{"version":3,"sources":["webpack:///../../src/util/dateTimeUtils.ts","webpack:///../../../../src/components/VCalendar/mixins/mouse.ts","webpack:///../../../../src/components/VCalendar/mixins/times.ts","webpack:///../../../../src/components/VCalendar/modes/common.ts","webpack:///../../../../src/components/VCalendar/modes/stack.ts","webpack:///../../../../src/components/VCalendar/modes/column.ts","webpack:///../../../../src/components/VCalendar/modes/index.ts","webpack:///../../../../src/components/VCalendar/util/props.ts","webpack:///../../../../src/components/VCalendar/mixins/calendar-base.ts","webpack:///../../../../src/components/VCalendar/util/events.ts","webpack:///../../../../src/components/VCalendar/mixins/calendar-with-events.ts","webpack:///../../../src/components/VCalendar/VCalendarWeekly.ts","webpack:///../../../src/components/VCalendar/VCalendarMonthly.ts","webpack:///../../../../src/components/VCalendar/mixins/calendar-with-intervals.ts","webpack:///../../../src/components/VCalendar/VCalendarDaily.ts","webpack:///../../../src/components/VCalendar/VCalendarCategory.ts","webpack:///../../../src/components/VCalendar/VCalendar.ts","webpack:///./node_modules/core-js/modules/es.number.max-safe-integer.js","webpack:///../../../src/mixins/localable/index.ts","webpack:///../../../../src/components/VCalendar/util/timestamp.ts"],"names":["createUTCDate","month","day","year","date","Date","isFinite","firstWeekOffset","firstWeekDayInFirstWeek","firstDayOfWeek","firstWeekDayOfYear","dayOfYear","isLeapYear","weeksInYear","weekOffset","weekOffsetNext","daysInYear","week","Math","name","methods","getDefaultMouseEventHandlers","this","getMouseEventHandlers","event","prevent","result","on","eventOptions","events","prefix","key","handler","e","mouseEvent","getEvent","Array","props","now","type","validator","data","times","today","computed","parsedNow","watch","created","setPresent","present","past","future","updateTimes","getNow","updateDay","target","updateTime","MILLIS_IN_DAY","minStart","visuals","columnCount","column","left","width","a","b","exclude","s0","e0","groups","group","groupVisual","dayStart","i","intersected","hasOverlap","start","end","k","timed","getRange","getDayRange","groupStart","groupEnd","min","max","reset","getVisuals","dayEvents","visual","setColumnCount","targetGroup","getOpenGroup","FULL_WIDTH","DEFAULT_OFFSET","WIDTH_MULTIPLIER","firstWeekday","overlapThreshold","getOverlapGroupHandler","getGroups","nodes","child","getNode","index","getNextIndex","parent","getParent","addTime","getOverlappingRange","children","grand","grandNext","calculateBounds","columns","getMaxChildIndex","spaceLeft","spaceWidth","offset","columnWidthMultiplier","getColumnWidthMultiplier","node","columnOffset","columnWidth","hasFullWidth","maxColumn","minColumn","c","getOverlappingIndices","indices","other","returnFirstColumn","overlapping","first","n","getNormalizedRange","added","sibling","childMax","removeMinutes","identifier","totalMinutes","addHours","addMinutes","CalendarEventOverlapModes","stack","base","String","Number","validate","default","weekdays","validateWeekdays","hideHeader","Boolean","shortWeekdays","weekdayFormat","dayFormat","intervals","maxDays","shortIntervals","intervalHeight","validateNumber","intervalWidth","intervalMinutes","firstInterval","firstTime","intervalCount","intervalFormat","intervalStyle","showIntervalLabel","weeks","localeFirstDayOfYear","minWeeks","shortMonths","showMonthOnFirst","showWeek","monthFormat","calendar","value","category","categories","categoryHideDynamic","categoryShowAll","categoryForInvalid","categoryDays","x","parseInt","eventStart","eventEnd","eventTimed","eventCategory","eventHeight","eventColor","eventTextColor","eventName","eventOverlapThreshold","eventOverlapMode","mode","eventMore","eventMoreText","eventRipple","eventMarginBottom","input","ints","visited","wrapped","d","mixins","directives","Resize","parsedWeekdays","weekdaySkips","weekdaySkipsReverse","reversed","reverse","parsedStart","parsedEnd","days","dayFormatter","options","timeZone","weekdayFormatter","longOptions","weekday","shortOptions","short","getRelativeClasses","outside","timestamp","getStartOfWeek","getEndOfWeek","getFormatter","startInput","endInput","startParsed","endParsed","startIdentifier","startTimestampIdentifier","endIdentifier","endOffset","endTimestampIdentifier","allDay","dayIdentifier","isEventOn","WIDTH_FULL","WIDTH_START","MINUTES_IN_DAY","ripple","noEvents","length","parsedEvents","map","parsedEventOverlapThreshold","eventColorFunction","eventTimedFunction","eventCategoryFunction","eventTextColorFunction","eventNameFunction","eventModeFunction","eventWeekdays","categoryMode","parseEvent","formatTime","formatter","hour","minute","withTime","undefined","updateEventVisibility","eventsMap","more","parentBounds","last","hide","hidden","eventBounds","$vuetify","lang","t","getEventsMap","elements","$refs","el","genDayEvent","weekdayIdentifier","scope","eventParsed","genEvent","staticClass","class","style","height","attrs","ref","refInFor","genTimedEvent","top","bottom","slot","$scopedSlots","text","background","overlapsNoon","singline","timeSummary","eventSummary","time","delimiter","scopeInput","$createElement","setTextColor","setBackgroundColor","nativeEvent","genName","domProps","innerHTML","genPlaceholder","genMore","click","display","getVisibleEvents","filter","isEventOverlapping","isEventForCategory","getEventsForDay","isEventStart","getEventsForDayAll","getEventsForDayTimed","getScopedSlots","isNode","getSlotChildren","getter","mapper","mapped","slots","slotDay","slotDayHeader","slotDayBody","classes","parsedMinWeeks","minDays","todayWeek","monthFormatter","isOutside","genHead","genHeadDays","header","genHeadDay","color","genWeeks","weekDays","genWeek","getWeekNumber","weekNodes","genWeekNumber","determineDay","genDay","_e","genDayLabel","genDayLabelButton","hasMonth","VBtn","fab","depressed","small","stop","genDayMonth","render","h","dragstart","parsedFirstInterval","parsedIntervalMinutes","parsedIntervalCount","parsedIntervalHeight","parseFloat","parsedFirstTime","firstMinute","bodyHeight","minutes","count","intervalFormatter","shortHourOptions","tms","showIntervalLabelDefault","isFirst","interval","intervalStyleDefault","getTimestampAtEvent","bounds","baseMinutes","touchEvent","touches","clientY","addIntervals","getSlotScope","scrollToTime","y","timeToY","pane","minutesToPixels","clamp","timeDelta","gap","scrollPush","themeClasses","mounted","init","onResize","getScrollPush","area","marginRight","genHeadIntervals","genHeadWeekday","genHeadDayLabel","genDayHeader","genHeadDayButton","genBody","genScrollArea","genPane","genDayContainer","genDays","genDayIntervals","genDayBody","genDayInterval","styler","genBodyIntervals","genIntervalLabels","genIntervalLabel","shower","show","label","modifiers","quiet","parsedCategories","split","getCategoryScope","genDayHeaderCategory","genDayHeaderCategoryTitle","genDayBodyCategory","lastStart","lastEnd","parsedValue","parsedCategoryDays","renderProps","around","component","getCategoryList","Error","title","spanYears","spanMonths","monthShortFormatter","monthLongFormatter","updated","window","checkChange","move","amount","moved","forward","mover","limit","next","prev","$children","parseTimestamp","required","timestampToDate","categoryMap","Object","categoryLength","ev","scopedSlots","$","stat","MAX_SAFE_INTEGER","locale","currentLocale","PARSE_REGEX","PARSE_TIME","DAYS_IN_MONTH","DAYS_IN_MONTH_LEAP","DAYS_IN_MONTH_MIN","DAYS_IN_MONTH_MAX","MONTH_MAX","MONTH_MIN","DAY_MIN","DAYS_IN_WEEK","MINUTES_IN_HOUR","MINUTE_MAX","HOUR_MAX","OFFSET_YEAR","OFFSET_MONTH","OFFSET_HOUR","OFFSET_TIME","copyTimestamp","findWeekday","updateFormatted","updateRelative","updateWeekday","daysInMonth","parts","parseDate","hasDay","hasTime","getDayIdentifier","getTimeIdentifier","getTime","getWeekday","getDate","_","m","C","Y","padded","str","padNumber","M","D","skips","filled","skip","j","current","currentIdentifier","stopped","relativeDays","nextDay","mins","int","updateMinutes","emptyFormatter","_t","_s","Intl","intlFormatter","getOptions"],"mappings":"2IAAA,SAASA,EAAT,GAAwD,IACtD,EADoCC,EAAkB,uDAAxD,EAAiDC,EAAO,uDAAxD,EAWE,OATIC,EAAA,KAAcA,GAAlB,GACEC,EAAO,IAAIC,KAAKA,KAAA,QAAhB,IACIC,SAASF,EAAb,mBACEA,EAAA,mBAGFA,EAAO,IAAIC,KAAKA,KAAA,QAAhB,IAGF,EAGF,SAASE,EAAT,OACE,IAAMC,EAA0B,EAAIC,EAApC,EACMC,GAAsB,EAAIV,EAAcG,EAAM,EAApB,GAAJ,YAAD,GAA3B,EAEA,OAAQO,EAAqBF,EAA7B,EAGF,SAASG,EAAT,SACE,IAAIA,EAAY,CAAC,EAAG,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAAnE,GAKA,OAJIV,EAAA,GAAaW,EAAjB,IACED,IAGKA,EAAP,EAGF,SAASE,EAAT,OACE,IAAMC,EAAaP,EAAgBJ,EAAMM,EAAzC,GACMM,EAAiBR,EAAgBJ,EAAD,IAAtC,GACMa,EAAaJ,EAAA,OAAnB,IAEA,OAAQI,EAAA,EAAD,GAAP,EAGI,sBACJ,IAAMF,EAAaP,EAAgBJ,EAAMM,EAAzC,GACMQ,EAAOC,KAAA,MAAWP,EAAUR,EAAMF,EAAOC,EAAvB,GAAD,GAAvB,GAEA,OAAIe,EAAJ,EACSA,EAAOJ,EAAYV,EAAD,IAAzB,GACSc,EAAOJ,EAAYV,EAAMM,EAA7B,GACEQ,EAAOJ,EAAYV,EAAMM,EAAhC,GAEA,EAIE,cACJ,OAASN,EAAA,IAAD,GAAqBA,EAAA,MAAtB,GAA6CA,EAAA,MAApD,EApDF,qE,4OCqBe,sBAAW,CACxBgB,KADwB,QAGxBC,QAAS,CACPC,6BADO,SACqB,KAAwC,MAClE,OAAOC,KAAKC,uBAAL,sBACJ,QAAD,EAAoB,CAAEC,MAAO,UADxB,iBAEJ,cAAD,EAA0B,CAAEA,MAAF,cAAwBC,SAAxB,EAAuCC,QAAQ,IAFpE,iBAGJ,YAAD,EAAwB,CAAEF,MAAO,cAH5B,iBAIJ,YAAD,EAAwB,CAAEA,MAAO,cAJ5B,iBAKJ,UAAD,EAAsB,CAAEA,MAAO,YAL1B,iBAMJ,aAAD,EAAyB,CAAEA,MAAO,eAN7B,iBAOJ,aAAD,EAAyB,CAAEA,MAAO,eAP7B,iBAQJ,aAAD,EAAyB,CAAEA,MAAO,eAR7B,iBASJ,YAAD,EAAwB,CAAEA,MAAO,cAT5B,iBAUJ,WAAD,EAAuB,CAAEA,MAAO,aAV3B,GAAP,IAaFD,sBAfO,SAec,KAA6C,WAC1DI,EAAN,GADgE,WAGhE,GACE,IAAMC,EAAeC,EAArB,GAEA,IAAK,aAAL,GAH0B,iBAO1B,IAAMC,EAASF,EAAA,aAA+BA,EAAA,SAAD,KAAkCA,EAAA,YAA/E,IACMG,EAAMD,EAASF,EAArB,MAEMI,EAAwB,SAAAC,GAC5B,IAAMC,EAAN,EAWA,YAVI,IAAAN,EAAA,QAAsCM,EAAA,WAA0BA,EAAA,SAAsBN,EAA1F,UACMA,EAAJ,SACEK,EAAA,iBAEEL,EAAJ,MACEK,EAAA,kBAEF,UAAkBE,EAAlB,KAGKP,EAAP,QAGEG,KAAJ,EAEMK,MAAA,QAAcT,EAAlB,IACGA,EAAA,WAEDA,EAAA,GAAU,CAACA,EAAD,GAAV,GAGFA,EAAA,MAjCJ,IAAK,IAAL,OAA4B,EAA5B,GAqCA,a,wBCtES,sBAAW,CACxBR,KADwB,QAGxBkB,MAAO,CACLC,IAAK,CACHC,KADG,OAEHC,UAAW,SAIfC,KAAM,iBAAO,CACXC,MAAO,CACLJ,IAAK,eAAe,oBADf,GAELK,MAAO,eAAe,cAAc,MAIxCC,SAAU,CACRC,UADQ,WAEN,OAAOvB,KAAKgB,IAAM,eAAehB,KAAD,KAAzB,GAAP,OAIJwB,MAAO,CACLD,UAAW,eAGbE,QA3BwB,WA4BtBzB,KAAA,cACAA,KAAA,cAGFF,QAAS,CACP4B,WADO,WAEL1B,KAAA,kBAAyBA,KAAKoB,MAAMC,MAAMM,SAA1C,EACA3B,KAAA,eAAsBA,KAAKoB,MAAMC,MAAMO,MAAvC,EACA5B,KAAA,iBAAwBA,KAAKoB,MAAMC,MAAMQ,QAAzC,GAEFC,YANO,WAOL,IAAMd,EAAyBhB,KAAKuB,WAAavB,KAAjD,SACAA,KAAA,YAAoBA,KAAKoB,MAAzB,KACApB,KAAA,aAAqBA,KAAKoB,MAA1B,KACApB,KAAA,YAAoBA,KAAKoB,MAAzB,QAEFW,OAZO,WAaL,OAAO,eAAU,IAAjB,OAEFC,UAfO,SAeE,KACHhB,EAAA,OAAaiB,EAAjB,OACEA,EAAA,KAAcjB,EAAd,KACAiB,EAAA,MAAejB,EAAf,MACAiB,EAAA,IAAajB,EAAb,IACAiB,EAAA,QAAiBjB,EAAjB,QACAiB,EAAA,KAAcjB,EAAd,OAGJkB,WAxBO,SAwBG,KACJlB,EAAA,OAAaiB,EAAjB,OACEA,EAAA,KAAcjB,EAAd,KACAiB,EAAA,OAAgBjB,EAAhB,OACAiB,EAAA,KAAcjB,EAAd,U,gDClEFmB,EAAN,MAIM,cAAiE,IAAZC,EAAY,uDAAjE,EACEC,EAAU9B,EAAA,KAAW,SAAAL,GAAK,MAAK,CACnCA,QACAoC,YAFmC,EAGnCC,OAHmC,EAInCC,KAJmC,EAKnCC,MAAO,QAQT,OALAJ,EAAA,MAAa,cACX,OAAQzC,KAAA,MAAmB8C,EAAA,MAAnB,0BAAuD9C,KAAA,MAAmB+C,EAAA,MAA3E,2BACCA,EAAA,6BAAiCD,EAAA,MADzC,0BAIF,EASI,oBAAoF,IAAdE,IAAc,yDACxF,OAAOA,IAAYC,GAAA,GAAYC,GAAjB,KAA+BD,EAAA,GAAWC,EAAxD,GAGI,cACJC,EAAA,SAAe,SAAAC,GACbA,EAAA,iBAAsB,SAAAC,GACpBA,EAAA,YAA0BF,EAA1B,aAKA,cACJ,MAAO,CAAC7C,EAAD,yBAAiCA,EAAxC,wBAGI,cACJ,MAAO,CAACA,EAAD,gBAAwBA,EAA/B,eAGI,gBACJ,MAAO,CAACN,KAAA,MAAmBM,EAApB,0BAAqDN,KAAA,IAASsD,EAAT,EAAmChD,EAA/F,yBAGI,oBACJ,IAAK,IAAIiD,EAAT,EAAgBA,EAAIJ,EAApB,OAAmCI,IAAK,CACtC,IAAMH,EAAQD,EAAd,GACIK,GAAJ,EAEA,GAAIC,EAAWC,EAAOC,EAAKP,EAAb,MAA0BA,EAA1B,IAAd,GACE,IAAK,IAAIQ,EAAT,EAAgBA,EAAIR,EAAA,QAApB,OAA0CQ,IAAK,CAC7C,IAAMP,EAAcD,EAAA,QAApB,GAD6C,EAEdS,EAAQC,EAAST,EAAZ,OAAiCU,EAAYV,EAAjF,OAF6C,sBAEvC,EAFuC,KAEvC,EAFuC,KAI7C,GAAII,EAAWC,EAAOC,EAAKK,EAAYC,EAAvC,GAAyD,CACvDT,GAAA,EACA,OAKN,MACE,SAIJ,SAGI,cACJ,IAAM1C,EAAU,CACdqC,OADc,GAEde,KAFc,EAGdC,KAHc,EAIdC,MAAO,WACLtD,EAAA,UACAA,EAAA,IAAcA,EAAA,KAAd,GAEFuD,WAAY,gBAA4F,IAAjBD,EAAiB,yDAClGpF,EAAA,aAAJ,IACE8B,EAAA,QAGF,IAAMwC,EAAW,eAAjB,GACMb,EAAU,EAAW6B,EAA3B,GAwCA,OAtCA7B,EAAA,SAAgB,SAAA8B,GAAS,MACFV,EAAQC,EAASS,EAAZ,OAA4BR,EAAYQ,EAAlE,OADuB,sBACjB,EADiB,KACjB,EADiB,KAGnBzD,EAAA,kBAA8B2C,EAAWC,EAAOC,EAAK7C,EAAb,IAA0BA,EAA1B,IAA5C,KACE0D,EAAe1D,EAAf,QACAA,EAAA,SAGF,IAAI2D,EAAcC,EAAa5D,EAAD,WAA9B,IAEA,IAAI2D,IACFA,EAAc3D,EAAA,OAAd,OAEAA,EAAA,YAAoB,CAAE4C,QAAOC,MAAKlB,QAAS,MAG7C,IAAMJ,EAASvB,EAAA,OAAf,GACAuB,EAAA,gBACAA,EAAA,MAAerC,KAAA,IAASqC,EAAT,MAAf,GACAA,EAAA,IAAarC,KAAA,IAASqC,EAAT,IAAb,GAEAkC,EAAA,UAEA,IAAIzD,EAAA,KACFA,EAAA,MACAA,EAAA,QAEAA,EAAA,IAAcd,KAAA,IAASc,EAAT,IAAd,GACAA,EAAA,IAAcd,KAAA,IAASc,EAAT,IAAd,OAIJ0D,EAAe1D,EAAf,QAEA,GACEA,EAAA,QAGF,IAIJ,SCtHF,IAAM6D,EAAN,IAEMC,EAAN,EAEMC,EAAN,IAgBa,EAAkC,SAAClE,EAAQmE,EAAcC,GACpE,IAAMjE,EAAUkE,EADwE,GAIxF,OAAO,kBACL,MACE,OAAOlE,EAAA,iBAAP,GAGF,IALsC,EAKhCwC,EAAW,eAAjB,GACMb,EAAU,EAAW6B,EAA3B,GACMnB,EAAS8B,EAAUxC,EAAzB,GAPsC,iBAStC,GATsC,IAStC,2BAA4B,OAA5B,EAA4B,QACpByC,EAAN,GAD0B,iBAGL9B,EAArB,SAH0B,IAG1B,2BAAoC,KAApC,EAAoC,QAC5B+B,EAAQC,EAAQb,EAAtB,GACMc,EAAQC,EAAaH,EAA3B,GAEA,QAAIE,EAAiB,CACnB,IAAME,EAASC,EAAUL,EAAzB,GACA,IACEA,EAAA,SACAA,EAAA,QAAgB1B,EAAW0B,EAAD,MAAcA,EAAd,IAAyBI,EAAzB,MAAuCE,EAAQF,EAAD,MAAxE,IACAJ,EAAA,MAAcI,EAAA,MAAd,EACAA,EAAA,sBAEG,OACYG,EAAoBP,EAAOD,EAAOG,EAAf,EAA0BA,EAA9D,GADK,sBACC,EADD,KAECM,EAAWD,EAAoBP,EAAOD,EAAOG,EAAf,EAA0BA,EAAQH,EAAlC,QAApC,GAEAC,EAAA,WACAA,EAAA,QAEA,IACEA,EAAA,SACAA,EAAA,QAAgB1B,EAAW0B,EAAD,MAAcA,EAAd,IAAyB,EAAzB,MAAuCM,EAAQ,EAAD,MAAxE,IACA,oBAVG,uBAaL,GAbK,IAaL,2BAA8B,KAA9B,EAA8B,QACxBG,EAAA,SAAJ,IACEA,EAAA,UAGF,IAAMC,EAAYD,EAAA,MAAcT,EAAd,OAAlB,EACIU,GAAaV,EAAb,SACF1B,EAAW0B,EAAD,MAAcM,EAAQN,EAAD,MAArB,GAAsDS,EAAtD,MAAmEA,EAD/E,OAEEA,EAAA,aArBC,+BA0BPV,EAAA,SAzCwB,8BA4C1BY,EAAgBZ,EAAhB,IArDoC,8BA0DtC,OAFAzC,EAAA,MAAa,qBAAWK,EAAA,KAASC,EAAV,MAAsBD,EAAA,+BAAmCC,EAAA,MAAhF,4BAEA,IAIJ,SAAS+C,EAAT,KAAiE,uBAC/D,GAD+D,IAC/D,2BAA0B,KAA1B,EAA0B,QAClB,EAAN,EAAM,OAAUP,EAAhB,EAAgBA,OACVQ,EAAUC,EAAA,GAAhB,EACMC,EAAYV,EAASA,EAAA,OAAH,KAAxB,EACMW,EAAavB,EAAnB,EACMwB,EAASnG,KAAA,MAAyB2E,EAAxC,GACMyB,EAAwBC,EAAyBC,EAAvD,GACMC,EAAeL,GAAcH,EAAUO,EAAV,MAAnC,GACME,EAAcN,GAAcH,EAAUO,EAAV,OAAwBA,EAAA,UAAtC,IAApB,EAEA,IACE/B,EAAA,KAAc+B,EAAA,QACVL,EADU,EAEVA,EAFJ,GAKF1B,EAAA,MAAekC,EAAaH,EAAMpB,EAAnB,GACXP,EAAaJ,EADF,KAEXvE,KAAA,IAAS2E,EAAaJ,EAAtB,KAAmCiC,EAFvC,IAjB6D,+BAuBjE,SAASH,EAAT,KACE,IAAKC,EAAA,SAAL,OACE,SAGF,IAAMI,EAAYJ,EAAA,MAAapB,EAA/B,OACMyB,EAAYL,EAAA,iBAAqB,qBAAYtG,KAAA,MAAc4G,EAA/C,SAAlB,GAEA,OAAOD,EAAYL,EAAnB,MAGF,SAASO,EAAT,KACE,IADuD,EACjDC,EAAN,GADuD,iBAEvD,GAFuD,IAEvD,2BAA2B,KAA3B,EAA2B,QACrBrD,EAAW6C,EAAD,MAAaA,EAAb,IAAuBS,EAAvB,MAAoCA,EAAlD,MACED,EAAA,KAAaC,EAAb,QAJmD,8BAOvD,SAGF,SAASzB,EAAT,KACE,IAAMwB,EAAUD,EAAsBP,EAAtC,GACAQ,EAAA,OAEA,IAAK,IAAIvD,EAAT,EAAgBA,EAAIuD,EAApB,OAAoCvD,IAClC,GAAIA,EAAIuD,EAARvD,GACE,SAGJ,SAGF,SAASmC,EAAT,SAAsH,MAAzBsB,EAAyB,wDAC9GC,EAAN,GADoH,iBAEpH,GAFoH,IAEpH,2BAA2B,KAA3B,EAA2B,QACrBF,EAAA,UAA2BA,EAAA,OAA3B,GAAsDtD,EAAW6C,EAAD,MAAaA,EAAb,IAAuBS,EAAvB,MAAoCA,EAAxG,MACEE,EAAA,SAJgH,8BAOpH,GAAID,GAAqBC,EAAA,OAAzB,EAAiD,CAC/C,IAAMC,EAAQD,EAAA,QAAmB,qBAAYjH,KAAA,MAAcmH,EAA7C,SAAuDF,EAAA,GAArE,OACA,OAAOA,EAAA,QAAmB,SAAAE,GAAC,OAAIA,EAAA,QAA/B,KAEF,SAGF,SAAS3B,EAAT,KACE,IAD2C,EACvCD,EAAJ,KAD2C,iBAE3C,GAF2C,IAE3C,2BAA2B,KAA3B,EAA2B,QACrB9B,EAAW6C,EAAD,MAAaA,EAAb,IAAuBS,EAAvB,MAAoCA,EAA9C,OAA6D,OAAAxB,GAAmBwB,EAAA,MAAcxB,EAAlG,SACEA,EAAA,IAJuC,8BAO3C,SAGF,SAASkB,EAAT,OAA0E,uBACxE,GADwE,IACxE,2BAA2B,KAA3B,EAA2B,QACzB,GAAIM,IAAA,GACFA,EAAA,MAAcT,EADZ,OAEF7C,EAAW6C,EAAD,MAAab,EAAQa,EAAD,MAApB,GAAoDS,EAApD,MAAiEA,EAF7E,KAGE,UALoE,8BASxE,SAGF,SAAS9B,EAAT,KACE,IADkE,EAC5D9B,EAAN,GADkE,iBAGlE,GAHkE,IAGlE,2BAA8B,OAA9B,EAA8B,UACPiE,EAAmB7C,EAAD,MAAvC,GAD4B,sBACtB,EADsB,KACtB,EADsB,KAExB8C,GAAJ,EAF4B,iBAI5B,GAJ4B,IAI5B,2BAA4B,KAA5B,EAA4B,QAC1B,GAAI5D,EAAWC,EAAOC,EAAKP,EAAb,MAA0BA,EAAxC,KAAoD,CAClDA,EAAA,gBACAA,EAAA,IAAYpD,KAAA,IAASoD,EAAT,IAAZ,GACAiE,GAAA,EACA,QATwB,8BAa5B,GACElE,EAAA,KAAY,CAAEO,QAAOC,MAAKlB,QAAS,CAAC8B,MAjB0B,8BAqBlE,SAGF,SAASa,EAAT,KAA+D,MACxCgC,EAAmB7C,EAAD,MAAvC,GAD6D,sBACvD,EADuD,KACvD,EADuD,KAG7D,MAAO,CACLgB,OADK,KAEL+B,SAFK,EAGLjC,MAHK,EAILd,SACAb,QACAC,MACAgC,SAAU,IAId,SAASK,EAAT,GACE,IADmC,EAC/B7B,EAAMmC,EAAV,MADmC,iBAEfA,EAApB,UAFmC,IAEnC,2BAAmC,KAAnC,EAAmC,QAC3BiB,EAAWvB,EAAjB,GACIuB,EAAJ,IACEpD,EAAA,IAL+B,8BAQnC,SAGF,SAASsB,EAAT,KACE,IAAM+B,EAAgBC,EAAtB,IACMC,EAAeF,EAArB,EACMG,EAAW3H,KAAA,MAAW0H,EAA5B,IACME,EAAaF,EAAnB,GAEA,OAAOD,EAAA,MAA6BE,EAApC,EC1PF,IAAM,EAAN,IAEa,EAAmC,SAAChH,EAAQmE,EAAcC,GACrE,IAAMjE,EAAUkE,EAAhB,GAEA,OAAO,kBACL,IAAMvC,EAAU3B,EAAA,iBAAhB,GASA,OAPA,GACE2B,EAAA,SAAgB,SAAA8B,GACdA,EAAA,KAAcA,EAAA,SAA6BA,EAA3C,YACAA,EAAA,MAAe,EAAaA,EAA5B,eAIJ,ICdSsD,EAAsE,CACjFC,MAAA,EACAnF,OAAA,GCCa,GACboF,KAAM,CACJrE,MAAO,CACLrC,KAAM,CAAC2G,OAAQC,OADV,MAELC,SAFK,OAGLC,QAAS,kBAAM,eAAU,IAAV,MAAsBjJ,OAEvCyE,IAAK,CACHtC,KAAM,CAAC2G,OAAQC,OADZ,MAEHC,SAAU,QAEZE,SAAU,CACR/G,KAAM,CAACH,MADC,QAERiH,QAAS,iBAAM,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAFvB,IAGRD,SAAUG,GAEZC,WAAY,CACVjH,KAAMkH,SAERC,cAAe,CACbnH,KADa,QAEb8G,SAAS,GAEXM,cAAe,CACbpH,KADa,SAEb8G,QAAS,MAEXO,UAAW,CACTrH,KADS,SAET8G,QAAS,OAGbQ,UAAW,CACTC,QAAS,CACPvH,KADO,OAEP8G,QAAS,GAEXU,eAAgB,CACdxH,KADc,QAEd8G,SAAS,GAEXW,eAAgB,CACdzH,KAAM,CAAC4G,OADO,QAEdE,QAFc,GAGdD,SAAUa,GAEZC,cAAe,CACb3H,KAAM,CAAC4G,OADM,QAEbE,QAFa,GAGbD,SAAUa,GAEZE,gBAAiB,CACf5H,KAAM,CAAC4G,OADQ,QAEfE,QAFe,GAGfD,SAAUa,GAEZG,cAAe,CACb7H,KAAM,CAAC4G,OADM,QAEbE,QAFa,EAGbD,SAAUa,GAEZI,UAAW,CACT9H,KAAM,CAAC4G,OAAQD,OADN,QAETE,SAAU,QAEZkB,cAAe,CACb/H,KAAM,CAAC4G,OADM,QAEbE,QAFa,GAGbD,SAAUa,GAEZM,eAAgB,CACdhI,KADc,SAEd8G,QAAS,MAEXmB,cAAe,CACbjI,KADa,SAEb8G,QAAS,MAEXoB,kBAAmB,CACjBlI,KADiB,SAEjB8G,QAAS,OAGbqB,MAAO,CACLC,qBAAsB,CACpBpI,KAAM,CAAC2G,OADa,QAEpBG,QAAS,GAEXuB,SAAU,CACRxB,SADQ,EAERC,QAAS,GAEXwB,YAAa,CACXtI,KADW,QAEX8G,SAAS,GAEXyB,iBAAkB,CAChBvI,KADgB,QAEhB8G,SAAS,GAEX0B,SAjBK,QAkBLC,YAAa,CACXzI,KADW,SAEX8G,QAAS,OAGb4B,SAAU,CACR1I,KAAM,CACJA,KADI,OAEJ8G,QAAS,SAEX6B,MAAO,CACL3I,KAAM,CAAC2G,OAAQC,OADV,MAELC,SAAU,SAGd+B,SAAU,CACRC,WAAY,CACV7I,KAAM,CAACH,MADG,QAEViH,QAAS,IAEXgC,oBAAqB,CACnB9I,KAAMkH,SAER6B,gBAAiB,CACf/I,KAAMkH,SAER8B,mBAAoB,CAClBhJ,KADkB,OAElB8G,QAAS,IAEXmC,aAAc,CACZjJ,KAAM,CAAC4G,OADK,QAEZE,QAFY,EAGZD,SAAW,SAAAqC,GAAD,OAAYnL,SAASoL,SAAT,KAAyBA,SAAA,GAAc,KAGjE7J,OAAQ,CACNA,OAAQ,CACNU,KADM,MAEN8G,QAAS,iBAAM,KAEjBsC,WAAY,CACVpJ,KADU,OAEV8G,QAAS,SAEXuC,SAAU,CACRrJ,KADQ,OAER8G,QAAS,OAEXwC,WAAY,CACVtJ,KAAM,CAAC2G,OADG,UAEVG,QAAS,SAEXyC,cAAe,CACbvJ,KAAM,CAAC2G,OADM,UAEbG,QAAS,YAEX0C,YAAa,CACXxJ,KADW,OAEX8G,QAAS,IAEX2C,WAAY,CACVzJ,KAAM,CAAC2G,OADG,UAEVG,QAAS,WAEX4C,eAAgB,CACd1J,KAAM,CAAC2G,OADO,UAEdG,QAAS,SAEX6C,UAAW,CACT3J,KAAM,CAAC2G,OADE,UAETG,QAAS,QAEX8C,sBAAuB,CACrB5J,KAAM,CAAC2G,OADc,QAErBG,QAAS,IAEX+C,iBAAkB,CAChB7J,KAAM,CAAC2G,OADS,UAEhBG,QAFgB,QAGhBD,SAAW,SAAAiD,GAAD,OAAeA,KAAA,GAAqD,oBAATA,IAEvEC,UAAW,CACT/J,KADS,QAET8G,SAAS,GAEXkD,cAAe,CACbhK,KADa,OAEb8G,QAAS,gCAEXmD,YAAa,CACXjK,KAAM,CAACkH,QADI,QAEXJ,QAAS,MAEXoD,kBAAmB,CACjBlK,KADiB,OAEjB8G,QAAS,KAKT,cACJ,OAAO/I,SAASoL,SAAhB,IAGI,cAKJ,GAJA,kBAAWgB,IACTA,EAAQA,EAAA,MAAR,MAGEtK,MAAA,QAAJ,GAA0B,CACxB,IAAMuK,EAAOD,EAAA,KAAU,SAAAjB,GAAC,OAAIC,SAA5B,MAEA,GAAIiB,EAAA,eAAJ,IAAkCA,EAAA,OAChC,SAMF,IAHA,IAAMC,EAAN,GACIC,GAAJ,EAESpI,EAAT,EAAgBA,EAAIkI,EAApB,OAAiClI,IAAK,CACpC,IAAMgH,EAAIkB,EAAV,GAEA,IAAKrM,SAAD,IAAgBmL,EAAhB,GAAyBA,GAA7B,OACE,SAGF,GAAIhH,EAAJ,EAAW,CACT,IAAMqI,EAAIrB,EAAIkB,EAAKlI,EAAnB,GACA,GAAIqI,EAAJ,EAAW,CACT,KACE,SAEFD,GAAA,OACK,OAAIC,EACT,SAIJ,GAAIF,EAAJ,GACE,SAEFA,EAAA,MAGF,SAGF,SCvOa,aAAAG,EAAA,MAAO,EAAD,qBAKnB,GALa,OAON,CACP5L,KADO,gBAGP6L,WAAY,CACVC,OAAA,QAGF5K,MAAOA,EAPA,KASPO,SAAU,CACRsK,eADQ,WAEN,OAAO9K,MAAA,QAAcd,KAAd,UACHA,KADG,UAEFA,KAAKgI,UAAN,oBAAqC,SAAAmC,GAAC,OAAIC,SAASD,EAFvD,QAIF0B,aANQ,WAON,OAAO,eAAgB7L,KAAvB,iBAEF8L,oBATQ,WAUN,IAAMC,EAAW/L,KAAK6L,aAAtB,QAEA,OADAE,EAAAC,UACA,GAEFC,YAdQ,WAeN,OAAO,eAAejM,KAAD,OAArB,IAEFkM,UAjBQ,WAkBN,IAAM5I,EAAQtD,KAAd,YACMuD,EAAyBvD,KAAKuD,KAAM,eAAevD,KAAf,MAA1C,EAEA,OAAO,kBAA8B,eAA9B,KAAP,GAEFmM,KAvBQ,WAwBN,OAAO,eACLnM,KADkB,YAElBA,KAFkB,UAGlBA,KAAKoB,MAHa,MAIlBpB,KAJF,eAOFoM,aA/BQ,WAgCN,GAAIpM,KAAJ,UACE,OAAOA,KAAP,UAGF,IAAMqM,EAAU,CAAEC,SAAF,MAAmB1N,IAAK,WAExC,OAAO,eACLoB,KADgC,eAEhC,qBAFF,MAKFuM,iBA3CQ,WA4CN,GAAIvM,KAAJ,cACE,OAAOA,KAAP,cAGF,IAAMwM,EAAc,CAAEF,SAAF,MAAmBG,QAAS,QAC1CC,EAAe,CAAEJ,SAAF,MAAmBG,QAAS,SAEjD,OAAO,eACLzM,KADgC,eAEhC,qBAAiB2M,EAAQD,EAF3B,OAOJ5M,QAAS,CACP8M,mBADO,SACW,GAA+C,IAAfC,EAAe,wDAC/D,MAAO,CACL,YAAaC,EADR,QAEL,SAAUA,EAFL,KAGL,WAAYA,EAHP,OAIL,YAAaD,IAGjBE,eATO,SASO,GACZ,OAAO,eAAeD,EAAW9M,KAAZ,eAAiCA,KAAKoB,MAA3D,QAEF4L,aAZO,SAYK,GACV,OAAO,eAAaF,EAAW9M,KAAZ,eAAiCA,KAAKoB,MAAzD,QAEF6L,aAfO,SAeK,GACV,OAAO,eACLjN,KADgC,QAEhC,qBAFF,S,YCzGA,oBAM4B,IADhCyD,EACgC,wDAAhCoG,EAAgC,wDAE1BqD,EAAa9B,EAAnB,GACM+B,EAAW/B,EAAjB,GACMgC,EAAiC,eAAeF,GAAtD,GACMG,EAAgCF,EAAW,eAAeA,GAAlB,GAA9C,EACM7J,EAA2B,kBAC7B,eAAc8J,EADe,GAAjC,EAGM7J,EAAyB,kBAC3B,eAAc8J,EADa,GAA/B,EAGMC,EAA0B,eAAhC,GACMC,EAAmC,eAAzC,GACMC,EAAwB,eAA9B,GACMC,EAAoBnK,EAAA,UAA1B,KACMoK,EAAiC,kBAAvC,EACMC,GAAmBrK,EAAzB,QAEA,MAAO,CAAE8H,QAAO9H,QAAOgK,kBAAiBC,2BAA0BhK,MAAKiK,gBAAeE,yBAAwBC,SAAQ1I,QAAO4E,YAGzH,gBACJ,OAAO+D,GAAiB1N,EAAjB,iBACL0N,GAAiB1N,EADZ,eAEL0N,EAAA,SAAgC1N,EAFlC,uBAKI,oBACJ,OAAO0N,IAAkB1N,EAAlB,iBAA4CwE,IAAiB9F,EAAjB,SAAgCiP,EAAU3N,EAA7F,GAGI,kBACJ,OAAOoN,GAAmBpN,EAAnB,eAA0CsN,GAAiBtN,EAAlE,gBCqBF,IAAM4N,EAAN,IACMC,GAAN,GACMC,GAAN,KAGe,YAAoB,CACjCnO,KADiC,uBAGjC6L,WAAY,CACVuC,SAAA,MAGFlN,MAAOA,EAP0B,OASjCO,SAAU,CACR4M,SADQ,WAEN,WAAOlO,KAAKO,OAAO4N,QAErBC,aAJQ,WAKN,OAAOpO,KAAKO,OAAO8N,IAAIrO,KAAvB,aAEFsO,4BAPQ,WAQN,OAAOlE,SAASpK,KAAhB,wBAEFuO,mBAVQ,WAUU,WAChB,MAAO,oBAAOvO,KAAP,WACHA,KADG,WAEH,kBAAO,EAFX,aAIFwO,mBAfQ,WAeU,WAChB,MAAO,oBAAOxO,KAAP,WACHA,KADG,WAEH,SAAAE,GAAK,QAAMA,EAAM,EAFrB,cAIFuO,sBApBQ,WAoBa,WACnB,MAAO,oBAAOzO,KAAP,cACHA,KADG,cAEH,SAAAE,GAAK,OAAIA,EAAM,EAFnB,iBAIFwO,uBAzBQ,WAyBc,WACpB,MAAO,oBAAO1O,KAAP,eACHA,KADG,eAEH,kBAAM,EAFV,iBAIF2O,kBA9BQ,WA8BS,WACf,MAAO,oBAAO3O,KAAP,UACHA,KADG,UAEH,qBAAuB,eAAWE,EAAA,MAAY,EAFlD,cAIF0O,kBAnCQ,WAoCN,MAAO,oBAAO5O,KAAP,iBACHA,KADG,iBAEHyH,EAA0BzH,KAF9B,mBAIF6O,cAxCQ,WAyCN,OAAO7O,KAAP,gBAEF8O,aA3CQ,WA4CN,WAIJhP,QAAS,CACPiP,WADO,SACG,GAAiC,IAAT9J,EAAS,uDAAjC,EACR,OAAO,EAAW,EAAD,EAGfjF,KAHe,WAIfA,KAJe,SAKfA,KAAKwO,mBALU,KAMfxO,KAAK8O,cAAe9O,KAAKyO,sBAAzB,KAGJO,WAXO,SAWG,KACR,IAAMC,EAAYjP,KAAKiN,aAAa,CAClCX,SADkC,MAElC4C,KAFkC,UAGlCC,OAAQC,EAAA,wBAAkCC,IAG5C,OAAOJ,EAAUG,GAAjB,IAEFE,sBApBO,WAqBL,IAAItP,KAAKkO,UAAalO,KAAtB,WAIA,IAAMyK,EAAczK,KAApB,YACMuP,EAAYvP,KAAlB,eAEA,IAAK,IAAL,OAA8B,OACKuP,EAAjC,GAAM,EADsB,EACtB,SADsB,EACtB,OAAkBC,EADI,EACJA,KACxB,MACE,MAQF,IALA,IAAMC,EAAetK,EAArB,wBACMuK,EAAOnP,EAAA,OAAb,EACIoP,GAAJ,EACIC,EAAJ,EAESzM,EAAT,EAAgBA,GAAhB,EAA2BA,IAAK,CAC9B,MAAW,CACT,IAAM0M,EAActP,EAAA,GAApB,wBACAoP,EAAOxM,IAAA,EACF0M,EAAA,OAAqBJ,EADnB,OAEFI,EAAA,SAAmCJ,EAFxC,OAIF,IACElP,EAAA,wBACAqP,KAIJ,GACEJ,EAAA,iBACAA,EAAA,UAAiBxP,KAAK8P,SAASC,KAAKC,EAAEhQ,KAArB,cAAjB,IAEAwP,EAAA,wBAINS,aA5DO,WA6DL,IAAMV,EAAN,GACMW,EAAWlQ,KAAKmQ,MAAtB,OAEA,OAAKD,GAAaA,EAAlB,SAIAA,EAAA,SAAiB,SAAAE,GACf,IAAMtR,EAAOsR,EAAA,aAAb,aACIA,EAAA,eAAJ,IACQtR,KAAN,IACEyQ,EAAA,GAAkB,CAChBpK,OAAQiL,EADQ,cAEhBZ,KAFgB,KAGhBjP,OAAQ,KAGR6P,EAAA,aAAJ,aACEb,EAAA,WAEAA,EAAA,GAAAhP,OAAA,QACA6P,EAAA,sBAKN,GAtBE,GAwBJC,YAzFO,WAyFI,GAA2D,IAAvDnQ,EAAuD,EAAvDA,MACPuK,EAAczK,KAApB,YACMmL,EAAoBnL,KAA1B,kBACM4N,EAAgB,eAAtB,GACMjO,EAAOf,EAAb,KACM0E,EAAQsK,IAAkB1N,EAAhC,gBACIqD,EAAMqK,IAAkB1N,EAA5B,cACIuC,EAAJ,GAEA,IAAKzC,KAAL,aACE,IAAK,IAAImD,EAAIvE,EAAA,MAAb,EAA4BuE,EAAIxD,EAAhC,OAA6CwD,IAAK,CAChD,IAAMmN,EAAoB,eAAiB3Q,EAA3C,IACA,KAAIO,EAAA,eAAJ,GAGO,CACLqD,GAAA,EACA,MAJAd,GAAA,EACAc,EAAMA,GAAO+M,IAAsBpQ,EAAnC,cAON,IAAMqQ,EAAQ,CAAEC,YAAF,EAAsB5R,MAAK0E,QAAOC,MAAKE,OAAO,GAE5D,OAAOzD,KAAKyQ,SAASvQ,EAAOqQ,GAAO,EAAO,CACxCG,YADwC,UAExCC,MAAO,CACL,gBADK,EAEL,cAAepN,GAEjBqN,MAAO,CACLC,OAAQ,GAAF,OADD,EACC,MACNpO,MAAO,GAAF,OAFA,EAEA,KACL,0BAAoB0I,EAApB,OAEF2F,MAAO,CACL,YAAalS,EAAIE,MAEnB2B,IAAKP,EAdmC,MAexC6Q,IAfwC,SAgBxCC,UAAU,KAGdC,cAnIO,WAmIM,GAA4E,IAA1E,EAA0E,EAA1E,QAA0E,EAA1E,KAAexO,EAA2D,EAA3DA,MAC5B,GAAI7D,EAAA,UAAcsB,EAAd,SAAiCtB,EAAA,UAAcsB,EAAd,QAArC,EACE,SAGF,IAAM0N,EAAgB,eAAtB,GACMtK,EAAQpD,EAAA,iBAAd,EACMqD,EAAMrD,EAAA,cAAZ,EACMgR,EAAM5N,EAAQ1E,EAAA,QAAYsB,EAAf,OAAjB,EACMiR,EAAS5N,EAAM3E,EAAA,QAAH,IAAiCA,EAAA,QAAYsB,EAA/D,KACM2Q,EAASjR,KAAA,IAASI,KAAT,YAA2BmR,EAA1C,GACMZ,EAAQ,CAAEC,YAAF,EAAsB5R,MAAK0E,QAAOC,MAAKE,OAAO,GAE5D,OAAOzD,KAAKyQ,SAASvQ,EAAOqQ,GAAO,EAAM,CACvCG,YADuC,gBAEvCE,MAAO,CACLM,IAAK,GAAF,OADE,EACF,MACHL,OAAQ,GAAF,OAFD,EAEC,MACNrO,KAAM,GAAF,OAHC,EAGD,KACJC,MAAO,GAAF,OAAKA,EAAL,SAIXgO,SA1JO,SA0JC,SAAgG,aAChGW,EAAOpR,KAAKqR,aAAlB,MACMC,EAAOtR,KAAK0O,uBAAuBxO,EAAzC,OACMqR,EAAavR,KAAKuO,mBAAmBrO,EAA3C,OACMsR,EAAetR,EAAA,eAAyBA,EAAA,UAA9C,GACMuR,EAAW,eAAYvR,EAAD,MAAcA,EAAzB,MAAuCF,KAAxD,4BACMgP,EAAahP,KAAnB,WACM0R,EAAc,kBAAM1C,EAAW9O,EAAD,MAAV,SAAgD8O,EAAW9O,EAAD,KAApF,IACMyR,EAAe,WACnB,IAAM9R,EAAO,sBAAb,GAEA,GAAIK,EAAA,MAAJ,QAAyB,CACvB,KAAgB,CACd,IAAM0R,EAAOF,IACPG,EAAYJ,EAAW,KAA7B,OAEA,wBAAkB5R,EAAlB,oBAAkCgS,GAAlC,UAEA,IAAM,EAAO7C,EAAW9O,EAAD,OAAvB,GAEA,wBAAkB,EAAlB,wBAIJ,UAGIqQ,EAAQ,oCAAH,IAETrQ,MAAOA,EAFK,MAGZ2M,QAASiF,EAAA,IAHG,QAIZL,WACAD,eACAxC,aACA0C,cACAC,iBAGF,OAAO3R,KAAK+R,eAAe,MACzB/R,KAAKgS,aAAaV,EAChBtR,KAAKiS,mBAAmBV,EAAY,OAApC,OAAoC,CAApC,CACElR,GAAIL,KAAKD,6BAA6B,UAAU,SAAAmS,GAAW,wCAAK,GAAL,IAAiBA,mBAC5ExG,WAAY,CAAC,CACX7L,KADW,SAEX+J,MAAK,SAAE5J,KAAF,mBAEJmB,KAEJiQ,EACCA,EADG,GAEH,CAACpR,KAAKmS,QAZZ,MAeFA,QA/MO,SA+MA,GACL,OAAOnS,KAAK+R,eAAe,MAAO,CAChCrB,YADgC,OAEhC0B,SAAU,CACRC,UAAWV,QAIjBW,eAvNO,SAuNO,GACZ,IAAMzB,EAAS7Q,KAAKyK,YAAczK,KAAlC,kBAEA,OAAOA,KAAK+R,eAAe,MAAO,CAChCnB,MAAO,CACLC,OAAQ,GAAF,OAAKA,EAAL,OAERC,MAAO,CACL,YAAalS,EAAIE,MAEnBiS,IAPgC,SAQhCC,UAAU,KAGduB,QArOO,SAqOA,GAA2B,aAC1B9H,EAAczK,KAApB,YACMmL,EAAoBnL,KAA1B,kBAEA,OAAOA,KAAK+R,eAAe,MAAO,CAChCrB,YADgC,oBAEhCC,MAAO,CACL,YAAa/R,EAAIiO,SAEnBiE,MAAO,CACL,YAAalS,EADR,KAEL,YAAa,GAEf8M,WAAY,CAAC,CACX7L,KADW,SAEX+J,MAAK,SAAE5J,KAAF,kBAEPK,GAAI,CACFmS,MAAO,kBAAM,0BAEf5B,MAAO,CACL6B,QADK,OAEL5B,OAAQ,GAAF,OAFD,EAEC,MACN,0BAAoB1F,EAApB,OAEF4F,IArBgC,SAsBhCC,UAAU,KAGd0B,iBAlQO,WAmQL,IAAMpP,EAAQ,eAAiBtD,KAAKmM,KAApC,IACM5I,EAAM,eAAiBvD,KAAKmM,KAAKnM,KAAKmM,KAAKgC,OAAjD,IAEA,OAAOnO,KAAKoO,aAAauE,QACvB,SAAAzS,GAAK,OAAI0S,EAAmB1S,EAAOoD,EADrC,OAIFuP,mBA1QO,SA0QW,KAChB,OAAQ7S,KAAD,cACL6J,IAAa3J,EADR,UAEJ,kBAAOA,EAAP,UAFH,OAEyC2J,GAE3CiJ,gBA/QO,SA+QQ,GACb,IAAMzL,EAAa,eAAnB,GACM3C,EAAe1E,KAAK6O,cAA1B,GAEA,OAAO7O,KAAKoO,aAAauE,QACvB,SAAAzS,GAAK,OAAI6S,EAAa7S,EAAOtB,EAAKyI,EADpC,OAIF2L,mBAvRO,SAuRW,GAA2B,WACrC3L,EAAa,eAAnB,GACM3C,EAAe1E,KAAK6O,cAA1B,GAEA,OAAO7O,KAAKoO,aAAauE,QACvB,SAAAzS,GAAK,OAAIA,EAAA,SACN,eAAoB2N,EAAU3N,EAA9B,GAAmD6S,EAAa7S,EAAOtB,EAAKyI,EADtE,KAEP,uBAA+BzI,EAHnC,cAMFqU,qBAjSO,SAiSa,GAA2B,WACvC5L,EAAa,eAAnB,GAEA,OAAOrH,KAAKoO,aAAauE,QACvB,SAAAzS,GAAK,OAAKA,EAAD,QACP2N,EAAU3N,EADH,IAEP,uBAA+BtB,EAHnC,cAMFsU,eA1SO,WA0SO,WACZ,GAAIlT,KAAJ,SACE,yBAAYA,KAAKqR,cAGnB,IAAMtG,EAAO/K,KAAK4O,kBAChB5O,KADW,aAEXA,KAAK6O,cAFM,GAGX7O,KAHF,6BAMMmT,EAAU,SAAA/H,GAAD,QAAf,GACMgI,EAAkC,SAACxU,EAAKyU,EAAQC,EAAQ7P,GAC5D,IAAMlD,EAAS8S,EAAf,GACMhR,EAAU0I,EAAKnM,EAAK2B,EAAQkD,EAAO,EAAzC,cAEA,KACE,OAAOpB,EAAA,KAAY,SAAA8B,GAAM,OAAImP,EAAOnP,EAA7B,aAAP,GAGF,IAAMoB,EAAN,GAaA,OAXAlD,EAAA,SAAgB,cACd,MAAOkD,EAAA,OAAkBpB,EAAzB,OACEoB,EAAA,KAAc,iBAAd,IAGF,IAAMgO,EAASD,EAAOnP,EAAtB,GACA,GACEoB,EAAA,WAIJ,GAGIiO,EAAQxT,KAAd,aACMyT,EAAUD,EAAhB,IACME,EAAgBF,EAAtB,cACMG,EAAcH,EAApB,YAEA,wCAAO,GAAP,IAEE5U,IAAM,YACJ,IAAI2G,EAAW6N,EAAgB,EAAK,EAAN,gBAA4B,EAA5B,aAA9B,GAIA,GAHI7N,GAAYA,EAAA,OAAZ,GAAmC,EAAvC,WACEA,EAAA,KAAc,UAAd,IAEF,EAAa,CACX,IAAM6L,EAAOqC,EAAb,GACA,IACElO,EAAWA,EAAWA,EAAA,OAAH,GAAnB,GAGJ,UAEF,aAAe,SAAA3G,GACb,IAAI2G,EAAW6N,EAAgBxU,EAAK,EAAN,mBAA+B,EAA/B,aAA9B,GAEA,KAAmB,CACjB,IAAMwS,EAAOsC,EAAb,GACA,IACEnO,EAAWA,EAAWA,EAAA,OAAH,GAAnB,GAGJ,UAEF,WAAa,SAAA3G,GACX,IAAM2B,EAAS6S,EAAgBxU,EAAK,EAAN,qBAAiC,EAAjC,eAA9B,GACI2G,EAAoB,CACtB,uBAA2B,CACzBmL,YAAa,2BAFjB,IAMA,KAAiB,CACf,IAAMU,EAAOuC,EAAb,GACA,IACEpO,EAAWA,EAAA,OAAX,IAGJ,gB,6DCveK,YAAoB,CACjC1F,KADiC,oBAGjCkB,MAAOA,EAH0B,MAKjCO,SAAU,CACRoP,YADQ,WAEN,2BAEFkD,QAJQ,WAKN,OAAO5T,KAAP,cAEF6T,eAPQ,WAQN,OAAOzJ,SAASpK,KAAhB,WAEFmM,KAVQ,WAWN,IAAM2H,EAAU9T,KAAK6T,eAAiB7T,KAAK4L,eAA3C,OACMtI,EAAQtD,KAAK+M,eAAe/M,KAAlC,aACMuD,EAAMvD,KAAKgN,aAAahN,KAA9B,WAEA,OAAO,eAAc,EAAD,EAGlBA,KAAKoB,MAHa,MAIlBpB,KAJkB,aAKlB6H,OALkB,iBAApB,IASFkM,UAxBQ,WAyBN,IAAM1S,EAAQrB,KAAKoB,MAAnB,MACMkC,EAAQtD,KAAK+M,eAAnB,GACMxJ,EAAMvD,KAAKgN,aAAjB,GAEA,OAAO,eAAc,EAAD,IAIlBhN,KAJkB,aAKlBA,KAAK4L,eALa,OAMlB5L,KAAK4L,eANP,SASFoI,eAtCQ,WAuCN,GAAIhU,KAAJ,YACE,OAAOA,KAAP,YAGF,IAAMwM,EAAc,CAAEF,SAAF,MAAmB3N,MAAO,QACxC+N,EAAe,CAAEJ,SAAF,MAAmB3N,MAAO,SAE/C,OAAO,eACLqB,KADgC,eAEhC,qBAAiB2M,EAAQD,EAF3B,OAOJ5M,QAAS,CACPmU,UADO,SACE,GACP,IAAMrG,EAAgB,eAAtB,GAEA,OAAOA,EAAgB,eAAiB5N,KAAjC,cACA4N,EAAgB,eAAiB5N,KADxC,YAGFkU,QAPO,WAQL,OAAOlU,KAAK+R,eAAe,MAAO,CAChCrB,YAAa,2BACZ1Q,KAFH,gBAIFmU,YAZO,WAaL,IAAMC,EAASpU,KAAK+T,UAAU1F,IAAIrO,KAAlC,YAQA,OANIA,KAAJ,UACEoU,EAAA,QAAepU,KAAK+R,eAAe,MAAO,CACxCrB,YAAa,wCAIjB,GAEF2D,WAvBO,SAuBG,KACR,IAAMxH,EAAU7M,KAAKiU,UAAUjU,KAAKmM,KAApC,IACMmI,EAAQ1V,EAAA,QAAcoB,KAAd,WAAd,EAEA,OAAOA,KAAK+R,eAAe,MAAO/R,KAAKgS,aAAasC,EAAO,CACzD7T,IAAK7B,EADoD,KAEzD8R,YAFyD,kCAGzDC,MAAO3Q,KAAK4M,mBAAmBhO,EAAKiO,KAClC7M,KAAKuM,iBAAiB3N,EAAKoB,KAJ/B,iBAMFuU,SAjCO,WAsCL,IAJA,IAAMpI,EAAOnM,KAAb,KACMwU,EAAWxU,KAAK4L,eAAtB,OACMxC,EAAN,GAESjG,EAAT,EAAgBA,EAAIgJ,EAApB,OAAiChJ,GAAjC,EACEiG,EAAA,KAAWpJ,KAAKyU,QAAQtI,EAAA,QAAchJ,EAA3B,GAA0CnD,KAAK0U,cAAcvI,EAAxE,MAGF,UAEFsI,QA5CO,SA4CA,KAA+C,WAC9CE,EAAYhV,EAAA,KAAS,qBAAgB,aAA3C,MAMA,OAJIK,KAAJ,UACE2U,EAAA,QAAkB3U,KAAK4U,cAAvB,IAGK5U,KAAK+R,eAAe,MAAO,CAChCtR,IAAKd,EAAA,GAD2B,KAEhC+Q,YAAa,2BAFf,IAKFgE,cAxDO,SAwDM,GACX,OAAO,gBACLG,EADe,KAEfA,EAAA,MAFe,EAGfA,EAHe,IAIf7U,KAAK4L,eAJU,GAKfxB,SAASpK,KALX,wBAQF4U,cAjEO,SAiEM,GACX,OAAO5U,KAAK+R,eAAe,MAAO,CAChCrB,YAAa,iCACZ,CACD1Q,KAAK+R,eAAe,QAASnK,OAH/B,OAMFkN,OAxEO,SAwED,OACJ,IAAMjI,EAAU7M,KAAKiU,UAArB,GAEA,OAAOjU,KAAK+R,eAAe,MAAO,CAChCtR,IAAK7B,EAD2B,KAEhC8R,YAFgC,yBAGhCC,MAAO3Q,KAAK4M,mBAAmBhO,EAHC,GAIhCyB,GAAIL,KAAKD,6BAA6B,QAAQ,SAAAgV,GAAE,OAA5C,MAJC,CAML/U,KAAKgV,YADJ,IALI,uBAOD,eAAQhV,KAAM,OAAO,kCAAS6M,UAAS5H,QAAOtF,QAASf,OAP7D,OAUFoW,YArFO,SAqFI,GACT,OAAOhV,KAAK+R,eAAe,MAAO,CAChCrB,YAAa,gCACZ,eAAQ1Q,KAAM,YAAd,IAAmC,CAACA,KAAKiV,kBAF5C,MAIFA,kBA1FO,SA0FU,GACf,IAAMX,EAAQ1V,EAAA,QAAcoB,KAAd,MAAd,cACMkV,EAAW,IAAAtW,OAAiBoB,KAAlC,iBAEA,OAAOA,KAAK+R,eAAeoD,GAApB,KAA0B,CAC/BpU,MAAO,CACLuT,QACAc,KAFK,EAGLC,WAHK,EAILC,OAAO,GAETjV,GAAIL,KAAKC,sBAAsB,CAC7B,aAAc,CAAEC,MAAF,QAAkBqV,MAAM,GACtC,mBAAoB,CAAErV,MAAF,cAAwBqV,MAAxB,EAAoCpV,SAApC,EAAmDC,QAAQ,KAC9E,SAAA2U,GAAE,OAHD,MAIHG,EACClV,KAAKgU,eAAepV,EAAKoB,KAAzB,iBAAmDA,KAAKoM,aAAaxN,GAD9D,GAEPoB,KAAKoM,aAAaxN,GAbtB,KAgBF4W,YA9GO,SA8GI,GACT,IAAMlB,EAAQ1V,EAAA,QAAcoB,KAAd,WAAd,EAEA,OAAOA,KAAK+R,eAAe,MAAO/R,KAAKgS,aAAasC,EAAO,CACzD5D,YAAa,iCACX,eAAQ1Q,KAAM,YAAd,IAAmCA,KAAKgU,eAAepV,EAAKoB,KAFhE,gBAMJyV,OAjLiC,SAiL3B,GACJ,OAAOC,EAAE,MAAO,CACdhF,YAAa1Q,KADC,YAEd2Q,MAAO3Q,KAFO,QAGdK,GAAI,CACFsV,UAAY,SAAAhV,GACVA,EAAA,oBALE,CASLX,KAAD,WADC,GACkBA,KAAnB,WATM,uBAUHA,KAVL,iBC/LW,aAAuB,CACpCH,KADoC,qBAGpCyB,SAAU,CACRoP,YADQ,WAEN,8CAEFzE,YAJQ,WAKN,OAAO,eAAgB,eAAejM,KAAD,OAArC,KAEFkM,UAPQ,WAQN,OAAO,eAAc,eAAelM,KAAD,KAAnC,QCHS,I,UAAA,SAAoB,CACjCH,KADiC,0BAGjCkB,MAAOA,EAH0B,UAKjCO,SAAU,CACRsU,oBADQ,WAEN,OAAOxL,SAASpK,KAAhB,gBAEF6V,sBAJQ,WAKN,OAAOzL,SAASpK,KAAhB,kBAEF8V,oBAPQ,WAQN,OAAO1L,SAASpK,KAAhB,gBAEF+V,qBAVQ,WAWN,OAAOC,WAAWhW,KAAlB,iBAEFiW,gBAbQ,WAcN,OAAO,eAAUjW,KAAjB,YAEFkW,YAhBQ,WAiBN,IAAMtE,EAAO5R,KAAb,gBAEA,OAAO,IAAA4R,GAAkBA,GAAlB,GAA+BA,GAA/B,OAAAA,EAEH5R,KAAK4V,oBAAsB5V,KAF/B,uBAIFmW,WAvBQ,WAwBN,OAAOnW,KAAK8V,oBAAsB9V,KAAlC,sBAEFmM,KA1BQ,WA2BN,OAAO,eACLnM,KADkB,YAElBA,KAFkB,UAGlBA,KAAKoB,MAHa,MAIlBpB,KAJkB,aAKlBA,KALF,UAQFuI,UAnCQ,WAoCN,IAAM4D,EAA4BnM,KAAlC,KACM8G,EAAgB9G,KAAtB,YACMoW,EAAkBpW,KAAxB,sBACMqW,EAAgBrW,KAAtB,oBACMgB,EAAyBhB,KAAKoB,MAApC,IAEA,OAAO+K,EAAA,KAAS,SAAAX,GAAC,OAAI,eAAmBA,EAAG1E,EAAOsP,EAASC,EAA3D,OAEFC,kBA5CQ,WA6CN,GAAItW,KAAJ,eACE,OAAOA,KAAP,eAGF,IAAMwM,EAAc,CAAEF,SAAF,MAAmB4C,KAAnB,UAAoCC,OAAQ,WAC1DzC,EAAe,CAAEJ,SAAF,MAAmB4C,KAAnB,UAAoCC,OAAQ,WAC3DoH,EAAmB,CAAEjK,SAAF,MAAmB4C,KAAM,WAElD,OAAO,eACLlP,KADgC,eAEhC,qBAAgB2M,EAAS,IAAA6J,EAAA,SAAJ,EAFvB,OAOJ1W,QAAS,CACP2W,yBADO,SACiB,GACtB,IAAM3P,EAA2B9G,KAAKuI,UAAU,GAAhD,GACMmO,EAAmB5P,EAAA,OAAe6P,EAAf,MAAgC7P,EAAA,SAAiB6P,EAA1E,OACA,UAEFC,qBANO,SAMa,KAGpBC,oBATO,SASY,KACjB,IAAM/J,EAA+B,eAArC,GACMgK,EAAUnW,EAAA,cAAhB,wBACMoW,EAAsB/W,KAA5B,YACMgX,EAAN,EACMpW,EAAN,EACMqW,EAAqBD,EAAA,gBAA6BA,EAAxD,QACME,EAAkBD,GAAWA,EAAX,GAAwBA,EAAA,GAAxB,QAA6CrW,EAArE,QACMuW,GAAwBD,EAAUJ,EAAX,KAAyB9W,KAAtD,qBACMwH,EAAqB5H,KAAA,MAAWuX,EAAenX,KAArD,uBACMoW,EAAkBW,EAAxB,EAEA,OAAO,eAAcjK,EAAWsJ,EAASpW,KAAKoB,MAA9C,MAEFgW,aAvBO,SAuBK,GACV,IAAM7G,EAAQ,eAAd,GAKA,OAJAA,EAAA,QAAgBvQ,KAAhB,QACAuQ,EAAA,UAAkBvQ,KAAlB,UACAuQ,EAAA,gBAAwBvQ,KAAxB,gBACAuQ,EAAA,KAAavQ,KAAb,KACA,GAEFqX,aA/BO,SA+BK,GACV,IAAMC,EAAItX,KAAKuX,QAAf,GACMC,EAAOxX,KAAKmQ,MAAlB,WAEA,SAAI,IAAAmH,IAAJ,KAIAE,EAAA,aAEA,IAEFC,gBA3CO,SA2CQ,GACb,OAAOrB,EAAUpW,KAAV,sBAAuCA,KAA9C,sBAEFuX,QA9CO,SA8CA,GAA2B,IAAZG,IAAY,yDAC5BJ,EAAItX,KAAK2X,UAAb,GAeA,OAbA,IAAIL,IACFA,GAAKtX,KAAL,WAEA,IACMsX,EAAJ,IACEA,EAAA,GAEEA,EAAItX,KAAR,aACEsX,EAAItX,KAAJ,cAKN,GAEF2X,UAhEO,SAgEE,GACP,IAAMvB,EAAU,eAAhB,GAEA,QAAIA,EACF,SAGF,IAAMtS,EAAc9D,KAApB,YACM4X,EAAc5X,KAAK8V,oBAAsB9V,KAA/C,sBAEA,OAAQoW,EAAD,GAAP,OC1IS,aAA6B,CAC1CvW,KAD0C,mBAG1C6L,WAAY,CAAEC,OAAA,QAEdxK,KAAM,iBAAO,CACX0W,WAAY,IAGdvW,SAAU,CACRsS,QADQ,WAEN,uBACE,oBADK,GAEF5T,KAAK8X,gBAKdC,QAlB0C,WAmBxC/X,KAAA,QAGFF,QAAS,CACPkY,KADO,WAELhY,KAAA,UAAeA,KAAf,WAEFiY,SAJO,WAKLjY,KAAA,WAAkBA,KAAlB,iBAEFkY,cAPO,WAQL,IAAMC,EAAOnY,KAAKmQ,MAAlB,WACMqH,EAAOxX,KAAKmQ,MAAlB,KAEA,OAAOgI,GAAA,EAAgBA,EAAA,YAAmBX,EAAnC,YAAP,GAEFtD,QAbO,WAcL,OAAOlU,KAAK+R,eAAe,MAAO,CAChCrB,YADgC,yBAEhCE,MAAO,CACLwH,YAAapY,KAAK6X,WAAa,OAH5B,CAML7X,KADC,oBALI,uBAOFA,KAPL,kBAUFqY,iBAxBO,WAyBL,IAAM5V,EAA4B,eAAczC,KAAhD,eAEA,OAAOA,KAAK+R,eAAe,MAAO,CAChCrB,YADgC,mCAEhCE,MAAO,CACLnO,UAED,eAAQzC,KALX,qBAOFmU,YAlCO,WAmCL,OAAOnU,KAAKmM,KAAKkC,IAAIrO,KAArB,aAEFqU,WArCO,SAqCG,KAAuC,WAC/C,OAAOrU,KAAK+R,eAAe,MAAO,CAChCtR,IAAK7B,EAD2B,KAEhC8R,YAFgC,4BAGhCC,MAAO3Q,KAAK4M,mBAHoB,GAIhCvM,GAAIL,KAAKD,6BAA6B,QAAQ,SAAAgV,GAC5C,OAAO,eAAP,OALG,CAQL/U,KAAKsY,eADJ,GAEDtY,KAAKuY,gBAFJ,IAPI,uBAUFvY,KAAKwY,aAAa5Z,EAVvB,OAaF4Z,aAnDO,SAmDK,KAAuC,WACjD,OAAO,eAAQxY,KAAM,cAAc,iCAAC,gBAClCL,KAAM,EADkC,SAAP,IACRsF,cAD3B,IAIFqT,eAxDO,SAwDO,GACZ,IAAMhE,EAAQ1V,EAAA,QAAcoB,KAAd,WAAd,EAEA,OAAOA,KAAK+R,eAAe,MAAO/R,KAAKgS,aAAasC,EAAO,CACzD5D,YAAa,kCACX1Q,KAAKuM,iBAAiB3N,EAAKoB,KAF/B,iBAIFuY,gBA/DO,SA+DQ,GACb,OAAOvY,KAAK+R,eAAe,MAAO,CAChCrB,YAAa,mCACZ,eAAQ1Q,KAAM,mBAAd,IAA0C,CAACA,KAAKyY,iBAFnD,MAIFA,iBApEO,SAoES,GACd,IAAMnE,EAAQ1V,EAAA,QAAcoB,KAAd,MAAd,cAEA,OAAOA,KAAK+R,eAAeoD,GAApB,KAA0B,CAC/BpU,MAAO,CACLuT,QACAc,KAFK,EAGLC,WAAW,GAEbhV,GAAIL,KAAKC,sBAAsB,CAC7B,aAAc,CAAEC,MAAF,QAAkBqV,MAAM,GACtC,mBAAoB,CAAErV,MAAF,cAAwBqV,MAAxB,EAAoCpV,SAApC,EAAmDC,QAAQ,KAC9E,SAAA2U,GACD,aAED/U,KAAKoM,aAAaxN,GAZrB,KAcF8Z,QArFO,WAsFL,OAAO1Y,KAAK+R,eAAe,MAAO,CAChCrB,YAAa,0BACZ,CACD1Q,KAHF,mBAMF2Y,cA5FO,WA6FL,OAAO3Y,KAAK+R,eAAe,MAAO,CAChChB,IADgC,aAEhCL,YAAa,iCACZ,CACD1Q,KAJF,aAOF4Y,QApGO,WAqGL,OAAO5Y,KAAK+R,eAAe,MAAO,CAChChB,IADgC,OAEhCL,YAFgC,yBAGhCE,MAAO,CACLC,OAAQ,eAAc7Q,KAAD,cAEtB,CACDA,KAPF,qBAUF6Y,gBA/GO,WAgHL,OAAO7Y,KAAK+R,eAAe,MAAO,CAChCrB,YAAa,mCADR,CAGL1Q,KADC,oBAFI,uBAIFA,KAJL,cAOF8Y,QAvHO,WAwHL,OAAO9Y,KAAKmM,KAAKkC,IAAIrO,KAArB,SAEF8U,OA1HO,SA0HD,KAAuC,WAC3C,OAAO9U,KAAK+R,eAAe,MAAO,CAChCtR,IAAK7B,EAD2B,KAEhC8R,YAFgC,wBAGhCC,MAAO3Q,KAAK4M,mBAHoB,GAIhCvM,GAAIL,KAAKD,6BAA6B,SAAS,SAAAY,GAC7C,OAAO,eAAkB,wBAAzB,QALG,0BAQFX,KAAK+Y,gBADP,IAPI,gBASF/Y,KAAKgZ,WATV,OAYFA,WAvIO,SAuIG,GAAwB,WAChC,OAAO,eAAQhZ,KAAM,YAAY,kBAAM,eAAhC,OAAP,IAEF+Y,gBA1IO,SA0IQ,GACb,OAAO/Y,KAAKuI,UAAUtD,GAAOoJ,IAAIrO,KAAjC,iBAEFiZ,eA7IO,SA6IO,GAA6B,WACnCpI,EAA6B,eAAc7Q,KAAjD,gBACMkZ,EAASlZ,KAAKkJ,eAAiBlJ,KAArC,qBAEMmB,EAAO,CACXV,IAAKkW,EADM,KAEXjG,YAFW,iCAGXE,MAAO,gBACLC,UACGqI,EAAOvC,KAIRpR,EAAW,eAAQvF,KAAM,YAAY,kBAAM,eAAjD,MAEA,OAAOA,KAAK+R,eAAe,MAAO5Q,EAAlC,IAEFgY,iBA9JO,WA8JS,WACR1W,EAA4B,eAAczC,KAAhD,eACMmB,EAAO,CACXuP,YADW,mCAEXE,MAAO,CACLnO,SAEFpC,GAAIL,KAAKD,6BAA6B,aAAa,SAAAY,GACjD,OAAO,wBAA4B,EAAnC,iBAIJ,OAAOX,KAAK+R,eAAe,MAAO5Q,EAAMnB,KAAxC,sBAEFoZ,kBA5KO,WA6KL,OAAKpZ,KAAKuI,UAAV,OAEOvI,KAAKuI,UAAU,GAAG8F,IAAIrO,KAA7B,kBAFmC,MAIrCqZ,iBAjLO,SAiLS,GACd,IAAMxI,EAA6B,eAAc7Q,KAAjD,gBACM2M,EAAiB3M,KAAvB,eACMsZ,EAAStZ,KAAKmJ,mBAAqBnJ,KAAzC,yBACMuZ,EAAOD,EAAb,GACME,EAAQD,EAAOvZ,KAAKsW,kBAAkBK,EAA1B,QAAlB,EAEA,OAAO3W,KAAK+R,eAAe,MAAO,CAChCtR,IAAKkW,EAD2B,KAEhCjG,YAFgC,6BAGhCE,MAAO,CACLC,WAED,CACD7Q,KAAK+R,eAAe,MAAO,CACzBrB,YAAa,mCARjB,OAcJ+E,OA5N0C,SA4NpC,GACJ,OAAOC,EAAE,MAAO,CACd/E,MAAO3Q,KADO,QAEdK,GAAI,CACFsV,UAAY,SAAAhV,GACVA,EAAA,mBAGJ+K,WAAY,CAAC,CACX+N,UAAW,CAAEC,OAAO,GACpB7Z,KAFW,SAGX+J,MAAO5J,KAAKiY,YAEb,CACAjY,KAAD,WADC,GACkBA,KAAnB,UACAA,KAdF,eClOW,I,UAAA,UAAsB,CACnCH,KADmC,sBAGnCkB,MAAOA,EAH4B,SAKnCO,SAAU,CACRsS,QADQ,WAEN,uBACE,oBADK,EAEL,uBAFK,GAGF5T,KAAK8X,eAGZ6B,iBARQ,WASN,MAAO,kBAAO3Z,KAAP,YAAuCA,KAAvC,WACHA,KAAK8J,WAAW8P,MADb,WAEH9Y,MAAA,QAAcd,KAAd,YACEA,KADF,WAFJ,KAQJF,QAAS,CACP0Y,aADO,SACK,KAAuC,WAC3CrX,EAAO,CACXuP,YAAa,gCAETH,EAAQ,+BACZ5Q,KAAMK,KADM,SAAH,IACgBiF,UAGrBM,EAAWvF,KAAK2Z,iBAAiBtL,KAAI,SAAAxE,GAAQ,OAAI,yBAA+B,qBAAtF,OAEA,MAAO,CAAC7J,KAAK+R,eAAe,MAAO5Q,EAAnC,KAEF0Y,iBAbO,SAaS,KACd,wCAAO,GAAP,IAEEhQ,SAAUA,IAAa7J,KAAb,wBAA8C6J,KAG5DiQ,qBAnBO,SAmBa,KAAoC,WACtD,OAAO9Z,KAAK+R,eAAe,MAAO,CAChCrB,YADgC,qCAEhCrQ,GAAIL,KAAKD,6BAA6B,iBAAiB,SAAAY,GACrD,OAAO,mBAAsB,eAAtB,GAA8C4P,EAArD,cAED,CACD,eAAQvQ,KAAM,WAAd,IAAoCA,KAAK+Z,0BAA0BxJ,EADlE,UAED,eAAQvQ,KAAM,aAPhB,MAUF+Z,0BA9BO,SA8BkB,GACvB,OAAO/Z,KAAK+R,eAAe,MAAO,CAChCrB,YAAa,iCACZ,OAAA7G,EAAoB7J,KAApB,mBAFH,IAIFgZ,WAnCO,SAmCG,GAAwB,WAC1B7X,EAAO,CACXuP,YAAa,gCAGTnL,EAAWvF,KAAK2Z,iBAAiBtL,KAAI,SAAAxE,GAAQ,OAAI,uBAAvD,MAEA,MAAO,CAAC7J,KAAK+R,eAAe,MAAO5Q,EAAnC,KAEF6Y,mBA5CO,SA4CW,KAA0C,WACpD7Y,EAAO,CACXuP,YADW,8BAEXrQ,GAAIL,KAAKD,6BAA6B,kBAAkB,SAAAY,GACtD,OAAO,mBAAsB,eAAkB,wBAAxC,IAAP,OAIE4E,EAAW,eAAQvF,KAAM,YAAY,kBAAM,mBAAsB,eAAtB,GAAjD,MAEA,OAAOA,KAAK+R,eAAe,MAAO5Q,EAAlC,QC1CS,iBAA0B,CACvCtB,KADuC,aAGvCkB,MAAO,+DACFA,EADE,UAEFA,EAFE,OAGFA,EAHE,WAIFA,EAAM8I,UAGX1I,KAAM,iBAAO,CACX8Y,UADW,KAEXC,QAAS,OAGX5Y,SAAU,CACR6Y,YADQ,WAEN,OAAQ,eAAkBna,KAAlB,OACJ,eAAeA,KAAD,OADV,GAEHA,KAAKiM,aAAejM,KAAKoB,MAF9B,OAIFgZ,mBANQ,WAON,OAAOhQ,SAASpK,KAAT,eAAP,GAEFqa,YATQ,WAUN,IAAMC,EAASta,KAAf,YACIua,EAAJ,KACI/R,EAAUxI,KAAd,QACIgI,EAAWhI,KAAf,eACI8J,EAAa9J,KAAjB,iBACIsD,EAAJ,EACIC,EAAJ,EACA,OAAQvD,KAAR,MACE,YACEua,EAAA,GACAjX,EAAQ,eAAR,GACAC,EAAM,eAAN,GACA,MACF,WACEgX,EAAA,GACAjX,EAAQtD,KAAK+M,eAAb,GACAxJ,EAAMvD,KAAKgN,aAAX,GACAxE,EAAA,EACA,MACF,UACE+R,EAAA,GACA/R,EAAA,EACAR,EAAW,CAAC1E,EAAZmJ,SACA,MACF,WACE8N,EAAA,GACAhX,EAAM,eAAa,eAAD,UAAlB,GACA,kBACAiF,EAAA,EACAR,EAAW,CACT1E,EADS,SAERA,EAAA,QAAD,GAFS,GAGRA,EAAA,QAAD,GAHS,GAIRA,EAAA,QAAD,GAJF,GAMA,MACF,oBACEiX,EAAA,GACAjX,EAAQtD,KAAKiM,aAAb,EACA1I,EAAMvD,KAAN,UACA,MACF,mBACEua,EAAA,GACAjX,EAAQtD,KAAKiM,aAAb,EACA1I,EAAMvD,KAAN,UACA,MACF,eACE,IAAMmM,EAAOnM,KAAb,mBAEAua,EAAA,GACAhX,EAAM,eAAa,eAAD,UAAlB,GACA,kBACAiF,EAAA,EACAR,EAAA,GAEA,IAAK,IAAI7E,EAAT,EAAgBA,EAAhB,EAA0BA,IACxB6E,EAAA,MAAe1E,EAAA,QAAD,GAAd,GAGFwG,EAAa9J,KAAKwa,gBAAlB1Q,GACA,MACF,QACE,MAAM,IAAI2Q,MAAMza,KAAKiB,KAArB,iCAGJ,MAAO,CAAEsZ,YAAWjX,QAAOC,MAAKiF,UAASR,WAAU8B,eAErD+E,cA7EQ,WA8EN,OAAO7O,KAAKqa,YAAZ,UAEFvL,aAhFQ,WAiFN,mBAAO9O,KAAKiB,MAEdyZ,MAnFQ,WAmFH,MACoB1a,KAAvB,YAAM,EADH,EACG,MAASuD,EADZ,EACYA,IACToX,EAAYrX,EAAA,OAAeC,EAAjC,KACMqX,EAAaD,GAAarX,EAAA,QAAgBC,EAAhD,MAEA,SACSvD,KAAK6a,oBAAoBvX,GAAO,GAAQ,IAAMA,EAA9C,WAAmEtD,KAAK6a,oBAAoBtX,GAA5F,OAA+GA,EAAtH,KAGF,EACSvD,KAAK6a,oBAAoBvX,GAAO,GAAQ,MAAQtD,KAAK6a,oBAAoBtX,GAAzE,OAA4FA,EAAnG,KAEOvD,KAAK8a,mBAAmBxX,GAAO,GAAS,IAAMA,EAArD,MAGJwX,mBAlGQ,WAmGN,OAAO9a,KAAKiN,aAAa,CACvBX,SADuB,MACN3N,MAAO,UAG5Bkc,oBAvGQ,WAwGN,OAAO7a,KAAKiN,aAAa,CACvBX,SADuB,MACN3N,MAAO,WAG5Bgb,iBA5GQ,WA6GN,MAAO,kBAAO3Z,KAAP,YAAuCA,KAAvC,WACHA,KAAK8J,WAAW8P,MADb,WAEH9Y,MAAA,QAAcd,KAAd,YACEA,KADF,WAFJ,KAQJwB,MAAO,CACL6Y,YAAa,eAGftC,QAxIuC,WAyIrC/X,KAAA,wBACAA,KAAA,eAGF+a,QA7IuC,WA8IrCC,OAAA,sBAA6Bhb,KAA7B,wBAGFF,QAAS,CACPmb,YADO,WACI,IACH,EAAN,KAAM,UAAaf,EAAnB,KAAmBA,QADV,EAEcla,KAAvB,YAAM,EAFG,EAEH,MAASuD,EAFN,EAEMA,IACV0W,GAAD,GACF3W,EAAA,OAAe2W,EADb,MAEF1W,EAAA,OAAa2W,EAFf,OAGEla,KAAA,YACAA,KAAA,UACAA,KAAA,eAAqB,CAAEsD,QAAOC,UAGlC2X,KAZO,WAYS,IAAVC,EAAU,uDAAZ,EACIC,EAAQ,eAAcpb,KAA5B,aACMqb,EAAUF,EAAhB,EACMG,EAAQD,EAAU,EAAH,KAArB,OACME,EAAQF,EAAU,EAAH,KAArB,OACIja,EAAQia,EAAUF,GAAtB,EAEA,QAAS/Z,GAAT,EACE,OAAQpB,KAAR,MACE,YACEob,EAAA,MACAE,EAAA,GACA,MACF,WACE,eAAaF,EAAOE,EAApB,QACA,MACF,UACE,eAAaF,EAAOE,EAApB,GACA,MACF,WACE,eAAaF,EAAOE,EAApB,GACA,MACF,eACE,eAAaF,EAAOE,EAAOtb,KAA3B,oBACA,MAIN,kBACA,kBACA,eAAeob,EAAOpb,KAAKoB,MAA3B,KAEIpB,KAAK4J,iBAAT,KACE5J,KAAA,cAAoB,eAApB,IACK,kBAAWA,KAAP,MACTA,KAAA,cAAoB,kBAApB,WAEAA,KAAA,cAAoBob,EAApB,MAGFpb,KAAA,kBAEFwb,KAtDO,WAsDS,IAAVL,EAAU,uDAAZ,EACFnb,KAAA,SAEFyb,KAzDO,WAyDS,IAAVN,EAAU,uDAAZ,EACFnb,KAAA,UAEFuX,QA5DO,SA4DA,GAA2B,IAAZG,IAAY,yDAC1BlR,EAAIxG,KAAK0b,UAAf,GAEA,SAAIlV,IAAKA,EAAT,UACSA,EAAA,UAAP,IAKJmR,UArEO,SAqEE,GACP,IAAMnR,EAAIxG,KAAK0b,UAAf,GAEA,SAAIlV,IAAKA,EAAT,YACSA,EAAA,UAAP,IAKJiR,gBA9EO,SA8EQ,GACb,IAAMjR,EAAIxG,KAAK0b,UAAf,GAEA,OAAIlV,GAAKA,EAAT,gBACSA,EAAA,gBAAP,IAEA,GAGJ6Q,aAvFO,SAuFK,GACV,IAAM7Q,EAAIxG,KAAK0b,UAAf,GAEA,SAAIlV,IAAKA,EAAT,eACSA,EAAA,aAAP,IAKJmV,eAhGO,SAgGO,KACZ,OAAO,eAAevQ,EAAOwQ,EAAU5b,KAAKoB,MAA5C,MAEFya,gBAnGO,SAmGQ,GACb,OAAO,eAAP,IAEFrB,gBAtGO,SAsGQ,GAAsB,WACnC,IAAKxa,KAAL,SAAoB,CAClB,IAAM8b,EAAchS,EAAA,QAAkB,gBAGpC,OAFAuE,EAAA,GAAgB,CAAEpJ,QAAOoR,MAAO,GAEhC,IACC0F,OAAA,OAJH,OAMA,IAAK/b,KAAD,sBAA8BA,KAAlC,gBAAwD,CACtD,IAAIgc,EAAiBlS,EAArB,OAEA9J,KAAA,sBAA0B,SAAAic,GACxB,IAAIpS,EAAWoS,EAAf,SAEA,kBAAWpS,IACTA,EAAW,EAAX,oBAGF,IAIIA,KAAJ,EACEiS,EAAAjS,GAAA,QACU,EAAL,sBACLiS,EAAAjS,GAAwB,CACtB5E,MAAO+W,IACP3F,MAAO,QAMf,IAAKrW,KAAL,gBACE,IAAK,IAAL,OACE,IAAI8b,EAAAjS,GAAA,cACKiS,EAAP,GAKNhS,EAAaiS,OAAA,KAAb,GAGF,WAIJtG,OAvSuC,SAuSjC,GAAG,aAC0DzV,KAAjE,YAAM,EADC,EACD,QADC,EACD,MADC,EACD,UADC,EACD,YADC,EACD,SAA4C8J,EAD3C,EAC2CA,WAElD,OAAO4L,EAAE6E,EAAW,CAClB7J,YADkB,aAElBC,MAAO,CACL,qBAAsB3Q,KAAKkO,UAE7BnN,MAAO,iCACFf,KADE,QAAF,IAEHsD,MAAOA,EAFF,KAGLC,IAAKA,EAHA,KAILiF,UACAR,WACA8B,eAEF4B,WAAY,CAAC,CACX+N,UAAW,CAAEC,OAAO,GACpB7Z,KAFW,SAGX+J,MAAO5J,KAAKsP,wBAEdjP,GAAI,iCACCL,KADD,YAAF,IAEA,aAAe,SAAApB,GACT,aAAJ,UACE,gBAAoBA,EAApB,MAEE,aAAJ,eACE,2BAINsd,YAAalc,KAAKkT,uB,qBCxXxB,IAAIiJ,EAAI,EAAQ,QAIhBA,EAAE,CAAEla,OAAQ,SAAUma,MAAM,GAAQ,CAClCC,iBAAkB,oB,gFCLpB,gBAEe,2BAAW,CACxBxc,KADwB,YAGxBkB,MAAO,CACLub,OAAQ1U,QAGVtG,SAAU,CACRib,cADQ,WAEN,OAAOvc,KAAKsc,QAAUtc,KAAK8P,SAASC,KAApC,a,urCCROyM,EAAN,+EACMC,EAAN,gCAEMC,EAA0B,CAAC,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAA5E,IACMC,EAA+B,CAAC,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAjF,IACMC,EAAN,GACMC,EAAN,GACMC,EAAN,GACMC,EAAN,EACMC,EAAN,EACMC,EAAN,EACMC,EAAN,GACMC,EAAN,GACMnP,EAAiB,KAEjBoP,EAAN,GAEMC,EAAN,IACMC,EAAN,IACMC,EAAN,IACMC,EAAN,IAWD,kBACJ,IAAMla,EAAQma,EAAd,GAOA,OANAC,EAAYpa,EAAO0E,EAAR,GAAX,GACA2V,EAAA,GACA,GACEC,EAAeta,EAAOjC,EAAOiC,EAA7B,SAGF,EAGI,kBACJ,IAAMC,EAAMka,EAAZ,GAOA,OANAC,EAAYna,EAAKyE,EAASA,EAAA,OAA1B,IACA2V,EAAA,GACA,GACEC,EAAera,EAAKlC,EAAOkC,EAA3B,SAGF,EAGI,cACJ,IAAMD,EAAQma,EAAd,GAKA,OAJAna,EAAA,MACAua,EAAA,GACAF,EAAA,GAEA,EAGI,cACJ,IAAMpa,EAAMka,EAAZ,GAKA,OAJAla,EAAA,IAAUua,EAAYva,EAAD,KAAWA,EAAhC,OACAsa,EAAA,GACAF,EAAA,GAEA,EAGI,cACJ,MAAyB,kBAAVvS,GAAsBpM,SAA9B,MACFyd,EAAA,KADE,IAEJ,8BAA6Bzd,SAASoM,EAAtC,OAAqDpM,SAASoM,EAFjE,QAKI,cACJ,qBAAWA,EAET,SACK,qBAAWA,EAAoB,CAEpC,IAAM2S,EAAQtB,EAAA,KAAd,GACA,WAIO,GAAArS,SAAS2T,EAAT,IAA0B3T,SAAS2T,EAAA,IAA1C,GACK,iBAAI,oBAEL,kBAAO3S,EAAP,MAAJ,kBAA6CA,EAAP,QAI/B,GAAAA,EAAA,KAAkBA,EAAzB,QAOE,cACJ,MAAyB,kBAAVA,GAAsBpM,SAA9B,IACa,kBAAVoM,KAAwBoR,EAAA,KAD3B,IAEJpR,aAFH,KAOI,cAA2F,IAAzCwQ,EAAyC,wDAA3F,EAA2F,uCAK/F,GAJqB,kBAAVxQ,GAAsBpM,SAAjC,KACEoM,EAAQ,IAAIrM,KAAZqM,IAGEA,aAAJ,KAA2B,CACzB,IAAMtM,EAA0Bkf,EAAhC,GAMA,OAJA,GACEJ,EAAe9e,EAAMkC,EAAKlC,EAA1B,SAGF,EAGF,qBAAWsM,EAAoB,CAC7B,KACE,MAAM,IAAIqP,MAAM,GAAV,OAAN,EAAM,gMAER,YAIF,IAAMsD,EAAQvB,EAAA,KAAd,GAEA,MAAY,CACV,KACE,MAAM,IAAI/B,MAAM,GAAV,OAAN,EAAM,gMAGR,YAGF,IAAM3N,EAA+B,CACnChO,KADmC,EAEnC8S,KAFmC,GAGnC/S,KAAMuL,SAAS2T,EAHoB,IAInCpf,MAAOyL,SAAS2T,EAJmB,IAKnCnf,IAAKwL,SAAS2T,EAAT,KAL8B,EAMnC7O,KAAM9E,SAAS2T,EAAT,KAN6B,EAOnC5O,OAAQ/E,SAAS2T,EAAT,KAP2B,EAQnCtR,QARmC,EASnCwR,SAAUF,EATyB,GAUnCG,WAAYH,EAAA,KAAYA,EAVW,IAWnCnc,MAXmC,EAYnCD,SAZmC,EAanCE,QAAQ,GAUV,OAPAgc,EAAA,GACAF,EAAA,GAEA,GACEC,EAAe9Q,EAAW9L,EAAK8L,EAA/B,SAGF,EAGI,cACJ,OAAO6Q,EAAgB,CACrB7e,KADqB,GAErB8S,KAFqB,GAGrB/S,KAAMC,EAHe,cAIrBH,MAAOG,EAAA,WAJc,EAKrBF,IAAKE,EALgB,UAMrB2N,QAAS3N,EANY,SAOrBoQ,KAAMpQ,EAPe,WAQrBqQ,OAAQrQ,EARa,aASrBmf,QATqB,EAUrBC,SAVqB,EAWrBtc,MAXqB,EAYrBD,SAZqB,EAarBE,QAAQ,IAIN,cACJ,OAAOiL,EAAA,OAA+BA,EAAA,MAA/B,EAAgEA,EAAvE,IAGI,cACJ,OAAOA,EAAA,OAA+BA,EAAtC,OAGI,cACJ,OAAOqR,EAAA,KAA4CC,EAAnD,GAGI,gBAA4F,IAAZxM,EAAY,wDAC5FlP,EAAIyb,EAAR,GACIxb,EAAIwb,EAAR,GACIxc,EAAUe,IAAd,EAYA,OAVIoK,EAAA,SAAA8E,GAAJ,IACElP,EAAI0b,EAAJ,GACAzb,EAAIyb,EAAJ,GACAzc,EAAUe,IAAV,GAGFoK,EAAA,KAAiBnK,EAAjB,EACAmK,EAAA,UACAA,EAAA,OAAmBnK,EAAnB,EAEA,EAGI,cACJ,OAAQyI,aAAD,MAA6C,kBAAVA,GAAsBpM,SAAhE,GAGI,kBAaJ,OAZI8N,EAAA,UAAJ,IACEA,EAAA,UACA,IACEA,EAAA,OACAA,EAAA,SACAA,EAAA8E,KAAiByM,EAAjBvR,IAEF,GACE8Q,EAAe9Q,EAAW9L,EAAK8L,EAA/B,UAIJ,EAGI,kBASJ,OARAA,EAAA,WACAA,EAAA,KAAiBlN,KAAA,MAAWwW,EAA5B,GACAtJ,EAAA,OAAmBsJ,EAAnB,EACAtJ,EAAA8E,KAAiByM,EAAjBvR,GACA,GACE8Q,EAAe9Q,EAAW9L,GAA1B,GAGF,EAGI,cAGJ,OAFA8L,EAAA,QAAoBwR,EAApBxR,GAEA,EAGI,cAIJ,OAHAA,EAAA8E,KAAiByM,EAAjBvR,GACAA,EAAA,KAAiByR,EAAjBzR,GAEA,EAGI,cACJ,GAAIA,EAAJ,OAAsB,CACpB,IAAM0R,EAAI5e,KAAV,MACM4D,EAAIsJ,EAAV,IACM2R,GAAM3R,EAAA,MAAD,GAAD,EAAV,EACM4R,EAAIF,EAAE1R,EAAA,KAAZ,KACM6R,EAAK7R,EAAA,KAAD,KAA0BA,EAAA,WAApC,GAEA,QAAUtJ,EAAIgb,EAAE,IAAMC,EAAZ,IAAuB,EAAvB,IAAmCD,EAAEG,EAArC,GAA8CH,EAAEE,EAAjD,IAAD,EAAD,GAAP,EAGF,OAAO5R,EAAP,QAGI,gBACJ,OAAO,kBAAmB6P,EAAnB,GAA+CD,EAAtD,GAGI,cAAqD,IACnD,EAAN,EAAM,OAAN,EAAM,OAAN,EAAM,OAAN,EAAM,QAAN,EAAM,MAAN,EAAM,UAAN,EAAM,OAAN,EAAM,SAAN,EAAM,SAAN,EAAM,UAAN,EAAM,OAAN,EAAM,QAAuF7a,EAA7F,EAA6FA,OAE7F,MAAO,CAAE/C,OAAM8S,OAAM/S,OAAMF,QAAOC,MAAK6N,UAASyC,OAAMC,SAAQ8O,SAAQC,UAAStc,OAAMD,UAASE,UAG1F,gBACJ,IAAI+c,EAAShX,OAAb,GACA,MAAOgX,EAAA,OAAP,EACEA,EAAS,IAATA,EAGF,SAGI,cACJ,IAAIC,EAAM,GAAH,OAAMC,EAAUhS,EAAD,QAAf,YAAsCgS,EAAUhS,EAAD,MAAtD,IAIA,OAFIA,EAAJ,SAAsB+R,GAAO,IAAJ,OAAQC,EAAUhS,EAAD,IAApB,KAEtB,EAGI,cACJ,OAAKA,EAAL,QAIA,UAAUgS,EAAUhS,EAAD,QAAnB,YAA0CgS,EAAUhS,EAAD,OAAnD,IAHE,GAoBE,cAYJ,OAXAA,EAAA,MACAA,EAAA,SAAqBA,EAAA,QAAD,GAApB,EACIA,EAAA,OAAqCA,EAAA,IAAgBgR,EAAYhR,EAAD,KAAiBA,EAArF,SACEA,EAAA,MACAA,EAAA,QACIA,EAAA,MAAJ,IACEA,EAAA,QACAA,EAAA,SAIJ,EAGI,cAYJ,OAXAA,EAAA,MACAA,EAAA,SAAqBA,EAAA,QAAD,GAApB,EACIA,EAAA,IAAJ,IACEA,EAAA,QACIA,EAAA,MAAJ,IACEA,EAAA,OACAA,EAAA,SAEFA,EAAA,IAAgBgR,EAAYhR,EAAD,KAAiBA,EAA5C,QAGF,EAGI,cAGI,IADRwO,EACQ,uDAHJ,EAGJnP,EAAQ,uDAHJ,EAKJ,QAASA,GAAT,EAAoBmP,EAAA,GAEpB,SAGI,gBACJ,IAAMqD,EAAN,QAAW5a,EAAA,KAAWD,EAAZ,MACJib,EAAN,OAAWhb,EAAA,MAAYD,EAAb,OACJkb,EAAN,MAAWjb,EAAA,IAAUD,EAAX,KACJ4R,EAAN,IAAW3R,EAAA,KAAWD,EAAZ,MACJ2a,EAAK1a,EAAA,OAAaD,EAAxB,OAEA,OAAO6a,EAAA,MAAP,EAGI,gBACoD,IAAxDrD,EAAwD,uDADpD,EACyC9S,EAAW,uDADpD,EAEJ,MAAOsE,EAAA,eAAmCtE,GAA1C,EAAwD8S,EAAA,GAExD,SAGI,cAGJ,IAFA,IAAM2D,EAAkB,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAxC,GACMC,EAAmB,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAzC,GACS/b,EAAT,EAAgBA,EAAI6E,EAApB,OAAqC7E,IACnC+b,EAAOlX,EAAP,MAEF,IAAK,IAAIxE,EAAT,EAAgBA,EAAhB,EAAkCA,IAAK,CAErC,IADA,IAAI2b,EAAJ,EACSC,EAAT,EAAgBA,EAAhB,EAAkCA,IAAK,CACrC,IAAM5D,GAAQhY,EAAD,GAAb,EACA,GAAI0b,EAAJ,GACE,MAEFC,IAEFF,EAAA,GAAWC,EAAA,GAAXC,EAGF,SAGI,cACJ,IAAMvN,EAAO,GAAH,OAAMkN,EAAUhS,EAAD,QAAf,YAAsCgS,EAAUhS,EAAD,OAAzD,IACMhO,EAAOgO,EAAb,KAEA,OAAO,IAAI/N,KAAK,GAAT,OAAYD,EAAZ,YAAP,EAAO,cAGH,qBAMG,IADPiF,EACO,uDANH,GAMJD,EAAO,uDANH,EAQEyR,EAAO4I,EAAb,GACMhS,EAAN,GACIkT,EAAU5B,EAAd,GACI6B,EAAJ,EACIC,EAAUD,IAAd,EAEA,GAAI/J,EAAO4I,EAAX,GACE,MAAM,IAAI1D,MAAV,wCAGF,QAAS8E,GAAWpT,EAAA,OAAb,IAAmCA,EAAA,OAA1C,EAGE,GAFAmT,EAAoBnB,EAApBkB,GACAE,EAAUA,GAAWD,IAArB/J,EACA,IAAI1J,EAAawT,EAAb5S,SAAJ,CAIA,IAAM7N,EAAM6e,EAAZ,GACAE,EAAA,GACAC,EAAehf,EAAf,GACAuN,EAAA,KAAAvN,GACAygB,EAAUG,EAAaH,EAASI,EAAS5T,EAAawT,EAAtD,eAPEA,EAAUI,EAAVJ,GAUJ,IAAKlT,EAAL,OAAkB,MAAM,IAAIsO,MAAV,sEAElB,SAGI,uBAIJ,IAFA,IAAMlS,EAAN,GAESpF,EAAT,EAAgBA,EAAhB,EAA2BA,IAAK,CAC9B,IAAMuc,EAAO5Y,EAAS3D,EAAtB,EACMwc,EAAMlC,EAAZ,GACAlV,EAAA,KAAeqX,EAAcD,EAAKD,EAAlC,IAGF,SAGI,iBACJ,IAAMG,EAAoC,SAACC,EAAIC,GAAL,MAA1C,IAEA,MAAoB,qBAATC,MAAX,qBAA0CA,KAAP,eACjC,EAGK,cACL,IACE,IAAMC,EAAgB,IAAID,KAAJ,eAAwB1D,QAAxB,EAA6C4D,EAAWpT,EAA9E,IAEA,OAAOmT,EAAA,OAAqBpE,EAA5B,IACA,MAAOlb,GACP,a","file":"js/chunk-62fee8c2.34b13cad.js","sourcesContent":["function createUTCDate (year: number, month = 0, day = 1) {\n let date\n if (year < 100 && year >= 0) {\n date = new Date(Date.UTC(year, month, day))\n if (isFinite(date.getUTCFullYear())) {\n date.setUTCFullYear(year)\n }\n } else {\n date = new Date(Date.UTC(year, month, day))\n }\n\n return date\n}\n\nfunction firstWeekOffset (year: number, firstDayOfWeek: number, firstDayOfYear: number) {\n const firstWeekDayInFirstWeek = 7 + firstDayOfWeek - firstDayOfYear\n const firstWeekDayOfYear = (7 + createUTCDate(year, 0, firstWeekDayInFirstWeek).getUTCDay() - firstDayOfWeek) % 7\n\n return -firstWeekDayOfYear + firstWeekDayInFirstWeek - 1\n}\n\nfunction dayOfYear (year: number, month: number, day: number, firstDayOfWeek: number) {\n let dayOfYear = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334][month]\n if (month > 1 && isLeapYear(year)) {\n dayOfYear++\n }\n\n return dayOfYear + day\n}\n\nfunction weeksInYear (year: number, firstDayOfWeek: number, firstDayOfYear: number) {\n const weekOffset = firstWeekOffset(year, firstDayOfWeek, firstDayOfYear)\n const weekOffsetNext = firstWeekOffset(year + 1, firstDayOfWeek, firstDayOfYear)\n const daysInYear = isLeapYear(year) ? 366 : 365\n\n return (daysInYear - weekOffset + weekOffsetNext) / 7\n}\n\nexport function weekNumber (year: number, month: number, day: number, firstDayOfWeek: number, localeFirstDayOfYear: number): number {\n const weekOffset = firstWeekOffset(year, firstDayOfWeek, localeFirstDayOfYear)\n const week = Math.ceil((dayOfYear(year, month, day, firstDayOfWeek) - weekOffset) / 7)\n\n if (week < 1) {\n return week + weeksInYear(year - 1, firstDayOfWeek, localeFirstDayOfYear)\n } else if (week > weeksInYear(year, firstDayOfWeek, localeFirstDayOfYear)) {\n return week - weeksInYear(year, firstDayOfWeek, localeFirstDayOfYear)\n } else {\n return week\n }\n}\n\nexport function isLeapYear (year: number): boolean {\n return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0)\n}\n","import Vue from 'vue'\n\nexport type MouseHandler = (e: MouseEvent | TouchEvent) => any\n\nexport type MouseEvents = {\n [event: string]: {\n event: string\n passive?: boolean\n capture?: boolean\n once?: boolean\n stop?: boolean\n prevent?: boolean\n button?: number\n result?: any\n }\n}\n\nexport type MouseEventsMap = {\n [event: string]: MouseHandler | MouseHandler[]\n}\n\nexport default Vue.extend({\n name: 'mouse',\n\n methods: {\n getDefaultMouseEventHandlers (suffix: string, getEvent: MouseHandler): MouseEventsMap {\n return this.getMouseEventHandlers({\n ['click' + suffix]: { event: 'click' },\n ['contextmenu' + suffix]: { event: 'contextmenu', prevent: true, result: false },\n ['mousedown' + suffix]: { event: 'mousedown' },\n ['mousemove' + suffix]: { event: 'mousemove' },\n ['mouseup' + suffix]: { event: 'mouseup' },\n ['mouseenter' + suffix]: { event: 'mouseenter' },\n ['mouseleave' + suffix]: { event: 'mouseleave' },\n ['touchstart' + suffix]: { event: 'touchstart' },\n ['touchmove' + suffix]: { event: 'touchmove' },\n ['touchend' + suffix]: { event: 'touchend' },\n }, getEvent)\n },\n getMouseEventHandlers (events: MouseEvents, getEvent: MouseHandler): MouseEventsMap {\n const on: MouseEventsMap = {}\n\n for (const event in events) {\n const eventOptions = events[event]\n\n if (!this.$listeners[event]) continue\n\n // TODO somehow pull in modifiers\n\n const prefix = eventOptions.passive ? '&' : ((eventOptions.once ? '~' : '') + (eventOptions.capture ? '!' : ''))\n const key = prefix + eventOptions.event\n\n const handler: MouseHandler = e => {\n const mouseEvent: MouseEvent = e as MouseEvent\n if (eventOptions.button === undefined || (mouseEvent.buttons > 0 && mouseEvent.button === eventOptions.button)) {\n if (eventOptions.prevent) {\n e.preventDefault()\n }\n if (eventOptions.stop) {\n e.stopPropagation()\n }\n this.$emit(event, getEvent(e))\n }\n\n return eventOptions.result\n }\n\n if (key in on) {\n /* istanbul ignore next */\n if (Array.isArray(on[key])) {\n (on[key] as MouseHandler[]).push(handler)\n } else {\n on[key] = [on[key], handler] as MouseHandler[]\n }\n } else {\n on[key] = handler\n }\n }\n\n return on\n },\n },\n})\n","import Vue from 'vue'\n\nimport {\n validateTimestamp,\n parseTimestamp,\n parseDate,\n} from '../util/timestamp'\nimport { CalendarTimestamp } from 'vuetify/types'\n\nexport default Vue.extend({\n name: 'times',\n\n props: {\n now: {\n type: String,\n validator: validateTimestamp,\n },\n },\n\n data: () => ({\n times: {\n now: parseTimestamp('0000-00-00 00:00', true),\n today: parseTimestamp('0000-00-00', true),\n },\n }),\n\n computed: {\n parsedNow (): CalendarTimestamp | null {\n return this.now ? parseTimestamp(this.now, true) : null\n },\n },\n\n watch: {\n parsedNow: 'updateTimes',\n },\n\n created () {\n this.updateTimes()\n this.setPresent()\n },\n\n methods: {\n setPresent (): void {\n this.times.now.present = this.times.today.present = true\n this.times.now.past = this.times.today.past = false\n this.times.now.future = this.times.today.future = false\n },\n updateTimes (): void {\n const now: CalendarTimestamp = this.parsedNow || this.getNow()\n this.updateDay(now, this.times.now)\n this.updateTime(now, this.times.now)\n this.updateDay(now, this.times.today)\n },\n getNow (): CalendarTimestamp {\n return parseDate(new Date())\n },\n updateDay (now: CalendarTimestamp, target: CalendarTimestamp): void {\n if (now.date !== target.date) {\n target.year = now.year\n target.month = now.month\n target.day = now.day\n target.weekday = now.weekday\n target.date = now.date\n }\n },\n updateTime (now: CalendarTimestamp, target: CalendarTimestamp): void {\n if (now.time !== target.time) {\n target.hour = now.hour\n target.minute = now.minute\n target.time = now.time\n }\n },\n },\n})\n","import { CalendarEventParsed, CalendarEventVisual, CalendarTimestamp } from 'vuetify/types'\nimport { getTimestampIdentifier } from '../util/timestamp'\n\nconst MILLIS_IN_DAY = 86400000\n\nexport type GetRange = (event: CalendarEventParsed) => [number, number]\n\nexport function getVisuals (events: CalendarEventParsed[], minStart = 0): CalendarEventVisual[] {\n const visuals = events.map(event => ({\n event,\n columnCount: 0,\n column: 0,\n left: 0,\n width: 100,\n }))\n\n visuals.sort((a, b) => {\n return (Math.max(minStart, a.event.startTimestampIdentifier) - Math.max(minStart, b.event.startTimestampIdentifier)) ||\n (b.event.endTimestampIdentifier - a.event.endTimestampIdentifier)\n })\n\n return visuals\n}\n\nexport interface ColumnGroup {\n start: number\n end: number\n visuals: CalendarEventVisual[]\n}\n\nexport function hasOverlap (s0: number, e0: number, s1: number, e1: number, exclude = true): boolean {\n return exclude ? !(s0 >= e1 || e0 <= s1) : !(s0 > e1 || e0 < s1)\n}\n\nexport function setColumnCount (groups: ColumnGroup[]) {\n groups.forEach(group => {\n group.visuals.forEach(groupVisual => {\n groupVisual.columnCount = groups.length\n })\n })\n}\n\nexport function getRange (event: CalendarEventParsed): [number, number] {\n return [event.startTimestampIdentifier, event.endTimestampIdentifier]\n}\n\nexport function getDayRange (event: CalendarEventParsed): [number, number] {\n return [event.startIdentifier, event.endIdentifier]\n}\n\nexport function getNormalizedRange (event: CalendarEventParsed, dayStart: number): [number, number] {\n return [Math.max(dayStart, event.startTimestampIdentifier), Math.min(dayStart + MILLIS_IN_DAY, event.endTimestampIdentifier)]\n}\n\nexport function getOpenGroup (groups: ColumnGroup[], start: number, end: number, timed: boolean) {\n for (let i = 0; i < groups.length; i++) {\n const group = groups[i]\n let intersected = false\n\n if (hasOverlap(start, end, group.start, group.end, timed)) {\n for (let k = 0; k < group.visuals.length; k++) {\n const groupVisual = group.visuals[k]\n const [groupStart, groupEnd] = timed ? getRange(groupVisual.event) : getDayRange(groupVisual.event)\n\n if (hasOverlap(start, end, groupStart, groupEnd, timed)) {\n intersected = true\n break\n }\n }\n }\n\n if (!intersected) {\n return i\n }\n }\n\n return -1\n}\n\nexport function getOverlapGroupHandler (firstWeekday: number) {\n const handler = {\n groups: [] as ColumnGroup[],\n min: -1,\n max: -1,\n reset: () => {\n handler.groups = []\n handler.min = handler.max = -1\n },\n getVisuals: (day: CalendarTimestamp, dayEvents: CalendarEventParsed[], timed: boolean, reset = false) => {\n if (day.weekday === firstWeekday || reset) {\n handler.reset()\n }\n\n const dayStart = getTimestampIdentifier(day)\n const visuals = getVisuals(dayEvents, dayStart)\n\n visuals.forEach(visual => {\n const [start, end] = timed ? getRange(visual.event) : getDayRange(visual.event)\n\n if (handler.groups.length > 0 && !hasOverlap(start, end, handler.min, handler.max, timed)) {\n setColumnCount(handler.groups)\n handler.reset()\n }\n\n let targetGroup = getOpenGroup(handler.groups, start, end, timed)\n\n if (targetGroup === -1) {\n targetGroup = handler.groups.length\n\n handler.groups.push({ start, end, visuals: [] })\n }\n\n const target = handler.groups[targetGroup]\n target.visuals.push(visual)\n target.start = Math.min(target.start, start)\n target.end = Math.max(target.end, end)\n\n visual.column = targetGroup\n\n if (handler.min === -1) {\n handler.min = start\n handler.max = end\n } else {\n handler.min = Math.min(handler.min, start)\n handler.max = Math.max(handler.max, end)\n }\n })\n\n setColumnCount(handler.groups)\n\n if (timed) {\n handler.reset()\n }\n\n return visuals\n },\n }\n\n return handler\n}\n","import { CalendarEventOverlapMode, CalendarEventVisual } from 'vuetify/types'\nimport { getOverlapGroupHandler, getVisuals, hasOverlap, getNormalizedRange } from './common'\nimport { getTimestampIdentifier } from '../util/timestamp'\n\ninterface Group {\n start: number\n end: number\n visuals: CalendarEventVisual[]\n}\n\ninterface Node {\n parent: Node | null\n sibling: boolean\n index: number\n visual: CalendarEventVisual\n start: number\n end: number\n children: Node[]\n}\n\nconst FULL_WIDTH = 100\n\nconst DEFAULT_OFFSET = 5\n\nconst WIDTH_MULTIPLIER = 1.7\n\n/**\n * Variation of column mode where events can be stacked. The priority of this\n * mode is to stack events together taking up the least amount of space while\n * trying to ensure the content of the event is always visible as well as its\n * start and end. A sibling column has intersecting event content and must be\n * placed beside each other. Non-sibling columns are offset by 5% from the\n * previous column. The width is scaled by 1.7 so the events overlap and\n * whitespace is reduced. If there is a hole in columns the event width is\n * scaled up so it intersects with the next column. The columns have equal\n * width in the space they are given. If the event doesn't have any to the\n * right of it that intersect with it's content it's right side is extended\n * to the right side.\n */\n\nexport const stack: CalendarEventOverlapMode = (events, firstWeekday, overlapThreshold) => {\n const handler = getOverlapGroupHandler(firstWeekday)\n\n // eslint-disable-next-line max-statements\n return (day, dayEvents, timed, reset) => {\n if (!timed) {\n return handler.getVisuals(day, dayEvents, timed, reset)\n }\n\n const dayStart = getTimestampIdentifier(day)\n const visuals = getVisuals(dayEvents, dayStart)\n const groups = getGroups(visuals, dayStart)\n\n for (const group of groups) {\n const nodes: Node[] = []\n\n for (const visual of group.visuals) {\n const child = getNode(visual, dayStart)\n const index = getNextIndex(child, nodes)\n\n if (index === false) {\n const parent = getParent(child, nodes)\n if (parent) {\n child.parent = parent\n child.sibling = hasOverlap(child.start, child.end, parent.start, addTime(parent.start, overlapThreshold))\n child.index = parent.index + 1\n parent.children.push(child)\n }\n } else {\n const [parent] = getOverlappingRange(child, nodes, index - 1, index - 1)\n const children = getOverlappingRange(child, nodes, index + 1, index + nodes.length, true)\n\n child.children = children\n child.index = index\n\n if (parent) {\n child.parent = parent\n child.sibling = hasOverlap(child.start, child.end, parent.start, addTime(parent.start, overlapThreshold))\n parent.children.push(child)\n }\n\n for (const grand of children) {\n if (grand.parent === parent) {\n grand.parent = child\n }\n\n const grandNext = grand.index - child.index <= 1\n if (grandNext && child.sibling &&\n hasOverlap(child.start, addTime(child.start, overlapThreshold), grand.start, grand.end)) {\n grand.sibling = true\n }\n }\n }\n\n nodes.push(child)\n }\n\n calculateBounds(nodes, overlapThreshold)\n }\n\n visuals.sort((a, b) => (a.left - b.left) || (a.event.startTimestampIdentifier - b.event.startTimestampIdentifier))\n\n return visuals\n }\n}\n\nfunction calculateBounds (nodes: Node[], overlapThreshold: number) {\n for (const node of nodes) {\n const { visual, parent } = node\n const columns = getMaxChildIndex(node) + 1\n const spaceLeft = parent ? parent.visual.left : 0\n const spaceWidth = FULL_WIDTH - spaceLeft\n const offset = Math.min(DEFAULT_OFFSET, FULL_WIDTH / columns)\n const columnWidthMultiplier = getColumnWidthMultiplier(node, nodes)\n const columnOffset = spaceWidth / (columns - node.index + 1)\n const columnWidth = spaceWidth / (columns - node.index + (node.sibling ? 1 : 0)) * columnWidthMultiplier\n\n if (parent) {\n visual.left = node.sibling\n ? spaceLeft + columnOffset\n : spaceLeft + offset\n }\n\n visual.width = hasFullWidth(node, nodes, overlapThreshold)\n ? FULL_WIDTH - visual.left\n : Math.min(FULL_WIDTH - visual.left, columnWidth * WIDTH_MULTIPLIER)\n }\n}\n\nfunction getColumnWidthMultiplier (node: Node, nodes: Node[]): number {\n if (!node.children.length) {\n return 1\n }\n\n const maxColumn = node.index + nodes.length\n const minColumn = node.children.reduce((min, c) => Math.min(min, c.index), maxColumn)\n\n return minColumn - node.index\n}\n\nfunction getOverlappingIndices (node: Node, nodes: Node[]): number[] {\n const indices: number[] = []\n for (const other of nodes) {\n if (hasOverlap(node.start, node.end, other.start, other.end)) {\n indices.push(other.index)\n }\n }\n return indices\n}\n\nfunction getNextIndex (node: Node, nodes: Node[]): number | false {\n const indices = getOverlappingIndices(node, nodes)\n indices.sort()\n\n for (let i = 0; i < indices.length; i++) {\n if (i < indices[i]) {\n return i\n }\n }\n return false\n}\n\nfunction getOverlappingRange (node: Node, nodes: Node[], indexMin: number, indexMax: number, returnFirstColumn = false): Node[] {\n const overlapping: Node[] = []\n for (const other of nodes) {\n if (other.index >= indexMin && other.index <= indexMax && hasOverlap(node.start, node.end, other.start, other.end)) {\n overlapping.push(other)\n }\n }\n if (returnFirstColumn && overlapping.length > 0) {\n const first = overlapping.reduce((min, n) => Math.min(min, n.index), overlapping[0].index)\n return overlapping.filter(n => n.index === first)\n }\n return overlapping\n}\n\nfunction getParent (node: Node, nodes: Node[]): Node | null {\n let parent: Node | null = null\n for (const other of nodes) {\n if (hasOverlap(node.start, node.end, other.start, other.end) && (parent === null || other.index > parent.index)) {\n parent = other\n }\n }\n return parent\n}\n\nfunction hasFullWidth (node: Node, nodes: Node[], overlapThreshold: number): boolean {\n for (const other of nodes) {\n if (other !== node &&\n other.index > node.index &&\n hasOverlap(node.start, addTime(node.start, overlapThreshold), other.start, other.end)) {\n return false\n }\n }\n\n return true\n}\n\nfunction getGroups (visuals: CalendarEventVisual[], dayStart: number): Group[] {\n const groups: Group[] = []\n\n for (const visual of visuals) {\n const [start, end] = getNormalizedRange(visual.event, dayStart)\n let added = false\n\n for (const group of groups) {\n if (hasOverlap(start, end, group.start, group.end)) {\n group.visuals.push(visual)\n group.end = Math.max(group.end, end)\n added = true\n break\n }\n }\n\n if (!added) {\n groups.push({ start, end, visuals: [visual] })\n }\n }\n\n return groups\n}\n\nfunction getNode (visual: CalendarEventVisual, dayStart: number): Node {\n const [start, end] = getNormalizedRange(visual.event, dayStart)\n\n return {\n parent: null,\n sibling: true,\n index: 0,\n visual,\n start,\n end,\n children: [],\n }\n}\n\nfunction getMaxChildIndex (node: Node): number {\n let max = node.index\n for (const child of node.children) {\n const childMax = getMaxChildIndex(child)\n if (childMax > max) {\n max = childMax\n }\n }\n return max\n}\n\nfunction addTime (identifier: number, minutes: number): number {\n const removeMinutes = identifier % 100\n const totalMinutes = removeMinutes + minutes\n const addHours = Math.floor(totalMinutes / 60)\n const addMinutes = totalMinutes % 60\n\n return identifier - removeMinutes + addHours * 100 + addMinutes\n}\n","import { CalendarEventOverlapMode } from 'vuetify/types'\nimport { getOverlapGroupHandler } from './common'\n\nconst FULL_WIDTH = 100\n\nexport const column: CalendarEventOverlapMode = (events, firstWeekday, overlapThreshold) => {\n const handler = getOverlapGroupHandler(firstWeekday)\n\n return (day, dayEvents, timed, reset) => {\n const visuals = handler.getVisuals(day, dayEvents, timed, reset)\n\n if (timed) {\n visuals.forEach(visual => {\n visual.left = visual.column * FULL_WIDTH / visual.columnCount\n visual.width = FULL_WIDTH / visual.columnCount\n })\n }\n\n return visuals\n }\n}\n","import { CalendarEventOverlapMode } from 'vuetify/types'\nimport { stack } from './stack'\nimport { column } from './column'\n\nexport const CalendarEventOverlapModes: Record = {\n stack,\n column,\n}\n","\nimport { validateTimestamp, parseDate, DAYS_IN_WEEK, validateTime } from './timestamp'\nimport { PropType } from 'vue'\nimport { CalendarEvent, CalendarFormatter, CalendarTimestamp, CalendarEventOverlapMode, CalendarEventNameFunction, CalendarEventColorFunction, CalendarEventCategoryFunction, CalendarEventTimedFunction } from 'vuetify/types'\nimport { CalendarEventOverlapModes } from '../modes'\nimport { PropValidator } from 'vue/types/options'\n\nexport default {\n base: {\n start: {\n type: [String, Number, Date],\n validate: validateTimestamp,\n default: () => parseDate(new Date()).date,\n },\n end: {\n type: [String, Number, Date],\n validate: validateTimestamp,\n },\n weekdays: {\n type: [Array, String] as PropType,\n default: () => [0, 1, 2, 3, 4, 5, 6],\n validate: validateWeekdays,\n },\n hideHeader: {\n type: Boolean,\n },\n shortWeekdays: {\n type: Boolean,\n default: true,\n },\n weekdayFormat: {\n type: Function as PropType,\n default: null,\n },\n dayFormat: {\n type: Function as PropType,\n default: null,\n },\n },\n intervals: {\n maxDays: {\n type: Number,\n default: 7,\n },\n shortIntervals: {\n type: Boolean,\n default: true,\n },\n intervalHeight: {\n type: [Number, String],\n default: 48,\n validate: validateNumber,\n },\n intervalWidth: {\n type: [Number, String],\n default: 60,\n validate: validateNumber,\n },\n intervalMinutes: {\n type: [Number, String],\n default: 60,\n validate: validateNumber,\n },\n firstInterval: {\n type: [Number, String],\n default: 0,\n validate: validateNumber,\n },\n firstTime: {\n type: [Number, String, Object],\n validate: validateTime,\n },\n intervalCount: {\n type: [Number, String],\n default: 24,\n validate: validateNumber,\n },\n intervalFormat: {\n type: Function as PropType,\n default: null,\n },\n intervalStyle: {\n type: Function as PropType<(interval: CalendarTimestamp) => object>,\n default: null,\n },\n showIntervalLabel: {\n type: Function as PropType<(interval: CalendarTimestamp) => boolean>,\n default: null,\n },\n },\n weeks: {\n localeFirstDayOfYear: {\n type: [String, Number],\n default: 0,\n },\n minWeeks: {\n validate: validateNumber,\n default: 1,\n },\n shortMonths: {\n type: Boolean,\n default: true,\n },\n showMonthOnFirst: {\n type: Boolean,\n default: true,\n },\n showWeek: Boolean,\n monthFormat: {\n type: Function as PropType,\n default: null,\n },\n },\n calendar: {\n type: {\n type: String,\n default: 'month',\n },\n value: {\n type: [String, Number, Date] as PropType,\n validate: validateTimestamp,\n },\n },\n category: {\n categories: {\n type: [Array, String],\n default: '',\n },\n categoryHideDynamic: {\n type: Boolean,\n },\n categoryShowAll: {\n type: Boolean,\n },\n categoryForInvalid: {\n type: String,\n default: '',\n },\n categoryDays: {\n type: [Number, String],\n default: 1,\n validate: (x: any) => isFinite(parseInt(x)) && parseInt(x) > 0,\n },\n },\n events: {\n events: {\n type: Array,\n default: () => [],\n } as PropValidator,\n eventStart: {\n type: String,\n default: 'start',\n },\n eventEnd: {\n type: String,\n default: 'end',\n },\n eventTimed: {\n type: [String, Function] as PropType,\n default: 'timed',\n },\n eventCategory: {\n type: [String, Function] as PropType,\n default: 'category',\n },\n eventHeight: {\n type: Number,\n default: 20,\n },\n eventColor: {\n type: [String, Function] as PropType,\n default: 'primary',\n },\n eventTextColor: {\n type: [String, Function] as PropType,\n default: 'white',\n },\n eventName: {\n type: [String, Function] as PropType,\n default: 'name',\n },\n eventOverlapThreshold: {\n type: [String, Number],\n default: 60,\n },\n eventOverlapMode: {\n type: [String, Function],\n default: 'stack',\n validate: (mode: any) => mode in CalendarEventOverlapModes || typeof mode === 'function',\n } as PropValidator<'stack' | 'column' | CalendarEventOverlapMode>,\n eventMore: {\n type: Boolean,\n default: true,\n },\n eventMoreText: {\n type: String,\n default: '$vuetify.calendar.moreEvents',\n },\n eventRipple: {\n type: [Boolean, Object],\n default: null,\n },\n eventMarginBottom: {\n type: Number,\n default: 1,\n },\n },\n}\n\nexport function validateNumber (input: any): boolean {\n return isFinite(parseInt(input))\n}\n\nexport function validateWeekdays (input: string | (number | string)[]): boolean {\n if (typeof input === 'string') {\n input = input.split(',')\n }\n\n if (Array.isArray(input)) {\n const ints = input.map(x => parseInt(x))\n\n if (ints.length > DAYS_IN_WEEK || ints.length === 0) {\n return false\n }\n\n const visited: Record = {}\n let wrapped = false\n\n for (let i = 0; i < ints.length; i++) {\n const x = ints[i]\n\n if (!isFinite(x) || x < 0 || x >= DAYS_IN_WEEK) {\n return false\n }\n\n if (i > 0) {\n const d = x - ints[i - 1]\n if (d < 0) {\n if (wrapped) {\n return false\n }\n wrapped = true\n } else if (d === 0) {\n return false\n }\n }\n\n if (visited[x]) {\n return false\n }\n visited[x] = true\n }\n\n return true\n }\n\n return false\n}\n","\n// Mixins\nimport mixins from '../../../util/mixins'\nimport Colorable from '../../../mixins/colorable'\nimport Localable from '../../../mixins/localable'\nimport Mouse from './mouse'\nimport Themeable from '../../../mixins/themeable'\nimport Times from './times'\n\n// Directives\nimport Resize from '../../../directives/resize'\n\n// Util\nimport props from '../util/props'\nimport {\n parseTimestamp,\n getWeekdaySkips,\n createDayList,\n createNativeLocaleFormatter,\n getStartOfWeek,\n getEndOfWeek,\n getTimestampIdentifier,\n} from '../util/timestamp'\nimport { CalendarTimestamp, CalendarFormatter } from 'vuetify/types'\n\nexport default mixins(\n Colorable,\n Localable,\n Mouse,\n Themeable,\n Times\n/* @vue/component */\n).extend({\n name: 'calendar-base',\n\n directives: {\n Resize,\n },\n\n props: props.base,\n\n computed: {\n parsedWeekdays (): number[] {\n return Array.isArray(this.weekdays)\n ? this.weekdays\n : (this.weekdays || '').split(',').map(x => parseInt(x, 10))\n },\n weekdaySkips (): number[] {\n return getWeekdaySkips(this.parsedWeekdays)\n },\n weekdaySkipsReverse (): number [] {\n const reversed = this.weekdaySkips.slice()\n reversed.reverse()\n return reversed\n },\n parsedStart (): CalendarTimestamp {\n return parseTimestamp(this.start, true)\n },\n parsedEnd (): CalendarTimestamp {\n const start = this.parsedStart\n const end: CalendarTimestamp = this.end ? parseTimestamp(this.end) || start : start\n\n return getTimestampIdentifier(end) < getTimestampIdentifier(start) ? start : end\n },\n days (): CalendarTimestamp[] {\n return createDayList(\n this.parsedStart,\n this.parsedEnd,\n this.times.today,\n this.weekdaySkips\n )\n },\n dayFormatter (): CalendarFormatter {\n if (this.dayFormat) {\n return this.dayFormat as CalendarFormatter\n }\n\n const options = { timeZone: 'UTC', day: 'numeric' }\n\n return createNativeLocaleFormatter(\n this.currentLocale,\n (_tms, _short) => options\n )\n },\n weekdayFormatter (): CalendarFormatter {\n if (this.weekdayFormat) {\n return this.weekdayFormat as CalendarFormatter\n }\n\n const longOptions = { timeZone: 'UTC', weekday: 'long' }\n const shortOptions = { timeZone: 'UTC', weekday: 'short' }\n\n return createNativeLocaleFormatter(\n this.currentLocale,\n (_tms, short) => short ? shortOptions : longOptions\n )\n },\n },\n\n methods: {\n getRelativeClasses (timestamp: CalendarTimestamp, outside = false): object {\n return {\n 'v-present': timestamp.present,\n 'v-past': timestamp.past,\n 'v-future': timestamp.future,\n 'v-outside': outside,\n }\n },\n getStartOfWeek (timestamp: CalendarTimestamp): CalendarTimestamp {\n return getStartOfWeek(timestamp, this.parsedWeekdays, this.times.today)\n },\n getEndOfWeek (timestamp: CalendarTimestamp): CalendarTimestamp {\n return getEndOfWeek(timestamp, this.parsedWeekdays, this.times.today)\n },\n getFormatter (options: object): CalendarFormatter {\n return createNativeLocaleFormatter(\n this.locale,\n (_tms, _short) => options\n )\n },\n },\n})\n","import {\n parseTimestamp,\n getDayIdentifier,\n getTimestampIdentifier,\n OFFSET_TIME,\n isTimedless,\n updateHasTime,\n} from './timestamp'\nimport { CalendarTimestamp, CalendarEvent, CalendarEventParsed } from 'vuetify/types'\n\nexport function parseEvent (\n input: CalendarEvent,\n index: number,\n startProperty: string,\n endProperty: string,\n timed = false,\n category: string | false = false,\n): CalendarEventParsed {\n const startInput = input[startProperty]\n const endInput = input[endProperty]\n const startParsed: CalendarTimestamp = parseTimestamp(startInput, true)\n const endParsed: CalendarTimestamp = (endInput ? parseTimestamp(endInput, true) : startParsed)\n const start: CalendarTimestamp = isTimedless(startInput)\n ? updateHasTime(startParsed, timed)\n : startParsed\n const end: CalendarTimestamp = isTimedless(endInput)\n ? updateHasTime(endParsed, timed)\n : endParsed\n const startIdentifier: number = getDayIdentifier(start)\n const startTimestampIdentifier: number = getTimestampIdentifier(start)\n const endIdentifier: number = getDayIdentifier(end)\n const endOffset: number = start.hasTime ? 0 : 2359\n const endTimestampIdentifier: number = getTimestampIdentifier(end) + endOffset\n const allDay: boolean = !start.hasTime\n\n return { input, start, startIdentifier, startTimestampIdentifier, end, endIdentifier, endTimestampIdentifier, allDay, index, category }\n}\n\nexport function isEventOn (event: CalendarEventParsed, dayIdentifier: number): boolean {\n return dayIdentifier >= event.startIdentifier &&\n dayIdentifier <= event.endIdentifier &&\n dayIdentifier * OFFSET_TIME !== event.endTimestampIdentifier\n}\n\nexport function isEventStart (event: CalendarEventParsed, day: CalendarTimestamp, dayIdentifier: number, firstWeekday: number): boolean {\n return dayIdentifier === event.startIdentifier || (firstWeekday === day.weekday && isEventOn(event, dayIdentifier))\n}\n\nexport function isEventOverlapping (event: CalendarEventParsed, startIdentifier: number, endIdentifier: number): boolean {\n return startIdentifier <= event.endIdentifier && endIdentifier >= event.startIdentifier\n}\n","// Styles\nimport './calendar-with-events.sass'\n\n// Types\nimport { VNode, VNodeData } from 'vue'\n\n// Directives\nimport ripple from '../../../directives/ripple'\n\n// Mixins\nimport CalendarBase from './calendar-base'\n\n// Helpers\nimport { escapeHTML } from '../../../util/helpers'\n\n// Util\nimport props from '../util/props'\nimport {\n CalendarEventOverlapModes,\n} from '../modes'\nimport {\n getDayIdentifier, diffMinutes,\n} from '../util/timestamp'\nimport {\n parseEvent,\n isEventStart,\n isEventOn,\n isEventOverlapping,\n} from '../util/events'\nimport {\n CalendarTimestamp,\n CalendarEventParsed,\n CalendarEventVisual,\n CalendarEventColorFunction,\n CalendarEventNameFunction,\n CalendarEventTimedFunction,\n CalendarDaySlotScope,\n CalendarDayBodySlotScope,\n CalendarEventOverlapMode,\n CalendarEvent,\n CalendarEventCategoryFunction,\n} from 'vuetify/types'\n\n// Types\ntype VEventGetter = (day: D) => CalendarEventParsed[]\n\ntype VEventVisualToNode = (visual: CalendarEventVisual, day: D) => VNode | false\n\ntype VEventsToNodes = (\n day: D,\n getter: VEventGetter,\n mapper: VEventVisualToNode,\n timed: boolean) => VNode[] | undefined\n\ntype VDailyEventsMap = {\n [date: string]: {\n parent: HTMLElement\n more: HTMLElement | null\n events: HTMLElement[]\n }\n}\n\ninterface VEventScopeInput {\n eventParsed: CalendarEventParsed\n day: CalendarDaySlotScope\n start: boolean\n end: boolean\n timed: boolean\n}\n\nconst WIDTH_FULL = 100\nconst WIDTH_START = 95\nconst MINUTES_IN_DAY = 1440\n\n/* @vue/component */\nexport default CalendarBase.extend({\n name: 'calendar-with-events',\n\n directives: {\n ripple,\n },\n\n props: props.events,\n\n computed: {\n noEvents (): boolean {\n return this.events.length === 0\n },\n parsedEvents (): CalendarEventParsed[] {\n return this.events.map(this.parseEvent)\n },\n parsedEventOverlapThreshold (): number {\n return parseInt(this.eventOverlapThreshold)\n },\n eventColorFunction (): CalendarEventColorFunction {\n return typeof this.eventColor === 'function'\n ? this.eventColor\n : () => (this.eventColor as string)\n },\n eventTimedFunction (): CalendarEventTimedFunction {\n return typeof this.eventTimed === 'function'\n ? this.eventTimed\n : event => !!event[this.eventTimed as string]\n },\n eventCategoryFunction (): CalendarEventCategoryFunction {\n return typeof this.eventCategory === 'function'\n ? this.eventCategory\n : event => event[this.eventCategory as string]\n },\n eventTextColorFunction (): CalendarEventColorFunction {\n return typeof this.eventTextColor === 'function'\n ? this.eventTextColor\n : () => this.eventTextColor as string\n },\n eventNameFunction (): CalendarEventNameFunction {\n return typeof this.eventName === 'function'\n ? this.eventName\n : (event, timedEvent) => escapeHTML(event.input[this.eventName as string] as string)\n },\n eventModeFunction (): CalendarEventOverlapMode {\n return typeof this.eventOverlapMode === 'function'\n ? this.eventOverlapMode\n : CalendarEventOverlapModes[this.eventOverlapMode]\n },\n eventWeekdays (): number[] {\n return this.parsedWeekdays\n },\n categoryMode (): boolean {\n return false\n },\n },\n\n methods: {\n parseEvent (input: CalendarEvent, index = 0): CalendarEventParsed {\n return parseEvent(\n input,\n index,\n this.eventStart,\n this.eventEnd,\n this.eventTimedFunction(input),\n this.categoryMode ? this.eventCategoryFunction(input) : false,\n )\n },\n formatTime (withTime: CalendarTimestamp, ampm: boolean): string {\n const formatter = this.getFormatter({\n timeZone: 'UTC',\n hour: 'numeric',\n minute: withTime.minute > 0 ? 'numeric' : undefined,\n })\n\n return formatter(withTime, true)\n },\n updateEventVisibility () {\n if (this.noEvents || !this.eventMore) {\n return\n }\n\n const eventHeight = this.eventHeight\n const eventsMap = this.getEventsMap()\n\n for (const date in eventsMap) {\n const { parent, events, more } = eventsMap[date]\n if (!more) {\n break\n }\n\n const parentBounds = parent.getBoundingClientRect()\n const last = events.length - 1\n let hide = false\n let hidden = 0\n\n for (let i = 0; i <= last; i++) {\n if (!hide) {\n const eventBounds = events[i].getBoundingClientRect()\n hide = i === last\n ? (eventBounds.bottom > parentBounds.bottom)\n : (eventBounds.bottom + eventHeight > parentBounds.bottom)\n }\n if (hide) {\n events[i].style.display = 'none'\n hidden++\n }\n }\n\n if (hide) {\n more.style.display = ''\n more.innerHTML = this.$vuetify.lang.t(this.eventMoreText, hidden)\n } else {\n more.style.display = 'none'\n }\n }\n },\n getEventsMap (): VDailyEventsMap {\n const eventsMap: VDailyEventsMap = {}\n const elements = this.$refs.events as HTMLElement[]\n\n if (!elements || !elements.forEach) {\n return eventsMap\n }\n\n elements.forEach(el => {\n const date = el.getAttribute('data-date')\n if (el.parentElement && date) {\n if (!(date in eventsMap)) {\n eventsMap[date] = {\n parent: el.parentElement,\n more: null,\n events: [],\n }\n }\n if (el.getAttribute('data-more')) {\n eventsMap[date].more = el\n } else {\n eventsMap[date].events.push(el)\n el.style.display = ''\n }\n }\n })\n\n return eventsMap\n },\n genDayEvent ({ event }: CalendarEventVisual, day: CalendarDaySlotScope): VNode {\n const eventHeight = this.eventHeight\n const eventMarginBottom = this.eventMarginBottom\n const dayIdentifier = getDayIdentifier(day)\n const week = day.week\n const start = dayIdentifier === event.startIdentifier\n let end = dayIdentifier === event.endIdentifier\n let width = WIDTH_START\n\n if (!this.categoryMode) {\n for (let i = day.index + 1; i < week.length; i++) {\n const weekdayIdentifier = getDayIdentifier(week[i])\n if (event.endIdentifier >= weekdayIdentifier) {\n width += WIDTH_FULL\n end = end || weekdayIdentifier === event.endIdentifier\n } else {\n end = true\n break\n }\n }\n }\n const scope = { eventParsed: event, day, start, end, timed: false }\n\n return this.genEvent(event, scope, false, {\n staticClass: 'v-event',\n class: {\n 'v-event-start': start,\n 'v-event-end': end,\n },\n style: {\n height: `${eventHeight}px`,\n width: `${width}%`,\n 'margin-bottom': `${eventMarginBottom}px`,\n },\n attrs: {\n 'data-date': day.date,\n },\n key: event.index,\n ref: 'events',\n refInFor: true,\n })\n },\n genTimedEvent ({ event, left, width }: CalendarEventVisual, day: CalendarDayBodySlotScope): VNode | false {\n if (day.timeDelta(event.end) <= 0 || day.timeDelta(event.start) >= 1) {\n return false\n }\n\n const dayIdentifier = getDayIdentifier(day)\n const start = event.startIdentifier >= dayIdentifier\n const end = event.endIdentifier > dayIdentifier\n const top = start ? day.timeToY(event.start) : 0\n const bottom = end ? day.timeToY(MINUTES_IN_DAY) : day.timeToY(event.end)\n const height = Math.max(this.eventHeight, bottom - top)\n const scope = { eventParsed: event, day, start, end, timed: true }\n\n return this.genEvent(event, scope, true, {\n staticClass: 'v-event-timed',\n style: {\n top: `${top}px`,\n height: `${height}px`,\n left: `${left}%`,\n width: `${width}%`,\n },\n })\n },\n genEvent (event: CalendarEventParsed, scopeInput: VEventScopeInput, timedEvent: boolean, data: VNodeData): VNode {\n const slot = this.$scopedSlots.event\n const text = this.eventTextColorFunction(event.input)\n const background = this.eventColorFunction(event.input)\n const overlapsNoon = event.start.hour < 12 && event.end.hour >= 12\n const singline = diffMinutes(event.start, event.end) <= this.parsedEventOverlapThreshold\n const formatTime = this.formatTime\n const timeSummary = () => formatTime(event.start, overlapsNoon) + ' - ' + formatTime(event.end, true)\n const eventSummary = () => {\n const name = this.eventNameFunction(event, timedEvent)\n\n if (event.start.hasTime) {\n if (timedEvent) {\n const time = timeSummary()\n const delimiter = singline ? ', ' : '
'\n\n return `${name}${delimiter}${time}`\n } else {\n const time = formatTime(event.start, true)\n\n return `${time} ${name}`\n }\n }\n\n return name\n }\n\n const scope = {\n ...scopeInput,\n event: event.input,\n outside: scopeInput.day.outside,\n singline,\n overlapsNoon,\n formatTime,\n timeSummary,\n eventSummary,\n }\n\n return this.$createElement('div',\n this.setTextColor(text,\n this.setBackgroundColor(background, {\n on: this.getDefaultMouseEventHandlers(':event', nativeEvent => ({ ...scope, nativeEvent })),\n directives: [{\n name: 'ripple',\n value: this.eventRipple ?? true,\n }],\n ...data,\n })\n ), slot\n ? slot(scope)\n : [this.genName(eventSummary)]\n )\n },\n genName (eventSummary: () => string): VNode {\n return this.$createElement('div', {\n staticClass: 'pl-1',\n domProps: {\n innerHTML: eventSummary(),\n },\n })\n },\n genPlaceholder (day: CalendarTimestamp): VNode {\n const height = this.eventHeight + this.eventMarginBottom\n\n return this.$createElement('div', {\n style: {\n height: `${height}px`,\n },\n attrs: {\n 'data-date': day.date,\n },\n ref: 'events',\n refInFor: true,\n })\n },\n genMore (day: CalendarDaySlotScope): VNode {\n const eventHeight = this.eventHeight\n const eventMarginBottom = this.eventMarginBottom\n\n return this.$createElement('div', {\n staticClass: 'v-event-more pl-1',\n class: {\n 'v-outside': day.outside,\n },\n attrs: {\n 'data-date': day.date,\n 'data-more': 1,\n },\n directives: [{\n name: 'ripple',\n value: this.eventRipple ?? true,\n }],\n on: {\n click: () => this.$emit('click:more', day),\n },\n style: {\n display: 'none',\n height: `${eventHeight}px`,\n 'margin-bottom': `${eventMarginBottom}px`,\n },\n ref: 'events',\n refInFor: true,\n })\n },\n getVisibleEvents (): CalendarEventParsed[] {\n const start = getDayIdentifier(this.days[0])\n const end = getDayIdentifier(this.days[this.days.length - 1])\n\n return this.parsedEvents.filter(\n event => isEventOverlapping(event, start, end)\n )\n },\n isEventForCategory (event: CalendarEventParsed, category: string | undefined | null): boolean {\n return !this.categoryMode ||\n category === event.category ||\n (typeof event.category !== 'string' && category === null)\n },\n getEventsForDay (day: CalendarDaySlotScope): CalendarEventParsed[] {\n const identifier = getDayIdentifier(day)\n const firstWeekday = this.eventWeekdays[0]\n\n return this.parsedEvents.filter(\n event => isEventStart(event, day, identifier, firstWeekday)\n )\n },\n getEventsForDayAll (day: CalendarDaySlotScope): CalendarEventParsed[] {\n const identifier = getDayIdentifier(day)\n const firstWeekday = this.eventWeekdays[0]\n\n return this.parsedEvents.filter(\n event => event.allDay &&\n (this.categoryMode ? isEventOn(event, identifier) : isEventStart(event, day, identifier, firstWeekday)) &&\n this.isEventForCategory(event, day.category)\n )\n },\n getEventsForDayTimed (day: CalendarDaySlotScope): CalendarEventParsed[] {\n const identifier = getDayIdentifier(day)\n\n return this.parsedEvents.filter(\n event => !event.allDay &&\n isEventOn(event, identifier) &&\n this.isEventForCategory(event, day.category)\n )\n },\n getScopedSlots () {\n if (this.noEvents) {\n return { ...this.$scopedSlots }\n }\n\n const mode = this.eventModeFunction(\n this.parsedEvents,\n this.eventWeekdays[0],\n this.parsedEventOverlapThreshold\n )\n\n const isNode = (input: VNode | false): input is VNode => !!input\n const getSlotChildren: VEventsToNodes = (day, getter, mapper, timed) => {\n const events = getter(day)\n const visuals = mode(day, events, timed, this.categoryMode)\n\n if (timed) {\n return visuals.map(visual => mapper(visual, day)).filter(isNode)\n }\n\n const children: VNode[] = []\n\n visuals.forEach((visual, index) => {\n while (children.length < visual.column) {\n children.push(this.genPlaceholder(day))\n }\n\n const mapped = mapper(visual, day)\n if (mapped) {\n children.push(mapped)\n }\n })\n\n return children\n }\n\n const slots = this.$scopedSlots\n const slotDay = slots.day\n const slotDayHeader = slots['day-header']\n const slotDayBody = slots['day-body']\n\n return {\n ...slots,\n day: (day: CalendarDaySlotScope) => {\n let children = getSlotChildren(day, this.getEventsForDay, this.genDayEvent, false)\n if (children && children.length > 0 && this.eventMore) {\n children.push(this.genMore(day))\n }\n if (slotDay) {\n const slot = slotDay(day)\n if (slot) {\n children = children ? children.concat(slot) : slot\n }\n }\n return children\n },\n 'day-header': (day: CalendarDaySlotScope) => {\n let children = getSlotChildren(day, this.getEventsForDayAll, this.genDayEvent, false)\n\n if (slotDayHeader) {\n const slot = slotDayHeader(day)\n if (slot) {\n children = children ? children.concat(slot) : slot\n }\n }\n return children\n },\n 'day-body': (day: CalendarDayBodySlotScope) => {\n const events = getSlotChildren(day, this.getEventsForDayTimed, this.genTimedEvent, true)\n let children: VNode[] = [\n this.$createElement('div', {\n staticClass: 'v-event-timed-container',\n }, events),\n ]\n\n if (slotDayBody) {\n const slot = slotDayBody(day)\n if (slot) {\n children = children.concat(slot)\n }\n }\n return children\n },\n }\n },\n },\n})\n","// Styles\nimport './VCalendarWeekly.sass'\n\n// Types\nimport { VNode } from 'vue'\n\n// Components\nimport VBtn from '../VBtn'\n\n// Mixins\nimport CalendarBase from './mixins/calendar-base'\n\n// Util\nimport { getSlot } from '../../util/helpers'\nimport { weekNumber } from '../../util/dateTimeUtils'\nimport props from './util/props'\nimport {\n createDayList,\n getDayIdentifier,\n createNativeLocaleFormatter,\n} from './util/timestamp'\nimport { CalendarTimestamp, CalendarFormatter } from 'vuetify/types'\n\n/* @vue/component */\nexport default CalendarBase.extend({\n name: 'v-calendar-weekly',\n\n props: props.weeks,\n\n computed: {\n staticClass (): string {\n return 'v-calendar-weekly'\n },\n classes (): object {\n return this.themeClasses\n },\n parsedMinWeeks (): number {\n return parseInt(this.minWeeks)\n },\n days (): CalendarTimestamp[] {\n const minDays = this.parsedMinWeeks * this.parsedWeekdays.length\n const start = this.getStartOfWeek(this.parsedStart)\n const end = this.getEndOfWeek(this.parsedEnd)\n\n return createDayList(\n start,\n end,\n this.times.today,\n this.weekdaySkips,\n Number.MAX_SAFE_INTEGER,\n minDays\n )\n },\n todayWeek (): CalendarTimestamp[] {\n const today = this.times.today\n const start = this.getStartOfWeek(today)\n const end = this.getEndOfWeek(today)\n\n return createDayList(\n start,\n end,\n today,\n this.weekdaySkips,\n this.parsedWeekdays.length,\n this.parsedWeekdays.length\n )\n },\n monthFormatter (): CalendarFormatter {\n if (this.monthFormat) {\n return this.monthFormat as CalendarFormatter\n }\n\n const longOptions = { timeZone: 'UTC', month: 'long' }\n const shortOptions = { timeZone: 'UTC', month: 'short' }\n\n return createNativeLocaleFormatter(\n this.currentLocale,\n (_tms, short) => short ? shortOptions : longOptions\n )\n },\n },\n\n methods: {\n isOutside (day: CalendarTimestamp): boolean {\n const dayIdentifier = getDayIdentifier(day)\n\n return dayIdentifier < getDayIdentifier(this.parsedStart) ||\n dayIdentifier > getDayIdentifier(this.parsedEnd)\n },\n genHead (): VNode {\n return this.$createElement('div', {\n staticClass: 'v-calendar-weekly__head',\n }, this.genHeadDays())\n },\n genHeadDays (): VNode[] {\n const header = this.todayWeek.map(this.genHeadDay)\n\n if (this.showWeek) {\n header.unshift(this.$createElement('div', {\n staticClass: 'v-calendar-weekly__head-weeknumber',\n }))\n }\n\n return header\n },\n genHeadDay (day: CalendarTimestamp, index: number): VNode {\n const outside = this.isOutside(this.days[index])\n const color = day.present ? this.color : undefined\n\n return this.$createElement('div', this.setTextColor(color, {\n key: day.date,\n staticClass: 'v-calendar-weekly__head-weekday',\n class: this.getRelativeClasses(day, outside),\n }), this.weekdayFormatter(day, this.shortWeekdays))\n },\n genWeeks (): VNode[] {\n const days = this.days\n const weekDays = this.parsedWeekdays.length\n const weeks: VNode[] = []\n\n for (let i = 0; i < days.length; i += weekDays) {\n weeks.push(this.genWeek(days.slice(i, i + weekDays), this.getWeekNumber(days[i])))\n }\n\n return weeks\n },\n genWeek (week: CalendarTimestamp[], weekNumber: number): VNode {\n const weekNodes = week.map((day, index) => this.genDay(day, index, week))\n\n if (this.showWeek) {\n weekNodes.unshift(this.genWeekNumber(weekNumber))\n }\n\n return this.$createElement('div', {\n key: week[0].date,\n staticClass: 'v-calendar-weekly__week',\n }, weekNodes)\n },\n getWeekNumber (determineDay: CalendarTimestamp) {\n return weekNumber(\n determineDay.year,\n determineDay.month - 1,\n determineDay.day,\n this.parsedWeekdays[0],\n parseInt(this.localeFirstDayOfYear)\n )\n },\n genWeekNumber (weekNumber: number) {\n return this.$createElement('div', {\n staticClass: 'v-calendar-weekly__weeknumber',\n }, [\n this.$createElement('small', String(weekNumber)),\n ])\n },\n genDay (day: CalendarTimestamp, index: number, week: CalendarTimestamp[]): VNode {\n const outside = this.isOutside(day)\n\n return this.$createElement('div', {\n key: day.date,\n staticClass: 'v-calendar-weekly__day',\n class: this.getRelativeClasses(day, outside),\n on: this.getDefaultMouseEventHandlers(':day', _e => day),\n }, [\n this.genDayLabel(day),\n ...(getSlot(this, 'day', () => ({ outside, index, week, ...day })) || []),\n ])\n },\n genDayLabel (day: CalendarTimestamp): VNode {\n return this.$createElement('div', {\n staticClass: 'v-calendar-weekly__day-label',\n }, getSlot(this, 'day-label', day) || [this.genDayLabelButton(day)])\n },\n genDayLabelButton (day: CalendarTimestamp): VNode {\n const color = day.present ? this.color : 'transparent'\n const hasMonth = day.day === 1 && this.showMonthOnFirst\n\n return this.$createElement(VBtn, {\n props: {\n color,\n fab: true,\n depressed: true,\n small: true,\n },\n on: this.getMouseEventHandlers({\n 'click:date': { event: 'click', stop: true },\n 'contextmenu:date': { event: 'contextmenu', stop: true, prevent: true, result: false },\n }, _e => day),\n }, hasMonth\n ? this.monthFormatter(day, this.shortMonths) + ' ' + this.dayFormatter(day, false)\n : this.dayFormatter(day, false)\n )\n },\n genDayMonth (day: CalendarTimestamp): VNode | string {\n const color = day.present ? this.color : undefined\n\n return this.$createElement('div', this.setTextColor(color, {\n staticClass: 'v-calendar-weekly__day-month',\n }), getSlot(this, 'day-month', day) || this.monthFormatter(day, this.shortMonths))\n },\n },\n\n render (h): VNode {\n return h('div', {\n staticClass: this.staticClass,\n class: this.classes,\n on: {\n dragstart: (e: MouseEvent) => {\n e.preventDefault()\n },\n },\n }, [\n !this.hideHeader ? this.genHead() : '',\n ...this.genWeeks(),\n ])\n },\n})\n","// Styles\nimport './VCalendarWeekly.sass'\n\n// Mixins\nimport VCalendarWeekly from './VCalendarWeekly'\n\n// Util\nimport { parseTimestamp, getStartOfMonth, getEndOfMonth } from './util/timestamp'\nimport { CalendarTimestamp } from 'vuetify/types'\n\n/* @vue/component */\nexport default VCalendarWeekly.extend({\n name: 'v-calendar-monthly',\n\n computed: {\n staticClass (): string {\n return 'v-calendar-monthly v-calendar-weekly'\n },\n parsedStart (): CalendarTimestamp {\n return getStartOfMonth(parseTimestamp(this.start, true))\n },\n parsedEnd (): CalendarTimestamp {\n return getEndOfMonth(parseTimestamp(this.end, true))\n },\n },\n\n})\n","\n// Mixins\nimport CalendarBase from './calendar-base'\n\n// Util\nimport props from '../util/props'\nimport {\n parseTime,\n copyTimestamp,\n updateMinutes,\n createDayList,\n createIntervalList,\n createNativeLocaleFormatter,\n VTime,\n MINUTES_IN_DAY,\n} from '../util/timestamp'\nimport { CalendarTimestamp, CalendarFormatter, CalendarDayBodySlotScope } from 'vuetify/types'\n\n/* @vue/component */\nexport default CalendarBase.extend({\n name: 'calendar-with-intervals',\n\n props: props.intervals,\n\n computed: {\n parsedFirstInterval (): number {\n return parseInt(this.firstInterval)\n },\n parsedIntervalMinutes (): number {\n return parseInt(this.intervalMinutes)\n },\n parsedIntervalCount (): number {\n return parseInt(this.intervalCount)\n },\n parsedIntervalHeight (): number {\n return parseFloat(this.intervalHeight)\n },\n parsedFirstTime (): number | false {\n return parseTime(this.firstTime)\n },\n firstMinute (): number {\n const time = this.parsedFirstTime\n\n return time !== false && time >= 0 && time <= MINUTES_IN_DAY\n ? time\n : this.parsedFirstInterval * this.parsedIntervalMinutes\n },\n bodyHeight (): number {\n return this.parsedIntervalCount * this.parsedIntervalHeight\n },\n days (): CalendarTimestamp[] {\n return createDayList(\n this.parsedStart,\n this.parsedEnd,\n this.times.today,\n this.weekdaySkips,\n this.maxDays\n )\n },\n intervals (): CalendarTimestamp[][] {\n const days: CalendarTimestamp[] = this.days\n const first: number = this.firstMinute\n const minutes: number = this.parsedIntervalMinutes\n const count: number = this.parsedIntervalCount\n const now: CalendarTimestamp = this.times.now\n\n return days.map(d => createIntervalList(d, first, minutes, count, now))\n },\n intervalFormatter (): CalendarFormatter {\n if (this.intervalFormat) {\n return this.intervalFormat as CalendarFormatter\n }\n\n const longOptions = { timeZone: 'UTC', hour: '2-digit', minute: '2-digit' }\n const shortOptions = { timeZone: 'UTC', hour: 'numeric', minute: '2-digit' }\n const shortHourOptions = { timeZone: 'UTC', hour: 'numeric' }\n\n return createNativeLocaleFormatter(\n this.currentLocale,\n (tms, short) => short ? (tms.minute === 0 ? shortHourOptions : shortOptions) : longOptions\n )\n },\n },\n\n methods: {\n showIntervalLabelDefault (interval: CalendarTimestamp): boolean {\n const first: CalendarTimestamp = this.intervals[0][0]\n const isFirst: boolean = first.hour === interval.hour && first.minute === interval.minute\n return !isFirst\n },\n intervalStyleDefault (_interval: CalendarTimestamp): object | undefined {\n return undefined\n },\n getTimestampAtEvent (e: MouseEvent | TouchEvent, day: CalendarTimestamp): CalendarTimestamp {\n const timestamp: CalendarTimestamp = copyTimestamp(day)\n const bounds = (e.currentTarget as HTMLElement).getBoundingClientRect()\n const baseMinutes: number = this.firstMinute\n const touchEvent: TouchEvent = e as TouchEvent\n const mouseEvent: MouseEvent = e as MouseEvent\n const touches: TouchList = touchEvent.changedTouches || touchEvent.touches\n const clientY: number = touches && touches[0] ? touches[0].clientY : mouseEvent.clientY\n const addIntervals: number = (clientY - bounds.top) / this.parsedIntervalHeight\n const addMinutes: number = Math.floor(addIntervals * this.parsedIntervalMinutes)\n const minutes: number = baseMinutes + addMinutes\n\n return updateMinutes(timestamp, minutes, this.times.now)\n },\n getSlotScope (timestamp: CalendarTimestamp): CalendarDayBodySlotScope {\n const scope = copyTimestamp(timestamp) as any\n scope.timeToY = this.timeToY\n scope.timeDelta = this.timeDelta\n scope.minutesToPixels = this.minutesToPixels\n scope.week = this.days\n return scope\n },\n scrollToTime (time: VTime): boolean {\n const y = this.timeToY(time)\n const pane = this.$refs.scrollArea as HTMLElement\n\n if (y === false || !pane) {\n return false\n }\n\n pane.scrollTop = y\n\n return true\n },\n minutesToPixels (minutes: number): number {\n return minutes / this.parsedIntervalMinutes * this.parsedIntervalHeight\n },\n timeToY (time: VTime, clamp = true): number | false {\n let y = this.timeDelta(time)\n\n if (y !== false) {\n y *= this.bodyHeight\n\n if (clamp) {\n if (y < 0) {\n y = 0\n }\n if (y > this.bodyHeight) {\n y = this.bodyHeight\n }\n }\n }\n\n return y\n },\n timeDelta (time: VTime): number | false {\n const minutes = parseTime(time)\n\n if (minutes === false) {\n return false\n }\n\n const min: number = this.firstMinute\n const gap: number = this.parsedIntervalCount * this.parsedIntervalMinutes\n\n return (minutes - min) / gap\n },\n },\n})\n","// Styles\nimport './VCalendarDaily.sass'\n\n// Types\nimport { VNode } from 'vue'\n\n// Directives\nimport Resize from '../../directives/resize'\n\n// Components\nimport VBtn from '../VBtn'\n\n// Mixins\nimport CalendarWithIntervals from './mixins/calendar-with-intervals'\n\n// Util\nimport { convertToUnit, getSlot } from '../../util/helpers'\nimport { CalendarTimestamp } from 'vuetify/types'\n\n/* @vue/component */\nexport default CalendarWithIntervals.extend({\n name: 'v-calendar-daily',\n\n directives: { Resize },\n\n data: () => ({\n scrollPush: 0,\n }),\n\n computed: {\n classes (): object {\n return {\n 'v-calendar-daily': true,\n ...this.themeClasses,\n }\n },\n },\n\n mounted () {\n this.init()\n },\n\n methods: {\n init () {\n this.$nextTick(this.onResize)\n },\n onResize () {\n this.scrollPush = this.getScrollPush()\n },\n getScrollPush (): number {\n const area = this.$refs.scrollArea as HTMLElement\n const pane = this.$refs.pane as HTMLElement\n\n return area && pane ? (area.offsetWidth - pane.offsetWidth) : 0\n },\n genHead (): VNode {\n return this.$createElement('div', {\n staticClass: 'v-calendar-daily__head',\n style: {\n marginRight: this.scrollPush + 'px',\n },\n }, [\n this.genHeadIntervals(),\n ...this.genHeadDays(),\n ])\n },\n genHeadIntervals (): VNode {\n const width: string | undefined = convertToUnit(this.intervalWidth)\n\n return this.$createElement('div', {\n staticClass: 'v-calendar-daily__intervals-head',\n style: {\n width,\n },\n }, getSlot(this, 'interval-header'))\n },\n genHeadDays (): VNode[] {\n return this.days.map(this.genHeadDay)\n },\n genHeadDay (day: CalendarTimestamp, index: number): VNode {\n return this.$createElement('div', {\n key: day.date,\n staticClass: 'v-calendar-daily_head-day',\n class: this.getRelativeClasses(day),\n on: this.getDefaultMouseEventHandlers(':day', _e => {\n return this.getSlotScope(day)\n }),\n }, [\n this.genHeadWeekday(day),\n this.genHeadDayLabel(day),\n ...this.genDayHeader(day, index),\n ])\n },\n genDayHeader (day: CalendarTimestamp, index: number): VNode[] {\n return getSlot(this, 'day-header', () => ({\n week: this.days, ...day, index,\n })) || []\n },\n genHeadWeekday (day: CalendarTimestamp): VNode {\n const color = day.present ? this.color : undefined\n\n return this.$createElement('div', this.setTextColor(color, {\n staticClass: 'v-calendar-daily_head-weekday',\n }), this.weekdayFormatter(day, this.shortWeekdays))\n },\n genHeadDayLabel (day: CalendarTimestamp): VNode {\n return this.$createElement('div', {\n staticClass: 'v-calendar-daily_head-day-label',\n }, getSlot(this, 'day-label-header', day) || [this.genHeadDayButton(day)])\n },\n genHeadDayButton (day: CalendarTimestamp): VNode {\n const color = day.present ? this.color : 'transparent'\n\n return this.$createElement(VBtn, {\n props: {\n color,\n fab: true,\n depressed: true,\n },\n on: this.getMouseEventHandlers({\n 'click:date': { event: 'click', stop: true },\n 'contextmenu:date': { event: 'contextmenu', stop: true, prevent: true, result: false },\n }, _e => {\n return day\n }),\n }, this.dayFormatter(day, false))\n },\n genBody (): VNode {\n return this.$createElement('div', {\n staticClass: 'v-calendar-daily__body',\n }, [\n this.genScrollArea(),\n ])\n },\n genScrollArea (): VNode {\n return this.$createElement('div', {\n ref: 'scrollArea',\n staticClass: 'v-calendar-daily__scroll-area',\n }, [\n this.genPane(),\n ])\n },\n genPane (): VNode {\n return this.$createElement('div', {\n ref: 'pane',\n staticClass: 'v-calendar-daily__pane',\n style: {\n height: convertToUnit(this.bodyHeight),\n },\n }, [\n this.genDayContainer(),\n ])\n },\n genDayContainer (): VNode {\n return this.$createElement('div', {\n staticClass: 'v-calendar-daily__day-container',\n }, [\n this.genBodyIntervals(),\n ...this.genDays(),\n ])\n },\n genDays (): VNode[] {\n return this.days.map(this.genDay)\n },\n genDay (day: CalendarTimestamp, index: number): VNode {\n return this.$createElement('div', {\n key: day.date,\n staticClass: 'v-calendar-daily__day',\n class: this.getRelativeClasses(day),\n on: this.getDefaultMouseEventHandlers(':time', e => {\n return this.getSlotScope(this.getTimestampAtEvent(e, day))\n }),\n }, [\n ...this.genDayIntervals(index),\n ...this.genDayBody(day),\n ])\n },\n genDayBody (day: CalendarTimestamp): VNode[] {\n return getSlot(this, 'day-body', () => this.getSlotScope(day)) || []\n },\n genDayIntervals (index: number): VNode[] {\n return this.intervals[index].map(this.genDayInterval)\n },\n genDayInterval (interval: CalendarTimestamp): VNode {\n const height: string | undefined = convertToUnit(this.intervalHeight)\n const styler = this.intervalStyle || this.intervalStyleDefault\n\n const data = {\n key: interval.time,\n staticClass: 'v-calendar-daily__day-interval',\n style: {\n height,\n ...styler(interval),\n },\n }\n\n const children = getSlot(this, 'interval', () => this.getSlotScope(interval))\n\n return this.$createElement('div', data, children)\n },\n genBodyIntervals (): VNode {\n const width: string | undefined = convertToUnit(this.intervalWidth)\n const data = {\n staticClass: 'v-calendar-daily__intervals-body',\n style: {\n width,\n },\n on: this.getDefaultMouseEventHandlers(':interval', e => {\n return this.getTimestampAtEvent(e, this.parsedStart)\n }),\n }\n\n return this.$createElement('div', data, this.genIntervalLabels())\n },\n genIntervalLabels (): VNode[] | null {\n if (!this.intervals.length) return null\n\n return this.intervals[0].map(this.genIntervalLabel)\n },\n genIntervalLabel (interval: CalendarTimestamp): VNode {\n const height: string | undefined = convertToUnit(this.intervalHeight)\n const short: boolean = this.shortIntervals\n const shower = this.showIntervalLabel || this.showIntervalLabelDefault\n const show = shower(interval)\n const label = show ? this.intervalFormatter(interval, short) : undefined\n\n return this.$createElement('div', {\n key: interval.time,\n staticClass: 'v-calendar-daily__interval',\n style: {\n height,\n },\n }, [\n this.$createElement('div', {\n staticClass: 'v-calendar-daily__interval-text',\n }, label),\n ])\n },\n },\n\n render (h): VNode {\n return h('div', {\n class: this.classes,\n on: {\n dragstart: (e: MouseEvent) => {\n e.preventDefault()\n },\n },\n directives: [{\n modifiers: { quiet: true },\n name: 'resize',\n value: this.onResize,\n }],\n }, [\n !this.hideHeader ? this.genHead() : '',\n this.genBody(),\n ])\n },\n})\n","// Styles\nimport './VCalendarCategory.sass'\n\n// Types\nimport { VNode } from 'vue'\n\n// Mixins\nimport VCalendarDaily from './VCalendarDaily'\n\n// Util\nimport { getSlot } from '../../util/helpers'\nimport { CalendarTimestamp } from 'types'\nimport props from './util/props'\n\n/* @vue/component */\nexport default VCalendarDaily.extend({\n name: 'v-calendar-category',\n\n props: props.category,\n\n computed: {\n classes (): object {\n return {\n 'v-calendar-daily': true,\n 'v-calendar-category': true,\n ...this.themeClasses,\n }\n },\n parsedCategories (): string[] {\n return typeof this.categories === 'string' && this.categories\n ? this.categories.split(/\\s*,\\s*/)\n : Array.isArray(this.categories)\n ? this.categories as string[]\n : []\n },\n },\n\n methods: {\n genDayHeader (day: CalendarTimestamp, index: number): VNode[] {\n const data = {\n staticClass: 'v-calendar-category__columns',\n }\n const scope = {\n week: this.days, ...day, index,\n }\n\n const children = this.parsedCategories.map(category => this.genDayHeaderCategory(day, this.getCategoryScope(scope, category)))\n\n return [this.$createElement('div', data, children)]\n },\n getCategoryScope (scope: any, category: string) {\n return {\n ...scope,\n category: category === this.categoryForInvalid ? null : category,\n }\n },\n genDayHeaderCategory (day: CalendarTimestamp, scope: any): VNode {\n return this.$createElement('div', {\n staticClass: 'v-calendar-category__column-header',\n on: this.getDefaultMouseEventHandlers(':day-category', e => {\n return this.getCategoryScope(this.getSlotScope(day), scope.category)\n }),\n }, [\n getSlot(this, 'category', scope) || this.genDayHeaderCategoryTitle(scope.category),\n getSlot(this, 'day-header', scope),\n ])\n },\n genDayHeaderCategoryTitle (category: string) {\n return this.$createElement('div', {\n staticClass: 'v-calendar-category__category',\n }, category === null ? this.categoryForInvalid : category)\n },\n genDayBody (day: CalendarTimestamp): VNode[] {\n const data = {\n staticClass: 'v-calendar-category__columns',\n }\n\n const children = this.parsedCategories.map(category => this.genDayBodyCategory(day, category))\n\n return [this.$createElement('div', data, children)]\n },\n genDayBodyCategory (day: CalendarTimestamp, category: string): VNode {\n const data = {\n staticClass: 'v-calendar-category__column',\n on: this.getDefaultMouseEventHandlers(':time-category', e => {\n return this.getCategoryScope(this.getSlotScope(this.getTimestampAtEvent(e, day)), category)\n }),\n }\n\n const children = getSlot(this, 'day-body', () => this.getCategoryScope(this.getSlotScope(day), category))\n\n return this.$createElement('div', data, children)\n },\n },\n})\n","// Styles\n// import '../../stylus/components/_calendar-daily.styl'\n\n// Types\nimport { VNode, Component } from 'vue'\n\n// Mixins\nimport CalendarWithEvents from './mixins/calendar-with-events'\n\n// Util\nimport props from './util/props'\nimport {\n DAYS_IN_MONTH_MAX,\n DAY_MIN,\n DAYS_IN_WEEK,\n parseTimestamp,\n validateTimestamp,\n relativeDays,\n nextDay,\n prevDay,\n copyTimestamp,\n updateFormatted,\n updateWeekday,\n updateRelative,\n getStartOfMonth,\n getEndOfMonth,\n VTime,\n VTimestampInput,\n timestampToDate,\n} from './util/timestamp'\n\n// Calendars\nimport VCalendarMonthly from './VCalendarMonthly'\nimport VCalendarDaily from './VCalendarDaily'\nimport VCalendarWeekly from './VCalendarWeekly'\nimport VCalendarCategory from './VCalendarCategory'\nimport { CalendarTimestamp, CalendarFormatter } from 'vuetify/types'\n\n// Types\ninterface VCalendarRenderProps {\n start: CalendarTimestamp\n end: CalendarTimestamp\n component: string | Component\n maxDays: number\n weekdays: number[]\n categories: string[]\n}\n\n/* @vue/component */\nexport default CalendarWithEvents.extend({\n name: 'v-calendar',\n\n props: {\n ...props.calendar,\n ...props.weeks,\n ...props.intervals,\n ...props.category,\n },\n\n data: () => ({\n lastStart: null as CalendarTimestamp | null,\n lastEnd: null as CalendarTimestamp | null,\n }),\n\n computed: {\n parsedValue (): CalendarTimestamp {\n return (validateTimestamp(this.value)\n ? parseTimestamp(this.value, true)\n : (this.parsedStart || this.times.today))\n },\n parsedCategoryDays (): number {\n return parseInt(this.categoryDays) || 1\n },\n renderProps (): VCalendarRenderProps {\n const around = this.parsedValue\n let component: any = null\n let maxDays = this.maxDays\n let weekdays = this.parsedWeekdays\n let categories = this.parsedCategories\n let start = around\n let end = around\n switch (this.type) {\n case 'month':\n component = VCalendarMonthly\n start = getStartOfMonth(around)\n end = getEndOfMonth(around)\n break\n case 'week':\n component = VCalendarDaily\n start = this.getStartOfWeek(around)\n end = this.getEndOfWeek(around)\n maxDays = 7\n break\n case 'day':\n component = VCalendarDaily\n maxDays = 1\n weekdays = [start.weekday]\n break\n case '4day':\n component = VCalendarDaily\n end = relativeDays(copyTimestamp(end), nextDay, 4)\n updateFormatted(end)\n maxDays = 4\n weekdays = [\n start.weekday,\n (start.weekday + 1) % 7,\n (start.weekday + 2) % 7,\n (start.weekday + 3) % 7,\n ]\n break\n case 'custom-weekly':\n component = VCalendarWeekly\n start = this.parsedStart || around\n end = this.parsedEnd\n break\n case 'custom-daily':\n component = VCalendarDaily\n start = this.parsedStart || around\n end = this.parsedEnd\n break\n case 'category':\n const days = this.parsedCategoryDays\n\n component = VCalendarCategory\n end = relativeDays(copyTimestamp(end), nextDay, days)\n updateFormatted(end)\n maxDays = days\n weekdays = []\n\n for (let i = 0; i < days; i++) {\n weekdays.push((start.weekday + i) % 7)\n }\n\n categories = this.getCategoryList(categories)\n break\n default:\n throw new Error(this.type + ' is not a valid Calendar type')\n }\n\n return { component, start, end, maxDays, weekdays, categories }\n },\n eventWeekdays (): number[] {\n return this.renderProps.weekdays\n },\n categoryMode (): boolean {\n return this.type === 'category'\n },\n title (): string {\n const { start, end } = this.renderProps\n const spanYears = start.year !== end.year\n const spanMonths = spanYears || start.month !== end.month\n\n if (spanYears) {\n return this.monthShortFormatter(start, true) + ' ' + start.year + ' - ' + this.monthShortFormatter(end, true) + ' ' + end.year\n }\n\n if (spanMonths) {\n return this.monthShortFormatter(start, true) + ' - ' + this.monthShortFormatter(end, true) + ' ' + end.year\n } else {\n return this.monthLongFormatter(start, false) + ' ' + start.year\n }\n },\n monthLongFormatter (): CalendarFormatter {\n return this.getFormatter({\n timeZone: 'UTC', month: 'long',\n })\n },\n monthShortFormatter (): CalendarFormatter {\n return this.getFormatter({\n timeZone: 'UTC', month: 'short',\n })\n },\n parsedCategories (): string[] {\n return typeof this.categories === 'string' && this.categories\n ? this.categories.split(/\\s*,\\s*/)\n : Array.isArray(this.categories)\n ? this.categories as string[]\n : []\n },\n },\n\n watch: {\n renderProps: 'checkChange',\n },\n\n mounted () {\n this.updateEventVisibility()\n this.checkChange()\n },\n\n updated () {\n window.requestAnimationFrame(this.updateEventVisibility)\n },\n\n methods: {\n checkChange (): void {\n const { lastStart, lastEnd } = this\n const { start, end } = this.renderProps\n if (!lastStart || !lastEnd ||\n start.date !== lastStart.date ||\n end.date !== lastEnd.date) {\n this.lastStart = start\n this.lastEnd = end\n this.$emit('change', { start, end })\n }\n },\n move (amount = 1): void {\n const moved = copyTimestamp(this.parsedValue)\n const forward = amount > 0\n const mover = forward ? nextDay : prevDay\n const limit = forward ? DAYS_IN_MONTH_MAX : DAY_MIN\n let times = forward ? amount : -amount\n\n while (--times >= 0) {\n switch (this.type) {\n case 'month':\n moved.day = limit\n mover(moved)\n break\n case 'week':\n relativeDays(moved, mover, DAYS_IN_WEEK)\n break\n case 'day':\n relativeDays(moved, mover, 1)\n break\n case '4day':\n relativeDays(moved, mover, 4)\n break\n case 'category':\n relativeDays(moved, mover, this.parsedCategoryDays)\n break\n }\n }\n\n updateWeekday(moved)\n updateFormatted(moved)\n updateRelative(moved, this.times.now)\n\n if (this.value instanceof Date) {\n this.$emit('input', timestampToDate(moved))\n } else if (typeof this.value === 'number') {\n this.$emit('input', timestampToDate(moved).getTime())\n } else {\n this.$emit('input', moved.date)\n }\n\n this.$emit('moved', moved)\n },\n next (amount = 1): void {\n this.move(amount)\n },\n prev (amount = 1): void {\n this.move(-amount)\n },\n timeToY (time: VTime, clamp = true): number | false {\n const c = this.$children[0] as any\n\n if (c && c.timeToY) {\n return c.timeToY(time, clamp)\n } else {\n return false\n }\n },\n timeDelta (time: VTime): number | false {\n const c = this.$children[0] as any\n\n if (c && c.timeDelta) {\n return c.timeDelta(time)\n } else {\n return false\n }\n },\n minutesToPixels (minutes: number): number {\n const c = this.$children[0] as any\n\n if (c && c.minutesToPixels) {\n return c.minutesToPixels(minutes)\n } else {\n return -1\n }\n },\n scrollToTime (time: VTime): boolean {\n const c = this.$children[0] as any\n\n if (c && c.scrollToTime) {\n return c.scrollToTime(time)\n } else {\n return false\n }\n },\n parseTimestamp (input: VTimestampInput, required?: false): CalendarTimestamp | null {\n return parseTimestamp(input, required, this.times.now)\n },\n timestampToDate (timestamp: CalendarTimestamp): Date {\n return timestampToDate(timestamp)\n },\n getCategoryList (categories: string[]): string[] {\n if (!this.noEvents) {\n const categoryMap = categories.reduce((map, category, index) => {\n map[category] = { index, count: 0 }\n\n return map\n }, Object.create(null))\n\n if (!this.categoryHideDynamic || !this.categoryShowAll) {\n let categoryLength = categories.length\n\n this.parsedEvents.forEach(ev => {\n let category = ev.category\n\n if (typeof category !== 'string') {\n category = this.categoryForInvalid\n }\n\n if (!category) {\n return\n }\n\n if (category in categoryMap) {\n categoryMap[category].count++\n } else if (!this.categoryHideDynamic) {\n categoryMap[category] = {\n index: categoryLength++,\n count: 1,\n }\n }\n })\n }\n\n if (!this.categoryShowAll) {\n for (const category in categoryMap) {\n if (categoryMap[category].count === 0) {\n delete categoryMap[category]\n }\n }\n }\n\n categories = Object.keys(categoryMap)\n }\n\n return categories\n },\n },\n\n render (h): VNode {\n const { start, end, maxDays, component, weekdays, categories } = this.renderProps\n\n return h(component, {\n staticClass: 'v-calendar',\n class: {\n 'v-calendar-events': !this.noEvents,\n },\n props: {\n ...this.$props,\n start: start.date,\n end: end.date,\n maxDays,\n weekdays,\n categories,\n },\n directives: [{\n modifiers: { quiet: true },\n name: 'resize',\n value: this.updateEventVisibility,\n }],\n on: {\n ...this.$listeners,\n 'click:date': (day: CalendarTimestamp) => {\n if (this.$listeners['input']) {\n this.$emit('input', day.date)\n }\n if (this.$listeners['click:date']) {\n this.$emit('click:date', day)\n }\n },\n },\n scopedSlots: this.getScopedSlots(),\n })\n },\n})\n","var $ = require('../internals/export');\n\n// `Number.MAX_SAFE_INTEGER` constant\n// https://tc39.github.io/ecma262/#sec-number.max_safe_integer\n$({ target: 'Number', stat: true }, {\n MAX_SAFE_INTEGER: 0x1FFFFFFFFFFFFF\n});\n","import Vue from 'vue'\n\nexport default Vue.extend({\n name: 'localable',\n\n props: {\n locale: String,\n },\n\n computed: {\n currentLocale (): string {\n return this.locale || this.$vuetify.lang.current\n },\n },\n})\n","import { CalendarTimestamp, CalendarFormatter } from 'vuetify/types'\nimport { isLeapYear } from '../../../util/dateTimeUtils'\n\nexport const PARSE_REGEX: RegExp = /^(\\d{4})-(\\d{1,2})(-(\\d{1,2}))?([^\\d]+(\\d{1,2}))?(:(\\d{1,2}))?(:(\\d{1,2}))?$/\nexport const PARSE_TIME: RegExp = /(\\d\\d?)(:(\\d\\d?)|)(:(\\d\\d?)|)/\n\nexport const DAYS_IN_MONTH: number[] = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]\nexport const DAYS_IN_MONTH_LEAP: number[] = [0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]\nexport const DAYS_IN_MONTH_MIN = 28\nexport const DAYS_IN_MONTH_MAX = 31\nexport const MONTH_MAX = 12\nexport const MONTH_MIN = 1\nexport const DAY_MIN = 1\nexport const DAYS_IN_WEEK = 7\nexport const MINUTES_IN_HOUR = 60\nexport const MINUTE_MAX = 59\nexport const MINUTES_IN_DAY = 24 * 60\nexport const HOURS_IN_DAY = 24\nexport const HOUR_MAX = 23\nexport const FIRST_HOUR = 0\nexport const OFFSET_YEAR = 10000\nexport const OFFSET_MONTH = 100\nexport const OFFSET_HOUR = 100\nexport const OFFSET_TIME = 10000\n\ntype CalendarTimestampFormatOptions = (timestamp: CalendarTimestamp, short: boolean) => object\ntype CalendarTimestampOperation = (timestamp: CalendarTimestamp) => CalendarTimestamp\nexport type VTime = number | string | {\n hour: number\n minute: number\n}\n\nexport type VTimestampInput = number | string | Date;\n\nexport function getStartOfWeek (timestamp: CalendarTimestamp, weekdays: number[], today?: CalendarTimestamp): CalendarTimestamp {\n const start = copyTimestamp(timestamp)\n findWeekday(start, weekdays[0], prevDay)\n updateFormatted(start)\n if (today) {\n updateRelative(start, today, start.hasTime)\n }\n\n return start\n}\n\nexport function getEndOfWeek (timestamp: CalendarTimestamp, weekdays: number[], today?: CalendarTimestamp): CalendarTimestamp {\n const end = copyTimestamp(timestamp)\n findWeekday(end, weekdays[weekdays.length - 1])\n updateFormatted(end)\n if (today) {\n updateRelative(end, today, end.hasTime)\n }\n\n return end\n}\n\nexport function getStartOfMonth (timestamp: CalendarTimestamp): CalendarTimestamp {\n const start = copyTimestamp(timestamp)\n start.day = DAY_MIN\n updateWeekday(start)\n updateFormatted(start)\n\n return start\n}\n\nexport function getEndOfMonth (timestamp: CalendarTimestamp): CalendarTimestamp {\n const end = copyTimestamp(timestamp)\n end.day = daysInMonth(end.year, end.month)\n updateWeekday(end)\n updateFormatted(end)\n\n return end\n}\n\nexport function validateTime (input: any): input is VTime {\n return (typeof input === 'number' && isFinite(input)) ||\n (!!PARSE_TIME.exec(input)) ||\n (typeof input === 'object' && isFinite(input.hour) && isFinite(input.minute))\n}\n\nexport function parseTime (input: any): number | false {\n if (typeof input === 'number') {\n // when a number is given, it's minutes since 12:00am\n return input\n } else if (typeof input === 'string') {\n // when a string is given, it's a hh:mm:ss format where seconds are optional\n const parts = PARSE_TIME.exec(input)\n if (!parts) {\n return false\n }\n\n return parseInt(parts[1]) * 60 + parseInt(parts[3] || 0)\n } else if (typeof input === 'object') {\n // when an object is given, it must have hour and minute\n if (typeof input.hour !== 'number' || typeof input.minute !== 'number') {\n return false\n }\n\n return input.hour * 60 + input.minute\n } else {\n // unsupported type\n return false\n }\n}\n\nexport function validateTimestamp (input: any): input is VTimestampInput {\n return (typeof input === 'number' && isFinite(input)) ||\n (typeof input === 'string' && !!PARSE_REGEX.exec(input)) ||\n (input instanceof Date)\n}\n\nexport function parseTimestamp (input: VTimestampInput, required?: false, now?: CalendarTimestamp): CalendarTimestamp | null\nexport function parseTimestamp (input: VTimestampInput, required: true, now?: CalendarTimestamp): CalendarTimestamp\nexport function parseTimestamp (input: VTimestampInput, required = false, now?: CalendarTimestamp): CalendarTimestamp | null {\n if (typeof input === 'number' && isFinite(input)) {\n input = new Date(input)\n }\n\n if (input instanceof Date) {\n const date: CalendarTimestamp = parseDate(input)\n\n if (now) {\n updateRelative(date, now, date.hasTime)\n }\n\n return date\n }\n\n if (typeof input !== 'string') {\n if (required) {\n throw new Error(`${input} is not a valid timestamp. It must be a Date, number of seconds since Epoch, or a string in the format of YYYY-MM-DD or YYYY-MM-DD hh:mm. Zero-padding is optional and seconds are ignored.`)\n }\n return null\n }\n\n // YYYY-MM-DD hh:mm:ss\n const parts = PARSE_REGEX.exec(input)\n\n if (!parts) {\n if (required) {\n throw new Error(`${input} is not a valid timestamp. It must be a Date, number of seconds since Epoch, or a string in the format of YYYY-MM-DD or YYYY-MM-DD hh:mm. Zero-padding is optional and seconds are ignored.`)\n }\n\n return null\n }\n\n const timestamp: CalendarTimestamp = {\n date: input,\n time: '',\n year: parseInt(parts[1]),\n month: parseInt(parts[2]),\n day: parseInt(parts[4]) || 1,\n hour: parseInt(parts[6]) || 0,\n minute: parseInt(parts[8]) || 0,\n weekday: 0,\n hasDay: !!parts[4],\n hasTime: !!(parts[6] && parts[8]),\n past: false,\n present: false,\n future: false,\n }\n\n updateWeekday(timestamp)\n updateFormatted(timestamp)\n\n if (now) {\n updateRelative(timestamp, now, timestamp.hasTime)\n }\n\n return timestamp\n}\n\nexport function parseDate (date: Date): CalendarTimestamp {\n return updateFormatted({\n date: '',\n time: '',\n year: date.getFullYear(),\n month: date.getMonth() + 1,\n day: date.getDate(),\n weekday: date.getDay(),\n hour: date.getHours(),\n minute: date.getMinutes(),\n hasDay: true,\n hasTime: true,\n past: false,\n present: true,\n future: false,\n })\n}\n\nexport function getDayIdentifier (timestamp: { year: number, month: number, day: number }): number {\n return timestamp.year * OFFSET_YEAR + timestamp.month * OFFSET_MONTH + timestamp.day\n}\n\nexport function getTimeIdentifier (timestamp: { hour: number, minute: number }): number {\n return timestamp.hour * OFFSET_HOUR + timestamp.minute\n}\n\nexport function getTimestampIdentifier (timestamp: CalendarTimestamp): number {\n return getDayIdentifier(timestamp) * OFFSET_TIME + getTimeIdentifier(timestamp)\n}\n\nexport function updateRelative (timestamp: CalendarTimestamp, now: CalendarTimestamp, time = false): CalendarTimestamp {\n let a = getDayIdentifier(now)\n let b = getDayIdentifier(timestamp)\n let present = a === b\n\n if (timestamp.hasTime && time && present) {\n a = getTimeIdentifier(now)\n b = getTimeIdentifier(timestamp)\n present = a === b\n }\n\n timestamp.past = b < a\n timestamp.present = present\n timestamp.future = b > a\n\n return timestamp\n}\n\nexport function isTimedless (input: VTimestampInput): input is (Date | number) {\n return (input instanceof Date) || (typeof input === 'number' && isFinite(input))\n}\n\nexport function updateHasTime (timestamp: CalendarTimestamp, hasTime: boolean, now?: CalendarTimestamp): CalendarTimestamp {\n if (timestamp.hasTime !== hasTime) {\n timestamp.hasTime = hasTime\n if (!hasTime) {\n timestamp.hour = HOUR_MAX\n timestamp.minute = MINUTE_MAX\n timestamp.time = getTime(timestamp)\n }\n if (now) {\n updateRelative(timestamp, now, timestamp.hasTime)\n }\n }\n\n return timestamp\n}\n\nexport function updateMinutes (timestamp: CalendarTimestamp, minutes: number, now?: CalendarTimestamp): CalendarTimestamp {\n timestamp.hasTime = true\n timestamp.hour = Math.floor(minutes / MINUTES_IN_HOUR)\n timestamp.minute = minutes % MINUTES_IN_HOUR\n timestamp.time = getTime(timestamp)\n if (now) {\n updateRelative(timestamp, now, true)\n }\n\n return timestamp\n}\n\nexport function updateWeekday (timestamp: CalendarTimestamp): CalendarTimestamp {\n timestamp.weekday = getWeekday(timestamp)\n\n return timestamp\n}\n\nexport function updateFormatted (timestamp: CalendarTimestamp): CalendarTimestamp {\n timestamp.time = getTime(timestamp)\n timestamp.date = getDate(timestamp)\n\n return timestamp\n}\n\nexport function getWeekday (timestamp: CalendarTimestamp): number {\n if (timestamp.hasDay) {\n const _ = Math.floor\n const k = timestamp.day\n const m = ((timestamp.month + 9) % MONTH_MAX) + 1\n const C = _(timestamp.year / 100)\n const Y = (timestamp.year % 100) - (timestamp.month <= 2 ? 1 : 0)\n\n return (((k + _(2.6 * m - 0.2) - 2 * C + Y + _(Y / 4) + _(C / 4)) % 7) + 7) % 7\n }\n\n return timestamp.weekday\n}\n\nexport function daysInMonth (year: number, month: number) {\n return isLeapYear(year) ? DAYS_IN_MONTH_LEAP[month] : DAYS_IN_MONTH[month]\n}\n\nexport function copyTimestamp (timestamp: CalendarTimestamp): CalendarTimestamp {\n const { date, time, year, month, day, weekday, hour, minute, hasDay, hasTime, past, present, future } = timestamp\n\n return { date, time, year, month, day, weekday, hour, minute, hasDay, hasTime, past, present, future }\n}\n\nexport function padNumber (x: number, length: number): string {\n let padded = String(x)\n while (padded.length < length) {\n padded = '0' + padded\n }\n\n return padded\n}\n\nexport function getDate (timestamp: CalendarTimestamp): string {\n let str = `${padNumber(timestamp.year, 4)}-${padNumber(timestamp.month, 2)}`\n\n if (timestamp.hasDay) str += `-${padNumber(timestamp.day, 2)}`\n\n return str\n}\n\nexport function getTime (timestamp: CalendarTimestamp): string {\n if (!timestamp.hasTime) {\n return ''\n }\n\n return `${padNumber(timestamp.hour, 2)}:${padNumber(timestamp.minute, 2)}`\n}\n\nexport function nextMinutes (timestamp: CalendarTimestamp, minutes: number): CalendarTimestamp {\n timestamp.minute += minutes\n while (timestamp.minute > MINUTES_IN_HOUR) {\n timestamp.minute -= MINUTES_IN_HOUR\n timestamp.hour++\n if (timestamp.hour >= HOURS_IN_DAY) {\n nextDay(timestamp)\n timestamp.hour = FIRST_HOUR\n }\n }\n\n return timestamp\n}\n\nexport function nextDay (timestamp: CalendarTimestamp): CalendarTimestamp {\n timestamp.day++\n timestamp.weekday = (timestamp.weekday + 1) % DAYS_IN_WEEK\n if (timestamp.day > DAYS_IN_MONTH_MIN && timestamp.day > daysInMonth(timestamp.year, timestamp.month)) {\n timestamp.day = DAY_MIN\n timestamp.month++\n if (timestamp.month > MONTH_MAX) {\n timestamp.month = MONTH_MIN\n timestamp.year++\n }\n }\n\n return timestamp\n}\n\nexport function prevDay (timestamp: CalendarTimestamp): CalendarTimestamp {\n timestamp.day--\n timestamp.weekday = (timestamp.weekday + 6) % DAYS_IN_WEEK\n if (timestamp.day < DAY_MIN) {\n timestamp.month--\n if (timestamp.month < MONTH_MIN) {\n timestamp.year--\n timestamp.month = MONTH_MAX\n }\n timestamp.day = daysInMonth(timestamp.year, timestamp.month)\n }\n\n return timestamp\n}\n\nexport function relativeDays (\n timestamp: CalendarTimestamp,\n mover: CalendarTimestampOperation = nextDay,\n days = 1\n): CalendarTimestamp {\n while (--days >= 0) mover(timestamp)\n\n return timestamp\n}\n\nexport function diffMinutes (min: CalendarTimestamp, max: CalendarTimestamp) {\n const Y = (max.year - min.year) * 525600\n const M = (max.month - min.month) * 43800\n const D = (max.day - min.day) * 1440\n const h = (max.hour - min.hour) * 60\n const m = (max.minute - min.minute)\n\n return Y + M + D + h + m\n}\n\nexport function findWeekday (timestamp: CalendarTimestamp, weekday: number,\n mover: CalendarTimestampOperation = nextDay, maxDays = 6): CalendarTimestamp {\n while (timestamp.weekday !== weekday && --maxDays >= 0) mover(timestamp)\n\n return timestamp\n}\n\nexport function getWeekdaySkips (weekdays: number[]): number[] {\n const skips: number[] = [1, 1, 1, 1, 1, 1, 1]\n const filled: number[] = [0, 0, 0, 0, 0, 0, 0]\n for (let i = 0; i < weekdays.length; i++) {\n filled[weekdays[i]] = 1\n }\n for (let k = 0; k < DAYS_IN_WEEK; k++) {\n let skip = 1\n for (let j = 1; j < DAYS_IN_WEEK; j++) {\n const next = (k + j) % DAYS_IN_WEEK\n if (filled[next]) {\n break\n }\n skip++\n }\n skips[k] = filled[k] * skip\n }\n\n return skips\n}\n\nexport function timestampToDate (timestamp: CalendarTimestamp): Date {\n const time = `${padNumber(timestamp.hour, 2)}:${padNumber(timestamp.minute, 2)}`\n const date = timestamp.date\n\n return new Date(`${date}T${time}:00+00:00`)\n}\n\nexport function createDayList (\n start: CalendarTimestamp,\n end: CalendarTimestamp,\n now: CalendarTimestamp,\n weekdaySkips: number[],\n max = 42,\n min = 0\n): CalendarTimestamp[] {\n const stop = getDayIdentifier(end)\n const days: CalendarTimestamp[] = []\n let current = copyTimestamp(start)\n let currentIdentifier = 0\n let stopped = currentIdentifier === stop\n\n if (stop < getDayIdentifier(start)) {\n throw new Error('End date is earlier than start date.')\n }\n\n while ((!stopped || days.length < min) && days.length < max) {\n currentIdentifier = getDayIdentifier(current)\n stopped = stopped || currentIdentifier === stop\n if (weekdaySkips[current.weekday] === 0) {\n current = nextDay(current)\n continue\n }\n const day = copyTimestamp(current)\n updateFormatted(day)\n updateRelative(day, now)\n days.push(day)\n current = relativeDays(current, nextDay, weekdaySkips[current.weekday])\n }\n\n if (!days.length) throw new Error('No dates found using specified start date, end date, and weekdays.')\n\n return days\n}\n\nexport function createIntervalList (timestamp: CalendarTimestamp, first: number,\n minutes: number, count: number, now?: CalendarTimestamp): CalendarTimestamp[] {\n const intervals: CalendarTimestamp[] = []\n\n for (let i = 0; i < count; i++) {\n const mins = first + (i * minutes)\n const int = copyTimestamp(timestamp)\n intervals.push(updateMinutes(int, mins, now))\n }\n\n return intervals\n}\n\nexport function createNativeLocaleFormatter (locale: string, getOptions: CalendarTimestampFormatOptions): CalendarFormatter {\n const emptyFormatter: CalendarFormatter = (_t, _s) => ''\n\n if (typeof Intl === 'undefined' || typeof Intl.DateTimeFormat === 'undefined') {\n return emptyFormatter\n }\n\n return (timestamp, short) => {\n try {\n const intlFormatter = new Intl.DateTimeFormat(locale || undefined, getOptions(timestamp, short))\n\n return intlFormatter.format(timestampToDate(timestamp))\n } catch (e) {\n return ''\n }\n }\n}\n"],"sourceRoot":""}