d0a7bccf0fbaeb0ccb74d9ce683c6397.json 499 KB
{"ast":null,"code":"//! moment.js\n//! version : 2.29.1\n//! authors : Tim Wood, Iskren Chernev, Moment.js contributors\n//! license : MIT\n//! momentjs.com\n;\n\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : global.moment = factory();\n})(this, function () {\n  'use strict';\n\n  var hookCallback;\n\n  function hooks() {\n    return hookCallback.apply(null, arguments);\n  } // This is done to register the method called with moment()\n  // without creating circular dependencies.\n\n\n  function setHookCallback(callback) {\n    hookCallback = callback;\n  }\n\n  function isArray(input) {\n    return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]';\n  }\n\n  function isObject(input) {\n    // IE8 will treat undefined and null as object if it wasn't for\n    // input != null\n    return input != null && Object.prototype.toString.call(input) === '[object Object]';\n  }\n\n  function hasOwnProp(a, b) {\n    return Object.prototype.hasOwnProperty.call(a, b);\n  }\n\n  function isObjectEmpty(obj) {\n    if (Object.getOwnPropertyNames) {\n      return Object.getOwnPropertyNames(obj).length === 0;\n    } else {\n      var k;\n\n      for (k in obj) {\n        if (hasOwnProp(obj, k)) {\n          return false;\n        }\n      }\n\n      return true;\n    }\n  }\n\n  function isUndefined(input) {\n    return input === void 0;\n  }\n\n  function isNumber(input) {\n    return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]';\n  }\n\n  function isDate(input) {\n    return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';\n  }\n\n  function map(arr, fn) {\n    var res = [],\n        i;\n\n    for (i = 0; i < arr.length; ++i) {\n      res.push(fn(arr[i], i));\n    }\n\n    return res;\n  }\n\n  function extend(a, b) {\n    for (var i in b) {\n      if (hasOwnProp(b, i)) {\n        a[i] = b[i];\n      }\n    }\n\n    if (hasOwnProp(b, 'toString')) {\n      a.toString = b.toString;\n    }\n\n    if (hasOwnProp(b, 'valueOf')) {\n      a.valueOf = b.valueOf;\n    }\n\n    return a;\n  }\n\n  function createUTC(input, format, locale, strict) {\n    return createLocalOrUTC(input, format, locale, strict, true).utc();\n  }\n\n  function defaultParsingFlags() {\n    // We need to deep clone this object.\n    return {\n      empty: false,\n      unusedTokens: [],\n      unusedInput: [],\n      overflow: -2,\n      charsLeftOver: 0,\n      nullInput: false,\n      invalidEra: null,\n      invalidMonth: null,\n      invalidFormat: false,\n      userInvalidated: false,\n      iso: false,\n      parsedDateParts: [],\n      era: null,\n      meridiem: null,\n      rfc2822: false,\n      weekdayMismatch: false\n    };\n  }\n\n  function getParsingFlags(m) {\n    if (m._pf == null) {\n      m._pf = defaultParsingFlags();\n    }\n\n    return m._pf;\n  }\n\n  var some;\n\n  if (Array.prototype.some) {\n    some = Array.prototype.some;\n  } else {\n    some = function (fun) {\n      var t = Object(this),\n          len = t.length >>> 0,\n          i;\n\n      for (i = 0; i < len; i++) {\n        if (i in t && fun.call(this, t[i], i, t)) {\n          return true;\n        }\n      }\n\n      return false;\n    };\n  }\n\n  function isValid(m) {\n    if (m._isValid == null) {\n      var flags = getParsingFlags(m),\n          parsedParts = some.call(flags.parsedDateParts, function (i) {\n        return i != null;\n      }),\n          isNowValid = !isNaN(m._d.getTime()) && flags.overflow < 0 && !flags.empty && !flags.invalidEra && !flags.invalidMonth && !flags.invalidWeekday && !flags.weekdayMismatch && !flags.nullInput && !flags.invalidFormat && !flags.userInvalidated && (!flags.meridiem || flags.meridiem && parsedParts);\n\n      if (m._strict) {\n        isNowValid = isNowValid && flags.charsLeftOver === 0 && flags.unusedTokens.length === 0 && flags.bigHour === undefined;\n      }\n\n      if (Object.isFrozen == null || !Object.isFrozen(m)) {\n        m._isValid = isNowValid;\n      } else {\n        return isNowValid;\n      }\n    }\n\n    return m._isValid;\n  }\n\n  function createInvalid(flags) {\n    var m = createUTC(NaN);\n\n    if (flags != null) {\n      extend(getParsingFlags(m), flags);\n    } else {\n      getParsingFlags(m).userInvalidated = true;\n    }\n\n    return m;\n  } // Plugins that add properties should also add the key here (null value),\n  // so we can properly clone ourselves.\n\n\n  var momentProperties = hooks.momentProperties = [],\n      updateInProgress = false;\n\n  function copyConfig(to, from) {\n    var i, prop, val;\n\n    if (!isUndefined(from._isAMomentObject)) {\n      to._isAMomentObject = from._isAMomentObject;\n    }\n\n    if (!isUndefined(from._i)) {\n      to._i = from._i;\n    }\n\n    if (!isUndefined(from._f)) {\n      to._f = from._f;\n    }\n\n    if (!isUndefined(from._l)) {\n      to._l = from._l;\n    }\n\n    if (!isUndefined(from._strict)) {\n      to._strict = from._strict;\n    }\n\n    if (!isUndefined(from._tzm)) {\n      to._tzm = from._tzm;\n    }\n\n    if (!isUndefined(from._isUTC)) {\n      to._isUTC = from._isUTC;\n    }\n\n    if (!isUndefined(from._offset)) {\n      to._offset = from._offset;\n    }\n\n    if (!isUndefined(from._pf)) {\n      to._pf = getParsingFlags(from);\n    }\n\n    if (!isUndefined(from._locale)) {\n      to._locale = from._locale;\n    }\n\n    if (momentProperties.length > 0) {\n      for (i = 0; i < momentProperties.length; i++) {\n        prop = momentProperties[i];\n        val = from[prop];\n\n        if (!isUndefined(val)) {\n          to[prop] = val;\n        }\n      }\n    }\n\n    return to;\n  } // Moment prototype object\n\n\n  function Moment(config) {\n    copyConfig(this, config);\n    this._d = new Date(config._d != null ? config._d.getTime() : NaN);\n\n    if (!this.isValid()) {\n      this._d = new Date(NaN);\n    } // Prevent infinite loop in case updateOffset creates new moment\n    // objects.\n\n\n    if (updateInProgress === false) {\n      updateInProgress = true;\n      hooks.updateOffset(this);\n      updateInProgress = false;\n    }\n  }\n\n  function isMoment(obj) {\n    return obj instanceof Moment || obj != null && obj._isAMomentObject != null;\n  }\n\n  function warn(msg) {\n    if (hooks.suppressDeprecationWarnings === false && typeof console !== 'undefined' && console.warn) {\n      console.warn('Deprecation warning: ' + msg);\n    }\n  }\n\n  function deprecate(msg, fn) {\n    var firstTime = true;\n    return extend(function () {\n      if (hooks.deprecationHandler != null) {\n        hooks.deprecationHandler(null, msg);\n      }\n\n      if (firstTime) {\n        var args = [],\n            arg,\n            i,\n            key;\n\n        for (i = 0; i < arguments.length; i++) {\n          arg = '';\n\n          if (typeof arguments[i] === 'object') {\n            arg += '\\n[' + i + '] ';\n\n            for (key in arguments[0]) {\n              if (hasOwnProp(arguments[0], key)) {\n                arg += key + ': ' + arguments[0][key] + ', ';\n              }\n            }\n\n            arg = arg.slice(0, -2); // Remove trailing comma and space\n          } else {\n            arg = arguments[i];\n          }\n\n          args.push(arg);\n        }\n\n        warn(msg + '\\nArguments: ' + Array.prototype.slice.call(args).join('') + '\\n' + new Error().stack);\n        firstTime = false;\n      }\n\n      return fn.apply(this, arguments);\n    }, fn);\n  }\n\n  var deprecations = {};\n\n  function deprecateSimple(name, msg) {\n    if (hooks.deprecationHandler != null) {\n      hooks.deprecationHandler(name, msg);\n    }\n\n    if (!deprecations[name]) {\n      warn(msg);\n      deprecations[name] = true;\n    }\n  }\n\n  hooks.suppressDeprecationWarnings = false;\n  hooks.deprecationHandler = null;\n\n  function isFunction(input) {\n    return typeof Function !== 'undefined' && input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';\n  }\n\n  function set(config) {\n    var prop, i;\n\n    for (i in config) {\n      if (hasOwnProp(config, i)) {\n        prop = config[i];\n\n        if (isFunction(prop)) {\n          this[i] = prop;\n        } else {\n          this['_' + i] = prop;\n        }\n      }\n    }\n\n    this._config = config; // Lenient ordinal parsing accepts just a number in addition to\n    // number + (possibly) stuff coming from _dayOfMonthOrdinalParse.\n    // TODO: Remove \"ordinalParse\" fallback in next major release.\n\n    this._dayOfMonthOrdinalParseLenient = new RegExp((this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) + '|' + /\\d{1,2}/.source);\n  }\n\n  function mergeConfigs(parentConfig, childConfig) {\n    var res = extend({}, parentConfig),\n        prop;\n\n    for (prop in childConfig) {\n      if (hasOwnProp(childConfig, prop)) {\n        if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {\n          res[prop] = {};\n          extend(res[prop], parentConfig[prop]);\n          extend(res[prop], childConfig[prop]);\n        } else if (childConfig[prop] != null) {\n          res[prop] = childConfig[prop];\n        } else {\n          delete res[prop];\n        }\n      }\n    }\n\n    for (prop in parentConfig) {\n      if (hasOwnProp(parentConfig, prop) && !hasOwnProp(childConfig, prop) && isObject(parentConfig[prop])) {\n        // make sure changes to properties don't modify parent config\n        res[prop] = extend({}, res[prop]);\n      }\n    }\n\n    return res;\n  }\n\n  function Locale(config) {\n    if (config != null) {\n      this.set(config);\n    }\n  }\n\n  var keys;\n\n  if (Object.keys) {\n    keys = Object.keys;\n  } else {\n    keys = function (obj) {\n      var i,\n          res = [];\n\n      for (i in obj) {\n        if (hasOwnProp(obj, i)) {\n          res.push(i);\n        }\n      }\n\n      return res;\n    };\n  }\n\n  var defaultCalendar = {\n    sameDay: '[Today at] LT',\n    nextDay: '[Tomorrow at] LT',\n    nextWeek: 'dddd [at] LT',\n    lastDay: '[Yesterday at] LT',\n    lastWeek: '[Last] dddd [at] LT',\n    sameElse: 'L'\n  };\n\n  function calendar(key, mom, now) {\n    var output = this._calendar[key] || this._calendar['sameElse'];\n    return isFunction(output) ? output.call(mom, now) : output;\n  }\n\n  function zeroFill(number, targetLength, forceSign) {\n    var absNumber = '' + Math.abs(number),\n        zerosToFill = targetLength - absNumber.length,\n        sign = number >= 0;\n    return (sign ? forceSign ? '+' : '' : '-') + Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber;\n  }\n\n  var formattingTokens = /(\\[[^\\[]*\\])|(\\\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,\n      localFormattingTokens = /(\\[[^\\[]*\\])|(\\\\)?(LTS|LT|LL?L?L?|l{1,4})/g,\n      formatFunctions = {},\n      formatTokenFunctions = {}; // token:    'M'\n  // padded:   ['MM', 2]\n  // ordinal:  'Mo'\n  // callback: function () { this.month() + 1 }\n\n  function addFormatToken(token, padded, ordinal, callback) {\n    var func = callback;\n\n    if (typeof callback === 'string') {\n      func = function () {\n        return this[callback]();\n      };\n    }\n\n    if (token) {\n      formatTokenFunctions[token] = func;\n    }\n\n    if (padded) {\n      formatTokenFunctions[padded[0]] = function () {\n        return zeroFill(func.apply(this, arguments), padded[1], padded[2]);\n      };\n    }\n\n    if (ordinal) {\n      formatTokenFunctions[ordinal] = function () {\n        return this.localeData().ordinal(func.apply(this, arguments), token);\n      };\n    }\n  }\n\n  function removeFormattingTokens(input) {\n    if (input.match(/\\[[\\s\\S]/)) {\n      return input.replace(/^\\[|\\]$/g, '');\n    }\n\n    return input.replace(/\\\\/g, '');\n  }\n\n  function makeFormatFunction(format) {\n    var array = format.match(formattingTokens),\n        i,\n        length;\n\n    for (i = 0, length = array.length; i < length; i++) {\n      if (formatTokenFunctions[array[i]]) {\n        array[i] = formatTokenFunctions[array[i]];\n      } else {\n        array[i] = removeFormattingTokens(array[i]);\n      }\n    }\n\n    return function (mom) {\n      var output = '',\n          i;\n\n      for (i = 0; i < length; i++) {\n        output += isFunction(array[i]) ? array[i].call(mom, format) : array[i];\n      }\n\n      return output;\n    };\n  } // format date using native date object\n\n\n  function formatMoment(m, format) {\n    if (!m.isValid()) {\n      return m.localeData().invalidDate();\n    }\n\n    format = expandFormat(format, m.localeData());\n    formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format);\n    return formatFunctions[format](m);\n  }\n\n  function expandFormat(format, locale) {\n    var i = 5;\n\n    function replaceLongDateFormatTokens(input) {\n      return locale.longDateFormat(input) || input;\n    }\n\n    localFormattingTokens.lastIndex = 0;\n\n    while (i >= 0 && localFormattingTokens.test(format)) {\n      format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);\n      localFormattingTokens.lastIndex = 0;\n      i -= 1;\n    }\n\n    return format;\n  }\n\n  var defaultLongDateFormat = {\n    LTS: 'h:mm:ss A',\n    LT: 'h:mm A',\n    L: 'MM/DD/YYYY',\n    LL: 'MMMM D, YYYY',\n    LLL: 'MMMM D, YYYY h:mm A',\n    LLLL: 'dddd, MMMM D, YYYY h:mm A'\n  };\n\n  function longDateFormat(key) {\n    var format = this._longDateFormat[key],\n        formatUpper = this._longDateFormat[key.toUpperCase()];\n\n    if (format || !formatUpper) {\n      return format;\n    }\n\n    this._longDateFormat[key] = formatUpper.match(formattingTokens).map(function (tok) {\n      if (tok === 'MMMM' || tok === 'MM' || tok === 'DD' || tok === 'dddd') {\n        return tok.slice(1);\n      }\n\n      return tok;\n    }).join('');\n    return this._longDateFormat[key];\n  }\n\n  var defaultInvalidDate = 'Invalid date';\n\n  function invalidDate() {\n    return this._invalidDate;\n  }\n\n  var defaultOrdinal = '%d',\n      defaultDayOfMonthOrdinalParse = /\\d{1,2}/;\n\n  function ordinal(number) {\n    return this._ordinal.replace('%d', number);\n  }\n\n  var defaultRelativeTime = {\n    future: 'in %s',\n    past: '%s ago',\n    s: 'a few seconds',\n    ss: '%d seconds',\n    m: 'a minute',\n    mm: '%d minutes',\n    h: 'an hour',\n    hh: '%d hours',\n    d: 'a day',\n    dd: '%d days',\n    w: 'a week',\n    ww: '%d weeks',\n    M: 'a month',\n    MM: '%d months',\n    y: 'a year',\n    yy: '%d years'\n  };\n\n  function relativeTime(number, withoutSuffix, string, isFuture) {\n    var output = this._relativeTime[string];\n    return isFunction(output) ? output(number, withoutSuffix, string, isFuture) : output.replace(/%d/i, number);\n  }\n\n  function pastFuture(diff, output) {\n    var format = this._relativeTime[diff > 0 ? 'future' : 'past'];\n    return isFunction(format) ? format(output) : format.replace(/%s/i, output);\n  }\n\n  var aliases = {};\n\n  function addUnitAlias(unit, shorthand) {\n    var lowerCase = unit.toLowerCase();\n    aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;\n  }\n\n  function normalizeUnits(units) {\n    return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined;\n  }\n\n  function normalizeObjectUnits(inputObject) {\n    var normalizedInput = {},\n        normalizedProp,\n        prop;\n\n    for (prop in inputObject) {\n      if (hasOwnProp(inputObject, prop)) {\n        normalizedProp = normalizeUnits(prop);\n\n        if (normalizedProp) {\n          normalizedInput[normalizedProp] = inputObject[prop];\n        }\n      }\n    }\n\n    return normalizedInput;\n  }\n\n  var priorities = {};\n\n  function addUnitPriority(unit, priority) {\n    priorities[unit] = priority;\n  }\n\n  function getPrioritizedUnits(unitsObj) {\n    var units = [],\n        u;\n\n    for (u in unitsObj) {\n      if (hasOwnProp(unitsObj, u)) {\n        units.push({\n          unit: u,\n          priority: priorities[u]\n        });\n      }\n    }\n\n    units.sort(function (a, b) {\n      return a.priority - b.priority;\n    });\n    return units;\n  }\n\n  function isLeapYear(year) {\n    return year % 4 === 0 && year % 100 !== 0 || year % 400 === 0;\n  }\n\n  function absFloor(number) {\n    if (number < 0) {\n      // -0 -> 0\n      return Math.ceil(number) || 0;\n    } else {\n      return Math.floor(number);\n    }\n  }\n\n  function toInt(argumentForCoercion) {\n    var coercedNumber = +argumentForCoercion,\n        value = 0;\n\n    if (coercedNumber !== 0 && isFinite(coercedNumber)) {\n      value = absFloor(coercedNumber);\n    }\n\n    return value;\n  }\n\n  function makeGetSet(unit, keepTime) {\n    return function (value) {\n      if (value != null) {\n        set$1(this, unit, value);\n        hooks.updateOffset(this, keepTime);\n        return this;\n      } else {\n        return get(this, unit);\n      }\n    };\n  }\n\n  function get(mom, unit) {\n    return mom.isValid() ? mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN;\n  }\n\n  function set$1(mom, unit, value) {\n    if (mom.isValid() && !isNaN(value)) {\n      if (unit === 'FullYear' && isLeapYear(mom.year()) && mom.month() === 1 && mom.date() === 29) {\n        value = toInt(value);\n\n        mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, mom.month(), daysInMonth(value, mom.month()));\n      } else {\n        mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);\n      }\n    }\n  } // MOMENTS\n\n\n  function stringGet(units) {\n    units = normalizeUnits(units);\n\n    if (isFunction(this[units])) {\n      return this[units]();\n    }\n\n    return this;\n  }\n\n  function stringSet(units, value) {\n    if (typeof units === 'object') {\n      units = normalizeObjectUnits(units);\n      var prioritized = getPrioritizedUnits(units),\n          i;\n\n      for (i = 0; i < prioritized.length; i++) {\n        this[prioritized[i].unit](units[prioritized[i].unit]);\n      }\n    } else {\n      units = normalizeUnits(units);\n\n      if (isFunction(this[units])) {\n        return this[units](value);\n      }\n    }\n\n    return this;\n  }\n\n  var match1 = /\\d/,\n      //       0 - 9\n  match2 = /\\d\\d/,\n      //      00 - 99\n  match3 = /\\d{3}/,\n      //     000 - 999\n  match4 = /\\d{4}/,\n      //    0000 - 9999\n  match6 = /[+-]?\\d{6}/,\n      // -999999 - 999999\n  match1to2 = /\\d\\d?/,\n      //       0 - 99\n  match3to4 = /\\d\\d\\d\\d?/,\n      //     999 - 9999\n  match5to6 = /\\d\\d\\d\\d\\d\\d?/,\n      //   99999 - 999999\n  match1to3 = /\\d{1,3}/,\n      //       0 - 999\n  match1to4 = /\\d{1,4}/,\n      //       0 - 9999\n  match1to6 = /[+-]?\\d{1,6}/,\n      // -999999 - 999999\n  matchUnsigned = /\\d+/,\n      //       0 - inf\n  matchSigned = /[+-]?\\d+/,\n      //    -inf - inf\n  matchOffset = /Z|[+-]\\d\\d:?\\d\\d/gi,\n      // +00:00 -00:00 +0000 -0000 or Z\n  matchShortOffset = /Z|[+-]\\d\\d(?::?\\d\\d)?/gi,\n      // +00 -00 +00:00 -00:00 +0000 -0000 or Z\n  matchTimestamp = /[+-]?\\d+(\\.\\d{1,3})?/,\n      // 123456789 123456789.123\n  // any word (or two) characters or numbers including two/three word month in arabic.\n  // includes scottish gaelic two word and hyphenated months\n  matchWord = /[0-9]{0,256}['a-z\\u00A0-\\u05FF\\u0700-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFF07\\uFF10-\\uFFEF]{1,256}|[\\u0600-\\u06FF\\/]{1,256}(\\s*?[\\u0600-\\u06FF]{1,256}){1,2}/i,\n      regexes;\n  regexes = {};\n\n  function addRegexToken(token, regex, strictRegex) {\n    regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) {\n      return isStrict && strictRegex ? strictRegex : regex;\n    };\n  }\n\n  function getParseRegexForToken(token, config) {\n    if (!hasOwnProp(regexes, token)) {\n      return new RegExp(unescapeFormat(token));\n    }\n\n    return regexes[token](config._strict, config._locale);\n  } // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript\n\n\n  function unescapeFormat(s) {\n    return regexEscape(s.replace('\\\\', '').replace(/\\\\(\\[)|\\\\(\\])|\\[([^\\]\\[]*)\\]|\\\\(.)/g, function (matched, p1, p2, p3, p4) {\n      return p1 || p2 || p3 || p4;\n    }));\n  }\n\n  function regexEscape(s) {\n    return s.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n  }\n\n  var tokens = {};\n\n  function addParseToken(token, callback) {\n    var i,\n        func = callback;\n\n    if (typeof token === 'string') {\n      token = [token];\n    }\n\n    if (isNumber(callback)) {\n      func = function (input, array) {\n        array[callback] = toInt(input);\n      };\n    }\n\n    for (i = 0; i < token.length; i++) {\n      tokens[token[i]] = func;\n    }\n  }\n\n  function addWeekParseToken(token, callback) {\n    addParseToken(token, function (input, array, config, token) {\n      config._w = config._w || {};\n      callback(input, config._w, config, token);\n    });\n  }\n\n  function addTimeToArrayFromToken(token, input, config) {\n    if (input != null && hasOwnProp(tokens, token)) {\n      tokens[token](input, config._a, config, token);\n    }\n  }\n\n  var YEAR = 0,\n      MONTH = 1,\n      DATE = 2,\n      HOUR = 3,\n      MINUTE = 4,\n      SECOND = 5,\n      MILLISECOND = 6,\n      WEEK = 7,\n      WEEKDAY = 8;\n\n  function mod(n, x) {\n    return (n % x + x) % x;\n  }\n\n  var indexOf;\n\n  if (Array.prototype.indexOf) {\n    indexOf = Array.prototype.indexOf;\n  } else {\n    indexOf = function (o) {\n      // I know\n      var i;\n\n      for (i = 0; i < this.length; ++i) {\n        if (this[i] === o) {\n          return i;\n        }\n      }\n\n      return -1;\n    };\n  }\n\n  function daysInMonth(year, month) {\n    if (isNaN(year) || isNaN(month)) {\n      return NaN;\n    }\n\n    var modMonth = mod(month, 12);\n    year += (month - modMonth) / 12;\n    return modMonth === 1 ? isLeapYear(year) ? 29 : 28 : 31 - modMonth % 7 % 2;\n  } // FORMATTING\n\n\n  addFormatToken('M', ['MM', 2], 'Mo', function () {\n    return this.month() + 1;\n  });\n  addFormatToken('MMM', 0, 0, function (format) {\n    return this.localeData().monthsShort(this, format);\n  });\n  addFormatToken('MMMM', 0, 0, function (format) {\n    return this.localeData().months(this, format);\n  }); // ALIASES\n\n  addUnitAlias('month', 'M'); // PRIORITY\n\n  addUnitPriority('month', 8); // PARSING\n\n  addRegexToken('M', match1to2);\n  addRegexToken('MM', match1to2, match2);\n  addRegexToken('MMM', function (isStrict, locale) {\n    return locale.monthsShortRegex(isStrict);\n  });\n  addRegexToken('MMMM', function (isStrict, locale) {\n    return locale.monthsRegex(isStrict);\n  });\n  addParseToken(['M', 'MM'], function (input, array) {\n    array[MONTH] = toInt(input) - 1;\n  });\n  addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {\n    var month = config._locale.monthsParse(input, token, config._strict); // if we didn't find a month name, mark the date as invalid.\n\n\n    if (month != null) {\n      array[MONTH] = month;\n    } else {\n      getParsingFlags(config).invalidMonth = input;\n    }\n  }); // LOCALES\n\n  var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),\n      defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n      MONTHS_IN_FORMAT = /D[oD]?(\\[[^\\[\\]]*\\]|\\s)+MMMM?/,\n      defaultMonthsShortRegex = matchWord,\n      defaultMonthsRegex = matchWord;\n\n  function localeMonths(m, format) {\n    if (!m) {\n      return isArray(this._months) ? this._months : this._months['standalone'];\n    }\n\n    return isArray(this._months) ? this._months[m.month()] : this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()];\n  }\n\n  function localeMonthsShort(m, format) {\n    if (!m) {\n      return isArray(this._monthsShort) ? this._monthsShort : this._monthsShort['standalone'];\n    }\n\n    return isArray(this._monthsShort) ? this._monthsShort[m.month()] : this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()];\n  }\n\n  function handleStrictParse(monthName, format, strict) {\n    var i,\n        ii,\n        mom,\n        llc = monthName.toLocaleLowerCase();\n\n    if (!this._monthsParse) {\n      // this is not used\n      this._monthsParse = [];\n      this._longMonthsParse = [];\n      this._shortMonthsParse = [];\n\n      for (i = 0; i < 12; ++i) {\n        mom = createUTC([2000, i]);\n        this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase();\n        this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();\n      }\n    }\n\n    if (strict) {\n      if (format === 'MMM') {\n        ii = indexOf.call(this._shortMonthsParse, llc);\n        return ii !== -1 ? ii : null;\n      } else {\n        ii = indexOf.call(this._longMonthsParse, llc);\n        return ii !== -1 ? ii : null;\n      }\n    } else {\n      if (format === 'MMM') {\n        ii = indexOf.call(this._shortMonthsParse, llc);\n\n        if (ii !== -1) {\n          return ii;\n        }\n\n        ii = indexOf.call(this._longMonthsParse, llc);\n        return ii !== -1 ? ii : null;\n      } else {\n        ii = indexOf.call(this._longMonthsParse, llc);\n\n        if (ii !== -1) {\n          return ii;\n        }\n\n        ii = indexOf.call(this._shortMonthsParse, llc);\n        return ii !== -1 ? ii : null;\n      }\n    }\n  }\n\n  function localeMonthsParse(monthName, format, strict) {\n    var i, mom, regex;\n\n    if (this._monthsParseExact) {\n      return handleStrictParse.call(this, monthName, format, strict);\n    }\n\n    if (!this._monthsParse) {\n      this._monthsParse = [];\n      this._longMonthsParse = [];\n      this._shortMonthsParse = [];\n    } // TODO: add sorting\n    // Sorting makes sure if one month (or abbr) is a prefix of another\n    // see sorting in computeMonthsParse\n\n\n    for (i = 0; i < 12; i++) {\n      // make the regex if we don't have it already\n      mom = createUTC([2000, i]);\n\n      if (strict && !this._longMonthsParse[i]) {\n        this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i');\n        this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');\n      }\n\n      if (!strict && !this._monthsParse[i]) {\n        regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');\n        this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');\n      } // test the regex\n\n\n      if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {\n        return i;\n      } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {\n        return i;\n      } else if (!strict && this._monthsParse[i].test(monthName)) {\n        return i;\n      }\n    }\n  } // MOMENTS\n\n\n  function setMonth(mom, value) {\n    var dayOfMonth;\n\n    if (!mom.isValid()) {\n      // No op\n      return mom;\n    }\n\n    if (typeof value === 'string') {\n      if (/^\\d+$/.test(value)) {\n        value = toInt(value);\n      } else {\n        value = mom.localeData().monthsParse(value); // TODO: Another silent failure?\n\n        if (!isNumber(value)) {\n          return mom;\n        }\n      }\n    }\n\n    dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));\n\n    mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);\n\n    return mom;\n  }\n\n  function getSetMonth(value) {\n    if (value != null) {\n      setMonth(this, value);\n      hooks.updateOffset(this, true);\n      return this;\n    } else {\n      return get(this, 'Month');\n    }\n  }\n\n  function getDaysInMonth() {\n    return daysInMonth(this.year(), this.month());\n  }\n\n  function monthsShortRegex(isStrict) {\n    if (this._monthsParseExact) {\n      if (!hasOwnProp(this, '_monthsRegex')) {\n        computeMonthsParse.call(this);\n      }\n\n      if (isStrict) {\n        return this._monthsShortStrictRegex;\n      } else {\n        return this._monthsShortRegex;\n      }\n    } else {\n      if (!hasOwnProp(this, '_monthsShortRegex')) {\n        this._monthsShortRegex = defaultMonthsShortRegex;\n      }\n\n      return this._monthsShortStrictRegex && isStrict ? this._monthsShortStrictRegex : this._monthsShortRegex;\n    }\n  }\n\n  function monthsRegex(isStrict) {\n    if (this._monthsParseExact) {\n      if (!hasOwnProp(this, '_monthsRegex')) {\n        computeMonthsParse.call(this);\n      }\n\n      if (isStrict) {\n        return this._monthsStrictRegex;\n      } else {\n        return this._monthsRegex;\n      }\n    } else {\n      if (!hasOwnProp(this, '_monthsRegex')) {\n        this._monthsRegex = defaultMonthsRegex;\n      }\n\n      return this._monthsStrictRegex && isStrict ? this._monthsStrictRegex : this._monthsRegex;\n    }\n  }\n\n  function computeMonthsParse() {\n    function cmpLenRev(a, b) {\n      return b.length - a.length;\n    }\n\n    var shortPieces = [],\n        longPieces = [],\n        mixedPieces = [],\n        i,\n        mom;\n\n    for (i = 0; i < 12; i++) {\n      // make the regex if we don't have it already\n      mom = createUTC([2000, i]);\n      shortPieces.push(this.monthsShort(mom, ''));\n      longPieces.push(this.months(mom, ''));\n      mixedPieces.push(this.months(mom, ''));\n      mixedPieces.push(this.monthsShort(mom, ''));\n    } // Sorting makes sure if one month (or abbr) is a prefix of another it\n    // will match the longer piece.\n\n\n    shortPieces.sort(cmpLenRev);\n    longPieces.sort(cmpLenRev);\n    mixedPieces.sort(cmpLenRev);\n\n    for (i = 0; i < 12; i++) {\n      shortPieces[i] = regexEscape(shortPieces[i]);\n      longPieces[i] = regexEscape(longPieces[i]);\n    }\n\n    for (i = 0; i < 24; i++) {\n      mixedPieces[i] = regexEscape(mixedPieces[i]);\n    }\n\n    this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n    this._monthsShortRegex = this._monthsRegex;\n    this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');\n    this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n  } // FORMATTING\n\n\n  addFormatToken('Y', 0, 0, function () {\n    var y = this.year();\n    return y <= 9999 ? zeroFill(y, 4) : '+' + y;\n  });\n  addFormatToken(0, ['YY', 2], 0, function () {\n    return this.year() % 100;\n  });\n  addFormatToken(0, ['YYYY', 4], 0, 'year');\n  addFormatToken(0, ['YYYYY', 5], 0, 'year');\n  addFormatToken(0, ['YYYYYY', 6, true], 0, 'year'); // ALIASES\n\n  addUnitAlias('year', 'y'); // PRIORITIES\n\n  addUnitPriority('year', 1); // PARSING\n\n  addRegexToken('Y', matchSigned);\n  addRegexToken('YY', match1to2, match2);\n  addRegexToken('YYYY', match1to4, match4);\n  addRegexToken('YYYYY', match1to6, match6);\n  addRegexToken('YYYYYY', match1to6, match6);\n  addParseToken(['YYYYY', 'YYYYYY'], YEAR);\n  addParseToken('YYYY', function (input, array) {\n    array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);\n  });\n  addParseToken('YY', function (input, array) {\n    array[YEAR] = hooks.parseTwoDigitYear(input);\n  });\n  addParseToken('Y', function (input, array) {\n    array[YEAR] = parseInt(input, 10);\n  }); // HELPERS\n\n  function daysInYear(year) {\n    return isLeapYear(year) ? 366 : 365;\n  } // HOOKS\n\n\n  hooks.parseTwoDigitYear = function (input) {\n    return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);\n  }; // MOMENTS\n\n\n  var getSetYear = makeGetSet('FullYear', true);\n\n  function getIsLeapYear() {\n    return isLeapYear(this.year());\n  }\n\n  function createDate(y, m, d, h, M, s, ms) {\n    // can't just apply() to create a date:\n    // https://stackoverflow.com/q/181348\n    var date; // the date constructor remaps years 0-99 to 1900-1999\n\n    if (y < 100 && y >= 0) {\n      // preserve leap years using a full 400 year cycle, then reset\n      date = new Date(y + 400, m, d, h, M, s, ms);\n\n      if (isFinite(date.getFullYear())) {\n        date.setFullYear(y);\n      }\n    } else {\n      date = new Date(y, m, d, h, M, s, ms);\n    }\n\n    return date;\n  }\n\n  function createUTCDate(y) {\n    var date, args; // the Date.UTC function remaps years 0-99 to 1900-1999\n\n    if (y < 100 && y >= 0) {\n      args = Array.prototype.slice.call(arguments); // preserve leap years using a full 400 year cycle, then reset\n\n      args[0] = y + 400;\n      date = new Date(Date.UTC.apply(null, args));\n\n      if (isFinite(date.getUTCFullYear())) {\n        date.setUTCFullYear(y);\n      }\n    } else {\n      date = new Date(Date.UTC.apply(null, arguments));\n    }\n\n    return date;\n  } // start-of-first-week - start-of-year\n\n\n  function firstWeekOffset(year, dow, doy) {\n    var // first-week day -- which january is always in the first week (4 for iso, 1 for other)\n    fwd = 7 + dow - doy,\n        // first-week day local weekday -- which local weekday is fwd\n    fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;\n    return -fwdlw + fwd - 1;\n  } // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday\n\n\n  function dayOfYearFromWeeks(year, week, weekday, dow, doy) {\n    var localWeekday = (7 + weekday - dow) % 7,\n        weekOffset = firstWeekOffset(year, dow, doy),\n        dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,\n        resYear,\n        resDayOfYear;\n\n    if (dayOfYear <= 0) {\n      resYear = year - 1;\n      resDayOfYear = daysInYear(resYear) + dayOfYear;\n    } else if (dayOfYear > daysInYear(year)) {\n      resYear = year + 1;\n      resDayOfYear = dayOfYear - daysInYear(year);\n    } else {\n      resYear = year;\n      resDayOfYear = dayOfYear;\n    }\n\n    return {\n      year: resYear,\n      dayOfYear: resDayOfYear\n    };\n  }\n\n  function weekOfYear(mom, dow, doy) {\n    var weekOffset = firstWeekOffset(mom.year(), dow, doy),\n        week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,\n        resWeek,\n        resYear;\n\n    if (week < 1) {\n      resYear = mom.year() - 1;\n      resWeek = week + weeksInYear(resYear, dow, doy);\n    } else if (week > weeksInYear(mom.year(), dow, doy)) {\n      resWeek = week - weeksInYear(mom.year(), dow, doy);\n      resYear = mom.year() + 1;\n    } else {\n      resYear = mom.year();\n      resWeek = week;\n    }\n\n    return {\n      week: resWeek,\n      year: resYear\n    };\n  }\n\n  function weeksInYear(year, dow, doy) {\n    var weekOffset = firstWeekOffset(year, dow, doy),\n        weekOffsetNext = firstWeekOffset(year + 1, dow, doy);\n    return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;\n  } // FORMATTING\n\n\n  addFormatToken('w', ['ww', 2], 'wo', 'week');\n  addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek'); // ALIASES\n\n  addUnitAlias('week', 'w');\n  addUnitAlias('isoWeek', 'W'); // PRIORITIES\n\n  addUnitPriority('week', 5);\n  addUnitPriority('isoWeek', 5); // PARSING\n\n  addRegexToken('w', match1to2);\n  addRegexToken('ww', match1to2, match2);\n  addRegexToken('W', match1to2);\n  addRegexToken('WW', match1to2, match2);\n  addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) {\n    week[token.substr(0, 1)] = toInt(input);\n  }); // HELPERS\n  // LOCALES\n\n  function localeWeek(mom) {\n    return weekOfYear(mom, this._week.dow, this._week.doy).week;\n  }\n\n  var defaultLocaleWeek = {\n    dow: 0,\n    // Sunday is the first day of the week.\n    doy: 6 // The week that contains Jan 6th is the first week of the year.\n\n  };\n\n  function localeFirstDayOfWeek() {\n    return this._week.dow;\n  }\n\n  function localeFirstDayOfYear() {\n    return this._week.doy;\n  } // MOMENTS\n\n\n  function getSetWeek(input) {\n    var week = this.localeData().week(this);\n    return input == null ? week : this.add((input - week) * 7, 'd');\n  }\n\n  function getSetISOWeek(input) {\n    var week = weekOfYear(this, 1, 4).week;\n    return input == null ? week : this.add((input - week) * 7, 'd');\n  } // FORMATTING\n\n\n  addFormatToken('d', 0, 'do', 'day');\n  addFormatToken('dd', 0, 0, function (format) {\n    return this.localeData().weekdaysMin(this, format);\n  });\n  addFormatToken('ddd', 0, 0, function (format) {\n    return this.localeData().weekdaysShort(this, format);\n  });\n  addFormatToken('dddd', 0, 0, function (format) {\n    return this.localeData().weekdays(this, format);\n  });\n  addFormatToken('e', 0, 0, 'weekday');\n  addFormatToken('E', 0, 0, 'isoWeekday'); // ALIASES\n\n  addUnitAlias('day', 'd');\n  addUnitAlias('weekday', 'e');\n  addUnitAlias('isoWeekday', 'E'); // PRIORITY\n\n  addUnitPriority('day', 11);\n  addUnitPriority('weekday', 11);\n  addUnitPriority('isoWeekday', 11); // PARSING\n\n  addRegexToken('d', match1to2);\n  addRegexToken('e', match1to2);\n  addRegexToken('E', match1to2);\n  addRegexToken('dd', function (isStrict, locale) {\n    return locale.weekdaysMinRegex(isStrict);\n  });\n  addRegexToken('ddd', function (isStrict, locale) {\n    return locale.weekdaysShortRegex(isStrict);\n  });\n  addRegexToken('dddd', function (isStrict, locale) {\n    return locale.weekdaysRegex(isStrict);\n  });\n  addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {\n    var weekday = config._locale.weekdaysParse(input, token, config._strict); // if we didn't get a weekday name, mark the date as invalid\n\n\n    if (weekday != null) {\n      week.d = weekday;\n    } else {\n      getParsingFlags(config).invalidWeekday = input;\n    }\n  });\n  addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {\n    week[token] = toInt(input);\n  }); // HELPERS\n\n  function parseWeekday(input, locale) {\n    if (typeof input !== 'string') {\n      return input;\n    }\n\n    if (!isNaN(input)) {\n      return parseInt(input, 10);\n    }\n\n    input = locale.weekdaysParse(input);\n\n    if (typeof input === 'number') {\n      return input;\n    }\n\n    return null;\n  }\n\n  function parseIsoWeekday(input, locale) {\n    if (typeof input === 'string') {\n      return locale.weekdaysParse(input) % 7 || 7;\n    }\n\n    return isNaN(input) ? null : input;\n  } // LOCALES\n\n\n  function shiftWeekdays(ws, n) {\n    return ws.slice(n, 7).concat(ws.slice(0, n));\n  }\n\n  var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),\n      defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n      defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n      defaultWeekdaysRegex = matchWord,\n      defaultWeekdaysShortRegex = matchWord,\n      defaultWeekdaysMinRegex = matchWord;\n\n  function localeWeekdays(m, format) {\n    var weekdays = isArray(this._weekdays) ? this._weekdays : this._weekdays[m && m !== true && this._weekdays.isFormat.test(format) ? 'format' : 'standalone'];\n    return m === true ? shiftWeekdays(weekdays, this._week.dow) : m ? weekdays[m.day()] : weekdays;\n  }\n\n  function localeWeekdaysShort(m) {\n    return m === true ? shiftWeekdays(this._weekdaysShort, this._week.dow) : m ? this._weekdaysShort[m.day()] : this._weekdaysShort;\n  }\n\n  function localeWeekdaysMin(m) {\n    return m === true ? shiftWeekdays(this._weekdaysMin, this._week.dow) : m ? this._weekdaysMin[m.day()] : this._weekdaysMin;\n  }\n\n  function handleStrictParse$1(weekdayName, format, strict) {\n    var i,\n        ii,\n        mom,\n        llc = weekdayName.toLocaleLowerCase();\n\n    if (!this._weekdaysParse) {\n      this._weekdaysParse = [];\n      this._shortWeekdaysParse = [];\n      this._minWeekdaysParse = [];\n\n      for (i = 0; i < 7; ++i) {\n        mom = createUTC([2000, 1]).day(i);\n        this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase();\n        this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase();\n        this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();\n      }\n    }\n\n    if (strict) {\n      if (format === 'dddd') {\n        ii = indexOf.call(this._weekdaysParse, llc);\n        return ii !== -1 ? ii : null;\n      } else if (format === 'ddd') {\n        ii = indexOf.call(this._shortWeekdaysParse, llc);\n        return ii !== -1 ? ii : null;\n      } else {\n        ii = indexOf.call(this._minWeekdaysParse, llc);\n        return ii !== -1 ? ii : null;\n      }\n    } else {\n      if (format === 'dddd') {\n        ii = indexOf.call(this._weekdaysParse, llc);\n\n        if (ii !== -1) {\n          return ii;\n        }\n\n        ii = indexOf.call(this._shortWeekdaysParse, llc);\n\n        if (ii !== -1) {\n          return ii;\n        }\n\n        ii = indexOf.call(this._minWeekdaysParse, llc);\n        return ii !== -1 ? ii : null;\n      } else if (format === 'ddd') {\n        ii = indexOf.call(this._shortWeekdaysParse, llc);\n\n        if (ii !== -1) {\n          return ii;\n        }\n\n        ii = indexOf.call(this._weekdaysParse, llc);\n\n        if (ii !== -1) {\n          return ii;\n        }\n\n        ii = indexOf.call(this._minWeekdaysParse, llc);\n        return ii !== -1 ? ii : null;\n      } else {\n        ii = indexOf.call(this._minWeekdaysParse, llc);\n\n        if (ii !== -1) {\n          return ii;\n        }\n\n        ii = indexOf.call(this._weekdaysParse, llc);\n\n        if (ii !== -1) {\n          return ii;\n        }\n\n        ii = indexOf.call(this._shortWeekdaysParse, llc);\n        return ii !== -1 ? ii : null;\n      }\n    }\n  }\n\n  function localeWeekdaysParse(weekdayName, format, strict) {\n    var i, mom, regex;\n\n    if (this._weekdaysParseExact) {\n      return handleStrictParse$1.call(this, weekdayName, format, strict);\n    }\n\n    if (!this._weekdaysParse) {\n      this._weekdaysParse = [];\n      this._minWeekdaysParse = [];\n      this._shortWeekdaysParse = [];\n      this._fullWeekdaysParse = [];\n    }\n\n    for (i = 0; i < 7; i++) {\n      // make the regex if we don't have it already\n      mom = createUTC([2000, 1]).day(i);\n\n      if (strict && !this._fullWeekdaysParse[i]) {\n        this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\\\\.?') + '$', 'i');\n        this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\\\\.?') + '$', 'i');\n        this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\\\\.?') + '$', 'i');\n      }\n\n      if (!this._weekdaysParse[i]) {\n        regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');\n        this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');\n      } // test the regex\n\n\n      if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) {\n        return i;\n      } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) {\n        return i;\n      } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) {\n        return i;\n      } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {\n        return i;\n      }\n    }\n  } // MOMENTS\n\n\n  function getSetDayOfWeek(input) {\n    if (!this.isValid()) {\n      return input != null ? this : NaN;\n    }\n\n    var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();\n\n    if (input != null) {\n      input = parseWeekday(input, this.localeData());\n      return this.add(input - day, 'd');\n    } else {\n      return day;\n    }\n  }\n\n  function getSetLocaleDayOfWeek(input) {\n    if (!this.isValid()) {\n      return input != null ? this : NaN;\n    }\n\n    var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;\n    return input == null ? weekday : this.add(input - weekday, 'd');\n  }\n\n  function getSetISODayOfWeek(input) {\n    if (!this.isValid()) {\n      return input != null ? this : NaN;\n    } // behaves the same as moment#day except\n    // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)\n    // as a setter, sunday should belong to the previous week.\n\n\n    if (input != null) {\n      var weekday = parseIsoWeekday(input, this.localeData());\n      return this.day(this.day() % 7 ? weekday : weekday - 7);\n    } else {\n      return this.day() || 7;\n    }\n  }\n\n  function weekdaysRegex(isStrict) {\n    if (this._weekdaysParseExact) {\n      if (!hasOwnProp(this, '_weekdaysRegex')) {\n        computeWeekdaysParse.call(this);\n      }\n\n      if (isStrict) {\n        return this._weekdaysStrictRegex;\n      } else {\n        return this._weekdaysRegex;\n      }\n    } else {\n      if (!hasOwnProp(this, '_weekdaysRegex')) {\n        this._weekdaysRegex = defaultWeekdaysRegex;\n      }\n\n      return this._weekdaysStrictRegex && isStrict ? this._weekdaysStrictRegex : this._weekdaysRegex;\n    }\n  }\n\n  function weekdaysShortRegex(isStrict) {\n    if (this._weekdaysParseExact) {\n      if (!hasOwnProp(this, '_weekdaysRegex')) {\n        computeWeekdaysParse.call(this);\n      }\n\n      if (isStrict) {\n        return this._weekdaysShortStrictRegex;\n      } else {\n        return this._weekdaysShortRegex;\n      }\n    } else {\n      if (!hasOwnProp(this, '_weekdaysShortRegex')) {\n        this._weekdaysShortRegex = defaultWeekdaysShortRegex;\n      }\n\n      return this._weekdaysShortStrictRegex && isStrict ? this._weekdaysShortStrictRegex : this._weekdaysShortRegex;\n    }\n  }\n\n  function weekdaysMinRegex(isStrict) {\n    if (this._weekdaysParseExact) {\n      if (!hasOwnProp(this, '_weekdaysRegex')) {\n        computeWeekdaysParse.call(this);\n      }\n\n      if (isStrict) {\n        return this._weekdaysMinStrictRegex;\n      } else {\n        return this._weekdaysMinRegex;\n      }\n    } else {\n      if (!hasOwnProp(this, '_weekdaysMinRegex')) {\n        this._weekdaysMinRegex = defaultWeekdaysMinRegex;\n      }\n\n      return this._weekdaysMinStrictRegex && isStrict ? this._weekdaysMinStrictRegex : this._weekdaysMinRegex;\n    }\n  }\n\n  function computeWeekdaysParse() {\n    function cmpLenRev(a, b) {\n      return b.length - a.length;\n    }\n\n    var minPieces = [],\n        shortPieces = [],\n        longPieces = [],\n        mixedPieces = [],\n        i,\n        mom,\n        minp,\n        shortp,\n        longp;\n\n    for (i = 0; i < 7; i++) {\n      // make the regex if we don't have it already\n      mom = createUTC([2000, 1]).day(i);\n      minp = regexEscape(this.weekdaysMin(mom, ''));\n      shortp = regexEscape(this.weekdaysShort(mom, ''));\n      longp = regexEscape(this.weekdays(mom, ''));\n      minPieces.push(minp);\n      shortPieces.push(shortp);\n      longPieces.push(longp);\n      mixedPieces.push(minp);\n      mixedPieces.push(shortp);\n      mixedPieces.push(longp);\n    } // Sorting makes sure if one weekday (or abbr) is a prefix of another it\n    // will match the longer piece.\n\n\n    minPieces.sort(cmpLenRev);\n    shortPieces.sort(cmpLenRev);\n    longPieces.sort(cmpLenRev);\n    mixedPieces.sort(cmpLenRev);\n    this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n    this._weekdaysShortRegex = this._weekdaysRegex;\n    this._weekdaysMinRegex = this._weekdaysRegex;\n    this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');\n    this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n    this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i');\n  } // FORMATTING\n\n\n  function hFormat() {\n    return this.hours() % 12 || 12;\n  }\n\n  function kFormat() {\n    return this.hours() || 24;\n  }\n\n  addFormatToken('H', ['HH', 2], 0, 'hour');\n  addFormatToken('h', ['hh', 2], 0, hFormat);\n  addFormatToken('k', ['kk', 2], 0, kFormat);\n  addFormatToken('hmm', 0, 0, function () {\n    return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);\n  });\n  addFormatToken('hmmss', 0, 0, function () {\n    return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) + zeroFill(this.seconds(), 2);\n  });\n  addFormatToken('Hmm', 0, 0, function () {\n    return '' + this.hours() + zeroFill(this.minutes(), 2);\n  });\n  addFormatToken('Hmmss', 0, 0, function () {\n    return '' + this.hours() + zeroFill(this.minutes(), 2) + zeroFill(this.seconds(), 2);\n  });\n\n  function meridiem(token, lowercase) {\n    addFormatToken(token, 0, 0, function () {\n      return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);\n    });\n  }\n\n  meridiem('a', true);\n  meridiem('A', false); // ALIASES\n\n  addUnitAlias('hour', 'h'); // PRIORITY\n\n  addUnitPriority('hour', 13); // PARSING\n\n  function matchMeridiem(isStrict, locale) {\n    return locale._meridiemParse;\n  }\n\n  addRegexToken('a', matchMeridiem);\n  addRegexToken('A', matchMeridiem);\n  addRegexToken('H', match1to2);\n  addRegexToken('h', match1to2);\n  addRegexToken('k', match1to2);\n  addRegexToken('HH', match1to2, match2);\n  addRegexToken('hh', match1to2, match2);\n  addRegexToken('kk', match1to2, match2);\n  addRegexToken('hmm', match3to4);\n  addRegexToken('hmmss', match5to6);\n  addRegexToken('Hmm', match3to4);\n  addRegexToken('Hmmss', match5to6);\n  addParseToken(['H', 'HH'], HOUR);\n  addParseToken(['k', 'kk'], function (input, array, config) {\n    var kInput = toInt(input);\n    array[HOUR] = kInput === 24 ? 0 : kInput;\n  });\n  addParseToken(['a', 'A'], function (input, array, config) {\n    config._isPm = config._locale.isPM(input);\n    config._meridiem = input;\n  });\n  addParseToken(['h', 'hh'], function (input, array, config) {\n    array[HOUR] = toInt(input);\n    getParsingFlags(config).bigHour = true;\n  });\n  addParseToken('hmm', function (input, array, config) {\n    var pos = input.length - 2;\n    array[HOUR] = toInt(input.substr(0, pos));\n    array[MINUTE] = toInt(input.substr(pos));\n    getParsingFlags(config).bigHour = true;\n  });\n  addParseToken('hmmss', function (input, array, config) {\n    var pos1 = input.length - 4,\n        pos2 = input.length - 2;\n    array[HOUR] = toInt(input.substr(0, pos1));\n    array[MINUTE] = toInt(input.substr(pos1, 2));\n    array[SECOND] = toInt(input.substr(pos2));\n    getParsingFlags(config).bigHour = true;\n  });\n  addParseToken('Hmm', function (input, array, config) {\n    var pos = input.length - 2;\n    array[HOUR] = toInt(input.substr(0, pos));\n    array[MINUTE] = toInt(input.substr(pos));\n  });\n  addParseToken('Hmmss', function (input, array, config) {\n    var pos1 = input.length - 4,\n        pos2 = input.length - 2;\n    array[HOUR] = toInt(input.substr(0, pos1));\n    array[MINUTE] = toInt(input.substr(pos1, 2));\n    array[SECOND] = toInt(input.substr(pos2));\n  }); // LOCALES\n\n  function localeIsPM(input) {\n    // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays\n    // Using charAt should be more compatible.\n    return (input + '').toLowerCase().charAt(0) === 'p';\n  }\n\n  var defaultLocaleMeridiemParse = /[ap]\\.?m?\\.?/i,\n      // Setting the hour should keep the time, because the user explicitly\n  // specified which hour they want. So trying to maintain the same hour (in\n  // a new timezone) makes sense. Adding/subtracting hours does not follow\n  // this rule.\n  getSetHour = makeGetSet('Hours', true);\n\n  function localeMeridiem(hours, minutes, isLower) {\n    if (hours > 11) {\n      return isLower ? 'pm' : 'PM';\n    } else {\n      return isLower ? 'am' : 'AM';\n    }\n  }\n\n  var baseConfig = {\n    calendar: defaultCalendar,\n    longDateFormat: defaultLongDateFormat,\n    invalidDate: defaultInvalidDate,\n    ordinal: defaultOrdinal,\n    dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse,\n    relativeTime: defaultRelativeTime,\n    months: defaultLocaleMonths,\n    monthsShort: defaultLocaleMonthsShort,\n    week: defaultLocaleWeek,\n    weekdays: defaultLocaleWeekdays,\n    weekdaysMin: defaultLocaleWeekdaysMin,\n    weekdaysShort: defaultLocaleWeekdaysShort,\n    meridiemParse: defaultLocaleMeridiemParse\n  }; // internal storage for locale config files\n\n  var locales = {},\n      localeFamilies = {},\n      globalLocale;\n\n  function commonPrefix(arr1, arr2) {\n    var i,\n        minl = Math.min(arr1.length, arr2.length);\n\n    for (i = 0; i < minl; i += 1) {\n      if (arr1[i] !== arr2[i]) {\n        return i;\n      }\n    }\n\n    return minl;\n  }\n\n  function normalizeLocale(key) {\n    return key ? key.toLowerCase().replace('_', '-') : key;\n  } // pick the locale from the array\n  // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each\n  // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root\n\n\n  function chooseLocale(names) {\n    var i = 0,\n        j,\n        next,\n        locale,\n        split;\n\n    while (i < names.length) {\n      split = normalizeLocale(names[i]).split('-');\n      j = split.length;\n      next = normalizeLocale(names[i + 1]);\n      next = next ? next.split('-') : null;\n\n      while (j > 0) {\n        locale = loadLocale(split.slice(0, j).join('-'));\n\n        if (locale) {\n          return locale;\n        }\n\n        if (next && next.length >= j && commonPrefix(split, next) >= j - 1) {\n          //the next array item is better than a shallower substring of this one\n          break;\n        }\n\n        j--;\n      }\n\n      i++;\n    }\n\n    return globalLocale;\n  }\n\n  function loadLocale(name) {\n    var oldLocale = null,\n        aliasedRequire; // TODO: Find a better way to register and load all the locales in Node\n\n    if (locales[name] === undefined && typeof module !== 'undefined' && module && module.exports) {\n      try {\n        oldLocale = globalLocale._abbr;\n        aliasedRequire = require;\n        aliasedRequire('./locale/' + name);\n        getSetGlobalLocale(oldLocale);\n      } catch (e) {\n        // mark as not found to avoid repeating expensive file require call causing high CPU\n        // when trying to find en-US, en_US, en-us for every format call\n        locales[name] = null; // null means not found\n      }\n    }\n\n    return locales[name];\n  } // This function will load locale and then set the global locale.  If\n  // no arguments are passed in, it will simply return the current global\n  // locale key.\n\n\n  function getSetGlobalLocale(key, values) {\n    var data;\n\n    if (key) {\n      if (isUndefined(values)) {\n        data = getLocale(key);\n      } else {\n        data = defineLocale(key, values);\n      }\n\n      if (data) {\n        // moment.duration._locale = moment._locale = data;\n        globalLocale = data;\n      } else {\n        if (typeof console !== 'undefined' && console.warn) {\n          //warn user if arguments are passed but the locale could not be set\n          console.warn('Locale ' + key + ' not found. Did you forget to load it?');\n        }\n      }\n    }\n\n    return globalLocale._abbr;\n  }\n\n  function defineLocale(name, config) {\n    if (config !== null) {\n      var locale,\n          parentConfig = baseConfig;\n      config.abbr = name;\n\n      if (locales[name] != null) {\n        deprecateSimple('defineLocaleOverride', 'use moment.updateLocale(localeName, config) to change ' + 'an existing locale. moment.defineLocale(localeName, ' + 'config) should only be used for creating a new locale ' + 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.');\n        parentConfig = locales[name]._config;\n      } else if (config.parentLocale != null) {\n        if (locales[config.parentLocale] != null) {\n          parentConfig = locales[config.parentLocale]._config;\n        } else {\n          locale = loadLocale(config.parentLocale);\n\n          if (locale != null) {\n            parentConfig = locale._config;\n          } else {\n            if (!localeFamilies[config.parentLocale]) {\n              localeFamilies[config.parentLocale] = [];\n            }\n\n            localeFamilies[config.parentLocale].push({\n              name: name,\n              config: config\n            });\n            return null;\n          }\n        }\n      }\n\n      locales[name] = new Locale(mergeConfigs(parentConfig, config));\n\n      if (localeFamilies[name]) {\n        localeFamilies[name].forEach(function (x) {\n          defineLocale(x.name, x.config);\n        });\n      } // backwards compat for now: also set the locale\n      // make sure we set the locale AFTER all child locales have been\n      // created, so we won't end up with the child locale set.\n\n\n      getSetGlobalLocale(name);\n      return locales[name];\n    } else {\n      // useful for testing\n      delete locales[name];\n      return null;\n    }\n  }\n\n  function updateLocale(name, config) {\n    if (config != null) {\n      var locale,\n          tmpLocale,\n          parentConfig = baseConfig;\n\n      if (locales[name] != null && locales[name].parentLocale != null) {\n        // Update existing child locale in-place to avoid memory-leaks\n        locales[name].set(mergeConfigs(locales[name]._config, config));\n      } else {\n        // MERGE\n        tmpLocale = loadLocale(name);\n\n        if (tmpLocale != null) {\n          parentConfig = tmpLocale._config;\n        }\n\n        config = mergeConfigs(parentConfig, config);\n\n        if (tmpLocale == null) {\n          // updateLocale is called for creating a new locale\n          // Set abbr so it will have a name (getters return\n          // undefined otherwise).\n          config.abbr = name;\n        }\n\n        locale = new Locale(config);\n        locale.parentLocale = locales[name];\n        locales[name] = locale;\n      } // backwards compat for now: also set the locale\n\n\n      getSetGlobalLocale(name);\n    } else {\n      // pass null for config to unupdate, useful for tests\n      if (locales[name] != null) {\n        if (locales[name].parentLocale != null) {\n          locales[name] = locales[name].parentLocale;\n\n          if (name === getSetGlobalLocale()) {\n            getSetGlobalLocale(name);\n          }\n        } else if (locales[name] != null) {\n          delete locales[name];\n        }\n      }\n    }\n\n    return locales[name];\n  } // returns locale data\n\n\n  function getLocale(key) {\n    var locale;\n\n    if (key && key._locale && key._locale._abbr) {\n      key = key._locale._abbr;\n    }\n\n    if (!key) {\n      return globalLocale;\n    }\n\n    if (!isArray(key)) {\n      //short-circuit everything else\n      locale = loadLocale(key);\n\n      if (locale) {\n        return locale;\n      }\n\n      key = [key];\n    }\n\n    return chooseLocale(key);\n  }\n\n  function listLocales() {\n    return keys(locales);\n  }\n\n  function checkOverflow(m) {\n    var overflow,\n        a = m._a;\n\n    if (a && getParsingFlags(m).overflow === -2) {\n      overflow = a[MONTH] < 0 || a[MONTH] > 11 ? MONTH : a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE : a[HOUR] < 0 || a[HOUR] > 24 || a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0) ? HOUR : a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE : a[SECOND] < 0 || a[SECOND] > 59 ? SECOND : a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND : -1;\n\n      if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {\n        overflow = DATE;\n      }\n\n      if (getParsingFlags(m)._overflowWeeks && overflow === -1) {\n        overflow = WEEK;\n      }\n\n      if (getParsingFlags(m)._overflowWeekday && overflow === -1) {\n        overflow = WEEKDAY;\n      }\n\n      getParsingFlags(m).overflow = overflow;\n    }\n\n    return m;\n  } // iso 8601 regex\n  // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)\n\n\n  var extendedIsoRegex = /^\\s*((?:[+-]\\d{6}|\\d{4})-(?:\\d\\d-\\d\\d|W\\d\\d-\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?::\\d\\d(?::\\d\\d(?:[.,]\\d+)?)?)?)([+-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/,\n      basicIsoRegex = /^\\s*((?:[+-]\\d{6}|\\d{4})(?:\\d\\d\\d\\d|W\\d\\d\\d|W\\d\\d|\\d\\d\\d|\\d\\d|))(?:(T| )(\\d\\d(?:\\d\\d(?:\\d\\d(?:[.,]\\d+)?)?)?)([+-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/,\n      tzRegex = /Z|[+-]\\d\\d(?::?\\d\\d)?/,\n      isoDates = [['YYYYYY-MM-DD', /[+-]\\d{6}-\\d\\d-\\d\\d/], ['YYYY-MM-DD', /\\d{4}-\\d\\d-\\d\\d/], ['GGGG-[W]WW-E', /\\d{4}-W\\d\\d-\\d/], ['GGGG-[W]WW', /\\d{4}-W\\d\\d/, false], ['YYYY-DDD', /\\d{4}-\\d{3}/], ['YYYY-MM', /\\d{4}-\\d\\d/, false], ['YYYYYYMMDD', /[+-]\\d{10}/], ['YYYYMMDD', /\\d{8}/], ['GGGG[W]WWE', /\\d{4}W\\d{3}/], ['GGGG[W]WW', /\\d{4}W\\d{2}/, false], ['YYYYDDD', /\\d{7}/], ['YYYYMM', /\\d{6}/, false], ['YYYY', /\\d{4}/, false]],\n      // iso time formats and regexes\n  isoTimes = [['HH:mm:ss.SSSS', /\\d\\d:\\d\\d:\\d\\d\\.\\d+/], ['HH:mm:ss,SSSS', /\\d\\d:\\d\\d:\\d\\d,\\d+/], ['HH:mm:ss', /\\d\\d:\\d\\d:\\d\\d/], ['HH:mm', /\\d\\d:\\d\\d/], ['HHmmss.SSSS', /\\d\\d\\d\\d\\d\\d\\.\\d+/], ['HHmmss,SSSS', /\\d\\d\\d\\d\\d\\d,\\d+/], ['HHmmss', /\\d\\d\\d\\d\\d\\d/], ['HHmm', /\\d\\d\\d\\d/], ['HH', /\\d\\d/]],\n      aspNetJsonRegex = /^\\/?Date\\((-?\\d+)/i,\n      // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3\n  rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\\s)?(\\d{1,2})\\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s(\\d{2,4})\\s(\\d\\d):(\\d\\d)(?::(\\d\\d))?\\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\\d{4}))$/,\n      obsOffsets = {\n    UT: 0,\n    GMT: 0,\n    EDT: -4 * 60,\n    EST: -5 * 60,\n    CDT: -5 * 60,\n    CST: -6 * 60,\n    MDT: -6 * 60,\n    MST: -7 * 60,\n    PDT: -7 * 60,\n    PST: -8 * 60\n  }; // date from iso format\n\n  function configFromISO(config) {\n    var i,\n        l,\n        string = config._i,\n        match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),\n        allowTime,\n        dateFormat,\n        timeFormat,\n        tzFormat;\n\n    if (match) {\n      getParsingFlags(config).iso = true;\n\n      for (i = 0, l = isoDates.length; i < l; i++) {\n        if (isoDates[i][1].exec(match[1])) {\n          dateFormat = isoDates[i][0];\n          allowTime = isoDates[i][2] !== false;\n          break;\n        }\n      }\n\n      if (dateFormat == null) {\n        config._isValid = false;\n        return;\n      }\n\n      if (match[3]) {\n        for (i = 0, l = isoTimes.length; i < l; i++) {\n          if (isoTimes[i][1].exec(match[3])) {\n            // match[2] should be 'T' or space\n            timeFormat = (match[2] || ' ') + isoTimes[i][0];\n            break;\n          }\n        }\n\n        if (timeFormat == null) {\n          config._isValid = false;\n          return;\n        }\n      }\n\n      if (!allowTime && timeFormat != null) {\n        config._isValid = false;\n        return;\n      }\n\n      if (match[4]) {\n        if (tzRegex.exec(match[4])) {\n          tzFormat = 'Z';\n        } else {\n          config._isValid = false;\n          return;\n        }\n      }\n\n      config._f = dateFormat + (timeFormat || '') + (tzFormat || '');\n      configFromStringAndFormat(config);\n    } else {\n      config._isValid = false;\n    }\n  }\n\n  function extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) {\n    var result = [untruncateYear(yearStr), defaultLocaleMonthsShort.indexOf(monthStr), parseInt(dayStr, 10), parseInt(hourStr, 10), parseInt(minuteStr, 10)];\n\n    if (secondStr) {\n      result.push(parseInt(secondStr, 10));\n    }\n\n    return result;\n  }\n\n  function untruncateYear(yearStr) {\n    var year = parseInt(yearStr, 10);\n\n    if (year <= 49) {\n      return 2000 + year;\n    } else if (year <= 999) {\n      return 1900 + year;\n    }\n\n    return year;\n  }\n\n  function preprocessRFC2822(s) {\n    // Remove comments and folding whitespace and replace multiple-spaces with a single space\n    return s.replace(/\\([^)]*\\)|[\\n\\t]/g, ' ').replace(/(\\s\\s+)/g, ' ').replace(/^\\s\\s*/, '').replace(/\\s\\s*$/, '');\n  }\n\n  function checkWeekday(weekdayStr, parsedInput, config) {\n    if (weekdayStr) {\n      // TODO: Replace the vanilla JS Date object with an independent day-of-week check.\n      var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr),\n          weekdayActual = new Date(parsedInput[0], parsedInput[1], parsedInput[2]).getDay();\n\n      if (weekdayProvided !== weekdayActual) {\n        getParsingFlags(config).weekdayMismatch = true;\n        config._isValid = false;\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  function calculateOffset(obsOffset, militaryOffset, numOffset) {\n    if (obsOffset) {\n      return obsOffsets[obsOffset];\n    } else if (militaryOffset) {\n      // the only allowed military tz is Z\n      return 0;\n    } else {\n      var hm = parseInt(numOffset, 10),\n          m = hm % 100,\n          h = (hm - m) / 100;\n      return h * 60 + m;\n    }\n  } // date and time from ref 2822 format\n\n\n  function configFromRFC2822(config) {\n    var match = rfc2822.exec(preprocessRFC2822(config._i)),\n        parsedArray;\n\n    if (match) {\n      parsedArray = extractFromRFC2822Strings(match[4], match[3], match[2], match[5], match[6], match[7]);\n\n      if (!checkWeekday(match[1], parsedArray, config)) {\n        return;\n      }\n\n      config._a = parsedArray;\n      config._tzm = calculateOffset(match[8], match[9], match[10]);\n      config._d = createUTCDate.apply(null, config._a);\n\n      config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n\n      getParsingFlags(config).rfc2822 = true;\n    } else {\n      config._isValid = false;\n    }\n  } // date from 1) ASP.NET, 2) ISO, 3) RFC 2822 formats, or 4) optional fallback if parsing isn't strict\n\n\n  function configFromString(config) {\n    var matched = aspNetJsonRegex.exec(config._i);\n\n    if (matched !== null) {\n      config._d = new Date(+matched[1]);\n      return;\n    }\n\n    configFromISO(config);\n\n    if (config._isValid === false) {\n      delete config._isValid;\n    } else {\n      return;\n    }\n\n    configFromRFC2822(config);\n\n    if (config._isValid === false) {\n      delete config._isValid;\n    } else {\n      return;\n    }\n\n    if (config._strict) {\n      config._isValid = false;\n    } else {\n      // Final attempt, use Input Fallback\n      hooks.createFromInputFallback(config);\n    }\n  }\n\n  hooks.createFromInputFallback = deprecate('value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' + 'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' + 'discouraged. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.', function (config) {\n    config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));\n  }); // Pick the first defined of two or three arguments.\n\n  function defaults(a, b, c) {\n    if (a != null) {\n      return a;\n    }\n\n    if (b != null) {\n      return b;\n    }\n\n    return c;\n  }\n\n  function currentDateArray(config) {\n    // hooks is actually the exported moment object\n    var nowValue = new Date(hooks.now());\n\n    if (config._useUTC) {\n      return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()];\n    }\n\n    return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];\n  } // convert an array to a date.\n  // the array should mirror the parameters below\n  // note: all values past the year are optional and will default to the lowest possible value.\n  // [year, month, day , hour, minute, second, millisecond]\n\n\n  function configFromArray(config) {\n    var i,\n        date,\n        input = [],\n        currentDate,\n        expectedWeekday,\n        yearToUse;\n\n    if (config._d) {\n      return;\n    }\n\n    currentDate = currentDateArray(config); //compute day of the year from weeks and weekdays\n\n    if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {\n      dayOfYearFromWeekInfo(config);\n    } //if the day of the year is set, figure out what it is\n\n\n    if (config._dayOfYear != null) {\n      yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);\n\n      if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) {\n        getParsingFlags(config)._overflowDayOfYear = true;\n      }\n\n      date = createUTCDate(yearToUse, 0, config._dayOfYear);\n      config._a[MONTH] = date.getUTCMonth();\n      config._a[DATE] = date.getUTCDate();\n    } // Default to current date.\n    // * if no year, month, day of month are given, default to today\n    // * if day of month is given, default month and year\n    // * if month is given, default only year\n    // * if year is given, don't default anything\n\n\n    for (i = 0; i < 3 && config._a[i] == null; ++i) {\n      config._a[i] = input[i] = currentDate[i];\n    } // Zero out whatever was not defaulted, including time\n\n\n    for (; i < 7; i++) {\n      config._a[i] = input[i] = config._a[i] == null ? i === 2 ? 1 : 0 : config._a[i];\n    } // Check for 24:00:00.000\n\n\n    if (config._a[HOUR] === 24 && config._a[MINUTE] === 0 && config._a[SECOND] === 0 && config._a[MILLISECOND] === 0) {\n      config._nextDay = true;\n      config._a[HOUR] = 0;\n    }\n\n    config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);\n    expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay(); // Apply timezone offset from input. The actual utcOffset can be changed\n    // with parseZone.\n\n    if (config._tzm != null) {\n      config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n    }\n\n    if (config._nextDay) {\n      config._a[HOUR] = 24;\n    } // check for mismatching day of week\n\n\n    if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday) {\n      getParsingFlags(config).weekdayMismatch = true;\n    }\n  }\n\n  function dayOfYearFromWeekInfo(config) {\n    var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow, curWeek;\n    w = config._w;\n\n    if (w.GG != null || w.W != null || w.E != null) {\n      dow = 1;\n      doy = 4; // TODO: We need to take the current isoWeekYear, but that depends on\n      // how we interpret now (local, utc, fixed offset). So create\n      // a now version of current config (take local/utc/offset flags, and\n      // create now).\n\n      weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year);\n      week = defaults(w.W, 1);\n      weekday = defaults(w.E, 1);\n\n      if (weekday < 1 || weekday > 7) {\n        weekdayOverflow = true;\n      }\n    } else {\n      dow = config._locale._week.dow;\n      doy = config._locale._week.doy;\n      curWeek = weekOfYear(createLocal(), dow, doy);\n      weekYear = defaults(w.gg, config._a[YEAR], curWeek.year); // Default to current week.\n\n      week = defaults(w.w, curWeek.week);\n\n      if (w.d != null) {\n        // weekday -- low day numbers are considered next week\n        weekday = w.d;\n\n        if (weekday < 0 || weekday > 6) {\n          weekdayOverflow = true;\n        }\n      } else if (w.e != null) {\n        // local weekday -- counting starts from beginning of week\n        weekday = w.e + dow;\n\n        if (w.e < 0 || w.e > 6) {\n          weekdayOverflow = true;\n        }\n      } else {\n        // default to beginning of week\n        weekday = dow;\n      }\n    }\n\n    if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {\n      getParsingFlags(config)._overflowWeeks = true;\n    } else if (weekdayOverflow != null) {\n      getParsingFlags(config)._overflowWeekday = true;\n    } else {\n      temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);\n      config._a[YEAR] = temp.year;\n      config._dayOfYear = temp.dayOfYear;\n    }\n  } // constant that refers to the ISO standard\n\n\n  hooks.ISO_8601 = function () {}; // constant that refers to the RFC 2822 form\n\n\n  hooks.RFC_2822 = function () {}; // date from string and format string\n\n\n  function configFromStringAndFormat(config) {\n    // TODO: Move this to another part of the creation flow to prevent circular deps\n    if (config._f === hooks.ISO_8601) {\n      configFromISO(config);\n      return;\n    }\n\n    if (config._f === hooks.RFC_2822) {\n      configFromRFC2822(config);\n      return;\n    }\n\n    config._a = [];\n    getParsingFlags(config).empty = true; // This array is used to make a Date, either with `new Date` or `Date.UTC`\n\n    var string = '' + config._i,\n        i,\n        parsedInput,\n        tokens,\n        token,\n        skipped,\n        stringLength = string.length,\n        totalParsedInputLength = 0,\n        era;\n    tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];\n\n    for (i = 0; i < tokens.length; i++) {\n      token = tokens[i];\n      parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];\n\n      if (parsedInput) {\n        skipped = string.substr(0, string.indexOf(parsedInput));\n\n        if (skipped.length > 0) {\n          getParsingFlags(config).unusedInput.push(skipped);\n        }\n\n        string = string.slice(string.indexOf(parsedInput) + parsedInput.length);\n        totalParsedInputLength += parsedInput.length;\n      } // don't parse if it's not a known token\n\n\n      if (formatTokenFunctions[token]) {\n        if (parsedInput) {\n          getParsingFlags(config).empty = false;\n        } else {\n          getParsingFlags(config).unusedTokens.push(token);\n        }\n\n        addTimeToArrayFromToken(token, parsedInput, config);\n      } else if (config._strict && !parsedInput) {\n        getParsingFlags(config).unusedTokens.push(token);\n      }\n    } // add remaining unparsed input length to the string\n\n\n    getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength;\n\n    if (string.length > 0) {\n      getParsingFlags(config).unusedInput.push(string);\n    } // clear _12h flag if hour is <= 12\n\n\n    if (config._a[HOUR] <= 12 && getParsingFlags(config).bigHour === true && config._a[HOUR] > 0) {\n      getParsingFlags(config).bigHour = undefined;\n    }\n\n    getParsingFlags(config).parsedDateParts = config._a.slice(0);\n    getParsingFlags(config).meridiem = config._meridiem; // handle meridiem\n\n    config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem); // handle era\n\n    era = getParsingFlags(config).era;\n\n    if (era !== null) {\n      config._a[YEAR] = config._locale.erasConvertYear(era, config._a[YEAR]);\n    }\n\n    configFromArray(config);\n    checkOverflow(config);\n  }\n\n  function meridiemFixWrap(locale, hour, meridiem) {\n    var isPm;\n\n    if (meridiem == null) {\n      // nothing to do\n      return hour;\n    }\n\n    if (locale.meridiemHour != null) {\n      return locale.meridiemHour(hour, meridiem);\n    } else if (locale.isPM != null) {\n      // Fallback\n      isPm = locale.isPM(meridiem);\n\n      if (isPm && hour < 12) {\n        hour += 12;\n      }\n\n      if (!isPm && hour === 12) {\n        hour = 0;\n      }\n\n      return hour;\n    } else {\n      // this is not supposed to happen\n      return hour;\n    }\n  } // date from string and array of format strings\n\n\n  function configFromStringAndArray(config) {\n    var tempConfig,\n        bestMoment,\n        scoreToBeat,\n        i,\n        currentScore,\n        validFormatFound,\n        bestFormatIsValid = false;\n\n    if (config._f.length === 0) {\n      getParsingFlags(config).invalidFormat = true;\n      config._d = new Date(NaN);\n      return;\n    }\n\n    for (i = 0; i < config._f.length; i++) {\n      currentScore = 0;\n      validFormatFound = false;\n      tempConfig = copyConfig({}, config);\n\n      if (config._useUTC != null) {\n        tempConfig._useUTC = config._useUTC;\n      }\n\n      tempConfig._f = config._f[i];\n      configFromStringAndFormat(tempConfig);\n\n      if (isValid(tempConfig)) {\n        validFormatFound = true;\n      } // if there is any input that was not parsed add a penalty for that format\n\n\n      currentScore += getParsingFlags(tempConfig).charsLeftOver; //or tokens\n\n      currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;\n      getParsingFlags(tempConfig).score = currentScore;\n\n      if (!bestFormatIsValid) {\n        if (scoreToBeat == null || currentScore < scoreToBeat || validFormatFound) {\n          scoreToBeat = currentScore;\n          bestMoment = tempConfig;\n\n          if (validFormatFound) {\n            bestFormatIsValid = true;\n          }\n        }\n      } else {\n        if (currentScore < scoreToBeat) {\n          scoreToBeat = currentScore;\n          bestMoment = tempConfig;\n        }\n      }\n    }\n\n    extend(config, bestMoment || tempConfig);\n  }\n\n  function configFromObject(config) {\n    if (config._d) {\n      return;\n    }\n\n    var i = normalizeObjectUnits(config._i),\n        dayOrDate = i.day === undefined ? i.date : i.day;\n    config._a = map([i.year, i.month, dayOrDate, i.hour, i.minute, i.second, i.millisecond], function (obj) {\n      return obj && parseInt(obj, 10);\n    });\n    configFromArray(config);\n  }\n\n  function createFromConfig(config) {\n    var res = new Moment(checkOverflow(prepareConfig(config)));\n\n    if (res._nextDay) {\n      // Adding is smart enough around DST\n      res.add(1, 'd');\n      res._nextDay = undefined;\n    }\n\n    return res;\n  }\n\n  function prepareConfig(config) {\n    var input = config._i,\n        format = config._f;\n    config._locale = config._locale || getLocale(config._l);\n\n    if (input === null || format === undefined && input === '') {\n      return createInvalid({\n        nullInput: true\n      });\n    }\n\n    if (typeof input === 'string') {\n      config._i = input = config._locale.preparse(input);\n    }\n\n    if (isMoment(input)) {\n      return new Moment(checkOverflow(input));\n    } else if (isDate(input)) {\n      config._d = input;\n    } else if (isArray(format)) {\n      configFromStringAndArray(config);\n    } else if (format) {\n      configFromStringAndFormat(config);\n    } else {\n      configFromInput(config);\n    }\n\n    if (!isValid(config)) {\n      config._d = null;\n    }\n\n    return config;\n  }\n\n  function configFromInput(config) {\n    var input = config._i;\n\n    if (isUndefined(input)) {\n      config._d = new Date(hooks.now());\n    } else if (isDate(input)) {\n      config._d = new Date(input.valueOf());\n    } else if (typeof input === 'string') {\n      configFromString(config);\n    } else if (isArray(input)) {\n      config._a = map(input.slice(0), function (obj) {\n        return parseInt(obj, 10);\n      });\n      configFromArray(config);\n    } else if (isObject(input)) {\n      configFromObject(config);\n    } else if (isNumber(input)) {\n      // from milliseconds\n      config._d = new Date(input);\n    } else {\n      hooks.createFromInputFallback(config);\n    }\n  }\n\n  function createLocalOrUTC(input, format, locale, strict, isUTC) {\n    var c = {};\n\n    if (format === true || format === false) {\n      strict = format;\n      format = undefined;\n    }\n\n    if (locale === true || locale === false) {\n      strict = locale;\n      locale = undefined;\n    }\n\n    if (isObject(input) && isObjectEmpty(input) || isArray(input) && input.length === 0) {\n      input = undefined;\n    } // object construction must be done this way.\n    // https://github.com/moment/moment/issues/1423\n\n\n    c._isAMomentObject = true;\n    c._useUTC = c._isUTC = isUTC;\n    c._l = locale;\n    c._i = input;\n    c._f = format;\n    c._strict = strict;\n    return createFromConfig(c);\n  }\n\n  function createLocal(input, format, locale, strict) {\n    return createLocalOrUTC(input, format, locale, strict, false);\n  }\n\n  var prototypeMin = deprecate('moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/', function () {\n    var other = createLocal.apply(null, arguments);\n\n    if (this.isValid() && other.isValid()) {\n      return other < this ? this : other;\n    } else {\n      return createInvalid();\n    }\n  }),\n      prototypeMax = deprecate('moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/', function () {\n    var other = createLocal.apply(null, arguments);\n\n    if (this.isValid() && other.isValid()) {\n      return other > this ? this : other;\n    } else {\n      return createInvalid();\n    }\n  }); // Pick a moment m from moments so that m[fn](other) is true for all\n  // other. This relies on the function fn to be transitive.\n  //\n  // moments should either be an array of moment objects or an array, whose\n  // first element is an array of moment objects.\n\n  function pickBy(fn, moments) {\n    var res, i;\n\n    if (moments.length === 1 && isArray(moments[0])) {\n      moments = moments[0];\n    }\n\n    if (!moments.length) {\n      return createLocal();\n    }\n\n    res = moments[0];\n\n    for (i = 1; i < moments.length; ++i) {\n      if (!moments[i].isValid() || moments[i][fn](res)) {\n        res = moments[i];\n      }\n    }\n\n    return res;\n  } // TODO: Use [].sort instead?\n\n\n  function min() {\n    var args = [].slice.call(arguments, 0);\n    return pickBy('isBefore', args);\n  }\n\n  function max() {\n    var args = [].slice.call(arguments, 0);\n    return pickBy('isAfter', args);\n  }\n\n  var now = function () {\n    return Date.now ? Date.now() : +new Date();\n  };\n\n  var ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond'];\n\n  function isDurationValid(m) {\n    var key,\n        unitHasDecimal = false,\n        i;\n\n    for (key in m) {\n      if (hasOwnProp(m, key) && !(indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])))) {\n        return false;\n      }\n    }\n\n    for (i = 0; i < ordering.length; ++i) {\n      if (m[ordering[i]]) {\n        if (unitHasDecimal) {\n          return false; // only allow non-integers for smallest unit\n        }\n\n        if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) {\n          unitHasDecimal = true;\n        }\n      }\n    }\n\n    return true;\n  }\n\n  function isValid$1() {\n    return this._isValid;\n  }\n\n  function createInvalid$1() {\n    return createDuration(NaN);\n  }\n\n  function Duration(duration) {\n    var normalizedInput = normalizeObjectUnits(duration),\n        years = normalizedInput.year || 0,\n        quarters = normalizedInput.quarter || 0,\n        months = normalizedInput.month || 0,\n        weeks = normalizedInput.week || normalizedInput.isoWeek || 0,\n        days = normalizedInput.day || 0,\n        hours = normalizedInput.hour || 0,\n        minutes = normalizedInput.minute || 0,\n        seconds = normalizedInput.second || 0,\n        milliseconds = normalizedInput.millisecond || 0;\n    this._isValid = isDurationValid(normalizedInput); // representation for dateAddRemove\n\n    this._milliseconds = +milliseconds + seconds * 1e3 + // 1000\n    minutes * 6e4 + // 1000 * 60\n    hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978\n    // Because of dateAddRemove treats 24 hours as different from a\n    // day when working around DST, we need to store them separately\n\n    this._days = +days + weeks * 7; // It is impossible to translate months into days without knowing\n    // which months you are are talking about, so we have to store\n    // it separately.\n\n    this._months = +months + quarters * 3 + years * 12;\n    this._data = {};\n    this._locale = getLocale();\n\n    this._bubble();\n  }\n\n  function isDuration(obj) {\n    return obj instanceof Duration;\n  }\n\n  function absRound(number) {\n    if (number < 0) {\n      return Math.round(-1 * number) * -1;\n    } else {\n      return Math.round(number);\n    }\n  } // compare two arrays, return the number of differences\n\n\n  function compareArrays(array1, array2, dontConvert) {\n    var len = Math.min(array1.length, array2.length),\n        lengthDiff = Math.abs(array1.length - array2.length),\n        diffs = 0,\n        i;\n\n    for (i = 0; i < len; i++) {\n      if (dontConvert && array1[i] !== array2[i] || !dontConvert && toInt(array1[i]) !== toInt(array2[i])) {\n        diffs++;\n      }\n    }\n\n    return diffs + lengthDiff;\n  } // FORMATTING\n\n\n  function offset(token, separator) {\n    addFormatToken(token, 0, 0, function () {\n      var offset = this.utcOffset(),\n          sign = '+';\n\n      if (offset < 0) {\n        offset = -offset;\n        sign = '-';\n      }\n\n      return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~offset % 60, 2);\n    });\n  }\n\n  offset('Z', ':');\n  offset('ZZ', ''); // PARSING\n\n  addRegexToken('Z', matchShortOffset);\n  addRegexToken('ZZ', matchShortOffset);\n  addParseToken(['Z', 'ZZ'], function (input, array, config) {\n    config._useUTC = true;\n    config._tzm = offsetFromString(matchShortOffset, input);\n  }); // HELPERS\n  // timezone chunker\n  // '+10:00' > ['10',  '00']\n  // '-1530'  > ['-15', '30']\n\n  var chunkOffset = /([\\+\\-]|\\d\\d)/gi;\n\n  function offsetFromString(matcher, string) {\n    var matches = (string || '').match(matcher),\n        chunk,\n        parts,\n        minutes;\n\n    if (matches === null) {\n      return null;\n    }\n\n    chunk = matches[matches.length - 1] || [];\n    parts = (chunk + '').match(chunkOffset) || ['-', 0, 0];\n    minutes = +(parts[1] * 60) + toInt(parts[2]);\n    return minutes === 0 ? 0 : parts[0] === '+' ? minutes : -minutes;\n  } // Return a moment from input, that is local/utc/zone equivalent to model.\n\n\n  function cloneWithOffset(input, model) {\n    var res, diff;\n\n    if (model._isUTC) {\n      res = model.clone();\n      diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf(); // Use low-level api, because this fn is low-level api.\n\n      res._d.setTime(res._d.valueOf() + diff);\n\n      hooks.updateOffset(res, false);\n      return res;\n    } else {\n      return createLocal(input).local();\n    }\n  }\n\n  function getDateOffset(m) {\n    // On Firefox.24 Date#getTimezoneOffset returns a floating point.\n    // https://github.com/moment/moment/pull/1871\n    return -Math.round(m._d.getTimezoneOffset());\n  } // HOOKS\n  // This function will be called whenever a moment is mutated.\n  // It is intended to keep the offset in sync with the timezone.\n\n\n  hooks.updateOffset = function () {}; // MOMENTS\n  // keepLocalTime = true means only change the timezone, without\n  // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->\n  // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset\n  // +0200, so we adjust the time as needed, to be valid.\n  //\n  // Keeping the time actually adds/subtracts (one hour)\n  // from the actual represented time. That is why we call updateOffset\n  // a second time. In case it wants us to change the offset again\n  // _changeInProgress == true case, then we have to adjust, because\n  // there is no such time in the given timezone.\n\n\n  function getSetOffset(input, keepLocalTime, keepMinutes) {\n    var offset = this._offset || 0,\n        localAdjust;\n\n    if (!this.isValid()) {\n      return input != null ? this : NaN;\n    }\n\n    if (input != null) {\n      if (typeof input === 'string') {\n        input = offsetFromString(matchShortOffset, input);\n\n        if (input === null) {\n          return this;\n        }\n      } else if (Math.abs(input) < 16 && !keepMinutes) {\n        input = input * 60;\n      }\n\n      if (!this._isUTC && keepLocalTime) {\n        localAdjust = getDateOffset(this);\n      }\n\n      this._offset = input;\n      this._isUTC = true;\n\n      if (localAdjust != null) {\n        this.add(localAdjust, 'm');\n      }\n\n      if (offset !== input) {\n        if (!keepLocalTime || this._changeInProgress) {\n          addSubtract(this, createDuration(input - offset, 'm'), 1, false);\n        } else if (!this._changeInProgress) {\n          this._changeInProgress = true;\n          hooks.updateOffset(this, true);\n          this._changeInProgress = null;\n        }\n      }\n\n      return this;\n    } else {\n      return this._isUTC ? offset : getDateOffset(this);\n    }\n  }\n\n  function getSetZone(input, keepLocalTime) {\n    if (input != null) {\n      if (typeof input !== 'string') {\n        input = -input;\n      }\n\n      this.utcOffset(input, keepLocalTime);\n      return this;\n    } else {\n      return -this.utcOffset();\n    }\n  }\n\n  function setOffsetToUTC(keepLocalTime) {\n    return this.utcOffset(0, keepLocalTime);\n  }\n\n  function setOffsetToLocal(keepLocalTime) {\n    if (this._isUTC) {\n      this.utcOffset(0, keepLocalTime);\n      this._isUTC = false;\n\n      if (keepLocalTime) {\n        this.subtract(getDateOffset(this), 'm');\n      }\n    }\n\n    return this;\n  }\n\n  function setOffsetToParsedOffset() {\n    if (this._tzm != null) {\n      this.utcOffset(this._tzm, false, true);\n    } else if (typeof this._i === 'string') {\n      var tZone = offsetFromString(matchOffset, this._i);\n\n      if (tZone != null) {\n        this.utcOffset(tZone);\n      } else {\n        this.utcOffset(0, true);\n      }\n    }\n\n    return this;\n  }\n\n  function hasAlignedHourOffset(input) {\n    if (!this.isValid()) {\n      return false;\n    }\n\n    input = input ? createLocal(input).utcOffset() : 0;\n    return (this.utcOffset() - input) % 60 === 0;\n  }\n\n  function isDaylightSavingTime() {\n    return this.utcOffset() > this.clone().month(0).utcOffset() || this.utcOffset() > this.clone().month(5).utcOffset();\n  }\n\n  function isDaylightSavingTimeShifted() {\n    if (!isUndefined(this._isDSTShifted)) {\n      return this._isDSTShifted;\n    }\n\n    var c = {},\n        other;\n    copyConfig(c, this);\n    c = prepareConfig(c);\n\n    if (c._a) {\n      other = c._isUTC ? createUTC(c._a) : createLocal(c._a);\n      this._isDSTShifted = this.isValid() && compareArrays(c._a, other.toArray()) > 0;\n    } else {\n      this._isDSTShifted = false;\n    }\n\n    return this._isDSTShifted;\n  }\n\n  function isLocal() {\n    return this.isValid() ? !this._isUTC : false;\n  }\n\n  function isUtcOffset() {\n    return this.isValid() ? this._isUTC : false;\n  }\n\n  function isUtc() {\n    return this.isValid() ? this._isUTC && this._offset === 0 : false;\n  } // ASP.NET json date format regex\n\n\n  var aspNetRegex = /^(-|\\+)?(?:(\\d*)[. ])?(\\d+):(\\d+)(?::(\\d+)(\\.\\d*)?)?$/,\n      // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html\n  // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere\n  // and further modified to allow for strings containing both week and day\n  isoRegex = /^(-|\\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;\n\n  function createDuration(input, key) {\n    var duration = input,\n        // matching against regexp is expensive, do it on demand\n    match = null,\n        sign,\n        ret,\n        diffRes;\n\n    if (isDuration(input)) {\n      duration = {\n        ms: input._milliseconds,\n        d: input._days,\n        M: input._months\n      };\n    } else if (isNumber(input) || !isNaN(+input)) {\n      duration = {};\n\n      if (key) {\n        duration[key] = +input;\n      } else {\n        duration.milliseconds = +input;\n      }\n    } else if (match = aspNetRegex.exec(input)) {\n      sign = match[1] === '-' ? -1 : 1;\n      duration = {\n        y: 0,\n        d: toInt(match[DATE]) * sign,\n        h: toInt(match[HOUR]) * sign,\n        m: toInt(match[MINUTE]) * sign,\n        s: toInt(match[SECOND]) * sign,\n        ms: toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match\n\n      };\n    } else if (match = isoRegex.exec(input)) {\n      sign = match[1] === '-' ? -1 : 1;\n      duration = {\n        y: parseIso(match[2], sign),\n        M: parseIso(match[3], sign),\n        w: parseIso(match[4], sign),\n        d: parseIso(match[5], sign),\n        h: parseIso(match[6], sign),\n        m: parseIso(match[7], sign),\n        s: parseIso(match[8], sign)\n      };\n    } else if (duration == null) {\n      // checks for null or undefined\n      duration = {};\n    } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) {\n      diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to));\n      duration = {};\n      duration.ms = diffRes.milliseconds;\n      duration.M = diffRes.months;\n    }\n\n    ret = new Duration(duration);\n\n    if (isDuration(input) && hasOwnProp(input, '_locale')) {\n      ret._locale = input._locale;\n    }\n\n    if (isDuration(input) && hasOwnProp(input, '_isValid')) {\n      ret._isValid = input._isValid;\n    }\n\n    return ret;\n  }\n\n  createDuration.fn = Duration.prototype;\n  createDuration.invalid = createInvalid$1;\n\n  function parseIso(inp, sign) {\n    // We'd normally use ~~inp for this, but unfortunately it also\n    // converts floats to ints.\n    // inp may be undefined, so careful calling replace on it.\n    var res = inp && parseFloat(inp.replace(',', '.')); // apply sign while we're at it\n\n    return (isNaN(res) ? 0 : res) * sign;\n  }\n\n  function positiveMomentsDifference(base, other) {\n    var res = {};\n    res.months = other.month() - base.month() + (other.year() - base.year()) * 12;\n\n    if (base.clone().add(res.months, 'M').isAfter(other)) {\n      --res.months;\n    }\n\n    res.milliseconds = +other - +base.clone().add(res.months, 'M');\n    return res;\n  }\n\n  function momentsDifference(base, other) {\n    var res;\n\n    if (!(base.isValid() && other.isValid())) {\n      return {\n        milliseconds: 0,\n        months: 0\n      };\n    }\n\n    other = cloneWithOffset(other, base);\n\n    if (base.isBefore(other)) {\n      res = positiveMomentsDifference(base, other);\n    } else {\n      res = positiveMomentsDifference(other, base);\n      res.milliseconds = -res.milliseconds;\n      res.months = -res.months;\n    }\n\n    return res;\n  } // TODO: remove 'name' arg after deprecation is removed\n\n\n  function createAdder(direction, name) {\n    return function (val, period) {\n      var dur, tmp; //invert the arguments, but complain about it\n\n      if (period !== null && !isNaN(+period)) {\n        deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' + 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.');\n        tmp = val;\n        val = period;\n        period = tmp;\n      }\n\n      dur = createDuration(val, period);\n      addSubtract(this, dur, direction);\n      return this;\n    };\n  }\n\n  function addSubtract(mom, duration, isAdding, updateOffset) {\n    var milliseconds = duration._milliseconds,\n        days = absRound(duration._days),\n        months = absRound(duration._months);\n\n    if (!mom.isValid()) {\n      // No op\n      return;\n    }\n\n    updateOffset = updateOffset == null ? true : updateOffset;\n\n    if (months) {\n      setMonth(mom, get(mom, 'Month') + months * isAdding);\n    }\n\n    if (days) {\n      set$1(mom, 'Date', get(mom, 'Date') + days * isAdding);\n    }\n\n    if (milliseconds) {\n      mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);\n    }\n\n    if (updateOffset) {\n      hooks.updateOffset(mom, days || months);\n    }\n  }\n\n  var add = createAdder(1, 'add'),\n      subtract = createAdder(-1, 'subtract');\n\n  function isString(input) {\n    return typeof input === 'string' || input instanceof String;\n  } // type MomentInput = Moment | Date | string | number | (number | string)[] | MomentInputObject | void; // null | undefined\n\n\n  function isMomentInput(input) {\n    return isMoment(input) || isDate(input) || isString(input) || isNumber(input) || isNumberOrStringArray(input) || isMomentInputObject(input) || input === null || input === undefined;\n  }\n\n  function isMomentInputObject(input) {\n    var objectTest = isObject(input) && !isObjectEmpty(input),\n        propertyTest = false,\n        properties = ['years', 'year', 'y', 'months', 'month', 'M', 'days', 'day', 'd', 'dates', 'date', 'D', 'hours', 'hour', 'h', 'minutes', 'minute', 'm', 'seconds', 'second', 's', 'milliseconds', 'millisecond', 'ms'],\n        i,\n        property;\n\n    for (i = 0; i < properties.length; i += 1) {\n      property = properties[i];\n      propertyTest = propertyTest || hasOwnProp(input, property);\n    }\n\n    return objectTest && propertyTest;\n  }\n\n  function isNumberOrStringArray(input) {\n    var arrayTest = isArray(input),\n        dataTypeTest = false;\n\n    if (arrayTest) {\n      dataTypeTest = input.filter(function (item) {\n        return !isNumber(item) && isString(input);\n      }).length === 0;\n    }\n\n    return arrayTest && dataTypeTest;\n  }\n\n  function isCalendarSpec(input) {\n    var objectTest = isObject(input) && !isObjectEmpty(input),\n        propertyTest = false,\n        properties = ['sameDay', 'nextDay', 'lastDay', 'nextWeek', 'lastWeek', 'sameElse'],\n        i,\n        property;\n\n    for (i = 0; i < properties.length; i += 1) {\n      property = properties[i];\n      propertyTest = propertyTest || hasOwnProp(input, property);\n    }\n\n    return objectTest && propertyTest;\n  }\n\n  function getCalendarFormat(myMoment, now) {\n    var diff = myMoment.diff(now, 'days', true);\n    return diff < -6 ? 'sameElse' : diff < -1 ? 'lastWeek' : diff < 0 ? 'lastDay' : diff < 1 ? 'sameDay' : diff < 2 ? 'nextDay' : diff < 7 ? 'nextWeek' : 'sameElse';\n  }\n\n  function calendar$1(time, formats) {\n    // Support for single parameter, formats only overload to the calendar function\n    if (arguments.length === 1) {\n      if (!arguments[0]) {\n        time = undefined;\n        formats = undefined;\n      } else if (isMomentInput(arguments[0])) {\n        time = arguments[0];\n        formats = undefined;\n      } else if (isCalendarSpec(arguments[0])) {\n        formats = arguments[0];\n        time = undefined;\n      }\n    } // We want to compare the start of today, vs this.\n    // Getting start-of-today depends on whether we're local/utc/offset or not.\n\n\n    var now = time || createLocal(),\n        sod = cloneWithOffset(now, this).startOf('day'),\n        format = hooks.calendarFormat(this, sod) || 'sameElse',\n        output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]);\n    return this.format(output || this.localeData().calendar(format, this, createLocal(now)));\n  }\n\n  function clone() {\n    return new Moment(this);\n  }\n\n  function isAfter(input, units) {\n    var localInput = isMoment(input) ? input : createLocal(input);\n\n    if (!(this.isValid() && localInput.isValid())) {\n      return false;\n    }\n\n    units = normalizeUnits(units) || 'millisecond';\n\n    if (units === 'millisecond') {\n      return this.valueOf() > localInput.valueOf();\n    } else {\n      return localInput.valueOf() < this.clone().startOf(units).valueOf();\n    }\n  }\n\n  function isBefore(input, units) {\n    var localInput = isMoment(input) ? input : createLocal(input);\n\n    if (!(this.isValid() && localInput.isValid())) {\n      return false;\n    }\n\n    units = normalizeUnits(units) || 'millisecond';\n\n    if (units === 'millisecond') {\n      return this.valueOf() < localInput.valueOf();\n    } else {\n      return this.clone().endOf(units).valueOf() < localInput.valueOf();\n    }\n  }\n\n  function isBetween(from, to, units, inclusivity) {\n    var localFrom = isMoment(from) ? from : createLocal(from),\n        localTo = isMoment(to) ? to : createLocal(to);\n\n    if (!(this.isValid() && localFrom.isValid() && localTo.isValid())) {\n      return false;\n    }\n\n    inclusivity = inclusivity || '()';\n    return (inclusivity[0] === '(' ? this.isAfter(localFrom, units) : !this.isBefore(localFrom, units)) && (inclusivity[1] === ')' ? this.isBefore(localTo, units) : !this.isAfter(localTo, units));\n  }\n\n  function isSame(input, units) {\n    var localInput = isMoment(input) ? input : createLocal(input),\n        inputMs;\n\n    if (!(this.isValid() && localInput.isValid())) {\n      return false;\n    }\n\n    units = normalizeUnits(units) || 'millisecond';\n\n    if (units === 'millisecond') {\n      return this.valueOf() === localInput.valueOf();\n    } else {\n      inputMs = localInput.valueOf();\n      return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf();\n    }\n  }\n\n  function isSameOrAfter(input, units) {\n    return this.isSame(input, units) || this.isAfter(input, units);\n  }\n\n  function isSameOrBefore(input, units) {\n    return this.isSame(input, units) || this.isBefore(input, units);\n  }\n\n  function diff(input, units, asFloat) {\n    var that, zoneDelta, output;\n\n    if (!this.isValid()) {\n      return NaN;\n    }\n\n    that = cloneWithOffset(input, this);\n\n    if (!that.isValid()) {\n      return NaN;\n    }\n\n    zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;\n    units = normalizeUnits(units);\n\n    switch (units) {\n      case 'year':\n        output = monthDiff(this, that) / 12;\n        break;\n\n      case 'month':\n        output = monthDiff(this, that);\n        break;\n\n      case 'quarter':\n        output = monthDiff(this, that) / 3;\n        break;\n\n      case 'second':\n        output = (this - that) / 1e3;\n        break;\n      // 1000\n\n      case 'minute':\n        output = (this - that) / 6e4;\n        break;\n      // 1000 * 60\n\n      case 'hour':\n        output = (this - that) / 36e5;\n        break;\n      // 1000 * 60 * 60\n\n      case 'day':\n        output = (this - that - zoneDelta) / 864e5;\n        break;\n      // 1000 * 60 * 60 * 24, negate dst\n\n      case 'week':\n        output = (this - that - zoneDelta) / 6048e5;\n        break;\n      // 1000 * 60 * 60 * 24 * 7, negate dst\n\n      default:\n        output = this - that;\n    }\n\n    return asFloat ? output : absFloor(output);\n  }\n\n  function monthDiff(a, b) {\n    if (a.date() < b.date()) {\n      // end-of-month calculations work correct when the start month has more\n      // days than the end month.\n      return -monthDiff(b, a);\n    } // difference in months\n\n\n    var wholeMonthDiff = (b.year() - a.year()) * 12 + (b.month() - a.month()),\n        // b is in (anchor - 1 month, anchor + 1 month)\n    anchor = a.clone().add(wholeMonthDiff, 'months'),\n        anchor2,\n        adjust;\n\n    if (b - anchor < 0) {\n      anchor2 = a.clone().add(wholeMonthDiff - 1, 'months'); // linear across the month\n\n      adjust = (b - anchor) / (anchor - anchor2);\n    } else {\n      anchor2 = a.clone().add(wholeMonthDiff + 1, 'months'); // linear across the month\n\n      adjust = (b - anchor) / (anchor2 - anchor);\n    } //check for negative zero, return zero if negative zero\n\n\n    return -(wholeMonthDiff + adjust) || 0;\n  }\n\n  hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';\n  hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';\n\n  function toString() {\n    return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');\n  }\n\n  function toISOString(keepOffset) {\n    if (!this.isValid()) {\n      return null;\n    }\n\n    var utc = keepOffset !== true,\n        m = utc ? this.clone().utc() : this;\n\n    if (m.year() < 0 || m.year() > 9999) {\n      return formatMoment(m, utc ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ');\n    }\n\n    if (isFunction(Date.prototype.toISOString)) {\n      // native implementation is ~50x faster, use it when we can\n      if (utc) {\n        return this.toDate().toISOString();\n      } else {\n        return new Date(this.valueOf() + this.utcOffset() * 60 * 1000).toISOString().replace('Z', formatMoment(m, 'Z'));\n      }\n    }\n\n    return formatMoment(m, utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ');\n  }\n  /**\n   * Return a human readable representation of a moment that can\n   * also be evaluated to get a new moment which is the same\n   *\n   * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects\n   */\n\n\n  function inspect() {\n    if (!this.isValid()) {\n      return 'moment.invalid(/* ' + this._i + ' */)';\n    }\n\n    var func = 'moment',\n        zone = '',\n        prefix,\n        year,\n        datetime,\n        suffix;\n\n    if (!this.isLocal()) {\n      func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';\n      zone = 'Z';\n    }\n\n    prefix = '[' + func + '(\"]';\n    year = 0 <= this.year() && this.year() <= 9999 ? 'YYYY' : 'YYYYYY';\n    datetime = '-MM-DD[T]HH:mm:ss.SSS';\n    suffix = zone + '[\")]';\n    return this.format(prefix + year + datetime + suffix);\n  }\n\n  function format(inputString) {\n    if (!inputString) {\n      inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat;\n    }\n\n    var output = formatMoment(this, inputString);\n    return this.localeData().postformat(output);\n  }\n\n  function from(time, withoutSuffix) {\n    if (this.isValid() && (isMoment(time) && time.isValid() || createLocal(time).isValid())) {\n      return createDuration({\n        to: this,\n        from: time\n      }).locale(this.locale()).humanize(!withoutSuffix);\n    } else {\n      return this.localeData().invalidDate();\n    }\n  }\n\n  function fromNow(withoutSuffix) {\n    return this.from(createLocal(), withoutSuffix);\n  }\n\n  function to(time, withoutSuffix) {\n    if (this.isValid() && (isMoment(time) && time.isValid() || createLocal(time).isValid())) {\n      return createDuration({\n        from: this,\n        to: time\n      }).locale(this.locale()).humanize(!withoutSuffix);\n    } else {\n      return this.localeData().invalidDate();\n    }\n  }\n\n  function toNow(withoutSuffix) {\n    return this.to(createLocal(), withoutSuffix);\n  } // If passed a locale key, it will set the locale for this\n  // instance.  Otherwise, it will return the locale configuration\n  // variables for this instance.\n\n\n  function locale(key) {\n    var newLocaleData;\n\n    if (key === undefined) {\n      return this._locale._abbr;\n    } else {\n      newLocaleData = getLocale(key);\n\n      if (newLocaleData != null) {\n        this._locale = newLocaleData;\n      }\n\n      return this;\n    }\n  }\n\n  var lang = deprecate('moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', function (key) {\n    if (key === undefined) {\n      return this.localeData();\n    } else {\n      return this.locale(key);\n    }\n  });\n\n  function localeData() {\n    return this._locale;\n  }\n\n  var MS_PER_SECOND = 1000,\n      MS_PER_MINUTE = 60 * MS_PER_SECOND,\n      MS_PER_HOUR = 60 * MS_PER_MINUTE,\n      MS_PER_400_YEARS = (365 * 400 + 97) * 24 * MS_PER_HOUR; // actual modulo - handles negative numbers (for dates before 1970):\n\n  function mod$1(dividend, divisor) {\n    return (dividend % divisor + divisor) % divisor;\n  }\n\n  function localStartOfDate(y, m, d) {\n    // the date constructor remaps years 0-99 to 1900-1999\n    if (y < 100 && y >= 0) {\n      // preserve leap years using a full 400 year cycle, then reset\n      return new Date(y + 400, m, d) - MS_PER_400_YEARS;\n    } else {\n      return new Date(y, m, d).valueOf();\n    }\n  }\n\n  function utcStartOfDate(y, m, d) {\n    // Date.UTC remaps years 0-99 to 1900-1999\n    if (y < 100 && y >= 0) {\n      // preserve leap years using a full 400 year cycle, then reset\n      return Date.UTC(y + 400, m, d) - MS_PER_400_YEARS;\n    } else {\n      return Date.UTC(y, m, d);\n    }\n  }\n\n  function startOf(units) {\n    var time, startOfDate;\n    units = normalizeUnits(units);\n\n    if (units === undefined || units === 'millisecond' || !this.isValid()) {\n      return this;\n    }\n\n    startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate;\n\n    switch (units) {\n      case 'year':\n        time = startOfDate(this.year(), 0, 1);\n        break;\n\n      case 'quarter':\n        time = startOfDate(this.year(), this.month() - this.month() % 3, 1);\n        break;\n\n      case 'month':\n        time = startOfDate(this.year(), this.month(), 1);\n        break;\n\n      case 'week':\n        time = startOfDate(this.year(), this.month(), this.date() - this.weekday());\n        break;\n\n      case 'isoWeek':\n        time = startOfDate(this.year(), this.month(), this.date() - (this.isoWeekday() - 1));\n        break;\n\n      case 'day':\n      case 'date':\n        time = startOfDate(this.year(), this.month(), this.date());\n        break;\n\n      case 'hour':\n        time = this._d.valueOf();\n        time -= mod$1(time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE), MS_PER_HOUR);\n        break;\n\n      case 'minute':\n        time = this._d.valueOf();\n        time -= mod$1(time, MS_PER_MINUTE);\n        break;\n\n      case 'second':\n        time = this._d.valueOf();\n        time -= mod$1(time, MS_PER_SECOND);\n        break;\n    }\n\n    this._d.setTime(time);\n\n    hooks.updateOffset(this, true);\n    return this;\n  }\n\n  function endOf(units) {\n    var time, startOfDate;\n    units = normalizeUnits(units);\n\n    if (units === undefined || units === 'millisecond' || !this.isValid()) {\n      return this;\n    }\n\n    startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate;\n\n    switch (units) {\n      case 'year':\n        time = startOfDate(this.year() + 1, 0, 1) - 1;\n        break;\n\n      case 'quarter':\n        time = startOfDate(this.year(), this.month() - this.month() % 3 + 3, 1) - 1;\n        break;\n\n      case 'month':\n        time = startOfDate(this.year(), this.month() + 1, 1) - 1;\n        break;\n\n      case 'week':\n        time = startOfDate(this.year(), this.month(), this.date() - this.weekday() + 7) - 1;\n        break;\n\n      case 'isoWeek':\n        time = startOfDate(this.year(), this.month(), this.date() - (this.isoWeekday() - 1) + 7) - 1;\n        break;\n\n      case 'day':\n      case 'date':\n        time = startOfDate(this.year(), this.month(), this.date() + 1) - 1;\n        break;\n\n      case 'hour':\n        time = this._d.valueOf();\n        time += MS_PER_HOUR - mod$1(time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE), MS_PER_HOUR) - 1;\n        break;\n\n      case 'minute':\n        time = this._d.valueOf();\n        time += MS_PER_MINUTE - mod$1(time, MS_PER_MINUTE) - 1;\n        break;\n\n      case 'second':\n        time = this._d.valueOf();\n        time += MS_PER_SECOND - mod$1(time, MS_PER_SECOND) - 1;\n        break;\n    }\n\n    this._d.setTime(time);\n\n    hooks.updateOffset(this, true);\n    return this;\n  }\n\n  function valueOf() {\n    return this._d.valueOf() - (this._offset || 0) * 60000;\n  }\n\n  function unix() {\n    return Math.floor(this.valueOf() / 1000);\n  }\n\n  function toDate() {\n    return new Date(this.valueOf());\n  }\n\n  function toArray() {\n    var m = this;\n    return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()];\n  }\n\n  function toObject() {\n    var m = this;\n    return {\n      years: m.year(),\n      months: m.month(),\n      date: m.date(),\n      hours: m.hours(),\n      minutes: m.minutes(),\n      seconds: m.seconds(),\n      milliseconds: m.milliseconds()\n    };\n  }\n\n  function toJSON() {\n    // new Date(NaN).toJSON() === null\n    return this.isValid() ? this.toISOString() : null;\n  }\n\n  function isValid$2() {\n    return isValid(this);\n  }\n\n  function parsingFlags() {\n    return extend({}, getParsingFlags(this));\n  }\n\n  function invalidAt() {\n    return getParsingFlags(this).overflow;\n  }\n\n  function creationData() {\n    return {\n      input: this._i,\n      format: this._f,\n      locale: this._locale,\n      isUTC: this._isUTC,\n      strict: this._strict\n    };\n  }\n\n  addFormatToken('N', 0, 0, 'eraAbbr');\n  addFormatToken('NN', 0, 0, 'eraAbbr');\n  addFormatToken('NNN', 0, 0, 'eraAbbr');\n  addFormatToken('NNNN', 0, 0, 'eraName');\n  addFormatToken('NNNNN', 0, 0, 'eraNarrow');\n  addFormatToken('y', ['y', 1], 'yo', 'eraYear');\n  addFormatToken('y', ['yy', 2], 0, 'eraYear');\n  addFormatToken('y', ['yyy', 3], 0, 'eraYear');\n  addFormatToken('y', ['yyyy', 4], 0, 'eraYear');\n  addRegexToken('N', matchEraAbbr);\n  addRegexToken('NN', matchEraAbbr);\n  addRegexToken('NNN', matchEraAbbr);\n  addRegexToken('NNNN', matchEraName);\n  addRegexToken('NNNNN', matchEraNarrow);\n  addParseToken(['N', 'NN', 'NNN', 'NNNN', 'NNNNN'], function (input, array, config, token) {\n    var era = config._locale.erasParse(input, token, config._strict);\n\n    if (era) {\n      getParsingFlags(config).era = era;\n    } else {\n      getParsingFlags(config).invalidEra = input;\n    }\n  });\n  addRegexToken('y', matchUnsigned);\n  addRegexToken('yy', matchUnsigned);\n  addRegexToken('yyy', matchUnsigned);\n  addRegexToken('yyyy', matchUnsigned);\n  addRegexToken('yo', matchEraYearOrdinal);\n  addParseToken(['y', 'yy', 'yyy', 'yyyy'], YEAR);\n  addParseToken(['yo'], function (input, array, config, token) {\n    var match;\n\n    if (config._locale._eraYearOrdinalRegex) {\n      match = input.match(config._locale._eraYearOrdinalRegex);\n    }\n\n    if (config._locale.eraYearOrdinalParse) {\n      array[YEAR] = config._locale.eraYearOrdinalParse(input, match);\n    } else {\n      array[YEAR] = parseInt(input, 10);\n    }\n  });\n\n  function localeEras(m, format) {\n    var i,\n        l,\n        date,\n        eras = this._eras || getLocale('en')._eras;\n\n    for (i = 0, l = eras.length; i < l; ++i) {\n      switch (typeof eras[i].since) {\n        case 'string':\n          // truncate time\n          date = hooks(eras[i].since).startOf('day');\n          eras[i].since = date.valueOf();\n          break;\n      }\n\n      switch (typeof eras[i].until) {\n        case 'undefined':\n          eras[i].until = +Infinity;\n          break;\n\n        case 'string':\n          // truncate time\n          date = hooks(eras[i].until).startOf('day').valueOf();\n          eras[i].until = date.valueOf();\n          break;\n      }\n    }\n\n    return eras;\n  }\n\n  function localeErasParse(eraName, format, strict) {\n    var i,\n        l,\n        eras = this.eras(),\n        name,\n        abbr,\n        narrow;\n    eraName = eraName.toUpperCase();\n\n    for (i = 0, l = eras.length; i < l; ++i) {\n      name = eras[i].name.toUpperCase();\n      abbr = eras[i].abbr.toUpperCase();\n      narrow = eras[i].narrow.toUpperCase();\n\n      if (strict) {\n        switch (format) {\n          case 'N':\n          case 'NN':\n          case 'NNN':\n            if (abbr === eraName) {\n              return eras[i];\n            }\n\n            break;\n\n          case 'NNNN':\n            if (name === eraName) {\n              return eras[i];\n            }\n\n            break;\n\n          case 'NNNNN':\n            if (narrow === eraName) {\n              return eras[i];\n            }\n\n            break;\n        }\n      } else if ([name, abbr, narrow].indexOf(eraName) >= 0) {\n        return eras[i];\n      }\n    }\n  }\n\n  function localeErasConvertYear(era, year) {\n    var dir = era.since <= era.until ? +1 : -1;\n\n    if (year === undefined) {\n      return hooks(era.since).year();\n    } else {\n      return hooks(era.since).year() + (year - era.offset) * dir;\n    }\n  }\n\n  function getEraName() {\n    var i,\n        l,\n        val,\n        eras = this.localeData().eras();\n\n    for (i = 0, l = eras.length; i < l; ++i) {\n      // truncate time\n      val = this.clone().startOf('day').valueOf();\n\n      if (eras[i].since <= val && val <= eras[i].until) {\n        return eras[i].name;\n      }\n\n      if (eras[i].until <= val && val <= eras[i].since) {\n        return eras[i].name;\n      }\n    }\n\n    return '';\n  }\n\n  function getEraNarrow() {\n    var i,\n        l,\n        val,\n        eras = this.localeData().eras();\n\n    for (i = 0, l = eras.length; i < l; ++i) {\n      // truncate time\n      val = this.clone().startOf('day').valueOf();\n\n      if (eras[i].since <= val && val <= eras[i].until) {\n        return eras[i].narrow;\n      }\n\n      if (eras[i].until <= val && val <= eras[i].since) {\n        return eras[i].narrow;\n      }\n    }\n\n    return '';\n  }\n\n  function getEraAbbr() {\n    var i,\n        l,\n        val,\n        eras = this.localeData().eras();\n\n    for (i = 0, l = eras.length; i < l; ++i) {\n      // truncate time\n      val = this.clone().startOf('day').valueOf();\n\n      if (eras[i].since <= val && val <= eras[i].until) {\n        return eras[i].abbr;\n      }\n\n      if (eras[i].until <= val && val <= eras[i].since) {\n        return eras[i].abbr;\n      }\n    }\n\n    return '';\n  }\n\n  function getEraYear() {\n    var i,\n        l,\n        dir,\n        val,\n        eras = this.localeData().eras();\n\n    for (i = 0, l = eras.length; i < l; ++i) {\n      dir = eras[i].since <= eras[i].until ? +1 : -1; // truncate time\n\n      val = this.clone().startOf('day').valueOf();\n\n      if (eras[i].since <= val && val <= eras[i].until || eras[i].until <= val && val <= eras[i].since) {\n        return (this.year() - hooks(eras[i].since).year()) * dir + eras[i].offset;\n      }\n    }\n\n    return this.year();\n  }\n\n  function erasNameRegex(isStrict) {\n    if (!hasOwnProp(this, '_erasNameRegex')) {\n      computeErasParse.call(this);\n    }\n\n    return isStrict ? this._erasNameRegex : this._erasRegex;\n  }\n\n  function erasAbbrRegex(isStrict) {\n    if (!hasOwnProp(this, '_erasAbbrRegex')) {\n      computeErasParse.call(this);\n    }\n\n    return isStrict ? this._erasAbbrRegex : this._erasRegex;\n  }\n\n  function erasNarrowRegex(isStrict) {\n    if (!hasOwnProp(this, '_erasNarrowRegex')) {\n      computeErasParse.call(this);\n    }\n\n    return isStrict ? this._erasNarrowRegex : this._erasRegex;\n  }\n\n  function matchEraAbbr(isStrict, locale) {\n    return locale.erasAbbrRegex(isStrict);\n  }\n\n  function matchEraName(isStrict, locale) {\n    return locale.erasNameRegex(isStrict);\n  }\n\n  function matchEraNarrow(isStrict, locale) {\n    return locale.erasNarrowRegex(isStrict);\n  }\n\n  function matchEraYearOrdinal(isStrict, locale) {\n    return locale._eraYearOrdinalRegex || matchUnsigned;\n  }\n\n  function computeErasParse() {\n    var abbrPieces = [],\n        namePieces = [],\n        narrowPieces = [],\n        mixedPieces = [],\n        i,\n        l,\n        eras = this.eras();\n\n    for (i = 0, l = eras.length; i < l; ++i) {\n      namePieces.push(regexEscape(eras[i].name));\n      abbrPieces.push(regexEscape(eras[i].abbr));\n      narrowPieces.push(regexEscape(eras[i].narrow));\n      mixedPieces.push(regexEscape(eras[i].name));\n      mixedPieces.push(regexEscape(eras[i].abbr));\n      mixedPieces.push(regexEscape(eras[i].narrow));\n    }\n\n    this._erasRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n    this._erasNameRegex = new RegExp('^(' + namePieces.join('|') + ')', 'i');\n    this._erasAbbrRegex = new RegExp('^(' + abbrPieces.join('|') + ')', 'i');\n    this._erasNarrowRegex = new RegExp('^(' + narrowPieces.join('|') + ')', 'i');\n  } // FORMATTING\n\n\n  addFormatToken(0, ['gg', 2], 0, function () {\n    return this.weekYear() % 100;\n  });\n  addFormatToken(0, ['GG', 2], 0, function () {\n    return this.isoWeekYear() % 100;\n  });\n\n  function addWeekYearFormatToken(token, getter) {\n    addFormatToken(0, [token, token.length], 0, getter);\n  }\n\n  addWeekYearFormatToken('gggg', 'weekYear');\n  addWeekYearFormatToken('ggggg', 'weekYear');\n  addWeekYearFormatToken('GGGG', 'isoWeekYear');\n  addWeekYearFormatToken('GGGGG', 'isoWeekYear'); // ALIASES\n\n  addUnitAlias('weekYear', 'gg');\n  addUnitAlias('isoWeekYear', 'GG'); // PRIORITY\n\n  addUnitPriority('weekYear', 1);\n  addUnitPriority('isoWeekYear', 1); // PARSING\n\n  addRegexToken('G', matchSigned);\n  addRegexToken('g', matchSigned);\n  addRegexToken('GG', match1to2, match2);\n  addRegexToken('gg', match1to2, match2);\n  addRegexToken('GGGG', match1to4, match4);\n  addRegexToken('gggg', match1to4, match4);\n  addRegexToken('GGGGG', match1to6, match6);\n  addRegexToken('ggggg', match1to6, match6);\n  addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) {\n    week[token.substr(0, 2)] = toInt(input);\n  });\n  addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {\n    week[token] = hooks.parseTwoDigitYear(input);\n  }); // MOMENTS\n\n  function getSetWeekYear(input) {\n    return getSetWeekYearHelper.call(this, input, this.week(), this.weekday(), this.localeData()._week.dow, this.localeData()._week.doy);\n  }\n\n  function getSetISOWeekYear(input) {\n    return getSetWeekYearHelper.call(this, input, this.isoWeek(), this.isoWeekday(), 1, 4);\n  }\n\n  function getISOWeeksInYear() {\n    return weeksInYear(this.year(), 1, 4);\n  }\n\n  function getISOWeeksInISOWeekYear() {\n    return weeksInYear(this.isoWeekYear(), 1, 4);\n  }\n\n  function getWeeksInYear() {\n    var weekInfo = this.localeData()._week;\n\n    return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);\n  }\n\n  function getWeeksInWeekYear() {\n    var weekInfo = this.localeData()._week;\n\n    return weeksInYear(this.weekYear(), weekInfo.dow, weekInfo.doy);\n  }\n\n  function getSetWeekYearHelper(input, week, weekday, dow, doy) {\n    var weeksTarget;\n\n    if (input == null) {\n      return weekOfYear(this, dow, doy).year;\n    } else {\n      weeksTarget = weeksInYear(input, dow, doy);\n\n      if (week > weeksTarget) {\n        week = weeksTarget;\n      }\n\n      return setWeekAll.call(this, input, week, weekday, dow, doy);\n    }\n  }\n\n  function setWeekAll(weekYear, week, weekday, dow, doy) {\n    var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),\n        date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);\n    this.year(date.getUTCFullYear());\n    this.month(date.getUTCMonth());\n    this.date(date.getUTCDate());\n    return this;\n  } // FORMATTING\n\n\n  addFormatToken('Q', 0, 'Qo', 'quarter'); // ALIASES\n\n  addUnitAlias('quarter', 'Q'); // PRIORITY\n\n  addUnitPriority('quarter', 7); // PARSING\n\n  addRegexToken('Q', match1);\n  addParseToken('Q', function (input, array) {\n    array[MONTH] = (toInt(input) - 1) * 3;\n  }); // MOMENTS\n\n  function getSetQuarter(input) {\n    return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);\n  } // FORMATTING\n\n\n  addFormatToken('D', ['DD', 2], 'Do', 'date'); // ALIASES\n\n  addUnitAlias('date', 'D'); // PRIORITY\n\n  addUnitPriority('date', 9); // PARSING\n\n  addRegexToken('D', match1to2);\n  addRegexToken('DD', match1to2, match2);\n  addRegexToken('Do', function (isStrict, locale) {\n    // TODO: Remove \"ordinalParse\" fallback in next major release.\n    return isStrict ? locale._dayOfMonthOrdinalParse || locale._ordinalParse : locale._dayOfMonthOrdinalParseLenient;\n  });\n  addParseToken(['D', 'DD'], DATE);\n  addParseToken('Do', function (input, array) {\n    array[DATE] = toInt(input.match(match1to2)[0]);\n  }); // MOMENTS\n\n  var getSetDayOfMonth = makeGetSet('Date', true); // FORMATTING\n\n  addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear'); // ALIASES\n\n  addUnitAlias('dayOfYear', 'DDD'); // PRIORITY\n\n  addUnitPriority('dayOfYear', 4); // PARSING\n\n  addRegexToken('DDD', match1to3);\n  addRegexToken('DDDD', match3);\n  addParseToken(['DDD', 'DDDD'], function (input, array, config) {\n    config._dayOfYear = toInt(input);\n  }); // HELPERS\n  // MOMENTS\n\n  function getSetDayOfYear(input) {\n    var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1;\n    return input == null ? dayOfYear : this.add(input - dayOfYear, 'd');\n  } // FORMATTING\n\n\n  addFormatToken('m', ['mm', 2], 0, 'minute'); // ALIASES\n\n  addUnitAlias('minute', 'm'); // PRIORITY\n\n  addUnitPriority('minute', 14); // PARSING\n\n  addRegexToken('m', match1to2);\n  addRegexToken('mm', match1to2, match2);\n  addParseToken(['m', 'mm'], MINUTE); // MOMENTS\n\n  var getSetMinute = makeGetSet('Minutes', false); // FORMATTING\n\n  addFormatToken('s', ['ss', 2], 0, 'second'); // ALIASES\n\n  addUnitAlias('second', 's'); // PRIORITY\n\n  addUnitPriority('second', 15); // PARSING\n\n  addRegexToken('s', match1to2);\n  addRegexToken('ss', match1to2, match2);\n  addParseToken(['s', 'ss'], SECOND); // MOMENTS\n\n  var getSetSecond = makeGetSet('Seconds', false); // FORMATTING\n\n  addFormatToken('S', 0, 0, function () {\n    return ~~(this.millisecond() / 100);\n  });\n  addFormatToken(0, ['SS', 2], 0, function () {\n    return ~~(this.millisecond() / 10);\n  });\n  addFormatToken(0, ['SSS', 3], 0, 'millisecond');\n  addFormatToken(0, ['SSSS', 4], 0, function () {\n    return this.millisecond() * 10;\n  });\n  addFormatToken(0, ['SSSSS', 5], 0, function () {\n    return this.millisecond() * 100;\n  });\n  addFormatToken(0, ['SSSSSS', 6], 0, function () {\n    return this.millisecond() * 1000;\n  });\n  addFormatToken(0, ['SSSSSSS', 7], 0, function () {\n    return this.millisecond() * 10000;\n  });\n  addFormatToken(0, ['SSSSSSSS', 8], 0, function () {\n    return this.millisecond() * 100000;\n  });\n  addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {\n    return this.millisecond() * 1000000;\n  }); // ALIASES\n\n  addUnitAlias('millisecond', 'ms'); // PRIORITY\n\n  addUnitPriority('millisecond', 16); // PARSING\n\n  addRegexToken('S', match1to3, match1);\n  addRegexToken('SS', match1to3, match2);\n  addRegexToken('SSS', match1to3, match3);\n  var token, getSetMillisecond;\n\n  for (token = 'SSSS'; token.length <= 9; token += 'S') {\n    addRegexToken(token, matchUnsigned);\n  }\n\n  function parseMs(input, array) {\n    array[MILLISECOND] = toInt(('0.' + input) * 1000);\n  }\n\n  for (token = 'S'; token.length <= 9; token += 'S') {\n    addParseToken(token, parseMs);\n  }\n\n  getSetMillisecond = makeGetSet('Milliseconds', false); // FORMATTING\n\n  addFormatToken('z', 0, 0, 'zoneAbbr');\n  addFormatToken('zz', 0, 0, 'zoneName'); // MOMENTS\n\n  function getZoneAbbr() {\n    return this._isUTC ? 'UTC' : '';\n  }\n\n  function getZoneName() {\n    return this._isUTC ? 'Coordinated Universal Time' : '';\n  }\n\n  var proto = Moment.prototype;\n  proto.add = add;\n  proto.calendar = calendar$1;\n  proto.clone = clone;\n  proto.diff = diff;\n  proto.endOf = endOf;\n  proto.format = format;\n  proto.from = from;\n  proto.fromNow = fromNow;\n  proto.to = to;\n  proto.toNow = toNow;\n  proto.get = stringGet;\n  proto.invalidAt = invalidAt;\n  proto.isAfter = isAfter;\n  proto.isBefore = isBefore;\n  proto.isBetween = isBetween;\n  proto.isSame = isSame;\n  proto.isSameOrAfter = isSameOrAfter;\n  proto.isSameOrBefore = isSameOrBefore;\n  proto.isValid = isValid$2;\n  proto.lang = lang;\n  proto.locale = locale;\n  proto.localeData = localeData;\n  proto.max = prototypeMax;\n  proto.min = prototypeMin;\n  proto.parsingFlags = parsingFlags;\n  proto.set = stringSet;\n  proto.startOf = startOf;\n  proto.subtract = subtract;\n  proto.toArray = toArray;\n  proto.toObject = toObject;\n  proto.toDate = toDate;\n  proto.toISOString = toISOString;\n  proto.inspect = inspect;\n\n  if (typeof Symbol !== 'undefined' && Symbol.for != null) {\n    proto[Symbol.for('nodejs.util.inspect.custom')] = function () {\n      return 'Moment<' + this.format() + '>';\n    };\n  }\n\n  proto.toJSON = toJSON;\n  proto.toString = toString;\n  proto.unix = unix;\n  proto.valueOf = valueOf;\n  proto.creationData = creationData;\n  proto.eraName = getEraName;\n  proto.eraNarrow = getEraNarrow;\n  proto.eraAbbr = getEraAbbr;\n  proto.eraYear = getEraYear;\n  proto.year = getSetYear;\n  proto.isLeapYear = getIsLeapYear;\n  proto.weekYear = getSetWeekYear;\n  proto.isoWeekYear = getSetISOWeekYear;\n  proto.quarter = proto.quarters = getSetQuarter;\n  proto.month = getSetMonth;\n  proto.daysInMonth = getDaysInMonth;\n  proto.week = proto.weeks = getSetWeek;\n  proto.isoWeek = proto.isoWeeks = getSetISOWeek;\n  proto.weeksInYear = getWeeksInYear;\n  proto.weeksInWeekYear = getWeeksInWeekYear;\n  proto.isoWeeksInYear = getISOWeeksInYear;\n  proto.isoWeeksInISOWeekYear = getISOWeeksInISOWeekYear;\n  proto.date = getSetDayOfMonth;\n  proto.day = proto.days = getSetDayOfWeek;\n  proto.weekday = getSetLocaleDayOfWeek;\n  proto.isoWeekday = getSetISODayOfWeek;\n  proto.dayOfYear = getSetDayOfYear;\n  proto.hour = proto.hours = getSetHour;\n  proto.minute = proto.minutes = getSetMinute;\n  proto.second = proto.seconds = getSetSecond;\n  proto.millisecond = proto.milliseconds = getSetMillisecond;\n  proto.utcOffset = getSetOffset;\n  proto.utc = setOffsetToUTC;\n  proto.local = setOffsetToLocal;\n  proto.parseZone = setOffsetToParsedOffset;\n  proto.hasAlignedHourOffset = hasAlignedHourOffset;\n  proto.isDST = isDaylightSavingTime;\n  proto.isLocal = isLocal;\n  proto.isUtcOffset = isUtcOffset;\n  proto.isUtc = isUtc;\n  proto.isUTC = isUtc;\n  proto.zoneAbbr = getZoneAbbr;\n  proto.zoneName = getZoneName;\n  proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth);\n  proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth);\n  proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear);\n  proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone);\n  proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted);\n\n  function createUnix(input) {\n    return createLocal(input * 1000);\n  }\n\n  function createInZone() {\n    return createLocal.apply(null, arguments).parseZone();\n  }\n\n  function preParsePostFormat(string) {\n    return string;\n  }\n\n  var proto$1 = Locale.prototype;\n  proto$1.calendar = calendar;\n  proto$1.longDateFormat = longDateFormat;\n  proto$1.invalidDate = invalidDate;\n  proto$1.ordinal = ordinal;\n  proto$1.preparse = preParsePostFormat;\n  proto$1.postformat = preParsePostFormat;\n  proto$1.relativeTime = relativeTime;\n  proto$1.pastFuture = pastFuture;\n  proto$1.set = set;\n  proto$1.eras = localeEras;\n  proto$1.erasParse = localeErasParse;\n  proto$1.erasConvertYear = localeErasConvertYear;\n  proto$1.erasAbbrRegex = erasAbbrRegex;\n  proto$1.erasNameRegex = erasNameRegex;\n  proto$1.erasNarrowRegex = erasNarrowRegex;\n  proto$1.months = localeMonths;\n  proto$1.monthsShort = localeMonthsShort;\n  proto$1.monthsParse = localeMonthsParse;\n  proto$1.monthsRegex = monthsRegex;\n  proto$1.monthsShortRegex = monthsShortRegex;\n  proto$1.week = localeWeek;\n  proto$1.firstDayOfYear = localeFirstDayOfYear;\n  proto$1.firstDayOfWeek = localeFirstDayOfWeek;\n  proto$1.weekdays = localeWeekdays;\n  proto$1.weekdaysMin = localeWeekdaysMin;\n  proto$1.weekdaysShort = localeWeekdaysShort;\n  proto$1.weekdaysParse = localeWeekdaysParse;\n  proto$1.weekdaysRegex = weekdaysRegex;\n  proto$1.weekdaysShortRegex = weekdaysShortRegex;\n  proto$1.weekdaysMinRegex = weekdaysMinRegex;\n  proto$1.isPM = localeIsPM;\n  proto$1.meridiem = localeMeridiem;\n\n  function get$1(format, index, field, setter) {\n    var locale = getLocale(),\n        utc = createUTC().set(setter, index);\n    return locale[field](utc, format);\n  }\n\n  function listMonthsImpl(format, index, field) {\n    if (isNumber(format)) {\n      index = format;\n      format = undefined;\n    }\n\n    format = format || '';\n\n    if (index != null) {\n      return get$1(format, index, field, 'month');\n    }\n\n    var i,\n        out = [];\n\n    for (i = 0; i < 12; i++) {\n      out[i] = get$1(format, i, field, 'month');\n    }\n\n    return out;\n  } // ()\n  // (5)\n  // (fmt, 5)\n  // (fmt)\n  // (true)\n  // (true, 5)\n  // (true, fmt, 5)\n  // (true, fmt)\n\n\n  function listWeekdaysImpl(localeSorted, format, index, field) {\n    if (typeof localeSorted === 'boolean') {\n      if (isNumber(format)) {\n        index = format;\n        format = undefined;\n      }\n\n      format = format || '';\n    } else {\n      format = localeSorted;\n      index = format;\n      localeSorted = false;\n\n      if (isNumber(format)) {\n        index = format;\n        format = undefined;\n      }\n\n      format = format || '';\n    }\n\n    var locale = getLocale(),\n        shift = localeSorted ? locale._week.dow : 0,\n        i,\n        out = [];\n\n    if (index != null) {\n      return get$1(format, (index + shift) % 7, field, 'day');\n    }\n\n    for (i = 0; i < 7; i++) {\n      out[i] = get$1(format, (i + shift) % 7, field, 'day');\n    }\n\n    return out;\n  }\n\n  function listMonths(format, index) {\n    return listMonthsImpl(format, index, 'months');\n  }\n\n  function listMonthsShort(format, index) {\n    return listMonthsImpl(format, index, 'monthsShort');\n  }\n\n  function listWeekdays(localeSorted, format, index) {\n    return listWeekdaysImpl(localeSorted, format, index, 'weekdays');\n  }\n\n  function listWeekdaysShort(localeSorted, format, index) {\n    return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');\n  }\n\n  function listWeekdaysMin(localeSorted, format, index) {\n    return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');\n  }\n\n  getSetGlobalLocale('en', {\n    eras: [{\n      since: '0001-01-01',\n      until: +Infinity,\n      offset: 1,\n      name: 'Anno Domini',\n      narrow: 'AD',\n      abbr: 'AD'\n    }, {\n      since: '0000-12-31',\n      until: -Infinity,\n      offset: 1,\n      name: 'Before Christ',\n      narrow: 'BC',\n      abbr: 'BC'\n    }],\n    dayOfMonthOrdinalParse: /\\d{1,2}(th|st|nd|rd)/,\n    ordinal: function (number) {\n      var b = number % 10,\n          output = toInt(number % 100 / 10) === 1 ? 'th' : b === 1 ? 'st' : b === 2 ? 'nd' : b === 3 ? 'rd' : 'th';\n      return number + output;\n    }\n  }); // Side effect imports\n\n  hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale);\n  hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale);\n  var mathAbs = Math.abs;\n\n  function abs() {\n    var data = this._data;\n    this._milliseconds = mathAbs(this._milliseconds);\n    this._days = mathAbs(this._days);\n    this._months = mathAbs(this._months);\n    data.milliseconds = mathAbs(data.milliseconds);\n    data.seconds = mathAbs(data.seconds);\n    data.minutes = mathAbs(data.minutes);\n    data.hours = mathAbs(data.hours);\n    data.months = mathAbs(data.months);\n    data.years = mathAbs(data.years);\n    return this;\n  }\n\n  function addSubtract$1(duration, input, value, direction) {\n    var other = createDuration(input, value);\n    duration._milliseconds += direction * other._milliseconds;\n    duration._days += direction * other._days;\n    duration._months += direction * other._months;\n    return duration._bubble();\n  } // supports only 2.0-style add(1, 's') or add(duration)\n\n\n  function add$1(input, value) {\n    return addSubtract$1(this, input, value, 1);\n  } // supports only 2.0-style subtract(1, 's') or subtract(duration)\n\n\n  function subtract$1(input, value) {\n    return addSubtract$1(this, input, value, -1);\n  }\n\n  function absCeil(number) {\n    if (number < 0) {\n      return Math.floor(number);\n    } else {\n      return Math.ceil(number);\n    }\n  }\n\n  function bubble() {\n    var milliseconds = this._milliseconds,\n        days = this._days,\n        months = this._months,\n        data = this._data,\n        seconds,\n        minutes,\n        hours,\n        years,\n        monthsFromDays; // if we have a mix of positive and negative values, bubble down first\n    // check: https://github.com/moment/moment/issues/2166\n\n    if (!(milliseconds >= 0 && days >= 0 && months >= 0 || milliseconds <= 0 && days <= 0 && months <= 0)) {\n      milliseconds += absCeil(monthsToDays(months) + days) * 864e5;\n      days = 0;\n      months = 0;\n    } // The following code bubbles up values, see the tests for\n    // examples of what that means.\n\n\n    data.milliseconds = milliseconds % 1000;\n    seconds = absFloor(milliseconds / 1000);\n    data.seconds = seconds % 60;\n    minutes = absFloor(seconds / 60);\n    data.minutes = minutes % 60;\n    hours = absFloor(minutes / 60);\n    data.hours = hours % 24;\n    days += absFloor(hours / 24); // convert days to months\n\n    monthsFromDays = absFloor(daysToMonths(days));\n    months += monthsFromDays;\n    days -= absCeil(monthsToDays(monthsFromDays)); // 12 months -> 1 year\n\n    years = absFloor(months / 12);\n    months %= 12;\n    data.days = days;\n    data.months = months;\n    data.years = years;\n    return this;\n  }\n\n  function daysToMonths(days) {\n    // 400 years have 146097 days (taking into account leap year rules)\n    // 400 years have 12 months === 4800\n    return days * 4800 / 146097;\n  }\n\n  function monthsToDays(months) {\n    // the reverse of daysToMonths\n    return months * 146097 / 4800;\n  }\n\n  function as(units) {\n    if (!this.isValid()) {\n      return NaN;\n    }\n\n    var days,\n        months,\n        milliseconds = this._milliseconds;\n    units = normalizeUnits(units);\n\n    if (units === 'month' || units === 'quarter' || units === 'year') {\n      days = this._days + milliseconds / 864e5;\n      months = this._months + daysToMonths(days);\n\n      switch (units) {\n        case 'month':\n          return months;\n\n        case 'quarter':\n          return months / 3;\n\n        case 'year':\n          return months / 12;\n      }\n    } else {\n      // handle milliseconds separately because of floating point math errors (issue #1867)\n      days = this._days + Math.round(monthsToDays(this._months));\n\n      switch (units) {\n        case 'week':\n          return days / 7 + milliseconds / 6048e5;\n\n        case 'day':\n          return days + milliseconds / 864e5;\n\n        case 'hour':\n          return days * 24 + milliseconds / 36e5;\n\n        case 'minute':\n          return days * 1440 + milliseconds / 6e4;\n\n        case 'second':\n          return days * 86400 + milliseconds / 1000;\n        // Math.floor prevents floating point math errors here\n\n        case 'millisecond':\n          return Math.floor(days * 864e5) + milliseconds;\n\n        default:\n          throw new Error('Unknown unit ' + units);\n      }\n    }\n  } // TODO: Use this.as('ms')?\n\n\n  function valueOf$1() {\n    if (!this.isValid()) {\n      return NaN;\n    }\n\n    return this._milliseconds + this._days * 864e5 + this._months % 12 * 2592e6 + toInt(this._months / 12) * 31536e6;\n  }\n\n  function makeAs(alias) {\n    return function () {\n      return this.as(alias);\n    };\n  }\n\n  var asMilliseconds = makeAs('ms'),\n      asSeconds = makeAs('s'),\n      asMinutes = makeAs('m'),\n      asHours = makeAs('h'),\n      asDays = makeAs('d'),\n      asWeeks = makeAs('w'),\n      asMonths = makeAs('M'),\n      asQuarters = makeAs('Q'),\n      asYears = makeAs('y');\n\n  function clone$1() {\n    return createDuration(this);\n  }\n\n  function get$2(units) {\n    units = normalizeUnits(units);\n    return this.isValid() ? this[units + 's']() : NaN;\n  }\n\n  function makeGetter(name) {\n    return function () {\n      return this.isValid() ? this._data[name] : NaN;\n    };\n  }\n\n  var milliseconds = makeGetter('milliseconds'),\n      seconds = makeGetter('seconds'),\n      minutes = makeGetter('minutes'),\n      hours = makeGetter('hours'),\n      days = makeGetter('days'),\n      months = makeGetter('months'),\n      years = makeGetter('years');\n\n  function weeks() {\n    return absFloor(this.days() / 7);\n  }\n\n  var round = Math.round,\n      thresholds = {\n    ss: 44,\n    // a few seconds to seconds\n    s: 45,\n    // seconds to minute\n    m: 45,\n    // minutes to hour\n    h: 22,\n    // hours to day\n    d: 26,\n    // days to month/week\n    w: null,\n    // weeks to month\n    M: 11 // months to year\n\n  }; // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize\n\n  function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {\n    return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);\n  }\n\n  function relativeTime$1(posNegDuration, withoutSuffix, thresholds, locale) {\n    var duration = createDuration(posNegDuration).abs(),\n        seconds = round(duration.as('s')),\n        minutes = round(duration.as('m')),\n        hours = round(duration.as('h')),\n        days = round(duration.as('d')),\n        months = round(duration.as('M')),\n        weeks = round(duration.as('w')),\n        years = round(duration.as('y')),\n        a = seconds <= thresholds.ss && ['s', seconds] || seconds < thresholds.s && ['ss', seconds] || minutes <= 1 && ['m'] || minutes < thresholds.m && ['mm', minutes] || hours <= 1 && ['h'] || hours < thresholds.h && ['hh', hours] || days <= 1 && ['d'] || days < thresholds.d && ['dd', days];\n\n    if (thresholds.w != null) {\n      a = a || weeks <= 1 && ['w'] || weeks < thresholds.w && ['ww', weeks];\n    }\n\n    a = a || months <= 1 && ['M'] || months < thresholds.M && ['MM', months] || years <= 1 && ['y'] || ['yy', years];\n    a[2] = withoutSuffix;\n    a[3] = +posNegDuration > 0;\n    a[4] = locale;\n    return substituteTimeAgo.apply(null, a);\n  } // This function allows you to set the rounding function for relative time strings\n\n\n  function getSetRelativeTimeRounding(roundingFunction) {\n    if (roundingFunction === undefined) {\n      return round;\n    }\n\n    if (typeof roundingFunction === 'function') {\n      round = roundingFunction;\n      return true;\n    }\n\n    return false;\n  } // This function allows you to set a threshold for relative time strings\n\n\n  function getSetRelativeTimeThreshold(threshold, limit) {\n    if (thresholds[threshold] === undefined) {\n      return false;\n    }\n\n    if (limit === undefined) {\n      return thresholds[threshold];\n    }\n\n    thresholds[threshold] = limit;\n\n    if (threshold === 's') {\n      thresholds.ss = limit - 1;\n    }\n\n    return true;\n  }\n\n  function humanize(argWithSuffix, argThresholds) {\n    if (!this.isValid()) {\n      return this.localeData().invalidDate();\n    }\n\n    var withSuffix = false,\n        th = thresholds,\n        locale,\n        output;\n\n    if (typeof argWithSuffix === 'object') {\n      argThresholds = argWithSuffix;\n      argWithSuffix = false;\n    }\n\n    if (typeof argWithSuffix === 'boolean') {\n      withSuffix = argWithSuffix;\n    }\n\n    if (typeof argThresholds === 'object') {\n      th = Object.assign({}, thresholds, argThresholds);\n\n      if (argThresholds.s != null && argThresholds.ss == null) {\n        th.ss = argThresholds.s - 1;\n      }\n    }\n\n    locale = this.localeData();\n    output = relativeTime$1(this, !withSuffix, th, locale);\n\n    if (withSuffix) {\n      output = locale.pastFuture(+this, output);\n    }\n\n    return locale.postformat(output);\n  }\n\n  var abs$1 = Math.abs;\n\n  function sign(x) {\n    return (x > 0) - (x < 0) || +x;\n  }\n\n  function toISOString$1() {\n    // for ISO strings we do not use the normal bubbling rules:\n    //  * milliseconds bubble up until they become hours\n    //  * days do not bubble at all\n    //  * months bubble up until they become years\n    // This is because there is no context-free conversion between hours and days\n    // (think of clock changes)\n    // and also not between days and months (28-31 days per month)\n    if (!this.isValid()) {\n      return this.localeData().invalidDate();\n    }\n\n    var seconds = abs$1(this._milliseconds) / 1000,\n        days = abs$1(this._days),\n        months = abs$1(this._months),\n        minutes,\n        hours,\n        years,\n        s,\n        total = this.asSeconds(),\n        totalSign,\n        ymSign,\n        daysSign,\n        hmsSign;\n\n    if (!total) {\n      // this is the same as C#'s (Noda) and python (isodate)...\n      // but not other JS (goog.date)\n      return 'P0D';\n    } // 3600 seconds -> 60 minutes -> 1 hour\n\n\n    minutes = absFloor(seconds / 60);\n    hours = absFloor(minutes / 60);\n    seconds %= 60;\n    minutes %= 60; // 12 months -> 1 year\n\n    years = absFloor(months / 12);\n    months %= 12; // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js\n\n    s = seconds ? seconds.toFixed(3).replace(/\\.?0+$/, '') : '';\n    totalSign = total < 0 ? '-' : '';\n    ymSign = sign(this._months) !== sign(total) ? '-' : '';\n    daysSign = sign(this._days) !== sign(total) ? '-' : '';\n    hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : '';\n    return totalSign + 'P' + (years ? ymSign + years + 'Y' : '') + (months ? ymSign + months + 'M' : '') + (days ? daysSign + days + 'D' : '') + (hours || minutes || seconds ? 'T' : '') + (hours ? hmsSign + hours + 'H' : '') + (minutes ? hmsSign + minutes + 'M' : '') + (seconds ? hmsSign + s + 'S' : '');\n  }\n\n  var proto$2 = Duration.prototype;\n  proto$2.isValid = isValid$1;\n  proto$2.abs = abs;\n  proto$2.add = add$1;\n  proto$2.subtract = subtract$1;\n  proto$2.as = as;\n  proto$2.asMilliseconds = asMilliseconds;\n  proto$2.asSeconds = asSeconds;\n  proto$2.asMinutes = asMinutes;\n  proto$2.asHours = asHours;\n  proto$2.asDays = asDays;\n  proto$2.asWeeks = asWeeks;\n  proto$2.asMonths = asMonths;\n  proto$2.asQuarters = asQuarters;\n  proto$2.asYears = asYears;\n  proto$2.valueOf = valueOf$1;\n  proto$2._bubble = bubble;\n  proto$2.clone = clone$1;\n  proto$2.get = get$2;\n  proto$2.milliseconds = milliseconds;\n  proto$2.seconds = seconds;\n  proto$2.minutes = minutes;\n  proto$2.hours = hours;\n  proto$2.days = days;\n  proto$2.weeks = weeks;\n  proto$2.months = months;\n  proto$2.years = years;\n  proto$2.humanize = humanize;\n  proto$2.toISOString = toISOString$1;\n  proto$2.toString = toISOString$1;\n  proto$2.toJSON = toISOString$1;\n  proto$2.locale = locale;\n  proto$2.localeData = localeData;\n  proto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1);\n  proto$2.lang = lang; // FORMATTING\n\n  addFormatToken('X', 0, 0, 'unix');\n  addFormatToken('x', 0, 0, 'valueOf'); // PARSING\n\n  addRegexToken('x', matchSigned);\n  addRegexToken('X', matchTimestamp);\n  addParseToken('X', function (input, array, config) {\n    config._d = new Date(parseFloat(input) * 1000);\n  });\n  addParseToken('x', function (input, array, config) {\n    config._d = new Date(toInt(input));\n  }); //! moment.js\n\n  hooks.version = '2.29.1';\n  setHookCallback(createLocal);\n  hooks.fn = proto;\n  hooks.min = min;\n  hooks.max = max;\n  hooks.now = now;\n  hooks.utc = createUTC;\n  hooks.unix = createUnix;\n  hooks.months = listMonths;\n  hooks.isDate = isDate;\n  hooks.locale = getSetGlobalLocale;\n  hooks.invalid = createInvalid;\n  hooks.duration = createDuration;\n  hooks.isMoment = isMoment;\n  hooks.weekdays = listWeekdays;\n  hooks.parseZone = createInZone;\n  hooks.localeData = getLocale;\n  hooks.isDuration = isDuration;\n  hooks.monthsShort = listMonthsShort;\n  hooks.weekdaysMin = listWeekdaysMin;\n  hooks.defineLocale = defineLocale;\n  hooks.updateLocale = updateLocale;\n  hooks.locales = listLocales;\n  hooks.weekdaysShort = listWeekdaysShort;\n  hooks.normalizeUnits = normalizeUnits;\n  hooks.relativeTimeRounding = getSetRelativeTimeRounding;\n  hooks.relativeTimeThreshold = getSetRelativeTimeThreshold;\n  hooks.calendarFormat = getCalendarFormat;\n  hooks.prototype = proto; // currently HTML5 input type only supports 24-hour formats\n\n  hooks.HTML5_FMT = {\n    DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm',\n    // <input type=\"datetime-local\" />\n    DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss',\n    // <input type=\"datetime-local\" step=\"1\" />\n    DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS',\n    // <input type=\"datetime-local\" step=\"0.001\" />\n    DATE: 'YYYY-MM-DD',\n    // <input type=\"date\" />\n    TIME: 'HH:mm',\n    // <input type=\"time\" />\n    TIME_SECONDS: 'HH:mm:ss',\n    // <input type=\"time\" step=\"1\" />\n    TIME_MS: 'HH:mm:ss.SSS',\n    // <input type=\"time\" step=\"0.001\" />\n    WEEK: 'GGGG-[W]WW',\n    // <input type=\"week\" />\n    MONTH: 'YYYY-MM' // <input type=\"month\" />\n\n  };\n  return hooks;\n});","map":{"version":3,"sources":["C:/Users/kkwan_000/Desktop/git/2017110269/minsung/node_modules/moment/moment.js"],"names":["global","factory","exports","module","define","amd","moment","hookCallback","hooks","apply","arguments","setHookCallback","callback","isArray","input","Array","Object","prototype","toString","call","isObject","hasOwnProp","a","b","hasOwnProperty","isObjectEmpty","obj","getOwnPropertyNames","length","k","isUndefined","isNumber","isDate","Date","map","arr","fn","res","i","push","extend","valueOf","createUTC","format","locale","strict","createLocalOrUTC","utc","defaultParsingFlags","empty","unusedTokens","unusedInput","overflow","charsLeftOver","nullInput","invalidEra","invalidMonth","invalidFormat","userInvalidated","iso","parsedDateParts","era","meridiem","rfc2822","weekdayMismatch","getParsingFlags","m","_pf","some","fun","t","len","isValid","_isValid","flags","parsedParts","isNowValid","isNaN","_d","getTime","invalidWeekday","_strict","bigHour","undefined","isFrozen","createInvalid","NaN","momentProperties","updateInProgress","copyConfig","to","from","prop","val","_isAMomentObject","_i","_f","_l","_tzm","_isUTC","_offset","_locale","Moment","config","updateOffset","isMoment","warn","msg","suppressDeprecationWarnings","console","deprecate","firstTime","deprecationHandler","args","arg","key","slice","join","Error","stack","deprecations","deprecateSimple","name","isFunction","Function","set","_config","_dayOfMonthOrdinalParseLenient","RegExp","_dayOfMonthOrdinalParse","source","_ordinalParse","mergeConfigs","parentConfig","childConfig","Locale","keys","defaultCalendar","sameDay","nextDay","nextWeek","lastDay","lastWeek","sameElse","calendar","mom","now","output","_calendar","zeroFill","number","targetLength","forceSign","absNumber","Math","abs","zerosToFill","sign","pow","max","substr","formattingTokens","localFormattingTokens","formatFunctions","formatTokenFunctions","addFormatToken","token","padded","ordinal","func","localeData","removeFormattingTokens","match","replace","makeFormatFunction","array","formatMoment","invalidDate","expandFormat","replaceLongDateFormatTokens","longDateFormat","lastIndex","test","defaultLongDateFormat","LTS","LT","L","LL","LLL","LLLL","_longDateFormat","formatUpper","toUpperCase","tok","defaultInvalidDate","_invalidDate","defaultOrdinal","defaultDayOfMonthOrdinalParse","_ordinal","defaultRelativeTime","future","past","s","ss","mm","h","hh","d","dd","w","ww","M","MM","y","yy","relativeTime","withoutSuffix","string","isFuture","_relativeTime","pastFuture","diff","aliases","addUnitAlias","unit","shorthand","lowerCase","toLowerCase","normalizeUnits","units","normalizeObjectUnits","inputObject","normalizedInput","normalizedProp","priorities","addUnitPriority","priority","getPrioritizedUnits","unitsObj","u","sort","isLeapYear","year","absFloor","ceil","floor","toInt","argumentForCoercion","coercedNumber","value","isFinite","makeGetSet","keepTime","set$1","get","month","date","daysInMonth","stringGet","stringSet","prioritized","match1","match2","match3","match4","match6","match1to2","match3to4","match5to6","match1to3","match1to4","match1to6","matchUnsigned","matchSigned","matchOffset","matchShortOffset","matchTimestamp","matchWord","regexes","addRegexToken","regex","strictRegex","isStrict","getParseRegexForToken","unescapeFormat","regexEscape","matched","p1","p2","p3","p4","tokens","addParseToken","addWeekParseToken","_w","addTimeToArrayFromToken","_a","YEAR","MONTH","DATE","HOUR","MINUTE","SECOND","MILLISECOND","WEEK","WEEKDAY","mod","n","x","indexOf","o","modMonth","monthsShort","months","monthsShortRegex","monthsRegex","monthsParse","defaultLocaleMonths","split","defaultLocaleMonthsShort","MONTHS_IN_FORMAT","defaultMonthsShortRegex","defaultMonthsRegex","localeMonths","_months","isFormat","localeMonthsShort","_monthsShort","handleStrictParse","monthName","ii","llc","toLocaleLowerCase","_monthsParse","_longMonthsParse","_shortMonthsParse","localeMonthsParse","_monthsParseExact","setMonth","dayOfMonth","min","getSetMonth","getDaysInMonth","computeMonthsParse","_monthsShortStrictRegex","_monthsShortRegex","_monthsStrictRegex","_monthsRegex","cmpLenRev","shortPieces","longPieces","mixedPieces","parseTwoDigitYear","parseInt","daysInYear","getSetYear","getIsLeapYear","createDate","ms","getFullYear","setFullYear","createUTCDate","UTC","getUTCFullYear","setUTCFullYear","firstWeekOffset","dow","doy","fwd","fwdlw","getUTCDay","dayOfYearFromWeeks","week","weekday","localWeekday","weekOffset","dayOfYear","resYear","resDayOfYear","weekOfYear","resWeek","weeksInYear","weekOffsetNext","localeWeek","_week","defaultLocaleWeek","localeFirstDayOfWeek","localeFirstDayOfYear","getSetWeek","add","getSetISOWeek","weekdaysMin","weekdaysShort","weekdays","weekdaysMinRegex","weekdaysShortRegex","weekdaysRegex","weekdaysParse","parseWeekday","parseIsoWeekday","shiftWeekdays","ws","concat","defaultLocaleWeekdays","defaultLocaleWeekdaysShort","defaultLocaleWeekdaysMin","defaultWeekdaysRegex","defaultWeekdaysShortRegex","defaultWeekdaysMinRegex","localeWeekdays","_weekdays","day","localeWeekdaysShort","_weekdaysShort","localeWeekdaysMin","_weekdaysMin","handleStrictParse$1","weekdayName","_weekdaysParse","_shortWeekdaysParse","_minWeekdaysParse","localeWeekdaysParse","_weekdaysParseExact","_fullWeekdaysParse","getSetDayOfWeek","getDay","getSetLocaleDayOfWeek","getSetISODayOfWeek","computeWeekdaysParse","_weekdaysStrictRegex","_weekdaysRegex","_weekdaysShortStrictRegex","_weekdaysShortRegex","_weekdaysMinStrictRegex","_weekdaysMinRegex","minPieces","minp","shortp","longp","hFormat","hours","kFormat","minutes","seconds","lowercase","matchMeridiem","_meridiemParse","kInput","_isPm","isPM","_meridiem","pos","pos1","pos2","localeIsPM","charAt","defaultLocaleMeridiemParse","getSetHour","localeMeridiem","isLower","baseConfig","dayOfMonthOrdinalParse","meridiemParse","locales","localeFamilies","globalLocale","commonPrefix","arr1","arr2","minl","normalizeLocale","chooseLocale","names","j","next","loadLocale","oldLocale","aliasedRequire","_abbr","require","getSetGlobalLocale","e","values","data","getLocale","defineLocale","abbr","parentLocale","forEach","updateLocale","tmpLocale","listLocales","checkOverflow","_overflowDayOfYear","_overflowWeeks","_overflowWeekday","extendedIsoRegex","basicIsoRegex","tzRegex","isoDates","isoTimes","aspNetJsonRegex","obsOffsets","UT","GMT","EDT","EST","CDT","CST","MDT","MST","PDT","PST","configFromISO","l","exec","allowTime","dateFormat","timeFormat","tzFormat","configFromStringAndFormat","extractFromRFC2822Strings","yearStr","monthStr","dayStr","hourStr","minuteStr","secondStr","result","untruncateYear","preprocessRFC2822","checkWeekday","weekdayStr","parsedInput","weekdayProvided","weekdayActual","calculateOffset","obsOffset","militaryOffset","numOffset","hm","configFromRFC2822","parsedArray","setUTCMinutes","getUTCMinutes","configFromString","createFromInputFallback","_useUTC","defaults","c","currentDateArray","nowValue","getUTCMonth","getUTCDate","getMonth","getDate","configFromArray","currentDate","expectedWeekday","yearToUse","dayOfYearFromWeekInfo","_dayOfYear","_nextDay","weekYear","temp","weekdayOverflow","curWeek","GG","W","E","createLocal","gg","ISO_8601","RFC_2822","skipped","stringLength","totalParsedInputLength","meridiemFixWrap","erasConvertYear","hour","isPm","meridiemHour","configFromStringAndArray","tempConfig","bestMoment","scoreToBeat","currentScore","validFormatFound","bestFormatIsValid","score","configFromObject","dayOrDate","minute","second","millisecond","createFromConfig","prepareConfig","preparse","configFromInput","isUTC","prototypeMin","other","prototypeMax","pickBy","moments","ordering","isDurationValid","unitHasDecimal","parseFloat","isValid$1","createInvalid$1","createDuration","Duration","duration","years","quarters","quarter","weeks","isoWeek","days","milliseconds","_milliseconds","_days","_data","_bubble","isDuration","absRound","round","compareArrays","array1","array2","dontConvert","lengthDiff","diffs","offset","separator","utcOffset","offsetFromString","chunkOffset","matcher","matches","chunk","parts","cloneWithOffset","model","clone","setTime","local","getDateOffset","getTimezoneOffset","getSetOffset","keepLocalTime","keepMinutes","localAdjust","_changeInProgress","addSubtract","getSetZone","setOffsetToUTC","setOffsetToLocal","subtract","setOffsetToParsedOffset","tZone","hasAlignedHourOffset","isDaylightSavingTime","isDaylightSavingTimeShifted","_isDSTShifted","toArray","isLocal","isUtcOffset","isUtc","aspNetRegex","isoRegex","ret","diffRes","parseIso","momentsDifference","invalid","inp","positiveMomentsDifference","base","isAfter","isBefore","createAdder","direction","period","dur","tmp","isAdding","isString","String","isMomentInput","isNumberOrStringArray","isMomentInputObject","objectTest","propertyTest","properties","property","arrayTest","dataTypeTest","filter","item","isCalendarSpec","getCalendarFormat","myMoment","calendar$1","time","formats","sod","startOf","calendarFormat","localInput","endOf","isBetween","inclusivity","localFrom","localTo","isSame","inputMs","isSameOrAfter","isSameOrBefore","asFloat","that","zoneDelta","monthDiff","wholeMonthDiff","anchor","anchor2","adjust","defaultFormat","defaultFormatUtc","toISOString","keepOffset","toDate","inspect","zone","prefix","datetime","suffix","inputString","postformat","humanize","fromNow","toNow","newLocaleData","lang","MS_PER_SECOND","MS_PER_MINUTE","MS_PER_HOUR","MS_PER_400_YEARS","mod$1","dividend","divisor","localStartOfDate","utcStartOfDate","startOfDate","isoWeekday","unix","toObject","toJSON","isValid$2","parsingFlags","invalidAt","creationData","matchEraAbbr","matchEraName","matchEraNarrow","erasParse","matchEraYearOrdinal","_eraYearOrdinalRegex","eraYearOrdinalParse","localeEras","eras","_eras","since","until","Infinity","localeErasParse","eraName","narrow","localeErasConvertYear","dir","getEraName","getEraNarrow","getEraAbbr","getEraYear","erasNameRegex","computeErasParse","_erasNameRegex","_erasRegex","erasAbbrRegex","_erasAbbrRegex","erasNarrowRegex","_erasNarrowRegex","abbrPieces","namePieces","narrowPieces","isoWeekYear","addWeekYearFormatToken","getter","getSetWeekYear","getSetWeekYearHelper","getSetISOWeekYear","getISOWeeksInYear","getISOWeeksInISOWeekYear","getWeeksInYear","weekInfo","getWeeksInWeekYear","weeksTarget","setWeekAll","dayOfYearData","getSetQuarter","getSetDayOfMonth","getSetDayOfYear","getSetMinute","getSetSecond","getSetMillisecond","parseMs","getZoneAbbr","getZoneName","proto","Symbol","for","eraNarrow","eraAbbr","eraYear","isoWeeks","weeksInWeekYear","isoWeeksInYear","isoWeeksInISOWeekYear","parseZone","isDST","zoneAbbr","zoneName","dates","isDSTShifted","createUnix","createInZone","preParsePostFormat","proto$1","firstDayOfYear","firstDayOfWeek","get$1","index","field","setter","listMonthsImpl","out","listWeekdaysImpl","localeSorted","shift","listMonths","listMonthsShort","listWeekdays","listWeekdaysShort","listWeekdaysMin","langData","mathAbs","addSubtract$1","add$1","subtract$1","absCeil","bubble","monthsFromDays","monthsToDays","daysToMonths","as","valueOf$1","makeAs","alias","asMilliseconds","asSeconds","asMinutes","asHours","asDays","asWeeks","asMonths","asQuarters","asYears","clone$1","get$2","makeGetter","thresholds","substituteTimeAgo","relativeTime$1","posNegDuration","getSetRelativeTimeRounding","roundingFunction","getSetRelativeTimeThreshold","threshold","limit","argWithSuffix","argThresholds","withSuffix","th","assign","abs$1","toISOString$1","total","totalSign","ymSign","daysSign","hmsSign","toFixed","proto$2","toIsoString","version","relativeTimeRounding","relativeTimeThreshold","HTML5_FMT","DATETIME_LOCAL","DATETIME_LOCAL_SECONDS","DATETIME_LOCAL_MS","TIME","TIME_SECONDS","TIME_MS"],"mappings":"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","sourcesContent":["//! moment.js\n//! version : 2.29.1\n//! authors : Tim Wood, Iskren Chernev, Moment.js contributors\n//! license : MIT\n//! momentjs.com\n\n;(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n    typeof define === 'function' && define.amd ? define(factory) :\n    global.moment = factory()\n}(this, (function () { 'use strict';\n\n    var hookCallback;\n\n    function hooks() {\n        return hookCallback.apply(null, arguments);\n    }\n\n    // This is done to register the method called with moment()\n    // without creating circular dependencies.\n    function setHookCallback(callback) {\n        hookCallback = callback;\n    }\n\n    function isArray(input) {\n        return (\n            input instanceof Array ||\n            Object.prototype.toString.call(input) === '[object Array]'\n        );\n    }\n\n    function isObject(input) {\n        // IE8 will treat undefined and null as object if it wasn't for\n        // input != null\n        return (\n            input != null &&\n            Object.prototype.toString.call(input) === '[object Object]'\n        );\n    }\n\n    function hasOwnProp(a, b) {\n        return Object.prototype.hasOwnProperty.call(a, b);\n    }\n\n    function isObjectEmpty(obj) {\n        if (Object.getOwnPropertyNames) {\n            return Object.getOwnPropertyNames(obj).length === 0;\n        } else {\n            var k;\n            for (k in obj) {\n                if (hasOwnProp(obj, k)) {\n                    return false;\n                }\n            }\n            return true;\n        }\n    }\n\n    function isUndefined(input) {\n        return input === void 0;\n    }\n\n    function isNumber(input) {\n        return (\n            typeof input === 'number' ||\n            Object.prototype.toString.call(input) === '[object Number]'\n        );\n    }\n\n    function isDate(input) {\n        return (\n            input instanceof Date ||\n            Object.prototype.toString.call(input) === '[object Date]'\n        );\n    }\n\n    function map(arr, fn) {\n        var res = [],\n            i;\n        for (i = 0; i < arr.length; ++i) {\n            res.push(fn(arr[i], i));\n        }\n        return res;\n    }\n\n    function extend(a, b) {\n        for (var i in b) {\n            if (hasOwnProp(b, i)) {\n                a[i] = b[i];\n            }\n        }\n\n        if (hasOwnProp(b, 'toString')) {\n            a.toString = b.toString;\n        }\n\n        if (hasOwnProp(b, 'valueOf')) {\n            a.valueOf = b.valueOf;\n        }\n\n        return a;\n    }\n\n    function createUTC(input, format, locale, strict) {\n        return createLocalOrUTC(input, format, locale, strict, true).utc();\n    }\n\n    function defaultParsingFlags() {\n        // We need to deep clone this object.\n        return {\n            empty: false,\n            unusedTokens: [],\n            unusedInput: [],\n            overflow: -2,\n            charsLeftOver: 0,\n            nullInput: false,\n            invalidEra: null,\n            invalidMonth: null,\n            invalidFormat: false,\n            userInvalidated: false,\n            iso: false,\n            parsedDateParts: [],\n            era: null,\n            meridiem: null,\n            rfc2822: false,\n            weekdayMismatch: false,\n        };\n    }\n\n    function getParsingFlags(m) {\n        if (m._pf == null) {\n            m._pf = defaultParsingFlags();\n        }\n        return m._pf;\n    }\n\n    var some;\n    if (Array.prototype.some) {\n        some = Array.prototype.some;\n    } else {\n        some = function (fun) {\n            var t = Object(this),\n                len = t.length >>> 0,\n                i;\n\n            for (i = 0; i < len; i++) {\n                if (i in t && fun.call(this, t[i], i, t)) {\n                    return true;\n                }\n            }\n\n            return false;\n        };\n    }\n\n    function isValid(m) {\n        if (m._isValid == null) {\n            var flags = getParsingFlags(m),\n                parsedParts = some.call(flags.parsedDateParts, function (i) {\n                    return i != null;\n                }),\n                isNowValid =\n                    !isNaN(m._d.getTime()) &&\n                    flags.overflow < 0 &&\n                    !flags.empty &&\n                    !flags.invalidEra &&\n                    !flags.invalidMonth &&\n                    !flags.invalidWeekday &&\n                    !flags.weekdayMismatch &&\n                    !flags.nullInput &&\n                    !flags.invalidFormat &&\n                    !flags.userInvalidated &&\n                    (!flags.meridiem || (flags.meridiem && parsedParts));\n\n            if (m._strict) {\n                isNowValid =\n                    isNowValid &&\n                    flags.charsLeftOver === 0 &&\n                    flags.unusedTokens.length === 0 &&\n                    flags.bigHour === undefined;\n            }\n\n            if (Object.isFrozen == null || !Object.isFrozen(m)) {\n                m._isValid = isNowValid;\n            } else {\n                return isNowValid;\n            }\n        }\n        return m._isValid;\n    }\n\n    function createInvalid(flags) {\n        var m = createUTC(NaN);\n        if (flags != null) {\n            extend(getParsingFlags(m), flags);\n        } else {\n            getParsingFlags(m).userInvalidated = true;\n        }\n\n        return m;\n    }\n\n    // Plugins that add properties should also add the key here (null value),\n    // so we can properly clone ourselves.\n    var momentProperties = (hooks.momentProperties = []),\n        updateInProgress = false;\n\n    function copyConfig(to, from) {\n        var i, prop, val;\n\n        if (!isUndefined(from._isAMomentObject)) {\n            to._isAMomentObject = from._isAMomentObject;\n        }\n        if (!isUndefined(from._i)) {\n            to._i = from._i;\n        }\n        if (!isUndefined(from._f)) {\n            to._f = from._f;\n        }\n        if (!isUndefined(from._l)) {\n            to._l = from._l;\n        }\n        if (!isUndefined(from._strict)) {\n            to._strict = from._strict;\n        }\n        if (!isUndefined(from._tzm)) {\n            to._tzm = from._tzm;\n        }\n        if (!isUndefined(from._isUTC)) {\n            to._isUTC = from._isUTC;\n        }\n        if (!isUndefined(from._offset)) {\n            to._offset = from._offset;\n        }\n        if (!isUndefined(from._pf)) {\n            to._pf = getParsingFlags(from);\n        }\n        if (!isUndefined(from._locale)) {\n            to._locale = from._locale;\n        }\n\n        if (momentProperties.length > 0) {\n            for (i = 0; i < momentProperties.length; i++) {\n                prop = momentProperties[i];\n                val = from[prop];\n                if (!isUndefined(val)) {\n                    to[prop] = val;\n                }\n            }\n        }\n\n        return to;\n    }\n\n    // Moment prototype object\n    function Moment(config) {\n        copyConfig(this, config);\n        this._d = new Date(config._d != null ? config._d.getTime() : NaN);\n        if (!this.isValid()) {\n            this._d = new Date(NaN);\n        }\n        // Prevent infinite loop in case updateOffset creates new moment\n        // objects.\n        if (updateInProgress === false) {\n            updateInProgress = true;\n            hooks.updateOffset(this);\n            updateInProgress = false;\n        }\n    }\n\n    function isMoment(obj) {\n        return (\n            obj instanceof Moment || (obj != null && obj._isAMomentObject != null)\n        );\n    }\n\n    function warn(msg) {\n        if (\n            hooks.suppressDeprecationWarnings === false &&\n            typeof console !== 'undefined' &&\n            console.warn\n        ) {\n            console.warn('Deprecation warning: ' + msg);\n        }\n    }\n\n    function deprecate(msg, fn) {\n        var firstTime = true;\n\n        return extend(function () {\n            if (hooks.deprecationHandler != null) {\n                hooks.deprecationHandler(null, msg);\n            }\n            if (firstTime) {\n                var args = [],\n                    arg,\n                    i,\n                    key;\n                for (i = 0; i < arguments.length; i++) {\n                    arg = '';\n                    if (typeof arguments[i] === 'object') {\n                        arg += '\\n[' + i + '] ';\n                        for (key in arguments[0]) {\n                            if (hasOwnProp(arguments[0], key)) {\n                                arg += key + ': ' + arguments[0][key] + ', ';\n                            }\n                        }\n                        arg = arg.slice(0, -2); // Remove trailing comma and space\n                    } else {\n                        arg = arguments[i];\n                    }\n                    args.push(arg);\n                }\n                warn(\n                    msg +\n                        '\\nArguments: ' +\n                        Array.prototype.slice.call(args).join('') +\n                        '\\n' +\n                        new Error().stack\n                );\n                firstTime = false;\n            }\n            return fn.apply(this, arguments);\n        }, fn);\n    }\n\n    var deprecations = {};\n\n    function deprecateSimple(name, msg) {\n        if (hooks.deprecationHandler != null) {\n            hooks.deprecationHandler(name, msg);\n        }\n        if (!deprecations[name]) {\n            warn(msg);\n            deprecations[name] = true;\n        }\n    }\n\n    hooks.suppressDeprecationWarnings = false;\n    hooks.deprecationHandler = null;\n\n    function isFunction(input) {\n        return (\n            (typeof Function !== 'undefined' && input instanceof Function) ||\n            Object.prototype.toString.call(input) === '[object Function]'\n        );\n    }\n\n    function set(config) {\n        var prop, i;\n        for (i in config) {\n            if (hasOwnProp(config, i)) {\n                prop = config[i];\n                if (isFunction(prop)) {\n                    this[i] = prop;\n                } else {\n                    this['_' + i] = prop;\n                }\n            }\n        }\n        this._config = config;\n        // Lenient ordinal parsing accepts just a number in addition to\n        // number + (possibly) stuff coming from _dayOfMonthOrdinalParse.\n        // TODO: Remove \"ordinalParse\" fallback in next major release.\n        this._dayOfMonthOrdinalParseLenient = new RegExp(\n            (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) +\n                '|' +\n                /\\d{1,2}/.source\n        );\n    }\n\n    function mergeConfigs(parentConfig, childConfig) {\n        var res = extend({}, parentConfig),\n            prop;\n        for (prop in childConfig) {\n            if (hasOwnProp(childConfig, prop)) {\n                if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {\n                    res[prop] = {};\n                    extend(res[prop], parentConfig[prop]);\n                    extend(res[prop], childConfig[prop]);\n                } else if (childConfig[prop] != null) {\n                    res[prop] = childConfig[prop];\n                } else {\n                    delete res[prop];\n                }\n            }\n        }\n        for (prop in parentConfig) {\n            if (\n                hasOwnProp(parentConfig, prop) &&\n                !hasOwnProp(childConfig, prop) &&\n                isObject(parentConfig[prop])\n            ) {\n                // make sure changes to properties don't modify parent config\n                res[prop] = extend({}, res[prop]);\n            }\n        }\n        return res;\n    }\n\n    function Locale(config) {\n        if (config != null) {\n            this.set(config);\n        }\n    }\n\n    var keys;\n\n    if (Object.keys) {\n        keys = Object.keys;\n    } else {\n        keys = function (obj) {\n            var i,\n                res = [];\n            for (i in obj) {\n                if (hasOwnProp(obj, i)) {\n                    res.push(i);\n                }\n            }\n            return res;\n        };\n    }\n\n    var defaultCalendar = {\n        sameDay: '[Today at] LT',\n        nextDay: '[Tomorrow at] LT',\n        nextWeek: 'dddd [at] LT',\n        lastDay: '[Yesterday at] LT',\n        lastWeek: '[Last] dddd [at] LT',\n        sameElse: 'L',\n    };\n\n    function calendar(key, mom, now) {\n        var output = this._calendar[key] || this._calendar['sameElse'];\n        return isFunction(output) ? output.call(mom, now) : output;\n    }\n\n    function zeroFill(number, targetLength, forceSign) {\n        var absNumber = '' + Math.abs(number),\n            zerosToFill = targetLength - absNumber.length,\n            sign = number >= 0;\n        return (\n            (sign ? (forceSign ? '+' : '') : '-') +\n            Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) +\n            absNumber\n        );\n    }\n\n    var formattingTokens = /(\\[[^\\[]*\\])|(\\\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,\n        localFormattingTokens = /(\\[[^\\[]*\\])|(\\\\)?(LTS|LT|LL?L?L?|l{1,4})/g,\n        formatFunctions = {},\n        formatTokenFunctions = {};\n\n    // token:    'M'\n    // padded:   ['MM', 2]\n    // ordinal:  'Mo'\n    // callback: function () { this.month() + 1 }\n    function addFormatToken(token, padded, ordinal, callback) {\n        var func = callback;\n        if (typeof callback === 'string') {\n            func = function () {\n                return this[callback]();\n            };\n        }\n        if (token) {\n            formatTokenFunctions[token] = func;\n        }\n        if (padded) {\n            formatTokenFunctions[padded[0]] = function () {\n                return zeroFill(func.apply(this, arguments), padded[1], padded[2]);\n            };\n        }\n        if (ordinal) {\n            formatTokenFunctions[ordinal] = function () {\n                return this.localeData().ordinal(\n                    func.apply(this, arguments),\n                    token\n                );\n            };\n        }\n    }\n\n    function removeFormattingTokens(input) {\n        if (input.match(/\\[[\\s\\S]/)) {\n            return input.replace(/^\\[|\\]$/g, '');\n        }\n        return input.replace(/\\\\/g, '');\n    }\n\n    function makeFormatFunction(format) {\n        var array = format.match(formattingTokens),\n            i,\n            length;\n\n        for (i = 0, length = array.length; i < length; i++) {\n            if (formatTokenFunctions[array[i]]) {\n                array[i] = formatTokenFunctions[array[i]];\n            } else {\n                array[i] = removeFormattingTokens(array[i]);\n            }\n        }\n\n        return function (mom) {\n            var output = '',\n                i;\n            for (i = 0; i < length; i++) {\n                output += isFunction(array[i])\n                    ? array[i].call(mom, format)\n                    : array[i];\n            }\n            return output;\n        };\n    }\n\n    // format date using native date object\n    function formatMoment(m, format) {\n        if (!m.isValid()) {\n            return m.localeData().invalidDate();\n        }\n\n        format = expandFormat(format, m.localeData());\n        formatFunctions[format] =\n            formatFunctions[format] || makeFormatFunction(format);\n\n        return formatFunctions[format](m);\n    }\n\n    function expandFormat(format, locale) {\n        var i = 5;\n\n        function replaceLongDateFormatTokens(input) {\n            return locale.longDateFormat(input) || input;\n        }\n\n        localFormattingTokens.lastIndex = 0;\n        while (i >= 0 && localFormattingTokens.test(format)) {\n            format = format.replace(\n                localFormattingTokens,\n                replaceLongDateFormatTokens\n            );\n            localFormattingTokens.lastIndex = 0;\n            i -= 1;\n        }\n\n        return format;\n    }\n\n    var defaultLongDateFormat = {\n        LTS: 'h:mm:ss A',\n        LT: 'h:mm A',\n        L: 'MM/DD/YYYY',\n        LL: 'MMMM D, YYYY',\n        LLL: 'MMMM D, YYYY h:mm A',\n        LLLL: 'dddd, MMMM D, YYYY h:mm A',\n    };\n\n    function longDateFormat(key) {\n        var format = this._longDateFormat[key],\n            formatUpper = this._longDateFormat[key.toUpperCase()];\n\n        if (format || !formatUpper) {\n            return format;\n        }\n\n        this._longDateFormat[key] = formatUpper\n            .match(formattingTokens)\n            .map(function (tok) {\n                if (\n                    tok === 'MMMM' ||\n                    tok === 'MM' ||\n                    tok === 'DD' ||\n                    tok === 'dddd'\n                ) {\n                    return tok.slice(1);\n                }\n                return tok;\n            })\n            .join('');\n\n        return this._longDateFormat[key];\n    }\n\n    var defaultInvalidDate = 'Invalid date';\n\n    function invalidDate() {\n        return this._invalidDate;\n    }\n\n    var defaultOrdinal = '%d',\n        defaultDayOfMonthOrdinalParse = /\\d{1,2}/;\n\n    function ordinal(number) {\n        return this._ordinal.replace('%d', number);\n    }\n\n    var defaultRelativeTime = {\n        future: 'in %s',\n        past: '%s ago',\n        s: 'a few seconds',\n        ss: '%d seconds',\n        m: 'a minute',\n        mm: '%d minutes',\n        h: 'an hour',\n        hh: '%d hours',\n        d: 'a day',\n        dd: '%d days',\n        w: 'a week',\n        ww: '%d weeks',\n        M: 'a month',\n        MM: '%d months',\n        y: 'a year',\n        yy: '%d years',\n    };\n\n    function relativeTime(number, withoutSuffix, string, isFuture) {\n        var output = this._relativeTime[string];\n        return isFunction(output)\n            ? output(number, withoutSuffix, string, isFuture)\n            : output.replace(/%d/i, number);\n    }\n\n    function pastFuture(diff, output) {\n        var format = this._relativeTime[diff > 0 ? 'future' : 'past'];\n        return isFunction(format) ? format(output) : format.replace(/%s/i, output);\n    }\n\n    var aliases = {};\n\n    function addUnitAlias(unit, shorthand) {\n        var lowerCase = unit.toLowerCase();\n        aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;\n    }\n\n    function normalizeUnits(units) {\n        return typeof units === 'string'\n            ? aliases[units] || aliases[units.toLowerCase()]\n            : undefined;\n    }\n\n    function normalizeObjectUnits(inputObject) {\n        var normalizedInput = {},\n            normalizedProp,\n            prop;\n\n        for (prop in inputObject) {\n            if (hasOwnProp(inputObject, prop)) {\n                normalizedProp = normalizeUnits(prop);\n                if (normalizedProp) {\n                    normalizedInput[normalizedProp] = inputObject[prop];\n                }\n            }\n        }\n\n        return normalizedInput;\n    }\n\n    var priorities = {};\n\n    function addUnitPriority(unit, priority) {\n        priorities[unit] = priority;\n    }\n\n    function getPrioritizedUnits(unitsObj) {\n        var units = [],\n            u;\n        for (u in unitsObj) {\n            if (hasOwnProp(unitsObj, u)) {\n                units.push({ unit: u, priority: priorities[u] });\n            }\n        }\n        units.sort(function (a, b) {\n            return a.priority - b.priority;\n        });\n        return units;\n    }\n\n    function isLeapYear(year) {\n        return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n    }\n\n    function absFloor(number) {\n        if (number < 0) {\n            // -0 -> 0\n            return Math.ceil(number) || 0;\n        } else {\n            return Math.floor(number);\n        }\n    }\n\n    function toInt(argumentForCoercion) {\n        var coercedNumber = +argumentForCoercion,\n            value = 0;\n\n        if (coercedNumber !== 0 && isFinite(coercedNumber)) {\n            value = absFloor(coercedNumber);\n        }\n\n        return value;\n    }\n\n    function makeGetSet(unit, keepTime) {\n        return function (value) {\n            if (value != null) {\n                set$1(this, unit, value);\n                hooks.updateOffset(this, keepTime);\n                return this;\n            } else {\n                return get(this, unit);\n            }\n        };\n    }\n\n    function get(mom, unit) {\n        return mom.isValid()\n            ? mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]()\n            : NaN;\n    }\n\n    function set$1(mom, unit, value) {\n        if (mom.isValid() && !isNaN(value)) {\n            if (\n                unit === 'FullYear' &&\n                isLeapYear(mom.year()) &&\n                mom.month() === 1 &&\n                mom.date() === 29\n            ) {\n                value = toInt(value);\n                mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](\n                    value,\n                    mom.month(),\n                    daysInMonth(value, mom.month())\n                );\n            } else {\n                mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);\n            }\n        }\n    }\n\n    // MOMENTS\n\n    function stringGet(units) {\n        units = normalizeUnits(units);\n        if (isFunction(this[units])) {\n            return this[units]();\n        }\n        return this;\n    }\n\n    function stringSet(units, value) {\n        if (typeof units === 'object') {\n            units = normalizeObjectUnits(units);\n            var prioritized = getPrioritizedUnits(units),\n                i;\n            for (i = 0; i < prioritized.length; i++) {\n                this[prioritized[i].unit](units[prioritized[i].unit]);\n            }\n        } else {\n            units = normalizeUnits(units);\n            if (isFunction(this[units])) {\n                return this[units](value);\n            }\n        }\n        return this;\n    }\n\n    var match1 = /\\d/, //       0 - 9\n        match2 = /\\d\\d/, //      00 - 99\n        match3 = /\\d{3}/, //     000 - 999\n        match4 = /\\d{4}/, //    0000 - 9999\n        match6 = /[+-]?\\d{6}/, // -999999 - 999999\n        match1to2 = /\\d\\d?/, //       0 - 99\n        match3to4 = /\\d\\d\\d\\d?/, //     999 - 9999\n        match5to6 = /\\d\\d\\d\\d\\d\\d?/, //   99999 - 999999\n        match1to3 = /\\d{1,3}/, //       0 - 999\n        match1to4 = /\\d{1,4}/, //       0 - 9999\n        match1to6 = /[+-]?\\d{1,6}/, // -999999 - 999999\n        matchUnsigned = /\\d+/, //       0 - inf\n        matchSigned = /[+-]?\\d+/, //    -inf - inf\n        matchOffset = /Z|[+-]\\d\\d:?\\d\\d/gi, // +00:00 -00:00 +0000 -0000 or Z\n        matchShortOffset = /Z|[+-]\\d\\d(?::?\\d\\d)?/gi, // +00 -00 +00:00 -00:00 +0000 -0000 or Z\n        matchTimestamp = /[+-]?\\d+(\\.\\d{1,3})?/, // 123456789 123456789.123\n        // any word (or two) characters or numbers including two/three word month in arabic.\n        // includes scottish gaelic two word and hyphenated months\n        matchWord = /[0-9]{0,256}['a-z\\u00A0-\\u05FF\\u0700-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFF07\\uFF10-\\uFFEF]{1,256}|[\\u0600-\\u06FF\\/]{1,256}(\\s*?[\\u0600-\\u06FF]{1,256}){1,2}/i,\n        regexes;\n\n    regexes = {};\n\n    function addRegexToken(token, regex, strictRegex) {\n        regexes[token] = isFunction(regex)\n            ? regex\n            : function (isStrict, localeData) {\n                  return isStrict && strictRegex ? strictRegex : regex;\n              };\n    }\n\n    function getParseRegexForToken(token, config) {\n        if (!hasOwnProp(regexes, token)) {\n            return new RegExp(unescapeFormat(token));\n        }\n\n        return regexes[token](config._strict, config._locale);\n    }\n\n    // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript\n    function unescapeFormat(s) {\n        return regexEscape(\n            s\n                .replace('\\\\', '')\n                .replace(/\\\\(\\[)|\\\\(\\])|\\[([^\\]\\[]*)\\]|\\\\(.)/g, function (\n                    matched,\n                    p1,\n                    p2,\n                    p3,\n                    p4\n                ) {\n                    return p1 || p2 || p3 || p4;\n                })\n        );\n    }\n\n    function regexEscape(s) {\n        return s.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n    }\n\n    var tokens = {};\n\n    function addParseToken(token, callback) {\n        var i,\n            func = callback;\n        if (typeof token === 'string') {\n            token = [token];\n        }\n        if (isNumber(callback)) {\n            func = function (input, array) {\n                array[callback] = toInt(input);\n            };\n        }\n        for (i = 0; i < token.length; i++) {\n            tokens[token[i]] = func;\n        }\n    }\n\n    function addWeekParseToken(token, callback) {\n        addParseToken(token, function (input, array, config, token) {\n            config._w = config._w || {};\n            callback(input, config._w, config, token);\n        });\n    }\n\n    function addTimeToArrayFromToken(token, input, config) {\n        if (input != null && hasOwnProp(tokens, token)) {\n            tokens[token](input, config._a, config, token);\n        }\n    }\n\n    var YEAR = 0,\n        MONTH = 1,\n        DATE = 2,\n        HOUR = 3,\n        MINUTE = 4,\n        SECOND = 5,\n        MILLISECOND = 6,\n        WEEK = 7,\n        WEEKDAY = 8;\n\n    function mod(n, x) {\n        return ((n % x) + x) % x;\n    }\n\n    var indexOf;\n\n    if (Array.prototype.indexOf) {\n        indexOf = Array.prototype.indexOf;\n    } else {\n        indexOf = function (o) {\n            // I know\n            var i;\n            for (i = 0; i < this.length; ++i) {\n                if (this[i] === o) {\n                    return i;\n                }\n            }\n            return -1;\n        };\n    }\n\n    function daysInMonth(year, month) {\n        if (isNaN(year) || isNaN(month)) {\n            return NaN;\n        }\n        var modMonth = mod(month, 12);\n        year += (month - modMonth) / 12;\n        return modMonth === 1\n            ? isLeapYear(year)\n                ? 29\n                : 28\n            : 31 - ((modMonth % 7) % 2);\n    }\n\n    // FORMATTING\n\n    addFormatToken('M', ['MM', 2], 'Mo', function () {\n        return this.month() + 1;\n    });\n\n    addFormatToken('MMM', 0, 0, function (format) {\n        return this.localeData().monthsShort(this, format);\n    });\n\n    addFormatToken('MMMM', 0, 0, function (format) {\n        return this.localeData().months(this, format);\n    });\n\n    // ALIASES\n\n    addUnitAlias('month', 'M');\n\n    // PRIORITY\n\n    addUnitPriority('month', 8);\n\n    // PARSING\n\n    addRegexToken('M', match1to2);\n    addRegexToken('MM', match1to2, match2);\n    addRegexToken('MMM', function (isStrict, locale) {\n        return locale.monthsShortRegex(isStrict);\n    });\n    addRegexToken('MMMM', function (isStrict, locale) {\n        return locale.monthsRegex(isStrict);\n    });\n\n    addParseToken(['M', 'MM'], function (input, array) {\n        array[MONTH] = toInt(input) - 1;\n    });\n\n    addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {\n        var month = config._locale.monthsParse(input, token, config._strict);\n        // if we didn't find a month name, mark the date as invalid.\n        if (month != null) {\n            array[MONTH] = month;\n        } else {\n            getParsingFlags(config).invalidMonth = input;\n        }\n    });\n\n    // LOCALES\n\n    var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split(\n            '_'\n        ),\n        defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split(\n            '_'\n        ),\n        MONTHS_IN_FORMAT = /D[oD]?(\\[[^\\[\\]]*\\]|\\s)+MMMM?/,\n        defaultMonthsShortRegex = matchWord,\n        defaultMonthsRegex = matchWord;\n\n    function localeMonths(m, format) {\n        if (!m) {\n            return isArray(this._months)\n                ? this._months\n                : this._months['standalone'];\n        }\n        return isArray(this._months)\n            ? this._months[m.month()]\n            : this._months[\n                  (this._months.isFormat || MONTHS_IN_FORMAT).test(format)\n                      ? 'format'\n                      : 'standalone'\n              ][m.month()];\n    }\n\n    function localeMonthsShort(m, format) {\n        if (!m) {\n            return isArray(this._monthsShort)\n                ? this._monthsShort\n                : this._monthsShort['standalone'];\n        }\n        return isArray(this._monthsShort)\n            ? this._monthsShort[m.month()]\n            : this._monthsShort[\n                  MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'\n              ][m.month()];\n    }\n\n    function handleStrictParse(monthName, format, strict) {\n        var i,\n            ii,\n            mom,\n            llc = monthName.toLocaleLowerCase();\n        if (!this._monthsParse) {\n            // this is not used\n            this._monthsParse = [];\n            this._longMonthsParse = [];\n            this._shortMonthsParse = [];\n            for (i = 0; i < 12; ++i) {\n                mom = createUTC([2000, i]);\n                this._shortMonthsParse[i] = this.monthsShort(\n                    mom,\n                    ''\n                ).toLocaleLowerCase();\n                this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();\n            }\n        }\n\n        if (strict) {\n            if (format === 'MMM') {\n                ii = indexOf.call(this._shortMonthsParse, llc);\n                return ii !== -1 ? ii : null;\n            } else {\n                ii = indexOf.call(this._longMonthsParse, llc);\n                return ii !== -1 ? ii : null;\n            }\n        } else {\n            if (format === 'MMM') {\n                ii = indexOf.call(this._shortMonthsParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._longMonthsParse, llc);\n                return ii !== -1 ? ii : null;\n            } else {\n                ii = indexOf.call(this._longMonthsParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._shortMonthsParse, llc);\n                return ii !== -1 ? ii : null;\n            }\n        }\n    }\n\n    function localeMonthsParse(monthName, format, strict) {\n        var i, mom, regex;\n\n        if (this._monthsParseExact) {\n            return handleStrictParse.call(this, monthName, format, strict);\n        }\n\n        if (!this._monthsParse) {\n            this._monthsParse = [];\n            this._longMonthsParse = [];\n            this._shortMonthsParse = [];\n        }\n\n        // TODO: add sorting\n        // Sorting makes sure if one month (or abbr) is a prefix of another\n        // see sorting in computeMonthsParse\n        for (i = 0; i < 12; i++) {\n            // make the regex if we don't have it already\n            mom = createUTC([2000, i]);\n            if (strict && !this._longMonthsParse[i]) {\n                this._longMonthsParse[i] = new RegExp(\n                    '^' + this.months(mom, '').replace('.', '') + '$',\n                    'i'\n                );\n                this._shortMonthsParse[i] = new RegExp(\n                    '^' + this.monthsShort(mom, '').replace('.', '') + '$',\n                    'i'\n                );\n            }\n            if (!strict && !this._monthsParse[i]) {\n                regex =\n                    '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');\n                this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');\n            }\n            // test the regex\n            if (\n                strict &&\n                format === 'MMMM' &&\n                this._longMonthsParse[i].test(monthName)\n            ) {\n                return i;\n            } else if (\n                strict &&\n                format === 'MMM' &&\n                this._shortMonthsParse[i].test(monthName)\n            ) {\n                return i;\n            } else if (!strict && this._monthsParse[i].test(monthName)) {\n                return i;\n            }\n        }\n    }\n\n    // MOMENTS\n\n    function setMonth(mom, value) {\n        var dayOfMonth;\n\n        if (!mom.isValid()) {\n            // No op\n            return mom;\n        }\n\n        if (typeof value === 'string') {\n            if (/^\\d+$/.test(value)) {\n                value = toInt(value);\n            } else {\n                value = mom.localeData().monthsParse(value);\n                // TODO: Another silent failure?\n                if (!isNumber(value)) {\n                    return mom;\n                }\n            }\n        }\n\n        dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));\n        mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);\n        return mom;\n    }\n\n    function getSetMonth(value) {\n        if (value != null) {\n            setMonth(this, value);\n            hooks.updateOffset(this, true);\n            return this;\n        } else {\n            return get(this, 'Month');\n        }\n    }\n\n    function getDaysInMonth() {\n        return daysInMonth(this.year(), this.month());\n    }\n\n    function monthsShortRegex(isStrict) {\n        if (this._monthsParseExact) {\n            if (!hasOwnProp(this, '_monthsRegex')) {\n                computeMonthsParse.call(this);\n            }\n            if (isStrict) {\n                return this._monthsShortStrictRegex;\n            } else {\n                return this._monthsShortRegex;\n            }\n        } else {\n            if (!hasOwnProp(this, '_monthsShortRegex')) {\n                this._monthsShortRegex = defaultMonthsShortRegex;\n            }\n            return this._monthsShortStrictRegex && isStrict\n                ? this._monthsShortStrictRegex\n                : this._monthsShortRegex;\n        }\n    }\n\n    function monthsRegex(isStrict) {\n        if (this._monthsParseExact) {\n            if (!hasOwnProp(this, '_monthsRegex')) {\n                computeMonthsParse.call(this);\n            }\n            if (isStrict) {\n                return this._monthsStrictRegex;\n            } else {\n                return this._monthsRegex;\n            }\n        } else {\n            if (!hasOwnProp(this, '_monthsRegex')) {\n                this._monthsRegex = defaultMonthsRegex;\n            }\n            return this._monthsStrictRegex && isStrict\n                ? this._monthsStrictRegex\n                : this._monthsRegex;\n        }\n    }\n\n    function computeMonthsParse() {\n        function cmpLenRev(a, b) {\n            return b.length - a.length;\n        }\n\n        var shortPieces = [],\n            longPieces = [],\n            mixedPieces = [],\n            i,\n            mom;\n        for (i = 0; i < 12; i++) {\n            // make the regex if we don't have it already\n            mom = createUTC([2000, i]);\n            shortPieces.push(this.monthsShort(mom, ''));\n            longPieces.push(this.months(mom, ''));\n            mixedPieces.push(this.months(mom, ''));\n            mixedPieces.push(this.monthsShort(mom, ''));\n        }\n        // Sorting makes sure if one month (or abbr) is a prefix of another it\n        // will match the longer piece.\n        shortPieces.sort(cmpLenRev);\n        longPieces.sort(cmpLenRev);\n        mixedPieces.sort(cmpLenRev);\n        for (i = 0; i < 12; i++) {\n            shortPieces[i] = regexEscape(shortPieces[i]);\n            longPieces[i] = regexEscape(longPieces[i]);\n        }\n        for (i = 0; i < 24; i++) {\n            mixedPieces[i] = regexEscape(mixedPieces[i]);\n        }\n\n        this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n        this._monthsShortRegex = this._monthsRegex;\n        this._monthsStrictRegex = new RegExp(\n            '^(' + longPieces.join('|') + ')',\n            'i'\n        );\n        this._monthsShortStrictRegex = new RegExp(\n            '^(' + shortPieces.join('|') + ')',\n            'i'\n        );\n    }\n\n    // FORMATTING\n\n    addFormatToken('Y', 0, 0, function () {\n        var y = this.year();\n        return y <= 9999 ? zeroFill(y, 4) : '+' + y;\n    });\n\n    addFormatToken(0, ['YY', 2], 0, function () {\n        return this.year() % 100;\n    });\n\n    addFormatToken(0, ['YYYY', 4], 0, 'year');\n    addFormatToken(0, ['YYYYY', 5], 0, 'year');\n    addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');\n\n    // ALIASES\n\n    addUnitAlias('year', 'y');\n\n    // PRIORITIES\n\n    addUnitPriority('year', 1);\n\n    // PARSING\n\n    addRegexToken('Y', matchSigned);\n    addRegexToken('YY', match1to2, match2);\n    addRegexToken('YYYY', match1to4, match4);\n    addRegexToken('YYYYY', match1to6, match6);\n    addRegexToken('YYYYYY', match1to6, match6);\n\n    addParseToken(['YYYYY', 'YYYYYY'], YEAR);\n    addParseToken('YYYY', function (input, array) {\n        array[YEAR] =\n            input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);\n    });\n    addParseToken('YY', function (input, array) {\n        array[YEAR] = hooks.parseTwoDigitYear(input);\n    });\n    addParseToken('Y', function (input, array) {\n        array[YEAR] = parseInt(input, 10);\n    });\n\n    // HELPERS\n\n    function daysInYear(year) {\n        return isLeapYear(year) ? 366 : 365;\n    }\n\n    // HOOKS\n\n    hooks.parseTwoDigitYear = function (input) {\n        return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);\n    };\n\n    // MOMENTS\n\n    var getSetYear = makeGetSet('FullYear', true);\n\n    function getIsLeapYear() {\n        return isLeapYear(this.year());\n    }\n\n    function createDate(y, m, d, h, M, s, ms) {\n        // can't just apply() to create a date:\n        // https://stackoverflow.com/q/181348\n        var date;\n        // the date constructor remaps years 0-99 to 1900-1999\n        if (y < 100 && y >= 0) {\n            // preserve leap years using a full 400 year cycle, then reset\n            date = new Date(y + 400, m, d, h, M, s, ms);\n            if (isFinite(date.getFullYear())) {\n                date.setFullYear(y);\n            }\n        } else {\n            date = new Date(y, m, d, h, M, s, ms);\n        }\n\n        return date;\n    }\n\n    function createUTCDate(y) {\n        var date, args;\n        // the Date.UTC function remaps years 0-99 to 1900-1999\n        if (y < 100 && y >= 0) {\n            args = Array.prototype.slice.call(arguments);\n            // preserve leap years using a full 400 year cycle, then reset\n            args[0] = y + 400;\n            date = new Date(Date.UTC.apply(null, args));\n            if (isFinite(date.getUTCFullYear())) {\n                date.setUTCFullYear(y);\n            }\n        } else {\n            date = new Date(Date.UTC.apply(null, arguments));\n        }\n\n        return date;\n    }\n\n    // start-of-first-week - start-of-year\n    function firstWeekOffset(year, dow, doy) {\n        var // first-week day -- which january is always in the first week (4 for iso, 1 for other)\n            fwd = 7 + dow - doy,\n            // first-week day local weekday -- which local weekday is fwd\n            fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;\n\n        return -fwdlw + fwd - 1;\n    }\n\n    // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday\n    function dayOfYearFromWeeks(year, week, weekday, dow, doy) {\n        var localWeekday = (7 + weekday - dow) % 7,\n            weekOffset = firstWeekOffset(year, dow, doy),\n            dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,\n            resYear,\n            resDayOfYear;\n\n        if (dayOfYear <= 0) {\n            resYear = year - 1;\n            resDayOfYear = daysInYear(resYear) + dayOfYear;\n        } else if (dayOfYear > daysInYear(year)) {\n            resYear = year + 1;\n            resDayOfYear = dayOfYear - daysInYear(year);\n        } else {\n            resYear = year;\n            resDayOfYear = dayOfYear;\n        }\n\n        return {\n            year: resYear,\n            dayOfYear: resDayOfYear,\n        };\n    }\n\n    function weekOfYear(mom, dow, doy) {\n        var weekOffset = firstWeekOffset(mom.year(), dow, doy),\n            week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,\n            resWeek,\n            resYear;\n\n        if (week < 1) {\n            resYear = mom.year() - 1;\n            resWeek = week + weeksInYear(resYear, dow, doy);\n        } else if (week > weeksInYear(mom.year(), dow, doy)) {\n            resWeek = week - weeksInYear(mom.year(), dow, doy);\n            resYear = mom.year() + 1;\n        } else {\n            resYear = mom.year();\n            resWeek = week;\n        }\n\n        return {\n            week: resWeek,\n            year: resYear,\n        };\n    }\n\n    function weeksInYear(year, dow, doy) {\n        var weekOffset = firstWeekOffset(year, dow, doy),\n            weekOffsetNext = firstWeekOffset(year + 1, dow, doy);\n        return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;\n    }\n\n    // FORMATTING\n\n    addFormatToken('w', ['ww', 2], 'wo', 'week');\n    addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');\n\n    // ALIASES\n\n    addUnitAlias('week', 'w');\n    addUnitAlias('isoWeek', 'W');\n\n    // PRIORITIES\n\n    addUnitPriority('week', 5);\n    addUnitPriority('isoWeek', 5);\n\n    // PARSING\n\n    addRegexToken('w', match1to2);\n    addRegexToken('ww', match1to2, match2);\n    addRegexToken('W', match1to2);\n    addRegexToken('WW', match1to2, match2);\n\n    addWeekParseToken(['w', 'ww', 'W', 'WW'], function (\n        input,\n        week,\n        config,\n        token\n    ) {\n        week[token.substr(0, 1)] = toInt(input);\n    });\n\n    // HELPERS\n\n    // LOCALES\n\n    function localeWeek(mom) {\n        return weekOfYear(mom, this._week.dow, this._week.doy).week;\n    }\n\n    var defaultLocaleWeek = {\n        dow: 0, // Sunday is the first day of the week.\n        doy: 6, // The week that contains Jan 6th is the first week of the year.\n    };\n\n    function localeFirstDayOfWeek() {\n        return this._week.dow;\n    }\n\n    function localeFirstDayOfYear() {\n        return this._week.doy;\n    }\n\n    // MOMENTS\n\n    function getSetWeek(input) {\n        var week = this.localeData().week(this);\n        return input == null ? week : this.add((input - week) * 7, 'd');\n    }\n\n    function getSetISOWeek(input) {\n        var week = weekOfYear(this, 1, 4).week;\n        return input == null ? week : this.add((input - week) * 7, 'd');\n    }\n\n    // FORMATTING\n\n    addFormatToken('d', 0, 'do', 'day');\n\n    addFormatToken('dd', 0, 0, function (format) {\n        return this.localeData().weekdaysMin(this, format);\n    });\n\n    addFormatToken('ddd', 0, 0, function (format) {\n        return this.localeData().weekdaysShort(this, format);\n    });\n\n    addFormatToken('dddd', 0, 0, function (format) {\n        return this.localeData().weekdays(this, format);\n    });\n\n    addFormatToken('e', 0, 0, 'weekday');\n    addFormatToken('E', 0, 0, 'isoWeekday');\n\n    // ALIASES\n\n    addUnitAlias('day', 'd');\n    addUnitAlias('weekday', 'e');\n    addUnitAlias('isoWeekday', 'E');\n\n    // PRIORITY\n    addUnitPriority('day', 11);\n    addUnitPriority('weekday', 11);\n    addUnitPriority('isoWeekday', 11);\n\n    // PARSING\n\n    addRegexToken('d', match1to2);\n    addRegexToken('e', match1to2);\n    addRegexToken('E', match1to2);\n    addRegexToken('dd', function (isStrict, locale) {\n        return locale.weekdaysMinRegex(isStrict);\n    });\n    addRegexToken('ddd', function (isStrict, locale) {\n        return locale.weekdaysShortRegex(isStrict);\n    });\n    addRegexToken('dddd', function (isStrict, locale) {\n        return locale.weekdaysRegex(isStrict);\n    });\n\n    addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {\n        var weekday = config._locale.weekdaysParse(input, token, config._strict);\n        // if we didn't get a weekday name, mark the date as invalid\n        if (weekday != null) {\n            week.d = weekday;\n        } else {\n            getParsingFlags(config).invalidWeekday = input;\n        }\n    });\n\n    addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {\n        week[token] = toInt(input);\n    });\n\n    // HELPERS\n\n    function parseWeekday(input, locale) {\n        if (typeof input !== 'string') {\n            return input;\n        }\n\n        if (!isNaN(input)) {\n            return parseInt(input, 10);\n        }\n\n        input = locale.weekdaysParse(input);\n        if (typeof input === 'number') {\n            return input;\n        }\n\n        return null;\n    }\n\n    function parseIsoWeekday(input, locale) {\n        if (typeof input === 'string') {\n            return locale.weekdaysParse(input) % 7 || 7;\n        }\n        return isNaN(input) ? null : input;\n    }\n\n    // LOCALES\n    function shiftWeekdays(ws, n) {\n        return ws.slice(n, 7).concat(ws.slice(0, n));\n    }\n\n    var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(\n            '_'\n        ),\n        defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n        defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n        defaultWeekdaysRegex = matchWord,\n        defaultWeekdaysShortRegex = matchWord,\n        defaultWeekdaysMinRegex = matchWord;\n\n    function localeWeekdays(m, format) {\n        var weekdays = isArray(this._weekdays)\n            ? this._weekdays\n            : this._weekdays[\n                  m && m !== true && this._weekdays.isFormat.test(format)\n                      ? 'format'\n                      : 'standalone'\n              ];\n        return m === true\n            ? shiftWeekdays(weekdays, this._week.dow)\n            : m\n            ? weekdays[m.day()]\n            : weekdays;\n    }\n\n    function localeWeekdaysShort(m) {\n        return m === true\n            ? shiftWeekdays(this._weekdaysShort, this._week.dow)\n            : m\n            ? this._weekdaysShort[m.day()]\n            : this._weekdaysShort;\n    }\n\n    function localeWeekdaysMin(m) {\n        return m === true\n            ? shiftWeekdays(this._weekdaysMin, this._week.dow)\n            : m\n            ? this._weekdaysMin[m.day()]\n            : this._weekdaysMin;\n    }\n\n    function handleStrictParse$1(weekdayName, format, strict) {\n        var i,\n            ii,\n            mom,\n            llc = weekdayName.toLocaleLowerCase();\n        if (!this._weekdaysParse) {\n            this._weekdaysParse = [];\n            this._shortWeekdaysParse = [];\n            this._minWeekdaysParse = [];\n\n            for (i = 0; i < 7; ++i) {\n                mom = createUTC([2000, 1]).day(i);\n                this._minWeekdaysParse[i] = this.weekdaysMin(\n                    mom,\n                    ''\n                ).toLocaleLowerCase();\n                this._shortWeekdaysParse[i] = this.weekdaysShort(\n                    mom,\n                    ''\n                ).toLocaleLowerCase();\n                this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();\n            }\n        }\n\n        if (strict) {\n            if (format === 'dddd') {\n                ii = indexOf.call(this._weekdaysParse, llc);\n                return ii !== -1 ? ii : null;\n            } else if (format === 'ddd') {\n                ii = indexOf.call(this._shortWeekdaysParse, llc);\n                return ii !== -1 ? ii : null;\n            } else {\n                ii = indexOf.call(this._minWeekdaysParse, llc);\n                return ii !== -1 ? ii : null;\n            }\n        } else {\n            if (format === 'dddd') {\n                ii = indexOf.call(this._weekdaysParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._shortWeekdaysParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._minWeekdaysParse, llc);\n                return ii !== -1 ? ii : null;\n            } else if (format === 'ddd') {\n                ii = indexOf.call(this._shortWeekdaysParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._weekdaysParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._minWeekdaysParse, llc);\n                return ii !== -1 ? ii : null;\n            } else {\n                ii = indexOf.call(this._minWeekdaysParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._weekdaysParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._shortWeekdaysParse, llc);\n                return ii !== -1 ? ii : null;\n            }\n        }\n    }\n\n    function localeWeekdaysParse(weekdayName, format, strict) {\n        var i, mom, regex;\n\n        if (this._weekdaysParseExact) {\n            return handleStrictParse$1.call(this, weekdayName, format, strict);\n        }\n\n        if (!this._weekdaysParse) {\n            this._weekdaysParse = [];\n            this._minWeekdaysParse = [];\n            this._shortWeekdaysParse = [];\n            this._fullWeekdaysParse = [];\n        }\n\n        for (i = 0; i < 7; i++) {\n            // make the regex if we don't have it already\n\n            mom = createUTC([2000, 1]).day(i);\n            if (strict && !this._fullWeekdaysParse[i]) {\n                this._fullWeekdaysParse[i] = new RegExp(\n                    '^' + this.weekdays(mom, '').replace('.', '\\\\.?') + '$',\n                    'i'\n                );\n                this._shortWeekdaysParse[i] = new RegExp(\n                    '^' + this.weekdaysShort(mom, '').replace('.', '\\\\.?') + '$',\n                    'i'\n                );\n                this._minWeekdaysParse[i] = new RegExp(\n                    '^' + this.weekdaysMin(mom, '').replace('.', '\\\\.?') + '$',\n                    'i'\n                );\n            }\n            if (!this._weekdaysParse[i]) {\n                regex =\n                    '^' +\n                    this.weekdays(mom, '') +\n                    '|^' +\n                    this.weekdaysShort(mom, '') +\n                    '|^' +\n                    this.weekdaysMin(mom, '');\n                this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');\n            }\n            // test the regex\n            if (\n                strict &&\n                format === 'dddd' &&\n                this._fullWeekdaysParse[i].test(weekdayName)\n            ) {\n                return i;\n            } else if (\n                strict &&\n                format === 'ddd' &&\n                this._shortWeekdaysParse[i].test(weekdayName)\n            ) {\n                return i;\n            } else if (\n                strict &&\n                format === 'dd' &&\n                this._minWeekdaysParse[i].test(weekdayName)\n            ) {\n                return i;\n            } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {\n                return i;\n            }\n        }\n    }\n\n    // MOMENTS\n\n    function getSetDayOfWeek(input) {\n        if (!this.isValid()) {\n            return input != null ? this : NaN;\n        }\n        var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();\n        if (input != null) {\n            input = parseWeekday(input, this.localeData());\n            return this.add(input - day, 'd');\n        } else {\n            return day;\n        }\n    }\n\n    function getSetLocaleDayOfWeek(input) {\n        if (!this.isValid()) {\n            return input != null ? this : NaN;\n        }\n        var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;\n        return input == null ? weekday : this.add(input - weekday, 'd');\n    }\n\n    function getSetISODayOfWeek(input) {\n        if (!this.isValid()) {\n            return input != null ? this : NaN;\n        }\n\n        // behaves the same as moment#day except\n        // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)\n        // as a setter, sunday should belong to the previous week.\n\n        if (input != null) {\n            var weekday = parseIsoWeekday(input, this.localeData());\n            return this.day(this.day() % 7 ? weekday : weekday - 7);\n        } else {\n            return this.day() || 7;\n        }\n    }\n\n    function weekdaysRegex(isStrict) {\n        if (this._weekdaysParseExact) {\n            if (!hasOwnProp(this, '_weekdaysRegex')) {\n                computeWeekdaysParse.call(this);\n            }\n            if (isStrict) {\n                return this._weekdaysStrictRegex;\n            } else {\n                return this._weekdaysRegex;\n            }\n        } else {\n            if (!hasOwnProp(this, '_weekdaysRegex')) {\n                this._weekdaysRegex = defaultWeekdaysRegex;\n            }\n            return this._weekdaysStrictRegex && isStrict\n                ? this._weekdaysStrictRegex\n                : this._weekdaysRegex;\n        }\n    }\n\n    function weekdaysShortRegex(isStrict) {\n        if (this._weekdaysParseExact) {\n            if (!hasOwnProp(this, '_weekdaysRegex')) {\n                computeWeekdaysParse.call(this);\n            }\n            if (isStrict) {\n                return this._weekdaysShortStrictRegex;\n            } else {\n                return this._weekdaysShortRegex;\n            }\n        } else {\n            if (!hasOwnProp(this, '_weekdaysShortRegex')) {\n                this._weekdaysShortRegex = defaultWeekdaysShortRegex;\n            }\n            return this._weekdaysShortStrictRegex && isStrict\n                ? this._weekdaysShortStrictRegex\n                : this._weekdaysShortRegex;\n        }\n    }\n\n    function weekdaysMinRegex(isStrict) {\n        if (this._weekdaysParseExact) {\n            if (!hasOwnProp(this, '_weekdaysRegex')) {\n                computeWeekdaysParse.call(this);\n            }\n            if (isStrict) {\n                return this._weekdaysMinStrictRegex;\n            } else {\n                return this._weekdaysMinRegex;\n            }\n        } else {\n            if (!hasOwnProp(this, '_weekdaysMinRegex')) {\n                this._weekdaysMinRegex = defaultWeekdaysMinRegex;\n            }\n            return this._weekdaysMinStrictRegex && isStrict\n                ? this._weekdaysMinStrictRegex\n                : this._weekdaysMinRegex;\n        }\n    }\n\n    function computeWeekdaysParse() {\n        function cmpLenRev(a, b) {\n            return b.length - a.length;\n        }\n\n        var minPieces = [],\n            shortPieces = [],\n            longPieces = [],\n            mixedPieces = [],\n            i,\n            mom,\n            minp,\n            shortp,\n            longp;\n        for (i = 0; i < 7; i++) {\n            // make the regex if we don't have it already\n            mom = createUTC([2000, 1]).day(i);\n            minp = regexEscape(this.weekdaysMin(mom, ''));\n            shortp = regexEscape(this.weekdaysShort(mom, ''));\n            longp = regexEscape(this.weekdays(mom, ''));\n            minPieces.push(minp);\n            shortPieces.push(shortp);\n            longPieces.push(longp);\n            mixedPieces.push(minp);\n            mixedPieces.push(shortp);\n            mixedPieces.push(longp);\n        }\n        // Sorting makes sure if one weekday (or abbr) is a prefix of another it\n        // will match the longer piece.\n        minPieces.sort(cmpLenRev);\n        shortPieces.sort(cmpLenRev);\n        longPieces.sort(cmpLenRev);\n        mixedPieces.sort(cmpLenRev);\n\n        this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n        this._weekdaysShortRegex = this._weekdaysRegex;\n        this._weekdaysMinRegex = this._weekdaysRegex;\n\n        this._weekdaysStrictRegex = new RegExp(\n            '^(' + longPieces.join('|') + ')',\n            'i'\n        );\n        this._weekdaysShortStrictRegex = new RegExp(\n            '^(' + shortPieces.join('|') + ')',\n            'i'\n        );\n        this._weekdaysMinStrictRegex = new RegExp(\n            '^(' + minPieces.join('|') + ')',\n            'i'\n        );\n    }\n\n    // FORMATTING\n\n    function hFormat() {\n        return this.hours() % 12 || 12;\n    }\n\n    function kFormat() {\n        return this.hours() || 24;\n    }\n\n    addFormatToken('H', ['HH', 2], 0, 'hour');\n    addFormatToken('h', ['hh', 2], 0, hFormat);\n    addFormatToken('k', ['kk', 2], 0, kFormat);\n\n    addFormatToken('hmm', 0, 0, function () {\n        return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);\n    });\n\n    addFormatToken('hmmss', 0, 0, function () {\n        return (\n            '' +\n            hFormat.apply(this) +\n            zeroFill(this.minutes(), 2) +\n            zeroFill(this.seconds(), 2)\n        );\n    });\n\n    addFormatToken('Hmm', 0, 0, function () {\n        return '' + this.hours() + zeroFill(this.minutes(), 2);\n    });\n\n    addFormatToken('Hmmss', 0, 0, function () {\n        return (\n            '' +\n            this.hours() +\n            zeroFill(this.minutes(), 2) +\n            zeroFill(this.seconds(), 2)\n        );\n    });\n\n    function meridiem(token, lowercase) {\n        addFormatToken(token, 0, 0, function () {\n            return this.localeData().meridiem(\n                this.hours(),\n                this.minutes(),\n                lowercase\n            );\n        });\n    }\n\n    meridiem('a', true);\n    meridiem('A', false);\n\n    // ALIASES\n\n    addUnitAlias('hour', 'h');\n\n    // PRIORITY\n    addUnitPriority('hour', 13);\n\n    // PARSING\n\n    function matchMeridiem(isStrict, locale) {\n        return locale._meridiemParse;\n    }\n\n    addRegexToken('a', matchMeridiem);\n    addRegexToken('A', matchMeridiem);\n    addRegexToken('H', match1to2);\n    addRegexToken('h', match1to2);\n    addRegexToken('k', match1to2);\n    addRegexToken('HH', match1to2, match2);\n    addRegexToken('hh', match1to2, match2);\n    addRegexToken('kk', match1to2, match2);\n\n    addRegexToken('hmm', match3to4);\n    addRegexToken('hmmss', match5to6);\n    addRegexToken('Hmm', match3to4);\n    addRegexToken('Hmmss', match5to6);\n\n    addParseToken(['H', 'HH'], HOUR);\n    addParseToken(['k', 'kk'], function (input, array, config) {\n        var kInput = toInt(input);\n        array[HOUR] = kInput === 24 ? 0 : kInput;\n    });\n    addParseToken(['a', 'A'], function (input, array, config) {\n        config._isPm = config._locale.isPM(input);\n        config._meridiem = input;\n    });\n    addParseToken(['h', 'hh'], function (input, array, config) {\n        array[HOUR] = toInt(input);\n        getParsingFlags(config).bigHour = true;\n    });\n    addParseToken('hmm', function (input, array, config) {\n        var pos = input.length - 2;\n        array[HOUR] = toInt(input.substr(0, pos));\n        array[MINUTE] = toInt(input.substr(pos));\n        getParsingFlags(config).bigHour = true;\n    });\n    addParseToken('hmmss', function (input, array, config) {\n        var pos1 = input.length - 4,\n            pos2 = input.length - 2;\n        array[HOUR] = toInt(input.substr(0, pos1));\n        array[MINUTE] = toInt(input.substr(pos1, 2));\n        array[SECOND] = toInt(input.substr(pos2));\n        getParsingFlags(config).bigHour = true;\n    });\n    addParseToken('Hmm', function (input, array, config) {\n        var pos = input.length - 2;\n        array[HOUR] = toInt(input.substr(0, pos));\n        array[MINUTE] = toInt(input.substr(pos));\n    });\n    addParseToken('Hmmss', function (input, array, config) {\n        var pos1 = input.length - 4,\n            pos2 = input.length - 2;\n        array[HOUR] = toInt(input.substr(0, pos1));\n        array[MINUTE] = toInt(input.substr(pos1, 2));\n        array[SECOND] = toInt(input.substr(pos2));\n    });\n\n    // LOCALES\n\n    function localeIsPM(input) {\n        // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays\n        // Using charAt should be more compatible.\n        return (input + '').toLowerCase().charAt(0) === 'p';\n    }\n\n    var defaultLocaleMeridiemParse = /[ap]\\.?m?\\.?/i,\n        // Setting the hour should keep the time, because the user explicitly\n        // specified which hour they want. So trying to maintain the same hour (in\n        // a new timezone) makes sense. Adding/subtracting hours does not follow\n        // this rule.\n        getSetHour = makeGetSet('Hours', true);\n\n    function localeMeridiem(hours, minutes, isLower) {\n        if (hours > 11) {\n            return isLower ? 'pm' : 'PM';\n        } else {\n            return isLower ? 'am' : 'AM';\n        }\n    }\n\n    var baseConfig = {\n        calendar: defaultCalendar,\n        longDateFormat: defaultLongDateFormat,\n        invalidDate: defaultInvalidDate,\n        ordinal: defaultOrdinal,\n        dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse,\n        relativeTime: defaultRelativeTime,\n\n        months: defaultLocaleMonths,\n        monthsShort: defaultLocaleMonthsShort,\n\n        week: defaultLocaleWeek,\n\n        weekdays: defaultLocaleWeekdays,\n        weekdaysMin: defaultLocaleWeekdaysMin,\n        weekdaysShort: defaultLocaleWeekdaysShort,\n\n        meridiemParse: defaultLocaleMeridiemParse,\n    };\n\n    // internal storage for locale config files\n    var locales = {},\n        localeFamilies = {},\n        globalLocale;\n\n    function commonPrefix(arr1, arr2) {\n        var i,\n            minl = Math.min(arr1.length, arr2.length);\n        for (i = 0; i < minl; i += 1) {\n            if (arr1[i] !== arr2[i]) {\n                return i;\n            }\n        }\n        return minl;\n    }\n\n    function normalizeLocale(key) {\n        return key ? key.toLowerCase().replace('_', '-') : key;\n    }\n\n    // pick the locale from the array\n    // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each\n    // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root\n    function chooseLocale(names) {\n        var i = 0,\n            j,\n            next,\n            locale,\n            split;\n\n        while (i < names.length) {\n            split = normalizeLocale(names[i]).split('-');\n            j = split.length;\n            next = normalizeLocale(names[i + 1]);\n            next = next ? next.split('-') : null;\n            while (j > 0) {\n                locale = loadLocale(split.slice(0, j).join('-'));\n                if (locale) {\n                    return locale;\n                }\n                if (\n                    next &&\n                    next.length >= j &&\n                    commonPrefix(split, next) >= j - 1\n                ) {\n                    //the next array item is better than a shallower substring of this one\n                    break;\n                }\n                j--;\n            }\n            i++;\n        }\n        return globalLocale;\n    }\n\n    function loadLocale(name) {\n        var oldLocale = null,\n            aliasedRequire;\n        // TODO: Find a better way to register and load all the locales in Node\n        if (\n            locales[name] === undefined &&\n            typeof module !== 'undefined' &&\n            module &&\n            module.exports\n        ) {\n            try {\n                oldLocale = globalLocale._abbr;\n                aliasedRequire = require;\n                aliasedRequire('./locale/' + name);\n                getSetGlobalLocale(oldLocale);\n            } catch (e) {\n                // mark as not found to avoid repeating expensive file require call causing high CPU\n                // when trying to find en-US, en_US, en-us for every format call\n                locales[name] = null; // null means not found\n            }\n        }\n        return locales[name];\n    }\n\n    // This function will load locale and then set the global locale.  If\n    // no arguments are passed in, it will simply return the current global\n    // locale key.\n    function getSetGlobalLocale(key, values) {\n        var data;\n        if (key) {\n            if (isUndefined(values)) {\n                data = getLocale(key);\n            } else {\n                data = defineLocale(key, values);\n            }\n\n            if (data) {\n                // moment.duration._locale = moment._locale = data;\n                globalLocale = data;\n            } else {\n                if (typeof console !== 'undefined' && console.warn) {\n                    //warn user if arguments are passed but the locale could not be set\n                    console.warn(\n                        'Locale ' + key + ' not found. Did you forget to load it?'\n                    );\n                }\n            }\n        }\n\n        return globalLocale._abbr;\n    }\n\n    function defineLocale(name, config) {\n        if (config !== null) {\n            var locale,\n                parentConfig = baseConfig;\n            config.abbr = name;\n            if (locales[name] != null) {\n                deprecateSimple(\n                    'defineLocaleOverride',\n                    'use moment.updateLocale(localeName, config) to change ' +\n                        'an existing locale. moment.defineLocale(localeName, ' +\n                        'config) should only be used for creating a new locale ' +\n                        'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.'\n                );\n                parentConfig = locales[name]._config;\n            } else if (config.parentLocale != null) {\n                if (locales[config.parentLocale] != null) {\n                    parentConfig = locales[config.parentLocale]._config;\n                } else {\n                    locale = loadLocale(config.parentLocale);\n                    if (locale != null) {\n                        parentConfig = locale._config;\n                    } else {\n                        if (!localeFamilies[config.parentLocale]) {\n                            localeFamilies[config.parentLocale] = [];\n                        }\n                        localeFamilies[config.parentLocale].push({\n                            name: name,\n                            config: config,\n                        });\n                        return null;\n                    }\n                }\n            }\n            locales[name] = new Locale(mergeConfigs(parentConfig, config));\n\n            if (localeFamilies[name]) {\n                localeFamilies[name].forEach(function (x) {\n                    defineLocale(x.name, x.config);\n                });\n            }\n\n            // backwards compat for now: also set the locale\n            // make sure we set the locale AFTER all child locales have been\n            // created, so we won't end up with the child locale set.\n            getSetGlobalLocale(name);\n\n            return locales[name];\n        } else {\n            // useful for testing\n            delete locales[name];\n            return null;\n        }\n    }\n\n    function updateLocale(name, config) {\n        if (config != null) {\n            var locale,\n                tmpLocale,\n                parentConfig = baseConfig;\n\n            if (locales[name] != null && locales[name].parentLocale != null) {\n                // Update existing child locale in-place to avoid memory-leaks\n                locales[name].set(mergeConfigs(locales[name]._config, config));\n            } else {\n                // MERGE\n                tmpLocale = loadLocale(name);\n                if (tmpLocale != null) {\n                    parentConfig = tmpLocale._config;\n                }\n                config = mergeConfigs(parentConfig, config);\n                if (tmpLocale == null) {\n                    // updateLocale is called for creating a new locale\n                    // Set abbr so it will have a name (getters return\n                    // undefined otherwise).\n                    config.abbr = name;\n                }\n                locale = new Locale(config);\n                locale.parentLocale = locales[name];\n                locales[name] = locale;\n            }\n\n            // backwards compat for now: also set the locale\n            getSetGlobalLocale(name);\n        } else {\n            // pass null for config to unupdate, useful for tests\n            if (locales[name] != null) {\n                if (locales[name].parentLocale != null) {\n                    locales[name] = locales[name].parentLocale;\n                    if (name === getSetGlobalLocale()) {\n                        getSetGlobalLocale(name);\n                    }\n                } else if (locales[name] != null) {\n                    delete locales[name];\n                }\n            }\n        }\n        return locales[name];\n    }\n\n    // returns locale data\n    function getLocale(key) {\n        var locale;\n\n        if (key && key._locale && key._locale._abbr) {\n            key = key._locale._abbr;\n        }\n\n        if (!key) {\n            return globalLocale;\n        }\n\n        if (!isArray(key)) {\n            //short-circuit everything else\n            locale = loadLocale(key);\n            if (locale) {\n                return locale;\n            }\n            key = [key];\n        }\n\n        return chooseLocale(key);\n    }\n\n    function listLocales() {\n        return keys(locales);\n    }\n\n    function checkOverflow(m) {\n        var overflow,\n            a = m._a;\n\n        if (a && getParsingFlags(m).overflow === -2) {\n            overflow =\n                a[MONTH] < 0 || a[MONTH] > 11\n                    ? MONTH\n                    : a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH])\n                    ? DATE\n                    : a[HOUR] < 0 ||\n                      a[HOUR] > 24 ||\n                      (a[HOUR] === 24 &&\n                          (a[MINUTE] !== 0 ||\n                              a[SECOND] !== 0 ||\n                              a[MILLISECOND] !== 0))\n                    ? HOUR\n                    : a[MINUTE] < 0 || a[MINUTE] > 59\n                    ? MINUTE\n                    : a[SECOND] < 0 || a[SECOND] > 59\n                    ? SECOND\n                    : a[MILLISECOND] < 0 || a[MILLISECOND] > 999\n                    ? MILLISECOND\n                    : -1;\n\n            if (\n                getParsingFlags(m)._overflowDayOfYear &&\n                (overflow < YEAR || overflow > DATE)\n            ) {\n                overflow = DATE;\n            }\n            if (getParsingFlags(m)._overflowWeeks && overflow === -1) {\n                overflow = WEEK;\n            }\n            if (getParsingFlags(m)._overflowWeekday && overflow === -1) {\n                overflow = WEEKDAY;\n            }\n\n            getParsingFlags(m).overflow = overflow;\n        }\n\n        return m;\n    }\n\n    // iso 8601 regex\n    // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)\n    var extendedIsoRegex = /^\\s*((?:[+-]\\d{6}|\\d{4})-(?:\\d\\d-\\d\\d|W\\d\\d-\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?::\\d\\d(?::\\d\\d(?:[.,]\\d+)?)?)?)([+-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/,\n        basicIsoRegex = /^\\s*((?:[+-]\\d{6}|\\d{4})(?:\\d\\d\\d\\d|W\\d\\d\\d|W\\d\\d|\\d\\d\\d|\\d\\d|))(?:(T| )(\\d\\d(?:\\d\\d(?:\\d\\d(?:[.,]\\d+)?)?)?)([+-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/,\n        tzRegex = /Z|[+-]\\d\\d(?::?\\d\\d)?/,\n        isoDates = [\n            ['YYYYYY-MM-DD', /[+-]\\d{6}-\\d\\d-\\d\\d/],\n            ['YYYY-MM-DD', /\\d{4}-\\d\\d-\\d\\d/],\n            ['GGGG-[W]WW-E', /\\d{4}-W\\d\\d-\\d/],\n            ['GGGG-[W]WW', /\\d{4}-W\\d\\d/, false],\n            ['YYYY-DDD', /\\d{4}-\\d{3}/],\n            ['YYYY-MM', /\\d{4}-\\d\\d/, false],\n            ['YYYYYYMMDD', /[+-]\\d{10}/],\n            ['YYYYMMDD', /\\d{8}/],\n            ['GGGG[W]WWE', /\\d{4}W\\d{3}/],\n            ['GGGG[W]WW', /\\d{4}W\\d{2}/, false],\n            ['YYYYDDD', /\\d{7}/],\n            ['YYYYMM', /\\d{6}/, false],\n            ['YYYY', /\\d{4}/, false],\n        ],\n        // iso time formats and regexes\n        isoTimes = [\n            ['HH:mm:ss.SSSS', /\\d\\d:\\d\\d:\\d\\d\\.\\d+/],\n            ['HH:mm:ss,SSSS', /\\d\\d:\\d\\d:\\d\\d,\\d+/],\n            ['HH:mm:ss', /\\d\\d:\\d\\d:\\d\\d/],\n            ['HH:mm', /\\d\\d:\\d\\d/],\n            ['HHmmss.SSSS', /\\d\\d\\d\\d\\d\\d\\.\\d+/],\n            ['HHmmss,SSSS', /\\d\\d\\d\\d\\d\\d,\\d+/],\n            ['HHmmss', /\\d\\d\\d\\d\\d\\d/],\n            ['HHmm', /\\d\\d\\d\\d/],\n            ['HH', /\\d\\d/],\n        ],\n        aspNetJsonRegex = /^\\/?Date\\((-?\\d+)/i,\n        // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3\n        rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\\s)?(\\d{1,2})\\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s(\\d{2,4})\\s(\\d\\d):(\\d\\d)(?::(\\d\\d))?\\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\\d{4}))$/,\n        obsOffsets = {\n            UT: 0,\n            GMT: 0,\n            EDT: -4 * 60,\n            EST: -5 * 60,\n            CDT: -5 * 60,\n            CST: -6 * 60,\n            MDT: -6 * 60,\n            MST: -7 * 60,\n            PDT: -7 * 60,\n            PST: -8 * 60,\n        };\n\n    // date from iso format\n    function configFromISO(config) {\n        var i,\n            l,\n            string = config._i,\n            match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),\n            allowTime,\n            dateFormat,\n            timeFormat,\n            tzFormat;\n\n        if (match) {\n            getParsingFlags(config).iso = true;\n\n            for (i = 0, l = isoDates.length; i < l; i++) {\n                if (isoDates[i][1].exec(match[1])) {\n                    dateFormat = isoDates[i][0];\n                    allowTime = isoDates[i][2] !== false;\n                    break;\n                }\n            }\n            if (dateFormat == null) {\n                config._isValid = false;\n                return;\n            }\n            if (match[3]) {\n                for (i = 0, l = isoTimes.length; i < l; i++) {\n                    if (isoTimes[i][1].exec(match[3])) {\n                        // match[2] should be 'T' or space\n                        timeFormat = (match[2] || ' ') + isoTimes[i][0];\n                        break;\n                    }\n                }\n                if (timeFormat == null) {\n                    config._isValid = false;\n                    return;\n                }\n            }\n            if (!allowTime && timeFormat != null) {\n                config._isValid = false;\n                return;\n            }\n            if (match[4]) {\n                if (tzRegex.exec(match[4])) {\n                    tzFormat = 'Z';\n                } else {\n                    config._isValid = false;\n                    return;\n                }\n            }\n            config._f = dateFormat + (timeFormat || '') + (tzFormat || '');\n            configFromStringAndFormat(config);\n        } else {\n            config._isValid = false;\n        }\n    }\n\n    function extractFromRFC2822Strings(\n        yearStr,\n        monthStr,\n        dayStr,\n        hourStr,\n        minuteStr,\n        secondStr\n    ) {\n        var result = [\n            untruncateYear(yearStr),\n            defaultLocaleMonthsShort.indexOf(monthStr),\n            parseInt(dayStr, 10),\n            parseInt(hourStr, 10),\n            parseInt(minuteStr, 10),\n        ];\n\n        if (secondStr) {\n            result.push(parseInt(secondStr, 10));\n        }\n\n        return result;\n    }\n\n    function untruncateYear(yearStr) {\n        var year = parseInt(yearStr, 10);\n        if (year <= 49) {\n            return 2000 + year;\n        } else if (year <= 999) {\n            return 1900 + year;\n        }\n        return year;\n    }\n\n    function preprocessRFC2822(s) {\n        // Remove comments and folding whitespace and replace multiple-spaces with a single space\n        return s\n            .replace(/\\([^)]*\\)|[\\n\\t]/g, ' ')\n            .replace(/(\\s\\s+)/g, ' ')\n            .replace(/^\\s\\s*/, '')\n            .replace(/\\s\\s*$/, '');\n    }\n\n    function checkWeekday(weekdayStr, parsedInput, config) {\n        if (weekdayStr) {\n            // TODO: Replace the vanilla JS Date object with an independent day-of-week check.\n            var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr),\n                weekdayActual = new Date(\n                    parsedInput[0],\n                    parsedInput[1],\n                    parsedInput[2]\n                ).getDay();\n            if (weekdayProvided !== weekdayActual) {\n                getParsingFlags(config).weekdayMismatch = true;\n                config._isValid = false;\n                return false;\n            }\n        }\n        return true;\n    }\n\n    function calculateOffset(obsOffset, militaryOffset, numOffset) {\n        if (obsOffset) {\n            return obsOffsets[obsOffset];\n        } else if (militaryOffset) {\n            // the only allowed military tz is Z\n            return 0;\n        } else {\n            var hm = parseInt(numOffset, 10),\n                m = hm % 100,\n                h = (hm - m) / 100;\n            return h * 60 + m;\n        }\n    }\n\n    // date and time from ref 2822 format\n    function configFromRFC2822(config) {\n        var match = rfc2822.exec(preprocessRFC2822(config._i)),\n            parsedArray;\n        if (match) {\n            parsedArray = extractFromRFC2822Strings(\n                match[4],\n                match[3],\n                match[2],\n                match[5],\n                match[6],\n                match[7]\n            );\n            if (!checkWeekday(match[1], parsedArray, config)) {\n                return;\n            }\n\n            config._a = parsedArray;\n            config._tzm = calculateOffset(match[8], match[9], match[10]);\n\n            config._d = createUTCDate.apply(null, config._a);\n            config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n\n            getParsingFlags(config).rfc2822 = true;\n        } else {\n            config._isValid = false;\n        }\n    }\n\n    // date from 1) ASP.NET, 2) ISO, 3) RFC 2822 formats, or 4) optional fallback if parsing isn't strict\n    function configFromString(config) {\n        var matched = aspNetJsonRegex.exec(config._i);\n        if (matched !== null) {\n            config._d = new Date(+matched[1]);\n            return;\n        }\n\n        configFromISO(config);\n        if (config._isValid === false) {\n            delete config._isValid;\n        } else {\n            return;\n        }\n\n        configFromRFC2822(config);\n        if (config._isValid === false) {\n            delete config._isValid;\n        } else {\n            return;\n        }\n\n        if (config._strict) {\n            config._isValid = false;\n        } else {\n            // Final attempt, use Input Fallback\n            hooks.createFromInputFallback(config);\n        }\n    }\n\n    hooks.createFromInputFallback = deprecate(\n        'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' +\n            'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' +\n            'discouraged. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.',\n        function (config) {\n            config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));\n        }\n    );\n\n    // Pick the first defined of two or three arguments.\n    function defaults(a, b, c) {\n        if (a != null) {\n            return a;\n        }\n        if (b != null) {\n            return b;\n        }\n        return c;\n    }\n\n    function currentDateArray(config) {\n        // hooks is actually the exported moment object\n        var nowValue = new Date(hooks.now());\n        if (config._useUTC) {\n            return [\n                nowValue.getUTCFullYear(),\n                nowValue.getUTCMonth(),\n                nowValue.getUTCDate(),\n            ];\n        }\n        return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];\n    }\n\n    // convert an array to a date.\n    // the array should mirror the parameters below\n    // note: all values past the year are optional and will default to the lowest possible value.\n    // [year, month, day , hour, minute, second, millisecond]\n    function configFromArray(config) {\n        var i,\n            date,\n            input = [],\n            currentDate,\n            expectedWeekday,\n            yearToUse;\n\n        if (config._d) {\n            return;\n        }\n\n        currentDate = currentDateArray(config);\n\n        //compute day of the year from weeks and weekdays\n        if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {\n            dayOfYearFromWeekInfo(config);\n        }\n\n        //if the day of the year is set, figure out what it is\n        if (config._dayOfYear != null) {\n            yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);\n\n            if (\n                config._dayOfYear > daysInYear(yearToUse) ||\n                config._dayOfYear === 0\n            ) {\n                getParsingFlags(config)._overflowDayOfYear = true;\n            }\n\n            date = createUTCDate(yearToUse, 0, config._dayOfYear);\n            config._a[MONTH] = date.getUTCMonth();\n            config._a[DATE] = date.getUTCDate();\n        }\n\n        // Default to current date.\n        // * if no year, month, day of month are given, default to today\n        // * if day of month is given, default month and year\n        // * if month is given, default only year\n        // * if year is given, don't default anything\n        for (i = 0; i < 3 && config._a[i] == null; ++i) {\n            config._a[i] = input[i] = currentDate[i];\n        }\n\n        // Zero out whatever was not defaulted, including time\n        for (; i < 7; i++) {\n            config._a[i] = input[i] =\n                config._a[i] == null ? (i === 2 ? 1 : 0) : config._a[i];\n        }\n\n        // Check for 24:00:00.000\n        if (\n            config._a[HOUR] === 24 &&\n            config._a[MINUTE] === 0 &&\n            config._a[SECOND] === 0 &&\n            config._a[MILLISECOND] === 0\n        ) {\n            config._nextDay = true;\n            config._a[HOUR] = 0;\n        }\n\n        config._d = (config._useUTC ? createUTCDate : createDate).apply(\n            null,\n            input\n        );\n        expectedWeekday = config._useUTC\n            ? config._d.getUTCDay()\n            : config._d.getDay();\n\n        // Apply timezone offset from input. The actual utcOffset can be changed\n        // with parseZone.\n        if (config._tzm != null) {\n            config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n        }\n\n        if (config._nextDay) {\n            config._a[HOUR] = 24;\n        }\n\n        // check for mismatching day of week\n        if (\n            config._w &&\n            typeof config._w.d !== 'undefined' &&\n            config._w.d !== expectedWeekday\n        ) {\n            getParsingFlags(config).weekdayMismatch = true;\n        }\n    }\n\n    function dayOfYearFromWeekInfo(config) {\n        var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow, curWeek;\n\n        w = config._w;\n        if (w.GG != null || w.W != null || w.E != null) {\n            dow = 1;\n            doy = 4;\n\n            // TODO: We need to take the current isoWeekYear, but that depends on\n            // how we interpret now (local, utc, fixed offset). So create\n            // a now version of current config (take local/utc/offset flags, and\n            // create now).\n            weekYear = defaults(\n                w.GG,\n                config._a[YEAR],\n                weekOfYear(createLocal(), 1, 4).year\n            );\n            week = defaults(w.W, 1);\n            weekday = defaults(w.E, 1);\n            if (weekday < 1 || weekday > 7) {\n                weekdayOverflow = true;\n            }\n        } else {\n            dow = config._locale._week.dow;\n            doy = config._locale._week.doy;\n\n            curWeek = weekOfYear(createLocal(), dow, doy);\n\n            weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);\n\n            // Default to current week.\n            week = defaults(w.w, curWeek.week);\n\n            if (w.d != null) {\n                // weekday -- low day numbers are considered next week\n                weekday = w.d;\n                if (weekday < 0 || weekday > 6) {\n                    weekdayOverflow = true;\n                }\n            } else if (w.e != null) {\n                // local weekday -- counting starts from beginning of week\n                weekday = w.e + dow;\n                if (w.e < 0 || w.e > 6) {\n                    weekdayOverflow = true;\n                }\n            } else {\n                // default to beginning of week\n                weekday = dow;\n            }\n        }\n        if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {\n            getParsingFlags(config)._overflowWeeks = true;\n        } else if (weekdayOverflow != null) {\n            getParsingFlags(config)._overflowWeekday = true;\n        } else {\n            temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);\n            config._a[YEAR] = temp.year;\n            config._dayOfYear = temp.dayOfYear;\n        }\n    }\n\n    // constant that refers to the ISO standard\n    hooks.ISO_8601 = function () {};\n\n    // constant that refers to the RFC 2822 form\n    hooks.RFC_2822 = function () {};\n\n    // date from string and format string\n    function configFromStringAndFormat(config) {\n        // TODO: Move this to another part of the creation flow to prevent circular deps\n        if (config._f === hooks.ISO_8601) {\n            configFromISO(config);\n            return;\n        }\n        if (config._f === hooks.RFC_2822) {\n            configFromRFC2822(config);\n            return;\n        }\n        config._a = [];\n        getParsingFlags(config).empty = true;\n\n        // This array is used to make a Date, either with `new Date` or `Date.UTC`\n        var string = '' + config._i,\n            i,\n            parsedInput,\n            tokens,\n            token,\n            skipped,\n            stringLength = string.length,\n            totalParsedInputLength = 0,\n            era;\n\n        tokens =\n            expandFormat(config._f, config._locale).match(formattingTokens) || [];\n\n        for (i = 0; i < tokens.length; i++) {\n            token = tokens[i];\n            parsedInput = (string.match(getParseRegexForToken(token, config)) ||\n                [])[0];\n            if (parsedInput) {\n                skipped = string.substr(0, string.indexOf(parsedInput));\n                if (skipped.length > 0) {\n                    getParsingFlags(config).unusedInput.push(skipped);\n                }\n                string = string.slice(\n                    string.indexOf(parsedInput) + parsedInput.length\n                );\n                totalParsedInputLength += parsedInput.length;\n            }\n            // don't parse if it's not a known token\n            if (formatTokenFunctions[token]) {\n                if (parsedInput) {\n                    getParsingFlags(config).empty = false;\n                } else {\n                    getParsingFlags(config).unusedTokens.push(token);\n                }\n                addTimeToArrayFromToken(token, parsedInput, config);\n            } else if (config._strict && !parsedInput) {\n                getParsingFlags(config).unusedTokens.push(token);\n            }\n        }\n\n        // add remaining unparsed input length to the string\n        getParsingFlags(config).charsLeftOver =\n            stringLength - totalParsedInputLength;\n        if (string.length > 0) {\n            getParsingFlags(config).unusedInput.push(string);\n        }\n\n        // clear _12h flag if hour is <= 12\n        if (\n            config._a[HOUR] <= 12 &&\n            getParsingFlags(config).bigHour === true &&\n            config._a[HOUR] > 0\n        ) {\n            getParsingFlags(config).bigHour = undefined;\n        }\n\n        getParsingFlags(config).parsedDateParts = config._a.slice(0);\n        getParsingFlags(config).meridiem = config._meridiem;\n        // handle meridiem\n        config._a[HOUR] = meridiemFixWrap(\n            config._locale,\n            config._a[HOUR],\n            config._meridiem\n        );\n\n        // handle era\n        era = getParsingFlags(config).era;\n        if (era !== null) {\n            config._a[YEAR] = config._locale.erasConvertYear(era, config._a[YEAR]);\n        }\n\n        configFromArray(config);\n        checkOverflow(config);\n    }\n\n    function meridiemFixWrap(locale, hour, meridiem) {\n        var isPm;\n\n        if (meridiem == null) {\n            // nothing to do\n            return hour;\n        }\n        if (locale.meridiemHour != null) {\n            return locale.meridiemHour(hour, meridiem);\n        } else if (locale.isPM != null) {\n            // Fallback\n            isPm = locale.isPM(meridiem);\n            if (isPm && hour < 12) {\n                hour += 12;\n            }\n            if (!isPm && hour === 12) {\n                hour = 0;\n            }\n            return hour;\n        } else {\n            // this is not supposed to happen\n            return hour;\n        }\n    }\n\n    // date from string and array of format strings\n    function configFromStringAndArray(config) {\n        var tempConfig,\n            bestMoment,\n            scoreToBeat,\n            i,\n            currentScore,\n            validFormatFound,\n            bestFormatIsValid = false;\n\n        if (config._f.length === 0) {\n            getParsingFlags(config).invalidFormat = true;\n            config._d = new Date(NaN);\n            return;\n        }\n\n        for (i = 0; i < config._f.length; i++) {\n            currentScore = 0;\n            validFormatFound = false;\n            tempConfig = copyConfig({}, config);\n            if (config._useUTC != null) {\n                tempConfig._useUTC = config._useUTC;\n            }\n            tempConfig._f = config._f[i];\n            configFromStringAndFormat(tempConfig);\n\n            if (isValid(tempConfig)) {\n                validFormatFound = true;\n            }\n\n            // if there is any input that was not parsed add a penalty for that format\n            currentScore += getParsingFlags(tempConfig).charsLeftOver;\n\n            //or tokens\n            currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;\n\n            getParsingFlags(tempConfig).score = currentScore;\n\n            if (!bestFormatIsValid) {\n                if (\n                    scoreToBeat == null ||\n                    currentScore < scoreToBeat ||\n                    validFormatFound\n                ) {\n                    scoreToBeat = currentScore;\n                    bestMoment = tempConfig;\n                    if (validFormatFound) {\n                        bestFormatIsValid = true;\n                    }\n                }\n            } else {\n                if (currentScore < scoreToBeat) {\n                    scoreToBeat = currentScore;\n                    bestMoment = tempConfig;\n                }\n            }\n        }\n\n        extend(config, bestMoment || tempConfig);\n    }\n\n    function configFromObject(config) {\n        if (config._d) {\n            return;\n        }\n\n        var i = normalizeObjectUnits(config._i),\n            dayOrDate = i.day === undefined ? i.date : i.day;\n        config._a = map(\n            [i.year, i.month, dayOrDate, i.hour, i.minute, i.second, i.millisecond],\n            function (obj) {\n                return obj && parseInt(obj, 10);\n            }\n        );\n\n        configFromArray(config);\n    }\n\n    function createFromConfig(config) {\n        var res = new Moment(checkOverflow(prepareConfig(config)));\n        if (res._nextDay) {\n            // Adding is smart enough around DST\n            res.add(1, 'd');\n            res._nextDay = undefined;\n        }\n\n        return res;\n    }\n\n    function prepareConfig(config) {\n        var input = config._i,\n            format = config._f;\n\n        config._locale = config._locale || getLocale(config._l);\n\n        if (input === null || (format === undefined && input === '')) {\n            return createInvalid({ nullInput: true });\n        }\n\n        if (typeof input === 'string') {\n            config._i = input = config._locale.preparse(input);\n        }\n\n        if (isMoment(input)) {\n            return new Moment(checkOverflow(input));\n        } else if (isDate(input)) {\n            config._d = input;\n        } else if (isArray(format)) {\n            configFromStringAndArray(config);\n        } else if (format) {\n            configFromStringAndFormat(config);\n        } else {\n            configFromInput(config);\n        }\n\n        if (!isValid(config)) {\n            config._d = null;\n        }\n\n        return config;\n    }\n\n    function configFromInput(config) {\n        var input = config._i;\n        if (isUndefined(input)) {\n            config._d = new Date(hooks.now());\n        } else if (isDate(input)) {\n            config._d = new Date(input.valueOf());\n        } else if (typeof input === 'string') {\n            configFromString(config);\n        } else if (isArray(input)) {\n            config._a = map(input.slice(0), function (obj) {\n                return parseInt(obj, 10);\n            });\n            configFromArray(config);\n        } else if (isObject(input)) {\n            configFromObject(config);\n        } else if (isNumber(input)) {\n            // from milliseconds\n            config._d = new Date(input);\n        } else {\n            hooks.createFromInputFallback(config);\n        }\n    }\n\n    function createLocalOrUTC(input, format, locale, strict, isUTC) {\n        var c = {};\n\n        if (format === true || format === false) {\n            strict = format;\n            format = undefined;\n        }\n\n        if (locale === true || locale === false) {\n            strict = locale;\n            locale = undefined;\n        }\n\n        if (\n            (isObject(input) && isObjectEmpty(input)) ||\n            (isArray(input) && input.length === 0)\n        ) {\n            input = undefined;\n        }\n        // object construction must be done this way.\n        // https://github.com/moment/moment/issues/1423\n        c._isAMomentObject = true;\n        c._useUTC = c._isUTC = isUTC;\n        c._l = locale;\n        c._i = input;\n        c._f = format;\n        c._strict = strict;\n\n        return createFromConfig(c);\n    }\n\n    function createLocal(input, format, locale, strict) {\n        return createLocalOrUTC(input, format, locale, strict, false);\n    }\n\n    var prototypeMin = deprecate(\n            'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',\n            function () {\n                var other = createLocal.apply(null, arguments);\n                if (this.isValid() && other.isValid()) {\n                    return other < this ? this : other;\n                } else {\n                    return createInvalid();\n                }\n            }\n        ),\n        prototypeMax = deprecate(\n            'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',\n            function () {\n                var other = createLocal.apply(null, arguments);\n                if (this.isValid() && other.isValid()) {\n                    return other > this ? this : other;\n                } else {\n                    return createInvalid();\n                }\n            }\n        );\n\n    // Pick a moment m from moments so that m[fn](other) is true for all\n    // other. This relies on the function fn to be transitive.\n    //\n    // moments should either be an array of moment objects or an array, whose\n    // first element is an array of moment objects.\n    function pickBy(fn, moments) {\n        var res, i;\n        if (moments.length === 1 && isArray(moments[0])) {\n            moments = moments[0];\n        }\n        if (!moments.length) {\n            return createLocal();\n        }\n        res = moments[0];\n        for (i = 1; i < moments.length; ++i) {\n            if (!moments[i].isValid() || moments[i][fn](res)) {\n                res = moments[i];\n            }\n        }\n        return res;\n    }\n\n    // TODO: Use [].sort instead?\n    function min() {\n        var args = [].slice.call(arguments, 0);\n\n        return pickBy('isBefore', args);\n    }\n\n    function max() {\n        var args = [].slice.call(arguments, 0);\n\n        return pickBy('isAfter', args);\n    }\n\n    var now = function () {\n        return Date.now ? Date.now() : +new Date();\n    };\n\n    var ordering = [\n        'year',\n        'quarter',\n        'month',\n        'week',\n        'day',\n        'hour',\n        'minute',\n        'second',\n        'millisecond',\n    ];\n\n    function isDurationValid(m) {\n        var key,\n            unitHasDecimal = false,\n            i;\n        for (key in m) {\n            if (\n                hasOwnProp(m, key) &&\n                !(\n                    indexOf.call(ordering, key) !== -1 &&\n                    (m[key] == null || !isNaN(m[key]))\n                )\n            ) {\n                return false;\n            }\n        }\n\n        for (i = 0; i < ordering.length; ++i) {\n            if (m[ordering[i]]) {\n                if (unitHasDecimal) {\n                    return false; // only allow non-integers for smallest unit\n                }\n                if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) {\n                    unitHasDecimal = true;\n                }\n            }\n        }\n\n        return true;\n    }\n\n    function isValid$1() {\n        return this._isValid;\n    }\n\n    function createInvalid$1() {\n        return createDuration(NaN);\n    }\n\n    function Duration(duration) {\n        var normalizedInput = normalizeObjectUnits(duration),\n            years = normalizedInput.year || 0,\n            quarters = normalizedInput.quarter || 0,\n            months = normalizedInput.month || 0,\n            weeks = normalizedInput.week || normalizedInput.isoWeek || 0,\n            days = normalizedInput.day || 0,\n            hours = normalizedInput.hour || 0,\n            minutes = normalizedInput.minute || 0,\n            seconds = normalizedInput.second || 0,\n            milliseconds = normalizedInput.millisecond || 0;\n\n        this._isValid = isDurationValid(normalizedInput);\n\n        // representation for dateAddRemove\n        this._milliseconds =\n            +milliseconds +\n            seconds * 1e3 + // 1000\n            minutes * 6e4 + // 1000 * 60\n            hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978\n        // Because of dateAddRemove treats 24 hours as different from a\n        // day when working around DST, we need to store them separately\n        this._days = +days + weeks * 7;\n        // It is impossible to translate months into days without knowing\n        // which months you are are talking about, so we have to store\n        // it separately.\n        this._months = +months + quarters * 3 + years * 12;\n\n        this._data = {};\n\n        this._locale = getLocale();\n\n        this._bubble();\n    }\n\n    function isDuration(obj) {\n        return obj instanceof Duration;\n    }\n\n    function absRound(number) {\n        if (number < 0) {\n            return Math.round(-1 * number) * -1;\n        } else {\n            return Math.round(number);\n        }\n    }\n\n    // compare two arrays, return the number of differences\n    function compareArrays(array1, array2, dontConvert) {\n        var len = Math.min(array1.length, array2.length),\n            lengthDiff = Math.abs(array1.length - array2.length),\n            diffs = 0,\n            i;\n        for (i = 0; i < len; i++) {\n            if (\n                (dontConvert && array1[i] !== array2[i]) ||\n                (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))\n            ) {\n                diffs++;\n            }\n        }\n        return diffs + lengthDiff;\n    }\n\n    // FORMATTING\n\n    function offset(token, separator) {\n        addFormatToken(token, 0, 0, function () {\n            var offset = this.utcOffset(),\n                sign = '+';\n            if (offset < 0) {\n                offset = -offset;\n                sign = '-';\n            }\n            return (\n                sign +\n                zeroFill(~~(offset / 60), 2) +\n                separator +\n                zeroFill(~~offset % 60, 2)\n            );\n        });\n    }\n\n    offset('Z', ':');\n    offset('ZZ', '');\n\n    // PARSING\n\n    addRegexToken('Z', matchShortOffset);\n    addRegexToken('ZZ', matchShortOffset);\n    addParseToken(['Z', 'ZZ'], function (input, array, config) {\n        config._useUTC = true;\n        config._tzm = offsetFromString(matchShortOffset, input);\n    });\n\n    // HELPERS\n\n    // timezone chunker\n    // '+10:00' > ['10',  '00']\n    // '-1530'  > ['-15', '30']\n    var chunkOffset = /([\\+\\-]|\\d\\d)/gi;\n\n    function offsetFromString(matcher, string) {\n        var matches = (string || '').match(matcher),\n            chunk,\n            parts,\n            minutes;\n\n        if (matches === null) {\n            return null;\n        }\n\n        chunk = matches[matches.length - 1] || [];\n        parts = (chunk + '').match(chunkOffset) || ['-', 0, 0];\n        minutes = +(parts[1] * 60) + toInt(parts[2]);\n\n        return minutes === 0 ? 0 : parts[0] === '+' ? minutes : -minutes;\n    }\n\n    // Return a moment from input, that is local/utc/zone equivalent to model.\n    function cloneWithOffset(input, model) {\n        var res, diff;\n        if (model._isUTC) {\n            res = model.clone();\n            diff =\n                (isMoment(input) || isDate(input)\n                    ? input.valueOf()\n                    : createLocal(input).valueOf()) - res.valueOf();\n            // Use low-level api, because this fn is low-level api.\n            res._d.setTime(res._d.valueOf() + diff);\n            hooks.updateOffset(res, false);\n            return res;\n        } else {\n            return createLocal(input).local();\n        }\n    }\n\n    function getDateOffset(m) {\n        // On Firefox.24 Date#getTimezoneOffset returns a floating point.\n        // https://github.com/moment/moment/pull/1871\n        return -Math.round(m._d.getTimezoneOffset());\n    }\n\n    // HOOKS\n\n    // This function will be called whenever a moment is mutated.\n    // It is intended to keep the offset in sync with the timezone.\n    hooks.updateOffset = function () {};\n\n    // MOMENTS\n\n    // keepLocalTime = true means only change the timezone, without\n    // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->\n    // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset\n    // +0200, so we adjust the time as needed, to be valid.\n    //\n    // Keeping the time actually adds/subtracts (one hour)\n    // from the actual represented time. That is why we call updateOffset\n    // a second time. In case it wants us to change the offset again\n    // _changeInProgress == true case, then we have to adjust, because\n    // there is no such time in the given timezone.\n    function getSetOffset(input, keepLocalTime, keepMinutes) {\n        var offset = this._offset || 0,\n            localAdjust;\n        if (!this.isValid()) {\n            return input != null ? this : NaN;\n        }\n        if (input != null) {\n            if (typeof input === 'string') {\n                input = offsetFromString(matchShortOffset, input);\n                if (input === null) {\n                    return this;\n                }\n            } else if (Math.abs(input) < 16 && !keepMinutes) {\n                input = input * 60;\n            }\n            if (!this._isUTC && keepLocalTime) {\n                localAdjust = getDateOffset(this);\n            }\n            this._offset = input;\n            this._isUTC = true;\n            if (localAdjust != null) {\n                this.add(localAdjust, 'm');\n            }\n            if (offset !== input) {\n                if (!keepLocalTime || this._changeInProgress) {\n                    addSubtract(\n                        this,\n                        createDuration(input - offset, 'm'),\n                        1,\n                        false\n                    );\n                } else if (!this._changeInProgress) {\n                    this._changeInProgress = true;\n                    hooks.updateOffset(this, true);\n                    this._changeInProgress = null;\n                }\n            }\n            return this;\n        } else {\n            return this._isUTC ? offset : getDateOffset(this);\n        }\n    }\n\n    function getSetZone(input, keepLocalTime) {\n        if (input != null) {\n            if (typeof input !== 'string') {\n                input = -input;\n            }\n\n            this.utcOffset(input, keepLocalTime);\n\n            return this;\n        } else {\n            return -this.utcOffset();\n        }\n    }\n\n    function setOffsetToUTC(keepLocalTime) {\n        return this.utcOffset(0, keepLocalTime);\n    }\n\n    function setOffsetToLocal(keepLocalTime) {\n        if (this._isUTC) {\n            this.utcOffset(0, keepLocalTime);\n            this._isUTC = false;\n\n            if (keepLocalTime) {\n                this.subtract(getDateOffset(this), 'm');\n            }\n        }\n        return this;\n    }\n\n    function setOffsetToParsedOffset() {\n        if (this._tzm != null) {\n            this.utcOffset(this._tzm, false, true);\n        } else if (typeof this._i === 'string') {\n            var tZone = offsetFromString(matchOffset, this._i);\n            if (tZone != null) {\n                this.utcOffset(tZone);\n            } else {\n                this.utcOffset(0, true);\n            }\n        }\n        return this;\n    }\n\n    function hasAlignedHourOffset(input) {\n        if (!this.isValid()) {\n            return false;\n        }\n        input = input ? createLocal(input).utcOffset() : 0;\n\n        return (this.utcOffset() - input) % 60 === 0;\n    }\n\n    function isDaylightSavingTime() {\n        return (\n            this.utcOffset() > this.clone().month(0).utcOffset() ||\n            this.utcOffset() > this.clone().month(5).utcOffset()\n        );\n    }\n\n    function isDaylightSavingTimeShifted() {\n        if (!isUndefined(this._isDSTShifted)) {\n            return this._isDSTShifted;\n        }\n\n        var c = {},\n            other;\n\n        copyConfig(c, this);\n        c = prepareConfig(c);\n\n        if (c._a) {\n            other = c._isUTC ? createUTC(c._a) : createLocal(c._a);\n            this._isDSTShifted =\n                this.isValid() && compareArrays(c._a, other.toArray()) > 0;\n        } else {\n            this._isDSTShifted = false;\n        }\n\n        return this._isDSTShifted;\n    }\n\n    function isLocal() {\n        return this.isValid() ? !this._isUTC : false;\n    }\n\n    function isUtcOffset() {\n        return this.isValid() ? this._isUTC : false;\n    }\n\n    function isUtc() {\n        return this.isValid() ? this._isUTC && this._offset === 0 : false;\n    }\n\n    // ASP.NET json date format regex\n    var aspNetRegex = /^(-|\\+)?(?:(\\d*)[. ])?(\\d+):(\\d+)(?::(\\d+)(\\.\\d*)?)?$/,\n        // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html\n        // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere\n        // and further modified to allow for strings containing both week and day\n        isoRegex = /^(-|\\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;\n\n    function createDuration(input, key) {\n        var duration = input,\n            // matching against regexp is expensive, do it on demand\n            match = null,\n            sign,\n            ret,\n            diffRes;\n\n        if (isDuration(input)) {\n            duration = {\n                ms: input._milliseconds,\n                d: input._days,\n                M: input._months,\n            };\n        } else if (isNumber(input) || !isNaN(+input)) {\n            duration = {};\n            if (key) {\n                duration[key] = +input;\n            } else {\n                duration.milliseconds = +input;\n            }\n        } else if ((match = aspNetRegex.exec(input))) {\n            sign = match[1] === '-' ? -1 : 1;\n            duration = {\n                y: 0,\n                d: toInt(match[DATE]) * sign,\n                h: toInt(match[HOUR]) * sign,\n                m: toInt(match[MINUTE]) * sign,\n                s: toInt(match[SECOND]) * sign,\n                ms: toInt(absRound(match[MILLISECOND] * 1000)) * sign, // the millisecond decimal point is included in the match\n            };\n        } else if ((match = isoRegex.exec(input))) {\n            sign = match[1] === '-' ? -1 : 1;\n            duration = {\n                y: parseIso(match[2], sign),\n                M: parseIso(match[3], sign),\n                w: parseIso(match[4], sign),\n                d: parseIso(match[5], sign),\n                h: parseIso(match[6], sign),\n                m: parseIso(match[7], sign),\n                s: parseIso(match[8], sign),\n            };\n        } else if (duration == null) {\n            // checks for null or undefined\n            duration = {};\n        } else if (\n            typeof duration === 'object' &&\n            ('from' in duration || 'to' in duration)\n        ) {\n            diffRes = momentsDifference(\n                createLocal(duration.from),\n                createLocal(duration.to)\n            );\n\n            duration = {};\n            duration.ms = diffRes.milliseconds;\n            duration.M = diffRes.months;\n        }\n\n        ret = new Duration(duration);\n\n        if (isDuration(input) && hasOwnProp(input, '_locale')) {\n            ret._locale = input._locale;\n        }\n\n        if (isDuration(input) && hasOwnProp(input, '_isValid')) {\n            ret._isValid = input._isValid;\n        }\n\n        return ret;\n    }\n\n    createDuration.fn = Duration.prototype;\n    createDuration.invalid = createInvalid$1;\n\n    function parseIso(inp, sign) {\n        // We'd normally use ~~inp for this, but unfortunately it also\n        // converts floats to ints.\n        // inp may be undefined, so careful calling replace on it.\n        var res = inp && parseFloat(inp.replace(',', '.'));\n        // apply sign while we're at it\n        return (isNaN(res) ? 0 : res) * sign;\n    }\n\n    function positiveMomentsDifference(base, other) {\n        var res = {};\n\n        res.months =\n            other.month() - base.month() + (other.year() - base.year()) * 12;\n        if (base.clone().add(res.months, 'M').isAfter(other)) {\n            --res.months;\n        }\n\n        res.milliseconds = +other - +base.clone().add(res.months, 'M');\n\n        return res;\n    }\n\n    function momentsDifference(base, other) {\n        var res;\n        if (!(base.isValid() && other.isValid())) {\n            return { milliseconds: 0, months: 0 };\n        }\n\n        other = cloneWithOffset(other, base);\n        if (base.isBefore(other)) {\n            res = positiveMomentsDifference(base, other);\n        } else {\n            res = positiveMomentsDifference(other, base);\n            res.milliseconds = -res.milliseconds;\n            res.months = -res.months;\n        }\n\n        return res;\n    }\n\n    // TODO: remove 'name' arg after deprecation is removed\n    function createAdder(direction, name) {\n        return function (val, period) {\n            var dur, tmp;\n            //invert the arguments, but complain about it\n            if (period !== null && !isNaN(+period)) {\n                deprecateSimple(\n                    name,\n                    'moment().' +\n                        name +\n                        '(period, number) is deprecated. Please use moment().' +\n                        name +\n                        '(number, period). ' +\n                        'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.'\n                );\n                tmp = val;\n                val = period;\n                period = tmp;\n            }\n\n            dur = createDuration(val, period);\n            addSubtract(this, dur, direction);\n            return this;\n        };\n    }\n\n    function addSubtract(mom, duration, isAdding, updateOffset) {\n        var milliseconds = duration._milliseconds,\n            days = absRound(duration._days),\n            months = absRound(duration._months);\n\n        if (!mom.isValid()) {\n            // No op\n            return;\n        }\n\n        updateOffset = updateOffset == null ? true : updateOffset;\n\n        if (months) {\n            setMonth(mom, get(mom, 'Month') + months * isAdding);\n        }\n        if (days) {\n            set$1(mom, 'Date', get(mom, 'Date') + days * isAdding);\n        }\n        if (milliseconds) {\n            mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);\n        }\n        if (updateOffset) {\n            hooks.updateOffset(mom, days || months);\n        }\n    }\n\n    var add = createAdder(1, 'add'),\n        subtract = createAdder(-1, 'subtract');\n\n    function isString(input) {\n        return typeof input === 'string' || input instanceof String;\n    }\n\n    // type MomentInput = Moment | Date | string | number | (number | string)[] | MomentInputObject | void; // null | undefined\n    function isMomentInput(input) {\n        return (\n            isMoment(input) ||\n            isDate(input) ||\n            isString(input) ||\n            isNumber(input) ||\n            isNumberOrStringArray(input) ||\n            isMomentInputObject(input) ||\n            input === null ||\n            input === undefined\n        );\n    }\n\n    function isMomentInputObject(input) {\n        var objectTest = isObject(input) && !isObjectEmpty(input),\n            propertyTest = false,\n            properties = [\n                'years',\n                'year',\n                'y',\n                'months',\n                'month',\n                'M',\n                'days',\n                'day',\n                'd',\n                'dates',\n                'date',\n                'D',\n                'hours',\n                'hour',\n                'h',\n                'minutes',\n                'minute',\n                'm',\n                'seconds',\n                'second',\n                's',\n                'milliseconds',\n                'millisecond',\n                'ms',\n            ],\n            i,\n            property;\n\n        for (i = 0; i < properties.length; i += 1) {\n            property = properties[i];\n            propertyTest = propertyTest || hasOwnProp(input, property);\n        }\n\n        return objectTest && propertyTest;\n    }\n\n    function isNumberOrStringArray(input) {\n        var arrayTest = isArray(input),\n            dataTypeTest = false;\n        if (arrayTest) {\n            dataTypeTest =\n                input.filter(function (item) {\n                    return !isNumber(item) && isString(input);\n                }).length === 0;\n        }\n        return arrayTest && dataTypeTest;\n    }\n\n    function isCalendarSpec(input) {\n        var objectTest = isObject(input) && !isObjectEmpty(input),\n            propertyTest = false,\n            properties = [\n                'sameDay',\n                'nextDay',\n                'lastDay',\n                'nextWeek',\n                'lastWeek',\n                'sameElse',\n            ],\n            i,\n            property;\n\n        for (i = 0; i < properties.length; i += 1) {\n            property = properties[i];\n            propertyTest = propertyTest || hasOwnProp(input, property);\n        }\n\n        return objectTest && propertyTest;\n    }\n\n    function getCalendarFormat(myMoment, now) {\n        var diff = myMoment.diff(now, 'days', true);\n        return diff < -6\n            ? 'sameElse'\n            : diff < -1\n            ? 'lastWeek'\n            : diff < 0\n            ? 'lastDay'\n            : diff < 1\n            ? 'sameDay'\n            : diff < 2\n            ? 'nextDay'\n            : diff < 7\n            ? 'nextWeek'\n            : 'sameElse';\n    }\n\n    function calendar$1(time, formats) {\n        // Support for single parameter, formats only overload to the calendar function\n        if (arguments.length === 1) {\n            if (!arguments[0]) {\n                time = undefined;\n                formats = undefined;\n            } else if (isMomentInput(arguments[0])) {\n                time = arguments[0];\n                formats = undefined;\n            } else if (isCalendarSpec(arguments[0])) {\n                formats = arguments[0];\n                time = undefined;\n            }\n        }\n        // We want to compare the start of today, vs this.\n        // Getting start-of-today depends on whether we're local/utc/offset or not.\n        var now = time || createLocal(),\n            sod = cloneWithOffset(now, this).startOf('day'),\n            format = hooks.calendarFormat(this, sod) || 'sameElse',\n            output =\n                formats &&\n                (isFunction(formats[format])\n                    ? formats[format].call(this, now)\n                    : formats[format]);\n\n        return this.format(\n            output || this.localeData().calendar(format, this, createLocal(now))\n        );\n    }\n\n    function clone() {\n        return new Moment(this);\n    }\n\n    function isAfter(input, units) {\n        var localInput = isMoment(input) ? input : createLocal(input);\n        if (!(this.isValid() && localInput.isValid())) {\n            return false;\n        }\n        units = normalizeUnits(units) || 'millisecond';\n        if (units === 'millisecond') {\n            return this.valueOf() > localInput.valueOf();\n        } else {\n            return localInput.valueOf() < this.clone().startOf(units).valueOf();\n        }\n    }\n\n    function isBefore(input, units) {\n        var localInput = isMoment(input) ? input : createLocal(input);\n        if (!(this.isValid() && localInput.isValid())) {\n            return false;\n        }\n        units = normalizeUnits(units) || 'millisecond';\n        if (units === 'millisecond') {\n            return this.valueOf() < localInput.valueOf();\n        } else {\n            return this.clone().endOf(units).valueOf() < localInput.valueOf();\n        }\n    }\n\n    function isBetween(from, to, units, inclusivity) {\n        var localFrom = isMoment(from) ? from : createLocal(from),\n            localTo = isMoment(to) ? to : createLocal(to);\n        if (!(this.isValid() && localFrom.isValid() && localTo.isValid())) {\n            return false;\n        }\n        inclusivity = inclusivity || '()';\n        return (\n            (inclusivity[0] === '('\n                ? this.isAfter(localFrom, units)\n                : !this.isBefore(localFrom, units)) &&\n            (inclusivity[1] === ')'\n                ? this.isBefore(localTo, units)\n                : !this.isAfter(localTo, units))\n        );\n    }\n\n    function isSame(input, units) {\n        var localInput = isMoment(input) ? input : createLocal(input),\n            inputMs;\n        if (!(this.isValid() && localInput.isValid())) {\n            return false;\n        }\n        units = normalizeUnits(units) || 'millisecond';\n        if (units === 'millisecond') {\n            return this.valueOf() === localInput.valueOf();\n        } else {\n            inputMs = localInput.valueOf();\n            return (\n                this.clone().startOf(units).valueOf() <= inputMs &&\n                inputMs <= this.clone().endOf(units).valueOf()\n            );\n        }\n    }\n\n    function isSameOrAfter(input, units) {\n        return this.isSame(input, units) || this.isAfter(input, units);\n    }\n\n    function isSameOrBefore(input, units) {\n        return this.isSame(input, units) || this.isBefore(input, units);\n    }\n\n    function diff(input, units, asFloat) {\n        var that, zoneDelta, output;\n\n        if (!this.isValid()) {\n            return NaN;\n        }\n\n        that = cloneWithOffset(input, this);\n\n        if (!that.isValid()) {\n            return NaN;\n        }\n\n        zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;\n\n        units = normalizeUnits(units);\n\n        switch (units) {\n            case 'year':\n                output = monthDiff(this, that) / 12;\n                break;\n            case 'month':\n                output = monthDiff(this, that);\n                break;\n            case 'quarter':\n                output = monthDiff(this, that) / 3;\n                break;\n            case 'second':\n                output = (this - that) / 1e3;\n                break; // 1000\n            case 'minute':\n                output = (this - that) / 6e4;\n                break; // 1000 * 60\n            case 'hour':\n                output = (this - that) / 36e5;\n                break; // 1000 * 60 * 60\n            case 'day':\n                output = (this - that - zoneDelta) / 864e5;\n                break; // 1000 * 60 * 60 * 24, negate dst\n            case 'week':\n                output = (this - that - zoneDelta) / 6048e5;\n                break; // 1000 * 60 * 60 * 24 * 7, negate dst\n            default:\n                output = this - that;\n        }\n\n        return asFloat ? output : absFloor(output);\n    }\n\n    function monthDiff(a, b) {\n        if (a.date() < b.date()) {\n            // end-of-month calculations work correct when the start month has more\n            // days than the end month.\n            return -monthDiff(b, a);\n        }\n        // difference in months\n        var wholeMonthDiff = (b.year() - a.year()) * 12 + (b.month() - a.month()),\n            // b is in (anchor - 1 month, anchor + 1 month)\n            anchor = a.clone().add(wholeMonthDiff, 'months'),\n            anchor2,\n            adjust;\n\n        if (b - anchor < 0) {\n            anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');\n            // linear across the month\n            adjust = (b - anchor) / (anchor - anchor2);\n        } else {\n            anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');\n            // linear across the month\n            adjust = (b - anchor) / (anchor2 - anchor);\n        }\n\n        //check for negative zero, return zero if negative zero\n        return -(wholeMonthDiff + adjust) || 0;\n    }\n\n    hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';\n    hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';\n\n    function toString() {\n        return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');\n    }\n\n    function toISOString(keepOffset) {\n        if (!this.isValid()) {\n            return null;\n        }\n        var utc = keepOffset !== true,\n            m = utc ? this.clone().utc() : this;\n        if (m.year() < 0 || m.year() > 9999) {\n            return formatMoment(\n                m,\n                utc\n                    ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'\n                    : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ'\n            );\n        }\n        if (isFunction(Date.prototype.toISOString)) {\n            // native implementation is ~50x faster, use it when we can\n            if (utc) {\n                return this.toDate().toISOString();\n            } else {\n                return new Date(this.valueOf() + this.utcOffset() * 60 * 1000)\n                    .toISOString()\n                    .replace('Z', formatMoment(m, 'Z'));\n            }\n        }\n        return formatMoment(\n            m,\n            utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ'\n        );\n    }\n\n    /**\n     * Return a human readable representation of a moment that can\n     * also be evaluated to get a new moment which is the same\n     *\n     * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects\n     */\n    function inspect() {\n        if (!this.isValid()) {\n            return 'moment.invalid(/* ' + this._i + ' */)';\n        }\n        var func = 'moment',\n            zone = '',\n            prefix,\n            year,\n            datetime,\n            suffix;\n        if (!this.isLocal()) {\n            func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';\n            zone = 'Z';\n        }\n        prefix = '[' + func + '(\"]';\n        year = 0 <= this.year() && this.year() <= 9999 ? 'YYYY' : 'YYYYYY';\n        datetime = '-MM-DD[T]HH:mm:ss.SSS';\n        suffix = zone + '[\")]';\n\n        return this.format(prefix + year + datetime + suffix);\n    }\n\n    function format(inputString) {\n        if (!inputString) {\n            inputString = this.isUtc()\n                ? hooks.defaultFormatUtc\n                : hooks.defaultFormat;\n        }\n        var output = formatMoment(this, inputString);\n        return this.localeData().postformat(output);\n    }\n\n    function from(time, withoutSuffix) {\n        if (\n            this.isValid() &&\n            ((isMoment(time) && time.isValid()) || createLocal(time).isValid())\n        ) {\n            return createDuration({ to: this, from: time })\n                .locale(this.locale())\n                .humanize(!withoutSuffix);\n        } else {\n            return this.localeData().invalidDate();\n        }\n    }\n\n    function fromNow(withoutSuffix) {\n        return this.from(createLocal(), withoutSuffix);\n    }\n\n    function to(time, withoutSuffix) {\n        if (\n            this.isValid() &&\n            ((isMoment(time) && time.isValid()) || createLocal(time).isValid())\n        ) {\n            return createDuration({ from: this, to: time })\n                .locale(this.locale())\n                .humanize(!withoutSuffix);\n        } else {\n            return this.localeData().invalidDate();\n        }\n    }\n\n    function toNow(withoutSuffix) {\n        return this.to(createLocal(), withoutSuffix);\n    }\n\n    // If passed a locale key, it will set the locale for this\n    // instance.  Otherwise, it will return the locale configuration\n    // variables for this instance.\n    function locale(key) {\n        var newLocaleData;\n\n        if (key === undefined) {\n            return this._locale._abbr;\n        } else {\n            newLocaleData = getLocale(key);\n            if (newLocaleData != null) {\n                this._locale = newLocaleData;\n            }\n            return this;\n        }\n    }\n\n    var lang = deprecate(\n        'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',\n        function (key) {\n            if (key === undefined) {\n                return this.localeData();\n            } else {\n                return this.locale(key);\n            }\n        }\n    );\n\n    function localeData() {\n        return this._locale;\n    }\n\n    var MS_PER_SECOND = 1000,\n        MS_PER_MINUTE = 60 * MS_PER_SECOND,\n        MS_PER_HOUR = 60 * MS_PER_MINUTE,\n        MS_PER_400_YEARS = (365 * 400 + 97) * 24 * MS_PER_HOUR;\n\n    // actual modulo - handles negative numbers (for dates before 1970):\n    function mod$1(dividend, divisor) {\n        return ((dividend % divisor) + divisor) % divisor;\n    }\n\n    function localStartOfDate(y, m, d) {\n        // the date constructor remaps years 0-99 to 1900-1999\n        if (y < 100 && y >= 0) {\n            // preserve leap years using a full 400 year cycle, then reset\n            return new Date(y + 400, m, d) - MS_PER_400_YEARS;\n        } else {\n            return new Date(y, m, d).valueOf();\n        }\n    }\n\n    function utcStartOfDate(y, m, d) {\n        // Date.UTC remaps years 0-99 to 1900-1999\n        if (y < 100 && y >= 0) {\n            // preserve leap years using a full 400 year cycle, then reset\n            return Date.UTC(y + 400, m, d) - MS_PER_400_YEARS;\n        } else {\n            return Date.UTC(y, m, d);\n        }\n    }\n\n    function startOf(units) {\n        var time, startOfDate;\n        units = normalizeUnits(units);\n        if (units === undefined || units === 'millisecond' || !this.isValid()) {\n            return this;\n        }\n\n        startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate;\n\n        switch (units) {\n            case 'year':\n                time = startOfDate(this.year(), 0, 1);\n                break;\n            case 'quarter':\n                time = startOfDate(\n                    this.year(),\n                    this.month() - (this.month() % 3),\n                    1\n                );\n                break;\n            case 'month':\n                time = startOfDate(this.year(), this.month(), 1);\n                break;\n            case 'week':\n                time = startOfDate(\n                    this.year(),\n                    this.month(),\n                    this.date() - this.weekday()\n                );\n                break;\n            case 'isoWeek':\n                time = startOfDate(\n                    this.year(),\n                    this.month(),\n                    this.date() - (this.isoWeekday() - 1)\n                );\n                break;\n            case 'day':\n            case 'date':\n                time = startOfDate(this.year(), this.month(), this.date());\n                break;\n            case 'hour':\n                time = this._d.valueOf();\n                time -= mod$1(\n                    time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE),\n                    MS_PER_HOUR\n                );\n                break;\n            case 'minute':\n                time = this._d.valueOf();\n                time -= mod$1(time, MS_PER_MINUTE);\n                break;\n            case 'second':\n                time = this._d.valueOf();\n                time -= mod$1(time, MS_PER_SECOND);\n                break;\n        }\n\n        this._d.setTime(time);\n        hooks.updateOffset(this, true);\n        return this;\n    }\n\n    function endOf(units) {\n        var time, startOfDate;\n        units = normalizeUnits(units);\n        if (units === undefined || units === 'millisecond' || !this.isValid()) {\n            return this;\n        }\n\n        startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate;\n\n        switch (units) {\n            case 'year':\n                time = startOfDate(this.year() + 1, 0, 1) - 1;\n                break;\n            case 'quarter':\n                time =\n                    startOfDate(\n                        this.year(),\n                        this.month() - (this.month() % 3) + 3,\n                        1\n                    ) - 1;\n                break;\n            case 'month':\n                time = startOfDate(this.year(), this.month() + 1, 1) - 1;\n                break;\n            case 'week':\n                time =\n                    startOfDate(\n                        this.year(),\n                        this.month(),\n                        this.date() - this.weekday() + 7\n                    ) - 1;\n                break;\n            case 'isoWeek':\n                time =\n                    startOfDate(\n                        this.year(),\n                        this.month(),\n                        this.date() - (this.isoWeekday() - 1) + 7\n                    ) - 1;\n                break;\n            case 'day':\n            case 'date':\n                time = startOfDate(this.year(), this.month(), this.date() + 1) - 1;\n                break;\n            case 'hour':\n                time = this._d.valueOf();\n                time +=\n                    MS_PER_HOUR -\n                    mod$1(\n                        time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE),\n                        MS_PER_HOUR\n                    ) -\n                    1;\n                break;\n            case 'minute':\n                time = this._d.valueOf();\n                time += MS_PER_MINUTE - mod$1(time, MS_PER_MINUTE) - 1;\n                break;\n            case 'second':\n                time = this._d.valueOf();\n                time += MS_PER_SECOND - mod$1(time, MS_PER_SECOND) - 1;\n                break;\n        }\n\n        this._d.setTime(time);\n        hooks.updateOffset(this, true);\n        return this;\n    }\n\n    function valueOf() {\n        return this._d.valueOf() - (this._offset || 0) * 60000;\n    }\n\n    function unix() {\n        return Math.floor(this.valueOf() / 1000);\n    }\n\n    function toDate() {\n        return new Date(this.valueOf());\n    }\n\n    function toArray() {\n        var m = this;\n        return [\n            m.year(),\n            m.month(),\n            m.date(),\n            m.hour(),\n            m.minute(),\n            m.second(),\n            m.millisecond(),\n        ];\n    }\n\n    function toObject() {\n        var m = this;\n        return {\n            years: m.year(),\n            months: m.month(),\n            date: m.date(),\n            hours: m.hours(),\n            minutes: m.minutes(),\n            seconds: m.seconds(),\n            milliseconds: m.milliseconds(),\n        };\n    }\n\n    function toJSON() {\n        // new Date(NaN).toJSON() === null\n        return this.isValid() ? this.toISOString() : null;\n    }\n\n    function isValid$2() {\n        return isValid(this);\n    }\n\n    function parsingFlags() {\n        return extend({}, getParsingFlags(this));\n    }\n\n    function invalidAt() {\n        return getParsingFlags(this).overflow;\n    }\n\n    function creationData() {\n        return {\n            input: this._i,\n            format: this._f,\n            locale: this._locale,\n            isUTC: this._isUTC,\n            strict: this._strict,\n        };\n    }\n\n    addFormatToken('N', 0, 0, 'eraAbbr');\n    addFormatToken('NN', 0, 0, 'eraAbbr');\n    addFormatToken('NNN', 0, 0, 'eraAbbr');\n    addFormatToken('NNNN', 0, 0, 'eraName');\n    addFormatToken('NNNNN', 0, 0, 'eraNarrow');\n\n    addFormatToken('y', ['y', 1], 'yo', 'eraYear');\n    addFormatToken('y', ['yy', 2], 0, 'eraYear');\n    addFormatToken('y', ['yyy', 3], 0, 'eraYear');\n    addFormatToken('y', ['yyyy', 4], 0, 'eraYear');\n\n    addRegexToken('N', matchEraAbbr);\n    addRegexToken('NN', matchEraAbbr);\n    addRegexToken('NNN', matchEraAbbr);\n    addRegexToken('NNNN', matchEraName);\n    addRegexToken('NNNNN', matchEraNarrow);\n\n    addParseToken(['N', 'NN', 'NNN', 'NNNN', 'NNNNN'], function (\n        input,\n        array,\n        config,\n        token\n    ) {\n        var era = config._locale.erasParse(input, token, config._strict);\n        if (era) {\n            getParsingFlags(config).era = era;\n        } else {\n            getParsingFlags(config).invalidEra = input;\n        }\n    });\n\n    addRegexToken('y', matchUnsigned);\n    addRegexToken('yy', matchUnsigned);\n    addRegexToken('yyy', matchUnsigned);\n    addRegexToken('yyyy', matchUnsigned);\n    addRegexToken('yo', matchEraYearOrdinal);\n\n    addParseToken(['y', 'yy', 'yyy', 'yyyy'], YEAR);\n    addParseToken(['yo'], function (input, array, config, token) {\n        var match;\n        if (config._locale._eraYearOrdinalRegex) {\n            match = input.match(config._locale._eraYearOrdinalRegex);\n        }\n\n        if (config._locale.eraYearOrdinalParse) {\n            array[YEAR] = config._locale.eraYearOrdinalParse(input, match);\n        } else {\n            array[YEAR] = parseInt(input, 10);\n        }\n    });\n\n    function localeEras(m, format) {\n        var i,\n            l,\n            date,\n            eras = this._eras || getLocale('en')._eras;\n        for (i = 0, l = eras.length; i < l; ++i) {\n            switch (typeof eras[i].since) {\n                case 'string':\n                    // truncate time\n                    date = hooks(eras[i].since).startOf('day');\n                    eras[i].since = date.valueOf();\n                    break;\n            }\n\n            switch (typeof eras[i].until) {\n                case 'undefined':\n                    eras[i].until = +Infinity;\n                    break;\n                case 'string':\n                    // truncate time\n                    date = hooks(eras[i].until).startOf('day').valueOf();\n                    eras[i].until = date.valueOf();\n                    break;\n            }\n        }\n        return eras;\n    }\n\n    function localeErasParse(eraName, format, strict) {\n        var i,\n            l,\n            eras = this.eras(),\n            name,\n            abbr,\n            narrow;\n        eraName = eraName.toUpperCase();\n\n        for (i = 0, l = eras.length; i < l; ++i) {\n            name = eras[i].name.toUpperCase();\n            abbr = eras[i].abbr.toUpperCase();\n            narrow = eras[i].narrow.toUpperCase();\n\n            if (strict) {\n                switch (format) {\n                    case 'N':\n                    case 'NN':\n                    case 'NNN':\n                        if (abbr === eraName) {\n                            return eras[i];\n                        }\n                        break;\n\n                    case 'NNNN':\n                        if (name === eraName) {\n                            return eras[i];\n                        }\n                        break;\n\n                    case 'NNNNN':\n                        if (narrow === eraName) {\n                            return eras[i];\n                        }\n                        break;\n                }\n            } else if ([name, abbr, narrow].indexOf(eraName) >= 0) {\n                return eras[i];\n            }\n        }\n    }\n\n    function localeErasConvertYear(era, year) {\n        var dir = era.since <= era.until ? +1 : -1;\n        if (year === undefined) {\n            return hooks(era.since).year();\n        } else {\n            return hooks(era.since).year() + (year - era.offset) * dir;\n        }\n    }\n\n    function getEraName() {\n        var i,\n            l,\n            val,\n            eras = this.localeData().eras();\n        for (i = 0, l = eras.length; i < l; ++i) {\n            // truncate time\n            val = this.clone().startOf('day').valueOf();\n\n            if (eras[i].since <= val && val <= eras[i].until) {\n                return eras[i].name;\n            }\n            if (eras[i].until <= val && val <= eras[i].since) {\n                return eras[i].name;\n            }\n        }\n\n        return '';\n    }\n\n    function getEraNarrow() {\n        var i,\n            l,\n            val,\n            eras = this.localeData().eras();\n        for (i = 0, l = eras.length; i < l; ++i) {\n            // truncate time\n            val = this.clone().startOf('day').valueOf();\n\n            if (eras[i].since <= val && val <= eras[i].until) {\n                return eras[i].narrow;\n            }\n            if (eras[i].until <= val && val <= eras[i].since) {\n                return eras[i].narrow;\n            }\n        }\n\n        return '';\n    }\n\n    function getEraAbbr() {\n        var i,\n            l,\n            val,\n            eras = this.localeData().eras();\n        for (i = 0, l = eras.length; i < l; ++i) {\n            // truncate time\n            val = this.clone().startOf('day').valueOf();\n\n            if (eras[i].since <= val && val <= eras[i].until) {\n                return eras[i].abbr;\n            }\n            if (eras[i].until <= val && val <= eras[i].since) {\n                return eras[i].abbr;\n            }\n        }\n\n        return '';\n    }\n\n    function getEraYear() {\n        var i,\n            l,\n            dir,\n            val,\n            eras = this.localeData().eras();\n        for (i = 0, l = eras.length; i < l; ++i) {\n            dir = eras[i].since <= eras[i].until ? +1 : -1;\n\n            // truncate time\n            val = this.clone().startOf('day').valueOf();\n\n            if (\n                (eras[i].since <= val && val <= eras[i].until) ||\n                (eras[i].until <= val && val <= eras[i].since)\n            ) {\n                return (\n                    (this.year() - hooks(eras[i].since).year()) * dir +\n                    eras[i].offset\n                );\n            }\n        }\n\n        return this.year();\n    }\n\n    function erasNameRegex(isStrict) {\n        if (!hasOwnProp(this, '_erasNameRegex')) {\n            computeErasParse.call(this);\n        }\n        return isStrict ? this._erasNameRegex : this._erasRegex;\n    }\n\n    function erasAbbrRegex(isStrict) {\n        if (!hasOwnProp(this, '_erasAbbrRegex')) {\n            computeErasParse.call(this);\n        }\n        return isStrict ? this._erasAbbrRegex : this._erasRegex;\n    }\n\n    function erasNarrowRegex(isStrict) {\n        if (!hasOwnProp(this, '_erasNarrowRegex')) {\n            computeErasParse.call(this);\n        }\n        return isStrict ? this._erasNarrowRegex : this._erasRegex;\n    }\n\n    function matchEraAbbr(isStrict, locale) {\n        return locale.erasAbbrRegex(isStrict);\n    }\n\n    function matchEraName(isStrict, locale) {\n        return locale.erasNameRegex(isStrict);\n    }\n\n    function matchEraNarrow(isStrict, locale) {\n        return locale.erasNarrowRegex(isStrict);\n    }\n\n    function matchEraYearOrdinal(isStrict, locale) {\n        return locale._eraYearOrdinalRegex || matchUnsigned;\n    }\n\n    function computeErasParse() {\n        var abbrPieces = [],\n            namePieces = [],\n            narrowPieces = [],\n            mixedPieces = [],\n            i,\n            l,\n            eras = this.eras();\n\n        for (i = 0, l = eras.length; i < l; ++i) {\n            namePieces.push(regexEscape(eras[i].name));\n            abbrPieces.push(regexEscape(eras[i].abbr));\n            narrowPieces.push(regexEscape(eras[i].narrow));\n\n            mixedPieces.push(regexEscape(eras[i].name));\n            mixedPieces.push(regexEscape(eras[i].abbr));\n            mixedPieces.push(regexEscape(eras[i].narrow));\n        }\n\n        this._erasRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n        this._erasNameRegex = new RegExp('^(' + namePieces.join('|') + ')', 'i');\n        this._erasAbbrRegex = new RegExp('^(' + abbrPieces.join('|') + ')', 'i');\n        this._erasNarrowRegex = new RegExp(\n            '^(' + narrowPieces.join('|') + ')',\n            'i'\n        );\n    }\n\n    // FORMATTING\n\n    addFormatToken(0, ['gg', 2], 0, function () {\n        return this.weekYear() % 100;\n    });\n\n    addFormatToken(0, ['GG', 2], 0, function () {\n        return this.isoWeekYear() % 100;\n    });\n\n    function addWeekYearFormatToken(token, getter) {\n        addFormatToken(0, [token, token.length], 0, getter);\n    }\n\n    addWeekYearFormatToken('gggg', 'weekYear');\n    addWeekYearFormatToken('ggggg', 'weekYear');\n    addWeekYearFormatToken('GGGG', 'isoWeekYear');\n    addWeekYearFormatToken('GGGGG', 'isoWeekYear');\n\n    // ALIASES\n\n    addUnitAlias('weekYear', 'gg');\n    addUnitAlias('isoWeekYear', 'GG');\n\n    // PRIORITY\n\n    addUnitPriority('weekYear', 1);\n    addUnitPriority('isoWeekYear', 1);\n\n    // PARSING\n\n    addRegexToken('G', matchSigned);\n    addRegexToken('g', matchSigned);\n    addRegexToken('GG', match1to2, match2);\n    addRegexToken('gg', match1to2, match2);\n    addRegexToken('GGGG', match1to4, match4);\n    addRegexToken('gggg', match1to4, match4);\n    addRegexToken('GGGGG', match1to6, match6);\n    addRegexToken('ggggg', match1to6, match6);\n\n    addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (\n        input,\n        week,\n        config,\n        token\n    ) {\n        week[token.substr(0, 2)] = toInt(input);\n    });\n\n    addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {\n        week[token] = hooks.parseTwoDigitYear(input);\n    });\n\n    // MOMENTS\n\n    function getSetWeekYear(input) {\n        return getSetWeekYearHelper.call(\n            this,\n            input,\n            this.week(),\n            this.weekday(),\n            this.localeData()._week.dow,\n            this.localeData()._week.doy\n        );\n    }\n\n    function getSetISOWeekYear(input) {\n        return getSetWeekYearHelper.call(\n            this,\n            input,\n            this.isoWeek(),\n            this.isoWeekday(),\n            1,\n            4\n        );\n    }\n\n    function getISOWeeksInYear() {\n        return weeksInYear(this.year(), 1, 4);\n    }\n\n    function getISOWeeksInISOWeekYear() {\n        return weeksInYear(this.isoWeekYear(), 1, 4);\n    }\n\n    function getWeeksInYear() {\n        var weekInfo = this.localeData()._week;\n        return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);\n    }\n\n    function getWeeksInWeekYear() {\n        var weekInfo = this.localeData()._week;\n        return weeksInYear(this.weekYear(), weekInfo.dow, weekInfo.doy);\n    }\n\n    function getSetWeekYearHelper(input, week, weekday, dow, doy) {\n        var weeksTarget;\n        if (input == null) {\n            return weekOfYear(this, dow, doy).year;\n        } else {\n            weeksTarget = weeksInYear(input, dow, doy);\n            if (week > weeksTarget) {\n                week = weeksTarget;\n            }\n            return setWeekAll.call(this, input, week, weekday, dow, doy);\n        }\n    }\n\n    function setWeekAll(weekYear, week, weekday, dow, doy) {\n        var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),\n            date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);\n\n        this.year(date.getUTCFullYear());\n        this.month(date.getUTCMonth());\n        this.date(date.getUTCDate());\n        return this;\n    }\n\n    // FORMATTING\n\n    addFormatToken('Q', 0, 'Qo', 'quarter');\n\n    // ALIASES\n\n    addUnitAlias('quarter', 'Q');\n\n    // PRIORITY\n\n    addUnitPriority('quarter', 7);\n\n    // PARSING\n\n    addRegexToken('Q', match1);\n    addParseToken('Q', function (input, array) {\n        array[MONTH] = (toInt(input) - 1) * 3;\n    });\n\n    // MOMENTS\n\n    function getSetQuarter(input) {\n        return input == null\n            ? Math.ceil((this.month() + 1) / 3)\n            : this.month((input - 1) * 3 + (this.month() % 3));\n    }\n\n    // FORMATTING\n\n    addFormatToken('D', ['DD', 2], 'Do', 'date');\n\n    // ALIASES\n\n    addUnitAlias('date', 'D');\n\n    // PRIORITY\n    addUnitPriority('date', 9);\n\n    // PARSING\n\n    addRegexToken('D', match1to2);\n    addRegexToken('DD', match1to2, match2);\n    addRegexToken('Do', function (isStrict, locale) {\n        // TODO: Remove \"ordinalParse\" fallback in next major release.\n        return isStrict\n            ? locale._dayOfMonthOrdinalParse || locale._ordinalParse\n            : locale._dayOfMonthOrdinalParseLenient;\n    });\n\n    addParseToken(['D', 'DD'], DATE);\n    addParseToken('Do', function (input, array) {\n        array[DATE] = toInt(input.match(match1to2)[0]);\n    });\n\n    // MOMENTS\n\n    var getSetDayOfMonth = makeGetSet('Date', true);\n\n    // FORMATTING\n\n    addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');\n\n    // ALIASES\n\n    addUnitAlias('dayOfYear', 'DDD');\n\n    // PRIORITY\n    addUnitPriority('dayOfYear', 4);\n\n    // PARSING\n\n    addRegexToken('DDD', match1to3);\n    addRegexToken('DDDD', match3);\n    addParseToken(['DDD', 'DDDD'], function (input, array, config) {\n        config._dayOfYear = toInt(input);\n    });\n\n    // HELPERS\n\n    // MOMENTS\n\n    function getSetDayOfYear(input) {\n        var dayOfYear =\n            Math.round(\n                (this.clone().startOf('day') - this.clone().startOf('year')) / 864e5\n            ) + 1;\n        return input == null ? dayOfYear : this.add(input - dayOfYear, 'd');\n    }\n\n    // FORMATTING\n\n    addFormatToken('m', ['mm', 2], 0, 'minute');\n\n    // ALIASES\n\n    addUnitAlias('minute', 'm');\n\n    // PRIORITY\n\n    addUnitPriority('minute', 14);\n\n    // PARSING\n\n    addRegexToken('m', match1to2);\n    addRegexToken('mm', match1to2, match2);\n    addParseToken(['m', 'mm'], MINUTE);\n\n    // MOMENTS\n\n    var getSetMinute = makeGetSet('Minutes', false);\n\n    // FORMATTING\n\n    addFormatToken('s', ['ss', 2], 0, 'second');\n\n    // ALIASES\n\n    addUnitAlias('second', 's');\n\n    // PRIORITY\n\n    addUnitPriority('second', 15);\n\n    // PARSING\n\n    addRegexToken('s', match1to2);\n    addRegexToken('ss', match1to2, match2);\n    addParseToken(['s', 'ss'], SECOND);\n\n    // MOMENTS\n\n    var getSetSecond = makeGetSet('Seconds', false);\n\n    // FORMATTING\n\n    addFormatToken('S', 0, 0, function () {\n        return ~~(this.millisecond() / 100);\n    });\n\n    addFormatToken(0, ['SS', 2], 0, function () {\n        return ~~(this.millisecond() / 10);\n    });\n\n    addFormatToken(0, ['SSS', 3], 0, 'millisecond');\n    addFormatToken(0, ['SSSS', 4], 0, function () {\n        return this.millisecond() * 10;\n    });\n    addFormatToken(0, ['SSSSS', 5], 0, function () {\n        return this.millisecond() * 100;\n    });\n    addFormatToken(0, ['SSSSSS', 6], 0, function () {\n        return this.millisecond() * 1000;\n    });\n    addFormatToken(0, ['SSSSSSS', 7], 0, function () {\n        return this.millisecond() * 10000;\n    });\n    addFormatToken(0, ['SSSSSSSS', 8], 0, function () {\n        return this.millisecond() * 100000;\n    });\n    addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {\n        return this.millisecond() * 1000000;\n    });\n\n    // ALIASES\n\n    addUnitAlias('millisecond', 'ms');\n\n    // PRIORITY\n\n    addUnitPriority('millisecond', 16);\n\n    // PARSING\n\n    addRegexToken('S', match1to3, match1);\n    addRegexToken('SS', match1to3, match2);\n    addRegexToken('SSS', match1to3, match3);\n\n    var token, getSetMillisecond;\n    for (token = 'SSSS'; token.length <= 9; token += 'S') {\n        addRegexToken(token, matchUnsigned);\n    }\n\n    function parseMs(input, array) {\n        array[MILLISECOND] = toInt(('0.' + input) * 1000);\n    }\n\n    for (token = 'S'; token.length <= 9; token += 'S') {\n        addParseToken(token, parseMs);\n    }\n\n    getSetMillisecond = makeGetSet('Milliseconds', false);\n\n    // FORMATTING\n\n    addFormatToken('z', 0, 0, 'zoneAbbr');\n    addFormatToken('zz', 0, 0, 'zoneName');\n\n    // MOMENTS\n\n    function getZoneAbbr() {\n        return this._isUTC ? 'UTC' : '';\n    }\n\n    function getZoneName() {\n        return this._isUTC ? 'Coordinated Universal Time' : '';\n    }\n\n    var proto = Moment.prototype;\n\n    proto.add = add;\n    proto.calendar = calendar$1;\n    proto.clone = clone;\n    proto.diff = diff;\n    proto.endOf = endOf;\n    proto.format = format;\n    proto.from = from;\n    proto.fromNow = fromNow;\n    proto.to = to;\n    proto.toNow = toNow;\n    proto.get = stringGet;\n    proto.invalidAt = invalidAt;\n    proto.isAfter = isAfter;\n    proto.isBefore = isBefore;\n    proto.isBetween = isBetween;\n    proto.isSame = isSame;\n    proto.isSameOrAfter = isSameOrAfter;\n    proto.isSameOrBefore = isSameOrBefore;\n    proto.isValid = isValid$2;\n    proto.lang = lang;\n    proto.locale = locale;\n    proto.localeData = localeData;\n    proto.max = prototypeMax;\n    proto.min = prototypeMin;\n    proto.parsingFlags = parsingFlags;\n    proto.set = stringSet;\n    proto.startOf = startOf;\n    proto.subtract = subtract;\n    proto.toArray = toArray;\n    proto.toObject = toObject;\n    proto.toDate = toDate;\n    proto.toISOString = toISOString;\n    proto.inspect = inspect;\n    if (typeof Symbol !== 'undefined' && Symbol.for != null) {\n        proto[Symbol.for('nodejs.util.inspect.custom')] = function () {\n            return 'Moment<' + this.format() + '>';\n        };\n    }\n    proto.toJSON = toJSON;\n    proto.toString = toString;\n    proto.unix = unix;\n    proto.valueOf = valueOf;\n    proto.creationData = creationData;\n    proto.eraName = getEraName;\n    proto.eraNarrow = getEraNarrow;\n    proto.eraAbbr = getEraAbbr;\n    proto.eraYear = getEraYear;\n    proto.year = getSetYear;\n    proto.isLeapYear = getIsLeapYear;\n    proto.weekYear = getSetWeekYear;\n    proto.isoWeekYear = getSetISOWeekYear;\n    proto.quarter = proto.quarters = getSetQuarter;\n    proto.month = getSetMonth;\n    proto.daysInMonth = getDaysInMonth;\n    proto.week = proto.weeks = getSetWeek;\n    proto.isoWeek = proto.isoWeeks = getSetISOWeek;\n    proto.weeksInYear = getWeeksInYear;\n    proto.weeksInWeekYear = getWeeksInWeekYear;\n    proto.isoWeeksInYear = getISOWeeksInYear;\n    proto.isoWeeksInISOWeekYear = getISOWeeksInISOWeekYear;\n    proto.date = getSetDayOfMonth;\n    proto.day = proto.days = getSetDayOfWeek;\n    proto.weekday = getSetLocaleDayOfWeek;\n    proto.isoWeekday = getSetISODayOfWeek;\n    proto.dayOfYear = getSetDayOfYear;\n    proto.hour = proto.hours = getSetHour;\n    proto.minute = proto.minutes = getSetMinute;\n    proto.second = proto.seconds = getSetSecond;\n    proto.millisecond = proto.milliseconds = getSetMillisecond;\n    proto.utcOffset = getSetOffset;\n    proto.utc = setOffsetToUTC;\n    proto.local = setOffsetToLocal;\n    proto.parseZone = setOffsetToParsedOffset;\n    proto.hasAlignedHourOffset = hasAlignedHourOffset;\n    proto.isDST = isDaylightSavingTime;\n    proto.isLocal = isLocal;\n    proto.isUtcOffset = isUtcOffset;\n    proto.isUtc = isUtc;\n    proto.isUTC = isUtc;\n    proto.zoneAbbr = getZoneAbbr;\n    proto.zoneName = getZoneName;\n    proto.dates = deprecate(\n        'dates accessor is deprecated. Use date instead.',\n        getSetDayOfMonth\n    );\n    proto.months = deprecate(\n        'months accessor is deprecated. Use month instead',\n        getSetMonth\n    );\n    proto.years = deprecate(\n        'years accessor is deprecated. Use year instead',\n        getSetYear\n    );\n    proto.zone = deprecate(\n        'moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/',\n        getSetZone\n    );\n    proto.isDSTShifted = deprecate(\n        'isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information',\n        isDaylightSavingTimeShifted\n    );\n\n    function createUnix(input) {\n        return createLocal(input * 1000);\n    }\n\n    function createInZone() {\n        return createLocal.apply(null, arguments).parseZone();\n    }\n\n    function preParsePostFormat(string) {\n        return string;\n    }\n\n    var proto$1 = Locale.prototype;\n\n    proto$1.calendar = calendar;\n    proto$1.longDateFormat = longDateFormat;\n    proto$1.invalidDate = invalidDate;\n    proto$1.ordinal = ordinal;\n    proto$1.preparse = preParsePostFormat;\n    proto$1.postformat = preParsePostFormat;\n    proto$1.relativeTime = relativeTime;\n    proto$1.pastFuture = pastFuture;\n    proto$1.set = set;\n    proto$1.eras = localeEras;\n    proto$1.erasParse = localeErasParse;\n    proto$1.erasConvertYear = localeErasConvertYear;\n    proto$1.erasAbbrRegex = erasAbbrRegex;\n    proto$1.erasNameRegex = erasNameRegex;\n    proto$1.erasNarrowRegex = erasNarrowRegex;\n\n    proto$1.months = localeMonths;\n    proto$1.monthsShort = localeMonthsShort;\n    proto$1.monthsParse = localeMonthsParse;\n    proto$1.monthsRegex = monthsRegex;\n    proto$1.monthsShortRegex = monthsShortRegex;\n    proto$1.week = localeWeek;\n    proto$1.firstDayOfYear = localeFirstDayOfYear;\n    proto$1.firstDayOfWeek = localeFirstDayOfWeek;\n\n    proto$1.weekdays = localeWeekdays;\n    proto$1.weekdaysMin = localeWeekdaysMin;\n    proto$1.weekdaysShort = localeWeekdaysShort;\n    proto$1.weekdaysParse = localeWeekdaysParse;\n\n    proto$1.weekdaysRegex = weekdaysRegex;\n    proto$1.weekdaysShortRegex = weekdaysShortRegex;\n    proto$1.weekdaysMinRegex = weekdaysMinRegex;\n\n    proto$1.isPM = localeIsPM;\n    proto$1.meridiem = localeMeridiem;\n\n    function get$1(format, index, field, setter) {\n        var locale = getLocale(),\n            utc = createUTC().set(setter, index);\n        return locale[field](utc, format);\n    }\n\n    function listMonthsImpl(format, index, field) {\n        if (isNumber(format)) {\n            index = format;\n            format = undefined;\n        }\n\n        format = format || '';\n\n        if (index != null) {\n            return get$1(format, index, field, 'month');\n        }\n\n        var i,\n            out = [];\n        for (i = 0; i < 12; i++) {\n            out[i] = get$1(format, i, field, 'month');\n        }\n        return out;\n    }\n\n    // ()\n    // (5)\n    // (fmt, 5)\n    // (fmt)\n    // (true)\n    // (true, 5)\n    // (true, fmt, 5)\n    // (true, fmt)\n    function listWeekdaysImpl(localeSorted, format, index, field) {\n        if (typeof localeSorted === 'boolean') {\n            if (isNumber(format)) {\n                index = format;\n                format = undefined;\n            }\n\n            format = format || '';\n        } else {\n            format = localeSorted;\n            index = format;\n            localeSorted = false;\n\n            if (isNumber(format)) {\n                index = format;\n                format = undefined;\n            }\n\n            format = format || '';\n        }\n\n        var locale = getLocale(),\n            shift = localeSorted ? locale._week.dow : 0,\n            i,\n            out = [];\n\n        if (index != null) {\n            return get$1(format, (index + shift) % 7, field, 'day');\n        }\n\n        for (i = 0; i < 7; i++) {\n            out[i] = get$1(format, (i + shift) % 7, field, 'day');\n        }\n        return out;\n    }\n\n    function listMonths(format, index) {\n        return listMonthsImpl(format, index, 'months');\n    }\n\n    function listMonthsShort(format, index) {\n        return listMonthsImpl(format, index, 'monthsShort');\n    }\n\n    function listWeekdays(localeSorted, format, index) {\n        return listWeekdaysImpl(localeSorted, format, index, 'weekdays');\n    }\n\n    function listWeekdaysShort(localeSorted, format, index) {\n        return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');\n    }\n\n    function listWeekdaysMin(localeSorted, format, index) {\n        return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');\n    }\n\n    getSetGlobalLocale('en', {\n        eras: [\n            {\n                since: '0001-01-01',\n                until: +Infinity,\n                offset: 1,\n                name: 'Anno Domini',\n                narrow: 'AD',\n                abbr: 'AD',\n            },\n            {\n                since: '0000-12-31',\n                until: -Infinity,\n                offset: 1,\n                name: 'Before Christ',\n                narrow: 'BC',\n                abbr: 'BC',\n            },\n        ],\n        dayOfMonthOrdinalParse: /\\d{1,2}(th|st|nd|rd)/,\n        ordinal: function (number) {\n            var b = number % 10,\n                output =\n                    toInt((number % 100) / 10) === 1\n                        ? 'th'\n                        : b === 1\n                        ? 'st'\n                        : b === 2\n                        ? 'nd'\n                        : b === 3\n                        ? 'rd'\n                        : 'th';\n            return number + output;\n        },\n    });\n\n    // Side effect imports\n\n    hooks.lang = deprecate(\n        'moment.lang is deprecated. Use moment.locale instead.',\n        getSetGlobalLocale\n    );\n    hooks.langData = deprecate(\n        'moment.langData is deprecated. Use moment.localeData instead.',\n        getLocale\n    );\n\n    var mathAbs = Math.abs;\n\n    function abs() {\n        var data = this._data;\n\n        this._milliseconds = mathAbs(this._milliseconds);\n        this._days = mathAbs(this._days);\n        this._months = mathAbs(this._months);\n\n        data.milliseconds = mathAbs(data.milliseconds);\n        data.seconds = mathAbs(data.seconds);\n        data.minutes = mathAbs(data.minutes);\n        data.hours = mathAbs(data.hours);\n        data.months = mathAbs(data.months);\n        data.years = mathAbs(data.years);\n\n        return this;\n    }\n\n    function addSubtract$1(duration, input, value, direction) {\n        var other = createDuration(input, value);\n\n        duration._milliseconds += direction * other._milliseconds;\n        duration._days += direction * other._days;\n        duration._months += direction * other._months;\n\n        return duration._bubble();\n    }\n\n    // supports only 2.0-style add(1, 's') or add(duration)\n    function add$1(input, value) {\n        return addSubtract$1(this, input, value, 1);\n    }\n\n    // supports only 2.0-style subtract(1, 's') or subtract(duration)\n    function subtract$1(input, value) {\n        return addSubtract$1(this, input, value, -1);\n    }\n\n    function absCeil(number) {\n        if (number < 0) {\n            return Math.floor(number);\n        } else {\n            return Math.ceil(number);\n        }\n    }\n\n    function bubble() {\n        var milliseconds = this._milliseconds,\n            days = this._days,\n            months = this._months,\n            data = this._data,\n            seconds,\n            minutes,\n            hours,\n            years,\n            monthsFromDays;\n\n        // if we have a mix of positive and negative values, bubble down first\n        // check: https://github.com/moment/moment/issues/2166\n        if (\n            !(\n                (milliseconds >= 0 && days >= 0 && months >= 0) ||\n                (milliseconds <= 0 && days <= 0 && months <= 0)\n            )\n        ) {\n            milliseconds += absCeil(monthsToDays(months) + days) * 864e5;\n            days = 0;\n            months = 0;\n        }\n\n        // The following code bubbles up values, see the tests for\n        // examples of what that means.\n        data.milliseconds = milliseconds % 1000;\n\n        seconds = absFloor(milliseconds / 1000);\n        data.seconds = seconds % 60;\n\n        minutes = absFloor(seconds / 60);\n        data.minutes = minutes % 60;\n\n        hours = absFloor(minutes / 60);\n        data.hours = hours % 24;\n\n        days += absFloor(hours / 24);\n\n        // convert days to months\n        monthsFromDays = absFloor(daysToMonths(days));\n        months += monthsFromDays;\n        days -= absCeil(monthsToDays(monthsFromDays));\n\n        // 12 months -> 1 year\n        years = absFloor(months / 12);\n        months %= 12;\n\n        data.days = days;\n        data.months = months;\n        data.years = years;\n\n        return this;\n    }\n\n    function daysToMonths(days) {\n        // 400 years have 146097 days (taking into account leap year rules)\n        // 400 years have 12 months === 4800\n        return (days * 4800) / 146097;\n    }\n\n    function monthsToDays(months) {\n        // the reverse of daysToMonths\n        return (months * 146097) / 4800;\n    }\n\n    function as(units) {\n        if (!this.isValid()) {\n            return NaN;\n        }\n        var days,\n            months,\n            milliseconds = this._milliseconds;\n\n        units = normalizeUnits(units);\n\n        if (units === 'month' || units === 'quarter' || units === 'year') {\n            days = this._days + milliseconds / 864e5;\n            months = this._months + daysToMonths(days);\n            switch (units) {\n                case 'month':\n                    return months;\n                case 'quarter':\n                    return months / 3;\n                case 'year':\n                    return months / 12;\n            }\n        } else {\n            // handle milliseconds separately because of floating point math errors (issue #1867)\n            days = this._days + Math.round(monthsToDays(this._months));\n            switch (units) {\n                case 'week':\n                    return days / 7 + milliseconds / 6048e5;\n                case 'day':\n                    return days + milliseconds / 864e5;\n                case 'hour':\n                    return days * 24 + milliseconds / 36e5;\n                case 'minute':\n                    return days * 1440 + milliseconds / 6e4;\n                case 'second':\n                    return days * 86400 + milliseconds / 1000;\n                // Math.floor prevents floating point math errors here\n                case 'millisecond':\n                    return Math.floor(days * 864e5) + milliseconds;\n                default:\n                    throw new Error('Unknown unit ' + units);\n            }\n        }\n    }\n\n    // TODO: Use this.as('ms')?\n    function valueOf$1() {\n        if (!this.isValid()) {\n            return NaN;\n        }\n        return (\n            this._milliseconds +\n            this._days * 864e5 +\n            (this._months % 12) * 2592e6 +\n            toInt(this._months / 12) * 31536e6\n        );\n    }\n\n    function makeAs(alias) {\n        return function () {\n            return this.as(alias);\n        };\n    }\n\n    var asMilliseconds = makeAs('ms'),\n        asSeconds = makeAs('s'),\n        asMinutes = makeAs('m'),\n        asHours = makeAs('h'),\n        asDays = makeAs('d'),\n        asWeeks = makeAs('w'),\n        asMonths = makeAs('M'),\n        asQuarters = makeAs('Q'),\n        asYears = makeAs('y');\n\n    function clone$1() {\n        return createDuration(this);\n    }\n\n    function get$2(units) {\n        units = normalizeUnits(units);\n        return this.isValid() ? this[units + 's']() : NaN;\n    }\n\n    function makeGetter(name) {\n        return function () {\n            return this.isValid() ? this._data[name] : NaN;\n        };\n    }\n\n    var milliseconds = makeGetter('milliseconds'),\n        seconds = makeGetter('seconds'),\n        minutes = makeGetter('minutes'),\n        hours = makeGetter('hours'),\n        days = makeGetter('days'),\n        months = makeGetter('months'),\n        years = makeGetter('years');\n\n    function weeks() {\n        return absFloor(this.days() / 7);\n    }\n\n    var round = Math.round,\n        thresholds = {\n            ss: 44, // a few seconds to seconds\n            s: 45, // seconds to minute\n            m: 45, // minutes to hour\n            h: 22, // hours to day\n            d: 26, // days to month/week\n            w: null, // weeks to month\n            M: 11, // months to year\n        };\n\n    // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize\n    function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {\n        return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);\n    }\n\n    function relativeTime$1(posNegDuration, withoutSuffix, thresholds, locale) {\n        var duration = createDuration(posNegDuration).abs(),\n            seconds = round(duration.as('s')),\n            minutes = round(duration.as('m')),\n            hours = round(duration.as('h')),\n            days = round(duration.as('d')),\n            months = round(duration.as('M')),\n            weeks = round(duration.as('w')),\n            years = round(duration.as('y')),\n            a =\n                (seconds <= thresholds.ss && ['s', seconds]) ||\n                (seconds < thresholds.s && ['ss', seconds]) ||\n                (minutes <= 1 && ['m']) ||\n                (minutes < thresholds.m && ['mm', minutes]) ||\n                (hours <= 1 && ['h']) ||\n                (hours < thresholds.h && ['hh', hours]) ||\n                (days <= 1 && ['d']) ||\n                (days < thresholds.d && ['dd', days]);\n\n        if (thresholds.w != null) {\n            a =\n                a ||\n                (weeks <= 1 && ['w']) ||\n                (weeks < thresholds.w && ['ww', weeks]);\n        }\n        a = a ||\n            (months <= 1 && ['M']) ||\n            (months < thresholds.M && ['MM', months]) ||\n            (years <= 1 && ['y']) || ['yy', years];\n\n        a[2] = withoutSuffix;\n        a[3] = +posNegDuration > 0;\n        a[4] = locale;\n        return substituteTimeAgo.apply(null, a);\n    }\n\n    // This function allows you to set the rounding function for relative time strings\n    function getSetRelativeTimeRounding(roundingFunction) {\n        if (roundingFunction === undefined) {\n            return round;\n        }\n        if (typeof roundingFunction === 'function') {\n            round = roundingFunction;\n            return true;\n        }\n        return false;\n    }\n\n    // This function allows you to set a threshold for relative time strings\n    function getSetRelativeTimeThreshold(threshold, limit) {\n        if (thresholds[threshold] === undefined) {\n            return false;\n        }\n        if (limit === undefined) {\n            return thresholds[threshold];\n        }\n        thresholds[threshold] = limit;\n        if (threshold === 's') {\n            thresholds.ss = limit - 1;\n        }\n        return true;\n    }\n\n    function humanize(argWithSuffix, argThresholds) {\n        if (!this.isValid()) {\n            return this.localeData().invalidDate();\n        }\n\n        var withSuffix = false,\n            th = thresholds,\n            locale,\n            output;\n\n        if (typeof argWithSuffix === 'object') {\n            argThresholds = argWithSuffix;\n            argWithSuffix = false;\n        }\n        if (typeof argWithSuffix === 'boolean') {\n            withSuffix = argWithSuffix;\n        }\n        if (typeof argThresholds === 'object') {\n            th = Object.assign({}, thresholds, argThresholds);\n            if (argThresholds.s != null && argThresholds.ss == null) {\n                th.ss = argThresholds.s - 1;\n            }\n        }\n\n        locale = this.localeData();\n        output = relativeTime$1(this, !withSuffix, th, locale);\n\n        if (withSuffix) {\n            output = locale.pastFuture(+this, output);\n        }\n\n        return locale.postformat(output);\n    }\n\n    var abs$1 = Math.abs;\n\n    function sign(x) {\n        return (x > 0) - (x < 0) || +x;\n    }\n\n    function toISOString$1() {\n        // for ISO strings we do not use the normal bubbling rules:\n        //  * milliseconds bubble up until they become hours\n        //  * days do not bubble at all\n        //  * months bubble up until they become years\n        // This is because there is no context-free conversion between hours and days\n        // (think of clock changes)\n        // and also not between days and months (28-31 days per month)\n        if (!this.isValid()) {\n            return this.localeData().invalidDate();\n        }\n\n        var seconds = abs$1(this._milliseconds) / 1000,\n            days = abs$1(this._days),\n            months = abs$1(this._months),\n            minutes,\n            hours,\n            years,\n            s,\n            total = this.asSeconds(),\n            totalSign,\n            ymSign,\n            daysSign,\n            hmsSign;\n\n        if (!total) {\n            // this is the same as C#'s (Noda) and python (isodate)...\n            // but not other JS (goog.date)\n            return 'P0D';\n        }\n\n        // 3600 seconds -> 60 minutes -> 1 hour\n        minutes = absFloor(seconds / 60);\n        hours = absFloor(minutes / 60);\n        seconds %= 60;\n        minutes %= 60;\n\n        // 12 months -> 1 year\n        years = absFloor(months / 12);\n        months %= 12;\n\n        // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js\n        s = seconds ? seconds.toFixed(3).replace(/\\.?0+$/, '') : '';\n\n        totalSign = total < 0 ? '-' : '';\n        ymSign = sign(this._months) !== sign(total) ? '-' : '';\n        daysSign = sign(this._days) !== sign(total) ? '-' : '';\n        hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : '';\n\n        return (\n            totalSign +\n            'P' +\n            (years ? ymSign + years + 'Y' : '') +\n            (months ? ymSign + months + 'M' : '') +\n            (days ? daysSign + days + 'D' : '') +\n            (hours || minutes || seconds ? 'T' : '') +\n            (hours ? hmsSign + hours + 'H' : '') +\n            (minutes ? hmsSign + minutes + 'M' : '') +\n            (seconds ? hmsSign + s + 'S' : '')\n        );\n    }\n\n    var proto$2 = Duration.prototype;\n\n    proto$2.isValid = isValid$1;\n    proto$2.abs = abs;\n    proto$2.add = add$1;\n    proto$2.subtract = subtract$1;\n    proto$2.as = as;\n    proto$2.asMilliseconds = asMilliseconds;\n    proto$2.asSeconds = asSeconds;\n    proto$2.asMinutes = asMinutes;\n    proto$2.asHours = asHours;\n    proto$2.asDays = asDays;\n    proto$2.asWeeks = asWeeks;\n    proto$2.asMonths = asMonths;\n    proto$2.asQuarters = asQuarters;\n    proto$2.asYears = asYears;\n    proto$2.valueOf = valueOf$1;\n    proto$2._bubble = bubble;\n    proto$2.clone = clone$1;\n    proto$2.get = get$2;\n    proto$2.milliseconds = milliseconds;\n    proto$2.seconds = seconds;\n    proto$2.minutes = minutes;\n    proto$2.hours = hours;\n    proto$2.days = days;\n    proto$2.weeks = weeks;\n    proto$2.months = months;\n    proto$2.years = years;\n    proto$2.humanize = humanize;\n    proto$2.toISOString = toISOString$1;\n    proto$2.toString = toISOString$1;\n    proto$2.toJSON = toISOString$1;\n    proto$2.locale = locale;\n    proto$2.localeData = localeData;\n\n    proto$2.toIsoString = deprecate(\n        'toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)',\n        toISOString$1\n    );\n    proto$2.lang = lang;\n\n    // FORMATTING\n\n    addFormatToken('X', 0, 0, 'unix');\n    addFormatToken('x', 0, 0, 'valueOf');\n\n    // PARSING\n\n    addRegexToken('x', matchSigned);\n    addRegexToken('X', matchTimestamp);\n    addParseToken('X', function (input, array, config) {\n        config._d = new Date(parseFloat(input) * 1000);\n    });\n    addParseToken('x', function (input, array, config) {\n        config._d = new Date(toInt(input));\n    });\n\n    //! moment.js\n\n    hooks.version = '2.29.1';\n\n    setHookCallback(createLocal);\n\n    hooks.fn = proto;\n    hooks.min = min;\n    hooks.max = max;\n    hooks.now = now;\n    hooks.utc = createUTC;\n    hooks.unix = createUnix;\n    hooks.months = listMonths;\n    hooks.isDate = isDate;\n    hooks.locale = getSetGlobalLocale;\n    hooks.invalid = createInvalid;\n    hooks.duration = createDuration;\n    hooks.isMoment = isMoment;\n    hooks.weekdays = listWeekdays;\n    hooks.parseZone = createInZone;\n    hooks.localeData = getLocale;\n    hooks.isDuration = isDuration;\n    hooks.monthsShort = listMonthsShort;\n    hooks.weekdaysMin = listWeekdaysMin;\n    hooks.defineLocale = defineLocale;\n    hooks.updateLocale = updateLocale;\n    hooks.locales = listLocales;\n    hooks.weekdaysShort = listWeekdaysShort;\n    hooks.normalizeUnits = normalizeUnits;\n    hooks.relativeTimeRounding = getSetRelativeTimeRounding;\n    hooks.relativeTimeThreshold = getSetRelativeTimeThreshold;\n    hooks.calendarFormat = getCalendarFormat;\n    hooks.prototype = proto;\n\n    // currently HTML5 input type only supports 24-hour formats\n    hooks.HTML5_FMT = {\n        DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // <input type=\"datetime-local\" />\n        DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // <input type=\"datetime-local\" step=\"1\" />\n        DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // <input type=\"datetime-local\" step=\"0.001\" />\n        DATE: 'YYYY-MM-DD', // <input type=\"date\" />\n        TIME: 'HH:mm', // <input type=\"time\" />\n        TIME_SECONDS: 'HH:mm:ss', // <input type=\"time\" step=\"1\" />\n        TIME_MS: 'HH:mm:ss.SSS', // <input type=\"time\" step=\"0.001\" />\n        WEEK: 'GGGG-[W]WW', // <input type=\"week\" />\n        MONTH: 'YYYY-MM', // <input type=\"month\" />\n    };\n\n    return hooks;\n\n})));\n"]},"metadata":{},"sourceType":"script"}