summaryrefslogtreecommitdiff
path: root/bin/wiki/ImportarDesdeURL/node_modules/chrono-node/chrono.map.json
diff options
context:
space:
mode:
Diffstat (limited to 'bin/wiki/ImportarDesdeURL/node_modules/chrono-node/chrono.map.json')
-rw-r--r--bin/wiki/ImportarDesdeURL/node_modules/chrono-node/chrono.map.json1
1 files changed, 1 insertions, 0 deletions
diff --git a/bin/wiki/ImportarDesdeURL/node_modules/chrono-node/chrono.map.json b/bin/wiki/ImportarDesdeURL/node_modules/chrono-node/chrono.map.json
new file mode 100644
index 00000000..d7dba024
--- /dev/null
+++ b/bin/wiki/ImportarDesdeURL/node_modules/chrono-node/chrono.map.json
@@ -0,0 +1 @@
+{"version":3,"sources":["node_modules/browser-pack/_prelude.js","node_modules/moment/locale/fr.js","node_modules/moment/moment.js","src/chrono.js","src/options.js","src/parsers/de/DECasualDateParser.js","src/parsers/de/DEDeadlineFormatParser.js","src/parsers/de/DEMonthNameLittleEndianParser.js","src/parsers/de/DEMonthNameParser.js","src/parsers/de/DESlashDateFormatParser.js","src/parsers/de/DETimeAgoFormatParser.js","src/parsers/de/DETimeExpressionParser.js","src/parsers/de/DEWeekdayParser.js","src/parsers/en/ENCasualDateParser.js","src/parsers/en/ENCasualTimeParser.js","src/parsers/en/ENDeadlineFormatParser.js","src/parsers/en/ENISOFormatParser.js","src/parsers/en/ENMonthNameLittleEndianParser.js","src/parsers/en/ENMonthNameMiddleEndianParser.js","src/parsers/en/ENMonthNameParser.js","src/parsers/en/ENRelativeDateFormatParser.js","src/parsers/en/ENSlashDateFormatParser.js","src/parsers/en/ENSlashDateFormatStartWithYearParser.js","src/parsers/en/ENSlashMonthFormatParser.js","src/parsers/en/ENTimeAgoFormatParser.js","src/parsers/en/ENTimeExpressionParser.js","src/parsers/en/ENTimeLaterFormatParser.js","src/parsers/en/ENWeekdayParser.js","src/parsers/es/ESCasualDateParser.js","src/parsers/es/ESDeadlineFormatParser.js","src/parsers/es/ESMonthNameLittleEndianParser.js","src/parsers/es/ESSlashDateFormatParser.js","src/parsers/es/ESTimeAgoFormatParser.js","src/parsers/es/ESTimeExpressionParser.js","src/parsers/es/ESWeekdayParser.js","src/parsers/fr/FRCasualDateParser.js","src/parsers/fr/FRDeadlineFormatParser.js","src/parsers/fr/FRMonthNameLittleEndianParser.js","src/parsers/fr/FRRelativeDateFormatParser.js","src/parsers/fr/FRSlashDateFormatParser.js","src/parsers/fr/FRTimeAgoFormatParser.js","src/parsers/fr/FRTimeExpressionParser.js","src/parsers/fr/FRWeekdayParser.js","src/parsers/ja/JPCasualDateParser.js","src/parsers/ja/JPStandardParser.js","src/parsers/parser.js","src/parsers/zh-Hant/ZHHantCasualDateParser.js","src/parsers/zh-Hant/ZHHantDateParser.js","src/parsers/zh-Hant/ZHHantDeadlineFormatParser.js","src/parsers/zh-Hant/ZHHantTimeExpressionParser.js","src/parsers/zh-Hant/ZHHantWeekdayParser.js","src/refiners/ExtractTimezoneAbbrRefiner.js","src/refiners/ExtractTimezoneOffsetRefiner.js","src/refiners/ForwardDateRefiner.js","src/refiners/OverlapRemovalRefiner.js","src/refiners/UnlikelyFormatFilter.js","src/refiners/de/DEMergeDateRangeRefiner.js","src/refiners/de/DEMergeDateTimeRefiner.js","src/refiners/en/ENMergeDateRangeRefiner.js","src/refiners/en/ENMergeDateTimeRefiner.js","src/refiners/en/ENPrioritizeSpecificDateRefiner.js","src/refiners/fr/FRMergeDateRangeRefiner.js","src/refiners/fr/FRMergeDateTimeRefiner.js","src/refiners/ja/JPMergeDateRangeRefiner.js","src/refiners/refiner.js","src/result.js","src/utils/DE.js","src/utils/EN.js","src/utils/ES.js","src/utils/FR.js","src/utils/JP.js","src/utils/ZH-Hant.js"],"names":["global","factory","exports","module","require","define","amd","moment","this","defineLocale","months","split","monthsShort","monthsParseExact","weekdays","weekdaysShort","weekdaysMin","weekdaysParseExact","longDateFormat","LT","LTS","L","LL","LLL","LLLL","calendar","sameDay","nextDay","nextWeek","lastDay","lastWeek","sameElse","relativeTime","future","past","s","ss","m","mm","h","hh","d","dd","M","MM","y","yy","dayOfMonthOrdinalParse","ordinal","number","period","week","dow","doy","hooks","hookCallback","apply","arguments","isArray","input","Array","Object","prototype","toString","call","isObject","isObjectEmpty","obj","getOwnPropertyNames","length","k","hasOwnProperty","isUndefined","isNumber","isDate","Date","map","arr","fn","i","res","push","hasOwnProp","a","b","extend","valueOf","createUTC","format","locale","strict","createLocalOrUTC","utc","defaultParsingFlags","empty","unusedTokens","unusedInput","overflow","charsLeftOver","nullInput","invalidMonth","invalidFormat","userInvalidated","iso","parsedDateParts","meridiem","rfc2822","weekdayMismatch","getParsingFlags","_pf","isValid","_isValid","flags","parsedParts","some","isNowValid","isNaN","_d","getTime","invalidWeekday","_strict","undefined","bigHour","isFrozen","createInvalid","NaN","copyConfig","to","from","prop","val","_isAMomentObject","_i","_f","_l","_tzm","_isUTC","_offset","_locale","momentProperties","Moment","config","updateInProgress","updateOffset","isMoment","absFloor","Math","ceil","floor","toInt","argumentForCoercion","coercedNumber","value","isFinite","compareArrays","array1","array2","dontConvert","len","min","lengthDiff","abs","diffs","warn","msg","suppressDeprecationWarnings","console","deprecate","firstTime","deprecationHandler","arg","args","key","slice","join","Error","stack","deprecateSimple","name","deprecations","isFunction","Function","set","_config","_dayOfMonthOrdinalParseLenient","RegExp","_dayOfMonthOrdinalParse","source","_ordinalParse","mergeConfigs","parentConfig","childConfig","Locale","mom","now","output","_calendar","_longDateFormat","formatUpper","toUpperCase","replace","invalidDate","_invalidDate","_ordinal","withoutSuffix","string","isFuture","_relativeTime","pastFuture","diff","addUnitAlias","unit","shorthand","lowerCase","toLowerCase","aliases","normalizeUnits","units","normalizeObjectUnits","inputObject","normalizedProp","normalizedInput","addUnitPriority","priority","priorities","getPrioritizedUnits","unitsObj","u","sort","zeroFill","targetLength","forceSign","absNumber","zerosToFill","pow","max","substr","addFormatToken","token","padded","callback","func","formatTokenFunctions","localeData","removeFormattingTokens","match","makeFormatFunction","array","formattingTokens","formatMoment","expandFormat","formatFunctions","replaceLongDateFormatTokens","localFormattingTokens","lastIndex","test","addRegexToken","regex","strictRegex","regexes","isStrict","getParseRegexForToken","unescapeFormat","regexEscape","matched","p1","p2","p3","p4","addParseToken","tokens","addWeekParseToken","_w","addTimeToArrayFromToken","_a","daysInYear","year","isLeapYear","getIsLeapYear","makeGetSet","keepTime","set$1","get","month","date","daysInMonth","stringGet","stringSet","prioritized","mod","n","x","modMonth","localeMonths","_months","isFormat","MONTHS_IN_FORMAT","localeMonthsShort","_monthsShort","handleStrictParse","monthName","ii","llc","toLocaleLowerCase","_monthsParse","_longMonthsParse","_shortMonthsParse","indexOf","localeMonthsParse","_monthsParseExact","setMonth","dayOfMonth","monthsParse","getSetMonth","getDaysInMonth","monthsShortRegex","computeMonthsParse","_monthsShortStrictRegex","_monthsShortRegex","defaultMonthsShortRegex","monthsRegex","_monthsStrictRegex","_monthsRegex","defaultMonthsRegex","cmpLenRev","shortPieces","longPieces","mixedPieces","createDate","ms","getFullYear","setFullYear","createUTCDate","UTC","getUTCFullYear","setUTCFullYear","firstWeekOffset","fwd","getUTCDay","dayOfYearFromWeeks","weekday","resYear","resDayOfYear","localWeekday","weekOffset","dayOfYear","weekOfYear","resWeek","weeksInYear","weekOffsetNext","localeWeek","_week","localeFirstDayOfWeek","localeFirstDayOfYear","getSetWeek","add","getSetISOWeek","parseWeekday","weekdaysParse","parseInt","parseIsoWeekday","localeWeekdays","_weekdays","day","localeWeekdaysShort","_weekdaysShort","localeWeekdaysMin","_weekdaysMin","handleStrictParse$1","weekdayName","_weekdaysParse","_shortWeekdaysParse","_minWeekdaysParse","localeWeekdaysParse","_weekdaysParseExact","_fullWeekdaysParse","getSetDayOfWeek","getDay","getSetLocaleDayOfWeek","getSetISODayOfWeek","weekdaysRegex","computeWeekdaysParse","_weekdaysStrictRegex","_weekdaysRegex","defaultWeekdaysRegex","weekdaysShortRegex","_weekdaysShortStrictRegex","_weekdaysShortRegex","defaultWeekdaysShortRegex","weekdaysMinRegex","_weekdaysMinStrictRegex","_weekdaysMinRegex","defaultWeekdaysMinRegex","minp","shortp","longp","minPieces","hFormat","hours","kFormat","lowercase","minutes","matchMeridiem","_meridiemParse","localeIsPM","charAt","localeMeridiem","isLower","normalizeLocale","chooseLocale","names","j","next","loadLocale","globalLocale","oldLocale","locales","_abbr","getSetGlobalLocale","e","values","data","getLocale","baseConfig","abbr","parentLocale","localeFamilies","forEach","updateLocale","tmpLocale","listLocales","keys","checkOverflow","MONTH","DATE","YEAR","HOUR","MINUTE","SECOND","MILLISECOND","_overflowDayOfYear","_overflowWeeks","WEEK","_overflowWeekday","WEEKDAY","defaults","c","currentDateArray","nowValue","_useUTC","getUTCMonth","getUTCDate","getMonth","getDate","configFromArray","currentDate","expectedWeekday","yearToUse","dayOfYearFromWeekInfo","_dayOfYear","_nextDay","setUTCMinutes","getUTCMinutes","w","weekYear","temp","weekdayOverflow","GG","W","E","createLocal","curWeek","gg","configFromISO","l","allowTime","dateFormat","timeFormat","tzFormat","extendedIsoRegex","exec","basicIsoRegex","isoDates","isoTimes","tzRegex","configFromStringAndFormat","extractFromRFC2822Strings","yearStr","monthStr","dayStr","hourStr","minuteStr","secondStr","result","untruncateYear","defaultLocaleMonthsShort","preprocessRFC2822","trim","checkWeekday","weekdayStr","parsedInput","defaultLocaleWeekdaysShort","calculateOffset","obsOffset","militaryOffset","numOffset","obsOffsets","hm","configFromRFC2822","parsedArray","configFromString","aspNetJsonRegex","createFromInputFallback","ISO_8601","RFC_2822","skipped","stringLength","totalParsedInputLength","_meridiem","meridiemFixWrap","hour","isPm","meridiemHour","isPM","configFromStringAndArray","tempConfig","bestMoment","scoreToBeat","currentScore","score","configFromObject","minute","second","millisecond","createFromConfig","prepareConfig","preparse","configFromInput","isUTC","pickBy","moments","isDurationValid","ordering","unitHasDecimal","parseFloat","isValid$1","createInvalid$1","createDuration","Duration","duration","years","quarters","quarter","weeks","days","seconds","milliseconds","_milliseconds","_days","_data","_bubble","isDuration","absRound","round","offset","separator","utcOffset","sign","offsetFromString","matcher","matches","chunk","parts","chunkOffset","cloneWithOffset","model","clone","setTime","local","getDateOffset","getTimezoneOffset","getSetOffset","keepLocalTime","keepMinutes","localAdjust","matchShortOffset","_changeInProgress","addSubtract","getSetZone","setOffsetToUTC","setOffsetToLocal","subtract","setOffsetToParsedOffset","tZone","matchOffset","hasAlignedHourOffset","isDaylightSavingTime","isDaylightSavingTimeShifted","_isDSTShifted","other","toArray","isLocal","isUtcOffset","isUtc","ret","diffRes","aspNetRegex","isoRegex","parseIso","momentsDifference","inp","positiveMomentsDifference","base","isAfter","isBefore","createAdder","direction","dur","tmp","isAdding","getCalendarFormat","myMoment","calendar$1","time","formats","sod","startOf","calendarFormat","localInput","endOf","isBetween","inclusivity","isSame","inputMs","isSameOrAfter","isSameOrBefore","asFloat","that","zoneDelta","monthDiff","anchor2","adjust","wholeMonthDiff","anchor","toISOString","keepOffset","toDate","inspect","zone","prefix","suffix","inputString","defaultFormatUtc","defaultFormat","postformat","humanize","fromNow","toNow","newLocaleData","isoWeekday","unix","toObject","toJSON","isValid$2","parsingFlags","invalidAt","creationData","addWeekYearFormatToken","getter","getSetWeekYear","getSetWeekYearHelper","getSetISOWeekYear","isoWeek","getISOWeeksInYear","getWeeksInYear","weekInfo","weeksTarget","setWeekAll","dayOfYearData","getSetQuarter","getSetDayOfYear","parseMs","getZoneAbbr","getZoneName","createUnix","createInZone","parseZone","preParsePostFormat","get$1","index","field","setter","listMonthsImpl","out","listWeekdaysImpl","localeSorted","shift","listMonths","listMonthsShort","listWeekdays","listWeekdaysShort","listWeekdaysMin","mathAbs","addSubtract$1","add$1","subtract$1","absCeil","bubble","monthsFromDays","monthsToDays","daysToMonths","as","valueOf$1","makeAs","alias","clone$1","get$2","makeGetter","substituteTimeAgo","relativeTime$1","posNegDuration","thresholds","getSetRelativeTimeRounding","roundingFunction","getSetRelativeTimeThreshold","threshold","limit","withSuffix","toISOString$1","abs$1","Y","D","toFixed","total","asSeconds","totalSign","ymSign","daysSign","hmsSign","fun","t","defaultCalendar","defaultLongDateFormat","defaultDayOfMonthOrdinalParse","defaultRelativeTime","match1","match2","match3","match4","match6","match1to2","match3to4","match5to6","match1to3","match1to4","match1to6","matchUnsigned","matchSigned","matchTimestamp","matchWord","parseTwoDigitYear","getSetYear","o","defaultLocaleMonths","defaultLocaleWeek","defaultLocaleWeekdays","defaultLocaleWeekdaysMin","kInput","_isPm","pos","pos1","pos2","defaultLocaleMeridiemParse","getSetHour","meridiemParse","UT","GMT","EDT","EST","CDT","CST","MDT","MST","PDT","PST","prototypeMin","prototypeMax","invalid","lang","isoWeekYear","getSetDayOfMonth","getSetMinute","getSetSecond","getSetMillisecond","proto","isoWeeks","isoWeeksInYear","isDST","zoneAbbr","zoneName","dates","isDSTShifted","proto$1","firstDayOfYear","firstDayOfWeek","langData","asMilliseconds","asMinutes","asHours","asDays","asWeeks","asMonths","asYears","proto$2","toIsoString","version","relativeTimeRounding","relativeTimeThreshold","HTML5_FMT","DATETIME_LOCAL","DATETIME_LOCAL_SECONDS","DATETIME_LOCAL_MS","TIME","TIME_SECONDS","TIME_MS","options","parser","refiner","Parser","Refiner","Filter","ParsedResult","ParsedComponents","Chrono","option","casualOption","parsers","refiners","parse","text","refDate","opt","forwardDate","allResults","results","execute","concat","refine","parseDate","start","strictOption","casual","en","mergeOptions","commonPostProcessing","en_GB","de","es","fr","ja","addedTypes","mergedOption","p","constructor","r","ExtractTimezoneOffsetRefiner","ExtractTimezoneAbbrRefiner","UnlikelyFormatFilter","strictConfig","zh","DEDeadlineFormatParser","DEMonthNameLittleEndianParser","DEMonthNameParser","DESlashDateFormatParser","DETimeAgoFormatParser","DETimeExpressionParser","OverlapRemovalRefiner","ForwardDateRefiner","DEMergeDateTimeRefiner","DEMergeDateRangeRefiner","unshift","DECasualDateParser","DEWeekdayParser","ENISOFormatParser","ENDeadlineFormatParser","ENMonthNameLittleEndianParser","ENMonthNameMiddleEndianParser","ENMonthNameParser","ENSlashDateFormatParser","ENSlashDateFormatStartWithYearParser","ENSlashMonthFormatParser","ENTimeAgoFormatParser","ENTimeLaterFormatParser","ENTimeExpressionParser","ENMergeDateTimeRefiner","ENMergeDateRangeRefiner","ENPrioritizeSpecificDateRefiner","ENCasualDateParser","ENCasualTimeParser","ENWeekdayParser","ENRelativeDateFormatParser","littleEndian","JPStandardParser","JPMergeDateRangeRefiner","JPCasualDateParser","ESTimeAgoFormatParser","ESDeadlineFormatParser","ESTimeExpressionParser","ESMonthNameLittleEndianParser","ESSlashDateFormatParser","ESCasualDateParser","ESWeekdayParser","FRDeadlineFormatParser","FRMonthNameLittleEndianParser","FRSlashDateFormatParser","FRTimeAgoFormatParser","FRTimeExpressionParser","FRMergeDateRangeRefiner","FRMergeDateTimeRefiner","FRCasualDateParser","FRWeekdayParser","FRRelativeDateFormatParser","ZHHantDateParser","ZHHantWeekdayParser","ZHHantTimeExpressionParser","ZHHantCasualDateParser","ZHHantDeadlineFormatParser","PATTERN","pattern","extract","ref","refMoment","startMoment","lowerText","imply","secondMatch","assign","tags","util","INTEGER_WORDS_PATTERN","STRICT_PATTERN","isStrictMode","num","INTEGER_WORDS","WEEKDAY_GROUP","DATE_GROUP","DATE_TO_GROUP","MONTH_NAME_GROUP","YEAR_GROUP","YEAR_BE_GROUP","MONTH_OFFSET","nextYear","lastYear","WEEKDAY_OFFSET","end","YEAR_GROUP2","YEAR_BE_GROUP2","DAYS_OFFSET","sonntag","so","montag","mo","dienstag","di","mittwoch","mi","donnerstag","do","freitag","samstag","sa","OPENNING_GROUP","ENDING_GROUP","DAY_GROUP","MONTH_GROUP","argument","FIRST_REG_PATTERN","SECOND_REG_PATTERN","HOUR_GROUP","MINUTE_GROUP","SECOND_GROUP","AM_PM_HOUR_GROUP","substring","ampm","isCertain","PREFIX_GROUP","POSTFIX_GROUP","dayOfWeek","postfix","refOffset","norm","TIME_MATCH","YEAR_NUMBER_GROUP","MONTH_NUMBER_GROUP","DATE_NUMBER_GROUP","HOUR_NUMBER_GROUP","MINUTE_NUMBER_GROUP","SECOND_NUMBER_GROUP","MILLISECOND_NUMBER_GROUP","TZD_HOUR_OFFSET_GROUP","TZD_MINUTE_OFFSET_GROUP","minuteOffset","hourOffset","ORDINAL_WORDS_PATTERN","MONTH_PATTERN","DATE_NUM_GROUP","DATE_TO_NUM_GROUP","ORDINAL_WORDS","endDate","yearBE","MODIFIER_WORD_GROUP","MULTIPLIER_WORD_GROUP","RELATIVE_WORD_GROUP","modifier","sunday","sun","monday","mon","tuesday","wednesday","wed","thursday","thur","friday","fri","saturday","sat","FIRST_NUMBERS_GROUP","SECOND_NUMBERS_GROUP","tday","TIME_UNIT_PATTERN","TIME_UNIT_STRICT_PATTERN","fragments","extractDateTimeUnitFragments","MILLI_SECOND_GROUP","preamble","tues","tue","thurs","thu","updateParsedComponent","startMomentFixed","firstMatch","domingo","dom","lunes","lun","martes","mar","miercoles","miércoles","mie","jueves","jue","viernes","vier","sábado","sabado","sab","originalLocale","MULTIPLIER_GROUP","MODIFIER_1_GROUP","MODIFIER_2_GROUP","multiplier","modifierFactor","dateFrom","dateTo","relative","dateTmp","dimanche","dim","lundi","mardi","mercredi","mer","jeudi","jeu","vendredi","ven","samedi","sam","ERA_GROUP","toHankaku","strictMode","remainingText","hasPossibleDates","NOW_GROUP","DAY_GROUP_1","TIME_GROUP_1","TIME_GROUP_2","DAY_GROUP_3","TIME_GROUP_3","day1","time1","timeString2","time2","day3","timeString3","time3","NUMBER","zhStringToNumber","zhStringToYear","NUMBER_GROUP","UNIT_GROUP","unitAbbr","patternString1","patternString2","ZH_AM_PM_HOUR_GROUP_1","ZH_AM_PM_HOUR_GROUP_2","ZH_AM_PM_HOUR_GROUP_3","ZHTimeExpressionParser","zhAMPMString1","zhAMPM1","zhAMPMString2","zhAMPM2","zhAMPMString3","zhAMPM3","endMoment","TIMEZONE_NAME_PATTERN","DEFAULT_TIMEZONE_ABBR_MAP","ACDT","ACST","ADT","AEDT","AEST","AFT","AKDT","AKST","ALMT","AMST","AMT","ANAST","ANAT","AQTT","ART","AST","AWDT","AWST","AZOST","AZOT","AZST","AZT","BNT","BOT","BRST","BRT","BST","BTT","CAST","CAT","CCT","CEST","CET","CHADT","CHAST","CKT","CLST","CLT","COT","CVT","CXT","ChST","DAVT","EASST","EAST","EAT","ECT","EEST","EET","EGST","EGT","ET","FJST","FJT","FKST","FKT","FNT","GALT","GAMT","GET","GFT","GILT","GST","GYT","HAA","HAC","HADT","HAE","HAP","HAR","HAST","HAT","HAY","HKT","HLV","HNA","HNC","HNE","HNP","HNR","HNT","HNY","HOVT","ICT","IDT","IOT","IRDT","IRKST","IRKT","IRST","IST","JST","KGT","KRAST","KRAT","KST","KUYT","LHDT","LHST","LINT","MAGST","MAGT","MART","MAWT","MESZ","MEZ","MHT","MMT","MSD","MSK","MUT","MVT","MYT","NCT","NDT","NFT","NOVST","NOVT","NPT","NST","NUT","NZDT","NZST","OMSST","OMST","PET","PETST","PETT","PGT","PHOT","PHT","PKT","PMDT","PMST","PONT","PT","PWT","PYST","PYT","RET","SAMT","SAST","SBT","SCT","SGT","SRT","SST","TAHT","TFT","TJT","TKT","TLT","TMT","TVT","ULAT","UYST","UYT","UZT","VET","VLAST","VLAT","VUT","WAST","WAT","WEST","WESZ","WET","WEZ","WFT","WGST","WGT","WIB","WIT","WITA","WST","WT","YAKST","YAKT","YAPT","YEKST","YEKT","timezones","timezoneAbbr","timezoneOffset","TIMEZONE_OFFSET_PATTERN","TIMEZONE_OFFSET_SIGN_GROUP","TIMEZONE_OFFSET_HOUR_OFFSET_GROUP","TIMEZONE_OFFSET_MINUTE_OFFSET_GROUP","filteredResults","prevResult","isAbleToMerge","curResult","mergeResult","dateResult","timeResult","beginDate","beginTime","beginDateTime","mergeDateTimeComponent","endTime","endDateTime","startIndex","endIndex","tag","isDateOnly","isTimeOnly","mergedResult","currResult","result1","result2","begin","isWeekdayResult","fromResult","toResult","knownValues","fromMoment","toMoment","dateComponent","timeComponent","dateTimeComponent","isMoreSpecific","moreSpecific","textBetween","includesRelativeResult","referToSameDate","specificResult","nonSpecificResult","filteredResult","components","impliedValues","JSON","stringify","isPossibleDate","component","dateMoment","currentTimezoneOffset","targetTimezoneOffset","adjustTimezoneOffset","januar","jan","jan.","februar","feb","feb.","märz","maerz","mär","mär.","mrz","mrz.","april","apr","apr.","mai","juni","jun","jun.","juli","jul","jul.","august","aug","aug.","september","sep","sep.","sept","sept.","oktober","okt","okt.","november","nov","nov.","dezember","dez","dez.","eins","zwei","drei","fünf","fuenf","sechs","sieben","acht","neun","zehn","elf","zwölf","zwoelf","collectDateTimeFragment","january","february","march","mar.","may","june","july","october","oct","oct.","december","dec","dec.","one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve","first","third","fourth","fifth","sixth","seventh","eighth","ninth","tenth","eleventh","twelfth","thirteenth","fourteenth","fifteenth","sixteenth","seventeenth","eighteenth","nineteenth","twentieth","twenty first","twenty second","twenty third","twenty fourth","twenty fifth","twenty sixth","twenty seventh","twenty eighth","twenty ninth","thirtieth","thirty first","TIME_UNIT","TIME_UNIT_STRICT","PATTERN_TIME_UNIT","timeunitText","vie","enero","ene","ene.","febrero","marzo","abril","abr","abr.","mayo","may.","junio","julio","agosto","ago","ago.","septiembre","octubre","noviembre","diciembre","dic","dic.","janvier","février","fév","fév.","fevrier","fev","fev.","mars","avril","avr","avr.","juin","juillet","août","aout","septembre","octobre","novembre","décembre","decembre","un","deux","trois","quatre","cinq","huit","neuf","dix","onze","douze","treize","String","fromCharCode","alphaNum","charCodeAt","toZenkaku","零","一","二","兩","三","四","五","六","七","八","九","十","廿","卅","天","日","char"],"mappings":"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","file":"bundle.js","sourcesContent":["(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()","//! moment.js locale configuration\n\n;(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined'\n && typeof require === 'function' ? factory(require('../moment')) :\n typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar fr = moment.defineLocale('fr', {\n months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'),\n monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'),\n monthsParseExact : true,\n weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),\n weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),\n weekdaysMin : 'di_lu_ma_me_je_ve_sa'.split('_'),\n weekdaysParseExact : true,\n longDateFormat : {\n LT : 'HH:mm',\n LTS : 'HH:mm:ss',\n L : 'DD/MM/YYYY',\n LL : 'D MMMM YYYY',\n LLL : 'D MMMM YYYY HH:mm',\n LLLL : 'dddd D MMMM YYYY HH:mm'\n },\n calendar : {\n sameDay : '[Aujourd’hui à] LT',\n nextDay : '[Demain à] LT',\n nextWeek : 'dddd [à] LT',\n lastDay : '[Hier à] LT',\n lastWeek : 'dddd [dernier à] LT',\n sameElse : 'L'\n },\n relativeTime : {\n future : 'dans %s',\n past : 'il y a %s',\n s : 'quelques secondes',\n ss : '%d secondes',\n m : 'une minute',\n mm : '%d minutes',\n h : 'une heure',\n hh : '%d heures',\n d : 'un jour',\n dd : '%d jours',\n M : 'un mois',\n MM : '%d mois',\n y : 'un an',\n yy : '%d ans'\n },\n dayOfMonthOrdinalParse: /\\d{1,2}(er|)/,\n ordinal : function (number, period) {\n switch (period) {\n // TODO: Return 'e' when day of month > 1. Move this case inside\n // block for masculine words below.\n // See https://github.com/moment/moment/issues/3375\n case 'D':\n return number + (number === 1 ? 'er' : '');\n\n // Words with masculine grammatical gender: mois, trimestre, jour\n default:\n case 'M':\n case 'Q':\n case 'DDD':\n case 'd':\n return number + (number === 1 ? 'er' : 'e');\n\n // Words with feminine grammatical gender: semaine\n case 'w':\n case 'W':\n return number + (number === 1 ? 're' : 'e');\n }\n },\n week : {\n dow : 1, // Monday is the first day of the week.\n doy : 4 // The week that contains Jan 4th is the first week of the year.\n }\n});\n\nreturn fr;\n\n})));\n","//! moment.js\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\nvar hookCallback;\n\nfunction 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.\nfunction setHookCallback (callback) {\n hookCallback = callback;\n}\n\nfunction isArray(input) {\n return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]';\n}\n\nfunction 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\nfunction 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 (obj.hasOwnProperty(k)) {\n return false;\n }\n }\n return true;\n }\n}\n\nfunction isUndefined(input) {\n return input === void 0;\n}\n\nfunction isNumber(input) {\n return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]';\n}\n\nfunction isDate(input) {\n return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';\n}\n\nfunction map(arr, fn) {\n var res = [], i;\n for (i = 0; i < arr.length; ++i) {\n res.push(fn(arr[i], i));\n }\n return res;\n}\n\nfunction hasOwnProp(a, b) {\n return Object.prototype.hasOwnProperty.call(a, b);\n}\n\nfunction 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\nfunction createUTC (input, format, locale, strict) {\n return createLocalOrUTC(input, format, locale, strict, true).utc();\n}\n\nfunction 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 invalidMonth : null,\n invalidFormat : false,\n userInvalidated : false,\n iso : false,\n parsedDateParts : [],\n meridiem : null,\n rfc2822 : false,\n weekdayMismatch : false\n };\n}\n\nfunction getParsingFlags(m) {\n if (m._pf == null) {\n m._pf = defaultParsingFlags();\n }\n return m._pf;\n}\n\nvar some;\nif (Array.prototype.some) {\n some = Array.prototype.some;\n} else {\n some = function (fun) {\n var t = Object(this);\n var len = t.length >>> 0;\n\n for (var 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\nfunction isValid(m) {\n if (m._isValid == null) {\n var flags = getParsingFlags(m);\n var parsedParts = some.call(flags.parsedDateParts, function (i) {\n return i != null;\n });\n var isNowValid = !isNaN(m._d.getTime()) &&\n flags.overflow < 0 &&\n !flags.empty &&\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 = 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 }\n else {\n return isNowValid;\n }\n }\n return m._isValid;\n}\n\nfunction createInvalid (flags) {\n var m = createUTC(NaN);\n if (flags != null) {\n extend(getParsingFlags(m), flags);\n }\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.\nvar momentProperties = hooks.momentProperties = [];\n\nfunction 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\nvar updateInProgress = false;\n\n// Moment prototype object\nfunction 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\nfunction isMoment (obj) {\n return obj instanceof Moment || (obj != null && obj._isAMomentObject != null);\n}\n\nfunction 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\nfunction 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// compare two arrays, return the number of differences\nfunction 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 ((dontConvert && array1[i] !== array2[i]) ||\n (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {\n diffs++;\n }\n }\n return diffs + lengthDiff;\n}\n\nfunction warn(msg) {\n if (hooks.suppressDeprecationWarnings === false &&\n (typeof console !== 'undefined') && console.warn) {\n console.warn('Deprecation warning: ' + msg);\n }\n}\n\nfunction 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 var arg;\n for (var i = 0; i < arguments.length; i++) {\n arg = '';\n if (typeof arguments[i] === 'object') {\n arg += '\\n[' + i + '] ';\n for (var key in arguments[0]) {\n arg += key + ': ' + arguments[0][key] + ', ';\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(msg + '\\nArguments: ' + Array.prototype.slice.call(args).join('') + '\\n' + (new Error()).stack);\n firstTime = false;\n }\n return fn.apply(this, arguments);\n }, fn);\n}\n\nvar deprecations = {};\n\nfunction 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\nhooks.suppressDeprecationWarnings = false;\nhooks.deprecationHandler = null;\n\nfunction isFunction(input) {\n return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';\n}\n\nfunction set (config) {\n var prop, i;\n for (i in config) {\n prop = config[i];\n if (isFunction(prop)) {\n this[i] = prop;\n } else {\n this['_' + i] = prop;\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 '|' + (/\\d{1,2}/).source);\n}\n\nfunction mergeConfigs(parentConfig, childConfig) {\n var res = extend({}, parentConfig), 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 (hasOwnProp(parentConfig, prop) &&\n !hasOwnProp(childConfig, prop) &&\n isObject(parentConfig[prop])) {\n // make sure changes to properties don't modify parent config\n res[prop] = extend({}, res[prop]);\n }\n }\n return res;\n}\n\nfunction Locale(config) {\n if (config != null) {\n this.set(config);\n }\n}\n\nvar keys;\n\nif (Object.keys) {\n keys = Object.keys;\n} else {\n keys = function (obj) {\n var i, res = [];\n for (i in obj) {\n if (hasOwnProp(obj, i)) {\n res.push(i);\n }\n }\n return res;\n };\n}\n\nvar 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\nfunction calendar (key, mom, now) {\n var output = this._calendar[key] || this._calendar['sameElse'];\n return isFunction(output) ? output.call(mom, now) : output;\n}\n\nvar 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\nfunction 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.replace(/MMMM|MM|DD|dddd/g, function (val) {\n return val.slice(1);\n });\n\n return this._longDateFormat[key];\n}\n\nvar defaultInvalidDate = 'Invalid date';\n\nfunction invalidDate () {\n return this._invalidDate;\n}\n\nvar defaultOrdinal = '%d';\nvar defaultDayOfMonthOrdinalParse = /\\d{1,2}/;\n\nfunction ordinal (number) {\n return this._ordinal.replace('%d', number);\n}\n\nvar 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 M : 'a month',\n MM : '%d months',\n y : 'a year',\n yy : '%d years'\n};\n\nfunction 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\nfunction 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\nvar aliases = {};\n\nfunction addUnitAlias (unit, shorthand) {\n var lowerCase = unit.toLowerCase();\n aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;\n}\n\nfunction normalizeUnits(units) {\n return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined;\n}\n\nfunction 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\nvar priorities = {};\n\nfunction addUnitPriority(unit, priority) {\n priorities[unit] = priority;\n}\n\nfunction getPrioritizedUnits(unitsObj) {\n var units = [];\n for (var u in unitsObj) {\n units.push({unit: u, priority: priorities[u]});\n }\n units.sort(function (a, b) {\n return a.priority - b.priority;\n });\n return units;\n}\n\nfunction zeroFill(number, targetLength, forceSign) {\n var absNumber = '' + Math.abs(number),\n zerosToFill = targetLength - absNumber.length,\n sign = number >= 0;\n return (sign ? (forceSign ? '+' : '') : '-') +\n Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber;\n}\n\nvar formattingTokens = /(\\[[^\\[]*\\])|(\\\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g;\n\nvar localFormattingTokens = /(\\[[^\\[]*\\])|(\\\\)?(LTS|LT|LL?L?L?|l{1,4})/g;\n\nvar formatFunctions = {};\n\nvar formatTokenFunctions = {};\n\n// token: 'M'\n// padded: ['MM', 2]\n// ordinal: 'Mo'\n// callback: function () { this.month() + 1 }\nfunction 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(func.apply(this, arguments), token);\n };\n }\n}\n\nfunction removeFormattingTokens(input) {\n if (input.match(/\\[[\\s\\S]/)) {\n return input.replace(/^\\[|\\]$/g, '');\n }\n return input.replace(/\\\\/g, '');\n}\n\nfunction makeFormatFunction(format) {\n var array = format.match(formattingTokens), i, 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 = '', i;\n for (i = 0; i < length; i++) {\n output += isFunction(array[i]) ? array[i].call(mom, format) : array[i];\n }\n return output;\n };\n}\n\n// format date using native date object\nfunction 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\n return formatFunctions[format](m);\n}\n\nfunction 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(localFormattingTokens, replaceLongDateFormatTokens);\n localFormattingTokens.lastIndex = 0;\n i -= 1;\n }\n\n return format;\n}\n\nvar match1 = /\\d/; // 0 - 9\nvar match2 = /\\d\\d/; // 00 - 99\nvar match3 = /\\d{3}/; // 000 - 999\nvar match4 = /\\d{4}/; // 0000 - 9999\nvar match6 = /[+-]?\\d{6}/; // -999999 - 999999\nvar match1to2 = /\\d\\d?/; // 0 - 99\nvar match3to4 = /\\d\\d\\d\\d?/; // 999 - 9999\nvar match5to6 = /\\d\\d\\d\\d\\d\\d?/; // 99999 - 999999\nvar match1to3 = /\\d{1,3}/; // 0 - 999\nvar match1to4 = /\\d{1,4}/; // 0 - 9999\nvar match1to6 = /[+-]?\\d{1,6}/; // -999999 - 999999\n\nvar matchUnsigned = /\\d+/; // 0 - inf\nvar matchSigned = /[+-]?\\d+/; // -inf - inf\n\nvar matchOffset = /Z|[+-]\\d\\d:?\\d\\d/gi; // +00:00 -00:00 +0000 -0000 or Z\nvar matchShortOffset = /Z|[+-]\\d\\d(?::?\\d\\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z\n\nvar matchTimestamp = /[+-]?\\d+(\\.\\d{1,3})?/; // 123456789 123456789.123\n\n// any word (or two) characters or numbers including two/three word month in arabic.\n// includes scottish gaelic two word and hyphenated months\nvar 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\nvar regexes = {};\n\nfunction addRegexToken (token, regex, strictRegex) {\n regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) {\n return (isStrict && strictRegex) ? strictRegex : regex;\n };\n}\n\nfunction 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\nfunction unescapeFormat(s) {\n return regexEscape(s.replace('\\\\', '').replace(/\\\\(\\[)|\\\\(\\])|\\[([^\\]\\[]*)\\]|\\\\(.)/g, function (matched, p1, p2, p3, p4) {\n return p1 || p2 || p3 || p4;\n }));\n}\n\nfunction regexEscape(s) {\n return s.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n}\n\nvar tokens = {};\n\nfunction addParseToken (token, callback) {\n var i, 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\nfunction 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\nfunction addTimeToArrayFromToken(token, input, config) {\n if (input != null && hasOwnProp(tokens, token)) {\n tokens[token](input, config._a, config, token);\n }\n}\n\nvar YEAR = 0;\nvar MONTH = 1;\nvar DATE = 2;\nvar HOUR = 3;\nvar MINUTE = 4;\nvar SECOND = 5;\nvar MILLISECOND = 6;\nvar WEEK = 7;\nvar WEEKDAY = 8;\n\n// FORMATTING\n\naddFormatToken('Y', 0, 0, function () {\n var y = this.year();\n return y <= 9999 ? '' + y : '+' + y;\n});\n\naddFormatToken(0, ['YY', 2], 0, function () {\n return this.year() % 100;\n});\n\naddFormatToken(0, ['YYYY', 4], 0, 'year');\naddFormatToken(0, ['YYYYY', 5], 0, 'year');\naddFormatToken(0, ['YYYYYY', 6, true], 0, 'year');\n\n// ALIASES\n\naddUnitAlias('year', 'y');\n\n// PRIORITIES\n\naddUnitPriority('year', 1);\n\n// PARSING\n\naddRegexToken('Y', matchSigned);\naddRegexToken('YY', match1to2, match2);\naddRegexToken('YYYY', match1to4, match4);\naddRegexToken('YYYYY', match1to6, match6);\naddRegexToken('YYYYYY', match1to6, match6);\n\naddParseToken(['YYYYY', 'YYYYYY'], YEAR);\naddParseToken('YYYY', function (input, array) {\n array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);\n});\naddParseToken('YY', function (input, array) {\n array[YEAR] = hooks.parseTwoDigitYear(input);\n});\naddParseToken('Y', function (input, array) {\n array[YEAR] = parseInt(input, 10);\n});\n\n// HELPERS\n\nfunction daysInYear(year) {\n return isLeapYear(year) ? 366 : 365;\n}\n\nfunction isLeapYear(year) {\n return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n}\n\n// HOOKS\n\nhooks.parseTwoDigitYear = function (input) {\n return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);\n};\n\n// MOMENTS\n\nvar getSetYear = makeGetSet('FullYear', true);\n\nfunction getIsLeapYear () {\n return isLeapYear(this.year());\n}\n\nfunction 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\nfunction get (mom, unit) {\n return mom.isValid() ?\n mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN;\n}\n\nfunction 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 mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, mom.month(), daysInMonth(value, mom.month()));\n }\n else {\n mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);\n }\n }\n}\n\n// MOMENTS\n\nfunction stringGet (units) {\n units = normalizeUnits(units);\n if (isFunction(this[units])) {\n return this[units]();\n }\n return this;\n}\n\n\nfunction stringSet (units, value) {\n if (typeof units === 'object') {\n units = normalizeObjectUnits(units);\n var prioritized = getPrioritizedUnits(units);\n for (var 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\nfunction mod(n, x) {\n return ((n % x) + x) % x;\n}\n\nvar indexOf;\n\nif (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\nfunction 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 ? (isLeapYear(year) ? 29 : 28) : (31 - modMonth % 7 % 2);\n}\n\n// FORMATTING\n\naddFormatToken('M', ['MM', 2], 'Mo', function () {\n return this.month() + 1;\n});\n\naddFormatToken('MMM', 0, 0, function (format) {\n return this.localeData().monthsShort(this, format);\n});\n\naddFormatToken('MMMM', 0, 0, function (format) {\n return this.localeData().months(this, format);\n});\n\n// ALIASES\n\naddUnitAlias('month', 'M');\n\n// PRIORITY\n\naddUnitPriority('month', 8);\n\n// PARSING\n\naddRegexToken('M', match1to2);\naddRegexToken('MM', match1to2, match2);\naddRegexToken('MMM', function (isStrict, locale) {\n return locale.monthsShortRegex(isStrict);\n});\naddRegexToken('MMMM', function (isStrict, locale) {\n return locale.monthsRegex(isStrict);\n});\n\naddParseToken(['M', 'MM'], function (input, array) {\n array[MONTH] = toInt(input) - 1;\n});\n\naddParseToken(['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\nvar MONTHS_IN_FORMAT = /D[oD]?(\\[[^\\[\\]]*\\]|\\s)+MMMM?/;\nvar defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_');\nfunction localeMonths (m, format) {\n if (!m) {\n return isArray(this._months) ? this._months :\n this._months['standalone'];\n }\n return isArray(this._months) ? this._months[m.month()] :\n this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()];\n}\n\nvar defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_');\nfunction localeMonthsShort (m, format) {\n if (!m) {\n return isArray(this._monthsShort) ? this._monthsShort :\n this._monthsShort['standalone'];\n }\n return isArray(this._monthsShort) ? this._monthsShort[m.month()] :\n this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()];\n}\n\nfunction handleStrictParse(monthName, format, strict) {\n var i, ii, mom, 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(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 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\nfunction 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('^' + this.months(mom, '').replace('.', '') + '$', 'i');\n this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');\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 }\n // test the regex\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}\n\n// MOMENTS\n\nfunction 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\nfunction 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\nfunction getDaysInMonth () {\n return daysInMonth(this.year(), this.month());\n}\n\nvar defaultMonthsShortRegex = matchWord;\nfunction 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 : this._monthsShortRegex;\n }\n}\n\nvar defaultMonthsRegex = matchWord;\nfunction 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 : this._monthsRegex;\n }\n}\n\nfunction computeMonthsParse () {\n function cmpLenRev(a, b) {\n return b.length - a.length;\n }\n\n var shortPieces = [], longPieces = [], mixedPieces = [],\n i, 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('^(' + longPieces.join('|') + ')', 'i');\n this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n}\n\nfunction 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 = new Date(y, m, d, h, M, s, ms);\n\n // the date constructor remaps years 0-99 to 1900-1999\n if (y < 100 && y >= 0 && isFinite(date.getFullYear())) {\n date.setFullYear(y);\n }\n return date;\n}\n\nfunction createUTCDate (y) {\n var date = new Date(Date.UTC.apply(null, arguments));\n\n // the Date.UTC function remaps years 0-99 to 1900-1999\n if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) {\n date.setUTCFullYear(y);\n }\n return date;\n}\n\n// start-of-first-week - start-of-year\nfunction 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\nfunction 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, 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\nfunction weekOfYear(mom, dow, doy) {\n var weekOffset = firstWeekOffset(mom.year(), dow, doy),\n week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,\n resWeek, 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\nfunction 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\naddFormatToken('w', ['ww', 2], 'wo', 'week');\naddFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');\n\n// ALIASES\n\naddUnitAlias('week', 'w');\naddUnitAlias('isoWeek', 'W');\n\n// PRIORITIES\n\naddUnitPriority('week', 5);\naddUnitPriority('isoWeek', 5);\n\n// PARSING\n\naddRegexToken('w', match1to2);\naddRegexToken('ww', match1to2, match2);\naddRegexToken('W', match1to2);\naddRegexToken('WW', match1to2, match2);\n\naddWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) {\n week[token.substr(0, 1)] = toInt(input);\n});\n\n// HELPERS\n\n// LOCALES\n\nfunction localeWeek (mom) {\n return weekOfYear(mom, this._week.dow, this._week.doy).week;\n}\n\nvar defaultLocaleWeek = {\n dow : 0, // Sunday is the first day of the week.\n doy : 6 // The week that contains Jan 1st is the first week of the year.\n};\n\nfunction localeFirstDayOfWeek () {\n return this._week.dow;\n}\n\nfunction localeFirstDayOfYear () {\n return this._week.doy;\n}\n\n// MOMENTS\n\nfunction getSetWeek (input) {\n var week = this.localeData().week(this);\n return input == null ? week : this.add((input - week) * 7, 'd');\n}\n\nfunction 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\naddFormatToken('d', 0, 'do', 'day');\n\naddFormatToken('dd', 0, 0, function (format) {\n return this.localeData().weekdaysMin(this, format);\n});\n\naddFormatToken('ddd', 0, 0, function (format) {\n return this.localeData().weekdaysShort(this, format);\n});\n\naddFormatToken('dddd', 0, 0, function (format) {\n return this.localeData().weekdays(this, format);\n});\n\naddFormatToken('e', 0, 0, 'weekday');\naddFormatToken('E', 0, 0, 'isoWeekday');\n\n// ALIASES\n\naddUnitAlias('day', 'd');\naddUnitAlias('weekday', 'e');\naddUnitAlias('isoWeekday', 'E');\n\n// PRIORITY\naddUnitPriority('day', 11);\naddUnitPriority('weekday', 11);\naddUnitPriority('isoWeekday', 11);\n\n// PARSING\n\naddRegexToken('d', match1to2);\naddRegexToken('e', match1to2);\naddRegexToken('E', match1to2);\naddRegexToken('dd', function (isStrict, locale) {\n return locale.weekdaysMinRegex(isStrict);\n});\naddRegexToken('ddd', function (isStrict, locale) {\n return locale.weekdaysShortRegex(isStrict);\n});\naddRegexToken('dddd', function (isStrict, locale) {\n return locale.weekdaysRegex(isStrict);\n});\n\naddWeekParseToken(['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\naddWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {\n week[token] = toInt(input);\n});\n\n// HELPERS\n\nfunction 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\nfunction 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\nvar defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');\nfunction localeWeekdays (m, format) {\n if (!m) {\n return isArray(this._weekdays) ? this._weekdays :\n this._weekdays['standalone'];\n }\n return isArray(this._weekdays) ? this._weekdays[m.day()] :\n this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()];\n}\n\nvar defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_');\nfunction localeWeekdaysShort (m) {\n return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort;\n}\n\nvar defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_');\nfunction localeWeekdaysMin (m) {\n return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin;\n}\n\nfunction handleStrictParse$1(weekdayName, format, strict) {\n var i, ii, mom, 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(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 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\nfunction 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('^' + 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 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 }\n // test the regex\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}\n\n// MOMENTS\n\nfunction 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\nfunction 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\nfunction 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\nvar defaultWeekdaysRegex = matchWord;\nfunction 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 : this._weekdaysRegex;\n }\n}\n\nvar defaultWeekdaysShortRegex = matchWord;\nfunction 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 : this._weekdaysShortRegex;\n }\n}\n\nvar defaultWeekdaysMinRegex = matchWord;\nfunction 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 : this._weekdaysMinRegex;\n }\n}\n\n\nfunction computeWeekdaysParse () {\n function cmpLenRev(a, b) {\n return b.length - a.length;\n }\n\n var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [],\n i, mom, minp, shortp, 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 = this.weekdaysMin(mom, '');\n shortp = this.weekdaysShort(mom, '');\n longp = 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 for (i = 0; i < 7; i++) {\n shortPieces[i] = regexEscape(shortPieces[i]);\n longPieces[i] = regexEscape(longPieces[i]);\n mixedPieces[i] = regexEscape(mixedPieces[i]);\n }\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('^(' + longPieces.join('|') + ')', 'i');\n this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i');\n}\n\n// FORMATTING\n\nfunction hFormat() {\n return this.hours() % 12 || 12;\n}\n\nfunction kFormat() {\n return this.hours() || 24;\n}\n\naddFormatToken('H', ['HH', 2], 0, 'hour');\naddFormatToken('h', ['hh', 2], 0, hFormat);\naddFormatToken('k', ['kk', 2], 0, kFormat);\n\naddFormatToken('hmm', 0, 0, function () {\n return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);\n});\n\naddFormatToken('hmmss', 0, 0, function () {\n return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) +\n zeroFill(this.seconds(), 2);\n});\n\naddFormatToken('Hmm', 0, 0, function () {\n return '' + this.hours() + zeroFill(this.minutes(), 2);\n});\n\naddFormatToken('Hmmss', 0, 0, function () {\n return '' + this.hours() + zeroFill(this.minutes(), 2) +\n zeroFill(this.seconds(), 2);\n});\n\nfunction meridiem (token, lowercase) {\n addFormatToken(token, 0, 0, function () {\n return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);\n });\n}\n\nmeridiem('a', true);\nmeridiem('A', false);\n\n// ALIASES\n\naddUnitAlias('hour', 'h');\n\n// PRIORITY\naddUnitPriority('hour', 13);\n\n// PARSING\n\nfunction matchMeridiem (isStrict, locale) {\n return locale._meridiemParse;\n}\n\naddRegexToken('a', matchMeridiem);\naddRegexToken('A', matchMeridiem);\naddRegexToken('H', match1to2);\naddRegexToken('h', match1to2);\naddRegexToken('k', match1to2);\naddRegexToken('HH', match1to2, match2);\naddRegexToken('hh', match1to2, match2);\naddRegexToken('kk', match1to2, match2);\n\naddRegexToken('hmm', match3to4);\naddRegexToken('hmmss', match5to6);\naddRegexToken('Hmm', match3to4);\naddRegexToken('Hmmss', match5to6);\n\naddParseToken(['H', 'HH'], HOUR);\naddParseToken(['k', 'kk'], function (input, array, config) {\n var kInput = toInt(input);\n array[HOUR] = kInput === 24 ? 0 : kInput;\n});\naddParseToken(['a', 'A'], function (input, array, config) {\n config._isPm = config._locale.isPM(input);\n config._meridiem = input;\n});\naddParseToken(['h', 'hh'], function (input, array, config) {\n array[HOUR] = toInt(input);\n getParsingFlags(config).bigHour = true;\n});\naddParseToken('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});\naddParseToken('hmmss', function (input, array, config) {\n var pos1 = input.length - 4;\n var 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});\naddParseToken('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});\naddParseToken('Hmmss', function (input, array, config) {\n var pos1 = input.length - 4;\n var 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\nfunction 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\nvar defaultLocaleMeridiemParse = /[ap]\\.?m?\\.?/i;\nfunction localeMeridiem (hours, minutes, isLower) {\n if (hours > 11) {\n return isLower ? 'pm' : 'PM';\n } else {\n return isLower ? 'am' : 'AM';\n }\n}\n\n\n// MOMENTS\n\n// Setting the hour should keep the time, because the user explicitly\n// specified which hour he wants. So trying to maintain the same hour (in\n// a new timezone) makes sense. Adding/subtracting hours does not follow\n// this rule.\nvar getSetHour = makeGetSet('Hours', true);\n\nvar 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\nvar locales = {};\nvar localeFamilies = {};\nvar globalLocale;\n\nfunction 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\nfunction chooseLocale(names) {\n var i = 0, j, next, locale, 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 (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {\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\nfunction loadLocale(name) {\n var oldLocale = null;\n // TODO: Find a better way to register and load all the locales in Node\n if (!locales[name] && (typeof module !== 'undefined') &&\n module && module.exports) {\n try {\n oldLocale = globalLocale._abbr;\n var aliasedRequire = require;\n aliasedRequire('./locale/' + name);\n getSetGlobalLocale(oldLocale);\n } catch (e) {}\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.\nfunction getSetGlobalLocale (key, values) {\n var data;\n if (key) {\n if (isUndefined(values)) {\n data = getLocale(key);\n }\n else {\n data = defineLocale(key, values);\n }\n\n if (data) {\n // moment.duration._locale = moment._locale = data;\n globalLocale = data;\n }\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\nfunction defineLocale (name, config) {\n if (config !== null) {\n var locale, parentConfig = baseConfig;\n config.abbr = name;\n if (locales[name] != null) {\n deprecateSimple('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 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\n return locales[name];\n } else {\n // useful for testing\n delete locales[name];\n return null;\n }\n}\n\nfunction updateLocale(name, config) {\n if (config != null) {\n var locale, tmpLocale, parentConfig = baseConfig;\n // MERGE\n tmpLocale = loadLocale(name);\n if (tmpLocale != null) {\n parentConfig = tmpLocale._config;\n }\n config = mergeConfigs(parentConfig, config);\n locale = new Locale(config);\n locale.parentLocale = locales[name];\n locales[name] = locale;\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 } else if (locales[name] != null) {\n delete locales[name];\n }\n }\n }\n return locales[name];\n}\n\n// returns locale data\nfunction 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\nfunction listLocales() {\n return keys(locales);\n}\n\nfunction checkOverflow (m) {\n var overflow;\n var a = m._a;\n\n if (a && getParsingFlags(m).overflow === -2) {\n overflow =\n a[MONTH] < 0 || a[MONTH] > 11 ? MONTH :\n a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE :\n a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR :\n a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE :\n a[SECOND] < 0 || a[SECOND] > 59 ? SECOND :\n a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND :\n -1;\n\n if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {\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// Pick the first defined of two or three arguments.\nfunction 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\nfunction currentDateArray(config) {\n // hooks is actually the exported moment object\n var nowValue = new Date(hooks.now());\n if (config._useUTC) {\n return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()];\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]\nfunction configFromArray (config) {\n var i, date, input = [], currentDate, expectedWeekday, 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 (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 }\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] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];\n }\n\n // Check for 24:00:00.000\n if (config._a[HOUR] === 24 &&\n config._a[MINUTE] === 0 &&\n config._a[SECOND] === 0 &&\n 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();\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 (config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday) {\n getParsingFlags(config).weekdayMismatch = true;\n }\n}\n\nfunction dayOfYearFromWeekInfo(config) {\n var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow;\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(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year);\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 var 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 begining of week\n weekday = w.e + dow;\n if (w.e < 0 || w.e > 6) {\n weekdayOverflow = true;\n }\n } else {\n // default to begining 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// 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)\nvar 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)?)?$/;\nvar 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\nvar tzRegex = /Z|[+-]\\d\\d(?::?\\d\\d)?/;\n\nvar 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 // YYYYMM is NOT allowed by the standard\n ['GGGG[W]WWE', /\\d{4}W\\d{3}/],\n ['GGGG[W]WW', /\\d{4}W\\d{2}/, false],\n ['YYYYDDD', /\\d{7}/]\n];\n\n// iso time formats and regexes\nvar 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\nvar aspNetJsonRegex = /^\\/?Date\\((\\-?\\d+)/i;\n\n// date from iso format\nfunction configFromISO(config) {\n var i, l,\n string = config._i,\n match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),\n allowTime, dateFormat, timeFormat, 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// RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3\nvar 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\nfunction extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) {\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\nfunction 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\nfunction 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, ' ').trim();\n}\n\nfunction checkWeekday(weekdayStr, parsedInput, config) {\n if (weekdayStr) {\n // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check.\n var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr),\n weekdayActual = new Date(parsedInput[0], parsedInput[1], parsedInput[2]).getDay();\n if (weekdayProvided !== weekdayActual) {\n getParsingFlags(config).weekdayMismatch = true;\n config._isValid = false;\n return false;\n }\n }\n return true;\n}\n\nvar 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\nfunction 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 var m = hm % 100, h = (hm - m) / 100;\n return h * 60 + m;\n }\n}\n\n// date and time from ref 2822 format\nfunction configFromRFC2822(config) {\n var match = rfc2822.exec(preprocessRFC2822(config._i));\n if (match) {\n var parsedArray = extractFromRFC2822Strings(match[4], match[3], match[2], match[5], match[6], match[7]);\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 iso format or fallback\nfunction 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 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 // Final attempt, use Input Fallback\n hooks.createFromInputFallback(config);\n}\n\nhooks.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 and will be removed in an upcoming major release. Please refer to ' +\n '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// constant that refers to the ISO standard\nhooks.ISO_8601 = function () {};\n\n// constant that refers to the RFC 2822 form\nhooks.RFC_2822 = function () {};\n\n// date from string and format string\nfunction 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, parsedInput, tokens, token, skipped,\n stringLength = string.length,\n totalParsedInputLength = 0;\n\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 // console.log('token', token, 'parsedInput', parsedInput,\n // 'regex', getParseRegexForToken(token, config));\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(string.indexOf(parsedInput) + parsedInput.length);\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 }\n else {\n getParsingFlags(config).unusedTokens.push(token);\n }\n addTimeToArrayFromToken(token, parsedInput, config);\n }\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 = 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 (config._a[HOUR] <= 12 &&\n getParsingFlags(config).bigHour === true &&\n 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;\n // handle meridiem\n config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem);\n\n configFromArray(config);\n checkOverflow(config);\n}\n\n\nfunction 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\nfunction configFromStringAndArray(config) {\n var tempConfig,\n bestMoment,\n\n scoreToBeat,\n i,\n currentScore;\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 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 continue;\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 (scoreToBeat == null || currentScore < scoreToBeat) {\n scoreToBeat = currentScore;\n bestMoment = tempConfig;\n }\n }\n\n extend(config, bestMoment || tempConfig);\n}\n\nfunction configFromObject(config) {\n if (config._d) {\n return;\n }\n\n var i = normalizeObjectUnits(config._i);\n config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) {\n return obj && parseInt(obj, 10);\n });\n\n configFromArray(config);\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction createLocalOrUTC (input, format, locale, strict, isUTC) {\n var c = {};\n\n if (locale === true || locale === false) {\n strict = locale;\n locale = undefined;\n }\n\n if ((isObject(input) && isObjectEmpty(input)) ||\n (isArray(input) && input.length === 0)) {\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\nfunction createLocal (input, format, locale, strict) {\n return createLocalOrUTC(input, format, locale, strict, false);\n}\n\nvar 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\nvar 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.\nfunction 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?\nfunction min () {\n var args = [].slice.call(arguments, 0);\n\n return pickBy('isBefore', args);\n}\n\nfunction max () {\n var args = [].slice.call(arguments, 0);\n\n return pickBy('isAfter', args);\n}\n\nvar now = function () {\n return Date.now ? Date.now() : +(new Date());\n};\n\nvar ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond'];\n\nfunction isDurationValid(m) {\n for (var key in m) {\n if (!(indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])))) {\n return false;\n }\n }\n\n var unitHasDecimal = false;\n for (var 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\nfunction isValid$1() {\n return this._isValid;\n}\n\nfunction createInvalid$1() {\n return createDuration(NaN);\n}\n\nfunction 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 || 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 = +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 +\n 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 +\n quarters * 3 +\n years * 12;\n\n this._data = {};\n\n this._locale = getLocale();\n\n this._bubble();\n}\n\nfunction isDuration (obj) {\n return obj instanceof Duration;\n}\n\nfunction absRound (number) {\n if (number < 0) {\n return Math.round(-1 * number) * -1;\n } else {\n return Math.round(number);\n }\n}\n\n// FORMATTING\n\nfunction offset (token, separator) {\n addFormatToken(token, 0, 0, function () {\n var offset = this.utcOffset();\n var sign = '+';\n if (offset < 0) {\n offset = -offset;\n sign = '-';\n }\n return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2);\n });\n}\n\noffset('Z', ':');\noffset('ZZ', '');\n\n// PARSING\n\naddRegexToken('Z', matchShortOffset);\naddRegexToken('ZZ', matchShortOffset);\naddParseToken(['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']\nvar chunkOffset = /([\\+\\-]|\\d\\d)/gi;\n\nfunction offsetFromString(matcher, string) {\n var matches = (string || '').match(matcher);\n\n if (matches === null) {\n return null;\n }\n\n var chunk = matches[matches.length - 1] || [];\n var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0];\n var minutes = +(parts[1] * 60) + toInt(parts[2]);\n\n return minutes === 0 ?\n 0 :\n parts[0] === '+' ? minutes : -minutes;\n}\n\n// Return a moment from input, that is local/utc/zone equivalent to model.\nfunction cloneWithOffset(input, model) {\n var res, diff;\n if (model._isUTC) {\n res = model.clone();\n diff = (isMoment(input) || isDate(input) ? input.valueOf() : 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\nfunction 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() / 15) * 15;\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.\nhooks.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.\nfunction 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(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 return this;\n } else {\n return this._isUTC ? offset : getDateOffset(this);\n }\n}\n\nfunction 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\nfunction setOffsetToUTC (keepLocalTime) {\n return this.utcOffset(0, keepLocalTime);\n}\n\nfunction 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\nfunction 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 }\n else {\n this.utcOffset(0, true);\n }\n }\n return this;\n}\n\nfunction 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\nfunction isDaylightSavingTime () {\n return (\n this.utcOffset() > this.clone().month(0).utcOffset() ||\n this.utcOffset() > this.clone().month(5).utcOffset()\n );\n}\n\nfunction isDaylightSavingTimeShifted () {\n if (!isUndefined(this._isDSTShifted)) {\n return this._isDSTShifted;\n }\n\n var c = {};\n\n copyConfig(c, this);\n c = prepareConfig(c);\n\n if (c._a) {\n var other = c._isUTC ? createUTC(c._a) : createLocal(c._a);\n this._isDSTShifted = this.isValid() &&\n compareArrays(c._a, other.toArray()) > 0;\n } else {\n this._isDSTShifted = false;\n }\n\n return this._isDSTShifted;\n}\n\nfunction isLocal () {\n return this.isValid() ? !this._isUTC : false;\n}\n\nfunction isUtcOffset () {\n return this.isValid() ? this._isUTC : false;\n}\n\nfunction isUtc () {\n return this.isValid() ? this._isUTC && this._offset === 0 : false;\n}\n\n// ASP.NET json date format regex\nvar aspNetRegex = /^(\\-|\\+)?(?:(\\d*)[. ])?(\\d+)\\:(\\d+)(?:\\:(\\d+)(\\.\\d*)?)?$/;\n\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\nvar 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\nfunction 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)) {\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 : (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) {// 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\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 return ret;\n}\n\ncreateDuration.fn = Duration.prototype;\ncreateDuration.invalid = createInvalid$1;\n\nfunction 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\nfunction positiveMomentsDifference(base, other) {\n var res = {milliseconds: 0, months: 0};\n\n res.months = other.month() - base.month() +\n (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\nfunction 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\nfunction 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(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' +\n 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.');\n tmp = val; val = period; period = tmp;\n }\n\n val = typeof val === 'string' ? +val : val;\n dur = createDuration(val, period);\n addSubtract(this, dur, direction);\n return this;\n };\n}\n\nfunction 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\nvar add = createAdder(1, 'add');\nvar subtract = createAdder(-1, 'subtract');\n\nfunction getCalendarFormat(myMoment, now) {\n var diff = myMoment.diff(now, 'days', true);\n return diff < -6 ? 'sameElse' :\n diff < -1 ? 'lastWeek' :\n diff < 0 ? 'lastDay' :\n diff < 1 ? 'sameDay' :\n diff < 2 ? 'nextDay' :\n diff < 7 ? 'nextWeek' : 'sameElse';\n}\n\nfunction calendar$1 (time, formats) {\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\n var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]);\n\n return this.format(output || this.localeData().calendar(format, this, createLocal(now)));\n}\n\nfunction clone () {\n return new Moment(this);\n}\n\nfunction isAfter (input, units) {\n var localInput = isMoment(input) ? input : createLocal(input);\n if (!(this.isValid() && localInput.isValid())) {\n return false;\n }\n units = normalizeUnits(!isUndefined(units) ? 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\nfunction isBefore (input, units) {\n var localInput = isMoment(input) ? input : createLocal(input);\n if (!(this.isValid() && localInput.isValid())) {\n return false;\n }\n units = normalizeUnits(!isUndefined(units) ? 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\nfunction isBetween (from, to, units, inclusivity) {\n inclusivity = inclusivity || '()';\n return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) &&\n (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units));\n}\n\nfunction 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 this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf();\n }\n}\n\nfunction isSameOrAfter (input, units) {\n return this.isSame(input, units) || this.isAfter(input,units);\n}\n\nfunction isSameOrBefore (input, units) {\n return this.isSame(input, units) || this.isBefore(input,units);\n}\n\nfunction diff (input, units, asFloat) {\n var that,\n zoneDelta,\n 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': output = monthDiff(this, that) / 12; break;\n case 'month': output = monthDiff(this, that); break;\n case 'quarter': output = monthDiff(this, that) / 3; break;\n case 'second': output = (this - that) / 1e3; break; // 1000\n case 'minute': output = (this - that) / 6e4; break; // 1000 * 60\n case 'hour': output = (this - that) / 36e5; break; // 1000 * 60 * 60\n case 'day': output = (this - that - zoneDelta) / 864e5; break; // 1000 * 60 * 60 * 24, negate dst\n case 'week': output = (this - that - zoneDelta) / 6048e5; break; // 1000 * 60 * 60 * 24 * 7, negate dst\n default: output = this - that;\n }\n\n return asFloat ? output : absFloor(output);\n}\n\nfunction monthDiff (a, b) {\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, 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\nhooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';\nhooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';\n\nfunction toString () {\n return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');\n}\n\nfunction toISOString(keepOffset) {\n if (!this.isValid()) {\n return null;\n }\n var utc = keepOffset !== true;\n var m = utc ? this.clone().utc() : this;\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 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 return formatMoment(m, utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ');\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 */\nfunction inspect () {\n if (!this.isValid()) {\n return 'moment.invalid(/* ' + this._i + ' */)';\n }\n var func = 'moment';\n var zone = '';\n if (!this.isLocal()) {\n func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';\n zone = 'Z';\n }\n var prefix = '[' + func + '(\"]';\n var year = (0 <= this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY';\n var datetime = '-MM-DD[T]HH:mm:ss.SSS';\n var suffix = zone + '[\")]';\n\n return this.format(prefix + year + datetime + suffix);\n}\n\nfunction format (inputString) {\n if (!inputString) {\n inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat;\n }\n var output = formatMoment(this, inputString);\n return this.localeData().postformat(output);\n}\n\nfunction from (time, withoutSuffix) {\n if (this.isValid() &&\n ((isMoment(time) && time.isValid()) ||\n createLocal(time).isValid())) {\n return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix);\n } else {\n return this.localeData().invalidDate();\n }\n}\n\nfunction fromNow (withoutSuffix) {\n return this.from(createLocal(), withoutSuffix);\n}\n\nfunction to (time, withoutSuffix) {\n if (this.isValid() &&\n ((isMoment(time) && time.isValid()) ||\n createLocal(time).isValid())) {\n return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix);\n } else {\n return this.localeData().invalidDate();\n }\n}\n\nfunction 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.\nfunction 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\nvar 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\nfunction localeData () {\n return this._locale;\n}\n\nfunction startOf (units) {\n units = normalizeUnits(units);\n // the following switch intentionally omits break keywords\n // to utilize falling through the cases.\n switch (units) {\n case 'year':\n this.month(0);\n /* falls through */\n case 'quarter':\n case 'month':\n this.date(1);\n /* falls through */\n case 'week':\n case 'isoWeek':\n case 'day':\n case 'date':\n this.hours(0);\n /* falls through */\n case 'hour':\n this.minutes(0);\n /* falls through */\n case 'minute':\n this.seconds(0);\n /* falls through */\n case 'second':\n this.milliseconds(0);\n }\n\n // weeks are a special case\n if (units === 'week') {\n this.weekday(0);\n }\n if (units === 'isoWeek') {\n this.isoWeekday(1);\n }\n\n // quarters are also special\n if (units === 'quarter') {\n this.month(Math.floor(this.month() / 3) * 3);\n }\n\n return this;\n}\n\nfunction endOf (units) {\n units = normalizeUnits(units);\n if (units === undefined || units === 'millisecond') {\n return this;\n }\n\n // 'date' is an alias for 'day', so it should be considered as such.\n if (units === 'date') {\n units = 'day';\n }\n\n return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms');\n}\n\nfunction valueOf () {\n return this._d.valueOf() - ((this._offset || 0) * 60000);\n}\n\nfunction unix () {\n return Math.floor(this.valueOf() / 1000);\n}\n\nfunction toDate () {\n return new Date(this.valueOf());\n}\n\nfunction toArray () {\n var m = this;\n return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()];\n}\n\nfunction 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\nfunction toJSON () {\n // new Date(NaN).toJSON() === null\n return this.isValid() ? this.toISOString() : null;\n}\n\nfunction isValid$2 () {\n return isValid(this);\n}\n\nfunction parsingFlags () {\n return extend({}, getParsingFlags(this));\n}\n\nfunction invalidAt () {\n return getParsingFlags(this).overflow;\n}\n\nfunction 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// FORMATTING\n\naddFormatToken(0, ['gg', 2], 0, function () {\n return this.weekYear() % 100;\n});\n\naddFormatToken(0, ['GG', 2], 0, function () {\n return this.isoWeekYear() % 100;\n});\n\nfunction addWeekYearFormatToken (token, getter) {\n addFormatToken(0, [token, token.length], 0, getter);\n}\n\naddWeekYearFormatToken('gggg', 'weekYear');\naddWeekYearFormatToken('ggggg', 'weekYear');\naddWeekYearFormatToken('GGGG', 'isoWeekYear');\naddWeekYearFormatToken('GGGGG', 'isoWeekYear');\n\n// ALIASES\n\naddUnitAlias('weekYear', 'gg');\naddUnitAlias('isoWeekYear', 'GG');\n\n// PRIORITY\n\naddUnitPriority('weekYear', 1);\naddUnitPriority('isoWeekYear', 1);\n\n\n// PARSING\n\naddRegexToken('G', matchSigned);\naddRegexToken('g', matchSigned);\naddRegexToken('GG', match1to2, match2);\naddRegexToken('gg', match1to2, match2);\naddRegexToken('GGGG', match1to4, match4);\naddRegexToken('gggg', match1to4, match4);\naddRegexToken('GGGGG', match1to6, match6);\naddRegexToken('ggggg', match1to6, match6);\n\naddWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) {\n week[token.substr(0, 2)] = toInt(input);\n});\n\naddWeekParseToken(['gg', 'GG'], function (input, week, config, token) {\n week[token] = hooks.parseTwoDigitYear(input);\n});\n\n// MOMENTS\n\nfunction getSetWeekYear (input) {\n return getSetWeekYearHelper.call(this,\n input,\n this.week(),\n this.weekday(),\n this.localeData()._week.dow,\n this.localeData()._week.doy);\n}\n\nfunction getSetISOWeekYear (input) {\n return getSetWeekYearHelper.call(this,\n input, this.isoWeek(), this.isoWeekday(), 1, 4);\n}\n\nfunction getISOWeeksInYear () {\n return weeksInYear(this.year(), 1, 4);\n}\n\nfunction getWeeksInYear () {\n var weekInfo = this.localeData()._week;\n return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);\n}\n\nfunction 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\nfunction 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\naddFormatToken('Q', 0, 'Qo', 'quarter');\n\n// ALIASES\n\naddUnitAlias('quarter', 'Q');\n\n// PRIORITY\n\naddUnitPriority('quarter', 7);\n\n// PARSING\n\naddRegexToken('Q', match1);\naddParseToken('Q', function (input, array) {\n array[MONTH] = (toInt(input) - 1) * 3;\n});\n\n// MOMENTS\n\nfunction getSetQuarter (input) {\n return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);\n}\n\n// FORMATTING\n\naddFormatToken('D', ['DD', 2], 'Do', 'date');\n\n// ALIASES\n\naddUnitAlias('date', 'D');\n\n// PRIOROITY\naddUnitPriority('date', 9);\n\n// PARSING\n\naddRegexToken('D', match1to2);\naddRegexToken('DD', match1to2, match2);\naddRegexToken('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\naddParseToken(['D', 'DD'], DATE);\naddParseToken('Do', function (input, array) {\n array[DATE] = toInt(input.match(match1to2)[0]);\n});\n\n// MOMENTS\n\nvar getSetDayOfMonth = makeGetSet('Date', true);\n\n// FORMATTING\n\naddFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');\n\n// ALIASES\n\naddUnitAlias('dayOfYear', 'DDD');\n\n// PRIORITY\naddUnitPriority('dayOfYear', 4);\n\n// PARSING\n\naddRegexToken('DDD', match1to3);\naddRegexToken('DDDD', match3);\naddParseToken(['DDD', 'DDDD'], function (input, array, config) {\n config._dayOfYear = toInt(input);\n});\n\n// HELPERS\n\n// MOMENTS\n\nfunction 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}\n\n// FORMATTING\n\naddFormatToken('m', ['mm', 2], 0, 'minute');\n\n// ALIASES\n\naddUnitAlias('minute', 'm');\n\n// PRIORITY\n\naddUnitPriority('minute', 14);\n\n// PARSING\n\naddRegexToken('m', match1to2);\naddRegexToken('mm', match1to2, match2);\naddParseToken(['m', 'mm'], MINUTE);\n\n// MOMENTS\n\nvar getSetMinute = makeGetSet('Minutes', false);\n\n// FORMATTING\n\naddFormatToken('s', ['ss', 2], 0, 'second');\n\n// ALIASES\n\naddUnitAlias('second', 's');\n\n// PRIORITY\n\naddUnitPriority('second', 15);\n\n// PARSING\n\naddRegexToken('s', match1to2);\naddRegexToken('ss', match1to2, match2);\naddParseToken(['s', 'ss'], SECOND);\n\n// MOMENTS\n\nvar getSetSecond = makeGetSet('Seconds', false);\n\n// FORMATTING\n\naddFormatToken('S', 0, 0, function () {\n return ~~(this.millisecond() / 100);\n});\n\naddFormatToken(0, ['SS', 2], 0, function () {\n return ~~(this.millisecond() / 10);\n});\n\naddFormatToken(0, ['SSS', 3], 0, 'millisecond');\naddFormatToken(0, ['SSSS', 4], 0, function () {\n return this.millisecond() * 10;\n});\naddFormatToken(0, ['SSSSS', 5], 0, function () {\n return this.millisecond() * 100;\n});\naddFormatToken(0, ['SSSSSS', 6], 0, function () {\n return this.millisecond() * 1000;\n});\naddFormatToken(0, ['SSSSSSS', 7], 0, function () {\n return this.millisecond() * 10000;\n});\naddFormatToken(0, ['SSSSSSSS', 8], 0, function () {\n return this.millisecond() * 100000;\n});\naddFormatToken(0, ['SSSSSSSSS', 9], 0, function () {\n return this.millisecond() * 1000000;\n});\n\n\n// ALIASES\n\naddUnitAlias('millisecond', 'ms');\n\n// PRIORITY\n\naddUnitPriority('millisecond', 16);\n\n// PARSING\n\naddRegexToken('S', match1to3, match1);\naddRegexToken('SS', match1to3, match2);\naddRegexToken('SSS', match1to3, match3);\n\nvar token;\nfor (token = 'SSSS'; token.length <= 9; token += 'S') {\n addRegexToken(token, matchUnsigned);\n}\n\nfunction parseMs(input, array) {\n array[MILLISECOND] = toInt(('0.' + input) * 1000);\n}\n\nfor (token = 'S'; token.length <= 9; token += 'S') {\n addParseToken(token, parseMs);\n}\n// MOMENTS\n\nvar getSetMillisecond = makeGetSet('Milliseconds', false);\n\n// FORMATTING\n\naddFormatToken('z', 0, 0, 'zoneAbbr');\naddFormatToken('zz', 0, 0, 'zoneName');\n\n// MOMENTS\n\nfunction getZoneAbbr () {\n return this._isUTC ? 'UTC' : '';\n}\n\nfunction getZoneName () {\n return this._isUTC ? 'Coordinated Universal Time' : '';\n}\n\nvar proto = Moment.prototype;\n\nproto.add = add;\nproto.calendar = calendar$1;\nproto.clone = clone;\nproto.diff = diff;\nproto.endOf = endOf;\nproto.format = format;\nproto.from = from;\nproto.fromNow = fromNow;\nproto.to = to;\nproto.toNow = toNow;\nproto.get = stringGet;\nproto.invalidAt = invalidAt;\nproto.isAfter = isAfter;\nproto.isBefore = isBefore;\nproto.isBetween = isBetween;\nproto.isSame = isSame;\nproto.isSameOrAfter = isSameOrAfter;\nproto.isSameOrBefore = isSameOrBefore;\nproto.isValid = isValid$2;\nproto.lang = lang;\nproto.locale = locale;\nproto.localeData = localeData;\nproto.max = prototypeMax;\nproto.min = prototypeMin;\nproto.parsingFlags = parsingFlags;\nproto.set = stringSet;\nproto.startOf = startOf;\nproto.subtract = subtract;\nproto.toArray = toArray;\nproto.toObject = toObject;\nproto.toDate = toDate;\nproto.toISOString = toISOString;\nproto.inspect = inspect;\nproto.toJSON = toJSON;\nproto.toString = toString;\nproto.unix = unix;\nproto.valueOf = valueOf;\nproto.creationData = creationData;\nproto.year = getSetYear;\nproto.isLeapYear = getIsLeapYear;\nproto.weekYear = getSetWeekYear;\nproto.isoWeekYear = getSetISOWeekYear;\nproto.quarter = proto.quarters = getSetQuarter;\nproto.month = getSetMonth;\nproto.daysInMonth = getDaysInMonth;\nproto.week = proto.weeks = getSetWeek;\nproto.isoWeek = proto.isoWeeks = getSetISOWeek;\nproto.weeksInYear = getWeeksInYear;\nproto.isoWeeksInYear = getISOWeeksInYear;\nproto.date = getSetDayOfMonth;\nproto.day = proto.days = getSetDayOfWeek;\nproto.weekday = getSetLocaleDayOfWeek;\nproto.isoWeekday = getSetISODayOfWeek;\nproto.dayOfYear = getSetDayOfYear;\nproto.hour = proto.hours = getSetHour;\nproto.minute = proto.minutes = getSetMinute;\nproto.second = proto.seconds = getSetSecond;\nproto.millisecond = proto.milliseconds = getSetMillisecond;\nproto.utcOffset = getSetOffset;\nproto.utc = setOffsetToUTC;\nproto.local = setOffsetToLocal;\nproto.parseZone = setOffsetToParsedOffset;\nproto.hasAlignedHourOffset = hasAlignedHourOffset;\nproto.isDST = isDaylightSavingTime;\nproto.isLocal = isLocal;\nproto.isUtcOffset = isUtcOffset;\nproto.isUtc = isUtc;\nproto.isUTC = isUtc;\nproto.zoneAbbr = getZoneAbbr;\nproto.zoneName = getZoneName;\nproto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth);\nproto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth);\nproto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear);\nproto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone);\nproto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted);\n\nfunction createUnix (input) {\n return createLocal(input * 1000);\n}\n\nfunction createInZone () {\n return createLocal.apply(null, arguments).parseZone();\n}\n\nfunction preParsePostFormat (string) {\n return string;\n}\n\nvar proto$1 = Locale.prototype;\n\nproto$1.calendar = calendar;\nproto$1.longDateFormat = longDateFormat;\nproto$1.invalidDate = invalidDate;\nproto$1.ordinal = ordinal;\nproto$1.preparse = preParsePostFormat;\nproto$1.postformat = preParsePostFormat;\nproto$1.relativeTime = relativeTime;\nproto$1.pastFuture = pastFuture;\nproto$1.set = set;\n\nproto$1.months = localeMonths;\nproto$1.monthsShort = localeMonthsShort;\nproto$1.monthsParse = localeMonthsParse;\nproto$1.monthsRegex = monthsRegex;\nproto$1.monthsShortRegex = monthsShortRegex;\nproto$1.week = localeWeek;\nproto$1.firstDayOfYear = localeFirstDayOfYear;\nproto$1.firstDayOfWeek = localeFirstDayOfWeek;\n\nproto$1.weekdays = localeWeekdays;\nproto$1.weekdaysMin = localeWeekdaysMin;\nproto$1.weekdaysShort = localeWeekdaysShort;\nproto$1.weekdaysParse = localeWeekdaysParse;\n\nproto$1.weekdaysRegex = weekdaysRegex;\nproto$1.weekdaysShortRegex = weekdaysShortRegex;\nproto$1.weekdaysMinRegex = weekdaysMinRegex;\n\nproto$1.isPM = localeIsPM;\nproto$1.meridiem = localeMeridiem;\n\nfunction get$1 (format, index, field, setter) {\n var locale = getLocale();\n var utc = createUTC().set(setter, index);\n return locale[field](utc, format);\n}\n\nfunction 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 var 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)\nfunction 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\n if (index != null) {\n return get$1(format, (index + shift) % 7, field, 'day');\n }\n\n var i;\n var out = [];\n for (i = 0; i < 7; i++) {\n out[i] = get$1(format, (i + shift) % 7, field, 'day');\n }\n return out;\n}\n\nfunction listMonths (format, index) {\n return listMonthsImpl(format, index, 'months');\n}\n\nfunction listMonthsShort (format, index) {\n return listMonthsImpl(format, index, 'monthsShort');\n}\n\nfunction listWeekdays (localeSorted, format, index) {\n return listWeekdaysImpl(localeSorted, format, index, 'weekdays');\n}\n\nfunction listWeekdaysShort (localeSorted, format, index) {\n return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');\n}\n\nfunction listWeekdaysMin (localeSorted, format, index) {\n return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');\n}\n\ngetSetGlobalLocale('en', {\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' :\n (b === 1) ? 'st' :\n (b === 2) ? 'nd' :\n (b === 3) ? 'rd' : 'th';\n return number + output;\n }\n});\n\n// Side effect imports\n\nhooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale);\nhooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale);\n\nvar mathAbs = Math.abs;\n\nfunction 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\nfunction 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)\nfunction 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)\nfunction subtract$1 (input, value) {\n return addSubtract$1(this, input, value, -1);\n}\n\nfunction absCeil (number) {\n if (number < 0) {\n return Math.floor(number);\n } else {\n return Math.ceil(number);\n }\n}\n\nfunction bubble () {\n var milliseconds = this._milliseconds;\n var days = this._days;\n var months = this._months;\n var data = this._data;\n var seconds, minutes, hours, years, 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 (!((milliseconds >= 0 && days >= 0 && months >= 0) ||\n (milliseconds <= 0 && days <= 0 && months <= 0))) {\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\nfunction 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\nfunction monthsToDays (months) {\n // the reverse of daysToMonths\n return months * 146097 / 4800;\n}\n\nfunction as (units) {\n if (!this.isValid()) {\n return NaN;\n }\n var days;\n var months;\n var milliseconds = this._milliseconds;\n\n units = normalizeUnits(units);\n\n if (units === 'month' || units === 'year') {\n days = this._days + milliseconds / 864e5;\n months = this._months + daysToMonths(days);\n return units === 'month' ? months : months / 12;\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' : return days / 7 + milliseconds / 6048e5;\n case 'day' : return days + milliseconds / 864e5;\n case 'hour' : return days * 24 + milliseconds / 36e5;\n case 'minute' : return days * 1440 + milliseconds / 6e4;\n case 'second' : return days * 86400 + milliseconds / 1000;\n // Math.floor prevents floating point math errors here\n case 'millisecond': return Math.floor(days * 864e5) + milliseconds;\n default: throw new Error('Unknown unit ' + units);\n }\n }\n}\n\n// TODO: Use this.as('ms')?\nfunction 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\nfunction makeAs (alias) {\n return function () {\n return this.as(alias);\n };\n}\n\nvar asMilliseconds = makeAs('ms');\nvar asSeconds = makeAs('s');\nvar asMinutes = makeAs('m');\nvar asHours = makeAs('h');\nvar asDays = makeAs('d');\nvar asWeeks = makeAs('w');\nvar asMonths = makeAs('M');\nvar asYears = makeAs('y');\n\nfunction clone$1 () {\n return createDuration(this);\n}\n\nfunction get$2 (units) {\n units = normalizeUnits(units);\n return this.isValid() ? this[units + 's']() : NaN;\n}\n\nfunction makeGetter(name) {\n return function () {\n return this.isValid() ? this._data[name] : NaN;\n };\n}\n\nvar milliseconds = makeGetter('milliseconds');\nvar seconds = makeGetter('seconds');\nvar minutes = makeGetter('minutes');\nvar hours = makeGetter('hours');\nvar days = makeGetter('days');\nvar months = makeGetter('months');\nvar years = makeGetter('years');\n\nfunction weeks () {\n return absFloor(this.days() / 7);\n}\n\nvar round = Math.round;\nvar 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\n M : 11 // months to year\n};\n\n// helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize\nfunction substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {\n return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);\n}\n\nfunction relativeTime$1 (posNegDuration, withoutSuffix, locale) {\n var duration = createDuration(posNegDuration).abs();\n var seconds = round(duration.as('s'));\n var minutes = round(duration.as('m'));\n var hours = round(duration.as('h'));\n var days = round(duration.as('d'));\n var months = round(duration.as('M'));\n var years = round(duration.as('y'));\n\n var a = 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 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\nfunction 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\nfunction 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\nfunction humanize (withSuffix) {\n if (!this.isValid()) {\n return this.localeData().invalidDate();\n }\n\n var locale = this.localeData();\n var output = relativeTime$1(this, !withSuffix, locale);\n\n if (withSuffix) {\n output = locale.pastFuture(+this, output);\n }\n\n return locale.postformat(output);\n}\n\nvar abs$1 = Math.abs;\n\nfunction sign(x) {\n return ((x > 0) - (x < 0)) || +x;\n}\n\nfunction 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 var days = abs$1(this._days);\n var months = abs$1(this._months);\n var minutes, hours, years;\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\n // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js\n var Y = years;\n var M = months;\n var D = days;\n var h = hours;\n var m = minutes;\n var s = seconds ? seconds.toFixed(3).replace(/\\.?0+$/, '') : '';\n var total = this.asSeconds();\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 var totalSign = total < 0 ? '-' : '';\n var ymSign = sign(this._months) !== sign(total) ? '-' : '';\n var daysSign = sign(this._days) !== sign(total) ? '-' : '';\n var hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : '';\n\n return totalSign + 'P' +\n (Y ? ymSign + Y + 'Y' : '') +\n (M ? ymSign + M + 'M' : '') +\n (D ? daysSign + D + 'D' : '') +\n ((h || m || s) ? 'T' : '') +\n (h ? hmsSign + h + 'H' : '') +\n (m ? hmsSign + m + 'M' : '') +\n (s ? hmsSign + s + 'S' : '');\n}\n\nvar proto$2 = Duration.prototype;\n\nproto$2.isValid = isValid$1;\nproto$2.abs = abs;\nproto$2.add = add$1;\nproto$2.subtract = subtract$1;\nproto$2.as = as;\nproto$2.asMilliseconds = asMilliseconds;\nproto$2.asSeconds = asSeconds;\nproto$2.asMinutes = asMinutes;\nproto$2.asHours = asHours;\nproto$2.asDays = asDays;\nproto$2.asWeeks = asWeeks;\nproto$2.asMonths = asMonths;\nproto$2.asYears = asYears;\nproto$2.valueOf = valueOf$1;\nproto$2._bubble = bubble;\nproto$2.clone = clone$1;\nproto$2.get = get$2;\nproto$2.milliseconds = milliseconds;\nproto$2.seconds = seconds;\nproto$2.minutes = minutes;\nproto$2.hours = hours;\nproto$2.days = days;\nproto$2.weeks = weeks;\nproto$2.months = months;\nproto$2.years = years;\nproto$2.humanize = humanize;\nproto$2.toISOString = toISOString$1;\nproto$2.toString = toISOString$1;\nproto$2.toJSON = toISOString$1;\nproto$2.locale = locale;\nproto$2.localeData = localeData;\n\nproto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1);\nproto$2.lang = lang;\n\n// Side effect imports\n\n// FORMATTING\n\naddFormatToken('X', 0, 0, 'unix');\naddFormatToken('x', 0, 0, 'valueOf');\n\n// PARSING\n\naddRegexToken('x', matchSigned);\naddRegexToken('X', matchTimestamp);\naddParseToken('X', function (input, array, config) {\n config._d = new Date(parseFloat(input, 10) * 1000);\n});\naddParseToken('x', function (input, array, config) {\n config._d = new Date(toInt(input));\n});\n\n// Side effect imports\n\n\nhooks.version = '2.21.0';\n\nsetHookCallback(createLocal);\n\nhooks.fn = proto;\nhooks.min = min;\nhooks.max = max;\nhooks.now = now;\nhooks.utc = createUTC;\nhooks.unix = createUnix;\nhooks.months = listMonths;\nhooks.isDate = isDate;\nhooks.locale = getSetGlobalLocale;\nhooks.invalid = createInvalid;\nhooks.duration = createDuration;\nhooks.isMoment = isMoment;\nhooks.weekdays = listWeekdays;\nhooks.parseZone = createInZone;\nhooks.localeData = getLocale;\nhooks.isDuration = isDuration;\nhooks.monthsShort = listMonthsShort;\nhooks.weekdaysMin = listWeekdaysMin;\nhooks.defineLocale = defineLocale;\nhooks.updateLocale = updateLocale;\nhooks.locales = listLocales;\nhooks.weekdaysShort = listWeekdaysShort;\nhooks.normalizeUnits = normalizeUnits;\nhooks.relativeTimeRounding = getSetRelativeTimeRounding;\nhooks.relativeTimeThreshold = getSetRelativeTimeThreshold;\nhooks.calendarFormat = getCalendarFormat;\nhooks.prototype = proto;\n\n// currently HTML5 input type only supports 24-hour formats\nhooks.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: 'YYYY-[W]WW', // <input type=\"week\" />\n MONTH: 'YYYY-MM' // <input type=\"month\" />\n};\n\nreturn hooks;\n\n})));\n","\nvar options = exports.options = require('./options');\n\nexports.parser = require('./parsers/parser');\nexports.refiner = require('./refiners/refiner');\n\nexports.Parser = exports.parser.Parser;\nexports.Refiner = exports.refiner.Refiner;\nexports.Filter = exports.refiner.Filter;\n\nexports.ParsedResult = require('./result').ParsedResult;\nexports.ParsedComponents = require('./result').ParsedComponents;\n\nvar Chrono = function(option) {\n\n option = option || exports.options.casualOption();\n this.parsers = new Object(option.parsers);\n this.refiners = new Object(option.refiners);\n};\n\n\nChrono.prototype.parse = function(text, refDate, opt) {\n\n refDate = refDate || new Date();\n opt = opt || {};\n opt.forwardDate = opt.forwardDate || opt.forwardDate;\n \n var allResults = [];\n\n this.parsers.forEach(function (parser) {\n var results = parser.execute(text, refDate, opt);\n allResults = allResults.concat(results);\n });\n\n allResults.sort(function(a, b) {\n return a.index - b.index;\n });\n\n this.refiners.forEach(function (refiner) {\n allResults = refiner.refine(text, allResults, opt);\n });\n \n return allResults;\n};\n\n\nChrono.prototype.parseDate = function(text, refDate, opt) {\n var results = this.parse(text, refDate, opt);\n if (results.length > 0) {\n return results[0].start.date();\n }\n return null;\n};\n\nexports.Chrono = Chrono;\nexports.strict = new Chrono( options.strictOption() );\nexports.casual = new Chrono( options.casualOption() );\n\nexports.en = new Chrono( options.mergeOptions([\n options.en.casual, options.commonPostProcessing]));\n\nexports.en_GB = new Chrono( options.mergeOptions([\n options.en_GB.casual, options.commonPostProcessing]));\n\nexports.de = new Chrono( options.mergeOptions([\n options.de.casual, options.en, options.commonPostProcessing]));\n\nexports.es = new Chrono( options.mergeOptions([\n options.es.casual, options.en, options.commonPostProcessing]));\n\nexports.fr = new Chrono( options.mergeOptions([\n options.fr.casual, options.en, options.commonPostProcessing]));\n\nexports.ja = new Chrono( options.mergeOptions([ \n options.ja.casual, options.en, options.commonPostProcessing]));\n\n\nexports.parse = function () {\n return exports.casual.parse.apply(exports.casual, arguments);\n};\n\nexports.parseDate = function () {\n return exports.casual.parseDate.apply(exports.casual, arguments);\n};\n\n\n\n\n","var parser = require('./parsers/parser');\nvar refiner = require('./refiners/refiner');\n\n\nexports.mergeOptions = function(options) {\n\n var addedTypes = {};\n var mergedOption = {\n parsers: [],\n refiners: []\n };\n\n options.forEach(function (option) {\n\n if (option.call) {\n option = option.call();\n }\n\n if (option.parsers) {\n option.parsers.forEach(function (p) {\n if (!addedTypes[p.constructor]) {\n mergedOption.parsers.push(p);\n addedTypes[p.constructor] = true;\n }\n });\n }\n\n if (option.refiners) {\n option.refiners.forEach(function (r) {\n if (!addedTypes[r.constructor]) {\n mergedOption.refiners.push(r);\n addedTypes[r.constructor] = true;\n }\n });\n }\n });\n\n return mergedOption;\n};\n\n\nexports.commonPostProcessing = function() {\n return {\n refiners: [\n // These should be after all other refiners\n new refiner.ExtractTimezoneOffsetRefiner(),\n new refiner.ExtractTimezoneAbbrRefiner(),\n new refiner.UnlikelyFormatFilter()\n ]\n }\n};\n\n\n// -------------------------------------------------------------\n\nexports.strictOption = function () {\n var strictConfig = {\n strict: true\n };\n\n return exports.mergeOptions([\n exports.en(strictConfig),\n exports.de(strictConfig),\n exports.es(strictConfig),\n exports.fr(strictConfig),\n exports.ja(strictConfig),\n exports.zh,\n exports.commonPostProcessing\n ]);\n};\n\nexports.casualOption = function () {\n return exports.mergeOptions([\n exports.en.casual,\n // Some German abbriviate overlap with common English\n exports.de({ strict: true }), \n exports.es.casual,\n exports.fr.casual,\n exports.ja.casual,\n exports.zh,\n exports.commonPostProcessing\n ]);\n};\n\n// -------------------------------------------------------------\n\nexports.de = function(config) {\n return {\n parsers: [\n new parser.DEDeadlineFormatParser(config),\n new parser.DEMonthNameLittleEndianParser(config),\n new parser.DEMonthNameParser(config),\n new parser.DESlashDateFormatParser(config),\n new parser.DETimeAgoFormatParser(config),\n new parser.DETimeExpressionParser(config)\n ],\n refiners: [\n new refiner.OverlapRemovalRefiner(),\n new refiner.ForwardDateRefiner(),\n new refiner.DEMergeDateTimeRefiner(),\n new refiner.DEMergeDateRangeRefiner()\n ]\n }\n};\n\nexports.de.casual = function() {\n var option = exports.de({\n strict: false\n });\n option.parsers.unshift(new parser.DECasualDateParser());\n option.parsers.unshift(new parser.DEWeekdayParser());\n return option;\n};\n\n\n\n// -------------------------------------------------------------\n\n\nexports.en = function(config) {\n return {\n parsers: [\n new parser.ENISOFormatParser(config),\n new parser.ENDeadlineFormatParser(config),\n new parser.ENMonthNameLittleEndianParser(config),\n new parser.ENMonthNameMiddleEndianParser(config),\n new parser.ENMonthNameParser(config),\n new parser.ENSlashDateFormatParser(config),\n new parser.ENSlashDateFormatStartWithYearParser(config),\n new parser.ENSlashMonthFormatParser(config),\n new parser.ENTimeAgoFormatParser(config),\n new parser.ENTimeLaterFormatParser(config),\n new parser.ENTimeExpressionParser(config)\n ],\n refiners: [\n new refiner.OverlapRemovalRefiner(),\n new refiner.ForwardDateRefiner(),\n\n // English\n new refiner.ENMergeDateTimeRefiner(),\n new refiner.ENMergeDateRangeRefiner(),\n new refiner.ENPrioritizeSpecificDateRefiner()\n ]\n }\n};\n\nexports.en.casual = function(config) {\n config = config || {};\n config.strict = false;\n var option = exports.en(config);\n\n // en\n option.parsers.unshift(new parser.ENCasualDateParser());\n option.parsers.unshift(new parser.ENCasualTimeParser());\n option.parsers.unshift(new parser.ENWeekdayParser());\n option.parsers.unshift(new parser.ENRelativeDateFormatParser());\n return option;\n};\n\n\nexports.en_GB = function(config) {\n config = config || {};\n config.littleEndian = true;\n return exports.en(config);\n}\n\nexports.en_GB.casual = function(config) {\n config = config || {};\n config.littleEndian = true;\n return exports.en.casual(config);\n}\n\n// -------------------------------------------------------------\n\nexports.ja = function() {\n return {\n parsers: [\n new parser.JPStandardParser()\n ],\n refiners: [\n new refiner.OverlapRemovalRefiner(),\n new refiner.ForwardDateRefiner(),\n new refiner.JPMergeDateRangeRefiner()\n ]\n }\n};\n\nexports.ja.casual = function() {\n var option = exports.ja();\n option.parsers.unshift(new parser.JPCasualDateParser());\n return option;\n};\n\n\n// -------------------------------------------------------------\n\n\nexports.es = function(config) {\n return {\n parsers: [\n new parser.ESTimeAgoFormatParser(config),\n new parser.ESDeadlineFormatParser(config),\n new parser.ESTimeExpressionParser(config),\n new parser.ESMonthNameLittleEndianParser(config),\n new parser.ESSlashDateFormatParser(config)\n ],\n refiners: [\n new refiner.OverlapRemovalRefiner(),\n new refiner.ForwardDateRefiner()\n ]\n }\n};\n\nexports.es.casual = function() {\n var option = exports.es({ \n strict: false \n });\n\n option.parsers.unshift(new parser.ESCasualDateParser());\n option.parsers.unshift(new parser.ESWeekdayParser());\n return option;\n};\n\n\n// -------------------------------------------------------------\n\nexports.fr = function(config) {\n return {\n parsers: [\n new parser.FRDeadlineFormatParser(config),\n new parser.FRMonthNameLittleEndianParser(config),\n new parser.FRSlashDateFormatParser(config),\n new parser.FRTimeAgoFormatParser(config),\n new parser.FRTimeExpressionParser(config)\n ],\n refiners: [\n new refiner.OverlapRemovalRefiner(),\n new refiner.ForwardDateRefiner(),\n new refiner.FRMergeDateRangeRefiner(),\n new refiner.FRMergeDateTimeRefiner()\n ]\n }\n};\n\nexports.fr.casual = function() {\n var option = exports.fr({\n strict: false\n });\n\n option.parsers.unshift(new parser.FRCasualDateParser());\n option.parsers.unshift(new parser.FRWeekdayParser());\n option.parsers.unshift(new parser.FRRelativeDateFormatParser());\n return option;\n};\n\n\n// -------------------------------------------------------------\n\nexports.zh = function() {\n return {\n parsers: [\n new parser.ZHHantDateParser(),\n new parser.ZHHantWeekdayParser(),\n new parser.ZHHantTimeExpressionParser(),\n new parser.ZHHantCasualDateParser(),\n new parser.ZHHantDeadlineFormatParser()\n ],\n refiners: [\n new refiner.OverlapRemovalRefiner(),\n new refiner.ForwardDateRefiner()\n ]\n }\n};","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = new RegExp(\n '(\\\\W|^)(' +\n 'jetzt|' +\n '(?:heute|diesen)\\\\s*(morgen|vormittag|mittag|nachmittag|abend)|' +\n '(?:heute|diese)\\\\s*nacht|' +\n 'heute|' +\n '(?:(?:ü|ue)ber)?morgen(?:\\\\s*(morgen|vormittag|mittag|nachmittag|abend|nacht))?|' +\n '(?:vor)?gestern(?:\\\\s*(morgen|vormittag|mittag|nachmittag|abend|nacht))?|' +\n 'letzte\\\\s*nacht' +\n ')(?=\\\\W|$)', 'i');\n\nexports.Parser = function DECasualDateParser() {\n\n Parser.apply(this, arguments);\n\n this.pattern = function() { return PATTERN; }\n\n this.extract = function(text, ref, match, opt) {\n var text = match[0].substr(match[1].length);\n var index = match.index + match[1].length;\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref,\n });\n\n var refMoment = moment(ref);\n var startMoment = refMoment.clone();\n var lowerText = text.toLowerCase();\n\n if (/(?:heute|diese)\\s*nacht/.test(lowerText)) {\n // Normally means this coming midnight\n result.start.imply('hour', 22);\n result.start.imply('meridiem', 1);\n } else if (/^(?:ü|ue)bermorgen/.test(lowerText)) {\n startMoment.add(refMoment.hour() > 1 ? 2 : 1, 'day');\n } else if (/^morgen/.test(lowerText)) {\n // Check not \"Tomorrow\" on late night\n if (refMoment.hour() > 1) {\n startMoment.add(1, 'day');\n }\n } else if (/^gestern/.test(lowerText)) {\n startMoment.add(-1, 'day');\n } else if (/^vorgestern/.test(lowerText)) {\n startMoment.add(-2, 'day');\n } else if (/letzte\\s*nacht/.test(lowerText)) {\n result.start.imply('hour', 0);\n if (refMoment.hour() > 6) {\n startMoment.add(-1, 'day');\n }\n } else if (lowerText === 'jetzt') {\n result.start.imply('hour', refMoment.hour());\n result.start.imply('minute', refMoment.minute());\n result.start.imply('second', refMoment.second());\n result.start.imply('millisecond', refMoment.millisecond());\n }\n\n var secondMatch = match[3] || match[4] || match[5];\n if (secondMatch) {\n switch (secondMatch.toLowerCase()) {\n case 'morgen':\n result.start.imply('hour', 6);\n break;\n case 'vormittag':\n result.start.imply('hour', 9);\n break;\n case 'mittag':\n result.start.imply('hour', 12);\n break;\n case 'nachmittag':\n result.start.imply('hour', 15);\n result.start.imply('meridiem', 1);\n break;\n case 'abend':\n result.start.imply('hour', 18);\n result.start.imply('meridiem', 1);\n break;\n case 'nacht':\n result.start.imply('hour', 0);\n break;\n }\n }\n\n result.start.assign('day', startMoment.date())\n result.start.assign('month', startMoment.month() + 1)\n result.start.assign('year', startMoment.year())\n result.tags['DECasualDateParser'] = true;\n return result;\n }\n}\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util = require('../../utils/DE');\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n '(in|nach)\\\\s*' +\n '('+ util.INTEGER_WORDS_PATTERN + '|[0-9]+|einigen|eine[rm]\\\\s*halben|eine[rm])\\\\s*' +\n '(sekunden?|min(?:ute)?n?|stunden?|tag(?:en)?|wochen?|monat(?:en)?|jahr(?:en)?)\\\\s*' +\n '(?=\\\\W|$)', 'i'\n);\n\nvar STRICT_PATTERN = new RegExp('(\\\\W|^)' +\n '(in|nach)\\\\s*' +\n '('+ util.INTEGER_WORDS_PATTERN + '|[0-9]+|eine(?:r|m)?)\\\\s*' +\n '(sekunden?|minuten?|stunden?|tag(?:en)?)\\\\s*' +\n '(?=\\\\W|$)', 'i'\n);\n\nexports.Parser = function DEDeadlineFormatParser(){\n Parser.apply(this, arguments);\n\n this.pattern = function() {\n return this.isStrictMode()? STRICT_PATTERN : PATTERN;\n };\n\n this.extract = function(text, ref, match, opt){\n\n var index = match.index + match[1].length;\n var text = match[0];\n text = match[0].substr(match[1].length, match[0].length - match[1].length);\n\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref\n });\n\n var num = match[3].toLowerCase();\n if (util.INTEGER_WORDS[num] !== undefined) {\n num = util.INTEGER_WORDS[num];\n } else if (num === 'einer' || num === 'einem') {\n num = 1;\n } else if (num === 'einigen') {\n num = 3;\n } else if (/halben/.test(num)) {\n num = 0.5;\n } else {\n num = parseInt(num);\n }\n\n var date = moment(ref);\n if (/tag|woche|monat|jahr/i.test(match[4])) {\n\n if (/tag/i.test(match[4])) {\n date.add(num, 'd');\n } else if (/woche/i.test(match[4])) {\n date.add(num * 7, 'd');\n } else if (/monat/i.test(match[4])) {\n date.add(num, 'month');\n } else if (/jahr/i.test(match[4])) {\n date.add(num, 'year');\n }\n\n result.start.assign('year', date.year());\n result.start.assign('month', date.month() + 1);\n result.start.assign('day', date.date());\n return result;\n }\n\n if (/stunde/i.test(match[4])) {\n\n date.add(num, 'hour');\n\n } else if (/min/i.test(match[4])) {\n\n date.add(num, 'minute');\n\n } else if (/sekunde/i.test(match[4])) {\n\n date.add(num, 'second');\n }\n\n result.start.imply('year', date.year());\n result.start.imply('month', date.month() + 1);\n result.start.imply('day', date.date());\n result.start.assign('hour', date.hour());\n result.start.assign('minute', date.minute());\n result.start.assign('second', date.second());\n result.tags['DEDeadlineFormatParser'] = true;\n return result;\n };\n};\n","/*\n\n\n*/\n\nvar moment = require('moment');\n\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util = require('../../utils/DE');\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n '(?:am\\\\s*?)?' +\n '(?:(Sonntag|Montag|Dienstag|Mittwoch|Donnerstag|Freitag|Samstag|So|Mo|Di|Mi|Do|Fr|Sa)\\\\s*,?\\\\s*)?' +\n '(?:den\\\\s*)?' +\n '([0-9]{1,2})\\\\.' +\n '(?:\\\\s*(?:bis(?:\\\\s*(?:am|zum))?|\\\\-|\\\\–|\\\\s)\\\\s*([0-9]{1,2})\\\\.)?\\\\s*' +\n '(Jan(?:uar|\\\\.)?|Feb(?:ruar|\\\\.)?|Mär(?:z|\\\\.)?|Maerz|Mrz\\\\.?|Apr(?:il|\\\\.)?|Mai|Jun(?:i|\\\\.)?|Jul(?:i|\\\\.)?|Aug(?:ust|\\\\.)?|Sep(?:t|t\\\\.|tember|\\\\.)?|Okt(?:ober|\\\\.)?|Nov(?:ember|\\\\.)?|Dez(?:ember|\\\\.)?)' +\n '(?:' +\n ',?\\\\s*([0-9]{1,4}(?![^\\\\s]\\\\d))' +\n '(\\\\s*[vn]\\\\.?\\\\s*C(?:hr)?\\\\.?)?' +\n ')?' +\n '(?=\\\\W|$)', 'i'\n );\n\nvar WEEKDAY_GROUP = 2;\nvar DATE_GROUP = 3;\nvar DATE_TO_GROUP = 4;\nvar MONTH_NAME_GROUP = 5;\nvar YEAR_GROUP = 6;\nvar YEAR_BE_GROUP = 7;\n\nexports.Parser = function DEMonthNameLittleEndianParser(){\n Parser.apply(this, arguments);\n\n this.pattern = function() { return PATTERN; }\n\n this.extract = function(text, ref, match, opt){\n\n var result = new ParsedResult({\n text: match[0].substr(match[1].length, match[0].length - match[1].length),\n index: match.index + match[1].length,\n ref: ref,\n });\n\n var month = match[MONTH_NAME_GROUP];\n month = util.MONTH_OFFSET[month.toLowerCase()];\n\n var day = match[DATE_GROUP];\n day = parseInt(day);\n\n var year = null;\n if (match[YEAR_GROUP]) {\n year = match[YEAR_GROUP];\n year = parseInt(year);\n\n if(match[YEAR_BE_GROUP]){\n if (/v/i.test(match[YEAR_BE_GROUP])) {\n // v.Chr.\n year = -year;\n }\n } else if (year < 100){\n\n year = year + 2000;\n }\n }\n\n if(year){\n result.start.assign('day', day);\n result.start.assign('month', month);\n result.start.assign('year', year);\n } else {\n\n //Find the most appropriated year\n var refMoment = moment(ref);\n refMoment.month(month - 1);\n refMoment.date(day);\n refMoment.year(moment(ref).year());\n\n var nextYear = refMoment.clone().add(1, 'y');\n var lastYear = refMoment.clone().add(-1, 'y');\n if( Math.abs(nextYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\n refMoment = nextYear;\n }\n else if( Math.abs(lastYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\n refMoment = lastYear;\n }\n\n result.start.assign('day', day);\n result.start.assign('month', month);\n result.start.imply('year', refMoment.year());\n }\n\n // Weekday component\n if (match[WEEKDAY_GROUP]) {\n var weekday = match[WEEKDAY_GROUP];\n weekday = util.WEEKDAY_OFFSET[weekday.toLowerCase()]\n result.start.assign('weekday', weekday);\n }\n\n // Text can be 'range' value. Such as '12 - 13 January 2012'\n if (match[DATE_TO_GROUP]) {\n result.end = result.start.clone();\n result.end.assign('day', parseInt(match[DATE_TO_GROUP]));\n }\n\n result.tags['DEMonthNameLittleEndianParser'] = true;\n return result;\n };\n}\n","/*\n \n The parser for parsing month name and year.\n \n EX. \n - Januar\n - Januar 2012\n*/\n\nvar moment = require('moment');\n\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util = require('../../utils/DE');\n\nvar PATTERN = new RegExp('(^|\\\\D\\\\s+|[^\\\\w\\\\s])' +\n '(Jan\\\\.?|Januar|Feb\\\\.?|Februar|Mär\\\\.?|M(?:ä|ae)rz|Mrz\\\\.?|Apr\\\\.?|April|Mai\\\\.?|Jun\\\\.?|Juni|Jul\\\\.?|Juli|Aug\\\\.?|August|Sep\\\\.?|Sept\\\\.?|September|Okt\\\\.?|Oktober|Nov\\\\.?|November|Dez\\\\.?|Dezember)' + \n '\\\\s*' +\n '(?:' +\n ',?\\\\s*(?:([0-9]{4})(\\\\s*[vn]\\\\.?\\\\s*C(?:hr)?\\\\.?)?|([0-9]{1,4})\\\\s*([vn]\\\\.?\\\\s*C(?:hr)?\\\\.?))' +\n ')?' +\n '(?=[^\\\\s\\\\w]|$)', 'i');\n\nvar MONTH_NAME_GROUP = 2;\nvar YEAR_GROUP = 3;\nvar YEAR_BE_GROUP = 4;\nvar YEAR_GROUP2 = 5;\nvar YEAR_BE_GROUP2 = 6;\n\nexports.Parser = function ENMonthNameParser(){\n Parser.apply(this, arguments);\n\n this.pattern = function() { return PATTERN; }\n \n this.extract = function(text, ref, match, opt){\n var result = new ParsedResult({\n text: match[0].substr(match[1].length, match[0].length - match[1].length),\n index: match.index + match[1].length,\n ref: ref,\n });\n\n \n var month = match[MONTH_NAME_GROUP];\n month = util.MONTH_OFFSET[month.toLowerCase()];\n\n var day = 1;\n\n var year = null;\n if (match[YEAR_GROUP] || match[YEAR_GROUP2]) {\n year = match[YEAR_GROUP] || match[YEAR_GROUP2];\n year = parseInt(year);\n\n if (match[YEAR_BE_GROUP] || match[YEAR_BE_GROUP2]) {\n if (/v/i.test(match[YEAR_BE_GROUP] || match[YEAR_BE_GROUP2])) {\n // v.Chr.\n year = -year;\n }\n\n } else if (year < 100){ \n\n year = year + 2000;\n }\n }\n\n if(year){\n result.start.imply('day', day);\n result.start.assign('month', month);\n result.start.assign('year', year);\n } else {\n \n //Find the most appropriated year\n var refMoment = moment(ref);\n refMoment.month(month - 1);\n refMoment.date(day);\n\n var nextYear = refMoment.clone().add(1, 'y');\n var lastYear = refMoment.clone().add(-1, 'y');\n if( Math.abs(nextYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){ \n refMoment = nextYear;\n }\n else if( Math.abs(lastYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){ \n refMoment = lastYear;\n }\n\n result.start.imply('day', day);\n result.start.assign('month', month);\n result.start.imply('year', refMoment.year());\n }\n\n result.tags['DEMonthNameParser'] = true;\n return result;\n }\n}\n\n","/*\n Date format with slash \"/\" (also \"-\" and \".\") between numbers\n - Tuesday 11/3/2015\n - 11/3/2015\n - 11/3\n*/\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n '(?:' +\n '(?:am\\\\s*?)?' +\n '((?:sonntag|so|montag|mo|dienstag|di|mittwoch|mi|donnerstag|do|freitag|fr|samstag|sa))' +\n '\\\\s*\\\\,?\\\\s*' +\n '(?:den\\\\s*)?' +\n ')?' +\n '([0-3]{0,1}[0-9]{1})[\\\\/\\\\.\\\\-]([0-3]{0,1}[0-9]{1})' +\n '(?:' +\n '[\\\\/\\\\.\\\\-]' +\n '([0-9]{4}\\s*\\,?\\s*|[0-9]{2}\\s*\\,?\\s*)' +\n ')?' +\n '(\\\\W|$)', 'i');\n\nvar DAYS_OFFSET = {\n 'sonntag': 0, 'so': 0,\n 'montag': 1, 'mo': 1,\n 'dienstag': 2, 'di': 2,\n 'mittwoch': 3, 'mi': 3,\n 'donnerstag': 4, 'do': 4,\n 'freitag': 5, 'fr': 5,\n 'samstag': 6, 'sa': 6\n};\n\n\nvar OPENNING_GROUP = 1;\nvar ENDING_GROUP = 6;\n\nvar WEEKDAY_GROUP = 2;\nvar DAY_GROUP = 3;\nvar MONTH_GROUP = 4;\nvar YEAR_GROUP = 5;\n\nexports.Parser = function DESlashDateFormatParser(argument) {\n Parser.apply(this, arguments);\n\n this.pattern = function () { return PATTERN; };\n this.extract = function(text, ref, match, opt){\n\n if(match[OPENNING_GROUP] == '/' || match[ENDING_GROUP] == '/') {\n // Long skip, if there is some overlapping like:\n // XX[/YY/ZZ]\n // [XX/YY/]ZZ\n match.index += match[0].length\n return;\n }\n\n var index = match.index + match[OPENNING_GROUP].length;\n var text = match[0].substr(match[OPENNING_GROUP].length, match[0].length - match[ENDING_GROUP].length);\n\n\n var result = new ParsedResult({\n text: text,\n index: index,\n ref: ref,\n });\n\n if(text.match(/^\\d\\.\\d$/)) return;\n if(text.match(/^\\d\\.\\d{1,2}\\.\\d{1,2}$/)) return;\n\n // MM/dd -> OK\n // MM.dd -> NG\n if(!match[YEAR_GROUP] && match[0].indexOf('/') < 0) return;\n\n var date = null;\n var year = match[YEAR_GROUP] || moment(ref).year() + '';\n var month = match[MONTH_GROUP];\n var day = match[DAY_GROUP];\n\n month = parseInt(month);\n day = parseInt(day);\n year = parseInt(year);\n\n if (month < 1 || month > 12) return null;\n if(day < 1 || day > 31) return null;\n\n if(year < 100){\n if (year > 50) {\n year = year + 1900;\n } else {\n year = year + 2000;\n }\n }\n\n result.start.assign('day', day);\n result.start.assign('month', month);\n result.start.assign('year', year);\n\n //Day of week\n if(match[WEEKDAY_GROUP]) {\n result.start.assign('weekday', DAYS_OFFSET[match[WEEKDAY_GROUP].toLowerCase()]);\n }\n\n result.tags['DESlashDateFormatParser'] = true;\n return result;\n };\n};\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util = require('../../utils/DE');\n\nvar PATTERN = new RegExp('' +\n '(\\\\W|^)vor\\\\s*' +\n '(' + util.INTEGER_WORDS_PATTERN + '|[0-9]+|einigen|eine[rm]\\\\s*halben|eine[rm])\\\\s*' +\n '(sekunden?|min(?:ute)?n?|stunden?|wochen?|tag(?:en)?|monat(?:en)?|jahr(?:en)?)\\\\s*' +\n '(?=(?:\\\\W|$))', 'i');\n\nvar STRICT_PATTERN = new RegExp('' +\n '(\\\\W|^)vor\\\\s*' +\n '([0-9]+|eine(?:r|m))\\\\s*' +\n '(sekunden?|minuten?|stunden?|tag(?:en)?)' +\n '(?=(?:\\\\W|$))', 'i');\n\nexports.Parser = function DETimeAgoFormatParser(){\n Parser.apply(this, arguments);\n\n this.pattern = function() {\n return this.isStrictMode()? STRICT_PATTERN : PATTERN;\n };\n\n this.extract = function(text, ref, match, opt){\n\n if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\n\n var text = match[0];\n text = match[0].substr(match[1].length, match[0].length - match[1].length);\n index = match.index + match[1].length;\n\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref\n });\n\n var num = match[2].toLowerCase() ;\n if (util.INTEGER_WORDS[num] !== undefined) {\n num = util.INTEGER_WORDS[num];\n } else if (num === 'einer' || num === 'einem') {\n num = 1;\n } else if (num === 'einigen') {\n num = 3;\n } else if (/halben/.test(num)) {\n num = 0.5;\n } else {\n num = parseInt(num);\n }\n\n var date = moment(ref);\n\n if (/stunde|min|sekunde/i.test(match[3])) {\n if (/stunde/i.test(match[3])) {\n\n date.add(-num, 'hour');\n\n } else if (/min/i.test(match[3])) {\n\n date.add(-num, 'minute');\n\n } else if (/sekunde/i.test(match[3])) {\n\n date.add(-num, 'second');\n }\n\n result.start.imply('day', date.date());\n result.start.imply('month', date.month() + 1);\n result.start.imply('year', date.year());\n result.start.assign('hour', date.hour());\n result.start.assign('minute', date.minute());\n result.start.assign('second', date.second());\n result.tags['DETimeAgoFormatParser'] = true;\n return result;\n }\n\n if (/woche/i.test(match[3])) {\n date.add(-num, 'week');\n\n result.start.imply('day', date.date());\n result.start.imply('month', date.month() + 1);\n result.start.imply('year', date.year());\n result.start.imply('weekday', date.day());\n return result;\n }\n\n if (/tag/i.test(match[3])) {\n date.add(-num, 'd');\n }\n\n if (/monat/i.test(match[3])) {\n date.add(-num, 'month');\n }\n\n if (/jahr/i.test(match[3])) {\n\n date.add(-num, 'year');\n }\n\n result.start.assign('day', date.date());\n result.start.assign('month', date.month() + 1);\n result.start.assign('year', date.year());\n return result;\n\n };\n}\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar ParsedComponents = require('../../result').ParsedComponents;\n\nvar FIRST_REG_PATTERN = new RegExp(\"(^|\\\\s|T)\" +\n \"(?:(?:um|von)\\\\s*)?\" + \n \"(\\\\d{1,4}|mittags?|mitternachts?)\" + \n \"(?:\" + \n \"(?:\\\\.|\\\\:|\\\\:)(\\\\d{1,2})\" + \n \"(?:\" + \n \"(?:\\\\:|\\\\:)(\\\\d{2})\" + \n \")?\" + \n \")?\" +\n \"(?:\\\\s*uhr)?\" +\n \"(?:\\\\s*(morgens|vormittags|mittags|nachmittags|abends|nachts))?\" + \n \"(?=\\\\W|$)\", 'i');\n\n\nvar SECOND_REG_PATTERN = new RegExp(\"^\\\\s*\" + \n \"(\\\\-|\\\\–|\\\\~|\\\\〜|bis|\\\\?)\\\\s*\" + \n \"(\\\\d{1,4})\" +\n \"(?:\" + \n \"(?:\\\\.|\\\\:|\\\\:)(\\\\d{1,2})\" + \n \"(?:\" + \n \"(?:\\\\.|\\\\:|\\\\:)(\\\\d{1,2})\" + \n \")?\" + \n \")?\" + \n \"(?:\\\\s*(morgens|vormittags|mittags|nachmittags|abends|nachts))?\" + \n \"(?=\\\\W|$)\", 'i');\n\nvar HOUR_GROUP = 2;\nvar MINUTE_GROUP = 3;\nvar SECOND_GROUP = 4;\nvar AM_PM_HOUR_GROUP = 5;\n\n\nexports.Parser = function DETimeExpressionParser() {\n Parser.apply(this, arguments);\n\n this.pattern = function() { return FIRST_REG_PATTERN; }\n \n this.extract = function(text, ref, match, opt){ \n \n // This pattern can be overlaped Ex. [12] AM, 1[2] AM\n if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\n var refMoment = moment(ref);\n var result = new ParsedResult();\n result.ref = ref;\n result.index = match.index + match[1].length;\n result.text = match[0].substring(match[1].length);\n result.tags['DETimeExpressionParser'] = true;\n\n result.start.imply('day', refMoment.date());\n result.start.imply('month', refMoment.month()+1);\n result.start.imply('year', refMoment.year());\n \n var hour = 0;\n var minute = 0;\n var meridiem = -1;\n\n // ----- Second\n if(match[SECOND_GROUP] != null){ \n var second = parseInt(match[SECOND_GROUP]);\n if(second >= 60) return null;\n\n result.start.assign('second', second);\n }\n \n // ----- Hours\n if (/mittags?/i.test(match[HOUR_GROUP])) {\n meridiem = 1; \n hour = 12;\n } else if (/mitternachts?/i.test(match[HOUR_GROUP])) {\n meridiem = 0; \n hour = 0;\n } else {\n hour = parseInt(match[HOUR_GROUP]);\n }\n \n // ----- Minutes\n if(match[MINUTE_GROUP] != null){ \n minute = parseInt(match[MINUTE_GROUP]);\n } else if(hour > 100) { \n minute = hour%100;\n hour = parseInt(hour/100);\n } \n \n if(minute >= 60) {\n return null;\n }\n\n if(hour > 24) {\n return null;\n }\n if (hour >= 12) { \n meridiem = 1;\n }\n\n // ----- AM & PM \n if (match[AM_PM_HOUR_GROUP] != null) {\n if (hour > 12) return null;\n var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();\n if (ampm === 'morgens' || ampm === 'vormittags') {\n meridiem = 0; \n if(hour == 12) hour = 0;\n } else {\n meridiem = 1; \n if(hour != 12) hour += 12;\n }\n } \n\n result.start.assign('hour', hour);\n result.start.assign('minute', minute);\n\n if (meridiem >= 0) {\n result.start.assign('meridiem', meridiem);\n } else {\n if (hour < 12) {\n result.start.imply('meridiem', 0);\n } else {\n result.start.imply('meridiem', 1);\n }\n }\n \n // ==============================================================\n // Extracting the 'to' chunk\n // ==============================================================\n match = SECOND_REG_PATTERN.exec(text.substring(result.index + result.text.length));\n if (!match) {\n // Not accept number only result\n if (result.text.match(/^\\d+$/)) { \n return null;\n }\n return result;\n }\n\n\n\n // Pattern \"YY.YY -XXXX\" is more like timezone offset\n if (match[0].match(/^\\s*(\\+|\\-)\\s*\\d{3,4}$/)) {\n return result;\n }\n\n if(result.end == null){\n result.end = new ParsedComponents(null, result.start.date());\n }\n\n var hour = 0;\n var minute = 0;\n var meridiem = -1;\n\n // ----- Second\n if(match[SECOND_GROUP] != null){ \n var second = parseInt(match[SECOND_GROUP]);\n if(second >= 60) return null;\n\n result.end.assign('second', second);\n }\n\n hour = parseInt(match[2]);\n \n // ----- Minute\n if (match[MINUTE_GROUP]!= null) {\n \n minute = parseInt(match[MINUTE_GROUP]);\n if(minute >= 60) return result;\n \n } else if (hour > 100) {\n\n minute = hour%100;\n hour = parseInt(hour/100);\n }\n\n if(minute >= 60) {\n return null;\n }\n\n if(hour > 24) {\n return null;\n }\n if (hour >= 12) { \n meridiem = 1;\n }\n \n // ----- AM & PM \n if (match[AM_PM_HOUR_GROUP] != null) {\n\n if (hour > 12) return null;\n\n var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();\n if (ampm === 'morgens' || ampm === 'vormittags') {\n meridiem = 0; \n if(hour == 12) {\n hour = 0;\n if (!result.end.isCertain('day')) {\n result.end.imply('day', result.end.get('day') + 1);\n }\n }\n } else {\n meridiem = 1; \n if(hour != 12) hour += 12;\n }\n \n if (!result.start.isCertain('meridiem')) {\n if (meridiem == 0) {\n \n result.start.imply('meridiem', 0);\n \n if (result.start.get('hour') == 12) {\n result.start.assign('hour', 0);\n }\n\n } else {\n\n result.start.imply('meridiem', 1);\n \n if (result.start.get('hour') != 12) {\n result.start.assign('hour', result.start.get('hour') + 12); \n }\n }\n }\n }\n\n result.text = result.text + match[0];\n result.end.assign('hour', hour);\n result.end.assign('minute', minute);\n if (meridiem >= 0) {\n result.end.assign('meridiem', meridiem);\n } else {\n var startAtPM = result.start.isCertain('meridiem') && result.start.get('meridiem') == 1;\n if (startAtPM && result.start.get('hour') > hour) {\n // 10pm - 1 (am)\n result.end.imply('meridiem', 0);\n\n } else if (hour > 12) {\n result.end.imply('meridiem', 1);\n }\n }\n\n if (result.end.date().getTime() < result.start.date().getTime()) {\n result.end.imply('day', result.end.get('day') + 1)\n }\n \n return result;\n }\n}\n","/*\n\n\n*/\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar DAYS_OFFSET = {\n 'sonntag': 0, 'so': 0,\n 'montag': 1, 'mo': 1,\n 'dienstag': 2, 'di': 2,\n 'mittwoch': 3, 'mi': 3,\n 'donnerstag': 4, 'do': 4,\n 'freitag': 5, 'fr': 5,\n 'samstag': 6, 'sa': 6\n};\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n '(?:(?:\\\\,|\\\\(|\\\\()\\\\s*)?' +\n '(?:a[mn]\\\\s*?)?' +\n '(?:(diese[mn]|letzte[mn]|n(?:ä|ae)chste[mn])\\\\s*)?' +\n '(' + Object.keys(DAYS_OFFSET).join('|') + ')' +\n '(?:\\\\s*(?:\\\\,|\\\\)|\\\\)))?' +\n '(?:\\\\s*(diese|letzte|n(?:ä|ae)chste)\\\\s*woche)?' +\n '(?=\\\\W|$)', 'i');\n\nvar PREFIX_GROUP = 2;\nvar WEEKDAY_GROUP = 3;\nvar POSTFIX_GROUP = 4;\n\nexports.Parser = function DEWeekdayParser() {\n Parser.apply(this, arguments);\n\n this.pattern = function() { return PATTERN; };\n\n this.extract = function(text, ref, match, opt){\n var index = match.index + match[1].length;\n var text = match[0].substr(match[1].length, match[0].length - match[1].length);\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref,\n });\n\n var dayOfWeek = match[WEEKDAY_GROUP].toLowerCase();\n var offset = DAYS_OFFSET[dayOfWeek];\n if(offset === undefined) return null;\n\n var startMoment = moment(ref);\n var prefix = match[PREFIX_GROUP];\n var postfix = match[POSTFIX_GROUP];\n\n var refOffset = startMoment.day();\n var norm = prefix || postfix;\n norm = norm || '';\n norm = norm.toLowerCase();\n if (/letzte/.test(norm)) {\n startMoment.day(offset - 7);\n } else if (/n(?:ä|ae)chste/.test(norm)) {\n startMoment.day(offset + 7);\n } else if (/diese/.test(norm)) {\n if ( opt.forwardDate && refOffset > offset ) {\n startMoment.day(offset + 7);\n } else {\n startMoment.day(offset);\n }\n } else {\n if ( opt.forwardDate && refOffset > offset ) {\n startMoment.day(offset + 7);\n } else if (!opt.forwardDate && Math.abs(offset - 7 - refOffset) < Math.abs(offset - refOffset)) {\n startMoment.day(offset - 7);\n } else if (!opt.forwardDate && Math.abs(offset + 7 - refOffset) < Math.abs(offset - refOffset)) {\n startMoment.day(offset + 7);\n } else {\n startMoment.day(offset);\n }\n }\n\n result.start.assign('weekday', offset);\n result.start.imply('day', startMoment.date());\n result.start.imply('month', startMoment.month() + 1);\n result.start.imply('year', startMoment.year());\n return result;\n }\n};\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = /(\\W|^)(now|today|tonight|last\\s*night|(?:tomorrow|tmr|yesterday)\\s*|tomorrow|tmr|yesterday)(?=\\W|$)/i;\n\nexports.Parser = function ENCasualDateParser(){\n\n Parser.apply(this, arguments);\n\n this.pattern = function() { return PATTERN; }\n\n this.extract = function(text, ref, match, opt){\n\n var text = match[0].substr(match[1].length);\n var index = match.index + match[1].length;\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref,\n });\n\n var refMoment = moment(ref);\n var startMoment = refMoment.clone();\n var lowerText = text.toLowerCase();\n\n if(lowerText == 'tonight'){\n // Normally means this coming midnight\n result.start.imply('hour', 22);\n result.start.imply('meridiem', 1);\n\n } else if (/^tomorrow|^tmr/.test(lowerText)) {\n\n // Check not \"Tomorrow\" on late night\n if(refMoment.hour() > 1) {\n startMoment.add(1, 'day');\n }\n\n } else if (/^yesterday/.test(lowerText)) {\n\n startMoment.add(-1, 'day');\n\n } else if(lowerText.match(/last\\s*night/)) {\n\n result.start.imply('hour', 0);\n if (refMoment.hour() > 6) {\n startMoment.add(-1, 'day');\n }\n\n } else if (lowerText.match(\"now\")) {\n\n result.start.assign('hour', refMoment.hour());\n result.start.assign('minute', refMoment.minute());\n result.start.assign('second', refMoment.second());\n result.start.assign('millisecond', refMoment.millisecond());\n\n }\n\n result.start.assign('day', startMoment.date())\n result.start.assign('month', startMoment.month() + 1)\n result.start.assign('year', startMoment.year())\n result.tags['ENCasualDateParser'] = true;\n return result;\n }\n}\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = /(\\W|^)((this)?\\s*(morning|afternoon|evening|noon|night))/i;\n\nvar TIME_MATCH = 4;\n\nexports.Parser = function ENCasualTimeParser(){\n\n Parser.apply(this, arguments);\n\n\n this.pattern = function() { return PATTERN; }\n\n this.extract = function(text, ref, match, opt){\n\n var text = match[0].substr(match[1].length);\n var index = match.index + match[1].length;\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref,\n });\n\n if(!match[TIME_MATCH]) TIME_MATCH = 3;\n \n switch (match[TIME_MATCH].toLowerCase()) {\n\n case 'afternoon':\n result.start.imply('meridiem', 1);\n result.start.imply('hour', 15);\n break;\n\n case 'evening':\n case 'night':\n result.start.imply('meridiem', 1);\n result.start.imply('hour', 20);\n break;\n\n case 'morning':\n result.start.imply('meridiem', 0);\n result.start.imply('hour', 6);\n break;\n\n case 'noon':\n result.start.imply('meridiem', 0);\n result.start.imply('hour', 12);\n break;\n }\n \n result.tags['ENCasualTimeParser'] = true;\n return result;\n };\n};\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util = require('../../utils/EN');\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n '(within|in)\\\\s*' +\n '('+ util.INTEGER_WORDS_PATTERN + '|[0-9]+|an?(?:\\\\s*few)?|half(?:\\\\s*an?)?)\\\\s*' +\n '(seconds?|min(?:ute)?s?|hours?|days?|weeks?|months?|years?)\\\\s*' +\n '(?=\\\\W|$)', 'i'\n);\n\nvar STRICT_PATTERN = new RegExp('(\\\\W|^)' +\n '(within|in)\\\\s*' +\n '('+ util.INTEGER_WORDS_PATTERN + '|[0-9]+|an?)\\\\s*' +\n '(seconds?|minutes?|hours?|days?)\\\\s*' +\n '(?=\\\\W|$)', 'i'\n);\n\nexports.Parser = function ENDeadlineFormatParser(){\n Parser.apply(this, arguments);\n\n this.pattern = function() {\n return this.isStrictMode()? STRICT_PATTERN : PATTERN;\n };\n\n this.extract = function(text, ref, match, opt){\n\n var index = match.index + match[1].length;\n var text = match[0];\n text = match[0].substr(match[1].length, match[0].length - match[1].length);\n\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref\n });\n\n var num = match[3].toLowerCase();\n if (util.INTEGER_WORDS[num] !== undefined) {\n num = util.INTEGER_WORDS[num];\n } else if (num === 'a' || num === 'an'){\n num = 1;\n } else if (num.match(/few/i)){\n num = 3;\n } else if (num.match(/half/i)) {\n num = 0.5;\n } else {\n num = parseInt(num);\n }\n\n var date = moment(ref);\n if (match[4].match(/day|week|month|year/i)) {\n\n if (match[4].match(/day/i)) {\n date.add(num, 'd');\n } else if (match[4].match(/week/i)) {\n date.add(num * 7, 'd');\n } else if (match[4].match(/month/i)) {\n date.add(num, 'month');\n } else if (match[4].match(/year/i)) {\n date.add(num, 'year');\n }\n\n result.start.imply('year', date.year());\n result.start.imply('month', date.month() + 1);\n result.start.imply('day', date.date());\n return result;\n }\n\n if (match[4].match(/hour/i)) {\n\n date.add(num, 'hour');\n\n } else if (match[4].match(/min/i)) {\n\n date.add(num, 'minute');\n\n } else if (match[4].match(/second/i)) {\n\n date.add(num, 'second');\n }\n\n result.start.imply('year', date.year());\n result.start.imply('month', date.month() + 1);\n result.start.imply('day', date.date());\n result.start.imply('hour', date.hour());\n result.start.imply('minute', date.minute());\n result.start.imply('second', date.second());\n result.tags['ENDeadlineFormatParser'] = true;\n return result;\n };\n};\n","/*\n ISO 8601\n http://www.w3.org/TR/NOTE-datetime\n - YYYY-MM-DD\n - YYYY-MM-DDThh:mmTZD\n - YYYY-MM-DDThh:mm:ssTZD\n - YYYY-MM-DDThh:mm:ss.sTZD \n - TZD = (Z or +hh:mm or -hh:mm)\n*/\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = new RegExp('(\\\\W|^)' \n + '([0-9]{4})\\\\-([0-9]{1,2})\\\\-([0-9]{1,2})'\n + '(?:T' //..\n + '([0-9]{1,2}):([0-9]{1,2})' // hh:mm\n + '(?::([0-9]{1,2})(?:\\\\.(\\\\d{1,4}))?)?' // :ss.s\n + '(?:Z|([+-]\\\\d{2}):?(\\\\d{2})?)?' // TZD (Z or ±hh:mm or ±hhmm or ±hh)\n + ')?' //..\n + '(?=\\\\W|$)', 'i');\n\nvar YEAR_NUMBER_GROUP = 2;\nvar MONTH_NUMBER_GROUP = 3;\nvar DATE_NUMBER_GROUP = 4;\nvar HOUR_NUMBER_GROUP = 5;\nvar MINUTE_NUMBER_GROUP = 6;\nvar SECOND_NUMBER_GROUP = 7;\nvar MILLISECOND_NUMBER_GROUP = 8;\nvar TZD_HOUR_OFFSET_GROUP = 9;\nvar TZD_MINUTE_OFFSET_GROUP = 10;\n\nexports.Parser = function ENISOFormatParser(){\n Parser.apply(this, arguments);\n \n this.pattern = function() { return PATTERN; }\n \n this.extract = function(text, ref, match, opt){ \n \n var text = match[0].substr(match[1].length);\n var index = match.index + match[1].length;\n\n var result = new ParsedResult({\n text: text,\n index: index,\n ref: ref,\n })\n \n result.start.assign('year', parseInt(match[YEAR_NUMBER_GROUP]));\n result.start.assign('month', parseInt(match[MONTH_NUMBER_GROUP]));\n result.start.assign('day', parseInt(match[DATE_NUMBER_GROUP]));\n\n if (moment(result.start.get('month')) > 12 || moment(result.start.get('month')) < 1 ||\n moment(result.start.get('day')) > 31 || moment(result.start.get('day')) < 1) {\n return null;\n }\n\n if (match[HOUR_NUMBER_GROUP] != null) {\n \n result.start.assign('hour',\n parseInt(match[HOUR_NUMBER_GROUP]));\n result.start.assign('minute',\n parseInt(match[MINUTE_NUMBER_GROUP]));\n\n if (match[SECOND_NUMBER_GROUP] != null) {\n\n result.start.assign('second',\n parseInt(match[SECOND_NUMBER_GROUP]));\n }\n\n if (match[MILLISECOND_NUMBER_GROUP] != null) {\n\n result.start.assign('millisecond',\n parseInt(match[MILLISECOND_NUMBER_GROUP]));\n }\n\n if (match[TZD_HOUR_OFFSET_GROUP] == null) {\n\n result.start.assign('timezoneOffset', 0);\n } else {\n\n var minuteOffset = 0;\n var hourOffset = parseInt(match[TZD_HOUR_OFFSET_GROUP]);\n if (match[TZD_MINUTE_OFFSET_GROUP] != null)\n minuteOffset = parseInt(match[TZD_MINUTE_OFFSET_GROUP]);\n\n var offset = hourOffset * 60;\n if (offset < 0) {\n offset -= minuteOffset;\n } else {\n offset += minuteOffset;\n }\n\n result.start.assign('timezoneOffset', offset);\n }\n }\n \n result.tags['ENISOFormatParser'] = true;\n return result;\n };\n\n}\n\n","/*\n\n\n*/\n\nvar moment = require('moment');\n\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util = require('../../utils/EN');\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n '(?:on\\\\s*?)?' +\n '(?:(Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sun|Mon|Tue|Wed|Thu|Fri|Sat)\\\\s*,?\\\\s*)?' +\n '(([0-9]{1,2})(?:st|nd|rd|th)?|' + util.ORDINAL_WORDS_PATTERN + ')' +\n '(?:\\\\s*' +\n '(?:to|\\\\-|\\\\–|until|through|till|\\\\s)\\\\s*' +\n '(([0-9]{1,2})(?:st|nd|rd|th)?|' + util.ORDINAL_WORDS_PATTERN + ')' +\n ')?' + \n '(?:-|\\/|\\\\s*(?:of)?\\\\s*)' +\n '(' + util.MONTH_PATTERN + ')' +\n '(?:' +\n '(?:-|\\/|,?\\\\s*)' +\n '((?:' + \n '[1-9][0-9]{0,3}\\\\s*(?:BE|AD|BC)|' +\n '[1-2][0-9]{3}' + \n ')(?![^\\\\s]\\\\d))' +\n ')?' +\n '(?=\\\\W|$)', 'i'\n );\n\nvar WEEKDAY_GROUP = 2;\nvar DATE_GROUP = 3;\nvar DATE_NUM_GROUP = 4;\nvar DATE_TO_GROUP = 5;\nvar DATE_TO_NUM_GROUP = 6;\nvar MONTH_NAME_GROUP = 7;\nvar YEAR_GROUP = 8;\n\nexports.Parser = function ENMonthNameLittleEndianParser(){\n Parser.apply(this, arguments);\n\n this.pattern = function() { return PATTERN; }\n\n this.extract = function(text, ref, match, opt){\n\n var result = new ParsedResult({\n text: match[0].substr(match[1].length, match[0].length - match[1].length),\n index: match.index + match[1].length,\n ref: ref\n });\n\n var month = match[MONTH_NAME_GROUP];\n month = util.MONTH_OFFSET[month.toLowerCase()];\n\n var day = match[DATE_NUM_GROUP] ?\n parseInt(match[DATE_NUM_GROUP]):\n util.ORDINAL_WORDS[match[DATE_GROUP].trim().replace('-', ' ').toLowerCase()];\n\n var year = null;\n if (match[YEAR_GROUP]) {\n year = match[YEAR_GROUP];\n \n if (/BE/i.test(year)) {\n // Buddhist Era\n year = year.replace(/BE/i, '');\n year = parseInt(year) - 543;\n } else if (/BC/i.test(year)){\n // Before Christ\n year = year.replace(/BC/i, '');\n year = -parseInt(year);\n } else if (/AD/i.test(year)){\n year = year.replace(/AD/i, '');\n year = parseInt(year);\n } else {\n year = parseInt(year);\n if (year < 100){\n year = year + 2000;\n }\n }\n }\n\n if(year){\n result.start.assign('day', day);\n result.start.assign('month', month);\n result.start.assign('year', year);\n } else {\n\n //Find the most appropriated year\n var refMoment = moment(ref);\n refMoment.month(month - 1);\n refMoment.date(day);\n refMoment.year(moment(ref).year());\n\n var nextYear = refMoment.clone().add(1, 'y');\n var lastYear = refMoment.clone().add(-1, 'y');\n if( Math.abs(nextYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\n refMoment = nextYear;\n }\n else if( Math.abs(lastYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\n refMoment = lastYear;\n }\n\n result.start.assign('day', day);\n result.start.assign('month', month);\n result.start.imply('year', refMoment.year());\n }\n\n // Weekday component\n if (match[WEEKDAY_GROUP]) {\n var weekday = match[WEEKDAY_GROUP];\n weekday = util.WEEKDAY_OFFSET[weekday.toLowerCase()]\n result.start.assign('weekday', weekday);\n }\n\n // Text can be 'range' value. Such as '12 - 13 January 2012'\n if (match[DATE_TO_GROUP]) {\n var endDate = match[DATE_TO_NUM_GROUP] ?\n parseInt(match[DATE_TO_NUM_GROUP]):\n util.ORDINAL_WORDS[match[DATE_TO_GROUP].trim().replace('-', ' ').toLowerCase()];\n\n result.end = result.start.clone();\n result.end.assign('day', endDate);\n }\n\n result.tags['ENMonthNameLittleEndianParser'] = true;\n return result;\n };\n};\n","/*\n\n The parser for parsing US's date format that begin with month's name.\n\n EX.\n - January 13\n - January 13, 2012\n - January 13 - 15, 2012\n - Tuesday, January 13, 2012\n\n Watch out for:\n - January 12:00\n - January 12.44\n - January 1222344\n*/\n\nvar moment = require('moment');\n\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util = require('../../utils/EN');\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n '(?:' +\n '(?:on\\\\s*?)?' +\n '(Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sun\\\\.?|Mon\\\\.?|Tue\\\\.?|Wed\\\\.?|Thu\\\\.?|Fri\\\\.?|Sat\\\\.?)' +\n '\\\\s*,?\\\\s*)?' +\n '(' + util.MONTH_PATTERN + ')' +\n '(?:-|\\/|\\\\s*,?\\\\s*)' +\n '(([0-9]{1,2})(?:st|nd|rd|th)?|' + util.ORDINAL_WORDS_PATTERN +')(?!\\\\s*(?:am|pm))\\\\s*' + '' + \n '(?:' +\n '(?:to|\\\\-)\\\\s*' +\n '(([0-9]{1,2})(?:st|nd|rd|th)?| ' + util.ORDINAL_WORDS_PATTERN + ')\\\\s*' +\n ')?' +\n '(?:' +\n '(?:-|\\/|\\\\s*,?\\\\s*)' +\n '(?:([0-9]{4})\\\\s*(BE|AD|BC)?|([0-9]{1,4})\\\\s*(AD|BC))\\\\s*' +\n ')?' +\n '(?=\\\\W|$)(?!\\\\:\\\\d)', 'i');\n\nvar WEEKDAY_GROUP = 2;\nvar MONTH_NAME_GROUP = 3;\nvar DATE_GROUP = 4;\nvar DATE_NUM_GROUP = 5;\nvar DATE_TO_GROUP = 6;\nvar DATE_TO_NUM_GROUP = 7;\nvar YEAR_GROUP = 8;\nvar YEAR_BE_GROUP = 9;\nvar YEAR_GROUP2 = 10;\nvar YEAR_BE_GROUP2 = 11;\n\nexports.Parser = function ENMonthNameMiddleEndianParser(){\n Parser.apply(this, arguments);\n\n this.pattern = function() { return PATTERN; }\n\n this.extract = function(text, ref, match, opt){\n\n var result = new ParsedResult({\n text: match[0].substr(match[1].length, match[0].length - match[1].length),\n index: match.index + match[1].length,\n ref: ref,\n });\n\n\n var month = match[MONTH_NAME_GROUP];\n month = util.MONTH_OFFSET[month.toLowerCase()];\n var day = match[DATE_NUM_GROUP] ?\n parseInt(match[DATE_NUM_GROUP]) :\n util.ORDINAL_WORDS[match[DATE_GROUP].trim().replace('-', ' ').toLowerCase()];\n\n var year = null;\n if (match[YEAR_GROUP] || match[YEAR_GROUP2]) {\n year = match[YEAR_GROUP] || match[YEAR_GROUP2];\n year = parseInt(year);\n\n var yearBE = match[YEAR_BE_GROUP] || match[YEAR_BE_GROUP2];\n if (yearBE) {\n if (/BE/i.test(yearBE)) {\n // Buddhist Era\n year = year - 543;\n } else if (/BC/i.test(yearBE)) {\n // Before Christ\n year = -year;\n }\n } else if (year < 100){\n\n year = year + 2000;\n }\n }\n\n if(year){\n result.start.assign('day', day);\n result.start.assign('month', month);\n result.start.assign('year', year);\n } else {\n\n //Find the most appropriated year\n var refMoment = moment(ref);\n refMoment.month(month - 1);\n refMoment.date(day);\n\n var nextYear = refMoment.clone().add(1, 'y');\n var lastYear = refMoment.clone().add(-1, 'y');\n if( Math.abs(nextYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\n refMoment = nextYear;\n }\n else if( Math.abs(lastYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\n refMoment = lastYear;\n }\n\n result.start.assign('day', day);\n result.start.assign('month', month);\n result.start.imply('year', refMoment.year());\n }\n\n // Weekday component\n if (match[WEEKDAY_GROUP]) {\n var weekday = match[WEEKDAY_GROUP];\n weekday = util.WEEKDAY_OFFSET[weekday.toLowerCase()]\n result.start.assign('weekday', weekday);\n }\n\n // Text can be 'range' value. Such as 'January 12 - 13, 2012'\n if (match[DATE_TO_GROUP]) {\n var endDate = match[DATE_TO_NUM_GROUP] ?\n endDate = parseInt(match[DATE_TO_NUM_GROUP]) :\n util.ORDINAL_WORDS[match[DATE_TO_GROUP].replace('-', ' ').trim().toLowerCase()];\n\n result.end = result.start.clone();\n result.end.assign('day', endDate);\n }\n\n result.tags['ENMonthNameMiddleEndianParser'] = true;\n return result;\n }\n};","/*\n \n The parser for parsing month name and year.\n \n EX. \n - January\n - January 2012\n - January, 2012\n*/\n\nvar moment = require('moment');\n\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util = require('../../utils/EN');\n\nvar PATTERN = new RegExp('(^|\\\\D\\\\s+|[^\\\\w\\\\s])' +\n '('+ util.MONTH_PATTERN +')' + \n '\\\\s*' +\n '(?:' +\n '[,-]?\\\\s*([0-9]{4})(\\\\s*BE|AD|BC)?' +\n ')?' +\n '(?=[^\\\\s\\\\w]|\\\\s+[^0-9]|\\\\s+$|$)', 'i');\n\nvar MONTH_NAME_GROUP = 2;\nvar YEAR_GROUP = 3;\nvar YEAR_BE_GROUP = 4;\n\nexports.Parser = function ENMonthNameParser(){\n Parser.apply(this, arguments);\n\n this.pattern = function() { return PATTERN; }\n \n this.extract = function(text, ref, match, opt){\n var result = new ParsedResult({\n text: match[0].substr(match[1].length, match[0].length - match[1].length),\n index: match.index + match[1].length,\n ref: ref,\n });\n\n \n var month = match[MONTH_NAME_GROUP];\n month = util.MONTH_OFFSET[month.toLowerCase()];\n\n var day = 1;\n\n var year = null;\n if (match[YEAR_GROUP]) {\n year = match[YEAR_GROUP];\n year = parseInt(year);\n\n if(match[YEAR_BE_GROUP]){\n if (match[YEAR_BE_GROUP].match(/BE/)) {\n // Buddhist Era\n year = year - 543;\n } else if (match[YEAR_BE_GROUP].match(/BC/)) {\n // Before Christ\n year = -year;\n }\n\n } else if (year < 100){ \n\n year = year + 2000;\n }\n }\n\n if(year){\n result.start.imply('day', day);\n result.start.assign('month', month);\n result.start.assign('year', year);\n } else {\n \n //Find the most appropriated year\n var refMoment = moment(ref);\n refMoment.month(month - 1);\n refMoment.date(day);\n\n var nextYear = refMoment.clone().add(1, 'y');\n var lastYear = refMoment.clone().add(-1, 'y');\n if( Math.abs(nextYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){ \n refMoment = nextYear;\n }\n else if( Math.abs(lastYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){ \n refMoment = lastYear;\n }\n\n result.start.imply('day', day);\n result.start.assign('month', month);\n result.start.imply('year', refMoment.year());\n }\n\n result.tags['ENMonthNameParser'] = true;\n return result;\n }\n}\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util = require('../../utils/EN');\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n '(this|next|last|past)\\\\s*' +\n '('+ util.INTEGER_WORDS_PATTERN + '|[0-9]+|few|half(?:\\\\s*an?)?)?\\\\s*' +\n '(seconds?|min(?:ute)?s?|hours?|days?|weeks?|months?|years?)(?=\\\\s*)' +\n '(?=\\\\W|$)', 'i'\n);\n\nvar MODIFIER_WORD_GROUP = 2;\nvar MULTIPLIER_WORD_GROUP = 3;\nvar RELATIVE_WORD_GROUP = 4;\n\nexports.Parser = function ENRelativeDateFormatParser(){\n Parser.apply(this, arguments);\n\n this.pattern = function() { return PATTERN; };\n\n this.extract = function(text, ref, match, opt){\n\n var index = match.index + match[1].length;\n var modifier = match[MODIFIER_WORD_GROUP].toLowerCase().match(/^next/) ? 1 : -1;\n var text = match[0];\n text = match[0].substr(match[1].length, match[0].length - match[1].length);\n\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref\n });\n result.tags['ENRelativeDateFormatParser'] = true;\n\n var num = match[MULTIPLIER_WORD_GROUP] === undefined ? '' : match[3].toLowerCase();\n if (util.INTEGER_WORDS[num] !== undefined) {\n num = util.INTEGER_WORDS[num];\n } else if (num === ''){\n num = 1;\n } else if (num.match(/few/i)){\n num = 3;\n } else if (num.match(/half/i)) {\n num = 0.5;\n } else {\n num = parseInt(num);\n }\n\n num *= modifier;\n var date = moment(ref);\n\n if (match[MODIFIER_WORD_GROUP].toLowerCase().match(/^this/)) {\n\n if (match[MULTIPLIER_WORD_GROUP]) {\n return null;\n }\n\n if (match[RELATIVE_WORD_GROUP].match(/day|week|month|year/i)) {\n \n // This week\n if (match[RELATIVE_WORD_GROUP].match(/week/i)) {\n date.add(-date.get('d'), 'd');\n result.start.imply('day', date.date());\n result.start.imply('month', date.month() + 1);\n result.start.imply('year', date.year());\n } \n \n // This month\n else if (match[RELATIVE_WORD_GROUP].match(/month/i)) {\n date.add(-date.date() + 1, 'd');\n result.start.imply('day', date.date());\n result.start.assign('year', date.year());\n result.start.assign('month', date.month() + 1);\n } \n\n // This year\n else if (match[RELATIVE_WORD_GROUP].match(/year/i)) {\n date.add(-date.date() + 1, 'd');\n date.add(-date.month(), 'month');\n\n result.start.imply('day', date.date());\n result.start.imply('month', date.month() + 1);\n result.start.assign('year', date.year());\n } \n\n return result;\n }\n }\n \n if (match[RELATIVE_WORD_GROUP].match(/day|week|month|year/i)) {\n\n if (match[RELATIVE_WORD_GROUP].match(/day/i)) {\n date.add(num, 'd');\n result.start.assign('year', date.year());\n result.start.assign('month', date.month() + 1);\n result.start.assign('day', date.date());\n } else if (match[RELATIVE_WORD_GROUP].match(/week/i)) {\n date.add(num * 7, 'd');\n // We don't know the exact date for next/last week so we imply\n // them\n result.start.imply('day', date.date());\n result.start.imply('month', date.month() + 1);\n result.start.imply('year', date.year());\n } else if (match[RELATIVE_WORD_GROUP].match(/month/i)) {\n date.add(num, 'month');\n // We don't know the exact day for next/last month\n result.start.imply('day', date.date());\n result.start.assign('year', date.year());\n result.start.assign('month', date.month() + 1);\n } else if (match[RELATIVE_WORD_GROUP].match(/year/i)) {\n date.add(num, 'year');\n // We don't know the exact day for month on next/last year\n result.start.imply('day', date.date());\n result.start.imply('month', date.month() + 1);\n result.start.assign('year', date.year());\n }\n\n return result;\n }\n\n if (match[RELATIVE_WORD_GROUP].match(/hour/i)) {\n\n date.add(num, 'hour');\n result.start.imply('minute', date.minute());\n result.start.imply('second', date.second());\n\n } else if (match[RELATIVE_WORD_GROUP].match(/min/i)) {\n\n date.add(num, 'minute');\n result.start.assign('minute', date.minute());\n result.start.imply('second', date.second());\n\n } else if (match[RELATIVE_WORD_GROUP].match(/second/i)) {\n\n date.add(num, 'second');\n result.start.assign('second', date.second());\n result.start.assign('minute', date.minute());\n }\n\n result.start.assign('hour', date.hour());\n result.start.assign('year', date.year());\n result.start.assign('month', date.month() + 1);\n result.start.assign('day', date.date());\n return result;\n };\n};\n","/*\n Date format with slash \"/\" (also \"-\" and \".\") between numbers\n - Tuesday 11/3/2015 \n - 11/3/2015\n - 11/3\n\n By default the paser us \"middle-endien\" format (US English),\n then fallback to little-endian if failed.\n - 11/3/2015 = November 3rd, 2015\n - 23/4/2015 = April 23th, 2015\n\n If \"littleEndian\" config is set, the parser will try the little-endian first. \n - 11/3/2015 = March 11th, 2015\n*/\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n '(?:' +\n '(?:on\\\\s*?)?' +\n '((?:sun|mon|tues?|wed(?:nes)?|thu(?:rs?)?|fri|sat(?:ur)?)(?:day)?)' +\n '\\\\s*\\\\,?\\\\s*' +\n ')?' +\n '([0-3]{0,1}[0-9]{1})[\\\\/\\\\.\\\\-]([0-3]{0,1}[0-9]{1})' +\n '(?:' +\n '[\\\\/\\\\.\\\\-]' +\n '([0-9]{4}\\s*\\,?\\s*|[0-9]{2}\\s*\\,?\\s*)' +\n ')?' +\n '(\\\\W|$)', 'i');\n\nvar DAYS_OFFSET = { 'sunday': 0, 'sun': 0, 'monday': 1, 'mon': 1,'tuesday': 2, 'wednesday': 3, 'wed': 3,\n 'thursday': 4, 'thur': 4,'friday': 5, 'fri': 5,'saturday': 6, 'sat': 6,}\n\n\nvar OPENNING_GROUP = 1;\nvar ENDING_GROUP = 6;\n\nvar WEEKDAY_GROUP = 2;\n\n\nvar FIRST_NUMBERS_GROUP = 3;\nvar SECOND_NUMBERS_GROUP = 4;\n\nvar YEAR_GROUP = 5;\n\nexports.Parser = function ENSlashDateFormatParser(config) {\n Parser.apply(this, arguments);\n config = config || {};\n var littleEndian = config.littleEndian;\n var MONTH_GROUP = littleEndian ? SECOND_NUMBERS_GROUP : FIRST_NUMBERS_GROUP;\n var DAY_GROUP = littleEndian ? FIRST_NUMBERS_GROUP : SECOND_NUMBERS_GROUP;\n\n this.pattern = function () { return PATTERN; };\n this.extract = function(text, ref, match, opt){\n\n if(match[OPENNING_GROUP] == '/' || match[ENDING_GROUP] == '/') {\n // Long skip, if there is some overlapping like:\n // XX[/YY/ZZ]\n // [XX/YY/]ZZ\n match.index += match[0].length\n return;\n }\n\n var index = match.index + match[OPENNING_GROUP].length;\n var text = match[0].substr(match[OPENNING_GROUP].length, match[0].length - match[ENDING_GROUP].length);\n\n\n var result = new ParsedResult({\n text: text,\n index: index,\n ref: ref,\n });\n\n if(text.match(/^\\d\\.\\d$/)) return;\n if(text.match(/^\\d\\.\\d{1,2}\\.\\d{1,2}$/)) return;\n\n // MM/dd -> OK\n // MM.dd -> NG\n if(!match[YEAR_GROUP] && match[0].indexOf('/') < 0) return;\n\n var date = null;\n var year = match[YEAR_GROUP] || moment(ref).year() + '';\n var month = match[MONTH_GROUP];\n var day = match[DAY_GROUP];\n\n month = parseInt(month);\n day = parseInt(day);\n year = parseInt(year);\n\n if(month < 1 || month > 12) {\n if(month > 12) {\n // dd/mm/yyyy date format if day looks like a month, and month\n // looks like a day.\n if (day >= 1 && day <= 12 && month >= 13 && month <= 31) {\n // unambiguous\n var tday = month;\n month = day;\n day = tday;\n }\n else {\n // both month and day are <= 12\n return null;\n }\n }\n }\n if(day < 1 || day > 31) return null;\n\n if(year < 100){\n if (year > 50) {\n year = year + 1900;\n } else {\n year = year + 2000;\n }\n }\n\n result.start.assign('day', day);\n result.start.assign('month', month);\n if (match[YEAR_GROUP]) {\n result.start.assign('year', year);\n } else {\n result.start.imply('year', year);\n }\n\n //Day of week\n if(match[WEEKDAY_GROUP]) {\n result.start.assign('weekday', DAYS_OFFSET[match[WEEKDAY_GROUP].toLowerCase()]);\n }\n\n result.tags['ENSlashDateFormatParser'] = true;\n return result;\n };\n};\n","/*\n Date format with slash \"/\" between numbers like ENSlashDateFormatParser,\n but this parser expect year before month and date. \n - YYYY/MM/DD\n - YYYY-MM-DD\n - YYYY.MM.DD\n*/\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util = require('../../utils/EN');\n\nvar PATTERN = new RegExp('(\\\\W|^)' \n + '([0-9]{4})[\\\\-\\\\.\\\\/]'\n + '((?:' + util.MONTH_PATTERN + '|[0-9]{1,2}))[\\\\-\\\\.\\\\/]'\n + '([0-9]{1,2})'\n + '(?=\\\\W|$)', 'i');\n\nvar YEAR_NUMBER_GROUP = 2;\nvar MONTH_NUMBER_GROUP = 3;\nvar DATE_NUMBER_GROUP = 4;\n\nexports.Parser = function ENSlashDateFormatStartWithYearParser(){\n Parser.apply(this, arguments);\n \n this.pattern = function() { return PATTERN; }\n \n this.extract = function(text, ref, match, opt){\n\n var text = match[0].substr(match[1].length);\n var index = match.index + match[1].length;\n\n var result = new ParsedResult({\n text: text,\n index: index,\n ref: ref,\n })\n \n var month = match[MONTH_NUMBER_GROUP].toLowerCase();\n month = util.MONTH_OFFSET[month] | month;\n\n result.start.assign('year', parseInt(match[YEAR_NUMBER_GROUP]));\n result.start.assign('month', parseInt(month));\n result.start.assign('day', parseInt(match[DATE_NUMBER_GROUP]));\n\n if (moment(result.start.get('month')) > 12 || moment(result.start.get('month')) < 1 ||\n moment(result.start.get('day')) > 31 || moment(result.start.get('day')) < 1) {\n return null;\n }\n \n result.tags['ENDateFormatParser'] = true;\n return result;\n };\n}\n","/*\n Month/Year date format with slash \"/\" (also \"-\" and \".\") between numbers \n - 11/05\n - 06/2005\n*/\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = new RegExp('(^|[^\\\\d/]\\\\s+|[^\\\\w\\\\s])' +\n '([0-9]|0[1-9]|1[012])/([0-9]{4})' + \n '([^\\\\d/]|$)', 'i');\n\nvar OPENNING_GROUP = 1;\nvar ENDING_GROUP = 4;\n\nvar MONTH_GROUP = 2;\nvar YEAR_GROUP = 3;\n\nexports.Parser = function ENSlashMonthFormatParser(argument) {\n Parser.apply(this, arguments);\n\n this.pattern = function () { return PATTERN; };\n this.extract = function(text, ref, match, opt){\n \n var index = match.index + match[OPENNING_GROUP].length;\n var text = match[0].substr(match[OPENNING_GROUP].length, match[0].length - (1 + match[ENDING_GROUP].length)).trim();\n\n var result = new ParsedResult({\n text: text,\n index: index,\n ref: ref,\n });\n\n var date = null;\n var year = match[YEAR_GROUP] ;\n var month = match[MONTH_GROUP];\n var day = 1;\n \n month = parseInt(month);\n year = parseInt(year);\n\n result.start.imply('day', day);\n result.start.assign('month', month);\n result.start.assign('year', year);\n\n result.tags['ENSlashMonthFormatParser'] = true;\n return result;\n };\n};\n","var moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util = require('../../utils/EN');\n\nvar PATTERN = new RegExp('' +\n '(\\\\W|^)' +\n '(?:within\\\\s*)?' +\n '(' + util.TIME_UNIT_PATTERN + ')' +\n '(?:ago|before|earlier)(?=(?:\\\\W|$))', 'i');\n\nvar STRICT_PATTERN = new RegExp('' +\n '(\\\\W|^)' +\n '(?:within\\\\s*)?' +\n '(' + util.TIME_UNIT_STRICT_PATTERN + ')' +\n 'ago(?=(?:\\\\W|$))', 'i');\n\nexports.Parser = function ENTimeAgoFormatParser(){\n Parser.apply(this, arguments);\n\n this.pattern = function() {\n return this.isStrictMode()? STRICT_PATTERN : PATTERN;\n };\n\n this.extract = function(text, ref, match, opt){\n\n if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\n\n var text = match[0];\n text = match[0].substr(match[1].length, match[0].length - match[1].length);\n var index = match.index + match[1].length;\n\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref\n });\n\n var fragments = util.extractDateTimeUnitFragments(match[2]);\n var date = moment(ref);\n\n for (var key in fragments) {\n date.add(-fragments[key], key);\n }\n\n if (fragments['hour'] > 0 || fragments['minute'] > 0 || fragments['second'] > 0) {\n result.start.assign('hour', date.hour());\n result.start.assign('minute', date.minute());\n result.start.assign('second', date.second());\n result.tags['ENTimeAgoFormatParser'] = true;\n } \n \n if (fragments['d'] > 0 || fragments['month'] > 0 || fragments['year'] > 0) {\n result.start.assign('day', date.date());\n result.start.assign('month', date.month() + 1);\n result.start.assign('year', date.year());\n } else {\n if (fragments['week'] > 0) {\n result.start.imply('weekday', date.day());\n }\n\n result.start.imply('day', date.date());\n result.start.imply('month', date.month() + 1);\n result.start.imply('year', date.year());\n }\n\n return result;\n };\n}\n","/*\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar ParsedComponents = require('../../result').ParsedComponents;\n\nvar FIRST_REG_PATTERN = new RegExp(\"(^|\\\\s|T)\" +\n \"(?:(?:at|from)\\\\s*)??\" + \n \"(\\\\d{1,4}|noon|midnight)\" + \n \"(?:\" + \n \"(?:\\\\.|\\\\:|\\\\:)(\\\\d{1,2})\" + \n \"(?:\" + \n \"(?:\\\\:|\\\\:)(\\\\d{2})(?:\\\\.(\\\\d{1,6}))?\" + \n \")?\" + \n \")?\" + \n \"(?:\\\\s*(A\\\\.M\\\\.|P\\\\.M\\\\.|AM?|PM?|O\\\\W*CLOCK))?\" + \n \"(?=\\\\W|$)\", 'i');\n\n\nvar SECOND_REG_PATTERN = new RegExp(\"^\\\\s*\" + \n \"(\\\\-|\\\\–|\\\\~|\\\\〜|to|\\\\?)\\\\s*\" + \n \"(\\\\d{1,4})\" +\n \"(?:\" + \n \"(?:\\\\.|\\\\:|\\\\:)(\\\\d{1,2})\" + \n \"(?:\" + \n \"(?:\\\\.|\\\\:|\\\\:)(\\\\d{1,2})(?:\\\\.(\\\\d{1,6}))?\" + \n \")?\" + \n \")?\" + \n \"(?:\\\\s*(A\\\\.M\\\\.|P\\\\.M\\\\.|AM?|PM?|O\\\\W*CLOCK))?\" + \n \"(?=\\\\W|$)\", 'i');\n\nvar HOUR_GROUP = 2;\nvar MINUTE_GROUP = 3;\nvar SECOND_GROUP = 4;\nvar MILLI_SECOND_GROUP = 5;\nvar AM_PM_HOUR_GROUP = 6;\n\n\nexports.Parser = function ENTimeExpressionParser(){\n Parser.apply(this, arguments);\n\n this.pattern = function() { return FIRST_REG_PATTERN; }\n \n this.extract = function(text, ref, match, opt){ \n \n // This pattern can be overlapped Ex. [12] AM, 1[2] AM\n if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\n var refMoment = moment(ref);\n var result = new ParsedResult();\n result.ref = ref;\n result.index = match.index + match[1].length;\n result.text = match[0].substring(match[1].length);\n result.tags['ENTimeExpressionParser'] = true;\n\n result.start.imply('day', refMoment.date());\n result.start.imply('month', refMoment.month()+1);\n result.start.imply('year', refMoment.year());\n \n var hour = 0;\n var minute = 0;\n var meridiem = -1;\n\n // ----- Millisecond\n if(match[MILLI_SECOND_GROUP] != null){ \n var millisecond = parseInt(match[MILLI_SECOND_GROUP].substring(0, 3));\n if(millisecond >= 1000) return null;\n \n result.start.assign('millisecond', millisecond);\n }\n\n // ----- Second\n if(match[SECOND_GROUP] != null){ \n var second = parseInt(match[SECOND_GROUP]);\n if(second >= 60) return null;\n\n result.start.assign('second', second);\n }\n \n // ----- Hours\n if (match[HOUR_GROUP].toLowerCase() == \"noon\"){\n meridiem = 1; \n hour = 12;\n } else if (match[HOUR_GROUP].toLowerCase() == \"midnight\") {\n meridiem = 0; \n hour = 0;\n } else {\n hour = parseInt(match[HOUR_GROUP]);\n }\n \n // ----- Minutes\n if(match[MINUTE_GROUP] != null){ \n minute = parseInt(match[MINUTE_GROUP]);\n } else if(hour > 100) { \n minute = hour%100;\n hour = parseInt(hour/100);\n } \n \n if(minute >= 60) {\n return null;\n }\n\n if(hour > 24) {\n return null;\n }\n if (hour >= 12) { \n meridiem = 1;\n }\n\n // ----- AM & PM \n if(match[AM_PM_HOUR_GROUP] != null) {\n if(hour > 12) return null;\n var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();\n if(ampm == \"a\"){\n meridiem = 0; \n if(hour == 12) hour = 0;\n }\n \n if(ampm == \"p\"){\n meridiem = 1; \n if(hour != 12) hour += 12;\n }\n } \n\n result.start.assign('hour', hour);\n result.start.assign('minute', minute);\n\n if (meridiem >= 0) {\n result.start.assign('meridiem', meridiem);\n } else {\n if (hour < 12) {\n result.start.imply('meridiem', 0);\n } else {\n result.start.imply('meridiem', 1);\n }\n }\n\n // ==============================================================\n // Extracting the 'to' chunk\n // ==============================================================\n match = SECOND_REG_PATTERN.exec(text.substring(result.index + result.text.length));\n if (!match) {\n return result;\n }\n\n\n\n // Pattern \"YY.YY -XXXX\" is more like timezone offset\n if (match[0].match(/^\\s*(\\+|\\-)\\s*\\d{3,4}$/)) {\n return result;\n }\n\n if(result.end == null){\n result.end = new ParsedComponents(null, result.start.date());\n }\n\n var hour = 0;\n var minute = 0;\n var meridiem = -1;\n\n // ----- Millisecond\n if(match[MILLI_SECOND_GROUP] != null){ \n var millisecond = parseInt(match[MILLI_SECOND_GROUP].substring(0, 3));\n if(millisecond >= 1000) return null;\n \n result.end.assign('millisecond', millisecond);\n }\n \n // ----- Second\n if(match[SECOND_GROUP] != null){ \n var second = parseInt(match[SECOND_GROUP]);\n if(second >= 60) return null;\n\n result.end.assign('second', second);\n }\n\n hour = parseInt(match[2]);\n \n // ----- Minute\n if (match[MINUTE_GROUP]!= null) {\n \n minute = parseInt(match[MINUTE_GROUP]);\n if(minute >= 60) return result;\n \n } else if (hour > 100) {\n\n minute = hour%100;\n hour = parseInt(hour/100);\n }\n\n if(minute >= 60) {\n return null;\n }\n\n if(hour > 24) {\n return null;\n }\n if (hour >= 12) { \n meridiem = 1;\n }\n \n // ----- AM & PM \n if (match[AM_PM_HOUR_GROUP] != null){\n\n if (hour > 12) return null;\n\n var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();\n if(ampm == \"a\"){\n meridiem = 0; \n if(hour == 12) {\n hour = 0;\n if (!result.end.isCertain('day')) {\n result.end.imply('day', result.end.get('day') + 1);\n }\n }\n }\n \n if(ampm == \"p\"){\n meridiem = 1; \n if(hour != 12) hour += 12;\n }\n \n if (!result.start.isCertain('meridiem')) {\n if (meridiem == 0) {\n \n result.start.imply('meridiem', 0);\n \n if (result.start.get('hour') == 12) {\n result.start.assign('hour', 0);\n }\n\n } else {\n\n result.start.imply('meridiem', 1);\n \n if (result.start.get('hour') != 12) {\n result.start.assign('hour', result.start.get('hour') + 12); \n }\n }\n }\n }\n\n result.text = result.text + match[0];\n result.end.assign('hour', hour);\n result.end.assign('minute', minute);\n if (meridiem >= 0) {\n result.end.assign('meridiem', meridiem);\n } else {\n var startAtPM = result.start.isCertain('meridiem') && result.start.get('meridiem') == 1;\n if (startAtPM && result.start.get('hour') > hour) {\n // 10pm - 1 (am)\n result.end.imply('meridiem', 0);\n\n } else if (hour > 12) {\n result.end.imply('meridiem', 1);\n }\n }\n\n if (result.end.date().getTime() < result.start.date().getTime()) {\n result.end.imply('day', result.end.get('day') + 1)\n }\n \n return result;\n }\n}\n","var moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util = require('../../utils/EN');\n\nvar PATTERN = new RegExp('' +\n /*match[1]*/ '(\\\\W|^)' +\n /*match[2]*/ '(in )?' +\n /*match[3]*/ '(' + util.TIME_UNIT_PATTERN + ')' +\n /*match[4]*/ '(later|after|from now|henceforth|forward|out)?' +\n /*match[5]*/ '(?=(?:\\\\W|$))',\n'i');\n\nvar STRICT_PATTERN = new RegExp('' +\n /*match[1]*/ '(\\\\W|^)' +\n /*match[2]*/ '(in )?' +\n /*match[3]*/ '(' + util.TIME_UNIT_STRICT_PATTERN + ')' +\n /*match[4]*/ '(later|from now)?' +\n /*match[5]*/ '(?=(?:\\\\W|$))',\n'i');\n\nexports.Parser = function ENTimeLaterFormatParser(){\n Parser.apply(this, arguments);\n\n this.pattern = function() {\n return this.isStrictMode()? STRICT_PATTERN : PATTERN;\n };\n\n this.extract = function(text, ref, match, opt){\n if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\n\n var prefix = match[2];\n var suffix = match[4];\n if (!prefix && !suffix) return null;\n\n var preamble = match[1];\n \n var text = match[0];\n text = match[0].substr(preamble.length, match[0].length - preamble.length);\n index = match.index + preamble.length;\n\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref\n });\n\n var fragments = util.extractDateTimeUnitFragments(match[3]);\n var date = moment(ref);\n for (var key in fragments) {\n date.add(fragments[key], key);\n }\n\n if (fragments['hour'] > 0 || fragments['minute'] > 0 || fragments['second'] > 0) {\n result.start.assign('hour', date.hour());\n result.start.assign('minute', date.minute());\n result.start.assign('second', date.second());\n result.tags['ENTimeAgoFormatParser'] = true;\n } \n \n if (fragments['d'] > 0 || fragments['month'] > 0 || fragments['year'] > 0) {\n result.start.assign('day', date.date());\n result.start.assign('month', date.month() + 1);\n result.start.assign('year', date.year());\n } else {\n if (fragments['week'] > 0) {\n result.start.imply('weekday', date.day());\n }\n\n result.start.imply('day', date.date());\n result.start.imply('month', date.month() + 1);\n result.start.imply('year', date.year());\n }\n\n return result;\n };\n}\n","/*\n\n\n*/\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar DAYS_OFFSET = { 'sunday': 0, 'sun': 0, 'monday': 1, 'mon': 1,'tuesday': 2, 'tues':2, 'tue':2, 'wednesday': 3, 'wed': 3,\n 'thursday': 4, 'thurs':4, 'thur': 4, 'thu': 4,'friday': 5, 'fri': 5,'saturday': 6, 'sat': 6};\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n '(?:(?:\\\\,|\\\\(|\\\\()\\\\s*)?' +\n '(?:on\\\\s*?)?' +\n '(?:(this|last|past|next)\\\\s*)?' +\n '(' + Object.keys(DAYS_OFFSET).join('|') + ')' +\n '(?:\\\\s*(?:\\\\,|\\\\)|\\\\)))?' +\n '(?:\\\\s*(this|last|past|next)\\\\s*week)?' +\n '(?=\\\\W|$)', 'i');\n\nvar PREFIX_GROUP = 2;\nvar WEEKDAY_GROUP = 3;\nvar POSTFIX_GROUP = 4;\n\n\nexports.updateParsedComponent = function updateParsedComponent(result, ref, offset, modifier) {\n\n var startMoment = moment(ref);\n var startMomentFixed = false;\n var refOffset = startMoment.day();\n\n if(modifier == 'last' || modifier == 'past') {\n startMoment.day(offset - 7);\n startMomentFixed = true;\n } else if(modifier == 'next') {\n startMoment.day(offset + 7);\n startMomentFixed = true;\n } else if(modifier == 'this') {\n startMoment.day(offset);\n } else {\n if (Math.abs(offset - 7 - refOffset) < Math.abs(offset - refOffset)) {\n startMoment.day(offset - 7);\n } else if (Math.abs(offset + 7 - refOffset) < Math.abs(offset - refOffset)) {\n startMoment.day(offset + 7);\n } else {\n startMoment.day(offset);\n }\n }\n\n result.start.assign('weekday', offset);\n if (startMomentFixed) {\n result.start.assign('day', startMoment.date());\n result.start.assign('month', startMoment.month() + 1);\n result.start.assign('year', startMoment.year());\n } else {\n result.start.imply('day', startMoment.date());\n result.start.imply('month', startMoment.month() + 1);\n result.start.imply('year', startMoment.year());\n }\n\n return result;\n};\n\n\nexports.Parser = function ENWeekdayParser() {\n Parser.apply(this, arguments);\n\n this.pattern = function() { return PATTERN; };\n\n this.extract = function(text, ref, match, opt){\n var index = match.index + match[1].length;\n var text = match[0].substr(match[1].length, match[0].length - match[1].length);\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref\n });\n\n var dayOfWeek = match[WEEKDAY_GROUP].toLowerCase();\n var offset = DAYS_OFFSET[dayOfWeek];\n if(offset === undefined) {\n return null;\n }\n\n var prefix = match[PREFIX_GROUP];\n var postfix = match[POSTFIX_GROUP];\n var norm = prefix || postfix;\n norm = norm || '';\n norm = norm.toLowerCase();\n\n exports.updateParsedComponent(result, ref, offset, norm);\n result.tags['ENWeekdayParser'] = true;\n\n return result;\n }\n};\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\n/*\n Valid patterns:\n - esta mañana -> today in the morning\n - esta tarde -> today in the afternoon/evening\n - esta noche -> tonight\n - ayer por la mañana -> yesterday in the morning\n - ayer por la tarde -> yesterday in the afternoon/evening\n - ayer por la noche -> yesterday at night\n - mañana por la mañana -> tomorrow in the morning\n - mañana por la tarde -> tomorrow in the afternoon/evening\n - mañana por la noche -> tomorrow at night\n - anoche -> tomorrow at night\n - hoy -> today\n - ayer -> yesterday\n - mañana -> tomorrow\n */\nvar PATTERN = /(\\W|^)(ahora|esta\\s*(mañana|tarde|noche)|(ayer|mañana)\\s*por\\s*la\\s*(mañana|tarde|noche)|hoy|mañana|ayer|anoche)(?=\\W|$)/i;\n\nexports.Parser = function ESCasualDateParser(){\n\n Parser.apply(this, arguments);\n\n this.pattern = function() { return PATTERN; }\n\n this.extract = function(text, ref, match, opt){\n\n var text = match[0].substr(match[1].length);\n var index = match.index + match[1].length;\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref,\n });\n\n var refMoment = moment(ref);\n var startMoment = refMoment.clone();\n var lowerText = text.toLowerCase().replace(/\\s+/g, ' ');\n\n if(lowerText == 'mañana'){\n\n // Check not \"Tomorrow\" on late night\n if(refMoment.hour() > 1) {\n startMoment.add(1, 'day');\n }\n\n } else if(lowerText == 'ayer') {\n\n startMoment.add(-1, 'day');\n }\n else if(lowerText == 'anoche') {\n\n result.start.imply('hour', 0);\n if (refMoment.hour() > 6) {\n startMoment.add(-1, 'day');\n }\n\n } else if (lowerText.match(\"esta\")) {\n\n var secondMatch = match[3].toLowerCase();\n if (secondMatch == \"tarde\") {\n\n result.start.imply('hour', 18);\n\n } else if (secondMatch == \"mañana\") {\n\n result.start.imply('hour', 6);\n\n } else if (secondMatch == \"noche\") {\n\n // Normally means this coming midnight\n result.start.imply('hour', 22);\n result.start.imply('meridiem', 1);\n\n }\n } else if (lowerText.match(/por\\s*la/)) {\n\n var firstMatch = match[4].toLowerCase();\n if (firstMatch === 'ayer') {\n\n startMoment.add(-1, 'day');\n\n } else if (firstMatch === 'mañana') {\n\n startMoment.add(1, 'day');\n\n }\n\n var secondMatch = match[5].toLowerCase();\n if (secondMatch == \"tarde\") {\n\n result.start.imply('hour', 18);\n\n } else if (secondMatch == \"mañana\") {\n\n result.start.imply('hour', 9);\n\n } else if (secondMatch == \"noche\") {\n\n // Normally means this coming midnight\n result.start.imply('hour', 22);\n result.start.imply('meridiem', 1);\n\n }\n\n } else if (lowerText.match(\"ahora\")) {\n\n result.start.imply('hour', refMoment.hour());\n result.start.imply('minute', refMoment.minute());\n result.start.imply('second', refMoment.second());\n result.start.imply('millisecond', refMoment.millisecond());\n\n }\n\n result.start.assign('day', startMoment.date())\n result.start.assign('month', startMoment.month() + 1)\n result.start.assign('year', startMoment.year())\n result.tags['ESCasualDateParser'] = true;\n return result;\n }\n}\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = /(\\W|^)(dentro\\s*de|en)\\s*([0-9]+|medi[oa]|una?)\\s*(minutos?|horas?|d[ií]as?)\\s*(?=(?:\\W|$))/i;\n\nexports.Parser = function ESDeadlineFormatParser(){\n Parser.apply(this, arguments);\n\n this.pattern = function() { return PATTERN; }\n\n this.extract = function(text, ref, match, opt){\n\n var index = match.index + match[1].length;\n var text = match[0];\n text = match[0].substr(match[1].length, match[0].length - match[1].length);\n\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref,\n });\n\n var num = parseInt(match[3]);\n if (isNaN(num)) {\n if (match[3].match(/medi/)) {\n num = 0.5;\n } else {\n num = 1;\n }\n }\n\n var date = moment(ref);\n if (match[4].match(/d[ií]a/)) {\n date.add(num, 'd');\n\n result.start.assign('year', date.year());\n result.start.assign('month', date.month() + 1);\n result.start.assign('day', date.date());\n return result;\n }\n\n\n if (match[4].match(/hora/)) {\n\n date.add(num, 'hour');\n\n } else if (match[4].match(/minuto/)) {\n\n date.add(num, 'minute');\n }\n\n result.start.imply('year', date.year());\n result.start.imply('month', date.month() + 1);\n result.start.imply('day', date.date());\n result.start.assign('hour', date.hour());\n result.start.assign('minute', date.minute());\n result.tags['ESDeadlineFormatParser'] = true;\n return result;\n };\n}\n","/*\n\n\n*/\n\nvar moment = require('moment');\n\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar util = require('../../utils/ES');\n\nvar DAYS_OFFSET = util.WEEKDAY_OFFSET;\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n '(?:(Domingo|Lunes|Martes|Miércoles|Miercoles|Jueves|Viernes|Sábado|Sabado|Dom|Lun|Mar|Mie|Jue|Vie|Sab)\\\\s*,?\\\\s*)?' +\n '([0-9]{1,2})(?:º|ª|°)?' +\n '(?:\\\\s*(?:desde|de|\\\\-|\\\\–|al?|hasta|\\\\s)\\\\s*([0-9]{1,2})(?:º|ª|°)?)?\\\\s*(?:de)?\\\\s*' +\n '(Ene(?:ro|\\\\.)?|Feb(?:rero|\\\\.)?|Mar(?:zo|\\\\.)?|Abr(?:il|\\\\.)?|May(?:o|\\\\.)?|Jun(?:io|\\\\.)?|Jul(?:io|\\\\.)?|Ago(?:sto|\\\\.)?|Sep(?:tiembre|\\\\.)?|Set(?:iembre|\\\\.)?|Oct(?:ubre|\\\\.)?|Nov(?:iembre|\\\\.)?|Dic(?:iembre|\\\\.)?)' +\n '(?:\\\\s*(?:del?)?(\\\\s*[0-9]{1,4}(?![^\\\\s]\\\\d))(\\\\s*[ad]\\\\.?\\\\s*c\\\\.?|a\\\\.?\\\\s*d\\\\.?)?)?' +\n '(?=\\\\W|$)', 'i'\n );\n\nvar WEEKDAY_GROUP = 2;\nvar DATE_GROUP = 3;\nvar DATE_TO_GROUP = 4;\nvar MONTH_NAME_GROUP = 5;\nvar YEAR_GROUP = 6;\nvar YEAR_BE_GROUP = 7;\n\nexports.Parser = function ESMonthNameLittleEndianParser(){\n Parser.apply(this, arguments);\n\n this.pattern = function() { return PATTERN; }\n\n this.extract = function(text, ref, match, opt){\n\n var result = new ParsedResult({\n text: match[0].substr(match[1].length, match[0].length - match[1].length),\n index: match.index + match[1].length,\n ref: ref,\n });\n\n var month = match[MONTH_NAME_GROUP];\n month = util.MONTH_OFFSET[month.toLowerCase()];\n\n var day = match[DATE_GROUP];\n day = parseInt(day);\n\n var year = null;\n if (match[YEAR_GROUP]) {\n year = match[YEAR_GROUP];\n year = parseInt(year);\n\n if(match[YEAR_BE_GROUP]){\n if (/a\\.?\\s*c\\.?/i.test(match[YEAR_BE_GROUP])) {\n // antes de Cristo\n year = -year;\n }\n } else if (year < 100){\n\n year = year + 2000;\n }\n }\n\n if(year){\n result.start.assign('day', day);\n result.start.assign('month', month);\n result.start.assign('year', year);\n } else {\n\n //Find the most appropriated year\n var refMoment = moment(ref);\n refMoment.month(month - 1);\n refMoment.date(day);\n refMoment.year(moment(ref).year());\n\n var nextYear = refMoment.clone().add(1, 'y');\n var lastYear = refMoment.clone().add(-1, 'y');\n if( Math.abs(nextYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\n refMoment = nextYear;\n }\n else if( Math.abs(lastYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\n refMoment = lastYear;\n }\n\n result.start.assign('day', day);\n result.start.assign('month', month);\n result.start.imply('year', refMoment.year());\n }\n\n // Weekday component\n if (match[WEEKDAY_GROUP]) {\n var weekday = match[WEEKDAY_GROUP];\n weekday = util.WEEKDAY_OFFSET[weekday.toLowerCase()]\n result.start.assign('weekday', weekday);\n }\n\n // Text can be 'range' value. Such as '12 - 13 January 2012'\n if (match[DATE_TO_GROUP]) {\n result.end = result.start.clone();\n result.end.assign('day', parseInt(match[DATE_TO_GROUP]));\n }\n\n result.tags['ESMonthNameLittleEndianParser'] = true;\n return result;\n };\n}\n","/*\n Date format with slash \"/\" (also \"-\" and \".\") between numbers\n - Martes 3/11/2015\n - 3/11/2015\n - 3/11\n*/\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n '(?:' +\n '((?:domingo|dom|lunes|lun|martes|mar|mi[ée]rcoles|mie|jueves|jue|viernes|vie|s[áa]bado|sab))' +\n '\\\\s*\\\\,?\\\\s*' +\n ')?' +\n '([0-1]{0,1}[0-9]{1})[\\\\/\\\\.\\\\-]([0-3]{0,1}[0-9]{1})' +\n '(?:' +\n '[\\\\/\\\\.\\\\-]' +\n '([0-9]{4}\\s*\\,?\\s*|[0-9]{2}\\s*\\,?\\s*)' +\n ')?' +\n '(\\\\W|$)', 'i');\n\nvar DAYS_OFFSET = { 'domingo': 0, 'dom': 0, 'lunes': 1, 'lun': 1, 'martes': 2, 'mar': 2, 'miercoles': 3, 'miércoles': 3, 'mie': 3,\n 'jueves': 4, 'jue': 4, 'viernes': 5, 'vier': 5, 'sábado': 6, 'sabado': 6, 'sab': 6,}\n\n\nvar OPENNING_GROUP = 1;\nvar ENDING_GROUP = 6;\n\n// in Spanish we use day/month/year\nvar WEEKDAY_GROUP = 2;\nvar MONTH_GROUP = 4;\nvar DAY_GROUP = 3;\nvar YEAR_GROUP = 5;\n\nexports.Parser = function ESSlashDateFormatParser(argument) {\n Parser.apply(this, arguments);\n\n this.pattern = function () { return PATTERN; };\n this.extract = function(text, ref, match, opt){\n\n if(match[OPENNING_GROUP] == '/' || match[ENDING_GROUP] == '/') {\n // Long skip, if there is some overlapping like:\n // XX[/YY/ZZ]\n // [XX/YY/]ZZ\n match.index += match[0].length\n return;\n }\n\n var index = match.index + match[OPENNING_GROUP].length;\n var text = match[0].substr(match[OPENNING_GROUP].length, match[0].length - match[ENDING_GROUP].length);\n\n\n var result = new ParsedResult({\n text: text,\n index: index,\n ref: ref,\n });\n\n if(text.match(/^\\d\\.\\d$/)) return;\n if(text.match(/^\\d\\.\\d{1,2}\\.\\d{1,2}$/)) return;\n\n // MM/dd -> OK\n // MM.dd -> NG\n if(!match[YEAR_GROUP] && match[0].indexOf('/') < 0) return;\n\n var date = null;\n var year = match[YEAR_GROUP] || moment(ref).year() + '';\n var month = match[MONTH_GROUP];\n var day = match[DAY_GROUP];\n\n month = parseInt(month);\n day = parseInt(day);\n year = parseInt(year);\n\n if(month < 1 || month > 12) {\n if(month > 12) {\n // dd/mm/yyyy date format if day looks like a month, and month\n // looks like a day.\n if (day >= 1 && day <= 12 && month >= 13 && month <= 31) {\n // unambiguous\n var tday = month;\n month = day;\n day = tday;\n }\n else {\n // both month and day are <= 12\n return null;\n }\n }\n }\n if(day < 1 || day > 31) return null;\n\n if(year < 100){\n if(year > 50){\n year = year + 1900;\n }else{\n year = year + 2000;\n }\n }\n\n result.start.assign('day', day);\n result.start.assign('month', month);\n result.start.assign('year', year);\n\n //Day of week\n if(match[WEEKDAY_GROUP]) {\n result.start.assign('weekday', DAYS_OFFSET[match[WEEKDAY_GROUP].toLowerCase()]);\n }\n\n result.tags['ESSlashDateFormatParser'] = true;\n return result;\n };\n};","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = /(\\W|^)hace\\s*([0-9]+|medi[oa]|una?)\\s*(minutos?|horas?|semanas?|d[ií]as?|mes(es)?|años?)(?=(?:\\W|$))/i;\n\nexports.Parser = function ESTimeAgoFormatParser(){\n Parser.apply(this, arguments);\n\n this.pattern = function() {\n return PATTERN;\n }\n\n this.extract = function(text, ref, match, opt){\n\n if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\n\n var text = match[0];\n text = match[0].substr(match[1].length, match[0].length - match[1].length);\n index = match.index + match[1].length;\n\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref,\n });\n\n var num = parseInt(match[2]);\n if (isNaN(num)) {\n if (match[2].match(/medi/)) {\n num = 0.5;\n } else {\n num = 1;\n }\n }\n\n var date = moment(ref);\n\n if (match[3].match(/hora/) || match[3].match(/minuto/)) {\n if (match[3].match(/hora/)) {\n\n date.add(-num, 'hour');\n\n } else if (match[3].match(/minuto/)) {\n\n date.add(-num, 'minute');\n }\n\n result.start.imply('day', date.date());\n result.start.imply('month', date.month() + 1);\n result.start.imply('year', date.year());\n result.start.assign('hour', date.hour());\n result.start.assign('minute', date.minute());\n result.tags['ESTimeAgoFormatParser'] = true;\n return result;\n }\n\n if (match[3].match(/semana/)) {\n date.add(-num, 'week');\n\n result.start.imply('day', date.date());\n result.start.imply('month', date.month() + 1);\n result.start.imply('year', date.year());\n result.start.imply('weekday', date.day());\n return result;\n }\n\n if (match[3].match(/d[ií]a/)) {\n date.add(-num, 'd');\n }\n\n if (match[3].match(/mes/)) {\n date.add(-num, 'month');\n }\n\n if (match[3].match(/año/)) {\n\n date.add(-num, 'year');\n }\n\n result.start.assign('day', date.date());\n result.start.assign('month', date.month() + 1);\n result.start.assign('year', date.year());\n return result;\n\n };\n}\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar ParsedComponents = require('../../result').ParsedComponents;\n\nvar FIRST_REG_PATTERN = new RegExp(\"(^|\\\\s|T)\" +\n \"(?:(?:a las?|al?|desde|de)\\\\s*)?\" +\n \"(\\\\d{1,4}|mediod[ií]a|medianoche)\" +\n \"(?:\" +\n \"(?:\\\\.|\\\\:|\\\\:)(\\\\d{1,2})\" +\n \"(?:\" +\n \"(?:\\\\:|\\\\:)(\\\\d{2})\" +\n \")?\" +\n \")?\" +\n \"(?:\\\\s*(A\\\\.M\\\\.|P\\\\.M\\\\.|AM?|PM?))?\" +\n \"(?=\\\\W|$)\", 'i');\n\n\nvar SECOND_REG_PATTERN = new RegExp(\"^\\\\s*\" +\n \"(\\\\-|\\\\–|\\\\~|\\\\〜|a(?:\\s*las)?|\\\\?)\\\\s*\" +\n \"(\\\\d{1,4})\" +\n \"(?:\" +\n \"(?:\\\\.|\\\\:|\\\\:)(\\\\d{1,2})\" +\n \"(?:\" +\n \"(?:\\\\.|\\\\:|\\\\:)(\\\\d{1,2})\" +\n \")?\" +\n \")?\" +\n \"(?:\\\\s*(A\\\\.M\\\\.|P\\\\.M\\\\.|AM?|PM?))?\" +\n \"(?=\\\\W|$)\", 'i');\n\nvar HOUR_GROUP = 2;\nvar MINUTE_GROUP = 3;\nvar SECOND_GROUP = 4;\nvar AM_PM_HOUR_GROUP = 5;\n\nexports.Parser = function ESTimeExpressionParser(){\n Parser.apply(this, arguments);\n\n this.pattern = function() { return FIRST_REG_PATTERN; }\n\n this.extract = function(text, ref, match, opt){\n\n // This pattern can be overlaped Ex. [12] AM, 1[2] AM\n if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\n var refMoment = moment(ref);\n var result = new ParsedResult();\n result.ref = ref;\n result.index = match.index + match[1].length;\n result.text = match[0].substring(match[1].length);\n result.tags['ESTimeExpressionParser'] = true;\n\n result.start.imply('day', refMoment.date());\n result.start.imply('month', refMoment.month()+1);\n result.start.imply('year', refMoment.year());\n\n var hour = 0;\n var minute = 0;\n var meridiem = -1;\n\n // ----- Second\n if(match[SECOND_GROUP] != null){\n var second = parseInt(match[SECOND_GROUP]);\n if(second >= 60) return null;\n\n result.start.assign('second', second);\n }\n\n // ----- Hours\n if (match[HOUR_GROUP].toLowerCase().match(/mediod/)){\n meridiem = 1;\n hour = 12;\n } else if (match[HOUR_GROUP].toLowerCase() == \"medianoche\") {\n meridiem = 0;\n hour = 0;\n } else {\n hour = parseInt(match[HOUR_GROUP]);\n }\n\n // ----- Minutes\n if(match[MINUTE_GROUP] != null){\n minute = parseInt(match[MINUTE_GROUP]);\n } else if(hour > 100) {\n minute = hour%100;\n hour = parseInt(hour/100);\n }\n\n if(minute >= 60) {\n return null;\n }\n\n if(hour > 24) {\n return null;\n }\n if (hour >= 12) {\n meridiem = 1;\n }\n\n // ----- AM & PM\n if(match[AM_PM_HOUR_GROUP] != null) {\n if(hour > 12) return null;\n var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();\n if(ampm == \"a\"){\n meridiem = 0;\n if(hour == 12) hour = 0;\n }\n\n if(ampm == \"p\"){\n meridiem = 1;\n if(hour != 12) hour += 12;\n }\n }\n result.start.assign('hour', hour);\n result.start.assign('minute', minute);\n if (meridiem >= 0) {\n result.start.assign('meridiem', meridiem);\n }\n\n // ==============================================================\n // Extracting the 'to' chunk\n // ==============================================================\n match = SECOND_REG_PATTERN.exec(text.substring(result.index + result.text.length));\n if (!match) {\n // Not accept number only result\n if (result.text.match(/^\\d+$/)) {\n return null;\n }\n return result;\n }\n\n\n\n // Pattern \"YY.YY -XXXX\" is more like timezone offset\n if (match[0].match(/^\\s*(\\+|\\-)\\s*\\d{3,4}$/)) {\n return result;\n }\n\n if(result.end == null){\n result.end = new ParsedComponents(null, result.start.date());\n }\n\n var hour = 0;\n var minute = 0;\n var meridiem = -1;\n\n // ----- Second\n if(match[SECOND_GROUP] != null){\n var second = parseInt(match[SECOND_GROUP]);\n if(second >= 60) return null;\n\n result.end.assign('second', second);\n }\n\n hour = parseInt(match[2]);\n\n // ----- Minute\n if (match[MINUTE_GROUP]!= null) {\n\n minute = parseInt(match[MINUTE_GROUP]);\n if(minute >= 60) return result;\n\n } else if (hour > 100) {\n\n minute = hour%100;\n hour = parseInt(hour/100);\n }\n\n if(minute >= 60) {\n return null;\n }\n\n if(hour > 24) {\n return null;\n }\n if (hour >= 12) {\n meridiem = 1;\n }\n\n // ----- AM & PM\n if (match[AM_PM_HOUR_GROUP] != null){\n\n if (hour > 12) return null;\n\n if(match[AM_PM_HOUR_GROUP][0].toLowerCase() == \"a\"){\n meridiem = 0;\n if(hour == 12) {\n hour = 0;\n if (!result.end.isCertain('day')) {\n result.end.imply('day', result.end.get('day') + 1);\n }\n }\n }\n\n if(match[AM_PM_HOUR_GROUP][0].toLowerCase() == \"p\"){\n meridiem = 1;\n if(hour != 12) hour += 12;\n }\n\n if (!result.start.isCertain('meridiem')) {\n if (meridiem == 0) {\n\n result.start.imply('meridiem', 0);\n\n if (result.start.get('hour') == 12) {\n result.start.assign('hour', 0);\n }\n\n } else {\n\n result.start.imply('meridiem', 1);\n\n if (result.start.get('hour') != 12) {\n result.start.assign('hour', result.start.get('hour') + 12);\n }\n }\n }\n\n } else if(hour >= 12) {\n meridiem = 1;\n }\n\n result.text = result.text + match[0];\n result.end.assign('hour', hour);\n result.end.assign('minute', minute);\n if (meridiem >= 0) {\n result.end.assign('meridiem', meridiem);\n }\n\n if (result.end.date().getTime() < result.start.date().getTime()) {\n result.end.imply('day', result.end.get('day') + 1)\n }\n\n return result;\n }\n}\n","/*\n\n\n*/\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar updateParsedComponent = require('../en/ENWeekdayParser').updateParsedComponent;\n\nvar DAYS_OFFSET = { 'domingo': 0, 'dom': 0, 'lunes': 1, 'lun': 1, 'martes': 2, 'mar':2, 'miercoles': 3, 'miércoles': 3, 'mie': 3,\n 'jueves': 4, 'jue': 4, 'viernes': 5, 'vier': 5, 'sabado': 6, 'sábado': 6, 'sab': 6,}\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n '(?:(?:\\\\,|\\\\(|\\\\()\\\\s*)?' +\n '(?:(este|pasado|pr[oó]ximo)\\\\s*)?' +\n '(' + Object.keys(DAYS_OFFSET).join('|') + ')' +\n '(?:\\\\s*(?:\\\\,|\\\\)|\\\\)))?' +\n '(?:\\\\s*(este|pasado|pr[óo]ximo)\\\\s*week)?' +\n '(?=\\\\W|$)', 'i');\n\nvar PREFIX_GROUP = 2;\nvar WEEKDAY_GROUP = 3;\nvar POSTFIX_GROUP = 4;\n\nexports.Parser = function ESWeekdayParser() {\n Parser.apply(this, arguments);\n\n this.pattern = function() { return PATTERN; }\n\n this.extract = function(text, ref, match, opt){\n var index = match.index + match[1].length;\n var text = match[0].substr(match[1].length, match[0].length - match[1].length);\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref\n });\n\n var dayOfWeek = match[WEEKDAY_GROUP].toLowerCase();\n var offset = DAYS_OFFSET[dayOfWeek];\n if(offset === undefined) return null;\n\n var modifier = null;\n var prefix = match[PREFIX_GROUP];\n var postfix = match[POSTFIX_GROUP];\n if (prefix || postfix) {\n var norm = prefix || postfix;\n norm = norm.toLowerCase();\n\n if(norm == 'pasado') {\n modifier = 'this';\n }\n else if(norm == 'próximo' || norm == 'proximo') {\n modifier = 'next';\n }\n else if(norm== 'este') {\n modifier = 'this';\n }\n }\n\n updateParsedComponent(result, ref, offset, modifier);\n result.tags['ESWeekdayParser'] = true;\n return result;\n }\n}\n","/*\r\n\r\n\r\n*/\r\n\r\nvar moment = require('moment');\r\nvar Parser = require('../parser').Parser;\r\nvar ParsedResult = require('../../result').ParsedResult;\r\n\r\nvar PATTERN = /(\\W|^)(maintenant|aujourd'hui|ajd|cette\\s*nuit|la\\s*veille|(demain|hier)(\\s*(matin|soir|aprem|après-midi))?|ce\\s*(matin|soir)|cet\\s*(après-midi|aprem))(?=\\W|$)/i;\r\n\r\nexports.Parser = function FRCasualDateParser(){\r\n\r\n Parser.apply(this, arguments);\r\n\r\n this.pattern = function() { return PATTERN; }\r\n\r\n this.extract = function(text, ref, match, opt){\r\n\r\n var text = match[0].substr(match[1].length);\r\n var index = match.index + match[1].length;\r\n var result = new ParsedResult({\r\n index: index,\r\n text: text,\r\n ref: ref,\r\n });\r\n\r\n var refMoment = moment(ref);\r\n var startMoment = refMoment.clone();\r\n var lowerText = text.toLowerCase();\r\n\r\n if(lowerText.match(/demain/)){\r\n // Check not \"Tomorrow\" on late night\r\n if(refMoment.hour() > 1) {\r\n startMoment.add(1, 'day');\r\n }\r\n } \r\n\r\n if(lowerText.match(/hier/)) {\r\n startMoment.add(-1, 'day');\r\n }\r\n\r\n if(lowerText.match(/cette\\s*nuit/)){\r\n // Normally means this coming midnight\r\n result.start.imply('hour', 22);\r\n result.start.imply('meridiem', 1);\r\n\r\n } else if(lowerText.match(/la\\s*veille/)) {\r\n\r\n result.start.imply('hour', 0);\r\n if (refMoment.hour() > 6) {\r\n startMoment.add(-1, 'day');\r\n }\r\n\r\n } else if (lowerText.match(/(après-midi|aprem)/)) {\r\n\r\n result.start.imply('hour', 14);\r\n\r\n } else if (lowerText.match(/(soir)/)) {\r\n\r\n result.start.imply('hour', 18);\r\n\r\n } else if (lowerText.match(/matin/)) {\r\n\r\n result.start.imply('hour', 8);\r\n\r\n } else if (lowerText.match(\"maintenant\")) {\r\n\r\n result.start.imply('hour', refMoment.hour());\r\n result.start.imply('minute', refMoment.minute());\r\n result.start.imply('second', refMoment.second());\r\n result.start.imply('millisecond', refMoment.millisecond());\r\n\r\n }\r\n\r\n result.start.assign('day', startMoment.date())\r\n result.start.assign('month', startMoment.month() + 1)\r\n result.start.assign('year', startMoment.year())\r\n result.tags['FRCasualDateParser'] = true;\r\n return result;\r\n }\r\n}\r\n","/*\r\n\r\n\r\n*/\r\n\r\nvar moment = require('moment');\r\nvar Parser = require('../parser').Parser;\r\nvar ParsedResult = require('../../result').ParsedResult;\r\nvar util = require('../../utils/FR');\r\n\r\nvar PATTERN = new RegExp('(\\\\W|^)' +\r\n '(dans|en)\\\\s*' +\r\n '('+ util.INTEGER_WORDS_PATTERN + '|[0-9]+|une?|(?:\\\\s*quelques)?|demi(?:\\\\s*|-?)?)\\\\s*' +\r\n '(secondes?|min(?:ute)?s?|heures?|jours?|semaines?|mois|années?)\\\\s*' +\r\n '(?=\\\\W|$)', 'i'\r\n);\r\n\r\nvar STRICT_PATTERN = new RegExp('(\\\\W|^)' +\r\n '(dans|en)\\\\s*' +\r\n '('+ util.INTEGER_WORDS_PATTERN + '|[0-9]+|un?)\\\\s*' +\r\n '(secondes?|minutes?|heures?|jours?)\\\\s*' +\r\n '(?=\\\\W|$)', 'i'\r\n);\r\n\r\nexports.Parser = function FRDeadlineFormatParser(){\r\n Parser.apply(this, arguments);\r\n\r\n this.pattern = function() {\r\n return this.isStrictMode()? STRICT_PATTERN : PATTERN;\r\n };\r\n\r\n this.extract = function(text, ref, match, opt){\r\n\r\n var index = match.index + match[1].length;\r\n var text = match[0];\r\n text = match[0].substr(match[1].length, match[0].length - match[1].length);\r\n\r\n var result = new ParsedResult({\r\n index: index,\r\n text: text,\r\n ref: ref\r\n });\r\n\r\n var num = match[3];\r\n if (util.INTEGER_WORDS[num] !== undefined) {\r\n num = util.INTEGER_WORDS[num];\r\n } else if (num === 'un' || num === 'une'){\r\n num = 1;\r\n } else if (num.match(/quelques?/i)){\r\n num = 3;\r\n } else if (num.match(/demi-?/i)) {\r\n num = 0.5;\r\n } else {\r\n num = parseInt(num);\r\n }\r\n\r\n var date = moment(ref);\r\n if (match[4].match(/jour|semaine|mois|année/i)) {\r\n\r\n if (match[4].match(/jour/)) {\r\n date.add(num, 'd');\r\n } else if (match[4].match(/semaine/i)) {\r\n date.add(num * 7, 'd');\r\n } else if (match[4].match(/mois/i)) {\r\n date.add(num, 'month');\r\n } else if (match[4].match(/année/i)) {\r\n date.add(num, 'year');\r\n }\r\n\r\n result.start.assign('year', date.year());\r\n result.start.assign('month', date.month() + 1);\r\n result.start.assign('day', date.date());\r\n return result;\r\n }\r\n\r\n if (match[4].match(/heure/i)) {\r\n\r\n date.add(num, 'hour');\r\n\r\n } else if (match[4].match(/min/i)) {\r\n\r\n date.add(num, 'minutes');\r\n\r\n } else if (match[4].match(/secondes/i)) {\r\n\r\n date.add(num, 'second');\r\n }\r\n\r\n result.start.imply('year', date.year());\r\n result.start.imply('month', date.month() + 1);\r\n result.start.imply('day', date.date());\r\n result.start.assign('hour', date.hour());\r\n result.start.assign('minute', date.minute());\r\n result.start.assign('second', date.second());\r\n result.tags['FRDeadlineFormatParser'] = true;\r\n return result;\r\n };\r\n};\r\n","/*\r\n\r\n\r\n*/\r\n\r\nvar moment = require('moment');\r\n\r\nvar Parser = require('../parser').Parser;\r\nvar ParsedResult = require('../../result').ParsedResult;\r\n\r\nvar util = require('../../utils/FR');\r\n\r\nvar DAYS_OFFSET = util.WEEKDAY_OFFSET;\r\n\r\nvar PATTERN = new RegExp('(\\\\W|^)' +\r\n '(?:(Dimanche|Lundi|Mardi|mercredi|Jeudi|Vendredi|Samedi|Dim|Lun|Mar|Mer|Jeu|Ven|Sam)\\\\s*,?\\\\s*)?' +\r\n '([0-9]{1,2}|1er)' +\r\n '(?:\\\\s*(?:au|\\\\-|\\\\–|jusqu\\'au?|\\\\s)\\\\s*([0-9]{1,2})(?:er)?)?\\\\s*(?:de)?\\\\s*' +\r\n '(Jan(?:vier|\\\\.)?|F[ée]v(?:rier|\\\\.)?|Mars|Avr(?:il|\\\\.)?|Mai|Juin|Juil(?:let|\\\\.)?|Ao[uû]t|Sept(?:embre|\\\\.)?|Oct(?:obre|\\\\.)?|Nov(?:embre|\\\\.)?|d[ée]c(?:embre|\\\\.)?)' +\r\n '(?:\\\\s*(\\\\s*[0-9]{1,4}(?![^\\\\s]\\\\d))(?:\\\\s*(AC|[ap]\\\\.?\\\\s*c(?:h(?:r)?)?\\\\.?\\\\s*n\\\\.?))?)?' +\r\n '(?=\\\\W|$)', 'i'\r\n );\r\n\r\nvar WEEKDAY_GROUP = 2;\r\nvar DATE_GROUP = 3;\r\nvar DATE_TO_GROUP = 4;\r\nvar MONTH_NAME_GROUP = 5;\r\nvar YEAR_GROUP = 6;\r\nvar YEAR_BE_GROUP = 7;\r\n\r\nexports.Parser = function FRMonthNameLittleEndianParser(){\r\n Parser.apply(this, arguments);\r\n\r\n this.pattern = function() { return PATTERN; }\r\n\r\n this.extract = function(text, ref, match, opt){\r\n\r\n var result = new ParsedResult({\r\n text: match[0].substr(match[1].length, match[0].length - match[1].length),\r\n index: match.index + match[1].length,\r\n ref: ref,\r\n });\r\n\r\n var month = match[MONTH_NAME_GROUP];\r\n month = util.MONTH_OFFSET[month.toLowerCase()];\r\n\r\n var day = match[DATE_GROUP];\r\n day = parseInt(day);\r\n\r\n var year = null;\r\n if (match[YEAR_GROUP]) {\r\n year = match[YEAR_GROUP];\r\n year = parseInt(year);\r\n\r\n if(match[YEAR_BE_GROUP]){\r\n if (/a/i.test(match[YEAR_BE_GROUP])) {\r\n // Ante Christe natum\r\n year = -year;\r\n }\r\n } else if (year < 100){\r\n\r\n year = year + 2000;\r\n }\r\n }\r\n\r\n if(year){\r\n result.start.assign('day', day);\r\n result.start.assign('month', month);\r\n result.start.assign('year', year);\r\n } else {\r\n\r\n // Find the most appropriated year\r\n var refMoment = moment(ref);\r\n refMoment.month(month - 1);\r\n refMoment.date(day);\r\n refMoment.year(moment(ref).year());\r\n\r\n var nextYear = refMoment.clone().add(1, 'y');\r\n var lastYear = refMoment.clone().add(-1, 'y');\r\n if( Math.abs(nextYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\r\n refMoment = nextYear;\r\n }\r\n else if( Math.abs(lastYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\r\n refMoment = lastYear;\r\n }\r\n\r\n result.start.assign('day', day);\r\n result.start.assign('month', month);\r\n result.start.imply('year', refMoment.year());\r\n }\r\n\r\n // Weekday component\r\n if (match[WEEKDAY_GROUP]) {\r\n var weekday = match[WEEKDAY_GROUP];\r\n weekday = util.WEEKDAY_OFFSET[weekday.toLowerCase()]\r\n result.start.assign('weekday', weekday);\r\n }\r\n\r\n // Text can be 'range' value. Such as '12 - 13 janvier 2012'\r\n if (match[DATE_TO_GROUP]) {\r\n result.end = result.start.clone();\r\n result.end.assign('day', parseInt(match[DATE_TO_GROUP]));\r\n }\r\n\r\n result.tags['FRMonthNameLittleEndianParser'] = true;\r\n return result;\r\n };\r\n}\r\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util = require('../../utils/FR');\n\n// Force load fr localization data from moment for the locale files to be linkded durning browserify.\n// NOTE: The function moment.defineLocale() also has a side effect that it change global locale\n// We also need to save and restore the previous locale (see. moment.js, loadLocale)\nvar originalLocale = moment.locale();\nrequire('moment/locale/fr');\nmoment.locale(originalLocale);\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n '(?:les?|la|l\\'|du|des?)\\\\s*' +\n '('+ util.INTEGER_WORDS_PATTERN + '|\\\\d+)?\\\\s*' +\n '(prochaine?s?|derni[eè]re?s?|pass[ée]e?s?|pr[ée]c[ée]dents?|suivante?s?)?\\\\s*' +\n '(secondes?|min(?:ute)?s?|heures?|jours?|semaines?|mois|trimestres?|années?)\\\\s*' +\n '(prochaine?s?|derni[eè]re?s?|pass[ée]e?s?|pr[ée]c[ée]dents?|suivante?s?)?' +\n '(?=\\\\W|$)', 'i'\n);\n\nvar MULTIPLIER_GROUP = 2;\nvar MODIFIER_1_GROUP = 3;\nvar RELATIVE_WORD_GROUP = 4;\nvar MODIFIER_2_GROUP = 5;\n\nexports.Parser = function FRRelativeDateFormatParser(){\n Parser.apply(this, arguments);\n\n this.pattern = function() { return PATTERN; };\n\n this.extract = function(text, ref, match, opt){\n var index = match.index + match[1].length;\n var text = match[0];\n text = match[0].substr(match[1].length, match[0].length - match[1].length);\n\n // Multiplier\n var multiplier = match[MULTIPLIER_GROUP] === undefined ? '1' : match[MULTIPLIER_GROUP];\n if (util.INTEGER_WORDS[multiplier] !== undefined) {\n multiplier = util.INTEGER_WORDS[multiplier];\n } else {\n multiplier = parseInt(multiplier);\n }\n\n // Modifier\n var modifier = match[MODIFIER_1_GROUP] === undefined ?\n (match[MODIFIER_2_GROUP] === undefined ? '' : match[MODIFIER_2_GROUP].toLowerCase())\n : match[MODIFIER_1_GROUP].toLowerCase();\n if(!modifier) {\n // At least one modifier is mandatory to match this parser\n return;\n }\n\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref\n });\n result.tags['FRRelativeDateFormatParser'] = true;\n\n var modifierFactor;\n switch(true) {\n case /prochaine?s?/.test(modifier):\n case /suivants?/.test(modifier):\n modifierFactor = 1;\n break;\n case /derni[eè]re?s?/.test(modifier):\n case /pass[ée]e?s?/.test(modifier):\n case /pr[ée]c[ée]dents?/.test(modifier):\n modifierFactor = -1;\n break;\n }\n\n var total = multiplier * modifierFactor;\n\n var dateFrom = moment(ref),\n dateTo = moment(ref);\n dateFrom.locale('fr');\n dateTo.locale('fr');\n var relative = match[RELATIVE_WORD_GROUP];\n var startOf;\n switch(true) {\n case /secondes?/.test(relative):\n dateFrom.add(total, 's');\n dateTo.add(modifierFactor, 's');\n startOf = 'second';\n break;\n case /min(?:ute)?s?/.test(relative):\n dateFrom.add(total, 'm');\n dateTo.add(modifierFactor, 'm');\n startOf = 'minute';\n break;\n case /heures?/.test(relative):\n dateFrom.add(total, 'h');\n dateTo.add(modifierFactor, 'h');\n startOf = 'hour';\n break;\n case /jours?/.test(relative):\n dateFrom.add(total, 'd');\n dateTo.add(modifierFactor, 'd');\n startOf = 'day';\n break;\n case /semaines?/.test(relative):\n dateFrom.add(total, 'w');\n dateTo.add(modifierFactor, 'w');\n startOf = 'week';\n break;\n case /mois?/.test(relative):\n dateFrom.add(total, 'M');\n dateTo.add(modifierFactor, 'M');\n startOf = 'month';\n break;\n case /trimestres?/.test(relative):\n dateFrom.add(total, 'Q');\n dateTo.add(modifierFactor, 'Q');\n startOf = 'quarter';\n break;\n case /années?/.test(relative):\n dateFrom.add(total, 'y');\n dateTo.add(modifierFactor, 'y');\n startOf = 'year';\n break;\n }\n\n // if we go forward, switch the start and end dates\n if(modifierFactor > 0) {\n var dateTmp = dateFrom;\n dateFrom = dateTo;\n dateTo = dateTmp;\n }\n\n // Get start and end of dates\n dateFrom.startOf(startOf);\n dateTo.endOf(startOf);\n\n // Assign results\n result.start.assign('year', dateFrom.year());\n result.start.assign('month', dateFrom.month() + 1);\n result.start.assign('day', dateFrom.date());\n result.start.assign('minute', dateFrom.minute());\n result.start.assign('second', dateFrom.second());\n result.start.assign('hour', dateFrom.hour());\n result.start.assign('millisecond', dateFrom.millisecond());\n\n result.end = result.start.clone();\n result.end.assign('year', dateTo.year());\n result.end.assign('month', dateTo.month() + 1);\n result.end.assign('day', dateTo.date());\n result.end.assign('minute', dateTo.minute());\n result.end.assign('second', dateTo.second());\n result.end.assign('hour', dateTo.hour());\n result.end.assign('millisecond', dateTo.millisecond());\n return result;\n };\n};\n","/*\r\n Date format with slash \"/\" (also \"-\" and \".\") between numbers\r\n - Martes 3/11/2015\r\n - 3/11/2015\r\n - 3/11\r\n*/\r\nvar moment = require('moment');\r\nvar Parser = require('../parser').Parser;\r\nvar ParsedResult = require('../../result').ParsedResult;\r\n\r\nvar PATTERN = new RegExp('(\\\\W|^)' +\r\n '(?:' +\r\n '((?:dimanche|dim|lundi|lun|mardi|mar|mercredi|mer|jeudi|jeu|vendredi|ven|samedi|sam|le))' +\r\n '\\\\s*\\\\,?\\\\s*' +\r\n ')?' +\r\n '([0-3]{0,1}[0-9]{1})[\\\\/\\\\.\\\\-]([0-3]{0,1}[0-9]{1})' +\r\n '(?:' +\r\n '[\\\\/\\\\.\\\\-]' +\r\n '([0-9]{4}\\s*\\,?\\s*|[0-9]{2}\\s*\\,?\\s*)' +\r\n ')?' +\r\n '(\\\\W|$)', 'i');\r\n\r\nvar DAYS_OFFSET = { 'dimanche': 0, 'dim': 0, 'lundi': 1, 'lun': 1,'mardi': 2, 'mar':2, 'mercredi': 3, 'mer': 3,\r\n 'jeudi': 4, 'jeu':4, 'vendredi': 5, 'ven': 5,'samedi': 6, 'sam': 6};\r\n\r\n\r\nvar OPENNING_GROUP = 1;\r\nvar ENDING_GROUP = 6;\r\n\r\n// In French we use day/month/year\r\nvar WEEKDAY_GROUP = 2;\r\nvar DAY_GROUP = 3;\r\nvar MONTH_GROUP = 4;\r\nvar YEAR_GROUP = 5;\r\nvar YEAR_BE_GROUP = 6;\r\n\r\nexports.Parser = function FRSlashDateFormatParser(argument) {\r\n Parser.apply(this, arguments);\r\n\r\n this.pattern = function () { return PATTERN; };\r\n this.extract = function(text, ref, match, opt){\r\n\r\n if(match[OPENNING_GROUP] == '/' || match[ENDING_GROUP] == '/') {\r\n // Long skip, if there is some overlapping like:\r\n // XX[/YY/ZZ]\r\n // [XX/YY/]ZZ\r\n match.index += match[0].length\r\n return;\r\n }\r\n\r\n var index = match.index + match[OPENNING_GROUP].length;\r\n var text = match[0].substr(match[OPENNING_GROUP].length, match[0].length - match[ENDING_GROUP].length);\r\n\r\n\r\n var result = new ParsedResult({\r\n text: text,\r\n index: index,\r\n ref: ref,\r\n });\r\n\r\n if(text.match(/^\\d\\.\\d$/)) return;\r\n if(text.match(/^\\d\\.\\d{1,2}\\.\\d{1,2}$/)) return;\r\n\r\n // MM/dd -> OK\r\n // MM.dd -> NG\r\n if(!match[YEAR_GROUP] && match[0].indexOf('/') < 0) return;\r\n\r\n var date = null;\r\n var month = match[MONTH_GROUP];\r\n var day = match[DAY_GROUP];\r\n\r\n day = parseInt(day);\r\n month = parseInt(month);\r\n\r\n var year = null;\r\n if (match[YEAR_GROUP]) {\r\n year = match[YEAR_GROUP];\r\n year = parseInt(year);\r\n\r\n if(match[YEAR_BE_GROUP]){\r\n if (/a/i.test(match[YEAR_BE_GROUP])) {\r\n // Ante Christe natum\r\n year = -year;\r\n }\r\n } else if (year < 100){\r\n\r\n year = year + 2000;\r\n }\r\n }\r\n\r\n if(month < 1 || month > 12) {\r\n if(month > 12) {\r\n // dd/mm/yyyy date format if day looks like a month, and month looks like a day.\r\n if (day >= 1 && day <= 12 && month >= 13 && month <= 31) {\r\n // unambiguous\r\n var tday = month;\r\n month = day;\r\n day = tday;\r\n }\r\n else {\r\n // both month and day are <= 12\r\n return null;\r\n }\r\n }\r\n }\r\n\r\n if(day < 1 || day > 31) return null;\r\n\r\n if(year){\r\n result.start.assign('day', day);\r\n result.start.assign('month', month);\r\n result.start.assign('year', year);\r\n } else {\r\n\r\n // Find the most appropriated year\r\n var refMoment = moment(ref);\r\n refMoment.month(month - 1);\r\n refMoment.date(day);\r\n refMoment.year(moment(ref).year());\r\n\r\n var nextYear = refMoment.clone().add(1, 'y');\r\n var lastYear = refMoment.clone().add(-1, 'y');\r\n if( Math.abs(nextYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\r\n refMoment = nextYear;\r\n }\r\n else if( Math.abs(lastYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\r\n refMoment = lastYear;\r\n }\r\n\r\n result.start.assign('day', day);\r\n result.start.assign('month', month);\r\n result.start.imply('year', refMoment.year());\r\n }\r\n\r\n // Day of week\r\n if(match[WEEKDAY_GROUP]) {\r\n result.start.assign('weekday', DAYS_OFFSET[match[WEEKDAY_GROUP].toLowerCase()]);\r\n }\r\n\r\n result.tags['FRSlashDateFormatParser'] = true;\r\n return result;\r\n };\r\n};","/*\r\n\r\n\r\n*/\r\n\r\nvar moment = require('moment');\r\nvar Parser = require('../parser').Parser;\r\nvar ParsedResult = require('../../result').ParsedResult;\r\n\r\nvar PATTERN = /(\\W|^)il y a\\s*([0-9]+|une?)\\s*(minutes?|heures?|semaines?|jours?|mois|années?|ans?)(?=(?:\\W|$))/i;\r\n\r\nexports.Parser = function FRTimeAgoFormatParser(){\r\n Parser.apply(this, arguments);\r\n\r\n this.pattern = function() {\r\n return PATTERN;\r\n }\r\n\r\n this.extract = function(text, ref, match, opt){\r\n\r\n if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\r\n\r\n var text = match[0];\r\n text = match[0].substr(match[1].length, match[0].length - match[1].length);\r\n index = match.index + match[1].length;\r\n\r\n var result = new ParsedResult({\r\n index: index,\r\n text: text,\r\n ref: ref,\r\n });\r\n result.tags['FRTimeAgoFormatParser'] = true;\r\n \r\n var num = parseInt(match[2]);\r\n if (isNaN(num)) {\r\n if (match[2].match(/demi/)) {\r\n num = 0.5;\r\n } else {\r\n num = 1;\r\n }\r\n }\r\n\r\n var date = moment(ref);\r\n\r\n if (match[3].match(/heure/) || match[3].match(/minute/)) {\r\n if (match[3].match(/heure/)) {\r\n\r\n date.add(-num, 'hour');\r\n\r\n } else if (match[3].match(/minute/)) {\r\n\r\n date.add(-num, 'minute');\r\n }\r\n\r\n result.start.imply('day', date.date());\r\n result.start.imply('month', date.month() + 1);\r\n result.start.imply('year', date.year());\r\n result.start.assign('hour', date.hour());\r\n result.start.assign('minute', date.minute());\r\n\r\n return result;\r\n }\r\n\r\n if (match[3].match(/semaine/)) {\r\n date.add(-num, 'week');\r\n\r\n result.start.imply('day', date.date());\r\n result.start.imply('month', date.month() + 1);\r\n result.start.imply('year', date.year());\r\n result.start.imply('weekday', date.day());\r\n return result;\r\n }\r\n\r\n if (match[3].match(/jour/)) {\r\n date.add(-num, 'd');\r\n }\r\n\r\n if (match[3].match(/mois/)) {\r\n date.add(-num, 'month');\r\n }\r\n\r\n if (match[3].match(/années?|ans?/)) {\r\n\r\n date.add(-num, 'year');\r\n }\r\n\r\n result.start.assign('day', date.date());\r\n result.start.assign('month', date.month() + 1);\r\n result.start.assign('year', date.year());\r\n return result;\r\n\r\n };\r\n}\r\n","/*\r\n\r\n\r\n*/\r\n\r\nvar moment = require('moment');\r\nvar Parser = require('../parser').Parser;\r\nvar ParsedResult = require('../../result').ParsedResult;\r\nvar ParsedComponents = require('../../result').ParsedComponents;\r\n\r\nvar FIRST_REG_PATTERN = new RegExp(\"(^|\\\\s|T)\" +\r\n \"(?:(?:[àa])\\\\s*)?\" +\r\n \"(\\\\d{1,2}(?:h)?|midi|minuit)\" +\r\n \"(?:\" +\r\n \"(?:\\\\.|\\\\:|\\\\:|h)(\\\\d{1,2})(?:m)?\" +\r\n \"(?:\" +\r\n \"(?:\\\\:|\\\\:|m)(\\\\d{0,2})(?:s)?\" +\r\n \")?\" +\r\n \")?\" +\r\n \"(?:\\\\s*(A\\\\.M\\\\.|P\\\\.M\\\\.|AM?|PM?))?\" +\r\n \"(?=\\\\W|$)\", 'i');\r\n\r\n\r\nvar SECOND_REG_PATTERN = new RegExp(\"^\\\\s*\" +\r\n \"(\\\\-|\\\\–|\\\\~|\\\\〜|[àa]|\\\\?)\\\\s*\" +\r\n \"(\\\\d{1,2}(?:h)?)\" +\r\n \"(?:\" +\r\n \"(?:\\\\.|\\\\:|\\\\:|h)(\\\\d{1,2})(?:m)?\" +\r\n \"(?:\" +\r\n \"(?:\\\\.|\\\\:|\\\\:|m)(\\\\d{1,2})(?:s)?\" +\r\n \")?\" +\r\n \")?\" +\r\n \"(?:\\\\s*(A\\\\.M\\\\.|P\\\\.M\\\\.|AM?|PM?))?\" +\r\n \"(?=\\\\W|$)\", 'i');\r\n\r\nvar HOUR_GROUP = 2;\r\nvar MINUTE_GROUP = 3;\r\nvar SECOND_GROUP = 4;\r\nvar AM_PM_HOUR_GROUP = 5;\r\n\r\nexports.Parser = function FRTimeExpressionParser(){\r\n Parser.apply(this, arguments);\r\n\r\n this.pattern = function() { return FIRST_REG_PATTERN; }\r\n\r\n this.extract = function(text, ref, match, opt){\r\n\r\n // This pattern can be overlaped Ex. [12] AM, 1[2] AM\r\n if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\r\n var refMoment = moment(ref);\r\n var result = new ParsedResult();\r\n result.ref = ref;\r\n result.index = match.index + match[1].length;\r\n result.text = match[0].substring(match[1].length);\r\n result.tags['FRTimeExpressionParser'] = true;\r\n\r\n result.start.imply('day', refMoment.date());\r\n result.start.imply('month', refMoment.month()+1);\r\n result.start.imply('year', refMoment.year());\r\n\r\n var hour = 0;\r\n var minute = 0;\r\n var meridiem = -1;\r\n\r\n // ----- Second\r\n if(match[SECOND_GROUP] != null){\r\n var second = parseInt(match[SECOND_GROUP]);\r\n if(second >= 60) return null;\r\n\r\n result.start.assign('second', second);\r\n }\r\n\r\n // ----- Hours\r\n if (match[HOUR_GROUP].toLowerCase() == \"midi\"){\r\n meridiem = 1;\r\n hour = 12;\r\n } else if (match[HOUR_GROUP].toLowerCase() == \"minuit\") {\r\n meridiem = 0;\r\n hour = 0;\r\n } else {\r\n hour = parseInt(match[HOUR_GROUP]);\r\n }\r\n\r\n // ----- Minutes\r\n if(match[MINUTE_GROUP] != null){\r\n minute = parseInt(match[MINUTE_GROUP]);\r\n } else if(hour > 100) {\r\n minute = hour%100;\r\n hour = parseInt(hour/100);\r\n }\r\n\r\n if(minute >= 60) {\r\n return null;\r\n }\r\n\r\n if(hour > 24) {\r\n return null;\r\n }\r\n if (hour >= 12) {\r\n meridiem = 1;\r\n }\r\n\r\n // ----- AM & PM\r\n if(match[AM_PM_HOUR_GROUP] != null) {\r\n if(hour > 12) return null;\r\n var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();\r\n if(ampm == \"a\"){\r\n meridiem = 0;\r\n if(hour == 12) hour = 0;\r\n }\r\n\r\n if(ampm == \"p\"){\r\n meridiem = 1;\r\n if(hour != 12) hour += 12;\r\n }\r\n }\r\n result.start.assign('hour', hour);\r\n result.start.assign('minute', minute);\r\n if (meridiem >= 0) {\r\n result.start.assign('meridiem', meridiem);\r\n }\r\n\r\n // ==============================================================\r\n // Extracting the 'to' chunk\r\n // ==============================================================\r\n match = SECOND_REG_PATTERN.exec(text.substring(result.index + result.text.length));\r\n if (!match) {\r\n // Not accept number only result\r\n if (result.text.match(/^\\d+$/)) {\r\n return null;\r\n }\r\n return result;\r\n }\r\n\r\n\r\n\r\n // Pattern \"YY.YY -XXXX\" is more like timezone offset\r\n if (match[0].match(/^\\s*(\\+|\\-)\\s*\\d{3,4}$/)) {\r\n return result;\r\n }\r\n\r\n if(result.end == null){\r\n result.end = new ParsedComponents(null, result.start.date());\r\n }\r\n\r\n var hour = 0;\r\n var minute = 0;\r\n var meridiem = -1;\r\n\r\n // ----- Second\r\n if(match[SECOND_GROUP] != null){\r\n var second = parseInt(match[SECOND_GROUP]);\r\n if(second >= 60) return null;\r\n\r\n result.end.assign('second', second);\r\n }\r\n\r\n hour = parseInt(match[2]);\r\n\r\n // ----- Minute\r\n if (match[MINUTE_GROUP]!= null) {\r\n\r\n minute = parseInt(match[MINUTE_GROUP]);\r\n if(minute >= 60) return result;\r\n\r\n } else if (hour > 100) {\r\n\r\n minute = hour%100;\r\n hour = parseInt(hour/100);\r\n }\r\n\r\n if(minute >= 60) {\r\n return null;\r\n }\r\n\r\n if(hour > 24) {\r\n return null;\r\n }\r\n if (hour >= 12) {\r\n meridiem = 1;\r\n }\r\n\r\n // ----- AM & PM\r\n if (match[AM_PM_HOUR_GROUP] != null){\r\n\r\n if (hour > 12) return null;\r\n\r\n if(match[AM_PM_HOUR_GROUP][0].toLowerCase() == \"a\"){\r\n meridiem = 0;\r\n if(hour == 12) {\r\n hour = 0;\r\n if (!result.end.isCertain('day')) {\r\n result.end.imply('day', result.end.get('day') + 1);\r\n }\r\n }\r\n }\r\n\r\n if(match[AM_PM_HOUR_GROUP][0].toLowerCase() == \"p\"){\r\n meridiem = 1;\r\n if(hour != 12) hour += 12;\r\n }\r\n\r\n if (!result.start.isCertain('meridiem')) {\r\n if (meridiem == 0) {\r\n\r\n result.start.imply('meridiem', 0);\r\n\r\n if (result.start.get('hour') == 12) {\r\n result.start.assign('hour', 0);\r\n }\r\n\r\n } else {\r\n\r\n result.start.imply('meridiem', 1);\r\n\r\n if (result.start.get('hour') != 12) {\r\n result.start.assign('hour', result.start.get('hour') + 12);\r\n }\r\n }\r\n }\r\n\r\n } else if(hour >= 12) {\r\n meridiem = 1;\r\n }\r\n\r\n result.text = result.text + match[0];\r\n result.end.assign('hour', hour);\r\n result.end.assign('minute', minute);\r\n if (meridiem >= 0) {\r\n result.end.assign('meridiem', meridiem);\r\n }\r\n\r\n if (result.end.date().getTime() < result.start.date().getTime()) {\r\n result.end.imply('day', result.end.get('day') + 1)\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n","/*\r\n\r\n\r\n*/\r\nvar moment = require('moment');\r\nvar Parser = require('../parser').Parser;\r\nvar ParsedResult = require('../../result').ParsedResult;\r\nvar updateParsedComponent = require('../en/ENWeekdayParser').updateParsedComponent;\r\n\r\nvar DAYS_OFFSET = { 'dimanche': 0, 'dim': 0, 'lundi': 1, 'lun': 1,'mardi': 2, 'mar':2, 'mercredi': 3, 'mer': 3,\r\n 'jeudi': 4, 'jeu':4, 'vendredi': 5, 'ven': 5,'samedi': 6, 'sam': 6};\r\n\r\nvar PATTERN = new RegExp('(\\\\s|^)' +\r\n '(?:(?:\\\\,|\\\\(|\\\\()\\\\s*)?' +\r\n '(?:(ce)\\\\s*)?' +\r\n '(' + Object.keys(DAYS_OFFSET).join('|') + ')' +\r\n '(?:\\\\s*(?:\\\\,|\\\\)|\\\\)))?' +\r\n '(?:\\\\s*(dernier|prochain)\\\\s*)?' +\r\n '(?=\\\\W|$)', 'i');\r\n\r\nvar PREFIX_GROUP = 2;\r\nvar WEEKDAY_GROUP = 3;\r\nvar POSTFIX_GROUP = 4;\r\n\r\nexports.Parser = function FRWeekdayParser() {\r\n Parser.apply(this, arguments);\r\n\r\n this.pattern = function() { return PATTERN; };\r\n\r\n this.extract = function(text, ref, match, opt){\r\n var index = match.index + match[1].length;\r\n var text = match[0].substr(match[1].length, match[0].length - match[1].length);\r\n var result = new ParsedResult({\r\n index: index,\r\n text: text,\r\n ref: ref\r\n });\r\n\r\n var dayOfWeek = match[WEEKDAY_GROUP].toLowerCase();\r\n var offset = DAYS_OFFSET[dayOfWeek];\r\n if(offset === undefined) return null;\r\n\r\n var modifier = null;\r\n var prefix = match[PREFIX_GROUP];\r\n var postfix = match[POSTFIX_GROUP];\r\n if (prefix || postfix) {\r\n var norm = prefix || postfix;\r\n norm = norm.toLowerCase();\r\n\r\n if(norm == 'dernier') {\r\n modifier = 'last';\r\n } else if(norm == 'prochain') {\r\n modifier = 'next';\r\n } else if(norm== 'ce') {\r\n modifier = 'this';\r\n }\r\n }\r\n\r\n updateParsedComponent(result, ref, offset, modifier);\r\n result.tags['FRWeekdayParser'] = true;\r\n return result;\r\n }\r\n};\r\n\r\n","/*\n \n \n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = /今日|当日|昨日|明日|今夜|今夕|今晩|今朝/i;\n\nexports.Parser = function JPCasualDateParser(){\n \n Parser.apply(this, arguments);\n \n this.pattern = function() { return PATTERN; }\n \n this.extract = function(text, ref, match, opt){ \n \n var index = match.index;\n var text = match[0];\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref,\n });\n\n var refMoment = moment(ref);\n var startMoment = refMoment.clone();\n\n if(text == '今夜' || text == '今夕' || text == '今晩'){\n // Normally means this coming midnight \n result.start.imply('hour', 22);\n result.start.imply('meridiem', 1);\n\n } else if(text == '明日'){\n\n // Check not \"Tomorrow\" on late night\n if(refMoment.hour() > 4) {\n startMoment.add(1, 'day');\n }\n\n } else if(text == '昨日') {\n\n startMoment.add(-1, 'day');\n\n } else if (text.match(\"今朝\")) {\n\n result.start.imply('hour', 6);\n result.start.imply('meridiem', 0);\n }\n\n result.start.assign('day', startMoment.date())\n result.start.assign('month', startMoment.month() + 1)\n result.start.assign('year', startMoment.year())\n result.tags['JPCasualDateParser'] = true;\n return result;\n }\n}\n\n","/*\n \n \n*/\n\nvar moment = require('moment');\n\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar util = require('../../utils/JP'); \nvar PATTERN = /(?:(同|((昭和|平成)?([0-90-9]{2,4})))年\\s*)?([0-90-9]{1,2})月\\s*([0-90-9]{1,2})日/i;\n \nvar YEAR_GROUP = 2;\nvar ERA_GROUP = 3;\nvar YEAR_NUMBER_GROUP = 4;\nvar MONTH_GROUP = 5;\nvar DAY_GROUP = 6;\n\nexports.Parser = function JPStandardParser(){\n Parser.apply(this, arguments);\n \n this.pattern = function() { return PATTERN; }\n \n this.extract = function(text, ref, match, opt){ \n\n var startMoment = moment(ref);\n var result = new ParsedResult({\n text: match[0],\n index: match.index,\n ref: ref,\n });\n \n var month = match[MONTH_GROUP];\n month = util.toHankaku(month);\n month = parseInt(month);\n\n var day = match[DAY_GROUP];\n day = util.toHankaku(day);\n day = parseInt(day);\n\n startMoment.set('date', day);\n startMoment.set('month', month - 1);\n result.start.assign('day', startMoment.date());\n result.start.assign('month', startMoment.month() + 1);\n \n if (!match[YEAR_GROUP]) {\n \n //Find the most appropriated year\n startMoment.year(moment(ref).year());\n var nextYear = startMoment.clone().add(1, 'y');\n var lastYear = startMoment.clone().add(-1, 'y');\n if( Math.abs(nextYear.diff(moment(ref))) < Math.abs(startMoment.diff(moment(ref))) ){ \n startMoment = nextYear;\n }\n else if( Math.abs(lastYear.diff(moment(ref))) < Math.abs(startMoment.diff(moment(ref))) ){ \n startMoment = lastYear;\n }\n\n result.start.assign('day', startMoment.date());\n result.start.assign('month', startMoment.month() + 1);\n result.start.imply('year', startMoment.year());\n\n } else if (match[YEAR_GROUP].match('同年')) {\n\n result.start.assign('year', startMoment.year());\n\n } else {\n var year = match[YEAR_NUMBER_GROUP];\n year = util.toHankaku(year);\n year = parseInt(year);\n\n if (match[ERA_GROUP] == '平成') {\n year += 1988;\n } else if (match[ERA_GROUP] == '昭和') {\n year += 1925;\n }\n\n result.start.assign('year', year);\n }\n \n\n result.tags['JPStandardParser'] = true;\n return result;\n };\n\n}\n\n","\nfunction Parser(config) {\n\n config = config || {};\n var strictMode = config.strict;\n\n this.isStrictMode = function() { return (strictMode == true) };\n\n this.pattern = function() { return /./i; }\n\n this.extract = function(text, ref, match, opt){ return null; }\n\n this.execute = function(text, ref, opt) {\n\n var results = [];\n var regex = this.pattern();\n\n var remainingText = text;\n var match = regex.exec(remainingText);\n\n while (match) {\n\n // Calculate match index on the full text;\n match.index += text.length - remainingText.length;\n\n var result = this.extract(text, ref, match, opt);\n if (result) {\n\n // If success, start from the end of the result\n remainingText = text.substring(result.index + result.text.length);\n\n if (!this.isStrictMode() || result.hasPossibleDates()) {\n results.push(result);\n }\n\n } else {\n // If fail, move on by 1\n remainingText = text.substring(match.index + 1);\n }\n\n match = regex.exec(remainingText);\n }\n\n if (this.refiners) {\n this.refiners.forEach(function () {\n results = refiner.refine(results, text, options);\n });\n }\n\n return results;\n }\n}\n\nexports.Parser = Parser;\n\nexports.ENISOFormatParser = require('./en/ENISOFormatParser').Parser;\nexports.ENDeadlineFormatParser = require('./en/ENDeadlineFormatParser').Parser;\nexports.ENRelativeDateFormatParser = require('./en/ENRelativeDateFormatParser').Parser;\nexports.ENMonthNameLittleEndianParser = require('./en/ENMonthNameLittleEndianParser').Parser;\nexports.ENMonthNameMiddleEndianParser = require('./en/ENMonthNameMiddleEndianParser').Parser;\nexports.ENMonthNameParser = require('./en/ENMonthNameParser').Parser;\nexports.ENSlashDateFormatParser = require('./en/ENSlashDateFormatParser').Parser;\nexports.ENSlashDateFormatStartWithYearParser = require('./en/ENSlashDateFormatStartWithYearParser').Parser;\nexports.ENSlashMonthFormatParser = require('./en/ENSlashMonthFormatParser').Parser;\nexports.ENTimeAgoFormatParser = require('./en/ENTimeAgoFormatParser').Parser;\nexports.ENTimeExpressionParser = require('./en/ENTimeExpressionParser').Parser;\nexports.ENTimeLaterFormatParser = require('./en/ENTimeLaterFormatParser').Parser;\nexports.ENWeekdayParser = require('./en/ENWeekdayParser').Parser;\nexports.ENCasualDateParser = require('./en/ENCasualDateParser').Parser;\nexports.ENCasualTimeParser = require('./en/ENCasualTimeParser').Parser;\n\nexports.JPStandardParser = require('./ja/JPStandardParser').Parser;\nexports.JPCasualDateParser = require('./ja/JPCasualDateParser').Parser;\n\nexports.ESCasualDateParser = require('./es/ESCasualDateParser').Parser;\nexports.ESDeadlineFormatParser = require('./es/ESDeadlineFormatParser').Parser;\nexports.ESTimeAgoFormatParser = require('./es/ESTimeAgoFormatParser').Parser;\nexports.ESTimeExpressionParser = require('./es/ESTimeExpressionParser').Parser;\nexports.ESWeekdayParser = require('./es/ESWeekdayParser').Parser;\nexports.ESMonthNameLittleEndianParser = require('./es/ESMonthNameLittleEndianParser').Parser;\nexports.ESSlashDateFormatParser = require('./es/ESSlashDateFormatParser').Parser;\n\nexports.FRCasualDateParser = require('./fr/FRCasualDateParser').Parser;\nexports.FRDeadlineFormatParser = require('./fr/FRDeadlineFormatParser').Parser;\nexports.FRMonthNameLittleEndianParser = require('./fr/FRMonthNameLittleEndianParser').Parser;\nexports.FRSlashDateFormatParser = require('./fr/FRSlashDateFormatParser').Parser;\nexports.FRTimeAgoFormatParser = require('./fr/FRTimeAgoFormatParser').Parser;\nexports.FRTimeExpressionParser = require('./fr/FRTimeExpressionParser').Parser;\nexports.FRWeekdayParser = require('./fr/FRWeekdayParser').Parser;\nexports.FRRelativeDateFormatParser = require('./fr/FRRelativeDateFormatParser').Parser;\n\nexports.ZHHantDateParser = require('./zh-Hant/ZHHantDateParser').Parser;\nexports.ZHHantWeekdayParser = require('./zh-Hant/ZHHantWeekdayParser').Parser;\nexports.ZHHantTimeExpressionParser = require('./zh-Hant/ZHHantTimeExpressionParser').Parser;\nexports.ZHHantCasualDateParser = require('./zh-Hant/ZHHantCasualDateParser').Parser;\nexports.ZHHantDeadlineFormatParser = require('./zh-Hant/ZHHantDeadlineFormatParser').Parser;\n\nexports.DEDeadlineFormatParser = require('./de/DEDeadlineFormatParser').Parser;\nexports.DEMonthNameLittleEndianParser = require('./de/DEMonthNameLittleEndianParser').Parser;\nexports.DEMonthNameParser = require('./de/DEMonthNameParser').Parser;\nexports.DESlashDateFormatParser = require('./de/DESlashDateFormatParser').Parser;\nexports.DETimeAgoFormatParser = require('./de/DETimeAgoFormatParser').Parser;\nexports.DETimeExpressionParser = require('./de/DETimeExpressionParser').Parser;\nexports.DEWeekdayParser = require('./de/DEWeekdayParser').Parser;\nexports.DECasualDateParser = require('./de/DECasualDateParser').Parser;\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = new RegExp(\n '(而家|立(?:刻|即)|即刻)|' +\n '(今|明|前|大前|後|大後|聽|昨|尋|琴)(早|朝|晚)|' +\n '(上(?:午|晝)|朝(?:早)|早(?:上)|下(?:午|晝)|晏(?:晝)|晚(?:上)|夜(?:晚)?|中(?:午)|凌(?:晨))|' +\n '(今|明|前|大前|後|大後|聽|昨|尋|琴)(?:日|天)' +\n '(?:[\\\\s|,|,]*)' +\n '(?:(上(?:午|晝)|朝(?:早)|早(?:上)|下(?:午|晝)|晏(?:晝)|晚(?:上)|夜(?:晚)?|中(?:午)|凌(?:晨)))?', 'i');\n\nvar NOW_GROUP = 1;\nvar DAY_GROUP_1 = 2;\nvar TIME_GROUP_1 = 3;\nvar TIME_GROUP_2 = 4;\nvar DAY_GROUP_3 = 5;\nvar TIME_GROUP_3 = 6;\n\nexports.Parser = function ZHHantCasualDateParser() {\n\n Parser.apply(this, arguments);\n\n this.pattern = function() {\n return PATTERN;\n };\n\n this.extract = function(text, ref, match, opt) {\n text = match[0];\n var index = match.index;\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref,\n });\n\n var refMoment = moment(ref);\n var startMoment = refMoment.clone();\n\n if (match[NOW_GROUP]) {\n result.start.imply('hour', refMoment.hour());\n result.start.imply('minute', refMoment.minute());\n result.start.imply('second', refMoment.second());\n result.start.imply('millisecond', refMoment.millisecond());\n } else if (match[DAY_GROUP_1]) {\n var day1 = match[DAY_GROUP_1];\n var time1 = match[TIME_GROUP_1];\n\n if (day1 == '明' || day1 == '聽') {\n // Check not \"Tomorrow\" on late night\n if(refMoment.hour() > 1) {\n startMoment.add(1, 'day');\n }\n } else if (day1 == '昨' || day1 == '尋' || day1 == '琴') {\n startMoment.add(-1, 'day');\n } else if (day1 == \"前\"){\n startMoment.add(-2, 'day');\n } else if (day1 == \"大前\"){\n startMoment.add(-3, 'day');\n } else if ( day1 == \"後\"){\n startMoment.add(2, 'day');\n } else if (day1 == \"大後\"){\n startMoment.add(3, 'day');\n }\n\n if (time1 == '早' || time1 == '朝') {\n result.start.imply('hour', 6);\n } else if (time1 == '晚') {\n result.start.imply('hour', 22);\n result.start.imply('meridiem', 1);\n }\n\n } else if (match[TIME_GROUP_2]) {\n var timeString2 = match[TIME_GROUP_2];\n var time2 = timeString2[0];\n if (time2 == '早' || time2 == '朝' || time2 == '上') {\n result.start.imply('hour', 6);\n } else if (time2 == '下' || time2 == '晏') {\n result.start.imply('hour', 15);\n result.start.imply('meridiem', 1);\n } else if (time2 == '中') {\n result.start.imply('hour', 12);\n result.start.imply('meridiem', 1);\n } else if (time2 == '夜' || time2 == '晚') {\n result.start.imply('hour', 22);\n result.start.imply('meridiem', 1);\n } else if (time2 == '凌') {\n result.start.imply('hour', 0);\n }\n\n } else if (match[DAY_GROUP_3]) {\n var day3 = match[DAY_GROUP_3];\n\n if (day3 == '明' || day3 == '聽') {\n // Check not \"Tomorrow\" on late night\n if(refMoment.hour() > 1) {\n startMoment.add(1, 'day');\n }\n } else if (day3 == '昨' || day3 == '尋' || day3 == '琴') {\n startMoment.add(-1, 'day');\n } else if (day3 == \"前\"){\n startMoment.add(-2, 'day');\n } else if (day3 == \"大前\"){\n startMoment.add(-3, 'day');\n } else if (day3 == \"後\"){\n startMoment.add(2, 'day');\n } else if (day3 == \"大後\"){\n startMoment.add(3, 'day');\n }\n\n\n var timeString3 = match[TIME_GROUP_3];\n if (timeString3) {\n var time3 = timeString3[0];\n if (time3 == '早' || time3 == '朝' || time3 == '上') {\n result.start.imply('hour', 6);\n } else if (time3 == '下' || time3 == '晏') {\n result.start.imply('hour', 15);\n result.start.imply('meridiem', 1);\n } else if (time3 == '中') {\n result.start.imply('hour', 12);\n result.start.imply('meridiem', 1);\n } else if (time3 == '夜' || time3 == '晚') {\n result.start.imply('hour', 22);\n result.start.imply('meridiem', 1);\n } else if (time3 == '凌') {\n result.start.imply('hour', 0);\n }\n }\n }\n\n result.start.assign('day', startMoment.date())\n result.start.assign('month', startMoment.month() + 1)\n result.start.assign('year', startMoment.year())\n result.tags.ZHHantCasualDateParser = true;\n return result;\n };\n};\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar util = require('../../utils/ZH-Hant.js');\n\nvar PATTERN = new RegExp(\n '(\\\\d{2,4}|[' + Object.keys(util.NUMBER).join('') + ']{2,4})?' +\n '(?:\\\\s*)' +\n '(?:年)?' +\n '(?:[\\\\s|,|,]*)' +\n '(\\\\d{1,2}|[' + Object.keys(util.NUMBER).join('') + ']{1,2})' +\n '(?:\\\\s*)' +\n '(?:月)' +\n '(?:\\\\s*)' +\n '(\\\\d{1,2}|[' + Object.keys(util.NUMBER).join('') + ']{1,2})?' +\n '(?:\\\\s*)' +\n '(?:日|號)?'\n);\n\nvar YEAR_GROUP = 1;\nvar MONTH_GROUP = 2;\nvar DAY_GROUP = 3;\n\nexports.Parser = function ZHHantDateParser() {\n\n Parser.apply(this, arguments);\n\n this.pattern = function() {\n return PATTERN;\n };\n\n this.extract = function(text, ref, match, opt) {\n var startMoment = moment(ref);\n var result = new ParsedResult({\n text: match[0],\n index: match.index,\n ref: ref,\n });\n\n //Month\n var month = parseInt(match[MONTH_GROUP]);\n if (isNaN(month)) month = util.zhStringToNumber(match[MONTH_GROUP]);\n result.start.assign('month', month);\n\n //Day\n if (match[DAY_GROUP]) {\n var day = parseInt(match[DAY_GROUP]);\n if (isNaN(day)) day = util.zhStringToNumber(match[DAY_GROUP]);\n result.start.assign('day', day);\n } else {\n result.start.imply('day', startMoment.date());\n }\n\n //Year\n if (match[YEAR_GROUP]) {\n var year = parseInt(match[YEAR_GROUP]);\n if (isNaN(year)) year = util.zhStringToYear(match[YEAR_GROUP]);\n result.start.assign('year', year);\n } else {\n result.start.imply('year', startMoment.year());\n }\n\n result.tags.ZHHantDateParser = true;\n return result;\n };\n};\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar util = require('../../utils/ZH-Hant.js');\n\nvar PATTERN = new RegExp(\n '(\\\\d+|[' + Object.keys(util.NUMBER).join('') + ']+|半|幾)(?:\\\\s*)' +\n '(?:個)?' +\n '(秒(?:鐘)?|分鐘|小時|鐘|日|天|星期|禮拜|月|年)' +\n '(?:(?:之|過)?後|(?:之)?內)', 'i'\n);\n\nvar NUMBER_GROUP = 1;\nvar UNIT_GROUP = 2;\n\nexports.Parser = function ZHHantCasualDateParser() {\n\n Parser.apply(this, arguments);\n\n this.pattern = function() {\n return PATTERN;\n };\n\n this.extract = function(text, ref, match, opt) {\n var index = match.index;\n text = match[0];\n\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref\n });\n\n var number = parseInt(match[NUMBER_GROUP]);\n if (isNaN(number)){\n number = util.zhStringToNumber(match[NUMBER_GROUP]);\n }\n\n if (isNaN(number)){\n var string = match[NUMBER_GROUP];\n if (string === '幾'){\n number = 3;\n }else if(string === '半'){\n number = 0.5;\n }else{\n\n //just in case\n return null;\n }\n }\n\n var date = moment(ref);\n var unit = match[UNIT_GROUP];\n var unitAbbr = unit[0];\n\n if (unitAbbr.match(/[日天星禮月年]/)){\n if(unitAbbr == '日' || unitAbbr == '天'){\n date.add(number, 'd');\n }else if(unitAbbr == '星' || unitAbbr == '禮'){\n date.add(number * 7, 'd');\n }else if(unitAbbr == '月'){\n date.add(number, 'month');\n }else if(unitAbbr == '年'){\n date.add(number, 'year');\n }\n\n result.start.assign('year', date.year());\n result.start.assign('month', date.month() + 1);\n result.start.assign('day', date.date());\n return result;\n }\n\n if(unitAbbr == '秒'){\n date.add(number, 'second');\n }else if(unitAbbr == '分'){\n date.add(number, 'minute');\n }else if(unitAbbr == '小' || unitAbbr == '鐘'){\n date.add(number, 'hour');\n }\n\n result.start.imply('year', date.year());\n result.start.imply('month', date.month() + 1);\n result.start.imply('day', date.date());\n result.start.assign('hour', date.hour());\n result.start.assign('minute', date.minute());\n result.start.assign('second', date.second());\n result.tags.ZHHantDeadlineFormatParser = true;\n return result;\n };\n};\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar ParsedComponents = require('../../result').ParsedComponents;\n\nvar util = require('../../utils/ZH-Hant.js');\n\nvar patternString1 = '(?:由|從|自)?' +\n '(?:' +\n '(今|明|前|大前|後|大後|聽|昨|尋|琴)(早|朝|晚)|' +\n '(上(?:午|晝)|朝(?:早)|早(?:上)|下(?:午|晝)|晏(?:晝)|晚(?:上)|夜(?:晚)?|中(?:午)|凌(?:晨))|' +\n '(今|明|前|大前|後|大後|聽|昨|尋|琴)(?:日|天)' +\n '(?:[\\\\s,,]*)' +\n '(?:(上(?:午|晝)|朝(?:早)|早(?:上)|下(?:午|晝)|晏(?:晝)|晚(?:上)|夜(?:晚)?|中(?:午)|凌(?:晨)))?' +\n ')?' +\n '(?:[\\\\s,,]*)' +\n '(?:(\\\\d+|[' + Object.keys(util.NUMBER).join('') + ']+)(?:\\\\s*)(?:點|時|:|:)' +\n '(?:\\\\s*)' +\n '(\\\\d+|半|正|整|[' + Object.keys(util.NUMBER).join('') + ']+)?(?:\\\\s*)(?:分|:|:)?' +\n '(?:\\\\s*)' +\n '(\\\\d+|[' + Object.keys(util.NUMBER).join('') + ']+)?(?:\\\\s*)(?:秒)?)' +\n '(?:\\\\s*(A\\.M\\.|P\\.M\\.|AM?|PM?))?';\n\nvar patternString2 = '(?:\\\\s*(?:到|至|\\\\-|\\\\–|\\\\~|\\\\〜)\\\\s*)' +\n '(?:' +\n '(今|明|前|大前|後|大後|聽|昨|尋|琴)(早|朝|晚)|' +\n '(上(?:午|晝)|朝(?:早)|早(?:上)|下(?:午|晝)|晏(?:晝)|晚(?:上)|夜(?:晚)?|中(?:午)|凌(?:晨))|' +\n '(今|明|前|大前|後|大後|聽|昨|尋|琴)(?:日|天)' +\n '(?:[\\\\s,,]*)' +\n '(?:(上(?:午|晝)|朝(?:早)|早(?:上)|下(?:午|晝)|晏(?:晝)|晚(?:上)|夜(?:晚)?|中(?:午)|凌(?:晨)))?' +\n ')?' +\n '(?:[\\\\s,,]*)' +\n '(?:(\\\\d+|[' + Object.keys(util.NUMBER).join('') + ']+)(?:\\\\s*)(?:點|時|:|:)' +\n '(?:\\\\s*)' +\n '(\\\\d+|半|正|整|[' + Object.keys(util.NUMBER).join('') + ']+)?(?:\\\\s*)(?:分|:|:)?' +\n '(?:\\\\s*)' +\n '(\\\\d+|[' + Object.keys(util.NUMBER).join('') + ']+)?(?:\\\\s*)(?:秒)?)' +\n '(?:\\\\s*(A\\.M\\.|P\\.M\\.|AM?|PM?))?';\n\nvar FIRST_REG_PATTERN = new RegExp(patternString1, 'i');\nvar SECOND_REG_PATTERN = new RegExp(patternString2, 'i');\n\nvar DAY_GROUP_1 = 1;\nvar ZH_AM_PM_HOUR_GROUP_1 = 2;\nvar ZH_AM_PM_HOUR_GROUP_2 = 3;\nvar DAY_GROUP_3 = 4;\nvar ZH_AM_PM_HOUR_GROUP_3 = 5;\nvar HOUR_GROUP = 6;\nvar MINUTE_GROUP = 7;\nvar SECOND_GROUP = 8;\nvar AM_PM_HOUR_GROUP = 9;\n\nexports.Parser = function ZHHantTimeExpressionParser() {\n\n Parser.apply(this, arguments);\n\n this.pattern = function() {\n return FIRST_REG_PATTERN;\n };\n\n this.extract = function(text, ref, match, opt) {\n\n // This pattern can be overlaped Ex. [12] AM, 1[2] AM\n if (match.index > 0 && text[match.index - 1].match(/\\w/)) return null;\n var refMoment = moment(ref);\n var result = new ParsedResult();\n result.ref = ref;\n result.index = match.index;\n result.text = match[0];\n result.tags.ZHTimeExpressionParser = true;\n\n var startMoment = refMoment.clone();\n\n // ----- Day\n if (match[DAY_GROUP_1]) {\n var day1 = match[DAY_GROUP_1];\n if (day1 == '明' || day1 == '聽') {\n // Check not \"Tomorrow\" on late night\n if(refMoment.hour() > 1) {\n startMoment.add(1, 'day');\n }\n } else if (day1 == '昨' || day1 == '尋' || day1 == '琴') {\n startMoment.add(-1, 'day');\n } else if (day1 == \"前\"){\n startMoment.add(-2, 'day');\n } else if (day1 == \"大前\"){\n startMoment.add(-3, 'day');\n } else if (day1 == \"後\"){\n startMoment.add(2, 'day');\n } else if (day1 == \"大後\"){\n startMoment.add(3, 'day');\n }\n result.start.assign('day', startMoment.date());\n result.start.assign('month', startMoment.month() + 1);\n result.start.assign('year', startMoment.year());\n } else if (match[DAY_GROUP_3]) {\n var day3 = match[DAY_GROUP_3];\n if (day3 == '明' || day3 == '聽') {\n startMoment.add(1, 'day');\n } else if (day3 == '昨' || day3 == '尋' || day3 == '琴') {\n startMoment.add(-1, 'day');\n } else if (day3 == \"前\"){\n startMoment.add(-2, 'day');\n } else if (day3 == \"大前\"){\n startMoment.add(-3, 'day');\n } else if (day3 == \"後\"){\n startMoment.add(2, 'day');\n } else if (day3 == \"大後\"){\n startMoment.add(3, 'day');\n }\n result.start.assign('day', startMoment.date());\n result.start.assign('month', startMoment.month() + 1);\n result.start.assign('year', startMoment.year());\n } else {\n result.start.imply('day', startMoment.date());\n result.start.imply('month', startMoment.month() + 1);\n result.start.imply('year', startMoment.year());\n }\n\n var hour = 0;\n var minute = 0;\n var meridiem = -1;\n\n // ----- Second\n if (match[SECOND_GROUP]) {\n var second = parseInt(match[SECOND_GROUP]);\n if (isNaN(second)) {\n second = util.zhStringToNumber(match[SECOND_GROUP]);\n }\n if (second >= 60) return null;\n result.start.assign('second', second);\n }\n\n hour = parseInt(match[HOUR_GROUP]);\n if (isNaN(hour)) {\n hour = util.zhStringToNumber(match[HOUR_GROUP]);\n }\n\n // ----- Minutes\n if (match[MINUTE_GROUP]) {\n if (match[MINUTE_GROUP] == '半') {\n minute = 30;\n } else if (match[MINUTE_GROUP] == '正' || match[MINUTE_GROUP] == '整') {\n minute = 0;\n } else {\n minute = parseInt(match[MINUTE_GROUP]);\n if (isNaN(minute)) {\n minute = util.zhStringToNumber(match[MINUTE_GROUP]);\n }\n }\n } else if (hour > 100) {\n minute = hour % 100;\n hour = parseInt(hour / 100);\n }\n\n if (minute >= 60) {\n return null;\n }\n\n if (hour > 24) {\n return null;\n }\n if (hour >= 12) {\n meridiem = 1;\n }\n\n // ----- AM & PM\n if (match[AM_PM_HOUR_GROUP]) {\n if (hour > 12) return null;\n var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();\n if (ampm == \"a\") {\n meridiem = 0;\n if (hour == 12) hour = 0;\n }\n\n if (ampm == \"p\") {\n meridiem = 1;\n if (hour != 12) hour += 12;\n }\n } else if (match[ZH_AM_PM_HOUR_GROUP_1]) {\n var zhAMPMString1 = match[ZH_AM_PM_HOUR_GROUP_1];\n var zhAMPM1 = zhAMPMString1[0];\n if (zhAMPM1 == '朝' || zhAMPM1 == '早') {\n meridiem = 0;\n if (hour == 12) hour = 0;\n } else if (zhAMPM1 == '晚') {\n meridiem = 1;\n if (hour != 12) hour += 12;\n }\n } else if (match[ZH_AM_PM_HOUR_GROUP_2]) {\n var zhAMPMString2 = match[ZH_AM_PM_HOUR_GROUP_2];\n var zhAMPM2 = zhAMPMString2[0];\n if (zhAMPM2 == '上' || zhAMPM2 == '朝' || zhAMPM2 == '早' || zhAMPM2 == '凌') {\n meridiem = 0;\n if (hour == 12) hour = 0;\n } else if (zhAMPM2 == '下' || zhAMPM2 == '晏' || zhAMPM2 == '晚') {\n meridiem = 1;\n if (hour != 12) hour += 12;\n }\n } else if (match[ZH_AM_PM_HOUR_GROUP_3]) {\n var zhAMPMString3 = match[ZH_AM_PM_HOUR_GROUP_3];\n var zhAMPM3 = zhAMPMString3[0];\n if (zhAMPM3 == '上' || zhAMPM3 == '朝' || zhAMPM3 == '早' || zhAMPM3 == '凌') {\n meridiem = 0;\n if (hour == 12) hour = 0;\n } else if (zhAMPM3 == '下' || zhAMPM3 == '晏' || zhAMPM3 == '晚') {\n meridiem = 1;\n if (hour != 12) hour += 12;\n }\n }\n\n result.start.assign('hour', hour);\n result.start.assign('minute', minute);\n\n if (meridiem >= 0) {\n result.start.assign('meridiem', meridiem);\n } else {\n if (hour < 12) {\n result.start.imply('meridiem', 0);\n } else {\n result.start.imply('meridiem', 1);\n }\n }\n\n // ==============================================================\n // Extracting the 'to' chunk\n // ==============================================================\n\n match = SECOND_REG_PATTERN.exec(text.substring(result.index + result.text.length));\n if (!match) {\n // Not accept number only result\n if (result.text.match(/^\\d+$/)) {\n return null;\n }\n return result;\n }\n\n var endMoment = startMoment.clone();\n result.end = new ParsedComponents(null, null);\n\n // ----- Day\n if (match[DAY_GROUP_1]) {\n var day1 = match[DAY_GROUP_1];\n if (day1 == '明' || day1 == '聽') {\n // Check not \"Tomorrow\" on late night\n if(refMoment.hour() > 1) {\n endMoment.add(1, 'day');\n }\n } else if (day1 == '昨' || day1 == '尋' || day1 == '琴') {\n endMoment.add(-1, 'day');\n } else if (day1 == \"前\"){\n endMoment.add(-2, 'day');\n } else if (day1 == \"大前\"){\n endMoment.add(-3, 'day');\n } else if (day1 == \"後\"){\n endMoment.add(2, 'day');\n } else if (day1 == \"大後\"){\n endMoment.add(3, 'day');\n }\n result.end.assign('day', endMoment.date());\n result.end.assign('month', endMoment.month() + 1);\n result.end.assign('year', endMoment.year());\n } else if (match[DAY_GROUP_3]) {\n var day3 = match[DAY_GROUP_3];\n if (day3 == '明' || day3 == '聽') {\n endMoment.add(1, 'day');\n } else if (day3 == '昨' || day3 == '尋' || day3 == '琴') {\n endMoment.add(-1, 'day');\n } else if (day3 == \"前\"){\n endMoment.add(-2, 'day');\n } else if (day3 == \"大前\"){\n endMoment.add(-3, 'day');\n } else if (day3 == \"後\"){\n endMoment.add(2, 'day');\n } else if (day3 == \"大後\"){\n endMoment.add(3, 'day');\n }\n result.end.assign('day', endMoment.date());\n result.end.assign('month', endMoment.month() + 1);\n result.end.assign('year', endMoment.year());\n } else {\n result.end.imply('day', endMoment.date());\n result.end.imply('month', endMoment.month() + 1);\n result.end.imply('year', endMoment.year());\n }\n\n hour = 0;\n minute = 0;\n meridiem = -1;\n\n // ----- Second\n if (match[SECOND_GROUP]) {\n var second = parseInt(match[SECOND_GROUP]);\n if (isNaN(second)) {\n second = util.zhStringToNumber(match[SECOND_GROUP]);\n }\n\n if (second >= 60) return null;\n result.end.assign('second', second);\n }\n\n hour = parseInt(match[HOUR_GROUP]);\n if (isNaN(hour)) {\n hour = util.zhStringToNumber(match[HOUR_GROUP]);\n }\n\n // ----- Minutes\n if (match[MINUTE_GROUP]) {\n if (match[MINUTE_GROUP] == '半') {\n minute = 30;\n } else if (match[MINUTE_GROUP] == '正' || match[MINUTE_GROUP] == '整') {\n minute = 0;\n } else {\n minute = parseInt(match[MINUTE_GROUP]);\n if (isNaN(minute)) {\n minute = util.zhStringToNumber(match[MINUTE_GROUP]);\n }\n }\n } else if (hour > 100) {\n minute = hour % 100;\n hour = parseInt(hour / 100);\n }\n\n if (minute >= 60) {\n return null;\n }\n\n if (hour > 24) {\n return null;\n }\n if (hour >= 12) {\n meridiem = 1;\n }\n\n // ----- AM & PM\n if (match[AM_PM_HOUR_GROUP]) {\n if (hour > 12) return null;\n var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();\n if (ampm == \"a\") {\n meridiem = 0;\n if (hour == 12) hour = 0;\n }\n\n if (ampm == \"p\") {\n meridiem = 1;\n if (hour != 12) hour += 12;\n }\n\n if (!result.start.isCertain('meridiem')) {\n if (meridiem == 0) {\n\n result.start.imply('meridiem', 0);\n\n if (result.start.get('hour') == 12) {\n result.start.assign('hour', 0);\n }\n\n } else {\n\n result.start.imply('meridiem', 1);\n\n if (result.start.get('hour') != 12) {\n result.start.assign('hour', result.start.get('hour') + 12);\n }\n }\n }\n\n } else if (match[ZH_AM_PM_HOUR_GROUP_1]) {\n var zhAMPMString1 = match[ZH_AM_PM_HOUR_GROUP_1];\n var zhAMPM1 = zhAMPMString1[0];\n if (zhAMPM1 == '朝' || zhAMPM1 == '早') {\n meridiem = 0;\n if (hour == 12) hour = 0;\n } else if (zhAMPM1 == '晚') {\n meridiem = 1;\n if (hour != 12) hour += 12;\n }\n } else if (match[ZH_AM_PM_HOUR_GROUP_2]) {\n var zhAMPMString2 = match[ZH_AM_PM_HOUR_GROUP_2];\n var zhAMPM2 = zhAMPMString2[0];\n if (zhAMPM2 == '上' || zhAMPM2 == '朝' || zhAMPM2 == '早' || zhAMPM2 == '凌') {\n meridiem = 0;\n if (hour == 12) hour = 0;\n } else if (zhAMPM2 == '下' || zhAMPM2 == '晏' || zhAMPM2 == '晚') {\n meridiem = 1;\n if (hour != 12) hour += 12;\n }\n } else if (match[ZH_AM_PM_HOUR_GROUP_3]) {\n var zhAMPMString3 = match[ZH_AM_PM_HOUR_GROUP_3];\n var zhAMPM3 = zhAMPMString3[0];\n if (zhAMPM3 == '上' || zhAMPM3 == '朝' || zhAMPM3 == '早' || zhAMPM3 == '凌') {\n meridiem = 0;\n if (hour == 12) hour = 0;\n } else if (zhAMPM3 == '下' || zhAMPM3 == '晏' || zhAMPM3 == '晚') {\n meridiem = 1;\n if (hour != 12) hour += 12;\n }\n }\n\n result.text = result.text + match[0];\n result.end.assign('hour', hour);\n result.end.assign('minute', minute);\n if (meridiem >= 0) {\n result.end.assign('meridiem', meridiem);\n } else {\n var startAtPM = result.start.isCertain('meridiem') && result.start.get('meridiem') == 1;\n if (startAtPM && result.start.get('hour') > hour) {\n // 10pm - 1 (am)\n result.end.imply('meridiem', 0);\n\n } else if (hour > 12) {\n result.end.imply('meridiem', 1);\n }\n }\n\n if (result.end.date().getTime() < result.start.date().getTime()) {\n result.end.imply('day', result.end.get('day') + 1)\n }\n\n return result;\n };\n};\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar updateParsedComponent = require('../en/ENWeekdayParser').updateParsedComponent;\n\nvar util = require('../../utils/ZH-Hant.js');\n\nvar PATTERN = new RegExp(\n '(上|今|下|這|呢)?' +\n '(?:個)?' +\n '(?:星期|禮拜)' +\n '(' + Object.keys(util.WEEKDAY_OFFSET).join('|') + ')'\n);\n\nvar PREFIX_GROUP = 1;\nvar WEEKDAY_GROUP = 2;\n\nexports.Parser = function ZHHantWeekdayParser() {\n\n Parser.apply(this, arguments);\n\n this.pattern = function() {\n return PATTERN;\n };\n\n this.extract = function(text, ref, match, opt) {\n var index = match.index;\n text = match[0];\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref\n });\n\n var dayOfWeek = match[WEEKDAY_GROUP];\n var offset = util.WEEKDAY_OFFSET[dayOfWeek];\n if(offset === undefined) return null;\n\n var modifier = null;\n var prefix = match[PREFIX_GROUP];\n\n if(prefix == '上') {\n modifier = 'last';\n } else if(prefix == '下') {\n modifier = 'next';\n } else if(prefix == '今' || prefix == '這' || prefix == '呢') {\n modifier = 'this';\n }\n\n updateParsedComponent(result, ref, offset, modifier);\n result.tags['ZHHantWeekdayParser'] = true;\n return result;\n };\n};\n","/*\n\n*/\nvar Refiner = require('./refiner').Refiner;\n\n// Map ABBR -> Offset in minute\nvar TIMEZONE_NAME_PATTERN = new RegExp(\"^\\\\s*\\\\(?([A-Z]{2,4})\\\\)?(?=\\\\W|$)\", 'i');\nvar DEFAULT_TIMEZONE_ABBR_MAP = {\n \"ACDT\":630,\"ACST\":570,\"ADT\":-180,\"AEDT\":660,\"AEST\":600,\"AFT\":270,\"AKDT\":-480,\"AKST\":-540,\"ALMT\":360,\"AMST\":-180,\"AMT\":-240,\"ANAST\":720,\"ANAT\":720,\"AQTT\":300,\"ART\":-180,\"AST\":-240,\"AWDT\":540,\"AWST\":480,\"AZOST\":0,\"AZOT\":-60,\"AZST\":300,\"AZT\":240,\"BNT\":480,\"BOT\":-240,\"BRST\":-120,\"BRT\":-180,\"BST\":60,\"BTT\":360,\"CAST\":480,\"CAT\":120,\"CCT\":390,\"CDT\":-300,\"CEST\":120,\"CET\":60,\"CHADT\":825,\"CHAST\":765,\"CKT\":-600,\"CLST\":-180,\"CLT\":-240,\"COT\":-300,\"CST\":-360,\"CVT\":-60,\"CXT\":420,\"ChST\":600,\"DAVT\":420,\"EASST\":-300,\"EAST\":-360,\"EAT\":180,\"ECT\":-300,\"EDT\":-240,\"EEST\":180,\"EET\":120,\"EGST\":0,\"EGT\":-60,\"EST\":-300,\"ET\":-300,\"FJST\":780,\"FJT\":720,\"FKST\":-180,\"FKT\":-240,\"FNT\":-120,\"GALT\":-360,\"GAMT\":-540,\"GET\":240,\"GFT\":-180,\"GILT\":720,\"GMT\":0,\"GST\":240,\"GYT\":-240,\"HAA\":-180,\"HAC\":-300,\"HADT\":-540,\"HAE\":-240,\"HAP\":-420,\"HAR\":-360,\"HAST\":-600,\"HAT\":-90,\"HAY\":-480,\"HKT\":480,\"HLV\":-210,\"HNA\":-240,\"HNC\":-360,\"HNE\":-300,\"HNP\":-480,\"HNR\":-420,\"HNT\":-150,\"HNY\":-540,\"HOVT\":420,\"ICT\":420,\"IDT\":180,\"IOT\":360,\"IRDT\":270,\"IRKST\":540,\"IRKT\":540,\"IRST\":210,\"IST\":330,\"JST\":540,\"KGT\":360,\"KRAST\":480,\"KRAT\":480,\"KST\":540,\"KUYT\":240,\"LHDT\":660,\"LHST\":630,\"LINT\":840,\"MAGST\":720,\"MAGT\":720,\"MART\":-510,\"MAWT\":300,\"MDT\":-360,\"MESZ\":120,\"MEZ\":60,\"MHT\":720,\"MMT\":390,\"MSD\":240,\"MSK\":240,\"MST\":-420,\"MUT\":240,\"MVT\":300,\"MYT\":480,\"NCT\":660,\"NDT\":-90,\"NFT\":690,\"NOVST\":420,\"NOVT\":360,\"NPT\":345,\"NST\":-150,\"NUT\":-660,\"NZDT\":780,\"NZST\":720,\"OMSST\":420,\"OMST\":420,\"PDT\":-420,\"PET\":-300,\"PETST\":720,\"PETT\":720,\"PGT\":600,\"PHOT\":780,\"PHT\":480,\"PKT\":300,\"PMDT\":-120,\"PMST\":-180,\"PONT\":660,\"PST\":-480,\"PT\":-480,\"PWT\":540,\"PYST\":-180,\"PYT\":-240,\"RET\":240,\"SAMT\":240,\"SAST\":120,\"SBT\":660,\"SCT\":240,\"SGT\":480,\"SRT\":-180,\"SST\":-660,\"TAHT\":-600,\"TFT\":300,\"TJT\":300,\"TKT\":780,\"TLT\":540,\"TMT\":300,\"TVT\":720,\"ULAT\":480,\"UTC\":0,\"UYST\":-120,\"UYT\":-180,\"UZT\":300,\"VET\":-210,\"VLAST\":660,\"VLAT\":660,\"VUT\":660,\"WAST\":120,\"WAT\":60,\"WEST\":60,\"WESZ\":60,\"WET\":0,\"WEZ\":0,\"WFT\":720,\"WGST\":-120,\"WGT\":-180,\"WIB\":420,\"WIT\":540,\"WITA\":480,\"WST\":780,\"WT\":0,\"YAKST\":600,\"YAKT\":600,\"YAPT\":600,\"YEKST\":360,\"YEKT\":360\n};\n\nexports.Refiner = function ExtractTimezoneAbbrRefiner(config) {\n\tRefiner.call(this, arguments);\n\n\tthis.refine = function(text, results, opt) {\n\n\t var timezones = new Object(DEFAULT_TIMEZONE_ABBR_MAP);\n\t if (opt.timezones) {\n\t for (var name in opt.timezones) {\n timezones[name] = opt.timezones[name];\n }\n }\n\n\t\tresults.forEach(function(result) {\n\n if (!result.tags['ENTimeExpressionParser'] &&\n !result.tags['ZHTimeExpressionParser'] &&\n !result.tags['FRTimeExpressionParser'] &&\n !result.tags['DETimeExpressionParser']) {\n return;\n }\n\n var match = TIMEZONE_NAME_PATTERN.exec(text.substring(result.index + result.text.length));\n if (match) {\n var timezoneAbbr = match[1].toUpperCase();\n if (timezones[timezoneAbbr] === undefined) {\n return;\n }\n\n var timezoneOffset = timezones[timezoneAbbr];\n if (!result.start.isCertain('timezoneOffset')) {\n result.start.assign('timezoneOffset', timezoneOffset);\n }\n\n if (result.end != null && !result.end.isCertain('timezoneOffset')) {\n result.end.assign('timezoneOffset', timezoneOffset);\n }\n\n result.text += match[0];\n result.tags['ExtractTimezoneAbbrRefiner'] = true;\n }\n\t\t});\n\n return results;\n\t}\n};","/*\n \n*/\nvar Refiner = require('./refiner').Refiner;\n\n\nvar TIMEZONE_OFFSET_PATTERN = new RegExp(\"^\\\\s*(GMT|UTC)?(\\\\+|\\\\-)(\\\\d{1,2}):?(\\\\d{2})\", 'i');\nvar TIMEZONE_OFFSET_SIGN_GROUP = 2;\nvar TIMEZONE_OFFSET_HOUR_OFFSET_GROUP = 3;\nvar TIMEZONE_OFFSET_MINUTE_OFFSET_GROUP = 4;\n\nexports.Refiner = function ExtractTimezoneOffsetRefiner() {\n Refiner.call(this);\n\n this.refine = function(text, results, opt) {\n\n results.forEach(function(result) {\n\n if (result.start.isCertain('timezoneOffset')) {\n return;\n }\n\n var match = TIMEZONE_OFFSET_PATTERN.exec(text.substring(result.index + result.text.length));\n if (!match) {\n return;\n }\n\n var hourOffset = parseInt(match[TIMEZONE_OFFSET_HOUR_OFFSET_GROUP]);\n var minuteOffset = parseInt(match[TIMEZONE_OFFSET_MINUTE_OFFSET_GROUP]);\n var timezoneOffset = hourOffset * 60 + minuteOffset;\n if (match[TIMEZONE_OFFSET_SIGN_GROUP] === '-') {\n timezoneOffset = -timezoneOffset;\n }\n\n if (result.end != null) {\n result.end.assign('timezoneOffset', timezoneOffset);\n }\n\n result.start.assign('timezoneOffset', timezoneOffset);\n result.text += match[0];\n result.tags['ExtractTimezoneOffsetRefiner'] = true;\n });\n\n return results;\n }\n}\n","/*\n Enforce 'forwardDate' option to on the results. When there are missing component,\n e.g. \"March 12-13 (without year)\" or \"Thursday\", the refiner will try to adjust the result\n into the future instead of the past.\n*/\nvar moment = require('moment');\nvar Refiner = require('./refiner').Refiner;\n\nexports.Refiner = function ForwardDateRefiner() {\n Refiner.call(this);\n\n this.refine = function(text, results, opt) {\n\n if (!opt['forwardDate']) {\n return results;\n }\n\n results.forEach(function(result) {\n\n var refMoment = moment(result.ref);\n\n if (result.start.isCertain('day') && result.start.isCertain('month') &&\n !result.start.isCertain('year') &&\n refMoment.isAfter(result.start.moment())\n ) {\n // Adjust year into the future\n for (var i=0; i < 3 && refMoment.isAfter(result.start.moment()); i++) {\n result.start.imply('year', result.start.get('year') + 1);\n\n if (result.end && !result.end.isCertain('year')) {\n result.end.imply('year', result.end.get('year') + 1);\n }\n }\n\n result.tags['ExtractTimezoneOffsetRefiner'] = true;\n }\n\n if (!result.start.isCertain('day') && !result.start.isCertain('month') && !result.start.isCertain('year') &&\n result.start.isCertain('weekday') &&\n refMoment.isAfter(result.start.moment())\n ) {\n // Adjust date to the coming week\n if (refMoment.day() > result.start.get('weekday')) {\n refMoment.day(result.start.get('weekday') + 7);\n } else {\n refMoment.day(result.start.get('weekday'));\n }\n\n result.start.imply('day', refMoment.date());\n result.start.imply('month', refMoment.month() + 1);\n result.start.imply('year', refMoment.year());\n result.tags['ExtractTimezoneOffsetRefiner'] = true;\n }\n });\n\n return results;\n }\n};\n","/*\n \n*/\nvar Refiner = require('./refiner').Refiner;\n\nexports.Refiner = function OverlapRemovalRefiner() {\n\tRefiner.call(this);\n\t\n\n\tthis.refine = function(text, results, opt) { \n\n if (results.length < 2) return results;\n \n var filteredResults = [];\n var prevResult = results[0];\n \n for (var i=1; i<results.length; i++){\n \n var result = results[i];\n \n // If overlap, compare the length and discard the shorter one\n if (result.index < prevResult.index + prevResult.text.length) {\n\n if (result.text.length > prevResult.text.length){\n prevResult = result;\n }\n \n } else {\n filteredResults.push(prevResult);\n prevResult = result;\n }\n }\n \n // The last one\n if (prevResult != null) {\n filteredResults.push(prevResult);\n }\n\n return filteredResults;\n }\n}","/*\n \n*/\nvar Filter = require('./refiner').Filter;\n\nexports.Refiner = function UnlikelyFormatFilter() {\n Filter.call(this);\n \n\n this.isValid = function(text, result, opt) { \n\n if (result.text.replace(' ','').match(/^\\d*(\\.\\d*)?$/)) {\n return false;\n }\n\n return true; \n }\n}","/*\n \n*/\nvar ENMergeDateRangeRefiner = require('../en/ENMergeDateRangeRefiner').Refiner;\n\nexports.Refiner = function DEMergeDateRangeRefiner() {\n ENMergeDateRangeRefiner.call(this);\n\n this.pattern = function () {\n return /^\\s*(bis(?:\\s*(?:am|zum))?|\\-)\\s*$/i\n };\n};\n","/*\n \n*/\nvar ParsedComponents = require('../../result').ParsedComponents;\nvar Refiner = require('../refiner').Refiner;\n\nvar mergeDateTimeComponent = require('../en/ENMergeDateTimeRefiner').mergeDateTimeComponent;\nvar isDateOnly = require('../en/ENMergeDateTimeRefiner').isDateOnly;\nvar isTimeOnly = require('../en/ENMergeDateTimeRefiner').isTimeOnly;\n\nvar PATTERN = new RegExp(\"^\\\\s*(T|um|am|,|-)?\\\\s*$\");\n\nfunction isAbleToMerge(text, prevResult, curResult) {\n var textBetween = text.substring(prevResult.index + prevResult.text.length, curResult.index);\n return textBetween.match(PATTERN);\n}\n\nfunction mergeResult(text, dateResult, timeResult){\n\n var beginDate = dateResult.start;\n var beginTime = timeResult.start; \n var beginDateTime = mergeDateTimeComponent(beginDate, beginTime);\n\n if (dateResult.end != null || timeResult.end != null) {\n \n var endDate = dateResult.end == null ? dateResult.start : dateResult.end; \n var endTime = timeResult.end == null ? timeResult.start : timeResult.end;\n var endDateTime = mergeDateTimeComponent(endDate, endTime);\n \n if (dateResult.end == null && endDateTime.date().getTime() < beginDateTime.date().getTime()) {\n // Ex. 9pm - 1am\n if (endDateTime.isCertain('day')) {\n endDateTime.assign('day', endDateTime.get('day') + 1);\n } else {\n endDateTime.imply('day', endDateTime.get('day') + 1);\n }\n }\n\n dateResult.end = endDateTime;\n }\n\n dateResult.start = beginDateTime; \n\n var startIndex = Math.min(dateResult.index, timeResult.index);\n var endIndex = Math.max(\n dateResult.index + dateResult.text.length, \n timeResult.index + timeResult.text.length);\n \n dateResult.index = startIndex;\n dateResult.text = text.substring(startIndex, endIndex);\n\n for (var tag in timeResult.tags) {\n dateResult.tags[tag] = true;\n }\n dateResult.tags['DEMergeDateAndTimeRefiner'] = true;\n return dateResult;\n}\n\nexports.Refiner = function DEMergeDateTimeRefiner() {\n Refiner.call(this);\n\n\n this.refine = function(text, results, opt) { \n\n if (results.length < 2) return results;\n\n var mergedResult = [];\n var currResult = null;\n var prevResult = null;\n\n for (var i = 1; i < results.length; i++) {\n\n currResult = results[i];\n prevResult = results[i-1];\n \n if (isDateOnly(prevResult) && isTimeOnly(currResult) \n && isAbleToMerge(text, prevResult, currResult)) {\n \n prevResult = mergeResult(text, prevResult, currResult);\n currResult = null;\n i += 1;\n \n } else if (isDateOnly(currResult) && isTimeOnly(prevResult)\n && isAbleToMerge(text, prevResult, currResult)) {\n \n prevResult = mergeResult(text, currResult, prevResult);\n currResult = null;\n i += 1;\n }\n \n mergedResult.push(prevResult);\n }\n\n if (currResult != null) {\n mergedResult.push(currResult);\n }\n\n return mergedResult;\n }\n}","/*\n \n*/\nvar Refiner = require('../refiner').Refiner;\n\nexports.Refiner = function ENMergeDateRangeRefiner() {\n Refiner.call(this);\n\n this.pattern = function () { return /^\\s*(to|\\-)\\s*$/i };\n\n this.refine = function(text, results, opt) {\n\n if (results.length < 2) return results;\n \n var mergedResult = [];\n var currResult = null;\n var prevResult = null;\n \n for (var i=1; i<results.length; i++){\n \n currResult = results[i];\n prevResult = results[i-1];\n \n if (!prevResult.end && !currResult.end \n && this.isAbleToMerge(text, prevResult, currResult)) {\n \n prevResult = this.mergeResult(text, prevResult, currResult);\n currResult = null;\n i += 1;\n }\n \n mergedResult.push(prevResult);\n }\n \n if (currResult != null) {\n mergedResult.push(currResult);\n }\n\n\n return mergedResult;\n };\n\n this.isAbleToMerge = function(text, result1, result2) {\n var begin = result1.index + result1.text.length;\n var end = result2.index;\n var textBetween = text.substring(begin,end);\n\n return textBetween.match(this.pattern());\n };\n\n this.isWeekdayResult = function (result) {\n return result.start.isCertain('weekday') && !result.start.isCertain('day');\n };\n\n this.mergeResult = function(text, fromResult, toResult) {\n\n if (!this.isWeekdayResult(fromResult) && !this.isWeekdayResult(toResult)) {\n \n var timeKeys = {'hour': true, 'minute': true, 'second': true};\n\n for (var key in toResult.start.knownValues) {\n if (!fromResult.start.isCertain(key)) {\n fromResult.start.assign(key, toResult.start.get(key));\n }\n }\n\n for (var key in fromResult.start.knownValues) {\n if (!toResult.start.isCertain(key)) {\n toResult.start.assign(key, fromResult.start.get(key));\n }\n }\n }\n\n if (fromResult.start.date().getTime() > toResult.start.date().getTime()) {\n \n var fromMoment = fromResult.start.moment();\n var toMoment = toResult.start.moment();\n\n if (this.isWeekdayResult(fromResult) && fromMoment.clone().add(-7, 'days').isBefore(toMoment)) {\n fromMoment = fromMoment.add(-7, 'days');\n fromResult.start.imply('day', fromMoment.date());\n fromResult.start.imply('month', fromMoment.month() + 1);\n fromResult.start.imply('year', fromMoment.year());\n } else if (this.isWeekdayResult(toResult) && toMoment.clone().add(7, 'days').isAfter(fromMoment)) {\n toMoment = toMoment.add(7, 'days');\n toResult.start.imply('day', toMoment.date());\n toResult.start.imply('month', toMoment.month() + 1);\n toResult.start.imply('year', toMoment.year());\n } else {\n var tmp = toResult;\n toResult = fromResult;\n fromResult = tmp;\n }\n }\n \n fromResult.end = toResult.start;\n\n \n\n for (var tag in toResult.tags) {\n fromResult.tags[tag] = true;\n }\n\n \n var startIndex = Math.min(fromResult.index, toResult.index);\n var endIndex = Math.max(\n fromResult.index + fromResult.text.length, \n toResult.index + toResult.text.length);\n \n fromResult.index = startIndex;\n fromResult.text = text.substring(startIndex, endIndex);\n fromResult.tags[this.constructor.name] = true;\n return fromResult;\n }\n};\n\n","/*\n \n*/\nvar ParsedComponents = require('../../result').ParsedComponents;\nvar Refiner = require('../refiner').Refiner;\n\nvar PATTERN = new RegExp(\"^\\\\s*(T|at|after|before|on|of|,|-)?\\\\s*$\");\n\nvar isDateOnly = exports.isDateOnly = function(result) {\n return !result.start.isCertain('hour');\n}\n \nvar isTimeOnly = exports.isTimeOnly = function(result) {\n return !result.start.isCertain('month') && !result.start.isCertain('weekday');\n}\n\nvar isAbleToMerge = exports.isAbleToMerge = function(text, prevResult, curResult) {\n var textBetween = text.substring(prevResult.index + prevResult.text.length, curResult.index);\n return textBetween.match(PATTERN);\n}\n\nvar mergeDateTimeComponent = exports.mergeDateTimeComponent = function(dateComponent, timeComponent) {\n var dateTimeComponent = dateComponent.clone();\n\n if (timeComponent.isCertain('hour')) {\n dateTimeComponent.assign('hour', timeComponent.get('hour'));\n dateTimeComponent.assign('minute', timeComponent.get('minute'));\n\n if (timeComponent.isCertain('second')) {\n dateTimeComponent.assign('second', timeComponent.get('second'));\n\n if (timeComponent.isCertain('millisecond')) {\n dateTimeComponent.assign('millisecond', timeComponent.get('millisecond'));\n } else {\n dateTimeComponent.imply('millisecond', timeComponent.get('millisecond'));\n }\n } else {\n dateTimeComponent.imply('second', timeComponent.get('second'));\n dateTimeComponent.imply('millisecond', timeComponent.get('millisecond'));\n }\n \n } else {\n dateTimeComponent.imply('hour', timeComponent.get('hour'));\n dateTimeComponent.imply('minute', timeComponent.get('minute'));\n dateTimeComponent.imply('second', timeComponent.get('second'));\n dateTimeComponent.imply('millisecond', timeComponent.get('millisecond'));\n }\n\n if (timeComponent.isCertain('meridiem')) {\n dateTimeComponent.assign('meridiem', timeComponent.get('meridiem'));\n } else if (\n timeComponent.get('meridiem') !== undefined &&\n dateTimeComponent.get('meridiem') === undefined\n ) {\n dateTimeComponent.imply('meridiem', timeComponent.get('meridiem'));\n }\n\n if (dateTimeComponent.get('meridiem') == 1 && dateTimeComponent.get('hour') < 12) {\n if (timeComponent.isCertain('hour')) {\n dateTimeComponent.assign('hour', dateTimeComponent.get('hour') + 12);\n } else {\n dateTimeComponent.imply('hour', dateTimeComponent.get('hour') + 12);\n }\n }\n\n return dateTimeComponent;\n}\n\n\nfunction mergeResult(text, dateResult, timeResult){\n\n var beginDate = dateResult.start;\n var beginTime = timeResult.start;\n var beginDateTime = mergeDateTimeComponent(beginDate, beginTime);\n \n if (dateResult.end != null || timeResult.end != null) {\n \n var endDate = dateResult.end == null ? dateResult.start : dateResult.end; \n var endTime = timeResult.end == null ? timeResult.start : timeResult.end;\n var endDateTime = mergeDateTimeComponent(endDate, endTime);\n \n if (dateResult.end == null && endDateTime.date().getTime() < beginDateTime.date().getTime()) {\n // Ex. 9pm - 1am\n if (endDateTime.isCertain('day')) {\n endDateTime.assign('day', endDateTime.get('day') + 1);\n } else {\n endDateTime.imply('day', endDateTime.get('day') + 1);\n }\n }\n\n dateResult.end = endDateTime;\n }\n\n dateResult.start = beginDateTime; \n\n var startIndex = Math.min(dateResult.index, timeResult.index);\n var endIndex = Math.max(\n dateResult.index + dateResult.text.length, \n timeResult.index + timeResult.text.length);\n \n dateResult.index = startIndex;\n dateResult.text = text.substring(startIndex, endIndex);\n\n for (var tag in timeResult.tags) {\n dateResult.tags[tag] = true;\n }\n dateResult.tags['ENMergeDateAndTimeRefiner'] = true;\n return dateResult;\n}\n\nexports.Refiner = function ENMergeDateTimeRefiner() {\n Refiner.call(this);\n\n\n this.refine = function(text, results, opt) { \n\n if (results.length < 2) return results;\n\n var mergedResult = [];\n var currResult = null;\n var prevResult = null;\n\n for (var i = 1; i < results.length; i++) {\n\n currResult = results[i];\n prevResult = results[i-1];\n \n if (isDateOnly(prevResult) && isTimeOnly(currResult) \n && isAbleToMerge(text, prevResult, currResult)) {\n \n prevResult = mergeResult(text, prevResult, currResult);\n currResult = results[i + 1];\n i += 1;\n \n } else if (isDateOnly(currResult) && isTimeOnly(prevResult)\n && isAbleToMerge(text, prevResult, currResult)) {\n \n prevResult = mergeResult(text, currResult, prevResult);\n currResult = results[i + 1];\n i += 1;\n }\n \n mergedResult.push(prevResult);\n }\n\n if (currResult != null) {\n mergedResult.push(currResult);\n }\n\n return mergedResult;\n }\n}","/*\n\n*/\nvar ParsedComponents = require('../../result').ParsedComponents;\nvar Refiner = require('../refiner').Refiner;\n\n\nvar PATTERN = new RegExp(\"^\\\\s*(at|after|before|on|,|-|\\\\(|\\\\))?\\\\s*$\");\n\nfunction isMoreSpecific(prevResult, currResult) {\n var moreSpecific = false;\n\n if (prevResult.start.isCertain('year')) {\n if (!currResult.start.isCertain('year')) {\n moreSpecific = true;\n } else {\n if (prevResult.start.isCertain('month')) {\n if (!currResult.start.isCertain('month')) {\n moreSpecific = true;\n } else {\n if (prevResult.start.isCertain('day') && !currResult.start.isCertain('day')) {\n moreSpecific = true;\n }\n }\n }\n }\n }\n\n return moreSpecific;\n}\n\n\nfunction isAbleToMerge(text, prevResult, currResult) {\n var textBetween = text.substring(prevResult.index + prevResult.text.length, currResult.index);\n\n // Only accepts merge if one of them comes from casual relative date\n var includesRelativeResult = (prevResult.tags['ENRelativeDateFormatParser'] || currResult.tags['ENRelativeDateFormatParser']);\n\n // We assume they refer to the same date if all date fields are implied\n var referToSameDate = !prevResult.start.isCertain('day') && !prevResult.start.isCertain('month') && !prevResult.start.isCertain('year');\n\n // If both years are certain, that determines if they refer to the same date\n // but with one more specific than the other\n if (prevResult.start.isCertain('year') && currResult.start.isCertain('year'))\n referToSameDate = (prevResult.start.get('year') === currResult.start.get('year'));\n\n // We now test with the next level (month) if they refer to the same date\n if (prevResult.start.isCertain('month') && currResult.start.isCertain('month'))\n referToSameDate = (prevResult.start.get('month') === currResult.start.get('month')) && referToSameDate;\n\n return includesRelativeResult && textBetween.match(PATTERN) && referToSameDate;\n}\n\nfunction mergeResult(text, specificResult, nonSpecificResult){\n\n var specificDate = specificResult.start;\n var nonSpecificDate = nonSpecificResult.start;\n\n var startIndex = Math.min(specificResult.index, nonSpecificResult.index);\n var endIndex = Math.max(\n specificResult.index + specificResult.text.length,\n nonSpecificResult.index + nonSpecificResult.text.length);\n\n specificResult.index = startIndex;\n specificResult.text = text.substring(startIndex, endIndex);\n\n for (var tag in nonSpecificResult.tags) {\n specificResult.tags[tag] = true;\n }\n specificResult.tags['ENPrioritizeSpecificDateRefiner'] = true;\n return specificResult;\n}\n\nexports.Refiner = function ENPrioritizeSpecificDateRefiner() {\n Refiner.call(this);\n\n this.refine = function(text, results, opt) {\n\n if (results.length < 2) return results;\n\n var mergedResult = [];\n var currResult = null;\n var prevResult = null;\n\n for (var i = 1; i < results.length; i++) {\n\n currResult = results[i];\n prevResult = results[i-1];\n\n if (isMoreSpecific(prevResult, currResult)\n && isAbleToMerge(text, prevResult, currResult)) {\n\n prevResult = mergeResult(text, prevResult, currResult);\n currResult = null;\n i += 1;\n\n } else if (isMoreSpecific(currResult, prevResult)\n && isAbleToMerge(text, prevResult, currResult)) {\n\n prevResult = mergeResult(text, currResult, prevResult);\n currResult = null;\n i += 1;\n }\n\n mergedResult.push(prevResult);\n }\n\n if (currResult != null) {\n mergedResult.push(currResult);\n }\n\n return mergedResult;\n }\n}\n","/*\r\n \r\n*/\r\nvar Refiner = require('../refiner').Refiner;\r\n\r\nexports.Refiner = function FRMergeDateRangeRefiner() {\r\n Refiner.call(this);\r\n\r\n this.pattern = function () { return /^\\s*(à|a|\\-)\\s*$/i };\r\n\r\n this.refine = function(text, results, opt) {\r\n\r\n if (results.length < 2) return results;\r\n \r\n var mergedResult = [];\r\n var currResult = null;\r\n var prevResult = null;\r\n \r\n for (var i=1; i<results.length; i++){\r\n \r\n currResult = results[i];\r\n prevResult = results[i-1];\r\n \r\n if (!prevResult.end && !currResult.end \r\n && this.isAbleToMerge(text, prevResult, currResult)) {\r\n \r\n prevResult = this.mergeResult(text, prevResult, currResult);\r\n currResult = null;\r\n i += 1;\r\n }\r\n \r\n mergedResult.push(prevResult);\r\n }\r\n \r\n if (currResult != null) {\r\n mergedResult.push(currResult);\r\n }\r\n\r\n\r\n return mergedResult;\r\n };\r\n\r\n this.isAbleToMerge = function(text, result1, result2) {\r\n var begin = result1.index + result1.text.length;\r\n var end = result2.index;\r\n var textBetween = text.substring(begin,end);\r\n\r\n return textBetween.match(this.pattern());\r\n };\r\n\r\n this.isWeekdayResult = function (result) {\r\n return result.start.isCertain('weekday') && !result.start.isCertain('day');\r\n };\r\n\r\n this.mergeResult = function(text, fromResult, toResult) {\r\n\r\n if (!this.isWeekdayResult(fromResult) && !this.isWeekdayResult(toResult)) {\r\n\r\n for (var key in toResult.start.knownValues) {\r\n if (!fromResult.start.isCertain(key)) {\r\n fromResult.start.assign(key, toResult.start.get(key));\r\n }\r\n }\r\n\r\n for (var key in fromResult.start.knownValues) {\r\n if (!toResult.start.isCertain(key)) {\r\n toResult.start.assign(key, fromResult.start.get(key));\r\n }\r\n }\r\n }\r\n\r\n if (fromResult.start.date().getTime() > toResult.start.date()) {\r\n var tmp = toResult;\r\n toResult = fromResult;\r\n fromResult = tmp;\r\n }\r\n \r\n fromResult.end = toResult.start;\r\n\r\n \r\n\r\n for (var tag in toResult.tags) {\r\n fromResult.tags[tag] = true;\r\n }\r\n\r\n \r\n var startIndex = Math.min(fromResult.index, toResult.index);\r\n var endIndex = Math.max(\r\n fromResult.index + fromResult.text.length, \r\n toResult.index + toResult.text.length);\r\n \r\n fromResult.index = startIndex;\r\n fromResult.text = text.substring(startIndex, endIndex);\r\n fromResult.tags[this.constructor.name] = true;\r\n return fromResult;\r\n }\r\n};\r\n\r\n","/*\r\n \r\n*/\r\nvar ParsedComponents = require('../../result').ParsedComponents;\r\nvar Refiner = require('../refiner').Refiner;\r\nvar mergeDateTimeComponent = require('../en/ENMergeDateTimeRefiner').mergeDateTimeComponent;\r\n\r\nvar PATTERN = new RegExp(\"^\\\\s*(T|à|a|vers|de|,|-)?\\\\s*$\");\r\n\r\nfunction isDateOnly(result) {\r\n return !result.start.isCertain('hour') || result.tags['FRCasualDateParser'];\r\n}\r\n \r\nfunction isTimeOnly(result) {\r\n return !result.start.isCertain('month') && !result.start.isCertain('weekday');\r\n}\r\n\r\n\r\nfunction isAbleToMerge(text, prevResult, curResult) {\r\n var textBetween = text.substring(prevResult.index + prevResult.text.length, curResult.index);\r\n return textBetween.match(PATTERN);\r\n}\r\n\r\nfunction mergeResult(text, dateResult, timeResult){\r\n\r\n var beginDate = dateResult.start;\r\n var beginTime = timeResult.start;\r\n var beginDateTime = mergeDateTimeComponent(beginDate, beginTime);\r\n\r\n if (dateResult.end != null || timeResult.end != null) {\r\n \r\n var endDate = dateResult.end == null ? dateResult.start : dateResult.end; \r\n var endTime = timeResult.end == null ? timeResult.start : timeResult.end;\r\n var endDateTime = mergeDateTimeComponent(endDate, endTime);\r\n \r\n if (dateResult.end == null && endDateTime.date().getTime() < beginDateTime.date().getTime()) {\r\n // Ex. 9pm - 1am\r\n if (endDateTime.isCertain('day')) {\r\n endDateTime.assign('day', endDateTime.get('day') + 1);\r\n } else {\r\n endDateTime.imply('day', endDateTime.get('day') + 1);\r\n }\r\n }\r\n\r\n dateResult.end = endDateTime;\r\n }\r\n\r\n dateResult.start = beginDateTime; \r\n\r\n var startIndex = Math.min(dateResult.index, timeResult.index);\r\n var endIndex = Math.max(\r\n dateResult.index + dateResult.text.length, \r\n timeResult.index + timeResult.text.length);\r\n \r\n dateResult.index = startIndex;\r\n dateResult.text = text.substring(startIndex, endIndex);\r\n\r\n for (var tag in timeResult.tags) {\r\n dateResult.tags[tag] = true;\r\n }\r\n dateResult.tags['FRMergeDateAndTimeRefiner'] = true;\r\n return dateResult;\r\n}\r\n\r\nexports.Refiner = function FRMergeDateTimeRefiner() {\r\n Refiner.call(this);\r\n\r\n\r\n this.refine = function(text, results, opt) { \r\n\r\n if (results.length < 2) return results;\r\n\r\n var mergedResult = [];\r\n var currResult = null;\r\n var prevResult = null;\r\n\r\n for (var i = 1; i < results.length; i++) {\r\n\r\n currResult = results[i];\r\n prevResult = results[i-1];\r\n \r\n if (isDateOnly(prevResult) && isTimeOnly(currResult) \r\n && isAbleToMerge(text, prevResult, currResult)) {\r\n \r\n prevResult = mergeResult(text, prevResult, currResult);\r\n currResult = null;\r\n i += 1;\r\n \r\n } else if (isDateOnly(currResult) && isTimeOnly(prevResult)\r\n && isAbleToMerge(text, prevResult, currResult)) {\r\n \r\n prevResult = mergeResult(text, currResult, prevResult);\r\n currResult = null;\r\n i += 1;\r\n }\r\n \r\n mergedResult.push(prevResult);\r\n }\r\n\r\n if (currResult != null) {\r\n mergedResult.push(currResult);\r\n }\r\n\r\n return mergedResult;\r\n }\r\n}","/*\n \n*/\nvar ENMergeDateRangeRefiner = require('../en/ENMergeDateRangeRefiner').Refiner;\n\nexports.Refiner = function JPMergeDateRangeRefiner() {\n ENMergeDateRangeRefiner.call(this);\n\n this.pattern = function () { return /^\\s*(から|ー)\\s*$/i };\n}\n\n","\nexports.Refiner = function Refiner() { \n\n this.refine = function(text, results, opt) { return results; };\n}\n\nexports.Filter = function Filter() { \n \n exports.Refiner.call(this);\n\n this.isValid = function(text, result, opt) { return true; }\n this.refine = function(text, results, opt) { \n\n var filteredResult = [];\n for (var i=0; i < results.length; i++) {\n\n var result = results[i];\n if (this.isValid(text, result, opt)) {\n filteredResult.push(result);\n }\n }\n\n return filteredResult;\n }\n}\n\n\n// Common refiners\nexports.OverlapRemovalRefiner = require('./OverlapRemovalRefiner').Refiner;\nexports.ExtractTimezoneOffsetRefiner = require('./ExtractTimezoneOffsetRefiner').Refiner;\nexports.ExtractTimezoneAbbrRefiner = require('./ExtractTimezoneAbbrRefiner').Refiner;\nexports.ForwardDateRefiner = require('./ForwardDateRefiner').Refiner;\nexports.UnlikelyFormatFilter = require('./UnlikelyFormatFilter').Refiner;\n\n// en refiners\nexports.ENMergeDateTimeRefiner = require('./en/ENMergeDateTimeRefiner').Refiner;\nexports.ENMergeDateRangeRefiner = require('./en/ENMergeDateRangeRefiner').Refiner;\nexports.ENPrioritizeSpecificDateRefiner = require('./en/ENPrioritizeSpecificDateRefiner').Refiner;\n\n// ja refiners\nexports.JPMergeDateRangeRefiner = require('./ja/JPMergeDateRangeRefiner').Refiner;\n\n// fr refiners\nexports.FRMergeDateRangeRefiner = require('./fr/FRMergeDateRangeRefiner').Refiner;\nexports.FRMergeDateTimeRefiner = require('./fr/FRMergeDateTimeRefiner').Refiner;\n\n// de refiners\nexports.DEMergeDateRangeRefiner = require('./de/DEMergeDateRangeRefiner').Refiner;\nexports.DEMergeDateTimeRefiner = require('./de/DEMergeDateTimeRefiner').Refiner;\n","var moment = require('moment');\n\nfunction ParsedResult(result){\n result = result || {};\n\n this.ref = result.ref;\n this.index = result.index;\n this.text = result.text;\n this.tags = result.tags || {};\n\n this.start = new ParsedComponents(result.start, result.ref)\n if(result.end){\n this.end = new ParsedComponents(result.end, result.ref)\n }\n}\n\nParsedResult.prototype.clone = function() {\n var result = new ParsedResult(this);\n result.tags = JSON.parse(JSON.stringify(this.tags));\n result.start = this.start.clone();\n if (this.end) {\n result.end = this.end.clone();\n }\n\n return result\n}\n\nParsedResult.prototype.hasPossibleDates = function() {\n return this.start.isPossibleDate() && (!this.end || this.end.isPossibleDate());\n}\n\n\nfunction ParsedComponents (components, ref){\n\n this.knownValues = {};\n this.impliedValues = {};\n\n if (components) {\n for (key in components) {\n this.knownValues[key] = components[key];\n }\n }\n\n if (ref) {\n ref = moment(ref);\n this.imply('day', ref.date())\n this.imply('month', ref.month() + 1)\n this.imply('year', ref.year())\n }\n \n\n this.imply('hour', 12);\n this.imply('minute', 0);\n this.imply('second', 0);\n this.imply('millisecond', 0);\n}\n\nParsedComponents.prototype.clone = function () {\n var component = new ParsedComponents();\n component.knownValues = JSON.parse(JSON.stringify(this.knownValues));\n component.impliedValues = JSON.parse(JSON.stringify(this.impliedValues));\n return component;\n};\n\nParsedComponents.prototype.get = function(component, value) {\n if (component in this.knownValues) return this.knownValues[component];\n if (component in this.impliedValues) return this.impliedValues[component];\n};\n\nParsedComponents.prototype.assign = function(component, value) {\n this.knownValues[component] = value;\n delete this.impliedValues[component];\n};\n\nParsedComponents.prototype.imply = function(component, value) {\n if (component in this.knownValues) return;\n this.impliedValues[component] = value;\n};\n\nParsedComponents.prototype.isCertain = function(component) {\n return component in this.knownValues;\n};\n\nParsedComponents.prototype.isPossibleDate = function() {\n var dateMoment = this.moment();\n if (this.isCertain('timezoneOffset')) {\n dateMoment.utcOffset(this.get('timezoneOffset'))\n }\n\n if (dateMoment.get('year') != this.get('year')) return false;\n if (dateMoment.get('month') != this.get('month')-1) return false;\n if (dateMoment.get('date') != this.get('day')) return false;\n if (dateMoment.get('hour') != this.get('hour')) return false;\n if (dateMoment.get('minute') != this.get('minute')) return false;\n\n return true;\n};\n\nParsedComponents.prototype.date = function() {\n var dateMoment = this.moment();\n return dateMoment.toDate();\n};\n\nParsedComponents.prototype.moment = function() {\n var dateMoment = moment();\n\n dateMoment.set('year', this.get('year'));\n dateMoment.set('month', this.get('month')-1);\n dateMoment.set('date', this.get('day'));\n dateMoment.set('hour', this.get('hour'));\n dateMoment.set('minute', this.get('minute'));\n dateMoment.set('second', this.get('second'));\n dateMoment.set('millisecond', this.get('millisecond'));\n\n // Javascript Date Object return minus timezone offset\n var currentTimezoneOffset = dateMoment.utcOffset();\n var targetTimezoneOffset = this.get('timezoneOffset') !== undefined ? \n this.get('timezoneOffset') : currentTimezoneOffset;\n\n var adjustTimezoneOffset = targetTimezoneOffset - currentTimezoneOffset;\n dateMoment.add(-adjustTimezoneOffset, 'minutes');\n\n return dateMoment;\n};\n\n\n\nexports.ParsedComponents = ParsedComponents;\nexports.ParsedResult = ParsedResult;\n","exports.WEEKDAY_OFFSET = { \n 'sonntag': 0, \n 'so': 0, \n 'montag': 1, \n 'mo': 1,\n 'dienstag': 2, \n 'di':2, \n 'mittwoch': 3, \n 'mi': 3, \n 'donnerstag': 4, \n 'do': 4, \n 'freitag': 5, \n 'fr': 5,\n 'samstag': 6, \n 'sa': 6\n};\n \nexports.MONTH_OFFSET = { \n 'januar': 1,\n 'jan': 1,\n 'jan.': 1,\n 'februar': 2,\n 'feb': 2,\n 'feb.': 2,\n 'märz': 3,\n 'maerz': 3,\n 'mär': 3,\n 'mär.': 3,\n 'mrz': 3,\n 'mrz.': 3,\n 'april': 4,\n 'apr': 4,\n 'apr.': 4,\n 'mai': 5,\n 'juni': 6,\n 'jun': 6,\n 'jun.': 6,\n 'juli': 7,\n 'jul': 7,\n 'jul.': 7,\n 'august': 8,\n 'aug': 8,\n 'aug.': 8,\n 'september': 9,\n 'sep': 9,\n 'sep.': 9,\n 'sept': 9,\n 'sept.': 9,\n 'oktober': 10,\n 'okt': 10,\n 'okt.': 10,\n 'november': 11,\n 'nov': 11,\n 'nov.': 11,\n 'dezember': 12,\n 'dez': 12,\n 'dez.': 12\n};\n\nexports.INTEGER_WORDS_PATTERN = '(?:eins|zwei|drei|vier|fünf|fuenf|sechs|sieben|acht|neun|zehn|elf|zwölf|zwoelf)';\nexports.INTEGER_WORDS = {\n 'eins' : 1,\n 'zwei' : 2,\n 'drei' : 3,\n 'vier' : 4,\n 'fünf' : 5,\n 'fuenf': 5,\n 'sechs' : 6,\n 'sieben' : 7,\n 'acht' : 8,\n 'neun' : 9,\n 'zehn' : 10,\n 'elf' : 11,\n 'zwölf' : 12,\n 'zwoelf' : 12\n};\n","exports.WEEKDAY_OFFSET = { \n 'sunday': 0, \n 'sun': 0, \n 'monday': 1, \n 'mon': 1,\n 'tuesday': 2, \n 'tue':2, \n 'wednesday': 3, \n 'wed': 3, \n 'thursday': 4, \n 'thur': 4, \n 'thu': 4,\n 'friday': 5, \n 'fri': 5,\n 'saturday': 6, \n 'sat': 6\n};\n \nexports.MONTH_OFFSET = { \n 'january': 1,\n 'jan': 1,\n 'jan.': 1,\n 'february': 2,\n 'feb': 2,\n 'feb.': 2,\n 'march': 3,\n 'mar': 3,\n 'mar.': 3,\n 'april': 4,\n 'apr': 4,\n 'apr.': 4,\n 'may': 5,\n 'june': 6,\n 'jun': 6,\n 'jun.': 6,\n 'july': 7,\n 'jul': 7,\n 'jul.': 7,\n 'august': 8,\n 'aug': 8,\n 'aug.': 8,\n 'september': 9,\n 'sep': 9,\n 'sep.': 9,\n 'sept': 9,\n 'sept.': 9,\n 'october': 10,\n 'oct': 10,\n 'oct.': 10,\n 'november': 11,\n 'nov': 11,\n 'nov.': 11,\n 'december': 12,\n 'dec': 12,\n 'dec.': 12\n};\n\nexports.MONTH_PATTERN = '(?:' \n + Object.keys(exports.MONTH_OFFSET).join('|').replace(/\\./g, '\\\\.')\n + ')';\n\nexports.INTEGER_WORDS = {\n 'one' : 1,\n 'two' : 2,\n 'three' : 3,\n 'four' : 4,\n 'five' : 5,\n 'six' : 6,\n 'seven' : 7,\n 'eight' : 8,\n 'nine' : 9,\n 'ten' : 10,\n 'eleven' : 11,\n 'twelve' : 12\n};\nexports.INTEGER_WORDS_PATTERN = '(?:' \n + Object.keys(exports.INTEGER_WORDS).join('|') \n +')';\n\nexports.ORDINAL_WORDS = {\n 'first' : 1,\n 'second': 2,\n 'third': 3,\n 'fourth': 4,\n 'fifth': 5,\n 'sixth': 6,\n 'seventh': 7,\n 'eighth': 8,\n 'ninth': 9,\n 'tenth': 10,\n 'eleventh': 11,\n 'twelfth': 12,\n 'thirteenth': 13,\n 'fourteenth': 14,\n 'fifteenth': 15,\n 'sixteenth': 16,\n 'seventeenth': 17,\n 'eighteenth': 18,\n 'nineteenth': 19,\n 'twentieth': 20,\n 'twenty first': 21,\n 'twenty second': 22,\n 'twenty third': 23,\n 'twenty fourth': 24,\n 'twenty fifth': 25,\n 'twenty sixth': 26,\n 'twenty seventh': 27,\n 'twenty eighth': 28,\n 'twenty ninth': 29,\n 'thirtieth': 30,\n 'thirty first': 31\n};\nexports.ORDINAL_WORDS_PATTERN = '(?:' \n + Object.keys(exports.ORDINAL_WORDS).join('|').replace(/ /g, '[ -]') \n + ')';\n\nvar TIME_UNIT = \n '(' + exports.INTEGER_WORDS_PATTERN + '|[0-9]+|[0-9]+\\.[0-9]+|an?(?:\\\\s*few)?|half(?:\\\\s*an?)?)\\\\s*' +\n '(sec(?:onds?)?|min(?:ute)?s?|hours?|weeks?|days?|months?|years?)\\\\s*';\n\nvar TIME_UNIT_STRICT = \n '(?:[0-9]+|an?)\\\\s*' +\n '(?:seconds?|minutes?|hours?|days?)\\\\s*';\n\nvar PATTERN_TIME_UNIT = new RegExp(TIME_UNIT, 'i');\n\nexports.TIME_UNIT_PATTERN = '(?:' + TIME_UNIT + ')+';\nexports.TIME_UNIT_STRICT_PATTERN = '(?:' + TIME_UNIT_STRICT + ')+';\n\nexports.extractDateTimeUnitFragments = function (timeunitText) {\n var fragments = {};\n var remainingText = timeunitText;\n var match = PATTERN_TIME_UNIT.exec(remainingText);\n while (match) {\n collectDateTimeFragment(match, fragments);\n remainingText = remainingText.substring(match[0].length);\n match = PATTERN_TIME_UNIT.exec(remainingText);\n }\n return fragments;\n};\n\nfunction collectDateTimeFragment(match, fragments) {\n var num = match[1].toLowerCase() ;\n if (exports.INTEGER_WORDS[num] !== undefined) {\n num = exports.INTEGER_WORDS[num];\n } else if(num === 'a' || num === 'an'){\n num = 1;\n } else if (num.match(/few/)) {\n num = 3;\n } else if (num.match(/half/)) {\n num = 0.5;\n } else {\n num = parseFloat(num);\n }\n\n if (match[2].match(/hour/i)) {\n fragments['hour'] = num;\n } else if (match[2].match(/min/i)) {\n fragments['minute'] = num;\n } else if (match[2].match(/sec/i)) {\n fragments['second'] = num;\n } else if (match[2].match(/week/i)) {\n fragments['week'] = num;\n } else if (match[2].match(/day/i)) {\n fragments['d'] = num;\n } else if (match[2].match(/month/i)) {\n fragments['month'] = num;\n } else if (match[2].match(/year/i)) {\n fragments['year'] = num;\n }\n\n return fragments;\n}","exports.WEEKDAY_OFFSET = {\n 'domingo': 0,\n 'dom': 0,\n 'lunes': 1,\n 'lun': 1,\n 'martes': 2,\n 'mar':2,\n 'miércoles': 3,\n 'miercoles': 3,\n 'mie': 3,\n 'jueves': 4,\n 'jue': 4,\n 'viernes': 5,\n 'vie': 5,\n 'sábado': 6,\n 'sabado': 6,\n 'sab': 6,}\n\nexports.MONTH_OFFSET = {\n 'enero': 1,\n 'ene': 1,\n 'ene.': 1,\n 'febrero': 2,\n 'feb': 2,\n 'feb.': 2,\n 'marzo': 3,\n 'mar': 3,\n 'mar.': 3,\n 'abril': 4,\n 'abr': 4,\n 'abr.': 4,\n 'mayo': 5,\n 'may': 5,\n 'may.': 5,\n 'junio': 6,\n 'jun': 6,\n 'jun.': 6,\n 'julio': 7,\n 'jul': 7,\n 'jul.': 7,\n 'agosto': 8,\n 'ago': 8,\n 'ago.': 8,\n 'septiembre': 9,\n 'sep': 9,\n 'sept': 9,\n 'sep.': 9,\n 'sept.': 9,\n 'octubre': 10,\n 'oct': 10,\n 'oct.': 10,\n 'noviembre': 11,\n 'nov': 11,\n 'nov.': 11,\n 'diciembre': 12,\n 'dic': 12,\n 'dic.': 12,\n}\n","exports.WEEKDAY_OFFSET = { \r\n 'dimanche': 0, \r\n 'dim': 0, \r\n 'lundi': 1, \r\n 'lun': 1,\r\n 'mardi': 2, \r\n 'mar':2, \r\n 'mercredi': 3, \r\n 'mer': 3, \r\n 'jeudi': 4, \r\n 'jeu': 4, \r\n 'vendredi': 5, \r\n 'ven': 5,\r\n 'samedi': 6, \r\n 'sam': 6\r\n};\r\n \r\nexports.MONTH_OFFSET = { \r\n 'janvier': 1,\r\n 'jan': 1,\r\n 'jan.': 1,\r\n 'février': 2,\r\n 'fév': 2,\r\n 'fév.': 2,\r\n 'fevrier': 2,\r\n 'fev': 2,\r\n 'fev.': 2,\r\n 'mars': 3,\r\n 'mar': 3,\r\n 'mar.': 3,\r\n 'avril': 4,\r\n 'avr': 4,\r\n 'avr.': 4,\r\n 'mai': 5,\r\n 'juin': 6,\r\n 'jun': 6,\r\n 'juillet': 7,\r\n 'jul': 7,\r\n 'jul.': 7,\r\n 'août': 8,\r\n 'aout': 8,\r\n 'septembre': 9,\r\n 'sep': 9,\r\n 'sep.': 9,\r\n 'sept': 9,\r\n 'sept.': 9,\r\n 'octobre': 10,\r\n 'oct': 10,\r\n 'oct.': 10,\r\n 'novembre': 11,\r\n 'nov': 11,\r\n 'nov.': 11,\r\n 'décembre': 12,\r\n 'decembre': 12,\r\n 'dec': 12,\r\n 'dec.': 12\r\n};\r\n\r\nexports.INTEGER_WORDS_PATTERN = '(?:un|deux|trois|quatre|cinq|six|sept|huit|neuf|dix|onze|douze|treize)';\r\nexports.INTEGER_WORDS = {\r\n 'un' : 1,\r\n 'deux' : 2,\r\n 'trois' : 3,\r\n 'quatre' : 4,\r\n 'cinq' : 5,\r\n 'six' : 6,\r\n 'sept' : 7,\r\n 'huit' : 8,\r\n 'neuf' : 9,\r\n 'dix' : 10,\r\n 'onze' : 11,\r\n 'douze' : 12,\r\n 'treize' : 13,\r\n};\r\n","\n\n/**\n * to-hankaku.js\n * convert to ascii code strings.\n *\n * @version 1.0.1\n * @author think49\n * @url https://gist.github.com/964592\n * @license http://www.opensource.org/licenses/mit-license.php (The MIT License)\n */\n \nexports.toHankaku = (function (String, fromCharCode) {\n \n function toHankaku (string) {\n return String(string).replace(/\\u2019/g, '\\u0027').replace(/\\u201D/g, '\\u0022').replace(/\\u3000/g, '\\u0020').replace(/\\uFFE5/g, '\\u00A5').replace(/[\\uFF01\\uFF03-\\uFF06\\uFF08\\uFF09\\uFF0C-\\uFF19\\uFF1C-\\uFF1F\\uFF21-\\uFF3B\\uFF3D\\uFF3F\\uFF41-\\uFF5B\\uFF5D\\uFF5E]/g, alphaNum);\n }\n \n function alphaNum (token) {\n return fromCharCode(token.charCodeAt(0) - 65248);\n }\n \n return toHankaku;\n})(String, String.fromCharCode);\n\n/**\n * to-zenkaku.js\n * convert to multi byte strings.\n *\n * @version 1.0.2\n * @author think49\n * @url https://gist.github.com/964592\n * @license http://www.opensource.org/licenses/mit-license.php (The MIT License)\n */\nexports.toZenkaku = (function (String, fromCharCode) {\n \n function toZenkaku (string) {\n return String(string).replace(/\\u0020/g, '\\u3000').replace(/\\u0022/g, '\\u201D').replace(/\\u0027/g, '\\u2019').replace(/\\u00A5/g, '\\uFFE5').replace(/[!#-&(),-9\\u003C-?A-[\\u005D_a-{}~]/g, alphaNum);\n }\n \n function alphaNum (token) {\n return fromCharCode(token.charCodeAt(0) + 65248);\n }\n \n return toZenkaku;\n})(String, String.fromCharCode);","var NUMBER ={\n '零':0,\n '一':1,\n '二':2,\n '兩':2,\n '三':3,\n '四':4,\n '五':5,\n '六':6,\n '七':7,\n '八':8,\n '九':9,\n '十':10,\n '廿':20,\n '卅':30,\n};\n\nvar WEEKDAY_OFFSET ={\n '天':0,\n '日':0,\n '一':1,\n '二':2,\n '三':3,\n '四':4,\n '五':5,\n '六':6,\n};\n\nexports.NUMBER = NUMBER;\nexports.WEEKDAY_OFFSET = WEEKDAY_OFFSET;\n\nexports.zhStringToNumber=function(text){\n var number = 0;\n for(var i=0; i<text.length ;i++){\n var char = text[i];\n if(char === '十'){\n number = number=== 0 ? NUMBER[char] : (number * NUMBER[char]);\n }else{\n number += NUMBER[char];\n }\n }\n return number;\n};\n\nexports.zhStringToYear=function(text){\n var string = '';\n for(var i=0; i<text.length ;i++){\n var char = text[i];\n string = string + NUMBER[char];\n }\n return parseInt(string);\n};\n"]} \ No newline at end of file