calendarkit-pro 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils.ts","../src/components/ui/button.tsx","../src/components/CalendarHeader.tsx","../src/lib/date.ts","../src/components/MiniCalendar.tsx","../src/components/Sidebar.tsx","../src/components/dnd/DraggableEvent.tsx","../src/components/dnd/DroppableCell.tsx","../src/views/MonthView.tsx","../src/components/dnd/ResizableEvent.tsx","../src/views/WeekView.tsx","../src/views/DayView.tsx","../src/components/EmptyState.tsx","../src/views/AgendaView.tsx","../src/views/ResourceView.tsx","../src/components/ui/Modal.tsx","../src/components/EventModal.tsx","../src/components/Skeleton.tsx","../src/components/ContextMenu.tsx","../src/locales/index.ts","../src/lib/theme.ts","../src/hooks/useCalendarLogic.ts","../src/hooks/useSwipeGesture.ts","../src/index.tsx"],"names":["React","format","subMonths","addMonths","ChevronLeft","ChevronRight","isSameDay","isSameMonth","isToday","startOfWeek","endOfWeek","eachDayOfInterval","toZonedTime","useState","useRef","useCallback","differenceInMinutes","Plus","useMemo","addDays","Users","startOfDay","useEffect","X","Calendar","Clock","motion","MapPin","Bell","Paperclip","Download","ChevronDown","_","Copy","Trash2","AnimatePresence","subDays","subWeeks","addWeeks"],"mappings":";;;;;;;;;;;;;;AAIO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;AAEO,IAAM,mBAAA,GAAsB,CAAC,KAAA,KAA0B,KAAA,EAAO,SAAA,KAAc,KAAA;AAG5E,IAAM,qBAAA,GAAwB,CAAC,KAAA,KACpC,KAAA,EAAO,SAAA,KAAc,SAAU,KAAA,EAAO,SAAA,KAAc,MAAA,IAAa,mBAAA,CAAoB,KAAK,CAAA;;;ACR5F,IAAM,cAAA,GAAiB,GAAA;AAAA,EACrB,wRAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,OAAA,EAAS,wDAAA;AAAA,QACT,WAAA,EACE,oEAAA;AAAA,QACF,OAAA,EACE,gFAAA;AAAA,QACF,SAAA,EACE,8DAAA;AAAA,QACF,KAAA,EAAO,8CAAA;AAAA,QACP,IAAA,EAAM;AAAA,OACR;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,OAAA,EAAS,gBAAA;AAAA,QACT,EAAA,EAAI,qBAAA;AAAA,QACJ,EAAA,EAAI,sBAAA;AAAA,QACJ,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS,SAAA;AAAA,MACT,IAAA,EAAM;AAAA;AACR;AAEJ,CAAA;AAQA,IAAM,MAAA,GAAeA,OAAA,CAAA,UAAA;AAAA,EACnB,CAAC,EAAE,SAAA,EAAW,OAAA,EAAS,IAAA,EAAM,UAAU,KAAA,EAAO,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAChE,IAAA,MAAM,IAAA,GAAO,QAAA;AACb,IAAA,uBACEA,OAAA,CAAA,aAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,GAAG,cAAA,CAAe,EAAE,SAAS,IAAA,EAAM,SAAA,EAAW,CAAC,CAAA;AAAA,QAC1D,GAAA;AAAA,QACC,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF,CAAA;AACA,MAAA,CAAO,WAAA,GAAc,QAAA;AC3Bd,IAAM,iBAAgD,CAAC;AAAA,EAC5D,WAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAA;AAAA,EACA,QAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,EAAE,GAAA,EAAK,OAAA,EAAS,IAAA,EAAM,YAAA,EAAa;AAAA,IACnC,EAAE,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,aAAA,EAAc;AAAA,IACnC,EAAE,GAAA,EAAK,KAAA,EAAO,IAAA,EAAM,QAAA,EAAS;AAAA,IAC7B,EAAE,GAAA,EAAK,QAAA,EAAU,IAAA,EAAM,QAAA;AAAS,GAClC;AAEA,EAAA,uBACEA,gBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,kMAAA,EAAA,kBAEbA,gBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,2EAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,kCAAA,EAAA,kBAEXA,gBAAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,SAAA,EAAU,uIAAA;AAAA,MACV,OAAA,EAAS;AAAA,KAAA;AAAA,oBAEPA,gBAAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAK,WAAU,SAAA,EAAU;AAAA,GAC9B,kBAGAA,gBAAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAQ,SAAA;AAAA,MACR,OAAA,EAAS,OAAA;AAAA,MACT,SAAA,EAAU;AAAA,KAAA;AAAA,IAEP,YAAA,CAAa;AAAA,GAClB,kBAGAA,gBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,gDAAA,EAAA,kBACXA,gBAAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,OAAA,EAAS,MAAA;AAAA,MACT,SAAA,EAAU;AAAA,KAAA;AAAA,oBAERA,gBAAAA,CAAA,aAAA,CAAC,WAAA,EAAA,EAAY,WAAU,+BAAA,EAAgC;AAAA,GAC3D,kBACAA,gBAAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,OAAA,EAAS,MAAA;AAAA,MACT,SAAA,EAAU;AAAA,KAAA;AAAA,oBAERA,gBAAAA,CAAA,aAAA,CAAC,YAAA,EAAA,EAAa,WAAU,+BAAA,EAAgC;AAAA,GAEhE,CAAA,kBAGAA,gBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cAAA,EAAA,kBACXA,iBAAA,aAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,8FAAA,EAAA,EACT,OAAO,WAAA,EAAa,WAAA,EAAa,EAAE,MAAA,EAAQ,CAChD,CACJ,CACJ,CACF,CAAA,kBAGAA,gBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,+DAAA,EAAA,EAEZ,gBAAA,IAAoB,QAAA,oBACnBA,gBAAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAK,IAAA;AAAA,MACL,SAAS,MAAM,gBAAA,CAAiB,QAAA,KAAa,IAAA,GAAO,OAAO,IAAI,CAAA;AAAA,MAC/D,SAAA,EAAU;AAAA,KAAA;AAAA,IAET;AAAA,GACH,EAID,aAAA,oBACCA,gBAAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,SAAA,EAAU,mEAAA;AAAA,MACV,OAAA,EAAS;AAAA,KAAA;AAAA,IAER,UAAA,mBACCA,gBAAAA,CAAA,aAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EAAyB,CAAA,mBAExCA,gBAAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAK,WAAU,+BAAA,EAAgC;AAAA,KAMrD,CAAC,gBAAA,oBACAA,gBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,+DAAA,EAAA,EACZ,UAAA,CAAW,GAAA,CAAI,CAAC,EAAE,GAAA,EAAK,MAAM,IAAA,EAAK,qBACjCA,gBAAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,OAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAK,IAAA;AAAA,MACL,OAAA,EAAS,MAAM,YAAA,CAAa,GAAG,CAAA;AAAA,MAC/B,SAAA,EAAW,EAAA;AAAA,QACT,iEAAA;AAAA,QACA,IAAA,KAAS,MACL,qFAAA,GACA;AAAA;AACN,KAAA;AAAA,oBAEAA,gBAAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAK,WAAU,aAAA,EAAc,CAAA;AAAA,oBAC9BA,iBAAA,aAAA,CAAC,MAAA,EAAA,EAAK,WAAU,kBAAA,EAAA,EAAoB,YAAA,CAAa,GAAG,CAAE;AAAA,GAEzD,CACH,CAEJ,CACF,CAAA;AAEJ,CAAA;ACvIO,IAAM,YAAA,GAAe,CAAC,IAAA,EAAY,WAAA,GAAyC,CAAA,KAAc;AAC9F,EAAA,MAAM,UAAA,GAAa,aAAa,IAAI,CAAA;AACpC,EAAA,MAAM,QAAA,GAAW,WAAW,UAAU,CAAA;AAEtC,EAAA,MAAM,YAAY,WAAA,CAAY,UAAA,EAAY,EAAE,YAAA,EAAc,aAAa,CAAA;AACvE,EAAA,MAAM,UAAU,SAAA,CAAU,QAAA,EAAU,EAAE,YAAA,EAAc,aAAa,CAAA;AAcjE,EAAA,OAAO,iBAAA,CAAkB;AAAA,IACvB,KAAA,EAAO,SAAA;AAAA,IACP,GAAA,EAAK;AAAA,GACN,CAAA;AACH,CAAA;AAOO,IAAM,eAAA,GAAkB,CAAC,MAAA,KAA6B;AAC3D,EAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AACpB,EAAA,OAAO,CAAC,WAAA,CAAY,IAAA,CAAKC,MAAAA,CAAO,IAAI,KAAK,GAAA,EAAM,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,CAAC,CAAA,EAAG,GAAA,EAAK,EAAE,MAAA,EAAQ,CAAC,CAAA;AAC/E,CAAA;ACpCO,IAAM,eAA4C,CAAC;AAAA,EACxD,WAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAID,gBAAAA,CAAM,SAAS,WAAW,CAAA;AAG1D,EAAAA,gBAAAA,CAAM,UAAU,MAAM;AACpB,IAAA,WAAA,CAAY,WAAW,CAAA;AAAA,EACzB,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAIhB,EAAA,MAAM,YAAA,GAAe,MAAA,EAAQ,OAAA,EAAS,YAAA,IAAgB,CAAA;AACtD,EAAA,MAAM,OAAOA,gBAAAA,CAAM,OAAA;AAAA,IACjB,MAAM,YAAA,CAAa,QAAA,EAAU,YAAY,CAAA;AAAA,IACzC,CAAC,UAAU,YAAY;AAAA,GACzB;AACA,EAAA,MAAM,QAAA,GAAW,MAAA,EAAQ,QAAA,GACrB,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,CAAE,IAAI,CAAA,CAAA,KAAK;AAC7B,IAAA,MAAM,QAAA,GAAA,CAAa,IAAI,YAAA,IAAgB,CAAA;AACvC,IAAA,OAAO,OAAO,QAAA,CAAS,GAAA,CAAI,UAAU,EAAE,KAAA,EAAO,UAAU,CAAA;AAAA,EAC1D,CAAC,IACD,CAAC,GAAA,EAAK,KAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA;AAEtC,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,MAAM,OAAA,GAAUE,SAAAA,CAAU,QAAA,EAAU,CAAC,CAAA;AACrC,IAAA,WAAA,CAAY,OAAO,CAAA;AAEnB,IAAA,YAAA,CAAa,OAAO,CAAA;AACpB,IAAA,IAAI,YAAA,eAA2B,OAAO,CAAA;AAAA,EACxC,CAAA;AAEA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,MAAM,OAAA,GAAUC,SAAAA,CAAU,QAAA,EAAU,CAAC,CAAA;AACrC,IAAA,WAAA,CAAY,OAAO,CAAA;AAEnB,IAAA,YAAA,CAAa,OAAO,CAAA;AACpB,IAAA,IAAI,YAAA,eAA2B,OAAO,CAAA;AAAA,EACxC,CAAA;AAEA,EAAA,MAAM,eAAA,GAAkB,CAAC,GAAA,KAAc;AACnC,IAAA,YAAA,CAAa,GAAG,CAAA;AAChB,IAAA,IAAI,YAAA,eAA2B,KAAK,CAAA;AAAA,EACxC,CAAA;AAEA,EAAA,uBACEH,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,gBAAA,EAAkB,SAAS,CAAA,EAAA,kBAE5CA,iBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sDACbC,MAAAA,CAAO,QAAA,EAAU,WAAA,EAAa,EAAE,QAAQ,CAC3C,CAAA,kBACAD,iBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gDAAA,EAAA,kBACXA,gBAAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,SAAA,EAAU,0DAAA;AAAA,MACV,OAAA,EAAS,UAAA;AAAA,MACT,YAAA,EAAW;AAAA,KAAA;AAAA,oBAETA,gBAAAA,CAAA,aAAA,CAACI,WAAAA,EAAA,EAAY,WAAU,SAAA,EAAU;AAAA,GACrC,kBACAJ,gBAAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,SAAA,EAAU,0DAAA;AAAA,MACV,OAAA,EAAS,UAAA;AAAA,MACT,YAAA,EAAW;AAAA,KAAA;AAAA,oBAETA,gBAAAA,CAAA,aAAA,CAACK,YAAAA,EAAA,EAAa,WAAU,SAAA,EAAU;AAAA,GAE1C,CACF,CAAA,kBAGAL,gBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2CAAA,EAAA,EACZ,QAAA,CAAS,IAAI,CAAC,GAAA,EAAK,sBAClBA,gBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,GAAA,EAAK,CAAA,EAAG,GAAG,IAAI,CAAC,CAAA,CAAA,EAAI,SAAA,EAAU,8DAAA,EAAA,EAChC,GACH,CACD,CACH,CAAA,kBAGAA,iBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,sCAAA,EAAA,EACZ,IAAA,CAAK,IAAI,CAAA,GAAA,KAAO;AACf,IAAA,MAAM,UAAA,GAAaM,SAAAA,CAAU,GAAA,EAAK,WAAW,CAAA;AAC7C,IAAA,MAAM,cAAA,GAAiBC,WAAAA,CAAY,GAAA,EAAK,QAAQ,CAAA;AAChD,IAAA,MAAM,WAAA,GAAcC,QAAQ,GAAG,CAAA;AAE/B,IAAA,uBACER,gBAAAA,CAAA,aAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,IAAI,WAAA,EAAY;AAAA,QACrB,OAAA,EAAS,MAAM,eAAA,CAAgB,GAAG,CAAA;AAAA,QAClC,SAAA,EAAW,EAAA;AAAA,UACT,6GAAA;AAAA,UACA,CAAC,cAAA,IAAkB,0BAAA;AAAA,UACnB,cAAA,IAAkB,CAAC,UAAA,IAAc,CAAC,WAAA,IAAe,oCAAA;AAAA,UACjD,UAAA,IAAc,0EAAA;AAAA,UACd,CAAC,cAAc,WAAA,IAAe;AAAA;AAChC,OAAA;AAAA,MAECC,MAAAA,CAAO,KAAK,GAAG;AAAA,KAClB;AAAA,EAEJ,CAAC,CACH,CACF,CAAA;AAEJ,CAAA;AClGO,IAAM,UAAkC,CAAC;AAAA,EAC9C,WAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,gBAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,gBAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,SAAS,IAAI,CAAA;AACvD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAI,SAAsB,IAAI,CAAA;AAChD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAS,KAAK,CAAA;AAGlD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,aAAA,CAAc,IAAI,CAAA;AAClB,IAAA,MAAA,iBAAO,IAAI,MAAM,CAAA;AACjB,IAAA,MAAM,KAAA,GAAQ,YAAY,MAAM,MAAA,qBAAW,IAAA,EAAM,GAAG,GAAK,CAAA;AACzD,IAAA,OAAO,MAAM,cAAc,KAAK,CAAA;AAAA,EAClC,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,gBAAA,GAAmB;AAAA,IACvB,EAAE,IAAI,GAAA,EAAK,KAAA,EAAO,eAAe,KAAA,EAAO,SAAA,EAAW,QAAQ,IAAA,EAAK;AAAA,IAChE,EAAE,IAAI,GAAA,EAAK,KAAA,EAAO,aAAa,KAAA,EAAO,SAAA,EAAW,QAAQ,IAAA,EAAK;AAAA,IAC9D,EAAE,IAAI,GAAA,EAAK,KAAA,EAAO,SAAS,KAAA,EAAO,SAAA,EAAW,QAAQ,IAAA;AAAK,GAC5D;AAEA,EAAA,MAAM,mBAAmB,SAAA,IAAa,gBAAA;AAEtC,EAAA,MAAM,UAAA,GAAa,CAAC,EAAA,KAAe;AAC/B,IAAA,IAAI,CAAC,EAAA,IAAM,CAAC,GAAA,EAAK,OAAO,KAAA;AACxB,IAAA,IAAI;AACF,MAAA,OAAO,IAAI,KAAK,cAAA,CAAe,OAAA,EAAS,EAAE,QAAA,EAAU,EAAA,EAAI,cAAc,OAAA,EAAS,EAC1E,aAAA,CAAc,GAAG,EACjB,IAAA,CAAK,CAAA,IAAA,KAAQ,KAAK,IAAA,KAAS,cAAc,GAAG,KAAA,IAAS,EAAA;AAAA,IAC5D,SAAS,CAAA,EAAG;AAAE,MAAA,OAAO,EAAA;AAAA,IAAI;AAAA,EAC7B,CAAA;AAEA,EAAA,MAAM,SAAA,GAAY;AAAA,IAChB,EAAE,OAAO,EAAA,EAAI,KAAA,EAAO,cAAc,SAAA,IAAa,YAAA,EAAc,SAAS,KAAA,EAAM;AAAA,IAC5E,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,SAAS,KAAA,EAAM;AAAA,IAC7C,EAAE,KAAA,EAAO,kBAAA,EAAoB,KAAA,EAAO,UAAA,EAAY,SAAS,KAAA,EAAM;AAAA,IAC/D,EAAE,KAAA,EAAO,iBAAA,EAAmB,KAAA,EAAO,SAAA,EAAW,SAAS,KAAA,EAAM;AAAA,IAC7D,EAAE,KAAA,EAAO,gBAAA,EAAkB,KAAA,EAAO,QAAA,EAAU,SAAS,KAAA,EAAM;AAAA,IAC3D,EAAE,KAAA,EAAO,qBAAA,EAAuB,KAAA,EAAO,aAAA,EAAe,SAAS,KAAA,EAAM;AAAA,IACrE,EAAE,KAAA,EAAO,eAAA,EAAiB,KAAA,EAAO,QAAA,EAAU,SAAS,KAAA,EAAM;AAAA,IAC1D,EAAE,KAAA,EAAO,cAAA,EAAgB,KAAA,EAAO,OAAA,EAAS,SAAS,KAAA,EAAM;AAAA,IACxD,EAAE,KAAA,EAAO,eAAA,EAAiB,KAAA,EAAO,QAAA,EAAU,SAAS,KAAA,EAAM;AAAA,IAC1D,EAAE,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,OAAA,EAAS,SAAS,KAAA,EAAM;AAAA,IACtD,EAAE,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,OAAA,EAAS,SAAS,KAAA,EAAM;AAAA,IACtD,EAAE,KAAA,EAAO,gBAAA,EAAkB,KAAA,EAAO,WAAA,EAAa,SAAS,KAAA,EAAM;AAAA,IAC9D,EAAE,KAAA,EAAO,kBAAA,EAAoB,KAAA,EAAO,QAAA,EAAU,SAAS,MAAA;AAAO,GAChE;AAGA,EAAA,MAAM,aAAA,GAAgB,CAAC,EAAA,EAAuD,QAAA,GAAoB,IAAA,KAAS;AAEvG,IAAA,IAAI,CAAC,UAAA,IAAc,CAAC,GAAA,IAAO,CAAC,QAAA,EAAU;AAClC,MAAA,uBAAOD,gBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,IAAA,EAAM,GAAG,KAAM,CAAA;AAAA,IAC3B;AAEA,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,IAAI,UAAU,EAAA,CAAG,OAAA;AAEjB,IAAA,IAAI;AACA,MAAA,IAAI,CAAC,GAAG,KAAA,EAAO;AACX,QAAA,IAAA,GAAOC,MAAAA,CAAO,KAAK,OAAO,CAAA;AAE1B,QAAA,IAAI;AACA,UAAA,OAAA,GAAU,IAAI,IAAA,CAAK,cAAA,CAAe,SAAS,EAAE,YAAA,EAAc,SAAS,CAAA,CAC/D,aAAA,CAAc,GAAG,EACjB,IAAA,CAAK,CAAA,IAAA,KAAQ,KAAK,IAAA,KAAS,cAAc,GAAG,KAAA,IAAS,KAAA;AAAA,QAC9D,SAAS,CAAA,EAAG;AAAA,QAAC;AAAA,MACjB,CAAA,MAAO;AACH,QAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,GAAA,EAAK,EAAA,CAAG,KAAK,CAAA;AACvC,QAAA,IAAA,GAAOA,MAAAA,CAAO,OAAO,OAAO,CAAA;AAE5B,QAAA,MAAM,UAAA,GAAa,UAAA,CAAW,EAAA,CAAG,KAAK,CAAA;AACtC,QAAA,IAAI,UAAA,IAAc,CAAC,UAAA,CAAW,QAAA,CAAS,KAAK,KAAK,CAAC,UAAA,CAAW,QAAA,CAAS,MAAM,CAAA,EAAG;AAC3E,UAAA,OAAA,GAAU,UAAA;AAAA,QACd;AAAA,MACJ;AAAA,IACJ,SAAS,CAAA,EAAG;AACR,MAAA,uBAAOD,gBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,IAAA,EAAM,GAAG,KAAM,CAAA;AAAA,IAC3B;AAEA,IAAA,uBACIA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EAAA,kBACXA,gBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,IAAA,EAAM,EAAA,CAAG,KAAM,mBAChBA,gBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yCAAA,EAAA,EACX,IAAA,EAAK,GAAA,kBAACA,gBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBAAA,EAAA,EAAqB,GAAA,EAAE,OAAA,EAAQ,GAAC,CAC3D,CACJ,CAAA;AAAA,EAER,CAAA;AAEA,EAAA,MAAM,gBAAgB,SAAA,CAAU,IAAA,CAAK,OAAK,CAAA,CAAE,KAAA,MAAW,YAAY,EAAA,CAAG,CAAA;AACtE,EAAA,MAAM,wBAAwB,aAAA,GAAgB,aAAA,CAAc,aAAa,CAAA,GAAK,cAAc,SAAA,IAAa,YAAA;AAEzG,EAAA,uBACEA,gBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAW,EAAA,CAAG,wKAAwK,SAAS,CAAA,EAAA,EACjM,CAAC,QAAA,oBACAA,gBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,WAAA,EAAA,kBACXA,gBAAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,wOAAA;AAAA,MACV,OAAA,EAAS;AAAA,KAAA;AAAA,oBAETA,gBAAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAK,WAAU,SAAA,EAAU,CAAA;AAAA,oBAC1BA,iBAAA,aAAA,CAAC,MAAA,EAAA,EAAK,WAAU,SAAA,EAAA,EAAW,YAAA,EAAc,UAAU,QAAS;AAAA,GAElE,CAAA,kBAGFA,gBAAAA,CAAA,aAAA,CAAC,gBAAa,WAAA,EAA0B,YAAA,EAA4B,YAAA,EAA4B,MAAA,EAAgB,CAAA,kBAEhHA,iBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EAAA,kBAEbA,gBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2DAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,0HAAA;AAAA,MACV,OAAA,EAAS,MAAM,gBAAA,CAAiB,CAAC,aAAa;AAAA,KAAA;AAAA,oBAE9CA,iBAAA,aAAA,CAAC,MAAA,EAAA,EAAK,WAAU,uCAAA,EAAA,EAAyC,YAAA,EAAc,aAAa,WAAY,CAAA;AAAA,oBAChGA,iBAAA,aAAA,CAAC,WAAA,EAAA,EAAY,WAAW,EAAA,CAAG,iEAAA,EAAmE,aAAA,IAAiB,YAAY,CAAA,EAAG;AAAA,GAChI,EAEC,aAAA,oBACCA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAAA,EACZ,gBAAA,CAAiB,GAAA,CAAI,CAAA,GAAA,qBACpBA,gBAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,KAAK,GAAA,CAAI,EAAA;AAAA,MACT,SAAA,EAAU,kHAAA;AAAA,MACV,OAAA,EAAS,MAAM,gBAAA,GAAmB,GAAA,CAAI,IAAI,EAAE,GAAA,CAAI,UAAU,IAAA,CAAK;AAAA,KAAA;AAAA,oBAEjEA,gBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,2CAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACG,IAAA,EAAK,UAAA;AAAA,QACL,OAAA,EAAS,IAAI,MAAA,IAAU,IAAA;AAAA,QACvB,QAAA,EAAU,CAAC,CAAA,KAAM;AACZ,UAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,UAAA,gBAAA,GAAmB,GAAA,CAAI,EAAA,EAAI,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AAAA,QAChD,CAAA;AAAA,QACA,SAAA,EAAU,yIAAA;AAAA,QACV,KAAA,EAAO,EAAE,iBAAA,EAAmB,GAAA,CAAI,KAAA,EAAM;AAAA,QACtC,eAAa,GAAA,CAAI;AAAA;AAAA,uBAErBA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,6HAAA,EAAA,kBACXA,gBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,wBAAA,EAAyB,IAAA,EAAK,MAAA,EAAO,SAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,qBACvGA,gBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,eAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,kBAAiB,CAC1E,CACJ,mBACAA,gBAAAA,CAAA,cAAC,OAAA,EAAA,IAAA,EAAO;AAAA,0DAAA,EACgC,IAAI,EAAE,CAAA;AAAA,0CAAA,EACtB,IAAI,KAAK,CAAA;AAAA,sCAAA,EACb,IAAI,KAAK,CAAA;AAAA;AAAA,0DAAA,EAEW,IAAI,EAAE,CAAA;AAAA,yCAAA,EACvB,IAAI,KAAK,CAAA;AAAA;AAAA,oBAAA,CAE9B,CACJ,CAAA;AAAA,oBACAA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wCAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iDAAA,EAAA,EAAmD,GAAA,CAAI,KAAM,CAC/E,CAAA;AAAA,oBACAA,gBAAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,4EAAA;AAAA,QACV,KAAA,EAAO,EAAE,eAAA,EAAiB,GAAA,CAAI,KAAA;AAAM;AAAA;AACtC,GAEH,CACH,CAEJ,CACF,CAAA,kBAGAA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EAAA,kBACXA,iBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EAAA,kBACXA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EAAA,kBACXA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,gCAAA,EAAA,kBACXA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,sBAAA,EAAuB,CAC5C,CAAA,kBACAA,gBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2CAAyC,YAAA,EAAc,QAAA,IAAY,UAAW,CAClG,CAAA,kBAEAA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACG,OAAA,EAAS,MAAM,eAAA,CAAgB,CAAC,YAAY,CAAA;AAAA,MAC5C,SAAA,EAAU;AAAA,KAAA;AAAA,oBAEVA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sCAAoC,qBAAsB,CAAA;AAAA,oBACzEA,iBAAA,aAAA,CAAC,WAAA,EAAA,EAAY,WAAW,EAAA,CAAG,iEAAA,EAAmE,YAAA,IAAgB,YAAY,CAAA,EAAG;AAAA,GACjI,EAEC,YAAA,oBACGA,gBAAAA,CAAA,aAAA,CAAAA,gBAAAA,CAAA,QAAA,EAAA,IAAA,kBACIA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EAAqB,OAAA,EAAS,MAAM,eAAA,CAAgB,KAAK,CAAA,EAAG,CAAA,kBAC3EA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oLAAA,EAAA,EACV,SAAA,CAAU,GAAA,CAAI,CAAA,EAAA,qBACXA,gBAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,KAAK,EAAA,CAAG,KAAA;AAAA,MACR,SAAA,EAAW,EAAA;AAAA,QACP,2EAAA;AAAA,QAAA,CACC,QAAA,IAAY,EAAA,MAAQ,EAAA,CAAG,KAAA,GAClB,kDAAA,GACA;AAAA,OACV;AAAA,MACA,SAAS,MAAM;AACX,QAAA,gBAAA,GAAmB,GAAG,KAAK,CAAA;AAC3B,QAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,MACzB;AAAA,KAAA;AAAA,IAEC,cAAc,EAAE;AAAA,GAExB,CACL,CACJ,CAEL,CACL,CACJ,CACF,CAAA;AAEJ,CAAA;AC3PO,IAAM,cAAA,GAAgD,CAAC,EAAE,KAAA,EAAO,QAAA,EAAU,WAAW,KAAA,EAAO,SAAA,EAAW,GAAG,KAAA,EAAM,KAAM;AAC3H,EAAA,MAAM,YAAA,GAAe,oBAAoB,KAAK,CAAA;AAC9C,EAAA,MAAM,EAAE,UAAA,EAAY,SAAA,EAAW,YAAY,SAAA,EAAW,UAAA,KAAe,YAAA,CAAa;AAAA,IAChF,IAAI,KAAA,CAAM,EAAA;AAAA,IACV,IAAA,EAAM,EAAE,KAAA,EAAM;AAAA,IACd,QAAA,EAAU;AAAA,GACX,CAAA;AAED,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,GAAG,SAAA;AAAA,IACH,SAAA,EAAW,GAAA,CAAI,SAAA,CAAU,QAAA,CAAS,SAAS,CAAA;AAAA,IAC3C,MAAA,EAAQ,UAAA,GAAa,GAAA,GAAM,SAAA,EAAW,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMtC,OAAA,EAAS,UAAA,GAAa,CAAA,GAAI,SAAA,EAAW;AAAA;AAAA,GACvC;AAEA,EAAA,uBACEA,gBAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,UAAA;AAAA,MACL,KAAA;AAAA,MACC,GAAG,SAAA;AAAA,MACH,GAAG,UAAA;AAAA,MACH,GAAG,KAAA;AAAA,MACJ,SAAA,EAAW,EAAA,CAAG,CAAC,YAAA,IAAgB,cAAc,SAAS;AAAA,KAAA;AAAA,IAErD;AAAA,GACH;AAEJ,CAAA;AC7BO,IAAM,aAAA,GAA8C,CAAC,EAAE,EAAA,EAAI,IAAA,EAAM,YAAY,QAAA,EAAU,SAAA,EAAW,KAAA,EAAO,OAAA,EAAQ,KAAM;AAC5H,EAAA,MAAM,EAAE,MAAA,EAAQ,UAAA,EAAW,GAAI,YAAA,CAAa;AAAA,IAC1C,EAAA;AAAA,IACA,IAAA,EAAM,EAAE,IAAA,EAAM,UAAA;AAAW,GAC1B,CAAA;AAGD,EAAA,MAAM,OAAA,GAAU,KAAK,UAAA,EAAW;AAChC,EAAA,MAAM,YAAA,GACJ,YAAY,CAAA,GAAI,+CAAA,GAChB,YAAY,EAAA,GAAK,+CAAA,GACjB,OAAA,KAAY,EAAA,GAAK,gDAAA,GACjB,gDAAA;AAEF,EAAA,MAAM,kBAAA,GACJ,YAAY,CAAA,GAAI,kEAAA,GAChB,YAAY,EAAA,GAAK,kEAAA,GACjB,OAAA,KAAY,EAAA,GAAK,mEAAA,GACjB,mEAAA;AAEF,EAAA,uBACEA,gBAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,UAAA;AAAA,MACL,SAAA,EAAW,EAAA;AAAA,QACT,SAAA;AAAA,QACA,YAAA;AAAA,QACA,MAAA,IAAU;AAAA,OACZ;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KAAA;AAAA,IAEC;AAAA,GACH;AAEJ,CAAA;;;AC5BA,IAAM,SAAA,GAAYA,gBAAAA,CAAM,IAAA,CAAK,CAAC,EAAE,KAAA,EAAO,YAAA,EAAa,qBAChDA,gBAAAA,CAAA,aAAA,CAAC,cAAA,EAAA,EAAe,KAAA,EAAA,kBACZA,gBAAAA,CAAA,aAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACG,SAAA,EAAW,EAAA;AAAA,MACT,gGAAA;AAAA,MACA,+CAAA;AAAA,MACA,CAAC,MAAM,KAAA,IAAS;AAAA,KAClB;AAAA,IACA,KAAA,EAAO,MAAM,KAAA,GAAQ;AAAA,MACnB,eAAA,EAAiB,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,EAAA,CAAA;AAAA,MAC/B,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,UAAA,EAAY,CAAA,UAAA,EAAa,KAAA,CAAM,KAAK,CAAA;AAAA,KACtC,GAAI,MAAA;AAAA,IACJ,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,YAAA,GAAe,KAAK,CAAA;AAAA,IACtB;AAAA,GAAA;AAAA,kBAEAA,gBAAAA,CAAA,aAAA,CAAC,UAAK,SAAA,EAAU,aAAA,EAAA,EAAe,MAAM,KAAM;AAC/C,CACJ,CACH,CAAA;AAED,SAAA,CAAU,WAAA,GAAc,WAAA;AAEjB,IAAM,YAAsC,CAAC;AAAA,EAClD,WAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,KAAM;AAIJ,EAAA,MAAM,YAAA,GAAe,MAAA,EAAQ,OAAA,EAAS,YAAA,IAAgB,CAAA;AACtD,EAAA,MAAM,IAAA,GAAO,OAAA;AAAA,IACX,MAAM,YAAA,CAAa,WAAA,EAAa,YAAY,CAAA;AAAA,IAC5C,CAAC,aAAa,YAAY;AAAA,GAC5B;AAGA,EAAA,MAAM,QAAA,GAAW,QAAQ,MAAM;AAC7B,IAAA,MAAM,KAAA,GAAQS,WAAAA,CAAY,WAAA,EAAa,EAAE,cAAc,CAAA;AACvD,IAAA,MAAM,GAAA,GAAMC,SAAAA,CAAU,WAAA,EAAa,EAAE,cAAc,CAAA;AACnD,IAAA,OAAOC,iBAAAA,CAAkB,EAAE,KAAA,EAAO,GAAA,EAAK,CAAA;AAAA,EACzC,CAAA,EAAG,CAAC,WAAA,EAAa,YAAY,CAAC,CAAA;AAG9B,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,CAAC,IAAA,KAAe;AAC/C,IAAA,OAAO,QAAA,GAAWC,WAAAA,CAAY,IAAA,EAAM,QAAQ,CAAA,GAAI,IAAA;AAAA,EAClD,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAIb,EAAA,MAAM,WAAA,GAAc,QAAQ,MAAM;AAChC,IAAA,MAAM,GAAA,uBAAU,GAAA,EAA6B;AAE7C,IAAA,MAAA,CAAO,QAAQ,CAAA,KAAA,KAAS;AACtB,MAAA,MAAM,UAAA,GAAa,YAAA,CAAa,KAAA,CAAM,KAAK,CAAA;AAE3C,MAAA,MAAM,GAAA,GAAMX,MAAAA,CAAO,UAAA,EAAY,YAAY,CAAA;AAE3C,MAAA,IAAI,CAAC,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA,EAAG;AACjB,QAAA,GAAA,CAAI,GAAA,CAAI,GAAA,EAAK,EAAE,CAAA;AAAA,MACjB;AACA,MAAA,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA,CAAG,IAAA,CAAK,KAAK,CAAA;AAAA,IAC1B,CAAC,CAAA;AAED,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,EAAG,CAAC,MAAA,EAAQ,YAAY,CAAC,CAAA;AAEzB,EAAA,uBACED,iBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kJAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qDAEbA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+IAAA,EAAA,EACZ,SAAS,GAAA,CAAI,CAAC,GAAA,qBACbA,gBAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,IAAI,WAAA,EAAY;AAAA,MACrB,SAAA,EAAU;AAAA,KAAA;AAAA,IAETC,MAAAA,CAAO,GAAA,EAAK,KAAA,EAAO,EAAE,QAAQ;AAAA,GAEjC,CACH,CAAA,kBACAD,gBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EAAmB,KAAA,EAAO,EAAE,YAAA,EAAc,OAAA,MACxD,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ;AACjB,IAAA,MAAM,MAAA,GAASC,MAAAA,CAAO,GAAA,EAAK,YAAY,CAAA;AACvC,IAAA,MAAM,SAAA,GAAY,WAAA,CAAY,GAAA,CAAI,MAAM,KAAK,EAAC;AAE9C,IAAA,MAAM,cAAA,GAAiBM,WAAAA,CAAY,GAAA,EAAK,WAAW,CAAA;AACnD,IAAA,MAAM,MAAA,GAAS,IAAI,WAAA,EAAY;AAE/B,IAAA,uBACEP,gBAAAA,CAAA,aAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,MAAA;AAAA,QACL,EAAA,EAAI,MAAA;AAAA,QACJ,IAAA,EAAM,GAAA;AAAA,QACN,SAAA,EAAW,EAAA;AAAA,UACT,qLAAA;AAAA,UACA,CAAC,cAAA,IAAkB,qCAAA;AAAA,UACnBQ,OAAAA,CAAQ,GAAG,CAAA,IAAK;AAAA,SAClB;AAAA,QACA,OAAA,EAAS,MAAM,WAAA,GAAc,GAAG;AAAA,OAAA;AAAA,sBAEhCR,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sDACbA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA;AAAA,QACd,yGAAA;AAAA,QACAQ,OAAAA,CAAQ,GAAG,CAAA,GACP,gEAAA,GACA;AAAA,OACN,EAAA,EACGP,OAAO,GAAA,EAAK,GAAA,EAAK,EAAE,MAAA,EAAQ,CAC9B,CAAA,EACC,SAAA,CAAU,SAAS,CAAA,oBAClBD,iBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yFAAA,EAAA,EACZ,SAAA,CAAU,MACb,CAEJ,CAAA;AAAA,sBAEAA,gBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,6EAAA,EAAA,EACZ,UAAU,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,2BACxBA,gBAAAA,CAAA,cAAC,SAAA,EAAA,EAAU,GAAA,EAAK,GAAG,KAAA,CAAM,EAAE,CAAA,CAAA,EAAI,MAAM,IAAI,KAAA,EAAc,YAAA,EAA4B,CACrF,CAAA,EACA,SAAA,CAAU,SAAS,CAAA,oBAChBA,iBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2IAAA,EAAA,EAA4I,GAAA,EACrJ,UAAU,MAAA,GAAS,CAAA,EAAE,OAC3B,CAEN;AAAA,KACF;AAAA,EAEJ,CAAC,CACD,CACF,CACF,CAAA;AAEJ,CAAA;ACjJO,IAAM,iBAAgD,CAAC;AAAA,EAC5D,KAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA,GAAc,EAAA;AAAA,EACd,QAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,YAAA,GAAe,QAAA,IAAY,qBAAA,CAAsB,KAAK,CAAA;AAC5D,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIa,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAAwB,IAAI,CAAA;AACpE,EAAA,MAAM,YAAA,GAAeC,OAAuB,IAAI,CAAA;AAChD,EAAA,MAAM,SAAA,GAAYA,OAAe,CAAC,CAAA;AAClC,EAAA,MAAM,cAAA,GAAiBA,OAAe,CAAC,CAAA;AAGvC,EAAA,MAAM,eAAA,GAAkBA,OAAsB,IAAI,CAAA;AAElD,EAAA,MAAM,iBAAA,GAAoBC,WAAAA,CAAY,CAAC,CAAA,KAA2C;AAChF,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,CAAA,CAAE,eAAA,EAAgB;AAElB,IAAA,MAAM,OAAA,GAAU,aAAa,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAC,CAAA,CAAE,UAAU,CAAA,CAAE,OAAA;AAC1D,IAAA,SAAA,CAAU,OAAA,GAAU,OAAA;AACpB,IAAA,cAAA,CAAe,OAAA,GAAU,YAAA,CAAa,OAAA,EAAS,YAAA,IAAgB,CAAA;AAE/D,IAAA,aAAA,CAAc,IAAI,CAAA;AAElB,IAAA,MAAM,UAAA,GAAa,CAAC,SAAA,KAAuC;AACzD,MAAA,MAAM,WAAA,GAAc,aAAa,SAAA,GAAY,SAAA,CAAU,QAAQ,CAAC,CAAA,CAAE,UAAU,SAAA,CAAU,OAAA;AACtF,MAAA,MAAM,MAAA,GAAS,cAAc,SAAA,CAAU,OAAA;AAGvC,MAAA,MAAM,eAAe,UAAA,GAAa,CAAA;AAClC,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,YAAY,CAAA,GAAI,YAAA;AAEzD,MAAA,MAAM,YAAY,IAAA,CAAK,GAAA;AAAA,QACpB,cAAc,EAAA,GAAM,UAAA;AAAA;AAAA,QACrB,eAAe,OAAA,GAAU;AAAA,OAC3B;AAEA,MAAA,eAAA,CAAgB,OAAA,GAAU,SAAA;AAC1B,MAAA,eAAA,CAAgB,SAAS,CAAA;AAAA,IAC3B,CAAA;AAEA,IAAA,MAAM,YAAY,MAAM;AACtB,MAAA,aAAA,CAAc,KAAK,CAAA;AAEnB,MAAA,MAAM,cAAc,eAAA,CAAgB,OAAA;AAEpC,MAAA,IAAI,WAAA,KAAgB,IAAA,IAAQ,YAAA,CAAa,OAAA,IAAW,QAAA,EAAU;AAE5D,QAAA,MAAM,iBAAiB,cAAA,CAAe,OAAA;AACtC,QAAA,MAAM,aAAa,WAAA,GAAc,cAAA;AACjC,QAAA,MAAM,WAAA,GAAe,aAAa,UAAA,GAAc,EAAA;AAEhD,QAAA,MAAM,MAAA,GAAS,IAAI,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AACjC,QAAA,MAAA,CAAO,UAAA,CAAW,MAAA,CAAO,UAAA,EAAW,GAAI,WAAW,CAAA;AAGnD,QAAA,IAAI,MAAA,GAAS,MAAM,KAAA,EAAO;AACxB,UAAA,QAAA,CAAS,OAAO,MAAM,CAAA;AAAA,QACxB;AAAA,MACF;AAEA,MAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAC1B,MAAA,eAAA,CAAgB,IAAI,CAAA;AAEpB,MAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,UAAU,CAAA;AACpD,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,SAAS,CAAA;AACjD,MAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,UAAU,CAAA;AACpD,MAAA,QAAA,CAAS,mBAAA,CAAoB,YAAY,SAAS,CAAA;AAAA,IACpD,CAAA;AAEA,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,UAAU,CAAA;AACjD,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAC9C,IAAA,QAAA,CAAS,iBAAiB,WAAA,EAAa,UAAA,EAAY,EAAE,OAAA,EAAS,OAAO,CAAA;AACrE,IAAA,QAAA,CAAS,gBAAA,CAAiB,YAAY,SAAS,CAAA;AAAA,EACjD,GAAG,CAAC,KAAA,EAAO,UAAA,EAAY,WAAA,EAAa,QAAQ,CAAC,CAAA;AAE7C,EAAA,MAAM,iBAAA,GAAoBA,WAAAA,CAAY,CAAC,CAAA,KAA0B;AAI/D,IAAA,CAAA,CAAE,eAAA,EAAgB;AAAA,EACpB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,uBACEf,gBAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,YAAA;AAAA,MACL,SAAA,EAAW,EAAA,CAAG,gBAAA,EAAkB,SAAS,CAAA;AAAA,MACzC,KAAA,EAAO;AAAA,QACL,GAAG,KAAA;AAAA,QACH,QAAQ,YAAA,KAAiB,IAAA,GAAO,CAAA,EAAG,YAAY,OAAO,KAAA,EAAO;AAAA;AAC/D,KAAA;AAAA,IAEC,QAAA;AAAA,oBAGDA,gBAAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,EAAA;AAAA,UACT,eAAe,gBAAA,GAAmB,0CAAA;AAAA,UAClC,4EAAA;AAAA,UACA,8BAAA;AAAA,UACA,UAAA,IAAc;AAAA,SAChB;AAAA,QACA,aAAA,EAAe,eAAe,MAAA,GAAY,iBAAA;AAAA,QAC1C,WAAA,EAAa,eAAe,MAAA,GAAY,iBAAA;AAAA,QACxC,YAAA,EAAc,eAAe,MAAA,GAAY;AAAA,OAAA;AAAA,sBAEzCA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA;AAAA,QACd,qCAAA;AAAA,QACA,aAAa,YAAA,GAAe;AAAA,OAC9B,EAAG;AAAA,KACL;AAAA,IAGC,8BACCA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oGAAA,EAAqG;AAAA,GAExH;AAEJ,CAAA;;;ACrHO,IAAM,WAAoC,CAAC;AAAA,EAChD,WAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,KAAM;AAGJ,EAAA,MAAM,YAAA,GAAe,MAAA,EAAQ,OAAA,EAAS,YAAA,IAAgB,CAAA;AACtD,EAAA,MAAM,KAAA,GAAQS,WAAAA,CAAY,WAAA,EAAa,EAAE,cAAc,CAAA;AACvD,EAAA,MAAM,GAAA,GAAMC,SAAAA,CAAU,WAAA,EAAa,EAAE,cAAc,CAAA;AACnD,EAAA,MAAM,QAAA,GAAWC,iBAAAA,CAAkB,EAAE,KAAA,EAAO,KAAK,CAAA;AACjD,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,IAAG,EAAG,CAAC,CAAA,EAAG,CAAA,KAAM,CAAC,CAAA;AAEpD,EAAA,MAAM,UAAA,GAAa,EAAA;AACnB,EAAA,MAAM,kBAAA,GAAqBX,gBAAAA,CAAM,MAAA,CAAuB,IAAI,CAAA;AAE5D,EAAA,MAAM,CAAC,KAAK,MAAM,CAAA,GAAIA,iBAAM,QAAA,iBAAS,IAAI,MAAM,CAAA;AAE/C,EAAAA,gBAAAA,CAAM,UAAU,MAAM;AACpB,IAAA,MAAM,QAAA,GAAW,YAAY,MAAM,MAAA,qBAAW,IAAA,EAAM,GAAG,GAAK,CAAA;AAC5D,IAAA,OAAO,MAAM,cAAc,QAAQ,CAAA;AAAA,EACrC,CAAA,EAAG,EAAE,CAAA;AAGL,EAAAA,gBAAAA,CAAM,UAAU,MAAM;AACpB,IAAA,IAAI,mBAAmB,OAAA,EAAS;AAC5B,MAAA,MAAM,qBAAqB,MAAM;AAC7B,QAAA,MAAM,WAAA,GAAc,IAAI,QAAA,EAAS;AACjC,QAAA,MAAM,UAAA,GAAa,CAAA;AACnB,QAAA,OAAA,CAAQ,cAAc,UAAA,IAAc,UAAA;AAAA,MACxC,CAAA;AACF,MAAA,kBAAA,CAAmB,OAAA,CAAQ,YAAY,kBAAA,EAAmB;AAAA,IAC5D;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,YAAA,GAAe,CAAC,IAAA,KAAe;AACnC,IAAA,OAAO,QAAA,GAAWY,WAAAA,CAAY,IAAA,EAAM,QAAQ,CAAA,GAAI,IAAA;AAAA,EAClD,CAAA;AAEA,EAAA,MAAM,QAAA,GAAW,YAAA,iBAAa,IAAI,IAAA,EAAM,CAAA;AAExC,EAAA,MAAM,kBAAA,GAAqB,CAAC,EAAA,KAA2B;AAGnD,IAAA,MAAM,IAAA,GAAO,GAAA;AACb,IAAA,IAAI,WAAA,GAAc,EAAA;AAClB,IAAA,IAAI,OAAA,GAAU,EAAA;AAEd,IAAA,IAAI,CAAC,EAAA,EAAI;AAEL,MAAA,WAAA,GAAcX,MAAAA,CAAO,MAAM,OAAO,CAAA;AAClC,MAAA,IAAI;AACD,QAAA,OAAA,GAAU,IAAI,IAAA,CAAK,cAAA,CAAe,SAAS,EAAE,YAAA,EAAc,SAAS,CAAA,CAClE,aAAA,CAAc,IAAI,EAClB,IAAA,CAAK,CAAA,IAAA,KAAQ,KAAK,IAAA,KAAS,cAAc,GAAG,KAAA,IAAS,EAAA;AAAA,MAC1D,SAAS,CAAA,EAAG;AAAE,QAAA,OAAA,GAAU,KAAA;AAAA,MAAO;AAAA,IACnC,CAAA,MAAO;AACH,MAAA,IAAI;AACA,QAAA,MAAM,KAAA,GAAQW,WAAAA,CAAY,IAAA,EAAM,EAAE,CAAA;AAClC,QAAA,WAAA,GAAcX,MAAAA,CAAO,OAAO,OAAO,CAAA;AAInC,QAAA,OAAA,GAAU,IAAI,KAAK,cAAA,CAAe,OAAA,EAAS,EAAE,QAAA,EAAU,EAAA,EAAI,cAAc,OAAA,EAAS,EAC7E,aAAA,CAAc,IAAI,EAClB,IAAA,CAAK,CAAA,IAAA,KAAQ,KAAK,IAAA,KAAS,cAAc,GAAG,KAAA,IAAS,EAAA;AAAA,MAC9D,SAAS,CAAA,EAAG;AAER,QAAA,WAAA,GAAcA,MAAAA,CAAO,MAAM,OAAO,CAAA;AAClC,QAAA,OAAA,GAAU,EAAA;AAAA,MACd;AAAA,IACJ;AAMA,IAAA,uBACED,iBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yDAAA,EAAA,kBACXA,iBAAA,aAAA,CAAC,MAAA,EAAA,IAAA,EAAM,WAAY,CAAA,kBACnBA,iBAAA,aAAA,CAAC,MAAA,EAAA,EAAK,WAAU,wBAAA,EAAA,EAAyB,GAAA,EAAE,OAAA,EAAQ,GAAC,CACxD,CAAA;AAAA,EAEN,CAAA;AAEA,EAAA,MAAM,KAAA,GAAQ,gBAAgB,MAAM,CAAA;AACpC,EAAA,MAAM,UAAA,GAAa,QAAQ,MAAA,GAAS,KAAA;AACpC,EAAA,MAAM,eAAA,GAAkB,QAAQ,MAAA,GAAS,QAAA;AACzC,EAAA,MAAM,SAAA,GAAY,QAAQ,MAAA,GAAS,MAAA;AAEnC,EAAA,uBACEA,gBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,mIAAA,EAAA,kBAKbA,gBAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,kBAAA;AAAA,MACL,SAAA,EAAU;AAAA,KAAA;AAAA,oBAGVA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qIAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2JAAA,EAAA,EACZ,kBAAA,CAAmB,QAAQ,CAC9B,CAAA,kBACAA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EAAA,EACV,QAAA,CAAS,GAAA,CAAI,CAAC,GAAA,EAAK,KAAA,qBACpBA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,GAAA,CAAI,WAAA,EAAY,EAAG,SAAA,EAAW,EAAA,CAAG,uBAAA,EAAyB,KAAA,GAAQ,CAAA,IAAK,mCAAmC,CAAA,EAAA,kBAChHA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iFAAA,EAAA,EAAmFC,MAAAA,CAAO,GAAA,EAAK,KAAA,EAAO,EAAE,MAAA,EAAQ,CAAE,CAAA,kBACjID,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA;AAAA,MACd,+GAAA;AAAA,MACAQ,OAAAA,CAAQ,GAAG,CAAA,GACP,0EAAA,GACA;AAAA,KACN,EAAA,EACGP,MAAAA,CAAO,GAAA,EAAK,GAAA,EAAK,EAAE,MAAA,EAAQ,CAC9B,CACJ,CACC,CACL,CACF,CAAA;AAAA,oBAGAD,gBAAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,0BAAA;AAAA,QACV,KAAA,EAAO,EAAE,MAAA,EAAQ,KAAA,CAAM,SAAS,UAAA;AAAW,OAAA;AAAA,sBAG3CA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sEAAA,EAAA,EACZ,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,qBACPA,gBAAAA,CAAA,aAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,IAAA;AAAA,UACL,SAAA,EAAU,0GAAA;AAAA,UACV,KAAA,EAAO,EAAE,MAAA,EAAQ,UAAA;AAAW,SAAA;AAAA,wBAE5BA,iBAAA,aAAA,CAAC,MAAA,EAAA,EAAK,WAAU,wBAAA,EAAA,EACd,IAAA,KAAS,CAAA,IAAKC,MAAAA,CAAAA,iBAAO,IAAI,IAAA,IAAO,QAAA,CAAS,IAAA,EAAM,GAAG,CAAA,EAAG,CAAC,GAAG,UAAA,EAAY,EAAE,MAAA,EAAQ,CACjF;AAAA,OAEN,CACH,CAAA;AAAA,sBAGAD,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sCACZ,QAAA,CAAS,GAAA,CAAI,CAAC,GAAA,EAAK,QAAA,KAAa;AAE7B,QAAA,MAAM,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,CAAA,CAAA,KAAK;AACjC,UAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAK,CAAA;AACvC,UAAA,OAAOM,SAAAA,CAAU,YAAY,GAAG,CAAA;AAAA,QACpC,CAAC,CAAA;AAED,QAAA,uBACAN,gBAAAA,CAAA,aAAA,CAAC,SAAI,GAAA,EAAK,GAAA,CAAI,aAAY,EAAG,SAAA,EAAW,EAAA,CAAG,iBAAA,EAAmB,WAAW,CAAA,IAAK,mCAAmC,KAE5G,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACjB,UAAA,uBACIA,gBAAAA,CAAA,aAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACG,GAAA,EAAK,IAAA;AAAA,cACL,SAAA,EAAU,gHAAA;AAAA,cACV,KAAA,EAAO,EAAE,MAAA,EAAQ,UAAA;AAAW,aAAA;AAAA,YAG3B,CAAC,GAAG,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA,CAAE,GAAA,CAAI,CAAC,MAAA,KAAW;AAC7B,cAAA,MAAM,QAAA,GAAW,IAAI,IAAA,CAAK,GAAG,CAAA;AAC7B,cAAA,QAAA,CAAS,QAAA,CAAS,IAAA,EAAM,MAAA,EAAQ,CAAA,EAAG,CAAC,CAAA;AACpC,cAAA,MAAM,MAAA,GAAS,SAAS,WAAA,EAAY;AAEpC,cAAA,uBACIA,gBAAAA,CAAA,aAAA;AAAA,gBAAC,aAAA;AAAA,gBAAA;AAAA,kBACG,GAAA,EAAK,MAAA;AAAA,kBACL,EAAA,EAAI,MAAA;AAAA,kBACJ,IAAA,EAAM,QAAA;AAAA,kBACN,SAAA,EAAU,sDAAA;AAAA,kBACV,KAAA,EAAO;AAAA,oBACH,MAAA,EAAQ,KAAA;AAAA,oBACR,GAAA,EAAK,CAAA,EAAI,MAAA,GAAS,EAAA,GAAM,GAAG,CAAA,CAAA;AAAA;AAC/B,iBAAA;AAAA,gCAEAA,gBAAAA,CAAA,aAAA;AAAA,kBAAC,KAAA;AAAA,kBAAA;AAAA,oBACG,SAAA,EAAU,6CAAA;AAAA,oBACV,OAAA,EAAS,MAAM,eAAA,GAAkB,QAAQ;AAAA;AAAA;AAC7C,eACJ;AAAA,YAER,CAAC;AAAA,WACL;AAAA,QAER,CAAC,CAAA,EAGA,SAAA,CAAU,GAAA,CAAI,CAAC,KAAA,KAAU;AAGtB,UAAA,MAAM,iBAAA,GAAoB,SAAA,CAAU,MAAA,CAAO,CAAA,CAAA,KAAK;AAC5C,YAAA,IAAI,CAAA,CAAE,EAAA,KAAO,KAAA,CAAM,EAAA,EAAI,OAAO,KAAA;AAC9B,YAAA,MAAM,EAAA,GAAK,YAAA,CAAa,KAAA,CAAM,KAAK,EAAE,OAAA,EAAQ;AAC7C,YAAA,MAAM,EAAA,GAAK,YAAA,CAAa,KAAA,CAAM,GAAG,EAAE,OAAA,EAAQ;AAC3C,YAAA,MAAM,EAAA,GAAK,YAAA,CAAa,CAAA,CAAE,KAAK,EAAE,OAAA,EAAQ;AACzC,YAAA,MAAM,EAAA,GAAK,YAAA,CAAa,CAAA,CAAE,GAAG,EAAE,OAAA,EAAQ;AACvC,YAAA,OAAO,EAAA,GAAK,MAAM,EAAA,GAAK,EAAA;AAAA,UAC3B,CAAC,CAAA;AAOD,UAAA,MAAM,KAAA,GAAQ,CAAC,KAAA,EAAO,GAAG,iBAAiB,CAAA,CAAE,IAAA;AAAA,YAAK,CAAC,CAAA,EAAG,CAAA,KACjD,aAAa,CAAA,CAAE,KAAK,EAAE,OAAA,EAAQ,GAAI,aAAa,CAAA,CAAE,KAAK,EAAE,OAAA,EAAQ,KAC/D,EAAE,EAAA,GAAK,CAAA,CAAE,KAAK,CAAA,GAAI,EAAA;AAAA;AAAA,WACvB;AAEA,UAAA,MAAM,QAAQ,KAAA,CAAM,SAAA,CAAU,OAAK,CAAA,CAAE,EAAA,KAAO,MAAM,EAAE,CAAA;AACpD,UAAA,MAAM,QAAQ,KAAA,CAAM,MAAA;AAEpB,UAAA,MAAM,eAAe,GAAA,GAAM,KAAA;AAC3B,UAAA,MAAM,cAAc,KAAA,GAAQ,YAAA;AAE5B,UAAA,MAAM,eAAA,GAAkB,YAAA,CAAa,KAAA,CAAM,KAAK,CAAA;AAChD,UAAA,MAAM,aAAA,GAAgB,YAAA,CAAa,KAAA,CAAM,GAAG,CAAA;AAE5C,UAAA,MAAM,eAAe,eAAA,CAAgB,QAAA,EAAS,GAAI,EAAA,GAAK,gBAAgB,UAAA,EAAW;AAClF,UAAA,MAAM,eAAA,GAAkB,mBAAA,CAAoB,aAAA,EAAe,eAAe,CAAA;AAE1E,UAAA,MAAM,GAAA,GAAO,eAAe,EAAA,GAAM,UAAA;AAClC,UAAA,MAAM,MAAA,GAAU,kBAAkB,EAAA,GAAM,UAAA;AAExC,UAAA,MAAM,eAAe,eAAA,GAAkB,EAAA;AAEvC,UAAA,uBACIA,gBAAAA,CAAA,aAAA;AAAA,YAAC,cAAA;AAAA,YAAA;AAAA,cACG,KAAK,CAAA,EAAG,KAAA,CAAM,EAAE,CAAA,CAAA,EAAI,GAAA,CAAI,aAAa,CAAA,CAAA;AAAA,cACrC,KAAA;AAAA,cACA,SAAA,EAAW,CAAA,6BAAA,EAAgC,QAAA,GAAW,gBAAA,GAAmB,EAAE,CAAA,CAAA;AAAA,cAC3E,KAAA,EAAO;AAAA,gBACH,GAAA,EAAK,GAAG,GAAG,CAAA,EAAA,CAAA;AAAA,gBACX,QAAQ,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,EAAE,CAAC,CAAA,EAAA,CAAA;AAAA,gBAC/B,IAAA,EAAM,GAAG,WAAW,CAAA,CAAA,CAAA;AAAA,gBACpB,KAAA,EAAO,GAAG,YAAY,CAAA,CAAA,CAAA;AAAA;AAAA,gBAEtB,YAAA,EAAc,KAAA,GAAQ,CAAA,GAAI,KAAA,GAAQ;AAAA;AACtC,aAAA;AAAA,4BAEAA,gBAAAA,CAAA,aAAA;AAAA,cAAC,cAAA;AAAA,cAAA;AAAA,gBACG,QAAA;AAAA,gBACA,KAAA;AAAA,gBACA,UAAA;AAAA,gBACA,QAAA,EAAU,aAAA;AAAA,gBACV,SAAA,EAAU,QAAA;AAAA,gBACV,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAA;AAAO,eAAA;AAAA,8BAExBA,gBAAAA,CAAA,aAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBACG,SAAA,EAAW,EAAA;AAAA,oBACP,2FAAA;AAAA,oBACA,OAAA;AAAA,oBACA,QAAA,IAAY,mBAAA,CAAoB,KAAK,CAAA,GAAI,gBAAA,GAAmB,oCAAA;AAAA,oBAC5D,CAAC,MAAM,KAAA,IAAS,iCAAA;AAAA,oBAChB,eAAe,uCAAA,GAA0C,KAAA;AAAA;AAAA,oBAEzD,QAAQ,CAAA,IAAK;AAAA,mBACjB;AAAA,kBACA,KAAA,EAAO;AAAA,oBACH,MAAA,EAAQ,MAAA;AAAA,oBACR,iBAAiB,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,EAAA,CAAA,GAAO,MAAA;AAAA,oBACpD,aAAa,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,EAAA,CAAA,GAAO,MAAA;AAAA,oBAChD,eAAA,EAAiB,KAAA;AAAA,oBACjB,eAAA,EAAiB,MAAM,KAAA,IAAS;AAAA,mBACpC;AAAA,kBACA,OAAA,EAAS,CAAC,CAAA,KAAM;AACZ,oBAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,oBAAA,YAAA,GAAe,KAAK,CAAA;AAAA,kBACxB,CAAA;AAAA,kBACA,KAAA,EAAO,KAAA,GAAQ,CAAA,GAAI,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,EAAA,EAAK,KAAA,GAAQ,CAAC,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAA,GAAM;AAAA,iBAAA;AAAA,gCAE9DA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iEACXA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA;AAAA,kBAAG,yDAAA;AAAA,kBACf,eAAe,qBAAA,GAAwB;AAAA,iBAC3C,EAAA,EACK,KAAA,CAAM,KACX,CAAA,EACC,CAAC,YAAA,oBACEA,gBAAAA,CAAA,aAAA,CAAAA,gBAAAA,CAAA,QAAA,EAAA,IAAA,kBACIA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6EAAA,EAAA,EACVC,MAAAA,CAAO,eAAA,EAAiB,eAAA,EAAiB,EAAE,MAAA,EAAQ,CAAA,EAAE,KAAA,EAAIA,MAAAA,CAAO,aAAA,EAAe,eAAA,EAAiB,EAAE,QAAQ,CAC/G,CAAA,EACC,KAAA,CAAM,WAAA,IAAe,MAAA,GAAS,EAAA,oBAC3BD,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6EAAA,EAAA,EACV,KAAA,CAAM,WACX,CAER,CAAA,EAGH,KAAA,GAAQ,CAAA,IAAK,CAAC,YAAA,oBACXA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0LAAA,EAAA,EACV,KACL,CAER;AAAA;AACJ;AACJ,WACJ;AAAA,QAER,CAAC,CAAA,EAGAQ,OAAAA,CAAQ,GAAG,CAAA,oBACZR,gBAAAA,CAAA,aAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACG,SAAA,EAAU,oEAAA;AAAA,YACV,KAAA,EAAO;AAAA,cACL,GAAA,EAAK,CAAA,EAAA,CAAI,QAAA,CAAS,QAAA,EAAS,GAAI,KAAK,QAAA,CAAS,UAAA,EAAW,IAAK,EAAA,GAAK,UAAU,CAAA,EAAA;AAAA;AAC9E,WAAA;AAAA,0BAEAA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wEAAA,EAAyE,CAAA;AAAA,0BACxFA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qHAAA,EAAsH;AAAA,SAG7I,CAAA;AAAA,MAEJ,CAAC,CACH;AAAA,KACF;AAAA,oBAGAA,gBAAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACG,SAAA,EAAU,qEAAA;AAAA,QACV,KAAA,EAAO;AAAA,UACH,GAAA,EAAK,CAAA,EAAA,CAAI,QAAA,CAAS,QAAA,EAAS,GAAI,EAAA,GAAK,QAAA,CAAS,UAAA,EAAW,IAAK,EAAA,GAAK,UAAA,GAAa,EAAE,CAAA,EAAA;AAAA;AACrF,OAAA;AAAA,sBAEAA,gBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iIAAA,EAAA,EACXC,MAAAA,CAAO,QAAA,EAAU,SAAA,EAAW,EAAE,MAAA,EAAQ,CAC3C;AAAA;AACJ,GAEJ,CAAA;AAEJ,CAAA;ACvVO,IAAM,UAAkC,CAAC;AAAA,EAC9C,WAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,IAAG,EAAG,CAAC,CAAA,EAAG,CAAA,KAAM,CAAC,CAAA;AACpD,EAAA,MAAM,UAAA,GAAa,EAAA;AACnB,EAAA,MAAM,kBAAA,GAAqBD,gBAAAA,CAAM,MAAA,CAAuB,IAAI,CAAA;AAE5D,EAAA,MAAM,CAAC,KAAK,MAAM,CAAA,GAAIA,iBAAM,QAAA,iBAAS,IAAI,MAAM,CAAA;AAE/C,EAAAA,gBAAAA,CAAM,UAAU,MAAM;AACpB,IAAA,MAAM,QAAA,GAAW,YAAY,MAAM,MAAA,qBAAW,IAAA,EAAM,GAAG,GAAK,CAAA;AAC5D,IAAA,OAAO,MAAM,cAAc,QAAQ,CAAA;AAAA,EACrC,CAAA,EAAG,EAAE,CAAA;AAGL,EAAAA,gBAAAA,CAAM,UAAU,MAAM;AACpB,IAAA,IAAI,mBAAmB,OAAA,EAAS;AAC5B,MAAA,MAAM,qBAAqB,MAAM;AAC7B,QAAA,MAAM,WAAA,GAAc,IAAI,QAAA,EAAS;AACjC,QAAA,MAAM,UAAA,GAAa,CAAA;AACnB,QAAA,OAAA,CAAQ,cAAc,UAAA,IAAc,UAAA;AAAA,MACxC,CAAA;AACF,MAAA,kBAAA,CAAmB,OAAA,CAAQ,YAAY,kBAAA,EAAmB;AAAA,IAC5D;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,YAAA,GAAe,CAAC,IAAA,KAAe;AACnC,IAAA,OAAO,QAAA,GAAWY,WAAAA,CAAY,IAAA,EAAM,QAAQ,CAAA,GAAI,IAAA;AAAA,EAClD,CAAA;AAEA,EAAA,MAAM,QAAA,GAAW,aAAa,GAAG,CAAA;AAGjC,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,CAAA,CAAA,KAAK;AACnC,IAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAK,CAAA;AACvC,IAAA,OAAON,SAAAA,CAAU,YAAY,WAAW,CAAA;AAAA,EAC1C,CAAC,CAAA;AAED,EAAA,MAAM,KAAA,GAAQ,gBAAgB,MAAM,CAAA;AACpC,EAAA,MAAM,UAAA,GAAa,QAAQ,MAAA,GAAS,KAAA;AACpC,EAAA,MAAM,eAAA,GAAkB,QAAQ,MAAA,GAAS,QAAA;AACzC,EAAA,MAAM,SAAA,GAAY,QAAQ,MAAA,GAAS,QAAA;AAEnC,EAAA,uBACEN,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8HAEXA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,4HAAA,EAAA,kBACXA,gBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,wCAAA,EAAA,kBACXA,gBAAAA,CAAA,cAAC,IAAA,EAAA,EAAG,SAAA,EAAU,kDAAA,EAAA,EACTC,MAAAA,CAAO,aAAa,oBAAA,EAAsB,EAAE,MAAA,EAAQ,CACzD,CAAA,EACCO,OAAAA,CAAQ,WAAW,CAAA,oBAChBR,gBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iHAA8G,OAE9H,CAER,CACJ,CAAA,kBAGAA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,oBAAoB,SAAA,EAAU,iCAAA,EAAA,kBACpCA,gBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EAAgB,KAAA,EAAO,EAAE,MAAA,EAAQ,KAAA,CAAM,MAAA,GAAS,UAAA,sBAE3DA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,4DAAA,EAAA,EACT,KAAA,CAAM,IAAI,CAAC,IAAA,qBACTA,gBAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,GAAA,EAAK,IAAA;AAAA,MACL,SAAA,EAAU,iBAAA;AAAA,MACV,KAAA,EAAO,EAAE,MAAA,EAAQ,UAAA;AAAW,KAAA;AAAA,IAE3B,IAAA,KAAS,qBACNA,gBAAAA,CAAA,cAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mKAAA,EAAA,EACXC,MAAAA,CAAAA,iBAAO,IAAI,IAAA,IAAO,QAAA,CAAS,IAAA,EAAM,GAAG,CAAA,EAAG,CAAC,GAAG,UAAA,EAAY,EAAE,MAAA,EAAQ,CACtE;AAAA,GAGV,CAAA,EAGAO,OAAAA,CAAQ,WAAW,CAAA,oBAChBR,gBAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,SAAA,EAAU,uEAAA;AAAA,MACV,KAAA,EAAO;AAAA,QACH,GAAA,EAAK,CAAA,EAAA,CAAI,QAAA,CAAS,QAAA,EAAS,GAAI,KAAK,QAAA,CAAS,UAAA,EAAW,IAAK,EAAA,GAAK,UAAU,CAAA,EAAA;AAAA;AAChF,KAAA;AAAA,oBAEAA,gBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+GAAA,EAAA,EACXC,MAAAA,CAAO,QAAA,EAAU,SAAA,EAAW,EAAE,MAAA,EAAQ,CAC3C;AAAA,GAGb,CAAA,kBAGAD,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EAAA,EACT,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACjB,IAAA,uBACGA,gBAAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACG,GAAA,EAAK,IAAA;AAAA,QACL,SAAA,EAAU,yGAAA;AAAA,QACV,KAAA,EAAO,EAAE,MAAA,EAAQ,UAAA;AAAW,OAAA;AAAA,MAG3B,CAAC,GAAG,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA,CAAE,GAAA,CAAI,CAAC,MAAA,KAAW;AAC7B,QAAA,MAAM,QAAA,GAAW,IAAI,IAAA,CAAK,WAAW,CAAA;AACrC,QAAA,QAAA,CAAS,QAAA,CAAS,IAAA,EAAM,MAAA,EAAQ,CAAA,EAAG,CAAC,CAAA;AACpC,QAAA,MAAM,MAAA,GAAS,SAAS,WAAA,EAAY;AAEpC,QAAA,uBACIA,gBAAAA,CAAA,aAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YACG,GAAA,EAAK,MAAA;AAAA,YACL,EAAA,EAAI,MAAA;AAAA,YACJ,IAAA,EAAM,QAAA;AAAA,YACN,SAAA,EAAU,sDAAA;AAAA,YACV,KAAA,EAAO;AAAA,cACH,MAAA,EAAQ,KAAA;AAAA,cACR,GAAA,EAAK,CAAA,EAAI,MAAA,GAAS,EAAA,GAAM,GAAG,CAAA,CAAA;AAAA;AAC/B,WAAA;AAAA,0BAEAA,gBAAAA,CAAA,aAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACG,SAAA,EAAU,6CAAA;AAAA,cACV,OAAA,EAAS,MAAM,eAAA,GAAkB,QAAQ;AAAA;AAAA;AAC7C,SACJ;AAAA,MAER,CAAC;AAAA,KACL;AAAA,EAEP,CAAC,CAAA,EAEA,SAAA,CAAU,GAAA,CAAI,CAAA,KAAA,KAAS;AAEtB,IAAA,MAAM,iBAAA,GAAoB,SAAA,CAAU,MAAA,CAAO,CAAA,CAAA,KAAK;AAC5C,MAAA,IAAI,CAAA,CAAE,EAAA,KAAO,KAAA,CAAM,EAAA,EAAI,OAAO,KAAA;AAC9B,MAAA,MAAM,EAAA,GAAK,YAAA,CAAa,KAAA,CAAM,KAAK,EAAE,OAAA,EAAQ;AAC7C,MAAA,MAAM,EAAA,GAAK,YAAA,CAAa,KAAA,CAAM,GAAG,EAAE,OAAA,EAAQ;AAC3C,MAAA,MAAM,EAAA,GAAK,YAAA,CAAa,CAAA,CAAE,KAAK,EAAE,OAAA,EAAQ;AACzC,MAAA,MAAM,EAAA,GAAK,YAAA,CAAa,CAAA,CAAE,GAAG,EAAE,OAAA,EAAQ;AACvC,MAAA,OAAO,EAAA,GAAK,MAAM,EAAA,GAAK,EAAA;AAAA,IAC3B,CAAC,CAAA;AAGD,IAAA,MAAM,KAAA,GAAQ,CAAC,KAAA,EAAO,GAAG,iBAAiB,CAAA,CAAE,IAAA;AAAA,MAAK,CAAC,CAAA,EAAG,CAAA,KACjD,aAAa,CAAA,CAAE,KAAK,EAAE,OAAA,EAAQ,GAAI,aAAa,CAAA,CAAE,KAAK,EAAE,OAAA,EAAQ,KAC/D,EAAE,EAAA,GAAK,CAAA,CAAE,KAAK,CAAA,GAAI,EAAA;AAAA,KACvB;AAEA,IAAA,MAAM,QAAQ,KAAA,CAAM,SAAA,CAAU,OAAK,CAAA,CAAE,EAAA,KAAO,MAAM,EAAE,CAAA;AACpD,IAAA,MAAM,QAAQ,KAAA,CAAM,MAAA;AAEpB,IAAA,MAAM,eAAe,GAAA,GAAM,KAAA;AAC3B,IAAA,MAAM,cAAc,KAAA,GAAQ,YAAA;AAE5B,IAAA,MAAM,UAAA,GAAa,YAAA,CAAa,KAAA,CAAM,KAAK,CAAA;AAC3C,IAAA,MAAM,QAAA,GAAW,YAAA,CAAa,KAAA,CAAM,GAAG,CAAA;AAEvC,IAAA,MAAM,eAAe,UAAA,CAAW,QAAA,EAAS,GAAI,EAAA,GAAK,WAAW,UAAA,EAAW;AACxE,IAAA,MAAM,eAAA,GAAkBgB,mBAAAA,CAAoB,QAAA,EAAU,UAAU,CAAA;AAChE,IAAA,MAAM,GAAA,GAAO,eAAe,EAAA,GAAM,UAAA;AAClC,IAAA,MAAM,MAAA,GAAU,kBAAkB,EAAA,GAAM,UAAA;AAExC,IAAA,MAAM,eAAe,eAAA,GAAkB,EAAA;AAEvC,IAAA,uBACEhB,gBAAAA,CAAA,aAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACE,KAAK,CAAA,EAAG,KAAA,CAAM,EAAE,CAAA,CAAA,EAAI,WAAA,CAAY,aAAa,CAAA,CAAA;AAAA,QAC7C,KAAA;AAAA,QACA,SAAA,EAAW,CAAA,6BAAA,EAAgC,QAAA,GAAW,gBAAA,GAAmB,EAAE,CAAA,CAAA;AAAA,QAC3E,KAAA,EAAO;AAAA,UACH,GAAA,EAAK,GAAG,GAAG,CAAA,EAAA,CAAA;AAAA,UACX,QAAQ,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,EAAE,CAAC,CAAA,EAAA,CAAA;AAAA,UAC/B,IAAA,EAAM,QAAQ,WAAW,CAAA,QAAA,CAAA;AAAA,UACzB,KAAA,EAAO,QAAQ,YAAY,CAAA,QAAA,CAAA;AAAA,UAC3B,YAAA,EAAc,KAAA,GAAQ,CAAA,GAAI,KAAA,GAAQ;AAAA;AACtC,OAAA;AAAA,sBAEAA,gBAAAA,CAAA,aAAA;AAAA,QAAC,cAAA;AAAA,QAAA;AAAA,UACG,QAAA;AAAA,UACA,KAAA;AAAA,UACA,UAAA;AAAA,UACA,QAAA,EAAU,aAAA;AAAA,UACV,SAAA,EAAU,QAAA;AAAA,UACV,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAA;AAAO,SAAA;AAAA,wBAExBA,gBAAAA,CAAA,aAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACG,SAAA,EAAW,EAAA;AAAA,cACP,4GAAA;AAAA,cACA,wBAAA;AAAA,cACA,QAAA,IAAY,mBAAA,CAAoB,KAAK,CAAA,GAAI,gBAAA,GAAmB,oCAAA;AAAA,cAC5D,CAAC,MAAM,KAAA,IAAS,iCAAA;AAAA,cAChB,eAAe,wBAAA,GAA2B,WAAA;AAAA,cAC1C,QAAQ,CAAA,IAAK;AAAA,aACjB;AAAA,YACA,KAAA,EAAO;AAAA,cACH,iBAAiB,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,EAAA,CAAA,GAAO,MAAA;AAAA,cACpD,aAAa,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,EAAA,CAAA,GAAO,MAAA;AAAA,cAChD,eAAA,EAAiB,MAAM,KAAA,IAAS,gBAAA;AAAA,cAChC,eAAA,EAAiB,KAAA,GAAQ,CAAA,GAAI,KAAA,GAAQ;AAAA,aACzC;AAAA,YACA,OAAA,EAAS,CAAC,CAAA,KAAM;AACZ,cAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,cAAA,YAAA,GAAe,KAAK,CAAA;AAAA,YACxB,CAAA;AAAA,YACA,KAAA,EAAO,KAAA,GAAQ,CAAA,GAAI,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,EAAA,EAAK,KAAA,GAAQ,CAAC,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAA,GAAM;AAAA,WAAA;AAAA,0BAE9DA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iEACXA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA;AAAA,YACZ,sCAAA;AAAA,YACA,eAAe,SAAA,GAAY,SAAA;AAAA,YAC3B,KAAA,CAAM,QAAQ,iBAAA,GAAoB;AAAA,WACtC,EAAA,EACK,KAAA,CAAM,KACX,CAAA,EACC,CAAC,YAAA,oBACEA,gBAAAA,CAAA,aAAA,CAAAA,gBAAAA,CAAA,QAAA,EAAA,IAAA,kBACIA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kDAAA,EAAA,EACVC,MAAAA,CAAO,UAAA,EAAY,eAAA,EAAiB,EAAE,MAAA,EAAQ,CAAA,EAAE,KAAA,EAAIA,MAAAA,CAAO,QAAA,EAAU,eAAA,EAAiB,EAAE,QAAQ,CACrG,CAAA,EACC,KAAA,CAAM,WAAA,IAAe,MAAA,GAAS,EAAA,oBAC3BD,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oDAAA,EAAA,EACV,KAAA,CAAM,WACX,CAER,CAAA,EAGH,KAAA,GAAQ,CAAA,IAAK,CAAC,YAAA,oBACXA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+LAAA,EAAA,EACV,KACL,CAER;AAAA;AACJ;AACJ,KACH;AAAA,EAEJ,CAAC,CAAA,EAGAQ,OAAAA,CAAQ,WAAW,CAAA,oBAClBR,gBAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,oEAAA;AAAA,MACV,KAAA,EAAO;AAAA,QACL,GAAA,EAAK,CAAA,EAAA,CAAI,QAAA,CAAS,QAAA,EAAS,GAAI,KAAK,QAAA,CAAS,UAAA,EAAW,IAAK,EAAA,GAAK,UAAU,CAAA,EAAA;AAAA;AAC9E,KAAA;AAAA,oBAGAA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wEAAA,EAAyE,CAAA;AAAA,oBAExFA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qHAAA,EAAsH;AAAA,GAG9I,CACJ,CACJ,CACJ,CAAA;AAEJ,CAAA;ACjLO,IAAM,gBAAA,GASR,CAAC,EAAE,aAAA,EAAe,YAAA,EAAa,qBAClCA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sEAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+HAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CACbA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0FAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CAAA,EAA6C,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,CAAA,EAAA,kBAC7HA,gBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA,EAAE,gBAAA,EAAiB,CACxE,CACF,CAAA,kBACAA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EAAA,EAA+B,YAAA,EAAc,WAAA,IAAe,gBAAiB,CAAA,kBAC5FA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EAAA,EAAiC,YAAA,EAAc,iBAAA,IAAqB,qBAAsB,CAC3G,CACF,CACF,CACF,CAAA,kBAEAA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,4CAAA,EAAA,EACX,YAAA,EAAc,UAAA,IAAc,wBAC/B,CAAA,kBACAA,gBAAAA,CAAA,aAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oCAAA,EAAA,EACV,YAAA,EAAc,cAAA,IAAkB,mEACnC,CAAA,EAEC,aAAA,oBACCA,gBAAAA,CAAA,aAAA;AAAA,EAAC,QAAA;AAAA,EAAA;AAAA,IACC,OAAA,EAAS,aAAA;AAAA,IACT,SAAA,EAAU;AAAA,GAAA;AAAA,kBAEVA,gBAAAA,CAAA,aAAA,CAACiB,IAAAA,EAAA,EAAK,WAAU,SAAA,EAAU,CAAA;AAAA,EACzB,cAAc,WAAA,IAAe;AAChC,CAEJ,CACF,CAAA;ACzIF,IAAM,cAAA,GAAiB,CAAC,KAAA,EAAa,GAAA,KAAsB;AACzD,EAAA,MAAM,OAAA,GAAUD,mBAAAA,CAAoB,GAAA,EAAK,KAAK,CAAA;AAC9C,EAAA,IAAI,OAAA,GAAU,EAAA,EAAI,OAAO,CAAA,EAAG,OAAO,CAAA,CAAA,CAAA;AACnC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AACrC,EAAA,MAAM,mBAAmB,OAAA,GAAU,EAAA;AACnC,EAAA,IAAI,gBAAA,KAAqB,CAAA,EAAG,OAAO,CAAA,EAAG,KAAK,CAAA,CAAA,CAAA;AAC3C,EAAA,OAAO,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,gBAAgB,CAAA,CAAA,CAAA;AACtC,CAAA;AAEA,IAAM,YAAA,GAAe,CACnB,IAAA,EACA,MAAA,EACA,YAAA,KACW;AACX,EAAA,IAAIR,OAAAA,CAAQ,IAAI,CAAA,EAAG,OAAO,cAAc,KAAA,IAAS,OAAA;AACjD,EAAA,IAAI,UAAA,CAAW,IAAI,CAAA,EAAG,OAAO,cAAc,QAAA,IAAY,UAAA;AACvD,EAAA,OAAOP,MAAAA,CAAO,IAAA,EAAM,MAAA,EAAQ,EAAE,QAAQ,CAAA;AACxC,CAAA;AAEO,IAAM,aAAwC,CAAC;AAAA,EACpD,WAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,KAAM;AAGJ,EAAA,MAAM,KAAA,GAAQ,gBAAgB,MAAM,CAAA;AACpC,EAAA,MAAM,WAAA,GAAc,QAAQ,MAAA,GAAS,QAAA;AACrC,EAAA,MAAM,kBAAA,GAAqB,QAAQ,MAAA,GAAS,MAAA;AAE5C,EAAA,MAAM,aAAA,GAAgBiB,QAAQ,MAAM;AAClC,IAAA,MAAM,SAAA,GAAY,WAAW,WAAW,CAAA;AAExC,IAAA,MAAM,SAAoD,EAAC;AAG3D,IAAA,MAAM,eAAe,CAAC,GAAG,MAAM,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,MAAM,OAAA,EAAQ,GAAI,CAAA,CAAE,KAAA,CAAM,SAAS,CAAA;AAGrF,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AACzB,MAAA,MAAM,GAAA,GAAMC,OAAAA,CAAQ,SAAA,EAAW,CAAC,CAAA;AAChC,MAAA,MAAM,SAAA,GAAY,aAAa,MAAA,CAAO,CAAA,KAAA,KAASb,UAAU,KAAA,CAAM,KAAA,EAAO,GAAG,CAAC,CAAA;AAE1E,MAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACtB,QAAA,MAAA,CAAO,KAAK,EAAE,IAAA,EAAM,GAAA,EAAK,MAAA,EAAQ,WAAW,CAAA;AAAA,MAChD;AAAA,IACJ;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,EAAG,CAAC,WAAA,EAAa,MAAM,CAAC,CAAA;AAExB,EAAA,MAAM,SAAA,GAAY;AAAA,IAChB,MAAA,EAAQ,EAAE,OAAA,EAAS,CAAA,EAAE;AAAA,IACrB,IAAA,EAAM;AAAA,MACJ,OAAA,EAAS,CAAA;AAAA,MACT,UAAA,EAAY;AAAA,QACV,eAAA,EAAiB;AAAA;AACnB;AACF,GACF;AAEA,EAAA,MAAM,IAAA,GAAO;AAAA,IACX,MAAA,EAAQ,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,GAAA,EAAI;AAAA,IAC7B,IAAA,EAAM,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,CAAA;AAAE,GAC3B;AAEA,EAAA,uBACEN,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wDACZ,aAAA,CAAc,MAAA,KAAW,CAAA,mBACxBA,iBAAA,aAAA,CAAC,gBAAA,EAAA,EAAiB,eAA8B,YAAA,EAA4B,CAAA,mBAE5EA,gBAAAA,CAAA,aAAA;AAAA,IAAC,MAAA,CAAO,GAAA;AAAA,IAAP;AAAA,MACC,SAAA,EAAU,6CAAA;AAAA,MACV,QAAA,EAAU,SAAA;AAAA,MACV,OAAA,EAAQ,QAAA;AAAA,MACR,OAAA,EAAQ;AAAA,KAAA;AAAA,IAEL,cAAc,GAAA,CAAI,CAAC,KAAA,EAAO,UAAA,qBACvBA,gBAAAA,CAAA,aAAA;AAAA,MAAC,MAAA,CAAO,GAAA;AAAA,MAAP;AAAA,QACC,GAAA,EAAK,KAAA,CAAM,IAAA,CAAK,WAAA,EAAY;AAAA,QAC5B,SAAA,EAAU,UAAA;AAAA,QACV,QAAA,EAAU;AAAA,OAAA;AAAA,sBAGRA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wGACbA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EAAA,kBAEbA,gBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAW,EAAA;AAAA,QACd,gFAAA;AAAA,QACAQ,OAAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,GACd,gEAAA,GACA;AAAA,2BAEJR,gBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,WAAU,iCAAA,EAAA,EACbC,MAAAA,CAAO,KAAA,CAAM,IAAA,EAAM,GAAG,CACzB,CAAA,kBACAD,gBAAAA,CAAA,aAAA,CAAC,UAAK,SAAA,EAAU,wDAAA,EAAA,EACbC,MAAAA,CAAO,KAAA,CAAM,MAAM,KAAA,EAAO,EAAE,QAAQ,CACvC,CACF,CAAA,kBAGAD,gBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,eAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA,CAAC,UAAK,SAAA,EAAW,EAAA;AAAA,QACf,uBAAA;AAAA,QACAQ,OAAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,IAAK;AAAA,OACzB,EAAA,EACG,YAAA,CAAa,KAAA,CAAM,IAAA,EAAM,MAAA,EAAQ,YAAY,CAChD,CAAA,kBACAR,gBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,WAAU,+BAAA,EAAA,EACb,KAAA,CAAM,MAAA,CAAO,MAAA,EAAQ,GAAA,EACrB,KAAA,CAAM,MAAA,CAAO,MAAA,KAAW,CAAA,GACpB,YAAA,EAAc,WAAA,IAAe,QAAA,GAC7B,YAAA,EAAc,aAAA,IAAiB,OACtC,CACF,CACF,CACF,CAAA;AAAA,sBAGAA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EAAA,EACV,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,EAAO,UAAA,qBACtBA,gBAAAA,CAAA,aAAA;AAAA,QAAC,MAAA,CAAO,GAAA;AAAA,QAAP;AAAA,UACG,KAAK,KAAA,CAAM,EAAA;AAAA,UACX,OAAA,EAAS,MAAM,YAAA,GAAe,KAAK,CAAA;AAAA,UACnC,SAAA,EAAW,EAAA;AAAA,YACT,mEAAA;AAAA,YACA,gEAAA;AAAA,YACA,4CAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA,UAAA,EAAY,EAAE,KAAA,EAAO,IAAA,EAAM,GAAG,EAAA,EAAG;AAAA,UACjC,UAAA,EAAY,EAAE,QAAA,EAAU,GAAA;AAAI,SAAA;AAAA,wBAG5BA,gBAAAA,CAAA,aAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,iDAAA;AAAA,YACV,KAAA,EAAO,EAAE,eAAA,EAAiB,KAAA,CAAM,SAAS,gBAAA;AAAiB;AAAA,SAC5D;AAAA,wBAGAA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kDACV,KAAA,CAAM,MAAA,mBACHA,gBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gDACbA,gBAAAA,CAAA,cAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kFAAA,EAAA,EACb,YAAA,EAAc,UAAU,SAC3B,CACF,CAAA,mBAEAA,iBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA,CAAC,UAAK,SAAA,EAAU,yCAAA,EAAA,EACbC,OAAO,KAAA,CAAM,KAAA,EAAO,kBAAA,EAAoB,EAAE,QAAQ,CACrD,CAAA,EACC,CAAC,yBACAD,gBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,WAAU,yCAAA,EAAA,EACbC,MAAAA,CAAO,MAAM,KAAA,EAAO,GAAG,CAC1B,CAAA,kBAEFD,gBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,yBAAA,EAA0B,CAAA,kBACzCA,iBAAA,aAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8CAAA,EAAA,EACb,eAAe,KAAA,CAAM,KAAA,EAAO,MAAM,GAAG,CACxC,CACF,CAER,CAAA;AAAA,wBAGAA,iBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,0BAAA,EAAA,kBACXA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4DACbA,gBAAAA,CAAA,cAAC,IAAA,EAAA,EAAG,SAAA,EAAU,qGACT,KAAA,CAAM,KACX,CAAA,kBAEAA,gBAAAA,CAAA,aAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,sCAAA;AAAA,YACV,KAAA,EAAO,EAAE,eAAA,EAAiB,KAAA,CAAM,SAAS,gBAAA;AAAiB;AAAA,SAE9D,CAAA,EAEC,KAAA,CAAM,WAAA,oBACHA,gBAAAA,CAAA,aAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,gEACR,KAAA,CAAM,WACX,CAAA,kBAIJA,iBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EAAA,EACZ,CAAC,KAAA,CAAM,MAAA,oBACNA,gBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yDAAA,EAAA,kBACbA,iBAAA,aAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,aAAA,EAAc,mBAC/BA,gBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,IAAA,EAAMC,OAAO,KAAA,CAAM,KAAA,EAAO,WAAA,EAAa,EAAE,QAAQ,CAAA,EAAE,KAAA,EAAIA,MAAAA,CAAO,MAAM,GAAA,EAAK,WAAA,EAAa,EAAE,MAAA,EAAQ,CAAE,CACrG,CAAA,EAGD,KAAA,CAAM,UAAU,KAAA,CAAM,MAAA,CAAO,MAAA,GAAS,CAAA,oBACrCD,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6EACbA,gBAAAA,CAAA,aAAA,CAACoB,KAAAA,EAAA,EAAM,SAAA,EAAU,aAAA,EAAc,CAAA,kBAC/BpB,gBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,IAAA,EACE,KAAA,CAAM,OAAO,MAAA,EAAQ,GAAA,EACrB,KAAA,CAAM,MAAA,CAAO,WAAW,CAAA,GACpB,YAAA,EAAc,WAAA,IAAe,QAAA,GAC7B,cAAc,UAAA,IAAc,OACnC,CACF,CAAA,EAGD,MAAM,WAAA,IAAe,KAAA,CAAM,WAAA,CAAY,MAAA,GAAS,qBAC/CA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yDAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA,CAAC,aAAU,SAAA,EAAU,aAAA,EAAc,CAAA,kBACnCA,iBAAA,aAAA,CAAC,MAAA,EAAA,IAAA,EAAM,KAAA,CAAM,WAAA,CAAY,MAAO,CAClC,CAAA,EAGD,KAAA,CAAM,SAAA,IAAa,MAAM,SAAA,CAAU,MAAA,GAAS,CAAA,oBAC3CA,iBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yDAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,eAAc,CAAA,kBAC9BA,gBAAAA,CAAA,aAAA,CAAC,cAAM,KAAA,CAAM,SAAA,CAAU,MAAO,CAChC,CAEJ,CACJ,CAAA;AAAA,wBAGAA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gGAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EAAgC,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAAA,kBAC/GA,gBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,eAAA,EAAgB,CAC1B,CACF;AAAA,OAEP,CACL;AAAA,KAEP;AAAA,GAGT,CAAA;AAEJ,CAAA;AChPO,IAAM,eAA4C,CAAC;AAAA,EACxD,WAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,YAAA,GAAec,OAAuB,IAAI,CAAA;AAIhD,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,IAAG,EAAG,CAAC,CAAA,EAAG,CAAA,KAAM,CAAC,CAAA;AACpD,EAAA,MAAM,SAAA,GAAY,GAAA;AAElB,EAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,MAAM,CAAA,GAAI,MAAA,GAAS,KAAA;AAEtD,EAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAAyB;AAC9C,IAAA,MAAM,KAAA,GAAQ,IAAI,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAClC,IAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC9B,IAAA,MAAM,QAAA,GAAWO,WAAW,WAAW,CAAA;AAGvC,IAAA,MAAM,YAAA,GAAeL,mBAAAA,CAAoB,KAAA,EAAO,QAAQ,CAAA;AACxD,IAAA,MAAM,eAAA,GAAkBA,mBAAAA,CAAoB,GAAA,EAAK,KAAK,CAAA;AAEtD,IAAA,MAAM,IAAA,GAAQ,eAAe,EAAA,GAAM,SAAA;AACnC,IAAA,MAAM,KAAA,GAAS,kBAAkB,EAAA,GAAM,SAAA;AAEvC,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,GAAG,IAAI,CAAA,EAAA,CAAA;AAAA,MACb,OAAO,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,CAAC,CAAC,CAAA,EAAA;AAAA;AAAA,KAC9B;AAAA,EACF,CAAA;AAEA,EAAA,uBACEhB,gBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,oDAAA,EAAA,kBAEbA,gBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,yCAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,iGAAA,EAAA,EAAkG,WAEjH,CAAA,kBACAA,iBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,sBAAA,EAAA,kBACVA,iBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,eAAA,EAAgB,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,CAAM,SAAS,SAAA,EAAU,EAAA,EACpE,MAAM,GAAA,CAAI,CAAA,IAAA,qBACPA,gBAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,GAAA,EAAK,IAAA;AAAA,MACL,SAAA,EAAU,kFAAA;AAAA,MACV,KAAA,EAAO,EAAE,KAAA,EAAO,SAAA;AAAU,KAAA;AAAA,IAEzBC,MAAAA,CAAAA,iBAAO,IAAI,IAAA,EAAK,EAAE,QAAA,CAAS,IAAA,EAAM,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,EAAG,UAAA,EAAY,EAAE,QAAQ;AAAA,GAEzE,CACJ,CACL,CACF,mBAGAD,gBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAgC,GAAA,EAAK,YAAA,EAAA,kBACjDA,gBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,WAAA,EAAA,EACX,SAAA,CAAU,GAAA,CAAI,CAAA,QAAA,KAAY;AACvB,IAAA,MAAM,iBAAiB,MAAA,CAAO,MAAA;AAAA,MAAO,CAAA,CAAA,KACjC,CAAA,CAAE,UAAA,KAAe,QAAA,CAAS,EAAA,IAC1BM,SAAAA,CAAU,IAAI,IAAA,CAAK,CAAA,CAAE,KAAK,CAAA,EAAG,WAAW;AAAA,KAC5C;AAEA,IAAA,uBACIN,gBAAAA,CAAA,aAAA,CAAC,SAAI,GAAA,EAAK,QAAA,CAAS,IAAI,SAAA,EAAU,2CAAA,EAAA,kBAE7BA,gBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,mGAAA,EAAA,EACV,SAAS,MAAA,mBACNA,iBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,QAAA,CAAS,QAAQ,GAAA,EAAK,QAAA,CAAS,OAAO,SAAA,EAAU,mCAAA,EAAoC,oBAE9FA,gBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wGACV,QAAA,CAAS,KAAA,CAAM,UAAU,CAAA,EAAG,CAAC,EAAE,WAAA,EACpC,CAAA,kBAEJA,iBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,eAAA,EAAA,kBACXA,iBAAA,aAAA,CAAC,MAAA,EAAA,EAAK,WAAU,qBAAA,EAAA,EAAuB,QAAA,CAAS,KAAM,CAAA,kBACtDA,iBAAA,aAAA,CAAC,MAAA,EAAA,EAAK,WAAU,+BAAA,EAAA,EAAgC,MAAA,EAAK,SAAS,EAAG,CACrE,CACJ,CAAA,kBAGAA,iBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,eAAA,EAAgB,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,CAAM,SAAS,SAAA,EAAU,EAAA,EAEnE,MAAM,GAAA,CAAI,CAAA,IAAA,qBACPA,gBAAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACG,GAAA,EAAK,IAAA;AAAA,QACL,SAAA,EAAU,sBAAA;AAAA,QACV,KAAA,EAAO,EAAE,KAAA,EAAO,SAAA;AAAU,OAAA;AAAA,MAEzB,CAAC,CAAA,EAAG,EAAA,EAAI,IAAI,EAAE,CAAA,CAAE,IAAI,CAAA,MAAA,KAAU;AAC3B,QAAA,MAAM,QAAA,GAAW,IAAI,IAAA,CAAK,WAAW,CAAA;AACrC,QAAA,QAAA,CAAS,QAAA,CAAS,IAAA,EAAM,MAAA,EAAQ,CAAA,EAAG,CAAC,CAAA;AACpC,QAAA,MAAM,SAAS,CAAA,EAAG,QAAA,CAAS,EAAE,CAAA,CAAA,EAAI,QAAA,CAAS,aAAa,CAAA,CAAA;AAEvD,QAAA,uBACIA,gBAAAA,CAAA,aAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YACG,GAAA,EAAK,MAAA;AAAA,YACL,EAAA,EAAI,MAAA;AAAA,YACJ,IAAA,EAAM,QAAA;AAAA,YACN,YAAY,QAAA,CAAS,EAAA;AAAA,YACrB,SAAA,EAAU,oGAAA;AAAA,YACV,SAAS,MAAM;AACX,cAAA,eAAA,GAAkB,QAAA,EAAU,SAAS,EAAE,CAAA;AAAA,YAC3C;AAAA;AAAA,SACJ;AAAA,MAER,CAAC;AAAA,KAER,CAAA,EAGA,cAAA,CAAe,GAAA,CAAI,CAAA,KAAA,qBAChBA,gBAAAA,CAAA,aAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACG,KAAK,KAAA,CAAM,EAAA;AAAA,QACX,KAAA;AAAA,QACA,OAAA,EAAS,CAAC,CAAA,KAAM;AACZ,UAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,UAAA,YAAA,GAAe,KAAK,CAAA;AAAA,QACxB,CAAA;AAAA,QACA,SAAA,EAAU,0JAAA;AAAA,QACV,KAAA,EAAO;AAAA,UACH,GAAG,cAAc,KAAK,CAAA;AAAA,UACtB,eAAA,EAAiB,KAAA,CAAM,KAAA,IAAS,QAAA,CAAS,KAAA,IAAS,gBAAA;AAAA,UAClD,WAAA,EAAa,iBAAA;AAAA,UACb,KAAA,EAAO;AAAA;AACX,OAAA;AAAA,sBAEAA,gBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,UAAA,EAAA,EAAY,MAAM,KAAM;AAAA,KAE9C,CACL,CACJ,CAAA;AAAA,EAER,CAAC,CACJ,CACH,CACF,CAAA;AAEJ,CAAA;ACjJO,IAAM,QAA8B,CAAC;AAAA,EAC1C,MAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA,GAAa;AACf,CAAA,KAAM;AACJ,EAAA,MAAM,UAAA,GAAac,OAAuB,IAAI,CAAA;AAE9C,EAAAQ,UAAU,MAAM;AACd,IAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAAqB;AACzC,MAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,QAAA,OAAA,EAAQ;AAAA,MACV;AAAA,IACF,CAAA;AAEA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,YAAY,CAAA;AAAA,IACnD;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,YAAY,CAAA;AAAA,IACtD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,OAAO,CAAC,CAAA;AAEpB,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAGpB,EAAA,uBACEtB,gBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,yHAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,UAAA;AAAA,MACL,SAAA,EAAU,kBAAA;AAAA,MACV,OAAA,EAAS;AAAA;AAAA,GACX,kBACAA,gBAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,4LAAA;AAAA,QACA;AAAA;AACF,KAAA;AAAA,IAEC,CAAC,UAAA,oBACAA,gBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,6HAAA,EAAA,kBACbA,gBAAAA,CAAA,cAAC,IAAA,EAAA,EAAG,SAAA,EAAU,2CACX,KACH,CAAA,kBACAA,gBAAAA,CAAA,aAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAK,IAAA;AAAA,QACL,OAAA,EAAS,OAAA;AAAA,QACT,SAAA,EAAU;AAAA,OAAA;AAAA,sBAEVA,gBAAAA,CAAA,aAAA,CAAC,CAAA,EAAA,EAAE,WAAU,SAAA,EAAU,CAAA;AAAA,sBACvBA,gBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,aAAU,OAAK;AAAA,KAEnC,CAAA;AAAA,oBAEFA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,wBAAA,EAA0B,CAAC,UAAA,IAAc,KAAK,CAAA,EAAA,EAC9D,QACH;AAAA,GAEJ,CAAA;AAEJ,CAAA;ACpDA,IAAM,gBAAA,GAAmB;AAAA,EACvB,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,kBAAA,EAAmB;AAAA,EACtC,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,kBAAA,EAAmB;AAAA,EACtC,EAAE,KAAA,EAAO,EAAA,EAAI,KAAA,EAAO,mBAAA,EAAoB;AAAA,EACxC,EAAE,KAAA,EAAO,EAAA,EAAI,KAAA,EAAO,mBAAA,EAAoB;AAAA,EACxC,EAAE,KAAA,EAAO,EAAA,EAAI,KAAA,EAAO,mBAAA,EAAoB;AAAA,EACxC,EAAE,KAAA,EAAO,EAAA,EAAI,KAAA,EAAO,eAAA,EAAgB;AAAA,EACpC,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,gBAAA,EAAiB;AAAA,EACtC,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,cAAA,EAAe;AAAA,EACrC,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,eAAA,EAAgB;AAAA,EACtC,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,eAAA;AACzB,CAAA;AAGA,IAAM,aAAA,GAAgB;AAAA,EACpB,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA;AAAA;AACF,CAAA;AAEO,IAAM,aAAwC,CAAC;AAAA,EACpD,MAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIa,SAAqC,QAAQ,CAAA;AACrE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAA2C,SAAS,CAAA;AAEtF,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,QAAAA,CAAiC;AAAA,IAC/D,KAAA,EAAO,EAAA;AAAA,IACP,WAAA,EAAa,EAAA;AAAA,IACb,QAAA,EAAU,EAAA;AAAA,IACV,KAAA,sBAAW,IAAA,EAAK;AAAA,IAChB,GAAA,sBAAS,IAAA,EAAK;AAAA,IACd,MAAA,EAAQ,KAAA;AAAA,IACR,KAAA,EAAO,SAAA;AAAA,IACP,UAAA,EAAY,SAAA,GAAY,CAAC,CAAA,EAAG,EAAA;AAAA,IAC5B,IAAA,EAAM,MAAA;AAAA,IACN,UAAA,EAAY,MAAA;AAAA,IACZ,aAAa,EAAC;AAAA,IACd,SAAA,EAAW,CAAC,EAAE,EAAA,EAAI,GAAA,EAAK,IAAA,EAAM,cAAA,EAAgB,IAAA,EAAM,EAAA,EAAI,KAAA,EAAO,mBAAA,EAAqB;AAAA,GACpF,CAAA;AAED,EAAA,MAAM,CAAC,sBAAA,EAAwB,yBAAyB,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC1E,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIA,SAAS,KAAK,CAAA;AAChE,EAAA,MAAM,CAAC,sBAAA,EAAwB,yBAAyB,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC1E,EAAA,MAAM,CAAC,oBAAA,EAAsB,uBAAuB,CAAA,GAAIA,SAAS,KAAK,CAAA;AAEtE,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,mBAAA;AAAA,IACA,iBAAA;AAAA,IACA,qBAAA;AAAA,IACA,mBAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAqBC,OAAyB,IAAI;AAClD,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAID,QAAAA,CAAmB,EAAE,CAAA;AAEjE,EAAAS,UAAU,MAAM;AACd,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,OAAA,CAAQ,MAAM,CAAA;AACd,QAAA,WAAA,CAAY;AAAA,UACV,GAAG,KAAA;AAAA,UACH,KAAA,EAAO,IAAI,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAAA,UAC3B,GAAA,EAAK,IAAI,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAAA,UACvB,WAAA,EAAa,KAAA,CAAM,WAAA,IAAe,EAAC;AAAA,UACnC,SAAA,EAAW,KAAA,CAAM,SAAA,IAAa,CAAC,EAAE,EAAA,EAAI,GAAA,EAAK,IAAA,EAAM,cAAA,EAAgB,IAAA,EAAM,EAAA,EAAI,KAAA,EAAO,qBAAqB;AAAA,SACvG,CAAA;AACD,QAAA,iBAAA,CAAkB,KAAA,CAAM,MAAA,IAAU,EAAE,CAAA;AAAA,MACtC,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,QAAQ,CAAA;AAChB,QAAA,MAAM,KAAA,GAAQ,WAAA,oBAAe,IAAI,IAAA,EAAK;AACtC,QAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,KAAK,CAAA;AAC1B,QAAA,GAAA,CAAI,QAAA,CAAS,KAAA,CAAM,QAAA,EAAS,GAAI,CAAC,CAAA;AAEjC,QAAA,WAAA,CAAY;AAAA,UACV,KAAA,EAAO,EAAA;AAAA,UACP,WAAA,EAAa,EAAA;AAAA,UACb,QAAA,EAAU,EAAA;AAAA,UACV,KAAA;AAAA,UACA,GAAA;AAAA,UACA,MAAA,EAAQ,KAAA;AAAA,UACR,KAAA,EAAO,SAAA;AAAA,UACP,UAAA,EAAY,SAAA,GAAY,CAAC,CAAA,EAAG,EAAA;AAAA,UAC5B,aAAa,EAAC;AAAA,UACd,SAAA,EAAW,CAAC,EAAE,EAAA,EAAI,GAAA,EAAK,IAAA,EAAM,cAAA,EAAgB,IAAA,EAAM,EAAA,EAAI,KAAA,EAAO,mBAAA,EAAqB;AAAA,SACpF,CAAA;AACD,QAAA,iBAAA,CAAkB,EAAE,CAAA;AACpB,QAAA,YAAA,CAAa,SAAS,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,MAAA,EAAQ,KAAA,EAAO,WAAA,EAAa,SAAS,CAAC,CAAA;AAE1C,EAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAAkB;AACrC,IAAA,iBAAA,CAAkB,CAAA,IAAA,KAAQ;AACtB,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,QAAA,CAAS,KAAK,IAC/B,IAAA,CAAK,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,KAAM,KAAK,CAAA,GAC5B,CAAC,GAAG,MAAM,KAAK,CAAA;AACrB,MAAA,WAAA,CAAY,WAAS,EAAE,GAAG,IAAA,EAAM,MAAA,EAAQ,WAAU,CAAE,CAAA;AACpD,MAAA,OAAO,SAAA;AAAA,IACX,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAAuB;AAC3C,IAAA,CAAA,CAAE,cAAA,EAAe;AAEjB,IAAA,IAAI,aAAa,QAAA,CAAS,KAAA;AAC1B,IAAA,IAAI,QAAA,CAAS,cAAc,SAAA,EAAW;AAClC,MAAA,MAAM,cAAc,SAAA,CAAU,IAAA,CAAK,OAAK,CAAA,CAAE,EAAA,KAAO,SAAS,UAAU,CAAA;AACpE,MAAA,IAAI,aAAa,KAAA,EAAO;AACpB,QAAA,UAAA,GAAa,WAAA,CAAY,KAAA;AAAA,MAC7B;AAAA,IACJ;AAEA,IAAA,MAAA,CAAO;AAAA,MACL,GAAG,QAAA;AAAA,MACH,KAAA,EAAO,UAAA;AAAA,MACP,IAAI,KAAA,EAAO;AAAA,KACZ,CAAA;AACD,IAAA,OAAA,EAAQ;AAAA,EACV,CAAA;AAEA,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,IAAI,KAAA,EAAO,MAAM,QAAA,EAAU;AACzB,MAAA,QAAA,CAAS,MAAM,EAAE,CAAA;AACjB,MAAA,OAAA,EAAQ;AAAA,IACV;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,kBAAA,GAAqB,CAAC,IAAA,KAA2B;AACrD,IAAA,IAAI,CAAC,MAAM,OAAO,EAAA;AAClB,IAAA,OAAOrB,MAAAA,CAAO,MAAM,oBAAoB,CAAA;AAAA,EAC1C,CAAA;AAEA,EAAA,MAAM,gBAAA,GAAmB,CAAC,KAAA,EAAwB,KAAA,KAAkB;AAClE,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,KAAK,CAAA;AAC3B,IAAA,IAAI,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,CAAA,EAAG;AAE3B,IAAA,IAAI,UAAU,OAAA,EAAS;AACnB,MAAA,MAAM,WAAW,QAAA,CAAS,GAAA,CAAK,SAAQ,GAAI,QAAA,CAAS,MAAO,OAAA,EAAQ;AACnE,MAAA,WAAA,CAAY,CAAA,IAAA,MAAS;AAAA,QACjB,GAAG,IAAA;AAAA,QACH,KAAA,EAAO,IAAA;AAAA,QACP,KAAK,IAAI,IAAA,CAAK,IAAA,CAAK,OAAA,KAAY,QAAQ;AAAA,OAC3C,CAAE,CAAA;AAAA,IACN,CAAA,MAAO;AACH,MAAA,IAAI,IAAA,GAAO,SAAS,KAAA,EAAQ;AACvB,QAAA,WAAA,CAAY,CAAA,IAAA,MAAS,EAAE,GAAG,IAAA,EAAM,OAAO,IAAA,EAAM,GAAA,EAAK,MAAK,CAAE,CAAA;AAAA,MAC9D,CAAA,MAAO;AACF,QAAA,WAAA,CAAY,WAAS,EAAE,GAAG,IAAA,EAAM,GAAA,EAAK,MAAK,CAAE,CAAA;AAAA,MACjD;AAAA,IACJ;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,OAAA,EAAiB,KAAA,KAAkB;AACtD,IAAA,MAAM,WAAA,GAA6B;AAAA,MACjC,EAAA,EAAI,KAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA;AAAA,MAC1C,IAAA,EAAM,cAAA;AAAA,MACN,IAAA,EAAM,OAAA;AAAA,MACN;AAAA,KACF;AACA,IAAA,WAAA,CAAY,CAAA,IAAA,MAAS;AAAA,MACnB,GAAG,IAAA;AAAA,MACH,WAAW,CAAC,GAAI,KAAK,SAAA,IAAa,IAAK,WAAW;AAAA,KACpD,CAAE,CAAA;AACF,IAAA,yBAAA,CAA0B,KAAK,CAAA;AAAA,EACjC,CAAA;AAEA,EAAA,MAAM,cAAA,GAAiB,CAAC,EAAA,KAAe;AACrC,IAAA,WAAA,CAAY,CAAA,IAAA,MAAS;AAAA,MACnB,GAAG,IAAA;AAAA,MACH,WAAW,IAAA,CAAK,SAAA,EAAW,OAAO,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,EAAE;AAAA,KACpD,CAAE,CAAA;AAAA,EACJ,CAAA;AAwBA,EAAA,MAAM,cAAA,GAAiB,CAAC,UAAA,KAAgC;AACtD,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AAC1C,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,oBAAA,GAAuB,UAAA,CAAW,IAAI,CAAA,EAAG,EAAC,IAAA,EAAM,YAAA,EAAa,CAAA;AACpF,IAAA,OAAA,CAAQ,IAAA,GAAO,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AACvC,IAAA,OAAA,CAAQ,WAAW,UAAA,CAAW,IAAA;AAC9B,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,OAAO,CAAA;AACjC,IAAA,OAAA,CAAQ,KAAA,EAAM;AACd,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,OAAO,CAAA;AAAA,EACnC,CAAA;AAEA,EAAA,MAAM,kBAAkB,MAAM;AAC5B,IAAA,IAAI,CAAC,QAAA,CAAS,KAAA,IAAS,CAAC,QAAA,CAAS,KAAK,OAAO,EAAA;AAC7C,IAAA,MAAM,IAAA,GAAOe,mBAAAA,CAAoB,QAAA,CAAS,GAAA,EAAK,SAAS,KAAK,CAAA;AAC7D,IAAA,IAAI,IAAA,GAAO,EAAA,EAAI,OAAO,CAAA,EAAG,IAAI,CAAA,IAAA,CAAA;AAC7B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,EAAE,CAAA;AAClC,IAAA,MAAM,gBAAgB,IAAA,GAAO,EAAA;AAC7B,IAAA,IAAI,aAAA,KAAkB,CAAA,EAAG,OAAO,CAAA,EAAG,KAAK,CAAA,GAAA,CAAA;AACxC,IAAA,OAAO,CAAA,EAAG,KAAK,CAAA,IAAA,EAAO,aAAa,CAAA,IAAA,CAAA;AAAA,EACrC,CAAA;AAGA,EAAA,MAAM,cAAA,GAAiB,sBACrBhB,gBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iEAAA,EAAA,kBAEbA,gBAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,yBAAA;AAAA,MACV,KAAA,EAAO;AAAA,QACL,UAAA,EAAY,CAAA,wBAAA,EAA2B,KAAA,EAAO,KAAA,IAAS,SAAS,CAAA,wBAAA;AAAA;AAClE,KAAA;AAAA,oBAGAA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,sBAAA;AAAA,QACV,KAAA,EAAO,EAAE,eAAA,EAAiB,KAAA,EAAO,SAAS,SAAA;AAAU;AAAA,KACtD,kBACAA,gBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oEAAA,EAAA,EACb,SAAA,EAAW,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,EAAA,KAAO,KAAA,EAAO,UAAU,CAAA,EAAG,KAAA,IAAS,OAC9D,CACF,CAAA,kBACAA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,MAAM,OAAA,CAAQ,MAAM,CAAA;AAAA,QAC7B,SAAA,EAAU,kGAAA;AAAA,QACV,KAAA,EAAM;AAAA,OAAA;AAAA,sBAENA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAM,WAAU,SAAA,EAAU;AAAA,KAC7B,kBACAA,gBAAAA,CAAA,aAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,YAAA;AAAA,QACT,SAAA,EAAU,oGAAA;AAAA,QACV,KAAA,EAAM;AAAA,OAAA;AAAA,sBAENA,gBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAO,WAAU,SAAA,EAAU;AAAA,KAC9B,kBACAA,gBAAAA,CAAA,aAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,OAAA;AAAA,QACT,SAAA,EAAU,kGAAA;AAAA,QACV,KAAA,EAAM;AAAA,OAAA;AAAA,sBAENA,gBAAAA,CAAA,aAAA,CAACuB,CAAAA,EAAA,EAAE,WAAU,SAAA,EAAU;AAAA,KAE3B,CACF,CAAA;AAAA,oBAGAvB,iBAAA,aAAA,CAAC,IAAA,EAAA,EAAG,WAAU,uDAAA,EAAA,EACX,KAAA,EAAO,SAAS,YACnB,CAAA;AAAA,oBAGAA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qDACbA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,0GAAA,EAAA,kBACbA,iBAAA,aAAA,CAACwB,QAAAA,EAAA,EAAS,SAAA,EAAU,+BAAA,EAAgC,CAAA,kBACpDxB,iBAAA,aAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EAAA,EACb,OAAO,KAAA,IAASC,MAAAA,CAAO,IAAI,IAAA,CAAK,MAAM,KAAK,CAAA,EAAG,YAAY,CAC7D,CACF,mBACAD,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,0GAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA,CAACyB,OAAA,EAAM,SAAA,EAAU,+BAAA,EAAgC,CAAA,kBACjDzB,gBAAAA,CAAA,aAAA,CAAC,UAAK,SAAA,EAAU,aAAA,EAAA,EACb,OAAO,KAAA,IAASC,MAAAA,CAAO,IAAI,IAAA,CAAK,MAAM,KAAK,CAAA,EAAG,QAAQ,CAAA,EAAE,YAAI,KAAA,EAAO,GAAA,IAAOA,MAAAA,CAAO,IAAI,KAAK,KAAA,CAAM,GAAG,GAAG,QAAQ,CACjH,CACF,CACF;AAAA,GACF,kBAGAD,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,4CAAA,EAAA,EAEZ,KAAA,EAAO,QAAA,oBACNA,gBAAAA,CAAA,aAAA;AAAA,IAAC0B,MAAAA,CAAO,GAAA;AAAA,IAAP;AAAA,MACC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,MAC7B,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MAC5B,SAAA,EAAU;AAAA,KAAA;AAAA,oBAEV1B,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA,CAAC2B,MAAAA,EAAA,EAAO,SAAA,EAAU,wBAAuB,CAC3C,CAAA;AAAA,oBACA3B,iBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,QAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,yCAAuC,KAAA,CAAM,QAAS,mBACnEA,gBAAAA,CAAA,cAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAA,EAAA,EAAuC,uBAAqB,CAC3E,CAAA;AAAA,oBACAA,gBAAAA,CAAA,aAAA,CAAC,YAAA,EAAA,EAAa,WAAU,oFAAA,EAAqF;AAAA,GAC/G,EAID,OAAO,MAAA,IAAU,KAAA,CAAM,OAAO,MAAA,GAAS,CAAA,oBACtCA,gBAAAA,CAAA,aAAA;AAAA,IAAC0B,MAAAA,CAAO,GAAA;AAAA,IAAP;AAAA,MACC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,MAC7B,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MAC5B,UAAA,EAAY,EAAE,KAAA,EAAO,IAAA,EAAK;AAAA,MAC1B,SAAA,EAAU;AAAA,KAAA;AAAA,oBAEV1B,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uDACbA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA,CAACoB,OAAA,EAAM,SAAA,EAAU,+BAAA,EAAgC,CAAA,kBACjDpB,gBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yCACb,KAAA,CAAM,MAAA,CAAO,MAAA,EAAO,GAAA,EAAE,MAAM,MAAA,CAAO,MAAA,GAAS,IAAI,QAAA,GAAW,OAC9D,CACF,CACF,CAAA;AAAA,oBACAA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EAAA,EACZ,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,EAAO,KAAA,qBACxBA,gBAAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,KAAA;AAAA,QACL,SAAA,EAAU;AAAA,OAAA;AAAA,sBAEVA,gBAAAA,CAAA,aAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,wFAAA;AAAA,UACV,OAAO,EAAE,eAAA,EAAiB,CAAA,IAAA,EAAO,KAAA,GAAQ,EAAE,CAAA,WAAA,CAAA;AAAc,SAAA;AAAA,QAExD,KAAA,CAAM,CAAC,CAAA,CAAE,WAAA;AAAY,OACxB;AAAA,sBACAA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qCAAA,EAAA,EAAuC,KAAA,CAAM,MAAM,GAAG,CAAA,CAAE,CAAC,CAAE,CAAA,kBACxEA,gBAAAA,CAAA,aAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,wCAAA,EAAA,EAA0C,KAAM,CAC/D;AAAA,KAEH,CACH;AAAA,GACF,EAID,OAAO,SAAA,IAAa,KAAA,CAAM,UAAU,MAAA,GAAS,CAAA,oBAC5CA,gBAAAA,CAAA,aAAA;AAAA,IAAC0B,MAAAA,CAAO,GAAA;AAAA,IAAP;AAAA,MACC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,MAC7B,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MAC5B,UAAA,EAAY,EAAE,KAAA,EAAO,GAAA,EAAI;AAAA,MACzB,SAAA,EAAU;AAAA,KAAA;AAAA,oBAEV1B,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA,CAAC4B,IAAAA,EAAA,EAAK,SAAA,EAAU,0BAAyB,CAC3C,CAAA;AAAA,oBACA5B,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EAAA,EACZ,KAAA,CAAM,SAAA,CAAU,GAAA,CAAI,CAAA,QAAA,qBACnBA,gBAAAA,CAAA,aAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,KAAK,QAAA,CAAS,EAAA;AAAA,QACd,SAAA,EAAU;AAAA,OAAA;AAAA,MAET,QAAA,CAAS,KAAA,IAAS,CAAA,EAAG,QAAA,CAAS,IAAI,CAAA,WAAA;AAAA,KAEtC,CACH;AAAA,GACF,EAID,KAAA,EAAO,WAAA,oBACNA,gBAAAA,CAAA,aAAA;AAAA,IAAC0B,MAAAA,CAAO,GAAA;AAAA,IAAP;AAAA,MACC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,MAC7B,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MAC5B,UAAA,EAAY,EAAE,KAAA,EAAO,IAAA,EAAK;AAAA,MAC1B,SAAA,EAAU;AAAA,KAAA;AAAA,oBAEV1B,iBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EAAA,kBACbA,iBAAA,aAAA,CAAC,SAAA,EAAA,EAAU,WAAU,+BAAA,EAAgC,CAAA,kBACrDA,gBAAAA,CAAA,aAAA,CAAC,UAAK,SAAA,EAAU,qCAAA,EAAA,EAAsC,OAAK,CAC7D,CAAA;AAAA,oBACAA,gBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,wHAAA,EAAA,EACZ,MAAM,WACT;AAAA,GACF,EAID,OAAO,WAAA,IAAe,KAAA,CAAM,YAAY,MAAA,GAAS,CAAA,oBAChDA,gBAAAA,CAAA,aAAA;AAAA,IAAC0B,MAAAA,CAAO,GAAA;AAAA,IAAP;AAAA,MACC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,MAC7B,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MAC5B,UAAA,EAAY,EAAE,KAAA,EAAO,GAAA,EAAI;AAAA,MACzB,SAAA,EAAU;AAAA,KAAA;AAAA,oBAEV1B,iBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EAAA,kBACbA,iBAAA,aAAA,CAAC6B,SAAAA,EAAA,EAAU,SAAA,EAAU,+BAAA,EAAgC,mBACrD7B,gBAAAA,CAAA,cAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qCAAA,EAAA,EAAsC,aAAW,CACnE,CAAA;AAAA,oBACAA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EAAA,EACZ,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,CAAA,GAAA,qBACrBA,gBAAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,KAAK,GAAA,CAAI,EAAA;AAAA,QACT,OAAA,EAAS,MAAM,cAAA,CAAe,GAAG,CAAA;AAAA,QACjC,SAAA,EAAU;AAAA,OAAA;AAAA,sBAEVA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,sBAAA,EAAuB,CACzC,CAAA;AAAA,sBACAA,iBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,gBAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,kDAAgD,GAAA,CAAI,IAAK,CAAA,kBACtEA,gBAAAA,CAAA,aAAA,CAAC,OAAE,SAAA,EAAU,+BAAA,EAAA,EAAiC,GAAA,CAAI,IAAK,CACzD,CAAA;AAAA,sBACAA,gBAAAA,CAAA,aAAA,CAAC8B,QAAAA,EAAA,EAAS,WAAU,oFAAA,EAAqF;AAAA,KAE5G,CACH;AAAA,GAGN,CACF,CAAA;AAIF,EAAA,MAAM,cAAA,GAAiB,sBACrB9B,gBAAAA,CAAA,cAAC,MAAA,EAAA,EAAK,QAAA,EAAU,YAAA,EAAc,SAAA,EAAU,iEAAA,EAAA,kBAEtCA,iBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gFAAA,EAAA,kBACbA,gBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,OAAA,EAAS,MAAM,oBAAA,CAAqB,CAAC,iBAAiB,CAAA;AAAA,MACtD,SAAA,EAAU;AAAA,KAAA;AAAA,oBAEVA,gBAAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,0EAAA;AAAA,QACV,KAAA,EAAO;AAAA,UACL,iBAAiB,QAAA,CAAS,KAAA;AAAA,UAC1B,SAAA,EAAW,CAAA,uCAAA,EAA0C,QAAA,CAAS,KAAK,CAAA,EAAA;AAAA;AACrE;AAAA,KACF;AAAA,IACC,iBAAA,oBACCA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iIAAA,EAAA,EACZ,aAAA,CAAc,GAAA,CAAI,CAAA,KAAA,qBACjBA,gBAAAA,CAAA,aAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,KAAA;AAAA,QACL,IAAA,EAAK,QAAA;AAAA,QACL,SAAS,MAAM;AACb,UAAA,WAAA,CAAY,CAAA,IAAA,MAAS,EAAE,GAAG,IAAA,EAAM,OAAM,CAAE,CAAA;AACxC,UAAA,oBAAA,CAAqB,KAAK,CAAA;AAAA,QAC5B,CAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,qDAAA;AAAA,UACA,QAAA,CAAS,UAAU,KAAA,IAAS;AAAA,SAC9B;AAAA,QACA,KAAA,EAAO,EAAE,eAAA,EAAiB,KAAA,EAAO,KAAA;AAAa;AAAA,KAEjD,CACH;AAAA,GAEJ,kBACAA,gBAAAA,CAAA,aAAA,CAAC,QAAG,SAAA,EAAU,uCAAA,EAAA,EACX,IAAA,KAAS,MAAA,GAAS,YAAA,GAAe,WACpC,CACF,CAAA,kBACAA,gBAAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,OAAA,EAAS,OAAA;AAAA,MACT,SAAA,EAAU;AAAA,KAAA;AAAA,oBAEVA,gBAAAA,CAAA,aAAA,CAACuB,CAAAA,EAAA,EAAE,WAAU,SAAA,EAAU;AAAA,GAE3B,CAAA,kBAGAvB,iBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wBAAA,EAAA,kBACbA,iBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qBAAA,EAAA,kBAEbA,iBAAA,aAAA,CAAC,KAAA,EAAA,IAAA,kBACCA,gBAAAA,CAAA,aAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,MAAA;AAAA,MACL,QAAA,EAAQ,IAAA;AAAA,MACR,SAAA,EAAS,IAAA;AAAA,MACT,SAAA,EAAU,qMAAA;AAAA,MACV,OAAO,QAAA,CAAS,KAAA;AAAA,MAChB,QAAA,EAAU,CAAA,CAAA,KAAK,WAAA,CAAY,EAAE,GAAG,UAAU,KAAA,EAAO,CAAA,CAAE,MAAA,CAAO,KAAA,EAAO,CAAA;AAAA,MACjE,WAAA,EAAY;AAAA;AAAA,GAEhB,CAAA,kBAGAA,iBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,6EAAA,EAAA,kBACbA,iBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uCAAA,EAAA,kBACbA,iBAAA,aAAA,CAACyB,KAAAA,EAAA,EAAM,SAAA,EAAU,sBAAA,EAAuB,CAC1C,CAAA,kBACAzB,gBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,+BAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA,CAAC,6BACCA,gBAAAA,CAAA,cAAC,OAAA,EAAA,EAAM,SAAA,EAAU,yFAAsF,OAAK,CAAA,kBAC5GA,gBAAAA,CAAA,aAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,gBAAA;AAAA,MACL,SAAA,EAAU,8KAAA;AAAA,MACV,KAAA,EAAO,kBAAA,CAAmB,QAAA,CAAS,KAAK,CAAA;AAAA,MACxC,UAAU,CAAA,CAAA,KAAK,gBAAA,CAAiB,OAAA,EAAS,CAAA,CAAE,OAAO,KAAK;AAAA;AAAA,GAE3D,CAAA,kBACAA,gBAAAA,CAAA,cAAC,KAAA,EAAA,IAAA,kBACCA,gBAAAA,CAAA,aAAA,CAAC,WAAM,SAAA,EAAU,qFAAA,EAAA,EAAsF,KAAG,CAAA,kBAC1GA,gBAAAA,CAAA,aAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,gBAAA;AAAA,MACL,SAAA,EAAU,8KAAA;AAAA,MACV,KAAA,EAAO,kBAAA,CAAmB,QAAA,CAAS,GAAG,CAAA;AAAA,MACtC,UAAU,CAAA,CAAA,KAAK,gBAAA,CAAiB,KAAA,EAAO,CAAA,CAAE,OAAO,KAAK;AAAA;AAAA,GAEzD,CACF,CACF,CAAA,EAGC,eAAA,EAAgB,oBACfA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uEAAA,EAAA,EACb,eAAA,EACH,CACF,CAAA,kBAIFA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAAA,kBACbA,iBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA,CAAC4B,IAAAA,EAAA,EAAK,SAAA,EAAU,iCAAgC,CAAA,kBAChD5B,gBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qCAAA,EAAA,EAAsC,WAAS,CACjE,CAAA,kBACAA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,OAAA,EAAS,MAAM,yBAAA,CAA0B,CAAC,sBAAsB,CAAA;AAAA,MAChE,SAAA,EAAU;AAAA,KAAA;AAAA,oBAEVA,gBAAAA,CAAA,aAAA,CAACiB,IAAAA,EAAA,EAAK,WAAU,aAAA,EAAc,CAAA;AAAA,IAAE;AAAA,GAElC,EACC,sBAAA,oBACCjB,gBAAAA,CAAA,aAAA,CAAAA,gBAAAA,CAAA,QAAA,EAAA,IAAA,kBACEA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EAAqB,OAAA,EAAS,MAAM,yBAAA,CAA0B,KAAK,CAAA,EAAG,CAAA,kBACrFA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gIAAA,EAAA,EACZ,gBAAA,CAAiB,GAAA,CAAI,CAAA,MAAA,qBACpBA,gBAAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,KAAK,MAAA,CAAO,KAAA;AAAA,MACZ,IAAA,EAAK,QAAA;AAAA,MACL,SAAS,MAAM,WAAA,CAAY,MAAA,CAAO,KAAA,EAAO,OAAO,KAAK,CAAA;AAAA,MACrD,SAAA,EAAU;AAAA,KAAA;AAAA,IAET,MAAA,CAAO;AAAA,GAEX,CACH,CACF,CAEJ,CACF,CAAA,EACC,QAAA,CAAS,SAAA,IAAa,QAAA,CAAS,SAAA,CAAU,MAAA,GAAS,qBACjDA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EAAA,EACZ,SAAS,SAAA,CAAU,GAAA,CAAI,CAAA,QAAA,qBACtBA,gBAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAK,QAAA,CAAS,EAAA;AAAA,MACd,SAAA,EAAU;AAAA,KAAA;AAAA,oBAEVA,gBAAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAS,WAAU,4BAAA,EAA6B,CAAA;AAAA,oBACjDA,gBAAAA,CAAA,aAAA,CAAC,UAAK,SAAA,EAAU,wDAAA,EAAA,EACb,SAAS,KACZ,CAAA;AAAA,oBACAA,gBAAAA,CAAA,aAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MAAM,cAAA,CAAe,QAAA,CAAS,EAAE,CAAA;AAAA,QACzC,SAAA,EAAU;AAAA,OAAA;AAAA,sBAEVA,gBAAAA,CAAA,aAAA,CAACuB,CAAAA,EAAA,EAAE,WAAU,wBAAA,EAAyB;AAAA;AACxC,GAEH,CACH,CAEJ,mBAGAvB,gBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAAA,kBACbA,iBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EAAA,kBACbA,iBAAA,aAAA,CAACoB,KAAAA,EAAA,EAAM,SAAA,EAAU,iCAAgC,CAAA,kBACjDpB,iBAAA,aAAA,CAAC,MAAA,EAAA,EAAK,WAAU,qCAAA,EAAA,EAAsC,QAAM,CAC9D,CAAA,kBACAA,gBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,UAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,OAAA,EAAS,MAAM,uBAAA,CAAwB,CAAC,oBAAoB,CAAA;AAAA,MAC5D,SAAA,EAAU;AAAA,KAAA;AAAA,oBAEVA,iBAAA,aAAA,CAAC,MAAA,EAAA,EAAK,WAAW,cAAA,CAAe,MAAA,GAAS,CAAA,GAAI,6BAAA,GAAgC,uBAAA,EAAA,EAC1E,cAAA,CAAe,SAAS,CAAA,GACrB,CAAA,EAAG,cAAA,CAAe,MAAM,CAAA,MAAA,EAAS,cAAA,CAAe,SAAS,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,MAAA,CAAA,GACrE,YACN,CAAA;AAAA,oBACAA,gBAAAA,CAAA,aAAA,CAAC+B,WAAAA,EAAA,EAAY,WAAW,EAAA,CAAG,oDAAA,EAAsD,oBAAA,IAAwB,YAAY,CAAA,EAAG;AAAA,GAC1H,EAEC,oBAAA,oBACC/B,gBAAAA,CAAA,aAAA,CAAAA,gBAAAA,CAAA,QAAA,EAAA,IAAA,kBACEA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EAAqB,OAAA,EAAS,MAAM,uBAAA,CAAwB,KAAK,CAAA,EAAG,CAAA,kBACnFA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4GAAA,EAAA,EACZ,UAAA,CAAW,GAAA,CAAI,CAAA,KAAA,qBACdA,gBAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,KAAA;AAAA,MACL,SAAA,EAAU,oFAAA;AAAA,MACV,OAAA,EAAS,MAAM,WAAA,CAAY,KAAK;AAAA,KAAA;AAAA,oBAEhCA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA;AAAA,MACd,6EAAA;AAAA,MACA,cAAA,CAAe,QAAA,CAAS,KAAK,CAAA,GAAI,2BAAA,GAA8B;AAAA,KACjE,EAAA,EACG,cAAA,CAAe,QAAA,CAAS,KAAK,CAAA,oBAAKA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,iCAAA,EAAkC,CACxF,CAAA;AAAA,oBACAA,gBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,yBAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,wFAAA;AAAA,QACV,KAAA,EAAO,EAAE,eAAA,EAAiB,CAAA,IAAA,EAAO,WAAW,OAAA,CAAQ,KAAK,CAAA,GAAI,EAAE,CAAA,WAAA,CAAA;AAAc,OAAA;AAAA,MAE5E,KAAA,CAAM,CAAC,CAAA,CAAE,WAAA;AAAY,KACxB,kBACAA,gBAAAA,CAAA,aAAA,CAAC,UAAK,SAAA,EAAU,SAAA,EAAA,EAAW,KAAM,CACnC;AAAA,GAEH,CACH,CACF,CAEJ,CAAA,EAEC,cAAA,CAAe,SAAS,CAAA,oBACvBA,gBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,2BAAA,EAAA,EACZ,eAAe,GAAA,CAAI,CAAA,KAAA,qBAClBA,gBAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,KAAA;AAAA,MACL,SAAA,EAAU;AAAA,KAAA;AAAA,oBAEVA,gBAAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,wFAAA;AAAA,QACV,KAAA,EAAO,EAAE,eAAA,EAAiB,CAAA,IAAA,EAAO,WAAW,OAAA,CAAQ,KAAK,CAAA,GAAI,EAAE,CAAA,WAAA,CAAA;AAAc,OAAA;AAAA,MAE5E,KAAA,CAAM,CAAC,CAAA,CAAE,WAAA;AAAY,KACxB;AAAA,oBACAA,gBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qCAAA,EAAA,EAAuC,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAE,CAAA;AAAA,oBAC3EA,gBAAAA,CAAA,aAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MAAM,WAAA,CAAY,KAAK,CAAA;AAAA,QAChC,SAAA,EAAU;AAAA,OAAA;AAAA,sBAEVA,gBAAAA,CAAA,aAAA,CAACuB,CAAAA,EAAA,EAAE,WAAU,+BAAA,EAAgC;AAAA;AAC/C,GAEH,CACH,CAEJ,mBAGAvB,gBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gGACbA,gBAAAA,CAAA,cAAC2B,MAAAA,EAAA,EAAO,WAAU,wCAAA,EAAyC,CAAA,kBAC3D3B,gBAAAA,CAAA,aAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,MAAA;AAAA,MACL,SAAA,EAAU,+FAAA;AAAA,MACV,WAAA,EAAY,cAAA;AAAA,MACZ,KAAA,EAAO,SAAS,QAAA,IAAY,EAAA;AAAA,MAC5B,QAAA,EAAU,CAAA,CAAA,KAAK,WAAA,CAAY,EAAE,GAAG,UAAU,QAAA,EAAU,CAAA,CAAE,MAAA,CAAO,KAAA,EAAO;AAAA;AAAA,GAExE,CAAA,kBAGAA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,+BAAA,EAAgC,CAAA,kBACrDA,gBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qCAAA,EAAA,EAAsC,OAAK,CAC7D,CAAA,kBACAA,gBAAAA,CAAA,aAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,uNAAA;AAAA,MACV,WAAA,EAAY,6BAAA;AAAA,MACZ,KAAA,EAAO,SAAS,WAAA,IAAe,EAAA;AAAA,MAC/B,QAAA,EAAU,CAAA,CAAA,KAAK,WAAA,CAAY,EAAE,GAAG,UAAU,WAAA,EAAa,CAAA,CAAE,MAAA,CAAO,KAAA,EAAO;AAAA;AAAA,GAE3E,CAAA,kBAGAA,gBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,4EAAA,EAAA,kBACbA,gBAAAA,CAAA,cAAC,MAAA,EAAA,EAAO,SAAA,EAAU,wCAAA,EAAyC,CAAA,kBAC3DA,gBAAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,iFAAA;AAAA,MACV,KAAA,EAAO,QAAA,CAAS,UAAA,EAAY,IAAA,IAAQ,EAAA;AAAA,MACpC,UAAU,CAAA,CAAA,KAAK;AACb,QAAA,IAAI,CAAA,CAAE,MAAA,CAAO,KAAA,KAAU,EAAA,EAAI;AACzB,UAAA,WAAA,CAAY,EAAE,GAAG,QAAA,EAAU,UAAA,EAAY,QAAW,CAAA;AAAA,QACpD,CAAA,MAAO;AACL,UAAA,WAAA,CAAY;AAAA,YACV,GAAG,QAAA;AAAA,YACH,UAAA,EAAY;AAAA,cACV,IAAA,EAAM,EAAE,MAAA,CAAO,KAAA;AAAA,cACf,QAAA,EAAU;AAAA;AACZ,WACD,CAAA;AAAA,QACH;AAAA,MACF;AAAA,KAAA;AAAA,oBAEAA,gBAAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,MAAG,iBAAe,CAAA;AAAA,oBAChCA,gBAAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,WAAQ,OAAK,CAAA;AAAA,oBAC3BA,gBAAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,YAAS,QAAM,CAAA;AAAA,oBAC7BA,gBAAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,aAAU,SAAO,CAAA;AAAA,oBAC/BA,gBAAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,YAAS,QAAM;AAAA,GAEjC,CAAA,kBAGAA,gBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,sFAAA,EAAA,kBACbA,gBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EAAA,kBACbA,iBAAA,aAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EAAgC,mBAC/CA,gBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,WAAU,yBAAA,EAAA,EAA0B,UAAQ,CACpD,CAAA,kBACAA,gBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,UAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,OAAA,EAAS,MAAM,yBAAA,CAA0B,CAAC,sBAAsB,CAAA;AAAA,MAChE,SAAA,EAAU;AAAA,KAAA;AAAA,oBAEVA,gBAAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,sBAAA;AAAA,QACV,KAAA,EAAO,EAAE,eAAA,EAAiB,SAAA,EAAW,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,EAAA,KAAO,QAAA,CAAS,UAAU,CAAA,EAAG,KAAA,IAAS,SAAA;AAAU;AAAA,KACnG;AAAA,oBACAA,gBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,WAAU,aAAA,EAAA,EAAe,SAAA,EAAW,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,EAAA,KAAO,QAAA,CAAS,UAAU,CAAA,EAAG,SAAS,QAAS,CAAA;AAAA,oBACrGA,gBAAAA,CAAA,aAAA,CAAC+B,WAAAA,EAAA,EAAY,WAAU,mCAAA,EAAoC;AAAA,GAC7D,EAEC,sBAAA,oBACC/B,gBAAAA,CAAA,aAAA,CAAAA,gBAAAA,CAAA,QAAA,EAAA,IAAA,kBACEA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EAAqB,OAAA,EAAS,MAAM,yBAAA,CAA0B,KAAK,CAAA,EAAG,CAAA,kBACrFA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0GAAA,EAAA,EACZ,SAAA,EAAW,GAAA,CAAI,CAAA,GAAA,qBACdA,gBAAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,KAAK,GAAA,CAAI,EAAA;AAAA,MACT,IAAA,EAAK,QAAA;AAAA,MACL,SAAA,EAAU,sFAAA;AAAA,MACV,SAAS,MAAM;AACb,QAAA,WAAA,CAAY;AAAA,UACV,GAAG,QAAA;AAAA,UACH,YAAY,GAAA,CAAI,EAAA;AAAA,UAChB,KAAA,EAAO,GAAA,CAAI,KAAA,IAAS,QAAA,CAAS;AAAA,SAC9B,CAAA;AACD,QAAA,yBAAA,CAA0B,KAAK,CAAA;AAAA,MACjC;AAAA,KAAA;AAAA,oBAEAA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EAAuB,KAAA,EAAO,EAAE,eAAA,EAAiB,GAAA,CAAI,KAAA,EAAM,EAAG,CAAA;AAAA,oBAC7EA,gBAAAA,CAAA,aAAA,CAAC,UAAK,SAAA,EAAU,gBAAA,EAAA,EAAkB,IAAI,KAAM,CAAA;AAAA,IAC3C,QAAA,CAAS,eAAe,GAAA,CAAI,EAAA,oBAAMA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,sBAAA,EAAuB;AAAA,GAE9E,CACH,CACF,CAEJ,CACF,CACF,CACF,CAAA,kBAGAA,gBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gGACZ,IAAA,KAAS,MAAA,oBACRA,gBAAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,OAAA,EAAS,YAAA;AAAA,MACT,SAAA,EAAU;AAAA,KAAA;AAAA,oBAEVA,gBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAO,WAAU,SAAA,EAAU,CAAA;AAAA,IAAE;AAAA,GAEhC,EAED,IAAA,KAAS,QAAA,oBAAYA,iBAAA,aAAA,CAAC,KAAA,EAAA,IAAI,CAAA,kBAC3BA,iBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,OAAA,EAAS,OAAA;AAAA,MACT,SAAA,EAAU;AAAA,KAAA;AAAA,IACX;AAAA,GAED,kBACAA,gBAAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,SAAA,EAAU;AAAA,KAAA;AAAA,IAET,IAAA,KAAS,SAAS,cAAA,GAAiB;AAAA,GAExC,CACF,CACF,CAAA;AAGF,EAAA,uBACEA,iBAAA,aAAA,CAAC,KAAA,EAAA,EAAM,QAAgB,OAAA,EAAkB,UAAA,EAAU,MAAC,SAAA,EAAU,qDAAA,EAAA,kBAC5DA,gBAAAA,CAAA,aAAA,CAAC,mBAAgB,IAAA,EAAK,MAAA,EAAA,EACnB,SAAS,MAAA,IAAU,KAAA,mBAClBA,gBAAAA,CAAA,aAAA;AAAA,IAAC0B,MAAAA,CAAO,GAAA;AAAA,IAAP;AAAA,MACC,GAAA,EAAI,MAAA;AAAA,MACJ,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAE;AAAA,MACtB,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAE;AAAA,MACtB,IAAA,EAAM,EAAE,OAAA,EAAS,CAAA,EAAE;AAAA,MACnB,UAAA,EAAY,EAAE,QAAA,EAAU,IAAA;AAAK,KAAA;AAAA,IAE5B,cAAA;AAAe,GAClB,mBAEA1B,gBAAAA,CAAA,aAAA;AAAA,IAAC0B,MAAAA,CAAO,GAAA;AAAA,IAAP;AAAA,MACC,GAAA,EAAI,MAAA;AAAA,MACJ,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAE;AAAA,MACtB,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAE;AAAA,MACtB,IAAA,EAAM,EAAE,OAAA,EAAS,CAAA,EAAE;AAAA,MACnB,UAAA,EAAY,EAAE,QAAA,EAAU,IAAA;AAAK,KAAA;AAAA,IAE5B,cAAA;AAAe,GAGtB,CACF,CAAA;AAEJ,CAAA;AC/1BO,IAAM,QAAA,GAA0E,CAAC,EAAE,SAAA,EAAW,OAAM,qBACzG1B,gBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAW,EAAA,CAAG,mCAAA,EAAqC,SAAS,GAAG,KAAA,EAAc,CAAA;AAI7E,IAAM,iBAAA,GAA8B,sBACzCA,gBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0EAAA,EAAA,kBAEbA,gBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,wDAAA,EAAA,EACZ,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,qBACjCA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,CAAA,EAAG,SAAA,EAAU,qFACrBA,gBAAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,iBAAA,EAAkB,CACxC,CACD,CACH,CAAA,kBAEAA,gBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,yBAAA,EAAA,EACZ,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,IAAI,CAAA,CAAE,IAAI,CAAC,CAAA,EAAG,sBAClCA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,CAAA,EAAG,WAAU,sDAAA,EAAA,kBACrBA,gBAAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,gBAAe,CAAA,kBACnCA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eACZ,IAAA,CAAK,MAAA,EAAO,GAAI,GAAA,oBAAOA,gBAAAA,CAAA,cAAC,QAAA,EAAA,EAAS,SAAA,EAAU,uBAAA,EAAwB,CAAA,EACnE,IAAA,CAAK,MAAA,KAAW,GAAA,oBAAOA,gBAAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,wBAAuB,CACrE,CACF,CACD,CACH,CACF,CAAA;AAIK,IAAM,mBAA6B,sBACxCA,gBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,0EAAA,EAAA,kBAEbA,gBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gEACbA,gBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oCAAA,EAAA,kBACbA,iBAAA,aAAA,CAAC,QAAA,EAAA,EAAS,WAAU,kBAAA,EAAmB,CACzC,mBACAA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EAAA,EACZ,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,GAAG,CAAA,qBACjCA,gBAAAA,CAAA,aAAA,CAAC,SAAI,GAAA,EAAK,CAAA,EAAG,SAAA,EAAU,iEAAA,EAAA,kBACrBA,gBAAAA,CAAA,aAAA,CAAC,YAAS,SAAA,EAAU,sBAAA,EAAuB,mBAC3CA,gBAAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAS,WAAU,4BAAA,EAA6B,CACnD,CACD,CACH,CACF,mBAEAA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,aAAA,EAAc,KAAA,EAAO,EAAE,MAAA,EAAQ,OAAA,sBAC5CA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,gCAAA,EAAA,EACZ,KAAA,CAAM,IAAA,CAAK,EAAE,QAAQ,EAAA,EAAI,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,qBAClCA,gBAAAA,CAAA,aAAA,CAAC,SAAI,GAAA,EAAK,CAAA,EAAG,SAAA,EAAU,mBAAA,EAAA,kBACrBA,gBAAAA,CAAA,aAAA,CAAC,YAAS,SAAA,EAAU,4CAAA,EAA6C,CACnE,CACD,CACH,CAAA,kBACAA,iBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kCAAA,EAAA,EACZ,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,CAAA,EAAG,EAAE,GAAA,CAAI,CAAC,CAAA,EAAG,MAAA,qBACjCA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,QAAQ,SAAA,EAAU,oDAAA,EAAA,EACzB,MAAM,IAAA,CAAK,EAAE,QAAQ,EAAA,EAAI,CAAA,CAAE,GAAA,CAAI,CAACgC,EAAAA,EAAG,MAAA,qBAClChC,gBAAAA,CAAA,aAAA,CAAC,SAAI,GAAA,EAAK,MAAA,EAAQ,SAAA,EAAU,kDAAA,EAAmD,CAChF,CAAA,EAEA,IAAA,CAAK,QAAO,GAAI,GAAA,oBACfA,gBAAAA,CAAA,aAAA;AAAA,EAAC,QAAA;AAAA,EAAA;AAAA,IACC,SAAA,EAAU,qBAAA;AAAA,IACV,KAAA,EAAO;AAAA,MACL,GAAA,EAAK,GAAG,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAO,GAAI,GAAG,CAAC,CAAA,EAAA,CAAA;AAAA,MACvC,IAAA,EAAM,KAAA;AAAA,MACN,KAAA,EAAO,KAAA;AAAA,MACP,MAAA,EAAQ,GAAG,EAAA,GAAK,IAAA,CAAK,MAAM,IAAA,CAAK,MAAA,EAAO,GAAI,GAAG,CAAC,CAAA,EAAA;AAAA;AACjD;AACF,CAEJ,CACD,CACH,CACF,CACF,CAAA;AAIK,IAAM,eAAA,GAA4B,sBACvCA,gBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8FAEbA,gBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iFACbA,gBAAAA,CAAA,cAAC,QAAA,EAAA,EAAS,SAAA,EAAU,kBAAA,EAAmB,CACzC,CAAA,kBAEAA,iBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,aAAA,EAAc,KAAA,EAAO,EAAE,MAAA,EAAQ,OAAA,sBAC5CA,gBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+CACZ,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,EAAA,EAAI,CAAA,CAAE,GAAA,CAAI,CAAC,GAAG,CAAA,qBAClCA,iBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,KAAK,CAAA,EAAG,SAAA,EAAU,uCACrBA,gBAAAA,CAAA,cAAC,QAAA,EAAA,EAAS,SAAA,EAAU,gEAA+D,CACrF,CACD,CACH,CAAA,kBACAA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBACZ,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,EAAA,EAAI,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,qBAClCA,gBAAAA,CAAA,aAAA,CAAC,SAAI,GAAA,EAAK,CAAA,EAAG,WAAU,kDAAA,EAAmD,CAC3E,CAAA,kBAEDA,gBAAAA,CAAA,aAAA;AAAA,EAAC,QAAA;AAAA,EAAA;AAAA,IACC,SAAA,EAAU,oCAAA;AAAA,IACV,KAAA,EAAO,EAAE,GAAA,EAAK,OAAA,EAAS,QAAQ,OAAA;AAAQ;AACzC,CAAA,kBACAA,gBAAAA,CAAA,aAAA;AAAA,EAAC,QAAA;AAAA,EAAA;AAAA,IACC,SAAA,EAAU,oCAAA;AAAA,IACV,KAAA,EAAO,EAAE,GAAA,EAAK,OAAA,EAAS,QAAQ,MAAA;AAAO;AACxC,CACF,CACF,CACF,CAAA;AAIK,IAAM,kBAAA,GAA+B,sBAC1CA,gBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8EAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,WAAA,EAAA,EACZ,MAAM,IAAA,CAAK,EAAE,QAAQ,CAAA,EAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,EAAG,2BACjCA,gBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,GAAA,EAAK,0BACRA,gBAAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,eAAA,EAAgB,mBACpCA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAAA,EACZ,MAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAO,GAAI,CAAC,CAAA,EAAG,EAAE,GAAA,CAAI,CAACgC,EAAAA,EAAG,QAAA,qBACjEhC,gBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,GAAA,EAAK,QAAA,EAAU,SAAA,EAAU,oDAAA,EAAA,kBAC5BA,iBAAA,aAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,sBAAA,EAAuB,CAAA,kBAC3CA,iBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kBAAA,EAAA,kBACbA,iBAAA,aAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,WAAA,EAAY,CAAA,kBAChCA,iBAAA,aAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,WAAA,EAAY,CAClC,CACF,CACD,CACH,CACF,CACD,CACH,CACF,CAAA;AC9GK,IAAM,mBAAoD,CAAC;AAAA,EAChE,KAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,gBAAgB,EAAC;AAAA,EACjB;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,OAAA,GAAUc,OAAuB,IAAI,CAAA;AAG3C,EAAAQ,UAAU,MAAM;AACd,IAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAqB;AAC1C,MAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,QAAA,OAAA,EAAQ;AAAA,MACV;AAAA,IACF,CAAA;AAEA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAClD,MAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,aAAa,CAAA;AAAA,IACpE;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,OAAO,CAAC,CAAA;AAGtB,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,kBAAA,GAAqB,CAAC,CAAA,KAAkB;AAC5C,MAAA,IAAI,OAAA,CAAQ,WAAW,CAAC,OAAA,CAAQ,QAAQ,QAAA,CAAS,CAAA,CAAE,MAAc,CAAA,EAAG;AAClE,QAAA,OAAA,EAAQ;AAAA,MACV;AAAA,IACF,CAAA;AAEA,IAAA,IAAI,QAAA,EAAU;AAEZ,MAAA,UAAA,CAAW,MAAM;AACf,QAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,kBAAkB,CAAA;AAAA,MAC3D,GAAG,CAAC,CAAA;AACJ,MAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,WAAA,EAAa,kBAAkB,CAAA;AAAA,IAC3E;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,OAAO,CAAC,CAAA;AAEtB,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,QAAA,EAAU,OAAO,IAAA;AAEhC,EAAA,MAAM,OAAA,GAA+B;AAAA,IACnC,GAAI,SAAS,CAAC;AAAA,MACZ,EAAA,EAAI,MAAA;AAAA,MACJ,KAAA,EAAO,cAAc,IAAA,IAAQ,MAAA;AAAA,MAC7B,sBAAMtB,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAM,WAAU,SAAA,EAAU,CAAA;AAAA,MACjC,SAAS,MAAM;AACb,QAAA,MAAA,CAAO,KAAK,CAAA;AACZ,QAAA,OAAA,EAAQ;AAAA,MACV;AAAA,KACD,IAAI,EAAC;AAAA,IACN,GAAI,cAAc,CAAC;AAAA,MACjB,EAAA,EAAI,WAAA;AAAA,MACJ,KAAA,EAAO,cAAc,SAAA,IAAa,WAAA;AAAA,MAClC,sBAAMA,gBAAAA,CAAA,cAACiC,IAAAA,EAAA,EAAK,WAAU,SAAA,EAAU,CAAA;AAAA,MAChC,SAAS,MAAM;AACb,QAAA,WAAA,CAAY,KAAK,CAAA;AACjB,QAAA,OAAA,EAAQ;AAAA,MACV;AAAA,KACD,IAAI,EAAC;AAAA,IACN,GAAG,aAAA;AAAA,IACH,GAAI,WAAW,CAAC;AAAA,MACd,EAAA,EAAI,QAAA;AAAA,MACJ,KAAA,EAAO,cAAc,MAAA,IAAU,QAAA;AAAA,MAC/B,sBAAMjC,gBAAAA,CAAA,cAACkC,MAAAA,EAAA,EAAO,WAAU,SAAA,EAAU,CAAA;AAAA,MAClC,SAAS,MAAM;AACb,QAAA,QAAA,CAAS,MAAM,EAAE,CAAA;AACjB,QAAA,OAAA,EAAQ;AAAA,MACV,CAAA;AAAA,MACA,OAAA,EAAS;AAAA,KACV,IAAI;AAAC,GACR;AAGA,EAAA,MAAM,gBAAA,GAAmB;AAAA,IACvB,GAAG,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,EAAG,MAAA,CAAO,aAAa,GAAG,CAAA;AAAA,IAC/C,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG,OAAO,WAAA,IAAe,OAAA,CAAQ,MAAA,GAAS,EAAA,GAAK,EAAA,CAAG;AAAA,GACzE;AAEA,EAAA,uBACElC,gBAAAA,CAAA,aAAA,CAACmC,eAAAA,EAAA,IAAA,kBACCnC,gBAAAA,CAAA,aAAA;AAAA,IAAC0B,MAAAA,CAAO,GAAA;AAAA,IAAP;AAAA,MACC,GAAA,EAAK,OAAA;AAAA,MACL,SAAS,EAAE,OAAA,EAAS,GAAG,KAAA,EAAO,IAAA,EAAM,GAAG,EAAA,EAAG;AAAA,MAC1C,SAAS,EAAE,OAAA,EAAS,GAAG,KAAA,EAAO,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MACtC,MAAM,EAAE,OAAA,EAAS,GAAG,KAAA,EAAO,IAAA,EAAM,GAAG,EAAA,EAAG;AAAA,MACvC,UAAA,EAAY,EAAE,QAAA,EAAU,IAAA,EAAM,MAAM,SAAA,EAAU;AAAA,MAC9C,SAAA,EAAU,6GAAA;AAAA,MACV,KAAA,EAAO;AAAA,QACL,MAAM,gBAAA,CAAiB,CAAA;AAAA,QACvB,KAAK,gBAAA,CAAiB;AAAA;AACxB,KAAA;AAAA,oBAGA1B,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sDAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,mCAAA;AAAA,QACV,KAAA,EAAO,EAAE,eAAA,EAAiB,KAAA,CAAM,SAAS,gBAAA;AAAiB;AAAA,KAC5D,kBACAA,gBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,WAAU,8CAAA,EAAA,EACb,KAAA,CAAM,KACT,CACF,CACF,CAAA;AAAA,oBAGAA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,MAAA,EAAA,EACZ,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,EAAQ,KAAA,qBACpBA,gBAAAA,CAAA,cAACA,gBAAAA,CAAM,QAAA,EAAN,EAAe,GAAA,EAAK,MAAA,CAAO,EAAA,EAAA,EACzB,KAAA,GAAQ,CAAA,IAAK,OAAO,OAAA,KAAY,QAAA,oBAC/BA,gBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EAAsB,CAAA,kBAEvCA,gBAAAA,CAAA,aAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,UAAU,MAAA,CAAO,QAAA;AAAA,QACjB,SAAA,EAAW,EAAA;AAAA,UACT,oEAAA;AAAA,UACA,OAAO,QAAA,IAAY,+BAAA;AAAA,UACnB,MAAA,CAAO,OAAA,KAAY,QAAA,GACf,yEAAA,GACA;AAAA;AACN,OAAA;AAAA,MAEC,MAAA,CAAO,IAAA;AAAA,sBACRA,gBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,IAAA,EAAM,OAAO,KAAM;AAAA,KAExB,CACD,CACH;AAAA,GAEJ,CAAA;AAEJ,CAAA;AAGO,IAAM,sBAAsB,MAAM;AACvC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIa,QAAAA,CAGnC,EAAE,KAAA,EAAO,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,CAAA;AAElC,EAAA,MAAM,eAAA,GAAkBE,WAAAA,CAAY,CAAC,KAAA,EAAsB,CAAA,KAAwB;AACjF,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,IAAA,cAAA,CAAe;AAAA,MACb,KAAA;AAAA,MACA,UAAU,EAAE,CAAA,EAAG,EAAE,OAAA,EAAS,CAAA,EAAG,EAAE,OAAA;AAAQ,KACxC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,gBAAA,GAAmBA,YAAY,MAAM;AACzC,IAAA,cAAA,CAAe,EAAE,KAAA,EAAO,IAAA,EAAM,QAAA,EAAU,MAAM,CAAA;AAAA,EAChD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,kBAAkB,WAAA,CAAY,KAAA;AAAA,IAC9B,qBAAqB,WAAA,CAAY,QAAA;AAAA,IACjC,eAAA;AAAA,IACA;AAAA,GACF;AACF,CAAA;;;ACnMO,IAAM,EAAA,GAAK;AAAA,EACd,KAAA,EAAO,OAAA;AAAA,EACP,KAAA,EAAO,OAAA;AAAA,EACP,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK,KAAA;AAAA,EACL,MAAA,EAAQ,QAAA;AAAA,EACR,QAAA,EAAU,WAAA;AAAA,EACV,WAAA,EAAa,cAAA;AAAA,EACb,SAAA,EAAW,YAAA;AAAA,EACX,MAAA,EAAQ,QAAA;AAAA,EACR,IAAA,EAAM,MAAA;AAAA,EACN,MAAA,EAAQ,QAAA;AAAA,EACR,KAAA,EAAO,WAAA;AAAA,EACP,KAAA,EAAO,OAAA;AAAA,EACP,GAAA,EAAK,KAAA;AAAA,EACL,MAAA,EAAQ,SAAA;AAAA,EACR,WAAA,EAAa,aAAA;AAAA,EACb,MAAA,EAAQ,QAAA;AAAA,EACR,QAAA,EAAU,iBAAA;AAAA,EACV,cAAA,EAAgB,iBAAA;AAAA,EAChB,UAAA,EAAY,aAAA;AAAA,EACZ,KAAA,EAAO,OAAA;AAAA,EACP,MAAA,EAAQ,QAAA;AAAA,EACR,OAAA,EAAS,SAAA;AAAA,EACT,MAAA,EAAQ,QAAA;AAAA,EACR,MAAA,EAAQ,kBAAA;AAAA,EACR,QAAA,EAAU,WAAA;AAAA,EACV,QAAA,EAAU,WAAA;AAAA,EACV,SAAA,EAAW,YAAA;AAAA,EACX,MAAA,EAAQ,QAAA;AAAA,EACR,SAAA,EAAW,WAAA;AAAA,EACX,KAAA,EAAO,OAAA;AAAA,EACP,IAAA,EAAM,MAAA;AAAA,EACN,mBAAA,EAAqB,sBAAA;AAAA,EACrB,GAAA,EAAK,KAAA;AAAA,EACL,WAAA,EAAa,aAAA;AAAA,EACb,WAAA,EAAa,gBAAA;AAAA,EACb,cAAA,EAAgB,4BAAA;AAAA,EAChB,eAAA,EAAiB,kBAAA;AAAA,EACjB,aAAA,EAAe,mBAAA;AAAA,EACf,QAAA,EAAU,eAAA;AAAA,EACV,yBAAA,EAA2B,aAAA;AAAA,EAC3B,WAAA,EAAa,sBAAA;AAAA,EACb,MAAA,EAAQ,QAAA;AAAA,EACR,SAAA,EAAW,YAAA;AAAA,EACX,aAAA,EAAe,cAAA;AAAA,EACf,WAAA,EAAa,cAAA;AAAA,EACb,aAAA,EAAe,iBAAA;AAAA,EACf,gBAAA,EAAkB,oEAAA;AAAA,EAClB,KAAA,EAAO,UAAA;AAAA,EACP,UAAA,EAAY,OAAA;AAAA,EACZ,WAAA,EAAa,QAAA;AAAA,EACb,SAAA,EAAW,YAAA;AAAA,EACX,KAAA,EAAO,OAAA;AAAA,EACP,KAAA,EAAO,OAAA;AAAA,EACP,SAAA,EAAW,YAAA;AAAA,EACX,KAAA,EAAO,OAAA;AAAA,EACP,gBAAA,EAAkB,mBAAA;AAAA,EAClB,MAAA,EAAQ,SAAA;AAAA,EACR,QAAA,EAAU,UAAA;AAAA,EACV,IAAA,EAAM,MAAA;AAAA,EACN,SAAA,EAAW,WAAA;AAAA,EACX,aAAA,EAAe,OAAA;AAAA,EACf,WAAA,EAAa,QAAA;AAAA,EACb,WAAA,EAAa,gBAAA;AAAA,EACb,iBAAA,EAAmB,qBAAA;AAAA,EACnB,UAAA,EAAY,wBAAA;AAAA,EACZ,cAAA,EAAgB;AACpB,CAAA;AAGO,IAAM,EAAA,GAAgB;AAAA,EACzB,KAAA,EAAO,aAAA;AAAA,EACP,KAAA,EAAO,MAAA;AAAA,EACP,IAAA,EAAM,SAAA;AAAA,EACN,GAAA,EAAK,MAAA;AAAA,EACL,MAAA,EAAQ,QAAA;AAAA,EACR,QAAA,EAAU,YAAA;AAAA,EACV,WAAA,EAAa,6BAAA;AAAA,EACb,SAAA,EAAW,4BAAA;AAAA,EACX,MAAA,EAAQ,WAAA;AAAA,EACR,IAAA,EAAM,aAAA;AAAA,EACN,MAAA,EAAQ,SAAA;AAAA,EACR,KAAA,EAAO,kBAAA;AAAA,EACP,KAAA,EAAO,UAAA;AAAA,EACP,GAAA,EAAK,KAAA;AAAA,EACL,MAAA,EAAQ,qBAAA;AAAA,EACR,WAAA,EAAa,aAAA;AAAA,EACb,MAAA,EAAQ,eAAA;AAAA,EACR,QAAA,EAAU,wBAAA;AAAA,EACV,cAAA,EAAgB,+BAAA;AAAA,EAChB,UAAA,EAAY,yBAAA;AAAA,EACZ,KAAA,EAAO,WAAA;AAAA,EACP,MAAA,EAAQ,cAAA;AAAA,EACR,OAAA,EAAS,SAAA;AAAA,EACT,MAAA,EAAQ,QAAA;AAAA,EACR,MAAA,EAAQ,eAAA;AAAA,EACR,QAAA,EAAU,gBAAA;AAAA,EACV,QAAA,EAAU,gBAAA;AAAA,EACV,SAAA,EAAW,cAAA;AAAA,EACX,MAAA,EAAQ,UAAA;AAAA,EACR,SAAA,EAAW,aAAA;AAAA,EACX,KAAA,EAAO,iBAAA;AAAA,EACP,IAAA,EAAM,UAAA;AAAA,EACN,mBAAA,EAAqB,yBAAA;AAAA,EACrB,GAAA,EAAK,SAAA;AAAA,EACL,WAAA,EAAa,eAAA;AAAA,EACb,WAAA,EAAa,iBAAA;AAAA,EACb,cAAA,EAAgB,yBAAA;AAAA,EAChB,eAAA,EAAiB,sBAAA;AAAA,EACjB,aAAA,EAAe,mBAAA;AAAA,EACf,QAAA,EAAU,oBAAA;AAAA,EACV,yBAAA,EAA2B,aAAA;AAAA,EAC3B,WAAA,EAAa,oCAAA;AAAA,EACb,MAAA,EAAQ,YAAA;AAAA,EACR,SAAA,EAAW,wBAAA;AAAA,EACX,aAAA,EAAe,gCAAA;AAAA,EACf,WAAA,EAAa,gBAAA;AAAA,EACb,aAAA,EAAe,wBAAA;AAAA,EACf,gBAAA,EAAkB,qFAAA;AAAA,EAClB,KAAA,EAAO,UAAA;AAAA,EACP,UAAA,EAAY,WAAA;AAAA,EACZ,WAAA,EAAa,YAAA;AAAA,EACb,SAAA,EAAW,uBAAA;AAAA,EACX,KAAA,EAAO,MAAA;AAAA,EACP,KAAA,EAAO,UAAA;AAAA,EACP,SAAA,EAAW,yBAAA;AAAA,EACX,KAAA,EAAO,QAAA;AAAA,EACP,gBAAA,EAAkB,sBAAA;AAAA,EAClB,MAAA,EAAQ,cAAA;AAAA,EACR,QAAA,EAAU,QAAA;AAAA,EACV,IAAA,EAAM,UAAA;AAAA,EACN,SAAA,EAAW,WAAA;AAAA,EACX,aAAA,EAAe,iBAAA;AAAA,EACf,WAAA,EAAa,kBAAA;AAAA,EACb,WAAA,EAAa,sBAAA;AAAA,EACb,iBAAA,EAAmB,gCAAA;AAAA,EACnB,UAAA,EAAY,0BAAA;AAAA,EACZ,cAAA,EAAgB;AACpB,CAAA;;;ACtIO,SAAS,WAAW,KAAA,EAA8B;AACvD,EAAA,IAAI,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA;AAGtB,EAAA,IAAI,MAAM,UAAA,CAAW,GAAG,KAAK,oBAAA,CAAqB,IAAA,CAAK,KAAK,CAAA,EAAG;AAC7D,IAAA,IAAI,CAAA,GAAI,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAA;AAC9B,IAAA,IAAI,CAAA,CAAE,WAAW,CAAA,EAAG;AAClB,MAAA,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,EAAE,CAAA,CAAE,GAAA,CAAI,UAAQ,IAAA,GAAO,IAAI,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AAAA,IAClD;AACA,IAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAE3B,IAAA,CAAA,GAAI,SAAS,CAAA,CAAE,SAAA,CAAU,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,GAAA;AACtC,IAAA,CAAA,GAAI,SAAS,CAAA,CAAE,SAAA,CAAU,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,GAAA;AACtC,IAAA,CAAA,GAAI,SAAS,CAAA,CAAE,SAAA,CAAU,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,GAAA;AAAA,EACxC,CAAA,MAAA,IAES,KAAA,CAAM,UAAA,CAAW,KAAK,CAAA,EAAG;AAChC,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,MAAM,CAAA;AAChC,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,GAAS,GAAG,OAAO,IAAA;AACvC,IAAA,CAAA,GAAI,QAAA,CAAS,KAAA,CAAM,CAAC,CAAC,CAAA,GAAI,GAAA;AACzB,IAAA,CAAA,GAAI,QAAA,CAAS,KAAA,CAAM,CAAC,CAAC,CAAA,GAAI,GAAA;AACzB,IAAA,CAAA,GAAI,QAAA,CAAS,KAAA,CAAM,CAAC,CAAC,CAAA,GAAI,GAAA;AAAA,EAC3B,CAAA,MACK;AACH,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAG,CAAC,CAAA;AAC5B,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAG,CAAC,CAAA;AAC5B,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,IAAI,CAAA,GAAA,CAAK,MAAM,GAAA,IAAO,CAAA;AAEtB,EAAA,IAAI,QAAQ,GAAA,EAAK;AACf,IAAA,MAAM,IAAI,GAAA,GAAM,GAAA;AAChB,IAAA,CAAA,GAAI,IAAI,GAAA,GAAM,CAAA,IAAK,IAAI,GAAA,GAAM,GAAA,CAAA,GAAO,KAAK,GAAA,GAAM,GAAA,CAAA;AAE/C,IAAA,QAAQ,GAAA;AAAK,MACX,KAAK,CAAA;AAAG,QAAA,CAAA,GAAA,CAAK,CAAA,GAAI,CAAA,IAAK,CAAA,IAAK,CAAA,GAAI,IAAI,CAAA,GAAI,CAAA,CAAA;AAAI,QAAA;AAAA,MAC3C,KAAK,CAAA;AAAG,QAAA,CAAA,GAAA,CAAK,CAAA,GAAI,KAAK,CAAA,GAAI,CAAA;AAAG,QAAA;AAAA,MAC7B,KAAK,CAAA;AAAG,QAAA,CAAA,GAAA,CAAK,CAAA,GAAI,KAAK,CAAA,GAAI,CAAA;AAAG,QAAA;AAAA;AAG/B,IAAA,CAAA,IAAK,CAAA;AAAA,EACP;AAEA,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAG,CAAA;AAC/B,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAG,CAAA;AAC/B,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAG,CAAA;AAE/B,EAAA,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,IAAI,KAAK,IAAI,CAAA,CAAA,CAAA;AACjC;AAmBO,SAAS,eAAe,KAAA,EAA4C;AACzE,EAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AAEpB,EAAA,MAAM,SAAiC,EAAC;AAGxC,EAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,IAAA,MAAM,QAAA,GAAsD;AAAA,MAC1D,cAAA,EAAgB,YAAA;AAAA,MAChB,cAAA,EAAgB,YAAA;AAAA,MAChB,WAAA,EAAa,SAAA;AAAA,MACb,aAAA,EAAe,WAAA;AAAA,MACf,SAAA,EAAW,OAAA;AAAA,MACX,UAAA,EAAY,QAAA;AAAA,MACZ,UAAA,EAAY;AAAA,KACd;AAEA,IAAA,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,MAAA,EAAQ,QAAQ,CAAA,KAAM;AACvD,MAAA,MAAM,UAAA,GAAa,KAAA,CAAM,MAAA,GAAS,QAAQ,CAAA;AAC1C,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,GAAA,GAAM,WAAW,UAAU,CAAA;AACjC,QAAA,IAAI,GAAA,EAAK;AACP,UAAA,MAAA,CAAO,MAAM,CAAA,GAAI,GAAA;AAAA,QACnB;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,MAAM,YAAA,EAAc;AACtB,IAAA,MAAA,CAAO,UAAU,IAAI,KAAA,CAAM,YAAA;AAAA,EAC7B;AAGA,EAAA,IAAI,MAAM,UAAA,EAAY;AACpB,IAAA,MAAA,CAAO,YAAY,IAAI,KAAA,CAAM,UAAA;AAAA,EAC/B;AAEA,EAAA,OAAO,MAAA;AACT;AC1FO,IAAM,mBAAmB,CAAC;AAAA,EAC/B,MAAA;AAAA,EACA,IAAA,EAAM,cAAA;AAAA,EACN,YAAA,EAAc,sBAAA;AAAA,EACd,IAAA,EAAM,cAAA;AAAA,EACN,YAAA,EAAc,sBAAA;AAAA,EACd,YAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,KAA6B;AAC3B,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIF,SAAmB,MAAM,CAAA;AACjE,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,IAAIA,QAAAA,iBAAS,IAAI,MAAM,CAAA;AAC3D,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,SAAS,IAAI,CAAA;AAGvD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,SAA+B,IAAI,CAAA;AAC7E,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,SAA2B,MAAS,CAAA;AAEpF,EAAA,MAAM,OAAO,cAAA,IAAkB,YAAA;AAC/B,EAAA,MAAM,cAAc,cAAA,IAAkB,YAAA;AAGtC,EAAA,MAAM,cAAA,GAAiBK,QAAQ,MAAM;AACnC,IAAA,MAAM,YAA6B,EAAC;AAIpC,IAAA,MAAM,UAAA,GAAakB,OAAAA,CAAQ,WAAA,EAAa,GAAG,CAAA;AAC3C,IAAA,MAAM,QAAA,GAAWjB,OAAAA,CAAQ,WAAA,EAAa,GAAG,CAAA;AAEzC,IAAA,MAAA,CAAO,QAAQ,CAAA,KAAA,KAAS;AACtB,MAAA,IAAI,MAAM,UAAA,EAAY;AACpB,QAAA,IAAI;AACA,UAAA,MAAM,IAAA,GAAO,IAAI,KAAA,CAAM;AAAA,YACnB,IAAA,EAAM,KAAA,CAAM,KAAA,CAAM,UAAA,CAAW,IAAI,CAAA;AAAA,YACjC,QAAA,EAAU,KAAA,CAAM,UAAA,CAAW,QAAA,IAAY,CAAA;AAAA,YACvC,OAAA,EAAS,IAAI,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAAA,YAC7B,KAAA,EAAO,MAAM,UAAA,CAAW,KAAA,GAAQ,IAAI,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,KAAK,CAAA,GAAI,KAAA,CAAA;AAAA,YACnE,KAAA,EAAO,MAAM,UAAA,CAAW;AAAA,WAC3B,CAAA;AAED,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,UAAA,EAAY,QAAQ,CAAA;AAE/C,UAAA,KAAA,CAAM,QAAQ,CAAA,IAAA,KAAQ;AAClB,YAAA,MAAM,QAAA,GAAW,wBAAA,CAAyB,IAAI,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,EAAG,IAAI,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA;AACpF,YAAA,SAAA,CAAU,IAAA,CAAK;AAAA,cACX,GAAG,KAAA;AAAA,cACH,IAAI,CAAA,EAAG,KAAA,CAAM,EAAE,CAAA,CAAA,EAAI,IAAA,CAAK,SAAS,CAAA,CAAA;AAAA;AAAA,cACjC,iBAAiB,KAAA,CAAM,EAAA;AAAA;AAAA,cACvB,KAAA,EAAO,IAAA;AAAA,cACP,KAAK,IAAI,IAAA,CAAK,IAAA,CAAK,OAAA,KAAY,QAAQ;AAAA,aAC1C,CAAA;AAAA,UACL,CAAC,CAAA;AAAA,QACL,SAAS,CAAA,EAAG;AACR,UAAA,OAAA,CAAQ,KAAA,CAAM,iCAAiC,CAAC,CAAA;AAChD,UAAA,SAAA,CAAU,KAAK,KAAK,CAAA;AAAA,QACxB;AAAA,MACF,CAAA,MAAO;AACL,QAAA,SAAA,CAAU,KAAK,KAAK,CAAA;AAAA,MACtB;AAAA,IACF,CAAC,CAAA;AAED,IAAA,OAAO,SAAA;AAAA,EACT,CAAA,EAAG,CAAC,MAAA,EAAQ,WAAW,CAAC,CAAA;AAExB,EAAA,MAAM,gBAAA,GAAmB,CAAC,OAAA,KAAsB;AAC9C,IAAA,IAAI,sBAAA,EAAwB;AAC1B,MAAA,sBAAA,CAAuB,OAAO,CAAA;AAAA,IAChC,CAAA,MAAO;AACL,MAAA,eAAA,CAAgB,OAAO,CAAA;AAAA,IACzB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,gBAAA,GAAmB,CAAC,OAAA,KAAkB;AAC1C,IAAA,IAAI,sBAAA,EAAwB;AAC1B,MAAA,sBAAA,CAAuB,OAAO,CAAA;AAAA,IAChC,CAAA,MAAO;AACL,MAAA,eAAA,CAAgB,OAAO,CAAA;AAAA,IACzB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAK,OAAA;AACH,QAAA,gBAAA,CAAiBjB,SAAAA,CAAU,WAAA,EAAa,CAAC,CAAC,CAAA;AAC1C,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAA,gBAAA,CAAiBmC,QAAAA,CAAS,WAAA,EAAa,CAAC,CAAC,CAAA;AACzC,QAAA;AAAA,MACF,KAAK,KAAA;AAAA,MACL,KAAK,UAAA;AACH,QAAA,gBAAA,CAAiBD,OAAAA,CAAQ,WAAA,EAAa,CAAC,CAAC,CAAA;AACxC,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,gBAAA,CAAiBA,OAAAA,CAAQ,WAAA,EAAa,CAAC,CAAC,CAAA;AACxC,QAAA;AAAA;AACJ,EACF,CAAA;AAEA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAK,OAAA;AACH,QAAA,gBAAA,CAAiBjC,SAAAA,CAAU,WAAA,EAAa,CAAC,CAAC,CAAA;AAC1C,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAA,gBAAA,CAAiBmC,QAAAA,CAAS,WAAA,EAAa,CAAC,CAAC,CAAA;AACzC,QAAA;AAAA,MACF,KAAK,KAAA;AAAA,MACL,KAAK,UAAA;AACH,QAAA,gBAAA,CAAiBnB,OAAAA,CAAQ,WAAA,EAAa,CAAC,CAAC,CAAA;AACxC,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,gBAAA,CAAiBA,OAAAA,CAAQ,WAAA,EAAa,CAAC,CAAC,CAAA;AACxC,QAAA;AAAA;AACJ,EACF,CAAA;AAEA,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,gBAAA,iBAAiB,IAAI,MAAM,CAAA;AAAA,EAC7B,CAAA;AAEA,EAAA,MAAM,eAAA,GAAkB,CAAC,IAAA,KAAe;AACtC,IAAA,gBAAA,CAAiB,IAAI,CAAA;AACrB,IAAA,gBAAA,CAAiB,KAAK,CAAA;AAAA,EACxB,CAAA;AAEA,EAAA,MAAM,mBAAA,GAAsB,CAAC,IAAA,KAAe;AACxC,IAAA,IAAI,QAAA,EAAU;AACd,IAAA,gBAAA,CAAiB,IAAI,CAAA;AACrB,IAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,IAAA,cAAA,CAAe,IAAI,CAAA;AAAA,EACvB,CAAA;AAEA,EAAA,MAAM,wBAAA,GAA2B,CAAC,KAAA,KAAyB;AACvD,IAAA,IAAI,YAAA,EAAc;AACd,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACtB;AAEA,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,gBAAA,CAAiB,KAAK,CAAA;AACtB,MAAA,mBAAA,CAAoB,MAAS,CAAA;AAC7B,MAAA,cAAA,CAAe,IAAI,CAAA;AAAA,IACrB;AAAA,EACJ,CAAA;AAEA,EAAA,MAAM,oBAAoB,MAAM;AAC5B,IAAA,IAAI,QAAA,EAAU;AACd,IAAA,gBAAA,CAAiB,IAAI,CAAA;AACrB,IAAA,mBAAA,iBAAoB,IAAI,MAAM,CAAA;AAC9B,IAAA,cAAA,CAAe,IAAI,CAAA;AAAA,EACvB,CAAA;AAEA,EAAA,MAAM,eAAA,GAAkB,CAAC,SAAA,KAAsC;AAM3D,IAAA,IAAI,mBAAmB,aAAA,EAAe,EAAA;AACtC,IAAA,IAAI,eAAe,eAAA,EAAiB;AAChC,MAAA,gBAAA,GAAmB,aAAA,CAAc,eAAA;AAAA,IACrC;AAEA,IAAA,IAAI,gBAAA,EAAkB;AAElB,MAAA,IAAI,aAAA,EAAe;AACf,QAAA,aAAA,CAAc;AAAA,UACV,GAAG,SAAA;AAAA,UACH,EAAA,EAAI;AAAA,SACU,CAAA;AAAA,MACtB;AAAA,IACJ,CAAA,MAAO;AAEH,MAAA,IAAI,aAAA,EAAe;AACf,QAAA,aAAA,CAAc,SAAS,CAAA;AAAA,MAC3B;AAAA,IACJ;AAAA,EACJ,CAAA;AAEA,EAAA,MAAM,iBAAA,GAAoB,CAAC,OAAA,KAAoB;AAE3C,IAAA,IAAI,gBAAA,GAAmB,OAAA;AACvB,IAAA,IAAI,aAAA,EAAe,eAAA,IAAmB,aAAA,CAAc,EAAA,KAAO,OAAA,EAAS;AAChE,MAAA,gBAAA,GAAmB,aAAA,CAAc,eAAA;AAAA,IACrC;AAEA,IAAA,IAAI,aAAA,EAAe;AACf,MAAA,aAAA,CAAc,gBAAgB,CAAA;AAAA,IAClC;AAAA,EACJ,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAAwB;AAC7C,IAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,EAAK,GAAI,KAAA;AAEzB,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,IAAA,CAAK,OAAA,EAAS,KAAA;AACzC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,IAAA;AAEpC,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,QAAA,EAAU;AAE/B,IAAA,MAAM,aAAA,GAAgB,IAAI,IAAA,CAAK,WAAA,CAAY,KAAK,CAAA;AAChD,IAAA,MAAM,WAAA,GAAc,IAAI,IAAA,CAAK,WAAA,CAAY,GAAG,CAAA;AAC5C,IAAA,MAAM,QAAA,GAAW,wBAAA,CAAyB,WAAA,EAAa,aAAa,CAAA;AAEpE,IAAA,IAAI,QAAA;AAEJ,IAAA,IAAI,SAAS,OAAA,EAAS;AAGlB,MAAA,IAAI,QAAA,EAAU;AAEZ,QAAA,MAAM,aAAA,GAAgBP,WAAAA,CAAY,aAAA,EAAe,QAAQ,CAAA;AAEzD,QAAA,MAAM,QAAA,GAAW,IAAI,IAAA,CAAK,QAAQ,CAAA;AAClC,QAAA,QAAA,CAAS,QAAA,CAAS,aAAA,CAAc,QAAA,EAAU,CAAA;AAC1C,QAAA,QAAA,CAAS,UAAA,CAAW,aAAA,CAAc,UAAA,EAAY,CAAA;AAC9C,QAAA,QAAA,CAAS,UAAA,CAAW,aAAA,CAAc,UAAA,EAAY,CAAA;AAC9C,QAAA,QAAA,CAAS,eAAA,CAAgB,aAAA,CAAc,eAAA,EAAiB,CAAA;AAExD,QAAA,QAAA,GAAW,aAAA,CAAc,UAAU,QAAQ,CAAA;AAAA,MAC7C,CAAA,MAAO;AACL,QAAA,QAAA,GAAW,IAAI,KAAK,QAAQ,CAAA;AAC5B,QAAA,QAAA,CAAS,QAAA,CAAS,aAAA,CAAc,QAAA,EAAU,CAAA;AAC1C,QAAA,QAAA,CAAS,UAAA,CAAW,aAAA,CAAc,UAAA,EAAY,CAAA;AAC9C,QAAA,QAAA,CAAS,UAAA,CAAW,aAAA,CAAc,UAAA,EAAY,CAAA;AAC9C,QAAA,QAAA,CAAS,eAAA,CAAgB,aAAA,CAAc,eAAA,EAAiB,CAAA;AAAA,MAC1D;AAAA,IACJ,CAAA,MAAO;AAGH,MAAA,IAAI,QAAA,EAAU;AAIZ,QAAA,QAAA,GAAW,aAAA,CAAc,UAAU,QAAQ,CAAA;AAAA,MAC7C,CAAA,MAAO;AAEL,QAAA,QAAA,GAAW,IAAI,KAAK,QAAQ,CAAA;AAAA,MAC9B;AAEA,MAAA,QAAA,CAAS,WAAW,CAAC,CAAA;AACrB,MAAA,QAAA,CAAS,gBAAgB,CAAC,CAAA;AAAA,IAC9B;AAEA,IAAA,MAAM,SAAS,IAAI,IAAA,CAAK,QAAA,CAAS,OAAA,KAAY,QAAQ,CAAA;AAGrD,IAAA,IAAI,gBAAgB,WAAA,CAAY,UAAA;AAChC,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,UAAA;AAC1C,IAAA,IAAI,cAAA,EAAgB;AAChB,MAAA,aAAA,GAAgB,cAAA;AAAA,IACpB;AAGA,IAAA,IAAI,QAAA,CAAS,OAAA,EAAQ,KAAM,aAAA,CAAc,SAAQ,IAC7C,MAAA,CAAO,OAAA,EAAQ,KAAM,WAAA,CAAY,OAAA,EAAQ,IACzC,aAAA,KAAkB,YAAY,UAAA,EAChC;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,aAAA,CAAc;AAAA,QACZ,GAAG,WAAA;AAAA,QACH,KAAA,EAAO,QAAA;AAAA,QACP,GAAA,EAAK,MAAA;AAAA,QACL,UAAA,EAAY;AAAA,OACb,CAAA;AAAA,IACH;AAAA,EACF,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,WAAA;AAAA,IACA,aAAA;AAAA,IACA,gBAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAA;AAAA,IACA,aAAA;AAAA,IACA,gBAAA;AAAA,IACA,cAAA;AAAA,IACA,gBAAA;AAAA,IACA,gBAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA;AAAA,IACA,eAAA;AAAA,IACA,mBAAA;AAAA,IACA,wBAAA;AAAA,IACA,iBAAA;AAAA,IACA,eAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GACF;AACF,CAAA;AChTO,IAAM,eAAA,GAAkB,CAC7B,OAAA,KACG;AACH,EAAA,MAAM;AAAA,IACJ,WAAA;AAAA,IACA,YAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA,GAAY,GAAA;AAAA,IACZ,SAAA,GAAY,GAAA;AAAA,IACZ,WAAA,GAAc,GAAA;AAAA,IACd,OAAA,GAAU;AAAA,GACZ,GAAI,OAAA;AAEJ,EAAA,MAAM,YAAA,GAAeE,OAAyB,IAAI,CAAA;AAClD,EAAA,MAAM,UAAA,GAAaA,OAAU,IAAI,CAAA;AAEjC,EAAA,MAAM,gBAAA,GAAmBC,WAAAA,CAAY,CAAC,CAAA,KAAkB;AACtD,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA;AACzB,IAAA,YAAA,CAAa,OAAA,GAAU;AAAA,MACrB,QAAQ,KAAA,CAAM,OAAA;AAAA,MACd,QAAQ,KAAA,CAAM,OAAA;AAAA,MACd,SAAA,EAAW,KAAK,GAAA;AAAI,KACtB;AAAA,EACF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,MAAM,cAAA,GAAiBA,WAAAA,CAAY,CAAC,CAAA,KAAkB;AACpD,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,YAAA,CAAa,OAAA,EAAS;AAEvC,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,cAAA,CAAe,CAAC,CAAA;AAChC,IAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,SAAA,KAAc,YAAA,CAAa,OAAA;AAEnD,IAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA;AAC9B,IAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA;AAC9B,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAGjC,IAAA,IAAI,eAAe,WAAA,EAAa;AAE9B,MAAA,IAAI,IAAA,CAAK,IAAI,KAAK,CAAA,IAAK,aAAa,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,IAAK,SAAA,EAAW;AAChE,QAAA,IAAI,QAAQ,CAAA,EAAG;AACb,UAAA,YAAA,IAAe;AAAA,QACjB,CAAA,MAAO;AACL,UAAA,WAAA,IAAc;AAAA,QAChB;AAAA,MACF,CAAA,MAAA,IAES,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,IAAK,aAAa,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,IAAK,SAAA,EAAW;AACrE,QAAA,IAAI,QAAQ,CAAA,EAAG;AACb,UAAA,WAAA,IAAc;AAAA,QAChB,CAAA,MAAO;AACL,UAAA,SAAA,IAAY;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAEA,IAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AAAA,EACzB,CAAA,EAAG,CAAC,OAAA,EAAS,SAAA,EAAW,SAAA,EAAW,aAAa,WAAA,EAAa,YAAA,EAAc,SAAA,EAAW,WAAW,CAAC,CAAA;AAElG,EAAAO,UAAU,MAAM;AACd,IAAA,MAAM,UAAU,UAAA,CAAW,OAAA;AAC3B,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,OAAA,CAAQ,iBAAiB,YAAA,EAAc,gBAAA,EAAkB,EAAE,OAAA,EAAS,MAAM,CAAA;AAC1E,IAAA,OAAA,CAAQ,iBAAiB,UAAA,EAAY,cAAA,EAAgB,EAAE,OAAA,EAAS,MAAM,CAAA;AAEtE,IAAA,OAAO,MAAM;AACX,MAAA,OAAA,CAAQ,mBAAA,CAAoB,cAAc,gBAAgB,CAAA;AAC1D,MAAA,OAAA,CAAQ,mBAAA,CAAoB,YAAY,cAAc,CAAA;AAAA,IACxD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,gBAAA,EAAkB,cAAc,CAAC,CAAA;AAErC,EAAA,OAAO,UAAA;AACT,CAAA;AAGO,IAAM,YAAA,GAAe,CAC1B,MAAA,EACA,MAAA,EACA,UAAmB,IAAA,KAChB;AACH,EAAA,OAAO,eAAA,CAAmB;AAAA,IACxB,WAAA,EAAa,MAAA;AAAA,IACb,YAAA,EAAc,MAAA;AAAA,IACd,SAAA,EAAW,EAAA;AAAA,IACX,SAAA,EAAW,GAAA;AAAA,IACX,WAAA,EAAa,GAAA;AAAA,IACb;AAAA,GACD,CAAA;AACH,CAAA;;;ACtEO,IAAM,YAAqC,CAAC;AAAA,EACjD,SAAS,EAAC;AAAA,EACV,IAAA,EAAM,cAAA;AAAA,EACN,YAAA,EAAc,sBAAA;AAAA,EACd,IAAA,EAAM,cAAA;AAAA,EACN,YAAA,EAAc,sBAAA;AAAA,EACd,YAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,gBAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,eAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,gBAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA;AAAA,EACA,gBAAA;AAAA,EACA,QAAA;AAAA,EACA,gBAAA;AAAA,EACA;AAAA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIT,SAA+B,IAAI,CAAA;AAGjF,EAAA,MAAM;AAAA,IACJ,gBAAA;AAAA,IACA,mBAAA;AAAA,IAEA;AAAA,MACE,mBAAA,EAAoB;AAExB,EAAA,MAAM;AAAA,IACJ,IAAA;AAAA,IACA,WAAA;AAAA,IACA,aAAA;AAAA,IACA,gBAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAA;AAAA,IACA,aAAA;AAAA,IACA,gBAAA;AAAA,IACA,gBAAA;AAAA,IACA,gBAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA;AAAA,IACA,eAAA;AAAA,IACA,mBAAA;AAAA,IACA,wBAAA;AAAA,IACA,iBAAA;AAAA,IACA,eAAA;AAAA,IACA,iBAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA;AAAA,MACE,gBAAA,CAAiB;AAAA,IACnB,MAAA;AAAA,IACA,IAAA,EAAM,cAAA;AAAA,IACN,YAAA,EAAc,sBAAA;AAAA,IACd,IAAA,EAAM,cAAA;AAAA,IACN,YAAA,EAAc,sBAAA;AAAA,IACd,YAAA;AAAA,IACA,aAAA;AAAA,IACA,aAAA;AAAA,IACA,aAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,OAAA,GAAU,UAAA;AAAA,IACd,UAAU,aAAA,EAAe;AAAA,MACvB,oBAAA,EAAsB;AAAA,QACpB,QAAA,EAAU;AAAA;AACZ,KACD;AAAA,GACH;AAEA,EAAA,MAAM,QAAA,GAAW,EAAA;AACjB,EAAA,MAAM,UAAA,GAAa,mBAAmB,QAAQ,CAAA;AAC9C,EAAA,MAAM,SAAA,GAAwB,CAAC,UAAA,EAAY,qBAAqB,CAAA;AAGhE,EAAA,MAAM,UAAA,GAAa,QAAA,GAAW,EAAC,GAAI,OAAA;AAGnC,EAAA,MAAM,iBAAA,GAAoB,CAAC,KAAA,EAAsB,MAAA,KAAiB;AAChE,IAAA,IAAI,QAAA,EAAU;AAGd,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,aAAA,CAAc,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,MAAM,CAAA;AAAA,IAC1C;AAGA,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,aAAA,CAAc;AAAA,QACZ,GAAG,KAAA;AAAA,QACH,GAAA,EAAK;AAAA,OACN,CAAA;AAAA,IACH;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,KAAK,KAAA,EAAM;AAGjB,EAAA,MAAM,QAAA,GAAW,YAAA,CAA6B,UAAA,EAAY,UAAA,EAAY,IAAI,CAAA;AAK1E,EAAA,MAAM,YAAA,GAAe,QAAA,KAAa,IAAA,GAAO,EAAA,GAAK,EAAA;AAE9C,EAAA,MAAM,CAAA,GAAI;AAAA,IACR,GAAG,YAAA;AAAA,IACH,GAAG;AAAA,GACL;AAGA,EAAA,MAAM,iBAAA,GAAoB,eAAA,CAAgB,MAAM,CAAA,GAAI,MAAA,GAAS,QAAA;AAE7D,EAAA,MAAM,eAAA,GAAkB,CAAC,KAAA,KAAe;AACtC,IAAA,MAAM,EAAE,QAAO,GAAI,KAAA;AACnB,IAAA,MAAM,eAAe,cAAA,CAAe,IAAA,CAAK,OAAK,CAAA,CAAE,EAAA,KAAO,OAAO,EAAE,CAAA;AAChE,IAAA,IAAI,YAAA,EAAc;AACd,MAAA,kBAAA,CAAmB,YAAY,CAAA;AAAA,IACnC;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,gBAAA,GAAmB,CAAC,KAAA,KAAe;AACrC,IAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,IAAA,aAAA,CAAc,KAAK,CAAA;AAAA,EACvB,CAAA;AAGA,EAAA,MAAM,gBAAgB,MAAM;AACxB,IAAA,IAAI,CAAC,iBAAiB,OAAO,MAAA;AAE7B,IAAA,IAAI,SAAS,UAAA,EAAY;AACvB,MAAA,OAAO,EAAA;AAAA,IACT;AAEA,IAAA,IAAI,IAAA,KAAS,MAAA,IAAU,IAAA,KAAS,KAAA,EAAO,OAAO,MAAA;AAC9C,IAAA,MAAM,QAAA,GAAWG,mBAAAA,CAAoB,eAAA,CAAgB,GAAA,EAAK,gBAAgB,KAAK,CAAA;AAQ/E,IAAA,MAAM,UAAA,GAAa,IAAA,KAAS,KAAA,GAAQ,EAAA,GAAK,EAAA;AACzC,IAAA,OAAQ,WAAW,EAAA,GAAM,UAAA;AAAA,EAC7B,CAAA;AAEA,EAAA,MAAM,eAAe,MAAM;AACvB,IAAA,IAAI,IAAA,KAAS,SAAS,OAAO,MAAA;AAE7B,IAAA,IAAI,IAAA,KAAS,cAAc,eAAA,EAAiB;AACxC,MAAA,MAAM,QAAA,GAAWA,mBAAAA,CAAoB,eAAA,CAAgB,GAAA,EAAK,gBAAgB,KAAK,CAAA;AAC/E,MAAA,MAAM,KAAA,GAAS,WAAW,EAAA,GAAM,GAAA;AAChC,MAAA,OAAO,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,CAAC,CAAC,CAAA,EAAA,CAAA;AAAA,IAChC;AAIA,IAAA,OAAO,OAAA;AAAA,EACX,CAAA;AAGA,EAAA,MAAM,cAAA,GAAiBE,QAAQ,MAAM;AACjC,IAAA,IAAI,CAAC,WAAW,OAAO,cAAA;AACvB,IAAA,MAAM,iBAAA,GAAoB,SAAA,CAAU,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,MAAA,KAAW,KAAK,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,EAAE,CAAA;AACjF,IAAA,OAAO,cAAA,CAAe,OAAO,CAAA,CAAA,KAAK;AAG9B,MAAA,IAAI,CAAC,CAAA,CAAE,UAAA,EAAY,OAAO,IAAA;AAC1B,MAAA,OAAO,iBAAA,CAAkB,QAAA,CAAS,CAAA,CAAE,UAAU,CAAA;AAAA,IAClD,CAAC,CAAA;AAAA,EACL,CAAA,EAAG,CAAC,cAAA,EAAgB,SAAS,CAAC,CAAA;AAE9B,EAAA,uBACElB,gBAAAA,CAAA,aAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACG,EAAA;AAAA,MACA,OAAA,EAAS,UAAA;AAAA,MACT,WAAA,EAAa,eAAA;AAAA,MACb,SAAA,EAAW,gBAAA;AAAA,MACX;AAAA,KAAA;AAAA,oBAEFA,gBAAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,EAAA,CAAG,6DAAA,EAA+D,SAAS,CAAA;AAAA,QACtF,KAAA,EAAO,eAAe,KAAK;AAAA,OAAA;AAAA,sBAE3BA,gBAAAA,CAAA,aAAA;AAAA,QAAC,cAAA;AAAA,QAAA;AAAA,UACC,WAAA;AAAA,UACA,MAAA,EAAQ,UAAA;AAAA,UACR,MAAA,EAAQ,UAAA;AAAA,UACR,OAAA,EAAS,WAAA;AAAA,UACT,IAAA;AAAA,UACA,YAAA,EAAc,gBAAA;AAAA,UACd,WAAA,EAAa,MAAM,gBAAA,CAAiB,CAAC,aAAa,CAAA;AAAA,UAClD,UAAA;AAAA,UACA,aAAA;AAAA,UACA,YAAA,EAAc,CAAA;AAAA,UACd,gBAAA;AAAA,UACA,QAAA;AAAA,UACA,gBAAA;AAAA,UACA;AAAA;AAAA,OACF;AAAA,sBAEAA,gBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,6BAAA,EAAA,kBACXA,gBAAAA,CAAA,aAAA;AAAA,QAAC0B,MAAAA,CAAO,GAAA;AAAA,QAAP;AAAA,UACG,SAAA,EAAW,EAAA;AAAA,YACT;AAAA,WACF;AAAA,UACA,OAAA,EAAS,KAAA;AAAA,UACT,OAAA,EAAS;AAAA,YACP,KAAA,EAAO,gBAAgB,GAAA,GAAM,CAAA;AAAA,YAC7B,OAAA,EAAS,gBAAgB,CAAA,GAAI;AAAA,WAC/B;AAAA,UACA,UAAA,EAAY;AAAA,YACV,QAAA,EAAU,GAAA;AAAA,YACV,IAAA,EAAM,CAAC,GAAA,EAAK,CAAA,EAAG,KAAK,CAAC;AAAA;AACvB,SAAA;AAAA,wBAEA1B,gBAAAA,CAAA,aAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACG,WAAA;AAAA,YACA,YAAA,EAAc,gBAAA;AAAA,YACd,YAAA,EAAc,gBAAA;AAAA,YACd,aAAA,EAAe,iBAAA;AAAA,YACf,QAAA;AAAA,YACA,gBAAA;AAAA,YACA,SAAA,EAAU,eAAA;AAAA,YACV,QAAA;AAAA,YACA,SAAA;AAAA,YACA,gBAAA;AAAA,YACA,YAAA,EAAc,CAAA;AAAA,YACd;AAAA;AAAA;AACJ,yBAGJA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,+CAAA,EAAA,EACV,SAAA,mBACGA,gBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qDACbA,gBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EAAA,EACZ,IAAA,KAAS,2BAAWA,gBAAAA,CAAA,aAAA,CAAC,iBAAA,EAAA,IAAkB,GACvC,IAAA,KAAS,MAAA,oBAAUA,gBAAAA,CAAA,cAAC,gBAAA,EAAA,IAAiB,CAAA,EACrC,SAAS,KAAA,oBAASA,iBAAA,aAAA,CAAC,eAAA,EAAA,IAAgB,CAAA,EACnC,IAAA,KAAS,4BAAYA,gBAAAA,CAAA,aAAA,CAAC,kBAAA,EAAA,IAAmB,GACzC,IAAA,KAAS,UAAA,oBAAcA,gBAAAA,CAAA,cAAC,gBAAA,EAAA,IAAiB,CAC5C,CACF,CAAA,mBAEJA,iBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,QAAA,EAAU,WAAU,6CAAA,EAAA,kBAC5BA,iBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mBAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA,CAACmC,iBAAA,EAAgB,IAAA,EAAK,QAAO,OAAA,EAAS,KAAA,EAAA,kBAClCnC,gBAAAA,CAAA,aAAA;AAAA,QAAC0B,MAAAA,CAAO,GAAA;AAAA,QAAP;AAAA,UACG,GAAA,EAAK,GAAG,IAAI,CAAA,CAAA,EAAI,YAAY,WAAA,EAAa,CAAA,CAAA,EAAI,QAAA,IAAY,OAAO,CAAA,CAAA;AAAA,UAChE,SAAS,EAAE,OAAA,EAAS,GAAG,KAAA,EAAO,IAAA,EAAM,GAAG,EAAA,EAAG;AAAA,UAC1C,OAAA,EAAS;AAAA,YACP,OAAA,EAAS,CAAA;AAAA,YACT,KAAA,EAAO,CAAA;AAAA,YACP,CAAA,EAAG,CAAA;AAAA,YACH,UAAA,EAAY;AAAA,cACV,QAAA,EAAU,IAAA;AAAA,cACV,IAAA,EAAM,CAAC,IAAA,EAAM,GAAA,EAAK,MAAM,CAAC;AAAA;AAC3B,WACF;AAAA,UACA,IAAA,EAAM;AAAA,YACJ,OAAA,EAAS,CAAA;AAAA,YACT,KAAA,EAAO,IAAA;AAAA,YACP,CAAA,EAAG,GAAA;AAAA,YACH,UAAA,EAAY;AAAA,cACV,QAAA,EAAU,IAAA;AAAA,cACV,IAAA,EAAM,CAAC,IAAA,EAAM,GAAA,EAAK,MAAM,CAAC;AAAA;AAC3B,WACF;AAAA,UACA,SAAA,EAAU;AAAA,SAAA;AAAA,QAET,IAAA,KAAS,OAAA,oBACN1B,gBAAAA,CAAA,aAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACD,WAAA;AAAA,YACA,MAAA,EAAQ,cAAA;AAAA,YACR,YAAA,EAAc,wBAAA;AAAA,YACd,WAAA,EAAa,eAAA;AAAA,YACb,QAAA;AAAA,YACA;AAAA;AAAA,SACA;AAAA,QAEH,IAAA,KAAS,MAAA,oBACNA,gBAAAA,CAAA,aAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACD,WAAA;AAAA,YACA,MAAA,EAAQ,cAAA;AAAA,YACR,YAAA,EAAc,wBAAA;AAAA,YACd,eAAA,EAAiB,mBAAA;AAAA,YACjB,aAAA,EAAe,iBAAA;AAAA,YACf,QAAA;AAAA,YACA,MAAA;AAAA,YACA,QAAA,EAAU;AAAA;AAAA,SACV;AAAA,QAEH,IAAA,KAAS,KAAA,oBACNA,gBAAAA,CAAA,aAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACG,WAAA;AAAA,YACA,MAAA,EAAQ,cAAA;AAAA,YACR,YAAA,EAAc,wBAAA;AAAA,YACd,eAAA,EAAiB,mBAAA;AAAA,YACjB,aAAA,EAAe,iBAAA;AAAA,YACf,QAAA;AAAA,YACA,MAAA;AAAA,YACA,QAAA,EAAU;AAAA;AAAA,SACd;AAAA,QAEH,IAAA,KAAS,QAAA,oBACNA,gBAAAA,CAAA,aAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACG,WAAA;AAAA,YACA,MAAA,EAAQ,cAAA;AAAA,YACR,YAAA,EAAc,wBAAA;AAAA,YACd,aAAA,EAAe,iBAAA;AAAA,YACf,MAAA;AAAA,YACA,YAAA,EAAc;AAAA;AAAA,SAClB;AAAA,QAEH,IAAA,KAAS,UAAA,IAAc,SAAA,oBACpBA,gBAAAA,CAAA,aAAA;AAAA,UAAC,YAAA;AAAA,UAAA;AAAA,YACG,WAAA;AAAA,YACA,MAAA,EAAQ,cAAA;AAAA,YACR,SAAA;AAAA,YACA,YAAA,EAAc,wBAAA;AAAA,YACd,eAAA,EAAiB,CAAC,IAAA,EAAM,UAAA,KAAe;AAInC,cAAA,IAAI,QAAA,EAAU;AAEd,cAAA,mBAAA,CAAoB,IAAI,CAAA;AAAA,YAC5B,CAAA;AAAA,YACA;AAAA;AAAA;AACJ,OAGZ,CACF,CACF,CAAA,kBAIAA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0CAAA,EAAA,kBACXA,gBAAAA,CAAA,aAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACG,OAAA,EAAS,iBAAA;AAAA,UACT,SAAA,EAAU;AAAA,SAAA;AAAA,wBAEVA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,OAAM,4BAAA,EAA6B,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,MAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,QAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAAI,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAA,kBAAQA,gBAAAA,CAAA,cAAC,MAAA,EAAA,EAAK,CAAA,EAAE,UAAA,EAAU,CAAA,kBAAEA,gBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,YAAU,CAAE;AAAA,OAElO,CACJ,CACJ,CAAA;AAAA,MAEC,kBACG,eAAA,CAAgB;AAAA,QACZ,MAAA,EAAQ,WAAA;AAAA,QACR,OAAA,EAAS,MAAM,cAAA,CAAe,KAAK,CAAA;AAAA,QACnC,KAAA,EAAO,aAAA;AAAA,QACP,WAAA,EAAa,gBAAA;AAAA,QACb,MAAA,EAAQ,eAAA;AAAA,QACR,QAAA,EAAU;AAAA,OACb,CAAA,mBAEDA,gBAAAA,CAAA,aAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACG,MAAA,EAAQ,WAAA;AAAA,UACR,OAAA,EAAS,MAAM,cAAA,CAAe,KAAK,CAAA;AAAA,UACnC,KAAA,EAAO,aAAA;AAAA,UACP,WAAA,EAAa,gBAAA;AAAA,UACb,MAAA,EAAQ,eAAA;AAAA,UACR,QAAA,EAAU,iBAAA;AAAA,UACV,SAAA;AAAA,UACA,UAAA;AAAA,UACA,YAAA,EAAc;AAAA;AAAA,OAClB;AAAA,sBAIJA,gBAAAA,CAAA,aAAA;AAAA,QAAC,gBAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,gBAAA;AAAA,UACP,QAAA,EAAU,mBAAA;AAAA,UACV,OAAA,EAAS,gBAAA;AAAA,UACT,MAAA,EAAQ,CAAC,KAAA,KAAU;AACjB,YAAA,wBAAA,CAAyB,KAAK,CAAA;AAC9B,YAAA,gBAAA,EAAiB;AAAA,UACnB,CAAA;AAAA,UACA,QAAA,EAAU,CAAC,OAAA,KAAY;AACrB,YAAA,aAAA,GAAgB,OAAO,CAAA;AACvB,YAAA,gBAAA,EAAiB;AAAA,UACnB,CAAA;AAAA,UACA,WAAA,EAAa,CAAC,KAAA,KAAU;AAEtB,YAAA,MAAM,eAAA,GAA0C;AAAA,cAC9C,GAAG,KAAA;AAAA,cACH,IAAI,CAAA,EAAG,KAAA,CAAM,EAAE,CAAA,MAAA,EAAS,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,cAClC,KAAA,EAAO,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,OAAA,CAAA;AAAA,cACrB,KAAA,EAAO,IAAI,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,SAAQ,GAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAI,CAAA;AAAA;AAAA,cAC3D,GAAA,EAAK,IAAI,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,SAAQ,GAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAI;AAAA,aACzD;AACA,YAAA,aAAA,GAAgB,eAAe,CAAA;AAC/B,YAAA,gBAAA,EAAiB;AAAA,UACnB,CAAA;AAAA,UACA,YAAA,EAAc;AAAA,YACZ,IAAA,EAAM,CAAA,CAAE,IAAA,IAAQ,CAAA,CAAE,SAAA,IAAa,MAAA;AAAA,YAC/B,MAAA,EAAQ,EAAE,MAAA,IAAU,QAAA;AAAA,YACpB,SAAA,EAAW,EAAE,SAAA,IAAa;AAAA;AAC5B;AAAA,OACF;AAAA,sBAEAA,iBAAA,aAAA,CAAC,WAAA,EAAA,EAAY,eAAe,IAAA,EAAA,EACvB,eAAA,mBACGA,gBAAAA,CAAA,aAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACG,SAAA,EAAW,EAAA;AAAA,YACT,qFAAA;AAAA,YACA,kBAAA;AAAA,YACA,CAAC,gBAAgB,KAAA,IAAS;AAAA,WAC5B;AAAA,UACA,KAAA,EAAO;AAAA,YACH,iBAAiB,eAAA,CAAgB,KAAA,GAAQ,CAAA,EAAG,eAAA,CAAgB,KAAK,CAAA,EAAA,CAAA,GAAO,MAAA;AAAA,YACxE,aAAa,eAAA,CAAgB,KAAA,GAAQ,CAAA,EAAG,eAAA,CAAgB,KAAK,CAAA,EAAA,CAAA,GAAO,MAAA;AAAA,YACpE,KAAA,EAAO,eAAA,CAAgB,KAAA,GAAQ,MAAA,GAAS,MAAA;AAAA,YACxC,OAAO,YAAA,EAAa;AAAA,YACpB,QAAQ,aAAA,EAAc,GAAI,CAAA,EAAG,aAAA,EAAe,CAAA,EAAA,CAAA,GAAO,MAAA;AAAA,YACnD,SAAA,EAAW,CAAA,kBAAA,EAAqB,eAAA,CAAgB,KAAA,IAAS,gBAAgB,CAAA,qCAAA,CAAA;AAAA,YACzE,SAAA,EAAW;AAAA;AACf,SAAA;AAAA,wBAEAA,gBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,4BAAA,EAAA,kBAEXA,gBAAAA,CAAA,aAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,iDAAA;AAAA,YACV,KAAA,EAAO,EAAE,eAAA,EAAiB,eAAA,CAAgB,SAAS,gBAAA;AAAiB;AAAA,2BAItEA,gBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,MAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,gCAAA,EAAA,EAAkC,gBAAgB,KAAM,CAAA,EAAA,CACrE,SAAS,MAAA,IAAU,IAAA,KAAS,KAAA,KAAU,aAAA,MAAmB,aAAA,EAAc,GAAK,EAAA,oBAC5EA,iBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mDAAA,EAAA,kBACbA,gBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,SAAA,EAAU,SAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,gBAAe,WAAA,EAAY,GAAA,EAAA,kBACzFA,gBAAAA,CAAA,cAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,MAAK,CAAA,EAAE,IAAA,EAAI,mBAC9BA,gBAAAA,CAAA,cAAC,MAAA,EAAA,EAAK,CAAA,EAAE,aAAA,EAAa,CACvB,GACCC,MAAAA,CAAO,eAAA,CAAgB,OAAO,iBAAA,EAAmB,EAAE,QAAQ,CAAA,EAAE,KAAA,EAAIA,MAAAA,CAAO,gBAAgB,GAAA,EAAK,iBAAA,EAAmB,EAAE,MAAA,EAAQ,CAC7H,CAEJ,CAAA,kBAGAD,gBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0CAAA,EAAA,kBACbA,iBAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,SAAQ,WAAA,EAAY,IAAA,EAAK,kCAChDA,gBAAAA,CAAA,cAAC,QAAA,EAAA,EAAO,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,KAAI,CAAA,EAAE,KAAA,EAAK,CAAA,kBAC7BA,iBAAA,aAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAI,CAAA,EAAE,OAAK,CAAA,kBAC9BA,iBAAA,aAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,CAAA,EAAE,KAAA,EAAK,CAAA,kBAC9BA,gBAAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,GAAE,KAAA,EAAK,CAAA,kBAC/BA,gBAAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,KAAI,EAAA,EAAG,IAAA,EAAK,GAAE,KAAA,EAAK,CAAA,kBAC9BA,gBAAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,GAAE,KAAA,EAAK,CACjC,CACF,CACJ;AAAA,UAEJ,IACR;AAAA;AAEF,GACF;AAEJ","file":"index.mjs","sourcesContent":["import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\nimport type { CalendarEvent } from \"./types\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\nexport const isEventDragDisabled = (event?: CalendarEvent) => event?.draggable === false\n\n// An event without an explicit `resizable` inherits the lock from `draggable`.\nexport const isEventResizeDisabled = (event?: CalendarEvent) =>\n event?.resizable === false || (event?.resizable === undefined && isEventDragDisabled(event))\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"../../utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-10 px-4 py-2\",\n sm: \"h-9 rounded-md px-3\",\n lg: \"h-11 rounded-md px-8\",\n icon: \"h-10 w-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = \"button\"\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n )\n }\n)\nButton.displayName = \"Button\"\n\nexport { Button, buttonVariants }\n","import React from 'react';\nimport { format, Locale } from 'date-fns';\nimport { Button } from './ui/button';\nimport { ChevronLeft, ChevronRight, Menu, Moon, Sun, CalendarDays, CalendarRange, Calendar, ListTodo } from 'lucide-react';\nimport { ViewType } from '../types';\nimport { cn } from '../utils';\n\ninterface CalendarHeaderProps {\n currentDate: Date;\n onPrev: () => void;\n onNext: () => void;\n onToday: () => void;\n view: ViewType;\n onViewChange: (view: ViewType) => void;\n onMenuClick?: () => void;\n isDarkMode?: boolean;\n onThemeToggle?: () => void;\n translations: any;\n hideViewSwitcher?: boolean;\n language?: 'en' | 'fr';\n onLanguageChange?: (lang: 'en' | 'fr') => void;\n locale?: Locale;\n}\n\nexport const CalendarHeader: React.FC<CalendarHeaderProps> = ({\n currentDate,\n onPrev,\n onNext,\n onToday,\n view,\n onViewChange,\n onMenuClick,\n isDarkMode,\n onThemeToggle,\n translations,\n hideViewSwitcher,\n language,\n onLanguageChange,\n locale\n}) => {\n const viewConfig = [\n { key: 'month', icon: CalendarDays },\n { key: 'week', icon: CalendarRange },\n { key: 'day', icon: Calendar },\n { key: 'agenda', icon: ListTodo },\n ] as const;\n\n return (\n <div className=\"flex flex-col md:flex-row items-center justify-between px-3 md:px-5 py-3 border-b-[0px] border-border/50 bg-gradient-to-r from-background via-background to-muted/20 gap-3 md:gap-0 min-h-[64px]\">\n {/* Left Section: Menu, Navigation, Title */}\n <div className=\"flex items-center gap-2 w-full md:w-auto justify-between md:justify-start\">\n <div className=\"flex items-center gap-2 md:gap-3\">\n {/* Menu Button */}\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"text-muted-foreground hover:text-foreground hover:bg-accent/80 rounded-xl h-10 w-10 hidden md:inline-flex transition-all duration-200\"\n onClick={onMenuClick}\n >\n <Menu className=\"h-5 w-5\" />\n </Button>\n\n {/* Today Button */}\n <Button\n variant=\"outline\"\n onClick={onToday}\n className=\"h-9 px-5 rounded-xl text-sm font-medium hidden sm:inline-flex border-[0.5px] border-border/60 hover:border-primary/40 hover:bg-primary/5 hover:text-primary transition-all duration-200\"\n >\n {translations.today}\n </Button>\n\n {/* Navigation Arrows */}\n <div className=\"flex items-center bg-muted/40 rounded-xl p-0.5\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={onPrev}\n className=\"rounded-lg h-8 w-8 hover:bg-background/80 transition-all duration-200\"\n >\n <ChevronLeft className=\"h-4 w-4 text-muted-foreground\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={onNext}\n className=\"rounded-lg h-8 w-8 hover:bg-background/80 transition-all duration-200\"\n >\n <ChevronRight className=\"h-4 w-4 text-muted-foreground\" />\n </Button>\n </div>\n\n {/* Current Date Display */}\n <div className=\"ml-2 md:ml-4\">\n <h2 className=\"text-lg md:text-xl font-semibold text-foreground whitespace-nowrap capitalize tracking-tight\">\n {format(currentDate, 'MMMM yyyy', { locale })}\n </h2>\n </div>\n </div>\n </div>\n\n {/* Right Section: View Switcher & Theme Toggle */}\n <div className=\"flex items-center gap-2 md:gap-3 w-full md:w-auto justify-end\">\n {/* Language Toggle */}\n {onLanguageChange && language && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => onLanguageChange(language === 'en' ? 'fr' : 'en')}\n className=\"h-9 px-3 rounded-xl text-xs font-semibold text-muted-foreground hover:text-foreground hover:bg-accent/80 transition-all duration-200 uppercase tracking-wider\"\n >\n {language}\n </Button>\n )}\n\n {/* Theme Toggle */}\n {onThemeToggle && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"rounded-xl h-9 w-9 hover:bg-accent/80 transition-all duration-200\"\n onClick={onThemeToggle}\n >\n {isDarkMode ? (\n <Sun className=\"h-4 w-4 text-amber-500\" />\n ) : (\n <Moon className=\"h-4 w-4 text-muted-foreground\" />\n )}\n </Button>\n )}\n\n {/* View Switcher */}\n {!hideViewSwitcher && (\n <div className=\"flex items-center bg-muted/50 backdrop-blur-sm rounded-xl p-1\">\n {viewConfig.map(({ key, icon: Icon }) => (\n <Button\n key={key}\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => onViewChange(key)}\n className={cn(\n \"h-8 px-3 text-xs rounded-lg transition-all duration-200 gap-1.5\",\n view === key\n ? \"bg-background shadow-sm text-foreground font-medium border-[0.5px] border-border/50\"\n : \"text-muted-foreground hover:text-foreground hover:bg-background/50\"\n )}\n >\n <Icon className=\"h-3.5 w-3.5\" />\n <span className=\"hidden sm:inline\">{translations[key]}</span>\n </Button>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n};\n","import { \n startOfMonth, \n endOfMonth, \n startOfWeek, \n endOfWeek, \n eachDayOfInterval, \n addDays,\n isSameMonth,\n isSameDay,\n isToday,\n format,\n Locale,\n addMonths,\n subMonths,\n addWeeks,\n subWeeks,\n addDays as addDaysFns,\n subDays\n} from 'date-fns';\n\nexport const getMonthGrid = (date: Date, weekStartOn: 0 | 1 | 2 | 3 | 4 | 5 | 6 = 0): Date[] => {\n const monthStart = startOfMonth(date);\n const monthEnd = endOfMonth(monthStart);\n \n const startDate = startOfWeek(monthStart, { weekStartsOn: weekStartOn });\n const endDate = endOfWeek(monthEnd, { weekStartsOn: weekStartOn });\n\n const dateFormat = 'd';\n const rows = [];\n let days = [];\n let day = startDate;\n let formattedDate = '';\n\n const grid: Date[] = [];\n\n // If the grid needs to always show 6 weeks (42 days) to be consistent\n // const totalDays = 42; \n // But eachDayOfInterval is easier.\n \n return eachDayOfInterval({\n start: startDate,\n end: endDate\n });\n};\n\n/**\n * Whether the locale renders times on a 24-hour clock (fr, pt-BR, de, ...).\n * Detected from the locale's own localized time pattern instead of\n * hardcoding language codes. Defaults to false (12h) without a locale.\n */\nexport const uses24HourClock = (locale?: Locale): boolean => {\n if (!locale) return false;\n return !/[ap]\\.?m/i.test(format(new Date(2000, 0, 1, 13, 0), 'p', { locale }));\n};\n\nexport const getWeekDays = (date: Date, weekStartOn: 0 | 1 | 2 | 3 | 4 | 5 | 6 = 0): Date[] => {\n const start = startOfWeek(date, { weekStartsOn: weekStartOn });\n const end = endOfWeek(date, { weekStartsOn: weekStartOn });\n return eachDayOfInterval({ start, end });\n};\n\nexport const getTimeSlots = (startHour: number = 0, endHour: number = 24, intervalMinutes: number = 30): Date[] => {\n // This might return just simple objects or dates relative to a base\n // For rendering the y-axis, we just need the labels usually.\n // But for the grid, we might need slots.\n \n // Simplified for now: return strings or just numbers\n return []; \n};\n\nexport {\n startOfMonth,\n endOfMonth,\n startOfWeek,\n endOfWeek,\n isSameMonth,\n isSameDay,\n isToday,\n format,\n addMonths,\n subMonths,\n addWeeks,\n subWeeks,\n addDaysFns,\n subDays\n};\n","import React from 'react';\nimport { format, isSameMonth, isSameDay, isToday, addMonths, subMonths, Locale } from 'date-fns';\nimport { getMonthGrid } from '../lib/date';\nimport { Button } from './ui/button';\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\nimport { cn } from '../utils';\n\nimport { ViewType } from '../types';\n\ninterface MiniCalendarProps {\n currentDate: Date;\n onDateChange: (date: Date) => void;\n onViewChange?: (view: ViewType) => void;\n className?: string;\n locale?: Locale;\n}\n\nexport const MiniCalendar: React.FC<MiniCalendarProps> = ({\n currentDate,\n onDateChange,\n onViewChange,\n className,\n locale\n}) => {\n const [viewDate, setViewDate] = React.useState(currentDate);\n\n // Sync viewDate with currentDate when it changes externally\n React.useEffect(() => {\n setViewDate(currentDate);\n }, [currentDate]);\n\n // Week start follows the locale's convention (Sunday fallback, matching\n // the hardcoded initials below).\n const weekStartsOn = locale?.options?.weekStartsOn ?? 0;\n const days = React.useMemo(\n () => getMonthGrid(viewDate, weekStartsOn),\n [viewDate, weekStartsOn],\n );\n const weekDays = locale?.localize\n ? [0, 1, 2, 3, 4, 5, 6].map(d => {\n const dayIndex = ((d + weekStartsOn) % 7) as 0 | 1 | 2 | 3 | 4 | 5 | 6;\n return locale.localize.day(dayIndex, { width: 'narrow' });\n })\n : ['S', 'M', 'T', 'W', 'T', 'F', 'S'];\n\n const handlePrev = () => {\n const newDate = subMonths(viewDate, 1);\n setViewDate(newDate);\n // Optional: if user wants to sync main calendar on arrow click, uncomment:\n onDateChange(newDate);\n if (onViewChange) onViewChange('month');\n };\n\n const handleNext = () => {\n const newDate = addMonths(viewDate, 1);\n setViewDate(newDate);\n // Optional: if user wants to sync main calendar on arrow click, uncomment:\n onDateChange(newDate);\n if (onViewChange) onViewChange('month');\n };\n \n const handleDateClick = (day: Date) => {\n onDateChange(day);\n if (onViewChange) onViewChange('day');\n };\n\n return (\n <div className={cn(\"px-4 w-[260px]\", className)}>\n {/* Header */}\n <div className=\"flex items-center justify-between mb-4\">\n <span className=\"text-sm font-semibold text-foreground capitalize\">\n {format(viewDate, 'MMMM yyyy', { locale })}\n </span>\n <div className=\"flex items-center bg-muted/40 rounded-lg p-0.5\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-7 w-7 rounded-md hover:bg-background/80 transition-all\"\n onClick={handlePrev}\n aria-label=\"Previous month\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-7 w-7 rounded-md hover:bg-background/80 transition-all\"\n onClick={handleNext}\n aria-label=\"Next month\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n\n {/* Weekday Headers */}\n <div className=\"grid grid-cols-7 gap-y-2 text-center mb-2\">\n {weekDays.map((day, i) => (\n <div key={`${day}-${i}`} className=\"text-[10px] text-muted-foreground/70 font-semibold uppercase\">\n {day}\n </div>\n ))}\n </div>\n\n {/* Days Grid */}\n <div className=\"grid grid-cols-7 gap-y-1 text-center\">\n {days.map(day => {\n const isSelected = isSameDay(day, currentDate);\n const isCurrentMonth = isSameMonth(day, viewDate);\n const isTodayDate = isToday(day);\n\n return (\n <button\n key={day.toISOString()}\n onClick={() => handleDateClick(day)}\n className={cn(\n \"h-8 w-8 mx-auto flex items-center justify-center text-xs rounded-xl transition-all duration-200 font-medium\",\n !isCurrentMonth && \"text-muted-foreground/30\",\n isCurrentMonth && !isSelected && !isTodayDate && \"text-foreground hover:bg-accent/80\",\n isSelected && \"bg-primary text-primary-foreground shadow-md shadow-primary/30 scale-105\",\n !isSelected && isTodayDate && \"bg-primary/10 text-primary ring-1 ring-primary/30\"\n )}\n >\n {format(day, 'd')}\n </button>\n );\n })}\n </div>\n </div>\n );\n};\n","import React, { useState, useEffect, useRef } from 'react';\nimport { Button } from './ui/button';\nimport { Plus, ChevronDown, Globe, Download, Upload } from 'lucide-react';\nimport { MiniCalendar } from './MiniCalendar';\nimport { cn } from '../utils';\nimport { toZonedTime } from 'date-fns-tz';\nimport { format, Locale } from 'date-fns';\n\nimport { ViewType, CalendarEvent } from '../types';\n\ninterface SidebarProps {\n currentDate: Date;\n onDateChange: (date: Date) => void;\n onViewChange?: (view: ViewType) => void;\n onEventCreate?: () => void;\n timezone?: string;\n onTimezoneChange?: (timezone: string) => void;\n className?: string;\n readOnly?: boolean;\n calendars?: {\n id: string;\n label: string;\n color?: string;\n active?: boolean;\n }[];\n onCalendarToggle?: (calendarId: string, active: boolean) => void;\n translations?: any;\n events?: CalendarEvent[];\n onImport?: (events: Partial<CalendarEvent>[]) => void;\n locale?: Locale;\n}\n\nexport const Sidebar: React.FC<SidebarProps> = ({\n currentDate,\n onDateChange,\n onViewChange,\n onEventCreate,\n timezone,\n onTimezoneChange,\n className,\n readOnly,\n calendars,\n onCalendarToggle,\n translations,\n locale,\n}) => {\n const [calendarsOpen, setCalendarsOpen] = useState(true);\n const [timezoneOpen, setTimezoneOpen] = useState(false);\n const [now, setNow] = useState<Date | null>(null);\n const [hasMounted, setHasMounted] = useState(false);\n\n // Only run on client to prevent hydration mismatch\n useEffect(() => {\n setHasMounted(true);\n setNow(new Date());\n const timer = setInterval(() => setNow(new Date()), 60000);\n return () => clearInterval(timer);\n }, []);\n \n // Default demo data if no calendars provided\n const defaultCalendars = [\n { id: '1', label: 'My Calendar', color: '#3b82f6', active: true },\n { id: '2', label: 'Birthdays', color: '#10b981', active: true },\n { id: '3', label: 'Tasks', color: '#6366f1', active: true },\n ];\n\n const displayCalendars = calendars || defaultCalendars;\n\n const getAcronym = (tz: string) => {\n if (!tz || !now) return 'LOC';\n try {\n return new Intl.DateTimeFormat('en-US', { timeZone: tz, timeZoneName: 'short' })\n .formatToParts(now)\n .find(part => part.type === 'timeZoneName')?.value || '';\n } catch (e) { return ''; }\n };\n\n const timezones = [\n { value: '', label: translations?.localTime || 'Local Time', acronym: 'LOC' },\n { value: 'UTC', label: 'UTC', acronym: 'UTC' },\n { value: 'America/New_York', label: 'New York', acronym: 'EST' },\n { value: 'America/Chicago', label: 'Chicago', acronym: 'CST' },\n { value: 'America/Denver', label: 'Denver', acronym: 'MST' },\n { value: 'America/Los_Angeles', label: 'Los Angeles', acronym: 'PST' },\n { value: 'Europe/London', label: 'London', acronym: 'GMT' },\n { value: 'Europe/Paris', label: 'Paris', acronym: 'CET' },\n { value: 'Europe/Berlin', label: 'Berlin', acronym: 'CET' },\n { value: 'Asia/Dubai', label: 'Dubai', acronym: 'GST' },\n { value: 'Asia/Tokyo', label: 'Tokyo', acronym: 'JST' },\n { value: 'Asia/Singapore', label: 'Singapore', acronym: 'SGT' },\n { value: 'Australia/Sydney', label: 'Sydney', acronym: 'AEDT' },\n ];\n\n // Format label with time: HH:MM (ACR)\n const formatTzLabel = (tz: { value: string, label: string, acronym: string }, showTime: boolean = true) => {\n // Don't show time if not mounted yet (SSR) to prevent hydration mismatch\n if (!hasMounted || !now || !showTime) {\n return <span>{tz.label}</span>;\n }\n\n let time = '';\n let acronym = tz.acronym;\n\n try {\n if (!tz.value) {\n time = format(now, 'HH:mm');\n // Try to get real local acronym\n try {\n acronym = new Intl.DateTimeFormat('en-US', { timeZoneName: 'short' })\n .formatToParts(now)\n .find(part => part.type === 'timeZoneName')?.value || 'LOC';\n } catch (e) {}\n } else {\n const zDate = toZonedTime(now, tz.value);\n time = format(zDate, 'HH:mm');\n // Calculate dynamic acronym if needed (e.g. DST changes)\n const dynAcronym = getAcronym(tz.value);\n if (dynAcronym && !dynAcronym.includes('GMT') && !dynAcronym.includes('Time')) {\n acronym = dynAcronym;\n }\n }\n } catch (e) {\n return <span>{tz.label}</span>;\n }\n\n return (\n <div className=\"flex justify-between w-full\">\n <span>{tz.label}</span>\n <span className=\"text-muted-foreground ml-2 tabular-nums\">\n {time} <span className=\"text-xs opacity-75\">({acronym})</span>\n </span>\n </div>\n );\n };\n \n const selectedTzObj = timezones.find(t => t.value === (timezone || ''));\n const selectedTimezoneLabel = selectedTzObj ? formatTzLabel(selectedTzObj) : (translations?.localTime || 'Local Time');\n\n return (\n <div className={cn(\"flex flex-col w-[260px] overflow-x-hidden h-full bg-gradient-to-b scrollbar-hide from-background via-background to-muted/10 pt-4 pb-4 overflow-y-auto hidden lg:flex\", className)}>\n {!readOnly && (\n <div className=\"px-4 mb-6\">\n <Button\n className=\"w-full rounded-2xl shadow-lg bg-primary text-primary-foreground hover:bg-primary/90 h-12 gap-3 justify-center transition-all duration-300 hover:shadow-xl hover:shadow-primary/20 hover:scale-[1.02] active:scale-[0.98] font-semibold\"\n onClick={onEventCreate}\n >\n <Plus className=\"w-5 h-5\" />\n <span className=\"text-sm\">{translations?.create || 'Create'}</span>\n </Button>\n </div>\n )}\n\n <MiniCalendar currentDate={currentDate} onDateChange={onDateChange} onViewChange={onViewChange} locale={locale} />\n\n <div className=\"flex-1 px-4 space-y-5 mt-5\">\n {/* Calendars List */}\n <div className=\"bg-muted/20 rounded-2xl p-3 border-[0px] border-border/30\">\n <div\n className=\"flex items-center justify-between cursor-pointer hover:bg-accent/50 p-2 -m-1 rounded-xl mb-2 transition-all duration-200\"\n onClick={() => setCalendarsOpen(!calendarsOpen)}\n >\n <span className=\"text-sm font-semibold text-foreground\">{translations?.calendars || 'Calendars'}</span>\n <ChevronDown className={cn(\"w-4 h-4 text-muted-foreground transition-transform duration-200\", calendarsOpen && \"rotate-180\")} />\n </div>\n\n {calendarsOpen && (\n <div className=\"space-y-1\">\n {displayCalendars.map(cal => (\n <div\n key={cal.id}\n className=\"flex items-center gap-3 py-2 px-2 hover:bg-accent/60 rounded-xl cursor-pointer group transition-all duration-200\"\n onClick={() => onCalendarToggle?.(cal.id, !(cal.active ?? true))}\n >\n <div className=\"relative flex items-center justify-center\">\n <input\n type=\"checkbox\"\n checked={cal.active ?? true}\n onChange={(e) => {\n e.stopPropagation();\n onCalendarToggle?.(cal.id, e.target.checked);\n }}\n className=\"peer h-5 w-5 rounded-md border-2 border-border/60 cursor-pointer appearance-none checked:border-transparent transition-all duration-200\"\n style={{ '--primary-color': cal.color } as React.CSSProperties}\n data-cal-id={cal.id}\n />\n <div className=\"absolute inset-0 flex items-center justify-center pointer-events-none opacity-0 peer-checked:opacity-100 transition-opacity\">\n <svg className=\"w-3.5 h-3.5 text-white\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={3}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 13l4 4L19 7\" />\n </svg>\n </div>\n <style>{`\n input[type=\"checkbox\"][data-cal-id=\"${cal.id}\"]:checked {\n background-color: ${cal.color} !important;\n border-color: ${cal.color} !important;\n }\n input[type=\"checkbox\"][data-cal-id=\"${cal.id}\"]:focus {\n --tw-ring-color: ${cal.color}40 !important;\n }\n `}</style>\n </div>\n <div className=\"flex items-center gap-2 flex-1 min-w-0\">\n <span className=\"text-sm text-foreground/90 truncate font-medium\">{cal.label}</span>\n </div>\n <div\n className=\"w-2 h-2 rounded-full opacity-60 group-hover:opacity-100 transition-opacity\"\n style={{ backgroundColor: cal.color }}\n />\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n\n {/* Timezone Selector - Custom UI */}\n <div className=\"mt-auto px-4 pt-5\">\n <div className=\"bg-muted/20 rounded-2xl p-3\">\n <div className=\"flex items-center gap-2 mb-3\">\n <div className=\"p-1.5 bg-primary/10 rounded-lg\">\n <Globe className=\"w-4 h-4 text-primary\" />\n </div>\n <span className=\"text-sm font-semibold text-foreground\">{translations?.timezone || 'Timezone'}</span>\n </div>\n\n <div className=\"relative\">\n <button\n onClick={() => setTimezoneOpen(!timezoneOpen)}\n className=\"w-full flex items-center justify-between bg-blue-200/40 hover:bg-blue-200/80 rounded-xl py-2.5 pl-4 pr-3 text-sm text-foreground focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary/50 transition-all duration-200 text-left\"\n >\n <div className=\"flex-1 truncate mr-2 font-medium\">{selectedTimezoneLabel}</div>\n <ChevronDown className={cn(\"w-4 h-4 text-muted-foreground transition-transform duration-200\", timezoneOpen && \"rotate-180\")} />\n </button>\n\n {timezoneOpen && (\n <>\n <div className=\"fixed inset-0 z-40\" onClick={() => setTimezoneOpen(false)} />\n <div className=\"absolute bottom-full left-0 w-full mb-2 bg-background rounded-xl shadow-2xl z-50 max-h-[260px] overflow-y-auto p-1.5 animate-in fade-in zoom-in-95 duration-200 backdrop-blur-none\">\n {timezones.map(tz => (\n <div\n key={tz.value}\n className={cn(\n \"px-3 py-2.5 text-sm rounded-lg cursor-pointer transition-all duration-200\",\n (timezone || '') === tz.value\n ? \"bg-primary text-primary-foreground font-semibold\"\n : \"text-foreground hover:bg-accent/80\"\n )}\n onClick={() => {\n onTimezoneChange?.(tz.value);\n setTimezoneOpen(false);\n }}\n >\n {formatTzLabel(tz)}\n </div>\n ))}\n </div>\n </>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport { useDraggable } from '@dnd-kit/core';\nimport { CSS } from '@dnd-kit/utilities';\nimport { CalendarEvent } from '../../types';\nimport { cn, isEventDragDisabled } from '../../utils';\n\ninterface DraggableEventProps extends React.HTMLAttributes<HTMLDivElement> {\n event: CalendarEvent;\n children: React.ReactNode;\n}\n\nexport const DraggableEvent: React.FC<DraggableEventProps> = ({ event, children, className, style: propStyle, ...props }) => {\n const dragDisabled = isEventDragDisabled(event);\n const { attributes, listeners, setNodeRef, transform, isDragging } = useDraggable({\n id: event.id,\n data: { event },\n disabled: dragDisabled,\n });\n\n const style = {\n ...propStyle,\n transform: CSS.Translate.toString(transform),\n zIndex: isDragging ? 100 : propStyle?.zIndex,\n // When dragging, we want the ORIGINAL element to be almost invisible (or fully invisible)\n // so that the DragOverlay (the \"ghost\") is the only thing the user focuses on.\n // If we set opacity: 0, it disappears. If 0.1, it's a faint placeholder.\n // The user asked for \"Make the entire dragged item transparent\". \n // Usually this means the original item should be faded out while the drag overlay is moving.\n opacity: isDragging ? 0 : propStyle?.opacity, // Hiding original element completely\n };\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n {...listeners}\n {...attributes}\n {...props}\n className={cn(!dragDisabled && \"touch-none\", className)}\n >\n {children}\n </div>\n );\n};\n","import React from 'react';\nimport { useDroppable } from '@dnd-kit/core';\nimport { cn } from '../../utils';\n\ninterface DroppableCellProps {\n id: string; // usually ISO date string\n date: Date;\n resourceId?: string;\n children?: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n onClick?: () => void;\n}\n\nexport const DroppableCell: React.FC<DroppableCellProps> = ({ id, date, resourceId, children, className, style, onClick }) => {\n const { isOver, setNodeRef } = useDroppable({\n id: id,\n data: { date, resourceId },\n });\n\n // Determine quarter based on minutes for graduated coloring\n const minutes = date.getMinutes();\n const quarterClass = \n minutes === 0 ? \"hover:bg-blue-50/50 dark:hover:bg-blue-900/10\" :\n minutes === 15 ? \"hover:bg-blue-50/80 dark:hover:bg-blue-900/20\" :\n minutes === 30 ? \"hover:bg-blue-100/50 dark:hover:bg-blue-900/30\" :\n \"hover:bg-blue-100/80 dark:hover:bg-blue-900/40\";\n\n const activeQuarterClass = \n minutes === 0 ? \"bg-blue-50/50 dark:bg-blue-900/10 ring-2 ring-primary ring-inset\" :\n minutes === 15 ? \"bg-blue-50/80 dark:bg-blue-900/20 ring-2 ring-primary ring-inset\" :\n minutes === 30 ? \"bg-blue-100/50 dark:bg-blue-900/30 ring-2 ring-primary ring-inset\" :\n \"bg-blue-100/80 dark:bg-blue-900/40 ring-2 ring-primary ring-inset\";\n\n return (\n <div\n ref={setNodeRef}\n className={cn(\n className,\n quarterClass,\n isOver && activeQuarterClass\n )}\n style={style}\n onClick={onClick}\n >\n {children}\n </div>\n );\n};\n","import React, { useMemo, useCallback } from 'react';\nimport { format, isSameMonth, isSameDay, isToday, startOfWeek, endOfWeek, eachDayOfInterval } from 'date-fns';\nimport { toZonedTime } from 'date-fns-tz';\nimport { getMonthGrid } from '../lib/date';\nimport { CalendarEvent } from '../types';\nimport { cn } from '../utils';\nimport { DraggableEvent } from '../components/dnd/DraggableEvent';\nimport { DroppableCell } from '../components/dnd/DroppableCell';\nimport { Locale } from 'date-fns';\n\ninterface MonthViewProps {\n currentDate: Date;\n events: CalendarEvent[];\n onEventClick?: (event: CalendarEvent) => void;\n onDateClick?: (date: Date) => void;\n timezone?: string;\n locale?: Locale;\n}\n\n// Memoized Event Item Component for performance\nconst EventItem = React.memo(({ event, onEventClick }: { event: CalendarEvent, onEventClick?: (e: CalendarEvent) => void }) => (\n <DraggableEvent event={event}>\n <div\n className={cn(\n \"text-xs px-2.5 py-1.5 rounded-lg truncate cursor-pointer shadow-sm transition-all duration-200\",\n \"hover:shadow-md hover:scale-[1.02] hover:z-10\",\n !event.color && \"bg-primary/10 text-primary hover:bg-primary/15 border-[0.5px] border-primary/20\"\n )}\n style={event.color ? {\n backgroundColor: `${event.color}20`,\n color: event.color,\n borderLeft: `3px solid ${event.color}`,\n } : undefined}\n onClick={(e) => {\n e.stopPropagation();\n onEventClick?.(event);\n }}\n >\n <span className=\"font-medium\">{event.title}</span>\n </div>\n </DraggableEvent>\n));\n\nEventItem.displayName = 'EventItem';\n\nexport const MonthView: React.FC<MonthViewProps> = ({\n currentDate,\n events,\n onEventClick,\n onDateClick,\n timezone,\n locale\n}) => {\n // Week start follows the locale's convention (historical Monday fallback).\n // The same value drives the grid AND the weekday header row — they were\n // previously built with different starts, shifting the labels by one day.\n const weekStartsOn = locale?.options?.weekStartsOn ?? 1;\n const days = useMemo(\n () => getMonthGrid(currentDate, weekStartsOn),\n [currentDate, weekStartsOn],\n );\n\n // Dynamic week days generation\n const weekDays = useMemo(() => {\n const start = startOfWeek(currentDate, { weekStartsOn });\n const end = endOfWeek(currentDate, { weekStartsOn });\n return eachDayOfInterval({ start, end });\n }, [currentDate, weekStartsOn]);\n\n // Timezone adjustment helper\n const getZonedDate = useCallback((date: Date) => {\n return timezone ? toZonedTime(date, timezone) : date;\n }, [timezone]);\n\n // Pre-calculate event buckets for O(1) access during render\n // This is crucial for handling 10000+ events\n const eventsByDay = useMemo(() => {\n const map = new Map<string, CalendarEvent[]>();\n \n events.forEach(event => {\n const zonedStart = getZonedDate(event.start);\n // Use date string as key (YYYY-MM-DD)\n const key = format(zonedStart, 'yyyy-MM-dd');\n \n if (!map.has(key)) {\n map.set(key, []);\n }\n map.get(key)!.push(event);\n });\n \n return map;\n }, [events, getZonedDate]);\n\n return (\n <div className=\"flex flex-col h-full bg-background border-[0.5px] scrollbar-hide border-border/50 rounded-2xl overflow-hidden min-w-[800px] md:min-w-0 shadow-sm\">\n <div className=\"overflow-y-auto flex-1 relative\">\n {/* Sticky Header */}\n <div className=\"grid grid-cols-7 border-b-[0.5px] border-border/50 bg-gradient-to-r from-muted/30 via-muted/40 to-muted/30 sticky top-0 z-20 backdrop-blur-sm\">\n {weekDays.map((day) => (\n <div\n key={day.toISOString()}\n className=\"py-3 text-center text-xs font-semibold text-muted-foreground border-r-[0.5px] border-border/30 last:border-r-0 uppercase tracking-wider\"\n >\n {format(day, 'EEE', { locale })}\n </div>\n ))}\n </div>\n <div className=\"grid grid-cols-7\" style={{ gridAutoRows: '130px' }}>\n {days.map((day) => {\n const dayKey = format(day, 'yyyy-MM-dd');\n const dayEvents = eventsByDay.get(dayKey) || [];\n\n const isCurrentMonth = isSameMonth(day, currentDate);\n const cellId = day.toISOString();\n\n return (\n <DroppableCell\n key={cellId}\n id={cellId}\n date={day}\n className={cn(\n \"h-[130px] p-2 border-b-[0.5px] border-r-[0.5px] border-border/30 last:border-r-0 relative transition-all duration-200 hover:bg-accent/5 flex flex-col gap-1.5 overflow-hidden group\",\n !isCurrentMonth && \"bg-muted/5 text-muted-foreground/60\",\n isToday(day) && \"bg-primary/5 ring-1 ring-inset ring-primary/20\"\n )}\n onClick={() => onDateClick?.(day)}\n >\n <div className=\"flex justify-between items-start\">\n <div className={cn(\n \"text-sm font-semibold w-7 h-7 flex items-center justify-center rounded-full transition-all duration-200\",\n isToday(day)\n ? \"bg-primary text-primary-foreground shadow-md shadow-primary/30\"\n : \"group-hover:bg-accent\"\n )}>\n {format(day, 'd', { locale })}\n </div>\n {dayEvents.length > 0 && (\n <div className=\"text-[10px] font-medium text-muted-foreground/60 bg-muted/50 px-1.5 py-0.5 rounded-full\">\n {dayEvents.length}\n </div>\n )}\n </div>\n\n <div className=\"flex-1 flex flex-col gap-1 scrollbar-hide overflow-y-auto overflow-x-hidden\">\n {dayEvents.slice(0, 4).map(event => (\n <EventItem key={`${event.id}-${dayKey}`} event={event} onEventClick={onEventClick} />\n ))}\n {dayEvents.length > 4 && (\n <div className=\"text-[10px] text-primary font-semibold text-center py-1 px-2 rounded-md bg-primary/5 hover:bg-primary/10 cursor-pointer transition-colors\">\n +{dayEvents.length - 4} more\n </div>\n )}\n </div>\n </DroppableCell>\n );\n })}\n </div>\n </div>\n </div>\n );\n};\n","import React, { useState, useRef, useCallback } from 'react';\nimport { CalendarEvent } from '../../types';\nimport { cn, isEventResizeDisabled } from '../../utils';\n\ninterface ResizableEventProps {\n event: CalendarEvent;\n hourHeight: number;\n minDuration?: number; // Minimum duration in minutes\n onResize?: (event: CalendarEvent, newEnd: Date) => void;\n children: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n readonly?: boolean;\n}\n\nexport const ResizableEvent: React.FC<ResizableEventProps> = ({\n event,\n hourHeight,\n minDuration = 15,\n onResize,\n children,\n className,\n style,\n readonly,\n}) => {\n const resizeLocked = readonly || isEventResizeDisabled(event);\n const [isResizing, setIsResizing] = useState(false);\n const [resizeHeight, setResizeHeight] = useState<number | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const startYRef = useRef<number>(0);\n const startHeightRef = useRef<number>(0);\n // Mirrors resizeHeight so the mouseup handler (registered at mousedown)\n // reads the final value instead of the state captured in a stale closure.\n const resizeHeightRef = useRef<number | null>(null);\n\n const handleResizeStart = useCallback((e: React.MouseEvent | React.TouchEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n const clientY = 'touches' in e ? e.touches[0].clientY : e.clientY;\n startYRef.current = clientY;\n startHeightRef.current = containerRef.current?.offsetHeight || 0;\n\n setIsResizing(true);\n\n const handleMove = (moveEvent: MouseEvent | TouchEvent) => {\n const moveClientY = 'touches' in moveEvent ? moveEvent.touches[0].clientY : moveEvent.clientY;\n const deltaY = moveClientY - startYRef.current;\n\n // Snap to 15-minute intervals\n const snapInterval = hourHeight / 4; // 15 minutes\n const snappedDelta = Math.round(deltaY / snapInterval) * snapInterval;\n\n const newHeight = Math.max(\n (minDuration / 60) * hourHeight, // Minimum height based on minDuration\n startHeightRef.current + snappedDelta\n );\n\n resizeHeightRef.current = newHeight;\n setResizeHeight(newHeight);\n };\n\n const handleEnd = () => {\n setIsResizing(false);\n\n const finalHeight = resizeHeightRef.current;\n\n if (finalHeight !== null && containerRef.current && onResize) {\n // Calculate new end time based on resize\n const originalHeight = startHeightRef.current;\n const heightDiff = finalHeight - originalHeight;\n const minutesDiff = (heightDiff / hourHeight) * 60;\n\n const newEnd = new Date(event.end);\n newEnd.setMinutes(newEnd.getMinutes() + minutesDiff);\n\n // Ensure new end is after start\n if (newEnd > event.start) {\n onResize(event, newEnd);\n }\n }\n\n resizeHeightRef.current = null;\n setResizeHeight(null);\n\n document.removeEventListener('mousemove', handleMove);\n document.removeEventListener('mouseup', handleEnd);\n document.removeEventListener('touchmove', handleMove);\n document.removeEventListener('touchend', handleEnd);\n };\n\n document.addEventListener('mousemove', handleMove);\n document.addEventListener('mouseup', handleEnd);\n document.addEventListener('touchmove', handleMove, { passive: false });\n document.addEventListener('touchend', handleEnd);\n }, [event, hourHeight, minDuration, onResize]);\n\n const handlePointerDown = useCallback((e: React.PointerEvent) => {\n // dnd-kit's PointerSensor activates on pointerdown, which mousedown's\n // stopPropagation doesn't reach — without this the whole-event drag\n // hijacks the resize gesture.\n e.stopPropagation();\n }, []);\n\n return (\n <div\n ref={containerRef}\n className={cn(\"relative group\", className)}\n style={{\n ...style,\n height: resizeHeight !== null ? `${resizeHeight}px` : style?.height,\n }}\n >\n {children}\n\n {/* Resize Handle */}\n <div\n className={cn(\n resizeLocked ? \"cursor-default\" : \"cursor-ns-resize group-hover:opacity-100\",\n \"absolute bottom-0 left-0 right-0 h-3 z-20 flex items-center justify-center\",\n \"opacity-0 transition-opacity\",\n isResizing && \"opacity-100\"\n )}\n onPointerDown={resizeLocked ? undefined : handlePointerDown}\n onMouseDown={resizeLocked ? undefined : handleResizeStart}\n onTouchStart={resizeLocked ? undefined : handleResizeStart}\n >\n <div className={cn(\n \"w-8 h-1 rounded-full transition-all\",\n isResizing ? \"bg-primary\" : \"bg-muted-foreground/30 group-hover:bg-primary/50\"\n )} />\n </div>\n\n {/* Visual feedback during resize */}\n {isResizing && (\n <div className=\"absolute inset-0 border-2 border-primary border-dashed rounded-md pointer-events-none bg-primary/5\" />\n )}\n </div>\n );\n};\n","import React from 'react';\nimport { format, isSameDay, differenceInMinutes, isToday, startOfWeek, endOfWeek, eachDayOfInterval } from 'date-fns';\nimport { toZonedTime } from 'date-fns-tz';\nimport { CalendarEvent } from '../types';\nimport { cn, isEventDragDisabled } from '../utils';\nimport { uses24HourClock } from '../lib/date';\nimport { DraggableEvent } from '../components/dnd/DraggableEvent';\nimport { DroppableCell } from '../components/dnd/DroppableCell';\nimport { ResizableEvent } from '../components/dnd/ResizableEvent';\nimport { Locale } from 'date-fns';\n\ninterface WeekViewProps {\n currentDate: Date;\n events: CalendarEvent[];\n onEventClick?: (event: CalendarEvent) => void;\n onTimeSlotClick?: (date: Date) => void;\n onEventResize?: (event: CalendarEvent, newEnd: Date) => void;\n timezone?: string;\n locale?: Locale;\n readonly?: boolean;\n}\n\nexport const WeekView: React.FC<WeekViewProps> = ({\n currentDate,\n events,\n onEventClick,\n onTimeSlotClick,\n onEventResize,\n timezone,\n locale,\n readonly,\n}) => {\n // Generate days for the week following the locale's convention (falls\n // back to the historical Monday start without a locale).\n const weekStartsOn = locale?.options?.weekStartsOn ?? 1;\n const start = startOfWeek(currentDate, { weekStartsOn });\n const end = endOfWeek(currentDate, { weekStartsOn });\n const weekDays = eachDayOfInterval({ start, end });\n const hours = Array.from({ length: 24 }, (_, i) => i);\n\n const hourHeight = 60; // px\n const scrollContainerRef = React.useRef<HTMLDivElement>(null);\n\n const [now, setNow] = React.useState(new Date());\n\n React.useEffect(() => {\n const interval = setInterval(() => setNow(new Date()), 60000);\n return () => clearInterval(interval);\n }, []);\n\n // Auto-scroll to 8am on mount for better UX\n React.useEffect(() => {\n if (scrollContainerRef.current) {\n const scrollToActualTime = () => {\n const currentHour = now.getHours();\n const offsetHour = 4; // Scroll a bit above current hour\n return (currentHour - offsetHour) * hourHeight;\n }\n scrollContainerRef.current.scrollTop = scrollToActualTime();\n }\n }, []);\n\n // Timezone adjustment helper\n const getZonedDate = (date: Date) => {\n return timezone ? toZonedTime(date, timezone) : date;\n };\n\n const zonedNow = getZonedDate(new Date());\n\n const getTimezoneDisplay = (tz: string | undefined) => {\n // Use zonedNow if tz matches, otherwise calculate for specific tz if needed\n // But here tz IS the current view timezone.\n const date = now;\n let displayTime = '';\n let acronym = '';\n\n if (!tz) {\n // Local time\n displayTime = format(date, 'HH:mm');\n try {\n acronym = new Intl.DateTimeFormat('en-US', { timeZoneName: 'short' })\n .formatToParts(date)\n .find(part => part.type === 'timeZoneName')?.value || '';\n } catch (e) { acronym = 'LOC'; }\n } else {\n try {\n const zDate = toZonedTime(date, tz);\n displayTime = format(zDate, 'HH:mm');\n \n // Get acronym\n // Note: Intl.DateTimeFormat needs the IANA timezone string\n acronym = new Intl.DateTimeFormat('en-US', { timeZone: tz, timeZoneName: 'short' })\n .formatToParts(date)\n .find(part => part.type === 'timeZoneName')?.value || '';\n } catch (e) {\n // Fallback\n displayTime = format(date, 'HH:mm');\n acronym = tz;\n }\n }\n \n // Simplify generic long names if necessary, though 'short' usually works well.\n // E.g. \"GMT-5\" is often returned for offsets. The user asked for \"EST\", \"PST\".\n // Chrome/Node usually return \"EST\" for America/New_York.\n \n return (\n <div className=\"flex flex-col items-center justify-center leading-tight\">\n <span>{displayTime}</span>\n <span className=\"text-[10px] opacity-75\">({acronym})</span>\n </div>\n );\n };\n\n const is24h = uses24HourClock(locale);\n const timeFormat = is24h ? 'H:mm' : 'h a';\n const eventTimeFormat = is24h ? 'H:mm' : 'h:mm a';\n const nowFormat = is24h ? 'H:mm' : 'h:mm';\n\n return (\n <div className=\"flex flex-col h-full bg-background border-[0.5px] border-border/50 rounded-2xl overflow-hidden min-w-[800px] md:min-w-0 shadow-sm\">\n {/* Scrollable Container - includes header for proper alignment.\n No scrollbar-gutter here: the scrollbar is hidden (scrollbar-hide),\n so reserving its space just leaves a blank strip after the last\n day column on classic-scrollbar platforms. */}\n <div\n ref={scrollContainerRef}\n className=\"flex-1 overflow-y-auto scrollbar-hide relative bg-background scroll-smooth\"\n >\n {/* Header - sticky inside scroll container */}\n <div className=\"flex border-b-[0.5px] border-border/50 bg-gradient-to-r from-muted/20 via-background to-muted/20 z-20 sticky top-0 backdrop-blur-sm\">\n <div className=\"flex-none p-3 text-center text-xs font-semibold text-muted-foreground w-16 flex items-center justify-center border-r-[0.5px] border-border/30 bg-muted/10\">\n {getTimezoneDisplay(timezone)}\n </div>\n <div className=\"flex-1 grid grid-cols-7\">\n {weekDays.map((day, index) => (\n <div key={day.toISOString()} className={cn(\"py-3 px-2 text-center\", index > 0 && \"border-l-[0.5px] border-border/30\")}>\n <div className=\"text-[10px] font-semibold text-muted-foreground uppercase tracking-wider mb-1.5\">{format(day, 'EEE', { locale })}</div>\n <div className={cn(\n \"w-9 h-9 flex items-center justify-center rounded-xl mx-auto text-sm font-semibold transition-all duration-200\",\n isToday(day)\n ? \"bg-primary text-primary-foreground shadow-lg shadow-primary/30 scale-110\"\n : \"text-foreground hover:bg-accent/80\"\n )}>\n {format(day, 'd', { locale })}\n </div>\n </div>\n ))}\n </div>\n </div>\n\n {/* Grid Content */}\n <div\n className=\"flex min-w-full relative\"\n style={{ height: hours.length * hourHeight }}\n >\n {/* Time Labels Column */}\n <div className=\"flex-none w-16 border-r-[0.5px] border-border/30 relative bg-muted/5\">\n {hours.map((hour) => (\n <div\n key={hour}\n className=\"relative w-full text-[11px] text-muted-foreground/80 text-right pr-3 font-medium tabular-nums box-border\"\n style={{ height: hourHeight }}\n >\n <span className=\"block -translate-y-1/2\">\n {hour !== 0 && format(new Date().setHours(hour, 0, 0, 0), timeFormat, { locale })}\n </span>\n </div>\n ))}\n </div>\n\n {/* Days Columns */}\n <div className=\"flex-1 grid grid-cols-7 relative\">\n {weekDays.map((day, dayIndex) => {\n // Filter events for this day\n const dayEvents = events.filter(e => {\n const zonedStart = getZonedDate(e.start);\n return isSameDay(zonedStart, day);\n });\n\n return (\n <div key={day.toISOString()} className={cn(\"relative h-full\", dayIndex > 0 && \"border-l-[0.5px] border-border/30\")}>\n {/* Grid Rows (Droppable Cells) */}\n {hours.map((hour) => {\n return (\n <div\n key={hour}\n className=\"w-full border-b-[0.5px] border-dashed border-border/20 box-border relative hover:bg-accent/5 transition-colors\"\n style={{ height: hourHeight }}\n >\n {/* 4 x 15-minute intervals */}\n {[0, 15, 30, 45].map((minute) => {\n const cellDate = new Date(day);\n cellDate.setHours(hour, minute, 0, 0);\n const cellId = cellDate.toISOString();\n \n return (\n <DroppableCell \n key={minute}\n id={cellId}\n date={cellDate}\n className=\"w-full absolute left-0 right-0 z-0 transition-colors\"\n style={{ \n height: '25%', \n top: `${(minute / 60) * 100}%` \n }}\n >\n <div \n className=\"w-full h-full bg-transparent cursor-pointer\"\n onClick={() => onTimeSlotClick?.(cellDate)}\n />\n </DroppableCell>\n );\n })}\n </div>\n );\n })}\n \n {/* Events Overlay */}\n {dayEvents.map((event) => {\n // Calculate layout for overlapping events\n // Find all events that overlap with this one\n const overlappingEvents = dayEvents.filter(e => {\n if (e.id === event.id) return false;\n const s1 = getZonedDate(event.start).getTime();\n const e1 = getZonedDate(event.end).getTime();\n const s2 = getZonedDate(e.start).getTime();\n const e2 = getZonedDate(e.end).getTime();\n return s1 < e2 && e1 > s2;\n });\n\n // Calculate horizontal position (simple version)\n // A more robust algorithm would use graph coloring or column packing\n // For now, we can check how many simultaneous events exist and assign width/left\n \n // Sort overlapping group by start time\n const group = [event, ...overlappingEvents].sort((a, b) => \n getZonedDate(a.start).getTime() - getZonedDate(b.start).getTime() ||\n (a.id > b.id ? 1 : -1) // stable sort\n );\n \n const index = group.findIndex(e => e.id === event.id);\n const count = group.length;\n \n const widthPercent = 100 / count;\n const leftPercent = index * widthPercent;\n\n const zonedEventStart = getZonedDate(event.start);\n const zonedEventEnd = getZonedDate(event.end);\n \n const startMinutes = zonedEventStart.getHours() * 60 + zonedEventStart.getMinutes();\n const durationMinutes = differenceInMinutes(zonedEventEnd, zonedEventStart);\n \n const top = (startMinutes / 60) * hourHeight;\n const height = (durationMinutes / 60) * hourHeight;\n \n const isShortEvent = durationMinutes < 60;\n \n return (\n <DraggableEvent\n key={`${event.id}-${day.toISOString()}`}\n event={event}\n className={`absolute z-10 transition-all ${readonly ? \"cursor-default\" : \"\"}`}\n style={{\n top: `${top}px`,\n height: `${Math.max(height, 20)}px`,\n left: `${leftPercent}%`,\n width: `${widthPercent}%`,\n // Add minimal spacing between overlapping events\n paddingRight: count > 1 ? '2px' : '0'\n }}\n >\n <ResizableEvent\n readonly={readonly}\n event={event}\n hourHeight={hourHeight}\n onResize={onEventResize}\n className=\"h-full\"\n style={{ height: '100%' }}\n >\n <div\n className={cn(\n \"rounded-md border shadow-sm transition-all hover:shadow-md group overflow-hidden relative\",\n \"glass\",\n readonly || isEventDragDisabled(event) ? \"cursor-default\" : \"cursor-grab active:cursor-grabbing\",\n !event.color && \"border-primary/20 bg-primary/10\",\n isShortEvent ? \"px-1 flex items-center justify-center\" : \"p-2\",\n // Add active border for overlapped events to distinguish them\n count > 1 && \"border-l-4 border-l-primary/50\"\n )}\n style={{\n height: '100%',\n backgroundColor: event.color ? `${event.color}15` : undefined,\n borderColor: event.color ? `${event.color}40` : undefined,\n borderLeftWidth: '3px',\n borderLeftColor: event.color || 'var(--primary)'\n }}\n onClick={(e) => {\n e.stopPropagation();\n onEventClick?.(event);\n }}\n title={count > 1 ? `${event.title} (${index + 1}/${count})` : undefined}\n >\n <div className=\"flex flex-col h-full overflow-hidden w-full\">\n <div className={cn(\"font-semibold truncate text-foreground/90 leading-tight\",\n isShortEvent ? \"text-xs text-center\" : \"text-xs\"\n )}>\n {event.title}\n </div>\n {!isShortEvent && (\n <>\n <div className=\"text-[10px] text-muted-foreground truncate mt-0.5 font-medium leading-tight\">\n {format(zonedEventStart, eventTimeFormat, { locale })} - {format(zonedEventEnd, eventTimeFormat, { locale })}\n </div>\n {event.description && height > 50 && (\n <div className=\"text-[10px] text-muted-foreground/80 truncate mt-1 leading-tight opacity-80\">\n {event.description}\n </div>\n )}\n </>\n )}\n {/* Overlap Badge */}\n {count > 1 && !isShortEvent && (\n <div className=\"absolute top-1 right-1 bg-background/80 backdrop-blur-sm rounded-full w-4 h-4 flex items-center justify-center text-[9px] font-bold text-muted-foreground border border-border shadow-sm\">\n {count}\n </div>\n )}\n </div>\n </div>\n </ResizableEvent>\n </DraggableEvent>\n );\n })}\n \n {/* Current Time Indicator */}\n {isToday(day) && (\n <div\n className=\"absolute left-0 right-0 z-20 pointer-events-none flex items-center\"\n style={{\n top: `${(zonedNow.getHours() * 60 + zonedNow.getMinutes()) / 60 * hourHeight}px`\n }}\n >\n <div className=\"h-[2px] w-full bg-gradient-to-r from-primary via-primary to-primary/50\" />\n <div className=\"absolute -left-1.5 w-3 h-3 bg-primary rounded-full shadow-lg shadow-primary/40 ring-2 ring-background animate-pulse\" />\n </div>\n )}\n </div>\n );\n })}\n </div>\n </div>\n \n {/* Current Time Label (Left Axis) */}\n <div \n className=\"absolute left-0 w-16 pointer-events-none z-30 flex justify-end pr-2\"\n style={{\n top: `${(zonedNow.getHours() * 60 + zonedNow.getMinutes()) / 60 * hourHeight + 80}px`,\n }}\n >\n <span className=\"text-[10px] font-bold text-primary-foreground bg-primary px-1.5 py-0.5 rounded-md shadow-md -translate-y-1/2 backdrop-blur-none\">\n {format(zonedNow, nowFormat, { locale })}\n </span>\n </div>\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport { format, differenceInMinutes, isToday, isSameDay } from 'date-fns';\nimport { toZonedTime } from 'date-fns-tz';\nimport { CalendarEvent } from '../types';\nimport { cn, isEventDragDisabled } from '../utils';\nimport { uses24HourClock } from '../lib/date';\nimport { DraggableEvent } from '../components/dnd/DraggableEvent';\nimport { DroppableCell } from '../components/dnd/DroppableCell';\nimport { ResizableEvent } from '../components/dnd/ResizableEvent';\nimport { Locale } from 'date-fns';\n\ninterface DayViewProps {\n currentDate: Date;\n events: CalendarEvent[];\n onEventClick?: (event: CalendarEvent) => void;\n onTimeSlotClick?: (date: Date) => void;\n onEventResize?: (event: CalendarEvent, newEnd: Date) => void;\n timezone?: string;\n locale?: Locale;\n readonly?: boolean;\n}\n\nexport const DayView: React.FC<DayViewProps> = ({\n currentDate,\n events,\n onEventClick,\n onTimeSlotClick,\n onEventResize,\n timezone,\n locale,\n readonly\n}) => {\n const hours = Array.from({ length: 24 }, (_, i) => i);\n const hourHeight = 80; // Larger height for Day View\n const scrollContainerRef = React.useRef<HTMLDivElement>(null);\n\n const [now, setNow] = React.useState(new Date());\n\n React.useEffect(() => {\n const interval = setInterval(() => setNow(new Date()), 60000);\n return () => clearInterval(interval);\n }, []);\n\n // Auto-scroll to 8am on mount\n React.useEffect(() => {\n if (scrollContainerRef.current) {\n const scrollToActualTime = () => {\n const currentHour = now.getHours();\n const offsetHour = 3; // Scroll a bit above current hour\n return (currentHour - offsetHour) * hourHeight;\n }\n scrollContainerRef.current.scrollTop = scrollToActualTime();\n }\n }, []);\n\n // Timezone adjustment helper\n const getZonedDate = (date: Date) => {\n return timezone ? toZonedTime(date, timezone) : date;\n };\n\n const zonedNow = getZonedDate(now);\n\n // Filter events for the current day\n const dayEvents = events.filter(e => {\n const zonedStart = getZonedDate(e.start);\n return isSameDay(zonedStart, currentDate);\n });\n\n const is24h = uses24HourClock(locale);\n const timeFormat = is24h ? 'H:mm' : 'h a';\n const eventTimeFormat = is24h ? 'H:mm' : 'h:mm a';\n const nowFormat = is24h ? 'H:mm' : 'h:mm a';\n\n return (\n <div className=\"flex flex-col h-full bg-background border-[0.5px] border-border/50 rounded-2xl overflow-hidden shadow-sm\">\n {/* Header */}\n <div className=\"px-6 py-4 border-b-[0.5px] border-border/50 bg-gradient-to-r from-muted/20 via-background to-muted/20 text-center shrink-0\">\n <div className=\"flex items-center justify-center gap-3\">\n <h2 className=\"text-xl font-semibold capitalize text-foreground\">\n {format(currentDate, 'EEEE, MMMM d, yyyy', { locale })}\n </h2>\n {isToday(currentDate) && (\n <span className=\"text-xs font-semibold bg-primary text-primary-foreground px-3 py-1 rounded-full shadow-md shadow-primary/20\">\n Today\n </span>\n )}\n </div>\n </div>\n\n {/* Grid */}\n <div ref={scrollContainerRef} className=\"flex-1 overflow-y-auto relative\">\n <div className=\"flex relative\" style={{ height: hours.length * hourHeight }}>\n {/* Time Labels */}\n <div className=\"w-20 bg-muted/5 border-r-[0.5px] border-border/30 relative\">\n {hours.map((hour) => (\n <div\n key={hour}\n className=\"relative w-full\"\n style={{ height: hourHeight }}\n >\n {hour !== 0 && (\n <span className=\"absolute w-full text-center -top-3 left-1/2 -translate-x-1/2 text-[11px] text-muted-foreground/80 font-medium tabular-nums bg-background px-1.5 py-0.5 rounded-md\">\n {format(new Date().setHours(hour, 0, 0, 0), timeFormat, { locale })}\n </span>\n )}\n </div>\n ))}\n\n {/* Left Side Current Time Indicator (Overlay) */}\n {isToday(currentDate) && (\n <div\n className=\"absolute left-0 w-full pointer-events-none z-30 flex justify-end pr-2\"\n style={{\n top: `${(zonedNow.getHours() * 60 + zonedNow.getMinutes()) / 60 * hourHeight}px`,\n }}\n >\n <span className=\"text-[10px] font-bold text-white bg-primary px-2 py-1 rounded-lg shadow-md shadow-primary/30 -translate-y-1/2\">\n {format(zonedNow, nowFormat, { locale })}\n </span>\n </div>\n )}\n </div>\n\n {/* Day Column */}\n <div className=\"flex-1 relative\">\n {hours.map((hour) => {\n return (\n <div\n key={hour}\n className=\"border-b-[0.5px] border-dashed border-border/20 box-border relative hover:bg-accent/5 transition-colors\"\n style={{ height: hourHeight }}\n >\n {/* 4 x 15-minute intervals */}\n {[0, 15, 30, 45].map((minute) => {\n const cellDate = new Date(currentDate);\n cellDate.setHours(hour, minute, 0, 0);\n const cellId = cellDate.toISOString();\n \n return (\n <DroppableCell \n key={minute}\n id={cellId}\n date={cellDate}\n className=\"w-full absolute left-0 right-0 z-0 transition-colors\"\n style={{ \n height: '25%', \n top: `${(minute / 60) * 100}%` \n }}\n >\n <div \n className=\"h-full w-full bg-transparent cursor-pointer\"\n onClick={() => onTimeSlotClick?.(cellDate)}\n />\n </DroppableCell>\n );\n })}\n </div>\n );\n })}\n\n {dayEvents.map(event => {\n // Calculate layout for overlapping events (same logic as WeekView)\n const overlappingEvents = dayEvents.filter(e => {\n if (e.id === event.id) return false;\n const s1 = getZonedDate(event.start).getTime();\n const e1 = getZonedDate(event.end).getTime();\n const s2 = getZonedDate(e.start).getTime();\n const e2 = getZonedDate(e.end).getTime();\n return s1 < e2 && e1 > s2;\n });\n\n // Sort overlapping group by start time for consistent positioning\n const group = [event, ...overlappingEvents].sort((a, b) =>\n getZonedDate(a.start).getTime() - getZonedDate(b.start).getTime() ||\n (a.id > b.id ? 1 : -1)\n );\n\n const index = group.findIndex(e => e.id === event.id);\n const count = group.length;\n\n const widthPercent = 100 / count;\n const leftPercent = index * widthPercent;\n\n const zonedStart = getZonedDate(event.start);\n const zonedEnd = getZonedDate(event.end);\n\n const startMinutes = zonedStart.getHours() * 60 + zonedStart.getMinutes();\n const durationMinutes = differenceInMinutes(zonedEnd, zonedStart);\n const top = (startMinutes / 60) * hourHeight;\n const height = (durationMinutes / 60) * hourHeight;\n\n const isShortEvent = durationMinutes < 45;\n\n return (\n <DraggableEvent\n key={`${event.id}-${currentDate.toISOString()}`}\n event={event}\n className={`absolute z-10 transition-all ${readonly ? \"cursor-default\" : \"\"}`}\n style={{\n top: `${top}px`,\n height: `${Math.max(height, 28)}px`,\n left: `calc(${leftPercent}% + 4px)`,\n width: `calc(${widthPercent}% - 8px)`,\n paddingRight: count > 1 ? '2px' : '0'\n }}\n >\n <ResizableEvent\n readonly={readonly}\n event={event}\n hourHeight={hourHeight}\n onResize={onEventResize}\n className=\"h-full\"\n style={{ height: '100%' }}\n >\n <div\n className={cn(\n \"h-full rounded-lg border-[0.5px] shadow-sm overflow-hidden transition-all hover:shadow-lg hover:z-20 group\",\n \"glass backdrop-blur-sm\",\n readonly || isEventDragDisabled(event) ? \"cursor-default\" : \"cursor-grab active:cursor-grabbing\",\n !event.color && \"bg-primary/10 border-primary/20\",\n isShortEvent ? \"px-2 flex items-center\" : \"px-3 py-2\",\n count > 1 && \"border-l-4\"\n )}\n style={{\n backgroundColor: event.color ? `${event.color}15` : undefined,\n borderColor: event.color ? `${event.color}30` : undefined,\n borderLeftColor: event.color || 'var(--primary)',\n borderLeftWidth: count > 1 ? '4px' : '3px'\n }}\n onClick={(e) => {\n e.stopPropagation();\n onEventClick?.(event);\n }}\n title={count > 1 ? `${event.title} (${index + 1}/${count})` : undefined}\n >\n <div className=\"flex flex-col h-full overflow-hidden w-full\">\n <div className={cn(\n \"font-semibold truncate leading-tight\",\n isShortEvent ? \"text-xs\" : \"text-sm\",\n event.color ? \"text-foreground\" : \"text-foreground/90\"\n )}>\n {event.title}\n </div>\n {!isShortEvent && (\n <>\n <div className=\"text-xs text-muted-foreground mt-0.5 font-medium\">\n {format(zonedStart, eventTimeFormat, { locale })} - {format(zonedEnd, eventTimeFormat, { locale })}\n </div>\n {event.description && height > 60 && (\n <div className=\"text-xs text-muted-foreground/80 mt-1 line-clamp-2\">\n {event.description}\n </div>\n )}\n </>\n )}\n {/* Overlap Badge */}\n {count > 1 && !isShortEvent && (\n <div className=\"absolute top-1.5 right-1.5 bg-background/90 backdrop-blur-sm rounded-full w-5 h-5 flex items-center justify-center text-[10px] font-bold text-muted-foreground border border-border shadow-sm\">\n {count}\n </div>\n )}\n </div>\n </div>\n </ResizableEvent>\n </DraggableEvent>\n );\n })}\n \n {/* Current Time Indicator */}\n {isToday(currentDate) && (\n <div\n className=\"absolute left-0 right-0 z-20 pointer-events-none flex items-center\"\n style={{\n top: `${(zonedNow.getHours() * 60 + zonedNow.getMinutes()) / 60 * hourHeight}px`\n }}\n >\n {/* Line */}\n <div className=\"h-[2px] w-full bg-gradient-to-r from-primary via-primary to-primary/50\" />\n {/* Dot */}\n <div className=\"absolute -left-1.5 w-3 h-3 bg-primary rounded-full shadow-lg shadow-primary/40 ring-2 ring-background animate-pulse\" />\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport { Calendar, CalendarDays, CalendarClock, ListTodo, Users, Plus } from 'lucide-react';\nimport { cn } from '../utils';\nimport { ViewType } from '../types';\n\ninterface EmptyStateProps {\n view: ViewType;\n onCreateEvent?: () => void;\n translations?: {\n noEvents?: string;\n noEventsDesc?: string;\n createFirst?: string;\n createEvent?: string;\n };\n className?: string;\n}\n\nconst viewIcons: Record<ViewType, React.ReactNode> = {\n month: <Calendar className=\"w-16 h-16 text-muted-foreground/30\" strokeWidth={1.5} />,\n week: <CalendarDays className=\"w-16 h-16 text-muted-foreground/30\" strokeWidth={1.5} />,\n day: <CalendarClock className=\"w-16 h-16 text-muted-foreground/30\" strokeWidth={1.5} />,\n agenda: <ListTodo className=\"w-16 h-16 text-muted-foreground/30\" strokeWidth={1.5} />,\n resource: <Users className=\"w-16 h-16 text-muted-foreground/30\" strokeWidth={1.5} />,\n};\n\nconst viewTitles: Record<ViewType, string> = {\n month: 'No events this month',\n week: 'No events this week',\n day: 'No events today',\n agenda: 'No upcoming events',\n resource: 'No scheduled resources',\n};\n\nconst viewDescriptions: Record<ViewType, string> = {\n month: 'Your calendar is clear. Add your first event to get started.',\n week: 'Nothing scheduled for this week. Create an event to begin planning.',\n day: 'Your day is free. Schedule something to make the most of it.',\n agenda: 'No events coming up. Plan ahead by creating new events.',\n resource: 'No resources have been assigned yet.',\n};\n\nexport const EmptyState: React.FC<EmptyStateProps> = ({\n view,\n onCreateEvent,\n translations,\n className,\n}) => {\n const title = translations?.noEvents || viewTitles[view];\n const description = translations?.noEventsDesc || viewDescriptions[view];\n\n return (\n <div className={cn(\n \"flex flex-col items-center justify-center h-full min-h-[400px] py-12 px-6\",\n className\n )}>\n {/* Decorative background */}\n <div className=\"relative mb-8\">\n <div className=\"absolute inset-0 bg-gradient-to-br from-primary/5 via-transparent to-primary/5 rounded-full blur-3xl scale-150\" />\n <div className=\"relative p-6 bg-gradient-to-br from-muted/30 to-muted/10 rounded-3xl border border-border/30\">\n {viewIcons[view]}\n </div>\n </div>\n\n {/* Content */}\n <div className=\"text-center max-w-sm\">\n <h3 className=\"text-lg font-semibold text-foreground mb-2\">\n {title}\n </h3>\n <p className=\"text-sm text-muted-foreground mb-6 leading-relaxed\">\n {description}\n </p>\n\n {/* Create button */}\n {onCreateEvent && (\n <button\n onClick={onCreateEvent}\n className=\"inline-flex items-center gap-2 px-5 py-2.5 bg-primary text-primary-foreground rounded-xl font-medium text-sm shadow-lg shadow-primary/20 hover:shadow-xl hover:shadow-primary/30 hover:scale-105 active:scale-95 transition-all duration-200\"\n >\n <Plus className=\"w-4 h-4\" />\n {translations?.createEvent || 'Create Event'}\n </button>\n )}\n </div>\n\n {/* Decorative dots pattern */}\n <div className=\"absolute inset-0 pointer-events-none overflow-hidden opacity-30\">\n <div className=\"absolute top-1/4 left-1/4 w-2 h-2 rounded-full bg-primary/20\" />\n <div className=\"absolute top-1/3 right-1/3 w-3 h-3 rounded-full bg-primary/10\" />\n <div className=\"absolute bottom-1/4 left-1/3 w-2 h-2 rounded-full bg-primary/15\" />\n <div className=\"absolute bottom-1/3 right-1/4 w-4 h-4 rounded-full bg-primary/5\" />\n </div>\n </div>\n );\n};\n\n// Mini empty state for use in smaller containers\nexport const MiniEmptyState: React.FC<{\n message?: string;\n className?: string;\n}> = ({ message = 'No events', className }) => (\n <div className={cn(\n \"flex flex-col items-center justify-center py-8 text-center\",\n className\n )}>\n <Calendar className=\"w-10 h-10 text-muted-foreground/20 mb-3\" strokeWidth={1.5} />\n <p className=\"text-sm text-muted-foreground\">{message}</p>\n </div>\n);\n\n// Empty state specifically for Agenda View with date context\nexport const AgendaEmptyState: React.FC<{\n onCreateEvent?: () => void;\n translations?: {\n noUpcoming?: string;\n noUpcomingHint?: string;\n allCaughtUp?: string;\n noEventsScheduled?: string;\n createEvent?: string;\n };\n}> = ({ onCreateEvent, translations }) => (\n <div className=\"flex flex-col items-center justify-center h-full min-h-[400px] py-12\">\n <div className=\"relative mb-8\">\n <div className=\"p-8 bg-gradient-to-br from-green-50 to-blue-50 dark:from-green-900/10 dark:to-blue-900/10 rounded-3xl border border-border/30\">\n <div className=\"flex items-center gap-4\">\n <div className=\"w-12 h-12 rounded-2xl bg-green-100 dark:bg-green-900/30 flex items-center justify-center\">\n <svg className=\"w-6 h-6 text-green-600 dark:text-green-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 13l4 4L19 7\" />\n </svg>\n </div>\n <div className=\"text-left\">\n <div className=\"font-medium text-foreground\">{translations?.allCaughtUp || 'All caught up!'}</div>\n <div className=\"text-sm text-muted-foreground\">{translations?.noEventsScheduled || 'No events scheduled'}</div>\n </div>\n </div>\n </div>\n </div>\n\n <div className=\"text-center max-w-sm\">\n <h3 className=\"text-lg font-semibold text-foreground mb-2\">\n {translations?.noUpcoming || 'Your schedule is clear'}\n </h3>\n <p className=\"text-sm text-muted-foreground mb-6\">\n {translations?.noUpcomingHint || 'No upcoming events to show. Create a new event to start planning.'}\n </p>\n\n {onCreateEvent && (\n <button\n onClick={onCreateEvent}\n className=\"inline-flex items-center gap-2 px-5 py-2.5 bg-primary text-primary-foreground rounded-xl font-medium text-sm shadow-lg shadow-primary/20 hover:shadow-xl hover:shadow-primary/30 hover:scale-105 active:scale-95 transition-all duration-200\"\n >\n <Plus className=\"w-4 h-4\" />\n {translations?.createEvent || 'Create Event'}\n </button>\n )}\n </div>\n </div>\n);\n","import React, { useMemo } from 'react';\nimport { format, isSameDay, isToday, isTomorrow, addDays, startOfDay, differenceInMinutes, Locale } from 'date-fns';\nimport { CalendarEvent, CalendarTranslations } from '../types';\nimport { cn } from '../utils';\nimport { uses24HourClock } from '../lib/date';\nimport { AgendaEmptyState } from '../components/EmptyState';\nimport { motion } from 'framer-motion';\nimport { Clock, MapPin, Users, Paperclip, Bell } from 'lucide-react';\n\ninterface AgendaViewProps {\n currentDate: Date;\n events: CalendarEvent[];\n onEventClick?: (event: CalendarEvent) => void;\n onCreateEvent?: () => void;\n locale?: Locale;\n translations?: Partial<CalendarTranslations>;\n}\n\nconst formatDuration = (start: Date, end: Date): string => {\n const minutes = differenceInMinutes(end, start);\n if (minutes < 60) return `${minutes}m`;\n const hours = Math.floor(minutes / 60);\n const remainingMinutes = minutes % 60;\n if (remainingMinutes === 0) return `${hours}h`;\n return `${hours}h ${remainingMinutes}m`;\n};\n\nconst getDateLabel = (\n date: Date,\n locale?: Locale,\n translations?: Partial<CalendarTranslations>\n): string => {\n if (isToday(date)) return translations?.today || 'Today';\n if (isTomorrow(date)) return translations?.tomorrow || 'Tomorrow';\n return format(date, 'EEEE', { locale });\n};\n\nexport const AgendaView: React.FC<AgendaViewProps> = ({\n currentDate,\n events,\n onEventClick,\n onCreateEvent,\n locale,\n translations,\n}) => {\n // Times follow the locale's clock convention (e.g. 24h for pt-BR/fr); the\n // historical 12h format stays the default without a locale.\n const is24h = uses24HourClock(locale);\n const timePattern = is24h ? 'H:mm' : 'h:mm a';\n const compactTimePattern = is24h ? 'H:mm' : 'h:mm';\n // Group events by day for the next 30 days starting from currentDate\n const groupedEvents = useMemo(() => {\n const startDate = startOfDay(currentDate);\n\n const groups: { date: Date; events: CalendarEvent[] }[] = [];\n\n // Sort all events by start time first\n const sortedEvents = [...events].sort((a, b) => a.start.getTime() - b.start.getTime());\n\n // Iterate through the next 30 days\n for (let i = 0; i < 30; i++) {\n const day = addDays(startDate, i);\n const dayEvents = sortedEvents.filter(event => isSameDay(event.start, day));\n\n if (dayEvents.length > 0) {\n groups.push({ date: day, events: dayEvents });\n }\n }\n\n return groups;\n }, [currentDate, events]);\n\n const container = {\n hidden: { opacity: 0 },\n show: {\n opacity: 1,\n transition: {\n staggerChildren: 0.05\n }\n }\n };\n\n const item = {\n hidden: { opacity: 0, x: -20 },\n show: { opacity: 1, x: 0 }\n };\n\n return (\n <div className=\"flex flex-col h-full bg-background overflow-y-auto\">\n {groupedEvents.length === 0 ? (\n <AgendaEmptyState onCreateEvent={onCreateEvent} translations={translations} />\n ) : (\n <motion.div\n className=\"max-w-3xl mx-auto w-full pb-10 px-4 md:px-6\"\n variants={container}\n initial=\"hidden\"\n animate=\"show\"\n >\n {groupedEvents.map((group, groupIndex) => (\n <motion.div\n key={group.date.toISOString()}\n className=\"relative\"\n variants={item}\n >\n {/* Date Header */}\n <div className=\"sticky top-0 bg-background/95 backdrop-blur-md py-4 z-10 border-b border-border/50\">\n <div className=\"flex items-center gap-4\">\n {/* Date box */}\n <div className={cn(\n \"flex flex-col items-center justify-center w-16 h-16 rounded-2xl transition-all\",\n isToday(group.date)\n ? \"bg-primary text-primary-foreground shadow-lg shadow-primary/30\"\n : \"bg-muted/50 text-foreground\"\n )}>\n <span className=\"text-2xl font-bold leading-none\">\n {format(group.date, 'd')}\n </span>\n <span className=\"text-xs font-medium uppercase tracking-wide opacity-80\">\n {format(group.date, 'MMM', { locale })}\n </span>\n </div>\n\n {/* Day info */}\n <div className=\"flex flex-col\">\n <span className={cn(\n \"text-lg font-semibold\",\n isToday(group.date) && \"text-primary\"\n )}>\n {getDateLabel(group.date, locale, translations)}\n </span>\n <span className=\"text-sm text-muted-foreground\">\n {group.events.length}{' '}\n {group.events.length !== 1\n ? (translations?.eventPlural || 'events')\n : (translations?.eventSingular || 'event')}\n </span>\n </div>\n </div>\n </div>\n\n {/* Events List */}\n <div className=\"py-4 space-y-3\">\n {group.events.map((event, eventIndex) => (\n <motion.div\n key={event.id}\n onClick={() => onEventClick?.(event)}\n className={cn(\n \"group relative flex gap-4 p-4 rounded-2xl border border-border/40\",\n \"hover:border-primary/40 hover:shadow-lg hover:shadow-primary/5\",\n \"transition-all duration-200 cursor-pointer\",\n \"bg-gradient-to-br from-card via-card to-card/80\"\n )}\n whileHover={{ scale: 1.01, y: -2 }}\n transition={{ duration: 0.2 }}\n >\n {/* Left accent bar */}\n <div\n className=\"absolute left-0 top-3 bottom-3 w-1 rounded-full\"\n style={{ backgroundColor: event.color || 'var(--primary)' }}\n />\n\n {/* Time Column */}\n <div className=\"flex flex-col items-center min-w-[70px] pl-2\">\n {event.allDay ? (\n <div className=\"flex flex-col items-center\">\n <span className=\"text-xs font-semibold text-muted-foreground bg-muted/80 px-2.5 py-1 rounded-full\">\n {translations?.allDay || 'All Day'}\n </span>\n </div>\n ) : (\n <div className=\"flex flex-col items-center\">\n <span className=\"text-base font-semibold text-foreground\">\n {format(event.start, compactTimePattern, { locale })}\n </span>\n {!is24h && (\n <span className=\"text-xs text-muted-foreground uppercase\">\n {format(event.start, 'a')}\n </span>\n )}\n <div className=\"w-px h-3 bg-border my-1\" />\n <span className=\"text-xs text-muted-foreground/70 font-medium\">\n {formatDuration(event.start, event.end)}\n </span>\n </div>\n )}\n </div>\n\n {/* Event Details */}\n <div className=\"flex-1 min-w-0 space-y-2\">\n <div className=\"flex items-start justify-between gap-2\">\n <h4 className=\"text-base font-semibold text-foreground group-hover:text-primary transition-colors line-clamp-1\">\n {event.title}\n </h4>\n {/* Color dot */}\n <div\n className=\"w-3 h-3 rounded-full shrink-0 mt-1.5\"\n style={{ backgroundColor: event.color || 'var(--primary)' }}\n />\n </div>\n\n {event.description && (\n <p className=\"text-sm text-muted-foreground line-clamp-2 leading-relaxed\">\n {event.description}\n </p>\n )}\n\n {/* Meta info row */}\n <div className=\"flex flex-wrap items-center gap-3 pt-1\">\n {!event.allDay && (\n <div className=\"flex items-center gap-1.5 text-xs text-muted-foreground\">\n <Clock className=\"w-3.5 h-3.5\" />\n <span>{format(event.start, timePattern, { locale })} - {format(event.end, timePattern, { locale })}</span>\n </div>\n )}\n\n {event.guests && event.guests.length > 0 && (\n <div className=\"flex items-center gap-1.5 text-xs text-muted-foreground\">\n <Users className=\"w-3.5 h-3.5\" />\n <span>\n {event.guests.length}{' '}\n {event.guests.length !== 1\n ? (translations?.guestsCount || 'guests')\n : (translations?.guestCount || 'guest')}\n </span>\n </div>\n )}\n\n {event.attachments && event.attachments.length > 0 && (\n <div className=\"flex items-center gap-1.5 text-xs text-muted-foreground\">\n <Paperclip className=\"w-3.5 h-3.5\" />\n <span>{event.attachments.length}</span>\n </div>\n )}\n\n {event.reminders && event.reminders.length > 0 && (\n <div className=\"flex items-center gap-1.5 text-xs text-muted-foreground\">\n <Bell className=\"w-3.5 h-3.5\" />\n <span>{event.reminders.length}</span>\n </div>\n )}\n </div>\n </div>\n\n {/* Hover arrow indicator */}\n <div className=\"absolute right-4 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-opacity\">\n <svg className=\"w-5 h-5 text-muted-foreground\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M9 18l6-6-6-6\" />\n </svg>\n </div>\n </motion.div>\n ))}\n </div>\n </motion.div>\n ))}\n </motion.div>\n )}\n </div>\n );\n};\n","import React, { useRef } from 'react';\nimport { format, addHours, startOfDay, differenceInMinutes, isSameDay } from 'date-fns';\nimport { CalendarEvent, Resource } from '../types';\nimport { cn } from '../utils';\nimport { uses24HourClock } from '../lib/date';\nimport { Locale } from 'date-fns';\nimport { DraggableEvent } from '../components/dnd/DraggableEvent';\nimport { DroppableCell } from '../components/dnd/DroppableCell';\n\ninterface ResourceViewProps {\n currentDate: Date;\n events: CalendarEvent[];\n resources: Resource[];\n onEventClick?: (event: CalendarEvent) => void;\n onTimeSlotClick?: (date: Date, resourceId: string) => void;\n locale?: Locale;\n}\n\nexport const ResourceView: React.FC<ResourceViewProps> = ({\n currentDate,\n events,\n resources,\n onEventClick,\n onTimeSlotClick,\n locale\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n \n // Define timeline: 8am to 8pm for example (or full 24h)\n // Let's do 24h for flexibility, but maybe scroll to 8am\n const hours = Array.from({ length: 24 }, (_, i) => i);\n const hourWidth = 100; // px per hour\n\n const timeFormat = uses24HourClock(locale) ? 'H:mm' : 'h a';\n\n const getEventStyle = (event: CalendarEvent) => {\n const start = new Date(event.start);\n const end = new Date(event.end);\n const dayStart = startOfDay(currentDate);\n \n // Calculate minutes from start of day\n const startMinutes = differenceInMinutes(start, dayStart);\n const durationMinutes = differenceInMinutes(end, start);\n \n const left = (startMinutes / 60) * hourWidth;\n const width = (durationMinutes / 60) * hourWidth;\n \n return {\n left: `${left}px`,\n width: `${Math.max(width, 4)}px`, // Min width for visibility\n };\n };\n\n return (\n <div className=\"flex flex-col h-full bg-background overflow-hidden\">\n {/* Header: Hours */}\n <div className=\"flex border-b border-border bg-muted/20\">\n <div className=\"w-48 shrink-0 border-r border-border p-4 font-semibold text-sm bg-background sticky left-0 z-20\">\n Resources\n </div>\n <div className=\"flex overflow-hidden\">\n <div className=\"flex relative\" style={{ width: hours.length * hourWidth }}>\n {hours.map(hour => (\n <div \n key={hour} \n className=\"border-r border-border/50 text-xs text-muted-foreground p-2 font-medium shrink-0\"\n style={{ width: hourWidth }}\n >\n {format(new Date().setHours(hour, 0, 0, 0), timeFormat, { locale })}\n </div>\n ))}\n </div>\n </div>\n </div>\n\n {/* Body: Resources & Events */}\n <div className=\"flex-1 overflow-auto relative\" ref={containerRef}>\n <div className=\"min-w-fit\">\n {resources.map(resource => {\n const resourceEvents = events.filter(e => \n e.resourceId === resource.id && \n isSameDay(new Date(e.start), currentDate)\n );\n\n return (\n <div key={resource.id} className=\"flex border-b border-border min-h-[100px]\">\n {/* Resource Label Column */}\n <div className=\"w-48 shrink-0 border-r border-border p-4 bg-background sticky left-0 z-10 flex items-center gap-3\">\n {resource.avatar ? (\n <img src={resource.avatar} alt={resource.label} className=\"w-8 h-8 rounded-full object-cover\" />\n ) : (\n <div className=\"w-8 h-8 rounded-full bg-primary/10 flex items-center justify-center text-xs font-bold text-primary\">\n {resource.label.substring(0, 2).toUpperCase()}\n </div>\n )}\n <div className=\"flex flex-col\">\n <span className=\"text-sm font-medium\">{resource.label}</span>\n <span className=\"text-xs text-muted-foreground\">ID: {resource.id}</span>\n </div>\n </div>\n\n {/* Timeline Row */}\n <div className=\"relative flex\" style={{ width: hours.length * hourWidth }}>\n {/* Grid Lines */}\n {hours.map(hour => (\n <div \n key={hour}\n className=\"flex h-full shrink-0\"\n style={{ width: hourWidth }}\n >\n {[0, 15, 30, 45].map(minute => {\n const slotDate = new Date(currentDate);\n slotDate.setHours(hour, minute, 0, 0);\n const slotId = `${resource.id}-${slotDate.toISOString()}`;\n\n return (\n <DroppableCell\n key={minute}\n id={slotId}\n date={slotDate}\n resourceId={resource.id}\n className=\"h-full flex-1 border-r border-border/10 last:border-border/30 hover:bg-accent/10 transition-colors\"\n onClick={() => {\n onTimeSlotClick?.(slotDate, resource.id);\n }}\n />\n );\n })}\n </div>\n ))}\n\n {/* Events */}\n {resourceEvents.map(event => (\n <DraggableEvent\n key={event.id}\n event={event}\n onClick={(e) => {\n e.stopPropagation();\n onEventClick?.(event);\n }}\n className=\"absolute top-2 bottom-2 rounded-md px-2 py-1 text-xs font-medium border shadow-sm cursor-pointer overflow-hidden hover:brightness-95 transition-all z-10\"\n style={{\n ...getEventStyle(event),\n backgroundColor: event.color || resource.color || 'var(--primary)',\n borderColor: 'rgba(0,0,0,0.1)',\n color: '#fff'\n }}\n >\n <div className=\"truncate\">{event.title}</div>\n </DraggableEvent>\n ))}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n );\n};\n","import React, { useEffect, useRef } from 'react';\nimport { X } from 'lucide-react';\nimport { cn } from '../../utils';\nimport { Button } from './button';\n\ninterface ModalProps {\n isOpen: boolean;\n onClose: () => void;\n title?: string;\n children: React.ReactNode;\n className?: string;\n hideHeader?: boolean;\n}\n\nexport const Modal: React.FC<ModalProps> = ({\n isOpen,\n onClose,\n title,\n children,\n className,\n hideHeader = false,\n}) => {\n const overlayRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose();\n }\n };\n\n if (isOpen) {\n document.addEventListener('keydown', handleEscape);\n }\n\n return () => {\n document.removeEventListener('keydown', handleEscape);\n };\n }, [isOpen, onClose]);\n\n if (!isOpen) return null;\n\n // Render inside parent container (absolute positioning) instead of portal to document.body\n return (\n <div className=\"absolute inset-0 z-50 flex items-center justify-center p-4 bg-black/40 backdrop-blur-md animate-in fade-in duration-300\">\n <div\n ref={overlayRef}\n className=\"absolute inset-0\"\n onClick={onClose}\n />\n <div\n className={cn(\n \"relative bg-background rounded-2xl shadow-2xl w-full max-w-md flex flex-col max-h-[70vh] sm:max-h-[80vh] animate-in zoom-in-95 slide-in-from-bottom-4 duration-300 border border-border/50\",\n className\n )}\n >\n {!hideHeader && (\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-border/50 shrink-0 bg-gradient-to-r from-muted/20 to-background\">\n <h3 className=\"text-lg font-semibold text-foreground\">\n {title}\n </h3>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onClose}\n className=\"h-9 w-9 p-0 rounded-xl hover:bg-accent/80 transition-all duration-200\"\n >\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </Button>\n </div>\n )}\n <div className={cn(\"overflow-y-auto flex-1\", !hideHeader && \"p-6\")}>\n {children}\n </div>\n </div>\n </div>\n );\n};\n","import React, { useState, useEffect, useRef } from 'react';\nimport { Modal } from './ui/Modal';\nimport { CalendarEvent, EventType, EventAttachment, EventReminder } from '../types';\nimport { format, formatDistanceToNow, differenceInMinutes } from 'date-fns';\nimport { motion, AnimatePresence } from 'framer-motion';\nimport {\n Clock, MapPin, AlignLeft, Trash2, X, Edit2,\n Users, Paperclip, File, XCircle, Calendar, ChevronDown, Check, Download,\n Bell, BellRing, Plus, Repeat, Tag, Palette, ChevronRight, Mail,\n ExternalLink, Copy, Share2, MoreHorizontal\n } from 'lucide-react';\nimport { cn } from '../utils';\n\ninterface EventModalProps {\n isOpen: boolean;\n onClose: () => void;\n event?: CalendarEvent | null;\n initialDate?: Date;\n onSave: (event: Partial<CalendarEvent>) => void;\n onDelete?: (eventId: string) => void;\n calendars?: { id: string; label: string; color?: string }[];\n eventTypes?: EventType[];\n translations: any;\n}\n\n// Predefined reminder options\nconst REMINDER_OPTIONS = [\n { value: 0, label: 'At time of event' },\n { value: 5, label: '5 minutes before' },\n { value: 10, label: '10 minutes before' },\n { value: 15, label: '15 minutes before' },\n { value: 30, label: '30 minutes before' },\n { value: 60, label: '1 hour before' },\n { value: 120, label: '2 hours before' },\n { value: 1440, label: '1 day before' },\n { value: 2880, label: '2 days before' },\n { value: 10080, label: '1 week before' },\n];\n\n// Color palette for events\nconst COLOR_PALETTE = [\n '#3b82f6', // Blue\n '#ef4444', // Red\n '#10b981', // Emerald\n '#f59e0b', // Amber\n '#8b5cf6', // Violet\n '#ec4899', // Pink\n '#06b6d4', // Cyan\n '#84cc16', // Lime\n '#f97316', // Orange\n '#6366f1', // Indigo\n];\n\nexport const EventModal: React.FC<EventModalProps> = ({\n isOpen,\n onClose,\n event,\n initialDate,\n onSave,\n onDelete,\n calendars,\n eventTypes,\n translations\n}) => {\n const [mode, setMode] = useState<'view' | 'edit' | 'create'>('create');\n const [activeTab, setActiveTab] = useState<'details' | 'guests' | 'options'>('details');\n\n const [formData, setFormData] = useState<Partial<CalendarEvent>>({\n title: '',\n description: '',\n location: '',\n start: new Date(),\n end: new Date(),\n allDay: false,\n color: '#3b82f6',\n calendarId: calendars?.[0]?.id,\n type: undefined,\n recurrence: undefined,\n attachments: [],\n reminders: [{ id: '1', type: 'notification', time: 30, label: '30 minutes before' }],\n });\n\n const [isCalendarDropdownOpen, setIsCalendarDropdownOpen] = useState(false);\n const [isColorPickerOpen, setIsColorPickerOpen] = useState(false);\n const [isReminderDropdownOpen, setIsReminderDropdownOpen] = useState(false);\n const [isGuestsDropdownOpen, setIsGuestsDropdownOpen] = useState(false);\n\n const fakeGuests = [\n 'alice@example.com',\n 'bob@example.com',\n 'charlie@example.com',\n 'diana@example.com',\n 'evan@example.com'\n ];\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n const [selectedGuests, setSelectedGuests] = useState<string[]>([]);\n\n useEffect(() => {\n if (isOpen) {\n if (event) {\n setMode('view');\n setFormData({\n ...event,\n start: new Date(event.start),\n end: new Date(event.end),\n attachments: event.attachments || [],\n reminders: event.reminders || [{ id: '1', type: 'notification', time: 30, label: '30 minutes before' }],\n });\n setSelectedGuests(event.guests || []);\n } else {\n setMode('create');\n const start = initialDate || new Date();\n const end = new Date(start);\n end.setHours(start.getHours() + 1);\n\n setFormData({\n title: '',\n description: '',\n location: '',\n start,\n end,\n allDay: false,\n color: '#3b82f6',\n calendarId: calendars?.[0]?.id,\n attachments: [],\n reminders: [{ id: '1', type: 'notification', time: 30, label: '30 minutes before' }],\n });\n setSelectedGuests([]);\n setActiveTab('details');\n }\n }\n }, [isOpen, event, initialDate, calendars]);\n\n const toggleGuest = (email: string) => {\n setSelectedGuests(prev => {\n const newGuests = prev.includes(email)\n ? prev.filter(e => e !== email)\n : [...prev, email];\n setFormData(curr => ({ ...curr, guests: newGuests }));\n return newGuests;\n });\n };\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n\n let eventColor = formData.color;\n if (formData.calendarId && calendars) {\n const selectedCal = calendars.find(c => c.id === formData.calendarId);\n if (selectedCal?.color) {\n eventColor = selectedCal.color;\n }\n }\n\n onSave({\n ...formData,\n color: eventColor,\n id: event?.id,\n });\n onClose();\n };\n\n const handleDelete = () => {\n if (event?.id && onDelete) {\n onDelete(event.id);\n onClose();\n }\n };\n\n const formatDateForInput = (date: Date | undefined) => {\n if (!date) return '';\n return format(date, \"yyyy-MM-dd'T'HH:mm\");\n };\n\n const handleDateChange = (field: 'start' | 'end', value: string) => {\n const date = new Date(value);\n if (isNaN(date.getTime())) return;\n\n if (field === 'start') {\n const duration = formData.end!.getTime() - formData.start!.getTime();\n setFormData(prev => ({\n ...prev,\n start: date,\n end: new Date(date.getTime() + duration)\n }));\n } else {\n if (date < formData.start!) {\n setFormData(prev => ({ ...prev, start: date, end: date }));\n } else {\n setFormData(prev => ({ ...prev, end: date }));\n }\n }\n };\n\n const addReminder = (minutes: number, label: string) => {\n const newReminder: EventReminder = {\n id: Math.random().toString(36).substr(2, 9),\n type: 'notification',\n time: minutes,\n label\n };\n setFormData(prev => ({\n ...prev,\n reminders: [...(prev.reminders || []), newReminder]\n }));\n setIsReminderDropdownOpen(false);\n };\n\n const removeReminder = (id: string) => {\n setFormData(prev => ({\n ...prev,\n reminders: prev.reminders?.filter(r => r.id !== id)\n }));\n };\n\n const handleFileUpload = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.files && e.target.files.length > 0) {\n const newAttachments: EventAttachment[] = Array.from(e.target.files).map(file => ({\n id: Math.random().toString(36).substr(2, 9),\n name: file.name,\n type: 'file',\n size: `${(file.size / 1024).toFixed(1)} KB`\n }));\n setFormData(prev => ({\n ...prev,\n attachments: [...(prev.attachments || []), ...newAttachments]\n }));\n }\n };\n\n const removeAttachment = (id: string) => {\n setFormData(prev => ({\n ...prev,\n attachments: prev.attachments?.filter(a => a.id !== id)\n }));\n };\n\n const handleDownload = (attachment: EventAttachment) => {\n const element = document.createElement(\"a\");\n const file = new Blob(['Dummy content for ' + attachment.name], {type: 'text/plain'});\n element.href = URL.createObjectURL(file);\n element.download = attachment.name;\n document.body.appendChild(element);\n element.click();\n document.body.removeChild(element);\n };\n\n const getDurationText = () => {\n if (!formData.start || !formData.end) return '';\n const mins = differenceInMinutes(formData.end, formData.start);\n if (mins < 60) return `${mins} min`;\n const hours = Math.floor(mins / 60);\n const remainingMins = mins % 60;\n if (remainingMins === 0) return `${hours} hr`;\n return `${hours} hr ${remainingMins} min`;\n };\n\n // ========== VIEW MODE ==========\n const renderViewMode = () => (\n <div className=\"flex flex-col bg-background overflow-hidden w-full max-h-[90vh]\">\n {/* Hero Header with Color */}\n <div\n className=\"relative px-6 pt-6 pb-8\"\n style={{\n background: `linear-gradient(135deg, ${event?.color || '#3b82f6'}15 0%, transparent 100%)`\n }}\n >\n {/* Top Actions Bar */}\n <div className=\"flex items-center justify-between mb-6\">\n <div className=\"flex items-center gap-2\">\n <div\n className=\"w-3 h-3 rounded-full\"\n style={{ backgroundColor: event?.color || '#3b82f6' }}\n />\n <span className=\"text-xs font-medium text-muted-foreground uppercase tracking-wider\">\n {calendars?.find(c => c.id === event?.calendarId)?.label || 'Event'}\n </span>\n </div>\n <div className=\"flex items-center gap-1\">\n <button\n onClick={() => setMode('edit')}\n className=\"p-2 hover:bg-background/80 rounded-lg transition-all text-muted-foreground hover:text-foreground\"\n title=\"Edit\"\n >\n <Edit2 className=\"w-4 h-4\" />\n </button>\n <button\n onClick={handleDelete}\n className=\"p-2 hover:bg-destructive/10 rounded-lg transition-all text-muted-foreground hover:text-destructive\"\n title=\"Delete\"\n >\n <Trash2 className=\"w-4 h-4\" />\n </button>\n <button\n onClick={onClose}\n className=\"p-2 hover:bg-background/80 rounded-lg transition-all text-muted-foreground hover:text-foreground\"\n title=\"Close\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n\n {/* Title */}\n <h1 className=\"text-2xl font-bold text-foreground mb-3 leading-tight\">\n {event?.title || '(No title)'}\n </h1>\n\n {/* Date & Time */}\n <div className=\"flex items-center gap-3 text-sm\">\n <div className=\"flex items-center gap-2 px-3 py-1.5 bg-background/60 backdrop-blur-sm rounded-lg border border-border/30\">\n <Calendar className=\"w-4 h-4 text-muted-foreground\" />\n <span className=\"font-medium\">\n {event?.start && format(new Date(event.start), 'EEE, MMM d')}\n </span>\n </div>\n <div className=\"flex items-center gap-2 px-3 py-1.5 bg-background/60 backdrop-blur-sm rounded-lg border border-border/30\">\n <Clock className=\"w-4 h-4 text-muted-foreground\" />\n <span className=\"font-medium\">\n {event?.start && format(new Date(event.start), 'h:mm a')} – {event?.end && format(new Date(event.end), 'h:mm a')}\n </span>\n </div>\n </div>\n </div>\n\n {/* Content */}\n <div className=\"px-6 pb-6 space-y-4 overflow-y-auto flex-1\">\n {/* Location */}\n {event?.location && (\n <motion.div\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n className=\"flex items-start gap-3 p-4 rounded-2xl bg-muted/30 border border-border/30 group hover:bg-muted/50 transition-all cursor-pointer\"\n >\n <div className=\"p-2 bg-primary/10 rounded-xl\">\n <MapPin className=\"w-5 h-5 text-primary\" />\n </div>\n <div className=\"flex-1\">\n <p className=\"text-sm font-medium text-foreground\">{event.location}</p>\n <p className=\"text-xs text-muted-foreground mt-0.5\">Click to open in maps</p>\n </div>\n <ExternalLink className=\"w-4 h-4 text-muted-foreground opacity-0 group-hover:opacity-100 transition-opacity\" />\n </motion.div>\n )}\n\n {/* Guests */}\n {event?.guests && event.guests.length > 0 && (\n <motion.div\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ delay: 0.05 }}\n className=\"space-y-3\"\n >\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <Users className=\"w-4 h-4 text-muted-foreground\" />\n <span className=\"text-sm font-medium text-foreground\">\n {event.guests.length} {event.guests.length > 1 ? 'Guests' : 'Guest'}\n </span>\n </div>\n </div>\n <div className=\"flex flex-wrap gap-2\">\n {event.guests.map((email, index) => (\n <div\n key={index}\n className=\"flex items-center gap-2 px-3 py-2 rounded-xl bg-muted/30 border border-border/30 hover:bg-muted/50 transition-all cursor-pointer group\"\n >\n <div\n className=\"w-8 h-8 rounded-full flex items-center justify-center text-sm font-semibold text-white\"\n style={{ backgroundColor: `hsl(${index * 60}, 70%, 50%)` }}\n >\n {email[0].toUpperCase()}\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-foreground\">{email.split('@')[0]}</p>\n <p className=\"text-xs text-muted-foreground truncate\">{email}</p>\n </div>\n </div>\n ))}\n </div>\n </motion.div>\n )}\n\n {/* Reminders */}\n {event?.reminders && event.reminders.length > 0 && (\n <motion.div\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ delay: 0.1 }}\n className=\"flex items-center gap-3\"\n >\n <div className=\"p-2 bg-amber-500/10 rounded-xl\">\n <Bell className=\"w-4 h-4 text-amber-500\" />\n </div>\n <div className=\"flex flex-wrap gap-2\">\n {event.reminders.map(reminder => (\n <span\n key={reminder.id}\n className=\"text-xs font-medium px-2.5 py-1 rounded-full bg-amber-500/10 text-amber-600 dark:text-amber-400\"\n >\n {reminder.label || `${reminder.time} min before`}\n </span>\n ))}\n </div>\n </motion.div>\n )}\n\n {/* Description */}\n {event?.description && (\n <motion.div\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ delay: 0.15 }}\n className=\"space-y-2\"\n >\n <div className=\"flex items-center gap-2\">\n <AlignLeft className=\"w-4 h-4 text-muted-foreground\" />\n <span className=\"text-sm font-medium text-foreground\">Notes</span>\n </div>\n <div className=\"text-sm text-foreground/80 whitespace-pre-wrap leading-relaxed pl-6 p-3 rounded-xl bg-muted/20 border border-border/30\">\n {event.description}\n </div>\n </motion.div>\n )}\n\n {/* Attachments */}\n {event?.attachments && event.attachments.length > 0 && (\n <motion.div\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ delay: 0.2 }}\n className=\"space-y-2\"\n >\n <div className=\"flex items-center gap-2\">\n <Paperclip className=\"w-4 h-4 text-muted-foreground\" />\n <span className=\"text-sm font-medium text-foreground\">Attachments</span>\n </div>\n <div className=\"grid gap-2\">\n {event.attachments.map(att => (\n <div\n key={att.id}\n onClick={() => handleDownload(att)}\n className=\"flex items-center gap-3 p-3 rounded-xl border border-border/30 bg-muted/20 hover:bg-muted/40 transition-all cursor-pointer group\"\n >\n <div className=\"p-2 bg-primary/10 rounded-lg\">\n <File className=\"w-4 h-4 text-primary\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-foreground truncate\">{att.name}</p>\n <p className=\"text-xs text-muted-foreground\">{att.size}</p>\n </div>\n <Download className=\"w-4 h-4 text-muted-foreground opacity-0 group-hover:opacity-100 transition-opacity\" />\n </div>\n ))}\n </div>\n </motion.div>\n )}\n </div>\n </div>\n );\n\n // ========== EDIT/CREATE MODE ==========\n const renderEditMode = () => (\n <form onSubmit={handleSubmit} className=\"flex flex-col bg-background overflow-hidden w-full max-h-[85vh]\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-5 py-4 border-b border-border/50 shrink-0\">\n <div className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={() => setIsColorPickerOpen(!isColorPickerOpen)}\n className=\"relative p-1\"\n >\n <div\n className=\"w-5 h-5 rounded-full cursor-pointer hover:scale-110 transition-transform\"\n style={{\n backgroundColor: formData.color,\n boxShadow: `0 0 0 2px var(--background), 0 0 0 4px ${formData.color}60`\n }}\n />\n {isColorPickerOpen && (\n <div className=\"absolute top-full left-0 mt-2 p-2 bg-background border border-border rounded-xl shadow-xl z-50 flex flex-wrap gap-1.5 w-[180px]\">\n {COLOR_PALETTE.map(color => (\n <button\n key={color}\n type=\"button\"\n onClick={() => {\n setFormData(prev => ({ ...prev, color }));\n setIsColorPickerOpen(false);\n }}\n className={cn(\n \"w-7 h-7 rounded-full transition-all hover:scale-110\",\n formData.color === color && \"ring-2 ring-offset-2 ring-offset-background ring-current\"\n )}\n style={{ backgroundColor: color, color: color }}\n />\n ))}\n </div>\n )}\n </button>\n <h2 className=\"text-lg font-semibold text-foreground\">\n {mode === 'edit' ? 'Edit Event' : 'New Event'}\n </h2>\n </div>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"p-2 hover:bg-accent rounded-xl transition-all text-muted-foreground hover:text-foreground\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n\n {/* Scrollable Content */}\n <div className=\"flex-1 overflow-y-auto\">\n <div className=\"px-5 py-4 space-y-5\">\n {/* Title */}\n <div>\n <input\n type=\"text\"\n required\n autoFocus\n className=\"w-full text-xl font-semibold border-0 border-b-2 border-transparent focus:border-primary bg-transparent px-0 py-2 placeholder-muted-foreground/50 transition-all text-foreground focus:outline-none\"\n value={formData.title}\n onChange={e => setFormData({ ...formData, title: e.target.value })}\n placeholder=\"Add title\"\n />\n </div>\n\n {/* Date & Time Row */}\n <div className=\"flex items-center gap-3 p-4 rounded-2xl bg-muted/20 border border-border/30\">\n <div className=\"p-2 bg-primary/10 rounded-xl shrink-0\">\n <Clock className=\"w-5 h-5 text-primary\" />\n </div>\n <div className=\"flex-1 grid grid-cols-2 gap-3\">\n <div>\n <label className=\"text-[10px] font-semibold text-muted-foreground uppercase tracking-wider mb-1 block\">Start</label>\n <input\n type=\"datetime-local\"\n className=\"w-full bg-background border border-border/50 rounded-xl px-3 py-2 text-sm font-medium text-foreground focus:border-primary focus:ring-2 focus:ring-primary/20 transition-all\"\n value={formatDateForInput(formData.start)}\n onChange={e => handleDateChange('start', e.target.value)}\n />\n </div>\n <div>\n <label className=\"text-[10px] font-semibold text-muted-foreground uppercase tracking-wider mb-1 block\">End</label>\n <input\n type=\"datetime-local\"\n className=\"w-full bg-background border border-border/50 rounded-xl px-3 py-2 text-sm font-medium text-foreground focus:border-primary focus:ring-2 focus:ring-primary/20 transition-all\"\n value={formatDateForInput(formData.end)}\n onChange={e => handleDateChange('end', e.target.value)}\n />\n </div>\n </div>\n </div>\n\n {/* Duration Badge */}\n {getDurationText() && (\n <div className=\"flex justify-center\">\n <span className=\"text-xs font-medium px-3 py-1 rounded-full bg-primary/10 text-primary\">\n {getDurationText()}\n </span>\n </div>\n )}\n\n {/* Reminders */}\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <Bell className=\"w-4 h-4 text-muted-foreground\" />\n <span className=\"text-sm font-medium text-foreground\">Reminders</span>\n </div>\n <div className=\"relative\">\n <button\n type=\"button\"\n onClick={() => setIsReminderDropdownOpen(!isReminderDropdownOpen)}\n className=\"flex items-center gap-1 text-xs font-medium text-primary hover:text-primary/80 transition-colors\"\n >\n <Plus className=\"w-3.5 h-3.5\" />\n Add\n </button>\n {isReminderDropdownOpen && (\n <>\n <div className=\"fixed inset-0 z-40\" onClick={() => setIsReminderDropdownOpen(false)} />\n <div className=\"absolute right-0 top-full mt-1 w-48 bg-background border border-border rounded-xl shadow-xl z-50 py-1 max-h-60 overflow-y-auto\">\n {REMINDER_OPTIONS.map(option => (\n <button\n key={option.value}\n type=\"button\"\n onClick={() => addReminder(option.value, option.label)}\n className=\"w-full px-3 py-2 text-left text-sm hover:bg-accent transition-colors\"\n >\n {option.label}\n </button>\n ))}\n </div>\n </>\n )}\n </div>\n </div>\n {formData.reminders && formData.reminders.length > 0 && (\n <div className=\"flex flex-wrap gap-2\">\n {formData.reminders.map(reminder => (\n <div\n key={reminder.id}\n className=\"flex items-center gap-2 px-3 py-1.5 rounded-full bg-amber-500/10 border border-amber-500/20\"\n >\n <BellRing className=\"w-3.5 h-3.5 text-amber-500\" />\n <span className=\"text-xs font-medium text-amber-600 dark:text-amber-400\">\n {reminder.label}\n </span>\n <button\n type=\"button\"\n onClick={() => removeReminder(reminder.id)}\n className=\"p-0.5 hover:bg-amber-500/20 rounded-full transition-colors\"\n >\n <X className=\"w-3 h-3 text-amber-500\" />\n </button>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Guests */}\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-2\">\n <Users className=\"w-4 h-4 text-muted-foreground\" />\n <span className=\"text-sm font-medium text-foreground\">Guests</span>\n </div>\n <div className=\"relative\">\n <button\n type=\"button\"\n onClick={() => setIsGuestsDropdownOpen(!isGuestsDropdownOpen)}\n className=\"w-full flex items-center justify-between px-4 py-3 bg-muted/20 border border-border/30 rounded-xl text-sm text-left hover:bg-muted/30 transition-all\"\n >\n <span className={selectedGuests.length > 0 ? \"text-foreground font-medium\" : \"text-muted-foreground\"}>\n {selectedGuests.length > 0\n ? `${selectedGuests.length} guest${selectedGuests.length > 1 ? 's' : ''} added`\n : \"Add guests\"}\n </span>\n <ChevronDown className={cn(\"w-4 h-4 text-muted-foreground transition-transform\", isGuestsDropdownOpen && \"rotate-180\")} />\n </button>\n\n {isGuestsDropdownOpen && (\n <>\n <div className=\"fixed inset-0 z-40\" onClick={() => setIsGuestsDropdownOpen(false)} />\n <div className=\"absolute z-50 w-full mt-2 bg-background border border-border rounded-xl shadow-xl max-h-48 overflow-y-auto\">\n {fakeGuests.map(email => (\n <div\n key={email}\n className=\"px-4 py-3 hover:bg-accent cursor-pointer flex items-center gap-3 transition-colors\"\n onClick={() => toggleGuest(email)}\n >\n <div className={cn(\n \"w-5 h-5 rounded-md border-2 flex items-center justify-center transition-all\",\n selectedGuests.includes(email) ? 'bg-primary border-primary' : 'border-border'\n )}>\n {selectedGuests.includes(email) && <Check className=\"w-3 h-3 text-primary-foreground\" />}\n </div>\n <div className=\"flex items-center gap-2\">\n <div\n className=\"w-7 h-7 rounded-full flex items-center justify-center text-xs font-semibold text-white\"\n style={{ backgroundColor: `hsl(${fakeGuests.indexOf(email) * 60}, 70%, 50%)` }}\n >\n {email[0].toUpperCase()}\n </div>\n <span className=\"text-sm\">{email}</span>\n </div>\n </div>\n ))}\n </div>\n </>\n )}\n </div>\n\n {selectedGuests.length > 0 && (\n <div className=\"flex flex-wrap gap-2 mt-2\">\n {selectedGuests.map(email => (\n <div\n key={email}\n className=\"flex items-center gap-2 pl-1 pr-2 py-1 bg-muted/30 border border-border/30 rounded-full\"\n >\n <div\n className=\"w-6 h-6 rounded-full flex items-center justify-center text-xs font-semibold text-white\"\n style={{ backgroundColor: `hsl(${fakeGuests.indexOf(email) * 60}, 70%, 50%)` }}\n >\n {email[0].toUpperCase()}\n </div>\n <span className=\"text-xs font-medium text-foreground\">{email.split('@')[0]}</span>\n <button\n type=\"button\"\n onClick={() => toggleGuest(email)}\n className=\"p-0.5 hover:bg-destructive/10 rounded-full transition-colors\"\n >\n <X className=\"w-3 h-3 text-muted-foreground\" />\n </button>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Location */}\n <div className=\"flex items-center gap-3 p-3 rounded-xl bg-muted/20 border border-border/30\">\n <MapPin className=\"w-5 h-5 text-muted-foreground shrink-0\" />\n <input\n type=\"text\"\n className=\"flex-1 bg-transparent text-sm text-foreground placeholder-muted-foreground focus:outline-none\"\n placeholder=\"Add location\"\n value={formData.location || ''}\n onChange={e => setFormData({ ...formData, location: e.target.value })}\n />\n </div>\n\n {/* Description */}\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-2\">\n <AlignLeft className=\"w-4 h-4 text-muted-foreground\" />\n <span className=\"text-sm font-medium text-foreground\">Notes</span>\n </div>\n <textarea\n className=\"w-full bg-muted/20 border border-border/30 rounded-xl px-4 py-3 text-sm min-h-[100px] resize-none text-foreground placeholder-muted-foreground focus:border-primary focus:ring-2 focus:ring-primary/20 transition-all\"\n placeholder=\"Add description or notes...\"\n value={formData.description || ''}\n onChange={e => setFormData({ ...formData, description: e.target.value })}\n />\n </div>\n\n {/* Recurrence */}\n <div className=\"flex items-center gap-3 p-3 rounded-xl bg-muted/20 border border-border/30\">\n <Repeat className=\"w-5 h-5 text-muted-foreground shrink-0\" />\n <select\n className=\"flex-1 bg-transparent text-sm text-foreground focus:outline-none cursor-pointer\"\n value={formData.recurrence?.freq || ''}\n onChange={e => {\n if (e.target.value === '') {\n setFormData({ ...formData, recurrence: undefined });\n } else {\n setFormData({\n ...formData,\n recurrence: {\n freq: e.target.value as 'DAILY' | 'WEEKLY' | 'MONTHLY' | 'YEARLY',\n interval: 1\n }\n });\n }\n }}\n >\n <option value=\"\">Does not repeat</option>\n <option value=\"DAILY\">Daily</option>\n <option value=\"WEEKLY\">Weekly</option>\n <option value=\"MONTHLY\">Monthly</option>\n <option value=\"YEARLY\">Yearly</option>\n </select>\n </div>\n\n {/* Calendar Selector */}\n <div className=\"flex items-center justify-between p-3 rounded-xl bg-muted/20 border border-border/30\">\n <div className=\"flex items-center gap-2\">\n <Tag className=\"w-5 h-5 text-muted-foreground\" />\n <span className=\"text-sm text-foreground\">Calendar</span>\n </div>\n <div className=\"relative\">\n <button\n type=\"button\"\n onClick={() => setIsCalendarDropdownOpen(!isCalendarDropdownOpen)}\n className=\"flex items-center gap-2 px-3 py-1.5 bg-background border border-border/50 rounded-lg text-sm hover:bg-accent/50 transition-all\"\n >\n <div\n className=\"w-3 h-3 rounded-full\"\n style={{ backgroundColor: calendars?.find(c => c.id === formData.calendarId)?.color || '#3b82f6' }}\n />\n <span className=\"font-medium\">{calendars?.find(c => c.id === formData.calendarId)?.label || 'Select'}</span>\n <ChevronDown className=\"w-3.5 h-3.5 text-muted-foreground\" />\n </button>\n\n {isCalendarDropdownOpen && (\n <>\n <div className=\"fixed inset-0 z-40\" onClick={() => setIsCalendarDropdownOpen(false)} />\n <div className=\"absolute right-0 bottom-full mb-2 w-48 bg-background border border-border rounded-xl shadow-xl z-50 py-1\">\n {calendars?.map(cal => (\n <button\n key={cal.id}\n type=\"button\"\n className=\"w-full flex items-center gap-3 px-3 py-2 hover:bg-accent transition-colors text-left\"\n onClick={() => {\n setFormData({\n ...formData,\n calendarId: cal.id,\n color: cal.color || formData.color\n });\n setIsCalendarDropdownOpen(false);\n }}\n >\n <div className=\"w-3 h-3 rounded-full\" style={{ backgroundColor: cal.color }} />\n <span className=\"flex-1 text-sm\">{cal.label}</span>\n {formData.calendarId === cal.id && <Check className=\"w-4 h-4 text-primary\" />}\n </button>\n ))}\n </div>\n </>\n )}\n </div>\n </div>\n </div>\n </div>\n\n {/* Footer */}\n <div className=\"px-5 py-4 border-t border-border/50 flex items-center justify-between bg-muted/10 shrink-0\">\n {mode === 'edit' && (\n <button\n type=\"button\"\n onClick={handleDelete}\n className=\"flex items-center gap-2 px-4 py-2 text-destructive hover:bg-destructive/10 rounded-xl transition-all text-sm font-medium\"\n >\n <Trash2 className=\"w-4 h-4\" />\n Delete\n </button>\n )}\n {mode === 'create' && <div />}\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n onClick={onClose}\n className=\"px-4 py-2.5 text-muted-foreground hover:text-foreground font-medium text-sm rounded-xl transition-all hover:bg-accent\"\n >\n Cancel\n </button>\n <button\n type=\"submit\"\n className=\"px-6 py-2.5 bg-primary hover:bg-primary/90 text-primary-foreground font-semibold text-sm rounded-xl shadow-md transition-all hover:shadow-lg hover:shadow-primary/20 active:scale-95\"\n >\n {mode === 'edit' ? 'Save Changes' : 'Create Event'}\n </button>\n </div>\n </div>\n </form>\n );\n\n return (\n <Modal isOpen={isOpen} onClose={onClose} hideHeader className=\"p-0 overflow-hidden max-w-lg rounded-2xl shadow-2xl\">\n <AnimatePresence mode=\"wait\">\n {mode === 'view' && event ? (\n <motion.div\n key=\"view\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15 }}\n >\n {renderViewMode()}\n </motion.div>\n ) : (\n <motion.div\n key=\"edit\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15 }}\n >\n {renderEditMode()}\n </motion.div>\n )}\n </AnimatePresence>\n </Modal>\n );\n};\n","import React from 'react';\nimport { cn } from '../utils';\n\n// Base skeleton component\nexport const Skeleton: React.FC<{ className?: string; style?: React.CSSProperties }> = ({ className, style }) => (\n <div className={cn(\"animate-pulse bg-muted/40 rounded\", className)} style={style} />\n);\n\n// Month View Skeleton\nexport const MonthViewSkeleton: React.FC = () => (\n <div className=\"h-full bg-background border border-border/50 rounded-2xl overflow-hidden\">\n {/* Header */}\n <div className=\"grid grid-cols-7 border-b border-border/50 bg-muted/10\">\n {Array.from({ length: 7 }).map((_, i) => (\n <div key={i} className=\"py-3 px-2 text-center border-r border-border/30 last:border-r-0\">\n <Skeleton className=\"h-4 w-8 mx-auto\" />\n </div>\n ))}\n </div>\n {/* Grid */}\n <div className=\"grid grid-cols-7 flex-1\">\n {Array.from({ length: 35 }).map((_, i) => (\n <div key={i} className=\"min-h-[120px] border-r border-b border-border/30 p-2\">\n <Skeleton className=\"h-4 w-6 mb-2\" />\n <div className=\"space-y-1\">\n {Math.random() > 0.5 && <Skeleton className=\"h-5 w-full rounded-md\" />}\n {Math.random() > 0.7 && <Skeleton className=\"h-5 w-3/4 rounded-md\" />}\n </div>\n </div>\n ))}\n </div>\n </div>\n);\n\n// Week View Skeleton\nexport const WeekViewSkeleton: React.FC = () => (\n <div className=\"h-full bg-background border border-border/50 rounded-2xl overflow-hidden\">\n {/* Header */}\n <div className=\"flex border-b border-border/50 bg-muted/10\">\n <div className=\"w-16 p-3 border-r border-border/30\">\n <Skeleton className=\"h-8 w-10 mx-auto\" />\n </div>\n <div className=\"flex-1 grid grid-cols-7\">\n {Array.from({ length: 7 }).map((_, i) => (\n <div key={i} className=\"py-3 px-2 text-center border-r border-border/30 last:border-r-0\">\n <Skeleton className=\"h-3 w-8 mx-auto mb-1\" />\n <Skeleton className=\"h-8 w-8 mx-auto rounded-xl\" />\n </div>\n ))}\n </div>\n </div>\n {/* Grid */}\n <div className=\"flex flex-1\" style={{ height: '600px' }}>\n <div className=\"w-16 border-r border-border/30\">\n {Array.from({ length: 10 }).map((_, i) => (\n <div key={i} className=\"h-[60px] relative\">\n <Skeleton className=\"h-4 w-10 absolute right-2 -translate-y-1/2\" />\n </div>\n ))}\n </div>\n <div className=\"flex-1 grid grid-cols-7 relative\">\n {Array.from({ length: 7 }).map((_, colIdx) => (\n <div key={colIdx} className=\"relative border-r border-border/30 last:border-r-0\">\n {Array.from({ length: 10 }).map((_, rowIdx) => (\n <div key={rowIdx} className=\"h-[60px] border-b border-dashed border-border/20\" />\n ))}\n {/* Random events */}\n {Math.random() > 0.3 && (\n <Skeleton\n className=\"absolute rounded-md\"\n style={{\n top: `${Math.floor(Math.random() * 400)}px`,\n left: '4px',\n right: '4px',\n height: `${60 + Math.floor(Math.random() * 120)}px`\n }}\n />\n )}\n </div>\n ))}\n </div>\n </div>\n </div>\n);\n\n// Day View Skeleton\nexport const DayViewSkeleton: React.FC = () => (\n <div className=\"h-full bg-background border border-border/50 rounded-2xl overflow-hidden\">\n {/* Header */}\n <div className=\"px-6 py-4 border-b border-border/50 bg-muted/10 text-center\">\n <Skeleton className=\"h-7 w-64 mx-auto\" />\n </div>\n {/* Grid */}\n <div className=\"flex flex-1\" style={{ height: '600px' }}>\n <div className=\"w-20 border-r border-border/30 bg-muted/5\">\n {Array.from({ length: 10 }).map((_, i) => (\n <div key={i} className=\"h-[80px] relative\">\n <Skeleton className=\"h-4 w-12 absolute left-1/2 -translate-x-1/2 -translate-y-1/2\" />\n </div>\n ))}\n </div>\n <div className=\"flex-1 relative\">\n {Array.from({ length: 10 }).map((_, i) => (\n <div key={i} className=\"h-[80px] border-b border-dashed border-border/20\" />\n ))}\n {/* Random events */}\n <Skeleton\n className=\"absolute rounded-lg left-4 right-4\"\n style={{ top: '160px', height: '120px' }}\n />\n <Skeleton\n className=\"absolute rounded-lg left-4 right-4\"\n style={{ top: '400px', height: '80px' }}\n />\n </div>\n </div>\n </div>\n);\n\n// Agenda View Skeleton\nexport const AgendaViewSkeleton: React.FC = () => (\n <div className=\"h-full bg-background border border-border/50 rounded-2xl overflow-hidden p-6\">\n <div className=\"space-y-6\">\n {Array.from({ length: 4 }).map((_, dayIdx) => (\n <div key={dayIdx}>\n <Skeleton className=\"h-5 w-40 mb-4\" />\n <div className=\"space-y-3\">\n {Array.from({ length: 2 + Math.floor(Math.random() * 3) }).map((_, eventIdx) => (\n <div key={eventIdx} className=\"flex items-center gap-4 p-3 rounded-xl bg-muted/10\">\n <Skeleton className=\"h-10 w-10 rounded-lg\" />\n <div className=\"flex-1 space-y-2\">\n <Skeleton className=\"h-4 w-3/4\" />\n <Skeleton className=\"h-3 w-1/2\" />\n </div>\n </div>\n ))}\n </div>\n </div>\n ))}\n </div>\n </div>\n);\n\n// Calendar Header Skeleton\nexport const CalendarHeaderSkeleton: React.FC = () => (\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-border/50 bg-muted/10\">\n <div className=\"flex items-center gap-3\">\n <Skeleton className=\"h-8 w-8 rounded-lg\" />\n <div className=\"flex items-center gap-2\">\n <Skeleton className=\"h-8 w-8 rounded-lg\" />\n <Skeleton className=\"h-8 w-8 rounded-lg\" />\n <Skeleton className=\"h-8 w-20 rounded-lg\" />\n </div>\n <Skeleton className=\"h-6 w-40\" />\n </div>\n <div className=\"flex items-center gap-2\">\n {Array.from({ length: 4 }).map((_, i) => (\n <Skeleton key={i} className=\"h-8 w-16 rounded-lg\" />\n ))}\n </div>\n </div>\n);\n\n// Sidebar Skeleton\nexport const SidebarSkeleton: React.FC = () => (\n <div className=\"w-[260px] h-full bg-background border-r border-border/50 p-4 space-y-6\">\n {/* Create button */}\n <Skeleton className=\"h-12 w-full rounded-2xl\" />\n\n {/* Mini calendar */}\n <div className=\"space-y-2\">\n <div className=\"flex justify-between items-center mb-2\">\n <Skeleton className=\"h-4 w-20\" />\n <div className=\"flex gap-1\">\n <Skeleton className=\"h-6 w-6 rounded\" />\n <Skeleton className=\"h-6 w-6 rounded\" />\n </div>\n </div>\n <div className=\"grid grid-cols-7 gap-1\">\n {Array.from({ length: 7 }).map((_, i) => (\n <Skeleton key={i} className=\"h-4 w-4 mx-auto\" />\n ))}\n {Array.from({ length: 35 }).map((_, i) => (\n <Skeleton key={i} className=\"h-7 w-7 mx-auto rounded\" />\n ))}\n </div>\n </div>\n\n {/* Calendars section */}\n <div className=\"bg-muted/20 rounded-2xl p-3\">\n <Skeleton className=\"h-4 w-20 mb-3\" />\n <div className=\"space-y-2\">\n {Array.from({ length: 3 }).map((_, i) => (\n <div key={i} className=\"flex items-center gap-3\">\n <Skeleton className=\"h-5 w-5 rounded\" />\n <Skeleton className=\"h-4 flex-1\" />\n </div>\n ))}\n </div>\n </div>\n </div>\n);\n\n// Full Calendar Skeleton (combines all)\nexport const CalendarSkeleton: React.FC<{ view?: string }> = ({ view = 'month' }) => (\n <div className=\"flex flex-col h-full\">\n <CalendarHeaderSkeleton />\n <div className=\"flex flex-1 overflow-hidden\">\n <SidebarSkeleton />\n <div className=\"flex-1 p-4\">\n {view === 'month' && <MonthViewSkeleton />}\n {view === 'week' && <WeekViewSkeleton />}\n {view === 'day' && <DayViewSkeleton />}\n {view === 'agenda' && <AgendaViewSkeleton />}\n </div>\n </div>\n </div>\n);\n","import React, { useState, useCallback, useEffect, useRef } from 'react';\nimport { CalendarEvent } from '../types';\nimport { cn } from '../utils';\nimport { Edit3, Trash2, Copy, Calendar, Clock, X } from 'lucide-react';\nimport { AnimatePresence, motion } from 'framer-motion';\n\ninterface ContextMenuAction {\n id: string;\n label: string;\n icon?: React.ReactNode;\n onClick: () => void;\n variant?: 'default' | 'danger';\n disabled?: boolean;\n}\n\ninterface EventContextMenuProps {\n event: CalendarEvent | null;\n position: { x: number; y: number } | null;\n onClose: () => void;\n onEdit?: (event: CalendarEvent) => void;\n onDelete?: (eventId: string) => void;\n onDuplicate?: (event: CalendarEvent) => void;\n customActions?: ContextMenuAction[];\n translations?: {\n edit?: string;\n delete?: string;\n duplicate?: string;\n };\n}\n\nexport const EventContextMenu: React.FC<EventContextMenuProps> = ({\n event,\n position,\n onClose,\n onEdit,\n onDelete,\n onDuplicate,\n customActions = [],\n translations,\n}) => {\n const menuRef = useRef<HTMLDivElement>(null);\n\n // Close on escape key\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose();\n }\n };\n\n if (position) {\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }\n }, [position, onClose]);\n\n // Close on click outside\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(e.target as Node)) {\n onClose();\n }\n };\n\n if (position) {\n // Delay to prevent immediate close from the right-click that opened it\n setTimeout(() => {\n document.addEventListener('mousedown', handleClickOutside);\n }, 0);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }\n }, [position, onClose]);\n\n if (!event || !position) return null;\n\n const actions: ContextMenuAction[] = [\n ...(onEdit ? [{\n id: 'edit',\n label: translations?.edit || 'Edit',\n icon: <Edit3 className=\"w-4 h-4\" />,\n onClick: () => {\n onEdit(event);\n onClose();\n },\n }] : []),\n ...(onDuplicate ? [{\n id: 'duplicate',\n label: translations?.duplicate || 'Duplicate',\n icon: <Copy className=\"w-4 h-4\" />,\n onClick: () => {\n onDuplicate(event);\n onClose();\n },\n }] : []),\n ...customActions,\n ...(onDelete ? [{\n id: 'delete',\n label: translations?.delete || 'Delete',\n icon: <Trash2 className=\"w-4 h-4\" />,\n onClick: () => {\n onDelete(event.id);\n onClose();\n },\n variant: 'danger' as const,\n }] : []),\n ];\n\n // Calculate position to ensure menu stays within viewport\n const adjustedPosition = {\n x: Math.min(position.x, window.innerWidth - 200),\n y: Math.min(position.y, window.innerHeight - (actions.length * 44 + 80)),\n };\n\n return (\n <AnimatePresence>\n <motion.div\n ref={menuRef}\n initial={{ opacity: 0, scale: 0.95, y: -5 }}\n animate={{ opacity: 1, scale: 1, y: 0 }}\n exit={{ opacity: 0, scale: 0.95, y: -5 }}\n transition={{ duration: 0.15, ease: 'easeOut' }}\n className=\"fixed z-[100] min-w-[180px] bg-background border-[0.5px] border-border rounded-xl shadow-xl overflow-hidden\"\n style={{\n left: adjustedPosition.x,\n top: adjustedPosition.y,\n }}\n >\n {/* Event preview header */}\n <div className=\"px-3 py-2 border-b-[0.5px] border-border bg-muted/30\">\n <div className=\"flex items-center gap-2\">\n <div\n className=\"w-2.5 h-2.5 rounded-full shrink-0\"\n style={{ backgroundColor: event.color || 'var(--primary)' }}\n />\n <span className=\"text-sm font-medium truncate text-foreground\">\n {event.title}\n </span>\n </div>\n </div>\n\n {/* Actions */}\n <div className=\"py-1\">\n {actions.map((action, index) => (\n <React.Fragment key={action.id}>\n {index > 0 && action.variant === 'danger' && (\n <div className=\"h-px bg-border my-1\" />\n )}\n <button\n onClick={action.onClick}\n disabled={action.disabled}\n className={cn(\n \"w-full flex items-center gap-3 px-3 py-2 text-sm transition-colors\",\n action.disabled && \"opacity-50 cursor-not-allowed\",\n action.variant === 'danger'\n ? \"text-red-600 hover:bg-red-50 dark:text-red-400 dark:hover:bg-red-900/20\"\n : \"text-foreground hover:bg-accent\"\n )}\n >\n {action.icon}\n <span>{action.label}</span>\n </button>\n </React.Fragment>\n ))}\n </div>\n </motion.div>\n </AnimatePresence>\n );\n};\n\n// Hook to manage context menu state\nexport const useEventContextMenu = () => {\n const [contextMenu, setContextMenu] = useState<{\n event: CalendarEvent | null;\n position: { x: number; y: number } | null;\n }>({ event: null, position: null });\n\n const openContextMenu = useCallback((event: CalendarEvent, e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setContextMenu({\n event,\n position: { x: e.clientX, y: e.clientY },\n });\n }, []);\n\n const closeContextMenu = useCallback(() => {\n setContextMenu({ event: null, position: null });\n }, []);\n\n return {\n contextMenuEvent: contextMenu.event,\n contextMenuPosition: contextMenu.position,\n openContextMenu,\n closeContextMenu,\n };\n};\n","export const en = {\n today: 'Today',\n month: 'Month',\n week: 'Week',\n day: 'Day',\n agenda: 'Agenda',\n resource: 'Resources',\n createEvent: 'Create Event',\n editEvent: 'Edit Event',\n delete: 'Delete',\n save: 'Save',\n cancel: 'Cancel',\n title: 'Add title',\n start: 'Start',\n end: 'End',\n allDay: 'All Day',\n description: 'Description',\n repeat: 'Repeat',\n noRepeat: 'Does not repeat',\n selectCalendar: 'Select Calendar',\n selectType: 'Select Type',\n daily: 'Daily',\n weekly: 'Weekly',\n monthly: 'Monthly',\n yearly: 'Yearly',\n search: 'Search events...',\n allTypes: 'All Types',\n timezone: 'Time zone',\n localTime: 'Local Time',\n create: 'Create',\n calendars: 'Calendars',\n event: 'Event',\n task: 'Task',\n appointmentSchedule: 'Appointment schedule',\n new: 'New',\n dateAndTime: 'Date & Time',\n whosJoining: \"Who's joining?\",\n suggestedTimes: 'Suggested times for guests',\n viewSuggestions: 'View suggestions',\n whereWillItBe: 'Where will it be?',\n location: 'Enter address',\n descriptionAndAttachments: 'Description',\n dragAndDrop: 'Drag & drop files or',\n guests: 'Guests',\n addGuests: 'Add guests',\n addAttachment: 'Upload files',\n moreOptions: 'More options',\n doesNotRepeat: 'Does not repeat',\n locationHelpText: 'Enter a physical address (e.g. \"123 Main St\") to generate the map.',\n notes: 'Notes...',\n guestCount: 'guest',\n guestsCount: 'guests',\n repeatFor: 'Repeat for',\n times: 'times',\n until: 'Until',\n endRepeat: 'End repeat',\n never: 'Never',\n afterOccurrences: 'After occurrences',\n onDate: 'On date',\n tomorrow: 'Tomorrow',\n edit: 'Edit',\n duplicate: 'Duplicate',\n eventSingular: 'event',\n eventPlural: 'events',\n allCaughtUp: 'All caught up!',\n noEventsScheduled: 'No events scheduled',\n noUpcoming: 'Your schedule is clear',\n noUpcomingHint: 'No upcoming events to show. Create a new event to start planning.'\n};\n\n// Typed against the English pack so the dictionaries can't drift apart.\nexport const fr: typeof en = {\n today: \"Aujourd'hui\",\n month: 'Mois',\n week: 'Semaine',\n day: 'Jour',\n agenda: 'Agenda',\n resource: 'Ressources',\n createEvent: 'Créer un événement',\n editEvent: \"Modifier l'événement\",\n delete: 'Supprimer',\n save: 'Enregistrer',\n cancel: 'Annuler',\n title: 'Ajouter un titre',\n start: 'Début',\n end: 'Fin',\n allDay: 'Toute la journée',\n description: 'Description',\n repeat: 'Répéter',\n noRepeat: 'Ne se répète pas',\n selectCalendar: 'Sélectionner un calendrier',\n selectType: 'Sélectionner un type',\n daily: 'Quotidien',\n weekly: 'Hebdomadaire',\n monthly: 'Mensuel',\n yearly: 'Annuel',\n search: 'Rechercher...',\n allTypes: 'Tous les types',\n timezone: 'Fuseau horaire',\n localTime: 'Heure locale',\n create: 'Créer',\n calendars: 'Calendriers',\n event: 'Événement',\n task: 'Tâche',\n appointmentSchedule: 'Planning de rendez-vous',\n new: 'Nouveau',\n dateAndTime: 'Date et heure',\n whosJoining: 'Qui participe ?',\n suggestedTimes: 'Horaires suggérés',\n viewSuggestions: 'Voir les suggestions',\n whereWillItBe: 'Où aura lieu ?',\n location: 'Entrer une adresse',\n descriptionAndAttachments: 'Description',\n dragAndDrop: 'Glisser-déposer des fichiers ou',\n guests: 'Invités',\n addGuests: 'Ajouter des invités',\n addAttachment: 'Télécharger des fichiers',\n moreOptions: \"Plus d'options\",\n doesNotRepeat: 'Ne se répète pas',\n locationHelpText: 'Entrez une adresse physique (ex: \"123 Rue Principale\") pour générer la carte.',\n notes: 'Notes...',\n guestCount: 'invité',\n guestsCount: 'invités',\n repeatFor: 'Répéter pendant',\n times: 'fois',\n until: \"Jusqu'au\",\n endRepeat: 'Fin de répétition',\n never: 'Jamais',\n afterOccurrences: 'Après occurrences',\n onDate: 'À la date',\n tomorrow: 'Demain',\n edit: 'Modifier',\n duplicate: 'Dupliquer',\n eventSingular: 'événement',\n eventPlural: 'événements',\n allCaughtUp: 'Tout est à jour !',\n noEventsScheduled: 'Aucun événement prévu',\n noUpcoming: 'Votre planning est libre',\n noUpcomingHint: 'Aucun événement à venir. Créez un nouvel événement pour commencer à planifier.'\n};\n","/**\n * Converts a color string (hex or rgb) to HSL values (h s% l%) for Tailwind CSS variables.\n * @param color - The color string (e.g., \"#3b82f6\", \"3b82f6\", \"rgb(0, 84, 97)\")\n * @returns The HSL string (e.g., \"217 91% 60%\") or null if invalid\n */\nexport function colorToHsl(color: string): string | null {\n let r = 0, g = 0, b = 0;\n\n // Handle Hex\n if (color.startsWith('#') || /^[0-9a-fA-F]{3,6}$/.test(color)) {\n let c = color.replace(/^#/, '');\n if (c.length === 3) {\n c = c.split('').map(char => char + char).join('');\n }\n if (c.length !== 6) return null;\n \n r = parseInt(c.substring(0, 2), 16) / 255;\n g = parseInt(c.substring(2, 4), 16) / 255;\n b = parseInt(c.substring(4, 6), 16) / 255;\n } \n // Handle RGB\n else if (color.startsWith('rgb')) {\n const match = color.match(/\\d+/g);\n if (!match || match.length < 3) return null;\n r = parseInt(match[0]) / 255;\n g = parseInt(match[1]) / 255;\n b = parseInt(match[2]) / 255;\n } \n else {\n return null;\n }\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n let h = 0;\n let s = 0;\n let l = (max + min) / 2;\n\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n\n h /= 6;\n }\n\n const hDeg = Math.round(h * 360);\n const sPct = Math.round(s * 100);\n const lPct = Math.round(l * 100);\n\n return `${hDeg} ${sPct}% ${lPct}%`;\n}\n\nexport interface ThemeVariables {\n '--background'?: string;\n '--foreground'?: string;\n '--primary'?: string;\n '--primary-foreground'?: string;\n '--secondary'?: string;\n '--secondary-foreground'?: string;\n '--muted'?: string;\n '--muted-foreground'?: string;\n '--accent'?: string;\n '--accent-foreground'?: string;\n '--border'?: string;\n '--radius'?: string;\n}\n\nimport { CalendarTheme } from '../types';\n\nexport function getThemeStyles(theme?: CalendarTheme): React.CSSProperties {\n if (!theme) return {};\n\n const styles: Record<string, string> = {};\n\n // Handle Colors\n if (theme.colors) {\n const mappings: Record<string, keyof typeof theme.colors> = {\n '--background': 'background',\n '--foreground': 'foreground',\n '--primary': 'primary',\n '--secondary': 'secondary',\n '--muted': 'muted',\n '--accent': 'accent',\n '--border': 'border',\n };\n\n Object.entries(mappings).forEach(([cssVar, themeKey]) => {\n const colorValue = theme.colors?.[themeKey];\n if (colorValue) {\n const hsl = colorToHsl(colorValue);\n if (hsl) {\n styles[cssVar] = hsl;\n }\n }\n });\n }\n\n // Handle Border Radius\n if (theme.borderRadius) {\n styles['--radius'] = theme.borderRadius;\n }\n\n // Handle Font Family\n if (theme.fontFamily) {\n styles['fontFamily'] = theme.fontFamily;\n }\n\n return styles as React.CSSProperties;\n}\n","import { useState, useMemo } from 'react';\nimport {\n addMonths, subMonths, addWeeks, subWeeks, addDays, subDays,\n differenceInMilliseconds\n} from 'date-fns';\nimport { toZonedTime, fromZonedTime } from 'date-fns-tz';\nimport { RRule } from 'rrule';\nimport { DragEndEvent } from '@dnd-kit/core';\nimport { ViewType, CalendarEvent } from '../types';\n\ninterface UseCalendarLogicProps {\n events: CalendarEvent[];\n view?: ViewType;\n onViewChange?: (view: ViewType) => void;\n date?: Date;\n onDateChange?: (date: Date) => void;\n onEventClick?: (event: CalendarEvent) => void;\n onEventUpdate?: (event: CalendarEvent) => void;\n onEventCreate?: (event: Partial<CalendarEvent>) => void;\n onEventDelete?: (eventId: string) => void;\n readOnly?: boolean;\n timezone?: string;\n}\n\nexport const useCalendarLogic = ({\n events,\n view: controlledView,\n onViewChange: controlledOnViewChange,\n date: controlledDate,\n onDateChange: controlledOnDateChange,\n onEventClick,\n onEventUpdate,\n onEventCreate,\n onEventDelete,\n readOnly,\n timezone\n}: UseCalendarLogicProps) => {\n const [internalView, setInternalView] = useState<ViewType>('week');\n const [internalDate, setInternalDate] = useState(new Date());\n const [isSidebarOpen, setIsSidebarOpen] = useState(true);\n \n // Modal state\n const [isModalOpen, setIsModalOpen] = useState(false);\n const [selectedEvent, setSelectedEvent] = useState<CalendarEvent | null>(null);\n const [modalInitialDate, setModalInitialDate] = useState<Date | undefined>(undefined);\n\n const view = controlledView ?? internalView;\n const currentDate = controlledDate ?? internalDate;\n\n // Expand recurring events\n const expandedEvents = useMemo(() => {\n const allEvents: CalendarEvent[] = [];\n \n // Define a range for expansion (e.g., +/- 1 year from current date)\n // For better performance, we could limit this based on the current view range\n const rangeStart = subDays(currentDate, 365);\n const rangeEnd = addDays(currentDate, 365);\n\n events.forEach(event => {\n if (event.recurrence) {\n try {\n const rule = new RRule({\n freq: RRule[event.recurrence.freq],\n interval: event.recurrence.interval || 1,\n dtstart: new Date(event.start),\n until: event.recurrence.until ? new Date(event.recurrence.until) : undefined,\n count: event.recurrence.count,\n });\n\n const dates = rule.between(rangeStart, rangeEnd);\n \n dates.forEach(date => {\n const duration = differenceInMilliseconds(new Date(event.end), new Date(event.start));\n allEvents.push({\n ...event,\n id: `${event.id}-${date.getTime()}`, // Unique ID for each instance\n originalEventId: event.id, // Reference to original\n start: date,\n end: new Date(date.getTime() + duration),\n });\n });\n } catch (e) {\n console.error(\"Error parsing recurrence rule\", e);\n allEvents.push(event); // Fallback to original\n }\n } else {\n allEvents.push(event);\n }\n });\n\n return allEvents;\n }, [events, currentDate]);\n\n const handleViewChange = (newView: ViewType) => {\n if (controlledOnViewChange) {\n controlledOnViewChange(newView);\n } else {\n setInternalView(newView);\n }\n };\n\n const handleDateChange = (newDate: Date) => {\n if (controlledOnDateChange) {\n controlledOnDateChange(newDate);\n } else {\n setInternalDate(newDate);\n }\n };\n\n const handlePrev = () => {\n switch (view) {\n case 'month':\n handleDateChange(subMonths(currentDate, 1));\n break;\n case 'week':\n handleDateChange(subWeeks(currentDate, 1));\n break;\n case 'day':\n case 'resource':\n handleDateChange(subDays(currentDate, 1));\n break;\n case 'agenda':\n handleDateChange(subDays(currentDate, 7));\n break;\n }\n };\n\n const handleNext = () => {\n switch (view) {\n case 'month':\n handleDateChange(addMonths(currentDate, 1));\n break;\n case 'week':\n handleDateChange(addWeeks(currentDate, 1));\n break;\n case 'day':\n case 'resource':\n handleDateChange(addDays(currentDate, 1));\n break;\n case 'agenda':\n handleDateChange(addDays(currentDate, 7));\n break;\n }\n };\n\n const handleToday = () => {\n handleDateChange(new Date());\n };\n\n const handleDateClick = (date: Date) => {\n handleDateChange(date);\n handleViewChange('day');\n };\n\n const handleTimeSlotClick = (date: Date) => {\n if (readOnly) return;\n setSelectedEvent(null);\n setModalInitialDate(date);\n setIsModalOpen(true);\n };\n \n const handleEventClickInternal = (event: CalendarEvent) => {\n if (onEventClick) {\n onEventClick(event);\n }\n \n if (!readOnly) {\n setSelectedEvent(event);\n setModalInitialDate(undefined);\n setIsModalOpen(true);\n }\n };\n\n const handleCreateEvent = () => {\n if (readOnly) return;\n setSelectedEvent(null);\n setModalInitialDate(new Date());\n setIsModalOpen(true);\n };\n\n const handleModalSave = (eventData: Partial<CalendarEvent>) => {\n // If we are editing an instance of a recurring event, we might want to split it\n // For simplicity in this version, we just update the original event if it has an ID,\n // or create a new one.\n \n // Check if it's a recurrence instance (has ID like \"originalId-timestamp\")\n let effectiveEventId = selectedEvent?.id;\n if (selectedEvent?.originalEventId) {\n effectiveEventId = selectedEvent.originalEventId;\n }\n\n if (effectiveEventId) {\n // Update existing\n if (onEventUpdate) {\n onEventUpdate({\n ...eventData,\n id: effectiveEventId\n } as CalendarEvent);\n }\n } else {\n // Create new\n if (onEventCreate) {\n onEventCreate(eventData);\n }\n }\n };\n \n const handleModalDelete = (eventId: string) => {\n // Handle deletion of recurring instances\n let effectiveEventId = eventId;\n if (selectedEvent?.originalEventId && selectedEvent.id === eventId) {\n effectiveEventId = selectedEvent.originalEventId;\n }\n\n if (onEventDelete) {\n onEventDelete(effectiveEventId);\n }\n };\n\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event;\n\n if (!over) return;\n\n const activeEvent = active.data.current?.event as CalendarEvent;\n const overDate = over.data.current?.date as Date;\n\n if (!activeEvent || !overDate) return;\n\n const originalStart = new Date(activeEvent.start);\n const originalEnd = new Date(activeEvent.end);\n const duration = differenceInMilliseconds(originalEnd, originalStart);\n\n let newStart: Date;\n\n if (view === 'month') {\n // For month view, overDate is the day cell\n // We need to preserve the original time but change the date\n if (timezone) {\n // Get the original time in the target timezone\n const zonedOriginal = toZonedTime(originalStart, timezone);\n // Create new date with overDate's date but original's time\n const zonedNew = new Date(overDate);\n zonedNew.setHours(zonedOriginal.getHours());\n zonedNew.setMinutes(zonedOriginal.getMinutes());\n zonedNew.setSeconds(zonedOriginal.getSeconds());\n zonedNew.setMilliseconds(zonedOriginal.getMilliseconds());\n // Convert back from zoned time to UTC\n newStart = fromZonedTime(zonedNew, timezone);\n } else {\n newStart = new Date(overDate);\n newStart.setHours(originalStart.getHours());\n newStart.setMinutes(originalStart.getMinutes());\n newStart.setSeconds(originalStart.getSeconds());\n newStart.setMilliseconds(originalStart.getMilliseconds());\n }\n } else {\n // Week / Day / Resource View Logic\n // overDate represents the time slot in \"display timezone\"\n if (timezone) {\n // overDate is already in the display timezone representation\n // We need to convert it back to UTC for storage\n // The cell date was created as local time representing the target timezone\n newStart = fromZonedTime(overDate, timezone);\n } else {\n // No timezone set - use the date directly\n newStart = new Date(overDate);\n }\n\n newStart.setSeconds(0);\n newStart.setMilliseconds(0);\n }\n\n const newEnd = new Date(newStart.getTime() + duration);\n\n // Resource Handling\n let newResourceId = activeEvent.resourceId;\n const overResourceId = over.data.current?.resourceId;\n if (overResourceId) {\n newResourceId = overResourceId;\n }\n\n // Check if event has actually changed\n if (newStart.getTime() === originalStart.getTime() &&\n newEnd.getTime() === originalEnd.getTime() &&\n newResourceId === activeEvent.resourceId\n ) {\n return;\n }\n\n if (onEventUpdate) {\n onEventUpdate({\n ...activeEvent,\n start: newStart,\n end: newEnd,\n resourceId: newResourceId\n });\n }\n };\n\n return {\n view,\n currentDate,\n isSidebarOpen,\n setIsSidebarOpen,\n isModalOpen,\n setIsModalOpen,\n selectedEvent,\n modalInitialDate,\n expandedEvents,\n handleViewChange,\n handleDateChange,\n handlePrev,\n handleNext,\n handleToday,\n handleDateClick,\n handleTimeSlotClick,\n handleEventClickInternal,\n handleCreateEvent,\n handleModalSave,\n handleModalDelete,\n handleDragEnd\n };\n};\n","import { useRef, useCallback, useEffect } from 'react';\n\ninterface SwipeGestureOptions {\n onSwipeLeft?: () => void;\n onSwipeRight?: () => void;\n onSwipeUp?: () => void;\n onSwipeDown?: () => void;\n threshold?: number; // Minimum distance to trigger swipe\n restraint?: number; // Maximum perpendicular distance\n allowedTime?: number; // Maximum time allowed to complete swipe\n enabled?: boolean;\n}\n\ninterface TouchInfo {\n startX: number;\n startY: number;\n startTime: number;\n}\n\nexport const useSwipeGesture = <T extends HTMLElement>(\n options: SwipeGestureOptions\n) => {\n const {\n onSwipeLeft,\n onSwipeRight,\n onSwipeUp,\n onSwipeDown,\n threshold = 100,\n restraint = 100,\n allowedTime = 500,\n enabled = true,\n } = options;\n\n const touchInfoRef = useRef<TouchInfo | null>(null);\n const elementRef = useRef<T>(null);\n\n const handleTouchStart = useCallback((e: TouchEvent) => {\n if (!enabled) return;\n\n const touch = e.touches[0];\n touchInfoRef.current = {\n startX: touch.clientX,\n startY: touch.clientY,\n startTime: Date.now(),\n };\n }, [enabled]);\n\n const handleTouchEnd = useCallback((e: TouchEvent) => {\n if (!enabled || !touchInfoRef.current) return;\n\n const touch = e.changedTouches[0];\n const { startX, startY, startTime } = touchInfoRef.current;\n\n const distX = touch.clientX - startX;\n const distY = touch.clientY - startY;\n const elapsedTime = Date.now() - startTime;\n\n // Check if swipe was fast enough\n if (elapsedTime <= allowedTime) {\n // Horizontal swipe\n if (Math.abs(distX) >= threshold && Math.abs(distY) <= restraint) {\n if (distX > 0) {\n onSwipeRight?.();\n } else {\n onSwipeLeft?.();\n }\n }\n // Vertical swipe\n else if (Math.abs(distY) >= threshold && Math.abs(distX) <= restraint) {\n if (distY > 0) {\n onSwipeDown?.();\n } else {\n onSwipeUp?.();\n }\n }\n }\n\n touchInfoRef.current = null;\n }, [enabled, threshold, restraint, allowedTime, onSwipeLeft, onSwipeRight, onSwipeUp, onSwipeDown]);\n\n useEffect(() => {\n const element = elementRef.current;\n if (!element) return;\n\n element.addEventListener('touchstart', handleTouchStart, { passive: true });\n element.addEventListener('touchend', handleTouchEnd, { passive: true });\n\n return () => {\n element.removeEventListener('touchstart', handleTouchStart);\n element.removeEventListener('touchend', handleTouchEnd);\n };\n }, [handleTouchStart, handleTouchEnd]);\n\n return elementRef;\n};\n\n// Higher-order component for adding swipe to views\nexport const useViewSwipe = <T extends HTMLElement = HTMLElement>(\n onPrev: () => void,\n onNext: () => void,\n enabled: boolean = true\n) => {\n return useSwipeGesture<T>({\n onSwipeLeft: onNext,\n onSwipeRight: onPrev,\n threshold: 50,\n restraint: 100,\n allowedTime: 300,\n enabled,\n });\n};\n","import React, { useId, useState, useMemo, useRef, useEffect, useCallback } from 'react';\nimport { DndContext, useSensor, useSensors, PointerSensor, Modifier, DragOverlay } from '@dnd-kit/core';\nimport { createSnapModifier, restrictToWindowEdges } from '@dnd-kit/modifiers';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { CalendarHeader } from './components/CalendarHeader';\nimport { Sidebar } from './components/Sidebar';\nimport { MonthView } from './views/MonthView';\nimport { WeekView } from './views/WeekView';\nimport { DayView } from './views/DayView';\nimport { AgendaView } from './views/AgendaView';\nimport { ResourceView } from './views/ResourceView';\nimport { EventModal } from './components/EventModal';\nimport { MonthViewSkeleton, WeekViewSkeleton, DayViewSkeleton, AgendaViewSkeleton } from './components/Skeleton';\nimport { EventContextMenu, useEventContextMenu } from './components/ContextMenu';\nimport { CalendarProps, CalendarEvent } from './types';\nimport { en, fr } from './locales';\nimport { cn } from './utils';\nimport { getThemeStyles } from './lib/theme';\nimport { uses24HourClock } from './lib/date';\nimport { useCalendarLogic } from './hooks/useCalendarLogic';\nimport { differenceInMinutes, format } from 'date-fns';\nimport { useViewSwipe } from './hooks/useSwipeGesture';\n\n// Re-export types for consumers\nexport type {\n ViewType,\n CalendarEvent,\n CalendarProps,\n CalendarTheme,\n CalendarTranslations,\n EventType,\n Resource,\n EventReminder,\n EventAttachment,\n ThemeColors,\n} from './types';\n\n// Re-export utilities\nexport { cn } from './utils';\n\nexport const Scheduler: React.FC<CalendarProps> = ({\n events = [],\n view: controlledView,\n onViewChange: controlledOnViewChange,\n date: controlledDate,\n onDateChange: controlledOnDateChange,\n onEventClick,\n onEventCreate,\n onEventUpdate,\n onEventDelete,\n onEventResize,\n timezone,\n onTimezoneChange,\n className,\n theme,\n renderEventForm,\n readOnly,\n calendars,\n resources,\n eventTypes,\n onCalendarToggle,\n isLoading,\n isDarkMode,\n onThemeToggle,\n translations, // New Prop\n hideViewSwitcher,\n language,\n onLanguageChange,\n locale // Date-fns locale\n}) => {\n const [activeDragEvent, setActiveDragEvent] = useState<CalendarEvent | null>(null);\n\n // Context menu state\n const {\n contextMenuEvent,\n contextMenuPosition,\n openContextMenu,\n closeContextMenu,\n } = useEventContextMenu();\n\n const {\n view,\n currentDate,\n isSidebarOpen,\n setIsSidebarOpen,\n isModalOpen,\n setIsModalOpen,\n selectedEvent,\n modalInitialDate,\n handleViewChange,\n handleDateChange,\n handlePrev,\n handleNext,\n handleToday,\n handleDateClick,\n handleTimeSlotClick,\n handleEventClickInternal,\n handleCreateEvent,\n handleModalSave,\n handleModalDelete,\n handleDragEnd,\n expandedEvents // New export\n } = useCalendarLogic({\n events,\n view: controlledView,\n onViewChange: controlledOnViewChange,\n date: controlledDate,\n onDateChange: controlledOnDateChange,\n onEventClick,\n onEventUpdate,\n onEventCreate,\n onEventDelete,\n readOnly,\n timezone\n });\n\n // DnD Sensors\n const sensors = useSensors(\n useSensor(PointerSensor, {\n activationConstraint: {\n distance: 8,\n },\n })\n );\n\n const gridSize = 15; // 15px snap (15 minutes if 60px/hr)\n const snapToGrid = createSnapModifier(gridSize);\n const modifiers: Modifier[] = [snapToGrid, restrictToWindowEdges];\n\n // Disable DnD if readOnly\n const dndSensors = readOnly ? [] : sensors;\n\n // Handle event resize\n const handleEventResize = (event: CalendarEvent, newEnd: Date) => {\n if (readOnly) return;\n\n // Call the external callback if provided\n if (onEventResize) {\n onEventResize(event, event.start, newEnd);\n }\n\n // Also update via onEventUpdate for internal state management\n if (onEventUpdate) {\n onEventUpdate({\n ...event,\n end: newEnd\n });\n }\n };\n \n const id = useId();\n\n // Mobile swipe gesture support\n const swipeRef = useViewSwipe<HTMLDivElement>(handlePrev, handleNext, true);\n\n // Base translations come from the built-in language packs (making the\n // `language` prop actually apply everywhere); the consumer's `translations`\n // prop overrides individual keys.\n const languagePack = language === 'fr' ? fr : en;\n\n const t = {\n ...languagePack,\n ...translations\n };\n\n // Drag ghost times follow the locale's clock convention.\n const overlayTimeFormat = uses24HourClock(locale) ? 'H:mm' : 'h:mm a';\n\n const handleDragStart = (event: any) => {\n const { active } = event;\n const draggedEvent = expandedEvents.find(e => e.id === active.id);\n if (draggedEvent) {\n setActiveDragEvent(draggedEvent);\n }\n };\n\n const onDragEndWrapper = (event: any) => {\n setActiveDragEvent(null);\n handleDragEnd(event);\n };\n \n // Calculate height for week/day view drag overlay\n const getDragHeight = () => {\n if (!activeDragEvent) return undefined;\n \n if (view === 'resource') {\n return 80; // Approximate height for resource view events\n }\n\n if (view !== 'week' && view !== 'day') return undefined;\n const duration = differenceInMinutes(activeDragEvent.end, activeDragEvent.start);\n // 60px per hour\n const height = (duration / 60) * 60; // 60px height base\n // If DayView uses 80px, we should account for that. \n // Current implementation: WeekView = 60px, DayView = 80px.\n // But DayView uses 80px in DayView.tsx.\n // Let's assume 60px for now as default or pass a prop.\n // Or check view state.\n const hourHeight = view === 'day' ? 80 : 60;\n return (duration / 60) * hourHeight;\n };\n\n const getDragWidth = () => {\n if (view === 'month') return '100%';\n \n if (view === 'resource' && activeDragEvent) {\n const duration = differenceInMinutes(activeDragEvent.end, activeDragEvent.start);\n const width = (duration / 60) * 100; // 100px per hour in ResourceView\n return `${Math.max(width, 4)}px`;\n }\n\n // For Week/Day views, use a fixed width that looks like a column\n // Ideally we would measure the column width, but a fixed reasonable width works for the ghost\n return '150px'; \n };\n\n // Filter events based on active calendars\n const filteredEvents = useMemo(() => {\n if (!calendars) return expandedEvents;\n const activeCalendarIds = calendars.filter(c => c.active !== false).map(c => c.id);\n return expandedEvents.filter(e => {\n // If event has no calendarId, show it by default OR hide it? \n // Usually events belong to a calendar. If undefined, maybe show it.\n if (!e.calendarId) return true; \n return activeCalendarIds.includes(e.calendarId);\n });\n }, [expandedEvents, calendars]);\n\n return (\n <DndContext \n id={id} \n sensors={dndSensors} \n onDragStart={handleDragStart}\n onDragEnd={onDragEndWrapper} \n modifiers={modifiers}\n >\n <div\n className={cn(\"flex flex-col h-full bg-background text-foreground relative\", className)}\n style={getThemeStyles(theme)}\n >\n <CalendarHeader\n currentDate={currentDate}\n onPrev={handlePrev}\n onNext={handleNext}\n onToday={handleToday}\n view={view}\n onViewChange={handleViewChange}\n onMenuClick={() => setIsSidebarOpen(!isSidebarOpen)}\n isDarkMode={isDarkMode}\n onThemeToggle={onThemeToggle}\n translations={t} // Pass translations\n hideViewSwitcher={hideViewSwitcher}\n language={language}\n onLanguageChange={onLanguageChange}\n locale={locale} // Pass locale\n />\n \n <div className=\"flex flex-1 overflow-hidden\">\n <motion.div\n className={cn(\n \"hidden md:block overflow-hidden\",\n )}\n initial={false}\n animate={{\n width: isSidebarOpen ? 256 : 0,\n opacity: isSidebarOpen ? 1 : 0,\n }}\n transition={{\n duration: 0.3,\n ease: [0.4, 0, 0.2, 1],\n }}\n >\n <Sidebar\n currentDate={currentDate}\n onDateChange={handleDateChange}\n onViewChange={handleViewChange}\n onEventCreate={handleCreateEvent}\n timezone={timezone}\n onTimezoneChange={onTimezoneChange}\n className=\"w-full h-full\"\n readOnly={readOnly}\n calendars={calendars}\n onCalendarToggle={onCalendarToggle}\n translations={t}\n locale={locale}\n />\n </motion.div>\n\n <div className=\"flex-1 flex flex-col overflow-hidden relative\">\n {isLoading ? (\n <div className=\"flex-1 overflow-auto p-0 md:p-4\">\n <div className=\"h-full min-w-full\">\n {view === 'month' && <MonthViewSkeleton />}\n {view === 'week' && <WeekViewSkeleton />}\n {view === 'day' && <DayViewSkeleton />}\n {view === 'agenda' && <AgendaViewSkeleton />}\n {view === 'resource' && <WeekViewSkeleton />}\n </div>\n </div>\n ) : (\n <div ref={swipeRef} className=\"flex-1 overflow-auto p-0 md:p-4 touch-pan-y\">\n <div className=\"h-full min-w-full\">\n <AnimatePresence mode=\"wait\" initial={false}>\n <motion.div\n key={`${view}-${currentDate.toISOString()}-${timezone || 'local'}`}\n initial={{ opacity: 0, scale: 0.98, y: 15 }}\n animate={{\n opacity: 1,\n scale: 1,\n y: 0,\n transition: {\n duration: 0.25,\n ease: [0.25, 0.1, 0.25, 1],\n }\n }}\n exit={{\n opacity: 0,\n scale: 0.98,\n y: -10,\n transition: {\n duration: 0.15,\n ease: [0.25, 0.1, 0.25, 1],\n }\n }}\n className=\"h-full\"\n >\n {view === 'month' && (\n <MonthView\n currentDate={currentDate}\n events={filteredEvents}\n onEventClick={handleEventClickInternal}\n onDateClick={handleDateClick}\n timezone={timezone}\n locale={locale}\n />\n )}\n {view === 'week' && (\n <WeekView\n currentDate={currentDate}\n events={filteredEvents}\n onEventClick={handleEventClickInternal}\n onTimeSlotClick={handleTimeSlotClick}\n onEventResize={handleEventResize}\n timezone={timezone}\n locale={locale}\n readonly={readOnly}\n />\n )}\n {view === 'day' && (\n <DayView\n currentDate={currentDate}\n events={filteredEvents}\n onEventClick={handleEventClickInternal}\n onTimeSlotClick={handleTimeSlotClick}\n onEventResize={handleEventResize}\n timezone={timezone}\n locale={locale}\n readonly={readOnly}\n />\n )}\n {view === 'agenda' && (\n <AgendaView\n currentDate={currentDate}\n events={filteredEvents}\n onEventClick={handleEventClickInternal}\n onCreateEvent={handleCreateEvent}\n locale={locale}\n translations={t}\n />\n )}\n {view === 'resource' && resources && (\n <ResourceView\n currentDate={currentDate}\n events={filteredEvents}\n resources={resources}\n onEventClick={handleEventClickInternal}\n onTimeSlotClick={(date, resourceId) => {\n // Handle resource time slot click\n // Ideally useCalendarLogic should support resourceId in handleTimeSlotClick\n // For now, we can manually trigger the modal\n if (readOnly) return;\n // Hack: we might need to update useCalendarLogic to accept resourceId\n handleTimeSlotClick(date); \n }}\n locale={locale}\n />\n )}\n </motion.div>\n </AnimatePresence>\n </div>\n </div>\n )}\n\n {/* Mobile Create Button (FAB) */}\n <div className=\"md:hidden absolute bottom-6 right-6 z-50\">\n <button \n onClick={handleCreateEvent}\n className=\"w-14 h-14 bg-blue-600 rounded-full shadow-lg flex items-center justify-center text-white active:scale-90 transition-transform\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M5 12h14\"/><path d=\"M12 5v14\"/></svg>\n </button>\n </div>\n </div>\n </div>\n \n {renderEventForm ? (\n renderEventForm({\n isOpen: isModalOpen,\n onClose: () => setIsModalOpen(false),\n event: selectedEvent,\n initialDate: modalInitialDate,\n onSave: handleModalSave,\n onDelete: handleModalDelete\n })\n ) : (\n <EventModal\n isOpen={isModalOpen}\n onClose={() => setIsModalOpen(false)}\n event={selectedEvent}\n initialDate={modalInitialDate}\n onSave={handleModalSave}\n onDelete={handleModalDelete}\n calendars={calendars}\n eventTypes={eventTypes}\n translations={t} // Pass translations\n />\n )}\n\n {/* Context Menu */}\n <EventContextMenu\n event={contextMenuEvent}\n position={contextMenuPosition}\n onClose={closeContextMenu}\n onEdit={(event) => {\n handleEventClickInternal(event);\n closeContextMenu();\n }}\n onDelete={(eventId) => {\n onEventDelete?.(eventId);\n closeContextMenu();\n }}\n onDuplicate={(event) => {\n // Create a duplicate with a new ID and slightly shifted time\n const duplicatedEvent: Partial<CalendarEvent> = {\n ...event,\n id: `${event.id}-copy-${Date.now()}`,\n title: `${event.title} (Copy)`,\n start: new Date(event.start.getTime() + 24 * 60 * 60 * 1000), // +1 day\n end: new Date(event.end.getTime() + 24 * 60 * 60 * 1000),\n };\n onEventCreate?.(duplicatedEvent);\n closeContextMenu();\n }}\n translations={{\n edit: t.edit || t.editEvent || 'Edit',\n delete: t.delete || 'Delete',\n duplicate: t.duplicate || 'Duplicate',\n }}\n />\n\n <DragOverlay dropAnimation={null}>\n {activeDragEvent ? (\n <div\n className={cn(\n \"rounded-lg shadow-2xl border-2 overflow-hidden cursor-grabbing transition-transform\",\n \"backdrop-blur-sm\",\n !activeDragEvent.color && \"bg-primary/90 border-primary/60 text-primary-foreground\",\n )}\n style={{\n backgroundColor: activeDragEvent.color ? `${activeDragEvent.color}e0` : undefined,\n borderColor: activeDragEvent.color ? `${activeDragEvent.color}80` : undefined,\n color: activeDragEvent.color ? '#fff' : undefined,\n width: getDragWidth(),\n height: getDragHeight() ? `${getDragHeight()}px` : undefined,\n boxShadow: `0 20px 40px -15px ${activeDragEvent.color || 'var(--primary)'}40, 0 10px 20px -10px rgba(0,0,0,0.2)`,\n transform: 'rotate(-2deg) scale(1.02)',\n }}\n >\n <div className=\"p-2.5 h-full flex flex-col\">\n {/* Event color accent bar */}\n <div\n className=\"absolute left-0 top-0 bottom-0 w-1 rounded-l-lg\"\n style={{ backgroundColor: activeDragEvent.color || 'var(--primary)' }}\n />\n\n {/* Content */}\n <div className=\"pl-2\">\n <div className=\"font-semibold truncate text-sm\">{activeDragEvent.title}</div>\n {(view === 'week' || view === 'day') && getDragHeight() && getDragHeight()! > 40 && (\n <div className=\"text-xs opacity-80 mt-0.5 flex items-center gap-1\">\n <svg className=\"w-3 h-3\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"/>\n <path d=\"M12 6v6l4 2\"/>\n </svg>\n {format(activeDragEvent.start, overlayTimeFormat, { locale })} - {format(activeDragEvent.end, overlayTimeFormat, { locale })}\n </div>\n )}\n </div>\n\n {/* Drag indicator */}\n <div className=\"absolute bottom-1.5 right-1.5 opacity-60\">\n <svg className=\"w-4 h-4\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <circle cx=\"9\" cy=\"5\" r=\"1.5\"/>\n <circle cx=\"15\" cy=\"5\" r=\"1.5\"/>\n <circle cx=\"9\" cy=\"12\" r=\"1.5\"/>\n <circle cx=\"15\" cy=\"12\" r=\"1.5\"/>\n <circle cx=\"9\" cy=\"19\" r=\"1.5\"/>\n <circle cx=\"15\" cy=\"19\" r=\"1.5\"/>\n </svg>\n </div>\n </div>\n </div>\n ) : null}\n </DragOverlay>\n\n </div>\n </DndContext>\n );\n};\n"]}