{"version":3,"sources":["../src/index.ts","../src/tools.ts","../src/event.ts","../src/attendee.ts","../src/alarm.ts","../src/category.ts","../src/types.ts","../src/calendar.ts"],"sourcesContent":["/**\n * ical-generator entrypoint\n */\n\n'use strict';\n\nimport ICalCalendar, {ICalCalendarData} from './calendar.ts';\n\n\n/**\n * Create a new, empty calendar and returns it.\n *\n * ```javascript\n * import ical from 'ical-generator';\n *\n * // or use require:\n * // const { default: ical } = require('ical-generator');\n *\n * const cal = ical();\n * ```\n *\n * You can pass options to setup your calendar or use setters to do this.\n *\n * ```javascript\n * import ical from 'ical-generator';\n *\n * // or use require:\n * // const { default: ical } = require('ical-generator');\n * const cal = ical({domain: 'sebbo.net'});\n *\n * // is the same as\n *\n * const cal = ical().domain('sebbo.net');\n *\n * // is the same as\n *\n * const cal = ical();\n * cal.domain('sebbo.net');\n * ```\n *\n * @param data Calendar data\n */\nfunction ical(data?: ICalCalendarData): ICalCalendar {\n return new ICalCalendar(data);\n}\n\nexport default ical;\n\nexport {\n default as ICalAlarm,\n ICalAlarmData,\n ICalAlarmBaseData,\n ICalAlarmJSONData,\n ICalAlarmRelatesTo,\n ICalAlarmRepeatData,\n ICalAlarmTriggerData,\n ICalAlarmTriggerAfterData,\n ICalAlarmTriggerBeforeData,\n ICalAlarmType,\n ICalAlarmTypeValue,\n ICalAttachment,\n} from './alarm.ts';\n\nexport {\n default as ICalAttendee,\n ICalAttendeeData,\n ICalAttendeeType,\n ICalAttendeeRole,\n ICalAttendeeStatus,\n ICalAttendeeJSONData\n} from './attendee.ts';\n\nexport {\n default as ICalCalendar,\n ICalCalendarData,\n ICalCalendarProdIdData,\n ICalCalendarMethod,\n ICalCalendarJSONData\n} from './calendar.ts';\n\nexport {\n default as ICalCategory,\n ICalCategoryData,\n ICalCategoryJSONData\n} from './category.ts';\n\nexport {\n default as ICalEvent,\n ICalEventStatus,\n ICalEventBusyStatus,\n ICalEventTransparency,\n ICalEventData,\n ICalEventJSONData,\n ICalEventJSONRepeatingData,\n ICalEventClass,\n} from './event.ts';\n\nexport {\n ICalDateTimeValue,\n ICalRepeatingOptions,\n ICalLocation,\n ICalLocationWithTitle,\n ICalLocationWithoutTitle,\n ICalGeo,\n ICalOrganizer,\n ICalDescription,\n ICalEventRepeatingFreq,\n ICalWeekday,\n ICalTimezone,\n ICalMomentStub,\n ICalMomentTimezoneStub,\n ICalMomentDurationStub,\n ICalLuxonDateTimeStub,\n ICalDayJsStub,\n ICalRRuleStub\n} from './types.ts';\n\nexport {\n formatDate,\n formatDateTZ,\n escape,\n foldLines\n} from './tools.ts';\n","'use strict';\n\nimport {\n ICalDateTimeValue,\n ICalDayJsStub,\n ICalLuxonDateTimeStub,\n ICalMomentDurationStub,\n ICalMomentStub,\n ICalMomentTimezoneStub,\n ICalOrganizer, ICalRRuleStub\n} from './types.ts';\n\n/**\n * Converts a valid date/time object supported by this library to a string.\n */\nexport function formatDate (timezone: string | null, d: ICalDateTimeValue, dateonly?: boolean, floating?: boolean): string {\n if(timezone?.startsWith('/')) {\n timezone = timezone.substr(1);\n }\n\n if(typeof d === 'string' || d instanceof Date) {\n const m = new Date(d);\n\n // (!dateonly && !floating) || !timezone => utc\n let s = m.getUTCFullYear() +\n String(m.getUTCMonth() + 1).padStart(2, '0') +\n m.getUTCDate().toString().padStart(2, '0');\n\n // (dateonly || floating) && timezone => tz\n if(timezone) {\n s = m.getFullYear() +\n String(m.getMonth() + 1).padStart(2, '0') +\n m.getDate().toString().padStart(2, '0');\n }\n\n if(dateonly) {\n return s;\n }\n\n if(timezone) {\n s += 'T' + m.getHours().toString().padStart(2, '0') +\n m.getMinutes().toString().padStart(2, '0') +\n m.getSeconds().toString().padStart(2, '0');\n\n return s;\n }\n\n s += 'T' + m.getUTCHours().toString().padStart(2, '0') +\n m.getUTCMinutes().toString().padStart(2, '0') +\n m.getUTCSeconds().toString().padStart(2, '0') +\n (floating ? '' : 'Z');\n\n return s;\n }\n else if(isMoment(d)) {\n // @see https://momentjs.com/timezone/docs/#/using-timezones/parsing-in-zone/\n const m = timezone\n ? (isMomentTZ(d) && !d.tz() ? d.clone().tz(timezone) : d)\n : (floating || (dateonly && isMomentTZ(d) && d.tz()) ? d : d.utc());\n\n return m.format('YYYYMMDD') + (!dateonly ? (\n 'T' + m.format('HHmmss') + (floating || timezone ? '' : 'Z')\n ) : '');\n }\n else if(isLuxonDate(d)) {\n const m = timezone\n ? d.setZone(timezone)\n : (floating || (dateonly && d.zone.type !== 'system') ? d : d.setZone('utc'));\n\n return m.toFormat('yyyyLLdd') + (!dateonly ? (\n 'T' + m.toFormat('HHmmss') + (floating || timezone ? '' : 'Z')\n ) : '');\n }\n else {\n // @see https://day.js.org/docs/en/plugin/utc\n\n let m = d;\n if(timezone) {\n m = typeof d.tz === 'function' ? d.tz(timezone) : d;\n }\n else if(floating) {\n // m = d;\n }\n\n else if (typeof d.utc === 'function') {\n m = d.utc();\n }\n else {\n throw new Error('Unable to convert dayjs object to UTC value: UTC plugin is not available!');\n }\n\n return m.format('YYYYMMDD') + (!dateonly ? (\n 'T' + m.format('HHmmss') + (floating || timezone ? '' : 'Z')\n ) : '');\n }\n}\n\n/**\n * Converts a valid date/time object supported by this library to a string.\n * For information about this format, see RFC 5545, section 3.3.5\n * https://tools.ietf.org/html/rfc5545#section-3.3.5\n */\nexport function formatDateTZ (timezone: string | null, property: string, date: ICalDateTimeValue | Date | string, eventData?: {floating?: boolean | null, timezone?: string | null}): string {\n let tzParam = '';\n let floating = eventData?.floating || false;\n\n if (eventData?.timezone) {\n tzParam = ';TZID=' + eventData.timezone;\n\n // This isn't a 'floating' event because it has a timezone;\n // but we use it to omit the 'Z' UTC specifier in formatDate()\n floating = true;\n }\n\n return property + tzParam + ':' + formatDate(timezone, date, false, floating);\n}\n\n/**\n * Escapes special characters in the given string\n */\nexport function escape (str: string | unknown, inQuotes: boolean): string {\n return String(str).replace(inQuotes ? /[\\\\\"]/g : /[\\\\;,]/g, function (match) {\n return '\\\\' + match;\n }).replace(/(?:\\r\\n|\\r|\\n)/g, '\\\\n');\n}\n\n/**\n * Trim line length of given string\n */\nexport function foldLines (input: string): string {\n return input.split('\\r\\n').map(function (line) {\n let result = '';\n let c = 0;\n for (let i = 0; i < line.length; i++) {\n let ch = line.charAt(i);\n\n // surrogate pair, see https://mathiasbynens.be/notes/javascript-encoding#surrogate-pairs\n if (ch >= '\\ud800' && ch <= '\\udbff') {\n ch += line.charAt(++i);\n }\n\n // TextEncoder is available in browsers and node.js >= 11.0.0\n const charsize = new TextEncoder().encode(ch).length;\n c += charsize;\n if (c > 74) {\n result += '\\r\\n ';\n c = charsize;\n }\n\n result += ch;\n }\n return result;\n }).join('\\r\\n');\n}\n\nexport function addOrGetCustomAttributes (data: {x: [string, string][]}, keyOrArray: ({key: string, value: string})[] | [string, string][] | Record): void;\nexport function addOrGetCustomAttributes (data: {x: [string, string][]}, keyOrArray: string, value: string): void;\nexport function addOrGetCustomAttributes (data: {x: [string, string][]}): ({key: string, value: string})[];\nexport function addOrGetCustomAttributes (data: {x: [string, string][]}, keyOrArray?: ({key: string, value: string})[] | [string, string][] | Record | string | undefined, value?: string | undefined): void | ({key: string, value: string})[] {\n if (Array.isArray(keyOrArray)) {\n data.x = keyOrArray.map((o: {key: string, value: string} | [string, string]) => {\n if(Array.isArray(o)) {\n return o;\n }\n if (typeof o.key !== 'string' || typeof o.value !== 'string') {\n throw new Error('Either key or value is not a string!');\n }\n if (o.key.substr(0, 2) !== 'X-') {\n throw new Error('Key has to start with `X-`!');\n }\n\n return [o.key, o.value] as [string, string];\n });\n }\n else if (typeof keyOrArray === 'object') {\n data.x = Object.entries(keyOrArray).map(([key, value]) => {\n if (typeof key !== 'string' || typeof value !== 'string') {\n throw new Error('Either key or value is not a string!');\n }\n if (key.substr(0, 2) !== 'X-') {\n throw new Error('Key has to start with `X-`!');\n }\n\n return [key, value];\n });\n }\n else if (typeof keyOrArray === 'string' && typeof value === 'string') {\n if (keyOrArray.substr(0, 2) !== 'X-') {\n throw new Error('Key has to start with `X-`!');\n }\n\n data.x.push([keyOrArray, value]);\n }\n else {\n return data.x.map(a => ({\n key: a[0],\n value: a[1]\n }));\n }\n}\n\nexport function generateCustomAttributes (data: {x: [string, string][]}): string {\n const str = data.x\n .map(([key, value]) => key.toUpperCase() + ':' + escape(value, false))\n .join('\\r\\n');\n return str.length ? str + '\\r\\n' : '';\n}\n\n/**\n * Check the given string or ICalOrganizer. Parses\n * the string for name and email address if possible.\n *\n * @param attribute Attribute name for error messages\n * @param value Value to parse name/email from\n */\nexport function checkNameAndMail (attribute: string, value: string | ICalOrganizer): ICalOrganizer {\n let result: ICalOrganizer | null = null;\n\n if (typeof value === 'string') {\n const match = value.match(/^(.+) ?<([^>]+)>$/);\n if (match) {\n result = {\n name: match[1].trim(),\n email: match[2].trim()\n };\n }\n else if(value.includes('@')) {\n result = {\n name: value.trim(),\n email: value.trim()\n };\n }\n }\n else if (typeof value === 'object') {\n result = {\n name: value.name,\n email: value.email,\n mailto: value.mailto,\n sentBy: value.sentBy\n };\n }\n\n if (!result && typeof value === 'string') {\n throw new Error(\n '`' + attribute + '` isn\\'t formated correctly. See https://sebbo2002.github.io/ical-generator/develop/'+\n 'reference/interfaces/ICalOrganizer.html'\n );\n }\n else if (!result) {\n throw new Error(\n '`' + attribute + '` needs to be a valid formed string or an object. See https://sebbo2002.github.io/'+\n 'ical-generator/develop/reference/interfaces/ICalOrganizer.html'\n );\n }\n\n if (!result.name) {\n throw new Error('`' + attribute + '.name` is empty!');\n }\n\n return result;\n}\n\n/**\n * Checks if the given string `value` is a\n * valid one for the type `type`\n */\nexport function checkEnum(type: Record, value: unknown): unknown {\n const allowedValues = Object.values(type);\n const valueStr = String(value).toUpperCase();\n\n if (!valueStr || !allowedValues.includes(valueStr)) {\n throw new Error(`Input must be one of the following: ${allowedValues.join(', ')}`);\n }\n\n return valueStr;\n}\n\n/**\n * Checks if the given input is a valid date and\n * returns the internal representation (= moment object)\n */\nexport function checkDate(value: ICalDateTimeValue, attribute: string): ICalDateTimeValue {\n\n // Date & String\n if(\n (value instanceof Date && isNaN(value.getTime())) ||\n (typeof value === 'string' && isNaN(new Date(value).getTime()))\n ) {\n throw new Error(`\\`${attribute}\\` has to be a valid date!`);\n }\n if(value instanceof Date || typeof value === 'string') {\n return value;\n }\n\n // Luxon\n if(isLuxonDate(value) && value.isValid === true) {\n return value;\n }\n\n // Moment / Moment Timezone\n if((isMoment(value) || isDayjs(value)) && value.isValid()) {\n return value;\n }\n\n throw new Error(`\\`${attribute}\\` has to be a valid date!`);\n}\n\nexport function toDate(value: ICalDateTimeValue): Date {\n if(typeof value === 'string' || value instanceof Date) {\n return new Date(value);\n }\n\n if(isLuxonDate(value)) {\n return value.toJSDate();\n }\n\n return value.toDate();\n}\n\nexport function isMoment(value: ICalDateTimeValue): value is ICalMomentStub {\n\n // @ts-expect-error _isAMomentObject is a private property\n return value != null && value._isAMomentObject != null;\n}\nexport function isMomentTZ(value: ICalDateTimeValue): value is ICalMomentTimezoneStub {\n return isMoment(value) && 'tz' in value && typeof value.tz === 'function';\n}\nexport function isDayjs(value: ICalDateTimeValue): value is ICalDayJsStub {\n return typeof value === 'object' &&\n value !== null &&\n !(value instanceof Date) &&\n !isMoment(value) &&\n !isLuxonDate(value);\n}\nexport function isLuxonDate(value: ICalDateTimeValue): value is ICalLuxonDateTimeStub {\n return typeof value === 'object' && value !== null && 'toJSDate' in value && typeof value.toJSDate === 'function';\n}\n\nexport function isMomentDuration(value: unknown): value is ICalMomentDurationStub {\n return value !== null && typeof value === 'object' && 'asSeconds' in value && typeof value.asSeconds === 'function';\n}\n\nexport function isRRule(value: unknown): value is ICalRRuleStub {\n return value !== null && typeof value === 'object' && 'between' in value && typeof value.between === 'function' && typeof value.toString === 'function';\n}\n\nexport function toJSON(value: ICalDateTimeValue | null | undefined): string | null | undefined {\n if(!value) {\n return null;\n }\n if(typeof value === 'string') {\n return value;\n }\n\n return value.toJSON();\n}\n\nexport function toDurationString(seconds: number): string {\n let string = '';\n\n // < 0\n if(seconds < 0) {\n string = '-';\n seconds *= -1;\n }\n\n string += 'P';\n\n // DAYS\n if(seconds >= 86400) {\n string += Math.floor(seconds / 86400) + 'D';\n seconds %= 86400;\n }\n if(!seconds && string.length > 1) {\n return string;\n }\n\n string += 'T';\n\n // HOURS\n if(seconds >= 3600) {\n string += Math.floor(seconds / 3600) + 'H';\n seconds %= 3600;\n }\n\n // MINUTES\n if(seconds >= 60) {\n string += Math.floor(seconds / 60) + 'M';\n seconds %= 60;\n }\n\n // SECONDS\n if(seconds > 0) {\n string += seconds + 'S';\n }\n else if(string.length <= 2) {\n string += '0S';\n }\n\n return string;\n}\n","'use strict';\n\nimport uuid from 'uuid-random';\nimport {\n addOrGetCustomAttributes,\n checkDate,\n checkEnum,\n checkNameAndMail,\n escape,\n formatDate,\n formatDateTZ,\n generateCustomAttributes,\n isRRule,\n toDate,\n toJSON\n} from './tools.ts';\nimport ICalAttendee, {ICalAttendeeData} from './attendee.ts';\nimport ICalAlarm, {ICalAlarmData} from './alarm.ts';\nimport ICalCategory, {ICalCategoryData} from './category.ts';\nimport ICalCalendar from './calendar.ts';\nimport {\n ICalDateTimeValue,\n ICalDescription,\n ICalEventRepeatingFreq,\n ICalLocation,\n ICalOrganizer,\n ICalRepeatingOptions,\n ICalRRuleStub,\n ICalWeekday\n} from './types.ts';\n\n\nexport enum ICalEventStatus {\n CONFIRMED = 'CONFIRMED',\n TENTATIVE = 'TENTATIVE',\n CANCELLED = 'CANCELLED'\n}\n\nexport enum ICalEventBusyStatus {\n FREE = 'FREE',\n TENTATIVE = 'TENTATIVE',\n BUSY = 'BUSY',\n OOF = 'OOF'\n}\n\nexport enum ICalEventTransparency {\n TRANSPARENT = 'TRANSPARENT',\n OPAQUE = 'OPAQUE'\n}\n\nexport enum ICalEventClass {\n PUBLIC = 'PUBLIC',\n PRIVATE = 'PRIVATE',\n CONFIDENTIAL = 'CONFIDENTIAL'\n}\n\nexport interface ICalEventData {\n id?: string | number | null,\n sequence?: number,\n start: ICalDateTimeValue,\n end?: ICalDateTimeValue | null,\n recurrenceId?: ICalDateTimeValue | null,\n timezone?: string | null,\n stamp?: ICalDateTimeValue,\n allDay?: boolean,\n floating?: boolean,\n repeating?: ICalRepeatingOptions | ICalRRuleStub | string | null,\n summary?: string,\n location?: ICalLocation | string | null,\n description?: ICalDescription | string | null,\n organizer?: ICalOrganizer | string | null,\n attendees?: ICalAttendee[] | ICalAttendeeData[],\n alarms?: ICalAlarm[] | ICalAlarmData[],\n categories?: ICalCategory[] | ICalCategoryData[],\n status?: ICalEventStatus | null,\n busystatus?: ICalEventBusyStatus | null,\n priority?: number | null,\n url?: string | null,\n attachments?: string[],\n transparency?: ICalEventTransparency | null,\n created?: ICalDateTimeValue | null,\n lastModified?: ICalDateTimeValue | null,\n class?: ICalEventClass | null;\n x?: {key: string, value: string}[] | [string, string][] | Record;\n}\n\ninterface ICalEventInternalData {\n id: string,\n sequence: number,\n start: ICalDateTimeValue,\n end: ICalDateTimeValue | null,\n recurrenceId: ICalDateTimeValue | null,\n timezone: string | null,\n stamp: ICalDateTimeValue,\n allDay: boolean,\n floating: boolean,\n repeating: ICalEventJSONRepeatingData | ICalRRuleStub | string | null,\n summary: string,\n location: ICalLocation | null,\n description: ICalDescription | null,\n organizer: ICalOrganizer | null,\n attendees: ICalAttendee[],\n alarms: ICalAlarm[],\n categories: ICalCategory[],\n status: ICalEventStatus | null,\n busystatus: ICalEventBusyStatus | null,\n priority: number | null,\n url: string | null,\n attachments: string[],\n transparency: ICalEventTransparency | null,\n created: ICalDateTimeValue | null,\n lastModified: ICalDateTimeValue | null,\n class: ICalEventClass | null,\n x: [string, string][];\n}\n\nexport interface ICalEventJSONData {\n id: string,\n sequence: number,\n start: string,\n end: string | null,\n recurrenceId: string | null,\n timezone: string | null,\n stamp: string,\n allDay: boolean,\n floating: boolean,\n repeating: ICalEventJSONRepeatingData | string | null,\n summary: string,\n location: ICalLocation | null,\n description: ICalDescription | null,\n organizer: ICalOrganizer | null,\n attendees: ICalAttendee[],\n alarms: ICalAlarm[],\n categories: ICalCategory[],\n status: ICalEventStatus | null,\n busystatus: ICalEventBusyStatus | null,\n priority?: number | null,\n url: string | null,\n attachments: string[],\n transparency: ICalEventTransparency | null,\n created: string | null,\n lastModified: string | null,\n x: {key: string, value: string}[];\n}\n\nexport interface ICalEventJSONRepeatingData {\n freq: ICalEventRepeatingFreq;\n count?: number;\n interval?: number;\n until?: ICalDateTimeValue;\n byDay?: ICalWeekday[];\n byMonth?: number[];\n byMonthDay?: number[];\n bySetPos?: number[];\n exclude?: ICalDateTimeValue[];\n startOfWeek?: ICalWeekday;\n}\n\n\n/**\n * Usually you get an {@link ICalEvent} object like this:\n * ```javascript\n * import ical from 'ical-generator';\n * const calendar = ical();\n * const event = calendar.createEvent();\n * ```\n */\nexport default class ICalEvent {\n private readonly data: ICalEventInternalData;\n private readonly calendar: ICalCalendar;\n\n /**\n * Constructor of [[`ICalEvent`]. The calendar reference is\n * required to query the calendar's timezone when required.\n *\n * @param data Calendar Event Data\n * @param calendar Reference to ICalCalendar object\n */\n constructor(data: ICalEventData, calendar: ICalCalendar) {\n this.data = {\n id: uuid(),\n sequence: 0,\n start: new Date(),\n end: null,\n recurrenceId: null,\n timezone: null,\n stamp: new Date(),\n allDay: false,\n floating: false,\n repeating: null,\n summary: '',\n location: null,\n description: null,\n organizer: null,\n attendees: [],\n alarms: [],\n categories: [],\n status: null,\n busystatus: null,\n priority: null,\n url: null,\n attachments: [],\n transparency: null,\n created: null,\n lastModified: null,\n class: null,\n x: []\n };\n\n this.calendar = calendar;\n if (!calendar) {\n throw new Error('`calendar` option required!');\n }\n\n if (data.id) this.id(data.id);\n if (data.sequence !== undefined) this.sequence(data.sequence);\n if (data.start) this.start(data.start);\n if (data.end !== undefined) this.end(data.end);\n if (data.recurrenceId !== undefined) this.recurrenceId(data.recurrenceId);\n if (data.timezone !== undefined) this.timezone(data.timezone);\n if (data.stamp !== undefined) this.stamp(data.stamp);\n if (data.allDay !== undefined) this.allDay(data.allDay);\n if (data.floating !== undefined) this.floating(data.floating);\n if (data.repeating !== undefined) this.repeating(data.repeating);\n if (data.summary !== undefined) this.summary(data.summary);\n if (data.location !== undefined) this.location(data.location);\n if (data.description !== undefined) this.description(data.description);\n if (data.organizer !== undefined) this.organizer(data.organizer);\n if (data.attendees !== undefined) this.attendees(data.attendees);\n if (data.alarms !== undefined) this.alarms(data.alarms);\n if (data.categories !== undefined) this.categories(data.categories);\n if (data.status !== undefined) this.status(data.status);\n if (data.busystatus !== undefined) this.busystatus(data.busystatus);\n if (data.priority !== undefined) this.priority(data.priority);\n if (data.url !== undefined) this.url(data.url);\n if (data.attachments !== undefined) this.attachments(data.attachments);\n if (data.transparency !== undefined) this.transparency(data.transparency);\n if (data.created !== undefined) this.created(data.created);\n if (data.lastModified !== undefined) this.lastModified(data.lastModified);\n if (data.class !== undefined) this.class(data.class);\n if (data.x !== undefined) this.x(data.x);\n }\n\n /**\n * Get the event's ID\n * @since 0.2.0\n */\n id(): string;\n\n /**\n * Use this method to set the event's ID.\n * If not set, a UUID will be generated randomly.\n *\n * @param id Event ID you want to set\n */\n id(id: string | number): this;\n id(id?: string | number): this | string {\n if (id === undefined) {\n return this.data.id;\n }\n\n this.data.id = String(id);\n return this;\n }\n\n /**\n * Get the event's ID\n * @since 0.2.0\n * @alias id\n */\n uid(): string;\n\n /**\n * Use this method to set the event's ID.\n * If not set, a UUID will be generated randomly.\n *\n * @param id Event ID you want to set\n * @alias id\n */\n uid(id: string | number): this;\n uid(id?: string | number): this | string {\n return id === undefined ? this.id() : this.id(id);\n }\n\n /**\n * Get the event's SEQUENCE number. Use this method to get the event's\n * revision sequence number of the calendar component within a sequence of revisions.\n *\n * @since 0.2.6\n */\n sequence(): number;\n\n /**\n * Set the event's SEQUENCE number. For a new event, this should be zero.\n * Each time the organizer makes a significant revision, the sequence\n * number should be incremented.\n *\n * @param sequence Sequence number or null to unset it\n */\n sequence(sequence: number): this;\n sequence(sequence?: number): this | number {\n if (sequence === undefined) {\n return this.data.sequence;\n }\n\n const s = parseInt(String(sequence), 10);\n if (isNaN(s)) {\n throw new Error('`sequence` must be a number!');\n }\n\n this.data.sequence = sequence;\n return this;\n }\n\n /**\n * Get the event start time which is currently\n * set. Can be any supported date object.\n *\n * @since 0.2.0\n */\n start(): ICalDateTimeValue;\n\n /**\n * Set the appointment date of beginning, which is required for all events.\n * You can use any supported date object, see\n * [Readme](https://github.com/sebbo2002/ical-generator#-date-time--timezones)\n * for details about supported values and timezone handling.\n *\n * ```typescript\n * import ical from 'ical-generator';\n *\n * const cal = ical();\n *\n * const event = cal.createEvent({\n * start: new Date('2020-01-01')\n * });\n *\n * // overwrites old start date\n * event.start(new Date('2024-02-01'));\n *\n * cal.toString();\n * ```\n *\n * ```text\n * BEGIN:VCALENDAR\n * VERSION:2.0\n * PRODID:-//sebbo.net//ical-generator//EN\n * BEGIN:VEVENT\n * UID:7e2aee64-b07a-4256-9b3e-e9eaa452bac8\n * SEQUENCE:0\n * DTSTAMP:20240212T190915Z\n * DTSTART:20240201T000000Z\n * SUMMARY:\n * END:VEVENT\n * END:VCALENDAR\n * ```\n *\n * @since 0.2.0\n */\n start(start: ICalDateTimeValue): this;\n start(start?: ICalDateTimeValue): this | ICalDateTimeValue {\n if (start === undefined) {\n this.swapStartAndEndIfRequired();\n return this.data.start;\n }\n\n this.data.start = checkDate(start, 'start');\n return this;\n }\n\n /**\n * Get the event end time which is currently\n * set. Can be any supported date object.\n *\n * @since 0.2.0\n */\n end(): ICalDateTimeValue | null;\n\n /**\n * Set the appointment date of end. You can use any supported date object, see\n * [readme](https://github.com/sebbo2002/ical-generator#-date-time--timezones)\n * for details about supported values and timezone handling.\n *\n * @since 0.2.0\n */\n end(end: ICalDateTimeValue | null): this;\n end(end?: ICalDateTimeValue | null): this | ICalDateTimeValue | null {\n if (end === undefined) {\n this.swapStartAndEndIfRequired();\n return this.data.end;\n }\n if (end === null) {\n this.data.end = null;\n return this;\n }\n\n this.data.end = checkDate(end, 'end');\n return this;\n }\n\n /**\n * Checks if the start date is after the end date and swaps them if necessary.\n * @private\n */\n private swapStartAndEndIfRequired(): void {\n if (this.data.start && this.data.end && toDate(this.data.start).getTime() > toDate(this.data.end).getTime()) {\n const t = this.data.start;\n this.data.start = this.data.end;\n this.data.end = t;\n }\n }\n\n /**\n * Get the event's recurrence id\n * @since 0.2.0\n */\n recurrenceId(): ICalDateTimeValue | null;\n\n /**\n * Set the event's recurrence id. You can use any supported date object, see\n * [readme](https://github.com/sebbo2002/ical-generator#-date-time--timezones)\n * for details about supported values and timezone handling.\n *\n * @since 0.2.0\n */\n recurrenceId(recurrenceId: ICalDateTimeValue | null): this;\n recurrenceId(recurrenceId?: ICalDateTimeValue | null): this | ICalDateTimeValue | null {\n if (recurrenceId === undefined) {\n return this.data.recurrenceId;\n }\n if (recurrenceId === null) {\n this.data.recurrenceId = null;\n return this;\n }\n\n this.data.recurrenceId = checkDate(recurrenceId, 'recurrenceId');\n return this;\n }\n\n /**\n * Get the event's timezone.\n * @since 0.2.6\n */\n timezone(): string | null;\n\n /**\n * Sets the time zone to be used for this event. If a time zone has been\n * defined in both the event and the calendar, the time zone of the event\n * is used.\n *\n * Please note that if the time zone is set, ical-generator assumes\n * that all times are already in the correct time zone. Alternatively,\n * a `moment-timezone` or a Luxon object can be passed with `setZone`,\n * ical-generator will then set the time zone itself.\n *\n * This and the 'floating' flag (see below) are mutually exclusive, and setting a timezone will unset the\n * 'floating' flag. If neither 'timezone' nor 'floating' are set, the date will be output with in UTC format\n * (see [date-time form #2 in section 3.3.5 of RFC 554](https://tools.ietf.org/html/rfc5545#section-3.3.5)).\n *\n * See [Readme](https://github.com/sebbo2002/ical-generator#-date-time--timezones) for details about\n * supported values and timezone handling.\n *\n * ```javascript\n * event.timezone('America/New_York');\n * ```\n *\n * @see https://github.com/sebbo2002/ical-generator#-date-time--timezones\n * @since 0.2.6\n */\n timezone(timezone: string | null): this;\n timezone(timezone?: string | null): this | string | null {\n if (timezone === undefined && this.data.timezone !== null) {\n return this.data.timezone;\n }\n if (timezone === undefined) {\n return this.calendar.timezone();\n }\n\n this.data.timezone = timezone && timezone !== 'UTC' ? timezone.toString() : null;\n if (this.data.timezone) {\n this.data.floating = false;\n }\n\n return this;\n }\n\n /**\n * Get the event's timestamp\n * @since 0.2.0\n */\n stamp(): ICalDateTimeValue;\n\n /**\n * Set the appointment date of creation. Defaults to the current time and date (`new Date()`). You can use\n * any supported date object, see [readme](https://github.com/sebbo2002/ical-generator#-date-time--timezones)\n * for details about supported values and timezone handling.\n *\n * @since 0.2.0\n */\n stamp(stamp: ICalDateTimeValue): this;\n stamp(stamp?: ICalDateTimeValue): this | ICalDateTimeValue {\n if (stamp === undefined) {\n return this.data.stamp;\n }\n\n this.data.stamp = checkDate(stamp, 'stamp');\n return this;\n }\n\n /**\n * Get the event's timestamp\n * @since 0.2.0\n * @alias stamp\n */\n timestamp(): ICalDateTimeValue;\n\n /**\n * Set the appointment date of creation. Defaults to the current time and date (`new Date()`). You can use\n * any supported date object, see [readme](https://github.com/sebbo2002/ical-generator#-date-time--timezones)\n * for details about supported values and timezone handling.\n *\n * @since 0.2.0\n * @alias stamp\n */\n timestamp(stamp: ICalDateTimeValue): this;\n timestamp(stamp?: ICalDateTimeValue): this | ICalDateTimeValue {\n if (stamp === undefined) {\n return this.stamp();\n }\n\n return this.stamp(stamp);\n }\n\n /**\n * Get the event's allDay flag\n * @since 0.2.0\n */\n allDay(): boolean;\n\n /**\n * Set the event's allDay flag.\n *\n * ```javascript\n * event.allDay(true); // → appointment is for the whole day\n * ```\n *\n * ```typescript\n * import ical from 'ical-generator';\n *\n * const cal = ical();\n *\n * cal.createEvent({\n * start: new Date('2020-01-01'),\n * summary: 'Very Important Day',\n * allDay: true\n * });\n *\n * cal.toString();\n * ```\n *\n * ```text\n * BEGIN:VCALENDAR\n * VERSION:2.0\n * PRODID:-//sebbo.net//ical-generator//EN\n * BEGIN:VEVENT\n * UID:1964fe8d-32c5-4f2a-bd62-7d9d7de5992b\n * SEQUENCE:0\n * DTSTAMP:20240212T191956Z\n * DTSTART;VALUE=DATE:20200101\n * X-MICROSOFT-CDO-ALLDAYEVENT:TRUE\n * X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE\n * SUMMARY:Very Important Day\n * END:VEVENT\n * END:VCALENDAR\n * ```\n *\n * @since 0.2.0\n */\n allDay(allDay: boolean): this;\n allDay(allDay?: boolean): this | boolean {\n if (allDay === undefined) {\n return this.data.allDay;\n }\n\n this.data.allDay = Boolean(allDay);\n return this;\n }\n\n /**\n * Get the event's floating flag.\n * @since 0.2.0\n */\n floating(): boolean;\n floating(floating: boolean): this;\n\n /**\n * Set the event's floating flag. This unsets the event's timezone.\n * Events whose floating flag is set to true always take place at the\n * same time, regardless of the time zone.\n *\n * ```typescript\n * import ical from 'ical-generator';\n *\n * const cal = ical();\n *\n * cal.createEvent({\n * start: new Date('2020-01-01T20:00:00Z'),\n * summary: 'Always at 20:00 in every checkEnum(ICalWeekday, day) as ICalWeekday);\n }\n\n if (repeating.byMonth) {\n const byMonthArray = Array.isArray(repeating.byMonth) ? repeating.byMonth : [repeating.byMonth];\n this.data.repeating.byMonth = byMonthArray.map(month => {\n if (typeof month !== 'number' || month < 1 || month > 12) {\n throw new Error('`repeating.byMonth` contains invalid value `' + month + '`!');\n }\n\n return month;\n });\n }\n\n if (repeating.byMonthDay) {\n const byMonthDayArray = Array.isArray(repeating.byMonthDay) ? repeating.byMonthDay : [repeating.byMonthDay];\n\n\n this.data.repeating.byMonthDay = byMonthDayArray.map(monthDay => {\n if (typeof monthDay !== 'number' || monthDay < -31 || monthDay > 31 || monthDay === 0) {\n throw new Error('`repeating.byMonthDay` contains invalid value `' + monthDay + '`!');\n }\n\n return monthDay;\n });\n }\n\n if (repeating.bySetPos) {\n if (!this.data.repeating.byDay) {\n throw '`repeating.bySetPos` must be used along with `repeating.byDay`!';\n }\n const bySetPosArray = Array.isArray(repeating.bySetPos) ? repeating.bySetPos : [repeating.bySetPos];\n this.data.repeating.bySetPos = bySetPosArray.map(bySetPos => {\n if (typeof bySetPos !== 'number' || bySetPos < -366 || bySetPos > 366 || bySetPos === 0) {\n throw '`repeating.bySetPos` contains invalid value `' + bySetPos + '`!';\n }\n return bySetPos;\n });\n }\n\n if (repeating.exclude) {\n const excludeArray = Array.isArray(repeating.exclude) ? repeating.exclude : [repeating.exclude];\n this.data.repeating.exclude = excludeArray.map((exclude, i) => {\n return checkDate(exclude, `repeating.exclude[${i}]`);\n });\n }\n\n if (repeating.startOfWeek) {\n this.data.repeating.startOfWeek = checkEnum(ICalWeekday, repeating.startOfWeek) as ICalWeekday;\n }\n\n return this;\n }\n\n /**\n * Get the event's summary\n * @since 0.2.0\n */\n summary(): string;\n\n /**\n * Set the event's summary.\n * Defaults to an empty string if nothing is set.\n *\n * @since 0.2.0\n */\n summary(summary: string): this;\n summary(summary?: string): this | string {\n if (summary === undefined) {\n return this.data.summary;\n }\n\n this.data.summary = summary ? String(summary) : '';\n return this;\n }\n\n\n /**\n * Get the event's location\n * @since 0.2.0\n */\n location(): ICalLocation | null;\n\n /**\n * Set the event's location by passing a string (minimum) or\n * an {@link ICalLocationWithTitle} object which will also fill the iCal\n * `GEO` attribute and Apple's `X-APPLE-STRUCTURED-LOCATION`.\n *\n * ```javascript\n * event.location({\n * title: 'Apple Store Kurfürstendamm',\n * address: 'Kurfürstendamm 26, 10719 Berlin, Deutschland',\n * radius: 141.1751386318387,\n * geo: {\n * lat: 52.503630,\n * lon: 13.328650\n * }\n * });\n * ```\n *\n * ```text\n * LOCATION:Apple Store Kurfürstendamm\\nKurfürstendamm 26\\, 10719 Berlin\\,\n * Deutschland\n * X-APPLE-STRUCTURED-LOCATION;VALUE=URI;X-ADDRESS=Kurfürstendamm 26\\, 10719\n * Berlin\\, Deutschland;X-APPLE-RADIUS=141.1751386318387;X-TITLE=Apple Store\n * Kurfürstendamm:geo:52.50363,13.32865\n * GEO:52.50363;13.32865\n * ```\n *\n * Since v6.1.0 you can also pass a {@link ICalLocationWithoutTitle} object to pass\n * the geolocation only. This will only fill the iCal `GEO` attribute.\n *\n * ```javascript\n * event.location({\n * geo: {\n * lat: 52.503630,\n * lon: 13.328650\n * }\n * });\n * ```\n *\n * ```text\n * GEO:52.50363;13.32865\n * ```\n *\n * @since 0.2.0\n */\n location(location: ICalLocation | string | null): this;\n location(location?: ICalLocation | string | null): this | ICalLocation | null {\n if (location === undefined) {\n return this.data.location;\n }\n if (typeof location === 'string') {\n this.data.location = {\n title: location\n };\n return this;\n }\n if (location && (\n ('title' in location && !location.title) ||\n (location?.geo && (!isFinite(location.geo.lat) || !isFinite(location.geo.lon))) ||\n (!('title' in location) && !location?.geo)\n )) {\n throw new Error(\n '`location` isn\\'t formatted correctly. See https://sebbo2002.github.io/ical-generator/'+\n 'develop/reference/classes/ICalEvent.html#location'\n );\n }\n\n this.data.location = location || null;\n return this;\n }\n\n\n /**\n * Get the event's description as an {@link ICalDescription} object.\n * @since 0.2.0\n */\n description(): ICalDescription | null;\n\n /**\n * Set the events description by passing a plaintext string or\n * an object containing both a plaintext and a html description.\n * Only a few calendar apps support html descriptions and like in\n * emails, supported HTML tags and styling is limited.\n *\n * ```javascript\n * event.description({\n * plain: 'Hello World!',\n * html: '

Hello World!

'\n * });\n * ```\n *\n * ```text\n * DESCRIPTION:Hello World!\n * X-ALT-DESC;FMTTYPE=text/html:

Hello World!

\n * ```\n *\n * @since 0.2.0\n */\n description(description: ICalDescription | string | null): this;\n description(description?: ICalDescription | string | null): this | ICalDescription | null {\n if (description === undefined) {\n return this.data.description;\n }\n if (description === null) {\n this.data.description = null;\n return this;\n }\n\n if (typeof description === 'string') {\n this.data.description = {plain: description};\n }\n else {\n this.data.description = description;\n }\n return this;\n }\n\n\n /**\n * Get the event's organizer\n * @since 0.2.0\n */\n organizer(): ICalOrganizer | null;\n\n /**\n * Set the event's organizer\n *\n * ```javascript\n * event.organizer({\n * name: 'Organizer\\'s Name',\n * email: 'organizer@example.com'\n * });\n *\n * // OR\n *\n * event.organizer('Organizer\\'s Name ');\n * ```\n *\n * You can also add an explicit `mailto` email address or or the sentBy address.\n *\n * ```javascript\n * event.organizer({\n * name: 'Organizer\\'s Name',\n * email: 'organizer@example.com',\n * mailto: 'explicit@mailto.com',\n * sentBy: 'substitute@example.com'\n * })\n * ```\n *\n * @since 0.2.0\n */\n organizer(organizer: ICalOrganizer | string | null): this;\n organizer(organizer?: ICalOrganizer | string | null): this | ICalOrganizer | null {\n if (organizer === undefined) {\n return this.data.organizer;\n }\n if (organizer === null) {\n this.data.organizer = null;\n return this;\n }\n\n this.data.organizer = checkNameAndMail('organizer', organizer);\n return this;\n }\n\n\n /**\n * Creates a new {@link ICalAttendee} and returns it. Use options to prefill\n * the attendee's attributes. Calling this method without options will create\n * an empty attendee.\n *\n * ```javascript\n * import ical from 'ical-generator';\n *\n * const cal = ical();\n * const event = cal.createEvent({\n * start: new Date()\n * });\n *\n * event.createAttendee({email: 'hui@example.com', name: 'Hui'});\n *\n * // add another attendee\n * event.createAttendee('Buh ');\n * ```\n *\n * ```text\n * BEGIN:VCALENDAR\n * VERSION:2.0\n * PRODID:-//sebbo.net//ical-generator//EN\n * BEGIN:VEVENT\n * UID:b4944f07-98e4-4581-ac80-2589bb20273d\n * SEQUENCE:0\n * DTSTAMP:20240212T194232Z\n * DTSTART:20240212T194232Z\n * SUMMARY:\n * ATTENDEE;ROLE=REQ-PARTICIPANT;CN=\"Hui\":MAILTO:hui@example.com\n * ATTENDEE;ROLE=REQ-PARTICIPANT;CN=\"Buh\":MAILTO:buh@example.net\n * END:VEVENT\n * END:VCALENDAR\n * ```\n *\n * As with the organizer, you can also add an explicit `mailto` address.\n *\n * ```javascript\n * event.createAttendee({email: 'hui@example.com', name: 'Hui', mailto: 'another@mailto.com'});\n *\n * // overwrite an attendee's mailto address\n * attendee.mailto('another@mailto.net');\n * ```\n *\n * @since 0.2.0\n */\n createAttendee(data: ICalAttendee | ICalAttendeeData | string): ICalAttendee {\n if (data instanceof ICalAttendee) {\n this.data.attendees.push(data);\n return data;\n }\n if (typeof data === 'string') {\n data = { email: data, ...checkNameAndMail('data', data) };\n }\n\n const attendee = new ICalAttendee(data, this);\n this.data.attendees.push(attendee);\n return attendee;\n }\n\n\n /**\n * Get all attendees\n * @since 0.2.0\n */\n attendees(): ICalAttendee[];\n\n /**\n * Add multiple attendees to your event\n *\n * ```javascript\n * const event = ical().createEvent();\n *\n * cal.attendees([\n * {email: 'a@example.com', name: 'Person A'},\n * {email: 'b@example.com', name: 'Person B'}\n * ]);\n *\n * cal.attendees(); // --> [ICalAttendee, ICalAttendee]\n * ```\n *\n * @since 0.2.0\n */\n attendees(attendees: (ICalAttendee | ICalAttendeeData | string)[]): this;\n attendees(attendees?: (ICalAttendee | ICalAttendeeData | string)[]): this | ICalAttendee[] {\n if (!attendees) {\n return this.data.attendees;\n }\n\n attendees.forEach(attendee => this.createAttendee(attendee));\n return this;\n }\n\n\n /**\n * Creates a new {@link ICalAlarm} and returns it. Use options to prefill\n * the alarm's attributes. Calling this method without options will create\n * an empty alarm.\n *\n * ```javascript\n * const cal = ical();\n * const event = cal.createEvent();\n * const alarm = event.createAlarm({type: ICalAlarmType.display, trigger: 300});\n *\n * // add another alarm\n * event.createAlarm({\n * type: ICalAlarmType.audio,\n * trigger: 300, // 5min before event\n * });\n * ```\n *\n * @since 0.2.1\n */\n createAlarm(data: ICalAlarm | ICalAlarmData): ICalAlarm {\n const alarm = data instanceof ICalAlarm ? data : new ICalAlarm(data, this);\n this.data.alarms.push(alarm);\n return alarm;\n }\n\n\n /**\n * Get all alarms\n * @since 0.2.0\n */\n alarms(): ICalAlarm[];\n\n /**\n * Add one or multiple alarms\n *\n * ```javascript\n * const event = ical().createEvent();\n *\n * cal.alarms([\n * {type: ICalAlarmType.display, trigger: 600},\n * {type: ICalAlarmType.audio, trigger: 300}\n * ]);\n *\n * cal.alarms(); // --> [ICalAlarm, ICalAlarm]\n ```\n *\n * @since 0.2.0\n */\n alarms(alarms: ICalAlarm[] | ICalAlarmData[]): this;\n alarms(alarms?: ICalAlarm[] | ICalAlarmData[]): this | ICalAlarm[] {\n if (!alarms) {\n return this.data.alarms;\n }\n\n alarms.forEach((alarm: ICalAlarm | ICalAlarmData) => this.createAlarm(alarm));\n return this;\n }\n\n\n /**\n * Creates a new {@link ICalCategory} and returns it. Use options to prefill the category's attributes.\n * Calling this method without options will create an empty category.\n *\n * ```javascript\n * const cal = ical();\n * const event = cal.createEvent();\n * const category = event.createCategory({name: 'APPOINTMENT'});\n *\n * // add another category\n * event.createCategory({\n * name: 'MEETING'\n * });\n * ```\n *\n * @since 0.3.0\n */\n createCategory(data: ICalCategory | ICalCategoryData): ICalCategory {\n const category = data instanceof ICalCategory ? data : new ICalCategory(data);\n this.data.categories.push(category);\n return category;\n }\n\n\n /**\n * Get all categories\n * @since 0.3.0\n */\n categories(): ICalCategory[];\n\n /**\n * Add categories to the event or return all selected categories.\n *\n * ```javascript\n * const event = ical().createEvent();\n *\n * cal.categories([\n * {name: 'APPOINTMENT'},\n * {name: 'MEETING'}\n * ]);\n *\n * cal.categories(); // --> [ICalCategory, ICalCategory]\n * ```\n *\n * @since 0.3.0\n */\n categories(categories: (ICalCategory | ICalCategoryData)[]): this;\n categories(categories?: (ICalCategory | ICalCategoryData)[]): this | ICalCategory[] {\n if (!categories) {\n return this.data.categories;\n }\n\n categories.forEach(category => this.createCategory(category));\n return this;\n }\n\n\n /**\n * Get the event's status\n * @since 0.2.0\n */\n status(): ICalEventStatus | null;\n\n /**\n * Set the event's status\n *\n * ```javascript\n * import ical, {ICalEventStatus} from 'ical-generator';\n * event.status(ICalEventStatus.CONFIRMED);\n * ```\n *\n * @since 0.2.0\n */\n status(status: ICalEventStatus | null): this;\n status(status?: ICalEventStatus | null): this | ICalEventStatus | null {\n if (status === undefined) {\n return this.data.status;\n }\n if (status === null) {\n this.data.status = null;\n return this;\n }\n\n this.data.status = checkEnum(ICalEventStatus, status) as ICalEventStatus;\n return this;\n }\n\n\n /**\n * Get the event's busy status\n * @since 1.0.2\n */\n busystatus(): ICalEventBusyStatus | null;\n\n /**\n * Set the event's busy status. Will add the\n * [`X-MICROSOFT-CDO-BUSYSTATUS`](https://docs.microsoft.com/en-us/openspecs/exchange_server_protocols/ms-oxcical/cd68eae7-ed65-4dd3-8ea7-ad585c76c736)\n * attribute to your event.\n *\n * ```javascript\n * import ical, {ICalEventBusyStatus} from 'ical-generator';\n * event.busystatus(ICalEventBusyStatus.BUSY);\n * ```\n *\n * @since 1.0.2\n */\n busystatus(busystatus: ICalEventBusyStatus | null): this;\n busystatus(busystatus?: ICalEventBusyStatus | null): this | ICalEventBusyStatus | null {\n if (busystatus === undefined) {\n return this.data.busystatus;\n }\n if (busystatus === null) {\n this.data.busystatus = null;\n return this;\n }\n\n this.data.busystatus = checkEnum(ICalEventBusyStatus, busystatus) as ICalEventBusyStatus;\n return this;\n }\n\n\n /**\n * Get the event's priority. A value of 1 represents\n * the highest priority, 9 the lowest. 0 specifies an undefined\n * priority.\n *\n * @since v2.0.0-develop.7\n */\n priority(): number | null;\n\n /**\n * Set the event's priority. A value of 1 represents\n * the highest priority, 9 the lowest. 0 specifies an undefined\n * priority.\n *\n * @since v2.0.0-develop.7\n */\n priority(priority: number | null): this;\n priority(priority?: number | null): this | number | null {\n if (priority === undefined) {\n return this.data.priority;\n }\n if (priority === null) {\n this.data.priority = null;\n return this;\n }\n\n if(priority < 0 || priority > 9) {\n throw new Error('`priority` is invalid, musst be 0 ≤ priority ≤ 9.');\n }\n\n this.data.priority = Math.round(priority);\n return this;\n }\n\n\n /**\n * Get the event's URL\n * @since 0.2.0\n */\n url(): string | null;\n\n /**\n * Set the event's URL\n * @since 0.2.0\n */\n url(url: string | null): this;\n url(url?: string | null): this | string | null {\n if (url === undefined) {\n return this.data.url;\n }\n\n this.data.url = url ? String(url) : null;\n return this;\n }\n\n /**\n * Adds an attachment to the event by adding the file URL to the calendar.\n *\n * `ical-generator` only supports external attachments. File attachments that\n * are directly included in the file are not supported, because otherwise the\n * calendar file could easily become unfavourably large.\n *\n * ```javascript\n * const cal = ical();\n * const event = cal.createEvent();\n * event.createAttachment('https://files.sebbo.net/calendar/attachments/foo');\n * ```\n *\n * @since 3.2.0-develop.1\n */\n createAttachment(url: string): this {\n this.data.attachments.push(url);\n return this;\n }\n\n\n /**\n * Get all attachment urls\n * @since 3.2.0-develop.1\n */\n attachments(): string[];\n\n /**\n * Add one or multiple alarms\n *\n * ```javascript\n * const event = ical().createEvent();\n *\n * cal.attachments([\n * 'https://files.sebbo.net/calendar/attachments/foo',\n * 'https://files.sebbo.net/calendar/attachments/bar'\n * ]);\n *\n * cal.attachments(); // --> [string, string]\n ```\n *\n * 3.2.0-develop.1\n */\n attachments(attachments: string[]): this;\n attachments(attachments?: string[]): this | string[] {\n if (!attachments) {\n return this.data.attachments;\n }\n\n attachments.forEach((attachment: string) => this.createAttachment(attachment));\n return this;\n }\n\n /**\n * Get the event's transparency\n * @since 1.7.3\n */\n transparency(): ICalEventTransparency | null;\n\n /**\n * Set the event's transparency\n *\n * Set the field to `OPAQUE` if the person or resource is no longer\n * available due to this event. If the calendar entry has no influence\n * on availability, you can set the field to `TRANSPARENT`. This value\n * is mostly used to find out if a person has time on a certain date or\n * not (see `TRANSP` in iCal specification).\n *\n * ```javascript\n * import ical, {ICalEventTransparency} from 'ical-generator';\n * event.transparency(ICalEventTransparency.OPAQUE);\n * ```\n *\n * @since 1.7.3\n */\n transparency(transparency: ICalEventTransparency | null): this;\n transparency(transparency?: ICalEventTransparency | null): this | ICalEventTransparency | null {\n if (transparency === undefined) {\n return this.data.transparency;\n }\n if (!transparency) {\n this.data.transparency = null;\n return this;\n }\n\n this.data.transparency = checkEnum(ICalEventTransparency, transparency) as ICalEventTransparency;\n return this;\n }\n\n\n /**\n * Get the event's creation date\n * @since 0.3.0\n */\n created(): ICalDateTimeValue | null;\n\n /**\n * Set the event's creation date\n * @since 0.3.0\n */\n created(created: ICalDateTimeValue | null): this;\n created(created?: ICalDateTimeValue | null): this | ICalDateTimeValue | null {\n if (created === undefined) {\n return this.data.created;\n }\n if (created === null) {\n this.data.created = null;\n return this;\n }\n\n this.data.created = checkDate(created, 'created');\n return this;\n }\n\n\n /**\n * Get the event's last modification date\n * @since 0.3.0\n */\n lastModified(): ICalDateTimeValue | null;\n\n /**\n * Set the event's last modification date\n * @since 0.3.0\n */\n lastModified(lastModified: ICalDateTimeValue | null): this;\n lastModified(lastModified?: ICalDateTimeValue | null): this | ICalDateTimeValue | null {\n if (lastModified === undefined) {\n return this.data.lastModified;\n }\n if (lastModified === null) {\n this.data.lastModified = null;\n return this;\n }\n\n this.data.lastModified = checkDate(lastModified, 'lastModified');\n return this;\n }\n\n /**\n * Get the event's class\n * @since 2.0.0\n */\n class(): ICalEventClass | null;\n\n /**\n * Set the event's class\n *\n * ```javascript\n * import ical, { ICalEventClass } from 'ical-generator';\n * event.class(ICalEventClass.PRIVATE);\n * ```\n *\n * @since 2.0.0\n */\n class(class_: ICalEventClass | null): this;\n class(class_?: ICalEventClass | null): this | ICalEventClass | null {\n if (class_ === undefined) {\n return this.data.class;\n }\n if (class_ === null) {\n this.data.class = null;\n return this;\n }\n\n this.data.class = checkEnum(ICalEventClass, class_) as ICalEventClass;\n return this;\n }\n\n\n /**\n * Set X-* attributes. Woun't filter double attributes,\n * which are also added by another method (e.g. summary),\n * so these attributes may be inserted twice.\n *\n * ```javascript\n * event.x([\n * {\n * key: \"X-MY-CUSTOM-ATTR\",\n * value: \"1337!\"\n * }\n * ]);\n *\n * event.x([\n * [\"X-MY-CUSTOM-ATTR\", \"1337!\"]\n * ]);\n *\n * event.x({\n * \"X-MY-CUSTOM-ATTR\": \"1337!\"\n * });\n * ```\n *\n * @since 1.9.0\n */\n x (keyOrArray: {key: string, value: string}[] | [string, string][] | Record): this;\n\n /**\n * Set a X-* attribute. Woun't filter double attributes,\n * which are also added by another method (e.g. summary),\n * so these attributes may be inserted twice.\n *\n * ```javascript\n * event.x(\"X-MY-CUSTOM-ATTR\", \"1337!\");\n * ```\n *\n * @since 1.9.0\n */\n x (keyOrArray: string, value: string): this;\n\n /**\n * Get all custom X-* attributes.\n * @since 1.9.0\n */\n x (): {key: string, value: string}[];\n x(keyOrArray?: ({ key: string, value: string })[] | [string, string][] | Record | string, value?: string): this | void | ({ key: string, value: string })[] {\n if (keyOrArray === undefined) {\n return addOrGetCustomAttributes(this.data);\n }\n\n if (typeof keyOrArray === 'string' && typeof value === 'string') {\n addOrGetCustomAttributes(this.data, keyOrArray, value);\n }\n if (typeof keyOrArray === 'object') {\n addOrGetCustomAttributes(this.data, keyOrArray);\n }\n\n return this;\n }\n\n\n /**\n * Return a shallow copy of the events's options for JSON stringification.\n * Third party objects like moment.js values or RRule objects are stringified\n * as well. Can be used for persistence.\n *\n * ```javascript\n * const event = ical().createEvent();\n * const json = JSON.stringify(event);\n *\n * // later: restore event data\n * const calendar = ical().createEvent(JSON.parse(json));\n * ```\n *\n * @since 0.2.4\n */\n toJSON(): ICalEventJSONData {\n let repeating: ICalEventJSONRepeatingData | string | null = null;\n if(isRRule(this.data.repeating) || typeof this.data.repeating === 'string') {\n repeating = this.data.repeating.toString();\n }\n else if(this.data.repeating) {\n repeating = Object.assign({}, this.data.repeating, {\n until: toJSON(this.data.repeating.until) || undefined,\n exclude: this.data.repeating.exclude?.map(d => toJSON(d)),\n });\n }\n\n this.swapStartAndEndIfRequired();\n return Object.assign({}, this.data, {\n start: toJSON(this.data.start) || null,\n end: toJSON(this.data.end) || null,\n recurrenceId: toJSON(this.data.recurrenceId) || null,\n stamp: toJSON(this.data.stamp) || null,\n created: toJSON(this.data.created) || null,\n lastModified: toJSON(this.data.lastModified) || null,\n repeating,\n x: this.x()\n });\n }\n\n\n /**\n * Return generated event as a string.\n *\n * ```javascript\n * const event = ical().createEvent();\n * console.log(event.toString()); // → BEGIN:VEVENT…\n * ```\n */\n toString(): string {\n let g = '';\n\n // DATE & TIME\n g += 'BEGIN:VEVENT\\r\\n';\n g += 'UID:' + this.data.id + '\\r\\n';\n\n // SEQUENCE\n g += 'SEQUENCE:' + this.data.sequence + '\\r\\n';\n\n this.swapStartAndEndIfRequired();\n g += 'DTSTAMP:' + formatDate(this.calendar.timezone(), this.data.stamp) + '\\r\\n';\n if (this.data.allDay) {\n g += 'DTSTART;VALUE=DATE:' + formatDate(this.timezone(), this.data.start, true) + '\\r\\n';\n if (this.data.end) {\n g += 'DTEND;VALUE=DATE:' + formatDate(this.timezone(), this.data.end, true) + '\\r\\n';\n }\n\n g += 'X-MICROSOFT-CDO-ALLDAYEVENT:TRUE\\r\\n';\n g += 'X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE\\r\\n';\n }\n else {\n g += formatDateTZ(this.timezone(), 'DTSTART', this.data.start, this.data) + '\\r\\n';\n if (this.data.end) {\n g += formatDateTZ(this.timezone(), 'DTEND', this.data.end, this.data) + '\\r\\n';\n }\n }\n\n // REPEATING\n if(isRRule(this.data.repeating) || typeof this.data.repeating === 'string') {\n let repeating = this.data.repeating\n .toString()\n .replace(/\\r\\n/g, '\\n')\n .split('\\n')\n .filter(l => l && !l.startsWith('DTSTART:'))\n .join('\\r\\n');\n\n if(!repeating.includes('\\r\\n') && !repeating.startsWith('RRULE:')) {\n repeating = 'RRULE:' + repeating;\n }\n\n g += repeating.trim() + '\\r\\n';\n }\n else if (this.data.repeating) {\n g += 'RRULE:FREQ=' + this.data.repeating.freq;\n\n if (this.data.repeating.count) {\n g += ';COUNT=' + this.data.repeating.count;\n }\n\n if (this.data.repeating.interval) {\n g += ';INTERVAL=' + this.data.repeating.interval;\n }\n\n if (this.data.repeating.until) {\n g += ';UNTIL=' + formatDate(this.calendar.timezone(), this.data.repeating.until, false, this.floating());\n }\n\n if (this.data.repeating.byDay) {\n g += ';BYDAY=' + this.data.repeating.byDay.join(',');\n }\n\n if (this.data.repeating.byMonth) {\n g += ';BYMONTH=' + this.data.repeating.byMonth.join(',');\n }\n\n if (this.data.repeating.byMonthDay) {\n g += ';BYMONTHDAY=' + this.data.repeating.byMonthDay.join(',');\n }\n\n if (this.data.repeating.bySetPos) {\n g += ';BYSETPOS=' + this.data.repeating.bySetPos.join(',');\n }\n\n if (this.data.repeating.startOfWeek) {\n g += ';WKST=' + this.data.repeating.startOfWeek;\n }\n\n g += '\\r\\n';\n\n // REPEATING EXCLUSION\n if (this.data.repeating.exclude) {\n if (this.data.allDay) {\n g += 'EXDATE;VALUE=DATE:' + this.data.repeating.exclude.map(excludedDate => {\n return formatDate(this.calendar.timezone(), excludedDate, true);\n }).join(',') + '\\r\\n';\n }\n else {\n g += 'EXDATE';\n if (this.timezone()) {\n g += ';TZID=' + this.timezone() + ':' + this.data.repeating.exclude.map(excludedDate => {\n // This isn't a 'floating' event because it has a timezone;\n // but we use it to omit the 'Z' UTC specifier in formatDate()\n return formatDate(this.timezone(), excludedDate, false, true);\n }).join(',') + '\\r\\n';\n }\n else {\n g += ':' + this.data.repeating.exclude.map(excludedDate => {\n return formatDate(this.timezone(), excludedDate, false, this.floating());\n }).join(',') + '\\r\\n';\n }\n }\n }\n }\n\n // RECURRENCE\n if (this.data.recurrenceId) {\n g += formatDateTZ(this.timezone(), 'RECURRENCE-ID', this.data.recurrenceId, this.data) + '\\r\\n';\n }\n\n // SUMMARY\n g += 'SUMMARY:' + escape(this.data.summary, false) + '\\r\\n';\n\n // TRANSPARENCY\n if (this.data.transparency) {\n g += 'TRANSP:' + escape(this.data.transparency, false) + '\\r\\n';\n }\n\n // LOCATION\n if (this.data.location && 'title' in this.data.location && this.data.location.title) {\n g += 'LOCATION:' + escape(\n this.data.location.title +\n (this.data.location.address ? '\\n' + this.data.location.address : ''),\n false\n ) + '\\r\\n';\n\n if (this.data.location.radius && this.data.location.geo) {\n g += 'X-APPLE-STRUCTURED-LOCATION;VALUE=URI;' +\n (this.data.location.address ? 'X-ADDRESS=' + escape(this.data.location.address, false) + ';' : '') +\n 'X-APPLE-RADIUS=' + escape(this.data.location.radius, false) + ';' +\n 'X-TITLE=' + escape(this.data.location.title, false) +\n ':geo:' + escape(this.data.location.geo?.lat, false) + ',' +\n escape(this.data.location.geo?.lon, false) + '\\r\\n';\n }\n }\n\n // GEO\n if (this.data.location && 'geo' in this.data.location && this.data.location.geo) {\n g += 'GEO:' + escape(this.data.location.geo?.lat, false) + ';' +\n escape(this.data.location.geo?.lon, false) + '\\r\\n';\n }\n \n // DESCRIPTION\n if (this.data.description) {\n g += 'DESCRIPTION:' + escape(this.data.description.plain, false) + '\\r\\n';\n\n // HTML DESCRIPTION\n if (this.data.description.html) {\n g += 'X-ALT-DESC;FMTTYPE=text/html:' + escape(this.data.description.html, false) + '\\r\\n';\n }\n }\n\n // ORGANIZER\n if (this.data.organizer) {\n g += 'ORGANIZER;CN=\"' + escape(this.data.organizer.name, true) + '\"';\n\n if (this.data.organizer.sentBy) {\n g += ';SENT-BY=\"mailto:' + escape(this.data.organizer.sentBy, true) + '\"';\n }\n if (this.data.organizer.email && this.data.organizer.mailto) {\n g += ';EMAIL=' + escape(this.data.organizer.email, false);\n }\n if(this.data.organizer.email) {\n g += ':mailto:' + escape(this.data.organizer.mailto || this.data.organizer.email, false);\n }\n g += '\\r\\n';\n }\n\n // ATTENDEES\n this.data.attendees.forEach(function (attendee) {\n g += attendee.toString();\n });\n\n // ALARMS\n this.data.alarms.forEach(function (alarm) {\n g += alarm.toString();\n });\n\n // CATEGORIES\n if (this.data.categories.length > 0) {\n g += 'CATEGORIES:' + this.data.categories\n .map(category => category.toString())\n .join() + '\\r\\n';\n }\n\n // URL\n if (this.data.url) {\n g += 'URL;VALUE=URI:' + escape(this.data.url, false) + '\\r\\n';\n }\n\n // ATTACHMENT\n if (this.data.attachments.length > 0) {\n this.data.attachments.forEach(url => {\n g += 'ATTACH:' + escape(url, false) + '\\r\\n';\n });\n }\n\n // STATUS\n if (this.data.status) {\n g += 'STATUS:' + this.data.status.toUpperCase() + '\\r\\n';\n }\n\n // BUSYSTATUS\n if (this.data.busystatus) {\n g += 'X-MICROSOFT-CDO-BUSYSTATUS:' + this.data.busystatus.toUpperCase() + '\\r\\n';\n }\n\n // PRIORITY\n if (this.data.priority !== null) {\n g += 'PRIORITY:' + this.data.priority + '\\r\\n';\n }\n\n // CUSTOM X ATTRIBUTES\n g += generateCustomAttributes(this.data);\n\n // CREATED\n if (this.data.created) {\n g += 'CREATED:' + formatDate(this.calendar.timezone(), this.data.created) + '\\r\\n';\n }\n\n // LAST-MODIFIED\n if (this.data.lastModified) {\n g += 'LAST-MODIFIED:' + formatDate(this.calendar.timezone(), this.data.lastModified) + '\\r\\n';\n }\n\n if (this.data.class) {\n g+= 'CLASS:' + this.data.class.toUpperCase() + '\\r\\n';\n }\n\n g += 'END:VEVENT\\r\\n';\n return g;\n }\n}\n","'use strict';\n\n\nimport {addOrGetCustomAttributes, checkEnum, checkNameAndMail, escape} from './tools.ts';\nimport ICalEvent from './event.ts';\nimport ICalAlarm from './alarm.ts';\n\n\ninterface ICalInternalAttendeeData {\n name: string | null;\n email: string;\n mailto: string | null;\n sentBy: string | null;\n status: ICalAttendeeStatus | null;\n role: ICalAttendeeRole;\n rsvp: boolean | null;\n type: ICalAttendeeType | null;\n delegatedTo: ICalAttendee | null;\n delegatedFrom: ICalAttendee | null;\n x: [string, string][];\n}\n\nexport interface ICalAttendeeData {\n name?: string | null;\n email: string;\n mailto?: string | null;\n sentBy?: string | null;\n status?: ICalAttendeeStatus | null;\n role?: ICalAttendeeRole;\n rsvp?: boolean | null;\n type?: ICalAttendeeType | null;\n delegatedTo?: ICalAttendee | ICalAttendeeData | string | null;\n delegatedFrom?: ICalAttendee | ICalAttendeeData | string | null;\n delegatesTo?: ICalAttendee | ICalAttendeeData | string | null;\n delegatesFrom?: ICalAttendee | ICalAttendeeData | string | null;\n x?: {key: string, value: string}[] | [string, string][] | Record;\n}\n\nexport interface ICalAttendeeJSONData {\n name: string | null;\n email: string;\n mailto: string | null;\n sentBy: string | null;\n status: ICalAttendeeStatus | null;\n role: ICalAttendeeRole;\n rsvp: boolean | null;\n type: ICalAttendeeType | null;\n delegatedTo: string | null;\n delegatedFrom: string | null;\n x: {key: string, value: string}[];\n}\n\nexport enum ICalAttendeeRole {\n CHAIR = 'CHAIR',\n REQ = 'REQ-PARTICIPANT',\n OPT = 'OPT-PARTICIPANT',\n NON = 'NON-PARTICIPANT'\n}\n\nexport enum ICalAttendeeStatus {\n ACCEPTED = 'ACCEPTED',\n TENTATIVE = 'TENTATIVE',\n DECLINED = 'DECLINED',\n DELEGATED = 'DELEGATED',\n NEEDSACTION = 'NEEDS-ACTION'\n}\n\n// ref: https://tools.ietf.org/html/rfc2445#section-4.2.3\nexport enum ICalAttendeeType {\n INDIVIDUAL = 'INDIVIDUAL',\n GROUP = 'GROUP',\n RESOURCE = 'RESOURCE',\n ROOM = 'ROOM',\n UNKNOWN = 'UNKNOWN'\n}\n\n\n/**\n * Usually you get an {@link ICalAttendee} object like this:\n *\n * ```javascript\n * import ical from 'ical-generator';\n * const calendar = ical();\n * const event = calendar.createEvent();\n * const attendee = event.createAttendee({ email: 'mail@example.com' });\n * ```\n *\n * You can also use the {@link ICalAttendee} object directly:\n *\n * ```javascript\n * import ical, {ICalAttendee} from 'ical-generator';\n * const attendee = new ICalAttendee({ email: 'mail@example.com' });\n * event.attendees([attendee]);\n * ```\n */\nexport default class ICalAttendee {\n private readonly data: ICalInternalAttendeeData;\n private readonly parent: ICalEvent | ICalAlarm;\n\n /**\n * Constructor of {@link ICalAttendee}. The event reference is\n * required to query the calendar's timezone when required.\n *\n * @param data Attendee Data\n * @param parent Reference to ICalEvent object\n */\n constructor(data: ICalAttendeeData, parent: ICalEvent | ICalAlarm) {\n this.data = {\n name: null,\n email: '',\n mailto: null,\n sentBy: null,\n status: null,\n role: ICalAttendeeRole.REQ,\n rsvp: null,\n type: null,\n delegatedTo: null,\n delegatedFrom: null,\n x: []\n };\n this.parent = parent;\n if (!this.parent) {\n throw new Error('`event` option required!');\n }\n if (!data.email) {\n throw new Error('No value for `email` in ICalAttendee given!');\n }\n\n if (data.name !== undefined) this.name(data.name);\n if (data.email !== undefined) this.email(data.email);\n if (data.mailto !== undefined) this.mailto(data.mailto);\n if (data.sentBy !== undefined) this.sentBy(data.sentBy);\n if (data.status !== undefined) this.status(data.status);\n if (data.role !== undefined) this.role(data.role);\n if (data.rsvp !== undefined) this.rsvp(data.rsvp);\n if (data.type !== undefined) this.type(data.type);\n if (data.delegatedTo !== undefined) this.delegatedTo(data.delegatedTo);\n if (data.delegatedFrom !== undefined) this.delegatedFrom(data.delegatedFrom);\n if (data.delegatesTo) this.delegatesTo(data.delegatesTo);\n if (data.delegatesFrom) this.delegatesFrom(data.delegatesFrom);\n if (data.x !== undefined) this.x(data.x);\n }\n\n\n /**\n * Get the attendee's name\n * @since 0.2.0\n */\n name(): string | null;\n\n /**\n * Set the attendee's name\n * @since 0.2.0\n */\n name(name: string | null): this;\n name(name?: string | null): this | string | null {\n if (name === undefined) {\n return this.data.name;\n }\n\n this.data.name = name || null;\n return this;\n }\n\n\n /**\n * Get the attendee's email address\n * @since 0.2.0\n */\n email(): string;\n\n /**\n * Set the attendee's email address\n * @since 0.2.0\n */\n email(email: string): this;\n email(email?: string): this | string {\n if (!email) {\n return this.data.email;\n }\n\n this.data.email = email;\n return this;\n }\n\n /**\n * Get the attendee's email address\n * @since 1.3.0\n */\n mailto(): string | null;\n\n /**\n * Set the attendee's email address\n * @since 1.3.0\n */\n mailto(mailto: string | null): this;\n mailto(mailto?: string | null): this | string | null {\n if (mailto === undefined) {\n return this.data.mailto;\n }\n\n this.data.mailto = mailto || null;\n return this;\n }\n\n\n /**\n * Get the acting user's email adress\n * @since 3.3.0\n */\n sentBy(): string | null;\n\n /**\n * Set the acting user's email adress\n * @since 3.3.0\n */\n sentBy(email: string | null): this;\n sentBy(email?: string | null): this | string | null {\n if (!email) {\n return this.data.sentBy;\n }\n\n this.data.sentBy = email;\n return this;\n }\n\n\n /**\n * Get attendee's role\n * @since 0.2.0\n */\n role(): ICalAttendeeRole;\n\n /**\n * Set the attendee's role, defaults to `REQ` / `REQ-PARTICIPANT`.\n * Checkout {@link ICalAttendeeRole} for available roles.\n *\n * @since 0.2.0\n */\n role(role: ICalAttendeeRole): this;\n role(role?: ICalAttendeeRole): this | ICalAttendeeRole {\n if (role === undefined) {\n return this.data.role;\n }\n\n this.data.role = checkEnum(ICalAttendeeRole, role) as ICalAttendeeRole;\n return this;\n }\n\n\n /**\n * Get attendee's RSVP expectation\n * @since 0.2.1\n */\n rsvp(): boolean | null;\n\n /**\n * Set the attendee's RSVP expectation\n * @since 0.2.1\n */\n rsvp(rsvp: boolean | null): this;\n rsvp(rsvp?: boolean | null): this | boolean | null {\n if (rsvp === undefined) {\n return this.data.rsvp;\n }\n if (rsvp === null) {\n this.data.rsvp = null;\n return this;\n }\n\n this.data.rsvp = Boolean(rsvp);\n return this;\n }\n\n\n /**\n * Get attendee's status\n * @since 0.2.0\n */\n status(): ICalAttendeeStatus | null;\n\n /**\n * Set the attendee's status. See {@link ICalAttendeeStatus}\n * for available status options.\n *\n * @since 0.2.0\n */\n status(status: ICalAttendeeStatus | null): this;\n status(status?: ICalAttendeeStatus | null): this | ICalAttendeeStatus | null {\n if (status === undefined) {\n return this.data.status;\n }\n if (!status) {\n this.data.status = null;\n return this;\n }\n\n this.data.status = checkEnum(ICalAttendeeStatus, status) as ICalAttendeeStatus;\n return this;\n }\n\n\n /**\n * Get attendee's type (a.k.a. CUTYPE)\n * @since 0.2.3\n */\n type(): ICalAttendeeType;\n\n /**\n * Set attendee's type (a.k.a. CUTYPE).\n * See {@link ICalAttendeeType} for available status options.\n *\n * @since 0.2.3\n */\n type(type: ICalAttendeeType | null): this;\n type(type?: ICalAttendeeType | null): this | ICalAttendeeType | null {\n if (type === undefined) {\n return this.data.type;\n }\n if (!type) {\n this.data.type = null;\n return this;\n }\n\n this.data.type = checkEnum(ICalAttendeeType, type) as ICalAttendeeType;\n return this;\n }\n\n\n /**\n * Get the attendee's delegated-to value.\n * @since 0.2.0\n */\n delegatedTo(): ICalAttendee | null;\n\n /**\n * Set the attendee's delegated-to field.\n *\n * Creates a new Attendee if the passed object is not already a\n * {@link ICalAttendee} object. Will set the `delegatedTo` and\n * `delegatedFrom` attributes.\n *\n * Will also set the `status` to `DELEGATED`, if attribute is set.\n *\n * ```javascript\n * const cal = ical();\n * const event = cal.createEvent();\n * const attendee = cal.createAttendee();\n *\n * attendee.delegatesTo({email: 'foo@bar.com', name: 'Foo'});\n ```\n *\n * @since 0.2.0\n */\n delegatedTo(delegatedTo: ICalAttendee | ICalAttendeeData | string | null): this;\n delegatedTo(delegatedTo?: ICalAttendee | ICalAttendeeData | string | null): this | ICalAttendee | null {\n if (delegatedTo === undefined) {\n return this.data.delegatedTo;\n }\n if (!delegatedTo) {\n this.data.delegatedTo = null;\n if (this.data.status === ICalAttendeeStatus.DELEGATED) {\n this.data.status = null;\n }\n return this;\n }\n\n if(typeof delegatedTo === 'string') {\n this.data.delegatedTo = new ICalAttendee(\n { email: delegatedTo, ...checkNameAndMail('delegatedTo', delegatedTo) },\n this.parent,\n );\n }\n else if(delegatedTo instanceof ICalAttendee) {\n this.data.delegatedTo = delegatedTo;\n }\n else {\n this.data.delegatedTo = new ICalAttendee(delegatedTo, this.parent);\n }\n\n this.data.status = ICalAttendeeStatus.DELEGATED;\n return this;\n }\n\n\n /**\n * Get the attendee's delegated-from field\n * @since 0.2.0\n */\n delegatedFrom (): ICalAttendee | null;\n\n /**\n * Set the attendee's delegated-from field\n *\n * Creates a new Attendee if the passed object is not already a\n * {@link ICalAttendee} object. Will set the `delegatedTo` and\n * `delegatedFrom` attributes.\n *\n * @param delegatedFrom\n */\n delegatedFrom (delegatedFrom: ICalAttendee | ICalAttendeeData | string | null): this;\n delegatedFrom(delegatedFrom?: ICalAttendee | ICalAttendeeData | string | null): this | ICalAttendee | null {\n if (delegatedFrom === undefined) {\n return this.data.delegatedFrom;\n }\n\n if (!delegatedFrom) {\n this.data.delegatedFrom = null;\n }\n else if(typeof delegatedFrom === 'string') {\n this.data.delegatedFrom = new ICalAttendee(\n { email: delegatedFrom, ...checkNameAndMail('delegatedFrom', delegatedFrom) },\n this.parent,\n );\n }\n else if(delegatedFrom instanceof ICalAttendee) {\n this.data.delegatedFrom = delegatedFrom;\n }\n else {\n this.data.delegatedFrom = new ICalAttendee(delegatedFrom, this.parent);\n }\n\n return this;\n }\n\n\n /**\n * Create a new attendee this attendee delegates to and returns\n * this new attendee. Creates a new attendee if the passed object\n * is not already an {@link ICalAttendee}.\n *\n * ```javascript\n * const cal = ical();\n * const event = cal.createEvent();\n * const attendee = cal.createAttendee();\n *\n * attendee.delegatesTo({email: 'foo@bar.com', name: 'Foo'});\n * ```\n *\n * @since 0.2.0\n */\n delegatesTo (options: ICalAttendee | ICalAttendeeData | string): ICalAttendee {\n const a = options instanceof ICalAttendee ? options : this.parent.createAttendee(options);\n this.delegatedTo(a);\n a.delegatedFrom(this);\n return a;\n }\n\n\n /**\n * Create a new attendee this attendee delegates from and returns\n * this new attendee. Creates a new attendee if the passed object\n * is not already an {@link ICalAttendee}.\n *\n * ```javascript\n * const cal = ical();\n * const event = cal.createEvent();\n * const attendee = cal.createAttendee();\n *\n * attendee.delegatesFrom({email: 'foo@bar.com', name: 'Foo'});\n * ```\n *\n * @since 0.2.0\n */\n delegatesFrom (options: ICalAttendee | ICalAttendeeData | string): ICalAttendee {\n const a = options instanceof ICalAttendee ? options : this.parent.createAttendee(options);\n this.delegatedFrom(a);\n a.delegatedTo(this);\n return a;\n }\n\n /**\n * Set X-* attributes. Woun't filter double attributes,\n * which are also added by another method (e.g. status),\n * so these attributes may be inserted twice.\n *\n * ```javascript\n * attendee.x([\n * {\n * key: \"X-MY-CUSTOM-ATTR\",\n * value: \"1337!\"\n * }\n * ]);\n *\n * attendee.x([\n * [\"X-MY-CUSTOM-ATTR\", \"1337!\"]\n * ]);\n *\n * attendee.x({\n * \"X-MY-CUSTOM-ATTR\": \"1337!\"\n * });\n * ```\n *\n * @since 1.9.0\n */\n x (keyOrArray: {key: string, value: string}[] | [string, string][] | Record): this;\n\n /**\n * Set a X-* attribute. Woun't filter double attributes,\n * which are also added by another method (e.g. status),\n * so these attributes may be inserted twice.\n *\n * ```javascript\n * attendee.x(\"X-MY-CUSTOM-ATTR\", \"1337!\");\n * ```\n *\n * @since 1.9.0\n */\n x (keyOrArray: string, value: string): this;\n\n /**\n * Get all custom X-* attributes.\n * @since 1.9.0\n */\n x (): {key: string, value: string}[];\n x (keyOrArray?: ({key: string, value: string})[] | [string, string][] | Record | string, value?: string): this | void | ({key: string, value: string})[] {\n if(keyOrArray === undefined) {\n return addOrGetCustomAttributes (this.data);\n }\n\n if(typeof keyOrArray === 'string' && typeof value === 'string') {\n addOrGetCustomAttributes (this.data, keyOrArray, value);\n }\n else if(typeof keyOrArray === 'object') {\n addOrGetCustomAttributes (this.data, keyOrArray);\n }\n else {\n throw new Error('Either key or value is not a string!');\n }\n\n return this;\n }\n\n\n /**\n * Return a shallow copy of the attendee's options for JSON stringification.\n * Can be used for persistence.\n *\n * @since 0.2.4\n */\n toJSON(): ICalAttendeeJSONData {\n return Object.assign({}, this.data, {\n delegatedTo: this.data.delegatedTo?.email() || null,\n delegatedFrom: this.data.delegatedFrom?.email() || null,\n x: this.x()\n });\n }\n\n\n /**\n * Return generated attendee as a string.\n *\n * ```javascript\n * console.log(attendee.toString()); // → ATTENDEE;ROLE=…\n * ```\n */\n toString (): string {\n let g = 'ATTENDEE';\n\n if (!this.data.email) {\n throw new Error('No value for `email` in ICalAttendee given!');\n }\n\n // ROLE\n g += ';ROLE=' + this.data.role;\n\n // TYPE\n if (this.data.type) {\n g += ';CUTYPE=' + this.data.type;\n }\n\n // PARTSTAT\n if (this.data.status) {\n g += ';PARTSTAT=' + this.data.status;\n }\n\n // RSVP\n if (this.data.rsvp !== null) {\n g += ';RSVP=' + this.data.rsvp.toString().toUpperCase();\n }\n\n // SENT-BY\n if (this.data.sentBy !== null) {\n g += ';SENT-BY=\"mailto:' + this.data.sentBy + '\"';\n }\n\n // DELEGATED-TO\n if (this.data.delegatedTo) {\n g += ';DELEGATED-TO=\"' + this.data.delegatedTo.email() + '\"';\n }\n\n // DELEGATED-FROM\n if (this.data.delegatedFrom) {\n g += ';DELEGATED-FROM=\"' + this.data.delegatedFrom.email() + '\"';\n }\n\n // CN / Name\n if (this.data.name) {\n g += ';CN=\"' + escape(this.data.name, true) + '\"';\n }\n\n // EMAIL\n if (this.data.email && this.data.mailto) {\n g += ';EMAIL=' + escape(this.data.email, false);\n }\n\n // CUSTOM X ATTRIBUTES\n if(this.data.x.length) {\n g += ';' + this.data.x\n .map(([key, value]) => key.toUpperCase() + '=' + escape(value, false))\n .join(';');\n }\n\n g += ':MAILTO:' + escape(this.data.mailto || this.data.email, false) + '\\r\\n';\n\n return g;\n }\n}\n","'use strict';\n\nimport ICalEvent from './event.ts';\nimport {\n addOrGetCustomAttributes,\n formatDate,\n escape,\n generateCustomAttributes,\n checkDate,\n toDurationString,\n toJSON,\n checkNameAndMail\n} from './tools.ts';\nimport {ICalDateTimeValue} from './types.ts';\nimport ICalAttendee, { ICalAttendeeData } from './attendee.ts';\n\n\nexport enum ICalAlarmType {\n display = 'display',\n audio = 'audio',\n email = 'email'\n}\n\nexport const ICalAlarmRelatesTo = {\n end: 'END',\n start: 'START'\n} as const;\n\nexport type ICalAlarmRelatesTo = typeof ICalAlarmRelatesTo[keyof typeof ICalAlarmRelatesTo];\n\nexport type ICalAlarmTypeValue = keyof ICalAlarmType;\n\nexport interface ICalAttachment {\n uri: string;\n mime: string | null;\n}\n\nexport type ICalAlarmData = ICalAlarmBaseData |\n ICalAlarmTriggerData |\n ICalAlarmTriggerAfterData |\n ICalAlarmTriggerBeforeData;\n\nexport type ICalAlarmTriggerData = ICalAlarmBaseData & { trigger: number | ICalDateTimeValue };\nexport type ICalAlarmTriggerAfterData = ICalAlarmBaseData & { triggerAfter: number | ICalDateTimeValue };\nexport type ICalAlarmTriggerBeforeData = ICalAlarmBaseData & { triggerBefore: number | ICalDateTimeValue };\n\nexport interface ICalAlarmBaseData {\n type?: ICalAlarmType;\n relatesTo?: ICalAlarmRelatesTo | null;\n repeat?: ICalAlarmRepeatData | null;\n attach?: string | ICalAttachment | null;\n description?: string | null;\n summary?: string | null;\n attendees?: ICalAttendee[] | ICalAttendeeData[];\n x?: {key: string, value: string}[] | [string, string][] | Record;\n}\n\nexport interface ICalAlarmRepeatData {\n times: number;\n interval: number;\n}\n\ninterface ICalInternalAlarmData {\n type: ICalAlarmType;\n trigger: ICalDateTimeValue | number;\n relatesTo: ICalAlarmRelatesTo | null;\n repeat: ICalAlarmRepeatData | null;\n interval: number | null;\n attach: ICalAttachment | null;\n description: string | null;\n summary: string | null;\n attendees: ICalAttendee[];\n x: [string, string][];\n}\n\nexport interface ICalAlarmJSONData {\n type: ICalAlarmType;\n trigger: string | number;\n relatesTo: ICalAlarmRelatesTo | null;\n repeat: ICalAlarmRepeatData | null;\n interval: number | null;\n attach: ICalAttachment | null;\n description: string | null;\n summary: string | null;\n attendees: ICalAttendee[];\n x: {key: string, value: string}[];\n}\n\n\n/**\n * Usually you get an {@link ICalAlarm} object like this:\n *\n * ```javascript\n * import ical from 'ical-generator';\n * const calendar = ical();\n * const event = calendar.createEvent();\n * const alarm = event.createAlarm();\n * ```\n *\n * You can also use the {@link ICalAlarm} object directly:\n *\n * ```javascript\n * import ical, {ICalAlarm} from 'ical-generator';\n * const alarm = new ICalAlarm();\n * event.alarms([alarm]);\n * ```\n */\nexport default class ICalAlarm {\n private readonly data: ICalInternalAlarmData;\n private readonly event: ICalEvent;\n\n /**\n * Constructor of {@link ICalAttendee}. The event reference is required\n * to query the calendar's timezone and summary when required.\n *\n * @param data Alarm Data\n * @param event Reference to ICalEvent object\n */\n constructor (data: ICalAlarmData, event: ICalEvent) {\n this.data = {\n type: ICalAlarmType.display,\n trigger: -600,\n relatesTo: null,\n repeat: null,\n interval: null,\n attach: null,\n description: null,\n summary: null,\n attendees: [],\n x: []\n };\n\n this.event = event;\n if (!event) {\n throw new Error('`event` option required!');\n }\n\n if (data.type !== undefined) this.type(data.type);\n if ('trigger' in data && data.trigger !== undefined) this.trigger(data.trigger);\n if ('triggerBefore' in data && data.triggerBefore !== undefined) this.triggerBefore(data.triggerBefore);\n if ('triggerAfter' in data && data.triggerAfter !== undefined) this.triggerAfter(data.triggerAfter);\n if (data.repeat) this.repeat(data.repeat);\n if (data.attach !== undefined) this.attach(data.attach);\n if (data.description !== undefined) this.description(data.description);\n if (data.summary !== undefined) this.summary(data.summary);\n if (data.attendees !== undefined) this.attendees(data.attendees);\n if (data.x !== undefined) this.x(data.x);\n }\n\n\n /**\n * Get the alarm type\n * @since 0.2.1\n */\n type (type: ICalAlarmType): this;\n\n /**\n * Set the alarm type. See {@link ICalAlarmType}\n * for available status options.\n * @since 0.2.1\n */\n type (): ICalAlarmType;\n type (type?: ICalAlarmType): this | ICalAlarmType {\n if (type === undefined) {\n return this.data.type;\n }\n if (!type || !Object.keys(ICalAlarmType).includes(type)) {\n throw new Error('`type` is not correct, must be either `display` or `audio`!');\n }\n\n this.data.type = type;\n return this;\n }\n\n\n /**\n * Get the trigger time for the alarm. Can either\n * be a date and time value ({@link ICalDateTimeValue}) or\n * a number, which will represent the seconds between\n * alarm and event start. The number is negative, if the\n * alarm is triggered after the event started.\n *\n * @since 0.2.1\n */\n trigger (): number | ICalDateTimeValue;\n\n /**\n * Use this method to set the alarm time.\n *\n * ```javascript\n * const cal = ical();\n * const event = cal.createEvent();\n * const alarm = cal.createAlarm();\n *\n * alarm.trigger(600); // -> 10 minutes before event starts\n * alarm.trigger(new Date()); // -> now\n * ```\n *\n * You can use any supported date object, see\n * [readme](https://github.com/sebbo2002/ical-generator#-date-time--timezones)\n * for details about supported values and timezone handling.\n *\n * @since 0.2.1\n */\n trigger (trigger: number | ICalDateTimeValue | Date): this;\n trigger (trigger?: number | ICalDateTimeValue | Date): this | number | ICalDateTimeValue {\n\n // Getter\n if (trigger === undefined && typeof this.data.trigger === 'number') {\n return -1 * this.data.trigger;\n }\n if (trigger === undefined) {\n return this.data.trigger;\n }\n\n // Setter\n if (typeof trigger === 'number' && isFinite(trigger)) {\n this.data.trigger = -1 * trigger;\n }\n else if(!trigger || typeof trigger === 'number') {\n throw new Error('`trigger` is not correct, must be a finite number or a supported date!');\n }\n else {\n this.data.trigger = checkDate(trigger, 'trigger');\n }\n\n return this;\n }\n\n /**\n * Get to which time alarm trigger relates to.\n * Can be either `START` or `END`. If the value is\n * `START` the alarm is triggerd relative to the event start time.\n * If the value is `END` the alarm is triggerd relative to the event end time\n * \n * @since 4.0.1\n */\n relatesTo(): ICalAlarmRelatesTo | null;\n\n /**\n * Use this method to set to which time alarm trigger relates to.\n * Works only if trigger is a `number`\n * \n * ```javascript\n * const cal = ical();\n * const event = cal.createEvent();\n * const alarm = cal.createAlarm();\n *\n * alarm.trigger(600); // -> 10 minutes before event starts\n * \n * alarm.relatesTo('START'); // -> 10 minutes before event starts\n * alarm.relatesTo('END'); // -> 10 minutes before event ends\n * \n * alarm.trigger(-600); // -> 10 minutes after event starts\n * \n * alarm.relatesTo('START'); // -> 10 minutes after event starts\n * alarm.relatesTo('END'); // -> 10 minutes after event ends\n * ```\n * @since 4.0.1\n */\n relatesTo(relatesTo: ICalAlarmRelatesTo | null): this;\n relatesTo(relatesTo?: ICalAlarmRelatesTo | null): this | ICalAlarmRelatesTo | null {\n if (relatesTo === undefined) {\n return this.data.relatesTo;\n }\n if (!relatesTo) {\n this.data.relatesTo = null;\n return this;\n }\n\n if (!Object.values(ICalAlarmRelatesTo).includes(relatesTo)) {\n throw new Error('`relatesTo` is not correct, must be either `START` or `END`!');\n }\n\n this.data.relatesTo = relatesTo;\n return this;\n }\n\n\n /**\n * Get the trigger time for the alarm. Can either\n * be a date and time value ({@link ICalDateTimeValue}) or\n * a number, which will represent the seconds between\n * alarm and event start. The number is negative, if the\n * alarm is triggered before the event started.\n *\n * @since 0.2.1\n */\n triggerAfter (): number | ICalDateTimeValue;\n\n /**\n * Use this method to set the alarm time. Unlike `trigger`, this time\n * the alarm takes place after the event has started.\n *\n * ```javascript\n * const cal = ical();\n * const event = cal.createEvent();\n * const alarm = cal.createAlarm();\n *\n * alarm.trigger(600); // -> 10 minutes after event starts\n * ```\n *\n * You can use any supported date object, see\n * [readme](https://github.com/sebbo2002/ical-generator#-date-time--timezones)\n * for details about supported values and timezone handling.\n *\n * @since 0.2.1\n */\n triggerAfter (trigger: number | ICalDateTimeValue): this;\n triggerAfter (trigger?: number | ICalDateTimeValue): this | number | ICalDateTimeValue {\n if (trigger === undefined) {\n return this.data.trigger;\n }\n\n return this.trigger(typeof trigger === 'number' ? -1 * trigger : trigger);\n }\n\n\n /**\n * Get the trigger time for the alarm. Can either\n * be a date and time value ({@link ICalDateTimeValue}) or\n * a number, which will represent the seconds between\n * alarm and event start. The number is negative, if the\n * alarm is triggered after the event started.\n *\n * @since 0.2.1\n * @alias trigger\n */\n triggerBefore (trigger: number | ICalDateTimeValue): this;\n\n /**\n * Use this method to set the alarm time.\n *\n * ```javascript\n * const cal = ical();\n * const event = cal.createEvent();\n * const alarm = cal.createAlarm();\n *\n * alarm.trigger(600); // -> 10 minutes before event starts\n * alarm.trigger(new Date()); // -> now\n * ```\n *\n * You can use any supported date object, see\n * [readme](https://github.com/sebbo2002/ical-generator#-date-time--timezones)\n * for details about supported values and timezone handling.\n *\n * @since 0.2.1\n * @alias trigger\n */\n triggerBefore (): number | ICalDateTimeValue;\n triggerBefore (trigger?: number | ICalDateTimeValue): this | number | ICalDateTimeValue {\n if(trigger === undefined) {\n return this.trigger();\n }\n\n return this.trigger(trigger);\n }\n\n\n /**\n * Get Alarm Repetitions\n * @since 0.2.1\n */\n repeat(): ICalAlarmRepeatData | null;\n\n /**\n * Set Alarm Repetitions. Use this to repeat the alarm.\n *\n * ```javascript\n * const cal = ical();\n * const event = cal.createEvent();\n *\n * // repeat the alarm 4 times every 5 minutes…\n * cal.createAlarm({\n * repeat: {\n * times: 4,\n * interval: 300\n * }\n * });\n * ```\n *\n * @since 0.2.1\n */\n repeat(repeat: ICalAlarmRepeatData | null): this;\n repeat (repeat?: ICalAlarmRepeatData | null): this | ICalAlarmRepeatData | null {\n if (repeat === undefined) {\n return this.data.repeat;\n }\n if (!repeat) {\n this.data.repeat = null;\n return this;\n }\n\n if (typeof repeat !== 'object') {\n throw new Error('`repeat` is not correct, must be an object!');\n }\n if (typeof repeat.times !== 'number' || !isFinite(repeat.times)) {\n throw new Error('`repeat.times` is not correct, must be numeric!');\n }\n if (typeof repeat.interval !== 'number' || !isFinite(repeat.interval)) {\n throw new Error('`repeat.interval` is not correct, must be numeric!');\n }\n\n this.data.repeat = repeat;\n return this;\n }\n\n\n /**\n * Get Attachment\n * @since 0.2.1\n */\n attach (): {uri: string, mime: string | null} | null;\n\n /**\n * Set Alarm attachment. Used to set the alarm sound\n * if alarm type is audio. Defaults to \"Basso\".\n *\n * ```javascript\n * const cal = ical();\n * const event = cal.createEvent();\n *\n * event.createAlarm({\n * attach: 'https://example.com/notification.aud'\n * });\n *\n * // OR\n *\n * event.createAlarm({\n * attach: {\n * uri: 'https://example.com/notification.aud',\n * mime: 'audio/basic'\n * }\n * });\n * ```\n *\n * @since 0.2.1\n */\n attach (attachment: {uri: string, mime?: string | null} | string | null): this;\n attach (attachment?: {uri: string, mime?: string | null} | string | null): this | {uri: string, mime: string | null} | null {\n if (attachment === undefined) {\n return this.data.attach;\n }\n if (!attachment) {\n this.data.attach = null;\n return this;\n }\n\n let _attach = null;\n if (typeof attachment === 'string') {\n _attach = {\n uri: attachment,\n mime: null\n };\n }\n else if (typeof attachment === 'object') {\n _attach = {\n uri: attachment.uri,\n mime: attachment.mime || null\n };\n }\n else {\n throw new Error(\n '`attachment` needs to be a valid formed string or an object. See https://sebbo2002.github.io/' +\n 'ical-generator/develop/reference/classes/ICalAlarm.html#attach'\n );\n }\n\n if (!_attach.uri) {\n throw new Error('`attach.uri` is empty!');\n }\n\n this.data.attach = {\n uri: _attach.uri,\n mime: _attach.mime\n };\n return this;\n }\n\n\n /**\n * Get the alarm description. Used to set the alarm message\n * if alarm type is `display`. If the alarm type is `email`, it's\n * used to set the email body. Defaults to the event's summary.\n *\n * @since 0.2.1\n */\n description (): string | null;\n\n /**\n * Set the alarm description. Used to set the alarm message\n * if alarm type is `display`. If the alarm type is `email`, it's\n * used to set the email body. Defaults to the event's summary.\n *\n * @since 0.2.1\n */\n description (description: string | null): this;\n description (description?: string | null): this | string | null {\n if (description === undefined) {\n return this.data.description;\n }\n if (!description) {\n this.data.description = null;\n return this;\n }\n\n this.data.description = description;\n return this;\n }\n\n\n /**\n * Get the alarm summary. Used to set the email subject\n * if alarm type is `email`. Defaults to the event's summary.\n *\n * @since 7.0.0\n */\n summary (): string | null;\n\n /**\n * Set the alarm summary. Used to set the email subject\n * if alarm type is display. Defaults to the event's summary.\n *\n * @since 0.2.1\n */\n summary (summary: string | null): this;\n summary (summary?: string | null): this | string | null {\n if (summary === undefined) {\n return this.data.summary;\n }\n if (!summary) {\n this.data.summary = null;\n return this;\n }\n\n this.data.summary = summary;\n return this;\n }\n\n\n /**\n * Creates a new {@link ICalAttendee} and returns it. Use options to prefill\n * the attendee's attributes. Calling this method without options will create\n * an empty attendee.\n *\n * @since 7.0.0\n */\n createAttendee(data: ICalAttendee | ICalAttendeeData | string): ICalAttendee {\n if (data instanceof ICalAttendee) {\n this.data.attendees.push(data);\n return data;\n }\n if (typeof data === 'string') {\n data = { email: data, ...checkNameAndMail('data', data) };\n }\n\n const attendee = new ICalAttendee(data, this);\n this.data.attendees.push(attendee);\n return attendee;\n }\n\n\n /**\n * Get all attendees\n * @since 7.0.0\n */\n attendees(): ICalAttendee[];\n\n /**\n * Add multiple attendees to your event\n *\n * @since 7.0.0\n */\n attendees(attendees: (ICalAttendee | ICalAttendeeData | string)[]): this;\n attendees(attendees?: (ICalAttendee | ICalAttendeeData | string)[]): this | ICalAttendee[] {\n if (!attendees) {\n return this.data.attendees;\n }\n\n attendees.forEach(attendee => this.createAttendee(attendee));\n return this;\n }\n\n\n /**\n * Set X-* attributes. Woun't filter double attributes,\n * which are also added by another method (e.g. type),\n * so these attributes may be inserted twice.\n *\n * ```javascript\n * alarm.x([\n * {\n * key: \"X-MY-CUSTOM-ATTR\",\n * value: \"1337!\"\n * }\n * ]);\n *\n * alarm.x([\n * [\"X-MY-CUSTOM-ATTR\", \"1337!\"]\n * ]);\n *\n * alarm.x({\n * \"X-MY-CUSTOM-ATTR\": \"1337!\"\n * });\n * ```\n *\n * @since 1.9.0\n */\n x (keyOrArray: {key: string, value: string}[] | [string, string][] | Record): this;\n\n /**\n * Set a X-* attribute. Woun't filter double attributes,\n * which are also added by another method (e.g. type),\n * so these attributes may be inserted twice.\n *\n * ```javascript\n * alarm.x(\"X-MY-CUSTOM-ATTR\", \"1337!\");\n * ```\n *\n * @since 1.9.0\n */\n x (keyOrArray: string, value: string): this;\n\n /**\n * Get all custom X-* attributes.\n * @since 1.9.0\n */\n x (): {key: string, value: string}[];\n x (keyOrArray?: ({key: string, value: string})[] | [string, string][] | Record | string, value?: string): this | void | ({key: string, value: string})[] {\n if(keyOrArray === undefined) {\n return addOrGetCustomAttributes (this.data);\n }\n\n if(typeof keyOrArray === 'string' && typeof value === 'string') {\n addOrGetCustomAttributes (this.data, keyOrArray, value);\n }\n else if(typeof keyOrArray === 'object') {\n addOrGetCustomAttributes (this.data, keyOrArray);\n }\n else {\n throw new Error('Either key or value is not a string!');\n }\n\n return this;\n }\n\n\n /**\n * Return a shallow copy of the alarm's options for JSON stringification.\n * Third party objects like moment.js values are stringified as well. Can\n * be used for persistence.\n *\n * @since 0.2.4\n */\n toJSON (): ICalAlarmJSONData {\n const trigger = this.trigger();\n return Object.assign({}, this.data, {\n trigger: typeof trigger === 'number' ? trigger : toJSON(trigger),\n x: this.x()\n });\n }\n\n\n /**\n * Return generated event as a string.\n *\n * ```javascript\n * const alarm = event.createAlarm();\n * console.log(alarm.toString()); // → BEGIN:VALARM…\n * ```\n */\n toString (): string {\n let g = 'BEGIN:VALARM\\r\\n';\n\n // ACTION\n g += 'ACTION:' + this.data.type.toUpperCase() + '\\r\\n';\n\n if (typeof this.data.trigger === 'number' && this.data.relatesTo === null) {\n if (this.data.trigger > 0) {\n g += 'TRIGGER;RELATED=END:' + toDurationString(this.data.trigger) + '\\r\\n';\n }\n else {\n g += 'TRIGGER:' + toDurationString(this.data.trigger) + '\\r\\n';\n }\n } \n else if (typeof this.data.trigger === 'number') {\n g += 'TRIGGER;RELATED=' + this.data.relatesTo?.toUpperCase() + ':' + toDurationString(this.data.trigger) + '\\r\\n';\n }\n else {\n g += 'TRIGGER;VALUE=DATE-TIME:' + formatDate(this.event.timezone(), this.data.trigger) + '\\r\\n';\n }\n\n // REPEAT\n if (this.data.repeat) {\n if (!this.data.repeat.times) {\n throw new Error('No value for `repeat.times` in ICalAlarm given, but required for `interval`!');\n }\n if (!this.data.repeat.interval) {\n throw new Error('No value for `repeat.interval` in ICalAlarm given, but required for `repeat`!');\n }\n\n g += 'REPEAT:' + this.data.repeat.times + '\\r\\n';\n g += 'DURATION:' + toDurationString(this.data.repeat.interval) + '\\r\\n';\n }\n\n // ATTACH\n if (this.data.type === 'audio' && this.data.attach && this.data.attach.mime) {\n g += 'ATTACH;FMTTYPE=' + escape(this.data.attach.mime, false) + ':' + escape(this.data.attach.uri, false) + '\\r\\n';\n }\n else if (this.data.type === 'audio' && this.data.attach) {\n g += 'ATTACH;VALUE=URI:' + escape(this.data.attach.uri, false) + '\\r\\n';\n }\n else if (this.data.type === 'audio') {\n g += 'ATTACH;VALUE=URI:Basso\\r\\n';\n }\n\n // DESCRIPTION\n if (this.data.type !== 'audio' && this.data.description) {\n g += 'DESCRIPTION:' + escape(this.data.description, false) + '\\r\\n';\n }\n else if (this.data.type !== 'audio') {\n g += 'DESCRIPTION:' + escape(this.event.summary(), false) + '\\r\\n';\n }\n\n // SUMMARY\n if (this.data.type === 'email' && this.data.summary) {\n g += 'SUMMARY:' + escape(this.data.summary, false) + '\\r\\n';\n }\n else if (this.data.type === 'email') {\n g += 'SUMMARY:' + escape(this.event.summary(), false) + '\\r\\n';\n }\n\n // ATTENDEES\n if (this.data.type === 'email') {\n this.data.attendees.forEach(attendee => {\n g += attendee.toString();\n });\n }\n\n // CUSTOM X ATTRIBUTES\n g += generateCustomAttributes(this.data);\n\n g += 'END:VALARM\\r\\n';\n return g;\n }\n}\n","'use strict';\n\n\nimport {escape} from './tools.ts';\n\n\nexport interface ICalCategoryData {\n name: string;\n}\n\n\nexport interface ICalCategoryJSONData {\n name: string;\n}\n\nexport type ICalCategoryInternalData = ICalCategoryJSONData;\n\n\n/**\n * Usually you get an {@link ICalCategory} object like this:\n *\n * ```javascript\n * import ical from 'ical-generator';\n * const calendar = ical();\n * const event = calendar.createEvent();\n * const category = event.createCategory();\n * ```\n *\n * You can also use the {@link ICalCategory} object directly:\n *\n * ```javascript\n * import ical, {ICalCategory} from 'ical-generator';\n * const category = new ICalCategory();\n * event.categories([category]);\n * ```\n */\nexport default class ICalCategory {\n private readonly data: ICalCategoryInternalData;\n\n /**\n * Constructor of {@link ICalCategory}.\n * @param data Category Data\n */\n constructor(data: ICalCategoryData) {\n this.data = {\n name: ''\n };\n\n if(!data.name) {\n throw new Error('No value for `name` in ICalCategory given!');\n }\n\n this.name(data.name);\n }\n\n\n /**\n * Get the category name\n * @since 0.3.0\n */\n name(): string;\n\n /**\n * Set the category name\n * @since 0.3.0\n */\n name(name: string): this;\n name(name?: string): this | string {\n if (name === undefined) {\n return this.data.name;\n }\n\n this.data.name = name;\n return this;\n }\n\n\n /**\n * Return a shallow copy of the category's options for JSON stringification.\n * Can be used for persistence.\n *\n * @since 0.2.4\n */\n toJSON(): ICalCategoryInternalData {\n return Object.assign({}, this.data);\n }\n\n\n /**\n * Return generated category name as a string.\n *\n * ```javascript\n * console.log(category.toString());\n * ```\n */\n toString(): string {\n\n // CN / Name\n return escape(this.data.name, false);\n }\n}\n","/**\n * ical-generator supports [native Date](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date),\n * [moment.js](https://momentjs.com/) (and [moment-timezone](https://momentjs.com/timezone/), [Day.js](https://day.js.org/en/) and\n * [Luxon](https://moment.github.io/luxon/)'s [DateTime](https://moment.github.io/luxon/docs/class/src/datetime.js~DateTime.html)\n * objects. You can also pass a string which is then passed to javascript's Date internally.\n */\nexport type ICalDateTimeValue = Date | ICalMomentStub | ICalMomentTimezoneStub | ICalLuxonDateTimeStub | ICalDayJsStub | string;\n\nexport interface ICalRepeatingOptions {\n freq: ICalEventRepeatingFreq;\n count?: number;\n interval?: number;\n until?: ICalDateTimeValue;\n byDay?: ICalWeekday[] | ICalWeekday;\n byMonth?: number[] | number;\n byMonthDay?: number[] | number;\n bySetPos?: number[] | number;\n exclude?: ICalDateTimeValue[] | ICalDateTimeValue;\n startOfWeek?: ICalWeekday;\n}\n\nexport type ICalLocation = ICalLocationWithTitle | ICalLocationWithoutTitle;\n\nexport interface ICalLocationWithTitle {\n title: string;\n address?: string;\n radius?: number;\n geo?: ICalGeo;\n}\n\nexport interface ICalLocationWithoutTitle {\n geo: ICalGeo;\n}\n\nexport interface ICalGeo {\n lat: number;\n lon: number;\n}\n\nexport interface ICalOrganizer {\n name: string;\n email?: string;\n mailto?: string;\n sentBy?: string;\n}\n\nexport interface ICalDescription {\n plain: string;\n html?: string;\n}\n\nexport interface ICalTimezone {\n name: string | null;\n generator?: (timezone: string) => string|null;\n}\n\nexport interface ICalMomentStub {\n format(format?: string): string;\n clone(): ICalMomentStub;\n utc(): ICalMomentStub;\n toDate(): Date;\n isValid(): boolean;\n toJSON(): string;\n}\n\nexport interface ICalMomentTimezoneStub extends ICalMomentStub {\n clone(): ICalMomentTimezoneStub;\n utc(): ICalMomentTimezoneStub;\n tz(): string | undefined;\n tz(timezone: string): ICalMomentTimezoneStub;\n}\n\nexport interface ICalMomentDurationStub {\n asSeconds(): number;\n}\n\nexport interface ICalLuxonDateTimeStub {\n setZone(zone?: string): ICalLuxonDateTimeStub;\n zone: { type: string; };\n toFormat(fmt: string): string;\n toJSDate(): Date;\n get isValid(): boolean;\n toJSON(): string | null;\n}\n\nexport interface ICalDayJsStub {\n tz(zone?: string): ICalDayJsStub;\n utc(): ICalDayJsStub;\n format(format?: string): string;\n toDate(): Date;\n isValid(): boolean;\n toJSON(): string;\n}\n\nexport interface ICalRRuleStub {\n between(after: Date, before: Date, inc?: boolean, iterator?: (d: Date, len: number) => boolean): Date[];\n toString(): string;\n}\n\nexport enum ICalEventRepeatingFreq {\n SECONDLY = 'SECONDLY',\n MINUTELY = 'MINUTELY',\n HOURLY = 'HOURLY',\n DAILY = 'DAILY',\n WEEKLY = 'WEEKLY',\n MONTHLY = 'MONTHLY',\n YEARLY = 'YEARLY'\n}\n\nexport enum ICalWeekday {\n SU = 'SU',\n MO = 'MO',\n TU = 'TU',\n WE = 'WE',\n TH = 'TH',\n FR = 'FR',\n SA = 'SA'\n}\n","'use strict';\n\nimport {\n addOrGetCustomAttributes,\n checkEnum,\n foldLines,\n generateCustomAttributes,\n isMomentDuration,\n toDurationString\n} from './tools.ts';\nimport ICalEvent, {ICalEventData, ICalEventJSONData} from './event.ts';\nimport { ICalMomentDurationStub, ICalTimezone } from './types.ts';\n\n\nexport interface ICalCalendarData {\n prodId?: ICalCalendarProdIdData | string;\n method?: ICalCalendarMethod | null;\n name?: string | null;\n description?: string | null;\n timezone?: ICalTimezone | string | null;\n source?: string | null;\n url?: string | null;\n scale?: string | null;\n ttl?: number | ICalMomentDurationStub | null;\n events?: (ICalEvent | ICalEventData)[];\n x?: {key: string, value: string}[] | [string, string][] | Record;\n}\n\ninterface ICalCalendarInternalData {\n prodId: string;\n method: ICalCalendarMethod | null;\n name: string | null;\n description: string | null;\n timezone: ICalTimezone | null;\n source: string | null;\n url: string | null;\n scale: string | null;\n ttl: number | null;\n events: ICalEvent[];\n x: [string, string][];\n}\n\nexport interface ICalCalendarJSONData {\n prodId: string;\n method: ICalCalendarMethod | null;\n name: string | null;\n description: string | null;\n timezone: string | null;\n source: string | null;\n url: string | null;\n scale: string | null;\n ttl: number | null;\n events: ICalEventJSONData[];\n x: {key: string, value: string}[];\n}\n\nexport interface ICalCalendarProdIdData {\n company: string;\n product: string;\n language?: string;\n}\n\nexport enum ICalCalendarMethod {\n PUBLISH = 'PUBLISH',\n REQUEST = 'REQUEST',\n REPLY = 'REPLY',\n ADD = 'ADD',\n CANCEL = 'CANCEL',\n REFRESH = 'REFRESH',\n COUNTER = 'COUNTER',\n DECLINECOUNTER = 'DECLINECOUNTER'\n}\n\n\n/**\n * Usually you get an {@link ICalCalendar} object like this:\n * ```javascript\n * import ical from 'ical-generator';\n * const calendar = ical();\n * ```\n *\n * But you can also use the constructor directly like this:\n * ```javascript\n * import {ICalCalendar} from 'ical-generator';\n * const calendar = new ICalCalendar();\n * ```\n */\nexport default class ICalCalendar {\n private readonly data: ICalCalendarInternalData;\n\n /**\n * You can pass options to set up your calendar or use setters to do this.\n *\n * ```javascript\n * * import ical from 'ical-generator';\n *\n * // or use require:\n * // const { default: ical } = require('ical-generator');\n *\n *\n * const cal = ical({name: 'my first iCal'});\n *\n * // is the same as\n *\n * const cal = ical().name('my first iCal');\n *\n * // is the same as\n *\n * const cal = ical();\n * cal.name('sebbo.net');\n * ```\n *\n * `cal.toString()` would then produce the following string:\n * ```text\n * BEGIN:VCALENDAR\n * VERSION:2.0\n * PRODID:-//sebbo.net//ical-generator//EN\n * NAME:sebbo.net\n * X-WR-CALNAME:sebbo.net\n * END:VCALENDAR\n * ```\n *\n * @param data Calendar data\n */\n constructor(data: ICalCalendarData = {}) {\n this.data = {\n prodId: '//sebbo.net//ical-generator//EN',\n method: null,\n name: null,\n description: null,\n timezone: null,\n source: null,\n url: null,\n scale: null,\n ttl: null,\n events: [],\n x: []\n };\n\n if (data.prodId !== undefined) this.prodId(data.prodId);\n if (data.method !== undefined) this.method(data.method);\n if (data.name !== undefined) this.name(data.name);\n if (data.description !== undefined) this.description(data.description);\n if (data.timezone !== undefined) this.timezone(data.timezone);\n if (data.source !== undefined) this.source(data.source);\n if (data.url !== undefined) this.url(data.url);\n if (data.scale !== undefined) this.scale(data.scale);\n if (data.ttl !== undefined) this.ttl(data.ttl);\n if (data.events !== undefined) this.events(data.events);\n if (data.x !== undefined) this.x(data.x);\n }\n\n\n /**\n * Get your feed's prodid. Will always return a string.\n * @since 0.2.0\n */\n prodId(): string;\n\n /**\n * Set your feed's prodid. `prodid` can be either a\n * string like `//sebbo.net//ical-generator//EN` or a\n * valid {@link ICalCalendarProdIdData} object. `language`\n * is optional and defaults to `EN`.\n *\n * ```javascript\n * cal.prodId({\n * company: 'My Company',\n * product: 'My Product',\n * language: 'EN' // optional, defaults to EN\n * });\n * ```\n *\n * `cal.toString()` would then produce the following string:\n * ```text\n * PRODID:-//My Company//My Product//EN\n * ```\n *\n * @since 0.2.0\n */\n prodId(prodId: ICalCalendarProdIdData | string): this;\n prodId(prodId?: ICalCalendarProdIdData | string): this | string {\n if (!prodId) {\n return this.data.prodId;\n }\n\n if (typeof prodId === 'string') {\n this.data.prodId = prodId;\n return this;\n }\n\n if (typeof prodId !== 'object') {\n throw new Error('`prodid` needs to be a string or an object!');\n }\n\n if (!prodId.company) {\n throw new Error('`prodid.company` is a mandatory item!');\n }\n if (!prodId.product) {\n throw new Error('`prodid.product` is a mandatory item!');\n }\n\n const language = (prodId.language || 'EN').toUpperCase();\n this.data.prodId = '//' + prodId.company + '//' + prodId.product + '//' + language;\n return this;\n }\n\n\n /**\n * Get the feed method attribute.\n * See {@link ICalCalendarMethod} for possible results.\n *\n * @since 0.2.8\n */\n method(): ICalCalendarMethod | null;\n\n /**\n * Set the feed method attribute.\n * See {@link ICalCalendarMethod} for available options.\n *\n * #### Typescript Example\n * ```typescript\n * import {ICalCalendarMethod} from 'ical-generator';\n *\n * // METHOD:PUBLISH\n * calendar.method(ICalCalendarMethod.PUBLISH);\n * ```\n *\n * @since 0.2.8\n */\n method(method: ICalCalendarMethod | null): this;\n method(method?: ICalCalendarMethod | null): this | ICalCalendarMethod | null {\n if (method === undefined) {\n return this.data.method;\n }\n if (!method) {\n this.data.method = null;\n return this;\n }\n\n this.data.method = checkEnum(ICalCalendarMethod, method) as ICalCalendarMethod;\n return this;\n }\n\n\n /**\n * Get your feed's name\n * @since 0.2.0\n */\n name(): string | null;\n\n /**\n * Set your feed's name. Is used to fill `NAME`\n * and `X-WR-CALNAME` in your iCal file.\n *\n * ```typescript\n * import ical from 'ical-generator';\n *\n * const cal = ical();\n * cal.name('Next Arrivals');\n *\n * cal.toString();\n * ```\n *\n * ```text\n * BEGIN:VCALENDAR\n * VERSION:2.0\n * PRODID:-//sebbo.net//ical-generator//EN\n * NAME:Next Arrivals\n * X-WR-CALNAME:Next Arrivals\n * END:VCALENDAR\n * ```\n *\n * @since 0.2.0\n */\n name(name: string | null): this;\n name(name?: string | null): this | string | null {\n if (name === undefined) {\n return this.data.name;\n }\n\n this.data.name = name ? String(name) : null;\n return this;\n }\n\n\n /**\n * Get your feed's description\n * @since 0.2.7\n */\n description(): string | null;\n\n /**\n * Set your feed's description\n * @since 0.2.7\n */\n description(description: string | null): this;\n description(description?: string | null): this | string | null {\n if (description === undefined) {\n return this.data.description;\n }\n\n this.data.description = description ? String(description) : null;\n return this;\n }\n\n\n /**\n * Get the current calendar timezone\n * @since 0.2.0\n */\n timezone(): string | null;\n\n /**\n * Use this method to set your feed's timezone. Is used\n * to fill `TIMEZONE-ID` and `X-WR-TIMEZONE` in your iCal export.\n * Please not that all date values are treaded differently, if\n * a timezone was set. See {@link formatDate} for details. If no\n * time zone is specified, all information is output as UTC.\n *\n * ```javascript\n * cal.timezone('America/New_York');\n * ```\n *\n * @see https://github.com/sebbo2002/ical-generator#-date-time--timezones\n * @since 0.2.0\n */\n timezone(timezone: string | null): this;\n\n /**\n * Sets the time zone to be used in this calendar file for all times of all\n * events. Please note that if the time zone is set, ical-generator assumes\n * that all times are already in the correct time zone. Alternatively, a\n * `moment-timezone` or a Luxon object can be passed with `setZone`,\n * ical-generator will then set the time zone itself.\n *\n * For the best support of time zones, a VTimezone entry in the calendar is\n * recommended, which informs the client about the corresponding time zones\n * (daylight saving time, deviation from UTC, etc.). `ical-generator` itself\n * does not have a time zone database, so an external generator is needed here.\n *\n * A VTimezone generator is a function that takes a time zone as a string and\n * returns a VTimezone component according to the ical standard. For example,\n * ical-timezones can be used for this:\n *\n * ```typescript\n * import ical from 'ical-generator';\n * import {getVtimezoneComponent} from '@touch4it/ical-timezones';\n *\n * const cal = ical();\n * cal.timezone({\n * name: 'FOO',\n * generator: getVtimezoneComponent\n * });\n * cal.createEvent({\n * start: new Date(),\n * timezone: 'Europe/London'\n * });\n * ```\n *\n * @see https://github.com/sebbo2002/ical-generator#-date-time--timezones\n * @since 2.0.0\n */\n timezone(timezone: ICalTimezone | string | null): this;\n timezone(timezone?: ICalTimezone | string | null): this | string | null {\n if (timezone === undefined) {\n return this.data.timezone?.name || null;\n }\n\n if(timezone === 'UTC') {\n this.data.timezone = null;\n }\n else if(typeof timezone === 'string') {\n this.data.timezone = {name: timezone};\n }\n else if(timezone === null) {\n this.data.timezone = null;\n }\n else {\n this.data.timezone = timezone;\n }\n\n return this;\n }\n\n\n /**\n * Get current value of the `SOURCE` attribute.\n * @since 2.2.0-develop.1\n */\n source(): string | null;\n\n /**\n * Use this method to set your feed's `SOURCE` attribute.\n * This tells the client where to refresh your feed.\n *\n * ```javascript\n * cal.source('http://example.com/my/original_source.ical');\n * ```\n *\n * ```text\n * SOURCE;VALUE=URI:http://example.com/my/original_source.ical\n * ```\n *\n * @since 2.2.0-develop.1\n */\n source(source: string | null): this;\n source(source?: string | null): this | string | null {\n if (source === undefined) {\n return this.data.source;\n }\n\n this.data.source = source || null;\n return this;\n }\n\n\n /**\n * Get your feed's URL\n * @since 0.2.5\n */\n url(): string | null;\n\n /**\n * Set your feed's URL\n *\n * ```javascript\n * calendar.url('http://example.com/my/feed.ical');\n * ```\n *\n * @since 0.2.5\n */\n url(url: string | null): this;\n url(url?: string | null): this | string | null {\n if (url === undefined) {\n return this.data.url;\n }\n\n this.data.url = url || null;\n return this;\n }\n\n\n /**\n * Get current value of the `CALSCALE` attribute. It will\n * return `null` if no value was set. The iCal standard\n * specifies this as `GREGORIAN` if no value is present.\n *\n * @since 1.8.0\n */\n scale(): string | null;\n\n /**\n * Use this method to set your feed's `CALSCALE` attribute. There is no\n * default value for this property and it will not appear in your iCal\n * file unless set. The iCal standard specifies this as `GREGORIAN` if\n * no value is present.\n *\n * ```javascript\n * cal.scale('gregorian');\n * ```\n *\n * @since 1.8.0\n */\n scale(scale: string | null): this;\n scale(scale?: string | null): this | string | null {\n if (scale === undefined) {\n return this.data.scale;\n }\n\n if (scale === null) {\n this.data.scale = null;\n }\n else {\n this.data.scale = scale.toUpperCase();\n }\n\n return this;\n }\n\n\n /**\n * Get the current ttl duration in seconds\n * @since 0.2.5\n */\n ttl(): number | null;\n\n /**\n * Use this method to set your feed's time to live\n * (in seconds). Is used to fill `REFRESH-INTERVAL` and\n * `X-PUBLISHED-TTL` in your iCal.\n *\n * ```javascript\n * const cal = ical().ttl(60 * 60 * 24); // 1 day\n * ```\n *\n * You can also pass a moment.js duration object. Zero, null\n * or negative numbers will reset the `ttl` attribute.\n *\n * @since 0.2.5\n */\n ttl(ttl: number | ICalMomentDurationStub | null): this;\n ttl(ttl?: number | ICalMomentDurationStub | null): this | number | null {\n if (ttl === undefined) {\n return this.data.ttl;\n }\n\n if (isMomentDuration(ttl)) {\n this.data.ttl = ttl.asSeconds();\n }\n else if (ttl && ttl > 0) {\n this.data.ttl = ttl;\n }\n else {\n this.data.ttl = null;\n }\n\n return this;\n }\n\n\n /**\n * Creates a new {@link ICalEvent} and returns it. Use options to prefill the event's attributes.\n * Calling this method without options will create an empty event.\n *\n * ```javascript\n * import ical from 'ical-generator';\n *\n * // or use require:\n * // const { default: ical } = require('ical-generator');\n *\n * const cal = ical();\n * const event = cal.createEvent({summary: 'My Event'});\n *\n * // overwrite event summary\n * event.summary('Your Event');\n * ```\n *\n * @since 0.2.0\n */\n createEvent(data: ICalEvent | ICalEventData): ICalEvent {\n const event = data instanceof ICalEvent ? data : new ICalEvent(data, this);\n this.data.events.push(event);\n return event;\n }\n\n\n /**\n * Returns all events of this calendar.\n *\n * ```javascript\n * const cal = ical();\n *\n * cal.events([\n * {\n * start: new Date(),\n * end: new Date(new Date().getTime() + 3600000),\n * summary: 'Example Event',\n * description: 'It works ;)',\n * url: 'http://sebbo.net/'\n * }\n * ]);\n *\n * cal.events(); // --> [ICalEvent]\n * ```\n *\n * @since 0.2.0\n */\n events(): ICalEvent[];\n\n /**\n * Add multiple events to your calendar.\n *\n * ```javascript\n * const cal = ical();\n *\n * cal.events([\n * {\n * start: new Date(),\n * end: new Date(new Date().getTime() + 3600000),\n * summary: 'Example Event',\n * description: 'It works ;)',\n * url: 'http://sebbo.net/'\n * }\n * ]);\n *\n * cal.events(); // --> [ICalEvent]\n * ```\n *\n * @since 0.2.0\n */\n events(events: (ICalEvent | ICalEventData)[]): this;\n events(events?: (ICalEvent | ICalEventData)[]): this | ICalEvent[] {\n if (!events) {\n return this.data.events;\n }\n\n events.forEach((e: ICalEvent | ICalEventData) => this.createEvent(e));\n return this;\n }\n\n\n /**\n * Remove all events from the calendar without\n * touching any other data like name or prodId.\n *\n * @since 2.0.0-develop.1\n */\n clear(): this {\n this.data.events = [];\n return this;\n }\n\n\n /**\n * Set X-* attributes. Woun't filter double attributes,\n * which are also added by another method (e.g. busystatus),\n * so these attributes may be inserted twice.\n *\n * ```javascript\n * calendar.x([\n * {\n * key: \"X-MY-CUSTOM-ATTR\",\n * value: \"1337!\"\n * }\n * ]);\n *\n * calendar.x([\n * [\"X-MY-CUSTOM-ATTR\", \"1337!\"]\n * ]);\n *\n * calendar.x({\n * \"X-MY-CUSTOM-ATTR\": \"1337!\"\n * });\n * ```\n *\n * ```text\n * BEGIN:VCALENDAR\n * VERSION:2.0\n * PRODID:-//sebbo.net//ical-generator//EN\n * X-MY-CUSTOM-ATTR:1337!\n * END:VCALENDAR\n * ```\n *\n * @since 1.9.0\n */\n x (keyOrArray: {key: string, value: string}[] | [string, string][] | Record): this;\n\n /**\n * Set a X-* attribute. Woun't filter double attributes,\n * which are also added by another method (e.g. busystatus),\n * so these attributes may be inserted twice.\n *\n * ```javascript\n * calendar.x(\"X-MY-CUSTOM-ATTR\", \"1337!\");\n * ```\n *\n * ```text\n * BEGIN:VCALENDAR\n * VERSION:2.0\n * PRODID:-//sebbo.net//ical-generator//EN\n * X-MY-CUSTOM-ATTR:1337!\n * END:VCALENDAR\n * ```\n *\n * @since 1.9.0\n */\n x (keyOrArray: string, value: string): this;\n\n /**\n * Get all custom X-* attributes.\n * @since 1.9.0\n */\n x (): {key: string, value: string}[];\n x (keyOrArray?: {key: string, value: string}[] | [string, string][] | Record | string, value?: string): this | void | ({key: string, value: string})[] {\n if(keyOrArray === undefined) {\n return addOrGetCustomAttributes (this.data);\n }\n\n if(typeof keyOrArray === 'string' && typeof value === 'string') {\n addOrGetCustomAttributes (this.data, keyOrArray, value);\n }\n else if(typeof keyOrArray === 'object') {\n addOrGetCustomAttributes (this.data, keyOrArray);\n }\n else {\n throw new Error('Either key or value is not a string!');\n }\n\n return this;\n }\n\n\n /**\n * Return a shallow copy of the calendar's options for JSON stringification.\n * Third party objects like moment.js values or RRule objects are stringified\n * as well. Can be used for persistence.\n *\n * ```javascript\n * const cal = ical();\n * const json = JSON.stringify(cal);\n *\n * // later: restore calendar data\n * cal = ical(JSON.parse(json));\n * ```\n *\n * @since 0.2.4\n */\n toJSON(): ICalCalendarJSONData {\n return Object.assign({}, this.data, {\n timezone: this.timezone(),\n events: this.data.events.map(event => event.toJSON()),\n x: this.x()\n });\n }\n\n\n /**\n * Get the number of events added to your calendar\n */\n length(): number {\n return this.data.events.length;\n }\n\n\n /**\n * Return generated calendar as a string.\n *\n * ```javascript\n * const cal = ical();\n * console.log(cal.toString()); // → BEGIN:VCALENDAR…\n * ```\n */\n toString(): string {\n let g = '';\n\n // VCALENDAR and VERSION\n g = 'BEGIN:VCALENDAR\\r\\nVERSION:2.0\\r\\n';\n\n // PRODID\n g += 'PRODID:-' + this.data.prodId + '\\r\\n';\n\n // URL\n if (this.data.url) {\n g += 'URL:' + this.data.url + '\\r\\n';\n }\n\n // SOURCE\n if (this.data.source) {\n g += 'SOURCE;VALUE=URI:' + this.data.source + '\\r\\n';\n }\n\n // CALSCALE\n if (this.data.scale) {\n g += 'CALSCALE:' + this.data.scale + '\\r\\n';\n }\n\n // METHOD\n if (this.data.method) {\n g += 'METHOD:' + this.data.method + '\\r\\n';\n }\n\n // NAME\n if (this.data.name) {\n g += 'NAME:' + this.data.name + '\\r\\n';\n g += 'X-WR-CALNAME:' + this.data.name + '\\r\\n';\n }\n\n // Description\n if (this.data.description) {\n g += 'X-WR-CALDESC:' + this.data.description + '\\r\\n';\n }\n\n // Timezone\n if(this.data.timezone?.generator) {\n const timezones = [...new Set([\n this.timezone(),\n ...this.data.events.map(event => event.timezone())\n ])].filter(tz => tz !== null && !tz.startsWith('/')) as string[];\n\n timezones.forEach(tz => {\n if(!this.data.timezone?.generator) {\n return;\n }\n\n const s = this.data.timezone.generator(tz);\n if(!s) {\n return;\n }\n\n g += s.replace(/\\r\\n/g, '\\n')\n .replace(/\\n/g, '\\r\\n')\n .trim() + '\\r\\n';\n });\n }\n if (this.data.timezone?.name) {\n g += 'TIMEZONE-ID:' + this.data.timezone.name + '\\r\\n';\n g += 'X-WR-TIMEZONE:' + this.data.timezone.name + '\\r\\n';\n }\n\n // TTL\n if (this.data.ttl) {\n g += 'REFRESH-INTERVAL;VALUE=DURATION:' + toDurationString(this.data.ttl) + '\\r\\n';\n g += 'X-PUBLISHED-TTL:' + toDurationString(this.data.ttl) + '\\r\\n';\n }\n\n // Events\n this.data.events.forEach(event => g += event.toString());\n\n // CUSTOM X ATTRIBUTES\n g += generateCustomAttributes(this.data);\n\n g += 'END:VCALENDAR';\n\n return foldLines(g);\n }\n}\n"],"mappings":"0jBAAA,IAAAA,GAAA,GAAAC,EAAAD,GAAA,eAAAE,EAAA,uBAAAC,EAAA,kBAAAC,EAAA,iBAAAC,EAAA,qBAAAC,EAAA,uBAAAC,EAAA,qBAAAC,EAAA,iBAAAC,EAAA,uBAAAC,EAAA,iBAAAC,EAAA,cAAAC,EAAA,wBAAAC,EAAA,mBAAAC,EAAA,2BAAAC,EAAA,oBAAAC,EAAA,0BAAAC,EAAA,gBAAAC,EAAA,YAAAC,GAAA,WAAAC,EAAA,cAAAC,EAAA,eAAAC,EAAA,iBAAAC,IAAA,eAAAC,EAAAxB,ICeO,SAASyB,EAAYC,EAAyBC,EAAsBC,EAAoBC,EAA4B,CAKvH,GAJGH,GAAU,WAAW,GAAG,IACvBA,EAAWA,EAAS,OAAO,CAAC,GAG7B,OAAOC,GAAM,UAAYA,aAAa,KAAM,CAC3C,IAAMG,EAAI,IAAI,KAAKH,CAAC,EAGhB,EAAIG,EAAE,eAAe,EACrB,OAAOA,EAAE,YAAY,EAAI,CAAC,EAAE,SAAS,EAAG,GAAG,EAC3CA,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAG,GAAG,EAS7C,OANGJ,IACC,EAAII,EAAE,YAAY,EACd,OAAOA,EAAE,SAAS,EAAI,CAAC,EAAE,SAAS,EAAG,GAAG,EACxCA,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAG,GAAG,GAG3CF,EACQ,EAGRF,GACC,GAAK,IAAMI,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAG,GAAG,EAC9CA,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAG,GAAG,EACzCA,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAG,GAAG,EAEtC,IAGX,GAAK,IAAMA,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAG,GAAG,EACjDA,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAG,GAAG,EAC5CA,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAG,GAAG,GAC3CD,EAAW,GAAK,KAEd,EACX,SACQE,EAASJ,CAAC,EAAG,CAEjB,IAAMG,EAAIJ,EACHM,EAAWL,CAAC,GAAK,CAACA,EAAE,GAAG,EAAIA,EAAE,MAAM,EAAE,GAAGD,CAAQ,EAAIC,EACpDE,GAAaD,GAAYI,EAAWL,CAAC,GAAKA,EAAE,GAAG,EAAKA,EAAIA,EAAE,IAAI,EAErE,OAAOG,EAAE,OAAO,UAAU,GAAMF,EAE5B,GADA,IAAME,EAAE,OAAO,QAAQ,GAAKD,GAAYH,EAAW,GAAK,KAEhE,SACQO,EAAYN,CAAC,EAAG,CACpB,IAAMG,EAAIJ,EACJC,EAAE,QAAQD,CAAQ,EACjBG,GAAaD,GAAYD,EAAE,KAAK,OAAS,SAAYA,EAAIA,EAAE,QAAQ,KAAK,EAE/E,OAAOG,EAAE,SAAS,UAAU,GAAMF,EAE9B,GADA,IAAME,EAAE,SAAS,QAAQ,GAAKD,GAAYH,EAAW,GAAK,KAElE,KACK,CAGD,IAAII,EAAIH,EACR,GAAGD,EACCI,EAAI,OAAOH,EAAE,IAAO,WAAaA,EAAE,GAAGD,CAAQ,EAAIC,UAE9C,CAAAE,EAIH,GAAI,OAAOF,EAAE,KAAQ,WACtBG,EAAIH,EAAE,IAAI,MAGV,OAAM,IAAI,MAAM,2EAA2E,EAG/F,OAAOG,EAAE,OAAO,UAAU,GAAMF,EAE5B,GADA,IAAME,EAAE,OAAO,QAAQ,GAAKD,GAAYH,EAAW,GAAK,KAEhE,CACJ,CAOO,SAASQ,EAAcR,EAAyBS,EAAkBC,EAAyCC,EAA2E,CACzL,IAAIC,EAAU,GACVT,EAAWQ,GAAW,UAAY,GAEtC,OAAIA,GAAW,WACXC,EAAU,SAAWD,EAAU,SAI/BR,EAAW,IAGRM,EAAWG,EAAU,IAAMb,EAAWC,EAAUU,EAAM,GAAOP,CAAQ,CAChF,CAKO,SAASU,EAAQC,EAAuBC,EAA2B,CACtE,OAAO,OAAOD,CAAG,EAAE,QAAQC,EAAW,SAAW,UAAW,SAAUC,EAAO,CACzE,MAAO,KAAOA,CAClB,CAAC,EAAE,QAAQ,kBAAmB,KAAK,CACvC,CAKO,SAASC,EAAWC,EAAuB,CAC9C,OAAOA,EAAM,MAAM;AAAA,CAAM,EAAE,IAAI,SAAUC,EAAM,CAC3C,IAAIC,EAAS,GACTC,EAAI,EACR,QAAS,EAAI,EAAG,EAAIF,EAAK,OAAQ,IAAK,CAClC,IAAIG,EAAKH,EAAK,OAAO,CAAC,EAGlBG,GAAM,UAAYA,GAAM,WACxBA,GAAMH,EAAK,OAAO,EAAE,CAAC,GAIzB,IAAMI,EAAW,IAAI,YAAY,EAAE,OAAOD,CAAE,EAAE,OAC9CD,GAAKE,EACDF,EAAI,KACJD,GAAU;AAAA,GACVC,EAAIE,GAGRH,GAAUE,CACd,CACA,OAAOF,CACX,CAAC,EAAE,KAAK;AAAA,CAAM,CAClB,CAKO,SAASI,EAA0BC,EAA+BC,EAAmHC,EAAqE,CAC7P,GAAI,MAAM,QAAQD,CAAU,EACxBD,EAAK,EAAIC,EAAW,IAAKE,GAAuD,CAC5E,GAAG,MAAM,QAAQA,CAAC,EACd,OAAOA,EAEX,GAAI,OAAOA,EAAE,KAAQ,UAAY,OAAOA,EAAE,OAAU,SAChD,MAAM,IAAI,MAAM,sCAAsC,EAE1D,GAAIA,EAAE,IAAI,OAAO,EAAG,CAAC,IAAM,KACvB,MAAM,IAAI,MAAM,6BAA6B,EAGjD,MAAO,CAACA,EAAE,IAAKA,EAAE,KAAK,CAC1B,CAAC,UAEI,OAAOF,GAAe,SAC3BD,EAAK,EAAI,OAAO,QAAQC,CAAU,EAAE,IAAI,CAAC,CAACG,EAAKF,CAAK,IAAM,CACtD,GAAI,OAAOE,GAAQ,UAAY,OAAOF,GAAU,SAC5C,MAAM,IAAI,MAAM,sCAAsC,EAE1D,GAAIE,EAAI,OAAO,EAAG,CAAC,IAAM,KACrB,MAAM,IAAI,MAAM,6BAA6B,EAGjD,MAAO,CAACA,EAAKF,CAAK,CACtB,CAAC,UAEI,OAAOD,GAAe,UAAY,OAAOC,GAAU,SAAU,CAClE,GAAID,EAAW,OAAO,EAAG,CAAC,IAAM,KAC5B,MAAM,IAAI,MAAM,6BAA6B,EAGjDD,EAAK,EAAE,KAAK,CAACC,EAAYC,CAAK,CAAC,CACnC,KAEI,QAAOF,EAAK,EAAE,IAAIK,IAAM,CACpB,IAAKA,EAAE,CAAC,EACR,MAAOA,EAAE,CAAC,CACd,EAAE,CAEV,CAEO,SAASC,EAA0BN,EAAuC,CAC7E,IAAMX,EAAMW,EAAK,EACZ,IAAI,CAAC,CAACI,EAAKF,CAAK,IAAME,EAAI,YAAY,EAAI,IAAMhB,EAAOc,EAAO,EAAK,CAAC,EACpE,KAAK;AAAA,CAAM,EAChB,OAAOb,EAAI,OAASA,EAAM;AAAA,EAAS,EACvC,CASO,SAASkB,EAAkBC,EAAmBN,EAA8C,CAC/F,IAAIP,EAA+B,KAEnC,GAAI,OAAOO,GAAU,SAAU,CAC3B,IAAMX,EAAQW,EAAM,MAAM,mBAAmB,EACzCX,EACAI,EAAS,CACL,KAAMJ,EAAM,CAAC,EAAE,KAAK,EACpB,MAAOA,EAAM,CAAC,EAAE,KAAK,CACzB,EAEIW,EAAM,SAAS,GAAG,IACtBP,EAAS,CACL,KAAMO,EAAM,KAAK,EACjB,MAAOA,EAAM,KAAK,CACtB,EAER,MACS,OAAOA,GAAU,WACtBP,EAAS,CACL,KAAMO,EAAM,KACZ,MAAOA,EAAM,MACb,OAAQA,EAAM,OACd,OAAQA,EAAM,MAClB,GAGJ,GAAI,CAACP,GAAU,OAAOO,GAAU,SAC5B,MAAM,IAAI,MACN,IAAMM,EAAY,4HAEtB,EAEC,GAAI,CAACb,EACN,MAAM,IAAI,MACN,IAAMa,EAAY,kJAEtB,EAGJ,GAAI,CAACb,EAAO,KACR,MAAM,IAAI,MAAM,IAAMa,EAAY,kBAAkB,EAGxD,OAAOb,CACX,CAMO,SAASc,EAAUC,EAA8BR,EAAyB,CAC7E,IAAMS,EAAgB,OAAO,OAAOD,CAAI,EAClCE,EAAW,OAAOV,CAAK,EAAE,YAAY,EAE3C,GAAI,CAACU,GAAY,CAACD,EAAc,SAASC,CAAQ,EAC7C,MAAM,IAAI,MAAM,uCAAuCD,EAAc,KAAK,IAAI,CAAC,EAAE,EAGrF,OAAOC,CACX,CAMO,SAASC,EAAUX,EAA0BM,EAAsC,CAGtF,GACKN,aAAiB,MAAQ,MAAMA,EAAM,QAAQ,CAAC,GAC9C,OAAOA,GAAU,UAAY,MAAM,IAAI,KAAKA,CAAK,EAAE,QAAQ,CAAC,EAE7D,MAAM,IAAI,MAAM,KAAKM,CAAS,4BAA4B,EAY9D,GAVGN,aAAiB,MAAQ,OAAOA,GAAU,UAK1CpB,EAAYoB,CAAK,GAAKA,EAAM,UAAY,KAKvCtB,EAASsB,CAAK,GAAKY,GAAQZ,CAAK,IAAMA,EAAM,QAAQ,EACpD,OAAOA,EAGX,MAAM,IAAI,MAAM,KAAKM,CAAS,4BAA4B,CAC9D,CAEO,SAASO,EAAOb,EAAgC,CACnD,OAAG,OAAOA,GAAU,UAAYA,aAAiB,KACtC,IAAI,KAAKA,CAAK,EAGtBpB,EAAYoB,CAAK,EACTA,EAAM,SAAS,EAGnBA,EAAM,OAAO,CACxB,CAEO,SAAStB,EAASsB,EAAmD,CAGxE,OAAOA,GAAS,MAAQA,EAAM,kBAAoB,IACtD,CACO,SAASrB,EAAWqB,EAA2D,CAClF,OAAOtB,EAASsB,CAAK,GAAK,OAAQA,GAAS,OAAOA,EAAM,IAAO,UACnE,CACO,SAASY,GAAQZ,EAAkD,CACtE,OAAO,OAAOA,GAAU,UACpBA,IAAU,MACV,EAAEA,aAAiB,OACnB,CAACtB,EAASsB,CAAK,GACf,CAACpB,EAAYoB,CAAK,CAC1B,CACO,SAASpB,EAAYoB,EAA0D,CAClF,OAAO,OAAOA,GAAU,UAAYA,IAAU,MAAQ,aAAcA,GAAS,OAAOA,EAAM,UAAa,UAC3G,CAEO,SAASc,EAAiBd,EAAiD,CAC9E,OAAOA,IAAU,MAAQ,OAAOA,GAAU,UAAY,cAAeA,GAAS,OAAOA,EAAM,WAAc,UAC7G,CAEO,SAASe,EAAQf,EAAwC,CAC5D,OAAOA,IAAU,MAAQ,OAAOA,GAAU,UAAY,YAAaA,GAAS,OAAOA,EAAM,SAAY,YAAc,OAAOA,EAAM,UAAa,UACjJ,CAEO,SAASgB,EAAOhB,EAAwE,CAC3F,OAAIA,EAGD,OAAOA,GAAU,SACTA,EAGJA,EAAM,OAAO,EANT,IAOf,CAEO,SAASiB,EAAiBC,EAAyB,CACtD,IAAIC,EAAS,GAeb,OAZGD,EAAU,IACTC,EAAS,IACTD,GAAW,IAGfC,GAAU,IAGPD,GAAW,QACVC,GAAU,KAAK,MAAMD,EAAU,KAAK,EAAI,IACxCA,GAAW,OAEZ,CAACA,GAAWC,EAAO,OAAS,IAI/BA,GAAU,IAGPD,GAAW,OACVC,GAAU,KAAK,MAAMD,EAAU,IAAI,EAAI,IACvCA,GAAW,MAIZA,GAAW,KACVC,GAAU,KAAK,MAAMD,EAAU,EAAE,EAAI,IACrCA,GAAW,IAIZA,EAAU,EACTC,GAAUD,EAAU,IAEhBC,EAAO,QAAU,IACrBA,GAAU,OAGPA,CACX,CC9YA,IAAAC,EAAiB,4BCkDV,IAAKC,OACRA,EAAA,MAAQ,QACRA,EAAA,IAAM,kBACNA,EAAA,IAAM,kBACNA,EAAA,IAAM,kBAJEA,OAAA,IAOAC,OACRA,EAAA,SAAW,WACXA,EAAA,UAAY,YACZA,EAAA,SAAW,WACXA,EAAA,UAAY,YACZA,EAAA,YAAc,eALNA,OAAA,IASAC,OACRA,EAAA,WAAa,aACbA,EAAA,MAAQ,QACRA,EAAA,SAAW,WACXA,EAAA,KAAO,OACPA,EAAA,QAAU,UALFA,OAAA,IA2BSC,EAArB,MAAqBC,CAAa,CACb,KACA,OASjB,YAAYC,EAAwBC,EAA+B,CAe/D,GAdA,KAAK,KAAO,CACR,KAAM,KACN,MAAO,GACP,OAAQ,KACR,OAAQ,KACR,OAAQ,KACR,KAAM,kBACN,KAAM,KACN,KAAM,KACN,YAAa,KACb,cAAe,KACf,EAAG,CAAC,CACR,EACA,KAAK,OAASA,EACV,CAAC,KAAK,OACN,MAAM,IAAI,MAAM,0BAA0B,EAE9C,GAAI,CAACD,EAAK,MACN,MAAM,IAAI,MAAM,6CAA6C,EAG7DA,EAAK,OAAS,QAAW,KAAK,KAAKA,EAAK,IAAI,EAC5CA,EAAK,QAAU,QAAW,KAAK,MAAMA,EAAK,KAAK,EAC/CA,EAAK,SAAW,QAAW,KAAK,OAAOA,EAAK,MAAM,EAClDA,EAAK,SAAW,QAAW,KAAK,OAAOA,EAAK,MAAM,EAClDA,EAAK,SAAW,QAAW,KAAK,OAAOA,EAAK,MAAM,EAClDA,EAAK,OAAS,QAAW,KAAK,KAAKA,EAAK,IAAI,EAC5CA,EAAK,OAAS,QAAW,KAAK,KAAKA,EAAK,IAAI,EAC5CA,EAAK,OAAS,QAAW,KAAK,KAAKA,EAAK,IAAI,EAC5CA,EAAK,cAAgB,QAAW,KAAK,YAAYA,EAAK,WAAW,EACjEA,EAAK,gBAAkB,QAAW,KAAK,cAAcA,EAAK,aAAa,EACvEA,EAAK,aAAa,KAAK,YAAYA,EAAK,WAAW,EACnDA,EAAK,eAAe,KAAK,cAAcA,EAAK,aAAa,EACzDA,EAAK,IAAM,QAAW,KAAK,EAAEA,EAAK,CAAC,CAC3C,CAcA,KAAKE,EAA4C,CAC7C,OAAIA,IAAS,OACF,KAAK,KAAK,MAGrB,KAAK,KAAK,KAAOA,GAAQ,KAClB,KACX,CAcA,MAAMC,EAA+B,CACjC,OAAKA,GAIL,KAAK,KAAK,MAAQA,EACX,MAJI,KAAK,KAAK,KAKzB,CAaA,OAAOC,EAA8C,CACjD,OAAIA,IAAW,OACJ,KAAK,KAAK,QAGrB,KAAK,KAAK,OAASA,GAAU,KACtB,KACX,CAcA,OAAOD,EAA6C,CAChD,OAAKA,GAIL,KAAK,KAAK,OAASA,EACZ,MAJI,KAAK,KAAK,MAKzB,CAgBA,KAAKE,EAAkD,CACnD,OAAIA,IAAS,OACF,KAAK,KAAK,MAGrB,KAAK,KAAK,KAAOC,EAAUX,EAAkBU,CAAI,EAC1C,KACX,CAcA,KAAKE,EAA8C,CAC/C,OAAIA,IAAS,OACF,KAAK,KAAK,KAEjBA,IAAS,MACT,KAAK,KAAK,KAAO,KACV,OAGX,KAAK,KAAK,KAAO,EAAQA,EAClB,KACX,CAgBA,OAAOC,EAAsE,CACzE,OAAIA,IAAW,OACJ,KAAK,KAAK,OAEhBA,GAKL,KAAK,KAAK,OAASF,EAAUV,EAAoBY,CAAM,EAChD,OALH,KAAK,KAAK,OAAS,KACZ,KAKf,CAgBA,KAAKC,EAAgE,CACjE,OAAIA,IAAS,OACF,KAAK,KAAK,KAEhBA,GAKL,KAAK,KAAK,KAAOH,EAAUT,EAAkBY,CAAI,EAC1C,OALH,KAAK,KAAK,KAAO,KACV,KAKf,CA6BA,YAAYC,EAA2F,CACnG,OAAIA,IAAgB,OACT,KAAK,KAAK,YAEhBA,GAQF,OAAOA,GAAgB,SACtB,KAAK,KAAK,YAAc,IAAIX,EACxB,CAAE,MAAOW,EAAa,GAAGC,EAAiB,cAAeD,CAAW,CAAE,EACtE,KAAK,MACT,EAEIA,aAAuBX,EAC3B,KAAK,KAAK,YAAcW,EAGxB,KAAK,KAAK,YAAc,IAAIX,EAAaW,EAAa,KAAK,MAAM,EAGrE,KAAK,KAAK,OAAS,YACZ,OArBH,KAAK,KAAK,YAAc,KACpB,KAAK,KAAK,SAAW,cACrB,KAAK,KAAK,OAAS,MAEhB,KAkBf,CAmBA,cAAcE,EAA6F,CACvG,OAAIA,IAAkB,OACX,KAAK,KAAK,eAGhBA,EAGG,OAAOA,GAAkB,SAC7B,KAAK,KAAK,cAAgB,IAAIb,EAC1B,CAAE,MAAOa,EAAe,GAAGD,EAAiB,gBAAiBC,CAAa,CAAE,EAC5E,KAAK,MACT,EAEIA,aAAyBb,EAC7B,KAAK,KAAK,cAAgBa,EAG1B,KAAK,KAAK,cAAgB,IAAIb,EAAaa,EAAe,KAAK,MAAM,EAZrE,KAAK,KAAK,cAAgB,KAevB,KACX,CAkBA,YAAaC,EAAiE,CAC1E,IAAMC,EAAID,aAAmBd,EAAec,EAAU,KAAK,OAAO,eAAeA,CAAO,EACxF,YAAK,YAAYC,CAAC,EAClBA,EAAE,cAAc,IAAI,EACbA,CACX,CAkBA,cAAeD,EAAiE,CAC5E,IAAMC,EAAID,aAAmBd,EAAec,EAAU,KAAK,OAAO,eAAeA,CAAO,EACxF,YAAK,cAAcC,CAAC,EACpBA,EAAE,YAAY,IAAI,EACXA,CACX,CA8CA,EAAGC,EAAsGC,EAAgE,CACrK,GAAGD,IAAe,OACd,OAAOE,EAA0B,KAAK,IAAI,EAG9C,GAAG,OAAOF,GAAe,UAAY,OAAOC,GAAU,SAClDC,EAA0B,KAAK,KAAMF,EAAYC,CAAK,UAElD,OAAOD,GAAe,SAC1BE,EAA0B,KAAK,KAAMF,CAAU,MAG/C,OAAM,IAAI,MAAM,sCAAsC,EAG1D,OAAO,IACX,CASA,QAA+B,CAC3B,OAAO,OAAO,OAAO,CAAC,EAAG,KAAK,KAAM,CAChC,YAAa,KAAK,KAAK,aAAa,MAAM,GAAK,KAC/C,cAAe,KAAK,KAAK,eAAe,MAAM,GAAK,KACnD,EAAG,KAAK,EAAE,CACd,CAAC,CACL,CAUA,UAAoB,CAChB,IAAIG,EAAI,WAER,GAAI,CAAC,KAAK,KAAK,MACX,MAAM,IAAI,MAAM,6CAA6C,EAIjE,OAAAA,GAAK,SAAW,KAAK,KAAK,KAGtB,KAAK,KAAK,OACVA,GAAK,WAAa,KAAK,KAAK,MAI5B,KAAK,KAAK,SACVA,GAAK,aAAe,KAAK,KAAK,QAI9B,KAAK,KAAK,OAAS,OACnBA,GAAK,SAAW,KAAK,KAAK,KAAK,SAAS,EAAE,YAAY,GAItD,KAAK,KAAK,SAAW,OACrBA,GAAK,oBAAsB,KAAK,KAAK,OAAS,KAI9C,KAAK,KAAK,cACVA,GAAK,kBAAoB,KAAK,KAAK,YAAY,MAAM,EAAI,KAIzD,KAAK,KAAK,gBACVA,GAAK,oBAAsB,KAAK,KAAK,cAAc,MAAM,EAAI,KAI7D,KAAK,KAAK,OACVA,GAAK,QAAUC,EAAO,KAAK,KAAK,KAAM,EAAI,EAAI,KAI9C,KAAK,KAAK,OAAS,KAAK,KAAK,SAC7BD,GAAK,UAAYC,EAAO,KAAK,KAAK,MAAO,EAAK,GAI/C,KAAK,KAAK,EAAE,SACXD,GAAK,IAAM,KAAK,KAAK,EAChB,IAAI,CAAC,CAACE,EAAKJ,CAAK,IAAMI,EAAI,YAAY,EAAI,IAAMD,EAAOH,EAAO,EAAK,CAAC,EACpE,KAAK,GAAG,GAGjBE,GAAK,WAAaC,EAAO,KAAK,KAAK,QAAU,KAAK,KAAK,MAAO,EAAK,EAAI;AAAA,EAEhED,CACX,CACJ,ECxlBO,IAAKG,OACRA,EAAA,QAAU,UACVA,EAAA,MAAQ,QACRA,EAAA,MAAQ,QAHAA,OAAA,IAMCC,EAAqB,CAC9B,IAAK,MACL,MAAO,OACX,EAiFqBC,EAArB,KAA+B,CACV,KACA,MASjB,YAAaC,EAAqBC,EAAkB,CAehD,GAdA,KAAK,KAAO,CACR,KAAM,UACN,QAAS,KACT,UAAW,KACX,OAAQ,KACR,SAAU,KACV,OAAQ,KACR,YAAa,KACb,QAAS,KACT,UAAW,CAAC,EACZ,EAAG,CAAC,CACR,EAEA,KAAK,MAAQA,EACT,CAACA,EACD,MAAM,IAAI,MAAM,0BAA0B,EAG1CD,EAAK,OAAS,QAAW,KAAK,KAAKA,EAAK,IAAI,EAC5C,YAAaA,GAAQA,EAAK,UAAY,QAAW,KAAK,QAAQA,EAAK,OAAO,EAC1E,kBAAmBA,GAAQA,EAAK,gBAAkB,QAAW,KAAK,cAAcA,EAAK,aAAa,EAClG,iBAAkBA,GAAQA,EAAK,eAAiB,QAAW,KAAK,aAAaA,EAAK,YAAY,EAC9FA,EAAK,QAAQ,KAAK,OAAOA,EAAK,MAAM,EACpCA,EAAK,SAAW,QAAW,KAAK,OAAOA,EAAK,MAAM,EAClDA,EAAK,cAAgB,QAAW,KAAK,YAAYA,EAAK,WAAW,EACjEA,EAAK,UAAY,QAAW,KAAK,QAAQA,EAAK,OAAO,EACrDA,EAAK,YAAc,QAAW,KAAK,UAAUA,EAAK,SAAS,EAC3DA,EAAK,IAAM,QAAW,KAAK,EAAEA,EAAK,CAAC,CAC3C,CAeA,KAAME,EAA4C,CAC9C,GAAIA,IAAS,OACT,OAAO,KAAK,KAAK,KAErB,GAAI,CAACA,GAAQ,CAAC,OAAO,KAAKL,CAAa,EAAE,SAASK,CAAI,EAClD,MAAM,IAAI,MAAM,6DAA6D,EAGjF,YAAK,KAAK,KAAOA,EACV,IACX,CAiCA,QAASC,EAAgF,CAGrF,GAAIA,IAAY,QAAa,OAAO,KAAK,KAAK,SAAY,SACtD,MAAO,GAAK,KAAK,KAAK,QAE1B,GAAIA,IAAY,OACZ,OAAO,KAAK,KAAK,QAIrB,GAAI,OAAOA,GAAY,UAAY,SAASA,CAAO,EAC/C,KAAK,KAAK,QAAU,GAAKA,MAExB,IAAG,CAACA,GAAW,OAAOA,GAAY,SACnC,MAAM,IAAI,MAAM,wEAAwE,EAGxF,KAAK,KAAK,QAAUC,EAAUD,EAAS,SAAS,EAGpD,OAAO,IACX,CAkCA,UAAUE,EAAyE,CAC/E,GAAIA,IAAc,OACd,OAAO,KAAK,KAAK,UAErB,GAAI,CAACA,EACD,YAAK,KAAK,UAAY,KACf,KAGX,GAAI,CAAC,OAAO,OAAOP,CAAkB,EAAE,SAASO,CAAS,EACrD,MAAM,IAAI,MAAM,8DAA8D,EAGlF,YAAK,KAAK,UAAYA,EACf,IACX,CAiCA,aAAcF,EAAyE,CACnF,OAAIA,IAAY,OACL,KAAK,KAAK,QAGd,KAAK,QAAQ,OAAOA,GAAY,SAAW,GAAKA,EAAUA,CAAO,CAC5E,CAmCA,cAAeA,EAAyE,CACpF,OAAGA,IAAY,OACJ,KAAK,QAAQ,EAGjB,KAAK,QAAQA,CAAO,CAC/B,CA4BA,OAAQG,EAAwE,CAC5E,GAAIA,IAAW,OACX,OAAO,KAAK,KAAK,OAErB,GAAI,CAACA,EACD,YAAK,KAAK,OAAS,KACZ,KAGX,GAAI,OAAOA,GAAW,SAClB,MAAM,IAAI,MAAM,6CAA6C,EAEjE,GAAI,OAAOA,EAAO,OAAU,UAAY,CAAC,SAASA,EAAO,KAAK,EAC1D,MAAM,IAAI,MAAM,iDAAiD,EAErE,GAAI,OAAOA,EAAO,UAAa,UAAY,CAAC,SAASA,EAAO,QAAQ,EAChE,MAAM,IAAI,MAAM,oDAAoD,EAGxE,YAAK,KAAK,OAASA,EACZ,IACX,CAkCA,OAAQC,EAAoH,CACxH,GAAIA,IAAe,OACf,OAAO,KAAK,KAAK,OAErB,GAAI,CAACA,EACD,YAAK,KAAK,OAAS,KACZ,KAGX,IAAIC,EAAU,KACd,GAAI,OAAOD,GAAe,SACtBC,EAAU,CACN,IAAKD,EACL,KAAM,IACV,UAEK,OAAOA,GAAe,SAC3BC,EAAU,CACN,IAAKD,EAAW,IAChB,KAAMA,EAAW,MAAQ,IAC7B,MAGA,OAAM,IAAI,MACN,6JAEJ,EAGJ,GAAI,CAACC,EAAQ,IACT,MAAM,IAAI,MAAM,wBAAwB,EAG5C,YAAK,KAAK,OAAS,CACf,IAAKA,EAAQ,IACb,KAAMA,EAAQ,IAClB,EACO,IACX,CAoBA,YAAaC,EAAmD,CAC5D,OAAIA,IAAgB,OACT,KAAK,KAAK,YAEhBA,GAKL,KAAK,KAAK,YAAcA,EACjB,OALH,KAAK,KAAK,YAAc,KACjB,KAKf,CAkBA,QAASC,EAA+C,CACpD,OAAIA,IAAY,OACL,KAAK,KAAK,QAEhBA,GAKL,KAAK,KAAK,QAAUA,EACb,OALH,KAAK,KAAK,QAAU,KACb,KAKf,CAUA,eAAeV,EAA8D,CACzE,GAAIA,aAAgBW,EAChB,YAAK,KAAK,UAAU,KAAKX,CAAI,EACtBA,EAEP,OAAOA,GAAS,WAChBA,EAAO,CAAE,MAAOA,EAAM,GAAGY,EAAiB,OAAQZ,CAAI,CAAE,GAG5D,IAAMa,EAAW,IAAIF,EAAaX,EAAM,IAAI,EAC5C,YAAK,KAAK,UAAU,KAAKa,CAAQ,EAC1BA,CACX,CAeA,UAAUC,EAAiF,CACvF,OAAKA,GAILA,EAAU,QAAQD,GAAY,KAAK,eAAeA,CAAQ,CAAC,EACpD,MAJI,KAAK,KAAK,SAKzB,CA+CA,EAAGE,EAAsGC,EAAgE,CACrK,GAAGD,IAAe,OACd,OAAOE,EAA0B,KAAK,IAAI,EAG9C,GAAG,OAAOF,GAAe,UAAY,OAAOC,GAAU,SAClDC,EAA0B,KAAK,KAAMF,EAAYC,CAAK,UAElD,OAAOD,GAAe,SAC1BE,EAA0B,KAAK,KAAMF,CAAU,MAG/C,OAAM,IAAI,MAAM,sCAAsC,EAG1D,OAAO,IACX,CAUA,QAA6B,CACzB,IAAMZ,EAAU,KAAK,QAAQ,EAC7B,OAAO,OAAO,OAAO,CAAC,EAAG,KAAK,KAAM,CAChC,QAAS,OAAOA,GAAY,SAAWA,EAAUe,EAAOf,CAAO,EAC/D,EAAG,KAAK,EAAE,CACd,CAAC,CACL,CAWA,UAAoB,CAChB,IAAIgB,EAAI;AAAA,EAqBR,GAlBAA,GAAK,UAAY,KAAK,KAAK,KAAK,YAAY,EAAI;AAAA,EAE5C,OAAO,KAAK,KAAK,SAAY,UAAY,KAAK,KAAK,YAAc,KAC7D,KAAK,KAAK,QAAU,EACpBA,GAAK,uBAAyBC,EAAiB,KAAK,KAAK,OAAO,EAAI;AAAA,EAGpED,GAAK,WAAaC,EAAiB,KAAK,KAAK,OAAO,EAAI;AAAA,EAGvD,OAAO,KAAK,KAAK,SAAY,SAClCD,GAAK,mBAAqB,KAAK,KAAK,WAAW,YAAY,EAAI,IAAMC,EAAiB,KAAK,KAAK,OAAO,EAAI;AAAA,EAG3GD,GAAK,2BAA6BE,EAAW,KAAK,MAAM,SAAS,EAAG,KAAK,KAAK,OAAO,EAAI;AAAA,EAIzF,KAAK,KAAK,OAAQ,CAClB,GAAI,CAAC,KAAK,KAAK,OAAO,MAClB,MAAM,IAAI,MAAM,8EAA8E,EAElG,GAAI,CAAC,KAAK,KAAK,OAAO,SAClB,MAAM,IAAI,MAAM,+EAA+E,EAGnGF,GAAK,UAAY,KAAK,KAAK,OAAO,MAAQ;AAAA,EAC1CA,GAAK,YAAcC,EAAiB,KAAK,KAAK,OAAO,QAAQ,EAAI;AAAA,CACrE,CAGA,OAAI,KAAK,KAAK,OAAS,SAAW,KAAK,KAAK,QAAU,KAAK,KAAK,OAAO,KACnED,GAAK,kBAAoBG,EAAO,KAAK,KAAK,OAAO,KAAM,EAAK,EAAI,IAAMA,EAAO,KAAK,KAAK,OAAO,IAAK,EAAK,EAAI;AAAA,EAEvG,KAAK,KAAK,OAAS,SAAW,KAAK,KAAK,OAC7CH,GAAK,oBAAsBG,EAAO,KAAK,KAAK,OAAO,IAAK,EAAK,EAAI;AAAA,EAE5D,KAAK,KAAK,OAAS,UACxBH,GAAK;AAAA,GAIL,KAAK,KAAK,OAAS,SAAW,KAAK,KAAK,YACxCA,GAAK,eAAiBG,EAAO,KAAK,KAAK,YAAa,EAAK,EAAI;AAAA,EAExD,KAAK,KAAK,OAAS,UACxBH,GAAK,eAAiBG,EAAO,KAAK,MAAM,QAAQ,EAAG,EAAK,EAAI;AAAA,GAI5D,KAAK,KAAK,OAAS,SAAW,KAAK,KAAK,QACxCH,GAAK,WAAaG,EAAO,KAAK,KAAK,QAAS,EAAK,EAAI;AAAA,EAEhD,KAAK,KAAK,OAAS,UACxBH,GAAK,WAAaG,EAAO,KAAK,MAAM,QAAQ,EAAG,EAAK,EAAI;AAAA,GAIxD,KAAK,KAAK,OAAS,SACnB,KAAK,KAAK,UAAU,QAAQT,GAAY,CACpCM,GAAKN,EAAS,SAAS,CAC3B,CAAC,EAILM,GAAKI,EAAyB,KAAK,IAAI,EAEvCJ,GAAK;AAAA,EACEA,CACX,CACJ,ECrsBA,IAAqBK,EAArB,KAAkC,CACb,KAMjB,YAAYC,EAAwB,CAKhC,GAJA,KAAK,KAAO,CACR,KAAM,EACV,EAEG,CAACA,EAAK,KACL,MAAM,IAAI,MAAM,4CAA4C,EAGhE,KAAK,KAAKA,EAAK,IAAI,CACvB,CAcA,KAAKC,EAA8B,CAC/B,OAAIA,IAAS,OACF,KAAK,KAAK,MAGrB,KAAK,KAAK,KAAOA,EACV,KACX,CASA,QAAmC,CAC/B,OAAO,OAAO,OAAO,CAAC,EAAG,KAAK,IAAI,CACtC,CAUA,UAAmB,CAGf,OAAOC,EAAO,KAAK,KAAK,KAAM,EAAK,CACvC,CACJ,ECDO,IAAKC,OACRA,EAAA,SAAW,WACXA,EAAA,SAAW,WACXA,EAAA,OAAS,SACTA,EAAA,MAAQ,QACRA,EAAA,OAAS,SACTA,EAAA,QAAU,UACVA,EAAA,OAAS,SAPDA,OAAA,IAUAC,OACRA,EAAA,GAAK,KACLA,EAAA,GAAK,KACLA,EAAA,GAAK,KACLA,EAAA,GAAK,KACLA,EAAA,GAAK,KACLA,EAAA,GAAK,KACLA,EAAA,GAAK,KAPGA,OAAA,IJ7EL,IAAKC,OACRA,EAAA,UAAY,YACZA,EAAA,UAAY,YACZA,EAAA,UAAY,YAHJA,OAAA,IAMAC,OACRA,EAAA,KAAO,OACPA,EAAA,UAAY,YACZA,EAAA,KAAO,OACPA,EAAA,IAAM,MAJEA,OAAA,IAOAC,OACRA,EAAA,YAAc,cACdA,EAAA,OAAS,SAFDA,OAAA,IAKAC,OACRA,EAAA,OAAS,SACTA,EAAA,QAAU,UACVA,EAAA,aAAe,eAHPA,OAAA,IAqHSC,EAArB,KAA+B,CACV,KACA,SASjB,YAAYC,EAAqBC,EAAwB,CAgCrD,GA/BA,KAAK,KAAO,CACR,MAAI,EAAAC,SAAK,EACT,SAAU,EACV,MAAO,IAAI,KACX,IAAK,KACL,aAAc,KACd,SAAU,KACV,MAAO,IAAI,KACX,OAAQ,GACR,SAAU,GACV,UAAW,KACX,QAAS,GACT,SAAU,KACV,YAAa,KACb,UAAW,KACX,UAAW,CAAC,EACZ,OAAQ,CAAC,EACT,WAAY,CAAC,EACb,OAAQ,KACR,WAAY,KACZ,SAAU,KACV,IAAK,KACL,YAAa,CAAC,EACd,aAAc,KACd,QAAS,KACT,aAAc,KACd,MAAO,KACP,EAAG,CAAC,CACR,EAEA,KAAK,SAAWD,EACZ,CAACA,EACD,MAAM,IAAI,MAAM,6BAA6B,EAG7CD,EAAK,IAAI,KAAK,GAAGA,EAAK,EAAE,EACxBA,EAAK,WAAa,QAAW,KAAK,SAASA,EAAK,QAAQ,EACxDA,EAAK,OAAO,KAAK,MAAMA,EAAK,KAAK,EACjCA,EAAK,MAAQ,QAAW,KAAK,IAAIA,EAAK,GAAG,EACzCA,EAAK,eAAiB,QAAW,KAAK,aAAaA,EAAK,YAAY,EACpEA,EAAK,WAAa,QAAW,KAAK,SAASA,EAAK,QAAQ,EACxDA,EAAK,QAAU,QAAW,KAAK,MAAMA,EAAK,KAAK,EAC/CA,EAAK,SAAW,QAAW,KAAK,OAAOA,EAAK,MAAM,EAClDA,EAAK,WAAa,QAAW,KAAK,SAASA,EAAK,QAAQ,EACxDA,EAAK,YAAc,QAAW,KAAK,UAAUA,EAAK,SAAS,EAC3DA,EAAK,UAAY,QAAW,KAAK,QAAQA,EAAK,OAAO,EACrDA,EAAK,WAAa,QAAW,KAAK,SAASA,EAAK,QAAQ,EACxDA,EAAK,cAAgB,QAAW,KAAK,YAAYA,EAAK,WAAW,EACjEA,EAAK,YAAc,QAAW,KAAK,UAAUA,EAAK,SAAS,EAC3DA,EAAK,YAAc,QAAW,KAAK,UAAUA,EAAK,SAAS,EAC3DA,EAAK,SAAW,QAAW,KAAK,OAAOA,EAAK,MAAM,EAClDA,EAAK,aAAe,QAAW,KAAK,WAAWA,EAAK,UAAU,EAC9DA,EAAK,SAAW,QAAW,KAAK,OAAOA,EAAK,MAAM,EAClDA,EAAK,aAAe,QAAW,KAAK,WAAWA,EAAK,UAAU,EAC9DA,EAAK,WAAa,QAAW,KAAK,SAASA,EAAK,QAAQ,EACxDA,EAAK,MAAQ,QAAW,KAAK,IAAIA,EAAK,GAAG,EACzCA,EAAK,cAAgB,QAAW,KAAK,YAAYA,EAAK,WAAW,EACjEA,EAAK,eAAiB,QAAW,KAAK,aAAaA,EAAK,YAAY,EACpEA,EAAK,UAAY,QAAW,KAAK,QAAQA,EAAK,OAAO,EACrDA,EAAK,eAAiB,QAAW,KAAK,aAAaA,EAAK,YAAY,EACpEA,EAAK,QAAU,QAAW,KAAK,MAAMA,EAAK,KAAK,EAC/CA,EAAK,IAAM,QAAW,KAAK,EAAEA,EAAK,CAAC,CAC3C,CAeA,GAAGG,EAAqC,CACpC,OAAIA,IAAO,OACA,KAAK,KAAK,IAGrB,KAAK,KAAK,GAAK,OAAOA,CAAE,EACjB,KACX,CAiBA,IAAIA,EAAqC,CACrC,OAAOA,IAAO,OAAY,KAAK,GAAG,EAAI,KAAK,GAAGA,CAAE,CACpD,CAkBA,SAASC,EAAkC,CACvC,GAAIA,IAAa,OACb,OAAO,KAAK,KAAK,SAGrB,IAAMC,EAAI,SAAS,OAAOD,CAAQ,EAAG,EAAE,EACvC,GAAI,MAAMC,CAAC,EACP,MAAM,IAAI,MAAM,8BAA8B,EAGlD,YAAK,KAAK,SAAWD,EACd,IACX,CAgDA,MAAME,EAAqD,CACvD,OAAIA,IAAU,QACV,KAAK,0BAA0B,EACxB,KAAK,KAAK,QAGrB,KAAK,KAAK,MAAQC,EAAUD,EAAO,OAAO,EACnC,KACX,CAkBA,IAAIE,EAAiE,CACjE,OAAIA,IAAQ,QACR,KAAK,0BAA0B,EACxB,KAAK,KAAK,KAEjBA,IAAQ,MACR,KAAK,KAAK,IAAM,KACT,OAGX,KAAK,KAAK,IAAMD,EAAUC,EAAK,KAAK,EAC7B,KACX,CAMQ,2BAAkC,CACtC,GAAI,KAAK,KAAK,OAAS,KAAK,KAAK,KAAOC,EAAO,KAAK,KAAK,KAAK,EAAE,QAAQ,EAAIA,EAAO,KAAK,KAAK,GAAG,EAAE,QAAQ,EAAG,CACzG,IAAM,EAAI,KAAK,KAAK,MACpB,KAAK,KAAK,MAAQ,KAAK,KAAK,IAC5B,KAAK,KAAK,IAAM,CACpB,CACJ,CAgBA,aAAaC,EAA0E,CACnF,OAAIA,IAAiB,OACV,KAAK,KAAK,aAEjBA,IAAiB,MACjB,KAAK,KAAK,aAAe,KAClB,OAGX,KAAK,KAAK,aAAeH,EAAUG,EAAc,cAAc,EACxD,KACX,CAiCA,SAASC,EAAgD,CACrD,OAAIA,IAAa,QAAa,KAAK,KAAK,WAAa,KAC1C,KAAK,KAAK,SAEjBA,IAAa,OACN,KAAK,SAAS,SAAS,GAGlC,KAAK,KAAK,SAAWA,GAAYA,IAAa,MAAQA,EAAS,SAAS,EAAI,KACxE,KAAK,KAAK,WACV,KAAK,KAAK,SAAW,IAGlB,KACX,CAgBA,MAAMC,EAAqD,CACvD,OAAIA,IAAU,OACH,KAAK,KAAK,OAGrB,KAAK,KAAK,MAAQL,EAAUK,EAAO,OAAO,EACnC,KACX,CAkBA,UAAUA,EAAqD,CAC3D,OAAIA,IAAU,OACH,KAAK,MAAM,EAGf,KAAK,MAAMA,CAAK,CAC3B,CAgDA,OAAOC,EAAkC,CACrC,OAAIA,IAAW,OACJ,KAAK,KAAK,QAGrB,KAAK,KAAK,OAAS,EAAQA,EACpB,KACX,CA4CA,SAASC,EAAoC,CACzC,OAAIA,IAAa,OACN,KAAK,KAAK,UAGrB,KAAK,KAAK,SAAW,EAAQA,EACzB,KAAK,KAAK,WACV,KAAK,KAAK,SAAW,MAGlB,KACX,CAuHA,UAAUC,EAAqI,CAC3I,GAAIA,IAAc,OACd,OAAO,KAAK,KAAK,UAErB,GAAI,CAACA,EACD,YAAK,KAAK,UAAY,KACf,KAEX,GAAGC,EAAQD,CAAS,GAAK,OAAOA,GAAc,SAC1C,YAAK,KAAK,UAAYA,EACf,KAOX,GAJA,KAAK,KAAK,UAAY,CAClB,KAAME,EAAUC,EAAwBH,EAAU,IAAI,CAC1D,EAEIA,EAAU,MAAO,CACjB,GAAI,CAAC,SAASA,EAAU,KAAK,EACzB,MAAM,IAAI,MAAM,4CAA4C,EAGhE,KAAK,KAAK,UAAU,MAAQA,EAAU,KAC1C,CAEA,GAAIA,EAAU,SAAU,CACpB,GAAI,CAAC,SAASA,EAAU,QAAQ,EAC5B,MAAM,IAAI,MAAM,+CAA+C,EAGnE,KAAK,KAAK,UAAU,SAAWA,EAAU,QAC7C,CAMA,GAJIA,EAAU,QAAU,SACpB,KAAK,KAAK,UAAU,MAAQR,EAAUQ,EAAU,MAAO,iBAAiB,GAGxEA,EAAU,MAAO,CACjB,IAAMI,EAAa,MAAM,QAAQJ,EAAU,KAAK,EAAIA,EAAU,MAAQ,CAACA,EAAU,KAAK,EACtF,KAAK,KAAK,UAAU,MAAQI,EAAW,IAAIC,GAAOH,EAAUI,EAAaD,CAAG,CAAgB,CAChG,CAEA,GAAIL,EAAU,QAAS,CACnB,IAAMO,EAAe,MAAM,QAAQP,EAAU,OAAO,EAAIA,EAAU,QAAU,CAACA,EAAU,OAAO,EAC9F,KAAK,KAAK,UAAU,QAAUO,EAAa,IAAIC,GAAS,CACpD,GAAI,OAAOA,GAAU,UAAYA,EAAQ,GAAKA,EAAQ,GAClD,MAAM,IAAI,MAAM,+CAAiDA,EAAQ,IAAI,EAGjF,OAAOA,CACX,CAAC,CACL,CAEA,GAAIR,EAAU,WAAY,CACtB,IAAMS,EAAkB,MAAM,QAAQT,EAAU,UAAU,EAAIA,EAAU,WAAa,CAACA,EAAU,UAAU,EAG1G,KAAK,KAAK,UAAU,WAAaS,EAAgB,IAAIC,GAAY,CAC7D,GAAI,OAAOA,GAAa,UAAYA,EAAW,KAAOA,EAAW,IAAMA,IAAa,EAChF,MAAM,IAAI,MAAM,kDAAoDA,EAAW,IAAI,EAGvF,OAAOA,CACX,CAAC,CACL,CAEA,GAAIV,EAAU,SAAU,CACpB,GAAI,CAAC,KAAK,KAAK,UAAU,MACrB,KAAM,kEAEV,IAAMW,EAAgB,MAAM,QAAQX,EAAU,QAAQ,EAAIA,EAAU,SAAW,CAACA,EAAU,QAAQ,EAClG,KAAK,KAAK,UAAU,SAAWW,EAAc,IAAIC,GAAY,CACzD,GAAI,OAAOA,GAAa,UAAYA,EAAW,MAAQA,EAAW,KAAOA,IAAa,EAClF,KAAM,gDAAkDA,EAAW,KAEvE,OAAOA,CACX,CAAC,CACL,CAEA,GAAIZ,EAAU,QAAS,CACnB,IAAMa,EAAe,MAAM,QAAQb,EAAU,OAAO,EAAIA,EAAU,QAAU,CAACA,EAAU,OAAO,EAC9F,KAAK,KAAK,UAAU,QAAUa,EAAa,IAAI,CAACC,EAAS,IAC9CtB,EAAUsB,EAAS,qBAAqB,CAAC,GAAG,CACtD,CACL,CAEA,OAAId,EAAU,cACV,KAAK,KAAK,UAAU,YAAcE,EAAUI,EAAaN,EAAU,WAAW,GAG3E,IACX,CAeA,QAAQe,EAAiC,CACrC,OAAIA,IAAY,OACL,KAAK,KAAK,SAGrB,KAAK,KAAK,QAAUA,EAAU,OAAOA,CAAO,EAAI,GACzC,KACX,CAsDA,SAASC,EAAqE,CAC1E,GAAIA,IAAa,OACb,OAAO,KAAK,KAAK,SAErB,GAAI,OAAOA,GAAa,SACpB,YAAK,KAAK,SAAW,CACjB,MAAOA,CACX,EACO,KAEX,GAAIA,IACC,UAAWA,GAAY,CAACA,EAAS,OACjCA,GAAU,MAAQ,CAAC,SAASA,EAAS,IAAI,GAAG,GAAK,CAAC,SAASA,EAAS,IAAI,GAAG,IAC3E,EAAE,UAAWA,IAAa,CAACA,GAAU,KAEtC,MAAM,IAAI,MACN,wIAEJ,EAGJ,YAAK,KAAK,SAAWA,GAAY,KAC1B,IACX,CA8BA,YAAYC,EAA8E,CACtF,OAAIA,IAAgB,OACT,KAAK,KAAK,YAEjBA,IAAgB,MAChB,KAAK,KAAK,YAAc,KACjB,OAGP,OAAOA,GAAgB,SACvB,KAAK,KAAK,YAAc,CAAC,MAAOA,CAAW,EAG3C,KAAK,KAAK,YAAcA,EAErB,KACX,CAqCA,UAAUC,EAAwE,CAC9E,OAAIA,IAAc,OACP,KAAK,KAAK,UAEjBA,IAAc,MACd,KAAK,KAAK,UAAY,KACf,OAGX,KAAK,KAAK,UAAYC,EAAiB,YAAaD,CAAS,EACtD,KACX,CAiDA,eAAejC,EAA8D,CACzE,GAAIA,aAAgBmC,EAChB,YAAK,KAAK,UAAU,KAAKnC,CAAI,EACtBA,EAEP,OAAOA,GAAS,WAChBA,EAAO,CAAE,MAAOA,EAAM,GAAGkC,EAAiB,OAAQlC,CAAI,CAAE,GAG5D,IAAMoC,EAAW,IAAID,EAAanC,EAAM,IAAI,EAC5C,YAAK,KAAK,UAAU,KAAKoC,CAAQ,EAC1BA,CACX,CA0BA,UAAUC,EAAiF,CACvF,OAAKA,GAILA,EAAU,QAAQD,GAAY,KAAK,eAAeA,CAAQ,CAAC,EACpD,MAJI,KAAK,KAAK,SAKzB,CAsBA,YAAYpC,EAA4C,CACpD,IAAMsC,EAAQtC,aAAgBuC,EAAYvC,EAAO,IAAIuC,EAAUvC,EAAM,IAAI,EACzE,YAAK,KAAK,OAAO,KAAKsC,CAAK,EACpBA,CACX,CA0BA,OAAOE,EAA4D,CAC/D,OAAKA,GAILA,EAAO,QAASF,GAAqC,KAAK,YAAYA,CAAK,CAAC,EACrE,MAJI,KAAK,KAAK,MAKzB,CAoBA,eAAetC,EAAqD,CAChE,IAAMyC,EAAWzC,aAAgB0C,EAAe1C,EAAO,IAAI0C,EAAa1C,CAAI,EAC5E,YAAK,KAAK,WAAW,KAAKyC,CAAQ,EAC3BA,CACX,CA0BA,WAAWE,EAAyE,CAChF,OAAKA,GAILA,EAAW,QAAQF,GAAY,KAAK,eAAeA,CAAQ,CAAC,EACrD,MAJI,KAAK,KAAK,UAKzB,CAoBA,OAAOG,EAAgE,CACnE,OAAIA,IAAW,OACJ,KAAK,KAAK,OAEjBA,IAAW,MACX,KAAK,KAAK,OAAS,KACZ,OAGX,KAAK,KAAK,OAAS3B,EAAUtB,EAAiBiD,CAAM,EAC7C,KACX,CAsBA,WAAWC,EAA4E,CACnF,OAAIA,IAAe,OACR,KAAK,KAAK,WAEjBA,IAAe,MACf,KAAK,KAAK,WAAa,KAChB,OAGX,KAAK,KAAK,WAAa5B,EAAUrB,EAAqBiD,CAAU,EACzD,KACX,CAoBA,SAASC,EAAgD,CACrD,GAAIA,IAAa,OACb,OAAO,KAAK,KAAK,SAErB,GAAIA,IAAa,KACb,YAAK,KAAK,SAAW,KACd,KAGX,GAAGA,EAAW,GAAKA,EAAW,EAC1B,MAAM,IAAI,MAAM,6DAAmD,EAGvE,YAAK,KAAK,SAAW,KAAK,MAAMA,CAAQ,EACjC,IACX,CAcA,IAAIC,EAA2C,CAC3C,OAAIA,IAAQ,OACD,KAAK,KAAK,KAGrB,KAAK,KAAK,IAAMA,EAAM,OAAOA,CAAG,EAAI,KAC7B,KACX,CAiBA,iBAAiBA,EAAmB,CAChC,YAAK,KAAK,YAAY,KAAKA,CAAG,EACvB,IACX,CA0BA,YAAYC,EAAyC,CACjD,OAAKA,GAILA,EAAY,QAASC,GAAuB,KAAK,iBAAiBA,CAAU,CAAC,EACtE,MAJI,KAAK,KAAK,WAKzB,CAyBA,aAAaC,EAAkF,CAC3F,OAAIA,IAAiB,OACV,KAAK,KAAK,aAEhBA,GAKL,KAAK,KAAK,aAAejC,EAAUpB,EAAuBqD,CAAY,EAC/D,OALH,KAAK,KAAK,aAAe,KAClB,KAKf,CAcA,QAAQC,EAAqE,CACzE,OAAIA,IAAY,OACL,KAAK,KAAK,QAEjBA,IAAY,MACZ,KAAK,KAAK,QAAU,KACb,OAGX,KAAK,KAAK,QAAU5C,EAAU4C,EAAS,SAAS,EACzC,KACX,CAcA,aAAaC,EAA0E,CACnF,OAAIA,IAAiB,OACV,KAAK,KAAK,aAEjBA,IAAiB,MACjB,KAAK,KAAK,aAAe,KAClB,OAGX,KAAK,KAAK,aAAe7C,EAAU6C,EAAc,cAAc,EACxD,KACX,CAmBA,MAAMC,EAA8D,CAChE,OAAIA,IAAW,OACJ,KAAK,KAAK,MAEjBA,IAAW,MACX,KAAK,KAAK,MAAQ,KACX,OAGX,KAAK,KAAK,MAAQpC,EAAUnB,EAAgBuD,CAAM,EAC3C,KACX,CA+CA,EAAEC,EAAwGC,EAAkE,CACxK,OAAID,IAAe,OACRE,EAAyB,KAAK,IAAI,GAGzC,OAAOF,GAAe,UAAY,OAAOC,GAAU,UACnDC,EAAyB,KAAK,KAAMF,EAAYC,CAAK,EAErD,OAAOD,GAAe,UACtBE,EAAyB,KAAK,KAAMF,CAAU,EAG3C,KACX,CAkBA,QAA4B,CACxB,IAAIvC,EAAwD,KAC5D,OAAGC,EAAQ,KAAK,KAAK,SAAS,GAAK,OAAO,KAAK,KAAK,WAAc,SAC9DD,EAAY,KAAK,KAAK,UAAU,SAAS,EAErC,KAAK,KAAK,YACdA,EAAY,OAAO,OAAO,CAAC,EAAG,KAAK,KAAK,UAAW,CAC/C,MAAO0C,EAAO,KAAK,KAAK,UAAU,KAAK,GAAK,OAC5C,QAAS,KAAK,KAAK,UAAU,SAAS,IAAIC,GAAKD,EAAOC,CAAC,CAAC,CAC5D,CAAC,GAGL,KAAK,0BAA0B,EACxB,OAAO,OAAO,CAAC,EAAG,KAAK,KAAM,CAChC,MAAOD,EAAO,KAAK,KAAK,KAAK,GAAK,KAClC,IAAKA,EAAO,KAAK,KAAK,GAAG,GAAK,KAC9B,aAAcA,EAAO,KAAK,KAAK,YAAY,GAAK,KAChD,MAAOA,EAAO,KAAK,KAAK,KAAK,GAAK,KAClC,QAASA,EAAO,KAAK,KAAK,OAAO,GAAK,KACtC,aAAcA,EAAO,KAAK,KAAK,YAAY,GAAK,KAChD,UAAA1C,EACA,EAAG,KAAK,EAAE,CACd,CAAC,CACL,CAWA,UAAmB,CACf,IAAI4C,EAAI,GA4BR,GAzBAA,GAAK;AAAA,EACLA,GAAK,OAAS,KAAK,KAAK,GAAK;AAAA,EAG7BA,GAAK,YAAc,KAAK,KAAK,SAAW;AAAA,EAExC,KAAK,0BAA0B,EAC/BA,GAAK,WAAaC,EAAW,KAAK,SAAS,SAAS,EAAG,KAAK,KAAK,KAAK,EAAI;AAAA,EACtE,KAAK,KAAK,QACVD,GAAK,sBAAwBC,EAAW,KAAK,SAAS,EAAG,KAAK,KAAK,MAAO,EAAI,EAAI;AAAA,EAC9E,KAAK,KAAK,MACVD,GAAK,oBAAsBC,EAAW,KAAK,SAAS,EAAG,KAAK,KAAK,IAAK,EAAI,EAAI;AAAA,GAGlFD,GAAK;AAAA,EACLA,GAAK;AAAA,IAGLA,GAAKE,EAAa,KAAK,SAAS,EAAG,UAAW,KAAK,KAAK,MAAO,KAAK,IAAI,EAAI;AAAA,EACxE,KAAK,KAAK,MACVF,GAAKE,EAAa,KAAK,SAAS,EAAG,QAAS,KAAK,KAAK,IAAK,KAAK,IAAI,EAAI;AAAA,IAK7E7C,EAAQ,KAAK,KAAK,SAAS,GAAK,OAAO,KAAK,KAAK,WAAc,SAAU,CACxE,IAAID,EAAY,KAAK,KAAK,UACrB,SAAS,EACT,QAAQ,QAAS;AAAA,CAAI,EACrB,MAAM;AAAA,CAAI,EACV,OAAO+C,GAAKA,GAAK,CAACA,EAAE,WAAW,UAAU,CAAC,EAC1C,KAAK;AAAA,CAAM,EAEb,CAAC/C,EAAU,SAAS;AAAA,CAAM,GAAK,CAACA,EAAU,WAAW,QAAQ,IAC5DA,EAAY,SAAWA,GAG3B4C,GAAK5C,EAAU,KAAK,EAAI;AAAA,CAC5B,MACS,KAAK,KAAK,YACf4C,GAAK,cAAgB,KAAK,KAAK,UAAU,KAErC,KAAK,KAAK,UAAU,QACpBA,GAAK,UAAY,KAAK,KAAK,UAAU,OAGrC,KAAK,KAAK,UAAU,WACpBA,GAAK,aAAe,KAAK,KAAK,UAAU,UAGxC,KAAK,KAAK,UAAU,QACpBA,GAAK,UAAYC,EAAW,KAAK,SAAS,SAAS,EAAG,KAAK,KAAK,UAAU,MAAO,GAAO,KAAK,SAAS,CAAC,GAGvG,KAAK,KAAK,UAAU,QACpBD,GAAK,UAAY,KAAK,KAAK,UAAU,MAAM,KAAK,GAAG,GAGnD,KAAK,KAAK,UAAU,UACpBA,GAAK,YAAc,KAAK,KAAK,UAAU,QAAQ,KAAK,GAAG,GAGvD,KAAK,KAAK,UAAU,aACpBA,GAAK,eAAiB,KAAK,KAAK,UAAU,WAAW,KAAK,GAAG,GAG7D,KAAK,KAAK,UAAU,WACpBA,GAAK,aAAe,KAAK,KAAK,UAAU,SAAS,KAAK,GAAG,GAGzD,KAAK,KAAK,UAAU,cACpBA,GAAK,SAAW,KAAK,KAAK,UAAU,aAGxCA,GAAK;AAAA,EAGD,KAAK,KAAK,UAAU,UAChB,KAAK,KAAK,OACVA,GAAK,qBAAuB,KAAK,KAAK,UAAU,QAAQ,IAAII,GACjDH,EAAW,KAAK,SAAS,SAAS,EAAGG,EAAc,EAAI,CACjE,EAAE,KAAK,GAAG,EAAI;AAAA,GAGfJ,GAAK,SACD,KAAK,SAAS,EACdA,GAAK,SAAW,KAAK,SAAS,EAAI,IAAM,KAAK,KAAK,UAAU,QAAQ,IAAII,GAG7DH,EAAW,KAAK,SAAS,EAAGG,EAAc,GAAO,EAAI,CAC/D,EAAE,KAAK,GAAG,EAAI;AAAA,EAGfJ,GAAK,IAAM,KAAK,KAAK,UAAU,QAAQ,IAAII,GAChCH,EAAW,KAAK,SAAS,EAAGG,EAAc,GAAO,KAAK,SAAS,CAAC,CAC1E,EAAE,KAAK,GAAG,EAAI;AAAA,KAO/B,OAAI,KAAK,KAAK,eACVJ,GAAKE,EAAa,KAAK,SAAS,EAAG,gBAAiB,KAAK,KAAK,aAAc,KAAK,IAAI,EAAI;AAAA,GAI7FF,GAAK,WAAaK,EAAO,KAAK,KAAK,QAAS,EAAK,EAAI;AAAA,EAGjD,KAAK,KAAK,eACVL,GAAK,UAAYK,EAAO,KAAK,KAAK,aAAc,EAAK,EAAI;AAAA,GAIzD,KAAK,KAAK,UAAY,UAAW,KAAK,KAAK,UAAY,KAAK,KAAK,SAAS,QAC1EL,GAAK,YAAcK,EACf,KAAK,KAAK,SAAS,OAClB,KAAK,KAAK,SAAS,QAAU;AAAA,EAAO,KAAK,KAAK,SAAS,QAAU,IAClE,EACJ,EAAI;AAAA,EAEA,KAAK,KAAK,SAAS,QAAU,KAAK,KAAK,SAAS,MAChDL,GAAK,0CACA,KAAK,KAAK,SAAS,QAAU,aAAeK,EAAO,KAAK,KAAK,SAAS,QAAS,EAAK,EAAI,IAAM,IAC/F,kBAAoBA,EAAO,KAAK,KAAK,SAAS,OAAQ,EAAK,EAAI,YAClDA,EAAO,KAAK,KAAK,SAAS,MAAO,EAAK,EACnD,QAAUA,EAAO,KAAK,KAAK,SAAS,KAAK,IAAK,EAAK,EAAI,IACvDA,EAAO,KAAK,KAAK,SAAS,KAAK,IAAK,EAAK,EAAI;AAAA,IAKrD,KAAK,KAAK,UAAY,QAAS,KAAK,KAAK,UAAY,KAAK,KAAK,SAAS,MACxEL,GAAK,OAASK,EAAO,KAAK,KAAK,SAAS,KAAK,IAAK,EAAK,EAAI,IACvDA,EAAO,KAAK,KAAK,SAAS,KAAK,IAAK,EAAK,EAAI;AAAA,GAIjD,KAAK,KAAK,cACVL,GAAK,eAAiBK,EAAO,KAAK,KAAK,YAAY,MAAO,EAAK,EAAI;AAAA,EAG/D,KAAK,KAAK,YAAY,OACtBL,GAAK,gCAAkCK,EAAO,KAAK,KAAK,YAAY,KAAM,EAAK,EAAI;AAAA,IAKvF,KAAK,KAAK,YACVL,GAAK,iBAAmBK,EAAO,KAAK,KAAK,UAAU,KAAM,EAAI,EAAI,IAE7D,KAAK,KAAK,UAAU,SACpBL,GAAK,oBAAsBK,EAAO,KAAK,KAAK,UAAU,OAAQ,EAAI,EAAI,KAEtE,KAAK,KAAK,UAAU,OAAS,KAAK,KAAK,UAAU,SACjDL,GAAK,UAAYK,EAAO,KAAK,KAAK,UAAU,MAAO,EAAK,GAEzD,KAAK,KAAK,UAAU,QACnBL,GAAK,WAAaK,EAAO,KAAK,KAAK,UAAU,QAAU,KAAK,KAAK,UAAU,MAAO,EAAK,GAE3FL,GAAK;AAAA,GAIT,KAAK,KAAK,UAAU,QAAQ,SAAUvB,EAAU,CAC5CuB,GAAKvB,EAAS,SAAS,CAC3B,CAAC,EAGD,KAAK,KAAK,OAAO,QAAQ,SAAUE,EAAO,CACtCqB,GAAKrB,EAAM,SAAS,CACxB,CAAC,EAGG,KAAK,KAAK,WAAW,OAAS,IAC9BqB,GAAK,cAAgB,KAAK,KAAK,WAC1B,IAAIlB,GAAYA,EAAS,SAAS,CAAC,EACnC,KAAK,EAAI;AAAA,GAId,KAAK,KAAK,MACVkB,GAAK,iBAAmBK,EAAO,KAAK,KAAK,IAAK,EAAK,EAAI;AAAA,GAIvD,KAAK,KAAK,YAAY,OAAS,GAC/B,KAAK,KAAK,YAAY,QAAQjB,GAAO,CACjCY,GAAK,UAAYK,EAAOjB,EAAK,EAAK,EAAI;AAAA,CAC1C,CAAC,EAID,KAAK,KAAK,SACVY,GAAK,UAAY,KAAK,KAAK,OAAO,YAAY,EAAI;AAAA,GAIlD,KAAK,KAAK,aACVA,GAAK,8BAAgC,KAAK,KAAK,WAAW,YAAY,EAAI;AAAA,GAI1E,KAAK,KAAK,WAAa,OACvBA,GAAK,YAAc,KAAK,KAAK,SAAW;AAAA,GAI5CA,GAAKM,EAAyB,KAAK,IAAI,EAGnC,KAAK,KAAK,UACVN,GAAK,WAAaC,EAAW,KAAK,SAAS,SAAS,EAAG,KAAK,KAAK,OAAO,EAAI;AAAA,GAI5E,KAAK,KAAK,eACVD,GAAK,iBAAmBC,EAAW,KAAK,SAAS,SAAS,EAAG,KAAK,KAAK,YAAY,EAAI;AAAA,GAGvF,KAAK,KAAK,QACVD,GAAI,SAAW,KAAK,KAAK,MAAM,YAAY,EAAI;AAAA,GAGnDA,GAAK;AAAA,EACEA,CACX,CACJ,EKjyDO,IAAKO,OACRA,EAAA,QAAU,UACVA,EAAA,QAAU,UACVA,EAAA,MAAQ,QACRA,EAAA,IAAM,MACNA,EAAA,OAAS,SACTA,EAAA,QAAU,UACVA,EAAA,QAAU,UACVA,EAAA,eAAiB,iBARTA,OAAA,IAyBSC,EAArB,KAAkC,CACb,KAoCjB,YAAYC,EAAyB,CAAC,EAAG,CACrC,KAAK,KAAO,CACR,OAAQ,kCACR,OAAQ,KACR,KAAM,KACN,YAAa,KACb,SAAU,KACV,OAAQ,KACR,IAAK,KACL,MAAO,KACP,IAAK,KACL,OAAQ,CAAC,EACT,EAAG,CAAC,CACR,EAEIA,EAAK,SAAW,QAAW,KAAK,OAAOA,EAAK,MAAM,EAClDA,EAAK,SAAW,QAAW,KAAK,OAAOA,EAAK,MAAM,EAClDA,EAAK,OAAS,QAAW,KAAK,KAAKA,EAAK,IAAI,EAC5CA,EAAK,cAAgB,QAAW,KAAK,YAAYA,EAAK,WAAW,EACjEA,EAAK,WAAa,QAAW,KAAK,SAASA,EAAK,QAAQ,EACxDA,EAAK,SAAW,QAAW,KAAK,OAAOA,EAAK,MAAM,EAClDA,EAAK,MAAQ,QAAW,KAAK,IAAIA,EAAK,GAAG,EACzCA,EAAK,QAAU,QAAW,KAAK,MAAMA,EAAK,KAAK,EAC/CA,EAAK,MAAQ,QAAW,KAAK,IAAIA,EAAK,GAAG,EACzCA,EAAK,SAAW,QAAW,KAAK,OAAOA,EAAK,MAAM,EAClDA,EAAK,IAAM,QAAW,KAAK,EAAEA,EAAK,CAAC,CAC3C,CA+BA,OAAOC,EAAyD,CAC5D,GAAI,CAACA,EACD,OAAO,KAAK,KAAK,OAGrB,GAAI,OAAOA,GAAW,SAClB,YAAK,KAAK,OAASA,EACZ,KAGX,GAAI,OAAOA,GAAW,SAClB,MAAM,IAAI,MAAM,6CAA6C,EAGjE,GAAI,CAACA,EAAO,QACR,MAAM,IAAI,MAAM,uCAAuC,EAE3D,GAAI,CAACA,EAAO,QACR,MAAM,IAAI,MAAM,uCAAuC,EAG3D,IAAMC,GAAYD,EAAO,UAAY,MAAM,YAAY,EACvD,YAAK,KAAK,OAAS,KAAOA,EAAO,QAAU,KAAOA,EAAO,QAAU,KAAOC,EACnE,IACX,CA0BA,OAAOC,EAAsE,CACzE,OAAIA,IAAW,OACJ,KAAK,KAAK,OAEhBA,GAKL,KAAK,KAAK,OAASC,EAAUN,EAAoBK,CAAM,EAChD,OALH,KAAK,KAAK,OAAS,KACZ,KAKf,CAkCA,KAAKE,EAA4C,CAC7C,OAAIA,IAAS,OACF,KAAK,KAAK,MAGrB,KAAK,KAAK,KAAOA,EAAO,OAAOA,CAAI,EAAI,KAChC,KACX,CAcA,YAAYC,EAAmD,CAC3D,OAAIA,IAAgB,OACT,KAAK,KAAK,aAGrB,KAAK,KAAK,YAAcA,EAAc,OAAOA,CAAW,EAAI,KACrD,KACX,CA4DA,SAASC,EAA+D,CACpE,OAAIA,IAAa,OACN,KAAK,KAAK,UAAU,MAAQ,MAGpCA,IAAa,MACZ,KAAK,KAAK,SAAW,KAEjB,OAAOA,GAAa,SACxB,KAAK,KAAK,SAAW,CAAC,KAAMA,CAAQ,EAEhCA,IAAa,KACjB,KAAK,KAAK,SAAW,KAGrB,KAAK,KAAK,SAAWA,EAGlB,KACX,CAwBA,OAAOC,EAA8C,CACjD,OAAIA,IAAW,OACJ,KAAK,KAAK,QAGrB,KAAK,KAAK,OAASA,GAAU,KACtB,KACX,CAmBA,IAAIC,EAA2C,CAC3C,OAAIA,IAAQ,OACD,KAAK,KAAK,KAGrB,KAAK,KAAK,IAAMA,GAAO,KAChB,KACX,CAyBA,MAAMC,EAA6C,CAC/C,OAAIA,IAAU,OACH,KAAK,KAAK,OAGjBA,IAAU,KACV,KAAK,KAAK,MAAQ,KAGlB,KAAK,KAAK,MAAQA,EAAM,YAAY,EAGjC,KACX,CAwBA,IAAIC,EAAoE,CACpE,OAAIA,IAAQ,OACD,KAAK,KAAK,KAGjBC,EAAiBD,CAAG,EACpB,KAAK,KAAK,IAAMA,EAAI,UAAU,EAEzBA,GAAOA,EAAM,EAClB,KAAK,KAAK,IAAMA,EAGhB,KAAK,KAAK,IAAM,KAGb,KACX,CAsBA,YAAYX,EAA4C,CACpD,IAAMa,EAAQb,aAAgBc,EAAYd,EAAO,IAAIc,EAAUd,EAAM,IAAI,EACzE,YAAK,KAAK,OAAO,KAAKa,CAAK,EACpBA,CACX,CAgDA,OAAOE,EAA4D,CAC/D,OAAKA,GAILA,EAAO,QAAS,GAAiC,KAAK,YAAY,CAAC,CAAC,EAC7D,MAJI,KAAK,KAAK,MAKzB,CASA,OAAc,CACV,YAAK,KAAK,OAAS,CAAC,EACb,IACX,CA+DA,EAAGC,EAAoGC,EAAgE,CACnK,GAAGD,IAAe,OACd,OAAOE,EAA0B,KAAK,IAAI,EAG9C,GAAG,OAAOF,GAAe,UAAY,OAAOC,GAAU,SAClDC,EAA0B,KAAK,KAAMF,EAAYC,CAAK,UAElD,OAAOD,GAAe,SAC1BE,EAA0B,KAAK,KAAMF,CAAU,MAG/C,OAAM,IAAI,MAAM,sCAAsC,EAG1D,OAAO,IACX,CAkBA,QAA+B,CAC3B,OAAO,OAAO,OAAO,CAAC,EAAG,KAAK,KAAM,CAChC,SAAU,KAAK,SAAS,EACxB,OAAQ,KAAK,KAAK,OAAO,IAAIH,GAASA,EAAM,OAAO,CAAC,EACpD,EAAG,KAAK,EAAE,CACd,CAAC,CACL,CAMA,QAAiB,CACb,OAAO,KAAK,KAAK,OAAO,MAC5B,CAWA,UAAmB,CACf,IAAIM,EAAI,GAGR,OAAAA,EAAI;AAAA;AAAA,EAGJA,GAAK,WAAa,KAAK,KAAK,OAAS;AAAA,EAGjC,KAAK,KAAK,MACVA,GAAK,OAAS,KAAK,KAAK,IAAM;AAAA,GAI9B,KAAK,KAAK,SACVA,GAAK,oBAAsB,KAAK,KAAK,OAAS;AAAA,GAI9C,KAAK,KAAK,QACVA,GAAK,YAAc,KAAK,KAAK,MAAQ;AAAA,GAIrC,KAAK,KAAK,SACVA,GAAK,UAAY,KAAK,KAAK,OAAS;AAAA,GAIpC,KAAK,KAAK,OACVA,GAAK,QAAU,KAAK,KAAK,KAAO;AAAA,EAChCA,GAAK,gBAAkB,KAAK,KAAK,KAAO;AAAA,GAIxC,KAAK,KAAK,cACVA,GAAK,gBAAkB,KAAK,KAAK,YAAc;AAAA,GAIhD,KAAK,KAAK,UAAU,WACD,CAAC,GAAG,IAAI,IAAI,CAC1B,KAAK,SAAS,EACd,GAAG,KAAK,KAAK,OAAO,IAAIN,GAASA,EAAM,SAAS,CAAC,CACrD,CAAC,CAAC,EAAE,OAAOO,GAAMA,IAAO,MAAQ,CAACA,EAAG,WAAW,GAAG,CAAC,EAEzC,QAAQA,GAAM,CACpB,GAAG,CAAC,KAAK,KAAK,UAAU,UACpB,OAGJ,IAAMC,EAAI,KAAK,KAAK,SAAS,UAAUD,CAAE,EACrCC,IAIJF,GAAKE,EAAE,QAAQ,QAAS;AAAA,CAAI,EACvB,QAAQ,MAAO;AAAA,CAAM,EACrB,KAAK,EAAI;AAAA,EAClB,CAAC,EAED,KAAK,KAAK,UAAU,OACpBF,GAAK,eAAiB,KAAK,KAAK,SAAS,KAAO;AAAA,EAChDA,GAAK,iBAAmB,KAAK,KAAK,SAAS,KAAO;AAAA,GAIlD,KAAK,KAAK,MACVA,GAAK,mCAAqCG,EAAiB,KAAK,KAAK,GAAG,EAAI;AAAA,EAC5EH,GAAK,mBAAqBG,EAAiB,KAAK,KAAK,GAAG,EAAI;AAAA,GAIhE,KAAK,KAAK,OAAO,QAAQT,GAASM,GAAKN,EAAM,SAAS,CAAC,EAGvDM,GAAKI,EAAyB,KAAK,IAAI,EAEvCJ,GAAK,gBAEEK,EAAUL,CAAC,CACtB,CACJ,EPtwBA,SAASM,GAAKC,EAAuC,CACjD,OAAO,IAAIC,EAAaD,CAAI,CAChC,CAEA,IAAOE,GAAQH","names":["src_exports","__export","ICalAlarm","ICalAlarmRelatesTo","ICalAlarmType","ICalAttendee","ICalAttendeeRole","ICalAttendeeStatus","ICalAttendeeType","ICalCalendar","ICalCalendarMethod","ICalCategory","ICalEvent","ICalEventBusyStatus","ICalEventClass","ICalEventRepeatingFreq","ICalEventStatus","ICalEventTransparency","ICalWeekday","src_default","escape","foldLines","formatDate","formatDateTZ","__toCommonJS","formatDate","timezone","d","dateonly","floating","m","isMoment","isMomentTZ","isLuxonDate","formatDateTZ","property","date","eventData","tzParam","escape","str","inQuotes","match","foldLines","input","line","result","c","ch","charsize","addOrGetCustomAttributes","data","keyOrArray","value","o","key","a","generateCustomAttributes","checkNameAndMail","attribute","checkEnum","type","allowedValues","valueStr","checkDate","isDayjs","toDate","isMomentDuration","isRRule","toJSON","toDurationString","seconds","string","import_uuid_random","ICalAttendeeRole","ICalAttendeeStatus","ICalAttendeeType","ICalAttendee","_ICalAttendee","data","parent","name","email","mailto","role","checkEnum","rsvp","status","type","delegatedTo","checkNameAndMail","delegatedFrom","options","a","keyOrArray","value","addOrGetCustomAttributes","g","escape","key","ICalAlarmType","ICalAlarmRelatesTo","ICalAlarm","data","event","type","trigger","checkDate","relatesTo","repeat","attachment","_attach","description","summary","ICalAttendee","checkNameAndMail","attendee","attendees","keyOrArray","value","addOrGetCustomAttributes","toJSON","g","toDurationString","formatDate","escape","generateCustomAttributes","ICalCategory","data","name","escape","ICalEventRepeatingFreq","ICalWeekday","ICalEventStatus","ICalEventBusyStatus","ICalEventTransparency","ICalEventClass","ICalEvent","data","calendar","uuid","id","sequence","s","start","checkDate","end","toDate","recurrenceId","timezone","stamp","allDay","floating","repeating","isRRule","checkEnum","ICalEventRepeatingFreq","byDayArray","day","ICalWeekday","byMonthArray","month","byMonthDayArray","monthDay","bySetPosArray","bySetPos","excludeArray","exclude","summary","location","description","organizer","checkNameAndMail","ICalAttendee","attendee","attendees","alarm","ICalAlarm","alarms","category","ICalCategory","categories","status","busystatus","priority","url","attachments","attachment","transparency","created","lastModified","class_","keyOrArray","value","addOrGetCustomAttributes","toJSON","d","g","formatDate","formatDateTZ","l","excludedDate","escape","generateCustomAttributes","ICalCalendarMethod","ICalCalendar","data","prodId","language","method","checkEnum","name","description","timezone","source","url","scale","ttl","isMomentDuration","event","ICalEvent","events","keyOrArray","value","addOrGetCustomAttributes","g","tz","s","toDurationString","generateCustomAttributes","foldLines","ical","data","ICalCalendar","src_default"]}