{"version":3,"file":"index.mjs","sources":["../../../../src/animation/timeline/index.ts"],"sourcesContent":["import {\n    animateSingleValue,\n    AnimationPlaybackControls,\n    AnimationPlaybackControlsWithThen,\n    AnimationScope,\n    GroupAnimationWithThen,\n    MotionValue,\n    motionValue,\n    TimelineWithFallback,\n} from \"motion-dom\"\nimport { removeItem } from \"motion-utils\"\nimport { animateSequence } from \"../animate/sequence\"\nimport { calcLabelTime } from \"../sequence/utils/calc-time\"\nimport {\n    AnimationSequence,\n    Segment,\n    SequenceInfo,\n    SequenceOptions,\n    SequenceTime,\n} from \"../sequence/types\"\n\nexport type TimelineItem = Segment | Timeline\n\n/**\n * Called with the playback direction: 1 forwards, -1 backwards.\n */\nexport type TimelineCallback = (direction: 1 | -1) => void\n\nexport interface TimelineOptions extends SequenceOptions {\n    /**\n     * Start paused. Defaults to `true` (plays as soon as it's built).\n     */\n    autoplay?: boolean\n    /**\n     * Resolve selectors within this scope, and stop when it's torn\n     * down. Pass the scope from useAnimate() in React.\n     */\n    scope?: AnimationScope\n    /**\n     * Called every frame while the playhead moves, with its time in\n     * seconds within the current repeat.\n     */\n    onUpdate?: (time: number) => void\n    /**\n     * Called each time the timeline starts a repeat.\n     */\n    onRepeat?: () => void\n    /**\n     * Called instead of `onComplete` when the timeline finishes\n     * playing backwards, at its start.\n     */\n    onReverseComplete?: () => void\n}\n\ninterface Marker {\n    name: string\n    time: number\n    callback?: TimelineCallback\n    pause?: boolean\n}\n\ninterface Entry {\n    item: TimelineItem | TimelineCallback\n    at?: SequenceTime\n    marker?: Marker\n}\n\nlet markerId = 0\n\n/**\n * Copy a segment with a new `at`, adding a transition if it has none.\n */\nfunction withAt(segment: any[], at: SequenceTime) {\n    const copy = [...segment]\n    const i = typeof copy[0] === \"function\" ? Math.max(1, copy.length - 1) : 2\n    copy[i] = { ...copy[i], at }\n    return copy as Segment\n}\n\nconst label = (name: string, at?: SequenceTime): Segment =>\n    at === undefined ? name : { name, at }\n\n/**\n * Rewind to the start and stop, so every value is back at the value it\n * started from and the next build reads those values as its origin.\n */\nfunction rewind(animation: AnimationPlaybackControls) {\n    animation.pause()\n    animation.time = 0\n    animation.stop()\n}\n\n/**\n * A sequence that can be changed after it's created. Segments, labels,\n * callbacks, pauses and other timelines can be added, moved and removed\n * at any point, including while it plays.\n *\n * Changes are batched and applied once per microtask. Each change\n * rebuilds the underlying animations from the timeline's starting\n * values, then restores the playhead, speed and play state, so changes\n * made while playing take effect without a jump.\n */\nexport class Timeline implements AnimationPlaybackControlsWithThen {\n    finished!: Promise<any>\n\n    private entries: Entry[] = []\n\n    private group?: GroupAnimationWithThen\n\n    /**\n     * Tracks the playhead in seconds. Used to fire callbacks, pauses and\n     * playTo(). Only created when one of those needs it.\n     */\n    private clock?: MotionValue<number>\n\n    private clockAnimation?: AnimationPlaybackControls\n\n    /**\n     * The repeat the playhead is in, to detect when it starts another.\n     */\n    private repeatIndex = 0\n\n    private prevTime = 0\n\n    private markers: Marker[] = []\n\n    private labels = new Map<string, number>()\n\n    private totalDuration = 0\n\n    private isDirty = false\n\n    private isPaused: boolean\n\n    private isDone = false\n\n    private isRebuilding = false\n\n    private playbackSpeed = 1\n\n    private stopAt?: number\n\n    private parent?: Timeline\n\n    private scrollTimeline?: TimelineWithFallback\n\n    private detachScroll?: VoidFunction\n\n    private resolveFinished!: VoidFunction\n\n    /**\n     * True while this plays the animations it was created with, before\n     * any change compiles it as a sequence.\n     */\n    private isWrapped = false\n\n    /**\n     * `animations` are already running animations of `items`, as\n     * animate() makes them. The timeline plays these until it's first\n     * changed, so it costs nothing over the animations themselves until\n     * then.\n     */\n    constructor(\n        items: TimelineItem[] = [],\n        private options: TimelineOptions = {},\n        animations?: AnimationPlaybackControlsWithThen[]\n    ) {\n        this.isPaused = options.autoplay === false\n        this.newFinished()\n        items.forEach((item) => this.add(item))\n\n        if (animations) {\n            this.isDirty = false\n            this.isWrapped = true\n            this.group = new GroupAnimationWithThen(animations)\n            this.watch()\n        } else {\n            /**\n             * Build now, like animate(), so selectors resolve while a\n             * scope is attached. Later changes are batched.\n             */\n            this.invalidate()\n            this.flush()\n        }\n\n        /**\n         * Register with the scope (for instance from useAnimate()) so it\n         * stops when the scope is torn down.\n         */\n        const { scope } = options\n        if (scope) {\n            scope.animations.push(this)\n            this.finished.then(() => removeItem(scope.animations, this))\n        }\n    }\n\n    /**\n     * Add a segment, label or timeline. `at` overrides any `at` already\n     * on the segment. The item itself is the handle for `move()` and\n     * `remove()`.\n     */\n    add(item: TimelineItem, at?: SequenceTime) {\n        if (item instanceof Timeline) item.adopt(this)\n        return this.push({ item, at })\n    }\n\n    /**\n     * Fire a callback when the playhead crosses `at`, in either direction.\n     * It receives the direction: 1 forwards, -1 backwards.\n     */\n    call(callback: TimelineCallback, at?: SequenceTime) {\n        return this.push({\n            item: callback,\n            at,\n            marker: { name: \"_m\" + markerId++, time: 0, callback },\n        })\n    }\n\n    /**\n     * Pause when the playhead reaches `at`.\n     */\n    addPause(at?: SequenceTime, callback?: TimelineCallback) {\n        return this.push({\n            item: callback || {},\n            at,\n            marker: { name: \"_m\" + markerId++, time: 0, callback, pause: true },\n        } as Entry)\n    }\n\n    /**\n     * Change where an item starts.\n     */\n    move(item: TimelineItem | TimelineCallback, at: SequenceTime) {\n        this.entries.forEach((entry) => {\n            if (entry.item === item) entry.at = at\n        })\n        return this.invalidate()\n    }\n\n    /**\n     * Remove a segment, label, callback or timeline.\n     */\n    remove(item: TimelineItem | TimelineCallback) {\n        if (item instanceof Timeline) item.parent = undefined\n        this.entries = this.entries.filter((entry) => entry.item !== item)\n        return this.invalidate()\n    }\n\n    clear() {\n        this.entries = []\n        return this.invalidate()\n    }\n\n    /**\n     * The time of a label in seconds, or `undefined` if there's no label\n     * with this name.\n     */\n    getLabelTime(name: string) {\n        this.flush()\n        return this.labels.get(name)\n    }\n\n    /**\n     * Jump to a time in seconds or a label.\n     */\n    seek(position: SequenceTime) {\n        this.time = this.resolve(position)\n        return this\n    }\n\n    /**\n     * Play forwards or backwards to a time or label, then pause there.\n     */\n    playTo(position: SequenceTime) {\n        const target = this.resolve(position)\n        const speed = Math.abs(this.speed)\n        this.speed = target < this.time ? -speed : speed\n        this.stopAt = target\n        this.clock || this.invalidate()\n        this.play()\n        return this\n    }\n\n    reverse() {\n        this.speed = -this.speed\n        this.play()\n        return this\n    }\n\n    get progress() {\n        return this.duration ? this.time / this.duration : 0\n    }\n\n    set progress(progress: number) {\n        this.time = progress * this.duration\n    }\n\n    get time() {\n        return this.active()?.time ?? 0\n    }\n\n    set time(time: number) {\n        this.flush()\n        this.prevTime = time\n        this.group && (this.group.time = time)\n        this.repeatIndex = this.currentRepeat()\n    }\n\n    get speed() {\n        return this.playbackSpeed\n    }\n\n    set speed(speed: number) {\n        this.playbackSpeed = speed\n        this.group && (this.group.speed = speed)\n    }\n\n    get duration() {\n        this.flush()\n        return this.isWrapped ? this.group!.duration : this.totalDuration\n    }\n\n    get iterationDuration() {\n        this.flush()\n        return this.isWrapped\n            ? this.group!.iterationDuration\n            : this.totalDuration\n    }\n\n    get state() {\n        return this.active()?.state ?? \"idle\"\n    }\n\n    get startTime() {\n        return this.active()?.startTime ?? null\n    }\n\n    play() {\n        this.flush()\n        this.isPaused = false\n        this.group?.play()\n\n        /**\n         * Watch after playing, so it waits for the restarted animations\n         * rather than the ones that already finished.\n         */\n        if (this.isDone) {\n            this.newFinished()\n            this.watch()\n        }\n    }\n\n    pause() {\n        this.flush()\n        this.isPaused = true\n        this.group?.pause()\n    }\n\n    stop = () => {\n        this.flush()\n        this.group?.stop()\n    }\n\n    cancel() {\n        this.flush()\n        this.group?.cancel()\n    }\n\n    complete() {\n        this.flush()\n        this.group?.complete()\n    }\n\n    attachTimeline(timeline: TimelineWithFallback) {\n        this.flush()\n        this.scrollTimeline = timeline\n        this.detachScroll = this.group?.attachTimeline(timeline)\n\n        return () => {\n            this.scrollTimeline = undefined\n            this.detachScroll?.()\n        }\n    }\n\n    then(onResolve: VoidFunction, onReject?: VoidFunction) {\n        return this.finished.then(onResolve, onReject)\n    }\n\n    /**\n     * The current animations, if any are running. Skipped animations\n     * (skipAnimations, reduced motion) can leave the group empty.\n     */\n    private active() {\n        this.flush()\n        return this.group?.animations.length ? this.group : undefined\n    }\n\n    private push(entry: Entry) {\n        this.entries.push(entry)\n        return this.invalidate()\n    }\n\n    /**\n     * Schedule a rebuild. A nested timeline passes changes up, as it's\n     * built as part of its parent.\n     */\n    private invalidate(): this {\n        if (this.parent) {\n            this.parent.invalidate()\n        } else if (!this.isDirty) {\n            this.isDirty = true\n            queueMicrotask(() => this.flush())\n        }\n        return this\n    }\n\n    /**\n     * Apply pending changes now, so reads straight after a change\n     * reflect it.\n     */\n    private flush() {\n        this.isDirty && !this.parent && this.build()\n    }\n\n    private adopt(parent: Timeline) {\n        if (this.group) {\n            rewind(this.group)\n            this.group = undefined\n        }\n        this.isDirty = false\n        this.parent = parent\n    }\n\n    private build() {\n        this.isDirty = false\n        this.isWrapped = false\n\n        const prev = this.group\n        let time = 0\n\n        if (prev) {\n            this.isRebuilding = true\n            if (this.scrollTimeline) {\n                /**\n                 * Scroll-linked animations can't be seeked in seconds.\n                 * Cancelling also returns them to their starting values,\n                 * and the new build is attached to scroll instead.\n                 */\n                this.detachScroll?.()\n                prev.cancel()\n            } else {\n                time = prev.animations.length ? prev.time : 0\n                rewind(prev)\n            }\n            this.isRebuilding = false\n        }\n\n        const {\n            defaultTransition,\n            onComplete,\n            onUpdate,\n            onRepeat,\n            onReverseComplete,\n            autoplay,\n            scope,\n            ...options\n        } = this.options\n\n        /**\n         * Inherit MotionConfig settings from a useAnimate() scope.\n         */\n        const playback: SequenceOptions = {}\n        if (scope?.reduceMotion !== undefined) {\n            playback.reduceMotion = scope.reduceMotion\n        }\n        if (scope?.skipAnimations !== undefined) {\n            playback.skipAnimations = scope.skipAnimations\n        }\n        Object.assign(playback, options)\n        const markers = new Map<string, Marker>()\n        const info: SequenceInfo = {}\n        const animations = animateSequence(\n            this.toSequence(markers),\n            { defaultTransition, ...playback },\n            scope,\n            info\n        )\n\n        const labels = info.labels!\n        let duration = playback.duration ?? info.duration!\n\n        /**\n         * A `duration` option stretches every animation to fit, so scale\n         * label and marker times to match.\n         */\n        const scale = info.duration ? duration / info.duration : 1\n        labels.forEach((time, name) => labels.set(name, time * scale))\n\n        /**\n         * Markers are resolved as labels. Move them out of the label map\n         * and extend the duration to reach any marker past the end.\n         */\n        this.markers = []\n        markers.forEach((marker, name) => {\n            marker.time = labels.get(name)!\n            labels.delete(name)\n            duration = Math.max(duration, marker.time)\n            this.markers.push(marker)\n        })\n        this.markers.sort((a, b) => a.time - b.time)\n        this.labels = labels\n        this.totalDuration = duration\n\n        /**\n         * Callbacks, pauses and playTo() watch a linear clock. Without\n         * them, the timeline is only its animations.\n         */\n        this.clock = this.clockAnimation = undefined\n        if (\n            this.markers.length ||\n            this.stopAt !== undefined ||\n            onUpdate ||\n            onRepeat\n        ) {\n            const clock = (this.clock = motionValue(0))\n            clock.on(\"change\", (t) => clock === this.clock && this.onClock(t))\n            animations.unshift(\n                (this.clockAnimation = animateSingleValue(\n                    clock,\n                    [0, duration],\n                    {\n                        ...playback,\n                        duration,\n                        ease: \"linear\",\n                    }\n                ))\n            )\n        }\n\n        const group = (this.group = new GroupAnimationWithThen(animations))\n\n        time = Math.min(time, duration)\n        if (this.isDone && time < duration) this.newFinished()\n\n        if (this.scrollTimeline) {\n            this.detachScroll = group.attachTimeline(this.scrollTimeline)\n        } else {\n            group.speed = this.playbackSpeed\n            if (this.isPaused) group.pause()\n            if (time) group.time = time\n        }\n        this.repeatIndex = this.currentRepeat()\n        /**\n         * Treat a start from 0 as coming from just before it, so markers\n         * at 0 fire.\n         */\n        this.prevTime = time || -1\n\n        this.watch()\n    }\n\n    private toSequence(markers: Map<string, Marker>): AnimationSequence {\n        return this.entries.map(({ item, at, marker }) => {\n            if (marker) {\n                markers.set(marker.name, marker)\n                return label(marker.name, at)\n            }\n            if (item instanceof Timeline) {\n                return { sequence: item.toSequence(markers), at }\n            }\n            if (typeof item === \"string\") return label(item, at)\n            if (at === undefined) return item as Segment\n            return Array.isArray(item)\n                ? withAt(item, at)\n                : ({ ...item, at } as Segment)\n        })\n    }\n\n    private resolve(position: SequenceTime) {\n        this.flush()\n        return typeof position === \"number\"\n            ? position\n            : calcLabelTime(position, this.labels) ?? this.time\n    }\n\n    /**\n     * The repeat the clock is in, from its time across all repeats.\n     */\n    private currentRepeat() {\n        const { repeat = 0, repeatDelay = 0, delay = 0 } = this.options\n        const cycle = this.totalDuration + repeatDelay\n        const time = (this.clockAnimation?.time ?? 0) - delay\n        return cycle && time > 0\n            ? Math.min(repeat, Math.floor(time / cycle))\n            : 0\n    }\n\n    private onClock(time: number) {\n        let prevTime = this.prevTime\n        this.prevTime = time\n        if (this.isRebuilding) return\n\n        const { onUpdate, onRepeat, repeatType = \"loop\" } = this.options\n        onUpdate?.(time)\n\n        const repeatIndex = this.currentRepeat()\n        if (repeatIndex !== this.repeatIndex) {\n            this.repeatIndex = repeatIndex\n            onRepeat?.()\n\n            /**\n             * A loop jumps the playhead back to the start, or to the\n             * end when playing backwards. Finish crossing the repeat\n             * that ended, then cross the new one from its edge.\n             */\n            if (repeatType === \"loop\") {\n                const isForward = this.speed > 0\n                if (this.cross(prevTime, isForward ? this.totalDuration : 0)) {\n                    return\n                }\n                prevTime = isForward ? -1 : Infinity\n            }\n        }\n\n        this.cross(prevTime, time)\n    }\n\n    /**\n     * Fire markers between two playhead times. Returns `true` if it\n     * paused.\n     */\n    private cross(from: number, to: number) {\n        if (from === to) return\n\n        const isForward = to > from\n        const crossed = (t: number) =>\n            isForward ? t > from && t <= to : t < from && t >= to\n\n        const markers = isForward ? this.markers : [...this.markers].reverse()\n        for (const marker of markers) {\n            if (!crossed(marker.time)) continue\n            marker.callback?.(isForward ? 1 : -1)\n            if (marker.pause) return this.pauseAt(marker.time)\n        }\n\n        if (this.stopAt !== undefined && crossed(this.stopAt)) {\n            this.pauseAt(this.stopAt)\n            this.stopAt = undefined\n            return true\n        }\n    }\n\n    private pauseAt(time: number) {\n        this.pause()\n        this.time = time\n        return true\n    }\n\n    private watch() {\n        const group = this.group!\n        group.finished.then(() => {\n            if (group !== this.group || this.isDone) return\n            this.isDone = true\n            const { onComplete, onReverseComplete } = this.options\n            /**\n             * Without onReverseComplete, onComplete fires in either\n             * direction, as it does for a single animation.\n             */\n            const callback =\n                (this.speed < 0 && onReverseComplete) || onComplete\n            callback?.()\n            this.resolveFinished()\n        })\n    }\n\n    private newFinished() {\n        this.isDone = false\n        this.finished = new Promise<void>((resolve) => {\n            this.resolveFinished = resolve\n        })\n    }\n}\n"],"names":[],"mappings":";;;;;AAmEA,IAAI,QAAQ,GAAG,CAAC;AAEhB;;AAEG;AACH,SAAS,MAAM,CAAC,OAAc,EAAE,EAAgB,EAAA;AAC5C,IAAA,MAAM,IAAI,GAAG,CAAC,GAAG,OAAO,CAAC;AACzB,IAAA,MAAM,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC;AAC1E,IAAA,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE;AAC5B,IAAA,OAAO,IAAe;AAC1B;AAEA,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,EAAiB,KAC1C,EAAE,KAAK,SAAS,GAAG,IAAI,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE;AAE1C;;;AAGG;AACH,SAAS,MAAM,CAAC,SAAoC,EAAA;IAChD,SAAS,CAAC,KAAK,EAAE;AACjB,IAAA,SAAS,CAAC,IAAI,GAAG,CAAC;IAClB,SAAS,CAAC,IAAI,EAAE;AACpB;AAEA;;;;;;;;;AASG;MACU,QAAQ,CAAA;AAsDjB;;;;;AAKG;AACH,IAAA,WAAA,CACI,QAAwB,EAAE,EAClB,OAAA,GAA2B,EAAE,EACrC,UAAgD,EAAA;QADxC,IAAA,CAAA,OAAO,GAAP,OAAO;QA3DX,IAAA,CAAA,OAAO,GAAY,EAAE;AAY7B;;AAEG;QACK,IAAA,CAAA,WAAW,GAAG,CAAC;QAEf,IAAA,CAAA,QAAQ,GAAG,CAAC;QAEZ,IAAA,CAAA,OAAO,GAAa,EAAE;AAEtB,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,GAAG,EAAkB;QAElC,IAAA,CAAA,aAAa,GAAG,CAAC;QAEjB,IAAA,CAAA,OAAO,GAAG,KAAK;QAIf,IAAA,CAAA,MAAM,GAAG,KAAK;QAEd,IAAA,CAAA,YAAY,GAAG,KAAK;QAEpB,IAAA,CAAA,aAAa,GAAG,CAAC;AAYzB;;;AAGG;QACK,IAAA,CAAA,SAAS,GAAG,KAAK;QA4MzB,IAAA,CAAA,IAAI,GAAG,MAAK;YACR,IAAI,CAAC,KAAK,EAAE;AACZ,YAAA,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE;AACtB,QAAA,CAAC;QAlMG,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,KAAK,KAAK;QAC1C,IAAI,CAAC,WAAW,EAAE;AAClB,QAAA,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAEvC,IAAI,UAAU,EAAE;AACZ,YAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AACpB,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI;YACrB,IAAI,CAAC,KAAK,GAAG,IAAI,sBAAsB,CAAC,UAAU,CAAC;YACnD,IAAI,CAAC,KAAK,EAAE;QAChB;aAAO;AACH;;;AAGG;YACH,IAAI,CAAC,UAAU,EAAE;YACjB,IAAI,CAAC,KAAK,EAAE;QAChB;AAEA;;;AAGG;AACH,QAAA,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO;QACzB,IAAI,KAAK,EAAE;AACP,YAAA,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;AAC3B,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,UAAU,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAChE;IACJ;AAEA;;;;AAIG;IACH,GAAG,CAAC,IAAkB,EAAE,EAAiB,EAAA;QACrC,IAAI,IAAI,YAAY,QAAQ;AAAE,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QAC9C,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IAClC;AAEA;;;AAGG;IACH,IAAI,CAAC,QAA0B,EAAE,EAAiB,EAAA;QAC9C,OAAO,IAAI,CAAC,IAAI,CAAC;AACb,YAAA,IAAI,EAAE,QAAQ;YACd,EAAE;AACF,YAAA,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,GAAG,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE;AACzD,SAAA,CAAC;IACN;AAEA;;AAEG;IACH,QAAQ,CAAC,EAAiB,EAAE,QAA2B,EAAA;QACnD,OAAO,IAAI,CAAC,IAAI,CAAC;YACb,IAAI,EAAE,QAAQ,IAAI,EAAE;YACpB,EAAE;AACF,YAAA,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,GAAG,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE;AAC7D,SAAA,CAAC;IACf;AAEA;;AAEG;IACH,IAAI,CAAC,IAAqC,EAAE,EAAgB,EAAA;QACxD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;AAC3B,YAAA,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI;AAAE,gBAAA,KAAK,CAAC,EAAE,GAAG,EAAE;AAC1C,QAAA,CAAC,CAAC;AACF,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE;IAC5B;AAEA;;AAEG;AACH,IAAA,MAAM,CAAC,IAAqC,EAAA;QACxC,IAAI,IAAI,YAAY,QAAQ;AAAE,YAAA,IAAI,CAAC,MAAM,GAAG,SAAS;QACrD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;AAClE,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE;IAC5B;IAEA,KAAK,GAAA;AACD,QAAA,IAAI,CAAC,OAAO,GAAG,EAAE;AACjB,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE;IAC5B;AAEA;;;AAGG;AACH,IAAA,YAAY,CAAC,IAAY,EAAA;QACrB,IAAI,CAAC,KAAK,EAAE;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;IAChC;AAEA;;AAEG;AACH,IAAA,IAAI,CAAC,QAAsB,EAAA;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;AAClC,QAAA,OAAO,IAAI;IACf;AAEA;;AAEG;AACH,IAAA,MAAM,CAAC,QAAsB,EAAA;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;AAClC,QAAA,IAAI,CAAC,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,KAAK,GAAG,KAAK;AAChD,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;AACpB,QAAA,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,UAAU,EAAE;QAC/B,IAAI,CAAC,IAAI,EAAE;AACX,QAAA,OAAO,IAAI;IACf;IAEA,OAAO,GAAA;AACH,QAAA,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK;QACxB,IAAI,CAAC,IAAI,EAAE;AACX,QAAA,OAAO,IAAI;IACf;AAEA,IAAA,IAAI,QAAQ,GAAA;AACR,QAAA,OAAO,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC;IACxD;IAEA,IAAI,QAAQ,CAAC,QAAgB,EAAA;QACzB,IAAI,CAAC,IAAI,GAAG,QAAQ,GAAG,IAAI,CAAC,QAAQ;IACxC;AAEA,IAAA,IAAI,IAAI,GAAA;QACJ,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,IAAI,CAAC;IACnC;IAEA,IAAI,IAAI,CAAC,IAAY,EAAA;QACjB,IAAI,CAAC,KAAK,EAAE;AACZ,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AACpB,QAAA,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;AACtC,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,aAAa,EAAE;IAC3C;AAEA,IAAA,IAAI,KAAK,GAAA;QACL,OAAO,IAAI,CAAC,aAAa;IAC7B;IAEA,IAAI,KAAK,CAAC,KAAa,EAAA;AACnB,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK;AAC1B,QAAA,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;IAC5C;AAEA,IAAA,IAAI,QAAQ,GAAA;QACR,IAAI,CAAC,KAAK,EAAE;AACZ,QAAA,OAAO,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,aAAa;IACrE;AAEA,IAAA,IAAI,iBAAiB,GAAA;QACjB,IAAI,CAAC,KAAK,EAAE;QACZ,OAAO,IAAI,CAAC;AACR,cAAE,IAAI,CAAC,KAAM,CAAC;AACd,cAAE,IAAI,CAAC,aAAa;IAC5B;AAEA,IAAA,IAAI,KAAK,GAAA;QACL,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,KAAK,IAAI,MAAM;IACzC;AAEA,IAAA,IAAI,SAAS,GAAA;QACT,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,IAAI,IAAI;IAC3C;IAEA,IAAI,GAAA;QACA,IAAI,CAAC,KAAK,EAAE;AACZ,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;AACrB,QAAA,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE;AAElB;;;AAGG;AACH,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;YACb,IAAI,CAAC,WAAW,EAAE;YAClB,IAAI,CAAC,KAAK,EAAE;QAChB;IACJ;IAEA,KAAK,GAAA;QACD,IAAI,CAAC,KAAK,EAAE;AACZ,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AACpB,QAAA,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE;IACvB;IAOA,MAAM,GAAA;QACF,IAAI,CAAC,KAAK,EAAE;AACZ,QAAA,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE;IACxB;IAEA,QAAQ,GAAA;QACJ,IAAI,CAAC,KAAK,EAAE;AACZ,QAAA,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE;IAC1B;AAEA,IAAA,cAAc,CAAC,QAA8B,EAAA;QACzC,IAAI,CAAC,KAAK,EAAE;AACZ,QAAA,IAAI,CAAC,cAAc,GAAG,QAAQ;QAC9B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,KAAK,EAAE,cAAc,CAAC,QAAQ,CAAC;AAExD,QAAA,OAAO,MAAK;AACR,YAAA,IAAI,CAAC,cAAc,GAAG,SAAS;AAC/B,YAAA,IAAI,CAAC,YAAY,IAAI;AACzB,QAAA,CAAC;IACL;IAEA,IAAI,CAAC,SAAuB,EAAE,QAAuB,EAAA;QACjD,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC;IAClD;AAEA;;;AAGG;IACK,MAAM,GAAA;QACV,IAAI,CAAC,KAAK,EAAE;AACZ,QAAA,OAAO,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,GAAG,SAAS;IACjE;AAEQ,IAAA,IAAI,CAAC,KAAY,EAAA;AACrB,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;AACxB,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE;IAC5B;AAEA;;;AAGG;IACK,UAAU,GAAA;AACd,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACb,YAAA,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;QAC5B;AAAO,aAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AACtB,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI;YACnB,cAAc,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACtC;AACA,QAAA,OAAO,IAAI;IACf;AAEA;;;AAGG;IACK,KAAK,GAAA;AACT,QAAA,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,EAAE;IAChD;AAEQ,IAAA,KAAK,CAAC,MAAgB,EAAA;AAC1B,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;AACZ,YAAA,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;AAClB,YAAA,IAAI,CAAC,KAAK,GAAG,SAAS;QAC1B;AACA,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AACpB,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;IACxB;IAEQ,KAAK,GAAA;AACT,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AACpB,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK;AAEtB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK;QACvB,IAAI,IAAI,GAAG,CAAC;QAEZ,IAAI,IAAI,EAAE;AACN,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,YAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACrB;;;;AAIG;AACH,gBAAA,IAAI,CAAC,YAAY,IAAI;gBACrB,IAAI,CAAC,MAAM,EAAE;YACjB;iBAAO;AACH,gBAAA,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC;gBAC7C,MAAM,CAAC,IAAI,CAAC;YAChB;AACA,YAAA,IAAI,CAAC,YAAY,GAAG,KAAK;QAC7B;QAEA,MAAM,EACF,iBAAiB,EACjB,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,iBAAiB,EACjB,QAAQ,EACR,KAAK,EACL,GAAG,OAAO,EACb,GAAG,IAAI,CAAC,OAAO;AAEhB;;AAEG;QACH,MAAM,QAAQ,GAAoB,EAAE;AACpC,QAAA,IAAI,KAAK,EAAE,YAAY,KAAK,SAAS,EAAE;AACnC,YAAA,QAAQ,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY;QAC9C;AACA,QAAA,IAAI,KAAK,EAAE,cAAc,KAAK,SAAS,EAAE;AACrC,YAAA,QAAQ,CAAC,cAAc,GAAG,KAAK,CAAC,cAAc;QAClD;AACA,QAAA,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC;AAChC,QAAA,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB;QACzC,MAAM,IAAI,GAAiB,EAAE;QAC7B,MAAM,UAAU,GAAG,eAAe,CAC9B,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EACxB,EAAE,iBAAiB,EAAE,GAAG,QAAQ,EAAE,EAClC,KAAK,EACL,IAAI,CACP;AAED,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAO;QAC3B,IAAI,QAAQ,GAAG,QAAQ,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAS;AAElD;;;AAGG;AACH,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,GAAG,QAAQ,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC;QAC1D,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,KAAK,CAAC,CAAC;AAE9D;;;AAGG;AACH,QAAA,IAAI,CAAC,OAAO,GAAG,EAAE;QACjB,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,IAAI,KAAI;YAC7B,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAE;AAC/B,YAAA,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;YACnB,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC;AAC1C,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;AAC7B,QAAA,CAAC,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;AAC5C,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;AACpB,QAAA,IAAI,CAAC,aAAa,GAAG,QAAQ;AAE7B;;;AAGG;QACH,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,cAAc,GAAG,SAAS;AAC5C,QAAA,IACI,IAAI,CAAC,OAAO,CAAC,MAAM;YACnB,IAAI,CAAC,MAAM,KAAK,SAAS;YACzB,QAAQ;AACR,YAAA,QAAQ,EACV;AACE,YAAA,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YAC3C,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,KAAK,KAAK,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAClE,YAAA,UAAU,CAAC,OAAO,EACb,IAAI,CAAC,cAAc,GAAG,kBAAkB,CACrC,KAAK,EACL,CAAC,CAAC,EAAE,QAAQ,CAAC,EACb;AACI,gBAAA,GAAG,QAAQ;gBACX,QAAQ;AACR,gBAAA,IAAI,EAAE,QAAQ;aACjB,CACJ,EACJ;QACL;AAEA,QAAA,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,sBAAsB,CAAC,UAAU,CAAC,CAAC;QAEnE,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC;AAC/B,QAAA,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,GAAG,QAAQ;YAAE,IAAI,CAAC,WAAW,EAAE;AAEtD,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;YACrB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,cAAc,CAAC;QACjE;aAAO;AACH,YAAA,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,aAAa;YAChC,IAAI,IAAI,CAAC,QAAQ;gBAAE,KAAK,CAAC,KAAK,EAAE;AAChC,YAAA,IAAI,IAAI;AAAE,gBAAA,KAAK,CAAC,IAAI,GAAG,IAAI;QAC/B;AACA,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,aAAa,EAAE;AACvC;;;AAGG;AACH,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,IAAI,EAAE;QAE1B,IAAI,CAAC,KAAK,EAAE;IAChB;AAEQ,IAAA,UAAU,CAAC,OAA4B,EAAA;AAC3C,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,KAAI;YAC7C,IAAI,MAAM,EAAE;gBACR,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC;gBAChC,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YACjC;AACA,YAAA,IAAI,IAAI,YAAY,QAAQ,EAAE;AAC1B,gBAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE;YACrD;YACA,IAAI,OAAO,IAAI,KAAK,QAAQ;AAAE,gBAAA,OAAO,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YACpD,IAAI,EAAE,KAAK,SAAS;AAAE,gBAAA,OAAO,IAAe;AAC5C,YAAA,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI;AACrB,kBAAE,MAAM,CAAC,IAAI,EAAE,EAAE;AACjB,kBAAG,EAAE,GAAG,IAAI,EAAE,EAAE,EAAc;AACtC,QAAA,CAAC,CAAC;IACN;AAEQ,IAAA,OAAO,CAAC,QAAsB,EAAA;QAClC,IAAI,CAAC,KAAK,EAAE;QACZ,OAAO,OAAO,QAAQ,KAAK;AACvB,cAAE;AACF,cAAE,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI;IAC3D;AAEA;;AAEG;IACK,aAAa,GAAA;AACjB,QAAA,MAAM,EAAE,MAAM,GAAG,CAAC,EAAE,WAAW,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO;AAC/D,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,GAAG,WAAW;AAC9C,QAAA,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,IAAI,CAAC,IAAI,KAAK;AACrD,QAAA,OAAO,KAAK,IAAI,IAAI,GAAG;AACnB,cAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC;cACzC,CAAC;IACX;AAEQ,IAAA,OAAO,CAAC,IAAY,EAAA;AACxB,QAAA,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ;AAC5B,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;QACpB,IAAI,IAAI,CAAC,YAAY;YAAE;AAEvB,QAAA,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO;AAChE,QAAA,QAAQ,GAAG,IAAI,CAAC;AAEhB,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,EAAE;AACxC,QAAA,IAAI,WAAW,KAAK,IAAI,CAAC,WAAW,EAAE;AAClC,YAAA,IAAI,CAAC,WAAW,GAAG,WAAW;YAC9B,QAAQ,IAAI;AAEZ;;;;AAIG;AACH,YAAA,IAAI,UAAU,KAAK,MAAM,EAAE;AACvB,gBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC;AAChC,gBAAA,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,SAAS,GAAG,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,EAAE;oBAC1D;gBACJ;gBACA,QAAQ,GAAG,SAAS,GAAG,EAAE,GAAG,QAAQ;YACxC;QACJ;AAEA,QAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC;IAC9B;AAEA;;;AAGG;IACK,KAAK,CAAC,IAAY,EAAE,EAAU,EAAA;QAClC,IAAI,IAAI,KAAK,EAAE;YAAE;AAEjB,QAAA,MAAM,SAAS,GAAG,EAAE,GAAG,IAAI;AAC3B,QAAA,MAAM,OAAO,GAAG,CAAC,CAAS,KACtB,SAAS,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE;QAEzD,MAAM,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AACtE,QAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;AAC1B,YAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;gBAAE;AAC3B,YAAA,MAAM,CAAC,QAAQ,GAAG,SAAS,GAAG,CAAC,GAAG,EAAE,CAAC;YACrC,IAAI,MAAM,CAAC,KAAK;gBAAE,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;QACtD;AAEA,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;AACnD,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;AACzB,YAAA,IAAI,CAAC,MAAM,GAAG,SAAS;AACvB,YAAA,OAAO,IAAI;QACf;IACJ;AAEQ,IAAA,OAAO,CAAC,IAAY,EAAA;QACxB,IAAI,CAAC,KAAK,EAAE;AACZ,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI;AAChB,QAAA,OAAO,IAAI;IACf;IAEQ,KAAK,GAAA;AACT,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAM;AACzB,QAAA,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAK;YACrB,IAAI,KAAK,KAAK,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM;gBAAE;AACzC,YAAA,IAAI,CAAC,MAAM,GAAG,IAAI;YAClB,MAAM,EAAE,UAAU,EAAE,iBAAiB,EAAE,GAAG,IAAI,CAAC,OAAO;AACtD;;;AAGG;AACH,YAAA,MAAM,QAAQ,GACV,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,iBAAiB,KAAK,UAAU;YACvD,QAAQ,IAAI;YACZ,IAAI,CAAC,eAAe,EAAE;AAC1B,QAAA,CAAC,CAAC;IACN;IAEQ,WAAW,GAAA;AACf,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;QACnB,IAAI,CAAC,QAAQ,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,KAAI;AAC1C,YAAA,IAAI,CAAC,eAAe,GAAG,OAAO;AAClC,QAAA,CAAC,CAAC;IACN;AACH;;;;"}