From e50790466900dc5d925a314f68ffa6bbef200ad4 Mon Sep 17 00:00:00 2001 From: Melvin Chen Date: Thu, 1 Feb 2024 14:55:00 -0800 Subject: [PATCH 01/69] Remove old carousel package, add basic children rendering and test stubs --- .eslintrc | 3 +- packages/nuka/.storybook/main.js | 3 +- packages/nuka/src/Carousel/Carousel.css | 8 + .../nuka/src/Carousel/Carousel.stories.tsx | 37 + packages/nuka/src/Carousel/Carousel.test.tsx | 10 + packages/nuka/src/Carousel/Carousel.tsx | 14 + packages/nuka/src/announce-slide.tsx | 35 - packages/nuka/src/carousel.test.tsx | 337 -------- packages/nuka/src/carousel.tsx | 767 ------------------ packages/nuka/src/control-styles.ts | 66 -- packages/nuka/src/controls.tsx | 109 --- packages/nuka/src/default-carousel-props.tsx | 73 -- packages/nuka/src/default-controls.test.tsx | 267 ------ packages/nuka/src/default-controls.tsx | 334 -------- packages/nuka/src/hooks/use-forward-ref.ts | 17 - packages/nuka/src/hooks/use-frame-height.ts | 99 --- .../hooks/use-slide-intersection-observer.ts | 40 - packages/nuka/src/hooks/use-state-with-ref.ts | 30 - packages/nuka/src/hooks/use-tween.ts | 87 -- packages/nuka/src/index.ts | 0 packages/nuka/src/index.tsx | 3 - packages/nuka/src/slide.tsx | 185 ----- packages/nuka/src/slider-list.tsx | 186 ----- packages/nuka/src/types.ts | 474 ----------- packages/nuka/src/utils.test.ts | 250 ------ packages/nuka/src/utils.ts | 89 -- packages/nuka/stories/carousel.stories.tsx | 311 ------- packages/nuka/stories/images/1.png | Bin 1119 -> 0 bytes packages/nuka/stories/images/10.png | Bin 1187 -> 0 bytes packages/nuka/stories/images/11.png | Bin 1029 -> 0 bytes packages/nuka/stories/images/12.png | Bin 1212 -> 0 bytes packages/nuka/stories/images/13.png | Bin 1250 -> 0 bytes packages/nuka/stories/images/14.png | Bin 1115 -> 0 bytes packages/nuka/stories/images/2.png | Bin 1298 -> 0 bytes packages/nuka/stories/images/3.png | Bin 1325 -> 0 bytes packages/nuka/stories/images/4.png | Bin 1189 -> 0 bytes packages/nuka/stories/images/5.png | Bin 1293 -> 0 bytes packages/nuka/stories/images/6.png | Bin 1347 -> 0 bytes packages/nuka/stories/images/7.png | Bin 1183 -> 0 bytes packages/nuka/stories/images/8.png | Bin 1355 -> 0 bytes packages/nuka/stories/images/9.png | Bin 1340 -> 0 bytes packages/nuka/stories/sample-slide-images.ts | 38 - 42 files changed, 72 insertions(+), 3800 deletions(-) create mode 100644 packages/nuka/src/Carousel/Carousel.css create mode 100644 packages/nuka/src/Carousel/Carousel.stories.tsx create mode 100644 packages/nuka/src/Carousel/Carousel.test.tsx create mode 100644 packages/nuka/src/Carousel/Carousel.tsx delete mode 100644 packages/nuka/src/announce-slide.tsx delete mode 100644 packages/nuka/src/carousel.test.tsx delete mode 100644 packages/nuka/src/carousel.tsx delete mode 100644 packages/nuka/src/control-styles.ts delete mode 100644 packages/nuka/src/controls.tsx delete mode 100644 packages/nuka/src/default-carousel-props.tsx delete mode 100644 packages/nuka/src/default-controls.test.tsx delete mode 100644 packages/nuka/src/default-controls.tsx delete mode 100644 packages/nuka/src/hooks/use-forward-ref.ts delete mode 100644 packages/nuka/src/hooks/use-frame-height.ts delete mode 100644 packages/nuka/src/hooks/use-slide-intersection-observer.ts delete mode 100644 packages/nuka/src/hooks/use-state-with-ref.ts delete mode 100644 packages/nuka/src/hooks/use-tween.ts create mode 100644 packages/nuka/src/index.ts delete mode 100644 packages/nuka/src/index.tsx delete mode 100644 packages/nuka/src/slide.tsx delete mode 100644 packages/nuka/src/slider-list.tsx delete mode 100644 packages/nuka/src/types.ts delete mode 100644 packages/nuka/src/utils.test.ts delete mode 100644 packages/nuka/src/utils.ts delete mode 100644 packages/nuka/stories/carousel.stories.tsx delete mode 100644 packages/nuka/stories/images/1.png delete mode 100644 packages/nuka/stories/images/10.png delete mode 100644 packages/nuka/stories/images/11.png delete mode 100644 packages/nuka/stories/images/12.png delete mode 100644 packages/nuka/stories/images/13.png delete mode 100644 packages/nuka/stories/images/14.png delete mode 100644 packages/nuka/stories/images/2.png delete mode 100644 packages/nuka/stories/images/3.png delete mode 100644 packages/nuka/stories/images/4.png delete mode 100644 packages/nuka/stories/images/5.png delete mode 100644 packages/nuka/stories/images/6.png delete mode 100644 packages/nuka/stories/images/7.png delete mode 100644 packages/nuka/stories/images/8.png delete mode 100644 packages/nuka/stories/images/9.png delete mode 100644 packages/nuka/stories/sample-slide-images.ts diff --git a/.eslintrc b/.eslintrc index 97d99db8..53b2e58b 100644 --- a/.eslintrc +++ b/.eslintrc @@ -45,6 +45,7 @@ "react-hooks/rules-of-hooks": "error", "react-hooks/exhaustive-deps": "error", "@typescript-eslint/no-unused-vars": ["error"], - "@typescript-eslint/no-var-requires": 0 + "@typescript-eslint/no-var-requires": 0, + "react/react-in-jsx-scope": "off" } } diff --git a/packages/nuka/.storybook/main.js b/packages/nuka/.storybook/main.js index 17ccbf04..2bc68f4f 100644 --- a/packages/nuka/.storybook/main.js +++ b/packages/nuka/.storybook/main.js @@ -1,7 +1,6 @@ module.exports = { stories: [ - '../stories/**/*.stories.mdx', - '../stories/**/*.stories.@(js|jsx|ts|tsx)', + '../src/**/*.stories.@(js|jsx|ts|tsx)', ], addons: ['@storybook/addon-links', '@storybook/addon-essentials'], diff --git a/packages/nuka/src/Carousel/Carousel.css b/packages/nuka/src/Carousel/Carousel.css new file mode 100644 index 00000000..6b0e7d08 --- /dev/null +++ b/packages/nuka/src/Carousel/Carousel.css @@ -0,0 +1,8 @@ +.overflow { + overflow: scroll; + scroll-behavior: smooth; +} + +.wrapper { + display: flex; +} diff --git a/packages/nuka/src/Carousel/Carousel.stories.tsx b/packages/nuka/src/Carousel/Carousel.stories.tsx new file mode 100644 index 00000000..a0ca15c9 --- /dev/null +++ b/packages/nuka/src/Carousel/Carousel.stories.tsx @@ -0,0 +1,37 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import { Carousel } from './Carousel'; +import { CSSProperties } from 'react'; + +const meta: Meta = { + title: 'components/Carousel', + component: (props) => , + tags: ['autodocs'], +}; + +export default meta; + +type Story = StoryObj; + +const getExampleSlideStyles = (index: number): CSSProperties => ({ + backgroundColor: index % 2 == 0 ? 'gray' : 'lightGray', + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + padding: '15vw', +}); + +const Slide = ({ index }: { index: number }) => ( +
{index}
+); + +export const Default: Story = { + args: { + children: ( + <> + {[...Array(6)].map((_, index) => ( + + ))} + + ), + }, +}; diff --git a/packages/nuka/src/Carousel/Carousel.test.tsx b/packages/nuka/src/Carousel/Carousel.test.tsx new file mode 100644 index 00000000..342f4cf1 --- /dev/null +++ b/packages/nuka/src/Carousel/Carousel.test.tsx @@ -0,0 +1,10 @@ +describe('Carousel', () => { + it.todo('passes a className and ref for the parent'); + it.todo('passes the same className for each of the children'); + it.todo('is draggable through touch controls'); + it.todo('has a next and previous function that is callable from its parent'); + it.todo('can slide'); + it.todo('omits slides whose children are falsy'); + + it.todo('autoplays at the right rate'); +}); diff --git a/packages/nuka/src/Carousel/Carousel.tsx b/packages/nuka/src/Carousel/Carousel.tsx new file mode 100644 index 00000000..cbdbca86 --- /dev/null +++ b/packages/nuka/src/Carousel/Carousel.tsx @@ -0,0 +1,14 @@ +import { ReactNode } from 'react'; +import './Carousel.css'; + +type CarouselProps = { + children: ReactNode; +}; + +export const Carousel = ({ children }: CarouselProps) => { + return ( +
+
{children}
+
+ ); +}; diff --git a/packages/nuka/src/announce-slide.tsx b/packages/nuka/src/announce-slide.tsx deleted file mode 100644 index 049e3e97..00000000 --- a/packages/nuka/src/announce-slide.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import React, { AriaAttributes, CSSProperties } from 'react'; - -const styles: CSSProperties = { - position: 'absolute', - width: '1px', - height: '1px', - overflow: 'hidden', - padding: 0, - margin: '-1px', - clip: 'rect(0, 0, 0, 0)', - whiteSpace: 'nowrap', - border: 0, -}; - -const AnnounceSlide = ({ - message, - ariaLive = 'polite', -}: { - message: string; - ariaLive: AriaAttributes['aria-live']; -}): React.ReactElement => ( -
- {message} -
-); - -export const defaultRenderAnnounceSlideMessage = ({ - currentSlide, - count, -}: { - currentSlide: number; - count: number; -}): string => `Slide ${currentSlide + 1} of ${count}`; - -export default AnnounceSlide; diff --git a/packages/nuka/src/carousel.test.tsx b/packages/nuka/src/carousel.test.tsx deleted file mode 100644 index 661dc3eb..00000000 --- a/packages/nuka/src/carousel.test.tsx +++ /dev/null @@ -1,337 +0,0 @@ -/** - * @jest-environment jsdom - */ - -import React from 'react'; -import { - act, - fireEvent, - render, - screen, - waitFor, -} from '@testing-library/react'; -import Carousel from './carousel'; -import { CarouselProps } from './types'; -import { axe } from 'jest-axe'; - -// Fake timers using Jest -beforeEach(() => { - jest.useFakeTimers(); -}); - -// Running all pending timers and switching to real timers using Jest -afterEach(() => { - jest.runOnlyPendingTimers(); - jest.useRealTimers(); -}); - -async function hasNoViolations(html: Element) { - await waitFor(async () => { - expect(await axe(html)).toHaveNoViolations(); - }); -} - -/** - * Mock dimensions for the carousel for calculations where carousel dimensions - * are used, such as with dragging thresholds - */ -const createCarouselRefWithMockedDimensions = ({ defaultWidth = 600 } = {}) => { - let refValue: HTMLDivElement | null = null; - const widthGetterMock = jest.fn(() => defaultWidth); - - const carouselRef: React.MutableRefObject = Object.create( - {}, - { - current: { - get: () => refValue, - set(newValue) { - refValue = newValue; - if (refValue) { - Object.defineProperty(refValue, 'offsetWidth', { - get: widthGetterMock, - }); - } - }, - }, - } - ); - - return { ref: carouselRef, widthGetterMock }; -}; - -describe('Carousel', () => { - const renderCarousel = ({ - slideCount = 5, - ...props - }: CarouselProps & { - slideCount?: number; - ref?: React.RefObject; - } = {}) => - render( - - {[...Array(slideCount)].map((_, index) => ( - {`slide - ))} - - ); - - it('autoplays at the right rate', async () => { - const beforeSlide = jest.fn(); - const afterSlide = jest.fn(); - const speed = 500; - const autoplayInterval = 1000; - const slideCount = 2; - - const { container } = renderCarousel({ - slideCount, - autoplay: true, - autoplayInterval, - speed, - wrapAround: true, - beforeSlide, - afterSlide, - }); - - expect(beforeSlide).toHaveBeenCalledTimes(0); - expect(afterSlide).toHaveBeenCalledTimes(0); - - // autoplay initiated, waiting for first interval - - act(() => { - jest.advanceTimersByTime(autoplayInterval); - }); - - expect(beforeSlide).toHaveBeenCalledTimes(1); - expect(afterSlide).toHaveBeenCalledTimes(0); - - const checkTimingCycle = (timesMoved: number) => { - // Animation begins, and next autoplay timeout set up - - act(() => { - jest.advanceTimersByTime(speed); - }); - - // Animation completes - - expect(beforeSlide).toHaveBeenCalledTimes(timesMoved); - expect(afterSlide).toHaveBeenCalledTimes(timesMoved); - expect(afterSlide).toHaveBeenLastCalledWith(timesMoved % slideCount); - - act(() => { - jest.advanceTimersByTime(autoplayInterval - speed); - }); - - // autoplay timeout triggers - - expect(beforeSlide).toHaveBeenCalledTimes(timesMoved + 1); - expect(afterSlide).toHaveBeenCalledTimes(timesMoved); - }; - - checkTimingCycle(1); - checkTimingCycle(2); - checkTimingCycle(3); - - await hasNoViolations(container); - }); - - it('omits slides whose children are falsy', async () => { - const { container } = render( - - {`slide - {`slide - {false && {`slide} - {null} - {`slide - - ); - - expect(container.getElementsByClassName('slide').length).toBe(3); - await hasNoViolations(container); - }); - - it('can be controlled with the keyboard', async () => { - const carouselId = 'keyboard'; - const beforeSlide = jest.fn(); - const keyCodeConfig = { - nextSlide: [39], - previousSlide: [37], - firstSlide: [81], - lastSlide: [69], - pause: [32], - }; - const slideCount = 8; - const { container } = renderCarousel({ - enableKeyboardControls: true, - keyCodeConfig, - slideCount, - beforeSlide, - frameAriaLabel: 'keyboard', - landmark: true, - carouselId, - }); - - const sliderFrame = screen.getByTestId(`${carouselId}-slider-frame`); - - fireEvent.keyDown(sliderFrame, { keyCode: keyCodeConfig.nextSlide[0] }); - expect(beforeSlide).toHaveBeenLastCalledWith(0, 1); - - fireEvent.keyDown(sliderFrame, { keyCode: keyCodeConfig.nextSlide[0] }); - expect(beforeSlide).toHaveBeenLastCalledWith(1, 2); - - fireEvent.keyDown(sliderFrame, { - keyCode: keyCodeConfig.previousSlide[0], - }); - expect(beforeSlide).toHaveBeenLastCalledWith(2, 1); - - fireEvent.keyDown(sliderFrame, { - keyCode: keyCodeConfig.previousSlide[0], - }); - expect(beforeSlide).toHaveBeenLastCalledWith(1, 0); - - fireEvent.keyDown(sliderFrame, { keyCode: keyCodeConfig.lastSlide[0] }); - expect(beforeSlide).toHaveBeenLastCalledWith(0, slideCount - 1); - - fireEvent.keyDown(sliderFrame, { keyCode: keyCodeConfig.firstSlide[0] }); - expect(beforeSlide).toHaveBeenLastCalledWith(slideCount - 1, 0); - - await hasNoViolations(container); - }); - - it('detects user-triggered navigation', async () => { - const carouselId = 'user-navigation'; - const beforeSlide = jest.fn(); - const onUserNavigation = jest.fn(); - const keyCodeConfig = { - nextSlide: [39], - previousSlide: [37], - firstSlide: [81], - lastSlide: [69], - pause: [32], - }; - const autoplayInterval = 3000; - const slideCount = 8; - const { container } = renderCarousel({ - enableKeyboardControls: true, - autoplay: true, - autoplayInterval, - keyCodeConfig, - ref: createCarouselRefWithMockedDimensions().ref, - slideCount, - beforeSlide, - onUserNavigation, - carouselId, - }); - - expect(onUserNavigation).toHaveBeenCalledTimes(0); - - // Let enough time pass that autoplay triggers navigation - act(() => { - jest.advanceTimersByTime(autoplayInterval); - }); - - // Make sure the navigation happened, but did not trigger the - // `onUserNavigation` callback (because it wasn't user-initiated) - expect(onUserNavigation).toHaveBeenCalledTimes(0); - expect(beforeSlide).toHaveBeenLastCalledWith(0, 1); - - const sliderFrame = screen.getByTestId(`${carouselId}-slider-frame`); - - // Simulating keyboard shortcut use to navigate - fireEvent.keyDown(sliderFrame, { keyCode: keyCodeConfig.nextSlide[0] }); - expect(beforeSlide).toHaveBeenLastCalledWith(1, 2); - expect(onUserNavigation).toHaveBeenCalledTimes(1); - - fireEvent.keyDown(sliderFrame, { - keyCode: keyCodeConfig.previousSlide[0], - }); - expect(onUserNavigation).toHaveBeenCalledTimes(2); - - fireEvent.keyDown(sliderFrame, { keyCode: keyCodeConfig.lastSlide[0] }); - expect(onUserNavigation).toHaveBeenCalledTimes(3); - - fireEvent.keyDown(sliderFrame, { keyCode: keyCodeConfig.firstSlide[0] }); - expect(onUserNavigation).toHaveBeenCalledTimes(4); - - // Simulating clicks on default controls to navigate - fireEvent.click(screen.getByRole('button', { name: /next/ })); - expect(onUserNavigation).toHaveBeenCalledTimes(5); - - fireEvent.click(screen.getByRole('button', { name: /prev/ })); - expect(onUserNavigation).toHaveBeenCalledTimes(6); - - fireEvent.click(screen.getByRole('tab', { name: /slide 2/ })); - expect(onUserNavigation).toHaveBeenCalledTimes(7); - - // Simulating drag to navigate - fireEvent.mouseDown(sliderFrame, { clientX: 100 }); - fireEvent.mouseMove(sliderFrame, { clientX: 100 }); - jest.advanceTimersByTime(100); - fireEvent.mouseMove(sliderFrame, { clientX: 700 }); - fireEvent.mouseUp(sliderFrame, { clientX: 700 }); - expect(onUserNavigation).toHaveBeenCalledTimes(8); - - // Simulating swipe to navigate - fireEvent.touchStart(sliderFrame, { touches: [{ pageX: 700 }] }); - fireEvent.touchMove(sliderFrame, { touches: [{ pageX: 700 }] }); - jest.advanceTimersByTime(100); - fireEvent.touchMove(sliderFrame, { touches: [{ pageX: 100 }] }); - fireEvent.touchEnd(sliderFrame, { touches: [{ pageX: 100 }] }); - expect(onUserNavigation).toHaveBeenCalledTimes(9); - - // Should not be triggering navigation callback when dragging didn't trigger navigation - fireEvent.mouseDown(sliderFrame, { clientX: 100 }); - fireEvent.mouseMove(sliderFrame, { clientX: 100 }); - jest.advanceTimersByTime(10); - fireEvent.mouseMove(sliderFrame, { clientX: 105 }); - fireEvent.mouseUp(sliderFrame, { clientX: 105 }); - expect(onUserNavigation).toHaveBeenCalledTimes(9); - - await hasNoViolations(container); - }); - - it('calls default control callbacks when interacted with', async () => { - const beforeSlide = jest.fn(); - const nextButtonOnClick = jest.fn(); - const prevButtonOnClick = jest.fn(); - const pagingDotsOnClick = jest.fn(); - const slideCount = 8; - - const { container } = renderCarousel({ - slideCount, - beforeSlide, - defaultControlsConfig: { - nextButtonOnClick, - prevButtonOnClick, - pagingDotsOnClick, - }, - }); - - // Simulating clicks on default controls to navigate - expect(nextButtonOnClick).toHaveBeenCalledTimes(0); - fireEvent.click(screen.getByRole('button', { name: /next/ })); - expect(nextButtonOnClick).toHaveBeenCalledTimes(1); - - expect(prevButtonOnClick).toHaveBeenCalledTimes(0); - fireEvent.click(screen.getByRole('button', { name: /prev/ })); - expect(prevButtonOnClick).toHaveBeenCalledTimes(1); - - expect(pagingDotsOnClick).toHaveBeenCalledTimes(0); - fireEvent.click(screen.getByRole('tab', { name: /slide 2/ })); - expect(pagingDotsOnClick).toHaveBeenCalledTimes(1); - - // Check that calling preventDefault in the custom callback will stop the - // default behavior (navigation) before it happens - const preventDefault = (event: React.FormEvent) => event.preventDefault(); - nextButtonOnClick.mockImplementation(preventDefault); - prevButtonOnClick.mockImplementation(preventDefault); - pagingDotsOnClick.mockImplementation(preventDefault); - - expect(beforeSlide).toHaveBeenCalledTimes(3); - fireEvent.click(screen.getByRole('button', { name: /next/ })); - fireEvent.click(screen.getByRole('button', { name: /prev/ })); - fireEvent.click(screen.getByRole('tab', { name: /slide 2/ })); - expect(beforeSlide).toHaveBeenCalledTimes(3); - - await hasNoViolations(container); - }); -}); diff --git a/packages/nuka/src/carousel.tsx b/packages/nuka/src/carousel.tsx deleted file mode 100644 index 41cc7120..00000000 --- a/packages/nuka/src/carousel.tsx +++ /dev/null @@ -1,767 +0,0 @@ -import React, { useEffect, useState, useRef, useCallback, useId } from 'react'; -import Slide from './slide'; -import AnnounceSlide from './announce-slide'; -import { getPercentOffsetForSlide, SliderList } from './slider-list'; -import { - CarouselProps, - CellAlign, - InternalCarouselProps, - KeyCodeConfig, - KeyCodeFunction, - ScrollMode, -} from './types'; -import renderControls from './controls'; -import defaultProps from './default-carousel-props'; -import { - getNextMoveIndex, - getPrevMoveIndex, - getDefaultSlideIndex, - getBoundedIndex, -} from './utils'; -import { useFrameHeight } from './hooks/use-frame-height'; -import { getDotIndexes } from './default-controls'; -import { useForwardRef } from './hooks/use-forward-ref'; - -export const Carousel = React.forwardRef( - (rawProps, ref): React.ReactElement => { - /** - * We need this cast because we want the component's properties to seem - * optional to external users, but always-present for the internal - * implementation. - * - * This cast is safe due to the `Carousel.defaultProps = defaultProps;` - * statement below. That guarantees all the properties are present, since - * `defaultProps` has type `InternalCarouselProps`. - */ - const props = rawProps as InternalCarouselProps; - const internalCarouselId = useId(); - - const { - adaptiveHeight, - adaptiveHeightAnimation, - afterSlide, - animation, - autoplay, - autoplayInterval, - autoplayReverse, - beforeSlide, - carouselId = internalCarouselId, - cellAlign: propsCellAlign, - cellSpacing, - children, - className, - disableAnimation, - dragging: desktopDraggingEnabled, - dragThreshold: propsDragThreshold, - enableKeyboardControls, - frameAriaLabel, - keyCodeConfig, - landmark, - onDrag, - onDragEnd, - onDragStart, - onUserNavigation, - pauseOnHover, - renderAnnounceSlideMessage, - scrollMode: propsScrollMode, - slideIndex, - slidesToScroll: propsSlidesToScroll, - slidesToShow: propsSlidesToShow, - slideWidth, - speed, - style, - swiping: mobileDraggingEnabled, - tabbed, - wrapAround, - zoomScale, - } = props; - - const filteredSlides = React.Children.toArray(children).filter(Boolean); - const slideCount = filteredSlides.length; - - const cellAlign: CellAlign = - slideWidth || propsSlidesToScroll === 'auto' ? 'left' : propsCellAlign; - - const scrollMode: ScrollMode = - propsSlidesToScroll === 'auto' ? ScrollMode.remainder : propsScrollMode; - - const [slideIOEntries, setSlideIOEntries] = useState( - new Map() - ); - - const visibleCount = Array.from(slideIOEntries).filter( - ([, visible]) => visible - ).length; - - const [constantVisibleCount, setConstantVisibleCount] = - useState(visibleCount); - - const slidesToShow = slideWidth ? constantVisibleCount : propsSlidesToShow; - - const slidesToScroll = - animation === 'fade' - ? slidesToShow - : propsSlidesToScroll === 'auto' - ? Math.max(constantVisibleCount, 1) - : propsSlidesToScroll; - - const [currentSlide, setCurrentSlide] = useState(() => - getDefaultSlideIndex( - slideIndex, - slideCount, - slidesToShow, - slidesToScroll, - cellAlign, - autoplayReverse, - scrollMode - ) - ); - const [pause, setPause] = useState(false); - const [isDragging, setIsDragging] = useState(false); - const [dragDistance, setDragDistance] = useState(0); - const [animationDistance, setAnimationDistance] = useState(0); - const [isAnimating, setIsAnimating] = useState(false); - - const updateSlideIOEntry = useCallback( - (id: string, isFullyVisible: boolean) => { - if (!!slideIOEntries.get(id) === isFullyVisible) return; - - setSlideIOEntries((prev) => { - const newMap = new Map(prev); - newMap.set(id, isFullyVisible); - return newMap; - }); - }, - [slideIOEntries] - ); - - const prevDragged = useRef(false); - - useEffect(() => { - if (isDragging) prevDragged.current = true; - - if (!(isDragging || isAnimating)) { - // Wait for the animation to complete after dragging - if (!prevDragged.current) setConstantVisibleCount(visibleCount); - prevDragged.current = false; - } - }, [isAnimating, isDragging, visibleCount]); - - const prevXPosition = useRef(null); - const preDragOffset = useRef(0); - const sliderListRef = useRef(null); - const defaultCarouselRef = useRef(null); - const autoplayTimeout = useRef>(); - const autoplayLastTriggeredRef = useRef(null); - const isMounted = useRef(true); - - const setSliderListRef = useCallback((node: HTMLDivElement) => { - if (node) { - // disable img draggable attribute by default, this will improve the dragging - // applying the querySelectorAll on just the descendants of the sliderList prevents - // impacting DOM elements outside our scope - node - .querySelectorAll('.slider-list img') - .forEach((el) => el.setAttribute('draggable', 'false')); - } - sliderListRef.current = node; - }, []); - - useEffect(() => { - isMounted.current = true; - return () => { - isMounted.current = false; - }; - }, []); - - const forwardedRef = useForwardRef(ref); - const carouselRef = forwardedRef || defaultCarouselRef; - - const goToSlide = useCallback( - (targetSlideUnbounded: number) => { - if (!sliderListRef.current || !carouselRef.current) return; - - const targetSlideBounded = getBoundedIndex( - targetSlideUnbounded, - slideCount - ); - - const slideChanged = targetSlideUnbounded !== currentSlide; - slideChanged && beforeSlide(currentSlide, targetSlideBounded); - - // Calculate the distance the slide transition animation needs to cover. - const currentOffset = - sliderListRef.current.getBoundingClientRect().left - - carouselRef.current.getBoundingClientRect().left; - const sliderWidth = sliderListRef.current.offsetWidth; - let targetOffset = - (getPercentOffsetForSlide( - targetSlideBounded, - slideCount, - slidesToShow, - cellAlign, - wrapAround - ) / - 100) * - sliderWidth; - if (wrapAround) { - // We have to do a bit of a recovery effort to figure out the closest - // offset based on the direction we're going in the slides. The reason - // it's complicated is because, when wrapped, both the current offset - // and the calculated target offset are based on bounded slide indices - - // that is, when wrapping, we often skip back to the first or last slide - // seamlessly to make the carousel appear to infinitely repeat - - // The DOM width of `slideCount` slides - const slideSetWidth = sliderWidth / 3; - - if (targetSlideUnbounded < 0) { - targetOffset += slideSetWidth; - } - if (targetSlideUnbounded >= slideCount) { - targetOffset -= slideSetWidth; - } - } - - setAnimationDistance(targetOffset - currentOffset); - - if (slideChanged) { - setCurrentSlide(targetSlideBounded); - - // if animation is disabled decrease the speed to 40 - const msToEndOfAnimation = !disableAnimation ? speed || 500 : 40; - setTimeout(() => { - if (!isMounted.current) return; - afterSlide(targetSlideBounded); - }, msToEndOfAnimation); - } - }, - [ - afterSlide, - beforeSlide, - carouselRef, - cellAlign, - currentSlide, - disableAnimation, - speed, - slideCount, - slidesToShow, - wrapAround, - ] - ); - - const nextSlide = useCallback(() => { - const nextSlideIndex = getNextMoveIndex( - scrollMode, - wrapAround, - currentSlide, - slideCount, - slidesToScroll, - slidesToShow, - cellAlign - ); - - if (currentSlide !== nextSlideIndex) { - goToSlide(nextSlideIndex); - } - }, [ - cellAlign, - currentSlide, - goToSlide, - slidesToScroll, - scrollMode, - slideCount, - slidesToShow, - wrapAround, - ]); - - const prevSlide = useCallback(() => { - const prevSlideIndex = getPrevMoveIndex( - scrollMode, - wrapAround, - currentSlide, - slidesToScroll, - slidesToShow, - cellAlign - ); - - if (currentSlide !== prevSlideIndex) { - goToSlide(prevSlideIndex); - } - }, [ - cellAlign, - currentSlide, - goToSlide, - slidesToScroll, - scrollMode, - slidesToShow, - wrapAround, - ]); - - // When user changed the slideIndex property from outside. - const prevMovedToSlideIndex = useRef(slideIndex); - useEffect(() => { - if ( - slideIndex !== undefined && - slideIndex !== prevMovedToSlideIndex.current && - !autoplayReverse - ) { - goToSlide(slideIndex); - prevMovedToSlideIndex.current = slideIndex; - } - }, [slideIndex, autoplayReverse, goToSlide]); - - useEffect(() => { - let pauseStarted: number | null = null; - - // Keep track of when autoplay was paused so we can resume it with the same - // remaining time to the next slide transition - if (pause) { - pauseStarted = Date.now(); - } - - return () => { - if ( - pauseStarted !== null && - autoplayLastTriggeredRef.current !== null - ) { - autoplayLastTriggeredRef.current += Date.now() - pauseStarted; - } - }; - }, [pause]); - - useEffect(() => { - if (autoplay && !pause) { - // Adjust the timeout duration to account for changes that triggered the - // re-creation of this timeout, such as the currentSlide being changed - // periodically to make wrapAround loop forever - const adjustedTimeoutMs = - autoplayLastTriggeredRef.current !== null - ? autoplayInterval - (Date.now() - autoplayLastTriggeredRef.current) - : autoplayInterval; - - autoplayTimeout.current = setTimeout(() => { - autoplayLastTriggeredRef.current = Date.now(); - - if (autoplayReverse) { - prevSlide(); - } else { - nextSlide(); - } - }, adjustedTimeoutMs); - } - - // Clear the timeout if user hover on carousel - if (autoplay && pause) { - clearTimeout(autoplayTimeout.current); - } - - return () => { - clearTimeout(autoplayTimeout.current); - }; - }, [ - pause, - autoplay, - autoplayInterval, - autoplayReverse, - prevSlide, - nextSlide, - ]); - - const onKeyDown = (event: React.KeyboardEvent) => { - let keyCommand: KeyCodeFunction = null; - (Object.keys(keyCodeConfig) as (keyof KeyCodeConfig)[]).forEach( - (command) => { - if (keyCodeConfig[command]?.includes(event.keyCode)) { - keyCommand = command; - } - } - ); - - if (keyCommand === null) return; - - // At this point we know some action is going to be triggered, so we - // preventDefault to avoid the browser interpreting the key event and - // stopPropagation to avoid any higher-up handlers from interpreting it. - event.preventDefault(); - event.stopPropagation(); - - switch (keyCommand) { - case 'nextSlide': - onUserNavigation(event); - nextSlide(); - break; - case 'previousSlide': - onUserNavigation(event); - prevSlide(); - break; - case 'firstSlide': - case 'lastSlide': { - onUserNavigation(event); - - const dotIndices = getDotIndexes( - slideCount, - slidesToScroll, - scrollMode, - slidesToShow, - wrapAround, - cellAlign - ); - - if (keyCommand === 'firstSlide') { - goToSlide(dotIndices[0]); - } else { - goToSlide(dotIndices[dotIndices.length - 1]); - } - break; - } - case 'pause': - setPause((p) => !p); - break; - } - }; - - const dragPositions = useRef<{ pos: number; time: number }[]>([]); - - const handleDragEnd = ( - e: React.MouseEvent | React.TouchEvent - ) => { - if (!isDragging || !carouselRef.current) return; - - setIsDragging(false); - - // Inertia calculation is used to allow quick flicks to scroll the carousel - // where they might not based on the start and end points of the gesture - // alone. In certain conditions, the inertia may also scroll the carousel - // several times. - let distanceFromInertia = 0; - if (dragPositions.current.length > 1) { - const startMove = dragPositions.current[0]; - const endMove = dragPositions.current[dragPositions.current.length - 1]; - const timeOffset = endMove.time - startMove.time; - const goodInertiaFeelConstant = 9; - const goodFrictionFeelConstant = 0.92; - const initialVelocity = - goodInertiaFeelConstant * - Math.abs((endMove.pos - startMove.pos) / timeOffset); - let velocity = initialVelocity; - - while (Math.abs(velocity) > 1) { - distanceFromInertia += velocity; - velocity *= goodFrictionFeelConstant; - } - } - dragPositions.current = []; - - const adjustedDragDistance = - Math.abs(dragDistance) + Math.abs(distanceFromInertia); - - onDragEnd(e); - - prevXPosition.current = null; - setDragDistance(0); - - const oneScrollWidth = - carouselRef.current.offsetWidth * - Math.min(1, slidesToScroll / slidesToShow); - const dragThreshold = oneScrollWidth * propsDragThreshold; - - if (adjustedDragDistance < dragThreshold) { - goToSlide(currentSlide); - return; - } - - // If skipping over multiple slides at a time is still roughly trackable by - // your eyes, we allow for skipping multiple slides with a single gesture. - // This formula is just based off an observation that it is confusing to - // skip from slides 1 to 3 when only one slide is shown at a time, but - // skipping from 1 to 4 or so with two slides shown at a time is pulled-back - // enough that you can still roughly keep track of your place in the - // carousel. - const canMaintainVisualContinuity = slidesToShow >= 2 * slidesToScroll; - const timesToMove = canMaintainVisualContinuity - ? 1 + - Math.floor((adjustedDragDistance - dragThreshold) / oneScrollWidth) - : 1; - - let nextSlideIndex = currentSlide; - for (let index = 0; index < timesToMove; index += 1) { - if (dragDistance > 0) { - nextSlideIndex = getNextMoveIndex( - scrollMode, - wrapAround, - nextSlideIndex, - slideCount, - slidesToScroll, - slidesToShow, - cellAlign - ); - } else { - nextSlideIndex = getPrevMoveIndex( - scrollMode, - wrapAround, - nextSlideIndex, - slidesToScroll, - slidesToShow, - cellAlign - ); - } - } - - if (nextSlideIndex !== currentSlide) { - onUserNavigation(e); - } - - goToSlide(nextSlideIndex); - }; - - const onTouchStart = useCallback( - (e: React.TouchEvent) => { - if ( - !mobileDraggingEnabled || - !sliderListRef.current || - !carouselRef.current - ) { - return; - } - setIsDragging(true); - preDragOffset.current = - sliderListRef.current.getBoundingClientRect().left - - carouselRef.current.getBoundingClientRect().left; - - onDragStart(e); - }, - [carouselRef, onDragStart, mobileDraggingEnabled] - ); - - const handlePointerMove = useCallback( - (xPosition: number) => { - if (!isDragging) return; - - const isFirstMove = prevXPosition.current === null; - const delta = - prevXPosition.current !== null - ? xPosition - prevXPosition.current - : 0; - const nextDragDistance = dragDistance + delta; - - const now = Date.now(); - // Maintain a buffer of drag positions from the last 100ms - while (dragPositions.current.length > 0) { - if (now - dragPositions.current[0].time <= 100) { - break; - } - dragPositions.current.shift(); - } - dragPositions.current.push({ pos: nextDragDistance, time: now }); - - if (!isFirstMove) { - // nextDragDistance will always be `0` on the first move event, so we - // skip it because the value is already set to 0 at this point - setDragDistance(nextDragDistance); - } - - prevXPosition.current = xPosition; - }, - [isDragging, dragDistance] - ); - - const onTouchMove = useCallback( - (e: React.TouchEvent) => { - if (!isDragging || !carouselRef.current) return; - - onDragStart(e); - - const moveValue = carouselRef.current.offsetWidth - e.touches[0].pageX; - - handlePointerMove(moveValue); - }, - [isDragging, carouselRef, handlePointerMove, onDragStart] - ); - - const onMouseDown = useCallback( - (e: React.MouseEvent) => { - if ( - !desktopDraggingEnabled || - !sliderListRef.current || - !carouselRef.current - ) - return; - - setIsDragging(true); - - preDragOffset.current = - sliderListRef.current.getBoundingClientRect().left - - carouselRef.current.getBoundingClientRect().left; - - onDragStart(e); - }, - [carouselRef, desktopDraggingEnabled, onDragStart] - ); - - const onMouseMove = useCallback( - (e: React.MouseEvent) => { - if (!isDragging || !carouselRef.current) return; - - onDrag(e); - - const offsetX = - e.clientX - carouselRef.current.getBoundingClientRect().left; - const moveValue = carouselRef.current.offsetWidth - offsetX; - - handlePointerMove(moveValue); - }, - [carouselRef, isDragging, handlePointerMove, onDrag] - ); - - const onMouseUp = (e: React.MouseEvent) => { - e.preventDefault(); - handleDragEnd(e); - }; - - const onMouseEnter = useCallback(() => { - if (pauseOnHover) { - setPause(true); - } - }, [pauseOnHover]); - - const onMouseLeave = useCallback(() => { - if (pauseOnHover) { - setPause(false); - } - }, [pauseOnHover]); - - const { - frameHeight, - handleVisibleSlideHeightChange, - initializedAdaptiveHeight, - } = useFrameHeight(adaptiveHeight, slidesToShow, slideCount); - - const renderSlides = (typeOfSlide?: 'prev-cloned' | 'next-cloned') => { - const slides = filteredSlides.map((child, index) => { - return ( - - {child} - - ); - }); - - return slides; - }; - - return ( -
- - - {renderControls( - { ...props, carouselId }, - slideCount, - currentSlide, - goToSlide, - nextSlide, - prevSlide, - slidesToScroll - )} - -
- - {wrapAround ? renderSlides('prev-cloned') : null} - {renderSlides()} - {wrapAround ? renderSlides('next-cloned') : null} - -
-
- ); - } -); - -Carousel.defaultProps = defaultProps; -Carousel.displayName = 'Carousel'; - -export default Carousel; diff --git a/packages/nuka/src/control-styles.ts b/packages/nuka/src/control-styles.ts deleted file mode 100644 index 66328e0a..00000000 --- a/packages/nuka/src/control-styles.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { CSSProperties } from 'react'; -import { Positions } from './types'; - -const commonStyles: CSSProperties = { - position: 'absolute', - display: 'flex', - zIndex: 1, - top: 0, - left: 0, - bottom: 0, - right: 0, -}; - -/** - * Gets flexbox alignment and justify-content styles for a given position. - */ -const getControlContainerFlexStyles = (pos: Positions): CSSProperties => { - let alignItems: CSSProperties['alignItems']; - - switch (pos) { - case Positions.TopLeft: - case Positions.TopCenter: - case Positions.TopRight: - alignItems = 'flex-start'; - break; - case Positions.CenterLeft: - case Positions.CenterCenter: - case Positions.CenterRight: - alignItems = 'center'; - break; - case Positions.BottomLeft: - case Positions.BottomCenter: - case Positions.BottomRight: - alignItems = 'flex-end'; - break; - } - - let justifyContent: CSSProperties['justifyContent']; - switch (pos) { - case Positions.TopLeft: - case Positions.CenterLeft: - case Positions.BottomLeft: - justifyContent = 'flex-start'; - break; - case Positions.TopCenter: - case Positions.CenterCenter: - case Positions.BottomCenter: - justifyContent = 'center'; - break; - case Positions.TopRight: - case Positions.CenterRight: - case Positions.BottomRight: - justifyContent = 'flex-end'; - break; - } - - return { alignItems, justifyContent }; -}; - -/** - * Gets the styles for a back/forward control container to align the control - * properly within the parent. - */ -export const getControlContainerStyles = (pos: Positions): CSSProperties => { - return { ...getControlContainerFlexStyles(pos), ...commonStyles }; -}; diff --git a/packages/nuka/src/controls.tsx b/packages/nuka/src/controls.tsx deleted file mode 100644 index f212b357..00000000 --- a/packages/nuka/src/controls.tsx +++ /dev/null @@ -1,109 +0,0 @@ -import React, { Fragment } from 'react'; -import { getControlContainerStyles } from './control-styles'; -import { - getDotIndexes, - nextButtonDisabled, - prevButtonDisabled, -} from './default-controls'; -import { - InternalCarouselProps, - Positions, - RenderControlFunctionNames, -} from './types'; - -type ControlMap = { funcName: RenderControlFunctionNames; key: Positions }[]; -const controlsMap: ControlMap = [ - { funcName: 'renderTopLeftControls', key: Positions.TopLeft }, - { funcName: 'renderTopCenterControls', key: Positions.TopCenter }, - { funcName: 'renderTopRightControls', key: Positions.TopRight }, - { funcName: 'renderCenterLeftControls', key: Positions.CenterLeft }, - { funcName: 'renderCenterCenterControls', key: Positions.CenterCenter }, - { funcName: 'renderCenterRightControls', key: Positions.CenterRight }, - { funcName: 'renderBottomLeftControls', key: Positions.BottomLeft }, - { funcName: 'renderBottomCenterControls', key: Positions.BottomCenter }, - { funcName: 'renderBottomRightControls', key: Positions.BottomRight }, -]; - -const renderControls = ( - props: InternalCarouselProps, - slideCount: number, - currentSlide: number, - goToSlide: (targetSlideIndex: number) => void, - nextSlide: () => void, - prevSlide: () => void, - slidesToScroll: number -): React.ReactElement[] | null => { - if (props.withoutControls) { - return null; - } - - const disableCheckProps = { - ...props, - currentSlide, - slideCount, - }; - const nextDisabled = nextButtonDisabled(disableCheckProps); - const previousDisabled = prevButtonDisabled(disableCheckProps); - const pagingDotsIndices = getDotIndexes( - slideCount, - slidesToScroll, - props.scrollMode, - props.slidesToShow, - props.wrapAround, - props.cellAlign - ); - - return controlsMap.map((control) => { - if ( - !props[control.funcName] || - typeof props[control.funcName] !== 'function' - ) { - return ; - } - return ( -
-
- {props[control.funcName]?.({ - cellAlign: props.cellAlign, - cellSpacing: props.cellSpacing, - currentSlide, - defaultControlsConfig: props.defaultControlsConfig || {}, - carouselId: props.carouselId, - pagingDotsIndices, - goToSlide, - nextDisabled, - nextSlide, - onUserNavigation: props.onUserNavigation, - previousDisabled, - previousSlide: prevSlide, - scrollMode: props.scrollMode, - slideCount, - slidesToScroll, - slidesToShow: props.slidesToShow || 1, - tabbed: props.tabbed, - vertical: props.vertical, - wrapAround: props.wrapAround, - })} -
-
- ); - }); -}; - -export default renderControls; diff --git a/packages/nuka/src/default-carousel-props.tsx b/packages/nuka/src/default-carousel-props.tsx deleted file mode 100644 index 86219cca..00000000 --- a/packages/nuka/src/default-carousel-props.tsx +++ /dev/null @@ -1,73 +0,0 @@ -import React from 'react'; -import { InternalCarouselProps, ControlProps, ScrollMode } from './types'; -import { NextButton, PagingDots, PreviousButton } from './default-controls'; -import { defaultRenderAnnounceSlideMessage } from './announce-slide'; - -const easeOut = (t: number) => (t - 1) ** 3 + 1; - -const defaultProps: InternalCarouselProps = { - adaptiveHeight: false, - adaptiveHeightAnimation: true, - afterSlide: () => { - // do nothing - }, - autoplay: false, - autoplayInterval: 3000, - autoplayReverse: false, - beforeSlide: () => { - // do nothing - }, - cellAlign: 'left', - cellSpacing: 0, - defaultControlsConfig: {}, - disableAnimation: false, - disableEdgeSwiping: false, - dragging: true, - dragThreshold: 0.5, - easing: easeOut, - edgeEasing: easeOut, - enableKeyboardControls: false, - frameAriaLabel: 'Slider', - keyCodeConfig: { - nextSlide: [39, 68, 38, 87], - previousSlide: [37, 65, 40, 83], - firstSlide: [81], - lastSlide: [69], - pause: [32], - }, - landmark: false, - onDragStart: () => { - // do nothing - }, - onDrag: () => { - // do nothing - }, - onDragEnd: () => { - // do nothing - }, - onUserNavigation: () => { - // do nothing - }, - pauseOnHover: true, - renderAnnounceSlideMessage: defaultRenderAnnounceSlideMessage, - renderBottomCenterControls: (props: ControlProps) => ( - - ), - renderCenterLeftControls: (props: ControlProps) => ( - - ), - renderCenterRightControls: (props: ControlProps) => , - scrollMode: ScrollMode.page, - slidesToScroll: 1, - slidesToShow: 1, - speed: 500, - style: {}, - swiping: true, - tabbed: true, - vertical: false, - withoutControls: false, - wrapAround: false, - children: <>, -}; - -export default defaultProps; diff --git a/packages/nuka/src/default-controls.test.tsx b/packages/nuka/src/default-controls.test.tsx deleted file mode 100644 index 7dc7d8da..00000000 --- a/packages/nuka/src/default-controls.test.tsx +++ /dev/null @@ -1,267 +0,0 @@ -import { ControlProps, ScrollMode } from './types'; -import { - getDotIndexes, - nextButtonDisabled, - prevButtonDisabled, -} from './default-controls'; - -describe('getDotIndexes', () => { - it.each` - slideCount | slidesToScroll | slidesToShow | cellAlign | expected - ${3} | ${1} | ${1} | ${'left'} | ${[0, 1, 2]} - ${5} | ${1} | ${2} | ${'left'} | ${[0, 1, 2, 3]} - ${4} | ${1} | ${2} | ${'left'} | ${[0, 1, 2]} - ${4} | ${1} | ${3} | ${'left'} | ${[0, 1]} - ${4} | ${2} | ${2} | ${'left'} | ${[0, 2]} - ${5} | ${2} | ${2} | ${'left'} | ${[0, 2, 3]} - ${4} | ${3} | ${3} | ${'left'} | ${[0, 1]} - ${5} | ${3} | ${3} | ${'left'} | ${[0, 2]} - ${4} | ${2} | ${2.5} | ${'left'} | ${[0, 1.5]} - ${4} | ${1.5} | ${2} | ${'left'} | ${[0, 1.5, 2]} - ${4} | ${2} | ${4} | ${'left'} | ${[0]} - ${3} | ${1} | ${1} | ${'right'} | ${[0, 1, 2]} - ${5} | ${1} | ${2} | ${'right'} | ${[1, 2, 3, 4]} - ${4} | ${1} | ${2} | ${'right'} | ${[1, 2, 3]} - ${4} | ${1} | ${3} | ${'right'} | ${[2, 3]} - ${4} | ${2} | ${2} | ${'right'} | ${[1, 3]} - ${5} | ${2} | ${2} | ${'right'} | ${[1, 3, 4]} - ${4} | ${3} | ${3} | ${'right'} | ${[2, 3]} - ${5} | ${3} | ${3} | ${'right'} | ${[2, 4]} - ${4} | ${2} | ${2.5} | ${'right'} | ${[1.5, 3]} - ${4} | ${1.5} | ${2} | ${'right'} | ${[1, 2.5, 3]} - ${1} | ${1} | ${3} | ${'right'} | ${[0]} - ${2} | ${1} | ${3} | ${'right'} | ${[1]} - ${4} | ${2} | ${4} | ${'right'} | ${[3]} - ${4} | ${2} | ${14} | ${'center'} | ${[0, 2, 3]} - `( - 'gets proper indices when avoiding whitespace ' + - '($slideCount slides, $slidesToScroll slidesToScroll, $slidesToShow slidesToShow, $cellAlign align)', - ({ slideCount, slidesToScroll, slidesToShow, cellAlign, expected }) => { - expect( - getDotIndexes( - slideCount, - slidesToScroll, - ScrollMode.remainder, - slidesToShow, - false, - cellAlign - ) - ).toEqual(expected); - } - ); - - it.each` - slideCount | slidesToScroll | slidesToShow | cellAlign | expected - ${4} | ${1} | ${2} | ${'left'} | ${[0, 1, 2]} - ${4} | ${2} | ${2} | ${'left'} | ${[0, 2]} - ${3} | ${2} | ${2} | ${'left'} | ${[0, 2]} - ${4} | ${3} | ${3} | ${'left'} | ${[0, 3]} - ${4} | ${1} | ${3} | ${'left'} | ${[0, 1]} - ${4} | ${2} | ${2.5} | ${'left'} | ${[0, 2]} - ${4} | ${1.5} | ${2} | ${'left'} | ${[0, 1.5, 3]} - ${4} | ${2} | ${4} | ${'left'} | ${[0]} - ${4} | ${2} | ${2} | ${'right'} | ${[1, 3]} - ${5} | ${2} | ${2} | ${'right'} | ${[0, 2, 4]} - ${5} | ${3} | ${3} | ${'right'} | ${[1, 4]} - ${4} | ${1} | ${3} | ${'right'} | ${[2, 3]} - ${4} | ${2} | ${2.5} | ${'right'} | ${[1, 3]} - ${5} | ${2} | ${2.5} | ${'right'} | ${[0, 2, 4]} - ${4} | ${1.5} | ${2} | ${'right'} | ${[0, 1.5, 3]} - ${4} | ${2} | ${4} | ${'right'} | ${[3]} - ${4} | ${2} | ${2} | ${'center'} | ${[0, 2, 3]} - ${4} | ${2} | ${14} | ${'center'} | ${[0, 2, 3]} - `( - 'gets proper indices when allowing whitespace ' + - '($slideCount slides, $slidesToScroll slidesToScroll, $slidesToShow slidesToShow, $cellAlign align)', - ({ slideCount, slidesToScroll, slidesToShow, cellAlign, expected }) => { - expect( - getDotIndexes( - slideCount, - slidesToScroll, - ScrollMode.page, - slidesToShow, - false, - cellAlign - ) - ).toEqual(expected); - } - ); - - it.each` - slideCount | slidesToScroll | slidesToShow | expected - ${4} | ${1} | ${2} | ${[0, 1, 2, 3]} - ${4} | ${2} | ${2} | ${[0, 2]} - ${3} | ${2} | ${2} | ${[0, 2]} - ${4} | ${3} | ${3} | ${[0, 3]} - ${4} | ${1} | ${3} | ${[0, 1, 2, 3]} - ${4} | ${2} | ${2.5} | ${[0, 2]} - ${4} | ${1.5} | ${2} | ${[0, 1.5, 3]} - `( - 'gets proper indices when wrapping ' + - '($slideCount slides, $slidesToScroll slidesToScroll, $slidesToShow slidesToShow)', - ({ slideCount, slidesToScroll, slidesToShow, expected }) => { - expect( - getDotIndexes( - slideCount, - slidesToScroll, - ScrollMode.page, // ignored - slidesToShow, - true, - 'left' - ) - ).toEqual(expected); - } - ); -}); - -describe('nextButtonDisabled', () => { - it.each` - currentSlide | slidesToShow | cellAlign | expected - ${1} | ${1} | ${'left'} | ${false} - ${1} | ${2} | ${'left'} | ${true} - ${2} | ${1} | ${'left'} | ${true} - ${2} | ${2} | ${'left'} | ${true} - ${1} | ${2.5} | ${'left'} | ${true} - ${1.5} | ${2} | ${'left'} | ${true} - ${0.5} | ${2} | ${'left'} | ${false} - ${1} | ${1} | ${'right'} | ${false} - ${1} | ${2} | ${'right'} | ${false} - ${2} | ${1} | ${'right'} | ${true} - ${2} | ${2} | ${'right'} | ${true} - ${1} | ${2.5} | ${'right'} | ${false} - ${1.5} | ${2} | ${'right'} | ${false} - ${1} | ${1} | ${'center'} | ${false} - ${1} | ${2} | ${'center'} | ${false} - ${2} | ${1} | ${'center'} | ${true} - ${2} | ${2} | ${'center'} | ${true} - ${1} | ${2.5} | ${'center'} | ${false} - ${1.5} | ${2} | ${'center'} | ${false} - `( - 'disables properly when allowing whitespace ' + - '(slideIndex $currentSlide, $slidesToShow slidesToShow, $cellAlign align)', - ({ currentSlide, slidesToShow, cellAlign, expected }) => { - const args: Partial = { - currentSlide, - slidesToShow, - slideCount: 3, - wrapAround: false, - scrollMode: ScrollMode.page, - cellAlign, - }; - expect(nextButtonDisabled(args as ControlProps)).toEqual(expected); - } - ); - - it.each` - currentSlide | slidesToShow | cellAlign | expected - ${1} | ${1} | ${'left'} | ${false} - ${1} | ${2} | ${'left'} | ${true} - ${2} | ${1} | ${'left'} | ${true} - ${2} | ${2} | ${'left'} | ${true} - ${1} | ${2.5} | ${'left'} | ${true} - ${1.5} | ${2} | ${'left'} | ${true} - ${0.5} | ${2} | ${'left'} | ${false} - ${1} | ${1} | ${'right'} | ${false} - ${1} | ${2} | ${'right'} | ${false} - ${2} | ${1} | ${'right'} | ${true} - ${2} | ${2} | ${'right'} | ${true} - ${1} | ${2.5} | ${'right'} | ${false} - ${1.5} | ${2} | ${'right'} | ${false} - ${0.5} | ${2} | ${'right'} | ${false} - ${1} | ${1} | ${'center'} | ${false} - ${1} | ${2} | ${'center'} | ${false} - ${2} | ${1} | ${'center'} | ${true} - ${2} | ${2} | ${'center'} | ${true} - ${1} | ${2.5} | ${'center'} | ${false} - ${1.5} | ${2} | ${'center'} | ${false} - ${0.5} | ${2} | ${'center'} | ${false} - `( - 'disables properly when avoiding whitespace ' + - '(slideIndex $currentSlide, $slidesToShow slidesToShow, $cellAlign align)', - ({ currentSlide, slidesToShow, cellAlign, expected }) => { - const args: Partial = { - currentSlide, - slidesToShow, - slideCount: 3, - wrapAround: false, - scrollMode: ScrollMode.remainder, - cellAlign, - }; - expect(nextButtonDisabled(args as ControlProps)).toEqual(expected); - } - ); -}); - -describe('prevButtonDisabled', () => { - it.each` - currentSlide | slidesToShow | cellAlign | expected - ${1} | ${1} | ${'left'} | ${false} - ${1} | ${2} | ${'left'} | ${false} - ${0} | ${1} | ${'left'} | ${true} - ${0} | ${2} | ${'left'} | ${true} - ${1} | ${2.5} | ${'left'} | ${false} - ${1.5} | ${2} | ${'left'} | ${false} - ${1} | ${1} | ${'center'} | ${false} - ${1} | ${2} | ${'center'} | ${false} - ${0} | ${1} | ${'center'} | ${true} - ${0} | ${2} | ${'center'} | ${true} - ${1} | ${2.5} | ${'center'} | ${false} - ${1.5} | ${2} | ${'center'} | ${false} - ${1} | ${1} | ${'right'} | ${false} - ${1} | ${2} | ${'right'} | ${true} - ${0} | ${1} | ${'right'} | ${true} - ${0} | ${2} | ${'right'} | ${true} - ${1} | ${2.5} | ${'right'} | ${true} - ${1.5} | ${2} | ${'right'} | ${false} - ${0.5} | ${2} | ${'right'} | ${true} - `( - 'disables properly when allowing whitespace ' + - '(slideIndex $currentSlide, $slidesToShow slidesToShow, $cellAlign align)', - ({ currentSlide, slidesToShow, cellAlign, expected }) => { - const args: Partial = { - currentSlide, - slidesToShow, - wrapAround: false, - cellAlign, - }; - expect(prevButtonDisabled(args as ControlProps)).toEqual(expected); - } - ); - - it.each` - currentSlide | slidesToShow | cellAlign | expected - ${1} | ${1} | ${'left'} | ${false} - ${1} | ${2} | ${'left'} | ${false} - ${0} | ${1} | ${'left'} | ${true} - ${0} | ${2} | ${'left'} | ${true} - ${1} | ${2.5} | ${'left'} | ${false} - ${1.5} | ${2} | ${'left'} | ${false} - ${0.5} | ${2} | ${'left'} | ${false} - ${1} | ${1} | ${'right'} | ${false} - ${1} | ${2} | ${'right'} | ${true} - ${0} | ${1} | ${'right'} | ${true} - ${0} | ${2} | ${'right'} | ${true} - ${1} | ${2.5} | ${'right'} | ${true} - ${0.5} | ${2} | ${'right'} | ${true} - ${1.5} | ${2} | ${'right'} | ${false} - ${1} | ${1} | ${'center'} | ${false} - ${1} | ${2} | ${'center'} | ${false} - ${0} | ${1} | ${'center'} | ${true} - ${0} | ${2} | ${'center'} | ${true} - ${1} | ${2.5} | ${'center'} | ${false} - ${1.5} | ${2} | ${'center'} | ${false} - ${0.5} | ${2} | ${'center'} | ${false} - `( - 'disables properly when avoiding whitespace ' + - '(slideIndex $currentSlide, $slidesToShow slidesToShow, $cellAlign align)', - ({ currentSlide, slidesToShow, cellAlign, expected }) => { - const args: Partial = { - currentSlide, - slidesToShow, - wrapAround: false, - cellAlign, - }; - expect(prevButtonDisabled(args as ControlProps)).toEqual(expected); - } - ); -}); diff --git a/packages/nuka/src/default-controls.tsx b/packages/nuka/src/default-controls.tsx deleted file mode 100644 index b7dbb2ff..00000000 --- a/packages/nuka/src/default-controls.tsx +++ /dev/null @@ -1,334 +0,0 @@ -import React, { CSSProperties, useCallback } from 'react'; -import { CellAlign, ControlProps, ScrollMode } from './types'; -import { getBoundedIndex } from './utils'; - -const defaultButtonStyles = (disabled: boolean): CSSProperties => ({ - border: 0, - background: 'rgba(0,0,0,0.4)', - color: 'white', - padding: 10, - textTransform: 'uppercase', - opacity: disabled ? 0.3 : 1, - cursor: disabled ? 'not-allowed' : 'pointer', -}); - -export const prevButtonDisabled = ({ - cellAlign, - currentSlide, - slidesToShow, - wrapAround, -}: Pick< - ControlProps, - 'cellAlign' | 'currentSlide' | 'slidesToShow' | 'wrapAround' ->) => { - // inifite carousel - if (wrapAround) { - return false; - } - - // disable if displaying the leftmost slide - if (currentSlide === 0) { - return true; - } - - // remainder scroll mode - if (cellAlign === 'right' && currentSlide <= slidesToShow - 1) { - return true; - } - - return false; -}; - -export const PreviousButton = ({ - previousSlide, - defaultControlsConfig: { - prevButtonClassName, - prevButtonStyle = {}, - prevButtonText, - prevButtonOnClick, - }, - onUserNavigation, - carouselId, - previousDisabled: disabled, -}: ControlProps) => { - const handleClick = (event: React.MouseEvent) => { - prevButtonOnClick?.(event); - if (event.defaultPrevented) return; - - onUserNavigation(event); - - event.preventDefault(); - previousSlide(); - }; - - return ( - - ); -}; - -export const nextButtonDisabled = ({ - cellAlign, - currentSlide, - slideCount, - slidesToShow, - wrapAround, -}: Pick< - ControlProps, - 'cellAlign' | 'currentSlide' | 'slideCount' | 'slidesToShow' | 'wrapAround' ->) => { - // inifite carousel - if (wrapAround) { - return false; - } - - // If we are at the last possible slide without wrap, disable - if (currentSlide >= slideCount - 1) { - return true; - } - - // remainder scroll mode - if (cellAlign === 'left' && currentSlide >= slideCount - slidesToShow) { - return true; - } - - return false; -}; - -export const NextButton = ({ - nextSlide, - defaultControlsConfig: { - nextButtonClassName, - nextButtonStyle = {}, - nextButtonText, - nextButtonOnClick, - }, - carouselId, - nextDisabled: disabled, - onUserNavigation, -}: ControlProps) => { - const handleClick = (event: React.MouseEvent) => { - nextButtonOnClick?.(event); - if (event.defaultPrevented) return; - - onUserNavigation(event); - - event.preventDefault(); - nextSlide(); - }; - - return ( - - ); -}; - -/** - * Calculate the indices that each dot will jump to when clicked - */ -export const getDotIndexes = ( - slideCount: number, - slidesToScroll: number, - scrollMode: ScrollMode, - slidesToShow: number, - wrapAround: boolean, - cellAlign: CellAlign -) => { - const dotIndexes: number[] = []; - const scrollSlides = slidesToScroll <= 0 ? 1 : slidesToScroll; - - if (wrapAround) { - for (let i = 0; i < slideCount; i += scrollSlides) { - dotIndexes.push(i); - } - - return dotIndexes; - } - - if (cellAlign === 'center') { - for (let i = 0; i < slideCount - 1; i += scrollSlides) { - dotIndexes.push(i); - } - - if (slideCount > 0) { - dotIndexes.push(slideCount - 1); - } - - return dotIndexes; - } - - if (cellAlign === 'left') { - if (slidesToShow >= slideCount) { - return [0]; - } - - const lastPossibleIndexWithoutWhitespace = slideCount - slidesToShow; - - for (let i = 0; i < lastPossibleIndexWithoutWhitespace; i += scrollSlides) { - dotIndexes.push(i); - } - - if (scrollMode === ScrollMode.remainder) { - dotIndexes.push(lastPossibleIndexWithoutWhitespace); - } else { - dotIndexes.push(dotIndexes[dotIndexes.length - 1] + scrollSlides); - } - - return dotIndexes; - } - - if (cellAlign === 'right') { - if (slidesToShow >= slideCount) { - return [slideCount - 1]; - } - - const firstPossibleIndexWithoutWhitespace = slidesToShow - 1; - - if (scrollMode === ScrollMode.remainder) { - for ( - let i = firstPossibleIndexWithoutWhitespace; - i < slideCount - 1; - i += scrollSlides - ) { - dotIndexes.push(i); - } - dotIndexes.push(slideCount - 1); - } else { - for ( - let i = slideCount - 1; - i > firstPossibleIndexWithoutWhitespace; - i -= scrollSlides - ) { - dotIndexes.push(i); - } - dotIndexes.push(dotIndexes[dotIndexes.length - 1] - scrollSlides); - - dotIndexes.reverse(); - } - - return dotIndexes; - } - - // We should never reach this, because the if statements above cover all - // possible values of cellAlign - return dotIndexes; -}; - -export const PagingDots = ({ - pagingDotsIndices, - defaultControlsConfig: { - pagingDotsContainerClassName, - pagingDotsClassName, - pagingDotsStyle = {}, - pagingDotsOnClick, - }, - carouselId, - currentSlide, - onUserNavigation, - slideCount, - goToSlide, - tabbed, -}: ControlProps) => { - const listStyles: CSSProperties = { - position: 'relative', - top: -10, - display: 'flex', - margin: 0, - padding: 0, - listStyleType: 'none', - }; - - const getButtonStyles = useCallback( - (active: boolean) => ({ - cursor: 'pointer', - opacity: active ? 1 : 0.5, - background: 'transparent', - border: 'none', - fill: 'black', - }), - [] - ); - const currentSlideBounded = getBoundedIndex(currentSlide, slideCount); - - if (!tabbed) return null; - - return ( -
- {pagingDotsIndices.map((slideIndex, i) => { - const isActive = - currentSlideBounded === slideIndex || - // sets navigation dots active if the current slide falls in the current index range - (currentSlideBounded < slideIndex && - (i === 0 || currentSlideBounded > pagingDotsIndices[i - 1])); - - return ( - - ); - })} -
- ); -}; diff --git a/packages/nuka/src/hooks/use-forward-ref.ts b/packages/nuka/src/hooks/use-forward-ref.ts deleted file mode 100644 index aba062b7..00000000 --- a/packages/nuka/src/hooks/use-forward-ref.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { useEffect, useRef, ForwardedRef } from 'react'; - -export const useForwardRef = (ref: ForwardedRef) => { - const targetRef = useRef(null); - - useEffect(() => { - if (!ref) return; - - if (typeof ref === 'function') { - ref(targetRef.current); - } else { - ref.current = targetRef.current; - } - }, [ref]); - - return targetRef; -}; diff --git a/packages/nuka/src/hooks/use-frame-height.ts b/packages/nuka/src/hooks/use-frame-height.ts deleted file mode 100644 index ae228ce7..00000000 --- a/packages/nuka/src/hooks/use-frame-height.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { SlideHeight } from '../types'; -import { useCallback, useMemo, useState } from 'react'; -import { useStateWithRef } from './use-state-with-ref'; - -/** - * The frame height is normally, just `auto` (i.e., it expands to fit the - * items), but in adaptiveHeight mode, it's the height of the tallest visible - * item. - * - * In adaptiveHeight mode, we also switch between two states to ensure that - * slides don't render with zero height when server-side-rendering: - * - * - When initializedAdaptiveHeight is false: the frame has height auto; visible - * slides have height auto; invisible slides have height 0 - * - The client sets initializedAdaptiveHeight to true once we've measured all - * the visible slides' heights - * - When initializedAdaptiveHeight is true: the frame has height set to the - * tallest visible slide; all slides have height 100% - */ -export const useFrameHeight = ( - adaptiveHeight: boolean, - slidesToShow: number, - slideCount: number -): { - /** - * Callback that can be passed to Slides to allow them to update the - * `visibleHeights` variable. - */ - handleVisibleSlideHeightChange: ( - slideIndex: number, - height: number | null - ) => unknown; - - /** CSS height of the frame container */ - frameHeight: string; - - /** - * Whether we'd measured the initial slide heights and are ready for the - * frame to control the children's height, rather than the other way around. - */ - initializedAdaptiveHeight: boolean; -} => { - const [visibleHeights, setVisibleHeights, visibleHeightsRef] = - useStateWithRef([]); - - // Whether we've received heights of all initial visible heights - const [initializedAdaptiveHeight, setInitializedAdaptiveHeight] = - useState(false); - - const handleVisibleSlideHeightChange = useCallback( - (slideIndex: number, height: number | null) => { - // Use the ref's value since it's always the latest value - const latestVisibleHeights = visibleHeightsRef.current; - let newVisibleHeights: SlideHeight[]; - if (height === null) { - newVisibleHeights = latestVisibleHeights.filter( - (slideHeight) => slideHeight.slideIndex !== slideIndex - ); - } else { - newVisibleHeights = [...latestVisibleHeights, { slideIndex, height }]; - } - setVisibleHeights(newVisibleHeights); - - if ( - newVisibleHeights.length >= - Math.min(slideCount, Math.ceil(slidesToShow)) - ) { - setInitializedAdaptiveHeight(true); - } - }, - [slideCount, setVisibleHeights, slidesToShow, visibleHeightsRef] - ); - - const frameHeight = useMemo(() => { - if (adaptiveHeight) { - // We want server-side-rendering to render the carousel with non-zero - // height. to achieve this, we first set the height to `auto` until - // we've received the heights of the visible slides. Then, we switch to - // a mode where the frame controls the height. - if (!initializedAdaptiveHeight) { - return 'auto'; - } - - const maxHeight = Math.max( - 0, - ...visibleHeights.map((height) => height.height) - ); - return `${maxHeight}px`; - } else { - return 'auto'; - } - }, [adaptiveHeight, initializedAdaptiveHeight, visibleHeights]); - - return { - handleVisibleSlideHeightChange, - frameHeight, - initializedAdaptiveHeight, - }; -}; diff --git a/packages/nuka/src/hooks/use-slide-intersection-observer.ts b/packages/nuka/src/hooks/use-slide-intersection-observer.ts deleted file mode 100644 index 4b4261ba..00000000 --- a/packages/nuka/src/hooks/use-slide-intersection-observer.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { RefObject, useEffect, useRef, useState } from 'react'; - -export const useSlideIntersectionObserver = ( - elementRef: RefObject, - rootRef: RefObject, - callback: (entry: IntersectionObserverEntry) => void -) => { - const [entry, setEntry] = useState(); - const callbackRef = useRef(callback); - - useEffect(() => { - callbackRef.current = callback; - }, [callback]); - - useEffect(() => { - const node = elementRef?.current; - const root = rootRef?.current; - - if (!window.IntersectionObserver || !node || !root) return; - - const observer = new IntersectionObserver( - (entries) => { - entries.forEach((entry) => { - setEntry(entry); - callbackRef.current(entry); - }); - }, - { - threshold: [0.05, 0.95], - root, - } - ); - - observer.observe(node); - - return () => observer.disconnect(); - }, [elementRef, rootRef]); - - return entry; -}; diff --git a/packages/nuka/src/hooks/use-state-with-ref.ts b/packages/nuka/src/hooks/use-state-with-ref.ts deleted file mode 100644 index 87d1a965..00000000 --- a/packages/nuka/src/hooks/use-state-with-ref.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { MutableRefObject, useCallback, useRef, useState } from 'react'; - -/** - * Like useState, but also returns a ref that's always instantly updated. - * - * This is useful in two cases: - * - * 1. You need to both force a re-render when a variable changes, and - * also avoid re-running side effects (for example, a network call), even - * before the state fully updates for the component. - * 2. Multiple callbacks need to modify the same object or array before the - * state updates. For example, if one callback tries to append 4 to - * `[1, 2, 3]` and another tries to append 5, we may end up with only - * `[1, 2, 3, 5]` instead of `[1, 2, 3, 4, 5]` - */ -export const useStateWithRef = ( - initialState: S -): [S, (newValue: S) => void, MutableRefObject] => { - const [value, setValue] = useState(initialState); - // Need to explicitly type this out, or the overloads can confuse the - // compiler to think that this might be a React Component ref - const valueRef = useRef(initialState) as MutableRefObject; - - const setValueAndRef = useCallback((newValue: S) => { - valueRef.current = newValue; - setValue(newValue); - }, []); - - return [value, setValueAndRef, valueRef]; -}; diff --git a/packages/nuka/src/hooks/use-tween.ts b/packages/nuka/src/hooks/use-tween.ts deleted file mode 100644 index 469e414d..00000000 --- a/packages/nuka/src/hooks/use-tween.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { useEffect, useState, useRef } from 'react'; -import { EasingFunction } from 'src/types'; - -/** - * Provides an interpolated value, beginning at 0 and ending at 1, based on a - * provided duration and animation timing function. - */ -export const useTween = ( - durationMs: number, - easingFunction: EasingFunction, - // navigationNum is an combination of numbers that are stable when the - // animation should not be running or should continue running, but change when - // the animation should start running. In practice, this is a combination of - // the animation distance and slide index. - navigationNum: number, - shouldInterrupt: boolean -) => { - const [normalizedTimeRaw, setNormalizedTime] = useState(1); - const startTime = useRef(Date.now()); - const rAF = useRef(); - const isFirstRender = useRef(true); - const lastNavigationNum = useRef(null); - - // Detect on the first render following navigation if the animation should - // be running. If we wait for the useEffect, the first render will flash with - // the slide in its destination position, before the animation triggers, - // sending it back to the position of the first frame of the animation. This - // approach is done in place of a useLayoutEffect, which has issues with SSR. - const normalizedTime = - lastNavigationNum.current === null || - lastNavigationNum.current === navigationNum || - shouldInterrupt - ? normalizedTimeRaw - : 0; // 0 here indicates the animation has begun - - useEffect(() => { - lastNavigationNum.current = navigationNum; - - // Skip the first render as we don't want to trigger the animation right off - // the bat - if (isFirstRender.current) { - isFirstRender.current = false; - return; - } - - if (shouldInterrupt) { - return; - } - - startTime.current = Date.now(); - setNormalizedTime(0); - - const tick = () => { - rAF.current = requestAnimationFrame(() => { - const currentTime = Date.now(); - const normalizedTime = Math.min( - 1, - (currentTime - startTime.current) / durationMs - ); - setNormalizedTime(normalizedTime); - - if (normalizedTime < 1) { - tick(); - } else { - // Clean up so we can use this value to determine if the most recent - // animation completed - rAF.current = undefined; - } - }); - }; - tick(); - - return () => { - // If the most recent animation did not complete, cut it short and reset - // the animation - if (rAF.current !== undefined) { - cancelAnimationFrame(rAF.current); - setNormalizedTime(1); - } - }; - }, [navigationNum, durationMs, shouldInterrupt]); - - return { - isAnimating: normalizedTime !== 1, - value: easingFunction(normalizedTime), - }; -}; diff --git a/packages/nuka/src/index.ts b/packages/nuka/src/index.ts new file mode 100644 index 00000000..e69de29b diff --git a/packages/nuka/src/index.tsx b/packages/nuka/src/index.tsx deleted file mode 100644 index 85416869..00000000 --- a/packages/nuka/src/index.tsx +++ /dev/null @@ -1,3 +0,0 @@ -export { Carousel as default } from './carousel'; -export * from './types'; -export { NextButton, PreviousButton, PagingDots } from './default-controls'; diff --git a/packages/nuka/src/slide.tsx b/packages/nuka/src/slide.tsx deleted file mode 100644 index e2984d5e..00000000 --- a/packages/nuka/src/slide.tsx +++ /dev/null @@ -1,185 +0,0 @@ -import React, { - CSSProperties, - ReactNode, - useRef, - useEffect, - RefObject, -} from 'react'; -import { useSlideIntersectionObserver } from './hooks/use-slide-intersection-observer'; - -const getSlideWidth = (count: number, wrapAround?: boolean): string => - `${wrapAround ? 100 / (3 * count) : 100 / count}%`; - -const getSlideStyles = ( - count: number, - isCurrentSlide: boolean, - isVisibleSlide: boolean, - wrapAround: boolean, - cellSpacing: number, - animation: 'zoom' | 'fade' | undefined, - speed: number, - zoomScale: number | undefined, - adaptiveHeight: boolean, - initializedAdaptiveHeight: boolean, - slideWidth: CSSProperties['width'] -): CSSProperties => { - const width = slideWidth ?? getSlideWidth(count, wrapAround); - // const width = getSlideWidth(count, wrapAround); - const visibleSlideOpacity = isVisibleSlide ? 1 : 0; - const animationSpeed = animation === 'fade' ? 200 : 500; - - let height = 'auto'; - if (adaptiveHeight) { - if (initializedAdaptiveHeight) { - // Once adaptiveHeight is initialized, the frame will size to the height - // of all the visible slides - height = '100%'; - } else if (isVisibleSlide) { - // If the slide is visible but we're still measuring heights, have - // visible slides just take up their natural height - height = 'auto'; - } else { - // If the slide is not visible and we're still measuring heights, the - // slide should have height 0 so it doesn't contribute to the measured - // height of the frame - height = '0'; - } - } - - return { - width, - height, - padding: `0 ${cellSpacing ? cellSpacing / 2 : 0}px`, - transition: animation ? `${speed || animationSpeed}ms ease 0s` : undefined, - transform: - animation === 'zoom' - ? `scale(${isCurrentSlide && isVisibleSlide ? 1 : zoomScale || 0.85})` - : undefined, - opacity: animation === 'fade' ? visibleSlideOpacity : 1, - }; -}; - -const generateIndex = ( - index: number, - count: number, - typeOfSlide?: 'prev-cloned' | 'next-cloned' -): number => { - if (typeOfSlide === 'prev-cloned') { - return index - count; - } - - if (typeOfSlide === 'next-cloned') { - return index + count; - } - - return index; -}; - -const Slide = ({ - count, - children, - index, - isCurrentSlide, - typeOfSlide, - wrapAround, - cellSpacing, - slideWidth, - animation, - speed, - zoomScale, - onVisibleSlideHeightChange, - adaptiveHeight, - initializedAdaptiveHeight, - updateIOEntry, - id, - carouselRef, - carouselId, - tabbed, -}: { - count: number; - id: string; - children: ReactNode | ReactNode[]; - index: number; - isCurrentSlide: boolean; - typeOfSlide: 'prev-cloned' | 'next-cloned' | undefined; - wrapAround: boolean; - cellSpacing: number; - animation: 'zoom' | 'fade' | undefined; - speed: number; - zoomScale: number | undefined; - slideWidth?: CSSProperties['width']; - updateIOEntry: (id: string, isFullyVisible: boolean) => void; - carouselRef: RefObject; - /** - * Called with `height` when slide becomes visible and `null` when it becomes - * hidden. - */ - onVisibleSlideHeightChange: (index: number, height: number | null) => unknown; - adaptiveHeight: boolean; - initializedAdaptiveHeight: boolean; - carouselId: string; - tabbed: boolean; -}): JSX.Element => { - const customIndex = wrapAround - ? generateIndex(index, count, typeOfSlide) - : index; - - const slideRef = useRef(null); - - const entry = useSlideIntersectionObserver(slideRef, carouselRef, (entry) => { - updateIOEntry(id, entry?.intersectionRatio >= 0.95); - }); - - const isVisible = !!entry?.isIntersecting; - const isFullyVisible = (entry?.intersectionRatio ?? 1) >= 0.95; - - const prevIsVisibleRef = useRef(false); - useEffect(() => { - const node = slideRef.current; - if (node) { - const slideHeight = node.getBoundingClientRect()?.height; - - const prevIsVisible = prevIsVisibleRef.current; - if (isVisible && !prevIsVisible) { - onVisibleSlideHeightChange(customIndex, slideHeight); - } else if (!isVisible && prevIsVisible) { - onVisibleSlideHeightChange(customIndex, null); - } - - prevIsVisibleRef.current = isVisible; - } - }, [customIndex, isVisible, onVisibleSlideHeightChange]); - - const currentSlideClass = - isCurrentSlide && isFullyVisible ? ' slide-current' : ''; - - return ( -
- {children} -
- ); -}; - -export default Slide; diff --git a/packages/nuka/src/slider-list.tsx b/packages/nuka/src/slider-list.tsx deleted file mode 100644 index 86f883eb..00000000 --- a/packages/nuka/src/slider-list.tsx +++ /dev/null @@ -1,186 +0,0 @@ -import React, { ReactNode, useEffect } from 'react'; -import { getDotIndexes } from './default-controls'; -import { useTween } from './hooks/use-tween'; -import { CellAlign, InternalCarouselProps } from './types'; - -export const getPercentOffsetForSlide = ( - currentSlide: number, - slideCount: number, - slidesToShow: number, - cellAlign: CellAlign, - wrapAround: boolean -): number => { - // When wrapAround is enabled, we show the slides 3 times - const renderedSlideCount = wrapAround ? 3 * slideCount : slideCount; - - const singleSlidePercentOfWhole = 100 / renderedSlideCount; - - // When wrap is on, -33.33% puts us right on the center, true set of slides - // (the left and right sets are clones meant to avoid visual gaps) - let slide0Offset = wrapAround ? -100 / 3 : 0; - - if (cellAlign === 'right' && slidesToShow > 1) { - const excessSlides = slidesToShow - 1; - slide0Offset += singleSlidePercentOfWhole * excessSlides; - } - - if (cellAlign === 'center' && slidesToShow > 1) { - const excessSlides = slidesToShow - 1; - // Half of excess is on left and half is on right when centered - const excessLeftSlides = excessSlides / 2; - slide0Offset += singleSlidePercentOfWhole * excessLeftSlides; - } - - const currentSlideOffsetFrom0 = (100 / renderedSlideCount) * currentSlide; - - return slide0Offset - currentSlideOffsetFrom0; -}; - -interface SliderListProps - extends Pick< - InternalCarouselProps, - | 'cellAlign' - | 'disableAnimation' - | 'disableEdgeSwiping' - | 'easing' - | 'edgeEasing' - | 'scrollMode' - | 'animation' - | 'slidesToShow' - | 'slideWidth' - | 'speed' - | 'wrapAround' - > { - slidesToScroll: number; - animationDistance: number; - children: ReactNode; - currentSlide: number; - draggedOffset: number; - isDragging: boolean; - slideCount: number; - setIsAnimating: React.Dispatch>; -} - -export const SliderList = React.forwardRef( - ( - { - animation, - animationDistance, - cellAlign, - children, - currentSlide, - disableAnimation, - disableEdgeSwiping, - draggedOffset, - easing, - edgeEasing, - isDragging, - scrollMode, - slideCount, - slidesToScroll, - slidesToShow, - speed, - wrapAround, - slideWidth, - setIsAnimating, - }, - forwardedRef - ) => { - // When wrapAround is enabled, we show the slides 3 times - const renderedSlideCount = wrapAround ? 3 * slideCount : slideCount; - - const listVisibleWidth = slideWidth - ? `calc(${slideWidth} * ${renderedSlideCount})` - : `${(renderedSlideCount * 100) / slidesToShow}%`; - - const percentOffsetForSlideProps = [ - slideCount, - slidesToShow, - cellAlign, - wrapAround, - ] as const; - - // We recycle dot index generation to determine the leftmost and rightmost - // indices used, to be used in calculating the x-translation values we need - // to limit to or when edgeEasing should be used. - const dotIndexes = getDotIndexes( - slideCount, - slidesToScroll, - scrollMode, - slidesToShow, - wrapAround, - cellAlign - ); - - let clampedDraggedOffset = `${draggedOffset}px`; - if (isDragging && disableEdgeSwiping && !wrapAround) { - const clampOffsets = [ - dotIndexes[0], - dotIndexes[dotIndexes.length - 1], - ].map((index) => - getPercentOffsetForSlide(index, ...percentOffsetForSlideProps) - ); - // Offsets are seemingly backwards because the rightmost slide creates - // the most negative translate value - clampedDraggedOffset = `clamp(${clampOffsets[1]}%, ${draggedOffset}px, ${clampOffsets[0]}%)`; - } - - const slideBasedOffset = getPercentOffsetForSlide( - currentSlide, - ...percentOffsetForSlideProps - ); - - const isEdgeEasing = - !disableEdgeSwiping && - !wrapAround && - ((currentSlide === dotIndexes[0] && animationDistance < 0) || - (currentSlide === dotIndexes[dotIndexes.length - 1] && - animationDistance > 0)); - const { value: transition, isAnimating } = useTween( - speed, - !isEdgeEasing ? easing : edgeEasing, - // animationDistance is assumed to be unique enough that it can be used to - // detect when a new animation should start. This is used in addition to - // currentSlide because some animations, such as those with edgeEasing, do - // not occur due to a change in value of currentSlide - currentSlide + animationDistance, - isDragging || disableAnimation || animation === 'fade' - ); - - // Return undefined if the transform would be 0 pixels since transforms can - // cause flickering in chrome. - let positioning: string | undefined; - if (isDragging || slideBasedOffset !== 0 || isAnimating) { - if (isDragging) { - positioning = `translateX(${clampedDraggedOffset})`; - } else { - const transitionOffset = isAnimating - ? (1 - transition) * animationDistance - : 0; - positioning = `translateX(calc(${slideBasedOffset}% - ${transitionOffset}px))`; - } - } - - useEffect(() => { - setIsAnimating(isAnimating); - }, [isAnimating, setIsAnimating]); - - return ( -
- {children} -
- ); - } -); - -SliderList.displayName = 'SliderList'; diff --git a/packages/nuka/src/types.ts b/packages/nuka/src/types.ts deleted file mode 100644 index eb9c6ff5..00000000 --- a/packages/nuka/src/types.ts +++ /dev/null @@ -1,474 +0,0 @@ -import { ReactNode, CSSProperties } from 'react'; - -export type CellAlign = 'center' | 'right' | 'left'; - -/** @deprecated use string literals for the values instead */ -export enum Alignment { - Center = 'center', - Right = 'right', - Left = 'left', -} - -export enum Directions { - Next = 'next', - Prev = 'prev', - Up = 'up', - Down = 'down', -} - -export enum Positions { - TopLeft = 'TopLeft', - TopCenter = 'TopCenter', - TopRight = 'TopRight', - CenterLeft = 'CenterLeft', - CenterCenter = 'CenterCenter', - CenterRight = 'CenterRight', - BottomLeft = 'BottomLeft', - BottomCenter = 'BottomCenter', - BottomRight = 'BottomRight', -} - -type SlideChildren = { - offsetHeight: number; -}; - -export type SlideHeight = { - height: number; - slideIndex: number; -}; - -export interface Slide { - children?: [SlideChildren]; - offsetHeight: number; -} - -export enum ScrollMode { - page = 'page', - remainder = 'remainder', -} - -interface DefaultControlsConfig { - containerClassName?: string; - nextButtonClassName?: string; - nextButtonOnClick?: React.MouseEventHandler; - nextButtonStyle?: CSSProperties; - nextButtonText?: ReactNode; - pagingDotsClassName?: string; - pagingDotsContainerClassName?: string; - pagingDotsOnClick?: React.MouseEventHandler; - pagingDotsStyle?: CSSProperties; - prevButtonClassName?: string; - prevButtonOnClick?: React.MouseEventHandler; - prevButtonStyle?: CSSProperties; - prevButtonText?: ReactNode; -} - -export interface KeyCodeConfig { - firstSlide?: number[]; - lastSlide?: number[]; - nextSlide?: number[]; - pause?: number[]; - previousSlide?: number[]; -} - -export type KeyCodeFunction = - | 'nextSlide' - | 'previousSlide' - | 'firstSlide' - | 'lastSlide' - | 'pause' - | null; - -export interface KeyCodeMap { - [key: number]: keyof KeyCodeConfig; -} - -/* eslint-disable @typescript-eslint/no-empty-interface */ -/** @deprecated This is not actually used for anything */ -export interface CarouselState {} -/* eslint-enable @typescript-eslint/no-empty-interface */ - -type RenderAnnounceSlideMessage = (props: { - currentSlide: number; - count: number; -}) => string; - -export interface ControlProps - extends Pick< - InternalCarouselProps, - | 'carouselId' - | 'cellAlign' - | 'cellSpacing' - | 'defaultControlsConfig' - | 'carouselId' - | 'onUserNavigation' - | 'scrollMode' - | 'slidesToScroll' - | 'slidesToShow' - | 'tabbed' - | 'vertical' - | 'wrapAround' - > { - /** - * Current slide index - */ - currentSlide: number; - - /** - * The indices for the paging dots - */ - pagingDotsIndices: number[]; - - /** - * Go to a specific slide - * @param targetIndex Index to go to - */ - goToSlide: (targetIndex: number) => void; - - /** - * Whether the "next" button should be disabled or not - */ - nextDisabled: boolean; - - /** - * Go to the next slide - */ - nextSlide: () => void; - - /** - * Whether the "previous" button should be disabled or not - */ - previousDisabled: boolean; - - /** - * Go to the previous slide - */ - previousSlide: () => void; - - /** - * Total number of slides - */ - slideCount: number; -} - -export type RenderControlFunctionNames = - | 'renderTopLeftControls' - | 'renderTopCenterControls' - | 'renderTopRightControls' - | 'renderCenterLeftControls' - | 'renderCenterCenterControls' - | 'renderCenterRightControls' - | 'renderBottomLeftControls' - | 'renderBottomCenterControls' - | 'renderBottomRightControls'; - -/** - * A function to override what to render on an edge/corner of the modal. - * - * Pass in null to not render the default controls on an edge. - */ -type RenderControls = ((props: ControlProps) => ReactNode) | null; - -/** - * Animation easing function accepting a normalized time between 0 and 1, - * inclusive, and returning an eased time, which equals 0 at normalizedTime==0 - * and equals 1 at normalizedTime==1 - */ -export type EasingFunction = (normalizedTime: number) => number; - -export interface InternalCarouselProps { - /** - * If it's set to true, the carousel will adapt its height to the visible slides. - */ - adaptiveHeight: boolean; - - /** - * Whether to smoothly transition the height of the frame when using - * `adaptiveHeight`. - * @default true - */ - adaptiveHeightAnimation: boolean; - - /** - * Hook to be called after a slide is changed - * @param index Index of the current slide - */ - afterSlide: (index: number) => void; - - /** - * Adds a zoom or fade effect on the currently visible slide. - */ - animation?: 'zoom' | 'fade'; - - /** - * Autoplay mode active - * @default false - */ - autoplay: boolean; - - /** - * Interval for autoplay iteration (ms) - * @default 3000 - */ - autoplayInterval: number; - - /** - * Autoplay cycles through slide indexes in reverse - * @default false - */ - autoplayReverse: boolean; - - /** - * Hook to be called before a slide is changed - * @param currentSlide Index of the current slide - * @param endSlide Index of the last slide - */ - beforeSlide: (currentSlideIndex: number, endSlideIndex: number) => void; - - /** - * Unique id attribute for the carousel which may be referenced by aria attributes. - */ - carouselId?: string; - - /** - * When displaying more than one slide, - * sets which position to anchor the current slide to - */ - cellAlign: CellAlign; - - /** - * Space between slides, as an integer, but reflected as px - */ - cellSpacing: number; - - /** - * Explicit children prop to resolve issue with @types/react v18 - */ - children: ReactNode | ReactNode[]; - - /** - * Additional className - */ - className?: string; - - /** - * This prop lets you apply custom classes and styles to the default Next, Previous, and Paging Dots controls - */ - defaultControlsConfig: DefaultControlsConfig; - - /** - * Disable slides animation - * @default false - */ - disableAnimation: boolean; - - /** - * Disable swipe before first slide and after last slide - * @default false - */ - disableEdgeSwiping: boolean; - - /** - * Enable mouse swipe/dragging - */ - dragging: boolean; - - /** - * The percentage (from 0 to 1) of a slide that the user needs to drag before - * @default `0.5` - */ - dragThreshold: number; - - /** - * Animation easing function - */ - easing: EasingFunction; - - /** - * Animation easing function when swipe exceeds edge - */ - edgeEasing: EasingFunction; - - /** - * When set to true, disable keyboard controls - * @default false - */ - enableKeyboardControls: boolean; - - /** - * Customize the aria-label of the frame container of the carousel. - */ - frameAriaLabel?: string; - - /** - * When enableKeyboardControls is enabled, Configure keyCodes for corresponding slide actions as array of keyCodes - */ - keyCodeConfig: KeyCodeConfig; - - /** - * Whether the carousel should be designated as a landmark region. - */ - landmark: boolean; - - /** - * optional callback function - */ - onDragStart: ( - e: React.TouchEvent | React.MouseEvent - ) => void; - - /** - * optional callback function - */ - onDrag: ( - e: React.TouchEvent | React.MouseEvent - ) => void; - - /** - * optional callback function - */ - onDragEnd: ( - e: React.TouchEvent | React.MouseEvent - ) => void; - - /** - * Callback called when user-triggered navigation occurs: dragging/swiping, - * clicking one of the controls (custom controls not included), or using a - * keyboard shortcut - */ - onUserNavigation: ( - e: React.TouchEvent | React.MouseEvent | React.KeyboardEvent - ) => void; - - /** - * Pause autoPlay when mouse is over carousel - * @default true - */ - pauseOnHover: boolean; - - /** - * Function for rendering aria-live announcement messages - */ - renderAnnounceSlideMessage: RenderAnnounceSlideMessage; - - /** - * Function for rendering bottom center control - */ - renderBottomCenterControls: RenderControls; - - /** - * Function for rendering bottom left control - */ - renderBottomLeftControls?: RenderControls; - - /** - * Function for rendering bottom right control - */ - renderBottomRightControls?: RenderControls; - - /** - * Function for rendering center center control - */ - renderCenterCenterControls?: RenderControls; - - /** - * Function for rendering center left control - */ - renderCenterLeftControls: RenderControls; - - /** - * Function for rendering center right control - */ - renderCenterRightControls: RenderControls; - - /** - * Function for rendering top center control - */ - renderTopCenterControls?: RenderControls; - - /** - * Function for rendering top left control - */ - renderTopLeftControls?: RenderControls; - - /** - * Function for rendering top right control - */ - renderTopRightControls?: RenderControls; - - /** - * Supports 'page' and 'remainder' scroll modes. - */ - scrollMode: ScrollMode; - - /** - * Manually set the index of the initial slide to be shown - */ - slideIndex?: number; - - /** - * Slides to scroll at once. - */ - slidesToScroll: number | 'auto'; - - /** - * Slides to show at once - */ - slidesToShow: number; - - /** - * Sets a fixed slide width - */ - slideWidth?: CSSProperties['width']; - - /** - * Animation duration - */ - speed: number; - - /** - * style object - */ - style: CSSProperties; - - /** - * Enable touch swipe/dragging - */ - swiping: boolean; - - /** - * Whether tab pagination is used to set appropriate roles for slides. - */ - tabbed: boolean; - - /** - * Not migrated yet - * - * Enable the slides to transition vertically - */ - vertical: boolean; - - /** - * Used to remove all controls at once. Overwrites the render[Top, Right, Bottom, Left]CenterControls() - * @default false - */ - withoutControls: boolean; - - /** - * Sets infinite wrapAround mode - * @default false - */ - wrapAround: boolean; - - /** - * Adds a number value to set the scale of zoom when animation === "zoom". - * The number value should be set in a range of (0,1). - * @default 0.85 - */ - zoomScale?: number; -} - -/** - * This component has no required props. - */ -export type CarouselProps = Partial; diff --git a/packages/nuka/src/utils.test.ts b/packages/nuka/src/utils.test.ts deleted file mode 100644 index b57c5852..00000000 --- a/packages/nuka/src/utils.test.ts +++ /dev/null @@ -1,250 +0,0 @@ -import { ScrollMode } from './types'; -import { getBoundedIndex, getNextMoveIndex, getPrevMoveIndex } from './utils'; - -describe('getNextMoveIndex', () => { - it.each` - currentSlide | slideCount | slidesToScroll | expected - ${1} | ${3} | ${2} | ${3} - ${1} | ${2} | ${2} | ${3} - ${-1} | ${2} | ${1} | ${0} - ${1} | ${1} | ${1} | ${2} - ${1} | ${2} | ${1} | ${2} - `( - 'does basic calculation with wrapAround=true ' + - '(currentSlide $currentSlide, slideCount $slideCount, slidesToScroll $slidesToScroll)', - ({ currentSlide, slideCount, slidesToScroll, expected }) => { - const args = [ - ScrollMode.page, - true, - currentSlide, - slideCount, - slidesToScroll, - 1, - ] as const; - expect(getNextMoveIndex(...args, 'left')).toEqual(expected); - expect(getNextMoveIndex(...args, 'right')).toEqual(expected); - expect(getNextMoveIndex(...args, 'center')).toEqual(expected); - } - ); - - it.each` - currentSlide | slidesToShow | slidesToScroll | cellAlign | expected - ${2} | ${1} | ${1} | ${'left'} | ${2} - ${1} | ${1} | ${1} | ${'left'} | ${2} - ${1.5} | ${1} | ${1} | ${'left'} | ${2} - ${1.5} | ${2} | ${1} | ${'left'} | ${1.5} - ${2} | ${2} | ${1} | ${'left'} | ${2} - ${1} | ${2} | ${1} | ${'left'} | ${1} - ${1} | ${2} | ${2} | ${'left'} | ${1} - ${1} | ${2} | ${1.5} | ${'left'} | ${1} - ${0} | ${1} | ${1} | ${'left'} | ${1} - ${0.5} | ${1} | ${1} | ${'left'} | ${1.5} - ${0} | ${2} | ${1} | ${'left'} | ${1} - ${0} | ${2} | ${2} | ${'left'} | ${2} - ${0} | ${2} | ${1.5} | ${'left'} | ${1.5} - ${0} | ${1.5} | ${2} | ${'left'} | ${2} - ${2} | ${1} | ${1} | ${'right'} | ${2} - ${1} | ${1} | ${1} | ${'right'} | ${2} - ${1.5} | ${1} | ${1} | ${'right'} | ${2} - ${1} | ${2} | ${1} | ${'right'} | ${2} - ${1} | ${2} | ${2} | ${'right'} | ${2} - ${1} | ${2} | ${1.5} | ${'right'} | ${2} - ${0} | ${1} | ${1} | ${'right'} | ${1} - ${0.5} | ${1} | ${1} | ${'right'} | ${1.5} - ${0} | ${2} | ${1} | ${'right'} | ${1} - ${0} | ${2} | ${2} | ${'right'} | ${2} - ${0} | ${2} | ${1.5} | ${'right'} | ${1.5} - ${0} | ${1.5} | ${2} | ${'right'} | ${2} - ${2} | ${1} | ${1} | ${'center'} | ${2} - ${1} | ${1} | ${1} | ${'center'} | ${2} - ${1.5} | ${1} | ${1} | ${'center'} | ${2} - ${1} | ${2} | ${1} | ${'center'} | ${2} - ${1} | ${2} | ${2} | ${'center'} | ${2} - ${1} | ${2} | ${1.5} | ${'center'} | ${2} - ${0} | ${1} | ${1} | ${'center'} | ${1} - ${0.5} | ${1} | ${1} | ${'center'} | ${1.5} - ${0} | ${2} | ${1} | ${'center'} | ${1} - ${0} | ${2} | ${2} | ${'center'} | ${2} - ${0} | ${2} | ${1.5} | ${'center'} | ${1.5} - ${0} | ${1.5} | ${2} | ${'center'} | ${2} - `( - 'gets correct index when allowing whitespace ' + - '(slideIndex $currentSlide, $slidesToShow slidesToShow, $slidesToScroll slidesToScroll, $cellAlign align)', - ({ currentSlide, slidesToShow, slidesToScroll, cellAlign, expected }) => { - expect( - getNextMoveIndex( - ScrollMode.page, - false, - currentSlide, - 3, - slidesToScroll, - slidesToShow, - cellAlign - ) - ).toEqual(expected); - } - ); - - it.each` - currentSlide | slidesToShow | slidesToScroll | cellAlign | expected - ${2} | ${1} | ${1} | ${'left'} | ${2} - ${1} | ${1} | ${1} | ${'left'} | ${2} - ${1.5} | ${1} | ${1} | ${'left'} | ${2} - ${1} | ${2} | ${1} | ${'left'} | ${1} - ${1} | ${2} | ${2} | ${'left'} | ${1} - ${1} | ${2} | ${1.5} | ${'left'} | ${1} - ${0} | ${1} | ${1} | ${'left'} | ${1} - ${0.5} | ${1} | ${1} | ${'left'} | ${1.5} - ${0} | ${2} | ${1} | ${'left'} | ${1} - ${0} | ${2} | ${2} | ${'left'} | ${1} - ${0} | ${2} | ${1.5} | ${'left'} | ${1} - ${3} | ${1} | ${11} | ${'left'} | ${3} - ${0} | ${1.5} | ${2} | ${'left'} | ${1.5} - ${1} | ${2} | ${1} | ${'center'} | ${2} - ${1} | ${2} | ${1} | ${'right'} | ${2} - `( - 'gets correct index when avoiding whitespace ' + - '(slideIndex $currentSlide, $slidesToShow slidesToShow, $slidesToScroll slidesToScroll, $cellAlign align)', - ({ currentSlide, slidesToShow, slidesToScroll, cellAlign, expected }) => { - expect( - getNextMoveIndex( - ScrollMode.remainder, - false, - currentSlide, - 3, - slidesToScroll, - slidesToShow, - cellAlign - ) - ).toEqual(expected); - } - ); -}); - -describe('getPrevMoveIndex', () => { - it.each` - currentSlide | slidesToScroll | expected - ${1} | ${2} | ${-1} - ${4} | ${2} | ${2} - ${-1} | ${1} | ${-2} - `( - 'does basic calculation with wrapAround=true ' + - '(currentSlide $currentSlide, slidesToScroll $slidesToScroll)', - ({ currentSlide, slidesToScroll, expected }) => { - expect( - getPrevMoveIndex( - ScrollMode.page, - true, - currentSlide, - slidesToScroll, - 1, - 'left' - ) - ).toEqual(expected); - } - ); - - it.each` - currentSlide | slidesToShow | slidesToScroll | cellAlign | expected - ${0} | ${1} | ${1} | ${'left'} | ${0} - ${1} | ${1} | ${1} | ${'left'} | ${0} - ${1.5} | ${1} | ${1} | ${'left'} | ${0.5} - ${1.5} | ${2} | ${1} | ${'left'} | ${0.5} - ${1} | ${2} | ${1} | ${'left'} | ${0} - ${1} | ${2} | ${2} | ${'left'} | ${0} - ${1} | ${2} | ${1.5} | ${'left'} | ${0} - ${2} | ${2} | ${1.5} | ${'left'} | ${0.5} - ${2} | ${2} | ${2} | ${'left'} | ${0} - ${2} | ${1.5} | ${2} | ${'left'} | ${0} - ${0} | ${1} | ${1} | ${'right'} | ${0} - ${1} | ${1} | ${1} | ${'right'} | ${0} - ${1.5} | ${1} | ${1} | ${'right'} | ${0.5} - ${1.5} | ${2} | ${1} | ${'right'} | ${0.5} - ${1} | ${2} | ${1} | ${'right'} | ${1} - ${1} | ${2} | ${2} | ${'right'} | ${1} - ${1} | ${2} | ${1.5} | ${'right'} | ${1} - ${2} | ${2} | ${1.5} | ${'right'} | ${0.5} - ${2} | ${2} | ${2} | ${'right'} | ${0} - ${2} | ${1.5} | ${2} | ${'right'} | ${0} - ${0} | ${1} | ${1} | ${'center'} | ${0} - ${1} | ${1} | ${1} | ${'center'} | ${0} - ${1.5} | ${1} | ${1} | ${'center'} | ${0.5} - ${1.5} | ${2} | ${1} | ${'center'} | ${0.5} - ${1} | ${2} | ${1} | ${'center'} | ${0} - ${1} | ${2} | ${2} | ${'center'} | ${0} - ${1} | ${2} | ${1.5} | ${'center'} | ${0} - ${2} | ${2} | ${1.5} | ${'center'} | ${0.5} - ${2} | ${2} | ${2} | ${'center'} | ${0} - ${2} | ${1.5} | ${2} | ${'center'} | ${0} - `( - 'gets correct index when allowing whitespace ' + - '(slideIndex $currentSlide, $slidesToShow slidesToShow, $slidesToScroll slidesToScroll, $cellAlign align)', - ({ currentSlide, slidesToShow, slidesToScroll, cellAlign, expected }) => { - expect( - getPrevMoveIndex( - ScrollMode.page, - false, - currentSlide, - slidesToScroll, - slidesToShow, - cellAlign - ) - ).toEqual(expected); - } - ); - - it.each` - currentSlide | slidesToShow | slidesToScroll | cellAlign | expected - ${0} | ${1} | ${1} | ${'right'} | ${0} - ${1} | ${1} | ${1} | ${'right'} | ${0} - ${1.5} | ${1} | ${1} | ${'right'} | ${0.5} - ${1.5} | ${2} | ${1} | ${'right'} | ${1} - ${1} | ${2} | ${1} | ${'right'} | ${1} - ${1} | ${2} | ${2} | ${'right'} | ${1} - ${1} | ${2} | ${1.5} | ${'right'} | ${1} - ${2} | ${2} | ${1.5} | ${'right'} | ${1} - ${2} | ${2} | ${2} | ${'right'} | ${1} - ${2} | ${1.5} | ${2} | ${'right'} | ${0.5} - ${1} | ${2} | ${1} | ${'center'} | ${0} - ${1} | ${2} | ${1} | ${'left'} | ${0} - `( - 'gets correct index when avoiding whitespace ' + - '(slideIndex $currentSlide, $slidesToShow slidesToShow, $slidesToScroll slidesToScroll, $cellAlign align)', - ({ currentSlide, slidesToShow, slidesToScroll, cellAlign, expected }) => { - expect( - getPrevMoveIndex( - ScrollMode.remainder, - false, - currentSlide, - slidesToScroll, - slidesToShow, - cellAlign - ) - ).toEqual(expected); - } - ); -}); - -describe('getBoundedIndex', () => { - it.each` - rawIndex | slideCount | expected - ${0} | ${1} | ${0} - ${1} | ${2} | ${1} - ${2} | ${2} | ${0} - ${3} | ${2} | ${1} - ${4} | ${2} | ${0} - ${-1} | ${2} | ${1} - ${-2} | ${2} | ${0} - ${-2} | ${3} | ${1} - ${-3} | ${3} | ${0} - ${-6} | ${3} | ${0} - ${-7} | ${3} | ${2} - ${-7.5} | ${3} | ${1.5} - `( - 'gets the right index when bounds applied ' + - '(rawIndex $rawIndex, slideCount $slideCount)', - ({ rawIndex, slideCount, expected }) => { - expect(getBoundedIndex(rawIndex, slideCount)).toEqual(expected); - } - ); -}); diff --git a/packages/nuka/src/utils.ts b/packages/nuka/src/utils.ts deleted file mode 100644 index 8f3a0fbd..00000000 --- a/packages/nuka/src/utils.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { getDotIndexes } from './default-controls'; -import { CellAlign, ScrollMode } from './types'; - -export const getNextMoveIndex = ( - scrollMode: ScrollMode, - wrapAround: boolean, - currentSlide: number, - slideCount: number, - slidesToScroll: number, - slidesToShow: number, - cellAlign: CellAlign -) => { - if (wrapAround) { - return currentSlide + slidesToScroll; - } - // Quit early if we're already as far right as we can go - if ( - currentSlide >= slideCount - 1 || - (cellAlign === 'left' && currentSlide >= slideCount - slidesToShow) - ) { - return currentSlide; - } - - if (scrollMode === ScrollMode.remainder && cellAlign === 'left') { - return Math.min(currentSlide + slidesToScroll, slideCount - slidesToShow); - } - - return Math.min(currentSlide + slidesToScroll, slideCount - 1); -}; - -export const getPrevMoveIndex = ( - scrollMode: ScrollMode, - wrapAround: boolean, - currentSlide: number, - slidesToScroll: number, - slidesToShow: number, - cellAlign: CellAlign -) => { - if (wrapAround) { - return currentSlide - slidesToScroll; - } - - // Quit early if we're already as far left as we can go - if ( - currentSlide <= 0 || - (cellAlign === 'right' && currentSlide <= slidesToShow - 1) - ) { - return currentSlide; - } - - if (scrollMode === ScrollMode.remainder && cellAlign === 'right') { - return Math.max(currentSlide - slidesToScroll, slidesToShow - 1); - } - - return Math.max(currentSlide - slidesToScroll, 0); -}; - -export const getDefaultSlideIndex = ( - slideIndex: number | undefined, - slideCount: number, - slidesToShow: number, - slidesToScroll: number, - cellAlign: CellAlign, - autoplayReverse: boolean, - scrollMode: ScrollMode -) => { - if (slideIndex !== undefined) { - return slideIndex; - } - - const dotIndexes = getDotIndexes( - slideCount, - slidesToScroll, - scrollMode, - slidesToShow, - false, - cellAlign - ); - - return autoplayReverse ? dotIndexes[dotIndexes.length - 1] : dotIndexes[0]; -}; - -/** - * Boils down an unbounded index (-Infinity < index < Infinity) to a bounded one - * (0 ≤ index < slideCount) - */ -export const getBoundedIndex = (rawIndex: number, slideCount: number) => { - return ((rawIndex % slideCount) + slideCount) % slideCount; -}; diff --git a/packages/nuka/stories/carousel.stories.tsx b/packages/nuka/stories/carousel.stories.tsx deleted file mode 100644 index e88ad90e..00000000 --- a/packages/nuka/stories/carousel.stories.tsx +++ /dev/null @@ -1,311 +0,0 @@ -import React from 'react'; -import { ComponentMeta, Story } from '@storybook/react'; -import isChromatic from 'chromatic/isChromatic'; -import { renderToString } from 'react-dom/server'; -import { easeLinear, easeElasticOut } from 'd3-ease'; - -import Carousel, { ControlProps, InternalCarouselProps } from '../src/index'; - -import { sampleSlideImageSources } from './sample-slide-images'; - -export default { - title: 'Nuka Carousel/Carousel', - component: Carousel, - args: { - storySlideCount: 9, - ...Carousel.defaultProps, - }, -} as ComponentMeta; - -/* Set up story template */ -interface StoryProps { - storySlideCount: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14; - slideHeights?: number[]; -} - -const Template: Story = ({ - storySlideCount = 9, - slideHeights, - ...args -}) => { - const slides = sampleSlideImageSources - .slice(0, storySlideCount) - .map((imageSrc, index) => ( - {`Slide - )); - - return ( -
-
- {slides} -
-
- ); -}; - -/** Template that replicates what's rendered with server-side rendering */ -const StaticTemplate: Story = (args) => { - return ( -
), - }} - /> - ); -}; - -/* Stories - add common combinations of props here! */ -export const Default = Template.bind({}); -Default.args = {}; - -export const Vertical = Template.bind({}); -Vertical.args = { - vertical: true, -}; - -export const CustomEasing = Template.bind({}); -CustomEasing.args = { - easing: easeLinear, - edgeEasing: easeElasticOut, - speed: 500, - slidesToShow: 3, -}; - -// export const FadeTransition = Template.bind({}); -// FadeTransition.args = { -// transitionMode: 'fade' -// }; - -// export const Scroll3DTransition = Template.bind({}); -// Scroll3DTransition.args = { -// transitionMode: 'scroll3d' -// }; - -export const ZoomAnimation = Template.bind({}); -ZoomAnimation.args = { - animation: 'zoom', - cellAlign: 'center', -}; - -export const WrapAround = Template.bind({}); -WrapAround.args = { - wrapAround: true, -}; - -// adjust the autoplay interval so it does not interfere with our visual -// snapshot tests in the CI (run by Chromatic) -const autoplayInterval = isChromatic() ? 10000 : undefined; - -export const Autoplay = Template.bind({}); -Autoplay.args = { - autoplay: true, - autoplayInterval, -}; - -export const AutoplayReverse = Template.bind({}); -AutoplayReverse.args = { - autoplay: true, - autoplayReverse: true, - autoplayInterval, - slideIndex: 8, -}; - -export const AutoplayWithCustomInterval = Template.bind({}); -AutoplayWithCustomInterval.args = { - autoplay: true, - autoplayInterval: autoplayInterval ?? 500, -}; - -export const AutoplayWithoutPauseOnHover = Template.bind({}); -AutoplayWithoutPauseOnHover.args = { - autoplay: true, - pauseOnHover: false, - autoplayInterval, -}; - -export const WithoutControls = Template.bind({}); -WithoutControls.args = { - withoutControls: true, -}; - -export const WithoutDragging = Template.bind({}); -WithoutDragging.args = { - dragging: false, -}; - -export const WithoutAnimation = Template.bind({}); -WithoutAnimation.args = { - disableAnimation: true, -}; - -export const WithoutEdgeSwiping = Template.bind({}); -WithoutEdgeSwiping.args = { - disableEdgeSwiping: true, -}; - -export const InitialIndex = Template.bind({}); -InitialIndex.args = { - slideIndex: 4, -}; - -export const MultipleSlides = Template.bind({}); -MultipleSlides.args = { - slidesToShow: 3, -}; - -export const MultipleSlidesWithSpacing = Template.bind({}); -MultipleSlidesWithSpacing.args = { - slidesToShow: 3, - cellSpacing: 10, -}; - -export const ScrollMultipleSlides = Template.bind({}); -ScrollMultipleSlides.args = { - slidesToShow: 3, - slidesToScroll: 3, -}; - -export const DragMultipleSlides = Template.bind({}); -DragMultipleSlides.args = { - slidesToShow: 3, -}; - -export const CellAlignCenter = Template.bind({}); -CellAlignCenter.args = { - slidesToShow: 2.5, - cellAlign: 'center', -}; - -export const CellAlignCenterWrapAround = Template.bind({}); -CellAlignCenterWrapAround.args = { - slidesToShow: 2.5, - cellAlign: 'center', - wrapAround: true, -}; - -export const CellAlignRight = Template.bind({}); -CellAlignRight.args = { - slidesToShow: 2.5, - cellAlign: 'right', -}; - -export const CellAlignRightWrapAround = Template.bind({}); -CellAlignRightWrapAround.args = { - slidesToShow: 2.5, - cellAlign: 'right', - wrapAround: true, -}; - -export const AdaptiveHeight = Template.bind({}); -AdaptiveHeight.args = { - adaptiveHeight: true, - slideHeights: [210, 220, 230, 240, 250, 260, 270, 280, 290], -}; - -export const AdaptiveHeightNoAnimation = Template.bind({}); -AdaptiveHeightNoAnimation.args = { - adaptiveHeight: true, - adaptiveHeightAnimation: false, - slideHeights: [210, 220, 230, 240, 250, 260, 270, 280, 290], -}; - -export const AdaptiveHeightWrapAround = Template.bind({}); -AdaptiveHeightWrapAround.args = { - adaptiveHeight: true, - slideHeights: [210, 220, 230, 240, 250, 260, 270, 280, 290], - wrapAround: true, -}; - -export const AdaptiveHeightThreeSlides = Template.bind({}); -AdaptiveHeightThreeSlides.args = { - adaptiveHeight: true, - slidesToShow: 3, - slidesToScroll: 3, - slideHeights: [210, 220, 230, 240, 250, 260, 270, 280, 290], -}; - -export const AdaptiveHeightThreeSlidesStatic = StaticTemplate.bind({}); -AdaptiveHeightThreeSlidesStatic.args = { - adaptiveHeight: true, - slidesToShow: 3, - slidesToScroll: 3, - slideHeights: [210, 220, 230, 240, 250, 260, 270, 280, 290], -}; - -export const KeyboardControls = Template.bind({}); -KeyboardControls.args = { - enableKeyboardControls: true, -}; - -export const CustomControls = Template.bind({}); -CustomControls.args = { - slidesToShow: 3, - renderCenterLeftControls: (props: ControlProps) => ( - - ), - renderCenterRightControls: (props: ControlProps) => ( - - ), - renderBottomCenterControls: (props: ControlProps) => ( -
    - {props.pagingDotsIndices.map((i) => ( -
  • - -
  • - ))} -
- ), -}; diff --git a/packages/nuka/stories/images/1.png b/packages/nuka/stories/images/1.png deleted file mode 100644 index 64eff8fec923f55a85a9339b0fc7f7ac44aed0d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1119 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKLEX+WWqKVr7fs}NBPl#)|(eD5M|95yF-aX^) z-P7;hJ^eN_^~|ceD`z%6J$QBHAD}YM0*}aI1_r((Aj~*bn@^g7f%%oEi(^Q|oVPd6 z`U^Ws9RK(-=$4#p;?!hr4Vm1ga;fHmlv;bSsV^o9@yX>bI%a=+?)3EXG{?niYW!b+ z@7!|voyz(3oAr%@lY!=w3L5^0pTBkgPry!l-b>rd|D{^i>tD(Fe5zhBWs{bp*lMAa zol1^eyOkW>fXsz9C*Ie*cyl|HBdEq=gSOz3^tW$0jcl~~FY}l8oiZ1HyYN<%2z%(y zly~=^IkttyzFht7@b`6}jMOfQFPZW4*RyxED36ka zDq{b9nsl6R*L_=i@%yZ03Wp=+)uvcECLLOPBZqI#{jzH!PkdhOPXDCPT4TuRIE(r8 zw#~~FzKVXT`uE|~E#JxPh3VHmR;=H&Szt-s%{@AH$2M|{uu2|Ty?Eb-v#icGpU}7Ga$IH@{x`RJt2WoA$qMfJpB0#Q zim@qrsHR`>sFDbEy!N!`<0J*=%1>7X4>26gu9@*AKxB!${x=0qqpZBmr!5@jJ8$-Q zx4)~Y=T_!|lTBY{%hySe;=5%J?nTt;Dkk=KCe7| zVVB{FNS;es^E$ekPF(r0GGE2<*3y$tq9!b>@^wrJ`hCZ=PHxG1JCBI(Hw_qf8hX5s zny~v)c&NbU_|}_0cU1Qtd7tkqU|jL$wDq5pNA;FpJNk9rsV0fd!L3t6|H(+U>#P6# zY`9dfLvvbPxMKaL&ho$CNEhuXPrtf{3e~PS8{G^+NRx?U(bm;%d}*|R}Y(l8F%)Jutv7+Wj9xvtFUQF z?CUiGzpcc>xFdJyS(WRSZpTO)MS)fE~i zs_rn|{VLpVazf$F&9}#Db+5}v@BJO+ynnuibjQtm`L-hG@9)bllX~s`?AYx`rVDEFj#|0SPoTSHi9deqL%thvFy>1|$(;za)2=VmqWB-Q4L-T%4xxy=>b zvv;$Z7io3;pS<(jL-nvqf&cN>(mwZx{$OA2lm2;C(~Q0ALo168CoT5-w6x05|JMAz kQo&{T!|GoOlnVCME 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 Z!KA{evg>i$;oiMECNw~ds{{iqeB%c5P diff --git a/packages/nuka/stories/images/13.png b/packages/nuka/stories/images/13.png deleted file mode 100644 index efcde63c16c18c0e22baec4df6b2eecc1fe49ad0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1250 zcmb7D>r>JR0Q@;;X_AO~_V5u{c2*X2nwhB?hKa$I56pbwooNmRSO}-UWM+e<^N~w=!McksWxNt{DM~lUR#bViPc4uej*w~mrAjrzfg2Um$;WX+> zY|R;TLJk0cyS~z@+z0Fi0M?{P6cU$rYfk+v`vrPK_t}86PS79>*1SO+#URGFId!{6 zOCxqR$CVT}CC!!It2#qfuKGd>&b}>85nkN;-u(d&^DfD>*ZHQk#=oQpICp+uo)s%WpmCdFrI@I&+kACDP_Z{+Gw9f#lc5w-ceSKF&OC=r&9tihHPkSsD?9)&P+!>ej?a7>woC-;ohBT~-pk0$F%T(JI zh4=H~C6W0EI9_kc=kyWrp=#jG-|PJY5qyR+CcJm!=3URi_@ZI+1!z~kb4jjm(C!_$ z44ddJXub;1wd09Xj2oD_Oy+Fit-1l4ZG|e+uXdL!GHrzMsjmIAW;NZCcpj5r8?ZQN zP1o3_)ez4)W7P(EXy%bxE915y_jks9fic53)>lIe$9io_#jIG*(Xv!fzKOH@xrv60Kh)SJa6vMax%0%T%A2R3{KU-XlzX(>oT@G8z*pcQu{oRDaYO5v;~Hex z^tdouIl_%HRNY!x?J_rwgTTVV{! zkED9xId8Nn0L*__Of8o1PeBw?moAkS?DX52>nOivvVQUojN(ZT?%7!+cj*0NW8M<8 z8pl;5jq0NuuS=W4U6=1Hd?G_~2+iGI&goS8f60yonKF#=btx-xc>>m(+rhV*8fq*B z$@Vl$jKeQ(-zSZHKP~7B66^ZlJe7pZI0BOoDI9|?; SNFjKAZAXS5MKy%|T=+kb*f#F~ diff --git a/packages/nuka/stories/images/14.png b/packages/nuka/stories/images/14.png deleted file mode 100644 index 82254b7f83508cfc4cf475aef0bd7d12ad2818c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1115 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKLEX+WWqKVr7fs}NBPl&6MlG6YG|05$KCrp@d z{P^+5j~}mDv!2Xw>;K5c%;zv)(t~ZrhR4~v#mE??ow== zp>4bWbe6f}d;8KHbq!Xa6(oZn?Pg!DHQQ!8p1OBo*X7MQ3l~50S#R}1@NeOS%8*L` z^|=#%sJ~dBKf!2K&8BURW{Xc1&rO@aUe!|=Qn_uLQx(3N?%QD~zi3ncsm-&Osn>_j+q?1aU4>*@UzHR5!8cwwm~NhS#m->v)a)lg ze>ck9;|+SD)vK^KNb7cR;Dnee{n!c4mMQLi`*-i#$EPL#DtD^eg!i|sI+{{0ZI@nl z>DQ_G!Xf)EEbnBQxl>_z;DnuTWxN-^=c{~lo>Oc7)o_JQg|EBz{8qA`v{95r^Xs|V zy4Bp7SE?s`zk2>sudXQD%bDj?ny%dL^_nTTNt#Xal*K9TT&bOVn~fyv7Oma0{<|>e zB+rSZPZt|_q^wM=jJ>?Lb!lAdi+X*!`Ax^0Hpi9`4JXA3QPf9%SgJML!> zDw+Sh%<*XYp8of%6gpO0UUyveYj$mUP;jMMysF@m`{!I8Cv-}?x=uLN?<5*xcRhHj z$AmL_uNLtJ-PpZ|Z%b<04eiXFYuWR!hQyunndma%m)VV-h4XJKESBYqf^GEUXi@f!@nuavn(nqQjC2jva=fzPLf+(kGDl24-Dk<1yYAod|EvG_mF@ay z8+0=KuEI9+s|sH~RO$Zy@l+u%<8Dcxzgb7n`7?TkG46azs{b}!S?b@cU>yGY&Oe*u zbDM*CiYn?9>d#J&+i`u@q`2*y{FhFw|NF@Al~1tenW*IQoxXo_1-4(hx%b+Ux7zG^ z+kA~r9EyEc_@#Tt+9h}Y_T5d}xPMP(%*`5^x_rCtcM}`$hNZr%ObNN^JZ;-Y?b-dx zn?w1|cHLlmd2@S2@&A?|jwk19mj`t@zGAtp|LJ*a`UNy_HX6p1nf$c6Qnl#q?_pY>8KdCS~uRZSQ z`#SYy#pg}mc<-5eYX0ODfzsFJ`vV1jdiK>W{?Z{^l{OzPx7+C5$UT-G@yGywp;w)oEg diff --git a/packages/nuka/stories/images/2.png b/packages/nuka/stories/images/2.png deleted file mode 100644 index 0ea55004fea679e3de45b9b8ff41d14ddc0cba48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1298 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 diff --git a/packages/nuka/stories/images/4.png b/packages/nuka/stories/images/4.png deleted file mode 100644 index a7291b01b78bc744da4152c52fcd785437319431..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1189 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 JygBRybOU%@N z)J=OP6}@YI?fVidpy{N71OHcRACdhpxwBrUgCqN%l*^Ag8=trTm>iRwC)~JWdqO&0 z>Bx5WRrl`Z8vQwU^j&Redhu))&7+ThuR8b4jN?-G##GbSb9_Gs|DVr(`A_lYYpyoB z+Le*d)~CNpmQc}No%es^zvokB7JhP@8hr$296-L}y zv~%tK$$kEXT9pG9=)Pu_Nw-pS+@H{vp#%mJ~6G-%1Y~~3;W7{Z|rtRwF zGg`50ua4R-K`HP38$xR@n+1uU;5Rbl-!1TsbtU)e@^JnGf~6B1vw~!IKC$I*zM*b^ z#qroS!P33=?0V8`FKu;PCVxm_rPHQAWBq&K=n?69<)}ma&8Z8-m%Nwzb7PM}^xvw9lU%o) zp32?-XS;5t;~fo!;|~`^Pk$%-ZShRL)onqmzFz6o+sZa`wt}g(vfGvGcQ1Wdt5xCn zYOUu+p(hi6sx8_Vr=O*tl2|*TE_#B|tjgG3Mq4LyPq?OVcdA0#3a{qW>)&LjSC!gj zeG~lr_m;xpin8{oUtXc_Q+(66`(~#aUh2)bV8rLOcQe=Xi4*^A;&^`imdzn~ze!82 zLOIgQK65>L-J~PUE*R)>RqPt~rDD_g7Vq^@l4tAoZrX2uN&eW^fU6NEea%M;YQ2>n zMP^o>-nU3lrOHf%@?Np)3x~gz73sR`Kx!-w$`p$_40?~n`x)# zEc)_RvnxBfd&RPejh0NdA+6dY&RgEV`(`njxgN@xNA D*?tw* diff --git a/packages/nuka/stories/images/8.png b/packages/nuka/stories/images/8.png deleted file mode 100644 index 30ec4d87716d02597ebfa7ab10d97f641e8a4f8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1355 zcmb7E`!~}I0H4drr9_WgR~}P}i&(T#nB8x-MlFxg8qRHTJrX7~S=rn(H{}uLQLSYW ztt2$ht65#<&Aet@hMkJd%5*c0Vs}@6LZ5R!=X1{Id_L#%+b7e{2W_CgPagyV8F+gk zu^^CE{x|AqZ#s!|JI$t;_+bK3;#3cfMkC3=DR?Z^?BLfW>D&Y2LUqO`LDPYE{^ZS= z-es?#BoJtO$2V#f+if=ifpo^bkw9R|1I3geNqF+-?gSJk0_=ZFYj8H}w8XPubK<+9A?T8+-7dvK z6jiwxy7gu4dB7oQ{-LgeoO(q-#(&AR2&z%TydvPA_3E4fb3<&9FPv7<(r8-IK)t48 z%(bY^sI0zg4&1*(+OUCFzl#ll)5cyheU+)sUeW4l%9>!Y@E_!)_mcVCks(4~HoJCX zi1@zS)+|!`=N=Y#eE5Y){Vd6fS)0y3>Wj|jNYwvv@*L!8?2IPIEu@UVLMs(POo-?Ma2?yjS8DG(Ko*8xpPZGb|qFffl#D3 zd^=c(r$OO!ieo1+Ra<=I)3|ne#s78uvlVA@|#SdK)uV%Mp&vprP zvn6~BqMRxDR+$tPq$t}zo{=&#Z+0|VA>c^&SK5nIA18exAt&AlLx zROp%)ae$LP6hq>;^*r6xF}Qwd_pzw}xfz(}!G-m-xd6Fi_ada-?D~$x7o;GrvFoCx zR9Ow!^6b4^ZPGM#GVH7L|jy$twQjSp0cV`GY4LSD$}&%6O!d_vyx4A3ncBit-RnEOMSbC z&w<)sjq3NwSKWK!R7DWp!FuCcfU9QRPvz}5SM)T#q~8xh}ez0loR}H>;z?aroL9uMkf}Qd*xzgI7Lu1#I2b` zMnDlAjv9%>z^y;?8?wUljya=CqY`hbEf^jxu196TjLEG{vS0zVB4uh@bi#v}%Fd6Z zP(!2idWrP>YpSNL1nL|heYYx)QXU-e=j}uh?v}9FUr!lz5F`8l9nH~F*gEAZZmrD6 z^{1?+K^LP_FIf_LKdwAHyL@r5aT;Kb?b7j|0Yq_-p$*;9C1cCu6Lq?AM}zP;fH^jp z`x-ANj<8x5%qGQe>}KcRo`zrNdHt^5Px?7 diff --git a/packages/nuka/stories/images/9.png b/packages/nuka/stories/images/9.png deleted file mode 100644 index 51da756bad253e7f0d1606d2e1705e4cec31ad1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1340 zcmb7E{WlW|0G-;?hZsF7wA!=zcuB;|%XibTtt>5K<||)^<15UBEumgdk!_e3rjzg{ zO`&1fUcJR4oSM`u_SEovEKQiN+0&oUJ?EZ#&OP^@``gX;!FXx!HrfpU0JKp^1Qr0$ zpnNBA`<9bJwN!73vCmmwk4I4T7M{7P-%-^wLiOTj_1}T&-ZZteK`rtUd2YpaT}I+k z0RSDrcWRVc>KFq6z#bF=?t7&|KGKyW@jTFzoKLeT?D8bI(DI83M{|gv^Ct%mOp;3~ zjD!I{9kLBPWwbbWY<|Mwkm0WsAky`|bP)T7mbbn-#&k-v+1mJFZ1Vp=%U4dzMN!M) z$wSKr;~OEr*HcwwnHjj7gGsvw+Fqy|HC;dJid( zBi*Py9lwYpfQ!at1i^X8aVHRQ}|*Wr6J zs-M6&cJ%Y~G#S!!eOdPm7p^K~!}jKT9(WD=ZMIx2)qXn+ndRmiI;Z;OnIgej;RULGTUgy;GMc zz1j?S)D8y7o?N&8-)CnPjFA>a)ffV;Z5RFm(&W}gUwcf7$qX}9*%ZKpKDj|WxhAS+ z5t(pCrE}7b|1{po;tr%3qc8$8&>0fM6R-?j&sx=H*s^ZHgl(x=xzgxO%?P_##rKLV#ss2o0x zN%z6pA4^Gbme+PZ%)UG6BC!=m#U${IydO9;#}yIkDwdSgk31Yf*~5&@65N6}*|+W< ztsG5zzHk%nNhLoG8}x!xs7b5!_{^mOX#4%F6`NM;ULtG8pfIZL0Fl2i5$dm_PYq(M zLF3+N(N^gG?6m~YbUL^E#(OQ7Rt*8lPf3G~7W%0DTOlxYbDMw3Jajg4+=<=xSJ zq|22b>zBE+ Date: Fri, 2 Feb 2024 16:51:21 -0800 Subject: [PATCH 02/69] Add next and previous slide hooks --- .../nuka/src/Carousel/Carousel.stories.tsx | 57 ++++++++---- packages/nuka/src/Carousel/Carousel.test.tsx | 12 ++- packages/nuka/src/Carousel/Carousel.tsx | 92 +++++++++++++++++-- packages/nuka/src/Carousel/ExampleSlide.tsx | 14 +++ 4 files changed, 150 insertions(+), 25 deletions(-) create mode 100644 packages/nuka/src/Carousel/ExampleSlide.tsx diff --git a/packages/nuka/src/Carousel/Carousel.stories.tsx b/packages/nuka/src/Carousel/Carousel.stories.tsx index a0ca15c9..b291b502 100644 --- a/packages/nuka/src/Carousel/Carousel.stories.tsx +++ b/packages/nuka/src/Carousel/Carousel.stories.tsx @@ -1,10 +1,34 @@ import type { Meta, StoryObj } from '@storybook/react'; -import { Carousel } from './Carousel'; -import { CSSProperties } from 'react'; +import { Carousel, CarouselProps, SlideHandle } from './Carousel'; +import { useRef } from 'react'; +import { ExampleSlide } from './ExampleSlide'; + +const StorybookComponent = (props: CarouselProps) => { + const ref = useRef(null); + return ( +
+ + + +
+ ); +}; const meta: Meta = { title: 'components/Carousel', - component: (props) => , + component: StorybookComponent, tags: ['autodocs'], }; @@ -12,24 +36,25 @@ export default meta; type Story = StoryObj; -const getExampleSlideStyles = (index: number): CSSProperties => ({ - backgroundColor: index % 2 == 0 ? 'gray' : 'lightGray', - display: 'flex', - alignItems: 'center', - justifyContent: 'center', - padding: '15vw', -}); - -const Slide = ({ index }: { index: number }) => ( -
{index}
-); - export const Default: Story = { args: { children: ( <> {[...Array(6)].map((_, index) => ( - + + ))} + + ), + }, +}; + +export const Slide: Story = { + args: { + scrollDistance: 'slide', + children: ( + <> + {[...Array(6)].map((_, index) => ( + ))} ), diff --git a/packages/nuka/src/Carousel/Carousel.test.tsx b/packages/nuka/src/Carousel/Carousel.test.tsx index 342f4cf1..27dcf2d4 100644 --- a/packages/nuka/src/Carousel/Carousel.test.tsx +++ b/packages/nuka/src/Carousel/Carousel.test.tsx @@ -1,8 +1,18 @@ +import { render } from '@testing-library/react'; +import { Carousel } from './Carousel'; +import { ExampleSlide } from './ExampleSlide'; + describe('Carousel', () => { it.todo('passes a className and ref for the parent'); it.todo('passes the same className for each of the children'); it.todo('is draggable through touch controls'); - it.todo('has a next and previous function that is callable from its parent'); + it('has a next and previous function that is callable from its parent', () => { + render( + + + + ); + }); it.todo('can slide'); it.todo('omits slides whose children are falsy'); diff --git a/packages/nuka/src/Carousel/Carousel.tsx b/packages/nuka/src/Carousel/Carousel.tsx index cbdbca86..825f73e2 100644 --- a/packages/nuka/src/Carousel/Carousel.tsx +++ b/packages/nuka/src/Carousel/Carousel.tsx @@ -1,14 +1,90 @@ -import { ReactNode } from 'react'; +import { + ReactNode, + forwardRef, + useCallback, + useEffect, + useImperativeHandle, + useRef, + useState, +} from 'react'; import './Carousel.css'; -type CarouselProps = { +export type CarouselProps = { children: ReactNode; + scrollDistance?: number | 'slide'; }; -export const Carousel = ({ children }: CarouselProps) => { - return ( -
-
{children}
-
- ); +export type SlideHandle = { + nextSlide: () => void; + previousSlide: () => void; }; + +enum SlideDirection { + Back = 'back', + Forward = 'forward', +} + +export const Carousel = forwardRef( + ({ children, scrollDistance = 100 }: CarouselProps, ref) => { + const [currentScrollIndex, setCurrentScrollIndex] = useState(0); + const [currentSlideIndex, setCurrentSlideIndex] = useState(0); + + const containerRef = useRef(null); + const wrapperRef = useRef(null); + + useEffect(() => { + if (containerRef.current) { + containerRef.current.scroll(currentScrollIndex, 0); + } + }, [currentScrollIndex]); + + const handleScroll = useCallback( + (distance: number | 'slide', direction: SlideDirection) => { + let proposedScrollDistance = 0; + const isMovingForward = direction === SlideDirection.Forward; + + if (typeof distance === 'number') { + proposedScrollDistance = currentScrollIndex + distance; + } else { + const newSlideIndex = currentSlideIndex + (isMovingForward ? 1 : -1); + + const incrementSlideDistance = + wrapperRef.current?.children[ + isMovingForward ? currentSlideIndex : newSlideIndex + ]?.scrollWidth; + + setCurrentSlideIndex(newSlideIndex); + proposedScrollDistance = incrementSlideDistance || 0; + } + + proposedScrollDistance = + proposedScrollDistance * (isMovingForward ? 1 : -1); + + setCurrentScrollIndex(currentScrollIndex + proposedScrollDistance); + }, + [currentScrollIndex, currentSlideIndex, setCurrentSlideIndex, wrapperRef] + ); + + useImperativeHandle(ref, () => ({ + nextSlide() { + handleScroll(scrollDistance, SlideDirection.Forward); + }, + previousSlide() { + handleScroll(scrollDistance, SlideDirection.Back); + }, + })); + + return ( +
+ + {JSON.stringify({ currentScrollIndex, currentSlideIndex })} + +
+ {children} +
+
+ ); + } +); + +Carousel.displayName = 'Carousel'; diff --git a/packages/nuka/src/Carousel/ExampleSlide.tsx b/packages/nuka/src/Carousel/ExampleSlide.tsx new file mode 100644 index 00000000..32653f15 --- /dev/null +++ b/packages/nuka/src/Carousel/ExampleSlide.tsx @@ -0,0 +1,14 @@ +import { CSSProperties } from 'react'; + +const getExampleSlideStyles = (index: number): CSSProperties => ({ + backgroundColor: index % 2 == 0 ? 'gray' : 'lightGray', + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + padding: '15vw', + minWidth: index === 1 ? '300px' : 'auto', +}); + +export const ExampleSlide = ({ index }: { index: number }) => ( +
{index}
+); From d09e8bff70c274cf40d70e879238c7b93738c586 Mon Sep 17 00:00:00 2001 From: Melvin Chen Date: Tue, 6 Feb 2024 16:00:06 -0800 Subject: [PATCH 03/69] Next and previous buttons by slide width --- .../nuka/src/Carousel/Carousel.stories.tsx | 4 +- packages/nuka/src/Carousel/Carousel.tsx | 93 +++++++++++++------ .../nuka/src/Carousel/CarouselStories.css | 3 + 3 files changed, 73 insertions(+), 27 deletions(-) create mode 100644 packages/nuka/src/Carousel/CarouselStories.css diff --git a/packages/nuka/src/Carousel/Carousel.stories.tsx b/packages/nuka/src/Carousel/Carousel.stories.tsx index b291b502..b4478d3c 100644 --- a/packages/nuka/src/Carousel/Carousel.stories.tsx +++ b/packages/nuka/src/Carousel/Carousel.stories.tsx @@ -2,6 +2,7 @@ import type { Meta, StoryObj } from '@storybook/react'; import { Carousel, CarouselProps, SlideHandle } from './Carousel'; import { useRef } from 'react'; import { ExampleSlide } from './ExampleSlide'; +import './CarouselStories.css'; const StorybookComponent = (props: CarouselProps) => { const ref = useRef(null); @@ -51,9 +52,10 @@ export const Default: Story = { export const Slide: Story = { args: { scrollDistance: 'slide', + wrapperClassName: 'slide__with-gap', children: ( <> - {[...Array(6)].map((_, index) => ( + {[...Array(10)].map((_, index) => ( ))} diff --git a/packages/nuka/src/Carousel/Carousel.tsx b/packages/nuka/src/Carousel/Carousel.tsx index 825f73e2..eec5ba57 100644 --- a/packages/nuka/src/Carousel/Carousel.tsx +++ b/packages/nuka/src/Carousel/Carousel.tsx @@ -12,6 +12,7 @@ import './Carousel.css'; export type CarouselProps = { children: ReactNode; scrollDistance?: number | 'slide'; + wrapperClassName?: string; }; export type SlideHandle = { @@ -25,9 +26,14 @@ enum SlideDirection { } export const Carousel = forwardRef( - ({ children, scrollDistance = 100 }: CarouselProps, ref) => { + ( + { children, scrollDistance = 100, wrapperClassName }: CarouselProps, + ref + ) => { const [currentScrollIndex, setCurrentScrollIndex] = useState(0); const [currentSlideIndex, setCurrentSlideIndex] = useState(0); + const [currentManualScrollIndex, setCurrentManualScrollIndex] = useState(0); + const [slideStartIndices, setSlideStartIndices] = useState([]); const containerRef = useRef(null); const wrapperRef = useRef(null); @@ -38,48 +44,83 @@ export const Carousel = forwardRef( } }, [currentScrollIndex]); - const handleScroll = useCallback( - (distance: number | 'slide', direction: SlideDirection) => { - let proposedScrollDistance = 0; - const isMovingForward = direction === SlideDirection.Forward; + useEffect(() => { + const handleDebounce = setTimeout(() => { + setCurrentScrollIndex(currentManualScrollIndex); - if (typeof distance === 'number') { - proposedScrollDistance = currentScrollIndex + distance; - } else { - const newSlideIndex = currentSlideIndex + (isMovingForward ? 1 : -1); + const closestPassedSlide = slideStartIndices.reduce( + (prev, current, index) => + current - currentManualScrollIndex < 0 ? index + 1 : prev, + 0 + ); + setCurrentSlideIndex(closestPassedSlide); + }, 100); - const incrementSlideDistance = - wrapperRef.current?.children[ - isMovingForward ? currentSlideIndex : newSlideIndex - ]?.scrollWidth; + return () => { + clearTimeout(handleDebounce); + }; + }, [currentManualScrollIndex, slideStartIndices]); - setCurrentSlideIndex(newSlideIndex); - proposedScrollDistance = incrementSlideDistance || 0; - } + useEffect(() => { + if (wrapperRef.current?.children) { + const wrapperChildren = Array.from( + wrapperRef.current.children + ) as HTMLDivElement[]; + const startIndices = wrapperChildren.reduce( + (prev, child, currentIndex) => [ + ...prev, + currentIndex === 0 + ? child.offsetWidth + : prev[currentIndex - 1] + child.offsetWidth, + ], + [] + ); + setSlideStartIndices(startIndices); + } + }, [wrapperRef]); - proposedScrollDistance = - proposedScrollDistance * (isMovingForward ? 1 : -1); + const handleScrollAction = useCallback( + (distance: number | 'slide', direction: SlideDirection) => { + if (typeof distance === 'number') { + setCurrentScrollIndex( + currentScrollIndex + + distance * (direction === SlideDirection.Forward ? 1 : -1) + ); + } else { + const proposedSlideIndex = + currentSlideIndex + (direction === SlideDirection.Forward ? 1 : -1); + const proposedSlide = + wrapperRef.current?.children[proposedSlideIndex]; - setCurrentScrollIndex(currentScrollIndex + proposedScrollDistance); + if (proposedSlide) { + const proposedScrollIndex = (proposedSlide as HTMLElement) + .offsetLeft; + setCurrentScrollIndex(proposedScrollIndex); + setCurrentSlideIndex(proposedSlideIndex); + } + } }, [currentScrollIndex, currentSlideIndex, setCurrentSlideIndex, wrapperRef] ); useImperativeHandle(ref, () => ({ nextSlide() { - handleScroll(scrollDistance, SlideDirection.Forward); + handleScrollAction(scrollDistance, SlideDirection.Forward); }, previousSlide() { - handleScroll(scrollDistance, SlideDirection.Back); + handleScrollAction(scrollDistance, SlideDirection.Back); }, })); return ( -
- - {JSON.stringify({ currentScrollIndex, currentSlideIndex })} - -
+
{ + setCurrentManualScrollIndex((event.target as HTMLElement).scrollLeft); + }} + > +
{children}
diff --git a/packages/nuka/src/Carousel/CarouselStories.css b/packages/nuka/src/Carousel/CarouselStories.css new file mode 100644 index 00000000..7653031d --- /dev/null +++ b/packages/nuka/src/Carousel/CarouselStories.css @@ -0,0 +1,3 @@ +.slide__with-gap { + gap: 8px; +} From 2658ca0e23806953d05086a17e2a1b91c23fd7c7 Mon Sep 17 00:00:00 2001 From: Melvin Chen Date: Thu, 8 Feb 2024 15:27:25 -0500 Subject: [PATCH 04/69] Add autoplay, fix scroll distance --- .../nuka/src/Carousel/Carousel.stories.tsx | 31 +++++++++++++++-- packages/nuka/src/Carousel/Carousel.tsx | 33 ++++++++++++++++--- packages/nuka/src/Carousel/ExampleSlide.tsx | 12 +++++++ 3 files changed, 70 insertions(+), 6 deletions(-) diff --git a/packages/nuka/src/Carousel/Carousel.stories.tsx b/packages/nuka/src/Carousel/Carousel.stories.tsx index b4478d3c..95ad8613 100644 --- a/packages/nuka/src/Carousel/Carousel.stories.tsx +++ b/packages/nuka/src/Carousel/Carousel.stories.tsx @@ -1,7 +1,7 @@ import type { Meta, StoryObj } from '@storybook/react'; import { Carousel, CarouselProps, SlideHandle } from './Carousel'; import { useRef } from 'react'; -import { ExampleSlide } from './ExampleSlide'; +import { ExampleSlide, FullWidthSlide } from './ExampleSlide'; import './CarouselStories.css'; const StorybookComponent = (props: CarouselProps) => { @@ -37,7 +37,7 @@ export default meta; type Story = StoryObj; -export const Default: Story = { +export const FixedWidthScroll: Story = { args: { children: ( <> @@ -62,3 +62,30 @@ export const Slide: Story = { ), }, }; + +export const FullWidth: Story = { + args: { + scrollDistance: 'slide', + children: ( + <> + {[...Array(10)].map((_, index) => ( + + ))} + + ), + }, +}; + +export const AutoPlay: Story = { + args: { + scrollDistance: 'slide', + autoplay: true, + children: ( + <> + {[...Array(10)].map((_, index) => ( + + ))} + + ), + }, +}; diff --git a/packages/nuka/src/Carousel/Carousel.tsx b/packages/nuka/src/Carousel/Carousel.tsx index eec5ba57..ce9d44c0 100644 --- a/packages/nuka/src/Carousel/Carousel.tsx +++ b/packages/nuka/src/Carousel/Carousel.tsx @@ -13,6 +13,8 @@ export type CarouselProps = { children: ReactNode; scrollDistance?: number | 'slide'; wrapperClassName?: string; + autoplay?: boolean; + autoplayInterval?: number; }; export type SlideHandle = { @@ -27,7 +29,13 @@ enum SlideDirection { export const Carousel = forwardRef( ( - { children, scrollDistance = 100, wrapperClassName }: CarouselProps, + { + children, + scrollDistance = 100, + wrapperClassName, + autoplay = false, + autoplayInterval = 3000, + }: CarouselProps, ref ) => { const [currentScrollIndex, setCurrentScrollIndex] = useState(0); @@ -91,18 +99,35 @@ export const Carousel = forwardRef( currentSlideIndex + (direction === SlideDirection.Forward ? 1 : -1); const proposedSlide = wrapperRef.current?.children[proposedSlideIndex]; + const containerRefOffset = containerRef.current?.offsetLeft; if (proposedSlide) { - const proposedScrollIndex = (proposedSlide as HTMLElement) - .offsetLeft; + const proposedScrollIndex = + (proposedSlide as HTMLElement).offsetLeft - + (containerRefOffset || 0); setCurrentScrollIndex(proposedScrollIndex); setCurrentSlideIndex(proposedSlideIndex); } } }, - [currentScrollIndex, currentSlideIndex, setCurrentSlideIndex, wrapperRef] + [ + currentScrollIndex, + currentSlideIndex, + setCurrentSlideIndex, + wrapperRef, + containerRef, + ] ); + useEffect(() => { + if (autoplay) { + setTimeout(() => { + handleScrollAction(scrollDistance, SlideDirection.Forward); + }, autoplayInterval); + } + return () => clearTimeout(autoplayInterval); + }, [autoplay, autoplayInterval, handleScrollAction, scrollDistance]); + useImperativeHandle(ref, () => ({ nextSlide() { handleScrollAction(scrollDistance, SlideDirection.Forward); diff --git a/packages/nuka/src/Carousel/ExampleSlide.tsx b/packages/nuka/src/Carousel/ExampleSlide.tsx index 32653f15..953333eb 100644 --- a/packages/nuka/src/Carousel/ExampleSlide.tsx +++ b/packages/nuka/src/Carousel/ExampleSlide.tsx @@ -12,3 +12,15 @@ const getExampleSlideStyles = (index: number): CSSProperties => ({ export const ExampleSlide = ({ index }: { index: number }) => (
{index}
); + +export const FullWidthSlide = ({ index }: { index: number }) => ( +
+ {index} +
+); From a6c7d4dbcdee9b53b4fcbcc8d16925c6ff086e5a Mon Sep 17 00:00:00 2001 From: Melvin Chen Date: Thu, 8 Feb 2024 15:30:42 -0500 Subject: [PATCH 05/69] Add back index.tsx --- packages/nuka/src/index.ts | 0 packages/nuka/src/index.tsx | 1 + 2 files changed, 1 insertion(+) delete mode 100644 packages/nuka/src/index.ts create mode 100644 packages/nuka/src/index.tsx diff --git a/packages/nuka/src/index.ts b/packages/nuka/src/index.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/nuka/src/index.tsx b/packages/nuka/src/index.tsx new file mode 100644 index 00000000..01c1a4c2 --- /dev/null +++ b/packages/nuka/src/index.tsx @@ -0,0 +1 @@ +export { Carousel as default } from './Carousel/Carousel'; From f0c08eee85a80af4a0b717cf5a7ab2e29f9068ad Mon Sep 17 00:00:00 2001 From: Melvin Chen Date: Thu, 8 Feb 2024 17:11:12 -0500 Subject: [PATCH 06/69] Scroll by screen width --- packages/nuka/src/Carousel/Carousel.css | 6 ++++++ .../nuka/src/Carousel/Carousel.stories.tsx | 14 +++++++++++++ packages/nuka/src/Carousel/Carousel.tsx | 20 ++++++++++++++----- 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/packages/nuka/src/Carousel/Carousel.css b/packages/nuka/src/Carousel/Carousel.css index 6b0e7d08..2b10ed2e 100644 --- a/packages/nuka/src/Carousel/Carousel.css +++ b/packages/nuka/src/Carousel/Carousel.css @@ -1,6 +1,12 @@ .overflow { overflow: scroll; scroll-behavior: smooth; + -ms-overflow-style: none; /* IE and Edge */ + scrollbar-width: none; /* Firefox */ +} + +.overflow::-webkit-scrollbar { + display: none; } .wrapper { diff --git a/packages/nuka/src/Carousel/Carousel.stories.tsx b/packages/nuka/src/Carousel/Carousel.stories.tsx index 95ad8613..68084b86 100644 --- a/packages/nuka/src/Carousel/Carousel.stories.tsx +++ b/packages/nuka/src/Carousel/Carousel.stories.tsx @@ -76,6 +76,20 @@ export const FullWidth: Story = { }, }; +export const Screen: Story = { + args: { + scrollDistance: 'screen', + wrapperClassName: 'slide__with-gap', + children: ( + <> + {[...Array(10)].map((_, index) => ( + + ))} + + ), + }, +}; + export const AutoPlay: Story = { args: { scrollDistance: 'slide', diff --git a/packages/nuka/src/Carousel/Carousel.tsx b/packages/nuka/src/Carousel/Carousel.tsx index ce9d44c0..5860b8bb 100644 --- a/packages/nuka/src/Carousel/Carousel.tsx +++ b/packages/nuka/src/Carousel/Carousel.tsx @@ -9,9 +9,11 @@ import { } from 'react'; import './Carousel.css'; +type scrollDistanceType = number | 'slide' | 'screen'; + export type CarouselProps = { children: ReactNode; - scrollDistance?: number | 'slide'; + scrollDistance?: scrollDistanceType; wrapperClassName?: string; autoplay?: boolean; autoplayInterval?: number; @@ -88,15 +90,23 @@ export const Carousel = forwardRef( }, [wrapperRef]); const handleScrollAction = useCallback( - (distance: number | 'slide', direction: SlideDirection) => { + (distance: scrollDistanceType, direction: SlideDirection) => { + const movementDirectionMultiplier = + direction === SlideDirection.Forward ? 1 : -1; if (typeof distance === 'number') { setCurrentScrollIndex( - currentScrollIndex + - distance * (direction === SlideDirection.Forward ? 1 : -1) + currentScrollIndex + distance * movementDirectionMultiplier ); + } else if (distance === 'screen') { + if (wrapperRef.current) { + setCurrentScrollIndex( + currentScrollIndex + + wrapperRef.current.offsetWidth * movementDirectionMultiplier + ); + } } else { const proposedSlideIndex = - currentSlideIndex + (direction === SlideDirection.Forward ? 1 : -1); + currentSlideIndex + movementDirectionMultiplier; const proposedSlide = wrapperRef.current?.children[proposedSlideIndex]; const containerRefOffset = containerRef.current?.offsetLeft; From 111c8af827766bc1a4bcab873be4ae2affd1bd3c Mon Sep 17 00:00:00 2001 From: Melvin Chen Date: Tue, 13 Feb 2024 10:21:20 -0800 Subject: [PATCH 07/69] Refactor scroll handling based on page indices --- .../nuka/src/Carousel/Carousel.stories.tsx | 21 ++- packages/nuka/src/Carousel/Carousel.test.tsx | 20 ++- packages/nuka/src/Carousel/Carousel.tsx | 159 +++++++++++++----- .../nuka/src/Carousel/CarouselStories.css | 20 +++ .../src/PageIndicators/PageIndicators.tsx | 33 ++++ tsconfig.json | 2 +- 6 files changed, 207 insertions(+), 48 deletions(-) create mode 100644 packages/nuka/src/PageIndicators/PageIndicators.tsx diff --git a/packages/nuka/src/Carousel/Carousel.stories.tsx b/packages/nuka/src/Carousel/Carousel.stories.tsx index 68084b86..4cba6b2a 100644 --- a/packages/nuka/src/Carousel/Carousel.stories.tsx +++ b/packages/nuka/src/Carousel/Carousel.stories.tsx @@ -8,7 +8,6 @@ const StorybookComponent = (props: CarouselProps) => { const ref = useRef(null); return (
- +
); }; @@ -103,3 +103,22 @@ export const AutoPlay: Story = { ), }, }; + +export const PageIndicators: Story = { + args: { + scrollDistance: 'screen', + showPageIndicators: true, + pageIndicatorProps: { + currentPageIndicatorClassName: 'indicator__current', + pageIndicatorClassName: 'indicator', + containerClassName: 'indicator-container', + }, + children: ( + <> + {[...Array(10)].map((_, index) => ( + + ))} + + ), + }, +}; diff --git a/packages/nuka/src/Carousel/Carousel.test.tsx b/packages/nuka/src/Carousel/Carousel.test.tsx index 27dcf2d4..5d2b9b1a 100644 --- a/packages/nuka/src/Carousel/Carousel.test.tsx +++ b/packages/nuka/src/Carousel/Carousel.test.tsx @@ -1,5 +1,10 @@ +/** + * @jest-environment jsdom + */ + +import { createRef } from 'react'; import { render } from '@testing-library/react'; -import { Carousel } from './Carousel'; +import { Carousel, SlideHandle } from './Carousel'; import { ExampleSlide } from './ExampleSlide'; describe('Carousel', () => { @@ -17,4 +22,17 @@ describe('Carousel', () => { it.todo('omits slides whose children are falsy'); it.todo('autoplays at the right rate'); + + it('returns the right number of page dots', () => { + const ref = createRef(); + render( + +
+
+
+ + ); + + // expect(ref.current?.getTotalNumberOfPagesFromScrollDistance()).toBe(6); + }); }); diff --git a/packages/nuka/src/Carousel/Carousel.tsx b/packages/nuka/src/Carousel/Carousel.tsx index 5860b8bb..348420a2 100644 --- a/packages/nuka/src/Carousel/Carousel.tsx +++ b/packages/nuka/src/Carousel/Carousel.tsx @@ -8,6 +8,7 @@ import { useState, } from 'react'; import './Carousel.css'; +import { PageIndicators } from '../PageIndicators/PageIndicators'; type scrollDistanceType = number | 'slide' | 'screen'; @@ -17,6 +18,12 @@ export type CarouselProps = { wrapperClassName?: string; autoplay?: boolean; autoplayInterval?: number; + showPageIndicators?: boolean; + pageIndicatorProps?: { + currentPageIndicatorClassName?: string; + pageIndicatorClassName?: string; + containerClassName?: string; + }; }; export type SlideHandle = { @@ -37,6 +44,8 @@ export const Carousel = forwardRef( wrapperClassName, autoplay = false, autoplayInterval = 3000, + showPageIndicators = false, + pageIndicatorProps, }: CarouselProps, ref ) => { @@ -44,6 +53,7 @@ export const Carousel = forwardRef( const [currentSlideIndex, setCurrentSlideIndex] = useState(0); const [currentManualScrollIndex, setCurrentManualScrollIndex] = useState(0); const [slideStartIndices, setSlideStartIndices] = useState([]); + const [pageStartIndices, setPageStartIndices] = useState([]); const containerRef = useRef(null); const wrapperRef = useRef(null); @@ -90,62 +100,111 @@ export const Carousel = forwardRef( }, [wrapperRef]); const handleScrollAction = useCallback( - (distance: scrollDistanceType, direction: SlideDirection) => { - const movementDirectionMultiplier = - direction === SlideDirection.Forward ? 1 : -1; - if (typeof distance === 'number') { - setCurrentScrollIndex( - currentScrollIndex + distance * movementDirectionMultiplier - ); - } else if (distance === 'screen') { - if (wrapperRef.current) { - setCurrentScrollIndex( - currentScrollIndex + - wrapperRef.current.offsetWidth * movementDirectionMultiplier - ); - } - } else { - const proposedSlideIndex = - currentSlideIndex + movementDirectionMultiplier; - const proposedSlide = - wrapperRef.current?.children[proposedSlideIndex]; - const containerRefOffset = containerRef.current?.offsetLeft; - - if (proposedSlide) { - const proposedScrollIndex = - (proposedSlide as HTMLElement).offsetLeft - - (containerRefOffset || 0); - setCurrentScrollIndex(proposedScrollIndex); - setCurrentSlideIndex(proposedSlideIndex); - } - } + (slideDirection: SlideDirection) => { + setCurrentScrollIndex( + pageStartIndices[ + currentSlideIndex + + (slideDirection === SlideDirection.Forward ? 1 : -1) + ] + ); }, - [ - currentScrollIndex, - currentSlideIndex, - setCurrentSlideIndex, - wrapperRef, - containerRef, - ] + [pageStartIndices, currentSlideIndex] ); useEffect(() => { if (autoplay) { setTimeout(() => { - handleScrollAction(scrollDistance, SlideDirection.Forward); + handleScrollAction(SlideDirection.Forward); }, autoplayInterval); } return () => clearTimeout(autoplayInterval); }, [autoplay, autoplayInterval, handleScrollAction, scrollDistance]); - useImperativeHandle(ref, () => ({ - nextSlide() { - handleScrollAction(scrollDistance, SlideDirection.Forward); - }, - previousSlide() { - handleScrollAction(scrollDistance, SlideDirection.Back); - }, - })); + useEffect(() => { + if (wrapperRef.current && containerRef.current) { + const wrapperCurrent = wrapperRef.current; + const containerRefOffsetLeft = containerRef.current.offsetLeft; + + if (scrollDistance === 'slide') { + setPageStartIndices( + Array.from(wrapperCurrent.children).map( + (child) => + (child as HTMLElement).offsetLeft - containerRefOffsetLeft + ) + ); + } else { + const lastChild = wrapperCurrent.lastChild as HTMLElement; + const carouselTotalWidth = + lastChild.offsetLeft + + lastChild.offsetWidth - + wrapperCurrent.offsetLeft; + + if (typeof scrollDistance === 'number') { + setPageStartIndices( + Array.from( + { + length: carouselTotalWidth / scrollDistance, + }, + (_, index) => wrapperCurrent.offsetLeft + index * scrollDistance + ) + ); + } else { + const arrayLength = Math.ceil( + carouselTotalWidth / wrapperCurrent.offsetWidth + ); + setPageStartIndices( + Array.from( + { + length: arrayLength, + }, + (_, index) => { + if (index === arrayLength - 1) { + return ( + carouselTotalWidth - + wrapperCurrent.offsetWidth - + containerRefOffsetLeft + ); + } + return ( + wrapperCurrent.offsetWidth * index - containerRefOffsetLeft + ); + } + ) + ); + } + } + } + }, [scrollDistance, wrapperRef, containerRef]); + + const getCurrentPageIndex = useCallback(() => { + if (containerRef.current) { + const containerScrollDistance = containerRef.current.scrollLeft; + + return containerScrollDistance === 0 + ? 0 + : pageStartIndices.findLastIndex( + (pageStartIndex) => containerScrollDistance >= pageStartIndex + ); + } + return 0; + }, [containerRef, pageStartIndices]); + + const getTotalNumberOfPages = useCallback(() => { + return pageStartIndices.length; + }, [pageStartIndices]); + + useImperativeHandle( + ref, + () => ({ + nextSlide() { + handleScrollAction(SlideDirection.Forward); + }, + previousSlide() { + handleScrollAction(SlideDirection.Back); + }, + }), + [handleScrollAction] + ); return (
(
{children}
+ {showPageIndicators && ( + + setCurrentScrollIndex(pageStartIndices[index]) + } + {...pageIndicatorProps} + /> + )}
); } diff --git a/packages/nuka/src/Carousel/CarouselStories.css b/packages/nuka/src/Carousel/CarouselStories.css index 7653031d..2e2c9a06 100644 --- a/packages/nuka/src/Carousel/CarouselStories.css +++ b/packages/nuka/src/Carousel/CarouselStories.css @@ -1,3 +1,23 @@ .slide__with-gap { gap: 8px; } + +.indicator-container { + display: flex; + gap: 4px; + position: fixed; + align-items: center; + justify-content: center; + width: 100%; + padding: 12px 0; +} + +.indicator { + width: 10px; + height: 10px; + background-color: lightgray; +} + +.indicator__current { + background-color: darkslategray; +} diff --git a/packages/nuka/src/PageIndicators/PageIndicators.tsx b/packages/nuka/src/PageIndicators/PageIndicators.tsx new file mode 100644 index 00000000..1d8352a3 --- /dev/null +++ b/packages/nuka/src/PageIndicators/PageIndicators.tsx @@ -0,0 +1,33 @@ +export type PageIndicatorsProps = { + totalIndicators: number; + currentPageIndex: number; + currentPageIndicatorClassName?: string; + pageIndicatorClassName?: string; + containerClassName?: string; + scrollToPage: (index: number) => void; +}; + +export const PageIndicators = ({ + totalIndicators, + currentPageIndex, + currentPageIndicatorClassName, + pageIndicatorClassName, + containerClassName, + scrollToPage, +}: PageIndicatorsProps) => { + return ( +
+ {[...Array(totalIndicators)].map((_, index) => ( +
+ ); +}; diff --git a/tsconfig.json b/tsconfig.json index 471c4477..d2c79d9d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,7 +4,7 @@ "target": "ES6", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ "lib": [ "DOM", - "ES2019" + "ES2023" ], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ "jsx": "react-jsx", /* Specify what JSX code is generated. */ From 5fae4f236617e1b3908f05a7e901a28b088dd392 Mon Sep 17 00:00:00 2001 From: Melvin Chen Date: Tue, 13 Feb 2024 12:55:14 -0800 Subject: [PATCH 08/69] Fix scroll by screen width, update jsx in tsconfig --- packages/nuka/src/Carousel/Carousel.tsx | 33 +++---------------------- tsconfig.json | 2 +- 2 files changed, 5 insertions(+), 30 deletions(-) diff --git a/packages/nuka/src/Carousel/Carousel.tsx b/packages/nuka/src/Carousel/Carousel.tsx index 348420a2..18ab637b 100644 --- a/packages/nuka/src/Carousel/Carousel.tsx +++ b/packages/nuka/src/Carousel/Carousel.tsx @@ -52,7 +52,6 @@ export const Carousel = forwardRef( const [currentScrollIndex, setCurrentScrollIndex] = useState(0); const [currentSlideIndex, setCurrentSlideIndex] = useState(0); const [currentManualScrollIndex, setCurrentManualScrollIndex] = useState(0); - const [slideStartIndices, setSlideStartIndices] = useState([]); const [pageStartIndices, setPageStartIndices] = useState([]); const containerRef = useRef(null); @@ -68,7 +67,7 @@ export const Carousel = forwardRef( const handleDebounce = setTimeout(() => { setCurrentScrollIndex(currentManualScrollIndex); - const closestPassedSlide = slideStartIndices.reduce( + const closestPassedSlide = pageStartIndices.reduce( (prev, current, index) => current - currentManualScrollIndex < 0 ? index + 1 : prev, 0 @@ -79,25 +78,7 @@ export const Carousel = forwardRef( return () => { clearTimeout(handleDebounce); }; - }, [currentManualScrollIndex, slideStartIndices]); - - useEffect(() => { - if (wrapperRef.current?.children) { - const wrapperChildren = Array.from( - wrapperRef.current.children - ) as HTMLDivElement[]; - const startIndices = wrapperChildren.reduce( - (prev, child, currentIndex) => [ - ...prev, - currentIndex === 0 - ? child.offsetWidth - : prev[currentIndex - 1] + child.offsetWidth, - ], - [] - ); - setSlideStartIndices(startIndices); - } - }, [wrapperRef]); + }, [currentManualScrollIndex, pageStartIndices]); const handleScrollAction = useCallback( (slideDirection: SlideDirection) => { @@ -159,15 +140,9 @@ export const Carousel = forwardRef( }, (_, index) => { if (index === arrayLength - 1) { - return ( - carouselTotalWidth - - wrapperCurrent.offsetWidth - - containerRefOffsetLeft - ); + return carouselTotalWidth - wrapperCurrent.offsetWidth; } - return ( - wrapperCurrent.offsetWidth * index - containerRefOffsetLeft - ); + return wrapperCurrent.offsetWidth * index; } ) ); diff --git a/tsconfig.json b/tsconfig.json index d2c79d9d..f4a5d279 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,7 +6,7 @@ "DOM", "ES2023" ], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ - "jsx": "react-jsx", /* Specify what JSX code is generated. */ + "jsx": "react", /* Specify what JSX code is generated. */ /* Modules */ "module": "commonjs", /* Specify what module code is generated. */ From dd02cf959cb0bc9351aac1a6d47b191f34c81101 Mon Sep 17 00:00:00 2001 From: Melvin Chen Date: Tue, 13 Feb 2024 17:23:22 -0800 Subject: [PATCH 09/69] Set index for on button clicks --- packages/nuka/src/Carousel/Carousel.tsx | 10 ++++++++-- tsconfig.json | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/nuka/src/Carousel/Carousel.tsx b/packages/nuka/src/Carousel/Carousel.tsx index 18ab637b..0fb78989 100644 --- a/packages/nuka/src/Carousel/Carousel.tsx +++ b/packages/nuka/src/Carousel/Carousel.tsx @@ -82,12 +82,18 @@ export const Carousel = forwardRef( const handleScrollAction = useCallback( (slideDirection: SlideDirection) => { + const proposedSlideIndex = + currentSlideIndex + + (slideDirection === SlideDirection.Forward ? 1 : -1); + const totalSlides = pageStartIndices.length - 1; setCurrentScrollIndex( pageStartIndices[ - currentSlideIndex + - (slideDirection === SlideDirection.Forward ? 1 : -1) + proposedSlideIndex < 0 + ? totalSlides + proposedSlideIndex + : proposedSlideIndex % totalSlides ] ); + setCurrentSlideIndex(proposedSlideIndex); }, [pageStartIndices, currentSlideIndex] ); diff --git a/tsconfig.json b/tsconfig.json index f4a5d279..d2c79d9d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,7 +6,7 @@ "DOM", "ES2023" ], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ - "jsx": "react", /* Specify what JSX code is generated. */ + "jsx": "react-jsx", /* Specify what JSX code is generated. */ /* Modules */ "module": "commonjs", /* Specify what module code is generated. */ From ca23f2b38bb1a7f25cea53473f994da9768f93b0 Mon Sep 17 00:00:00 2001 From: Melvin Chen Date: Wed, 14 Feb 2024 11:10:02 -0800 Subject: [PATCH 10/69] Wrap around, fix index issue, fix autoplay bug --- packages/nuka/src/Carousel/Carousel.tsx | 68 +++++++++++++------------ 1 file changed, 36 insertions(+), 32 deletions(-) diff --git a/packages/nuka/src/Carousel/Carousel.tsx b/packages/nuka/src/Carousel/Carousel.tsx index 0fb78989..491720e0 100644 --- a/packages/nuka/src/Carousel/Carousel.tsx +++ b/packages/nuka/src/Carousel/Carousel.tsx @@ -85,7 +85,8 @@ export const Carousel = forwardRef( const proposedSlideIndex = currentSlideIndex + (slideDirection === SlideDirection.Forward ? 1 : -1); - const totalSlides = pageStartIndices.length - 1; + + const totalSlides = pageStartIndices.length; setCurrentScrollIndex( pageStartIndices[ proposedSlideIndex < 0 @@ -100,11 +101,11 @@ export const Carousel = forwardRef( useEffect(() => { if (autoplay) { - setTimeout(() => { + const autoplayTimeout = setTimeout(() => { handleScrollAction(SlideDirection.Forward); }, autoplayInterval); + return () => clearTimeout(autoplayTimeout); } - return () => clearTimeout(autoplayInterval); }, [autoplay, autoplayInterval, handleScrollAction, scrollDistance]); useEffect(() => { @@ -112,48 +113,51 @@ export const Carousel = forwardRef( const wrapperCurrent = wrapperRef.current; const containerRefOffsetLeft = containerRef.current.offsetLeft; + const lastChild = wrapperCurrent.lastChild as HTMLElement; + const carouselTotalWidth = + lastChild.offsetLeft + + lastChild.offsetWidth - + wrapperCurrent.offsetLeft; + + let proposedPageStartIndices = []; + if (scrollDistance === 'slide') { - setPageStartIndices( - Array.from(wrapperCurrent.children).map( - (child) => - (child as HTMLElement).offsetLeft - containerRefOffsetLeft - ) + proposedPageStartIndices = Array.from(wrapperCurrent.children).map( + (child) => + (child as HTMLElement).offsetLeft - containerRefOffsetLeft ); } else { - const lastChild = wrapperCurrent.lastChild as HTMLElement; - const carouselTotalWidth = - lastChild.offsetLeft + - lastChild.offsetWidth - - wrapperCurrent.offsetLeft; - if (typeof scrollDistance === 'number') { - setPageStartIndices( - Array.from( - { - length: carouselTotalWidth / scrollDistance, - }, - (_, index) => wrapperCurrent.offsetLeft + index * scrollDistance - ) + proposedPageStartIndices = Array.from( + { + length: carouselTotalWidth / scrollDistance, + }, + (_, index) => wrapperCurrent.offsetLeft + index * scrollDistance ); } else { const arrayLength = Math.ceil( carouselTotalWidth / wrapperCurrent.offsetWidth ); - setPageStartIndices( - Array.from( - { - length: arrayLength, - }, - (_, index) => { - if (index === arrayLength - 1) { - return carouselTotalWidth - wrapperCurrent.offsetWidth; - } - return wrapperCurrent.offsetWidth * index; + proposedPageStartIndices = Array.from( + { + length: arrayLength, + }, + (_, index) => { + if (index === arrayLength - 1) { + return carouselTotalWidth - wrapperCurrent.offsetWidth; } - ) + return wrapperCurrent.offsetWidth * index; + } ); } } + + const lastIndexInView = + proposedPageStartIndices.findLastIndex( + (index) => index < carouselTotalWidth - wrapperCurrent.offsetWidth + ) + 2; + + setPageStartIndices(proposedPageStartIndices.slice(0, lastIndexInView)); } }, [scrollDistance, wrapperRef, containerRef]); From 3724ab75f2b3c2bfb05197bbe39735c131c9cf9f Mon Sep 17 00:00:00 2001 From: Melvin Chen Date: Fri, 16 Feb 2024 11:24:17 -0800 Subject: [PATCH 11/69] Use es2022 methods --- packages/nuka/src/Carousel/Carousel.tsx | 16 +++++++++++++--- tsconfig.json | 2 +- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/packages/nuka/src/Carousel/Carousel.tsx b/packages/nuka/src/Carousel/Carousel.tsx index 491720e0..ac33383f 100644 --- a/packages/nuka/src/Carousel/Carousel.tsx +++ b/packages/nuka/src/Carousel/Carousel.tsx @@ -36,6 +36,14 @@ enum SlideDirection { Forward = 'forward', } +const findLastIndex = ( + array: any[], + findFunction: (index: number) => boolean +) => { + const arrayCopy = [...array]; + return array.length - 1 - arrayCopy.reverse().findIndex(findFunction); +}; + export const Carousel = forwardRef( ( { @@ -153,7 +161,8 @@ export const Carousel = forwardRef( } const lastIndexInView = - proposedPageStartIndices.findLastIndex( + findLastIndex( + proposedPageStartIndices, (index) => index < carouselTotalWidth - wrapperCurrent.offsetWidth ) + 2; @@ -167,8 +176,9 @@ export const Carousel = forwardRef( return containerScrollDistance === 0 ? 0 - : pageStartIndices.findLastIndex( - (pageStartIndex) => containerScrollDistance >= pageStartIndex + : findLastIndex( + pageStartIndices, + (index) => containerScrollDistance >= index ); } return 0; diff --git a/tsconfig.json b/tsconfig.json index d2c79d9d..6d3b078c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,7 +4,7 @@ "target": "ES6", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ "lib": [ "DOM", - "ES2023" + "ES2022" ], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ "jsx": "react-jsx", /* Specify what JSX code is generated. */ From 13624e321e65702fe04c33f91b387c42c40c88dd Mon Sep 17 00:00:00 2001 From: Melvin Chen Date: Fri, 16 Feb 2024 11:46:22 -0800 Subject: [PATCH 12/69] Add api docs --- docs/api/index.mdx | 9 +++++ docs/api/methods.mdx | 23 +++++++++++++ docs/api/options.mdx | 79 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 111 insertions(+) create mode 100644 docs/api/index.mdx create mode 100644 docs/api/methods.mdx create mode 100644 docs/api/options.mdx diff --git a/docs/api/index.mdx b/docs/api/index.mdx new file mode 100644 index 00000000..39696e23 --- /dev/null +++ b/docs/api/index.mdx @@ -0,0 +1,9 @@ +--- +sidebar_position: 3 +--- + +# API v8 + +## children + +## scrollDistance \ No newline at end of file diff --git a/docs/api/methods.mdx b/docs/api/methods.mdx new file mode 100644 index 00000000..657bcca4 --- /dev/null +++ b/docs/api/methods.mdx @@ -0,0 +1,23 @@ +--- +sidebar_position: 2 +--- + +# Methods + +Nuka Carousel has a few exposed methods that allow the user to control certain parts of the carousel manually. + +## Progression + +The carousel can be advanced forward and backwards based on the `scrollDistance` defined from the props. + +### `goForward()` + +Advances the carousel forward by the given `scrollDistance`. + +### `goBack()` + +Advances the carousel backward by the given `scrollDistance`. + +### Usage/Examples + +Add examples here diff --git a/docs/api/options.mdx b/docs/api/options.mdx new file mode 100644 index 00000000..aaaf5c8c --- /dev/null +++ b/docs/api/options.mdx @@ -0,0 +1,79 @@ +--- +sidebar_position: 1 +--- + +# Options + +## Autoplay + +The carousel can advance on its own with a specified interval measured in milliseconds. An `autoplayInterval` without the `autoplay` prop being true will not do anything. + +### Details + +| Prop Name | Type | Default Value | +| :----------------- | :------ | :------------ | +| `autoplay` | boolean | `false` | +| `autoplayInterval` | number | `3000` | + +--- + +## Scroll + +How far the carousel should move when its goForward() and goBack() methods are called. + +### Details + +| Prop Name | Type | Default Value | +| :--------------- | :---------------------------- | :------------ | +| `scrollDistance` | number \| "slide" \| "screen" | `100` | + +Using a number will cause the carousel to scroll that many pixels each time. +Using "slide" will advance the carousel one slide each time. +Using "screen" will advance the carousel by the width of the visible carousel. + +### Examples + +Add examples here + +--- + +## Page Indicators + +Indicators that show what page the carousel is on. These pages are calculated from the `scrollDistance` and have to be styled in addition to setting the `showPageIndicators` boolean to true. + +### Details + +| Prop Name | Type | Default Value | +| :------------------- | :----------------- | :------------ | +| `showPageIndicators` | boolean | `false` | +| `pageIndicatorProps` | object (see below) | see below | + +#### `pageIndicatorProps` Details + +| Prop Name | Type | Default Value | +| :------------------------------ | :----- | :------------ | +| `containerClassName` | string | `undefined` | +| `currentPageIndicatorClassName` | string | `undefined` | +| `pageIndicatorClassName` | string | `undefined` | + +### Examples + +Add examples here + +--- + +## Wrapper Styling + +Apply classNames to the `
` that contains the `children`. This is likely how you will determine the spacing between items in the carousel. + +By default, this wrapper has `display: flex` applied. + +### Details + +| Prop Name | Type | Default Value | +| :----------------- | :----- | :------------ | +| `wrapperClassName` | string | `undefined` | + +### Examples + +Add examples here From 0556406286d6c816c8e0ad933c518e76de170147 Mon Sep 17 00:00:00 2001 From: Melvin Chen Date: Fri, 16 Feb 2024 14:36:46 -0800 Subject: [PATCH 13/69] Add examples into docs --- docs/api/options.mdx | 51 ++++++++++++-- packages/nuka/package.json | 2 +- .../nuka/src/Carousel/Carousel.stories.tsx | 5 +- packages/nuka/src/Carousel/Carousel.tsx | 36 +++++----- packages/nuka/src/index.tsx | 2 +- packages/nuka/tsup.config.ts | 1 + website/src/components/cards.tsx | 2 +- website/src/components/demos.tsx | 70 +++++++++++-------- 8 files changed, 111 insertions(+), 58 deletions(-) diff --git a/docs/api/options.mdx b/docs/api/options.mdx index aaaf5c8c..39749641 100644 --- a/docs/api/options.mdx +++ b/docs/api/options.mdx @@ -2,6 +2,10 @@ sidebar_position: 1 --- +import { BasicDemo } from '../../website/src/components/demos'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + # Options ## Autoplay @@ -15,6 +19,10 @@ The carousel can advance on its own with a specified interval measured in millis | `autoplay` | boolean | `false` | | `autoplayInterval` | number | `3000` | +### Example + + + --- ## Scroll @@ -25,7 +33,7 @@ How far the carousel should move when its goForward() and goBack() methods are c | Prop Name | Type | Default Value | | :--------------- | :---------------------------- | :------------ | -| `scrollDistance` | number \| "slide" \| "screen" | `100` | +| `scrollDistance` | "slide" \| number \| "screen" | `slide` | Using a number will cause the carousel to scroll that many pixels each time. Using "slide" will advance the carousel one slide each time. @@ -33,7 +41,28 @@ Using "screen" will advance the carousel by the width of the visible carousel. ### Examples -Add examples here + + +

+ Default scroll by slide width. The scroll distance will automatically + update on the widths of the slides so you can have multiple widths for + each slide. +

+ +
+ +

+ Scroll by a fixed distance measured in px. This example scrolls by 100px. +

+ +
+ +

+ Scroll by the width of the "screen" or the container the carousel is in. +

+ +
+
--- @@ -56,9 +85,19 @@ Indicators that show what page the carousel is on. These pages are calculated fr | `currentPageIndicatorClassName` | string | `undefined` | | `pageIndicatorClassName` | string | `undefined` | -### Examples +### Example -Add examples here + --- @@ -74,6 +113,6 @@ By default, this wrapper has `display: flex` applied. | :----------------- | :----- | :------------ | | `wrapperClassName` | string | `undefined` | -### Examples +### Example -Add examples here + diff --git a/packages/nuka/package.json b/packages/nuka/package.json index 689a749a..3408af3c 100644 --- a/packages/nuka/package.json +++ b/packages/nuka/package.json @@ -89,7 +89,7 @@ "url": "https://github.com/FormidableLabs/nuka-carousel/issues" }, "homepage": "https://github.com/FormidableLabs/nuka-carousel", - "sideEffects": false, + "sideEffects": true, "publishConfig": { "provenance": true } diff --git a/packages/nuka/src/Carousel/Carousel.stories.tsx b/packages/nuka/src/Carousel/Carousel.stories.tsx index 4cba6b2a..287c6e92 100644 --- a/packages/nuka/src/Carousel/Carousel.stories.tsx +++ b/packages/nuka/src/Carousel/Carousel.stories.tsx @@ -10,14 +10,14 @@ const StorybookComponent = (props: CarouselProps) => {
+ +
); }; From 90160fa40807d335cda90746d930fb4195634d10 Mon Sep 17 00:00:00 2001 From: Melvin Chen Date: Tue, 20 Feb 2024 11:05:27 -0800 Subject: [PATCH 14/69] Add mock for css files --- packages/nuka/__mocks__/styleMock.js | 1 + packages/nuka/jest.config.js | 3 +++ 2 files changed, 4 insertions(+) create mode 100644 packages/nuka/__mocks__/styleMock.js diff --git a/packages/nuka/__mocks__/styleMock.js b/packages/nuka/__mocks__/styleMock.js new file mode 100644 index 00000000..a0995453 --- /dev/null +++ b/packages/nuka/__mocks__/styleMock.js @@ -0,0 +1 @@ +module.exports = {}; \ No newline at end of file diff --git a/packages/nuka/jest.config.js b/packages/nuka/jest.config.js index 03df57ec..91d7ccff 100644 --- a/packages/nuka/jest.config.js +++ b/packages/nuka/jest.config.js @@ -1,3 +1,6 @@ module.exports = { + moduleNameMapper: { + '\\.(css|less)$': '/test/jest/__mocks__/styleMock.js', + }, setupFilesAfterEnv: ['/jest-setup.ts'], }; From 87577a0996262233dd9a9bcfa9ffeaf96fe67a67 Mon Sep 17 00:00:00 2001 From: Melvin Chen Date: Tue, 20 Feb 2024 11:07:22 -0800 Subject: [PATCH 15/69] Fix lint in mock --- packages/nuka/__mocks__/styleMock.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nuka/__mocks__/styleMock.js b/packages/nuka/__mocks__/styleMock.js index a0995453..f053ebf7 100644 --- a/packages/nuka/__mocks__/styleMock.js +++ b/packages/nuka/__mocks__/styleMock.js @@ -1 +1 @@ -module.exports = {}; \ No newline at end of file +module.exports = {}; From 5eedae8023e49bdb707c908804de0004d1b07f86 Mon Sep 17 00:00:00 2001 From: Melvin Chen Date: Tue, 20 Feb 2024 13:31:38 -0800 Subject: [PATCH 16/69] Fix style mock path, comment out tests --- packages/nuka/jest.config.js | 2 +- packages/nuka/src/Carousel/Carousel.test.tsx | 43 ++++++++++++-------- 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/packages/nuka/jest.config.js b/packages/nuka/jest.config.js index 91d7ccff..a726cb8a 100644 --- a/packages/nuka/jest.config.js +++ b/packages/nuka/jest.config.js @@ -1,6 +1,6 @@ module.exports = { moduleNameMapper: { - '\\.(css|less)$': '/test/jest/__mocks__/styleMock.js', + '\\.(css|less)$': '/__mocks__/styleMock.js', }, setupFilesAfterEnv: ['/jest-setup.ts'], }; diff --git a/packages/nuka/src/Carousel/Carousel.test.tsx b/packages/nuka/src/Carousel/Carousel.test.tsx index 5d2b9b1a..72f05f23 100644 --- a/packages/nuka/src/Carousel/Carousel.test.tsx +++ b/packages/nuka/src/Carousel/Carousel.test.tsx @@ -8,31 +8,38 @@ import { Carousel, SlideHandle } from './Carousel'; import { ExampleSlide } from './ExampleSlide'; describe('Carousel', () => { - it.todo('passes a className and ref for the parent'); - it.todo('passes the same className for each of the children'); - it.todo('is draggable through touch controls'); - it('has a next and previous function that is callable from its parent', () => { + it('renders', () => { render( ); }); - it.todo('can slide'); - it.todo('omits slides whose children are falsy'); + // it.todo('passes a className and ref for the parent'); + // it.todo('passes the same className for each of the children'); + // it.todo('is draggable through touch controls'); + // it('has a next and previous function that is callable from its parent', () => { + // render( + // + // + // + // ); + // }); + // it.todo('can slide'); + // it.todo('omits slides whose children are falsy'); - it.todo('autoplays at the right rate'); + // it.todo('autoplays at the right rate'); - it('returns the right number of page dots', () => { - const ref = createRef(); - render( - -
-
-
- - ); + // it('returns the right number of page dots', () => { + // const ref = createRef(); + // render( + // + //
+ //
+ //
+ // + // ); - // expect(ref.current?.getTotalNumberOfPagesFromScrollDistance()).toBe(6); - }); + // // expect(ref.current?.getTotalNumberOfPagesFromScrollDistance()).toBe(6); + // }); }); From aa4669f173d8abe2e234016158e4f033286c8647 Mon Sep 17 00:00:00 2001 From: Melvin Chen Date: Tue, 20 Feb 2024 13:32:48 -0800 Subject: [PATCH 17/69] Cleanup tests --- packages/nuka/src/Carousel/Carousel.test.tsx | 36 +++++--------------- 1 file changed, 9 insertions(+), 27 deletions(-) diff --git a/packages/nuka/src/Carousel/Carousel.test.tsx b/packages/nuka/src/Carousel/Carousel.test.tsx index 72f05f23..fb43fcba 100644 --- a/packages/nuka/src/Carousel/Carousel.test.tsx +++ b/packages/nuka/src/Carousel/Carousel.test.tsx @@ -2,9 +2,8 @@ * @jest-environment jsdom */ -import { createRef } from 'react'; import { render } from '@testing-library/react'; -import { Carousel, SlideHandle } from './Carousel'; +import { Carousel } from './Carousel'; import { ExampleSlide } from './ExampleSlide'; describe('Carousel', () => { @@ -15,31 +14,14 @@ describe('Carousel', () => { ); }); - // it.todo('passes a className and ref for the parent'); - // it.todo('passes the same className for each of the children'); - // it.todo('is draggable through touch controls'); - // it('has a next and previous function that is callable from its parent', () => { - // render( - // - // - // - // ); - // }); - // it.todo('can slide'); - // it.todo('omits slides whose children are falsy'); + it.todo('passes a className and ref for the parent'); + it.todo('passes the same className for each of the children'); + it.todo('is draggable through touch controls'); + it.todo('has a next and previous function that is callable from its parent'); + it.todo('can slide'); + it.todo('omits slides whose children are falsy'); - // it.todo('autoplays at the right rate'); + it.todo('autoplays at the right rate'); - // it('returns the right number of page dots', () => { - // const ref = createRef(); - // render( - // - //
- //
- //
- // - // ); - - // // expect(ref.current?.getTotalNumberOfPagesFromScrollDistance()).toBe(6); - // }); + it.todo('returns the right number of page dots'); }); From 909e3a4c869db82ea4531b3ba6af89d4fee1a060 Mon Sep 17 00:00:00 2001 From: Melvin Chen Date: Tue, 20 Feb 2024 14:51:27 -0800 Subject: [PATCH 18/69] Add storybook test workflow --- .github/workflows/storybook-tests.yml | 24 + package.json | 5 + packages/nuka/.storybook/main.js | 16 +- packages/nuka/package.json | 4 + .../nuka/src/Carousel/Carousel.stories.tsx | 27 +- packages/nuka/src/Carousel/Carousel.tsx | 7 +- pnpm-lock.yaml | 1842 ++++++++++++++++- 7 files changed, 1897 insertions(+), 28 deletions(-) create mode 100644 .github/workflows/storybook-tests.yml diff --git a/.github/workflows/storybook-tests.yml b/.github/workflows/storybook-tests.yml new file mode 100644 index 00000000..2d8f198f --- /dev/null +++ b/.github/workflows/storybook-tests.yml @@ -0,0 +1,24 @@ +name: 'UI Tests' + +on: push + +jobs: + # Run interaction and accessibility tests + interaction-and-accessibility: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: '16.x' + - name: Install dependencies + run: pnpm install + - name: Install Playwright + run: npx playwright install --with-deps + - name: Build Storybook + run: pnpm build-storybook --quiet + - name: Serve Storybook and run tests + run: | + npx concurrently -k -s first -n "SB,TEST" -c "magenta,blue" \ + "npx http-server storybook-static --port 6006 --silent" \ + "npx wait-on tcp:6006 && pnpm test:storybook" diff --git a/package.json b/package.json index 1a76859f..c8bf9ae1 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "test": "pnpm run -r test", "test:ci": "pnpm run -r test:ci", "test:ci-with-server": "start-server-and-test start:website http://localhost:3000 test:ci", + "test:storybook": "pnpm run --filter nuka-carousel test:storybook", "check": "pnpm run lint", "check:ci": "pnpm run check", "clean": "pnpm run -r clean", @@ -29,6 +30,7 @@ "@babel/preset-react": "^7.10.4", "@babel/preset-typescript": "^7.16.0", "@changesets/cli": "^2.23.1", + "@storybook/test-runner": "^0.16.0", "@svitejs/changesets-changelog-github-compact": "^0.1.1", "@types/jest": "^27.0.2", "@typescript-eslint/eslint-plugin": "^6.7.5", @@ -50,5 +52,8 @@ "shx": "^0.3.4", "start-server-and-test": "^2.0.0", "typescript": "^4.5.2" + }, + "dependencies": { + "playwright": "^1.41.2" } } diff --git a/packages/nuka/.storybook/main.js b/packages/nuka/.storybook/main.js index 2bc68f4f..10551c58 100644 --- a/packages/nuka/.storybook/main.js +++ b/packages/nuka/.storybook/main.js @@ -1,16 +1,18 @@ module.exports = { - stories: [ - '../src/**/*.stories.@(js|jsx|ts|tsx)', - ], + stories: ['../src/**/*.stories.@(js|jsx|ts|tsx)'], - addons: ['@storybook/addon-links', '@storybook/addon-essentials'], + addons: [ + '@storybook/addon-links', + '@storybook/addon-essentials', + '@storybook/addon-interactions', + ], framework: { name: '@storybook/react-webpack5', - options: {} + options: {}, }, docs: { - autodocs: true - } + autodocs: true, + }, }; diff --git a/packages/nuka/package.json b/packages/nuka/package.json index 3408af3c..5539654e 100644 --- a/packages/nuka/package.json +++ b/packages/nuka/package.json @@ -25,6 +25,7 @@ "test:unit:watch": "pnpm run test:unit --watchAll", "test:e2e": "cypress open", "test:e2e:ci": "cypress run", + "test:storybook": "test-storybook --watch", "package": "pnpm pack", "prepublishOnly": "shx cp ../../README.md ./README.md && shx cp ../../LICENSE ./LICENSE && pnpm run build", "postpack": "shx rm ./README.md && shx rm ./LICENSE", @@ -36,9 +37,12 @@ "@babel/core": "^7.17.2", "@storybook/addon-actions": "^7.4.6", "@storybook/addon-essentials": "^7.4.6", + "@storybook/addon-interactions": "^7.6.17", "@storybook/addon-links": "^7.4.6", + "@storybook/jest": "^0.2.3", "@storybook/react": "^7.4.6", "@storybook/react-webpack5": "^7.4.6", + "@storybook/testing-library": "^0.2.2", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.3.0", "@types/d3-ease": "^3.0.0", diff --git a/packages/nuka/src/Carousel/Carousel.stories.tsx b/packages/nuka/src/Carousel/Carousel.stories.tsx index 287c6e92..538a4075 100644 --- a/packages/nuka/src/Carousel/Carousel.stories.tsx +++ b/packages/nuka/src/Carousel/Carousel.stories.tsx @@ -1,4 +1,6 @@ import type { Meta, StoryObj } from '@storybook/react'; +import { within, waitFor, userEvent } from '@storybook/testing-library'; +import { expect } from '@storybook/jest'; import { Carousel, CarouselProps, SlideHandle } from './Carousel'; import { useRef } from 'react'; import { ExampleSlide, FullWidthSlide } from './ExampleSlide'; @@ -37,9 +39,11 @@ export default meta; type Story = StoryObj; +const FIXED_SCROLL_DISTANCE = 200; + export const FixedWidthScroll: Story = { args: { - scrollDistance: 200, + scrollDistance: FIXED_SCROLL_DISTANCE, children: ( <> {[...Array(6)].map((_, index) => ( @@ -48,6 +52,27 @@ export const FixedWidthScroll: Story = { ), }, + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + const backButton = canvas.getByText('previous'); + const forwardButton = canvas.getByText('next'); + + await expect(backButton).toBeInTheDocument(); + await expect(forwardButton).toBeInTheDocument(); + + await userEvent.click(forwardButton); + + await waitFor(async () => { + expect(canvas.getByTestId('overflow').scrollLeft).toEqual( + FIXED_SCROLL_DISTANCE + ); + }); + await userEvent.click(backButton); + + await waitFor(async () => { + expect(canvas.getByTestId('overflow').scrollLeft).toEqual(0); + }); + }, }; export const Slide: Story = { diff --git a/packages/nuka/src/Carousel/Carousel.tsx b/packages/nuka/src/Carousel/Carousel.tsx index 8f365cae..18df23ce 100644 --- a/packages/nuka/src/Carousel/Carousel.tsx +++ b/packages/nuka/src/Carousel/Carousel.tsx @@ -211,8 +211,13 @@ export const Carousel = forwardRef( (event.target as HTMLElement).scrollLeft ); }} + data-testId="overflow" > -
+
{children}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 668165ef..83544cf1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,6 +7,10 @@ settings: importers: .: + dependencies: + playwright: + specifier: ^1.41.2 + version: 1.41.2 devDependencies: '@babel/cli': specifier: ^7.10.4 @@ -35,6 +39,9 @@ importers: '@changesets/cli': specifier: ^2.23.1 version: 2.23.2 + '@storybook/test-runner': + specifier: ^0.16.0 + version: 0.16.0 '@svitejs/changesets-changelog-github-compact': specifier: ^0.1.1 version: 0.1.1 @@ -110,15 +117,24 @@ importers: '@storybook/addon-essentials': specifier: ^7.4.6 version: 7.4.6(@types/react-dom@18.0.6)(@types/react@18.0.15)(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-interactions': + specifier: ^7.6.17 + version: 7.6.17 '@storybook/addon-links': specifier: ^7.4.6 version: 7.4.6(react-dom@18.2.0)(react@18.2.0) + '@storybook/jest': + specifier: ^0.2.3 + version: 0.2.3(jest@28.1.3) '@storybook/react': specifier: ^7.4.6 version: 7.4.6(react-dom@18.2.0)(react@18.2.0)(typescript@4.7.4) '@storybook/react-webpack5': specifier: ^7.4.6 version: 7.4.6(@babel/core@7.18.9)(@types/react-dom@18.0.6)(@types/react@18.0.15)(react-dom@18.2.0)(react@18.2.0)(typescript@4.7.4)(webpack-cli@4.10.0)(webpack-dev-server@4.9.3) + '@storybook/testing-library': + specifier: ^0.2.2 + version: 0.2.2 '@testing-library/jest-dom': specifier: ^5.16.5 version: 5.16.5 @@ -268,6 +284,10 @@ packages: resolution: {integrity: sha512-+u76oB43nOHrF4DDWRLWDCtci7f3QJoEBigemIdIeTi1ODqjx6Tad9NCVnPRwewWlKkVab5PlK8DCtPTyX7S8g==} dev: true + /@adobe/css-tools@4.3.3: + resolution: {integrity: sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==} + dev: true + /@algolia/autocomplete-core@1.7.4: resolution: {integrity: sha512-daoLpQ3ps/VTMRZDEBfU8ixXd+amZcNJ4QSP3IERGyzqnL5Ch8uSRFt/4G8pUvW9c3o6GA4vtVv4I4lmnkdXyg==} dependencies: @@ -430,6 +450,14 @@ packages: '@babel/highlight': 7.22.20 chalk: 2.4.2 + /@babel/code-frame@7.23.5: + resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.23.4 + chalk: 2.4.2 + dev: true + /@babel/compat-data@7.18.8: resolution: {integrity: sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==} engines: {node: '>=6.9.0'} @@ -438,6 +466,11 @@ packages: resolution: {integrity: sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==} engines: {node: '>=6.9.0'} + /@babel/compat-data@7.23.5: + resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/core@7.12.9: resolution: {integrity: sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==} engines: {node: '>=6.9.0'} @@ -528,6 +561,29 @@ packages: transitivePeerDependencies: - supports-color + /@babel/core@7.23.9: + resolution: {integrity: sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.0 + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) + '@babel/helpers': 7.23.9 + '@babel/parser': 7.23.9 + '@babel/template': 7.23.9 + '@babel/traverse': 7.23.9 + '@babel/types': 7.23.9 + convert-source-map: 2.0.0 + debug: 4.3.4(supports-color@8.1.1) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/generator@7.18.9: resolution: {integrity: sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug==} engines: {node: '>=6.9.0'} @@ -551,8 +607,18 @@ packages: dependencies: '@babel/types': 7.23.0 '@jridgewell/gen-mapping': 0.3.2 - '@jridgewell/trace-mapping': 0.3.17 + '@jridgewell/trace-mapping': 0.3.19 + jsesc: 2.5.2 + + /@babel/generator@7.23.6: + resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.9 + '@jridgewell/gen-mapping': 0.3.2 + '@jridgewell/trace-mapping': 0.3.19 jsesc: 2.5.2 + dev: true /@babel/helper-annotate-as-pure@7.18.6: resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} @@ -615,6 +681,17 @@ packages: lru-cache: 5.1.1 semver: 6.3.1 + /@babel/helper-compilation-targets@7.23.6: + resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.23.5 + '@babel/helper-validator-option': 7.23.5 + browserslist: 4.23.0 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true + /@babel/helper-create-class-features-plugin@7.18.9(@babel/core@7.18.9): resolution: {integrity: sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw==} engines: {node: '>=6.9.0'} @@ -956,6 +1033,20 @@ packages: '@babel/helper-split-export-declaration': 7.22.6 '@babel/helper-validator-identifier': 7.22.20 + /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.9): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + dev: true + /@babel/helper-optimise-call-expression@7.18.6: resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} engines: {node: '>=6.9.0'} @@ -1118,6 +1209,11 @@ packages: resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} engines: {node: '>=6.9.0'} + /@babel/helper-string-parser@7.23.4: + resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/helper-validator-identifier@7.18.6: resolution: {integrity: sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==} engines: {node: '>=6.9.0'} @@ -1134,6 +1230,11 @@ packages: resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} engines: {node: '>=6.9.0'} + /@babel/helper-validator-option@7.23.5: + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/helper-wrap-function@7.18.9: resolution: {integrity: sha512-cG2ru3TRAL6a60tfQflpEfs4ldiPwF6YW3zfJiRgmoFVIaC1vGnBBgatfec+ZUziPHkHSaXAuEck3Cdkf3eRpQ==} engines: {node: '>=6.9.0'} @@ -1184,6 +1285,17 @@ packages: transitivePeerDependencies: - supports-color + /@babel/helpers@7.23.9: + resolution: {integrity: sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.23.9 + '@babel/traverse': 7.23.9 + '@babel/types': 7.23.9 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/highlight@7.18.6: resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} engines: {node: '>=6.9.0'} @@ -1200,6 +1312,15 @@ packages: chalk: 2.4.2 js-tokens: 4.0.0 + /@babel/highlight@7.23.4: + resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + /@babel/parser@7.18.9: resolution: {integrity: sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==} engines: {node: '>=6.0.0'} @@ -1221,6 +1342,14 @@ packages: dependencies: '@babel/types': 7.23.0 + /@babel/parser@7.23.9: + resolution: {integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.23.0 + dev: true + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.18.6(@babel/core@7.18.9): resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} engines: {node: '>=6.9.0'} @@ -1973,6 +2102,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.18.9): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: @@ -4173,6 +4312,15 @@ packages: '@babel/parser': 7.23.0 '@babel/types': 7.23.0 + /@babel/template@7.23.9: + resolution: {integrity: sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 + dev: true + /@babel/traverse@7.18.9: resolution: {integrity: sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg==} engines: {node: '>=6.9.0'} @@ -4224,6 +4372,24 @@ packages: transitivePeerDependencies: - supports-color + /@babel/traverse@7.23.9: + resolution: {integrity: sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 + debug: 4.3.4(supports-color@8.1.1) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/types@7.18.9: resolution: {integrity: sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==} engines: {node: '>=6.9.0'} @@ -4248,6 +4414,15 @@ packages: '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 + /@babel/types@7.23.9: + resolution: {integrity: sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.23.4 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + dev: true + /@base2/pretty-print-object@1.0.1: resolution: {integrity: sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==} dev: true @@ -5828,6 +6003,18 @@ packages: slash: 3.0.0 dev: true + /@jest/console@29.7.0: + resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@types/node': 18.7.5 + chalk: 4.1.2 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + dev: true + /@jest/core@28.1.3: resolution: {integrity: sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -5871,6 +6058,56 @@ packages: - ts-node dev: true + /@jest/core@29.7.0: + resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.7.5 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.3.2 + exit: 0.1.2 + graceful-fs: 4.2.10 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@18.7.5) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.5 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + dev: true + + /@jest/create-cache-key-function@29.7.0: + resolution: {integrity: sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + dev: true + /@jest/environment@28.1.3: resolution: {integrity: sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -5881,6 +6118,16 @@ packages: jest-mock: 28.1.3 dev: true + /@jest/environment@29.7.0: + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.7.5 + jest-mock: 29.7.0 + dev: true + /@jest/expect-utils@28.1.3: resolution: {integrity: sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -5888,6 +6135,13 @@ packages: jest-get-type: 28.0.2 dev: true + /@jest/expect-utils@29.7.0: + resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-get-type: 29.6.3 + dev: true + /@jest/expect@28.1.3: resolution: {integrity: sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -5898,6 +6152,16 @@ packages: - supports-color dev: true + /@jest/expect@29.7.0: + resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + expect: 29.7.0 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + dev: true + /@jest/fake-timers@28.1.3: resolution: {integrity: sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -5910,6 +6174,18 @@ packages: jest-util: 28.1.3 dev: true + /@jest/fake-timers@29.7.0: + resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@sinonjs/fake-timers': 10.3.0 + '@types/node': 18.7.5 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-util: 29.7.0 + dev: true + /@jest/globals@28.1.3: resolution: {integrity: sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -5921,6 +6197,18 @@ packages: - supports-color dev: true + /@jest/globals@29.7.0: + resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/types': 29.6.3 + jest-mock: 29.7.0 + transitivePeerDependencies: + - supports-color + dev: true + /@jest/reporters@28.1.3: resolution: {integrity: sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -5959,6 +6247,43 @@ packages: - supports-color dev: true + /@jest/reporters@29.7.0: + resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.19 + '@types/node': 18.7.5 + chalk: 4.1.2 + collect-v8-coverage: 1.0.1 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.10 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-instrument: 6.0.2 + istanbul-lib-report: 3.0.0 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.5 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + jest-worker: 29.7.0 + slash: 3.0.0 + string-length: 4.0.2 + strip-ansi: 6.0.1 + v8-to-istanbul: 9.0.1 + transitivePeerDependencies: + - supports-color + dev: true + /@jest/schemas@28.1.3: resolution: {integrity: sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -5981,6 +6306,15 @@ packages: graceful-fs: 4.2.10 dev: true + /@jest/source-map@29.6.3: + resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jridgewell/trace-mapping': 0.3.19 + callsites: 3.1.0 + graceful-fs: 4.2.10 + dev: true + /@jest/test-result@28.1.3: resolution: {integrity: sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -5991,6 +6325,16 @@ packages: collect-v8-coverage: 1.0.1 dev: true + /@jest/test-result@29.7.0: + resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/console': 29.7.0 + '@jest/types': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.4 + collect-v8-coverage: 1.0.1 + dev: true + /@jest/test-sequencer@28.1.3: resolution: {integrity: sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -6001,6 +6345,16 @@ packages: slash: 3.0.0 dev: true + /@jest/test-sequencer@29.7.0: + resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/test-result': 29.7.0 + graceful-fs: 4.2.10 + jest-haste-map: 29.7.0 + slash: 3.0.0 + dev: true + /@jest/transform@28.1.3: resolution: {integrity: sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -6047,6 +6401,17 @@ packages: - supports-color dev: true + /@jest/types@27.5.1: + resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-reports': 3.0.1 + '@types/node': 18.7.5 + '@types/yargs': 16.0.9 + chalk: 4.1.2 + dev: true + /@jest/types@28.1.3: resolution: {integrity: sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -6889,6 +7254,18 @@ packages: type-detect: 4.0.8 dev: true + /@sinonjs/commons@3.0.1: + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + dependencies: + type-detect: 4.0.8 + dev: true + + /@sinonjs/fake-timers@10.3.0: + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + dependencies: + '@sinonjs/commons': 3.0.1 + dev: true + /@sinonjs/fake-timers@9.1.2: resolution: {integrity: sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==} dependencies: @@ -7069,6 +7446,16 @@ packages: '@storybook/preview-api': 7.4.6 dev: true + /@storybook/addon-interactions@7.6.17: + resolution: {integrity: sha512-6zlX+RDQ1PlA6fp7C+hun8t7h2RXfCGs5dGrhEenp2lqnR/rYuUJRC0tmKpkZBb8kZVcbSChzkB/JYkBjBCzpQ==} + dependencies: + '@storybook/global': 5.0.0 + '@storybook/types': 7.6.17 + jest-mock: 27.5.1 + polished: 4.2.2 + ts-dedent: 2.2.0 + dev: true + /@storybook/addon-links@7.4.6(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-BPygElZKX+CPI9Se6GJNk1dYc5oxuhA+vHigO1tBqhiM6VkHyFP3cvezJNQvpNYhkUnu3cxnZXb3UJnlRbPY3g==} peerDependencies: @@ -7350,13 +7737,24 @@ packages: tiny-invariant: 1.3.1 dev: true - /@storybook/cli@7.4.6: - resolution: {integrity: sha512-rRwaH8pOL+FHz/pJMEkNpMH2xvZvWsrl7obBYw26NQiHmiVSAkfHJicndSN1mwc+p5w+9iXthrgzbLtSAOSvkA==} - hasBin: true + /@storybook/channels@7.6.17: + resolution: {integrity: sha512-GFG40pzaSxk1hUr/J/TMqW5AFDDPUSu+HkeE/oqSWJbOodBOLJzHN6CReJS6y1DjYSZLNFt1jftPWZZInG/XUA==} dependencies: - '@babel/core': 7.23.2 - '@babel/preset-env': 7.23.2(@babel/core@7.23.2) - '@babel/types': 7.23.0 + '@storybook/client-logger': 7.6.17 + '@storybook/core-events': 7.6.17 + '@storybook/global': 5.0.0 + qs: 6.11.0 + telejson: 7.2.0 + tiny-invariant: 1.3.1 + dev: true + + /@storybook/cli@7.4.6: + resolution: {integrity: sha512-rRwaH8pOL+FHz/pJMEkNpMH2xvZvWsrl7obBYw26NQiHmiVSAkfHJicndSN1mwc+p5w+9iXthrgzbLtSAOSvkA==} + hasBin: true + dependencies: + '@babel/core': 7.23.2 + '@babel/preset-env': 7.23.2(@babel/core@7.23.2) + '@babel/types': 7.23.0 '@ndelangen/get-tarball': 3.0.9 '@storybook/codemod': 7.4.6 '@storybook/core-common': 7.4.6 @@ -7415,6 +7813,12 @@ packages: '@storybook/global': 5.0.0 dev: true + /@storybook/client-logger@7.6.17: + resolution: {integrity: sha512-6WBYqixAXNAXlSaBWwgljWpAu10tPRBJrcFvx2gPUne58EeMM20Gi/iHYBz2kMCY+JLAgeIH7ZxInqwO8vDwiQ==} + dependencies: + '@storybook/global': 5.0.0 + dev: true + /@storybook/codemod@7.4.6: resolution: {integrity: sha512-lxmwEpwksCaAq96APN2YlooSDfKjJ1vKzN5Ni2EqQzf2TEXl7XQjLacHd7OOaII1kfsy+D5gNG4N5wBo7Ub30g==} dependencies: @@ -7503,6 +7907,12 @@ packages: ts-dedent: 2.2.0 dev: true + /@storybook/core-events@7.6.17: + resolution: {integrity: sha512-AriWMCm/k1cxlv10f+jZ1wavThTRpLaN3kY019kHWbYT9XgaSuLU67G7GPr3cGnJ6HuA6uhbzu8qtqVCd6OfXA==} + dependencies: + ts-dedent: 2.2.0 + dev: true + /@storybook/core-server@7.4.6: resolution: {integrity: sha512-jqmRTGCJ1W0WReImivkisPVaLFT5sjtLnFoAk0feHp6QS5j7EYOPN7CYzliyQmARWTLUEXOVaFf3VD6nJZQhJQ==} dependencies: @@ -7616,10 +8026,30 @@ packages: - supports-color dev: true + /@storybook/expect@28.1.3-5: + resolution: {integrity: sha512-lS1oJnY1qTAxnH87C765NdfvGhksA6hBcbUVI5CHiSbNsEtr456wtg/z+dT9XlPriq1D5t2SgfNL9dBAoIGyIA==} + dependencies: + '@types/jest': 28.1.3 + dev: true + /@storybook/global@5.0.0: resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} dev: true + /@storybook/jest@0.2.3(jest@28.1.3): + resolution: {integrity: sha512-ov5izrmbAFObzKeh9AOC5MlmFxAcf0o5i6YFGae9sDx6DGh6alXsRM+chIbucVkUwVHVlSzdfbLDEFGY/ShaYw==} + dependencies: + '@storybook/expect': 28.1.3-5 + '@testing-library/jest-dom': 6.4.2(@types/jest@28.1.3)(jest@28.1.3) + '@types/jest': 28.1.3 + jest-mock: 27.5.1 + transitivePeerDependencies: + - '@jest/globals' + - '@types/bun' + - jest + - vitest + dev: true + /@storybook/manager-api@7.4.6(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-inrm3DIbCp8wjXSN/wK6e6i2ysQ/IEmtC7IN0OJ7vdrp+USCooPT448SQTUmVctUGCFmOU3fxXByq8g77oIi7w==} peerDependencies: @@ -7878,6 +8308,58 @@ packages: - supports-color dev: true + /@storybook/test-runner@0.16.0: + resolution: {integrity: sha512-LDmNbKFoEDW/VS9o6KR8e1r5MnbCc5ZojUfi5yqLdq80gFD7BvilgKgV0lUh/xWHryzoy+Ids5LYgrPJZmU2dQ==} + engines: {node: ^16.10.0 || ^18.0.0 || >=20.0.0} + hasBin: true + dependencies: + '@babel/core': 7.23.2 + '@babel/generator': 7.23.0 + '@babel/template': 7.22.15 + '@babel/types': 7.23.0 + '@jest/types': 29.6.3 + '@storybook/core-common': 7.4.6 + '@storybook/csf': 0.1.1 + '@storybook/csf-tools': 7.4.6 + '@storybook/preview-api': 7.4.6 + '@swc/core': 1.3.92 + '@swc/jest': 0.2.36(@swc/core@1.3.92) + can-bind-to-host: 1.1.2 + commander: 9.5.0 + expect-playwright: 0.8.0 + glob: 10.3.10 + jest: 29.7.0 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-junit: 16.0.0 + jest-playwright-preset: 4.0.0(jest-circus@29.7.0)(jest-environment-node@29.7.0)(jest-runner@29.7.0)(jest@29.7.0) + jest-runner: 29.7.0 + jest-serializer-html: 7.1.0 + jest-watch-typeahead: 2.2.2(jest@29.7.0) + node-fetch: 2.6.7 + playwright: 1.41.2 + read-pkg-up: 7.0.1 + tempy: 1.0.1 + ts-dedent: 2.2.0 + transitivePeerDependencies: + - '@swc/helpers' + - '@types/node' + - babel-plugin-macros + - debug + - encoding + - node-notifier + - supports-color + - ts-node + dev: true + + /@storybook/testing-library@0.2.2: + resolution: {integrity: sha512-L8sXFJUHmrlyU2BsWWZGuAjv39Jl1uAqUHdxmN42JY15M4+XCMjGlArdCCjDe1wpTSW6USYISA9axjZojgtvnw==} + dependencies: + '@testing-library/dom': 9.3.4 + '@testing-library/user-event': 14.5.2(@testing-library/dom@9.3.4) + ts-dedent: 2.2.0 + dev: true + /@storybook/theming@7.4.6(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-HW77iJ9ptCMqhoBOYFjRQw7VBap+38fkJGHP5KylEJCyYCgIAm2dEcQmtWpMVYFssSGcb6djfbtAMhYU4TL4Iw==} peerDependencies: @@ -7901,6 +8383,15 @@ packages: file-system-cache: 2.3.0 dev: true + /@storybook/types@7.6.17: + resolution: {integrity: sha512-GRY0xEJQ0PrL7DY2qCNUdIfUOE0Gsue6N+GBJw9ku1IUDFLJRDOF+4Dx2BvYcVCPI5XPqdWKlEyZdMdKjiQN7Q==} + dependencies: + '@storybook/channels': 7.6.17 + '@types/babel__core': 7.1.19 + '@types/express': 4.17.13 + file-system-cache: 2.3.0 + dev: true + /@svgr/babel-plugin-add-jsx-attribute@6.5.1(@babel/core@7.23.2): resolution: {integrity: sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==} engines: {node: '>=10'} @@ -8183,6 +8674,22 @@ packages: resolution: {integrity: sha512-9F4ys4C74eSTEUNndnER3VJ15oru2NumfQxS8geE+f3eB5xvfxpWyqE5XlVnxb/R14uoXi6SLbBwwiDSkv+XEw==} dev: true + /@swc/counter@0.1.3: + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + dev: true + + /@swc/jest@0.2.36(@swc/core@1.3.92): + resolution: {integrity: sha512-8X80dp81ugxs4a11z1ka43FPhP+/e+mJNXJSxiNYk8gIX/jPBtY4gQTrKu/KIoco8bzKuPI5lUxjfLiGsfvnlw==} + engines: {npm: '>= 7.0.0'} + peerDependencies: + '@swc/core': '*' + dependencies: + '@jest/create-cache-key-function': 29.7.0 + '@swc/core': 1.3.92 + '@swc/counter': 0.1.3 + jsonc-parser: 3.2.1 + dev: true + /@swc/types@0.1.5: resolution: {integrity: sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==} dev: true @@ -8208,6 +8715,20 @@ packages: pretty-format: 27.5.1 dev: true + /@testing-library/dom@9.3.4: + resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} + engines: {node: '>=14'} + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/runtime': 7.21.0 + '@types/aria-query': 5.0.4 + aria-query: 5.1.3 + chalk: 4.1.2 + dom-accessibility-api: 0.5.14 + lz-string: 1.5.0 + pretty-format: 27.5.1 + dev: true + /@testing-library/jest-dom@5.16.5: resolution: {integrity: sha512-N5ixQ2qKpi5OLYfwQmUb/5mSV9LneAcaUfp32pn4yCnpb8r/Yz0pXFPck21dIicKmi+ta5WRAknkZCfA8refMA==} engines: {node: '>=8', npm: '>=6', yarn: '>=1'} @@ -8223,6 +8744,39 @@ packages: redent: 3.0.0 dev: true + /@testing-library/jest-dom@6.4.2(@types/jest@28.1.3)(jest@28.1.3): + resolution: {integrity: sha512-CzqH0AFymEMG48CpzXFriYYkOjk6ZGPCLMhW9e9jg3KMCn5OfJecF8GtGW7yGfR/IgCe3SX8BSwjdzI6BBbZLw==} + engines: {node: '>=14', npm: '>=6', yarn: '>=1'} + peerDependencies: + '@jest/globals': '>= 28' + '@types/bun': latest + '@types/jest': '>= 28' + jest: '>= 28' + vitest: '>= 0.32' + peerDependenciesMeta: + '@jest/globals': + optional: true + '@types/bun': + optional: true + '@types/jest': + optional: true + jest: + optional: true + vitest: + optional: true + dependencies: + '@adobe/css-tools': 4.3.3 + '@babel/runtime': 7.21.0 + '@types/jest': 28.1.3 + aria-query: 5.0.0 + chalk: 3.0.0 + css.escape: 1.5.1 + dom-accessibility-api: 0.6.3 + jest: 28.1.3 + lodash: 4.17.21 + redent: 3.0.0 + dev: true + /@testing-library/react@13.3.0(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-DB79aA426+deFgGSjnf5grczDPiL4taK3hFaa+M5q7q20Kcve9eQottOG5kZ74KEr55v0tU2CQormSSDK87zYQ==} engines: {node: '>=12'} @@ -8237,6 +8791,15 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: true + /@testing-library/user-event@14.5.2(@testing-library/dom@9.3.4): + resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==} + engines: {node: '>=12', npm: '>=6'} + peerDependencies: + '@testing-library/dom': '>=7.21.4' + dependencies: + '@testing-library/dom': 9.3.4 + dev: true + /@tootallnate/once@2.0.0: resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} @@ -8267,6 +8830,10 @@ packages: resolution: {integrity: sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==} dev: true + /@types/aria-query@5.0.4: + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + dev: true + /@types/babel__core@7.1.19: resolution: {integrity: sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==} dependencies: @@ -8446,6 +9013,13 @@ packages: pretty-format: 27.5.1 dev: true + /@types/jest@28.1.3: + resolution: {integrity: sha512-Tsbjk8Y2hkBaY/gJsataeb4q9Mubw9EOz7+4RjPkzD5KjTvHHs7cpws22InaoXxAVAhF5HfFbzJjo6oKWqSZLw==} + dependencies: + jest-matcher-utils: 28.1.3 + pretty-format: 28.1.3 + dev: true + /@types/jsdom@16.2.15: resolution: {integrity: sha512-nwF87yjBKuX/roqGYerZZM0Nv1pZDMAT5YhOHYeM/72Fic+VEqJh4nyoqoapzJnW3pUlfxPY5FhgsJtM+dRnQQ==} dependencies: @@ -8650,6 +9224,12 @@ packages: /@types/unist@2.0.6: resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} + /@types/wait-on@5.3.4: + resolution: {integrity: sha512-EBsPjFMrFlMbbUFf9D1Fp+PAB2TwmUn7a3YtHyD9RLuTIk1jDd8SxXVAoez2Ciy+8Jsceo2MYEYZzJ/DvorOKw==} + dependencies: + '@types/node': 18.7.5 + dev: true + /@types/webpack-env@1.17.0: resolution: {integrity: sha512-eHSaNYEyxRA5IAG0Ym/yCyf86niZUIF/TpWKofQI/CVfh5HsMEUyfE2kwFxha4ow0s5g0LfISQxpDKjbRDrizw==} dev: true @@ -8662,6 +9242,12 @@ packages: /@types/yargs-parser@21.0.0: resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} + /@types/yargs@16.0.9: + resolution: {integrity: sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==} + dependencies: + '@types/yargs-parser': 21.0.0 + dev: true + /@types/yargs@17.0.10: resolution: {integrity: sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA==} dependencies: @@ -9191,6 +9777,13 @@ packages: type-fest: 0.21.3 dev: true + /ansi-escapes@6.2.0: + resolution: {integrity: sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==} + engines: {node: '>=14.16'} + dependencies: + type-fest: 3.13.1 + dev: true + /ansi-html-community@0.0.8: resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} engines: {'0': node >= 0.8.0} @@ -9240,10 +9833,21 @@ packages: resolution: {integrity: sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g==} dev: true + /append-transform@2.0.0: + resolution: {integrity: sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==} + engines: {node: '>=8'} + dependencies: + default-require-extensions: 3.0.1 + dev: true + /arch@2.2.0: resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} dev: true + /archy@1.0.0: + resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} + dev: true + /arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} @@ -9270,6 +9874,20 @@ packages: engines: {node: '>=6.0'} dev: true + /aria-query@5.1.3: + resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} + dependencies: + deep-equal: 2.2.3 + dev: true + + /array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + is-array-buffer: 3.0.4 + dev: true + /array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} @@ -9407,6 +10025,13 @@ packages: engines: {node: '>= 0.4'} dev: true + /available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + dependencies: + possible-typed-array-names: 1.0.0 + dev: true + /aws-sign2@0.7.0: resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} dev: true @@ -9486,6 +10111,24 @@ packages: - supports-color dev: true + /babel-jest@29.7.0(@babel/core@7.23.2): + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + dependencies: + '@babel/core': 7.23.2 + '@jest/transform': 29.7.0 + '@types/babel__core': 7.1.19 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.6.3(@babel/core@7.23.2) + chalk: 4.1.2 + graceful-fs: 4.2.10 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + /babel-loader@8.1.0(@babel/core@7.18.9)(webpack@5.61.0): resolution: {integrity: sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==} engines: {node: '>= 6.9'} @@ -9578,6 +10221,16 @@ packages: '@types/babel__traverse': 7.17.1 dev: true + /babel-plugin-jest-hoist@29.6.3: + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/template': 7.22.15 + '@babel/types': 7.23.0 + '@types/babel__core': 7.1.19 + '@types/babel__traverse': 7.17.1 + dev: true + /babel-plugin-named-exports-order@0.0.2: resolution: {integrity: sha512-OgOYHOLoRK+/mvXU9imKHlG6GkPLYrUCvFXG/CM93R/aNNO8pOOF4aS+S8CCHMDQoNSeiOYEZb/G6RwL95Jktw==} dev: true @@ -9738,6 +10391,17 @@ packages: babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.2) dev: true + /babel-preset-jest@29.6.3(@babel/core@7.23.2): + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + babel-plugin-jest-hoist: 29.6.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.2) + dev: true + /bail@1.0.5: resolution: {integrity: sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==} dev: false @@ -9787,6 +10451,7 @@ packages: /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} + requiresBuild: true /bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} @@ -9938,6 +10603,17 @@ packages: node-releases: 2.0.13 update-browserslist-db: 1.0.13(browserslist@4.22.1) + /browserslist@4.23.0: + resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001588 + electron-to-chromium: 1.4.677 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.23.0) + dev: true + /bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} dependencies: @@ -10031,12 +10707,33 @@ packages: engines: {node: '>=6'} dev: true + /caching-transform@4.0.0: + resolution: {integrity: sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==} + engines: {node: '>=8'} + dependencies: + hasha: 5.2.2 + make-dir: 3.1.0 + package-hash: 4.0.0 + write-file-atomic: 3.0.3 + dev: true + /call-bind@1.0.2: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: function-bind: 1.1.1 get-intrinsic: 1.1.2 + /call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.1 + dev: true + /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -10069,6 +10766,11 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} + /can-bind-to-host@1.1.2: + resolution: {integrity: sha512-CqsgmaqiyFRNtP17Ihqa/uHbZxRirntNVNl/kJz31DLKuNRfzvzionkLoUSkElQ6Cz+cpXKA3mhHq4tjbieujA==} + hasBin: true + dev: true + /caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} dependencies: @@ -10088,6 +10790,10 @@ packages: /caniuse-lite@1.0.30001547: resolution: {integrity: sha512-W7CrtIModMAxobGhz8iXmDfuJiiKg1WADMO/9x7/CLNin5cpSbuBjooyoIUVB5eyCc36QuTVlkVa1iB2S5+/eA==} + /caniuse-lite@1.0.30001588: + resolution: {integrity: sha512-+hVY9jE44uKLkH0SrUTqxjxqNTOWHsbnQDIKjwkZ3lNTzUUVdBLBGXtj/q5Mp5u98r3droaZAewQuEDzjQdZlQ==} + dev: true + /case-sensitive-paths-webpack-plugin@2.4.0: resolution: {integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==} engines: {node: '>=4'} @@ -10124,11 +10830,21 @@ packages: ansi-styles: 4.3.0 supports-color: 7.2.0 + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true + /char-regex@1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} dev: true + /char-regex@2.0.1: + resolution: {integrity: sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==} + engines: {node: '>=12.20'} + dev: true + /character-entities-legacy@1.1.4: resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} dev: false @@ -10368,6 +11084,10 @@ packages: /commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + /commander@3.0.2: + resolution: {integrity: sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==} + dev: true + /commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} @@ -10390,6 +11110,11 @@ packages: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} + /commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + dev: true + /common-path-prefix@3.0.0: resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} dev: true @@ -10605,6 +11330,25 @@ packages: path-type: 4.0.0 dev: false + /create-jest@29.7.0: + resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.10 + jest-config: 29.7.0(@types/node@18.7.5) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + dev: true + /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} @@ -10875,6 +11619,14 @@ packages: stream-transform: 2.1.3 dev: true + /cwd@0.10.0: + resolution: {integrity: sha512-YGZxdTTL9lmLkCUTpg4j0zQ7IhRB5ZmqNBbGCl3Tg6MP/d5/6sY7L5mmTjzbc6JKgVZYiqTQTNhPFsbXNGlRaA==} + engines: {node: '>=0.8'} + dependencies: + find-pkg: 0.1.2 + fs-exists-sync: 0.1.0 + dev: true + /cypress@10.3.0: resolution: {integrity: sha512-txkQWKzvBVnWdCuKs5Xc08gjpO89W2Dom2wpZgT9zWZT5jXxqPIxqP/NC1YArtkpmp3fN5HW8aDjYBizHLUFvg==} engines: {node: '>=12.0.0'} @@ -11020,6 +11772,39 @@ packages: resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} dev: true + /dedent@1.5.1: + resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + dev: true + + /deep-equal@2.2.3: + resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + es-get-iterator: 1.1.3 + get-intrinsic: 1.2.4 + is-arguments: 1.1.1 + is-array-buffer: 3.0.4 + is-date-object: 1.0.5 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + isarray: 2.0.5 + object-is: 1.1.5 + object-keys: 1.1.1 + object.assign: 4.1.4 + regexp.prototype.flags: 1.5.2 + side-channel: 1.0.4 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.1 + which-typed-array: 1.1.14 + dev: true + /deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} @@ -11046,6 +11831,13 @@ packages: dependencies: execa: 5.1.1 + /default-require-extensions@3.0.1: + resolution: {integrity: sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==} + engines: {node: '>=8'} + dependencies: + strip-bom: 4.0.0 + dev: true + /defaults@1.0.3: resolution: {integrity: sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==} dependencies: @@ -11056,6 +11848,15 @@ packages: resolution: {integrity: sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==} dev: false + /define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + dev: true + /define-lazy-prop@2.0.0: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} @@ -11067,6 +11868,15 @@ packages: has-property-descriptors: 1.0.0 object-keys: 1.1.1 + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.0 + object-keys: 1.1.1 + dev: true + /defu@6.1.2: resolution: {integrity: sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ==} dev: true @@ -11180,6 +11990,12 @@ packages: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} + /diffable-html@4.1.0: + resolution: {integrity: sha512-++kyNek+YBLH8cLXS+iTj/Hiy2s5qkRJEJ8kgu/WHbFrVY2vz9xPFUT+fii2zGF0m1CaojDlQJjkfrCt7YWM1g==} + dependencies: + htmlparser2: 3.10.1 + dev: true + /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -11216,11 +12032,22 @@ packages: resolution: {integrity: sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg==} dev: true + /dom-accessibility-api@0.6.3: + resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} + dev: true + /dom-converter@0.2.0: resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} dependencies: utila: 0.4.0 + /dom-serializer@0.2.2: + resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==} + dependencies: + domelementtype: 2.3.0 + entities: 2.2.0 + dev: true + /dom-serializer@1.4.1: resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} dependencies: @@ -11236,6 +12063,10 @@ packages: entities: 4.4.0 dev: false + /domelementtype@1.3.1: + resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==} + dev: true + /domelementtype@2.3.0: resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} @@ -11246,6 +12077,12 @@ packages: webidl-conversions: 7.0.0 dev: true + /domhandler@2.4.2: + resolution: {integrity: sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==} + dependencies: + domelementtype: 1.3.1 + dev: true + /domhandler@4.3.1: resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} engines: {node: '>= 4'} @@ -11259,6 +12096,13 @@ packages: domelementtype: 2.3.0 dev: false + /domutils@1.7.0: + resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==} + dependencies: + dom-serializer: 0.2.2 + domelementtype: 1.3.1 + dev: true + /domutils@2.8.0: resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} dependencies: @@ -11354,11 +12198,20 @@ packages: /electron-to-chromium@1.4.551: resolution: {integrity: sha512-/Ng/W/kFv7wdEHYzxdK7Cv0BHEGSkSB3M0Ssl8Ndr1eMiYeas/+Mv4cNaDqamqWx6nd2uQZfPz6g25z25M/sdw==} + /electron-to-chromium@1.4.677: + resolution: {integrity: sha512-erDa3CaDzwJOpyvfKhOiJjBVNnMM0qxHq47RheVVwsSQrgBA9ZSGV9kdaOfZDPXcHzhG7lBxhj6A7KvfLJBd6Q==} + dev: true + /emittery@0.10.2: resolution: {integrity: sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==} engines: {node: '>=12'} dev: true + /emittery@0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} + dev: true + /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -11404,6 +12257,10 @@ packages: ansi-colors: 4.1.3 dev: true + /entities@1.1.2: + resolution: {integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==} + dev: true + /entities@2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} @@ -11458,6 +12315,32 @@ packages: unbox-primitive: 1.0.2 dev: true + /es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.4 + dev: true + + /es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + dev: true + + /es-get-iterator@1.1.3: + resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + is-arguments: 1.1.1 + is-map: 2.0.2 + is-set: 2.0.2 + is-string: 1.0.7 + isarray: 2.0.5 + stop-iteration-iterator: 1.0.0 + dev: true + /es-module-lexer@0.9.3: resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==} @@ -11476,6 +12359,10 @@ packages: is-symbol: 1.0.4 dev: true + /es6-error@4.1.1: + resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + dev: true + /esbuild-plugin-alias@0.2.1: resolution: {integrity: sha512-jyfL/pwPqaFXyKnj8lP8iLk6Z0m099uXR45aSN8Av1XD4vhvQutxxPzgA2bTcAwQpa1zCXDcWOlhFgyP3GKqhQ==} dev: true @@ -11885,6 +12772,17 @@ packages: engines: {node: '>= 0.8.0'} dev: true + /expand-tilde@1.2.2: + resolution: {integrity: sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q==} + engines: {node: '>=0.10.0'} + dependencies: + os-homedir: 1.0.2 + dev: true + + /expect-playwright@0.8.0: + resolution: {integrity: sha512-+kn8561vHAY+dt+0gMqqj1oY+g5xWrsuGMk4QGxotT2WS545nVqqjs37z6hrYfIuucwqthzwJfCJUEYqixyljg==} + dev: true + /expect@28.1.3: resolution: {integrity: sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -11896,6 +12794,17 @@ packages: jest-util: 28.1.3 dev: true + /expect@29.7.0: + resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/expect-utils': 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + dev: true + /express@4.18.1: resolution: {integrity: sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==} engines: {node: '>= 0.10.0'} @@ -12130,6 +13039,7 @@ packages: /fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} + requiresBuild: true dependencies: to-regex-range: 5.0.1 @@ -12172,6 +13082,32 @@ packages: pkg-dir: 7.0.0 dev: true + /find-file-up@0.1.3: + resolution: {integrity: sha512-mBxmNbVyjg1LQIIpgO8hN+ybWBgDQK8qjht+EbrTCGmmPV/sc7RF1i9stPTD6bpvXZywBdrwRYxhSdJv867L6A==} + engines: {node: '>=0.10.0'} + dependencies: + fs-exists-sync: 0.1.0 + resolve-dir: 0.1.1 + dev: true + + /find-pkg@0.1.2: + resolution: {integrity: sha512-0rnQWcFwZr7eO0513HahrWafsc3CTFioEB7DRiEYCUM/70QXSY8f3mCST17HXLcPvEhzH/Ty/Bxd72ZZsr/yvw==} + engines: {node: '>=0.10.0'} + dependencies: + find-file-up: 0.1.3 + dev: true + + /find-process@1.4.7: + resolution: {integrity: sha512-/U4CYp1214Xrp3u3Fqr9yNynUrr5Le4y0SsJh2lMDDSbpwYSz3M2SMWQC+wqcx79cN8PQtHQIL8KnuY9M66fdg==} + hasBin: true + dependencies: + chalk: 4.1.2 + commander: 5.1.0 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: true + /find-up@3.0.0: resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} engines: {node: '>=6'} @@ -12359,10 +13295,19 @@ packages: resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==} dev: true + /fromentries@1.3.2: + resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==} + dev: true + /fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} dev: true + /fs-exists-sync@0.1.0: + resolution: {integrity: sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==} + engines: {node: '>=0.10.0'} + dev: true + /fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} @@ -12437,6 +13382,10 @@ packages: /function-bind@1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + dev: true + /function.prototype.name@1.1.5: resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} engines: {node: '>= 0.4'} @@ -12478,6 +13427,17 @@ packages: has-proto: 1.0.1 has-symbols: 1.0.3 + /get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.1 + has-symbols: 1.0.3 + hasown: 2.0.1 + dev: true + /get-nonce@1.0.1: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} @@ -12611,6 +13571,14 @@ packages: dependencies: ini: 2.0.0 + /global-modules@0.2.3: + resolution: {integrity: sha512-JeXuCbvYzYXcwE6acL9V2bAOeSIGl4dD+iwLY9iUx2VBJJ80R18HCn+JCwHM9Oegdfya3lEkGCdaRkSyc10hDA==} + engines: {node: '>=0.10.0'} + dependencies: + global-prefix: 0.1.5 + is-windows: 0.2.0 + dev: true + /global-modules@2.0.0: resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} engines: {node: '>=6'} @@ -12618,6 +13586,16 @@ packages: global-prefix: 3.0.0 dev: false + /global-prefix@0.1.5: + resolution: {integrity: sha512-gOPiyxcD9dJGCEArAhF4Hd0BAqvAe/JzERP7tYumE4yIkmIedPUVXcJFWbV3/p/ovIIvKjkrTk+f1UVkq7vvbw==} + engines: {node: '>=0.10.0'} + dependencies: + homedir-polyfill: 1.0.3 + ini: 1.3.8 + is-windows: 0.2.0 + which: 1.3.1 + dev: true + /global-prefix@3.0.0: resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} engines: {node: '>=6'} @@ -12762,6 +13740,12 @@ packages: dependencies: get-intrinsic: 1.2.1 + /has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + dependencies: + es-define-property: 1.0.0 + dev: true + /has-proto@1.0.1: resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} engines: {node: '>= 0.4'} @@ -12777,6 +13761,13 @@ packages: has-symbols: 1.0.3 dev: true + /has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + /has-yarn@2.1.0: resolution: {integrity: sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==} engines: {node: '>=8'} @@ -12788,6 +13779,21 @@ packages: dependencies: function-bind: 1.1.1 + /hasha@5.2.2: + resolution: {integrity: sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==} + engines: {node: '>=8'} + dependencies: + is-stream: 2.0.1 + type-fest: 0.8.1 + dev: true + + /hasown@2.0.1: + resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + dev: true + /hast-to-hyperscript@9.0.1: resolution: {integrity: sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==} dependencies: @@ -12871,6 +13877,13 @@ packages: react-is: 16.13.1 dev: false + /homedir-polyfill@1.0.3: + resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} + engines: {node: '>=0.10.0'} + dependencies: + parse-passwd: 1.0.0 + dev: true + /hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} dev: true @@ -12946,6 +13959,17 @@ packages: webpack: 5.77.0 dev: false + /htmlparser2@3.10.1: + resolution: {integrity: sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==} + dependencies: + domelementtype: 1.3.1 + domhandler: 2.4.2 + domutils: 1.7.0 + entities: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.0 + dev: true + /htmlparser2@6.1.0: resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} dependencies: @@ -13195,6 +14219,15 @@ packages: side-channel: 1.0.4 dev: true + /internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + hasown: 2.0.1 + side-channel: 1.0.4 + dev: true + /interpret@1.4.0: resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} engines: {node: '>= 0.10'} @@ -13245,6 +14278,14 @@ packages: has-tostringtag: 1.0.0 dev: true + /is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + dev: true + /is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} @@ -13257,6 +14298,7 @@ packages: /is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} + requiresBuild: true dependencies: binary-extensions: 2.2.0 @@ -13372,6 +14414,10 @@ packages: engines: {node: '>=8'} dev: true + /is-map@2.0.2: + resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} + dev: true + /is-nan@1.3.2: resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} engines: {node: '>= 0.4'} @@ -13400,6 +14446,7 @@ packages: /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + requiresBuild: true /is-obj@1.0.1: resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} @@ -13466,6 +14513,10 @@ packages: engines: {node: '>=6'} dev: false + /is-set@2.0.2: + resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} + dev: true + /is-shared-array-buffer@1.0.2: resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} dependencies: @@ -13512,12 +14563,23 @@ packages: engines: {node: '>=10'} dev: true + /is-weakmap@2.0.1: + resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} + dev: true + /is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: call-bind: 1.0.2 dev: true + /is-weakset@2.0.2: + resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + dev: true + /is-whitespace-character@1.0.4: resolution: {integrity: sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==} dev: false @@ -13527,6 +14589,11 @@ packages: engines: {node: '>=0.10.0'} dev: true + /is-windows@0.2.0: + resolution: {integrity: sha512-n67eJYmXbniZB7RF4I/FTjK1s6RPOCTxhYrVYLRaCt3lF0mpWZPKr3T2LSZAqyjQsxR2qMmGYXXzK0YWwcPM1Q==} + engines: {node: '>=0.10.0'} + dev: true + /is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} @@ -13553,6 +14620,10 @@ packages: /isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + /isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: true + /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -13569,6 +14640,25 @@ packages: engines: {node: '>=8'} dev: true + /istanbul-lib-hook@3.0.0: + resolution: {integrity: sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==} + engines: {node: '>=8'} + dependencies: + append-transform: 2.0.0 + dev: true + + /istanbul-lib-instrument@4.0.3: + resolution: {integrity: sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==} + engines: {node: '>=8'} + dependencies: + '@babel/core': 7.23.2 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + /istanbul-lib-instrument@5.2.0: resolution: {integrity: sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==} engines: {node: '>=8'} @@ -13582,6 +14672,31 @@ packages: - supports-color dev: true + /istanbul-lib-instrument@6.0.2: + resolution: {integrity: sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==} + engines: {node: '>=10'} + dependencies: + '@babel/core': 7.23.9 + '@babel/parser': 7.23.9 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.0 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-lib-processinfo@2.0.3: + resolution: {integrity: sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==} + engines: {node: '>=8'} + dependencies: + archy: 1.0.0 + cross-spawn: 7.0.3 + istanbul-lib-coverage: 3.2.0 + p-map: 3.0.0 + rimraf: 3.0.2 + uuid: 8.3.2 + dev: true + /istanbul-lib-report@3.0.0: resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} engines: {node: '>=8'} @@ -13648,6 +14763,15 @@ packages: p-limit: 3.1.0 dev: true + /jest-changed-files@29.7.0: + resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + execa: 5.1.1 + jest-util: 29.7.0 + p-limit: 3.1.0 + dev: true + /jest-circus@28.1.3: resolution: {integrity: sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -13675,6 +14799,35 @@ packages: - supports-color dev: true + /jest-circus@29.7.0: + resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.7.5 + chalk: 4.1.2 + co: 4.6.0 + dedent: 1.5.1 + is-generator-fn: 2.1.0 + jest-each: 29.7.0 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + p-limit: 3.1.0 + pretty-format: 29.7.0 + pure-rand: 6.0.4 + slash: 3.0.0 + stack-utils: 2.0.5 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + dev: true + /jest-cli@28.1.3: resolution: {integrity: sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -13703,6 +14856,34 @@ packages: - ts-node dev: true + /jest-cli@29.7.0: + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0 + exit: 0.1.2 + import-local: 3.1.0 + jest-config: 29.7.0(@types/node@18.7.5) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.5.1 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + dev: true + /jest-config@28.1.3(@types/node@18.7.5): resolution: {integrity: sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -13742,6 +14923,46 @@ packages: - supports-color dev: true + /jest-config@29.7.0(@types/node@18.7.5): + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.23.2 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.7.5 + babel-jest: 29.7.0(@babel/core@7.23.2) + chalk: 4.1.2 + ci-info: 3.3.2 + deepmerge: 4.2.2 + glob: 7.2.3 + graceful-fs: 4.2.10 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + dev: true + /jest-diff@27.5.1: resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -13779,6 +15000,13 @@ packages: detect-newline: 3.1.0 dev: true + /jest-docblock@29.7.0: + resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + detect-newline: 3.1.0 + dev: true + /jest-each@28.1.3: resolution: {integrity: sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -13790,6 +15018,17 @@ packages: pretty-format: 28.1.3 dev: true + /jest-each@29.7.0: + resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + jest-get-type: 29.6.3 + jest-util: 29.7.0 + pretty-format: 29.7.0 + dev: true + /jest-environment-jsdom@28.1.3: resolution: {integrity: sha512-HnlGUmZRdxfCByd3GM2F100DgQOajUBzEitjGqIREcb45kGjZvRrKUdlaF6escXBdcXNl0OBh+1ZrfeZT3GnAg==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -13821,6 +15060,18 @@ packages: jest-util: 28.1.3 dev: true + /jest-environment-node@29.7.0: + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.7.5 + jest-mock: 29.7.0 + jest-util: 29.7.0 + dev: true + /jest-get-type@27.5.1: resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -13874,6 +15125,16 @@ packages: fsevents: 2.3.2 dev: true + /jest-junit@16.0.0: + resolution: {integrity: sha512-A94mmw6NfJab4Fg/BlvVOUXzXgF0XIH6EmTgJ5NDPp4xoKq0Kr7sErb+4Xs9nZvu58pJojz5RFGpqnZYJTrRfQ==} + engines: {node: '>=10.12.0'} + dependencies: + mkdirp: 1.0.4 + strip-ansi: 6.0.1 + uuid: 8.3.2 + xml: 1.0.1 + dev: true + /jest-leak-detector@28.1.3: resolution: {integrity: sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -13882,6 +15143,14 @@ packages: pretty-format: 28.1.3 dev: true + /jest-leak-detector@29.7.0: + resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + dev: true + /jest-matcher-utils@27.5.1: resolution: {integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -13912,6 +15181,16 @@ packages: pretty-format: 29.7.0 dev: true + /jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + dev: true + /jest-message-util@28.1.3: resolution: {integrity: sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -13927,6 +15206,29 @@ packages: stack-utils: 2.0.5 dev: true + /jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/code-frame': 7.22.13 + '@jest/types': 29.6.3 + '@types/stack-utils': 2.0.1 + chalk: 4.1.2 + graceful-fs: 4.2.10 + micromatch: 4.0.5 + pretty-format: 29.7.0 + slash: 3.0.0 + stack-utils: 2.0.5 + dev: true + + /jest-mock@27.5.1: + resolution: {integrity: sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/node': 18.7.5 + dev: true + /jest-mock@28.1.3: resolution: {integrity: sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -13935,6 +15237,38 @@ packages: '@types/node': 18.7.5 dev: true + /jest-mock@29.7.0: + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@types/node': 18.7.5 + jest-util: 29.7.0 + dev: true + + /jest-playwright-preset@4.0.0(jest-circus@29.7.0)(jest-environment-node@29.7.0)(jest-runner@29.7.0)(jest@29.7.0): + resolution: {integrity: sha512-+dGZ1X2KqtwXaabVjTGxy0a3VzYfvYsWaRcuO8vMhyclHSOpGSI1+5cmlqzzCwQ3+fv0EjkTc7I5aV9lo08dYw==} + peerDependencies: + jest: ^29.3.1 + jest-circus: ^29.3.1 + jest-environment-node: ^29.3.1 + jest-runner: ^29.3.1 + dependencies: + expect-playwright: 0.8.0 + jest: 29.7.0 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-process-manager: 0.4.0 + jest-runner: 29.7.0 + nyc: 15.1.0 + playwright-core: 1.41.2 + rimraf: 3.0.2 + uuid: 8.3.2 + transitivePeerDependencies: + - debug + - supports-color + dev: true + /jest-pnp-resolver@1.2.2(jest-resolve@28.1.3): resolution: {integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==} engines: {node: '>=6'} @@ -13947,6 +15281,36 @@ packages: jest-resolve: 28.1.3 dev: true + /jest-pnp-resolver@1.2.2(jest-resolve@29.7.0): + resolution: {integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + dependencies: + jest-resolve: 29.7.0 + dev: true + + /jest-process-manager@0.4.0: + resolution: {integrity: sha512-80Y6snDyb0p8GG83pDxGI/kQzwVTkCxc7ep5FPe/F6JYdvRDhwr6RzRmPSP7SEwuLhxo80lBS/NqOdUIbHIfhw==} + dependencies: + '@types/wait-on': 5.3.4 + chalk: 4.1.2 + cwd: 0.10.0 + exit: 0.1.2 + find-process: 1.4.7 + prompts: 2.4.2 + signal-exit: 3.0.7 + spawnd: 5.0.0 + tree-kill: 1.2.2 + wait-on: 7.0.1(debug@4.3.4) + transitivePeerDependencies: + - debug + - supports-color + dev: true + /jest-regex-util@28.0.2: resolution: {integrity: sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -13967,6 +15331,16 @@ packages: - supports-color dev: true + /jest-resolve-dependencies@29.7.0: + resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-regex-util: 29.6.3 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + dev: true + /jest-resolve@28.1.3: resolution: {integrity: sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -13982,6 +15356,21 @@ packages: slash: 3.0.0 dev: true + /jest-resolve@29.7.0: + resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.10 + jest-haste-map: 29.7.0 + jest-pnp-resolver: 1.2.2(jest-resolve@29.7.0) + jest-util: 29.7.0 + jest-validate: 29.7.0 + resolve: 1.22.1 + resolve.exports: 2.0.2 + slash: 3.0.0 + dev: true + /jest-runner@28.1.3: resolution: {integrity: sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -13995,16 +15384,45 @@ packages: chalk: 4.1.2 emittery: 0.10.2 graceful-fs: 4.2.10 - jest-docblock: 28.1.1 - jest-environment-node: 28.1.3 - jest-haste-map: 28.1.3 - jest-leak-detector: 28.1.3 - jest-message-util: 28.1.3 - jest-resolve: 28.1.3 - jest-runtime: 28.1.3 - jest-util: 28.1.3 - jest-watcher: 28.1.3 - jest-worker: 28.1.3 + jest-docblock: 28.1.1 + jest-environment-node: 28.1.3 + jest-haste-map: 28.1.3 + jest-leak-detector: 28.1.3 + jest-message-util: 28.1.3 + jest-resolve: 28.1.3 + jest-runtime: 28.1.3 + jest-util: 28.1.3 + jest-watcher: 28.1.3 + jest-worker: 28.1.3 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-runner@29.7.0: + resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/console': 29.7.0 + '@jest/environment': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.7.5 + chalk: 4.1.2 + emittery: 0.13.1 + graceful-fs: 4.2.10 + jest-docblock: 29.7.0 + jest-environment-node: 29.7.0 + jest-haste-map: 29.7.0 + jest-leak-detector: 29.7.0 + jest-message-util: 29.7.0 + jest-resolve: 29.7.0 + jest-runtime: 29.7.0 + jest-util: 29.7.0 + jest-watcher: 29.7.0 + jest-worker: 29.7.0 p-limit: 3.1.0 source-map-support: 0.5.13 transitivePeerDependencies: @@ -14041,6 +15459,42 @@ packages: - supports-color dev: true + /jest-runtime@29.7.0: + resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/globals': 29.7.0 + '@jest/source-map': 29.6.3 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.7.5 + chalk: 4.1.2 + cjs-module-lexer: 1.2.2 + collect-v8-coverage: 1.0.1 + glob: 7.2.3 + graceful-fs: 4.2.10 + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-serializer-html@7.1.0: + resolution: {integrity: sha512-xYL2qC7kmoYHJo8MYqJkzrl/Fdlx+fat4U1AqYg+kafqwcKPiMkOcjWHPKhueuNEgr+uemhGc+jqXYiwCyRyLA==} + dependencies: + diffable-html: 4.1.0 + dev: true + /jest-snapshot@28.1.3: resolution: {integrity: sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -14072,6 +15526,34 @@ packages: - supports-color dev: true + /jest-snapshot@29.7.0: + resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/core': 7.23.2 + '@babel/generator': 7.23.0 + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-syntax-typescript': 7.18.6(@babel/core@7.23.2) + '@babel/types': 7.23.0 + '@jest/expect-utils': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.2) + chalk: 4.1.2 + expect: 29.7.0 + graceful-fs: 4.2.10 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + natural-compare: 1.4.0 + pretty-format: 29.7.0 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + dev: true + /jest-util@28.1.3: resolution: {integrity: sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -14120,6 +15602,34 @@ packages: pretty-format: 28.1.3 dev: true + /jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 29.6.3 + leven: 3.1.0 + pretty-format: 29.7.0 + dev: true + + /jest-watch-typeahead@2.2.2(jest@29.7.0): + resolution: {integrity: sha512-+QgOFW4o5Xlgd6jGS5X37i08tuuXNW8X0CV9WNFi+3n8ExCIP+E1melYhvYLjv5fE6D0yyzk74vsSO8I6GqtvQ==} + engines: {node: ^14.17.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + jest: ^27.0.0 || ^28.0.0 || ^29.0.0 + dependencies: + ansi-escapes: 6.2.0 + chalk: 5.3.0 + jest: 29.7.0 + jest-regex-util: 29.6.3 + jest-watcher: 29.7.0 + slash: 5.1.0 + string-length: 5.0.1 + strip-ansi: 7.0.1 + dev: true + /jest-watcher@28.1.3: resolution: {integrity: sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -14134,6 +15644,20 @@ packages: string-length: 4.0.2 dev: true + /jest-watcher@29.7.0: + resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.7.5 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 29.7.0 + string-length: 4.0.2 + dev: true + /jest-worker@27.5.1: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} @@ -14191,6 +15715,27 @@ packages: - ts-node dev: true + /jest@29.7.0: + resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.7.0 + '@jest/types': 29.6.3 + import-local: 3.1.0 + jest-cli: 29.7.0 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + dev: true + /jiti@1.18.2: resolution: {integrity: sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==} hasBin: true @@ -14376,6 +15921,10 @@ packages: engines: {node: '>=6'} hasBin: true + /jsonc-parser@3.2.1: + resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} + dev: true + /jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} optionalDependencies: @@ -14594,6 +16143,10 @@ packages: /lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + /lodash.flattendeep@4.4.0: + resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==} + dev: true + /lodash.flow@3.5.0: resolution: {integrity: sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==} dev: false @@ -14691,6 +16244,11 @@ packages: hasBin: true dev: true + /lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + dev: true + /make-dir@2.1.0: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} engines: {node: '>=6'} @@ -15082,12 +16640,23 @@ packages: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} dev: true + /node-preload@0.2.1: + resolution: {integrity: sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==} + engines: {node: '>=8'} + dependencies: + process-on-spawn: 1.0.0 + dev: true + /node-releases@2.0.10: resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==} /node-releases@2.0.13: resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + /node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + dev: true + /node-releases@2.0.6: resolution: {integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==} dev: true @@ -15154,6 +16723,42 @@ packages: resolution: {integrity: sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg==} dev: true + /nyc@15.1.0: + resolution: {integrity: sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==} + engines: {node: '>=8.9'} + hasBin: true + dependencies: + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + caching-transform: 4.0.0 + convert-source-map: 1.8.0 + decamelize: 1.2.0 + find-cache-dir: 3.3.2 + find-up: 4.1.0 + foreground-child: 2.0.0 + get-package-type: 0.1.0 + glob: 7.2.3 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-hook: 3.0.0 + istanbul-lib-instrument: 4.0.3 + istanbul-lib-processinfo: 2.0.3 + istanbul-lib-report: 3.0.0 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.5 + make-dir: 3.1.0 + node-preload: 0.2.1 + p-map: 3.0.0 + process-on-spawn: 1.0.0 + resolve-from: 5.0.0 + rimraf: 3.0.2 + signal-exit: 3.0.7 + spawn-wrap: 2.0.0 + test-exclude: 6.0.0 + yargs: 15.4.1 + transitivePeerDependencies: + - supports-color + dev: true + /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -15396,6 +17001,13 @@ packages: engines: {node: '>=6'} dev: true + /p-map@3.0.0: + resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} + engines: {node: '>=8'} + dependencies: + aggregate-error: 3.1.0 + dev: true + /p-map@4.0.0: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} @@ -15413,6 +17025,16 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + /package-hash@4.0.0: + resolution: {integrity: sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==} + engines: {node: '>=8'} + dependencies: + graceful-fs: 4.2.10 + hasha: 5.2.2 + lodash.flattendeep: 4.4.0 + release-zalgo: 1.0.0 + dev: true + /package-json@6.5.0: resolution: {integrity: sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==} engines: {node: '>=8'} @@ -15463,6 +17085,11 @@ packages: resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} dev: false + /parse-passwd@1.0.0: + resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} + engines: {node: '>=0.10.0'} + dev: true + /parse5-htmlparser2-tree-adapter@7.0.0: resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} dependencies: @@ -15628,6 +17255,20 @@ packages: find-up: 3.0.0 dev: false + /playwright-core@1.41.2: + resolution: {integrity: sha512-VaTvwCA4Y8kxEe+kfm2+uUUw5Lubf38RxF7FpBxLPmGe5sdNkSg5e3ChEigaGrX7qdqT3pt2m/98LiyvU2x6CA==} + engines: {node: '>=16'} + hasBin: true + + /playwright@1.41.2: + resolution: {integrity: sha512-v0bOa6H2GJChDL8pAeLa/LZC4feoAMbSQm1/jF/ySsWWoaNItvrMP7GEkvEEFyCTUYKMxjQKaTSg5up7nR6/8A==} + engines: {node: '>=16'} + hasBin: true + dependencies: + playwright-core: 1.41.2 + optionalDependencies: + fsevents: 2.3.2 + /polished@4.2.2: resolution: {integrity: sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ==} engines: {node: '>=10'} @@ -15635,6 +17276,11 @@ packages: '@babel/runtime': 7.21.0 dev: true + /possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + dev: true + /postcss-calc@8.2.4(postcss@8.4.21): resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} peerDependencies: @@ -16228,6 +17874,13 @@ packages: /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + /process-on-spawn@1.0.0: + resolution: {integrity: sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==} + engines: {node: '>=8'} + dependencies: + fromentries: 1.3.2 + dev: true + /process@0.11.10: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} @@ -16359,6 +18012,10 @@ packages: resolution: {integrity: sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==} dev: false + /pure-rand@6.0.4: + resolution: {integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==} + dev: true + /qs@6.10.3: resolution: {integrity: sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==} engines: {node: '>=0.6'} @@ -16828,6 +18485,7 @@ packages: /readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + requiresBuild: true dependencies: picomatch: 2.3.1 @@ -16931,6 +18589,16 @@ packages: functions-have-names: 1.2.3 dev: true + /regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-errors: 1.3.0 + set-function-name: 2.0.2 + dev: true + /regexpp@3.2.0: resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} engines: {node: '>=8'} @@ -16990,6 +18658,13 @@ packages: resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} engines: {node: '>= 0.10'} + /release-zalgo@1.0.0: + resolution: {integrity: sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==} + engines: {node: '>=4'} + dependencies: + es6-error: 4.1.1 + dev: true + /remark-emoji@2.2.0: resolution: {integrity: sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w==} dependencies: @@ -17109,6 +18784,14 @@ packages: resolve-from: 5.0.0 dev: true + /resolve-dir@0.1.1: + resolution: {integrity: sha512-QxMPqI6le2u0dCLyiGzgy92kjkkL6zO0XyvHzjdTNH3zM6e5Hz3BwG6+aEyNgiQ5Xz6PwTwgQEj3U50dByPKIA==} + engines: {node: '>=0.10.0'} + dependencies: + expand-tilde: 1.2.2 + global-modules: 0.2.3 + dev: true + /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -17127,6 +18810,11 @@ packages: engines: {node: '>=10'} dev: true + /resolve.exports@2.0.2: + resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} + engines: {node: '>=10'} + dev: true + /resolve@1.22.1: resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} hasBin: true @@ -17411,6 +19099,28 @@ packages: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} dev: true + /set-function-length@1.2.1: + resolution: {integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + dev: true + + /set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + dev: true + /setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} dev: false @@ -17537,6 +19247,11 @@ packages: engines: {node: '>=12'} dev: false + /slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + dev: true + /slice-ansi@3.0.0: resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} engines: {node: '>=8'} @@ -17621,6 +19336,29 @@ packages: /space-separated-tokens@1.1.5: resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} + /spawn-wrap@2.0.0: + resolution: {integrity: sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==} + engines: {node: '>=8'} + dependencies: + foreground-child: 2.0.0 + is-windows: 1.0.2 + make-dir: 3.1.0 + rimraf: 3.0.2 + signal-exit: 3.0.7 + which: 2.0.2 + dev: true + + /spawnd@5.0.0: + resolution: {integrity: sha512-28+AJr82moMVWolQvlAIv3JcYDkjkFTEmfDc503wxrF5l2rQ3dFz6DpbXp3kD4zmgGGldfM4xM4v1sFj/ZaIOA==} + dependencies: + exit: 0.1.2 + signal-exit: 3.0.7 + tree-kill: 1.2.2 + wait-port: 0.2.14 + transitivePeerDependencies: + - supports-color + dev: true + /spawndamnit@2.0.0: resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} dependencies: @@ -17748,6 +19486,13 @@ packages: resolution: {integrity: sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==} dev: false + /stop-iteration-iterator@1.0.0: + resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} + engines: {node: '>= 0.4'} + dependencies: + internal-slot: 1.0.7 + dev: true + /store2@2.14.2: resolution: {integrity: sha512-siT1RiqlfQnGqgT/YzXVUNsom9S0H1OX+dpdGN1xkyYATo4I6sep5NmsRD/40s3IIOvlCq6akxkqG82urIZW1w==} dev: true @@ -17788,6 +19533,14 @@ packages: strip-ansi: 6.0.1 dev: true + /string-length@5.0.1: + resolution: {integrity: sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==} + engines: {node: '>=12.20'} + dependencies: + char-regex: 2.0.1 + strip-ansi: 7.0.1 + dev: true + /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -18284,6 +20037,7 @@ packages: /to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + requiresBuild: true dependencies: is-number: 7.0.0 @@ -18531,6 +20285,11 @@ packages: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} + /type-fest@3.13.1: + resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} + engines: {node: '>=14.16'} + dev: true + /type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -18542,7 +20301,6 @@ packages: resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} dependencies: is-typedarray: 1.0.0 - dev: false /typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} @@ -18727,6 +20485,17 @@ packages: escalade: 3.1.1 picocolors: 1.0.0 + /update-browserslist-db@1.0.13(browserslist@4.23.0): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.23.0 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + /update-browserslist-db@1.0.5(browserslist@4.21.2): resolution: {integrity: sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==} hasBin: true @@ -19026,6 +20795,18 @@ packages: - debug dev: true + /wait-port@0.2.14: + resolution: {integrity: sha512-kIzjWcr6ykl7WFbZd0TMae8xovwqcqbx6FM9l+7agOgUByhzdjfzZBPK2CPufldTOMxbUivss//Sh9MFawmPRQ==} + engines: {node: '>=8'} + hasBin: true + dependencies: + chalk: 2.4.2 + commander: 3.0.2 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: true + /walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} dependencies: @@ -19486,6 +21267,15 @@ packages: is-symbol: 1.0.4 dev: true + /which-collection@1.0.1: + resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} + dependencies: + is-map: 2.0.2 + is-set: 2.0.2 + is-weakmap: 2.0.1 + is-weakset: 2.0.2 + dev: true + /which-module@2.0.0: resolution: {integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==} dev: true @@ -19509,6 +21299,17 @@ packages: has-tostringtag: 1.0.0 dev: true + /which-typed-array@1.1.14: + resolution: {integrity: sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.2 + dev: true + /which@1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} hasBin: true @@ -19590,7 +21391,6 @@ packages: is-typedarray: 1.0.0 signal-exit: 3.0.7 typedarray-to-buffer: 3.1.5 - dev: false /write-file-atomic@4.0.1: resolution: {integrity: sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ==} @@ -19664,6 +21464,10 @@ packages: engines: {node: '>=12'} dev: true + /xml@1.0.1: + resolution: {integrity: sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==} + dev: true + /xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} dev: true From 85438c01f4186da8b5b5e2dac810ac6d13d9c8ac Mon Sep 17 00:00:00 2001 From: Melvin Chen Date: Tue, 20 Feb 2024 14:55:10 -0800 Subject: [PATCH 19/69] Storybook test CI update --- .github/workflows/storybook-tests.yml | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/.github/workflows/storybook-tests.yml b/.github/workflows/storybook-tests.yml index 2d8f198f..bc37aaaa 100644 --- a/.github/workflows/storybook-tests.yml +++ b/.github/workflows/storybook-tests.yml @@ -10,7 +10,23 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-node@v2 with: - node-version: '16.x' + node-version: ${{ matrix.node-version }} + + - uses: pnpm/action-setup@v2.2.2 + with: + version: 7 + + - name: Get pnpm store directory + id: pnpm-cache + run: echo "::set-output name=pnpm_cache_dir::$(pnpm store path)" + + - name: Setup pnpm cache + uses: actions/cache@v3 + with: + path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }} + key: ${{ runner.os }}-pnpm-store-${{ hashFiles('./pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm-store- - name: Install dependencies run: pnpm install - name: Install Playwright From 49e3429d23a34e09ed4c00bd93337adb5a398123 Mon Sep 17 00:00:00 2001 From: Melvin Chen Date: Tue, 20 Feb 2024 14:59:20 -0800 Subject: [PATCH 20/69] Update storybook build command --- .github/workflows/storybook-tests.yml | 2 +- .gitignore | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/storybook-tests.yml b/.github/workflows/storybook-tests.yml index bc37aaaa..74889c0a 100644 --- a/.github/workflows/storybook-tests.yml +++ b/.github/workflows/storybook-tests.yml @@ -32,7 +32,7 @@ jobs: - name: Install Playwright run: npx playwright install --with-deps - name: Build Storybook - run: pnpm build-storybook --quiet + run: pnpm build:storybook --quiet - name: Serve Storybook and run tests run: | npx concurrently -k -s first -n "SB,TEST" -c "magenta,blue" \ diff --git a/.gitignore b/.gitignore index 6933bbda..6076474c 100644 --- a/.gitignore +++ b/.gitignore @@ -42,3 +42,4 @@ cypress/screenshots cypress/videos /packages/nuka/cypress/screenshots /packages/nuka/cypress/videos +/packages/nuka/storybook-static From d3d6e83830370585fd0f58dccbd32b362eabddc5 Mon Sep 17 00:00:00 2001 From: Melvin Chen Date: Wed, 21 Feb 2024 10:53:53 -0800 Subject: [PATCH 21/69] Test manually adding wait-on --- package.json | 3 ++- pnpm-lock.yaml | 62 ++++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 59 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index c8bf9ae1..6fd1176b 100644 --- a/package.json +++ b/package.json @@ -54,6 +54,7 @@ "typescript": "^4.5.2" }, "dependencies": { - "playwright": "^1.41.2" + "playwright": "^1.41.2", + "wait-on": "^7.2.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 83544cf1..7503a677 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,9 @@ importers: playwright: specifier: ^1.41.2 version: 1.41.2 + wait-on: + specifier: ^7.2.0 + version: 7.2.0 devDependencies: '@babel/cli': specifier: ^7.10.4 @@ -7227,6 +7230,11 @@ packages: dependencies: '@hapi/hoek': 9.3.0 + /@sideway/address@4.1.5: + resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} + dependencies: + '@hapi/hoek': 9.3.0 + /@sideway/formula@3.0.0: resolution: {integrity: sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==} @@ -9999,7 +10007,6 @@ packages: /asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: true /at-least-node@1.0.0: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} @@ -10067,6 +10074,15 @@ packages: - debug dev: true + /axios@1.6.7: + resolution: {integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==} + dependencies: + follow-redirects: 1.15.5 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + /babel-core@7.0.0-bridge.0(@babel/core@7.23.2): resolution: {integrity: sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==} peerDependencies: @@ -11075,7 +11091,6 @@ packages: engines: {node: '>= 0.8'} dependencies: delayed-stream: 1.0.0 - dev: true /comma-separated-tokens@1.0.8: resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==} @@ -11897,7 +11912,6 @@ packages: /delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} - dev: true /depd@1.1.2: resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} @@ -13181,6 +13195,15 @@ packages: dependencies: debug: 4.3.4(supports-color@8.1.1) + /follow-redirects@1.15.5: + resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + /for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: @@ -13278,7 +13301,6 @@ packages: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 - dev: true /forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} @@ -15305,7 +15327,7 @@ packages: signal-exit: 3.0.7 spawnd: 5.0.0 tree-kill: 1.2.2 - wait-on: 7.0.1(debug@4.3.4) + wait-on: 7.2.0 transitivePeerDependencies: - debug - supports-color @@ -15741,6 +15763,15 @@ packages: hasBin: true dev: true + /joi@17.12.2: + resolution: {integrity: sha512-RonXAIzCiHLc8ss3Ibuz45u28GOsWE1UpfDXLbN/9NKbL4tCJf8TWYVKsoYuuh+sAUt7fsSNpA+r2+TBA6Wjmw==} + dependencies: + '@hapi/hoek': 9.3.0 + '@hapi/topo': 5.1.0 + '@sideway/address': 4.1.5 + '@sideway/formula': 3.0.1 + '@sideway/pinpoint': 2.0.0 + /joi@17.6.0: resolution: {integrity: sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw==} dependencies: @@ -17932,6 +17963,9 @@ packages: resolution: {integrity: sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==} dev: true + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + /ps-tree@1.2.0: resolution: {integrity: sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==} engines: {node: '>= 0.10'} @@ -18910,6 +18944,11 @@ packages: dependencies: tslib: 2.4.0 + /rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + dependencies: + tslib: 2.4.0 + /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} @@ -20795,6 +20834,19 @@ packages: - debug dev: true + /wait-on@7.2.0: + resolution: {integrity: sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==} + engines: {node: '>=12.0.0'} + hasBin: true + dependencies: + axios: 1.6.7 + joi: 17.12.2 + lodash: 4.17.21 + minimist: 1.2.8 + rxjs: 7.8.1 + transitivePeerDependencies: + - debug + /wait-port@0.2.14: resolution: {integrity: sha512-kIzjWcr6ykl7WFbZd0TMae8xovwqcqbx6FM9l+7agOgUByhzdjfzZBPK2CPufldTOMxbUivss//Sh9MFawmPRQ==} engines: {node: '>=8'} From 7ebe168a71e78dc3eb63c4e5ab3d4f3ee3743b76 Mon Sep 17 00:00:00 2001 From: Melvin Chen Date: Wed, 21 Feb 2024 10:59:06 -0800 Subject: [PATCH 22/69] update wait on tcp address --- .github/workflows/storybook-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/storybook-tests.yml b/.github/workflows/storybook-tests.yml index 74889c0a..bc6587f3 100644 --- a/.github/workflows/storybook-tests.yml +++ b/.github/workflows/storybook-tests.yml @@ -37,4 +37,4 @@ jobs: run: | npx concurrently -k -s first -n "SB,TEST" -c "magenta,blue" \ "npx http-server storybook-static --port 6006 --silent" \ - "npx wait-on tcp:6006 && pnpm test:storybook" + "npx wait-on tcp:127.0.0.1:6006 && pnpm test:storybook" From 1db7dcca25f2a0cfb3dc6217132a2917a52d5d91 Mon Sep 17 00:00:00 2001 From: Melvin Chen Date: Wed, 21 Feb 2024 11:03:17 -0800 Subject: [PATCH 23/69] update wait on tcp address --- .github/workflows/storybook-tests.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/storybook-tests.yml b/.github/workflows/storybook-tests.yml index bc6587f3..e8f54377 100644 --- a/.github/workflows/storybook-tests.yml +++ b/.github/workflows/storybook-tests.yml @@ -36,5 +36,5 @@ jobs: - name: Serve Storybook and run tests run: | npx concurrently -k -s first -n "SB,TEST" -c "magenta,blue" \ - "npx http-server storybook-static --port 6006 --silent" \ - "npx wait-on tcp:127.0.0.1:6006 && pnpm test:storybook" + "npx http-server storybook-static --port 9009 --silent" \ + "npx wait-on tcp:127.0.0.1:9009 && pnpm test:storybook --url http://127.0.0.1:9009/" From 5bcf9eaadd72ae97b47613e3d16fbb7ad6b2380c Mon Sep 17 00:00:00 2001 From: Melvin Chen Date: Wed, 21 Feb 2024 15:14:09 -0800 Subject: [PATCH 24/69] Add tests into storybook stories, update function for website examples --- .../nuka/src/Carousel/Carousel.stories.tsx | 25 +- .../src/Carousel/CarouselTests.stories.tsx | 224 ++++++++++++++++++ .../src/PageIndicators/PageIndicators.tsx | 2 +- 3 files changed, 226 insertions(+), 25 deletions(-) create mode 100644 packages/nuka/src/Carousel/CarouselTests.stories.tsx diff --git a/packages/nuka/src/Carousel/Carousel.stories.tsx b/packages/nuka/src/Carousel/Carousel.stories.tsx index 538a4075..4065fdf0 100644 --- a/packages/nuka/src/Carousel/Carousel.stories.tsx +++ b/packages/nuka/src/Carousel/Carousel.stories.tsx @@ -39,11 +39,9 @@ export default meta; type Story = StoryObj; -const FIXED_SCROLL_DISTANCE = 200; - export const FixedWidthScroll: Story = { args: { - scrollDistance: FIXED_SCROLL_DISTANCE, + scrollDistance: 200, children: ( <> {[...Array(6)].map((_, index) => ( @@ -52,27 +50,6 @@ export const FixedWidthScroll: Story = { ), }, - play: async ({ canvasElement }) => { - const canvas = within(canvasElement); - const backButton = canvas.getByText('previous'); - const forwardButton = canvas.getByText('next'); - - await expect(backButton).toBeInTheDocument(); - await expect(forwardButton).toBeInTheDocument(); - - await userEvent.click(forwardButton); - - await waitFor(async () => { - expect(canvas.getByTestId('overflow').scrollLeft).toEqual( - FIXED_SCROLL_DISTANCE - ); - }); - await userEvent.click(backButton); - - await waitFor(async () => { - expect(canvas.getByTestId('overflow').scrollLeft).toEqual(0); - }); - }, }; export const Slide: Story = { diff --git a/packages/nuka/src/Carousel/CarouselTests.stories.tsx b/packages/nuka/src/Carousel/CarouselTests.stories.tsx new file mode 100644 index 00000000..6945806b --- /dev/null +++ b/packages/nuka/src/Carousel/CarouselTests.stories.tsx @@ -0,0 +1,224 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import { within, waitFor, userEvent } from '@storybook/testing-library'; +import { expect } from '@storybook/jest'; +import { Carousel, CarouselProps, SlideHandle } from './Carousel'; +import { useRef } from 'react'; +import { ExampleSlide, FullWidthSlide } from './ExampleSlide'; +import './CarouselStories.css'; + +const StorybookComponent = (props: CarouselProps) => { + const ref = useRef(null); + return ( +
+ + + +
+ ); +}; + +const meta: Meta = { + title: 'components/TestRunners', + component: StorybookComponent, + tags: ['autodocs'], +}; + +export default meta; + +type Story = StoryObj; + +const FIXED_SCROLL_DISTANCE = 200; + +export const FixedWidthScroll: Story = { + args: { + scrollDistance: FIXED_SCROLL_DISTANCE, + children: ( + <> + {[...Array(6)].map((_, index) => ( + + ))} + + ), + }, + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + const backButton = canvas.getByText('previous'); + const forwardButton = canvas.getByText('next'); + + await expect(backButton).toBeInTheDocument(); + await expect(forwardButton).toBeInTheDocument(); + + await userEvent.click(forwardButton); + + await waitFor(async () => { + expect(canvas.getByTestId('overflow').scrollLeft).toEqual( + FIXED_SCROLL_DISTANCE + ); + }); + await userEvent.click(backButton); + + await waitFor(async () => { + expect(canvas.getByTestId('overflow').scrollLeft).toEqual(0); + }); + }, +}; + +export const Slide: Story = { + args: { + scrollDistance: 'slide', + wrapperClassName: 'slide__with-gap', + children: ( + <> + {[...Array(10)].map((_, index) => ( + + ))} + + ), + }, + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + + await expect(canvas.getByTestId('wrapper').classList).toContain( + 'slide__with-gap' + ); + const forwardButton = canvas.getByText('next'); + + await userEvent.click(forwardButton); + + await waitFor(async () => { + expect(canvas.getByTestId('overflow').scrollLeft).toEqual( + (canvas.getByTestId('wrapper').children[1] as HTMLElement).offsetLeft - + canvas.getByTestId('overflow').offsetLeft + ); + }); + + await userEvent.click(forwardButton); + + await waitFor(async () => { + expect(canvas.getByTestId('overflow').scrollLeft).toEqual( + (canvas.getByTestId('wrapper').children[2] as HTMLElement).offsetLeft - + canvas.getByTestId('overflow').offsetLeft + ); + }); + }, +}; + +export const FullWidth: Story = { + args: { + scrollDistance: 'slide', + children: ( + <> + {[...Array(10)].map((_, index) => ( + + ))} + + ), + }, +}; + +export const Screen: Story = { + args: { + scrollDistance: 'screen', + wrapperClassName: 'slide__with-gap', + children: ( + <> + {[...Array(10)].map((_, index) => ( + + ))} + + ), + }, +}; + +const AUTOPLAY_INTERVAL_IN_MS = 2000; +export const AutoPlay: Story = { + args: { + scrollDistance: 'slide', + autoplay: true, + autoplayInterval: AUTOPLAY_INTERVAL_IN_MS, + children: ( + <> + {[...Array(10)].map((_, index) => ( + + ))} + + ), + }, + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + + const overflow = canvas.getByTestId('overflow'); + expect(canvas.getByTestId('overflow').scrollLeft).toEqual(0); + + setTimeout(async () => { + await waitFor(async () => { + expect(canvas.getByTestId('overflow').scrollLeft).toEqual( + (overflow.children[0].children[1] as HTMLElement).offsetLeft - + overflow.offsetLeft + ); + }); + }, AUTOPLAY_INTERVAL_IN_MS); + }, +}; + +const CURRENT_PAGE_INDICATOR_CLASSNAME = 'indicator__current'; +const GENERAL_PAGE_INDICATOR_CLASSNAME = 'indicator'; +const PAGE_INDICATOR_CONTAINER_CLASSNAME = 'indicator--container'; + +export const PageIndicators: Story = { + args: { + scrollDistance: 'screen', + showPageIndicators: true, + pageIndicatorProps: { + currentPageIndicatorClassName: CURRENT_PAGE_INDICATOR_CLASSNAME, + pageIndicatorClassName: GENERAL_PAGE_INDICATOR_CLASSNAME, + containerClassName: PAGE_INDICATOR_CONTAINER_CLASSNAME, + }, + children: ( + <> + {[...Array(10)].map((_, index) => ( + + ))} + + ), + }, + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + + const carouselWidth = canvas.getByTestId('wrapper').clientWidth; + + const pageIndicatorContainer = canvas.getByTestId('pageIndicatorContainer'); + + await expect(pageIndicatorContainer).toBeInTheDocument(); + await expect(pageIndicatorContainer).toHaveClass( + PAGE_INDICATOR_CONTAINER_CLASSNAME + ); + await expect( + pageIndicatorContainer.getElementsByClassName( + GENERAL_PAGE_INDICATOR_CLASSNAME + ).length + ).toBe(pageIndicatorContainer.children.length); + + await waitFor(async () => { + userEvent.click(pageIndicatorContainer.children[1]); + expect(canvas.getByTestId('overflow').scrollLeft).toEqual(carouselWidth); + }); + + await waitFor(async () => { + userEvent.click(pageIndicatorContainer.children[0]); + expect(canvas.getByTestId('overflow').scrollLeft).toEqual(0); + }); + }, +}; diff --git a/packages/nuka/src/PageIndicators/PageIndicators.tsx b/packages/nuka/src/PageIndicators/PageIndicators.tsx index 1d8352a3..6fc81f8a 100644 --- a/packages/nuka/src/PageIndicators/PageIndicators.tsx +++ b/packages/nuka/src/PageIndicators/PageIndicators.tsx @@ -16,7 +16,7 @@ export const PageIndicators = ({ scrollToPage, }: PageIndicatorsProps) => { return ( -
+
{[...Array(totalIndicators)].map((_, index) => (
); + +export const FocusableLinkSlide = ({ index }: { index: number }) => ( + event.target.scrollIntoView()} + className="focusable" + > + Card {index} + +); diff --git a/website/src/components/cards.tsx b/website/src/components/cards.tsx index 1f753ea9..1daf3572 100644 --- a/website/src/components/cards.tsx +++ b/website/src/components/cards.tsx @@ -19,30 +19,21 @@ const Card = ({ className, slideId }: CardProps) => (
); -export const Cards = [ - , - , - , - , - , +const colorPairings = [ + 'bg-red-300 text-red-700', + 'bg-orange-300 text-orange-700', + 'bg-yellow-300 text-yellow-700', + 'bg-green-300 text-green-700', + 'bg-blue-300 text-blue-700', + 'bg-purple-300 text-purple-700', + 'bg-violet-300 text-violet-700', ]; + +export const generateCards = (length: number = 7) => + [...Array(length)].map((_, index) => ( + + )); diff --git a/website/src/components/demos.tsx b/website/src/components/demos.tsx index 5d645754..4acc30df 100644 --- a/website/src/components/demos.tsx +++ b/website/src/components/demos.tsx @@ -1,6 +1,6 @@ import React, { useRef } from 'react'; import Carousel, { SlideHandle } from 'nuka-carousel'; -import { Cards } from '@site/src/components/cards'; +import { generateCards } from '@site/src/components/cards'; type scrollDistanceType = number | 'slide' | 'screen'; @@ -29,7 +29,6 @@ export const BasicDemo = ({ className = '', }: Props) => { const ref = useRef(null); - console.log(scrollDistance); return (
- {Cards} + {generateCards()}
From 63031b83f142409c8eb684234dd245a14e04e4f7 Mon Sep 17 00:00:00 2001 From: Melvin Chen Date: Thu, 22 Feb 2024 11:34:14 -0800 Subject: [PATCH 26/69] Docs for methods and upgrade guide --- docs/{api.mdx => api-v7.mdx} | 2 +- docs/api/index.mdx | 6 +- docs/api/methods.mdx | 28 ++++- docs/v8-upgrade-guide.mdx | 101 ++++++++++++++++++ .../src/Carousel/CarouselTests.stories.tsx | 4 +- website/src/components/demos.tsx | 20 ++++ 6 files changed, 152 insertions(+), 9 deletions(-) rename docs/{api.mdx => api-v7.mdx} (99%) create mode 100644 docs/v8-upgrade-guide.mdx diff --git a/docs/api.mdx b/docs/api-v7.mdx similarity index 99% rename from docs/api.mdx rename to docs/api-v7.mdx index ccda1b84..5f755f0a 100644 --- a/docs/api.mdx +++ b/docs/api-v7.mdx @@ -2,7 +2,7 @@ sidebar_position: 3 --- -# API +# API (v7 and Below) ## Carousel Props diff --git a/docs/api/index.mdx b/docs/api/index.mdx index 39696e23..c9ee7cdb 100644 --- a/docs/api/index.mdx +++ b/docs/api/index.mdx @@ -2,8 +2,6 @@ sidebar_position: 3 --- -# API v8 +# API (v8+) -## children - -## scrollDistance \ No newline at end of file +Nuka v8 and above are completely rewritten with new props and might not be completely backwards compatable with v7. diff --git a/docs/api/methods.mdx b/docs/api/methods.mdx index 657bcca4..702aac01 100644 --- a/docs/api/methods.mdx +++ b/docs/api/methods.mdx @@ -2,9 +2,33 @@ sidebar_position: 2 --- +import { MethodsDemo } from '../../website/src/components/demos'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + # Methods -Nuka Carousel has a few exposed methods that allow the user to control certain parts of the carousel manually. +Nuka Carousel has a few exposed methods that allow the user to control certain parts of the carousel manually. These methods are accessed via a ref attached to the carousel. + +```tsx title="MyComponent.tsx" +import { useRef } from 'react'; +import Carousel, { SlideHandle } from 'nuka-carousel'; + +const MyComponent = () => { + const ref = useRef(null); + + return ( +
+ ... + + + +
+ ); +}; +``` + +--- ## Progression @@ -20,4 +44,4 @@ Advances the carousel backward by the given `scrollDistance`. ### Usage/Examples -Add examples here + diff --git a/docs/v8-upgrade-guide.mdx b/docs/v8-upgrade-guide.mdx new file mode 100644 index 00000000..4b662716 --- /dev/null +++ b/docs/v8-upgrade-guide.mdx @@ -0,0 +1,101 @@ +--- +sidebar_position: 6 +--- + +# v8 Upgrade Guide + +Nuka v8 and above are completely rewritten with new props and might not be completely backwards compatable with v7. + +--- + +## New Props + +`scrollDistance` + +`showPageIndicators` + +`pageIndicatorProps` + +`wrapperClassName` + +Read more about how to use them in the API (v8+) pages. + +--- + +## Removed Props + +`adaptiveHeight` - The carousel should adapt automatically to the height of the items in the carousel without the need of this prop. + +`adaptiveHeightAnimation` - The carousel should adapt automatically to the height of the items in the carousel without the need of this prop. + +`carouselId` + +`cellAlign` - this should just be controlled through passed CSS (prop `wrapperClassName`). + +`cellSpacing` - this should just be controlled through passed CSS. + +`defaultControlsConfig` + +`disableAnimation` - should just be controlled through passed CSS. + +`dragging` - this is always on, it defaults to the OS/browser settings. + +`dragThreshold` - this defaults to the OS/browser settings. + +`easing` - should just be controlled through passed CSS. + +`edgeEasing` - should just be controlled through passed CSS. + +`enableKeyboardControls` - this should be native without interference. If the content is focusable through normal tabbing, it will focus. + +`keyCodeConfig` - should be native. + +`landmark` + +`renderTop{direction}Controls` - build your own next/prev controls with the goBack() and goForward() exposed methods. + +`scrollMode` - always on `remainder` for now. + +`slideIndex` + +`slidesToScroll` - renamed to scrollDistance. + +`slidesToShow` - now based on media queries and how large the slides are. + +`speed` - should be native. + +`style` - pass styles through the wrapperClassName if needed. + +`swiping` - default to OS/browser settings. + +`tabbed` - should be native. + +`withoutControls` - controls are not rendered by default. Use methods to build your own next/prev triggers or style the page controls with `showPageIndicators` and `pageIndicatorProps`. + +`zoomScale` - should just be controlled through passed CSS. + +--- + +## Props in consideration + +These v7 and below props are being worked on or are considered for v8. + +`afterSlide` + +`beforeSlide` + +`disableEdgeSwiping` + +`frameAriaLabel` + +`onDragStart` + +`onDrag` + +`onDragEnd` + +`onUserNavigation` + +`pauseOnHover` + +`wrapAround` - right now, you can wrap the the front but it won't infinitely scroll like in v7. diff --git a/packages/nuka/src/Carousel/CarouselTests.stories.tsx b/packages/nuka/src/Carousel/CarouselTests.stories.tsx index 6945806b..2093697e 100644 --- a/packages/nuka/src/Carousel/CarouselTests.stories.tsx +++ b/packages/nuka/src/Carousel/CarouselTests.stories.tsx @@ -30,7 +30,7 @@ const StorybookComponent = (props: CarouselProps) => { }; const meta: Meta = { - title: 'components/TestRunners', + title: 'TestRunners', component: StorybookComponent, tags: ['autodocs'], }; @@ -103,7 +103,7 @@ export const Slide: Story = { canvas.getByTestId('overflow').offsetLeft ); }); - + await userEvent.click(forwardButton); await waitFor(async () => { diff --git a/website/src/components/demos.tsx b/website/src/components/demos.tsx index 4acc30df..be9e063d 100644 --- a/website/src/components/demos.tsx +++ b/website/src/components/demos.tsx @@ -54,3 +54,23 @@ export const BasicDemo = ({
); }; + +export const MethodsDemo = () => { + const ref = useRef(null); + return ( +
+ + {generateCards()} + + +
+ + +
+
+ ); +}; From ce84a454a9666f79e0c612d14e8ff1157d2fff13 Mon Sep 17 00:00:00 2001 From: Melvin Chen Date: Thu, 22 Feb 2024 11:59:18 -0800 Subject: [PATCH 27/69] Link v8 to docs --- docs/v8-upgrade-guide.mdx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/v8-upgrade-guide.mdx b/docs/v8-upgrade-guide.mdx index 4b662716..51ba5dea 100644 --- a/docs/v8-upgrade-guide.mdx +++ b/docs/v8-upgrade-guide.mdx @@ -2,6 +2,8 @@ sidebar_position: 6 --- +import Link from '@docusaurus/Link'; + # v8 Upgrade Guide Nuka v8 and above are completely rewritten with new props and might not be completely backwards compatable with v7. @@ -18,7 +20,7 @@ Nuka v8 and above are completely rewritten with new props and might not be compl `wrapperClassName` -Read more about how to use them in the API (v8+) pages. +Read more about how to use them in the API (v8+) pages. --- From 717f4d3ed42dbb34520806ab62ca14f4d89d6c71 Mon Sep 17 00:00:00 2001 From: Melvin Chen Date: Thu, 22 Feb 2024 13:00:47 -0800 Subject: [PATCH 28/69] Go to index function --- packages/nuka/src/Carousel/Carousel.css | 4 ++ .../nuka/src/Carousel/Carousel.stories.tsx | 37 +++++++++++++++++-- packages/nuka/src/Carousel/Carousel.tsx | 30 +++++++++++---- 3 files changed, 61 insertions(+), 10 deletions(-) diff --git a/packages/nuka/src/Carousel/Carousel.css b/packages/nuka/src/Carousel/Carousel.css index 2b10ed2e..2d25b7d4 100644 --- a/packages/nuka/src/Carousel/Carousel.css +++ b/packages/nuka/src/Carousel/Carousel.css @@ -12,3 +12,7 @@ .wrapper { display: flex; } + +.wrapper--scroll-snapping { + scroll-snap-type: x mandatory; +} diff --git a/packages/nuka/src/Carousel/Carousel.stories.tsx b/packages/nuka/src/Carousel/Carousel.stories.tsx index d790ea79..72999bed 100644 --- a/packages/nuka/src/Carousel/Carousel.stories.tsx +++ b/packages/nuka/src/Carousel/Carousel.stories.tsx @@ -1,8 +1,6 @@ import type { Meta, StoryObj } from '@storybook/react'; -import { within, waitFor, userEvent } from '@storybook/testing-library'; -import { expect } from '@storybook/jest'; import { Carousel, CarouselProps, SlideHandle } from './Carousel'; -import { useRef } from 'react'; +import { useRef, useState } from 'react'; import { ExampleSlide, FocusableLinkSlide, @@ -141,3 +139,36 @@ export const FocusableCards: Story = { ), }, }; + +export const GoToIndex: Story = { + render: (props) => { + const ref = useRef(null); + const [randomInRangeIndex, setRandomInRangeIndex] = useState( + Math.floor(Math.random() * 7) + ); + return ( +
+ + +
+ ); + }, + args: { + children: ( + <> + {[...Array(10)].map((_, index) => ( + + ))} + + ), + }, +}; diff --git a/packages/nuka/src/Carousel/Carousel.tsx b/packages/nuka/src/Carousel/Carousel.tsx index 18df23ce..48882a0f 100644 --- a/packages/nuka/src/Carousel/Carousel.tsx +++ b/packages/nuka/src/Carousel/Carousel.tsx @@ -29,6 +29,7 @@ export type CarouselProps = { export type SlideHandle = { goForward: () => void; goBack: () => void; + goToIndex: (proposedIndex: number) => void; }; enum SlideDirection { @@ -89,12 +90,24 @@ export const Carousel = forwardRef( }, [currentManualScrollIndex, pageStartIndices]); const handleScrollAction = useCallback( - (slideDirection: SlideDirection) => { + ({ + slideDirection, + proposedIndex, + }: { + slideDirection?: SlideDirection; + proposedIndex?: number; + }) => { + const totalSlides = pageStartIndices.length; + + const passedProposedIndex = + proposedIndex && Math.min(Math.max(0, proposedIndex), totalSlides); + const proposedSlideIndex = - currentSlideIndex + - (slideDirection === SlideDirection.Forward ? 1 : -1); + typeof passedProposedIndex === 'number' + ? passedProposedIndex + : currentSlideIndex + + (slideDirection === SlideDirection.Forward ? 1 : -1); - const totalSlides = pageStartIndices.length; setCurrentScrollIndex( pageStartIndices[ proposedSlideIndex < 0 @@ -110,7 +123,7 @@ export const Carousel = forwardRef( useEffect(() => { if (autoplay) { const autoplayTimeout = setTimeout(() => { - handleScrollAction(SlideDirection.Forward); + handleScrollAction({ slideDirection: SlideDirection.Forward }); }, autoplayInterval); return () => clearTimeout(autoplayTimeout); } @@ -192,10 +205,13 @@ export const Carousel = forwardRef( ref, () => ({ goForward() { - handleScrollAction(SlideDirection.Forward); + handleScrollAction({ slideDirection: SlideDirection.Forward }); }, goBack() { - handleScrollAction(SlideDirection.Back); + handleScrollAction({ slideDirection: SlideDirection.Back }); + }, + goToIndex(proposedIndex: number) { + handleScrollAction({ proposedIndex }); }, }), [handleScrollAction] From f3e55fedb76bfe90b95c57ed754a18a7dd48014a Mon Sep 17 00:00:00 2001 From: Melvin Chen Date: Fri, 23 Feb 2024 09:41:14 -0800 Subject: [PATCH 29/69] use separate named component for custom render --- .../nuka/src/Carousel/Carousel.stories.tsx | 46 ++++++++++--------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/packages/nuka/src/Carousel/Carousel.stories.tsx b/packages/nuka/src/Carousel/Carousel.stories.tsx index 72999bed..4351c47d 100644 --- a/packages/nuka/src/Carousel/Carousel.stories.tsx +++ b/packages/nuka/src/Carousel/Carousel.stories.tsx @@ -140,33 +140,35 @@ export const FocusableCards: Story = { }, }; +const CustomGoToIndexRenderComponent = (props: CarouselProps) => { + const ref = useRef(null); + const [randomInRangeIndex, setRandomInRangeIndex] = useState( + Math.floor(Math.random() * 7) + ); + return ( +
+ + +
+ ); +}; + export const GoToIndex: Story = { - render: (props) => { - const ref = useRef(null); - const [randomInRangeIndex, setRandomInRangeIndex] = useState( - Math.floor(Math.random() * 7) - ); - return ( -
- - -
- ); - }, + render: CustomGoToIndexRenderComponent, args: { children: ( <> {[...Array(10)].map((_, index) => ( - + ))} ), From 50e3aabc14cc7a1d2b7421f5d444a0e2617deccd Mon Sep 17 00:00:00 2001 From: Melvin Chen Date: Mon, 26 Feb 2024 12:10:58 -0800 Subject: [PATCH 30/69] Update test script for storybook testing, comment out cypress tests --- .github/workflows/cypress.yml | 4 +-- .github/workflows/storybook-tests.yml | 22 ++++++++++++++ package.json | 1 + packages/nuka/package.json | 2 +- packages/nuka/src/Carousel/Carousel.test.tsx | 30 ++++++++++---------- 5 files changed, 41 insertions(+), 18 deletions(-) create mode 100644 .github/workflows/storybook-tests.yml diff --git a/.github/workflows/cypress.yml b/.github/workflows/cypress.yml index 1eca3edc..1c1fc1ec 100644 --- a/.github/workflows/cypress.yml +++ b/.github/workflows/cypress.yml @@ -37,8 +37,8 @@ jobs: - name: Install the Cypress binary run: npx cypress install - - name: Cypress run - run: pnpm run test:ci-with-server + # - name: Cypress run + # run: pnpm run test:ci-with-server - uses: actions/upload-artifact@v3 if: failure() diff --git a/.github/workflows/storybook-tests.yml b/.github/workflows/storybook-tests.yml new file mode 100644 index 00000000..26ead397 --- /dev/null +++ b/.github/workflows/storybook-tests.yml @@ -0,0 +1,22 @@ +name: 'Storybook Tests' +on: push +jobs: + test: + timeout-minutes: 60 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version-file: '.nvmrc' + - name: Install dependencies + run: yarn + - name: Install Playwright + run: npx playwright install --with-deps + - name: Build Storybook + run: pnpm build:storybook --quiet + - name: Serve Storybook and run tests + run: | + npx concurrently -k -s first -n "SB,TEST" -c "magenta,blue" \ + "npx http-server packages/nuka/storybook-static --port 6006" \ + "npx wait-on tcp:6006 && pnpm test:storybook" diff --git a/package.json b/package.json index 6fd1176b..98bf0291 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "test": "pnpm run -r test", "test:ci": "pnpm run -r test:ci", "test:ci-with-server": "start-server-and-test start:website http://localhost:3000 test:ci", + "test:storybook-with-server": "start-server-and-test start:storybook http://localhost:3000 test:storybook", "test:storybook": "pnpm run --filter nuka-carousel test:storybook", "check": "pnpm run lint", "check:ci": "pnpm run check", diff --git a/packages/nuka/package.json b/packages/nuka/package.json index 5539654e..e12050a3 100644 --- a/packages/nuka/package.json +++ b/packages/nuka/package.json @@ -25,7 +25,7 @@ "test:unit:watch": "pnpm run test:unit --watchAll", "test:e2e": "cypress open", "test:e2e:ci": "cypress run", - "test:storybook": "test-storybook --watch", + "test:storybook": "test-storybook", "package": "pnpm pack", "prepublishOnly": "shx cp ../../README.md ./README.md && shx cp ../../LICENSE ./LICENSE && pnpm run build", "postpack": "shx rm ./README.md && shx rm ./LICENSE", diff --git a/packages/nuka/src/Carousel/Carousel.test.tsx b/packages/nuka/src/Carousel/Carousel.test.tsx index fb43fcba..f3ece4be 100644 --- a/packages/nuka/src/Carousel/Carousel.test.tsx +++ b/packages/nuka/src/Carousel/Carousel.test.tsx @@ -2,26 +2,26 @@ * @jest-environment jsdom */ -import { render } from '@testing-library/react'; -import { Carousel } from './Carousel'; -import { ExampleSlide } from './ExampleSlide'; +// import { render } from '@testing-library/react'; +// import { Carousel } from './Carousel'; +// import { ExampleSlide } from './ExampleSlide'; describe('Carousel', () => { - it('renders', () => { - render( - - - - ); - }); - it.todo('passes a className and ref for the parent'); - it.todo('passes the same className for each of the children'); + // it('renders', () => { + // render( + // + // + // + // ); + // }); + // it.todo('passes a className and ref for the parent'); + // it.todo('passes the same className for each of the children'); it.todo('is draggable through touch controls'); - it.todo('has a next and previous function that is callable from its parent'); - it.todo('can slide'); + // it.todo('has a next and previous function that is callable from its parent'); + // it.todo('can slide'); it.todo('omits slides whose children are falsy'); - it.todo('autoplays at the right rate'); + // it.todo('autoplays at the right rate'); it.todo('returns the right number of page dots'); }); From d8eb4e070ff5b5fbcb54cc805ffbcf90acd238f0 Mon Sep 17 00:00:00 2001 From: Melvin Chen Date: Mon, 26 Feb 2024 12:12:53 -0800 Subject: [PATCH 31/69] Use matrix node version --- .github/workflows/storybook-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/storybook-tests.yml b/.github/workflows/storybook-tests.yml index 26ead397..ac12c80a 100644 --- a/.github/workflows/storybook-tests.yml +++ b/.github/workflows/storybook-tests.yml @@ -8,7 +8,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: - node-version-file: '.nvmrc' + node-version: ${{ matrix.node-version }} - name: Install dependencies run: yarn - name: Install Playwright From 83c8a14ab9c88112a593fc53af46527d963173ad Mon Sep 17 00:00:00 2001 From: Melvin Chen Date: Mon, 26 Feb 2024 12:16:53 -0800 Subject: [PATCH 32/69] Use all pnpm commands for storybook-tests --- .github/workflows/storybook-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/storybook-tests.yml b/.github/workflows/storybook-tests.yml index ac12c80a..1bc9ebbf 100644 --- a/.github/workflows/storybook-tests.yml +++ b/.github/workflows/storybook-tests.yml @@ -10,7 +10,7 @@ jobs: with: node-version: ${{ matrix.node-version }} - name: Install dependencies - run: yarn + run: pnpm install - name: Install Playwright run: npx playwright install --with-deps - name: Build Storybook From a910126e619e186febc750f425bc8ffc25765754 Mon Sep 17 00:00:00 2001 From: Melvin Chen Date: Mon, 26 Feb 2024 12:17:45 -0800 Subject: [PATCH 33/69] Use all yarn commands for storybook-tests --- .github/workflows/storybook-tests.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/storybook-tests.yml b/.github/workflows/storybook-tests.yml index 1bc9ebbf..3ac6e580 100644 --- a/.github/workflows/storybook-tests.yml +++ b/.github/workflows/storybook-tests.yml @@ -10,13 +10,13 @@ jobs: with: node-version: ${{ matrix.node-version }} - name: Install dependencies - run: pnpm install + run: yarn install - name: Install Playwright run: npx playwright install --with-deps - name: Build Storybook - run: pnpm build:storybook --quiet + run: yarn build:storybook --quiet - name: Serve Storybook and run tests run: | npx concurrently -k -s first -n "SB,TEST" -c "magenta,blue" \ "npx http-server packages/nuka/storybook-static --port 6006" \ - "npx wait-on tcp:6006 && pnpm test:storybook" + "npx wait-on tcp:6006 && yarn test:storybook" From 8225b60672993e9256467cfe459e0411f62414cd Mon Sep 17 00:00:00 2001 From: Melvin Chen Date: Mon, 26 Feb 2024 12:19:41 -0800 Subject: [PATCH 34/69] Add pnpm action-steup line --- .github/workflows/storybook-tests.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/storybook-tests.yml b/.github/workflows/storybook-tests.yml index 3ac6e580..0fcf6dc1 100644 --- a/.github/workflows/storybook-tests.yml +++ b/.github/workflows/storybook-tests.yml @@ -6,17 +6,20 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 + - uses: pnpm/action-setup@v2.2.2 + with: + version: 7 - uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - name: Install dependencies - run: yarn install + run: pnpm install - name: Install Playwright run: npx playwright install --with-deps - name: Build Storybook - run: yarn build:storybook --quiet + run: pnpm build:storybook --quiet - name: Serve Storybook and run tests run: | npx concurrently -k -s first -n "SB,TEST" -c "magenta,blue" \ "npx http-server packages/nuka/storybook-static --port 6006" \ - "npx wait-on tcp:6006 && yarn test:storybook" + "npx wait-on tcp:6006 && pnpm test:storybook" From 54fc328d076e1d025a00b27f2ef573a8aaeae472 Mon Sep 17 00:00:00 2001 From: Melvin Chen Date: Mon, 26 Feb 2024 12:28:41 -0800 Subject: [PATCH 35/69] Add testing packages to devDependencies --- package.json | 10 +-- pnpm-lock.yaml | 178 ++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 160 insertions(+), 28 deletions(-) diff --git a/package.json b/package.json index 98bf0291..85ca4cea 100644 --- a/package.json +++ b/package.json @@ -38,6 +38,7 @@ "@typescript-eslint/parser": "^5.4.0", "babel-eslint": "^10.1.0", "builder": "^5.0.0", + "concurrently": "^8.2.2", "cypress": "10.3.0", "eslint": "^8.14.0", "eslint-config-prettier": "^8.5.0", @@ -46,16 +47,15 @@ "eslint-plugin-react": "^7.29.4", "eslint-plugin-react-hooks": "^4.5.0", "jest": "^28.1.3", + "playwright": "^1.41.2", "prettier": "^2.7.1", "pretty": "^2.0.0", "react": "^18.0.0", "react-dom": "^18.0.0", "shx": "^0.3.4", "start-server-and-test": "^2.0.0", - "typescript": "^4.5.2" - }, - "dependencies": { - "playwright": "^1.41.2", - "wait-on": "^7.2.0" + "typescript": "^4.5.2", + "wait-on": "^7.2.0", + "http-server": "^14.1.1" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7503a677..c26908ba 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,13 +7,6 @@ settings: importers: .: - dependencies: - playwright: - specifier: ^1.41.2 - version: 1.41.2 - wait-on: - specifier: ^7.2.0 - version: 7.2.0 devDependencies: '@babel/cli': specifier: ^7.10.4 @@ -63,6 +56,9 @@ importers: builder: specifier: ^5.0.0 version: 5.0.0 + concurrently: + specifier: ^8.2.2 + version: 8.2.2 cypress: specifier: 10.3.0 version: 10.3.0 @@ -84,9 +80,15 @@ importers: eslint-plugin-react-hooks: specifier: ^4.5.0 version: 4.6.0(eslint@8.20.0) + http-server: + specifier: ^14.1.1 + version: 14.1.1 jest: specifier: ^28.1.3 version: 28.1.3 + playwright: + specifier: ^1.41.2 + version: 1.41.2 prettier: specifier: ^2.7.1 version: 2.7.1 @@ -108,6 +110,9 @@ importers: typescript: specifier: ^4.5.2 version: 4.7.4 + wait-on: + specifier: ^7.2.0 + version: 7.2.0 packages/nuka: devDependencies: @@ -7234,6 +7239,7 @@ packages: resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} dependencies: '@hapi/hoek': 9.3.0 + dev: true /@sideway/formula@3.0.0: resolution: {integrity: sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==} @@ -10001,12 +10007,19 @@ packages: resolution: {integrity: sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==} dev: true + /async@2.6.4: + resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} + dependencies: + lodash: 4.17.21 + dev: true + /async@3.2.4: resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} dev: true /asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: true /at-least-node@1.0.0: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} @@ -10060,7 +10073,7 @@ packages: /axios@0.25.0: resolution: {integrity: sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==} dependencies: - follow-redirects: 1.15.1(debug@4.3.4) + follow-redirects: 1.15.5(debug@4.3.4) transitivePeerDependencies: - debug dev: false @@ -10068,7 +10081,7 @@ packages: /axios@0.27.2(debug@4.3.4): resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} dependencies: - follow-redirects: 1.15.1(debug@4.3.4) + follow-redirects: 1.15.5(debug@4.3.4) form-data: 4.0.0 transitivePeerDependencies: - debug @@ -10077,11 +10090,12 @@ packages: /axios@1.6.7: resolution: {integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==} dependencies: - follow-redirects: 1.15.5 + follow-redirects: 1.15.5(debug@4.3.4) form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug + dev: true /babel-core@7.0.0-bridge.0(@babel/core@7.23.2): resolution: {integrity: sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==} @@ -10433,6 +10447,13 @@ packages: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} dev: true + /basic-auth@2.0.1: + resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} + engines: {node: '>= 0.8'} + dependencies: + safe-buffer: 5.1.2 + dev: true + /batch@0.6.1: resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} @@ -11016,6 +11037,15 @@ packages: wrap-ansi: 7.0.0 dev: true + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + /clone-deep@4.0.1: resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} engines: {node: '>=6'} @@ -11091,6 +11121,7 @@ packages: engines: {node: '>= 0.8'} dependencies: delayed-stream: 1.0.0 + dev: true /comma-separated-tokens@1.0.8: resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==} @@ -11175,6 +11206,22 @@ packages: typedarray: 0.0.6 dev: true + /concurrently@8.2.2: + resolution: {integrity: sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==} + engines: {node: ^14.13.0 || >=16.0.0} + hasBin: true + dependencies: + chalk: 4.1.2 + date-fns: 2.30.0 + lodash: 4.17.21 + rxjs: 7.8.1 + shell-quote: 1.8.1 + spawn-command: 0.0.2 + supports-color: 8.1.1 + tree-kill: 1.2.2 + yargs: 17.7.2 + dev: true + /condense-newlines@0.2.1: resolution: {integrity: sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==} engines: {node: '>=0.10.0'} @@ -11299,6 +11346,11 @@ packages: /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + /corser@2.0.1: + resolution: {integrity: sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==} + engines: {node: '>= 0.4.0'} + dev: true + /cosmiconfig-typescript-loader@4.3.0(@types/node@18.7.5)(cosmiconfig@8.1.3)(ts-node@10.9.1)(typescript@4.7.4): resolution: {integrity: sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q==} engines: {node: '>=12', npm: '>=6'} @@ -11721,6 +11773,13 @@ packages: resolution: {integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==} dev: true + /date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} + dependencies: + '@babel/runtime': 7.21.0 + dev: true + /dayjs@1.11.4: resolution: {integrity: sha512-Zj/lPM5hOvQ1Bf7uAvewDaUcsJoI6JmNqmHhHl3nyumwe0XHwt8sWdOVAPACJzCebL8gQCi+K49w7iKWnGwX9g==} dev: true @@ -11912,6 +11971,7 @@ packages: /delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} + dev: true /depd@1.1.2: resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} @@ -13184,8 +13244,8 @@ packages: - encoding dev: false - /follow-redirects@1.15.1(debug@4.3.4): - resolution: {integrity: sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==} + /follow-redirects@1.15.5(debug@4.3.4): + resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -13195,15 +13255,6 @@ packages: dependencies: debug: 4.3.4(supports-color@8.1.1) - /follow-redirects@1.15.5: - resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - /for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: @@ -13301,6 +13352,7 @@ packages: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 + dev: true /forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} @@ -14072,11 +14124,34 @@ packages: engines: {node: '>=8.0.0'} dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.1(debug@4.3.4) + follow-redirects: 1.15.5(debug@4.3.4) requires-port: 1.0.0 transitivePeerDependencies: - debug + /http-server@14.1.1: + resolution: {integrity: sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==} + engines: {node: '>=12'} + hasBin: true + dependencies: + basic-auth: 2.0.1 + chalk: 4.1.2 + corser: 2.0.1 + he: 1.2.0 + html-encoding-sniffer: 3.0.0 + http-proxy: 1.18.1 + mime: 1.6.0 + minimist: 1.2.8 + opener: 1.5.2 + portfinder: 1.0.32 + secure-compare: 3.0.1 + union: 0.5.0 + url-join: 4.0.1 + transitivePeerDependencies: + - debug + - supports-color + dev: true + /http-signature@1.3.6: resolution: {integrity: sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==} engines: {node: '>=0.10'} @@ -15771,6 +15846,7 @@ packages: '@sideway/address': 4.1.5 '@sideway/formula': 3.0.1 '@sideway/pinpoint': 2.0.0 + dev: true /joi@17.6.0: resolution: {integrity: sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw==} @@ -16906,7 +16982,6 @@ packages: /opener@1.5.2: resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} hasBin: true - dev: false /optionator@0.8.3: resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} @@ -17290,6 +17365,7 @@ packages: resolution: {integrity: sha512-VaTvwCA4Y8kxEe+kfm2+uUUw5Lubf38RxF7FpBxLPmGe5sdNkSg5e3ChEigaGrX7qdqT3pt2m/98LiyvU2x6CA==} engines: {node: '>=16'} hasBin: true + dev: true /playwright@1.41.2: resolution: {integrity: sha512-v0bOa6H2GJChDL8pAeLa/LZC4feoAMbSQm1/jF/ySsWWoaNItvrMP7GEkvEEFyCTUYKMxjQKaTSg5up7nR6/8A==} @@ -17299,6 +17375,7 @@ packages: playwright-core: 1.41.2 optionalDependencies: fsevents: 2.3.2 + dev: true /polished@4.2.2: resolution: {integrity: sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ==} @@ -17307,6 +17384,17 @@ packages: '@babel/runtime': 7.21.0 dev: true + /portfinder@1.0.32: + resolution: {integrity: sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==} + engines: {node: '>= 0.12.0'} + dependencies: + async: 2.6.4 + debug: 3.2.7(supports-color@8.1.1) + mkdirp: 0.5.6 + transitivePeerDependencies: + - supports-color + dev: true + /possible-typed-array-names@1.0.0: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} @@ -17965,6 +18053,7 @@ packages: /proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: true /ps-tree@1.2.0: resolution: {integrity: sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==} @@ -18948,6 +19037,7 @@ packages: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} dependencies: tslib: 2.4.0 + dev: true /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} @@ -19016,6 +19106,10 @@ packages: kind-of: 6.0.3 dev: false + /secure-compare@3.0.1: + resolution: {integrity: sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==} + dev: true + /select-hose@2.0.0: resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} @@ -19205,6 +19299,10 @@ packages: resolution: {integrity: sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==} dev: false + /shell-quote@1.8.1: + resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + dev: true + /shelljs@0.8.5: resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} engines: {node: '>=4'} @@ -19375,6 +19473,10 @@ packages: /space-separated-tokens@1.1.5: resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} + /spawn-command@0.0.2: + resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==} + dev: true + /spawn-wrap@2.0.0: resolution: {integrity: sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==} engines: {node: '>=8'} @@ -20425,6 +20527,13 @@ packages: vfile: 4.2.1 dev: false + /union@0.5.0: + resolution: {integrity: sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==} + engines: {node: '>= 0.8.0'} + dependencies: + qs: 6.11.0 + dev: true + /unique-string@2.0.0: resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} engines: {node: '>=8'} @@ -20571,6 +20680,10 @@ packages: dependencies: punycode: 2.1.1 + /url-join@4.0.1: + resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} + dev: true + /url-loader@4.1.1(file-loader@6.2.0)(webpack@5.77.0): resolution: {integrity: sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==} engines: {node: '>= 10.13.0'} @@ -20846,6 +20959,7 @@ packages: rxjs: 7.8.1 transitivePeerDependencies: - debug + dev: true /wait-port@0.2.14: resolution: {integrity: sha512-kIzjWcr6ykl7WFbZd0TMae8xovwqcqbx6FM9l+7agOgUByhzdjfzZBPK2CPufldTOMxbUivss//Sh9MFawmPRQ==} @@ -21569,6 +21683,11 @@ packages: engines: {node: '>=12'} dev: true + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true + /yargs@15.4.1: resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} engines: {node: '>=8'} @@ -21612,6 +21731,19 @@ packages: yargs-parser: 21.0.1 dev: true + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: true + /yauzl@2.10.0: resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} dependencies: From e1ad237b21db3d340ef524bd6a1dad1e4ad80401 Mon Sep 17 00:00:00 2001 From: Melvin Chen Date: Mon, 26 Feb 2024 12:35:14 -0800 Subject: [PATCH 36/69] Fix indefinite hang on wait --- .github/workflows/storybook-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/storybook-tests.yml b/.github/workflows/storybook-tests.yml index 0fcf6dc1..e7226a98 100644 --- a/.github/workflows/storybook-tests.yml +++ b/.github/workflows/storybook-tests.yml @@ -22,4 +22,4 @@ jobs: run: | npx concurrently -k -s first -n "SB,TEST" -c "magenta,blue" \ "npx http-server packages/nuka/storybook-static --port 6006" \ - "npx wait-on tcp:6006 && pnpm test:storybook" + "npx wait-on tcp:127.0.0.1:6006 && pnpm test:storybook" From 638b378f4a0dd36823f28e86ebb620d616a0adc2 Mon Sep 17 00:00:00 2001 From: Melvin Chen Date: Mon, 26 Feb 2024 15:53:27 -0800 Subject: [PATCH 37/69] Remove cypress tests, remove cypress workflow, add to storybook interaction tests --- .github/workflows/cypress.yml | 53 ------------ package.json | 4 - .../nuka/cypress/e2e/standard-carousel.cy.ts | 62 -------------- .../cypress/e2e/swipe-gestures-carousel.cy.ts | 59 ------------- .../cypress/e2e/wrap-around-carousel.cy.ts | 54 ------------ packages/nuka/cypress/fixtures/example.json | 5 -- packages/nuka/cypress/plugins/index.ts | 22 ----- packages/nuka/cypress/support/commands.ts | 25 ------ packages/nuka/cypress/support/e2e.ts | 85 ------------------- packages/nuka/cypress/support/util.ts | 31 ------- packages/nuka/cypress/tsconfig.json | 8 -- .../src/Carousel/CarouselTests.stories.tsx | 15 +++- 12 files changed, 13 insertions(+), 410 deletions(-) delete mode 100644 .github/workflows/cypress.yml delete mode 100644 packages/nuka/cypress/e2e/standard-carousel.cy.ts delete mode 100644 packages/nuka/cypress/e2e/swipe-gestures-carousel.cy.ts delete mode 100644 packages/nuka/cypress/e2e/wrap-around-carousel.cy.ts delete mode 100644 packages/nuka/cypress/fixtures/example.json delete mode 100644 packages/nuka/cypress/plugins/index.ts delete mode 100644 packages/nuka/cypress/support/commands.ts delete mode 100644 packages/nuka/cypress/support/e2e.ts delete mode 100644 packages/nuka/cypress/support/util.ts delete mode 100644 packages/nuka/cypress/tsconfig.json diff --git a/.github/workflows/cypress.yml b/.github/workflows/cypress.yml deleted file mode 100644 index 1c1fc1ec..00000000 --- a/.github/workflows/cypress.yml +++ /dev/null @@ -1,53 +0,0 @@ -name: Cypress Tests - -on: - push: - branches: - - main - pull_request: - branches: - - main - - -jobs: - cypress-run: - runs-on: ubuntu-latest - container: - image: cypress/browsers:node16.16.0-chrome107-ff107 - options: --user 1001 - - steps: - - name: Checkout - uses: actions/checkout@v2 - - - uses: pnpm/action-setup@v2.2.2 - with: - version: 7 - - - uses: actions/setup-node@v2 - with: - node-version: ${{ matrix.node-version }} - - - name: Install dependencies - run: pnpm install - - - name: Build nuka-carousel - run: pnpm build - - - name: Install the Cypress binary - run: npx cypress install - - # - name: Cypress run - # run: pnpm run test:ci-with-server - - - uses: actions/upload-artifact@v3 - if: failure() - with: - name: cypress-screenshots - path: ./packages/nuka/cypress/screenshots - - - uses: actions/upload-artifact@v3 - if: always() - with: - name: cypress-videos - path: ./packages/nuka/cypress/videos diff --git a/package.json b/package.json index 85ca4cea..f721e852 100644 --- a/package.json +++ b/package.json @@ -10,10 +10,6 @@ "lint:fix": "pnpm run --parallel lint --fix", "start:storybook": "pnpm run --filter nuka-carousel storybook", "start:website": "pnpm run --filter website start", - "test": "pnpm run -r test", - "test:ci": "pnpm run -r test:ci", - "test:ci-with-server": "start-server-and-test start:website http://localhost:3000 test:ci", - "test:storybook-with-server": "start-server-and-test start:storybook http://localhost:3000 test:storybook", "test:storybook": "pnpm run --filter nuka-carousel test:storybook", "check": "pnpm run lint", "check:ci": "pnpm run check", diff --git a/packages/nuka/cypress/e2e/standard-carousel.cy.ts b/packages/nuka/cypress/e2e/standard-carousel.cy.ts deleted file mode 100644 index 270dd172..00000000 --- a/packages/nuka/cypress/e2e/standard-carousel.cy.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { assertVisibleSlide, navigateToNextSlide } from '../support/util'; - -describe('Standard Carousel', () => { - const stdDemoSel = '.standard-demo '; - - it('should render carousel with 5 slides and only 1 visible slide and go through all of the slides', () => { - cy.visitCarousel(); - - cy.get(stdDemoSel + '.slider-container').should( - 'have.attr', - 'aria-label', - 'Carousel Demo' - ); - - assertVisibleSlide(stdDemoSel, 1); - - cy.get(stdDemoSel + '.paging-item').should('have.length', 5); - - cy.get(stdDemoSel + 'button[aria-label="Go to previous slide"]').should( - 'be.disabled' - ); - - /** - * Navigate through the entire carousel and verify the buttons - * are enabled until the last slide. - */ - - navigateToNextSlide(stdDemoSel); - assertVisibleSlide(stdDemoSel, 2); - - navigateToNextSlide(stdDemoSel); - assertVisibleSlide(stdDemoSel, 3); - - navigateToNextSlide(stdDemoSel); - assertVisibleSlide(stdDemoSel, 4); - - navigateToNextSlide(stdDemoSel); - assertVisibleSlide(stdDemoSel, 5); - - cy.get(stdDemoSel + 'button[aria-label="Go to next slide"]').should( - 'be.disabled' - ); - }); - - it('should be a landmark region', () => { - const params = { - carouselId: 'region-carousel', - landmark: true, - }; - - const url = `http://localhost:3000/open-source/nuka-carousel?params='${JSON.stringify( - params - )}'`; - - cy.visit(url); - - cy.get(stdDemoSel + '.slider-container') - .should('have.attr', 'aria-label', 'Carousel Demo') - .should('have.attr', 'role', 'region') - .and('have.attr', 'aria-roledescription', 'carousel'); - }); -}); diff --git a/packages/nuka/cypress/e2e/swipe-gestures-carousel.cy.ts b/packages/nuka/cypress/e2e/swipe-gestures-carousel.cy.ts deleted file mode 100644 index 8ead0036..00000000 --- a/packages/nuka/cypress/e2e/swipe-gestures-carousel.cy.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { assertVisibleSlide } from '../support/util'; - -describe('Swipe Carousel', () => { - const carouselWidth = 750; - const stdDemoSel = '.standard-demo '; - - it('should navigate the carousel using swipe gestures', () => { - const distance = carouselWidth / 2; - - cy.visitCarousel(); - - assertVisibleSlide(stdDemoSel, 1); - - cy.swipeSlider(stdDemoSel, distance); - assertVisibleSlide(stdDemoSel, 2); - - cy.swipeSlider(stdDemoSel, distance); - assertVisibleSlide(stdDemoSel, 3); - - cy.swipeSlider(stdDemoSel, -distance); - assertVisibleSlide(stdDemoSel, 2); - }); - - it('should not navigate the carousel using incomplete swipe gestures', () => { - cy.visitCarousel(); - - assertVisibleSlide(stdDemoSel, 1); - - /** - * An incomplete gesture at a standard intertia should not navigate to the next slide - */ - cy.swipeSlider(stdDemoSel, carouselWidth / 4); - assertVisibleSlide(stdDemoSel, 1); - - cy.swipeSlider(stdDemoSel, carouselWidth / 2); - assertVisibleSlide(stdDemoSel, 2); - - /** - * An incomplete gesture at a standard intertia should not navigate to the previous slide - */ - cy.swipeSlider(stdDemoSel, -carouselWidth / 4); - assertVisibleSlide(stdDemoSel, 2); - }); - - it('should navigate the carousel small quick gestures', () => { - cy.visitCarousel(); - - assertVisibleSlide(stdDemoSel, 1); - - cy.swipeSlider(stdDemoSel, carouselWidth / 4, { waitMs: 90 }); - assertVisibleSlide(stdDemoSel, 2); - - /** - * Perform a reverse swipe to verify it works going backwards - */ - cy.swipeSlider(stdDemoSel, -carouselWidth / 4, { waitMs: 90 }); - assertVisibleSlide(stdDemoSel, 1); - }); -}); diff --git a/packages/nuka/cypress/e2e/wrap-around-carousel.cy.ts b/packages/nuka/cypress/e2e/wrap-around-carousel.cy.ts deleted file mode 100644 index e7bae648..00000000 --- a/packages/nuka/cypress/e2e/wrap-around-carousel.cy.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { - assertVisibleSlide, - navigateToNextSlide, - navigateToPreviousSlide, -} from '../support/util'; - -describe('Wrap-Around Carousel', () => { - const waDemoSel = '.wrap-around-demo '; - - it('should render carousel with 5 slides and only 1 visible slide and go through all of the slides', () => { - cy.visitCarousel(); - - cy.get('li').contains('Wrap Around').click(); - - cy.get(waDemoSel + '.slider-container').should( - 'have.attr', - 'aria-label', - 'Carousel Demo' - ); - - assertVisibleSlide(waDemoSel, 1); - - cy.get(waDemoSel + '.paging-item').should('have.length', 5); - - /** - * Click through to the final slide and verify it shows - * and the next button is still enabled. - */ - - cy.get(waDemoSel + 'button[aria-label="Go to previous slide"]').should( - 'be.not.disabled' - ); - navigateToNextSlide(waDemoSel); - navigateToNextSlide(waDemoSel); - navigateToNextSlide(waDemoSel); - navigateToNextSlide(waDemoSel); - assertVisibleSlide(waDemoSel, 5); - - /** - * Click next slide to see if it can go from 5 -> 1 - * and the next previous is still enabled. - */ - - navigateToNextSlide(waDemoSel); - assertVisibleSlide(waDemoSel, 1); - - /** - * Click previous slide to see if it can go from 1 -> 5 again - */ - - navigateToPreviousSlide(waDemoSel); - assertVisibleSlide(waDemoSel, 5); - }); -}); diff --git a/packages/nuka/cypress/fixtures/example.json b/packages/nuka/cypress/fixtures/example.json deleted file mode 100644 index 02e42543..00000000 --- a/packages/nuka/cypress/fixtures/example.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "name": "Using fixtures to represent data", - "email": "hello@cypress.io", - "body": "Fixtures are a great way to mock data for responses to routes" -} diff --git a/packages/nuka/cypress/plugins/index.ts b/packages/nuka/cypress/plugins/index.ts deleted file mode 100644 index 258d858a..00000000 --- a/packages/nuka/cypress/plugins/index.ts +++ /dev/null @@ -1,22 +0,0 @@ -// / -// *********************************************************** -// This example plugins/index.js can be used to load plugins -// -// You can change the location of this file or turn off loading -// the plugins file with the 'pluginsFile' configuration option. -// -// You can read more here: -// https://on.cypress.io/plugins-guide -// *********************************************************** - -// This function is called when a project is opened or re-opened (e.g. due to -// the project's config changing) - -/** - * @type {Cypress.PluginConfig} - */ -// eslint-disable-next-line @typescript-eslint/no-unused-vars -module.exports = (on, config) => { - // `on` is used to hook into various events Cypress emits - // `config` is the resolved Cypress config -}; diff --git a/packages/nuka/cypress/support/commands.ts b/packages/nuka/cypress/support/commands.ts deleted file mode 100644 index 119ab03f..00000000 --- a/packages/nuka/cypress/support/commands.ts +++ /dev/null @@ -1,25 +0,0 @@ -// *********************************************** -// This example commands.js shows you how to -// create various custom commands and overwrite -// existing commands. -// -// For more comprehensive examples of custom -// commands please read more here: -// https://on.cypress.io/custom-commands -// *********************************************** -// -// -// -- This is a parent command -- -// Cypress.Commands.add('login', (email, password) => { ... }) -// -// -// -- This is a child command -- -// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... }) -// -// -// -- This is a dual command -- -// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... }) -// -// -// -- This will overwrite an existing command -- -// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) diff --git a/packages/nuka/cypress/support/e2e.ts b/packages/nuka/cypress/support/e2e.ts deleted file mode 100644 index 714ec844..00000000 --- a/packages/nuka/cypress/support/e2e.ts +++ /dev/null @@ -1,85 +0,0 @@ -// *********************************************************** -// This example support/index.js is processed and -// loaded automatically before your test files. -// -// This is a great place to put global configuration and -// behavior that modifies Cypress. -// -// You can change the location of this file or turn off -// automatically serving support files with the -// 'supportFile' configuration option. -// -// You can read more here: -// https://on.cypress.io/configuration -// *********************************************************** - -// Import commands.js using ES2015 syntax: -import './commands'; - -// Alternatively you can use CommonJS syntax: -// require('./commands') - -// Custom command typings, based on documentation at -// https://docs.cypress.io/guides/tooling/typescript-support#Types-for-Custom-Commands -declare global { - // eslint-disable-next-line @typescript-eslint/no-namespace - namespace Cypress { - interface Chainable { - /** - * Opens the dev site with a carousel set to the designated props. - */ - visitCarousel(): ReturnType; - /** - * Simulates a swipe gesture on the carousel - * @param distance - the distance (px) to swipe from right to left (or - * left to right if negative) - */ - swipeSlider( - selector: string, - distance: number, - options?: { waitMs?: number } - ): ReturnType; - } - } -} - -Cypress.Commands.add('visitCarousel', () => { - cy.visit(`http://localhost:3000/open-source/nuka-carousel`); -}); - -Cypress.Commands.add( - 'swipeSlider', - (selector: string, distance, { waitMs = 1000 } = {}) => { - const [start, end] = - distance >= 0 ? [distance, 0] : [0, Math.abs(distance)]; - - // Mock out the Date object so we can precisely simulate gesture event - // timing. Cypress' timing is too flaky due to its UI checks to be reliable - // on the millisecond level. - cy.clock(Date.UTC(2018, 10, 30), ['Date']); - - cy.get(selector + '.slider-container') - .trigger('mousedown', { which: 1 }) - .trigger('mousemove', { clientX: start }) - .then(function () { - this.clock.tick(waitMs - 1); - }) - .trigger('mousemove', { - // Add in one extra move event prior to the final one to fill the - // position buffer used to calculate inertia, so that calls with waitMs - // longer than 100ms (the maximum the position buffer keeps) will get - // proper velocity calculations. We use linear interpolation to - // determine a point that is consistent with a swipe of constant speed - // from start to end. - clientX: start + ((waitMs - 1) / waitMs) * (end - start), - }) - .then(function () { - this.clock.tick(1); - }) - .trigger('mousemove', { clientX: end }) - .trigger('mouseup') - .then(function () { - this.clock.restore(); - }); - } -); diff --git a/packages/nuka/cypress/support/util.ts b/packages/nuka/cypress/support/util.ts deleted file mode 100644 index 6e2ba76f..00000000 --- a/packages/nuka/cypress/support/util.ts +++ /dev/null @@ -1,31 +0,0 @@ -/* eslint-disable cypress/no-unnecessary-waiting */ -const waitThreshold = 100; - -export const assertVisibleSlide = (demoId: string, slideNumber: number) => { - cy.get(demoId + '.slide.slide-visible') - .should('have.length', 1) - .find('div') - .should('have.attr', 'data-slide', `Slide ${slideNumber}`); -}; - -export const navigateToNextSlide = (demoId: string) => { - cy.get(demoId + 'button[aria-label="Go to next slide"]') - .should('not.be.disabled') - .click(); - cy.wait(waitThreshold); -}; - -export const navigateToPreviousSlide = (demoId: string) => { - cy.get(demoId + 'button[aria-label="Go to previous slide"]') - .should('not.be.disabled') - .click(); - cy.wait(waitThreshold); -}; - -export const getSliderXOffset = ($sliderList: JQuery) => { - const parentElementOffset = - $sliderList[0].parentElement.getBoundingClientRect().left; - const sliderListOffset = $sliderList[0].getBoundingClientRect().left; - - return sliderListOffset - parentElementOffset; -}; diff --git a/packages/nuka/cypress/tsconfig.json b/packages/nuka/cypress/tsconfig.json deleted file mode 100644 index 18edb199..00000000 --- a/packages/nuka/cypress/tsconfig.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "compilerOptions": { - "target": "es5", - "lib": ["es5", "dom"], - "types": ["cypress", "node"] - }, - "include": ["**/*.ts"] -} diff --git a/packages/nuka/src/Carousel/CarouselTests.stories.tsx b/packages/nuka/src/Carousel/CarouselTests.stories.tsx index 2093697e..91c1b4ff 100644 --- a/packages/nuka/src/Carousel/CarouselTests.stories.tsx +++ b/packages/nuka/src/Carousel/CarouselTests.stories.tsx @@ -90,6 +90,8 @@ export const Slide: Story = { play: async ({ canvasElement }) => { const canvas = within(canvasElement); + const overflow = canvas.getByTestId('overflow'); + await expect(canvas.getByTestId('wrapper').classList).toContain( 'slide__with-gap' ); @@ -98,9 +100,9 @@ export const Slide: Story = { await userEvent.click(forwardButton); await waitFor(async () => { - expect(canvas.getByTestId('overflow').scrollLeft).toEqual( + expect(overflow.scrollLeft).toEqual( (canvas.getByTestId('wrapper').children[1] as HTMLElement).offsetLeft - - canvas.getByTestId('overflow').offsetLeft + overflow.offsetLeft ); }); @@ -112,6 +114,15 @@ export const Slide: Story = { canvas.getByTestId('overflow').offsetLeft ); }); + + overflow.scrollBy({ left: 1000000, behavior: 'instant' }); + + setTimeout(async () => { + await userEvent.click(forwardButton); + await waitFor(async () => { + expect(canvas.getByTestId('overflow').scrollLeft).toEqual(0); + }); + }, 300); }, }; From bcf2cf1ec420fdbccd90422ba96855ed526d21f0 Mon Sep 17 00:00:00 2001 From: Melvin Chen Date: Wed, 28 Feb 2024 11:02:48 -0800 Subject: [PATCH 38/69] Upgrade node versions, remove side effect, use named exports --- .github/workflows/storybook-tests.yml | 8 ++++---- packages/nuka/package.json | 2 +- packages/nuka/src/index.tsx | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/storybook-tests.yml b/.github/workflows/storybook-tests.yml index e7226a98..5bd0d425 100644 --- a/.github/workflows/storybook-tests.yml +++ b/.github/workflows/storybook-tests.yml @@ -5,13 +5,13 @@ jobs: timeout-minutes: 60 runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: pnpm/action-setup@v2.2.2 + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v3.0.0 with: version: 7 - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 with: - node-version: ${{ matrix.node-version }} + node-version: 18.x - name: Install dependencies run: pnpm install - name: Install Playwright diff --git a/packages/nuka/package.json b/packages/nuka/package.json index e12050a3..db036764 100644 --- a/packages/nuka/package.json +++ b/packages/nuka/package.json @@ -93,7 +93,7 @@ "url": "https://github.com/FormidableLabs/nuka-carousel/issues" }, "homepage": "https://github.com/FormidableLabs/nuka-carousel", - "sideEffects": true, + "sideEffects": false, "publishConfig": { "provenance": true } diff --git a/packages/nuka/src/index.tsx b/packages/nuka/src/index.tsx index 67e81da6..012d06ae 100644 --- a/packages/nuka/src/index.tsx +++ b/packages/nuka/src/index.tsx @@ -1 +1 @@ -export { Carousel as default, SlideHandle } from './Carousel/Carousel'; +export { Carousel, SlideHandle } from './Carousel/Carousel'; From 3f4df56d0cac6297165a7b51ef277a3f9f7224ca Mon Sep 17 00:00:00 2001 From: Melvin Chen Date: Wed, 28 Feb 2024 15:00:46 -0800 Subject: [PATCH 39/69] Add side effects back in, use named export, add resize listener --- packages/nuka/package.json | 2 +- packages/nuka/src/Carousel/Carousel.tsx | 97 ++++++++++++++----------- website/src/components/demos.tsx | 2 +- 3 files changed, 55 insertions(+), 46 deletions(-) diff --git a/packages/nuka/package.json b/packages/nuka/package.json index db036764..e12050a3 100644 --- a/packages/nuka/package.json +++ b/packages/nuka/package.json @@ -93,7 +93,7 @@ "url": "https://github.com/FormidableLabs/nuka-carousel/issues" }, "homepage": "https://github.com/FormidableLabs/nuka-carousel", - "sideEffects": false, + "sideEffects": true, "publishConfig": { "provenance": true } diff --git a/packages/nuka/src/Carousel/Carousel.tsx b/packages/nuka/src/Carousel/Carousel.tsx index 48882a0f..5ecebb46 100644 --- a/packages/nuka/src/Carousel/Carousel.tsx +++ b/packages/nuka/src/Carousel/Carousel.tsx @@ -130,57 +130,66 @@ export const Carousel = forwardRef( }, [autoplay, autoplayInterval, handleScrollAction, scrollDistance]); useEffect(() => { - if (wrapperRef.current && containerRef.current) { - const wrapperCurrent = wrapperRef.current; - const containerRefOffsetLeft = containerRef.current.offsetLeft; - - const lastChild = wrapperCurrent.lastChild as HTMLElement; - const carouselTotalWidth = - lastChild.offsetLeft + - lastChild.offsetWidth - - wrapperCurrent.offsetLeft; - - let proposedPageStartIndices = []; - - if (scrollDistance === 'slide') { - proposedPageStartIndices = Array.from(wrapperCurrent.children).map( - (child) => - (child as HTMLElement).offsetLeft - containerRefOffsetLeft - ); - } else { - if (typeof scrollDistance === 'number') { - proposedPageStartIndices = Array.from( - { - length: carouselTotalWidth / scrollDistance, - }, - (_, index) => index * scrollDistance + const updateIndices = () => { + if (wrapperRef.current && containerRef.current) { + const wrapperCurrent = wrapperRef.current; + const containerRefOffsetLeft = containerRef.current.offsetLeft; + + const lastChild = wrapperCurrent.lastChild as HTMLElement; + const carouselTotalWidth = + lastChild.offsetLeft + + lastChild.offsetWidth - + wrapperCurrent.offsetLeft; + + let proposedPageStartIndices = []; + + if (scrollDistance === 'slide') { + proposedPageStartIndices = Array.from(wrapperCurrent.children).map( + (child) => + (child as HTMLElement).offsetLeft - containerRefOffsetLeft ); } else { - const arrayLength = Math.ceil( - carouselTotalWidth / wrapperCurrent.offsetWidth - ); - proposedPageStartIndices = Array.from( - { - length: arrayLength, - }, - (_, index) => { - if (index === arrayLength - 1) { - return carouselTotalWidth - wrapperCurrent.offsetWidth; + if (typeof scrollDistance === 'number') { + proposedPageStartIndices = Array.from( + { + length: carouselTotalWidth / scrollDistance, + }, + (_, index) => index * scrollDistance + ); + } else { + const arrayLength = Math.ceil( + carouselTotalWidth / wrapperCurrent.offsetWidth + ); + proposedPageStartIndices = Array.from( + { + length: arrayLength, + }, + (_, index) => { + if (index === arrayLength - 1) { + return carouselTotalWidth - wrapperCurrent.offsetWidth; + } + return wrapperCurrent.offsetWidth * index; } - return wrapperCurrent.offsetWidth * index; - } - ); + ); + } } + + const lastIndexInView = + findLastIndex( + proposedPageStartIndices, + (index) => index < carouselTotalWidth - wrapperCurrent.offsetWidth + ) + 2; + + setPageStartIndices( + proposedPageStartIndices.slice(0, lastIndexInView) + ); } + }; - const lastIndexInView = - findLastIndex( - proposedPageStartIndices, - (index) => index < carouselTotalWidth - wrapperCurrent.offsetWidth - ) + 2; + window.addEventListener('resize', updateIndices); + updateIndices(); - setPageStartIndices(proposedPageStartIndices.slice(0, lastIndexInView)); - } + return () => window.removeEventListener('resize', updateIndices); }, [scrollDistance, wrapperRef, containerRef]); const getCurrentPageIndex = useCallback(() => { diff --git a/website/src/components/demos.tsx b/website/src/components/demos.tsx index be9e063d..8fc41379 100644 --- a/website/src/components/demos.tsx +++ b/website/src/components/demos.tsx @@ -1,5 +1,5 @@ import React, { useRef } from 'react'; -import Carousel, { SlideHandle } from 'nuka-carousel'; +import { Carousel, SlideHandle } from 'nuka-carousel'; import { generateCards } from '@site/src/components/cards'; type scrollDistanceType = number | 'slide' | 'screen'; From 2ab32e10514a9f33d3910ea4ffdc4d31c32b2ff8 Mon Sep 17 00:00:00 2001 From: Melvin Chen Date: Thu, 29 Feb 2024 10:32:59 -0800 Subject: [PATCH 40/69] Add before/after slide hooks, docs, and tests --- docs/api/options.mdx | 37 ++++++++++++++ docs/v8-upgrade-guide.mdx | 24 +++++---- .../nuka/src/Carousel/Carousel.stories.tsx | 26 ++++++++++ packages/nuka/src/Carousel/Carousel.tsx | 12 ++++- .../src/Carousel/CarouselTests.stories.tsx | 50 ++++++++++++++++++- 5 files changed, 136 insertions(+), 13 deletions(-) diff --git a/docs/api/options.mdx b/docs/api/options.mdx index 39749641..b65d7ce4 100644 --- a/docs/api/options.mdx +++ b/docs/api/options.mdx @@ -116,3 +116,40 @@ By default, this wrapper has `display: flex` applied. ### Example + +--- + +## Before/After Slide + +Functions that are invoked when the progression methods (goBack()/goForward()) are called or when carousel changes its scroll position. + +### Details + +| Prop Name | Type | Default Value | +| :------------ | :--------- | :------------ | +| `beforeSlide` | () => void | `undefined` | +| `afterSlide` | () => void | `undefined` | + +beforeSlide: Runs a given function before scrolling when a progression method is called. It will also run right before the carousel registers that it has been scrolled on if manually scrolled. + +afterSlide: Runs a given function after scrolling when a progression method is called or after manually scrolling. + +### Example + +This is a code usage example. Docusaurus will not run passed functions because the components are converted to static HTML at build time. + +```tsx + { + myCustomBeforeFunction(); + }} +/> +``` + +```tsx + { + myCustomAfterFunction(); + }} +/> +``` diff --git a/docs/v8-upgrade-guide.mdx b/docs/v8-upgrade-guide.mdx index 51ba5dea..45b2377a 100644 --- a/docs/v8-upgrade-guide.mdx +++ b/docs/v8-upgrade-guide.mdx @@ -20,6 +20,12 @@ Nuka v8 and above are completely rewritten with new props and might not be compl `wrapperClassName` +## Changed Props + +`afterSlide` + +`beforeSlide` - implemented with some changes from v7 + Read more about how to use them in the API (v8+) pages. --- @@ -82,22 +88,18 @@ Nuka v8 and above are completely rewritten with new props and might not be compl These v7 and below props are being worked on or are considered for v8. -`afterSlide` - -`beforeSlide` - -`disableEdgeSwiping` +`disableEdgeSwiping` - This might just be covered natively by browser/os. Not entirely sure yet. -`frameAriaLabel` +`frameAriaLabel` - would like to do sweeping functionality and docs update for all accessibility things -`onDragStart` +`onDragStart` - in theory should be the same as `beforeSlide` but the debounce is too late for manual scrolling for this to really be effective. -`onDrag` +`onDrag` - considering the use case for this, this would involve writing a shorter debounce on a useEffect that runs this function every time the scrollIndex changes. -`onDragEnd` +`onDragEnd` - in theory should be the same as `afterSlide` since dragging with a touch device will trigger `afterSlide` after the scroll listening debounce ends. -`onUserNavigation` +`onUserNavigation` - would like to do sweeping functionality and docs update for all accessibility things -`pauseOnHover` +`pauseOnHover` - not implemented, not documented. `wrapAround` - right now, you can wrap the the front but it won't infinitely scroll like in v7. diff --git a/packages/nuka/src/Carousel/Carousel.stories.tsx b/packages/nuka/src/Carousel/Carousel.stories.tsx index 4351c47d..22dc73b5 100644 --- a/packages/nuka/src/Carousel/Carousel.stories.tsx +++ b/packages/nuka/src/Carousel/Carousel.stories.tsx @@ -174,3 +174,29 @@ export const GoToIndex: Story = { ), }, }; + +export const BeforeSlide: Story = { + args: { + beforeSlide: () => alert('Function was called before scroll occurred '), + children: ( + <> + {[...Array(10)].map((_, index) => ( + + ))} + + ), + }, +}; + +export const AfterSlide: Story = { + args: { + afterSlide: () => alert('Function was called after scroll occurred '), + children: ( + <> + {[...Array(10)].map((_, index) => ( + + ))} + + ), + }, +}; diff --git a/packages/nuka/src/Carousel/Carousel.tsx b/packages/nuka/src/Carousel/Carousel.tsx index 5ecebb46..0c314e08 100644 --- a/packages/nuka/src/Carousel/Carousel.tsx +++ b/packages/nuka/src/Carousel/Carousel.tsx @@ -24,6 +24,8 @@ export type CarouselProps = { pageIndicatorClassName?: string; containerClassName?: string; }; + beforeSlide?: () => void; + afterSlide?: () => void; }; export type SlideHandle = { @@ -55,6 +57,8 @@ export const Carousel = forwardRef( autoplayInterval = 3000, showPageIndicators = false, pageIndicatorProps, + beforeSlide, + afterSlide, }: CarouselProps, ref ) => { @@ -66,9 +70,15 @@ export const Carousel = forwardRef( const containerRef = useRef(null); const wrapperRef = useRef(null); + const isFirstRender = useRef(true); + useEffect(() => { - if (containerRef.current) { + if (isFirstRender.current) { + isFirstRender.current = false; + } else if (containerRef.current) { + beforeSlide && beforeSlide(); containerRef.current.scroll(currentScrollIndex, 0); + afterSlide && setTimeout(() => afterSlide(), 0); } }, [currentScrollIndex]); diff --git a/packages/nuka/src/Carousel/CarouselTests.stories.tsx b/packages/nuka/src/Carousel/CarouselTests.stories.tsx index 91c1b4ff..ef2fb15e 100644 --- a/packages/nuka/src/Carousel/CarouselTests.stories.tsx +++ b/packages/nuka/src/Carousel/CarouselTests.stories.tsx @@ -1,6 +1,6 @@ import type { Meta, StoryObj } from '@storybook/react'; import { within, waitFor, userEvent } from '@storybook/testing-library'; -import { expect } from '@storybook/jest'; +import { expect, jest } from '@storybook/jest'; import { Carousel, CarouselProps, SlideHandle } from './Carousel'; import { useRef } from 'react'; import { ExampleSlide, FullWidthSlide } from './ExampleSlide'; @@ -233,3 +233,51 @@ export const PageIndicators: Story = { }); }, }; + +const beforeFn = jest.fn(); + +export const BeforeSlide: Story = { + args: { + beforeSlide: beforeFn, + children: ( + <> + {[...Array(10)].map((_, index) => ( + + ))} + + ), + }, + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + expect(beforeFn).not.toHaveBeenCalled(); + + const forwardButton = canvas.getByText('next'); + await userEvent.click(forwardButton); + await expect(beforeFn).toHaveBeenCalled(); + }, +}; + +const afterFn = jest.fn(); +export const AfterSlide: Story = { + args: { + afterSlide: afterFn, + children: ( + <> + {[...Array(10)].map((_, index) => ( + + ))} + + ), + }, + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + expect(afterFn).not.toHaveBeenCalled(); + + const forwardButton = canvas.getByText('next'); + userEvent.click(forwardButton); + expect(afterFn).not.toHaveBeenCalled(); // should not be immediately called + await waitFor(async () => { + await expect(afterFn).toHaveBeenCalled(); + }); + }, +}; From 9bd5d8ea0586698ee6993e7dd5fb2861ca0d0ff4 Mon Sep 17 00:00:00 2001 From: Melvin Chen Date: Thu, 29 Feb 2024 11:49:40 -0800 Subject: [PATCH 41/69] Add missing useeffect dependencies --- packages/nuka/src/Carousel/Carousel.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nuka/src/Carousel/Carousel.tsx b/packages/nuka/src/Carousel/Carousel.tsx index 0c314e08..443a360c 100644 --- a/packages/nuka/src/Carousel/Carousel.tsx +++ b/packages/nuka/src/Carousel/Carousel.tsx @@ -80,7 +80,7 @@ export const Carousel = forwardRef( containerRef.current.scroll(currentScrollIndex, 0); afterSlide && setTimeout(() => afterSlide(), 0); } - }, [currentScrollIndex]); + }, [currentScrollIndex, beforeSlide, afterSlide]); useEffect(() => { const handleDebounce = setTimeout(() => { From bc368179002a06e76668930f0ccd53a7282c870e Mon Sep 17 00:00:00 2001 From: Melvin Chen Date: Thu, 29 Feb 2024 14:52:49 -0800 Subject: [PATCH 42/69] Rename prop type to capital, Remove buttons by default on demos, add code examples into docs --- docs/api/methods.mdx | 23 +++++++-- docs/api/options.mdx | 69 ++++++++++++++++++++----- packages/nuka/src/Carousel/Carousel.tsx | 4 +- website/src/components/demos.tsx | 19 ++++--- 4 files changed, 89 insertions(+), 26 deletions(-) diff --git a/docs/api/methods.mdx b/docs/api/methods.mdx index 702aac01..b5f8a826 100644 --- a/docs/api/methods.mdx +++ b/docs/api/methods.mdx @@ -20,9 +20,6 @@ const MyComponent = () => { return (
... - - -
); }; @@ -45,3 +42,23 @@ Advances the carousel backward by the given `scrollDistance`. ### Usage/Examples + +#### Code + +```tsx title="MyComponent.tsx" +import { useRef } from 'react'; +import Carousel, { SlideHandle } from 'nuka-carousel'; + +const MyComponent = () => { + const ref = useRef(null); + + return ( +
+ ... + + + +
+ ); +}; +``` diff --git a/docs/api/options.mdx b/docs/api/options.mdx index b65d7ce4..e988b568 100644 --- a/docs/api/options.mdx +++ b/docs/api/options.mdx @@ -5,6 +5,7 @@ sidebar_position: 1 import { BasicDemo } from '../../website/src/components/demos'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; # Options @@ -23,6 +24,14 @@ The carousel can advance on its own with a specified interval measured in millis +#### Code + +```tsx + + {/* Cards */} + +``` + --- ## Scroll @@ -48,19 +57,38 @@ Using "screen" will advance the carousel by the width of the visible carousel. update on the widths of the slides so you can have multiple widths for each slide.

- + +

Code

+ {`{/* Cards */}`} +

Scroll by a fixed distance measured in px. This example scrolls by 100px.

- + +

Code

+ {`{/* Cards */}`}

Scroll by the width of the "screen" or the container the carousel is in.

- + +

Code

+ {`{/* Cards */}`}
@@ -99,6 +127,23 @@ Indicators that show what page the carousel is on. These pages are calculated fr scrollDistance="screen" /> +#### Code + +```tsx + + {/* Cards */} + +``` + --- ## Wrapper Styling @@ -117,6 +162,12 @@ By default, this wrapper has `display: flex` applied. +#### Code + +```tsx +{/* Cards */} +``` + --- ## Before/After Slide @@ -139,17 +190,9 @@ afterSlide: Runs a given function after scrolling when a progression method is c This is a code usage example. Docusaurus will not run passed functions because the components are converted to static HTML at build time. ```tsx - { - myCustomBeforeFunction(); - }} -/> + myCustomBeforeFunction()}>{/* Cards */} ``` ```tsx - { - myCustomAfterFunction(); - }} -/> + myCustomAfterFunction()}>{/* Cards */} ``` diff --git a/packages/nuka/src/Carousel/Carousel.tsx b/packages/nuka/src/Carousel/Carousel.tsx index 443a360c..72eb48f9 100644 --- a/packages/nuka/src/Carousel/Carousel.tsx +++ b/packages/nuka/src/Carousel/Carousel.tsx @@ -10,11 +10,11 @@ import { import './Carousel.css'; import { PageIndicators } from '../PageIndicators/PageIndicators'; -type scrollDistanceType = number | 'slide' | 'screen'; +type ScrollDistanceType = number | 'slide' | 'screen'; export type CarouselProps = { children: ReactNode; - scrollDistance?: scrollDistanceType; + scrollDistance?: ScrollDistanceType; wrapperClassName?: string; autoplay?: boolean; autoplayInterval?: number; diff --git a/website/src/components/demos.tsx b/website/src/components/demos.tsx index 8fc41379..7659832e 100644 --- a/website/src/components/demos.tsx +++ b/website/src/components/demos.tsx @@ -26,6 +26,7 @@ export const BasicDemo = ({ showPageIndicators, pageIndicatorProps, wrapperClassName, + showForwardBackButtons, className = '', }: Props) => { const ref = useRef(null); @@ -43,14 +44,16 @@ export const BasicDemo = ({ {generateCards()} -
- - -
+ {showForwardBackButtons && ( +
+ + +
+ )}
); }; From 495b25fae595db55aaddb5244e6309de001a83e1 Mon Sep 17 00:00:00 2001 From: Melvin Chen Date: Fri, 1 Mar 2024 10:44:52 -0800 Subject: [PATCH 43/69] Add info about built in buttons into docs --- docs/v8-upgrade-guide.mdx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/v8-upgrade-guide.mdx b/docs/v8-upgrade-guide.mdx index 45b2377a..0072e3cf 100644 --- a/docs/v8-upgrade-guide.mdx +++ b/docs/v8-upgrade-guide.mdx @@ -103,3 +103,5 @@ These v7 and below props are being worked on or are considered for v8. `pauseOnHover` - not implemented, not documented. `wrapAround` - right now, you can wrap the the front but it won't infinitely scroll like in v7. + +`showDefaultButtons?` - would be a new prop and not sure about the naming. The idea would be that there's built in forward/back buttons that don't require the user to use the imperative handle hooks. It would likely have a className for styling and children property, but also unsure about how to organize it. From c2e59d29d439468809c4b4b865543a7c3645ced9 Mon Sep 17 00:00:00 2001 From: Melvin Chen Date: Fri, 1 Mar 2024 11:21:51 -0800 Subject: [PATCH 44/69] Round numbers to fix page indicator and scrolling bugs --- packages/nuka/src/Carousel/Carousel.tsx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/nuka/src/Carousel/Carousel.tsx b/packages/nuka/src/Carousel/Carousel.tsx index 72eb48f9..8eb41427 100644 --- a/packages/nuka/src/Carousel/Carousel.tsx +++ b/packages/nuka/src/Carousel/Carousel.tsx @@ -84,11 +84,10 @@ export const Carousel = forwardRef( useEffect(() => { const handleDebounce = setTimeout(() => { - setCurrentScrollIndex(currentManualScrollIndex); - + const roundedManualScrollIndex = Math.round(currentManualScrollIndex); const closestPassedSlide = pageStartIndices.reduce( (prev, current, index) => - current - currentManualScrollIndex < 0 ? index + 1 : prev, + current - roundedManualScrollIndex < 0 ? index + 1 : prev, 0 ); setCurrentSlideIndex(closestPassedSlide); @@ -210,7 +209,7 @@ export const Carousel = forwardRef( ? 0 : findLastIndex( pageStartIndices, - (index) => containerScrollDistance >= index + (index) => Math.round(containerScrollDistance) >= index ); } return 0; From b8ae41fe2140919765e930ad162441f207db5ca2 Mon Sep 17 00:00:00 2001 From: Charlie Brown Date: Wed, 13 Mar 2024 11:30:24 -0500 Subject: [PATCH 45/69] Cleanup CI and add chromatic --- .github/actions/setup/action.yml | 23 +++++++++++++++++++ .github/workflows/chromatic.yml | 32 +++++++++++++++++++++++++++ .github/workflows/ci.yml | 32 ++++----------------------- .github/workflows/release.yml | 32 ++------------------------- .github/workflows/storybook-tests.yml | 13 ++++------- 5 files changed, 65 insertions(+), 67 deletions(-) create mode 100644 .github/actions/setup/action.yml create mode 100644 .github/workflows/chromatic.yml diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml new file mode 100644 index 00000000..67a4324e --- /dev/null +++ b/.github/actions/setup/action.yml @@ -0,0 +1,23 @@ +name: Setup +description: Setup Build Step +inputs: + node-version: + required: true + default: '18.x' + +runs: + using: "composite" + steps: + - uses: pnpm/action-setup@v3 + with: + version: 7 + + - name: Use Node.js + uses: actions/setup-node@v4 + with: + node-version: ${{ inputs.node-version }} + cache: 'pnpm' + + - name: Install dependencies + shell: bash + run: pnpm install diff --git a/.github/workflows/chromatic.yml b/.github/workflows/chromatic.yml new file mode 100644 index 00000000..dfa02be7 --- /dev/null +++ b/.github/workflows/chromatic.yml @@ -0,0 +1,32 @@ +name: Chromatic + +on: + push: + branches: + - main + pull_request: + branches: + - main + paths: + - 'packages/**' + +jobs: + chromatic: + name: Storybook Publish + runs-on: ubuntu-latest + steps: + # requires all branches and tags to be fetched for chromatic + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - uses: ./.github/actions/setup + + - name: Build + run: pnpm build + + - name: Publish to Chromatic + uses: chromaui/action@v1 + with: + token: ${{ secrets.GITHUB_TOKEN }} + projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d0951ab8..182713a2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,36 +12,12 @@ jobs: build: name: Check and build codebase runs-on: ubuntu-latest - strategy: - matrix: - node-version: [ 16.x, 18.x ] steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v2 - with: - node-version: ${{ matrix.node-version }} + - uses: actions/checkout@v4 + - uses: ./.github/actions/setup - - uses: pnpm/action-setup@v2.2.2 - with: - version: 7 - - - name: Get pnpm store directory - id: pnpm-cache - run: echo "::set-output name=pnpm_cache_dir::$(pnpm store path)" - - - name: Setup pnpm cache - uses: actions/cache@v3 - with: - path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }} - key: ${{ runner.os }}-pnpm-store-${{ hashFiles('./pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}-pnpm-store- - - - name: Install dependencies - run: pnpm install - - - name: Check Code ${{ matrix.node-version }} + - name: Check Code run: pnpm check:ci - - name: Build ${{ matrix.node-version }} + - name: Build run: pnpm build diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4f8cbfcd..cfe88347 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -18,33 +18,8 @@ jobs: pull-requests: write steps: - - uses: actions/checkout@v2 - with: - fetch-depth: 0 - - - name: Use Node.js - uses: actions/setup-node@v1 - with: - node-version: 18.x - - - uses: pnpm/action-setup@v2.2.2 - with: - version: 7 - - - name: Get pnpm store directory - id: pnpm-cache - run: echo "::set-output name=pnpm_cache_dir::$(pnpm store path)" - - - name: Setup pnpm cache - uses: actions/cache@v3 - with: - path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }} - key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}-pnpm-store- - - - name: Install dependencies - run: pnpm install + - uses: actions/checkout@v4 + - uses: ./.github/actions/setup - name: Build packages run: pnpm run build @@ -53,9 +28,6 @@ jobs: id: changesets uses: changesets/action@v1 with: - # Note: Our `package.json:scripts.version` currently doesn't have `--fix-lockfile` for - # `pnpm install` because of a PNPM bug of some kind. - # https://github.com/FormidableLabs/spectacle/issues/1156 version: pnpm run version publish: pnpm changeset publish env: diff --git a/.github/workflows/storybook-tests.yml b/.github/workflows/storybook-tests.yml index 5bd0d425..a8e58968 100644 --- a/.github/workflows/storybook-tests.yml +++ b/.github/workflows/storybook-tests.yml @@ -2,22 +2,17 @@ name: 'Storybook Tests' on: push jobs: test: - timeout-minutes: 60 runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v3.0.0 - with: - version: 7 - - uses: actions/setup-node@v4 - with: - node-version: 18.x - - name: Install dependencies - run: pnpm install + - uses: ./.github/actions/setup + - name: Install Playwright run: npx playwright install --with-deps + - name: Build Storybook run: pnpm build:storybook --quiet + - name: Serve Storybook and run tests run: | npx concurrently -k -s first -n "SB,TEST" -c "magenta,blue" \ From a2bd014b349e65f90e2d7b5913b8b39ff6af0fc1 Mon Sep 17 00:00:00 2001 From: Charlie Brown Date: Wed, 13 Mar 2024 11:35:14 -0500 Subject: [PATCH 46/69] Need duplicate command for chromatic --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index f721e852..9a20102b 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "build": "pnpm run --filter nuka-carousel build", "build:watch": "pnpm run --filter nuka-carousel build:watch", "build:storybook": "pnpm run --filter nuka-carousel storybook:build", + "build-storybook": "pnpm run --filter nuka-carousel storybook:build", "build:website": "pnpm run --filter website build", "build:website:vercel": "pnpm run --filter website build:vercel", "lint": "pnpm run --parallel lint", From 3b433b78ee39e1ca12ae42fa6d79d5e5c11f3f16 Mon Sep 17 00:00:00 2001 From: Charlie Brown Date: Wed, 13 Mar 2024 13:52:21 -0500 Subject: [PATCH 47/69] Rename container class and improve doc page --- docs/api/options.mdx | 6 +- docs/installation.mdx | 18 ----- docs/introduction.mdx | 69 ++++++++++++------ docs/v8-upgrade-guide.mdx | 6 +- .../nuka/src/Carousel/Carousel.stories.tsx | 4 +- packages/nuka/src/Carousel/Carousel.tsx | 10 +-- .../src/Carousel/CarouselTests.stories.tsx | 4 +- .../src/PageIndicators/PageIndicators.tsx | 2 +- website/src/components/demos.tsx | 6 +- website/static/img/pexels-01.jpg | Bin 0 -> 545513 bytes website/static/img/pexels-02.jpg | Bin 0 -> 130363 bytes website/static/img/pexels-03.jpg | Bin 0 -> 198503 bytes 12 files changed, 66 insertions(+), 59 deletions(-) create mode 100644 website/static/img/pexels-01.jpg create mode 100644 website/static/img/pexels-02.jpg create mode 100644 website/static/img/pexels-03.jpg diff --git a/docs/api/options.mdx b/docs/api/options.mdx index e988b568..eac336ac 100644 --- a/docs/api/options.mdx +++ b/docs/api/options.mdx @@ -156,16 +156,16 @@ By default, this wrapper has `display: flex` applied. | Prop Name | Type | Default Value | | :----------------- | :----- | :------------ | -| `wrapperClassName` | string | `undefined` | +| `className` | string | `undefined` | ### Example - + #### Code ```tsx -{/* Cards */} +{/* Cards */} ``` --- diff --git a/docs/installation.mdx b/docs/installation.mdx index 07b33388..5f353c18 100644 --- a/docs/installation.mdx +++ b/docs/installation.mdx @@ -38,21 +38,3 @@ pnpm add nuka-carousel Nuka Carousel has a peer dependency on React 18. ::: - -### Basic Usage - -```jsx -import Carousel from "nuka-carousel" - -const App = () => { - return ( - - - - - - - - ) -} -``` diff --git a/docs/introduction.mdx b/docs/introduction.mdx index 78ba598b..b095d11a 100644 --- a/docs/introduction.mdx +++ b/docs/introduction.mdx @@ -4,29 +4,56 @@ title: Introduction slug: / --- -import { BasicDemo } from "../website/src/components/demos"; +import { Carousel } from 'nuka-carousel'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; [![Nuka Carousel — Formidable, We build the modern web](https://raw.githubusercontent.com/FormidableLabs/nuka-carousel/main/Nuka-Hero.png)](https://formidable.com/open-source/) -Small, fast and accessibility-first React carousel library with easily customizable UI and behavior to fit your brand and site. - - -### Nuka Demos -See Nuka Carousel in action with three common configurations: - - - -

Nuka with standard options. Slides can navigate using gestures or arrow buttons at the edges.

- -
- -

Nuka with wrap around mode can navigate to the last slide from the first or the first slide from the last.

- -
- -

Nuka can auto play slides at a custom interval with or without wrap around mode.

- -
-
+Small, fast, and accessibility-first React carousel library with easily customizable UI and behavior to fit your brand and site. + +### Basic Usage + +Nuka Carousel accepts any React component as children, and will render them as slides. Here's a basic example: + + + + + + + +#### Basic Code + +```jsx +import Carousel from 'nuka-carousel'; + +const App = () => { + return ( + +
Slide 1
+
Slide 2
+
Slide 3
+
+ ); +}; +``` + +Feel free to mix React components and HTML elements as children. Nuka Carousel will handle them all. + +```jsx + +
Slide 1
+ + +
+``` diff --git a/docs/v8-upgrade-guide.mdx b/docs/v8-upgrade-guide.mdx index 0072e3cf..8cf51641 100644 --- a/docs/v8-upgrade-guide.mdx +++ b/docs/v8-upgrade-guide.mdx @@ -18,7 +18,7 @@ Nuka v8 and above are completely rewritten with new props and might not be compl `pageIndicatorProps` -`wrapperClassName` +`className` ## Changed Props @@ -38,7 +38,7 @@ Nuka v8 and above are completely rewritten with new props and might not be compl `carouselId` -`cellAlign` - this should just be controlled through passed CSS (prop `wrapperClassName`). +`cellAlign` - this should just be controlled through passed CSS (prop `className`). `cellSpacing` - this should just be controlled through passed CSS. @@ -72,7 +72,7 @@ Nuka v8 and above are completely rewritten with new props and might not be compl `speed` - should be native. -`style` - pass styles through the wrapperClassName if needed. +`style` - pass styles through the className if needed. `swiping` - default to OS/browser settings. diff --git a/packages/nuka/src/Carousel/Carousel.stories.tsx b/packages/nuka/src/Carousel/Carousel.stories.tsx index 22dc73b5..de534ad3 100644 --- a/packages/nuka/src/Carousel/Carousel.stories.tsx +++ b/packages/nuka/src/Carousel/Carousel.stories.tsx @@ -57,7 +57,7 @@ export const FixedWidthScroll: Story = { export const Slide: Story = { args: { scrollDistance: 'slide', - wrapperClassName: 'slide__with-gap', + className: 'slide__with-gap', children: ( <> {[...Array(10)].map((_, index) => ( @@ -84,7 +84,7 @@ export const FullWidth: Story = { export const Screen: Story = { args: { scrollDistance: 'screen', - wrapperClassName: 'slide__with-gap', + className: 'slide__with-gap', children: ( <> {[...Array(10)].map((_, index) => ( diff --git a/packages/nuka/src/Carousel/Carousel.tsx b/packages/nuka/src/Carousel/Carousel.tsx index 8eb41427..8e289310 100644 --- a/packages/nuka/src/Carousel/Carousel.tsx +++ b/packages/nuka/src/Carousel/Carousel.tsx @@ -15,7 +15,7 @@ type ScrollDistanceType = number | 'slide' | 'screen'; export type CarouselProps = { children: ReactNode; scrollDistance?: ScrollDistanceType; - wrapperClassName?: string; + className?: string; autoplay?: boolean; autoplayInterval?: number; showPageIndicators?: boolean; @@ -51,8 +51,8 @@ export const Carousel = forwardRef( ( { children, + className = '', scrollDistance = 'slide', - wrapperClassName, autoplay = false, autoplayInterval = 3000, showPageIndicators = false, @@ -245,12 +245,12 @@ export const Carousel = forwardRef( (event.target as HTMLElement).scrollLeft ); }} - data-testId="overflow" + data-testid="overflow" >
{children}
diff --git a/packages/nuka/src/Carousel/CarouselTests.stories.tsx b/packages/nuka/src/Carousel/CarouselTests.stories.tsx index ef2fb15e..309c33af 100644 --- a/packages/nuka/src/Carousel/CarouselTests.stories.tsx +++ b/packages/nuka/src/Carousel/CarouselTests.stories.tsx @@ -78,7 +78,7 @@ export const FixedWidthScroll: Story = { export const Slide: Story = { args: { scrollDistance: 'slide', - wrapperClassName: 'slide__with-gap', + className: 'slide__with-gap', children: ( <> {[...Array(10)].map((_, index) => ( @@ -142,7 +142,7 @@ export const FullWidth: Story = { export const Screen: Story = { args: { scrollDistance: 'screen', - wrapperClassName: 'slide__with-gap', + className: 'slide__with-gap', children: ( <> {[...Array(10)].map((_, index) => ( diff --git a/packages/nuka/src/PageIndicators/PageIndicators.tsx b/packages/nuka/src/PageIndicators/PageIndicators.tsx index 6fc81f8a..ba82a90e 100644 --- a/packages/nuka/src/PageIndicators/PageIndicators.tsx +++ b/packages/nuka/src/PageIndicators/PageIndicators.tsx @@ -16,7 +16,7 @@ export const PageIndicators = ({ scrollToPage, }: PageIndicatorsProps) => { return ( -
+
{[...Array(totalIndicators)].map((_, index) => (
); }; + +function classNames(...classes: string[]) { + return classes.filter(Boolean).join(' '); +} From 56f9915178091a57d328bda9775b045bb947f19f Mon Sep 17 00:00:00 2001 From: Charlie Brown Date: Sat, 16 Mar 2024 07:42:34 -0500 Subject: [PATCH 58/69] Move styling API to container to avoid gap bug --- docs/api/04_styling.mdx | 28 ++++++++++++------------- packages/nuka/src/Carousel/Carousel.tsx | 8 ++----- 2 files changed, 16 insertions(+), 20 deletions(-) diff --git a/docs/api/04_styling.mdx b/docs/api/04_styling.mdx index b57b36a0..95ea2f6b 100644 --- a/docs/api/04_styling.mdx +++ b/docs/api/04_styling.mdx @@ -11,9 +11,7 @@ import CodeBlock from '@theme/CodeBlock'; ## Wrapper Styling -Apply classNames to the `
` that contains the `children`. This is likely how you will determine the spacing between items in the carousel. - -By default, this wrapper has `display: flex` applied. +Apply css classes to the carousel container. ### Details @@ -23,22 +21,24 @@ By default, this wrapper has `display: flex` applied. ### Example - -
-
-
-
-
-
-
-
-
+ + + + #### Code ```tsx - + diff --git a/packages/nuka/src/Carousel/Carousel.tsx b/packages/nuka/src/Carousel/Carousel.tsx index 4810c760..113a8fe4 100644 --- a/packages/nuka/src/Carousel/Carousel.tsx +++ b/packages/nuka/src/Carousel/Carousel.tsx @@ -144,16 +144,12 @@ export const Carousel = forwardRef( return (
-
+
{children}
From 2a6bdab27bb4557b6217afde86ea8d72f670f229 Mon Sep 17 00:00:00 2001 From: Charlie Brown Date: Sat, 16 Mar 2024 09:43:45 -0500 Subject: [PATCH 59/69] Add wraparound option to API --- docs/api/03_scroll.mdx | 118 ------------------- docs/api/{02_autoplay.mdx => autoplay.mdx} | 0 docs/api/{05_callbacks.mdx => callbacks.mdx} | 3 +- docs/api/{06_methods.mdx => methods.mdx} | 4 +- docs/api/{01_page.mdx => page.mdx} | 0 docs/api/scroll.mdx | 111 +++++++++++++++++ docs/api/{04_styling.mdx => styling.mdx} | 0 docs/api/wraparound.mdx | 47 ++++++++ docs/introduction.mdx | 15 +-- docs/v8-upgrade-guide.mdx | 2 - packages/nuka/src/Carousel/Carousel.tsx | 25 ++-- packages/nuka/src/hooks/use-paging.test.tsx | 32 +++-- packages/nuka/src/hooks/use-paging.tsx | 17 ++- packages/nuka/src/index.tsx | 2 +- website/src/components/basic-button-demo.tsx | 26 ++++ website/src/components/buttons.tsx | 12 ++ website/src/components/controls.tsx | 41 ------- website/src/components/demos.tsx | 80 ------------- 18 files changed, 258 insertions(+), 277 deletions(-) delete mode 100644 docs/api/03_scroll.mdx rename docs/api/{02_autoplay.mdx => autoplay.mdx} (100%) rename docs/api/{05_callbacks.mdx => callbacks.mdx} (93%) rename docs/api/{06_methods.mdx => methods.mdx} (91%) rename docs/api/{01_page.mdx => page.mdx} (100%) create mode 100644 docs/api/scroll.mdx rename docs/api/{04_styling.mdx => styling.mdx} (100%) create mode 100644 docs/api/wraparound.mdx create mode 100644 website/src/components/basic-button-demo.tsx create mode 100644 website/src/components/buttons.tsx delete mode 100644 website/src/components/controls.tsx delete mode 100644 website/src/components/demos.tsx diff --git a/docs/api/03_scroll.mdx b/docs/api/03_scroll.mdx deleted file mode 100644 index 5246472f..00000000 --- a/docs/api/03_scroll.mdx +++ /dev/null @@ -1,118 +0,0 @@ ---- -sidebar_position: 3 ---- - -import { Carousel } from 'nuka-carousel'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -# Scroll - -How far the carousel should move when its goForward() and goBack() methods are called. - -### API - -| Prop Name | Type | Default Value | -| :--------------- | :---------------------------- | :------------ | -| `scrollDistance` | "slide" \| number \| "screen" | `slide` | - -- `slide` - Using "slide" will advance the carousel one slide each time. -- `number` - Using a number will cause the carousel to scroll that many pixels each time. -- `screen` - Using "screen" will advance the carousel by the width of the visible carousel. - -### Example - - - -

- Default scroll by slide width. The scroll distance will automatically - update on the widths of the slides so you can have multiple widths for - each slide. -

- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -

Code

- -```tsx - - - - - -``` - - - -

- Scroll by a fixed distance measured in px. This example scrolls by 100px. -

- - - - - -

Code

- -```tsx - - - - - -``` - -
- -

- Scroll by the width of the "screen" or the container the carousel is in. -

- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -

Code

- -```tsx - - - - - -``` - - - diff --git a/docs/api/02_autoplay.mdx b/docs/api/autoplay.mdx similarity index 100% rename from docs/api/02_autoplay.mdx rename to docs/api/autoplay.mdx diff --git a/docs/api/05_callbacks.mdx b/docs/api/callbacks.mdx similarity index 93% rename from docs/api/05_callbacks.mdx rename to docs/api/callbacks.mdx index 6e7fb068..6691616a 100644 --- a/docs/api/05_callbacks.mdx +++ b/docs/api/callbacks.mdx @@ -1,8 +1,7 @@ --- -sidebar_position: 5 +sidebar_position: 8 --- -import { BasicDemo } from '../../website/src/components/demos'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import CodeBlock from '@theme/CodeBlock'; diff --git a/docs/api/06_methods.mdx b/docs/api/methods.mdx similarity index 91% rename from docs/api/06_methods.mdx rename to docs/api/methods.mdx index 14996a78..47c45d70 100644 --- a/docs/api/06_methods.mdx +++ b/docs/api/methods.mdx @@ -2,7 +2,7 @@ sidebar_position: 6 --- -import { MethodsDemo } from '../../website/src/components/demos'; +import { BasicButtonDemo } from '../../website/src/components/basic-button-demo'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; @@ -41,7 +41,7 @@ Advances the carousel backward by the given `scrollDistance`. ### Usage/Examples - + #### Code diff --git a/docs/api/01_page.mdx b/docs/api/page.mdx similarity index 100% rename from docs/api/01_page.mdx rename to docs/api/page.mdx diff --git a/docs/api/scroll.mdx b/docs/api/scroll.mdx new file mode 100644 index 00000000..b9fd3e1c --- /dev/null +++ b/docs/api/scroll.mdx @@ -0,0 +1,111 @@ +--- +sidebar_position: 3 +--- + +import { Carousel } from 'nuka-carousel'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Scroll + +How far the carousel should move when its goForward() and goBack() methods are called. + +### API + +| Prop Name | Type | Default Value | +| :--------------- | :---------------------------- | :------------ | +| `scrollDistance` | "slide" \| number \| "screen" | `slide` | + +- `slide` - Using "slide" will advance the carousel one slide each time. +- `number` - Using a number will cause the carousel to scroll that many pixels each time. +- `screen` - Using "screen" will advance the carousel by the width of the visible carousel. + +### Slide (default) + +Default scroll by slide width. The scroll distance will automatically update on the widths of the slides so you can have multiple widths for each slide. + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + +#### Code + +```tsx + + + + + +``` + +### Fixed Distance (number) + +Scroll by a fixed distance measured in px. This example scrolls by 100px. + + + + + + + +#### Code + +```tsx + + + + + +``` + +### Screen + +Scroll by the width of the "screen" or the container the carousel is in. + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + +#### Code + +```tsx + + + + + +``` diff --git a/docs/api/04_styling.mdx b/docs/api/styling.mdx similarity index 100% rename from docs/api/04_styling.mdx rename to docs/api/styling.mdx diff --git a/docs/api/wraparound.mdx b/docs/api/wraparound.mdx new file mode 100644 index 00000000..965541ea --- /dev/null +++ b/docs/api/wraparound.mdx @@ -0,0 +1,47 @@ +--- +sidebar_position: 2 +title: Wraparound +slug: / +--- + +import { BasicButtonDemo } from '../../website/src/components/basic-button-demo'; + +# Wraparound + +By default, the carousel will wrap around when it reaches the end of the slide set. This means that if you are on the last slide and you click next, it will go to the first slide. + +### API + +| Prop Name | Type | Default Value | +| :----------- | :-------- | :------------ | +| `wrapAround` | `boolean` | `true` | + +Nuka Carousel accepts any React component as children, and will render them as slides. + +#### Enabled (default) + + + +#### Code + +```tsx + + + + + +``` + +#### Disabled + + + +#### Code + +```tsx + + + + + +``` diff --git a/docs/introduction.mdx b/docs/introduction.mdx index a4715660..82f8737c 100644 --- a/docs/introduction.mdx +++ b/docs/introduction.mdx @@ -6,24 +6,13 @@ slug: / import { Carousel } from 'nuka-carousel'; -[![Nuka Carousel — Formidable, We build the modern web](https://oss.nearform.com/api/banner.svg?badge=nuka&bg=bd34bd&text=nuka%20carousel)](https://formidable.com/open-source/) - Small, fast, and accessibility-first React carousel library with easily customizable UI and behavior to fit your brand and site. ## Demo -Nuka Carousel accepts any React component as children, and will render them as slides. Here's a basic example: +Nuka Carousel accepts any React component as children, and will render them as slides. - + diff --git a/docs/v8-upgrade-guide.mdx b/docs/v8-upgrade-guide.mdx index 93e99f05..e003ecd7 100644 --- a/docs/v8-upgrade-guide.mdx +++ b/docs/v8-upgrade-guide.mdx @@ -102,6 +102,4 @@ These v7 and below props are being worked on or are considered for v8. `pauseOnHover` - not implemented, not documented. -`wrapAround` - right now, you can wrap the the front but it won't infinitely scroll like in v7. - `showDefaultButtons?` - would be a new prop and not sure about the naming. The idea would be that there's built in forward/back buttons that don't require the user to use the imperative handle hooks. It would likely have a className for styling and children property, but also unsure about how to organize it. diff --git a/packages/nuka/src/Carousel/Carousel.tsx b/packages/nuka/src/Carousel/Carousel.tsx index 113a8fe4..004a5a29 100644 --- a/packages/nuka/src/Carousel/Carousel.tsx +++ b/packages/nuka/src/Carousel/Carousel.tsx @@ -17,20 +17,25 @@ import { arraySeq, arraySum, nint } from 'src/utils'; type ScrollDistanceType = number | 'slide' | 'screen'; -export type CarouselProps = { +export type CarouselCallbacks = { + beforeSlide?: () => void; + afterSlide?: () => void; +}; + +export type CarouselProps = CarouselCallbacks & { children: ReactNode; - scrollDistance?: ScrollDistanceType; + className?: string; autoplay?: boolean; autoplayInterval?: number; - showPageIndicators?: boolean; pageIndicatorProps?: { currentPageIndicatorClassName?: string; pageIndicatorClassName?: string; containerClassName?: string; }; - beforeSlide?: () => void; - afterSlide?: () => void; + scrollDistance?: ScrollDistanceType; + showPageIndicators?: boolean; + wrapAround?: boolean; }; export type SlideHandle = { @@ -44,11 +49,12 @@ export const Carousel = forwardRef( { children, className = '', - scrollDistance = 'slide', autoplay = false, autoplayInterval = 3000, - showPageIndicators = false, pageIndicatorProps, + scrollDistance = 'slide', + showPageIndicators = false, + wrapAround = true, beforeSlide, afterSlide, }: CarouselProps, @@ -60,7 +66,10 @@ export const Carousel = forwardRef( const totalSlides = Children.count(children); const [totalPages, setTotalPages] = useState(totalSlides); const [scrollOffset, setScrollOffset] = useState(arraySeq(totalPages, 0)); - const { currentPage, goBack, goForward, goToPage } = usePaging(totalPages); + const { currentPage, goBack, goForward, goToPage } = usePaging( + totalPages, + wrapAround + ); // -- update page count and scroll offset based on scroll distance useEffect(() => { diff --git a/packages/nuka/src/hooks/use-paging.test.tsx b/packages/nuka/src/hooks/use-paging.test.tsx index 17a00ad2..a9433805 100644 --- a/packages/nuka/src/hooks/use-paging.test.tsx +++ b/packages/nuka/src/hooks/use-paging.test.tsx @@ -4,12 +4,12 @@ import { usePaging } from './use-paging'; describe('usePaging', () => { it('should return the current page', () => { - const { result } = renderHook(() => usePaging(3)); + const { result } = renderHook(() => usePaging(3, true)); expect(result.current.currentPage).toBe(0); }); it('should go to the next page', () => { - const { result } = renderHook(() => usePaging(3)); + const { result } = renderHook(() => usePaging(3, true)); act(() => { result.current.goForward(); }); @@ -17,7 +17,7 @@ describe('usePaging', () => { }); it('should go to the next page and loop back to the first page', () => { - const { result } = renderHook(() => usePaging(3)); + const { result } = renderHook(() => usePaging(3, true)); act(() => { result.current.goForward(); result.current.goForward(); @@ -26,8 +26,18 @@ describe('usePaging', () => { expect(result.current.currentPage).toBe(0); }); + it('should stop at the last page', () => { + const { result } = renderHook(() => usePaging(3, false)); + act(() => { + result.current.goForward(); + result.current.goForward(); + result.current.goForward(); + }); + expect(result.current.currentPage).toBe(2); + }); + it('should go to the previous page', () => { - const { result } = renderHook(() => usePaging(3)); + const { result } = renderHook(() => usePaging(3, true)); act(() => { result.current.goForward(); result.current.goBack(); @@ -36,15 +46,23 @@ describe('usePaging', () => { }); it('should go to the previous page and wrap back to the last page', () => { - const { result } = renderHook(() => usePaging(3)); + const { result } = renderHook(() => usePaging(3, true)); act(() => { result.current.goBack(); }); expect(result.current.currentPage).toBe(2); }); + it('should stop at the first page', () => { + const { result } = renderHook(() => usePaging(3, false)); + act(() => { + result.current.goBack(); + }); + expect(result.current.currentPage).toBe(0); + }); + it('should go to any page', () => { - const { result } = renderHook(() => usePaging(5)); + const { result } = renderHook(() => usePaging(5, true)); act(() => { result.current.goToPage(3); }); @@ -52,7 +70,7 @@ describe('usePaging', () => { }); it('should not go to a page that is out of bounds', () => { - const { result } = renderHook(() => usePaging(5)); + const { result } = renderHook(() => usePaging(5, true)); act(() => { result.current.goToPage(10); }); diff --git a/packages/nuka/src/hooks/use-paging.tsx b/packages/nuka/src/hooks/use-paging.tsx index dc1cd412..99e0c42a 100644 --- a/packages/nuka/src/hooks/use-paging.tsx +++ b/packages/nuka/src/hooks/use-paging.tsx @@ -7,7 +7,10 @@ type UsePagingReturnType = { goBack: () => void; }; -export function usePaging(totalSlides: number): UsePagingReturnType { +export function usePaging( + totalSlides: number, + wrapAround: boolean +): UsePagingReturnType { const [currentPage, setCurrentPage] = useState(0); const goToPage = (idx: number) => { @@ -16,11 +19,19 @@ export function usePaging(totalSlides: number): UsePagingReturnType { }; const goForward = () => { - setCurrentPage((prev) => (prev + 1) % totalSlides); + if (wrapAround) { + setCurrentPage((prev) => (prev + 1) % totalSlides); + } else { + setCurrentPage((prev) => Math.min(prev + 1, totalSlides - 1)); + } }; const goBack = () => { - setCurrentPage((prev) => (prev - 1 + totalSlides) % totalSlides); + if (wrapAround) { + setCurrentPage((prev) => (prev - 1 + totalSlides) % totalSlides); + } else { + setCurrentPage((prev) => Math.max(prev - 1, 0)); + } }; return { currentPage, goToPage, goForward, goBack }; diff --git a/packages/nuka/src/index.tsx b/packages/nuka/src/index.tsx index 012d06ae..24788309 100644 --- a/packages/nuka/src/index.tsx +++ b/packages/nuka/src/index.tsx @@ -1 +1 @@ -export { Carousel, SlideHandle } from './Carousel/Carousel'; +export * from './Carousel/Carousel'; diff --git a/website/src/components/basic-button-demo.tsx b/website/src/components/basic-button-demo.tsx new file mode 100644 index 00000000..5b393d12 --- /dev/null +++ b/website/src/components/basic-button-demo.tsx @@ -0,0 +1,26 @@ +import React, { useRef } from 'react'; +import { Carousel, CarouselProps, SlideHandle } from 'nuka-carousel'; +import { BsChevronLeft, BsChevronRight } from 'react-icons/bs'; +import { FlatDarkButton } from './buttons'; + +export const BasicButtonDemo = (props: CarouselProps) => { + const ref = useRef(null); + return ( +
+ + + + + + +
+ ref.current && ref.current.goBack()}> + + ref.current && ref.current.goForward()}> + +
+
+ ); +}; diff --git a/website/src/components/buttons.tsx b/website/src/components/buttons.tsx new file mode 100644 index 00000000..af6923b8 --- /dev/null +++ b/website/src/components/buttons.tsx @@ -0,0 +1,12 @@ +import React from 'react'; + +export function FlatDarkButton({ children, ...props }) { + return ( + + {children} + + ); +} diff --git a/website/src/components/controls.tsx b/website/src/components/controls.tsx deleted file mode 100644 index 76ad015c..00000000 --- a/website/src/components/controls.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import React from 'react'; -import clsx from 'clsx'; -import { - BsFillArrowLeftCircleFill, - BsFillArrowRightCircleFill, -} from 'react-icons/bs'; - -export const renderCenterLeftControls = ({ - previousDisabled, - previousSlide, -}) => ( - -); - -export const renderCenterRightControls = ({ nextDisabled, nextSlide }) => ( - -); diff --git a/website/src/components/demos.tsx b/website/src/components/demos.tsx deleted file mode 100644 index d1b35eb1..00000000 --- a/website/src/components/demos.tsx +++ /dev/null @@ -1,80 +0,0 @@ -import React, { useRef } from 'react'; -import { Carousel, SlideHandle } from 'nuka-carousel'; - -type scrollDistanceType = number | 'slide' | 'screen'; - -type Props = { - scrollDistance?: scrollDistanceType; - className?: string; - autoplay?: boolean; - autoplayInterval?: number; - showPageIndicators?: boolean; - pageIndicatorProps?: { - currentPageIndicatorClassName?: string; - pageIndicatorClassName?: string; - containerClassName?: string; - }; - showForwardBackButtons?: boolean; -}; - -export const BasicDemo = ({ - autoplay, - autoplayInterval, - scrollDistance, - showPageIndicators, - pageIndicatorProps, - showForwardBackButtons, - className = '', -}: Props) => { - const ref = useRef(null); - return ( -
- - - - - - - {showForwardBackButtons && ( -
- - -
- )} -
- ); -}; - -export const MethodsDemo = () => { - const ref = useRef(null); - return ( -
- - - - - - -
- - -
-
- ); -}; From 9ad5c30567f6d3051be3294f991cfa24f13a5206 Mon Sep 17 00:00:00 2001 From: Charlie Brown Date: Sat, 16 Mar 2024 09:58:46 -0500 Subject: [PATCH 60/69] Refactor measurements into hook --- packages/nuka/src/Carousel/Carousel.tsx | 65 ++++--------------- packages/nuka/src/hooks/use-measurement.tsx | 70 +++++++++++++++++++++ 2 files changed, 81 insertions(+), 54 deletions(-) create mode 100644 packages/nuka/src/hooks/use-measurement.tsx diff --git a/packages/nuka/src/Carousel/Carousel.tsx b/packages/nuka/src/Carousel/Carousel.tsx index 004a5a29..82f8a3a6 100644 --- a/packages/nuka/src/Carousel/Carousel.tsx +++ b/packages/nuka/src/Carousel/Carousel.tsx @@ -5,7 +5,6 @@ import { useEffect, useImperativeHandle, useRef, - useState, } from 'react'; import './Carousel.css'; @@ -13,7 +12,8 @@ import { PageIndicators } from '../PageIndicators/PageIndicators'; import { useInterval } from 'src/hooks/use-interval'; import { usePaging } from 'src/hooks/use-paging'; import { useDebounced } from 'src/hooks/use-debounced'; -import { arraySeq, arraySum, nint } from 'src/utils'; +import { useMeasurement } from 'src/hooks/use-measurement'; +import { nint } from 'src/utils'; type ScrollDistanceType = number | 'slide' | 'screen'; @@ -63,64 +63,21 @@ export const Carousel = forwardRef( const containerRef = useRef(null); const wrapperRef = useRef(null); + // -- update page count and scroll offset based on scroll distance const totalSlides = Children.count(children); - const [totalPages, setTotalPages] = useState(totalSlides); - const [scrollOffset, setScrollOffset] = useState(arraySeq(totalPages, 0)); + const { totalPages, scrollOffset } = useMeasurement({ + totalSlides, + scrollDistance, + containerRef, + wrapperRef, + }); + + // -- paging const { currentPage, goBack, goForward, goToPage } = usePaging( totalPages, wrapAround ); - // -- update page count and scroll offset based on scroll distance - useEffect(() => { - // execute before paint to ensure refs are set with the - // correct dimensions for the calculation - // note: this is similar to useLayout, but runs async - requestAnimationFrame(() => { - switch (scrollDistance) { - case 'screen': { - if (containerRef.current && wrapperRef.current) { - const pageCount = Math.ceil( - wrapperRef.current.scrollWidth / - containerRef.current.offsetWidth - ); - setTotalPages(pageCount); - setScrollOffset( - arraySeq(pageCount, containerRef.current.offsetWidth) - ); - } - break; - } - case 'slide': { - if (wrapperRef.current) { - // creates an array of slide widths in order to support - // slides of varying widths as children - const offsets = Array.from(wrapperRef.current.children).map( - (child) => (child as HTMLElement).offsetWidth - ); - - setTotalPages(totalSlides); - setScrollOffset(arraySum([0, ...offsets.slice(0, -1)])); - } - break; - } - default: { - if (containerRef.current && typeof scrollDistance === 'number') { - const carouselTotalWidth = - containerRef.current.scrollWidth - - containerRef.current.offsetWidth; - - const pageCount = - Math.ceil(carouselTotalWidth / scrollDistance) + 1; - - setTotalPages(pageCount); - setScrollOffset(arraySeq(pageCount, scrollDistance)); - } - } - } - }); - }, [scrollDistance, totalSlides]); - // -- autoplay useInterval(goForward, autoplayInterval, autoplay); diff --git a/packages/nuka/src/hooks/use-measurement.tsx b/packages/nuka/src/hooks/use-measurement.tsx new file mode 100644 index 00000000..637b8ea4 --- /dev/null +++ b/packages/nuka/src/hooks/use-measurement.tsx @@ -0,0 +1,70 @@ +import { useEffect, useState } from 'react'; + +import { arraySeq, arraySum } from 'src/utils'; + +type MeasurementProps = { + totalSlides: number; + scrollDistance: number | 'slide' | 'screen'; + containerRef: React.RefObject; + wrapperRef: React.RefObject; +}; + +export function useMeasurement({ + totalSlides, + scrollDistance, + containerRef, + wrapperRef, +}: MeasurementProps) { + const [totalPages, setTotalPages] = useState(totalSlides); + const [scrollOffset, setScrollOffset] = useState(arraySeq(totalPages, 0)); + + useEffect(() => { + // execute before paint to ensure refs are set with the + // correct dimensions for the calculation + // note: this is similar to useLayout, but runs async + requestAnimationFrame(() => { + switch (scrollDistance) { + case 'screen': { + if (containerRef.current && wrapperRef.current) { + const pageCount = Math.ceil( + wrapperRef.current.scrollWidth / containerRef.current.offsetWidth + ); + setTotalPages(pageCount); + setScrollOffset( + arraySeq(pageCount, containerRef.current.offsetWidth) + ); + } + break; + } + case 'slide': { + if (wrapperRef.current) { + // creates an array of slide widths in order to support + // slides of varying widths as children + const offsets = Array.from(wrapperRef.current.children).map( + (child) => (child as HTMLElement).offsetWidth + ); + + setTotalPages(totalSlides); + setScrollOffset(arraySum([0, ...offsets.slice(0, -1)])); + } + break; + } + default: { + if (containerRef.current && typeof scrollDistance === 'number') { + const carouselTotalWidth = + containerRef.current.scrollWidth - + containerRef.current.offsetWidth; + + const pageCount = + Math.ceil(carouselTotalWidth / scrollDistance) + 1; + + setTotalPages(pageCount); + setScrollOffset(arraySeq(pageCount, scrollDistance)); + } + } + } + }); + }, [scrollDistance, totalSlides, containerRef, wrapperRef]); + + return { totalPages, scrollOffset }; +} From fb2337ae97c1be249e48dc1cf894889034f97d63 Mon Sep 17 00:00:00 2001 From: Charlie Brown Date: Sat, 16 Mar 2024 10:20:36 -0500 Subject: [PATCH 61/69] Recalculate dimensions on resize --- packages/nuka/src/hooks/use-measurement.tsx | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/packages/nuka/src/hooks/use-measurement.tsx b/packages/nuka/src/hooks/use-measurement.tsx index 637b8ea4..941db82f 100644 --- a/packages/nuka/src/hooks/use-measurement.tsx +++ b/packages/nuka/src/hooks/use-measurement.tsx @@ -1,5 +1,6 @@ -import { useEffect, useState } from 'react'; +import { useCallback, useEffect, useState } from 'react'; +import { useDebounced } from 'src/hooks/use-debounced'; import { arraySeq, arraySum } from 'src/utils'; type MeasurementProps = { @@ -18,7 +19,7 @@ export function useMeasurement({ const [totalPages, setTotalPages] = useState(totalSlides); const [scrollOffset, setScrollOffset] = useState(arraySeq(totalPages, 0)); - useEffect(() => { + const measure = useCallback(() => { // execute before paint to ensure refs are set with the // correct dimensions for the calculation // note: this is similar to useLayout, but runs async @@ -66,5 +67,16 @@ export function useMeasurement({ }); }, [scrollDistance, totalSlides, containerRef, wrapperRef]); + // debounce the measure function when resizing so + // it doesnt fire on every pixel change + const resizer = useDebounced(measure, 100); + + useEffect(() => { + measure(); + + window.addEventListener('resize', resizer as EventListener); + return () => window.removeEventListener('resize', resizer as EventListener); + }, [measure, resizer]); + return { totalPages, scrollOffset }; } From 7d030cd73fd16f03338aae35082222b1e1dd7c3f Mon Sep 17 00:00:00 2001 From: Charlie Brown Date: Sat, 16 Mar 2024 12:19:08 -0500 Subject: [PATCH 62/69] Add swiping property --- docs/api/callbacks.mdx | 2 +- docs/api/methods.mdx | 2 +- docs/api/scroll.mdx | 2 +- docs/api/styling.mdx | 2 +- docs/api/swiping.mdx | 67 +++++++++++++++++++++++++ docs/api/wraparound.mdx | 4 +- docs/v8-upgrade-guide.mdx | 2 - packages/nuka/src/Carousel/Carousel.tsx | 7 ++- 8 files changed, 79 insertions(+), 9 deletions(-) create mode 100644 docs/api/swiping.mdx diff --git a/docs/api/callbacks.mdx b/docs/api/callbacks.mdx index 6691616a..c01aa7d3 100644 --- a/docs/api/callbacks.mdx +++ b/docs/api/callbacks.mdx @@ -1,5 +1,5 @@ --- -sidebar_position: 8 +sidebar_position: 90 --- import Tabs from '@theme/Tabs'; diff --git a/docs/api/methods.mdx b/docs/api/methods.mdx index 47c45d70..6bcada74 100644 --- a/docs/api/methods.mdx +++ b/docs/api/methods.mdx @@ -1,5 +1,5 @@ --- -sidebar_position: 6 +sidebar_position: 80 --- import { BasicButtonDemo } from '../../website/src/components/basic-button-demo'; diff --git a/docs/api/scroll.mdx b/docs/api/scroll.mdx index b9fd3e1c..87e07547 100644 --- a/docs/api/scroll.mdx +++ b/docs/api/scroll.mdx @@ -1,5 +1,5 @@ --- -sidebar_position: 3 +sidebar_position: 4 --- import { Carousel } from 'nuka-carousel'; diff --git a/docs/api/styling.mdx b/docs/api/styling.mdx index 95ea2f6b..1f4db56d 100644 --- a/docs/api/styling.mdx +++ b/docs/api/styling.mdx @@ -1,5 +1,5 @@ --- -sidebar_position: 4 +sidebar_position: 6 --- import { Carousel } from 'nuka-carousel'; diff --git a/docs/api/swiping.mdx b/docs/api/swiping.mdx new file mode 100644 index 00000000..dd119848 --- /dev/null +++ b/docs/api/swiping.mdx @@ -0,0 +1,67 @@ +--- +sidebar_position: 5 +--- + +import { Carousel } from 'nuka-carousel'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Swiping + +By default the carousel will allow you to drag the carousel to the next slide. You can disable this by setting the `swiping` prop to `false`. This is only enabled on mobile devices. + +### API + +| Prop Name | Type | Default Value | +| :--------- | :-------- | :------------ | +| `swiping` | `boolean` | `true` | + +### Enabled (default) + + +
+
+
+
+
+
+
+
+
+
+ + +#### Code + +```tsx + + + + + +``` + +### Disabled + + +
+
+
+
+
+
+
+
+
+
+ + +#### Code + +```tsx + + + + + +``` diff --git a/docs/api/wraparound.mdx b/docs/api/wraparound.mdx index 965541ea..b58dcecb 100644 --- a/docs/api/wraparound.mdx +++ b/docs/api/wraparound.mdx @@ -1,6 +1,6 @@ --- -sidebar_position: 2 -title: Wraparound +sidebar_position: 3 +title: Wrapping slug: / --- diff --git a/docs/v8-upgrade-guide.mdx b/docs/v8-upgrade-guide.mdx index e003ecd7..52bdf783 100644 --- a/docs/v8-upgrade-guide.mdx +++ b/docs/v8-upgrade-guide.mdx @@ -74,8 +74,6 @@ Nuka v8 and above are completely rewritten with new props and might not be compl `style` - pass styles through the className if needed. -`swiping` - default to OS/browser settings. - `tabbed` - should be native. `withoutControls` - controls are not rendered by default. Use methods to build your own next/prev triggers or style the page controls with `showPageIndicators` and `pageIndicatorProps`. diff --git a/packages/nuka/src/Carousel/Carousel.tsx b/packages/nuka/src/Carousel/Carousel.tsx index 82f8a3a6..a801b320 100644 --- a/packages/nuka/src/Carousel/Carousel.tsx +++ b/packages/nuka/src/Carousel/Carousel.tsx @@ -28,6 +28,7 @@ export type CarouselProps = CarouselCallbacks & { className?: string; autoplay?: boolean; autoplayInterval?: number; + swiping?: boolean; pageIndicatorProps?: { currentPageIndicatorClassName?: string; pageIndicatorClassName?: string; @@ -51,6 +52,7 @@ export const Carousel = forwardRef( className = '', autoplay = false, autoplayInterval = 3000, + swiping = true, pageIndicatorProps, scrollDistance = 'slide', showPageIndicators = false, @@ -103,7 +105,9 @@ export const Carousel = forwardRef( // find the closest page index based on the scroll position const scrollLeft = containerRef.current.scrollLeft; - const closestPageIndex = nint(scrollOffset, scrollLeft); + const closestPageIndex = scrollOffset.indexOf( + nint(scrollOffset, scrollLeft) + ); goToPage(closestPageIndex); }, 100); @@ -114,6 +118,7 @@ export const Carousel = forwardRef( ref={containerRef} onTouchMove={onContainerScroll} data-testid="overflow" + style={{ touchAction: swiping ? 'pan-x' : 'none' }} >
{children} From 3b818daca6b93e414c284b5912042f6e42e9218c Mon Sep 17 00:00:00 2001 From: Charlie Brown Date: Sat, 16 Mar 2024 13:44:19 -0500 Subject: [PATCH 63/69] Add nav buttons --- docs/api/autoplay.mdx | 2 +- docs/api/buttons.mdx | 53 ++++++++++++++++++ docs/api/wraparound.mdx | 1 - docs/introduction.mdx | 2 +- docs/v8-upgrade-guide.mdx | 16 +++--- packages/nuka/src/Carousel/Carousel.css | 45 +++++++++++++++- packages/nuka/src/Carousel/Carousel.tsx | 45 +++++++++++----- packages/nuka/src/Carousel/NavButtons.tsx | 54 +++++++++++++++++++ .../PageIndicators.tsx | 2 +- 9 files changed, 192 insertions(+), 28 deletions(-) create mode 100644 docs/api/buttons.mdx create mode 100644 packages/nuka/src/Carousel/NavButtons.tsx rename packages/nuka/src/{PageIndicators => Carousel}/PageIndicators.tsx (92%) diff --git a/docs/api/autoplay.mdx b/docs/api/autoplay.mdx index 248d5530..c47a4b24 100644 --- a/docs/api/autoplay.mdx +++ b/docs/api/autoplay.mdx @@ -1,5 +1,5 @@ --- -sidebar_position: 2 +sidebar_position: 3 --- import { Carousel } from 'nuka-carousel'; diff --git a/docs/api/buttons.mdx b/docs/api/buttons.mdx new file mode 100644 index 00000000..76cc56e3 --- /dev/null +++ b/docs/api/buttons.mdx @@ -0,0 +1,53 @@ +--- +sidebar_position: 2 +--- + +import { Carousel } from 'nuka-carousel'; + +# Navigation + +The carousel can show buttons to navigate between slides. + +### Details + +| Prop Name | Type | Default Value | +| :----------------- | :------- | :------------ | +| `showButtons` | boolean | `false` | + +### Example + + + + + + + +#### Code + +```tsx + + + + + +``` + +### Wraparound + +When the `wrapAround` prop is set to `false`, the buttons will be hidden when the first or last slide is active. + + + + + + + +#### Code + +```tsx + + + + + +``` diff --git a/docs/api/wraparound.mdx b/docs/api/wraparound.mdx index b58dcecb..83c0c3fd 100644 --- a/docs/api/wraparound.mdx +++ b/docs/api/wraparound.mdx @@ -1,7 +1,6 @@ --- sidebar_position: 3 title: Wrapping -slug: / --- import { BasicButtonDemo } from '../../website/src/components/basic-button-demo'; diff --git a/docs/introduction.mdx b/docs/introduction.mdx index 82f8737c..a7507e98 100644 --- a/docs/introduction.mdx +++ b/docs/introduction.mdx @@ -12,7 +12,7 @@ Small, fast, and accessibility-first React carousel library with easily customiz Nuka Carousel accepts any React component as children, and will render them as slides. - + diff --git a/docs/v8-upgrade-guide.mdx b/docs/v8-upgrade-guide.mdx index 52bdf783..85ce9560 100644 --- a/docs/v8-upgrade-guide.mdx +++ b/docs/v8-upgrade-guide.mdx @@ -12,13 +12,11 @@ Nuka v8 and above are completely rewritten with new props and might not be compl ## New Props -`scrollDistance` - -`showPageIndicators` - -`pageIndicatorProps` - -`className` +- `className` +- `pageIndicatorProps` +- `scrollDistance` +- `showButtons` +- `showPageIndicators` ## Changed Props @@ -86,7 +84,7 @@ Nuka v8 and above are completely rewritten with new props and might not be compl These v7 and below props are being worked on or are considered for v8. -`disableEdgeSwiping` - This might just be covered natively by browser/os. Not entirely sure yet. +`disableEdgeSwiping` - This might just be covered natively by browser/os. `frameAriaLabel` - would like to do sweeping functionality and docs update for all accessibility things @@ -99,5 +97,3 @@ These v7 and below props are being worked on or are considered for v8. `onUserNavigation` - would like to do sweeping functionality and docs update for all accessibility things `pauseOnHover` - not implemented, not documented. - -`showDefaultButtons?` - would be a new prop and not sure about the naming. The idea would be that there's built in forward/back buttons that don't require the user to use the imperative handle hooks. It would likely have a className for styling and children property, but also unsure about how to organize it. diff --git a/packages/nuka/src/Carousel/Carousel.css b/packages/nuka/src/Carousel/Carousel.css index ec9db172..a1f5d39a 100644 --- a/packages/nuka/src/Carousel/Carousel.css +++ b/packages/nuka/src/Carousel/Carousel.css @@ -1,3 +1,11 @@ +.nuka-container { + position: relative; +} + +.nuka-slide-container { + position: relative; +} + .nuka-overflow { overflow: scroll; scroll-behavior: smooth; @@ -17,6 +25,38 @@ scroll-snap-type: x mandatory; } +.nuka-nav { + position: absolute; + top: 0; + display: flex; + align-items: center; + justify-content: space-between; + width: 100%; + height: 100%; +} + +.nuka-nav-button { + visibility: hidden; + margin: 1rem; + display: block; + height: 2rem; + width: 2rem; + cursor: pointer; + background-color: rgb(229 231 235 / 0.5); + color: white; + border-radius: 9999px; + font-size: 1rem; + user-select: none; + + &:hover { + background-color: rgb(229 231 235 / 0.65); + } +} + +.nuka-nav-button-enabled { + visibility: visible; +} + .nuka-page-container { padding-top: 1rem; padding-bottom: 1rem; @@ -34,8 +74,9 @@ border-style: none; background-color: rgb(229 231 235 / 1); - &.active, &.active:hover { - background-color: rgb(236 72 153 / 1); + &.nuka-page-indicator-active, + &.nuka-page-indicator-active:hover { + background-color: rgb(236, 72, 153); } &:hover { diff --git a/packages/nuka/src/Carousel/Carousel.tsx b/packages/nuka/src/Carousel/Carousel.tsx index a801b320..b698b879 100644 --- a/packages/nuka/src/Carousel/Carousel.tsx +++ b/packages/nuka/src/Carousel/Carousel.tsx @@ -8,12 +8,13 @@ import { } from 'react'; import './Carousel.css'; -import { PageIndicators } from '../PageIndicators/PageIndicators'; import { useInterval } from 'src/hooks/use-interval'; import { usePaging } from 'src/hooks/use-paging'; import { useDebounced } from 'src/hooks/use-debounced'; import { useMeasurement } from 'src/hooks/use-measurement'; import { nint } from 'src/utils'; +import { NavButtons } from './NavButtons'; +import { PageIndicators } from './PageIndicators'; type ScrollDistanceType = number | 'slide' | 'screen'; @@ -28,7 +29,6 @@ export type CarouselProps = CarouselCallbacks & { className?: string; autoplay?: boolean; autoplayInterval?: number; - swiping?: boolean; pageIndicatorProps?: { currentPageIndicatorClassName?: string; pageIndicatorClassName?: string; @@ -36,6 +36,8 @@ export type CarouselProps = CarouselCallbacks & { }; scrollDistance?: ScrollDistanceType; showPageIndicators?: boolean; + showButtons?: boolean; + swiping?: boolean; wrapAround?: boolean; }; @@ -52,6 +54,7 @@ export const Carousel = forwardRef( className = '', autoplay = false, autoplayInterval = 3000, + showButtons = false, swiping = true, pageIndicatorProps, scrollDistance = 'slide', @@ -111,18 +114,36 @@ export const Carousel = forwardRef( goToPage(closestPageIndex); }, 100); + // -- button nav + const enablePrevNavButton = wrapAround || currentPage > 0; + const enableNextNavButton = wrapAround || currentPage < totalPages - 1; + return ( -
-
-
- {children} +
+
+
+
+ {children} +
+ {showButtons && ( + + )}
{showPageIndicators && ( void; + goForward: () => void; +}; + +export function NavButtons({ + enablePrevNavButton, + enableNextNavButton, + goBack, + goForward, +}: NavButtonsProps) { + return ( +
+ + + + + + + + + + +
+ ); +} diff --git a/packages/nuka/src/PageIndicators/PageIndicators.tsx b/packages/nuka/src/Carousel/PageIndicators.tsx similarity index 92% rename from packages/nuka/src/PageIndicators/PageIndicators.tsx rename to packages/nuka/src/Carousel/PageIndicators.tsx index 0b71e788..b0b1e757 100644 --- a/packages/nuka/src/PageIndicators/PageIndicators.tsx +++ b/packages/nuka/src/Carousel/PageIndicators.tsx @@ -27,7 +27,7 @@ export const PageIndicators = ({ className={classNames( pageIndicatorClassName || 'nuka-page-indicator', currentPageIndex === index - ? currentPageIndicatorClassName || 'active' + ? currentPageIndicatorClassName || 'nuka-page-indicator-active' : '' )} /> From 356e710322ba269bc47b49918295795c0055f52d Mon Sep 17 00:00:00 2001 From: Charlie Brown Date: Sat, 16 Mar 2024 14:08:51 -0500 Subject: [PATCH 64/69] Improve doc page main demo --- docs/introduction.mdx | 12 +--- website/src/components/full-feature-demo.tsx | 59 ++++++++++++++++++++ 2 files changed, 61 insertions(+), 10 deletions(-) create mode 100644 website/src/components/full-feature-demo.tsx diff --git a/docs/introduction.mdx b/docs/introduction.mdx index a7507e98..36ed2f29 100644 --- a/docs/introduction.mdx +++ b/docs/introduction.mdx @@ -4,16 +4,8 @@ title: Introduction slug: / --- -import { Carousel } from 'nuka-carousel'; +import { FullFeatureDemo } from '../website/src/components/full-feature-demo'; Small, fast, and accessibility-first React carousel library with easily customizable UI and behavior to fit your brand and site. -## Demo - -Nuka Carousel accepts any React component as children, and will render them as slides. - - - - - - + diff --git a/website/src/components/full-feature-demo.tsx b/website/src/components/full-feature-demo.tsx new file mode 100644 index 00000000..27e62db1 --- /dev/null +++ b/website/src/components/full-feature-demo.tsx @@ -0,0 +1,59 @@ +import React from 'react'; +import { Carousel } from 'nuka-carousel'; + +const FeatureCard = ({ src, title }: { src: string; title: string }) => ( +
+
+ + + +
+ +
+ {title} +
+
+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do + eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad + minim veniam, quis nostrud exercitation ullamco laboris nisi ut + aliquip ex ea commodo consequat. +

+
+
+
+); + +export const FullFeatureDemo = () => { + return ( +
+ + + + + + + +
+ ); +}; From 5cacb02e224dfdbaf56b14374b9e44d346ab24d1 Mon Sep 17 00:00:00 2001 From: Charlie Brown Date: Sun, 17 Mar 2024 07:50:48 -0500 Subject: [PATCH 65/69] Fix slide page count --- packages/nuka/src/Carousel/Carousel.tsx | 3 --- packages/nuka/src/hooks/use-measurement.tsx | 19 +++++++++++++------ 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/packages/nuka/src/Carousel/Carousel.tsx b/packages/nuka/src/Carousel/Carousel.tsx index b698b879..fe9e066b 100644 --- a/packages/nuka/src/Carousel/Carousel.tsx +++ b/packages/nuka/src/Carousel/Carousel.tsx @@ -1,5 +1,4 @@ import { - Children, forwardRef, ReactNode, useEffect, @@ -69,9 +68,7 @@ export const Carousel = forwardRef( const wrapperRef = useRef(null); // -- update page count and scroll offset based on scroll distance - const totalSlides = Children.count(children); const { totalPages, scrollOffset } = useMeasurement({ - totalSlides, scrollDistance, containerRef, wrapperRef, diff --git a/packages/nuka/src/hooks/use-measurement.tsx b/packages/nuka/src/hooks/use-measurement.tsx index 941db82f..68e39ad2 100644 --- a/packages/nuka/src/hooks/use-measurement.tsx +++ b/packages/nuka/src/hooks/use-measurement.tsx @@ -4,19 +4,17 @@ import { useDebounced } from 'src/hooks/use-debounced'; import { arraySeq, arraySum } from 'src/utils'; type MeasurementProps = { - totalSlides: number; scrollDistance: number | 'slide' | 'screen'; containerRef: React.RefObject; wrapperRef: React.RefObject; }; export function useMeasurement({ - totalSlides, scrollDistance, containerRef, wrapperRef, }: MeasurementProps) { - const [totalPages, setTotalPages] = useState(totalSlides); + const [totalPages, setTotalPages] = useState(0); const [scrollOffset, setScrollOffset] = useState(arraySeq(totalPages, 0)); const measure = useCallback(() => { @@ -45,8 +43,17 @@ export function useMeasurement({ (child) => (child as HTMLElement).offsetWidth ); - setTotalPages(totalSlides); - setScrollOffset(arraySum([0, ...offsets.slice(0, -1)])); + const scrollOffsets = arraySum([0, ...offsets.slice(0, -1)]); + + // find the index of the scroll offset that is greater than + // the remainder of the full width and window width + const remainder = + wrapperRef.current.scrollWidth - wrapperRef.current.offsetWidth; + const pageCount = + scrollOffsets.findIndex((offset) => offset >= remainder) + 1; + + setTotalPages(pageCount); + setScrollOffset(scrollOffsets); } break; } @@ -65,7 +72,7 @@ export function useMeasurement({ } } }); - }, [scrollDistance, totalSlides, containerRef, wrapperRef]); + }, [scrollDistance, containerRef, wrapperRef]); // debounce the measure function when resizing so // it doesnt fire on every pixel change From db0577448876ed46c90c1f2f383febd18fc3d3ab Mon Sep 17 00:00:00 2001 From: Charlie Brown Date: Sun, 17 Mar 2024 09:27:41 -0500 Subject: [PATCH 66/69] Namespace to avoid conflicts with consumer app --- .../src/Carousel/CarouselTests.stories.tsx | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/packages/nuka/src/Carousel/CarouselTests.stories.tsx b/packages/nuka/src/Carousel/CarouselTests.stories.tsx index 309c33af..33a846c7 100644 --- a/packages/nuka/src/Carousel/CarouselTests.stories.tsx +++ b/packages/nuka/src/Carousel/CarouselTests.stories.tsx @@ -63,14 +63,14 @@ export const FixedWidthScroll: Story = { await userEvent.click(forwardButton); await waitFor(async () => { - expect(canvas.getByTestId('overflow').scrollLeft).toEqual( + expect(canvas.getByTestId('nuka-overflow').scrollLeft).toEqual( FIXED_SCROLL_DISTANCE ); }); await userEvent.click(backButton); await waitFor(async () => { - expect(canvas.getByTestId('overflow').scrollLeft).toEqual(0); + expect(canvas.getByTestId('nuka-overflow').scrollLeft).toEqual(0); }); }, }; @@ -90,9 +90,9 @@ export const Slide: Story = { play: async ({ canvasElement }) => { const canvas = within(canvasElement); - const overflow = canvas.getByTestId('overflow'); + const overflow = canvas.getByTestId('nuka-overflow'); - await expect(canvas.getByTestId('wrapper').classList).toContain( + await expect(canvas.getByTestId('nuka-wrapper').classList).toContain( 'slide__with-gap' ); const forwardButton = canvas.getByText('next'); @@ -101,17 +101,17 @@ export const Slide: Story = { await waitFor(async () => { expect(overflow.scrollLeft).toEqual( - (canvas.getByTestId('wrapper').children[1] as HTMLElement).offsetLeft - - overflow.offsetLeft + (canvas.getByTestId('nuka-wrapper').children[1] as HTMLElement) + .offsetLeft - overflow.offsetLeft ); }); await userEvent.click(forwardButton); await waitFor(async () => { - expect(canvas.getByTestId('overflow').scrollLeft).toEqual( - (canvas.getByTestId('wrapper').children[2] as HTMLElement).offsetLeft - - canvas.getByTestId('overflow').offsetLeft + expect(canvas.getByTestId('nuka-overflow').scrollLeft).toEqual( + (canvas.getByTestId('nuka-wrapper').children[2] as HTMLElement) + .offsetLeft - canvas.getByTestId('nuka-overflow').offsetLeft ); }); @@ -120,7 +120,7 @@ export const Slide: Story = { setTimeout(async () => { await userEvent.click(forwardButton); await waitFor(async () => { - expect(canvas.getByTestId('overflow').scrollLeft).toEqual(0); + expect(canvas.getByTestId('nuka-overflow').scrollLeft).toEqual(0); }); }, 300); }, @@ -170,12 +170,12 @@ export const AutoPlay: Story = { play: async ({ canvasElement }) => { const canvas = within(canvasElement); - const overflow = canvas.getByTestId('overflow'); - expect(canvas.getByTestId('overflow').scrollLeft).toEqual(0); + const overflow = canvas.getByTestId('nuka-overflow'); + expect(canvas.getByTestId('nuka-overflow').scrollLeft).toEqual(0); setTimeout(async () => { await waitFor(async () => { - expect(canvas.getByTestId('overflow').scrollLeft).toEqual( + expect(canvas.getByTestId('nuka-overflow').scrollLeft).toEqual( (overflow.children[0].children[1] as HTMLElement).offsetLeft - overflow.offsetLeft ); @@ -208,7 +208,7 @@ export const PageIndicators: Story = { play: async ({ canvasElement }) => { const canvas = within(canvasElement); - const carouselWidth = canvas.getByTestId('wrapper').clientWidth; + const carouselWidth = canvas.getByTestId('nuka-wrapper').clientWidth; const pageIndicatorContainer = canvas.getByTestId('pageIndicatorContainer'); @@ -224,12 +224,12 @@ export const PageIndicators: Story = { await waitFor(async () => { userEvent.click(pageIndicatorContainer.children[1]); - expect(canvas.getByTestId('overflow').scrollLeft).toEqual(carouselWidth); + expect(canvas.getByTestId('nuka-overflow').scrollLeft).toEqual(carouselWidth); }); await waitFor(async () => { userEvent.click(pageIndicatorContainer.children[0]); - expect(canvas.getByTestId('overflow').scrollLeft).toEqual(0); + expect(canvas.getByTestId('nuka-overflow').scrollLeft).toEqual(0); }); }, }; From 623dee3986fc91b89e64bc6b1f8f1b0f53254d82 Mon Sep 17 00:00:00 2001 From: Charlie Brown Date: Sun, 17 Mar 2024 09:31:01 -0500 Subject: [PATCH 67/69] Cleanup and simplify hooks --- packages/nuka/src/Carousel/Carousel.tsx | 15 +++-- packages/nuka/src/hooks/use-measurement.tsx | 69 ++++++++++----------- packages/nuka/src/hooks/use-paging.tsx | 21 ++++--- 3 files changed, 52 insertions(+), 53 deletions(-) diff --git a/packages/nuka/src/Carousel/Carousel.tsx b/packages/nuka/src/Carousel/Carousel.tsx index fe9e066b..9e2254f5 100644 --- a/packages/nuka/src/Carousel/Carousel.tsx +++ b/packages/nuka/src/Carousel/Carousel.tsx @@ -65,20 +65,18 @@ export const Carousel = forwardRef( ref ) => { const containerRef = useRef(null); - const wrapperRef = useRef(null); // -- update page count and scroll offset based on scroll distance const { totalPages, scrollOffset } = useMeasurement({ scrollDistance, containerRef, - wrapperRef, }); // -- paging - const { currentPage, goBack, goForward, goToPage } = usePaging( + const { currentPage, goBack, goForward, goToPage } = usePaging({ totalPages, - wrapAround - ); + wrapAround, + }); // -- autoplay useInterval(goForward, autoplayInterval, autoplay); @@ -122,13 +120,14 @@ export const Carousel = forwardRef( className="nuka-overflow" ref={containerRef} onTouchMove={onContainerScroll} - data-testid="overflow" + id="nuka-overflow" + data-testid="nuka-overflow" style={{ touchAction: swiping ? 'pan-x' : 'none' }} >
{children}
diff --git a/packages/nuka/src/hooks/use-measurement.tsx b/packages/nuka/src/hooks/use-measurement.tsx index 68e39ad2..06ee0fe0 100644 --- a/packages/nuka/src/hooks/use-measurement.tsx +++ b/packages/nuka/src/hooks/use-measurement.tsx @@ -4,15 +4,13 @@ import { useDebounced } from 'src/hooks/use-debounced'; import { arraySeq, arraySum } from 'src/utils'; type MeasurementProps = { - scrollDistance: number | 'slide' | 'screen'; containerRef: React.RefObject; - wrapperRef: React.RefObject; + scrollDistance: number | 'slide' | 'screen'; }; export function useMeasurement({ - scrollDistance, containerRef, - wrapperRef, + scrollDistance, }: MeasurementProps) { const [totalPages, setTotalPages] = useState(0); const [scrollOffset, setScrollOffset] = useState(arraySeq(totalPages, 0)); @@ -22,49 +20,46 @@ export function useMeasurement({ // correct dimensions for the calculation // note: this is similar to useLayout, but runs async requestAnimationFrame(() => { + const container = containerRef.current; + if (!container) return; + + // determine the width of the content that is not visible (overflow) + const remainder = container.scrollWidth - container.offsetWidth; + switch (scrollDistance) { case 'screen': { - if (containerRef.current && wrapperRef.current) { - const pageCount = Math.ceil( - wrapperRef.current.scrollWidth / containerRef.current.offsetWidth - ); - setTotalPages(pageCount); - setScrollOffset( - arraySeq(pageCount, containerRef.current.offsetWidth) - ); - } + const pageCount = Math.ceil( + container.scrollWidth / container.offsetWidth + ); + setTotalPages(pageCount); + setScrollOffset(arraySeq(pageCount, container.offsetWidth)); break; } case 'slide': { - if (wrapperRef.current) { - // creates an array of slide widths in order to support - // slides of varying widths as children - const offsets = Array.from(wrapperRef.current.children).map( - (child) => (child as HTMLElement).offsetWidth - ); + // creates an array of slide widths in order to support + // slides of varying widths as children + const children = + container.querySelector('#nuka-wrapper')?.children || []; + const offsets = Array.from(children).map( + (child) => (child as HTMLElement).offsetWidth + ); - const scrollOffsets = arraySum([0, ...offsets.slice(0, -1)]); + const scrollOffsets = arraySum([0, ...offsets.slice(0, -1)]); - // find the index of the scroll offset that is greater than - // the remainder of the full width and window width - const remainder = - wrapperRef.current.scrollWidth - wrapperRef.current.offsetWidth; - const pageCount = - scrollOffsets.findIndex((offset) => offset >= remainder) + 1; + // find the index of the scroll offset that is greater than + // the remainder of the full width and window width + const pageCount = + scrollOffsets.findIndex((offset) => offset >= remainder) + 1; - setTotalPages(pageCount); - setScrollOffset(scrollOffsets); - } + setTotalPages(pageCount); + setScrollOffset(scrollOffsets); break; } default: { - if (containerRef.current && typeof scrollDistance === 'number') { - const carouselTotalWidth = - containerRef.current.scrollWidth - - containerRef.current.offsetWidth; - - const pageCount = - Math.ceil(carouselTotalWidth / scrollDistance) + 1; + if (typeof scrollDistance === 'number') { + // find the number of pages required to scroll the all slides + // to the end of the container + const pageCount = Math.ceil(remainder / scrollDistance) + 1; setTotalPages(pageCount); setScrollOffset(arraySeq(pageCount, scrollDistance)); @@ -72,7 +67,7 @@ export function useMeasurement({ } } }); - }, [scrollDistance, containerRef, wrapperRef]); + }, [scrollDistance, containerRef]); // debounce the measure function when resizing so // it doesnt fire on every pixel change diff --git a/packages/nuka/src/hooks/use-paging.tsx b/packages/nuka/src/hooks/use-paging.tsx index 99e0c42a..969592f8 100644 --- a/packages/nuka/src/hooks/use-paging.tsx +++ b/packages/nuka/src/hooks/use-paging.tsx @@ -7,28 +7,33 @@ type UsePagingReturnType = { goBack: () => void; }; -export function usePaging( - totalSlides: number, - wrapAround: boolean -): UsePagingReturnType { +type PagingProps = { + totalPages: number; + wrapAround: boolean; +}; + +export function usePaging({ + totalPages, + wrapAround, +}: PagingProps): UsePagingReturnType { const [currentPage, setCurrentPage] = useState(0); const goToPage = (idx: number) => { - if (idx < 0 || idx >= totalSlides) return; + if (idx < 0 || idx >= totalPages) return; setCurrentPage(idx); }; const goForward = () => { if (wrapAround) { - setCurrentPage((prev) => (prev + 1) % totalSlides); + setCurrentPage((prev) => (prev + 1) % totalPages); } else { - setCurrentPage((prev) => Math.min(prev + 1, totalSlides - 1)); + setCurrentPage((prev) => Math.min(prev + 1, totalPages - 1)); } }; const goBack = () => { if (wrapAround) { - setCurrentPage((prev) => (prev - 1 + totalSlides) % totalSlides); + setCurrentPage((prev) => (prev - 1 + totalPages) % totalPages); } else { setCurrentPage((prev) => Math.max(prev - 1, 0)); } From 195250599659c8bbd7bdfb82d62be7eb130729d8 Mon Sep 17 00:00:00 2001 From: Charlie Brown Date: Sun, 17 Mar 2024 10:33:33 -0500 Subject: [PATCH 68/69] Update website branding --- LICENSE | 4 +-- README.md | 8 ++--- website/docusaurus.config.js | 29 +++++++-------- website/src/components/full-feature-demo.tsx | 2 +- website/src/css/custom.css | 37 ++++++++++++++++++++ website/static/img/formidable-f.svg | 33 ----------------- website/static/img/formidable-icon.svg | 3 -- website/static/img/nearform-icon-white.svg | 7 ++++ website/static/img/nearform-icon.svg | 4 +++ website/static/img/nearform-logo-white.svg | 4 +++ website/static/img/nearform-logo.svg | 7 ++++ 11 files changed, 78 insertions(+), 60 deletions(-) delete mode 100644 website/static/img/formidable-f.svg delete mode 100644 website/static/img/formidable-icon.svg create mode 100644 website/static/img/nearform-icon-white.svg create mode 100644 website/static/img/nearform-icon.svg create mode 100644 website/static/img/nearform-logo-white.svg create mode 100644 website/static/img/nearform-logo.svg diff --git a/LICENSE b/LICENSE index 8c44e8e9..b1e24e45 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2013 - 2018 Formidable Labs, Inc. +Copyright (c) 2013-2024 Formidable Labs, Inc. Copyright (c) 2018 Roman Charugin, Alex Smith, Matt Sungwook, and potentially other DefinitelyTyped contributors. @@ -20,4 +20,4 @@ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md index 42b47613..30e08d6f 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[![Nuka Carousel — Formidable, We build the modern web](https://raw.githubusercontent.com/FormidableLabs/nuka-carousel/main/Nuka-Hero.png)](https://formidable.com/open-source/nuka-carousel) +[![Nuka Carousel](https://raw.githubusercontent.com/FormidableLabs/nuka-carousel/main/Nuka-Hero.png)](https://commerce.nearform.com/open-source/nuka-carousel) [![Maintenance Status][maintenance-image]](#maintenance-status) @@ -15,11 +15,11 @@ To add `nuka-carousel` to your project run the following command in your project $ yarn add nuka-carousel ``` -Come learn more and see a live demo at our [docs site](https://formidable.com/open-source/nuka-carousel)! +Come learn more and see a live demo at our [docs site](https://commerce.nearform.com/open-source/nuka-carousel)! ## Support -Have a question about react-live? Submit an issue in this repository using the +Have a question about nuka-carousel? Submit an issue in this repository using the ["Question" template](https://github.com/FormidableLabs/nuka-carousel/issues/new?template=question.md). Notice something inaccurate or confusing? Feel free to [open an issue](https://github.com/FormidableLabs/nuka-carousel/issues/new/choose) or [make a pull request](https://github.com/FormidableLabs/nuka-carousel/pulls) to help improve the documentation for everyone! @@ -33,6 +33,6 @@ See the [Contribution Docs](CONTRIBUTING.md). ### Maintenance Status -**Active:** Formidable is actively working on this project, and we expect to continue for work for the foreseeable future. Bug reports, feature requests and pull requests are welcome. +**Active:** Nearform is actively working on this project, and we expect to continue for work for the foreseeable future. Bug reports, feature requests and pull requests are welcome. [maintenance-image]: https://img.shields.io/badge/maintenance-active-green.svg?color=brightgreen&style=flat diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js index 87de089f..0ef03909 100644 --- a/website/docusaurus.config.js +++ b/website/docusaurus.config.js @@ -9,17 +9,12 @@ const config = { title: 'Nuka Carousel', tagline: 'Small, fast, and accessibility-first React carousel library with easily customizable UI and behavior to fit your brand and site.', - url: 'https://formidable.com', + url: 'https://commerce.nearform.com', baseUrl: process.env.VERCEL_ENV === 'preview' ? '/' : '/open-source/nuka-carousel', onBrokenLinks: 'throw', onBrokenMarkdownLinks: 'warn', - favicon: 'img/favicon.ico', - - // GitHub pages deployment config. - // If you aren't using GitHub pages, you don't need these. - organizationName: 'Formidable', - projectName: 'nuka-carousel', // Usually your repo name. + favicon: 'img/nearform-icon.svg', // Even if you don't use internalization, you can use this field to set useful // metadata like html lang. For example, if your site is Chinese, you may want @@ -68,8 +63,8 @@ const config = { navbar: { title: 'Nuka Carousel', logo: { - alt: 'Formidable logo', - src: 'img/formidable-f.svg', + alt: 'Nearform logo', + src: 'img/nearform-logo-white.svg', }, items: [ { @@ -78,17 +73,17 @@ const config = { 'aria-label': 'GitHub Repository', position: 'right', }, - { - href: 'https://formidable.com', - className: 'header-formidable-link', - 'aria-label': 'Formidable Website', - position: 'right', - }, ], }, footer: { - style: 'dark', - copyright: `Copyright © ${new Date().getFullYear()} Formidable`, + logo: { + alt: 'Nearform logo', + src: 'img/nearform-logo-white.svg', + href: 'https://nearform.com', + width: 100, + height: 100, + }, + copyright: `Copyright © 2013-${new Date().getFullYear()} Nearform`, }, prism: { theme: lightCodeTheme, diff --git a/website/src/components/full-feature-demo.tsx b/website/src/components/full-feature-demo.tsx index 27e62db1..70697a34 100644 --- a/website/src/components/full-feature-demo.tsx +++ b/website/src/components/full-feature-demo.tsx @@ -30,7 +30,7 @@ export const FullFeatureDemo = () => { - - - - - - - - - - diff --git a/website/static/img/formidable-icon.svg b/website/static/img/formidable-icon.svg deleted file mode 100644 index 3fed8cbf..00000000 --- a/website/static/img/formidable-icon.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/website/static/img/nearform-icon-white.svg b/website/static/img/nearform-icon-white.svg new file mode 100644 index 00000000..5ec896a9 --- /dev/null +++ b/website/static/img/nearform-icon-white.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/website/static/img/nearform-icon.svg b/website/static/img/nearform-icon.svg new file mode 100644 index 00000000..4e95a020 --- /dev/null +++ b/website/static/img/nearform-icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/website/static/img/nearform-logo-white.svg b/website/static/img/nearform-logo-white.svg new file mode 100644 index 00000000..cd49ab39 --- /dev/null +++ b/website/static/img/nearform-logo-white.svg @@ -0,0 +1,4 @@ + + + + diff --git a/website/static/img/nearform-logo.svg b/website/static/img/nearform-logo.svg new file mode 100644 index 00000000..f455f561 --- /dev/null +++ b/website/static/img/nearform-logo.svg @@ -0,0 +1,7 @@ + + + + + + + From 8c146870eb66f0d52d428928ea6df503b3733f79 Mon Sep 17 00:00:00 2001 From: Charlie Brown Date: Mon, 18 Mar 2024 14:43:26 -0500 Subject: [PATCH 69/69] Add basic docs landing page --- pnpm-lock.yaml | 2448 ++++++++++++++++++------------ website/docusaurus.config.js | 3 +- website/package.json | 2 + website/src/pages/.keep | 0 website/src/pages/index.tsx | 108 ++ website/static/img/av_cover.jpg | Bin 0 -> 490229 bytes website/static/img/product-1.jpg | Bin 0 -> 34157 bytes website/static/img/product-2.jpg | Bin 0 -> 34209 bytes website/static/img/product-3.jpg | Bin 0 -> 24458 bytes website/static/img/product-4.jpg | Bin 0 -> 37084 bytes website/static/img/product-5.jpg | Bin 0 -> 24574 bytes 11 files changed, 1561 insertions(+), 1000 deletions(-) delete mode 100644 website/src/pages/.keep create mode 100644 website/src/pages/index.tsx create mode 100644 website/static/img/av_cover.jpg create mode 100644 website/static/img/product-1.jpg create mode 100644 website/static/img/product-2.jpg create mode 100644 website/static/img/product-3.jpg create mode 100644 website/static/img/product-4.jpg create mode 100644 website/static/img/product-5.jpg diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 52fe125d..28447fe1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -224,6 +224,9 @@ importers: '@docusaurus/core': specifier: 2.4.0 version: 2.4.0(@docusaurus/types@2.4.0)(@types/node@18.7.5)(react-dom@18.2.0)(react@18.2.0)(ts-node@10.9.1)(typescript@4.7.4) + '@docusaurus/plugin-content-pages': + specifier: 2.4.0 + version: 2.4.0(@types/node@18.7.5)(react-dom@18.2.0)(react@18.2.0)(ts-node@10.9.1)(typescript@4.7.4) '@docusaurus/preset-classic': specifier: 2.4.0 version: 2.4.0(@algolia/client-search@4.17.0)(@types/node@18.7.5)(react-dom@18.2.0)(react@18.2.0)(ts-node@10.9.1)(typescript@4.7.4) @@ -267,6 +270,9 @@ importers: autoprefixer: specifier: ^10.4.14 version: 10.4.14(postcss@8.4.21) + formidable-oss-badges: + specifier: ^1.3.2 + version: 1.3.2(react-dom@18.2.0)(react@18.2.0) postcss: specifier: ^8.4.21 version: 8.4.21 @@ -439,26 +445,12 @@ packages: dependencies: '@babel/highlight': 7.18.6 - /@babel/code-frame@7.21.4: - resolution: {integrity: sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.22.20 - - /@babel/code-frame@7.22.13: - resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.22.20 - chalk: 2.4.2 - /@babel/code-frame@7.23.5: resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} engines: {node: '>=6.9.0'} dependencies: '@babel/highlight': 7.23.4 chalk: 2.4.2 - dev: true /@babel/compat-data@7.18.8: resolution: {integrity: sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==} @@ -467,24 +459,24 @@ packages: /@babel/compat-data@7.23.2: resolution: {integrity: sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==} engines: {node: '>=6.9.0'} + dev: true /@babel/compat-data@7.23.5: resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} engines: {node: '>=6.9.0'} - dev: true /@babel/core@7.12.9: resolution: {integrity: sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.22.13 - '@babel/generator': 7.23.0 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.12.9) - '@babel/helpers': 7.21.0 - '@babel/parser': 7.23.0 - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.2 - '@babel/types': 7.23.0 + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.12.9) + '@babel/helpers': 7.23.9 + '@babel/parser': 7.23.9 + '@babel/template': 7.23.9 + '@babel/traverse': 7.23.9 + '@babel/types': 7.23.9 convert-source-map: 1.8.0 debug: 4.3.4 gensync: 1.0.0-beta.2 @@ -519,42 +511,20 @@ packages: transitivePeerDependencies: - supports-color - /@babel/core@7.21.4: - resolution: {integrity: sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.2.0 - '@babel/code-frame': 7.21.4 - '@babel/generator': 7.21.4 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-module-transforms': 7.21.2 - '@babel/helpers': 7.21.0 - '@babel/parser': 7.21.4 - '@babel/template': 7.20.7 - '@babel/traverse': 7.21.4 - '@babel/types': 7.23.0 - convert-source-map: 1.8.0 - debug: 4.3.4 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - /@babel/core@7.23.2: resolution: {integrity: sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.0 - '@babel/code-frame': 7.22.13 - '@babel/generator': 7.23.0 + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) - '@babel/helpers': 7.23.2 - '@babel/parser': 7.23.0 - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.2 - '@babel/types': 7.23.0 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.2) + '@babel/helpers': 7.23.9 + '@babel/parser': 7.23.9 + '@babel/template': 7.23.9 + '@babel/traverse': 7.23.9 + '@babel/types': 7.23.9 convert-source-map: 2.0.0 debug: 4.3.4 gensync: 1.0.0-beta.2 @@ -562,6 +532,7 @@ packages: semver: 6.3.1 transitivePeerDependencies: - supports-color + dev: true /@babel/core@7.23.9: resolution: {integrity: sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==} @@ -584,7 +555,6 @@ packages: semver: 6.3.1 transitivePeerDependencies: - supports-color - dev: true /@babel/generator@7.18.9: resolution: {integrity: sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug==} @@ -594,23 +564,15 @@ packages: '@jridgewell/gen-mapping': 0.3.2 jsesc: 2.5.2 - /@babel/generator@7.21.4: - resolution: {integrity: sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.0 - '@jridgewell/gen-mapping': 0.3.2 - '@jridgewell/trace-mapping': 0.3.17 - jsesc: 2.5.2 - /@babel/generator@7.23.0: resolution: {integrity: sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.0 + '@babel/types': 7.23.9 '@jridgewell/gen-mapping': 0.3.2 '@jridgewell/trace-mapping': 0.3.19 jsesc: 2.5.2 + dev: true /@babel/generator@7.23.6: resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} @@ -620,32 +582,31 @@ packages: '@jridgewell/gen-mapping': 0.3.2 '@jridgewell/trace-mapping': 0.3.19 jsesc: 2.5.2 - dev: true /@babel/helper-annotate-as-pure@7.18.6: resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.0 + '@babel/types': 7.23.9 /@babel/helper-annotate-as-pure@7.22.5: resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.0 + '@babel/types': 7.23.9 /@babel/helper-builder-binary-assignment-operator-visitor@7.18.9: resolution: {integrity: sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-explode-assignable-expression': 7.18.6 - '@babel/types': 7.23.0 + '@babel/types': 7.23.9 /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15: resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.0 + '@babel/types': 7.23.9 dev: true /@babel/helper-compilation-targets@7.18.9(@babel/core@7.18.9): @@ -660,14 +621,14 @@ packages: browserslist: 4.21.5 semver: 6.3.0 - /@babel/helper-compilation-targets@7.18.9(@babel/core@7.21.4): + /@babel/helper-compilation-targets@7.18.9(@babel/core@7.23.9): resolution: {integrity: sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/compat-data': 7.18.8 - '@babel/core': 7.21.4 + '@babel/core': 7.23.9 '@babel/helper-validator-option': 7.18.6 browserslist: 4.21.5 semver: 6.3.0 @@ -677,11 +638,12 @@ packages: resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/compat-data': 7.23.2 - '@babel/helper-validator-option': 7.22.15 - browserslist: 4.22.1 + '@babel/compat-data': 7.23.5 + '@babel/helper-validator-option': 7.23.5 + browserslist: 4.23.0 lru-cache: 5.1.1 semver: 6.3.1 + dev: true /@babel/helper-compilation-targets@7.23.6: resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} @@ -692,7 +654,6 @@ packages: browserslist: 4.23.0 lru-cache: 5.1.1 semver: 6.3.1 - dev: true /@babel/helper-create-class-features-plugin@7.18.9(@babel/core@7.18.9): resolution: {integrity: sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw==} @@ -702,58 +663,39 @@ packages: dependencies: '@babel/core': 7.18.9 '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.18.9 - '@babel/helper-member-expression-to-functions': 7.18.9 - '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/helper-replace-supers': 7.18.9 - '@babel/helper-split-export-declaration': 7.18.6 - transitivePeerDependencies: - - supports-color - - /@babel/helper-create-class-features-plugin@7.18.9(@babel/core@7.21.4): - resolution: {integrity: sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.18.9 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 '@babel/helper-member-expression-to-functions': 7.18.9 '@babel/helper-optimise-call-expression': 7.18.6 '@babel/helper-replace-supers': 7.18.9 - '@babel/helper-split-export-declaration': 7.18.6 + '@babel/helper-split-export-declaration': 7.22.6 transitivePeerDependencies: - supports-color - dev: false - /@babel/helper-create-class-features-plugin@7.18.9(@babel/core@7.23.2): + /@babel/helper-create-class-features-plugin@7.18.9(@babel/core@7.23.9): resolution: {integrity: sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.9 '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.18.9 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 '@babel/helper-member-expression-to-functions': 7.18.9 '@babel/helper-optimise-call-expression': 7.18.6 '@babel/helper-replace-supers': 7.18.9 - '@babel/helper-split-export-declaration': 7.18.6 + '@babel/helper-split-export-declaration': 7.22.6 transitivePeerDependencies: - supports-color - dev: true - /@babel/helper-create-class-features-plugin@7.21.4(@babel/core@7.21.4): + /@babel/helper-create-class-features-plugin@7.21.4(@babel/core@7.23.9): resolution: {integrity: sha512-46QrX2CQlaFRF4TkwfTt6nJD7IHq8539cCL7SDpqWSDeJKY1xylKKY5F/33mJhLZ3mFvKv2gGrVS6NkyF6qs+Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.9 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 @@ -784,6 +726,24 @@ packages: semver: 6.3.1 dev: true + /@babel/helper-create-class-features-plugin@7.22.15(@babel/core@7.23.9): + resolution: {integrity: sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.9) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + semver: 6.3.1 + dev: true + /@babel/helper-create-regexp-features-plugin@7.18.6(@babel/core@7.18.9): resolution: {integrity: sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==} engines: {node: '>=6.9.0'} @@ -794,38 +754,37 @@ packages: '@babel/helper-annotate-as-pure': 7.18.6 regexpu-core: 5.1.0 - /@babel/helper-create-regexp-features-plugin@7.18.6(@babel/core@7.21.4): + /@babel/helper-create-regexp-features-plugin@7.18.6(@babel/core@7.23.9): resolution: {integrity: sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.9 '@babel/helper-annotate-as-pure': 7.18.6 regexpu-core: 5.1.0 dev: false - /@babel/helper-create-regexp-features-plugin@7.21.4(@babel/core@7.21.4): + /@babel/helper-create-regexp-features-plugin@7.21.4(@babel/core@7.23.2): resolution: {integrity: sha512-M00OuhU+0GyZ5iBBN9czjugzWrEq2vDpf/zCYHxxf93ul/Q5rv+a5h+/+0WnI1AebHNVtl5bFV0qsJoH23DbfA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.2 '@babel/helper-annotate-as-pure': 7.22.5 regexpu-core: 5.3.2 - dev: false + dev: true - /@babel/helper-create-regexp-features-plugin@7.21.4(@babel/core@7.23.2): + /@babel/helper-create-regexp-features-plugin@7.21.4(@babel/core@7.23.9): resolution: {integrity: sha512-M00OuhU+0GyZ5iBBN9czjugzWrEq2vDpf/zCYHxxf93ul/Q5rv+a5h+/+0WnI1AebHNVtl5bFV0qsJoH23DbfA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.9 '@babel/helper-annotate-as-pure': 7.22.5 regexpu-core: 5.3.2 - dev: true /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} @@ -839,6 +798,18 @@ packages: semver: 6.3.1 dev: true + /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.23.9): + resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-annotate-as-pure': 7.22.5 + regexpu-core: 5.3.2 + semver: 6.3.1 + dev: true + /@babel/helper-define-polyfill-provider@0.3.2(@babel/core@7.18.9): resolution: {integrity: sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg==} peerDependencies: @@ -846,7 +817,7 @@ packages: dependencies: '@babel/core': 7.18.9 '@babel/helper-compilation-targets': 7.18.9(@babel/core@7.18.9) - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.22.5 debug: 4.3.4 lodash.debounce: 4.0.8 resolve: 1.22.1 @@ -854,13 +825,13 @@ packages: transitivePeerDependencies: - supports-color - /@babel/helper-define-polyfill-provider@0.3.3(@babel/core@7.21.4): + /@babel/helper-define-polyfill-provider@0.3.3(@babel/core@7.23.9): resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==} peerDependencies: '@babel/core': ^7.4.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-compilation-targets': 7.22.15 + '@babel/core': 7.23.9 + '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 debug: 4.3.4 lodash.debounce: 4.0.8 @@ -876,7 +847,22 @@ packages: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: '@babel/core': 7.23.2 - '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + debug: 4.3.4 + lodash.debounce: 4.0.8 + resolve: 1.22.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-define-polyfill-provider@0.4.3(@babel/core@7.23.9): + resolution: {integrity: sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 debug: 4.3.4 lodash.debounce: 4.0.8 @@ -897,59 +883,52 @@ packages: resolution: {integrity: sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.0 + '@babel/types': 7.23.9 /@babel/helper-function-name@7.18.9: resolution: {integrity: sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.18.6 - '@babel/types': 7.18.9 - - /@babel/helper-function-name@7.21.0: - resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.15 - '@babel/types': 7.23.0 + '@babel/template': 7.23.9 + '@babel/types': 7.23.9 /@babel/helper-function-name@7.23.0: resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.22.15 - '@babel/types': 7.23.0 + '@babel/template': 7.23.9 + '@babel/types': 7.23.9 /@babel/helper-hoist-variables@7.18.6: resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.18.9 + '@babel/types': 7.23.9 /@babel/helper-hoist-variables@7.22.5: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.0 + '@babel/types': 7.23.9 /@babel/helper-member-expression-to-functions@7.18.9: resolution: {integrity: sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.0 + '@babel/types': 7.23.9 /@babel/helper-member-expression-to-functions@7.21.0: resolution: {integrity: sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.0 + '@babel/types': 7.23.9 dev: false /@babel/helper-member-expression-to-functions@7.23.0: resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.0 + '@babel/types': 7.23.9 dev: true /@babel/helper-module-imports@7.18.6: @@ -962,7 +941,7 @@ packages: resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.0 + '@babel/types': 7.23.9 /@babel/helper-module-transforms@7.18.9: resolution: {integrity: sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==} @@ -979,23 +958,8 @@ packages: transitivePeerDependencies: - supports-color - /@babel/helper-module-transforms@7.21.2: - resolution: {integrity: sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-simple-access': 7.20.2 - '@babel/helper-split-export-declaration': 7.18.6 - '@babel/helper-validator-identifier': 7.22.20 - '@babel/template': 7.20.7 - '@babel/traverse': 7.23.2 - '@babel/types': 7.23.0 - transitivePeerDependencies: - - supports-color - - /@babel/helper-module-transforms@7.23.0(@babel/core@7.12.9): - resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} + /@babel/helper-module-transforms@7.23.3(@babel/core@7.12.9): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -1008,22 +972,8 @@ packages: '@babel/helper-validator-identifier': 7.22.20 dev: false - /@babel/helper-module-transforms@7.23.0(@babel/core@7.21.4): - resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 - dev: false - - /@babel/helper-module-transforms@7.23.0(@babel/core@7.23.2): - resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} + /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -1034,6 +984,7 @@ packages: '@babel/helper-simple-access': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 '@babel/helper-validator-identifier': 7.22.20 + dev: true /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} @@ -1047,19 +998,18 @@ packages: '@babel/helper-simple-access': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 '@babel/helper-validator-identifier': 7.22.20 - dev: true /@babel/helper-optimise-call-expression@7.18.6: resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.0 + '@babel/types': 7.23.9 /@babel/helper-optimise-call-expression@7.22.5: resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.0 + '@babel/types': 7.23.9 dev: true /@babel/helper-plugin-utils@7.10.4: @@ -1070,11 +1020,6 @@ packages: resolution: {integrity: sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==} engines: {node: '>=6.9.0'} - /@babel/helper-plugin-utils@7.20.2: - resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==} - engines: {node: '>=6.9.0'} - dev: false - /@babel/helper-plugin-utils@7.22.5: resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} engines: {node: '>=6.9.0'} @@ -1087,23 +1032,23 @@ packages: dependencies: '@babel/core': 7.18.9 '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-wrap-function': 7.18.9 - '@babel/types': 7.23.0 + '@babel/types': 7.23.9 transitivePeerDependencies: - supports-color - /@babel/helper-remap-async-to-generator@7.18.9(@babel/core@7.21.4): + /@babel/helper-remap-async-to-generator@7.18.9(@babel/core@7.23.9): resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.9 '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-wrap-function': 7.18.9 - '@babel/types': 7.23.0 + '@babel/types': 7.23.9 transitivePeerDependencies: - supports-color dev: false @@ -1120,15 +1065,27 @@ packages: '@babel/helper-wrap-function': 7.22.20 dev: true + /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.23.9): + resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-wrap-function': 7.22.20 + dev: true + /@babel/helper-replace-supers@7.18.9: resolution: {integrity: sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-member-expression-to-functions': 7.18.9 '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/traverse': 7.18.9 - '@babel/types': 7.23.0 + '@babel/traverse': 7.23.9 + '@babel/types': 7.23.9 transitivePeerDependencies: - supports-color @@ -1139,9 +1096,9 @@ packages: '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-member-expression-to-functions': 7.21.0 '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.2 - '@babel/types': 7.23.0 + '@babel/template': 7.23.9 + '@babel/traverse': 7.23.9 + '@babel/types': 7.23.9 transitivePeerDependencies: - supports-color dev: false @@ -1158,63 +1115,64 @@ packages: '@babel/helper-optimise-call-expression': 7.22.5 dev: true - /@babel/helper-simple-access@7.18.6: - resolution: {integrity: sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==} + /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.9): + resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 dependencies: - '@babel/types': 7.18.9 + '@babel/core': 7.23.9 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + dev: true - /@babel/helper-simple-access@7.20.2: - resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} + /@babel/helper-simple-access@7.18.6: + resolution: {integrity: sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.0 + '@babel/types': 7.23.9 /@babel/helper-simple-access@7.22.5: resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.0 + '@babel/types': 7.23.9 /@babel/helper-skip-transparent-expression-wrappers@7.18.9: resolution: {integrity: sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.0 + '@babel/types': 7.23.9 /@babel/helper-skip-transparent-expression-wrappers@7.20.0: resolution: {integrity: sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.0 + '@babel/types': 7.23.9 /@babel/helper-skip-transparent-expression-wrappers@7.22.5: resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.0 + '@babel/types': 7.23.9 dev: true /@babel/helper-split-export-declaration@7.18.6: resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.18.9 + '@babel/types': 7.23.9 /@babel/helper-split-export-declaration@7.22.6: resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.0 - - /@babel/helper-string-parser@7.22.5: - resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} - engines: {node: '>=6.9.0'} + '@babel/types': 7.23.9 /@babel/helper-string-parser@7.23.4: resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} engines: {node: '>=6.9.0'} - dev: true /@babel/helper-validator-identifier@7.18.6: resolution: {integrity: sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==} @@ -1231,20 +1189,20 @@ packages: /@babel/helper-validator-option@7.22.15: resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} engines: {node: '>=6.9.0'} + dev: true /@babel/helper-validator-option@7.23.5: resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} engines: {node: '>=6.9.0'} - dev: true /@babel/helper-wrap-function@7.18.9: resolution: {integrity: sha512-cG2ru3TRAL6a60tfQflpEfs4ldiPwF6YW3zfJiRgmoFVIaC1vGnBBgatfec+ZUziPHkHSaXAuEck3Cdkf3eRpQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-function-name': 7.18.9 - '@babel/template': 7.20.7 - '@babel/traverse': 7.23.2 - '@babel/types': 7.23.0 + '@babel/helper-function-name': 7.23.0 + '@babel/template': 7.23.9 + '@babel/traverse': 7.23.9 + '@babel/types': 7.23.9 transitivePeerDependencies: - supports-color @@ -1253,8 +1211,8 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/helper-function-name': 7.23.0 - '@babel/template': 7.22.15 - '@babel/types': 7.23.0 + '@babel/template': 7.23.9 + '@babel/types': 7.23.9 dev: true /@babel/helpers@7.18.9: @@ -1267,26 +1225,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/helpers@7.21.0: - resolution: {integrity: sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.20.7 - '@babel/traverse': 7.23.2 - '@babel/types': 7.23.0 - transitivePeerDependencies: - - supports-color - - /@babel/helpers@7.23.2: - resolution: {integrity: sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.2 - '@babel/types': 7.23.0 - transitivePeerDependencies: - - supports-color - /@babel/helpers@7.23.9: resolution: {integrity: sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==} engines: {node: '>=6.9.0'} @@ -1296,19 +1234,10 @@ packages: '@babel/types': 7.23.9 transitivePeerDependencies: - supports-color - dev: true /@babel/highlight@7.18.6: resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.18.6 - chalk: 2.4.2 - js-tokens: 4.0.0 - - /@babel/highlight@7.22.20: - resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} - engines: {node: '>=6.9.0'} dependencies: '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 @@ -1321,7 +1250,6 @@ packages: '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 - dev: true /@babel/parser@7.18.9: resolution: {integrity: sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==} @@ -1330,27 +1258,12 @@ packages: dependencies: '@babel/types': 7.18.9 - /@babel/parser@7.21.4: - resolution: {integrity: sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.23.0 - - /@babel/parser@7.23.0: - resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.23.0 - /@babel/parser@7.23.9: resolution: {integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.23.0 - dev: true + '@babel/types': 7.23.9 /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.18.6(@babel/core@7.18.9): resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} @@ -1361,13 +1274,13 @@ packages: '@babel/core': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.18.6(@babel/core@7.21.4): + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.18.6(@babel/core@7.23.9): resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.18.9 dev: false @@ -1381,6 +1294,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.15(@babel/core@7.23.9): + resolution: {integrity: sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.18.9(@babel/core@7.18.9): resolution: {integrity: sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==} engines: {node: '>=6.9.0'} @@ -1392,16 +1315,16 @@ packages: '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 '@babel/plugin-proposal-optional-chaining': 7.18.9(@babel/core@7.18.9) - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.20.7(@babel/core@7.21.4): + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.20.7(@babel/core@7.23.9): resolution: {integrity: sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.21.4) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.23.9) dev: false /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.15(@babel/core@7.23.2): @@ -1416,6 +1339,18 @@ packages: '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.23.2) dev: true + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.15(@babel/core@7.23.9): + resolution: {integrity: sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.23.9) + dev: true + /@babel/plugin-proposal-async-generator-functions@7.18.6(@babel/core@7.18.9): resolution: {integrity: sha512-WAz4R9bvozx4qwf74M+sfqPMKfSqwM0phxPTR6iJIi8robgzXwkEgmeJG1gEKhm6sDqT/U9aV3lfcqybIpev8w==} engines: {node: '>=6.9.0'} @@ -1430,17 +1365,17 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.21.4): + /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.23.9): resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.9 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.21.4) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.21.4) + '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.23.9) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.9) transitivePeerDependencies: - supports-color dev: false @@ -1457,31 +1392,17 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-create-class-features-plugin': 7.18.9(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.18.9 - transitivePeerDependencies: - - supports-color - dev: false - - /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.23.2): + /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.23.9): resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 - '@babel/helper-create-class-features-plugin': 7.18.9(@babel/core@7.23.2) + '@babel/core': 7.23.9 + '@babel/helper-create-class-features-plugin': 7.18.9(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.18.9 transitivePeerDependencies: - supports-color - dev: true /@babel/plugin-proposal-class-static-block@7.18.6(@babel/core@7.18.9): resolution: {integrity: sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==} @@ -1496,16 +1417,16 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-proposal-class-static-block@7.21.0(@babel/core@7.21.4): + /@babel/plugin-proposal-class-static-block@7.21.0(@babel/core@7.23.9): resolution: {integrity: sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-create-class-features-plugin': 7.21.4(@babel/core@7.21.4) + '@babel/core': 7.23.9 + '@babel/helper-create-class-features-plugin': 7.21.4(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.21.4) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.9) transitivePeerDependencies: - supports-color dev: false @@ -1520,15 +1441,15 @@ packages: '@babel/helper-plugin-utils': 7.18.9 '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.18.9) - /@babel/plugin-proposal-dynamic-import@7.18.6(@babel/core@7.21.4): + /@babel/plugin-proposal-dynamic-import@7.18.6(@babel/core@7.23.9): resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.18.9 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.9) dev: false /@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.18.9): @@ -1541,15 +1462,15 @@ packages: '@babel/helper-plugin-utils': 7.18.9 '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.18.9) - /@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.21.4): + /@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.23.9): resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.18.9 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.9) dev: false /@babel/plugin-proposal-json-strings@7.18.6(@babel/core@7.18.9): @@ -1562,15 +1483,15 @@ packages: '@babel/helper-plugin-utils': 7.18.9 '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.18.9) - /@babel/plugin-proposal-json-strings@7.18.6(@babel/core@7.21.4): + /@babel/plugin-proposal-json-strings@7.18.6(@babel/core@7.23.9): resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.18.9 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.9) dev: false /@babel/plugin-proposal-logical-assignment-operators@7.18.9(@babel/core@7.18.9): @@ -1583,15 +1504,15 @@ packages: '@babel/helper-plugin-utils': 7.18.9 '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.18.9) - /@babel/plugin-proposal-logical-assignment-operators@7.20.7(@babel/core@7.21.4): + /@babel/plugin-proposal-logical-assignment-operators@7.20.7(@babel/core@7.23.9): resolution: {integrity: sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.21.4) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.9) dev: false /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.18.9): @@ -1604,27 +1525,15 @@ packages: '@babel/helper-plugin-utils': 7.18.9 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.18.9) - /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.18.9 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.21.4) - dev: false - - /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.23.2): + /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.23.9): resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.18.9 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.2) - dev: true + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.9) /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.18.9): resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} @@ -1636,15 +1545,15 @@ packages: '@babel/helper-plugin-utils': 7.18.9 '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.18.9) - /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.21.4): + /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.23.9): resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.18.9 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.21.4) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.9) dev: false /@babel/plugin-proposal-object-rest-spread@7.12.1(@babel/core@7.12.9): @@ -1656,7 +1565,7 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.12.9) - '@babel/plugin-transform-parameters': 7.21.3(@babel/core@7.12.9) + '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.12.9) dev: false /@babel/plugin-proposal-object-rest-spread@7.18.9(@babel/core@7.18.9): @@ -1672,19 +1581,19 @@ packages: '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.18.9) '@babel/plugin-transform-parameters': 7.18.8(@babel/core@7.18.9) - /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.21.4): + /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.23.9): resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.23.2 - '@babel/core': 7.21.4 - '@babel/helper-compilation-targets': 7.22.15 + '@babel/compat-data': 7.23.5 + '@babel/core': 7.23.9 + '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-transform-parameters': 7.21.3(@babel/core@7.21.4) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.9) dev: false /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.18.9): @@ -1697,15 +1606,15 @@ packages: '@babel/helper-plugin-utils': 7.18.9 '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.18.9) - /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.21.4): + /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.23.9): resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.18.9 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.9) dev: false /@babel/plugin-proposal-optional-chaining@7.18.9(@babel/core@7.18.9): @@ -1719,31 +1628,17 @@ packages: '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.18.9) - /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.21.4): - resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.4) - dev: false - - /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.23.2): + /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.23.9): resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.2) - dev: true + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.9) /@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.18.9): resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} @@ -1757,14 +1652,14 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.21.4): + /@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.23.9): resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-create-class-features-plugin': 7.18.9(@babel/core@7.21.4) + '@babel/core': 7.23.9 + '@babel/helper-create-class-features-plugin': 7.18.9(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.18.9 transitivePeerDependencies: - supports-color @@ -1784,18 +1679,18 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-proposal-private-property-in-object@7.21.0(@babel/core@7.21.4): + /@babel/plugin-proposal-private-property-in-object@7.21.0(@babel/core@7.23.9): resolution: {integrity: sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.9 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.21.4(@babel/core@7.21.4) + '@babel/helper-create-class-features-plugin': 7.21.4(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.21.4) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.9) transitivePeerDependencies: - supports-color dev: false @@ -1809,6 +1704,15 @@ packages: '@babel/core': 7.23.2 dev: true + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.9): + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + dev: true + /@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.18.9): resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} engines: {node: '>=4'} @@ -1819,14 +1723,14 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.18.6(@babel/core@7.18.9) '@babel/helper-plugin-utils': 7.18.9 - /@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.21.4): + /@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.23.9): resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} engines: {node: '>=4'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-create-regexp-features-plugin': 7.18.6(@babel/core@7.21.4) + '@babel/core': 7.23.9 + '@babel/helper-create-regexp-features-plugin': 7.18.6(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.18.9 dev: false @@ -1838,30 +1742,29 @@ packages: '@babel/core': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.21.4): + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.2): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.18.9 - dev: false + dev: true - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.2): + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.9): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.18.9 - dev: true - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.2): + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -1873,23 +1776,22 @@ packages: '@babel/core': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.21.4): + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.2): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.18.9 - dev: false + dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.2): + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.9): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.18.9 - dev: true /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.18.9): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} @@ -1900,25 +1802,24 @@ packages: '@babel/core': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.21.4): + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.2): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.18.9 - dev: false + dev: true - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.2): + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.9): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.18.9 - dev: true /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.18.9): resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} @@ -1926,25 +1827,24 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.21.4): + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.2): resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.18.9 - dev: false + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.2): + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.18.9 - dev: true + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.18.9): resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} @@ -1954,23 +1854,22 @@ packages: '@babel/core': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.21.4): + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.2): resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.18.9 - dev: false + dev: true - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.2): + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.18.9 - dev: true /@babel/plugin-syntax-flow@7.22.5(@babel/core@7.18.9): resolution: {integrity: sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ==} @@ -1982,13 +1881,13 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-flow@7.22.5(@babel/core@7.23.2): + /@babel/plugin-syntax-flow@7.22.5(@babel/core@7.23.9): resolution: {integrity: sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -2001,13 +1900,13 @@ packages: '@babel/core': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 - /@babel/plugin-syntax-import-assertions@7.20.0(@babel/core@7.21.4): + /@babel/plugin-syntax-import-assertions@7.20.0(@babel/core@7.23.9): resolution: {integrity: sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: false @@ -2021,6 +1920,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.23.9): + resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-import-attributes@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==} engines: {node: '>=6.9.0'} @@ -2031,6 +1940,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-import-attributes@7.22.5(@babel/core@7.23.9): + resolution: {integrity: sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.2): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: @@ -2040,6 +1959,15 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.9): + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.18.9): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: @@ -2048,23 +1976,22 @@ packages: '@babel/core': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.21.4): + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.2): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.18.9 - dev: false + dev: true - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.2): + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.18.9 - dev: true /@babel/plugin-syntax-jsx@7.12.1(@babel/core@7.12.9): resolution: {integrity: sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==} @@ -2082,16 +2009,16 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-jsx@7.18.6(@babel/core@7.21.4): + /@babel/plugin-syntax-jsx@7.18.6(@babel/core@7.23.9): resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 dev: false /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.18.9): @@ -2104,13 +2031,13 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.23.2): + /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.23.9): resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -2122,23 +2049,22 @@ packages: '@babel/core': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.21.4): + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.2): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.18.9 - dev: false + dev: true - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.2): + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.9): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.18.9 - dev: true /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.18.9): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} @@ -2148,23 +2074,22 @@ packages: '@babel/core': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.21.4): + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.2): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.18.9 - dev: false + dev: true - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.2): + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.18.9 - dev: true /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.18.9): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} @@ -2174,23 +2099,22 @@ packages: '@babel/core': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.21.4): + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.2): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.18.9 - dev: false + dev: true - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.2): + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.9): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.18.9 - dev: true /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.12.9): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} @@ -2209,23 +2133,22 @@ packages: '@babel/core': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.21.4): + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.2): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.18.9 - dev: false + dev: true - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.2): + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.18.9 - dev: true /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.18.9): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} @@ -2235,23 +2158,22 @@ packages: '@babel/core': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.21.4): + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.2): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.18.9 - dev: false + dev: true - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.2): + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.18.9 - dev: true /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.18.9): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} @@ -2261,23 +2183,22 @@ packages: '@babel/core': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.21.4): + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.2): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.18.9 - dev: false + dev: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.2): + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.18.9 - dev: true /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.18.9): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} @@ -2288,25 +2209,24 @@ packages: '@babel/core': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.21.4): + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.2): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.18.9 - dev: false + dev: true - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.2): + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.9): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.18.9 - dev: true /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.18.9): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} @@ -2317,25 +2237,24 @@ packages: '@babel/core': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.21.4): + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.2): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.18.9 - dev: false + dev: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.2): + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.9): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.18.9 - dev: true /@babel/plugin-syntax-typescript@7.18.6(@babel/core@7.18.9): resolution: {integrity: sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==} @@ -2344,36 +2263,36 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-typescript@7.18.6(@babel/core@7.21.4): + /@babel/plugin-syntax-typescript@7.18.6(@babel/core@7.23.9): resolution: {integrity: sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.18.9 - dev: false + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-typescript@7.18.6(@babel/core@7.23.2): - resolution: {integrity: sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==} + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.2): + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-create-regexp-features-plugin': 7.21.4(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.2): + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.9): resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.2 - '@babel/helper-create-regexp-features-plugin': 7.21.4(@babel/core@7.23.2) + '@babel/core': 7.23.9 + '@babel/helper-create-regexp-features-plugin': 7.21.4(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -2386,13 +2305,13 @@ packages: '@babel/core': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 - /@babel/plugin-transform-arrow-functions@7.20.7(@babel/core@7.21.4): + /@babel/plugin-transform-arrow-functions@7.20.7(@babel/core@7.23.9): resolution: {integrity: sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: false @@ -2406,6 +2325,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.23.9): + resolution: {integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-async-generator-functions@7.23.2(@babel/core@7.23.2): resolution: {integrity: sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==} engines: {node: '>=6.9.0'} @@ -2419,6 +2348,19 @@ packages: '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.2) dev: true + /@babel/plugin-transform-async-generator-functions@7.23.2(@babel/core@7.23.9): + resolution: {integrity: sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.9) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.9) + dev: true + /@babel/plugin-transform-async-to-generator@7.18.6(@babel/core@7.18.9): resolution: {integrity: sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==} engines: {node: '>=6.9.0'} @@ -2432,16 +2374,16 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-async-to-generator@7.20.7(@babel/core@7.21.4): + /@babel/plugin-transform-async-to-generator@7.20.7(@babel/core@7.23.9): resolution: {integrity: sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.9 '@babel/helper-module-imports': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.21.4) + '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.23.9) transitivePeerDependencies: - supports-color dev: false @@ -2458,6 +2400,18 @@ packages: '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.2) dev: true + /@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.23.9): + resolution: {integrity: sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.9) + dev: true + /@babel/plugin-transform-block-scoped-functions@7.18.6(@babel/core@7.18.9): resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} engines: {node: '>=6.9.0'} @@ -2467,13 +2421,13 @@ packages: '@babel/core': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 - /@babel/plugin-transform-block-scoped-functions@7.18.6(@babel/core@7.21.4): + /@babel/plugin-transform-block-scoped-functions@7.18.6(@babel/core@7.23.9): resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.18.9 dev: false @@ -2487,6 +2441,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.23.9): + resolution: {integrity: sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-block-scoping@7.18.9(@babel/core@7.18.9): resolution: {integrity: sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==} engines: {node: '>=6.9.0'} @@ -2496,13 +2460,13 @@ packages: '@babel/core': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 - /@babel/plugin-transform-block-scoping@7.21.0(@babel/core@7.21.4): + /@babel/plugin-transform-block-scoping@7.21.0(@babel/core@7.23.9): resolution: {integrity: sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: false @@ -2516,6 +2480,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-block-scoping@7.23.0(@babel/core@7.23.9): + resolution: {integrity: sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-class-properties@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==} engines: {node: '>=6.9.0'} @@ -2527,6 +2501,17 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-class-properties@7.22.5(@babel/core@7.23.9): + resolution: {integrity: sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.9) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-class-static-block@7.22.11(@babel/core@7.23.2): resolution: {integrity: sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==} engines: {node: '>=6.9.0'} @@ -2539,6 +2524,18 @@ packages: '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.2) dev: true + /@babel/plugin-transform-class-static-block@7.22.11(@babel/core@7.23.9): + resolution: {integrity: sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.9) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.9) + dev: true + /@babel/plugin-transform-classes@7.18.9(@babel/core@7.18.9): resolution: {integrity: sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==} engines: {node: '>=6.9.0'} @@ -2557,21 +2554,21 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-classes@7.21.0(@babel/core@7.21.4): + /@babel/plugin-transform-classes@7.21.0(@babel/core@7.23.9): resolution: {integrity: sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.9 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.21.0 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 '@babel/helper-optimise-call-expression': 7.18.6 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-replace-supers': 7.20.7 - '@babel/helper-split-export-declaration': 7.18.6 + '@babel/helper-split-export-declaration': 7.22.6 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -2585,7 +2582,7 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 @@ -2595,6 +2592,24 @@ packages: globals: 11.12.0 dev: true + /@babel/plugin-transform-classes@7.22.15(@babel/core@7.23.9): + resolution: {integrity: sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.9) + '@babel/helper-split-export-declaration': 7.22.6 + globals: 11.12.0 + dev: true + /@babel/plugin-transform-computed-properties@7.18.9(@babel/core@7.18.9): resolution: {integrity: sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==} engines: {node: '>=6.9.0'} @@ -2604,15 +2619,15 @@ packages: '@babel/core': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 - /@babel/plugin-transform-computed-properties@7.20.7(@babel/core@7.21.4): + /@babel/plugin-transform-computed-properties@7.20.7(@babel/core@7.23.9): resolution: {integrity: sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/template': 7.22.15 + '@babel/template': 7.23.9 dev: false /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.23.2): @@ -2623,7 +2638,18 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - '@babel/template': 7.22.15 + '@babel/template': 7.23.9 + dev: true + + /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.23.9): + resolution: {integrity: sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/template': 7.23.9 dev: true /@babel/plugin-transform-destructuring@7.18.9(@babel/core@7.18.9): @@ -2635,13 +2661,13 @@ packages: '@babel/core': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 - /@babel/plugin-transform-destructuring@7.21.3(@babel/core@7.21.4): + /@babel/plugin-transform-destructuring@7.21.3(@babel/core@7.23.9): resolution: {integrity: sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: false @@ -2655,6 +2681,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-destructuring@7.23.0(@babel/core@7.23.9): + resolution: {integrity: sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-dotall-regex@7.18.6(@babel/core@7.18.9): resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==} engines: {node: '>=6.9.0'} @@ -2665,14 +2701,14 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.18.6(@babel/core@7.18.9) '@babel/helper-plugin-utils': 7.18.9 - /@babel/plugin-transform-dotall-regex@7.18.6(@babel/core@7.21.4): + /@babel/plugin-transform-dotall-regex@7.18.6(@babel/core@7.23.9): resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-create-regexp-features-plugin': 7.18.6(@babel/core@7.21.4) + '@babel/core': 7.23.9 + '@babel/helper-create-regexp-features-plugin': 7.18.6(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.18.9 dev: false @@ -2687,6 +2723,17 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.23.9): + resolution: {integrity: sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-duplicate-keys@7.18.9(@babel/core@7.18.9): resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} engines: {node: '>=6.9.0'} @@ -2696,13 +2743,13 @@ packages: '@babel/core': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 - /@babel/plugin-transform-duplicate-keys@7.18.9(@babel/core@7.21.4): + /@babel/plugin-transform-duplicate-keys@7.18.9(@babel/core@7.23.9): resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.18.9 dev: false @@ -2716,6 +2763,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-duplicate-keys@7.22.5(@babel/core@7.23.9): + resolution: {integrity: sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-dynamic-import@7.22.11(@babel/core@7.23.2): resolution: {integrity: sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==} engines: {node: '>=6.9.0'} @@ -2727,6 +2784,17 @@ packages: '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.2) dev: true + /@babel/plugin-transform-dynamic-import@7.22.11(@babel/core@7.23.9): + resolution: {integrity: sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.9) + dev: true + /@babel/plugin-transform-exponentiation-operator@7.18.6(@babel/core@7.18.9): resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} engines: {node: '>=6.9.0'} @@ -2737,13 +2805,13 @@ packages: '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 - /@babel/plugin-transform-exponentiation-operator@7.18.6(@babel/core@7.21.4): + /@babel/plugin-transform-exponentiation-operator@7.18.6(@babel/core@7.23.9): resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.9 '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 dev: false @@ -2759,6 +2827,17 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-exponentiation-operator@7.22.5(@babel/core@7.23.9): + resolution: {integrity: sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-export-namespace-from@7.22.11(@babel/core@7.23.2): resolution: {integrity: sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==} engines: {node: '>=6.9.0'} @@ -2770,6 +2849,17 @@ packages: '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.2) dev: true + /@babel/plugin-transform-export-namespace-from@7.22.11(@babel/core@7.23.9): + resolution: {integrity: sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.9) + dev: true + /@babel/plugin-transform-flow-strip-types@7.22.5(@babel/core@7.18.9): resolution: {integrity: sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA==} engines: {node: '>=6.9.0'} @@ -2781,15 +2871,15 @@ packages: '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.18.9) dev: true - /@babel/plugin-transform-flow-strip-types@7.22.5(@babel/core@7.23.2): + /@babel/plugin-transform-flow-strip-types@7.22.5(@babel/core@7.23.9): resolution: {integrity: sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.23.9) dev: true /@babel/plugin-transform-for-of@7.18.8(@babel/core@7.18.9): @@ -2801,13 +2891,13 @@ packages: '@babel/core': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 - /@babel/plugin-transform-for-of@7.21.0(@babel/core@7.21.4): + /@babel/plugin-transform-for-of@7.21.0(@babel/core@7.23.9): resolution: {integrity: sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: false @@ -2821,6 +2911,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-for-of@7.22.15(@babel/core@7.23.9): + resolution: {integrity: sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-function-name@7.18.9(@babel/core@7.18.9): resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} engines: {node: '>=6.9.0'} @@ -2832,14 +2932,14 @@ packages: '@babel/helper-function-name': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 - /@babel/plugin-transform-function-name@7.18.9(@babel/core@7.21.4): + /@babel/plugin-transform-function-name@7.18.9(@babel/core@7.23.9): resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-compilation-targets': 7.18.9(@babel/core@7.21.4) + '@babel/core': 7.23.9 + '@babel/helper-compilation-targets': 7.18.9(@babel/core@7.23.9) '@babel/helper-function-name': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 dev: false @@ -2851,7 +2951,19 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.2 - '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.23.9): + resolution: {integrity: sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-function-name': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -2867,6 +2979,17 @@ packages: '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.2) dev: true + /@babel/plugin-transform-json-strings@7.22.11(@babel/core@7.23.9): + resolution: {integrity: sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.9) + dev: true + /@babel/plugin-transform-literals@7.18.9(@babel/core@7.18.9): resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} engines: {node: '>=6.9.0'} @@ -2876,13 +2999,13 @@ packages: '@babel/core': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 - /@babel/plugin-transform-literals@7.18.9(@babel/core@7.21.4): + /@babel/plugin-transform-literals@7.18.9(@babel/core@7.23.9): resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.18.9 dev: false @@ -2896,6 +3019,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-literals@7.22.5(@babel/core@7.23.9): + resolution: {integrity: sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-logical-assignment-operators@7.22.11(@babel/core@7.23.2): resolution: {integrity: sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==} engines: {node: '>=6.9.0'} @@ -2907,6 +3040,17 @@ packages: '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.2) dev: true + /@babel/plugin-transform-logical-assignment-operators@7.22.11(@babel/core@7.23.9): + resolution: {integrity: sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.9) + dev: true + /@babel/plugin-transform-member-expression-literals@7.18.6(@babel/core@7.18.9): resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} engines: {node: '>=6.9.0'} @@ -2916,13 +3060,13 @@ packages: '@babel/core': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 - /@babel/plugin-transform-member-expression-literals@7.18.6(@babel/core@7.21.4): + /@babel/plugin-transform-member-expression-literals@7.18.6(@babel/core@7.23.9): resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.18.9 dev: false @@ -2936,6 +3080,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.23.9): + resolution: {integrity: sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-modules-amd@7.18.6(@babel/core@7.18.9): resolution: {integrity: sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==} engines: {node: '>=6.9.0'} @@ -2949,14 +3103,14 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-modules-amd@7.20.11(@babel/core@7.21.4): + /@babel/plugin-transform-modules-amd@7.20.11(@babel/core@7.23.9): resolution: {integrity: sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.21.4) + '@babel/core': 7.23.9 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 dev: false @@ -2967,7 +3121,18 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.2 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-modules-amd@7.23.0(@babel/core@7.23.9): + resolution: {integrity: sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -2985,38 +3150,37 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-modules-commonjs@7.21.2(@babel/core@7.21.4): + /@babel/plugin-transform-modules-commonjs@7.21.2(@babel/core@7.23.9): resolution: {integrity: sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.21.4) + '@babel/core': 7.23.9 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-simple-access': 7.22.5 - dev: false - /@babel/plugin-transform-modules-commonjs@7.21.2(@babel/core@7.23.2): - resolution: {integrity: sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==} + /@babel/plugin-transform-modules-commonjs@7.23.0(@babel/core@7.23.2): + resolution: {integrity: sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.2 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-simple-access': 7.22.5 dev: true - /@babel/plugin-transform-modules-commonjs@7.23.0(@babel/core@7.23.2): + /@babel/plugin-transform-modules-commonjs@7.23.0(@babel/core@7.23.9): resolution: {integrity: sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) + '@babel/core': 7.23.9 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-simple-access': 7.22.5 dev: true @@ -3036,15 +3200,15 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-modules-systemjs@7.20.11(@babel/core@7.21.4): + /@babel/plugin-transform-modules-systemjs@7.20.11(@babel/core@7.23.9): resolution: {integrity: sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.9 '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.21.4) + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-identifier': 7.22.20 dev: false @@ -3057,7 +3221,20 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 + dev: true + + /@babel/plugin-transform-modules-systemjs@7.23.0(@babel/core@7.23.9): + resolution: {integrity: sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-identifier': 7.22.20 dev: true @@ -3074,13 +3251,13 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-modules-umd@7.18.6(@babel/core@7.21.4): + /@babel/plugin-transform-modules-umd@7.18.6(@babel/core@7.23.9): resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.9 '@babel/helper-module-transforms': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 transitivePeerDependencies: @@ -3094,7 +3271,18 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.2 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.23.9): + resolution: {integrity: sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -3108,14 +3296,14 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.18.6(@babel/core@7.18.9) '@babel/helper-plugin-utils': 7.18.9 - /@babel/plugin-transform-named-capturing-groups-regex@7.20.5(@babel/core@7.21.4): + /@babel/plugin-transform-named-capturing-groups-regex@7.20.5(@babel/core@7.23.9): resolution: {integrity: sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-create-regexp-features-plugin': 7.21.4(@babel/core@7.21.4) + '@babel/core': 7.23.9 + '@babel/helper-create-regexp-features-plugin': 7.21.4(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 dev: false @@ -3130,6 +3318,17 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.9): + resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-new-target@7.18.6(@babel/core@7.18.9): resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} engines: {node: '>=6.9.0'} @@ -3139,13 +3338,13 @@ packages: '@babel/core': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 - /@babel/plugin-transform-new-target@7.18.6(@babel/core@7.21.4): + /@babel/plugin-transform-new-target@7.18.6(@babel/core@7.23.9): resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.18.9 dev: false @@ -3159,6 +3358,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-new-target@7.22.5(@babel/core@7.23.9): + resolution: {integrity: sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-nullish-coalescing-operator@7.22.11(@babel/core@7.23.2): resolution: {integrity: sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==} engines: {node: '>=6.9.0'} @@ -3170,6 +3379,17 @@ packages: '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.2) dev: true + /@babel/plugin-transform-nullish-coalescing-operator@7.22.11(@babel/core@7.23.9): + resolution: {integrity: sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.9) + dev: true + /@babel/plugin-transform-numeric-separator@7.22.11(@babel/core@7.23.2): resolution: {integrity: sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==} engines: {node: '>=6.9.0'} @@ -3181,6 +3401,17 @@ packages: '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.2) dev: true + /@babel/plugin-transform-numeric-separator@7.22.11(@babel/core@7.23.9): + resolution: {integrity: sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.9) + dev: true + /@babel/plugin-transform-object-assign@7.18.6(@babel/core@7.18.9): resolution: {integrity: sha512-mQisZ3JfqWh2gVXvfqYCAAyRs6+7oev+myBsTwW5RnPhYXOTuCEw2oe3YgxlXMViXUS53lG8koulI7mJ+8JE+A==} engines: {node: '>=6.9.0'} @@ -3197,14 +3428,28 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.23.2 + '@babel/compat-data': 7.23.5 '@babel/core': 7.23.2 - '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.2) '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.2) dev: true + /@babel/plugin-transform-object-rest-spread@7.22.15(@babel/core@7.23.9): + resolution: {integrity: sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.23.5 + '@babel/core': 7.23.9 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.9) + dev: true + /@babel/plugin-transform-object-super@7.18.6(@babel/core@7.18.9): resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} engines: {node: '>=6.9.0'} @@ -3217,13 +3462,13 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-object-super@7.18.6(@babel/core@7.21.4): + /@babel/plugin-transform-object-super@7.18.6(@babel/core@7.23.9): resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.18.9 '@babel/helper-replace-supers': 7.18.9 transitivePeerDependencies: @@ -3241,6 +3486,17 @@ packages: '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.2) dev: true + /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.23.9): + resolution: {integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.9) + dev: true + /@babel/plugin-transform-optional-catch-binding@7.22.11(@babel/core@7.23.2): resolution: {integrity: sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==} engines: {node: '>=6.9.0'} @@ -3252,6 +3508,17 @@ packages: '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.2) dev: true + /@babel/plugin-transform-optional-catch-binding@7.22.11(@babel/core@7.23.9): + resolution: {integrity: sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.9) + dev: true + /@babel/plugin-transform-optional-chaining@7.23.0(@babel/core@7.23.2): resolution: {integrity: sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==} engines: {node: '>=6.9.0'} @@ -3264,6 +3531,18 @@ packages: '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.2) dev: true + /@babel/plugin-transform-optional-chaining@7.23.0(@babel/core@7.23.9): + resolution: {integrity: sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.9) + dev: true + /@babel/plugin-transform-parameters@7.18.8(@babel/core@7.18.9): resolution: {integrity: sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==} engines: {node: '>=6.9.0'} @@ -3273,8 +3552,8 @@ packages: '@babel/core': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 - /@babel/plugin-transform-parameters@7.21.3(@babel/core@7.12.9): - resolution: {integrity: sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==} + /@babel/plugin-transform-parameters@7.22.15(@babel/core@7.12.9): + resolution: {integrity: sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -3283,48 +3562,71 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: false - /@babel/plugin-transform-parameters@7.21.3(@babel/core@7.21.4): - resolution: {integrity: sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==} + /@babel/plugin-transform-parameters@7.22.15(@babel/core@7.23.2): + resolution: {integrity: sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - dev: false + dev: true - /@babel/plugin-transform-parameters@7.22.15(@babel/core@7.23.2): + /@babel/plugin-transform-parameters@7.22.15(@babel/core@7.23.9): resolution: {integrity: sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-private-methods@7.22.5(@babel/core@7.23.2): + resolution: {integrity: sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-private-methods@7.22.5(@babel/core@7.23.9): + resolution: {integrity: sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-private-methods@7.22.5(@babel/core@7.23.2): - resolution: {integrity: sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==} + /@babel/plugin-transform-private-property-in-object@7.22.11(@babel/core@7.23.2): + resolution: {integrity: sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.2 + '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.2) dev: true - /@babel/plugin-transform-private-property-in-object@7.22.11(@babel/core@7.23.2): + /@babel/plugin-transform-private-property-in-object@7.22.11(@babel/core@7.23.9): resolution: {integrity: sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.9 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.2) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.9) dev: true /@babel/plugin-transform-property-literals@7.18.6(@babel/core@7.18.9): @@ -3336,13 +3638,13 @@ packages: '@babel/core': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 - /@babel/plugin-transform-property-literals@7.18.6(@babel/core@7.21.4): + /@babel/plugin-transform-property-literals@7.18.6(@babel/core@7.23.9): resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.18.9 dev: false @@ -3356,14 +3658,24 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-react-constant-elements@7.21.3(@babel/core@7.21.4): + /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.23.9): + resolution: {integrity: sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-react-constant-elements@7.21.3(@babel/core@7.23.9): resolution: {integrity: sha512-4DVcFeWe/yDYBLp0kBmOGFJ6N2UYg7coGid1gdxb4co62dy/xISDMaYBXBVXEDhfgMk7qkbcYiGtwd5Q/hwDDQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 dev: false /@babel/plugin-transform-react-display-name@7.18.6(@babel/core@7.18.9): @@ -3375,13 +3687,13 @@ packages: '@babel/core': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 - /@babel/plugin-transform-react-display-name@7.18.6(@babel/core@7.21.4): + /@babel/plugin-transform-react-display-name@7.18.6(@babel/core@7.23.9): resolution: {integrity: sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.18.9 dev: false @@ -3404,14 +3716,14 @@ packages: '@babel/core': 7.18.9 '@babel/plugin-transform-react-jsx': 7.18.6(@babel/core@7.18.9) - /@babel/plugin-transform-react-jsx-development@7.18.6(@babel/core@7.21.4): + /@babel/plugin-transform-react-jsx-development@7.18.6(@babel/core@7.23.9): resolution: {integrity: sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/plugin-transform-react-jsx': 7.18.6(@babel/core@7.21.4) + '@babel/core': 7.23.9 + '@babel/plugin-transform-react-jsx': 7.18.6(@babel/core@7.23.9) dev: false /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.18.9): @@ -3437,17 +3749,17 @@ packages: '@babel/plugin-syntax-jsx': 7.18.6(@babel/core@7.18.9) '@babel/types': 7.18.9 - /@babel/plugin-transform-react-jsx@7.18.6(@babel/core@7.21.4): + /@babel/plugin-transform-react-jsx@7.18.6(@babel/core@7.23.9): resolution: {integrity: sha512-Mz7xMPxoy9kPS/JScj6fJs03TZ/fZ1dJPlMjRAgTaxaS0fUBk8FV/A2rRgfPsVCZqALNwMexD+0Uaf5zlcKPpw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.9 '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-module-imports': 7.18.6 '@babel/helper-plugin-utils': 7.18.9 - '@babel/plugin-syntax-jsx': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-syntax-jsx': 7.18.6(@babel/core@7.23.9) '@babel/types': 7.18.9 dev: false @@ -3462,7 +3774,7 @@ packages: '@babel/helper-module-imports': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.18.9) - '@babel/types': 7.23.0 + '@babel/types': 7.23.9 dev: true /@babel/plugin-transform-react-pure-annotations@7.18.6(@babel/core@7.18.9): @@ -3475,13 +3787,13 @@ packages: '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-plugin-utils': 7.18.9 - /@babel/plugin-transform-react-pure-annotations@7.18.6(@babel/core@7.21.4): + /@babel/plugin-transform-react-pure-annotations@7.18.6(@babel/core@7.23.9): resolution: {integrity: sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.9 '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-plugin-utils': 7.18.9 dev: false @@ -3507,13 +3819,13 @@ packages: '@babel/helper-plugin-utils': 7.18.9 regenerator-transform: 0.15.0 - /@babel/plugin-transform-regenerator@7.20.5(@babel/core@7.21.4): + /@babel/plugin-transform-regenerator@7.20.5(@babel/core@7.23.9): resolution: {integrity: sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 regenerator-transform: 0.15.1 dev: false @@ -3529,6 +3841,17 @@ packages: regenerator-transform: 0.15.2 dev: true + /@babel/plugin-transform-regenerator@7.22.10(@babel/core@7.23.9): + resolution: {integrity: sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + regenerator-transform: 0.15.2 + dev: true + /@babel/plugin-transform-reserved-words@7.18.6(@babel/core@7.18.9): resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} engines: {node: '>=6.9.0'} @@ -3538,13 +3861,13 @@ packages: '@babel/core': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 - /@babel/plugin-transform-reserved-words@7.18.6(@babel/core@7.21.4): + /@babel/plugin-transform-reserved-words@7.18.6(@babel/core@7.23.9): resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.18.9 dev: false @@ -3558,6 +3881,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-reserved-words@7.22.5(@babel/core@7.23.9): + resolution: {integrity: sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-runtime@7.18.10(@babel/core@7.18.9): resolution: {integrity: sha512-q5mMeYAdfEbpBAgzl7tBre/la3LeCxmDO1+wMXRdPWbcoMjR3GiXlCLk7JBZVVye0bqTGNMbt0yYVXX1B1jEWQ==} engines: {node: '>=6.9.0'} @@ -3583,13 +3916,13 @@ packages: '@babel/core': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 - /@babel/plugin-transform-shorthand-properties@7.18.6(@babel/core@7.21.4): + /@babel/plugin-transform-shorthand-properties@7.18.6(@babel/core@7.23.9): resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.18.9 dev: false @@ -3603,6 +3936,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.23.9): + resolution: {integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-spread@7.18.9(@babel/core@7.18.9): resolution: {integrity: sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==} engines: {node: '>=6.9.0'} @@ -3613,13 +3956,13 @@ packages: '@babel/helper-plugin-utils': 7.18.9 '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 - /@babel/plugin-transform-spread@7.20.7(@babel/core@7.21.4): + /@babel/plugin-transform-spread@7.20.7(@babel/core@7.23.9): resolution: {integrity: sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 dev: false @@ -3635,6 +3978,17 @@ packages: '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 dev: true + /@babel/plugin-transform-spread@7.22.5(@babel/core@7.23.9): + resolution: {integrity: sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + dev: true + /@babel/plugin-transform-sticky-regex@7.18.6(@babel/core@7.18.9): resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} engines: {node: '>=6.9.0'} @@ -3644,13 +3998,13 @@ packages: '@babel/core': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 - /@babel/plugin-transform-sticky-regex@7.18.6(@babel/core@7.21.4): + /@babel/plugin-transform-sticky-regex@7.18.6(@babel/core@7.23.9): resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.18.9 dev: false @@ -3664,6 +4018,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-sticky-regex@7.22.5(@babel/core@7.23.9): + resolution: {integrity: sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-template-literals@7.18.9(@babel/core@7.18.9): resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} engines: {node: '>=6.9.0'} @@ -3673,13 +4037,13 @@ packages: '@babel/core': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 - /@babel/plugin-transform-template-literals@7.18.9(@babel/core@7.21.4): + /@babel/plugin-transform-template-literals@7.18.9(@babel/core@7.23.9): resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.18.9 dev: false @@ -3693,6 +4057,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.23.9): + resolution: {integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-typeof-symbol@7.18.9(@babel/core@7.18.9): resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} engines: {node: '>=6.9.0'} @@ -3702,13 +4076,13 @@ packages: '@babel/core': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 - /@babel/plugin-transform-typeof-symbol@7.18.9(@babel/core@7.21.4): + /@babel/plugin-transform-typeof-symbol@7.18.9(@babel/core@7.23.9): resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.18.9 dev: false @@ -3722,54 +4096,49 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-typescript@7.18.8(@babel/core@7.18.9): - resolution: {integrity: sha512-p2xM8HI83UObjsZGofMV/EdYjamsDm6MoN3hXPYIT0+gxIoopE+B7rPYKAxfrz9K9PK7JafTTjqYC6qipLExYA==} + /@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.23.9): + resolution: {integrity: sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.18.9 - '@babel/helper-create-class-features-plugin': 7.18.9(@babel/core@7.18.9) - '@babel/helper-plugin-utils': 7.18.9 - '@babel/plugin-syntax-typescript': 7.18.6(@babel/core@7.18.9) - transitivePeerDependencies: - - supports-color + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true - /@babel/plugin-transform-typescript@7.18.8(@babel/core@7.21.4): + /@babel/plugin-transform-typescript@7.18.8(@babel/core@7.18.9): resolution: {integrity: sha512-p2xM8HI83UObjsZGofMV/EdYjamsDm6MoN3hXPYIT0+gxIoopE+B7rPYKAxfrz9K9PK7JafTTjqYC6qipLExYA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-create-class-features-plugin': 7.18.9(@babel/core@7.21.4) + '@babel/core': 7.18.9 + '@babel/helper-create-class-features-plugin': 7.18.9(@babel/core@7.18.9) '@babel/helper-plugin-utils': 7.18.9 - '@babel/plugin-syntax-typescript': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-syntax-typescript': 7.18.6(@babel/core@7.18.9) transitivePeerDependencies: - supports-color - dev: false - /@babel/plugin-transform-typescript@7.18.8(@babel/core@7.23.2): + /@babel/plugin-transform-typescript@7.18.8(@babel/core@7.23.9): resolution: {integrity: sha512-p2xM8HI83UObjsZGofMV/EdYjamsDm6MoN3hXPYIT0+gxIoopE+B7rPYKAxfrz9K9PK7JafTTjqYC6qipLExYA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 - '@babel/helper-create-class-features-plugin': 7.18.9(@babel/core@7.23.2) + '@babel/core': 7.23.9 + '@babel/helper-create-class-features-plugin': 7.18.9(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.18.9 - '@babel/plugin-syntax-typescript': 7.18.6(@babel/core@7.23.2) + '@babel/plugin-syntax-typescript': 7.18.6(@babel/core@7.23.9) transitivePeerDependencies: - supports-color - dev: true - /@babel/plugin-transform-unicode-escapes@7.18.10(@babel/core@7.21.4): + /@babel/plugin-transform-unicode-escapes@7.18.10(@babel/core@7.23.9): resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: false @@ -3792,6 +4161,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-unicode-escapes@7.22.10(@babel/core@7.23.9): + resolution: {integrity: sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-unicode-property-regex@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==} engines: {node: '>=6.9.0'} @@ -3803,6 +4182,17 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-unicode-property-regex@7.22.5(@babel/core@7.23.9): + resolution: {integrity: sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-unicode-regex@7.18.6(@babel/core@7.18.9): resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} engines: {node: '>=6.9.0'} @@ -3813,14 +4203,14 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.18.6(@babel/core@7.18.9) '@babel/helper-plugin-utils': 7.18.9 - /@babel/plugin-transform-unicode-regex@7.18.6(@babel/core@7.21.4): + /@babel/plugin-transform-unicode-regex@7.18.6(@babel/core@7.23.9): resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-create-regexp-features-plugin': 7.18.6(@babel/core@7.21.4) + '@babel/core': 7.23.9 + '@babel/helper-create-regexp-features-plugin': 7.18.6(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.18.9 dev: false @@ -3835,6 +4225,17 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-unicode-regex@7.22.5(@babel/core@7.23.9): + resolution: {integrity: sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-unicode-sets-regex@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==} engines: {node: '>=6.9.0'} @@ -3846,6 +4247,17 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-unicode-sets-regex@7.22.5(@babel/core@7.23.9): + resolution: {integrity: sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/preset-env@7.18.9(@babel/core@7.18.9): resolution: {integrity: sha512-75pt/q95cMIHWssYtyfjVlvI+QEZQThQbKvR9xH+F/Agtw/s4Wfc2V9Bwd/P39VtixB7oWxGdH4GteTTwYJWMg==} engines: {node: '>=6.9.0'} @@ -3931,86 +4343,86 @@ packages: transitivePeerDependencies: - supports-color - /@babel/preset-env@7.21.4(@babel/core@7.21.4): + /@babel/preset-env@7.21.4(@babel/core@7.23.9): resolution: {integrity: sha512-2W57zHs2yDLm6GD5ZpvNn71lZ0B/iypSdIeq25OurDKji6AdzV07qp4s3n1/x5BqtiGaTrPN3nerlSCaC5qNTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.23.2 - '@babel/core': 7.21.4 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-validator-option': 7.22.15 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.20.7(@babel/core@7.21.4) - '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.21.4) - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-class-static-block': 7.21.0(@babel/core@7.21.4) - '@babel/plugin-proposal-dynamic-import': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-export-namespace-from': 7.18.9(@babel/core@7.21.4) - '@babel/plugin-proposal-json-strings': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-logical-assignment-operators': 7.20.7(@babel/core@7.21.4) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.21.4) - '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.21.4) - '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-private-property-in-object': 7.21.0(@babel/core@7.21.4) - '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.21.4) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.21.4) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.21.4) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-import-assertions': 7.20.0(@babel/core@7.21.4) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.21.4) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.21.4) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.21.4) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.21.4) - '@babel/plugin-transform-arrow-functions': 7.20.7(@babel/core@7.21.4) - '@babel/plugin-transform-async-to-generator': 7.20.7(@babel/core@7.21.4) - '@babel/plugin-transform-block-scoped-functions': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-block-scoping': 7.21.0(@babel/core@7.21.4) - '@babel/plugin-transform-classes': 7.21.0(@babel/core@7.21.4) - '@babel/plugin-transform-computed-properties': 7.20.7(@babel/core@7.21.4) - '@babel/plugin-transform-destructuring': 7.21.3(@babel/core@7.21.4) - '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-duplicate-keys': 7.18.9(@babel/core@7.21.4) - '@babel/plugin-transform-exponentiation-operator': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-for-of': 7.21.0(@babel/core@7.21.4) - '@babel/plugin-transform-function-name': 7.18.9(@babel/core@7.21.4) - '@babel/plugin-transform-literals': 7.18.9(@babel/core@7.21.4) - '@babel/plugin-transform-member-expression-literals': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-modules-amd': 7.20.11(@babel/core@7.21.4) - '@babel/plugin-transform-modules-commonjs': 7.21.2(@babel/core@7.21.4) - '@babel/plugin-transform-modules-systemjs': 7.20.11(@babel/core@7.21.4) - '@babel/plugin-transform-modules-umd': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-named-capturing-groups-regex': 7.20.5(@babel/core@7.21.4) - '@babel/plugin-transform-new-target': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-object-super': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-parameters': 7.21.3(@babel/core@7.21.4) - '@babel/plugin-transform-property-literals': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-regenerator': 7.20.5(@babel/core@7.21.4) - '@babel/plugin-transform-reserved-words': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-shorthand-properties': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-spread': 7.20.7(@babel/core@7.21.4) - '@babel/plugin-transform-sticky-regex': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-template-literals': 7.18.9(@babel/core@7.21.4) - '@babel/plugin-transform-typeof-symbol': 7.18.9(@babel/core@7.21.4) - '@babel/plugin-transform-unicode-escapes': 7.18.10(@babel/core@7.21.4) - '@babel/plugin-transform-unicode-regex': 7.18.6(@babel/core@7.21.4) - '@babel/preset-modules': 0.1.5(@babel/core@7.21.4) - '@babel/types': 7.23.0 - babel-plugin-polyfill-corejs2: 0.3.3(@babel/core@7.21.4) - babel-plugin-polyfill-corejs3: 0.6.0(@babel/core@7.21.4) - babel-plugin-polyfill-regenerator: 0.4.1(@babel/core@7.21.4) + '@babel/compat-data': 7.23.5 + '@babel/core': 7.23.9 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.23.5 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.20.7(@babel/core@7.23.9) + '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.23.9) + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-proposal-class-static-block': 7.21.0(@babel/core@7.23.9) + '@babel/plugin-proposal-dynamic-import': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-proposal-export-namespace-from': 7.18.9(@babel/core@7.23.9) + '@babel/plugin-proposal-json-strings': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-proposal-logical-assignment-operators': 7.20.7(@babel/core@7.23.9) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.23.9) + '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.23.9) + '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-proposal-private-property-in-object': 7.21.0(@babel/core@7.23.9) + '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.9) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.9) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.9) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-import-assertions': 7.20.0(@babel/core@7.23.9) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.9) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.9) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.9) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.9) + '@babel/plugin-transform-arrow-functions': 7.20.7(@babel/core@7.23.9) + '@babel/plugin-transform-async-to-generator': 7.20.7(@babel/core@7.23.9) + '@babel/plugin-transform-block-scoped-functions': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-transform-block-scoping': 7.21.0(@babel/core@7.23.9) + '@babel/plugin-transform-classes': 7.21.0(@babel/core@7.23.9) + '@babel/plugin-transform-computed-properties': 7.20.7(@babel/core@7.23.9) + '@babel/plugin-transform-destructuring': 7.21.3(@babel/core@7.23.9) + '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-transform-duplicate-keys': 7.18.9(@babel/core@7.23.9) + '@babel/plugin-transform-exponentiation-operator': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-transform-for-of': 7.21.0(@babel/core@7.23.9) + '@babel/plugin-transform-function-name': 7.18.9(@babel/core@7.23.9) + '@babel/plugin-transform-literals': 7.18.9(@babel/core@7.23.9) + '@babel/plugin-transform-member-expression-literals': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-transform-modules-amd': 7.20.11(@babel/core@7.23.9) + '@babel/plugin-transform-modules-commonjs': 7.21.2(@babel/core@7.23.9) + '@babel/plugin-transform-modules-systemjs': 7.20.11(@babel/core@7.23.9) + '@babel/plugin-transform-modules-umd': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-transform-named-capturing-groups-regex': 7.20.5(@babel/core@7.23.9) + '@babel/plugin-transform-new-target': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-transform-object-super': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.9) + '@babel/plugin-transform-property-literals': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-transform-regenerator': 7.20.5(@babel/core@7.23.9) + '@babel/plugin-transform-reserved-words': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-transform-shorthand-properties': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-transform-spread': 7.20.7(@babel/core@7.23.9) + '@babel/plugin-transform-sticky-regex': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-transform-template-literals': 7.18.9(@babel/core@7.23.9) + '@babel/plugin-transform-typeof-symbol': 7.18.9(@babel/core@7.23.9) + '@babel/plugin-transform-unicode-escapes': 7.18.10(@babel/core@7.23.9) + '@babel/plugin-transform-unicode-regex': 7.18.6(@babel/core@7.23.9) + '@babel/preset-modules': 0.1.5(@babel/core@7.23.9) + '@babel/types': 7.23.9 + babel-plugin-polyfill-corejs2: 0.3.3(@babel/core@7.23.9) + babel-plugin-polyfill-corejs3: 0.6.0(@babel/core@7.23.9) + babel-plugin-polyfill-regenerator: 0.4.1(@babel/core@7.23.9) core-js-compat: 3.30.0 semver: 6.3.1 transitivePeerDependencies: @@ -4098,7 +4510,7 @@ packages: '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.23.2) '@babel/plugin-transform-unicode-sets-regex': 7.22.5(@babel/core@7.23.2) '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.23.2) - '@babel/types': 7.23.0 + '@babel/types': 7.23.9 babel-plugin-polyfill-corejs2: 0.4.6(@babel/core@7.23.2) babel-plugin-polyfill-corejs3: 0.8.5(@babel/core@7.23.2) babel-plugin-polyfill-regenerator: 0.5.3(@babel/core@7.23.2) @@ -4108,6 +4520,97 @@ packages: - supports-color dev: true + /@babel/preset-env@7.23.2(@babel/core@7.23.9): + resolution: {integrity: sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.23.2 + '@babel/core': 7.23.9 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.22.15 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.22.15(@babel/core@7.23.9) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.22.15(@babel/core@7.23.9) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.9) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.9) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.9) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.9) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-import-assertions': 7.22.5(@babel/core@7.23.9) + '@babel/plugin-syntax-import-attributes': 7.22.5(@babel/core@7.23.9) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.9) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.9) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.9) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.9) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.9) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.23.9) + '@babel/plugin-transform-async-generator-functions': 7.23.2(@babel/core@7.23.9) + '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.23.9) + '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.23.9) + '@babel/plugin-transform-block-scoping': 7.23.0(@babel/core@7.23.9) + '@babel/plugin-transform-class-properties': 7.22.5(@babel/core@7.23.9) + '@babel/plugin-transform-class-static-block': 7.22.11(@babel/core@7.23.9) + '@babel/plugin-transform-classes': 7.22.15(@babel/core@7.23.9) + '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.23.9) + '@babel/plugin-transform-destructuring': 7.23.0(@babel/core@7.23.9) + '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.23.9) + '@babel/plugin-transform-duplicate-keys': 7.22.5(@babel/core@7.23.9) + '@babel/plugin-transform-dynamic-import': 7.22.11(@babel/core@7.23.9) + '@babel/plugin-transform-exponentiation-operator': 7.22.5(@babel/core@7.23.9) + '@babel/plugin-transform-export-namespace-from': 7.22.11(@babel/core@7.23.9) + '@babel/plugin-transform-for-of': 7.22.15(@babel/core@7.23.9) + '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.23.9) + '@babel/plugin-transform-json-strings': 7.22.11(@babel/core@7.23.9) + '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.23.9) + '@babel/plugin-transform-logical-assignment-operators': 7.22.11(@babel/core@7.23.9) + '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.23.9) + '@babel/plugin-transform-modules-amd': 7.23.0(@babel/core@7.23.9) + '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.23.9) + '@babel/plugin-transform-modules-systemjs': 7.23.0(@babel/core@7.23.9) + '@babel/plugin-transform-modules-umd': 7.22.5(@babel/core@7.23.9) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.23.9) + '@babel/plugin-transform-new-target': 7.22.5(@babel/core@7.23.9) + '@babel/plugin-transform-nullish-coalescing-operator': 7.22.11(@babel/core@7.23.9) + '@babel/plugin-transform-numeric-separator': 7.22.11(@babel/core@7.23.9) + '@babel/plugin-transform-object-rest-spread': 7.22.15(@babel/core@7.23.9) + '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.23.9) + '@babel/plugin-transform-optional-catch-binding': 7.22.11(@babel/core@7.23.9) + '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.23.9) + '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.9) + '@babel/plugin-transform-private-methods': 7.22.5(@babel/core@7.23.9) + '@babel/plugin-transform-private-property-in-object': 7.22.11(@babel/core@7.23.9) + '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.23.9) + '@babel/plugin-transform-regenerator': 7.22.10(@babel/core@7.23.9) + '@babel/plugin-transform-reserved-words': 7.22.5(@babel/core@7.23.9) + '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.23.9) + '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.23.9) + '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.23.9) + '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.23.9) + '@babel/plugin-transform-typeof-symbol': 7.22.5(@babel/core@7.23.9) + '@babel/plugin-transform-unicode-escapes': 7.22.10(@babel/core@7.23.9) + '@babel/plugin-transform-unicode-property-regex': 7.22.5(@babel/core@7.23.9) + '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.23.9) + '@babel/plugin-transform-unicode-sets-regex': 7.22.5(@babel/core@7.23.9) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.23.9) + '@babel/types': 7.23.9 + babel-plugin-polyfill-corejs2: 0.4.6(@babel/core@7.23.9) + babel-plugin-polyfill-corejs3: 0.8.5(@babel/core@7.23.9) + babel-plugin-polyfill-regenerator: 0.5.3(@babel/core@7.23.9) + core-js-compat: 3.33.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/preset-flow@7.22.15(@babel/core@7.18.9): resolution: {integrity: sha512-dB5aIMqpkgbTfN5vDdTRPzjqtWiZcRESNR88QYnoPR+bmdYoluOzMX9tQerTv0XzSgZYctPfO1oc0N5zdog1ew==} engines: {node: '>=6.9.0'} @@ -4120,16 +4623,16 @@ packages: '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.18.9) dev: true - /@babel/preset-flow@7.22.15(@babel/core@7.23.2): + /@babel/preset-flow@7.22.15(@babel/core@7.23.9): resolution: {integrity: sha512-dB5aIMqpkgbTfN5vDdTRPzjqtWiZcRESNR88QYnoPR+bmdYoluOzMX9tQerTv0XzSgZYctPfO1oc0N5zdog1ew==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-option': 7.22.15 - '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.23.9) dev: true /@babel/preset-modules@0.1.5(@babel/core@7.18.9): @@ -4144,15 +4647,15 @@ packages: '@babel/types': 7.18.9 esutils: 2.0.3 - /@babel/preset-modules@0.1.5(@babel/core@7.21.4): + /@babel/preset-modules@0.1.5(@babel/core@7.23.9): resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.18.9 - '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.23.9) '@babel/types': 7.18.9 esutils: 2.0.3 dev: false @@ -4164,7 +4667,18 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - '@babel/types': 7.23.0 + '@babel/types': 7.23.9 + esutils: 2.0.3 + dev: true + + /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.9): + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/types': 7.23.9 esutils: 2.0.3 dev: true @@ -4182,19 +4696,19 @@ packages: '@babel/plugin-transform-react-jsx-development': 7.18.6(@babel/core@7.18.9) '@babel/plugin-transform-react-pure-annotations': 7.18.6(@babel/core@7.18.9) - /@babel/preset-react@7.18.6(@babel/core@7.21.4): + /@babel/preset-react@7.18.6(@babel/core@7.23.9): resolution: {integrity: sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.18.9 '@babel/helper-validator-option': 7.18.6 - '@babel/plugin-transform-react-display-name': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-react-jsx': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-react-jsx-development': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-react-pure-annotations': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-transform-react-display-name': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-transform-react-jsx': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-transform-react-jsx-development': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-transform-react-pure-annotations': 7.18.6(@babel/core@7.23.9) dev: false /@babel/preset-react@7.22.15(@babel/core@7.18.9): @@ -4225,41 +4739,26 @@ packages: transitivePeerDependencies: - supports-color - /@babel/preset-typescript@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.18.9 - '@babel/helper-validator-option': 7.18.6 - '@babel/plugin-transform-typescript': 7.18.8(@babel/core@7.21.4) - transitivePeerDependencies: - - supports-color - dev: false - - /@babel/preset-typescript@7.18.6(@babel/core@7.23.2): + /@babel/preset-typescript@7.18.6(@babel/core@7.23.9): resolution: {integrity: sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.18.9 '@babel/helper-validator-option': 7.18.6 - '@babel/plugin-transform-typescript': 7.18.8(@babel/core@7.23.2) + '@babel/plugin-transform-typescript': 7.18.8(@babel/core@7.23.9) transitivePeerDependencies: - supports-color - dev: true - /@babel/register@7.18.9(@babel/core@7.23.2): + /@babel/register@7.18.9(@babel/core@7.23.9): resolution: {integrity: sha512-ZlbnXDcNYHMR25ITwwNKT88JiaukkdVj/nG7r3wnuXkOTHc60Uy05PwMCPre0hSkY68E6zK3xz+vUJSP2jWmcw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.9 clone-deep: 4.0.1 find-cache-dir: 2.1.0 make-dir: 2.1.0 @@ -4298,21 +4797,14 @@ packages: '@babel/parser': 7.18.9 '@babel/types': 7.18.9 - /@babel/template@7.20.7: - resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.13 - '@babel/parser': 7.23.0 - '@babel/types': 7.23.0 - /@babel/template@7.22.15: resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.22.13 - '@babel/parser': 7.23.0 - '@babel/types': 7.23.0 + '@babel/code-frame': 7.23.5 + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 + dev: true /@babel/template@7.23.9: resolution: {integrity: sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==} @@ -4321,7 +4813,6 @@ packages: '@babel/code-frame': 7.23.5 '@babel/parser': 7.23.9 '@babel/types': 7.23.9 - dev: true /@babel/traverse@7.18.9: resolution: {integrity: sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg==} @@ -4340,40 +4831,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/traverse@7.21.4: - resolution: {integrity: sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.13 - '@babel/generator': 7.23.0 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.21.0 - '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-split-export-declaration': 7.18.6 - '@babel/parser': 7.23.0 - '@babel/types': 7.23.0 - debug: 4.3.4 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - - /@babel/traverse@7.23.2: - resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.13 - '@babel/generator': 7.23.0 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.23.0 - '@babel/types': 7.23.0 - debug: 4.3.4 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - /@babel/traverse@7.23.9: resolution: {integrity: sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==} engines: {node: '>=6.9.0'} @@ -4390,7 +4847,6 @@ packages: globals: 11.12.0 transitivePeerDependencies: - supports-color - dev: true /@babel/types@7.18.9: resolution: {integrity: sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==} @@ -4399,22 +4855,14 @@ packages: '@babel/helper-validator-identifier': 7.18.6 to-fast-properties: 2.0.0 - /@babel/types@7.21.4: - resolution: {integrity: sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.22.5 - '@babel/helper-validator-identifier': 7.22.20 - to-fast-properties: 2.0.0 - dev: true - /@babel/types@7.23.0: resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-string-parser': 7.22.5 + '@babel/helper-string-parser': 7.23.4 '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 + dev: true /@babel/types@7.23.9: resolution: {integrity: sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==} @@ -4423,7 +4871,6 @@ packages: '@babel/helper-string-parser': 7.23.4 '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 - dev: true /@base2/pretty-print-object@1.0.1: resolution: {integrity: sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==} @@ -4796,8 +5243,8 @@ packages: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@babel/parser': 7.18.9 - '@babel/traverse': 7.18.9 + '@babel/parser': 7.23.9 + '@babel/traverse': 7.23.9 '@docusaurus/logger': 2.4.0 '@docusaurus/utils': 2.4.0(@docusaurus/types@2.4.0) '@mdx-js/mdx': 1.6.22 @@ -5398,7 +5845,7 @@ packages: dependencies: '@docusaurus/logger': 2.4.0 '@docusaurus/utils': 2.4.0(@docusaurus/types@2.4.0) - joi: 17.9.1 + joi: 17.12.2 js-yaml: 4.1.0 tslib: 2.4.0 transitivePeerDependencies: @@ -6195,7 +6642,7 @@ packages: '@jest/test-result': 28.1.3 '@jest/transform': 28.1.3 '@jest/types': 28.1.3 - '@jridgewell/trace-mapping': 0.3.17 + '@jridgewell/trace-mapping': 0.3.19 '@types/node': 18.7.5 chalk: 4.1.2 collect-v8-coverage: 1.0.1 @@ -6273,7 +6720,7 @@ packages: resolution: {integrity: sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: - '@jridgewell/trace-mapping': 0.3.17 + '@jridgewell/trace-mapping': 0.3.19 callsites: 3.1.0 graceful-fs: 4.2.10 dev: true @@ -6331,9 +6778,9 @@ packages: resolution: {integrity: sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.9 '@jest/types': 28.1.3 - '@jridgewell/trace-mapping': 0.3.17 + '@jridgewell/trace-mapping': 0.3.19 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 convert-source-map: 1.8.0 @@ -6354,7 +6801,7 @@ packages: resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.23.9 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.19 babel-plugin-istanbul: 6.1.1 @@ -6433,7 +6880,7 @@ packages: dependencies: '@jridgewell/set-array': 1.1.2 '@jridgewell/sourcemap-codec': 1.4.14 - '@jridgewell/trace-mapping': 0.3.17 + '@jridgewell/trace-mapping': 0.3.19 /@jridgewell/resolve-uri@3.1.0: resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} @@ -6458,12 +6905,6 @@ packages: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 - /@jridgewell/trace-mapping@0.3.17: - resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} - dependencies: - '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.4.14 - /@jridgewell/trace-mapping@0.3.19: resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} dependencies: @@ -7203,7 +7644,6 @@ packages: resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} dependencies: '@hapi/hoek': 9.3.0 - dev: true /@sideway/formula@3.0.0: resolution: {integrity: sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==} @@ -7800,9 +8240,9 @@ packages: /@storybook/codemod@7.4.6: resolution: {integrity: sha512-lxmwEpwksCaAq96APN2YlooSDfKjJ1vKzN5Ni2EqQzf2TEXl7XQjLacHd7OOaII1kfsy+D5gNG4N5wBo7Ub30g==} dependencies: - '@babel/core': 7.23.2 - '@babel/preset-env': 7.23.2(@babel/core@7.23.2) - '@babel/types': 7.23.0 + '@babel/core': 7.23.9 + '@babel/preset-env': 7.23.2(@babel/core@7.23.9) + '@babel/types': 7.23.9 '@storybook/csf': 0.1.1 '@storybook/csf-tools': 7.4.6 '@storybook/node-logger': 7.4.6 @@ -7967,10 +8407,10 @@ packages: /@storybook/csf-tools@7.4.6: resolution: {integrity: sha512-ocKpcIUtTBy6hlLY34RUFQyX403cWpB2gGfqvkHbpGe2BQj7EyV0zpWnjsfVxvw+M9OWlCdxHWDOPUgXM33ELw==} dependencies: - '@babel/generator': 7.23.0 - '@babel/parser': 7.23.0 - '@babel/traverse': 7.23.2 - '@babel/types': 7.23.0 + '@babel/generator': 7.23.6 + '@babel/parser': 7.23.9 + '@babel/traverse': 7.23.9 + '@babel/types': 7.23.9 '@storybook/csf': 0.1.1 '@storybook/types': 7.4.6 fs-extra: 11.1.1 @@ -8370,101 +8810,101 @@ packages: file-system-cache: 2.3.0 dev: true - /@svgr/babel-plugin-add-jsx-attribute@6.5.1(@babel/core@7.23.2): + /@svgr/babel-plugin-add-jsx-attribute@6.5.1(@babel/core@7.23.9): resolution: {integrity: sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.9 dev: false - /@svgr/babel-plugin-remove-jsx-attribute@7.0.0(@babel/core@7.23.2): + /@svgr/babel-plugin-remove-jsx-attribute@7.0.0(@babel/core@7.23.9): resolution: {integrity: sha512-iiZaIvb3H/c7d3TH2HBeK91uI2rMhZNwnsIrvd7ZwGLkFw6mmunOCoVnjdYua662MqGFxlN9xTq4fv9hgR4VXQ==} engines: {node: '>=14'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.9 dev: false - /@svgr/babel-plugin-remove-jsx-empty-expression@7.0.0(@babel/core@7.23.2): + /@svgr/babel-plugin-remove-jsx-empty-expression@7.0.0(@babel/core@7.23.9): resolution: {integrity: sha512-sQQmyo+qegBx8DfFc04PFmIO1FP1MHI1/QEpzcIcclo5OAISsOJPW76ZIs0bDyO/DBSJEa/tDa1W26pVtt0FRw==} engines: {node: '>=14'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.9 dev: false - /@svgr/babel-plugin-replace-jsx-attribute-value@6.5.1(@babel/core@7.23.2): + /@svgr/babel-plugin-replace-jsx-attribute-value@6.5.1(@babel/core@7.23.9): resolution: {integrity: sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.9 dev: false - /@svgr/babel-plugin-svg-dynamic-title@6.5.1(@babel/core@7.23.2): + /@svgr/babel-plugin-svg-dynamic-title@6.5.1(@babel/core@7.23.9): resolution: {integrity: sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.9 dev: false - /@svgr/babel-plugin-svg-em-dimensions@6.5.1(@babel/core@7.23.2): + /@svgr/babel-plugin-svg-em-dimensions@6.5.1(@babel/core@7.23.9): resolution: {integrity: sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.9 dev: false - /@svgr/babel-plugin-transform-react-native-svg@6.5.1(@babel/core@7.23.2): + /@svgr/babel-plugin-transform-react-native-svg@6.5.1(@babel/core@7.23.9): resolution: {integrity: sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.9 dev: false - /@svgr/babel-plugin-transform-svg-component@6.5.1(@babel/core@7.23.2): + /@svgr/babel-plugin-transform-svg-component@6.5.1(@babel/core@7.23.9): resolution: {integrity: sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==} engines: {node: '>=12'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.9 dev: false - /@svgr/babel-preset@6.5.1(@babel/core@7.23.2): + /@svgr/babel-preset@6.5.1(@babel/core@7.23.9): resolution: {integrity: sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 - '@svgr/babel-plugin-add-jsx-attribute': 6.5.1(@babel/core@7.23.2) - '@svgr/babel-plugin-remove-jsx-attribute': 7.0.0(@babel/core@7.23.2) - '@svgr/babel-plugin-remove-jsx-empty-expression': 7.0.0(@babel/core@7.23.2) - '@svgr/babel-plugin-replace-jsx-attribute-value': 6.5.1(@babel/core@7.23.2) - '@svgr/babel-plugin-svg-dynamic-title': 6.5.1(@babel/core@7.23.2) - '@svgr/babel-plugin-svg-em-dimensions': 6.5.1(@babel/core@7.23.2) - '@svgr/babel-plugin-transform-react-native-svg': 6.5.1(@babel/core@7.23.2) - '@svgr/babel-plugin-transform-svg-component': 6.5.1(@babel/core@7.23.2) + '@babel/core': 7.23.9 + '@svgr/babel-plugin-add-jsx-attribute': 6.5.1(@babel/core@7.23.9) + '@svgr/babel-plugin-remove-jsx-attribute': 7.0.0(@babel/core@7.23.9) + '@svgr/babel-plugin-remove-jsx-empty-expression': 7.0.0(@babel/core@7.23.9) + '@svgr/babel-plugin-replace-jsx-attribute-value': 6.5.1(@babel/core@7.23.9) + '@svgr/babel-plugin-svg-dynamic-title': 6.5.1(@babel/core@7.23.9) + '@svgr/babel-plugin-svg-em-dimensions': 6.5.1(@babel/core@7.23.9) + '@svgr/babel-plugin-transform-react-native-svg': 6.5.1(@babel/core@7.23.9) + '@svgr/babel-plugin-transform-svg-component': 6.5.1(@babel/core@7.23.9) dev: false /@svgr/core@6.5.1: resolution: {integrity: sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==} engines: {node: '>=10'} dependencies: - '@babel/core': 7.23.2 - '@svgr/babel-preset': 6.5.1(@babel/core@7.23.2) + '@babel/core': 7.23.9 + '@svgr/babel-preset': 6.5.1(@babel/core@7.23.9) '@svgr/plugin-jsx': 6.5.1(@svgr/core@6.5.1) camelcase: 6.3.0 cosmiconfig: 7.0.1 @@ -8476,7 +8916,7 @@ packages: resolution: {integrity: sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==} engines: {node: '>=10'} dependencies: - '@babel/types': 7.23.0 + '@babel/types': 7.23.9 entities: 4.4.0 dev: false @@ -8486,8 +8926,8 @@ packages: peerDependencies: '@svgr/core': ^6.0.0 dependencies: - '@babel/core': 7.23.2 - '@svgr/babel-preset': 6.5.1(@babel/core@7.23.2) + '@babel/core': 7.23.9 + '@svgr/babel-preset': 6.5.1(@babel/core@7.23.9) '@svgr/core': 6.5.1 '@svgr/hast-util-to-babel-ast': 6.5.1 svg-parser: 2.0.4 @@ -8511,11 +8951,11 @@ packages: resolution: {integrity: sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA==} engines: {node: '>=10'} dependencies: - '@babel/core': 7.21.4 - '@babel/plugin-transform-react-constant-elements': 7.21.3(@babel/core@7.21.4) - '@babel/preset-env': 7.21.4(@babel/core@7.21.4) - '@babel/preset-react': 7.18.6(@babel/core@7.21.4) - '@babel/preset-typescript': 7.18.6(@babel/core@7.21.4) + '@babel/core': 7.23.9 + '@babel/plugin-transform-react-constant-elements': 7.21.3(@babel/core@7.23.9) + '@babel/preset-env': 7.21.4(@babel/core@7.23.9) + '@babel/preset-react': 7.18.6(@babel/core@7.23.9) + '@babel/preset-typescript': 7.18.6(@babel/core@7.23.9) '@svgr/core': 6.5.1 '@svgr/plugin-jsx': 6.5.1(@svgr/core@6.5.1) '@svgr/plugin-svgo': 6.5.1(@svgr/core@6.5.1) @@ -8814,8 +9254,8 @@ packages: /@types/babel__core@7.1.19: resolution: {integrity: sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==} dependencies: - '@babel/parser': 7.21.4 - '@babel/types': 7.21.4 + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 '@types/babel__generator': 7.6.4 '@types/babel__template': 7.4.1 '@types/babel__traverse': 7.17.1 @@ -8824,20 +9264,20 @@ packages: /@types/babel__generator@7.6.4: resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} dependencies: - '@babel/types': 7.23.0 + '@babel/types': 7.23.9 dev: true /@types/babel__template@7.4.1: resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} dependencies: - '@babel/parser': 7.23.0 - '@babel/types': 7.23.0 + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 dev: true /@types/babel__traverse@7.17.1: resolution: {integrity: sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA==} dependencies: - '@babel/types': 7.23.0 + '@babel/types': 7.23.9 dev: true /@types/body-parser@1.19.2: @@ -9567,12 +10007,20 @@ packages: acorn-walk: 7.2.0 dev: true + /acorn-import-assertions@1.8.0(acorn@8.10.0): + resolution: {integrity: sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==} + peerDependencies: + acorn: ^8 + dependencies: + acorn: 8.10.0 + /acorn-import-assertions@1.8.0(acorn@8.7.1): resolution: {integrity: sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==} peerDependencies: acorn: ^8 dependencies: acorn: 8.7.1 + dev: true /acorn-jsx@5.3.2(acorn@7.4.1): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -9582,12 +10030,12 @@ packages: acorn: 7.4.1 dev: true - /acorn-jsx@5.3.2(acorn@8.7.1): + /acorn-jsx@5.3.2(acorn@8.10.0): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.7.1 + acorn: 8.10.0 dev: true /acorn-walk@7.2.0: @@ -9609,7 +10057,6 @@ packages: resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} engines: {node: '>=0.4.0'} hasBin: true - dev: true /acorn@8.7.1: resolution: {integrity: sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==} @@ -10014,12 +10461,12 @@ packages: - debug dev: true - /babel-core@7.0.0-bridge.0(@babel/core@7.23.2): + /babel-core@7.0.0-bridge.0(@babel/core@7.23.9): resolution: {integrity: sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.9 dev: true /babel-eslint@10.1.0(eslint@8.20.0): @@ -10040,17 +10487,17 @@ packages: - supports-color dev: true - /babel-jest@28.1.3(@babel/core@7.23.2): + /babel-jest@28.1.3(@babel/core@7.23.9): resolution: {integrity: sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} peerDependencies: '@babel/core': ^7.8.0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.9 '@jest/transform': 28.1.3 '@types/babel__core': 7.1.19 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 28.1.3(@babel/core@7.23.2) + babel-preset-jest: 28.1.3(@babel/core@7.23.9) chalk: 4.1.2 graceful-fs: 4.2.10 slash: 3.0.0 @@ -10058,17 +10505,17 @@ packages: - supports-color dev: true - /babel-jest@29.7.0(@babel/core@7.23.2): + /babel-jest@29.7.0(@babel/core@7.23.9): resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.8.0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.9 '@jest/transform': 29.7.0 '@types/babel__core': 7.1.19 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.23.2) + babel-preset-jest: 29.6.3(@babel/core@7.23.9) chalk: 4.1.2 graceful-fs: 4.2.10 slash: 3.0.0 @@ -10101,7 +10548,7 @@ packages: dependencies: '@babel/core': 7.18.9 find-cache-dir: 3.3.2 - loader-utils: 2.0.2 + loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 webpack: 5.77.0 @@ -10162,8 +10609,8 @@ packages: resolution: {integrity: sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: - '@babel/template': 7.22.15 - '@babel/types': 7.23.0 + '@babel/template': 7.23.9 + '@babel/types': 7.23.9 '@types/babel__core': 7.1.19 '@types/babel__traverse': 7.17.1 dev: true @@ -10172,8 +10619,8 @@ packages: resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/template': 7.22.15 - '@babel/types': 7.23.0 + '@babel/template': 7.23.9 + '@babel/types': 7.23.9 '@types/babel__core': 7.1.19 '@types/babel__traverse': 7.17.1 dev: true @@ -10194,14 +10641,14 @@ packages: transitivePeerDependencies: - supports-color - /babel-plugin-polyfill-corejs2@0.3.3(@babel/core@7.21.4): + /babel-plugin-polyfill-corejs2@0.3.3(@babel/core@7.23.9): resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.23.2 - '@babel/core': 7.21.4 - '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.21.4) + '@babel/compat-data': 7.23.5 + '@babel/core': 7.23.9 + '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.23.9) semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -10212,7 +10659,7 @@ packages: peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/compat-data': 7.23.2 + '@babel/compat-data': 7.23.5 '@babel/core': 7.23.2 '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.23.2) semver: 6.3.1 @@ -10220,6 +10667,19 @@ packages: - supports-color dev: true + /babel-plugin-polyfill-corejs2@0.4.6(@babel/core@7.23.9): + resolution: {integrity: sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/compat-data': 7.23.5 + '@babel/core': 7.23.9 + '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.23.9) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + /babel-plugin-polyfill-corejs3@0.5.3(@babel/core@7.18.9): resolution: {integrity: sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==} peerDependencies: @@ -10231,13 +10691,13 @@ packages: transitivePeerDependencies: - supports-color - /babel-plugin-polyfill-corejs3@0.6.0(@babel/core@7.21.4): + /babel-plugin-polyfill-corejs3@0.6.0(@babel/core@7.23.9): resolution: {integrity: sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.21.4) + '@babel/core': 7.23.9 + '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.23.9) core-js-compat: 3.30.0 transitivePeerDependencies: - supports-color @@ -10255,6 +10715,18 @@ packages: - supports-color dev: true + /babel-plugin-polyfill-corejs3@0.8.5(@babel/core@7.23.9): + resolution: {integrity: sha512-Q6CdATeAvbScWPNLB8lzSO7fgUVBkQt6zLgNlfyeCr/EQaEQR+bWiBYYPYAFyE528BMjRhL+1QBMOI4jc/c5TA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.23.9) + core-js-compat: 3.33.0 + transitivePeerDependencies: + - supports-color + dev: true + /babel-plugin-polyfill-regenerator@0.3.1(@babel/core@7.18.9): resolution: {integrity: sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==} peerDependencies: @@ -10275,13 +10747,13 @@ packages: transitivePeerDependencies: - supports-color - /babel-plugin-polyfill-regenerator@0.4.1(@babel/core@7.21.4): + /babel-plugin-polyfill-regenerator@0.4.1(@babel/core@7.23.9): resolution: {integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.4 - '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.21.4) + '@babel/core': 7.23.9 + '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.23.9) transitivePeerDependencies: - supports-color dev: false @@ -10297,6 +10769,17 @@ packages: - supports-color dev: true + /babel-plugin-polyfill-regenerator@0.5.3(@babel/core@7.23.9): + resolution: {integrity: sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.23.9) + transitivePeerDependencies: + - supports-color + dev: true + /babel-plugin-react-docgen@4.2.1: resolution: {integrity: sha512-UQ0NmGHj/HAqi5Bew8WvNfCk8wSsmdgNd8ZdMjBCICtyCJCq9LiqgqvjCYe570/Wg7AQArSq1VQ60Dd/CHN7mQ==} dependencies: @@ -10307,46 +10790,46 @@ packages: - supports-color dev: true - /babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.2): + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.9): resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.2 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.2) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.23.2) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.2) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.2) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.2) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.2) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.2) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.2) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.2) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.2) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.2) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.2) - dev: true - - /babel-preset-jest@28.1.3(@babel/core@7.23.2): + '@babel/core': 7.23.9 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.9) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.9) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.9) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.9) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.9) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.9) + dev: true + + /babel-preset-jest@28.1.3(@babel/core@7.23.9): resolution: {integrity: sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.9 babel-plugin-jest-hoist: 28.1.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.2) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.9) dev: true - /babel-preset-jest@29.6.3(@babel/core@7.23.2): + /babel-preset-jest@29.6.3(@babel/core@7.23.9): resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.9 babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.2) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.9) dev: true /bail@1.0.5: @@ -10537,16 +11020,6 @@ packages: node-releases: 2.0.10 update-browserslist-db: 1.0.10(browserslist@4.21.5) - /browserslist@4.22.1: - resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - caniuse-lite: 1.0.30001547 - electron-to-chromium: 1.4.551 - node-releases: 2.0.13 - update-browserslist-db: 1.0.13(browserslist@4.22.1) - /browserslist@4.23.0: resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -10556,7 +11029,6 @@ packages: electron-to-chromium: 1.4.677 node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.23.0) - dev: true /bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} @@ -10713,8 +11185,8 @@ packages: /caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} dependencies: - browserslist: 4.22.1 - caniuse-lite: 1.0.30001547 + browserslist: 4.23.0 + caniuse-lite: 1.0.30001588 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 dev: false @@ -10726,12 +11198,8 @@ packages: /caniuse-lite@1.0.30001474: resolution: {integrity: sha512-iaIZ8gVrWfemh5DG3T9/YqarVZoYf0r188IjaGwx68j4Pf0SGY6CQkmJUIE+NZHkkecQGohzXmBGEwWDr9aM3Q==} - /caniuse-lite@1.0.30001547: - resolution: {integrity: sha512-W7CrtIModMAxobGhz8iXmDfuJiiKg1WADMO/9x7/CLNin5cpSbuBjooyoIUVB5eyCc36QuTVlkVa1iB2S5+/eA==} - /caniuse-lite@1.0.30001588: resolution: {integrity: sha512-+hVY9jE44uKLkH0SrUTqxjxqNTOWHsbnQDIKjwkZ3lNTzUUVdBLBGXtj/q5Mp5u98r3droaZAewQuEDzjQdZlQ==} - dev: true /case-sensitive-paths-webpack-plugin@2.4.0: resolution: {integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==} @@ -11200,19 +11668,19 @@ packages: /core-js-compat@3.23.5: resolution: {integrity: sha512-fHYozIFIxd+91IIbXJgWd/igXIc8Mf9is0fusswjnGIWVG96y2cwyUdlCkGOw6rMLHKAxg7xtCIVaHsyOUnJIg==} dependencies: - browserslist: 4.21.5 + browserslist: 4.23.0 semver: 7.0.0 /core-js-compat@3.30.0: resolution: {integrity: sha512-P5A2h/9mRYZFIAP+5Ab8ns6083IyVpSclU74UNvbGVQ8VM7n3n3/g2yF3AkKQ9NXz2O+ioxLbEWKnDtgsFamhg==} dependencies: - browserslist: 4.22.1 + browserslist: 4.23.0 dev: false /core-js-compat@3.33.0: resolution: {integrity: sha512-0w4LcLXsVEuNkIqwjjf9rjCoPhK8uqA4tMRh4Ge26vfLtUutshn+aRJU21I9LCJlh2QQHfisNToLjw1XEJLTWw==} dependencies: - browserslist: 4.22.1 + browserslist: 4.23.0 dev: true /core-js-pure@3.23.5: @@ -12082,12 +12550,8 @@ packages: /electron-to-chromium@1.4.351: resolution: {integrity: sha512-W35n4jAsyj6OZGxeWe+gA6+2Md4jDO19fzfsRKEt3DBwIdlVTT8O9Uv8ojgUAoQeXASdgG9zMU+8n8Xg/W6dRQ==} - /electron-to-chromium@1.4.551: - resolution: {integrity: sha512-/Ng/W/kFv7wdEHYzxdK7Cv0BHEGSkSB3M0Ssl8Ndr1eMiYeas/+Mv4cNaDqamqWx6nd2uQZfPz6g25z25M/sdw==} - /electron-to-chromium@1.4.677: resolution: {integrity: sha512-erDa3CaDzwJOpyvfKhOiJjBVNnMM0qxHq47RheVVwsSQrgBA9ZSGV9kdaOfZDPXcHzhG7lBxhj6A7KvfLJBd6Q==} - dev: true /emittery@0.10.2: resolution: {integrity: sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==} @@ -12526,8 +12990,8 @@ packages: resolution: {integrity: sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.7.1 - acorn-jsx: 5.3.2(acorn@8.7.1) + acorn: 8.10.0 + acorn-jsx: 5.3.2(acorn@8.10.0) eslint-visitor-keys: 3.3.0 dev: true @@ -12561,8 +13025,8 @@ packages: resolution: {integrity: sha512-YNF+mZ/Wu2FU/gvmzuWtYc8rloubL7wfXCTgouFrnjGVXPA/EeYYA7pupXWrb3Iv1cTBeSSxxJIbK23l4MRNqg==} engines: {node: '>=8.3.0'} dependencies: - '@babel/traverse': 7.23.2 - '@babel/types': 7.23.0 + '@babel/traverse': 7.23.9 + '@babel/types': 7.23.9 c8: 7.14.0 transitivePeerDependencies: - supports-color @@ -12848,7 +13312,7 @@ packages: peerDependencies: webpack: ^4.0.0 || ^5.0.0 dependencies: - loader-utils: 2.0.2 + loader-utils: 2.0.4 schema-utils: 3.1.1 webpack: 5.77.0 dev: false @@ -13064,7 +13528,7 @@ packages: vue-template-compiler: optional: true dependencies: - '@babel/code-frame': 7.21.4 + '@babel/code-frame': 7.23.5 '@types/json-schema': 7.0.11 chalk: 4.1.2 chokidar: 3.5.3 @@ -13088,7 +13552,7 @@ packages: typescript: '>3.6.0' webpack: ^5.11.0 dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.23.5 chalk: 4.1.2 chokidar: 3.5.3 cosmiconfig: 7.0.1 @@ -13113,6 +13577,17 @@ packages: mime-types: 2.1.35 dev: true + /formidable-oss-badges@1.3.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Qe+Qsi0/bclmr+/J77xgbh2nrN1IxXpuErCaajdYSCnDo4Qt/EVsQ7smIoCQ72ju1RTkxKGMomF22SrAwYeBxw==} + engines: {node: '>= 0.12.0', npm: '>= 2.0.0'} + peerDependencies: + react: '>= 18.0.0' + react-dom: '>= 18.0.0' + dependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: true + /forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -14484,7 +14959,7 @@ packages: resolution: {integrity: sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.9 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.0 semver: 6.3.1 @@ -14496,8 +14971,8 @@ packages: resolution: {integrity: sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.23.2 - '@babel/parser': 7.23.0 + '@babel/core': 7.23.9 + '@babel/parser': 7.23.9 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.0 semver: 6.3.1 @@ -14729,10 +15204,10 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.9 '@jest/test-sequencer': 28.1.3 '@jest/types': 28.1.3 - babel-jest: 28.1.3(@babel/core@7.23.2) + babel-jest: 28.1.3(@babel/core@7.23.9) chalk: 4.1.2 ci-info: 3.3.2 deepmerge: 4.2.2 @@ -14767,11 +15242,11 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.9 '@jest/test-sequencer': 28.1.3 '@jest/types': 28.1.3 '@types/node': 18.7.5 - babel-jest: 28.1.3(@babel/core@7.23.2) + babel-jest: 28.1.3(@babel/core@7.23.9) chalk: 4.1.2 ci-info: 3.3.2 deepmerge: 4.2.2 @@ -14806,10 +15281,10 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.9 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.23.2) + babel-jest: 29.7.0(@babel/core@7.23.9) chalk: 4.1.2 ci-info: 3.3.2 deepmerge: 4.2.2 @@ -14845,11 +15320,11 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.23.2 + '@babel/core': 7.23.9 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 '@types/node': 18.7.5 - babel-jest: 29.7.0(@babel/core@7.23.2) + babel-jest: 29.7.0(@babel/core@7.23.9) chalk: 4.1.2 ci-info: 3.3.2 deepmerge: 4.2.2 @@ -15105,7 +15580,7 @@ packages: resolution: {integrity: sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: - '@babel/code-frame': 7.18.6 + '@babel/code-frame': 7.23.5 '@jest/types': 28.1.3 '@types/stack-utils': 2.0.1 chalk: 4.1.2 @@ -15120,7 +15595,7 @@ packages: resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.23.5 '@jest/types': 29.6.3 '@types/stack-utils': 2.0.1 chalk: 4.1.2 @@ -15409,17 +15884,17 @@ packages: resolution: {integrity: sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: - '@babel/core': 7.23.2 - '@babel/generator': 7.21.4 - '@babel/plugin-syntax-typescript': 7.18.6(@babel/core@7.23.2) - '@babel/traverse': 7.21.4 - '@babel/types': 7.23.0 + '@babel/core': 7.23.9 + '@babel/generator': 7.23.6 + '@babel/plugin-syntax-typescript': 7.18.6(@babel/core@7.23.9) + '@babel/traverse': 7.23.9 + '@babel/types': 7.23.9 '@jest/expect-utils': 28.1.3 '@jest/transform': 28.1.3 '@jest/types': 28.1.3 '@types/babel__traverse': 7.17.1 '@types/prettier': 2.6.4 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.2) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.9) chalk: 4.1.2 expect: 28.1.3 graceful-fs: 4.2.10 @@ -15440,15 +15915,15 @@ packages: resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.23.2 - '@babel/generator': 7.23.0 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.2) - '@babel/plugin-syntax-typescript': 7.18.6(@babel/core@7.23.2) - '@babel/types': 7.23.0 + '@babel/core': 7.23.9 + '@babel/generator': 7.23.6 + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.9) + '@babel/plugin-syntax-typescript': 7.18.6(@babel/core@7.23.9) + '@babel/types': 7.23.9 '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.2) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.9) chalk: 4.1.2 expect: 29.7.0 graceful-fs: 4.2.10 @@ -15659,7 +16134,6 @@ packages: '@sideway/address': 4.1.5 '@sideway/formula': 3.0.1 '@sideway/pinpoint': 2.0.0 - dev: true /joi@17.6.0: resolution: {integrity: sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw==} @@ -15670,15 +16144,6 @@ packages: '@sideway/formula': 3.0.0 '@sideway/pinpoint': 2.0.0 - /joi@17.9.1: - resolution: {integrity: sha512-FariIi9j6QODKATGBrEX7HZcja8Bsh3rfdGYy/Sb65sGlZWK/QWesU1ghk7aJWDj95knjXlQfSmzFSPPkLVsfw==} - dependencies: - '@hapi/hoek': 9.3.0 - '@hapi/topo': 5.1.0 - '@sideway/address': 4.1.4 - '@sideway/formula': 3.0.1 - '@sideway/pinpoint': 2.0.0 - /joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} @@ -15717,17 +16182,17 @@ packages: peerDependencies: '@babel/preset-env': ^7.1.6 dependencies: - '@babel/core': 7.23.2 - '@babel/parser': 7.23.0 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.23.2) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.23.2) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.23.2) - '@babel/plugin-transform-modules-commonjs': 7.21.2(@babel/core@7.23.2) + '@babel/core': 7.23.9 + '@babel/parser': 7.23.9 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.23.9) + '@babel/plugin-transform-modules-commonjs': 7.21.2(@babel/core@7.23.9) '@babel/preset-env': 7.23.2(@babel/core@7.23.2) - '@babel/preset-flow': 7.22.15(@babel/core@7.23.2) - '@babel/preset-typescript': 7.18.6(@babel/core@7.23.2) - '@babel/register': 7.18.9(@babel/core@7.23.2) - babel-core: 7.0.0-bridge.0(@babel/core@7.23.2) + '@babel/preset-flow': 7.22.15(@babel/core@7.23.9) + '@babel/preset-typescript': 7.18.6(@babel/core@7.23.9) + '@babel/register': 7.18.9(@babel/core@7.23.9) + babel-core: 7.0.0-bridge.0(@babel/core@7.23.9) chalk: 4.1.2 flow-parser: 0.218.1 graceful-fs: 4.2.10 @@ -15983,7 +16448,6 @@ packages: big.js: 5.2.2 emojis-list: 3.0.0 json5: 2.2.3 - dev: true /loader-utils@3.2.1: resolution: {integrity: sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==} @@ -16518,12 +16982,8 @@ packages: /node-releases@2.0.10: resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==} - /node-releases@2.0.13: - resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} - /node-releases@2.0.14: resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} - dev: true /node-releases@2.0.6: resolution: {integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==} @@ -16940,7 +17400,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.23.5 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -17170,7 +17630,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.22.1 + browserslist: 4.23.0 caniuse-api: 3.0.0 colord: 2.9.3 postcss: 8.4.21 @@ -17183,7 +17643,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.22.1 + browserslist: 4.23.0 postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: false @@ -17344,7 +17804,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.22.1 + browserslist: 4.23.0 caniuse-api: 3.0.0 cssnano-utils: 3.1.0(postcss@8.4.21) postcss: 8.4.21 @@ -17379,7 +17839,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.22.1 + browserslist: 4.23.0 cssnano-utils: 3.1.0(postcss@8.4.21) postcss: 8.4.21 postcss-value-parser: 4.2.0 @@ -17507,7 +17967,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.22.1 + browserslist: 4.23.0 postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: false @@ -17560,7 +18020,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.22.1 + browserslist: 4.23.0 caniuse-api: 3.0.0 postcss: 8.4.21 dev: false @@ -18015,9 +18475,9 @@ packages: typescript: optional: true dependencies: - '@babel/code-frame': 7.18.6 + '@babel/code-frame': 7.23.5 address: 1.2.0 - browserslist: 4.21.5 + browserslist: 4.23.0 chalk: 4.1.2 cross-spawn: 7.0.3 detect-port-alt: 1.1.6 @@ -18060,8 +18520,8 @@ packages: engines: {node: '>=8.10.0'} hasBin: true dependencies: - '@babel/core': 7.23.2 - '@babel/generator': 7.23.0 + '@babel/core': 7.23.9 + '@babel/generator': 7.23.6 '@babel/runtime': 7.21.0 ast-types: 0.14.2 commander: 2.20.3 @@ -19529,7 +19989,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.22.1 + browserslist: 4.23.0 postcss: 8.4.21 postcss-selector-parser: 6.0.11 dev: false @@ -19809,7 +20269,7 @@ packages: hasBin: true dependencies: '@jridgewell/source-map': 0.3.2 - acorn: 8.7.1 + acorn: 8.10.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -19940,6 +20400,7 @@ packages: /trim@0.0.1: resolution: {integrity: sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==} + deprecated: Use String.prototype.trim() instead dev: false /trough@1.0.5: @@ -20310,16 +20771,6 @@ packages: escalade: 3.1.1 picocolors: 1.0.0 - /update-browserslist-db@1.0.13(browserslist@4.22.1): - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - dependencies: - browserslist: 4.22.1 - escalade: 3.1.1 - picocolors: 1.0.0 - /update-browserslist-db@1.0.13(browserslist@4.23.0): resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} hasBin: true @@ -20329,7 +20780,6 @@ packages: browserslist: 4.23.0 escalade: 3.1.1 picocolors: 1.0.0 - dev: true /update-browserslist-db@1.0.5(browserslist@4.21.2): resolution: {integrity: sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==} @@ -20545,7 +20995,7 @@ packages: resolution: {integrity: sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==} engines: {node: '>=10.12.0'} dependencies: - '@jridgewell/trace-mapping': 0.3.17 + '@jridgewell/trace-mapping': 0.3.19 '@types/istanbul-lib-coverage': 2.0.4 convert-source-map: 1.8.0 dev: true @@ -20604,7 +21054,7 @@ packages: hasBin: true dependencies: axios: 0.25.0 - joi: 17.9.1 + joi: 17.12.2 lodash: 4.17.21 minimist: 1.2.8 rxjs: 7.8.0 @@ -20618,7 +21068,7 @@ packages: hasBin: true dependencies: axios: 0.27.2(debug@4.3.4) - joi: 17.9.1 + joi: 17.12.2 lodash: 4.17.21 minimist: 1.2.8 rxjs: 7.8.0 @@ -20698,7 +21148,7 @@ packages: hasBin: true dependencies: '@discoveryjs/json-ext': 0.5.7 - acorn: 8.7.1 + acorn: 8.10.0 acorn-walk: 8.2.0 chalk: 4.1.2 commander: 7.2.0 @@ -21011,9 +21461,9 @@ packages: '@webassemblyjs/ast': 1.11.1 '@webassemblyjs/wasm-edit': 1.11.1 '@webassemblyjs/wasm-parser': 1.11.1 - acorn: 8.7.1 - acorn-import-assertions: 1.8.0(acorn@8.7.1) - browserslist: 4.21.5 + acorn: 8.10.0 + acorn-import-assertions: 1.8.0(acorn@8.10.0) + browserslist: 4.23.0 chrome-trace-event: 1.0.3 enhanced-resolve: 5.10.0 es-module-lexer: 0.9.3 diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js index 0ef03909..2a7dad07 100644 --- a/website/docusaurus.config.js +++ b/website/docusaurus.config.js @@ -30,7 +30,7 @@ const config = { /** @type {import('@docusaurus/preset-classic').Options} */ ({ docs: { - routeBasePath: '/', + routeBasePath: '/docs', path: '../docs', sidebarPath: require.resolve('./sidebars.js'), editUrl: @@ -67,6 +67,7 @@ const config = { src: 'img/nearform-logo-white.svg', }, items: [ + { to: 'docs', label: 'Documentation', position: 'left' }, { href: 'https://github.com/FormidableLabs/nuka-carousel', className: 'header-github-link', diff --git a/website/package.json b/website/package.json index 7c8ca50f..f58f3ea8 100644 --- a/website/package.json +++ b/website/package.json @@ -19,6 +19,7 @@ "dependencies": { "@docusaurus/core": "2.4.0", "@docusaurus/preset-classic": "2.4.0", + "@docusaurus/plugin-content-pages": "2.4.0", "@mdx-js/react": "^1.6.22", "clsx": "^1.2.1", "nuka-carousel": "*", @@ -34,6 +35,7 @@ "@tsconfig/docusaurus": "^1.0.5", "@types/node": "^18.7.5", "autoprefixer": "^10.4.14", + "formidable-oss-badges": "^1.3.2", "postcss": "^8.4.21", "tailwindcss": "^3.3.1", "ts-node": "^10.9.1", diff --git a/website/src/pages/.keep b/website/src/pages/.keep deleted file mode 100644 index e69de29b..00000000 diff --git a/website/src/pages/index.tsx b/website/src/pages/index.tsx new file mode 100644 index 00000000..eb6c9f96 --- /dev/null +++ b/website/src/pages/index.tsx @@ -0,0 +1,108 @@ +import React from 'react'; +import Layout from '@theme/Layout'; +import { FeaturedBadge } from 'formidable-oss-badges'; +import { Carousel } from 'nuka-carousel'; + +function DemoCard({ title, description, imageSrc, price }) { + return ( +
+
+
+ ${price.toFixed(2)} +
+ {title} +
+
+
+ {title} +
+
+ {description} +
+ +
+
+ ); +} + +export default function Index() { + return ( + +
+
+
+
+ +
+
+

+ Nuka Carousel +

+

+ Small, fast, and accessibility-first React carousel library with + easily customizable UI and behavior to fit your brand and site. +

+ +
+
+
+
+

+ Feature Demo +

+
+
+ + + + + + + +
+
+
+ ); +} diff --git a/website/static/img/av_cover.jpg b/website/static/img/av_cover.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2c2612d72f3f7c9eea4756e79c2f44fcd4872e3b GIT binary patch literal 490229 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

a^g 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

2W34<%F^PqWEqjyOx;QTm4(E-rO&28Jxgi- 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

o`k+f z;eN?CgI7j=WfK8>!^0=r@go%GX$}4aM6u=&>*0q4p9keXCh5%HNcZyQAyB`w`ZoOp0C$XZGHS{XcuGn?jDy{1eFhlm7sPFgVP%Iisxq0OG3qK+Jf_ zmc-zfK$RS9BKAA)b1Dm3O^UfmQCZIJ@z#I%-4fOi449`WJgNMAZ_L|d%Z<;NN#j5y zc#~hGXyG0l#3Z^&Fc++!Z^Zn4e+enA8wY$yc)uuXFglKm{3>oLO6uq0z|l>yYIKwD zc8~x^S@~6cjv4&bF`v}JHCmN)ik3g6NGLAn=f^)JxibTSJ*U z#$b0*?LVjQb(3lLd`~0tPyPT_h=N@PwBD!mu|XcQ`U(KGm4-GQv;IWD#iQa-78<_) z0CL4@O;&z57>BhH=`R4953D7X1+zc=W;$lLir^Xc+)Y#WPvN}rzcOvJm{HVaaP1N; zvH(#gzeas$FlsRSc!5DFH7DT!Dg86>vmaoIf>H9ClU>9-UzC*#Q(5?{+J1aYZVnQ7 z{{ZCtIn4ZP{2h^dj(mv0t^%{{R|`6Rf{P4O)@RG&4x+KZaoa7|0{&TO&=XOoKzC1&d+$g8t@Y6)J9z zJ!j+VIG=^kzA_WQnsZuaTtmh9WX@TsR1T4pyz!rsYeLerGEpbq?LU{%)Sr_r5?04t zon$qSGMuXu`aEPl5Z77!N$Lh6`VC3^ZdS=%%+Je)r}cJ6tdXD5_qxfleNL0e{F0g( z)byX;=`s7C)%SX5@Vx0oOquZn-w=1*mEO3EHJE;SApvtCJ|{JY2lLc$K-i4;SH(@IDzf zsO0KT;l238y5Rw4r4oK|KMrDOIuhMl_TE0E0>AQ~H@=6ZGft+{lrHlVzw6 z_AR#WKd2cmEP6yW@y{8|aALGi{{R}2FXVXhHX3uK%EatYCh9vM>6j`(Na|gKigre2qzeyG@U!4A!{<{OE;RFN2Kcnw;n@AOJ3I71W zjrh!cP_2+Ld{6BIMXs^IOB;~`T3YiR8FbE<6=9Tk3I71ZhE|jY@ti3dU_do=fkmmT z{{Zj?u#AQnOf7bZjWRVa{v>yPvpOuSbpHUb>ujfT;#m@+Z3AanblDWCFz%=0Q9hHI z2(xr~pO3HNejT=RuOEj2Qf)WZAhJT&qcwUE@ID#+8KnMIxQ0Sa0{t%%zSgdPB&#EE zmXztA&&N$E<~}4;eEza|KRNgs+#eJ8TRW)hASt5MwRcqhtcAusBuCUI^ZVUlq=1Q7 zLcOF!{{Y;d-HqOp@mRV1>7T(5Sy2mevyCF>bmK^{Bi)GYeK88u?b7oFAX#&nD~%XRPz2)@$jDn{sMK0_*Yu$pVfAv>C#JD>r?st z?z3o5AK^dvF+Ud7Z9klo_+Q#AYuCgynO7Zf{{YFig9Lov%TL@@ZPlOLo%LN!H^U0H zEwqc3E(cuGC`*%;%Tc(M??={R%B<} zey9Hc+^P6Zv?M69f9OCJCR%nRyOkiTe&A`ONq4M38#Baw${03H7osV=w`VSq@IEK! z$$n*ubefU#H-mpYr24%R@%4I7!T@q)IhADzaAQA$c`()4@XzB{r2HoKAjpt4R=WKn zWS)?{W)9EjhD9hc*{h$7xE6@{O*^JjNxWI`TGLX04-E|y%6v)b654tH04YA} zr28ES{J{=qx_?%UUb{k|l#)N6-s=q{7Tu`$C-;;33FdbhU7=hHc$>uWa8&5b{;^oL zu~%v}8Ctl!9@W=%{z1WN3NO@VQq`r;?ydnB>8AF$!Hrz$s~e?lb5zQ@bJ#)u0Ak=n zLxNkN&*PXY)?5%%=Ep^0D-G)YV~I~+0EaD9bb+-Q3Q{OlK}{fT#2e>7IAGOL3K zJ)2L@f`-%XIFU-8Z^}=)=`}u>C;tEvpz$hlsw=eqkG<9sJU@hmZ$GxDgatG%@D;Z~ zdc}dqwc#nCqJL4aT|_f-srXg(2YW~ECL=4^bNdCV4qaJaJbP3|Ak$bdAnHbAn#8u- zDA*_Us)rG19Oh{hyVlrfpZ@@629gOk@_?=x`TH(s;L>qoKB|nVj_Z%ypP#7aT_pCE z5_FJDYykQv24$wn(%odv^Qmnk1L}u)4S8sesc#^dNcYMU6+Xo*ELVif}2j#_$0;z^FC5G;-}&b zE)R+Q0NBV6W`9z>Q~EylSV9)fzr>q61I~YFkySro2IlL;qk4@S{Uz1vmhC^UA+2#C zhROPQe^dG6Z_(a=D-lb90Yd)(P?4mQg8+LHQ0C6gBX{h|TKSe!oa?07Y!GyPK`+e* zd0G8fGpl?J)x#5IXdH2tU1b-s zsrd!EG?9%dRx+uSj)s0pf%kLzNXK@%L0Z=JCq!rC!AVhb@JSE~(W^2OckciW?TNKd z=?PwiP^h&UpVLOGUF1q<@vNJ*Pqo$(Au$&=9^@v{>c_c1w;XLOhJ}G|zxE>gE`L`z z0=c{Y04FSiSgppJ96(a|iarnCU)1~?w{-p+O#1l#D_G=o)cAl*NK9h!GFXgt;6P1E zvVWsW`b|;Y#5(CSHBTILnA%x${{UiJTSK7F!P)7ZcFUj36Dr=NYfQQ|OoetuR@wP7 z#IdOn8cI%JD?xMr0O!)&gcIqwhf%es_>9fRB5xtCW4%|2`1(#|I!M}IQGr+1LViF| z)$;_=Hi9^FU7rm8TDy`iUg)S717!T_`Xw{*Y+N1R_I?R%<$9Th zg;ry-_bx(1fLZ#V#S5oWnWx1?P~zv~!A+&F{{VtamoV`^Gp*vi;BFWv%r%a+Hu@gNn?w(Vy5B)OEzbs`mR6`sSGBMAlD}%tdKl zv+-r2fE{P>R@KlG@)pr5v0dY|uvYp})({z8ji$%u4PUH8)Yb`1&gQCq1uc1X=0>Q? z06Rsx?HM%!D){R(!2N9gWvnO@&+g6Y=Bx6ZrX$gt2~R?$3sQEk_@`{9qs)C-Eg+k=AIv z-ky{3mwV+H2JjMM!uGEh)ElQ{1h*g@FPv}8w zi_%J0Qts#f00)YNFW#R7`#oW-Cy)7N*3%!_3#0}Xx)4yeo1fIy(V~LPz)i7VW6In$zk<>BzWuj`Ay0bCv_XbJ7 zz+g}Uu7Nj#HI}cxaU4CRuQT!rU1_W~)_PQ8au&MEabbF;k4ipWA-4*jX@V0r1@6MY z#PyMzX5nd_&Jvovr{PWjS4n!D#a`q(7fUG(2zo$LFLREO0d^bD{{WU~n&P-a6YV&W zyJqpoA)D{Sowp3+hHaHV-TbrhQvKnOq=K)mkjgl?wgQ-&sGc+PDv^YC?|fL?L9y> zQ~3sfuLM0tVlTIP7@qUItf2SpdlQedEi zuCi&_XzIWFH9O7Oo*iTb(1CjBt=>rmMvBVWzw%Y<9=#=W46ay8EQn0dTE^_isHXa9 z=@z4+;&{I)_@_dCXzZzSjVlN=T*YhpMmz;Ux-(VStpaGO?#iG403<-BM{sNX3HT5v zFzIwXq=rU>%=7{~H)=iSVnIL>oT@_sAU@>7~#43qPvD9aj8$h>4MiY@u`YK)Sr*M z=2`0@=+AeVitGOXqt+qDl`s?dkc4ThV%wMqhf+>PYtv}Hqe%|HWpyqb~JTv+U zZW~kk0s*Tu1q+Yi;-Je~kCp=c&)GMIuoqTs^C3U6s#d$ob^=}1k16#~$kBz_QpRciA;lc*MpYl!s+VU{*U<|-Ouak5^$0pE7^3X0P~ z+J6LWQ0#L*hN6gGVF7eBl;QyupqDRN6)ThpDX`lS`$b<^3AW{}9K@`sa?$T(b+{hQ zVHvIGOUa0_7o@t!d`Uvq-ki?NWpF{XQLO7fE*#I{QNeEfO%3R4m|1J6G|K>B+HZC7 zKmJCUsw9V`cM^Hq%K|}uCrtE^3XlmFILOBlN{D6>;&NtF3GNhiker`i01SWZ{91z zLrCLl2{V92y8xS_CI)GLm>ic|*Aas5*`I*aj;%k)hYA|b*8rcz_6&^`4h3PXvVg6x zSd=Xo=Q3H)-QqO@I?w+AhA}lrlkT{XCYU1+D_JKr6AqBhw|b-ILZu_%(h)!WbF^-!)$|57C!n zKNVKZJt}`g$k?g;94C@14c;FU^WvwpUlZ**&EyMXaqlcGRHj-}MY~VyHHie-(YX;z zqpNBCLYZr7=0R;6z-X;TalAHzJtpM(P80eo!4L;yaaUJKIBwyn%z%9>v2_ye{rW{S zN8=atlBPM7IH{&V6yB}>_TkWuFWslktutY zOA1{U!fjA{ul$yF3ONOeKRBU|1R$KL*y4#o$}XXD(4j6n3`b-YgHQPzxuP1@%b&Jb zS5u`@VAl zaVojb;vsaqC5gM!(hRh5bMdEUQBw z_Ng?v#$Yw~xVQq&i3aMSYgZit!+pMHj>PyARrdNZw#Vy8Hho&Yvi=qdhk!ZNvu-?1 z^}is>dZojFPr}epxo-HUX;23+mHnK`1z^Ue@7?9SHls&>S#EDaY&1Oin|PZH0XxR> zWKF8J4dlFG^e$rJ-P5YGpz1u@SBQ!M-ae=0m6dBwVNfESJtjx(uafzgAs6HZneTHI z)-Eo+;WlL4aF^oQ^i|LP>O)jx zKGTRe%wR7YA_4V@wa?>{bbe$OPs9*+cnP;BhwvkF+%rFi z*z}MBX#W5b%Y>{hIdL#V9L}HIscqJNB+MDIlO@rSAqFg!w9t5SAH~SIXTCC-2@M5R zq>9$V0*GJvN%y?T_4~-6HkMI*qKm3(_mvApMojNylgXC;sH~j>07D(RFccw`#%IxS zCaejw51H_xD@K#9h%@v1NH@Z&ZwoA@XQY~>QU3sE^4v5oe^#>UDt>%a`+Xfr($AZr@>D0DiGTHRurAju5d07n1Wa3)##$9W1o{)L74pD|#CdNJ3w^ot z;!SeVop|itJU< znPgL44%gNXc8ayui1o~(ECAEKuDF)DzE4zuqe9lO8d-KQETGl>UT5(XoUmhBz-HI0 z6Ea;{f!U10d!$s>E)Hdod$AuoX*QqzZ5fn|EhpHY$?nwLcZP+Fdq0U1Qf(K+bSaYY z9eSP7B`i^@=1{f^KOO_~5)*uq41Qejeh6YE9afC|{f|ilcGpmP(rYehX7JO84wG4G z8pSX?Gbz2S!3>qAD}S@38i+bx)ACEr!9+4q?;WF*pKHv6C)YFalIR3wSB81gr*4TL z1RM;><<43xn~ug0RE($`;p-4PT6;+$KsN4G+#w4Kqa^8udQka-)5YCd$jXi`FxoWn z7N?K4(iY)uK}h0%ZBNgRpMRwL&ay{{_-FR(fXr^0^p`dO4k)SpJU2(FU%9P4>Q;P` z{RI@Q_W6$RE2N$Re6#$5G|Ja#Ut;9Xqu*ol%iw?$XEy?300GFqsK&ul^KDeQ`Z|Rm6&*7vkjIhFu`toSOFza8!cBMS3oWz+4uetG zBOPR%tf(zr72T0ubdb~!@?2$=jURXdG>-16wvqX5^8)KpXwByZ%NFU+yZnikuzdAY zAKD4`mU(0csjN?qVb}gnrZ!%-RDJMzo0e~G_nX9Mo7U!kjrO+eD^jpPq+Q`$@< z6ysX8?Gvj`kZ&|%QCnSE2>l!GWf(ISeGsW+l;X>&1PU~DpZzAYL`fe+_@Y(FPvn#u zx;&laGE|%7IxvZ)sJJdV**qVC zCa^9)KSR<%c?&{$39oq=&02g!s9I5TI)rPGza~&-n;qm?ohR{0U)hvo;7WG9CBXZDF)vYOYV zAVtycE`LoXjODE+5-Esta-^v5VL~IYn(9x-ikQ1p?W%trK{E8xL~!-c=f%Ymne{a{6c>h(SDUEx z7xNeZ2E9$?;D*x?O}2>2q#Ud8E7gKE^vS9#n!&pUW}!5^8GDO$?ICB33*4APR*vry z;8v^+{K&_!B4}|aoL+#1ts28mu7`9;h+gRgO@XoWbe{#6(q;#BHnn_2(lXb@%*+n! zgbTxm0)E?)Q&~_2cP3C%Ym?;sMgq4BdHR%E^Wu6#5& z2fBL9;(@NN8q5*YDq0~7gi0T32JC&Q! z#8$Td01`Ux{TZzyQlg=1Wzg8bLN6^k?AEcK9ddq{g#E zTIsE&iJXVG`6Arld@iB7Q-NNIE0_iBY#@z_;7PUacm-)|15i&w(Ht z;g})cd;;#T5Y*frlcJ$fv}A$7!&A|f`_xHC{gJ%8dv>48UY82fu|GXB&*9^z-|0TH ztRXOl;q1@shsf?LN*DDKtySwkrpe5-S6P&W-E?AA)P)^9RH&EO85{9G9x8ojGx7@1 zT%|0mTYH8|YEh~$zR*KuD~+BeR9kG$sgU8As@lys;7~R%%>D#T7F-*|z)3nOgJlf_ zE*AMX{{Y0?1yQsD5H0ccrfdaN9QPOG(9WV5g3V)bg*9+2tXN9z^!BRY$M9oS{R1cFmCWo7mha8p{yn6yuBjZ zKLeX&xZ5}g!7X)JUv(6>Lx`FN7Ahc2@6b^8i4LG(CxmP@;$PI0QQHfkcCZ#0+o?3@ zS%HMoinD=mQ!cy8re+i`GyedEZZ${>K7)x}O>-?PD|nr0P0c$%s!EgtN6gyT^f}55 zw^{ePGx13h)}*Ae*7Nb=KQnxc=?FYcDxE^BQaL$E@O}yTB?;a#rQ#yrq9=WU=?KR} zgBGF;HOz4_UHTIXiaHTMrWi6_l|LGtq!zj}`0Fmc24s@6K9`tpq#Ys@Yiw+iu?G5* z{R!hfXWDZb_HdqD16>ecXX6Gqv$HyyqKe^hV~jzl!)f?f_!4g$2CQe@ZgRuIKo6GQiS)f^<(*qs@0j9t zm3ZkbGYV=i2do4@z}s12MWWi6-=5w2eSRb`c9ao9sp6}e4%Ym$(*n%0bVhi6t-_eI zi0J_Idi49GMF@5jL;K-71Wv+KyKs)-v)!xW5Iq|-yQ{6Voz`a2WI=gO)g6Q33Q1mH zL7}917zZ2#$tj`J;EGgS7-@R*tWMaxTJ?IaA#xGA*hpWy72A$8BksB;vms?}^X&yW z!LV|8m=X{)f20xR9RU6Mz|d;IZweH6!XdSuYQS7Qit*O!2N)+OUxk5@QRbANQnQ>26!s;Shig1F~RF>`j|LS2&L6e(8rr-CE54;ineI9lxPtOOUuH z{{RN5G;u8Mq~5U{_tI^YTcN#tlH^~-!^h~w+=of{zo46rj2+*?L+!sZ9;BBoq$6pd zH*e{IP4r{CWAS(h1525qvoYQiIl%!QtnUSAfq;WEHeDL<$M#lbC9JdA50eF%U}9B1 z6qBkf)4m|4m@Qgd%m-K#G?dTbqsYxC(&WYiptUm=H)H&V(GM{cRzu$5Bi<*Q7Ywr! zo1-)EK$_K&wH1T|s5teQ1?;kh;wJ0;IE7C?tov?f#FC~L1PtUSqC;nr=O3Z(yod^< zJf)7J13Evqp&SmZ!QmNUvKy-FNi3;XKaHra{)T4P3~OYXLd@KBF+UZ}R>b8zRQvrW z+;xPBzp~n>cqy7}---P4cnCJtz9mKcW{l9sg3^tF_(lL>|@$y zbuj|1MBc8BS&$awjT+K@FIg$~=hh>*Rc}naqGw!exU26IgJAf(sHGT(L2KY(275PL zv*{WdpuBGPSc+Ix?aU%?F;&;=C;=(S<=`Odusg3RebOQ+s?&w(0oxyM`hzC{Xr|(O zl)C`&=2j7IqR~XA!j$%whTgGGFQZr#-!B52)gW@}pSB->+EHr(mtl7v(sN+egVLY* z9~PxcWXK>Eo9N?FmT1>KS9&S-@u5`V|cKV90e;?is!?lDHvY zaZ2H9Hh%2;u2U4=4%rxDY*P%=Bj~67lTuaPRha%1o2{;%(v6)+dU@)Wc#T-pBQ>2M z+f8=b2!PS6#DK|CfZkx>VfL|;-Gf|wLE9jv9#`doR%jV@m-MvoPwq)EhKL+5w9u^E zJd{aIq$x;FB$gzig2(lpp<^}C-hKj6lf>L%6yf=TOYt=Zw~LzIl5; z1L77+v~QSOlSu2o#5H}B@oz$Y49!llXS(L6HFB$kYDX9)Yh=(Gr{DrGXKH+t*)m}Y z44Ixh6GupLT>9Q(K{X~mt)X4UhuDiu-Ot8B%M(MQSo?txjWd>8Sm9I4hTk8o`fg$w z)MD-k%Np0iCj|ep?QneLU|)bv+U86%Yo-pEl-iCl_tO>4}4#|L7xyh{(=LA06e(N z4=%Pe74Pv;y!khWz~)zJ+l{_~DVDjlixevx$f|;G293$%J2WHJ9t}$DFou@7 z@1$X#wwYd7abvfmtsao#doi6EkVaa|jq7cFq6G^8<7fkbMs#YWnLWE56}BT61LUR0 zjb(ul4x!M3bCKmrE!~Nzb?x-nj@X7deI-TS0eV2sXiFe%?XNnn6TPzJaw=V7dmYqzm4m422fY>q*opT6Vu|t@w>1&xPX?gA@TDJ;w zQS=yCEmA%vkjptbu}9kju~YKT!zKij^tZZAP1j)7I8?|JvS zMcoz>KEGH>#10*qXeCQ&{Z~*>{mS{9b3Po;=>k!9jf=0Dc`R22XW}#SQ^ilH=0+UW zYgoahUDOuet|n7;cxj)QeMHUSk z^N`NhuDYj~!U9}0xhgfMaX??x-%a8b`bbWt2&Y+})bpX{A}Ba|k@v(6h(4)R<^fUD zmAO47lv`IqivFX#bR$C|`!A^}0EfLFxh@!AP-4iys@hdgcvy4F)pI4$H=x4#AW>+A zpaA>4d*|cOTOQJkY#W&0$(u(#+m%^XvL4&v4C z4RUUW(xy4s+&R395$$$fh2q@aYqn zbY;_#Vu8JypNjd%7!OAc;KV>mLGZv%*nmY6lWAV!n#6!Bx%lO1o0N>D3cj>PGG?eCa5LcVU(LNd&chXOOwEdKEuH(`pT9a z+x3F5(b7JE#5ZV!_h}7kBQ36B5B(*oeaVUHgnG|`3qjB5mqyTvddIN{fl+aUYoyON ztd>^PrXIvU=fu0<ot=jBwAdyohS7xc=S9G=m!3FZ$F@Hqf3Ni z);4}o4zN!29w+29kc=jvH9S=Mj$l;;))*R-;rOS)EjXT&j8)puWrNn8aQqJTuL zt+V+$U~U`iMSL&6N5mNvt?!u-3?&>5-^8p%g8q6$Ay1y?l4^3m_KU=U0_ZHX1)E^! zKHg=uH!;W^*nR1e>bF@zL6fmRDwIElT7`d6NTt`9me;>xCOZ^+w1=VO zn!%Pdqi=A!?FiLrSUOYYUAov?E^AovUu4O*nDmq~xq1ZZ>Xwabv^Kw14#Hn{MfY~= z8i!6$adB*b)lEYBM{R1>UV!KXH~gqTn!jBo%^q0+9{5fU;x2>URC#6YEck?Y1$5B5 zmJ}lwjbd#cKQ3_wk6kArEF&=vt)M8TGk}y2+v7SgtysbjX@NrtN*Jzi>lfJ1W{a1r z=tSATHA!Kvbe8a@LQ$q=x%IRFw(kO~9MgerNxWx~nB3Ra(!#Rxm09NLEvO2# zS9R5=NnYL0xhURuJcq+P7cQz4dZYYI={2ngARKgxd?Muo54}PwxMj8+_lXz_$))6k zDZJgMFIHX$C-p8kiH{eWxH10#VMR@rxv$ZfD=igvU8o)FGNTt9z!RISz^c~ar)URP zt>U{*``49kS)zG4?uu5U&i$grh?quy*^ti03NE|P=#nzZw&R$5e33)3 zpN}W;IU;HIgK4oP;lP#LM}vs-851P@Sx%`fP0|9#QN%6V@iQz`vaT{&%%Y|@g1M3) zi&*{Q;Kqhyb~gV2c)8%WL@0Jp^FIM`i=i5*YZ8q|Mt(&!Wx%Mt&Y3lh@?a-2vAXFQ zO%PvbtOIX?IsxWMk@@-MGAPVCRQHStxjyn52U?oF&w_Yg+?-!YuJPN%UA*0QBj1To zTSI4PK5B*4S&F^CSzzgTp8|dTBoq#oNvu8FQ}EP!D$bdh0i)|b*~*LijzdOnl?c;A zy!5M2;;7)ZoOu zR!QQa*ye-PWei%&#}IDtAn5+!2W{?JPe8L;2VYI4@ME0oKbC=EHNyq~tKWMuGMFoG zO0Y&03L{@v7=E?S>u3b2ndLAu=pqCz0_X$GuihZ)(m=hX(Qj#QHLtMzFKC6Q8Kf^| zpECM6FGDA+8oRRDe0$520k3b^g`pRtC-n_$y~N9lA1dk9tpN)VYX; zHOa1BdpgipZuZLsh#;#3Ec6f5+BT7;hex~x=V-D0EhpS_Du%_{)GZKBN0hLo^tdVs zRcb1%>j-)({XleL1)&7np4UaRy4>6tuFxqazq#^eOpcHf$4@J_~zGXLA zDlkL7u@AbL^Ax+}+!8us4YI}t z`s*x2p{>+^gjqMuRXJ7I(tR7dn9knua(HkH!40PjE(IN%z&k)y1W|I^Scl?*S~A_@ zXaWVqEFC(+-!v>8!2QJHiU_1~S40cG0aWIGDt;mUR%PbopN}E zfBkO$w5^G`O;CBCUPy;pjLnl+e%OslF$vW`0yP(&T`4v*F@pEP&XF zVnu`2eGaoAe$2=lR&I9QA>f}7(nk?Uj7^JZE%i>914iQuK;I}v!3pOONaD2Qg8*-s zww~hP0N|jJK)KgC0RSb_EnjWSRVuuX+<2B5dnC6r|>n5 znptU^<}q%7xV@lL-c$wZ`G$2}r>0|qw>R2;4T9>}@PN{r(>&Mp9cR}586)fUg=osD zT_yhj)c%{>RVnQ_3Q*337ipQz)BBaX9ctVqpM$Aby*PYN$vW0{T&F(W(3PIkZ{SRx zOiHdzPLMj9{{YGO1!yf`pm;)7gdPh^Z3+|dVwM4}0*U;t zBT+lg^5t0_`L5Li1*Y3J_myJ9<&X-g3Yv%hWcLtdW?|_i(%5^!x$9oM2i~yM036tF z4PdRWq*rZY>OJbc=3q@*)p#Omp`NY#!cu7+pQfJB3}jVhJD$g+w7+xz07+?UAjel? zH(rBkd?`MUiBl0%)ztn8(9&g2CYD3ky6+YdS|iR}<6x%HZyA$fuW3tORN)bYp`xIH0zGFKE4}-B7sDN2>Epqlc^l;H}zSh5BGt z4vTvK09DEs8H^Oo->l_&>6&wVMHSMMO3*ql)?cXVuJ#W3_J~-Ejrxy5$OT9Z7V`GM z<%0VthGx#Wdep&Mm>N*LwH)?yRJNVP>ggD$B8C!Sur(b1a$^UpO<9=`@*VUvO%-4+A?-d;=O`b`rn!V04Zf53znUIBgdkra{i_=1$RI5 z%-bv!YfNs!Aqjbn@BT`HsA6s~&%#Lu^PmSXeK47mSw~ji4E%Zj0EtU`N+!0_YtP1e zCOP$T8)Qgbar-6_mFKJ#CeD)@oQY*vvjNVaS;U5q4n1Yk%?S-JVE16wn)4Fm6yLKm zQPKTi-~oTGYXZwJ;v++Zl(9<(XlQnMAm^lq(b#pBT)Usd&KE8wgCZ4ZWr}r$^Ql+F zoA)&)uui`Cm=>}xQ6`;`^#$f<^s@+2yK;OViAL?LYW8XZ9vN}d8R}S?E2l+7tAhB% z^_EMPhdhL{h?T=Pzf{HOZt6>j=QuBEd({5`WjqC#<1?sgDrDm9#ip@yq;Xf`#V+fS8thsnJ&72nY#Ko&;)@zcRmxPQZP{XAA&XetQkkWmA zvSRnJ>p!P!nin^gpY~i22Gd%pl`n;M6&(O-QKKcC+m93Y1O`>aHOjC$lDth^Urvkq zlnZ?|IXq$Af*8?LYD7&+lj}L2d*)-iR`^VzNn**`p$tU5slUwE6+G6Xz)9+W3@wq8 zk*JgKXzKa!Z!d!cF|{vgdEIbzro6$Z(vhKS_nO(eThO>V8q^vb@Gh?eMtZ7)l8uJ- z9SgSU(p@!N?{$8M%((3xzqAOLRl;cYNrl!$hyMUs^ps3U6mb&JKu;?RhTlVq*eiy>rnI;-U&^aQ1E-lm{~M;G`x9{a?8p?v>Hao zTmJxvmKxpd18+OLin*9$8)#*3dMB@V<$}~;2x3QNdJ>8$0Kp743t5yZHQQEv#B6t- zW`~~oq;CT-(bKrcvPGUoU726fZ>)j=JUser?2m ztczjRVOlw~#QVTFs-+6v~`h1LLqwlJ~ZePOl((a!G!R@PtAJL>_| z13Qify9of!xJXuA{v^K%AbxyE8orarlLGbmM2Y17B*@%z23qu=j5^Cc_gT0}#FWe% zhcM|uFRWGq*0SxUp2Bm{!l2yf%!>O&*ev9PKSO%W;u_6CGai#Bs1+&F6&tjP%jAk| z9=yywIcMv-Q|e=CD_U8+%J#BEvFn~DclzogL(0oa%2k$2at@qt5h|?VJ7pFr?T%w9 zc9T3zD-_p(#uvQ?Q*vBf51I8G$~4^uFKO`pAp>U?+&Jed<{#8qmBpmoEOd3mt@19U zWn8$GDz!eRNL&zo=TLu!YTGKul0m2dE(#{IC9;HVJvL9&Vj3&zN8;9m0jK_Pz~Qw+ z)07_Z;_yUBh_|1MM+=*mt4S2vLaQvvH)^>cEg_9lCa>ANfWJ_Y8_A4!o;rE|0HjGz z2@N3tmPj=<#wI;h`6u-49G&BJ%vnU635pG!PDA=2r}$Q=`MPJ~OslAS$ZM@YYguD> zX8s~ony1XfhAH7<{6;Vmd(f4<$vF>_HmsKg=S(ZM(hi6fj5(nk%%@l47wQkX0<{KtA7kriGD9X_7wB_)4wxw<;QsxP>TGr8< z1$8(}z%v{3bKGd{F7#`0r8M`}I2FkN$3Qs0bH}PE+<+;p^o^9ge5!NMffd>-MI3kd zNofP0R%%p1coqA_jo1Twf?gD&^$PbM({$~^I%V4FV9%v_VIH5jR#ERYb+uh{GXxEx zSO%-sG^16Tw5p8p%1ZO0Tm?c5D7JN@LKs_<5>1iTJ+7Ki)4J3IW1yvsgQ~tD8mPdY zd|<7W!5E3q3WeN@37r{Eh+4c9n9h`TdF#?U`%==wmqM7z2#thOto%Z&_DIm0968SX zcajzsx|-%Se+;a(ch$_dATud&Bn92o4+$+)Yv0~xn-~_|X7zh-iD5tV!}2Q%tXNtX z%pa&)z@XQpuUI<6&3!H#J91lH0BQRA%u6u7uUv3xsm8!KC8W}L)HHa^%6+C~`XK{g zni~@KNYdteS<-1%2vJZT!9Kr;Y!gSMK}v)TYn>etSqmZCMR|p`6X~d1yuxKx;IA;% z71wH{X%LBNIX$5WbcKy&jkqQM0JTRT3ga^GC_hzW1m?yV!~lPF8d^PmdL|DbEs%+7 zL6?DeLDz!$npCJ^FQ8I1jQ&ZbOoE7Z!!n95tO*b>8b^j@m%^|IP&6#b0)=! zzwHKA8OZM}o=ftMX89`vBlwamKgfe#sJWq{eAqujSqTA>7?_7#gJ>8t+^Ji;wlJ27 zWh7>X;_@8D*;$^m4mv2pTV>B?VoM(Fz@Aq80{EF;U>hfV3OIWCmOl2PcI5 zHSZzjG;r&NY1x6G>2=J~^_eSf8c3*i6(C#m1`^TQp0Vzl#$GCvo#&X8YTnOyt^Su8 zlxtTS)+eBo=7MZqxR#x7E$yrn&aiNt%B~aeU%RCCu~FSMdod-XS8PXGllUN8H#vwV zliU$`wx_;e7}$1%DC7?iY3#mtkTl~+YSkO6=|3d=G|nm3WV3QIi)FM|0wEVxetdNE z+2N!#kl-hff#*s6C@9bBXQk(SN)0JxuSvLBmB0kCy0SZOKLsBveWa{hY$e{hTp>}a z^b^($Xy@YPWGXnu@9JbS@=>9u?U=(s+7SrwCWPz^Id%TP&=$K9_ed@404AQQwH?3N zyE|6*v*ecJbQf7j6|&HBQ;%dLAkg5iFNk3Z>vamgS&3>4Xs~^A6qUJ{D-ZxIZuU#4 zS3ZIMi7stkdc5?AD0*0!w=t`8+ zOr)E!O?m-U+9njm)`}kThH3!m9CvY2(ANuz#0#&xS((w+(z_XjtraSe7eQ0$+Qe`))7ty$S)0e*^yS$L5 z5~Ve8g0arA)V`4oY$fU{1wUQ9_l~Lgk6_bmQkUOJs4_rHXVwh1>AJSzRZj_((Rd~! zmaZVYj*;G03x)#S%fuP68q0dzSX!d=!8_`hfW$p|Y(Vw`OuNM`$2KCtdKzr9(TT449VeUCk_~sdiV1-cP3S1Y&q-87!zc zA;1+NCX#ibFCC@Fff>qc{{UtTWI1j;P2fW6^bOeZHV(n)=Q8%?5Tb$#HU-XU@|#`+ z+n}4wb$3!=LtB`C-ms5z9xU7ASX6>G6xW5#Q%qt>1XR-dL?@P#fX!tqNCTB;5E#9g z(+i|;yC*TYAt49r_>yRQML}H4(JeGU!KMPwS@*iln367$31su}em)){o%j>NL+*k{ zb<7n>EJ>PbJ8cZq`vJJH(Vwz5xJcUuh~u?s5)~FUh49kH4E#3AXrwDfRre*8UQ?vH zrwaxPsP;>Yg2c3SDv-!x3N}J3fY2`D>#e@b({DKtKdMA>EP=~dmaV4>1ElT?{pF41 zJy@u;jDJBKW;CLN3+iz#Fm^7e)#KrrX**bz6{wZOfoQXG4#)JFqAK$ddxyg*2C+ja zMRg@Zh0n`c+OX>h84>9J0Lh8VSwt699@P@Iw>}XdH8g^>t+5SKLQR)wpPJWZx=PJ! z84YMlP^I^!H7gNNc$8Gs%oL{+$4@`>o+?5iDv4+SFsN(gZnOFfv`uE4dQB%0)$~LY zMgy{Hd&Lw%du+_JmEjs}H?few%i{cjFnenl1Vd(5=KnhFEy z6j=b`zfl^=66tJwIb|u=8O&|K<_iA+&oLJ|w^X-}m>eUir$nOL!M<1IkL$_plnr&v z`@R_6>urvc#LNUKO`o`?IX>}Mv|{-9rW^_s(5ii^D>_8sNcIU|(tAQ@oE@V)d%J=z zGKG@Kvpz`i4JTLXFTUhaySo>)3U9rlRY*<(BTB$;v4UER8l=AU4xL%}iVQd%&bNQz zd6;4F1~Y2^07;=wFuzbHehn8c(SWw@y;$dai1^y$v%S_{u6K#whR~vp^pT__*op(7 zzpNrCwd*tq6RHGQ@Jtf4xoNBdjESZUx=iLWjB5x=jcaLqNjN)cCPNGymH;ho6f~}- zxakv0ET+BQUG-wO3133>lk56RnyQV(3HJQWWHrFvWDBmY(Jxt$YK=ac%dPsAn!Dd@ z#vq`hqee1oZ&A1PHw$PX$Zcwa!I{yKu;_P97f$t2Omc;#-J9Ihs%oQm*rIBl8PdRa zSS`*y*L8b3%bOiLwvI=uiG{>u8>=q+V@Mf+mCNwHHOvPW!m~GS_`$Tt#qKSJd4w6t zmzKj!rVcrVDvUH5((^bSr4}>HSp%IxWv@w@5@srw>4}AG$0bY0GT1rSNy?fULqRV+ zUF9LiE;7wOaZLsF%VQ8*Us$r;{+Nq&s6<^cZ@(kZ#2JA^{1}$UywLA8Ou<5_l5=HL z!qCu%O{Rc{CRrZLL4~R^j$aVE0Ft$=G0`R9eN!o!JU`rn!I9kcrwO$D0w=7+2`T}k;i_(z+jMq_D};!5SxDDDiwHoAKt>8f&; zZi1x@i4{C2FU@*XXF_3uc37IDYdn#Ip*&kdCuy~N^q3-#)Z#xd5KW0%w-RR>%X4X- z^v}0Qgs%c>JI6Fa9-}E%D*0vXrnvPb3EBpS2_Udcd!L8|zYmzYD*P~(H{9sMC9&d@ z@!~+*VE1F|q(xldnEEWTREUzjVLE=PDAv-UYgEt6RZ7NYp?9>LI-W#cjTc_zp*AXd zLiV4EtA({}@Kf(PLw%Hl`~75m8;XB0wul6@OlET0n9D0wZd4jl20FwDpo6_dnw4}xJIr5=w@O`4;g>JO>dI=;L-$dLI-PVfl07#+8$V;3_8;k4=~=m zq1{lF@@{s-6YSjv>-Nej0^RRWsR5N)ZBL&ORd`(tcxTo%pe}CdhOwjW&tQfi+VvdG zKuWEuFbKPb=mF*lxmv6WN15+*x%kXnEFV;g%nlqbt3+>jzZVO zy{anJ+7U>M1x2!A>F$+I_dFS4SGD>Nf=2not5l}_Y869!(HGf_&{fl$_4-r|W&UY{ zt6yYe`pP8z+J?;f_Ta;p0w3a3WY*IowSSOBd9nykVSzLqju z?=h9ft1vrhA33jDsIM?nUgM;W20|S(*LhPn2CF%e&h?DSo!x1R*|DLtNj5wkfrVVf z4($QW&5Ms${gk59MzW#E8!hUOTuac-`X*tZ9cRO-!8u@&ZILPiQ3trl#V<8A?#nYB z(Qo%)WkwbAf9$7N!d{z9Bw=hX{3kyK7dd7v+PG+u!)}1ED|))hP7{E{6!CWRm}SZo zmBI-?#ofyXpHHIIr>45V{{RZC$UB+VI^crqMjuFn+aXt=4lXo+joR?^h(}hu=2~@J zpfOqvU0S8|0G%}_RK#{f80;;0pN1k)w_OQa=_moJ1{^SKXI*5p z$VtkUcTvpONs6W|YF&7lCd`nPu9+BQ;+#8SpNa{nz9!d{(eFP7v2bNuO5!UYxgjL- zFkVhkC5>ag)bn2xRQx6N0vkC2r`Aumq=X3B523U!EXBV<0$s6+=!Q>JYih*W;@s9a z5<4Z)evyo7GJ@$oWJN5+-c#Ns@**qDEw!&&9*wsXyB)2PI5GfCJEa7l>2tnGsFk`I zI)yME!kDmwTg_MyJy$ar?K?@T8|@*{Hpv0Adu<|F~=BhGOGH0nuKHiL*_#{8v%aF0#k5767bvM7`>AX26bvet%3l@)?e65-hW>kBU>qY%NCc4X&i-)Mh{D7czp`Z|DpN?)u`BQ!MaytG>afdH+@W!cQx_o`aBc4@$(UeG zf_>jGZfcontMuy|Epf&WX|q^ei>)!PZ}$)NFb*c!*a(vGE{$^dC)RbJ!fXf${aS;W zi1)sZjG-A87*>4BYk;P>&CS`HSmf_6hz;J~;#i8h!v}I3?EP_ioCLSu)eGQRO*@i$ zDYsQ%ujtwR&!^rnjYj2WkkPwd?qZIe|3tbH$R&X0vn;P_i`KFyxF1RWKO_^d)citA$KGSw#aTds)MqqZ# zTU_~ADPI!_XBlwa$1klgSFXn>(Qoc734@H!z{cBbytI~iN2oV?Q;MX zMcCi!HEw8-Ts1f0=s1BI6*ihp3ga;@T6CXz#QY*oUlOI}XX~Gv>BYU`#_E3LHyFp- z6gZNJ;}b4(lroY-Mp@YQ0_(ni&8Z8LgBpRRl6Vrtbf&@_QfO``w~jmmRO z5l9oZt@eyMiNdNL99TP{ROrQ_)QQ{HC>Sn6>q(z1>9xYKCQM$ zy$g#d>rgj_u>t9iUn%~`^=JY6gGlBU(k|uy04jViDgHEON zIC+lukDqVqB*7eh>QO)uTjFXjs5-8P{eeXGq<*4=eE=YNj%%_C{@2940^8)czen0( zRwCI#N)&IW27JCCgWz1dAheIYT(9a}AQ1K%pt`gq>jJQgA5cA@6u@7Vx9%*d0A6ev zI@{V{o2+;Gz#`U*$fg$(cV`5>bv@60zG2RT?`6BFsB9st{{S%|62jQf1SN|Tp@@*% zE%jcqpj_19e^TaMR1YeqZ76tIj6BQ)^3WHOJ8eJVAgbQZg!d(y+d;u`m1xbhKBaUb4wz?JP{1arZ+O;W zLEiFFDs46#yc5|igZ8r^J}YI(cc#X&n?zIqVX<)$qH$PG>Ysy+DR*rWkO`|n0BTz7 zWgM}K-A0iXDv4e2k$jKJeIEqT?mF^lkQfe&7Cf`5g!s7VzBPyLsgl>&u#UiJ9?$Ys zPw@0~-ORZpt>0LZyGSafaQZ>~TEc;_O)No<<1F2j3yYFnWPMzG!PfQemQg0Fu!hyD zX(P8PnJgf2?^v^B2SO|xOAN^katyw(7MGcn}jvi9x3S0EjO^$UIBytTiA%^%1>!g-!^JXxfq=j2hP4 zhMr8^W$QYqU=}hm$S9$%IcRXK%v9wT6|5z&o{`&k65Y#~)+K`CqlFmyZ5@nC`Cl;2 zAnYZ#H09%Jfgg@xq?Ugr+P_@0ol*!BCQ zCYB)98Yp@)Vd^E#(78zJG1j05El(mzyJysf-~Ch4XoRCo-tkIWp2_1SKv4DXKQ4!c zTLwExW}45!o3(oy#kSq&vuji6lC2dU zr^vG9C^U4>nPzY!mb%;V74G%AB}-zQw)IcuOq3DPY4*;zPc*I~ASDHa5K>F$r zTtzN=ozR0cWTUgJja82EZCN$`v`MlKTW3}@2O zMp`J7Pur}CNLOJ$1Gn%e>f@Bue)&aka&1ND+9wOkiGX3S-FSeEASgACN|xKGxb&b; zu6ExVP4|sFNt;F5v{K?}QKLxRtuq_w&DAfE)-q}*0@JQ?%+Q22K|y=kWr^p+6pE zss4o)(wLVDcKS@guFL{g@DkXTQF;_)0L4_dnUu88$*j$|vgTCQn8IP1het@AIS2`< zApt6qcA0wr0P`2_#P3r!aankXW0kL1f;vMoaDeUynJ(Kvifzz8QED-yz^=)xG*lN& zKlLJO2A|fa!xGb^LbkA;Q{ocq&2cMz9}oo!$$rs#5?Jzq9K#F{9-fwt#*|SOflaRx zBByz!MnOv~wE=KU^<4*ANp32)Z*>0vk)-aTC>C`PWK1e&@v;qij;43Mle4W|_P2(=%HNyLFlu3cVIGcc{6bjnp7moAs9= zv2nvgUuNSbD-LZ;7N1irxl<0j!J4jDs(;ypzKaWAx0%&CD&>7fD60(mXPHJL4u)_O zO^KkfqkpKGq_5Sp?$F)4e6gO8+v+%tT9oH)fkEw1fd$KbA2R^LUDB`aG<8^HuAehz z6@}O&Isp4sigY2h4RxbQcs3uAhs>oS)LW&==`k@h zajVwY4#PSDz6jLD$0e?iBH+BxH1=i%wa*Ts`l91xZNTs|Isqq$q8Bo;Zs+`qiRf?K zTk!x>Eo&}_S4xcyq+ck%Fe^c8p$(3siT+HT*Ef{?z2@t5apXF)oC8BP9;+puoOB0% zWq^Mu8w>LkTG%*{!Lrz{h~G_!vs#sICAT_p8)icmMwcW}Y3F@b{7VB?`=|LnqpbC@ z?AdgW#+PA3N2}D1+bUS!cy^aW)!a)aCJEph17MRt!0h=?#TeNj7rcnjh*scqG{j-; zYG8ZnmTWW-=rYasKjizqGBC61qeLza>Sijo%iZ;?m;o;@k|ms@52Rv3tRCqxPGgoh z+7+WE3)X{J?JBm2>UDa@TdgI{7mUD!Tv%_D6jNWC9JbbC7=;_WRFaKTKC79ZKBaWr zTJcp;@yZfP7f@kAADNZYhG~^E@YKig2L76oeWwy7!S22#G*82Vc4y(_=ctGVJt0k@%LPy*P#qIviOw-i_0h-L$nQxtkhc4&UgrwP1M~0ZeX3iBSpj5-?IUxS>kE;BE;xrR6QX}rC%~Q znbK1OjkW+uGRt5GM2t! zXiKNFh6$#x6zj+nFihq$H5npk7YX`Yl0N7rU8l_o3EQUZ}u0 z*ZhbDa+>ReLTKaCJ!^u>c;O=`f+z;2-2` zR)cg=JP^6ZfvQY+q_K$~Iz0J5$Gb*As~Iv6YAbV8^M9ngL} z%*^Q`%l$*D!O^Ssq4vt{@p)7v#;2(AID)$EjSuN%xB(3^e$#5od8hm08Nkh*&fbx@ zRYI&2Pjk$%6s2}LJ)JE*NA}D>-2icYc8rzy4`oVJt1wh0j{WdmP_jn!yPHHK=>0?e&8>|rp zMy+WSA4ocoqqFL$lM*KRKe)hNZ@>(84qye$e*0sXsfB)Av?Vuv3?8#b1n(oPrlWOC zD?M&Dwk)t)$Tbj8vJe48po`ztbVE-uDTt>msxFCr6uIW@cEN+BE1@s%DH~i)2%v8P zwWuBvFrYH%%TRi;=tn_3&&=Xg12zSn3So24I}(HJD(NPA)8NQ!Jhc10Vo}wPZ1b>k zEsfVK5Tfphrq!$ItXfgxs8%{+Pr1@6fS@#Cjz!uN-hp<=WL8aX#Mpea(75+xedvkQ zf)3dl3+cqA-HU(h_<`TKEv|jBd9la$E#VVJF7=Dd#U+oiaf!AwvE$U3`s=BSx`3jA z74JH{)o+=ROqJtv;Ka;tF5J338%)S@Pl=*L97(x$@H90$C~(`$;8<* zOY!ww$eLi%eJ2qMbef;nQ}Op)r=33jl3UD;4G3bTmgSmPZYF^gf{vlCq~KdRoIqli z+=jh_btenf3tGoguH`O@(}`7>tzY?|am=?L&p<;ZabV-nxCRXi%MFL*76u9QKN= zI7A6rC!=3hFjd1%9*(G~98tQJR2u+GlRc2L8mXO%JtedZ@U=J6ZvdVx+tX=dWs6wE zZlR%F8>`;1cbbM(RvVeP_#h|%?Ea>xs_krC_v56yaHg2p^+E!7*G3WjrWR>OSNxZn zk~9Ld6;rMlp?*+qS}oD;7qp}GjkI1)fwT}j7A;ZTmM)dd6kF+(Ht#lw6bFI}16Su} z&GZhPUua7JhZkPaM$AxItJY9i!=*g0#CSwfX-CVf3#uOTOM;aay?q2WX=#o}uz{ao zo&4`HpqZ=+Exz#SX4AQN_L+_6U z!*N=xpN-{KxWv6w7md;{Fd}NZxSxB*Pod#0p^aZkl#MJy@p2`o^RxE=KdU#Fb|x9& zsB1*vbQdYs+B89O=LI+>XC5m%drln|$`(8lB{UsHIGXOuC@Ix6I7_Nn&}?I;`6*Kl z(-O=vkuD22T=)z0k;{f?!v#U8dQ1s-3}7a^wG1+`?dzk`778t|-dIN_5CesS z+5A8#)gofFXI&f=+f(<;cf@8pzXVM?gd8exgN#)p4 z(o{-QESYNL5qbsIiMy@7%Kre8wr(F?%=%7~!$Lx!Z&M0rvL!j*Q~E9tIE|{~kCZ9W z0s+B#L54w!*ed+b3*euPZtC?jHHq##d`CjHZC60{sG~q3%Fnmza8VUbyZMQw-GUUk zYHq}Lc04c~m0qm=(Mv#W#dq>bAayH2^D|%zwMX^lHH0p}zxgv8Q#YqQ;+gKFpv>D! zz}bsP((O&xi{tbu-4ef-<7i zrA77~U=+4;HyEF?Iud(uIKD0rAfsGfuwuJngGCQo^_67c${%WsWm5EToT_X08R!QF zk`eSa$(;}<6Y2GaS5JC6y11TtA4kmd{{UGHa~M+wf_@H^1KQ&p6E5DpC*Sas6%WG2 z%^u{yjF-Eg@+@)i{{S=UdC0`KD)jl4N_A?pd`W19m2?8cc!|`gU2H*6I(%ZwD$ZuP zqJASHR!Y)Yb(&4SPO%xW3HZ%LK(F$jk0tR8YQ~KG3&?cq2bmR7;{#?I92p5B1(I0} zcyx2jKtok&lq-vF{{U!dKJ$tEKI@dz*(ul0#QrWMmRzkkJ81Ji1hyuU46zpLq=KQm zQD@2;21I&BSZ=}6-BZ_f?-;G9B&Y@hI@E%)(`elIuOp)z{{Yy4H=~s`!B0eEA(J*g z1k)*MS8xLPgpKu~F)|M@30O*&ny=G{*<=1`oQjZHsB~g#=+ku@4_n+Uhb#Aj z_Z=n>&8YiHlhy%iO|FyieMXp625KjIHIdwyv2hh!TZA>%vH8^BCh(kCl*B;u7^KwC zWQGmhbMS#NrYN1?k}<04gqzK|eMaOX2H@`#flK0eXi2N|%+=fZU^fAisU2tW3^-U6 z2CSy6mEQi~ZYWjl0~!D%rf-P8F@v?{1syyLex$gJ+WS@p^tI{+{n?u-_Al82(DdpN zh7(7M{{XN^trroR570N378 zD5ir?UhO+nhMyU$mlp`^)-niI%{lbALgHi%7uEUik@!Vx2B5uPngKFFp`K zb-KX#JGCqtQCNH-p>Fc7@6P|AAvO$1awf7p3adx#AV7 zg8N{W8KxvxJU?=ujYT(Wb$o=Z9MinkPQBph8n(j?bb~ObMmzvLV$r5cu8Y3VS)_ZK zEA2uztSMG(OZKT_Mw_O`Tx%IYSPf>2UfRcs`WpiaH)W5U#{=Eih^S;0oxN=?QB?VJ zLL3OT0%N>sN?lDF`Z0?K*(>HuC*AR$5)Pj4f_(>BU?|h4SvO37;~g^bswso=N_hRl z!9xWke|7@(*tRwg25EF(nJ0ce>x4C$z+2i8&ADE&K}xLdlaIURdB3cV&0S*WF_P3n zUFYE0^}&o#bJ0K9_xvQMRfn3Jzfh^5Y;MXx06pi_aTXqCSmopXXWsLZ8Q3w6bIaa- zdVHD{rur_sZ8v(LB*v#UqvC6tC*pVF&@5BLeTp_Ap=r$gediPL<-Q=(BXsrAm;f%L z&@7W-Q$ef?HR8A~B1)masfM?_cQVx5w5`F(D--QFkX2b3`1`I>eFsUoKZ{zJnul5W z-ywE!{TfCCt%tP-Ib2%~|(`!3VBz7~Hv{U8;brr~su z^0$?8WL;$GaS!A z_qkxIuLS-|1qQmel_V>!WeFv|9AHbcs?U5dn~NFjW8`Go3R)}X6Im-^RX3R)tUpsm zeGA42Zu?wo&7%4>`HMiT*B1h)Etxjn0D=czvpAMBS{cu@4PKd?6+2rhJ-*Rn>u3&$ z-v&#|0;fTBrt8+At76`j@-w4|-ti7X2IW<;+i*igvOG_U@lZYOV$xd0XeudLcc3Z% z0ArLGIq)8=s8qdnYy6I~vDa=BNUG}8)~~0DtSF}fJq*ml*w9KCj$z$;afC42T>!Pc zBl6KbOZ}7qv9pPnt84)S7BW=VrTLa<4LerOFB4>&m}_6IVy;;lSVTGV%P7m9Lc9gv zsKD4FEt^^)jx6{Hv2TxpCL6l_>>YH1kB*en-60lGC0}Ygw+A;cj8k5-v=2MFB)|#qOa2k%0(V<@yO7yHXT`F}_5v^wNGVkfk<=6(*!%_VD?0rLv-Dn7fm z?nmKOwYfClbyC9uP%OGz`I~A9T_g68t9yZT7PC^4TK@pSiTD=OHQ~FqFfZyig09C! z9{puR4s_egA>V!r^OiA9p%W@cYW)&kP|#|=U^dlNgi=!0^3 zZ;ANwBsbA%iVM~u?fgjXlSq-WX8!<7nXBR!yjI;ARX(GLwVE*8u$=WV#6Y^ltr>r@ zszf{$ekO-`Hh&h5MT~|SV$(6z^(qSH#;N%lY?O`~On~1rB(byFi4D;lj|@aA>O`#I z^p}%}LB+c<&eVg+1%^}dLk7YGN>bc64Gu@lwROTnWPQle+e(3@DmP)9QNqa$ zpAjD76Dg?Hqn70|YJRXP%a2K)8mln{Fn6tEtfQ8^r|<@)09Jo-5{RYJGY^&!j+(%F zOvoS|VIDQ*^{C2SXs>zr)zy3PA+ZXK$KyffUchUbu{+EiSgb&TX=|H=6ugVaS>k?^ z!%4jOP+CjF7=Rd06ZsvbNA9{H5MqV7q8W^U8^#y?nu$jA4hZPPyZXV~ESpq-S0f(R zGw@NfaPui#j!zg5)FUuC4UE2Kc9pLgA|hJ0%9#LtYZBBA1it-m0fi|syjS%XO0qK5 zLGdnZ`XOR*Xmz@b3!_>oPBsMZOH0r5o)4E>7;%qw1uDm~(qrS9KvH85yN zZEr>UN)9BaFYzz{Em{s{I*K@>N5SbUlCsPex1eXSX4Vfv?pH~+NH(6e1oo9`jouAm z)`3a|O)OTU=*z`m)|YHLM0hZ^H+$T5V?&J8bqHzpXYT;J!E}+TMV%M*0p29lQBRUy zB0XDlda+)@uQ^rETuZled&hr5qx&dL{{UvOLSo$UdG?yu6!!RE2Jm*`J*6G2tiiLL z4eTDl4yN5jVBNti;=-LpSD`D}!M3dy+e(RuDqVoQhue?GR9SW1;$>UrSf@fZ~EmC*{xGg&IEM&ZfpNG>;H2Hj%o z`8w9p_=Va#z&6*SiQ-o!VWb>M_1qvlJR_HA;q5JCOAA4E7?>*URszpx(VF4Ba`o># z-_~VZevRx;;DcOR!q&Z_CPtRksQwg~jfIlrTP00O#)iY2o8QkHf1#HhrE=}r_9AoppqLrm&E*e z5}LyotaaB9dVO1Dh8za9s6GKd8W>iuj7m^SOYngxnU)W4-ja$C zmTxFb>-3s0y-UF2WH+bn1(bBw(5FF&W~&+1l+f=9w7P#$M9SA_0ikJeD71kY?zz0l z2z`A*YVMrOQxkPuA2TjRZN#RavFe_G;yNS|P7^NExtky_IeJT0VJ=3oXIO#-WEq>A z7TMxXTCeZKKsduG(|C(jji7sGP@O~b9cM+~WW^#no6B^2*Q7H-tgo3b8DivcU0|tA zT{OwU+4an`h|s=_#^N@5%d)H;wI_-CPKKT4^WjQr>k(d8e03-DYyn}rw5dEC0*~rc zZCfqR{v+iq)!H~+XLfGy^(_q(UXmG<(r5+^lQJ~Bu&nz^vZoI)7Miu45By9O1-9)^ z`7)J@tJ-a%=g_bgae#ZW^;v_p_KWQqW2kwJaiO@>OBCJDdD1Qh!SC@Djat3nZ^rJ$ zr3=(1u8L1ZhC@DP#lGrm_oPa!!k7#F>ZU*_W4#~y?=QepJs09o(RV4U+7ev@yE8)! zqnehc?`!CG{{UsfLWV3~y1j{KZf2?8_YY{ttg~Won8Z{v&80!QsmIfxCUNTgGD0{WPHV zjG(b$hx&@LI+Pju+F-~O08wt&#LKNVE^GG^RY|J?tJo|zC%IM@3F1614!?Qb`iW3^Sw<$e@q@}on|=3PFT zPr@hF@g=1u#0^d3Kx}tW^u+<^^&-L3Al;Mk_T0;gU1gpcZ3X>|O%Csf)wLD0t3x`o zOd?wcgRA8Q^bg$DZVL976Pme%$52NbJCa-hFAqs`y`-Y81|q2`l@-F<#Tzlu$l{%t zgt=ODjvdekbkybx516b)@R{=1TX!9$cib(s(T0fyYDs?DJ|d;6)?phQWlZ|LBIU`v z0CYm?kctJ(TBQNI8isv9PmK!az|XwRxCkL__by(i+8{e-3|Vq@ik5DfL(^z#%@!|B zd`g8hUuk9-CjE>iM9UP>B36~+m`yaMej9vCK9)*TRqAOh7kS%T%RS_KZ6&6#DwilX zS@TfdfF0`-S={H=A_CZU{{YlP)<;<3tK~Ekn|$(mL$VD8n@2iAQq#KRgAYtRPp0O0 zpQH;<2x|%PB{Xxb=?a;~e>SVg6SQ#EIEp}AXqRJlt6#a5syqbd!`xzE(Y4dOuclTy zU;IUiubbjLj5sTL1Rdq~V76Y&SLALraE)l|-9xb?T#RTjYqvez8^&;D) zL?njerXe{1-;8nVP?9Z{%VS??a>}qe;eS5y4FyBhfnNx>T$*nV4znnxr#8$9iW;>) z>{x4~$Y6IRvyK2@A#L@2<687Sh8vt1(RCWc|%U5zTr-hhQXR*h?s7N zu`|i-MVawESxt0ldH(>}!c|aH7q}>Rf-bfTwQNzc|IeB2dS+F**(T7DEVKW2;tZ2ObEt0NF5z(d|z_qE?z2d^Ptfskm zntvBVC9JRn3@dG3CHfg!$#8o{Lh0-wDvKHj7!K-o46t6Ycbb9*)BP}TwW&chBY{n7 z7I+T470kO8K~+IjyJB7`Oocxf$6E`d>nj%}s%;$R@Hw*+fsO9K(qN;AWHo16tr-^Z z@6j>@33o^}?5W=Rse$2h9w*^?|-=FZXaa0p=ECvkHgV=1*^oRS*}=Y=!&g? zq+&q=;h@lz)z%>@RG&klM@aoilM3m)KHmY?SP>l#lS{nS`)L8v1fN5sikFX(D#Zas zuVip7mQS_Ok%~UVHw<*2kF4e;z&WS1RM487lfk(rOo>{{Rt{>e}c2L8s6J*}V0MO$Py^ zi0OD?Di$qI2{oN-9!S_1V@}fzl+a__ma~qL2}3%1OPI_dzUMqHp$1<}NqDHBIu=Vi zB6GvU^P%<9d6*e`MrqQr>h8W~UuO}kHMh*h*IRuFq(U&fTDWdwB`IztGkw%?8l`U~ zh{>uME-=Xo--P@Tun$1R)dB962JNEJ+9b7W_LiHe?O@GjleC6aS{>n*jCvUV0AUKn z*7yGaCa!T`v;rkk@jn3ctCUvM!6Q-U{zprSQ^iX`&sP9O)?ed1Z_<4Zkdg5u?li4VC_%vuLA6_`tSly@_8)%lB+A?T}? z`nTw+z4FQ{*nB3_4I0>io_T6TbG=gseqAS6y@<+#e4E<+qpBgqfujywb|ah>S%)pY zYtkt4d!7FPNVFV>O%Ni+T^DW4JKu;`XfJo(DyUP`xWNu;eHe+GRSW(3NvH?%7PGS@9vyjy)Z>u+No?-Nx_ z)2J5pEx=wk#RxKW6Og zH1$8Sm^W(6gsH@$#>KHoXAaE{#;}mxM(d<$EfBnJ^FFVc=Kix+fw!rMNhpSE4q2x} z0$M(h&H}#>{yi(SaziYu*aWn#2`U|)(@XD|*sD$o%z$`#+e-*YpfCpZyW$}ix(9Do zm*!Zt2-1N~HG<2=%>Mu{Sb8(JT!07EXXEWS$975&SiMK2Efn8bZAQ3+BuL18VJ{jB z%oSzz3&K939aVK@Wx>QNXisJm6d01W>-r=?)@MECN%Xohq9y2s(*e6C%5vGfpJl{~ zVTg2->p6pw)-KH^)9JX4fel+}kbx0-iw4_}RWjoDAOzmtSW+~(_>K#eQrPHk{f_yi z{{W%p9>HMgKN)~`N;nlAd+B^IZNv(*TD(B-a7^o_kF{|{KVXZ!8-E4N1ZqlC+52TaA&2JbUc4b01Ev=&xWJnviWOr_`whVsBz=%HV z#GgVMdclHoeW7g|!vw}LE!3!F(&+$Jc^)Fl7-1^d5CyIX*wZ;l2T4T+0-06QUu7|< zNR-DjaK(ssp6*7(=ox^~g!GK8?Hee{^??vEViwVl@ewyYb4;)XFMh-qi&1q=Z{iw3 zO;^{_rNr3E@I*Z!^teeX{wM%~h_JYx#IM%ccRcwb6gD+J@Q?=Bfcg}CPvuR8@8SJM zEwr6*+^v0KHy~bfq~2Xp>pu*Q2Ap05K4V>W#0t<`KN^W#O9y=?#5QLcy>~t%Q@cUK zrQcd0z8Cy&&WSCX%_Ogqn#CB+h*0h>lcosUd=qp*r2qh7gUDOUE$FzDZP z!deWmdP^8Oy^PAKCTs>Te-j3`#s$Ow07Cl<2k%Aq)$Y{La+Y&}7Xa6zO9^I=R^=j> zo~Ry~WiYnemnHPXOO=@DRF+wFTHMw30{x{&sgabk4O-P=tJn20?U|?-m5t%?I^ReX zQS%foxYZ*<90Mxo^d+QNZLYl0JIHX*SEhaD9M(5b{{Ufs(A3uUB}NQxjNNnkOW1kf zzY|Wk7U(SxSQHup@MJF7V5Du~G%M2@N}Vw54@rcW8?Nu%2LriQj~l}hx)9DgW+~{J z1sLnB6+&JS0PPOJ7wH^tC}$#5hOY5~Uek%2@6sYQfuQWZb-@^YI95@Hnz1K+17NA7 zV#-Y;v8|a+;1zm3&T}ZEoCo}Y=1?XFt%VHi%ZYEC)!?$vc%NKjp$dECOsO+NN?T(b z*}||h=3Q(#?kNfBS2|T&>!i~{$)qkZw6IqSsHh`3&Y6@rI`xD90AUZH&!xZ_-Q&C- z`;@#C1iTA0g7;Wxyw?*i;uckxtn>c>Si$Os*uYjha?8~yE>$zQcsxh=&9(9@#R)mL zMyyt>KiT3BYtq8H?*S{CXs2|*H*vIhJC@7eh?tvbs5Ek{TY$4pm5y;O0gBf>-_Z;r zi)huMzGJHV*VJ4_<8MGk^N7I=pf2M84W<|+094+&q(azXT?nj2YA)tDie-V}VZRda z;~LcE;7{P`kE%$VFBh5dDDwfNwM~`o^kQ@#OZ`W~3{qr+Czkk=UL!XP)-?|j$(hnm zy5fEiU^7IP*Sjlb3hks89Q+Zn{{Un|h@th4)CszP$;Rgqeyi)sUH%^>_G^m zGYvDWc~^>=4)Bx;s!zko!!k5Ae8oup1bZTd%k;a5ok18-Sqg6~>kAUp4D#_285{9c z9j+Wp^*?E9t1?A)CxG~a13(#Na?tr+)! zF86$~*Ve>p4#mpFYQ7@Spwc=F+VK$6ZuK{n7Q2~jcpi+r+MU%Y290|elCJ?aOG)oM z)Hiu^y2E*zAH2-Qt8)>Cm%V0wjuX}qfDq-x69Kyp){@s{WOtNavY=HjcC)Mr7L|PT zVbPF&=_o|X>&N*Gmk9gaB$)1-AdJU16u=lNuT8!nNW4YwSdCKKa2nU^A>9Q30EF;gmJ+K(7l@(8LDbkT(`NuWH;&4EGuC7x>NijQ zj>|xUa~w-<0?x1rrl`%gPsBBOkAd&Hg=L=Mc-$6O{^tkSvzSk zT;KV8K?}Fwn>|4yL8)IUfszT)**jeuxr zFS{AyGI!D$Doc!gWpOY*RYBfdG9&Ln>_qHpW~=B_&4dd0H@d-8$Y{3M?Rv$&w$Y)L z{{SUix4|m<>kx#U+KHjNrKhX@iESE=6-s=VAG zFmRMA6atCn{QE4(-_6!j_t?8CW2c&*drzbR#ra6+WlbQeu!fe!f;Woy@XR_W~Kv-+5O3!brFvVyy_+iT5- zys$^u)JkPseYLyuKZn-ng=XMp2IR1PM&uO8>N}7vg=aQq3@=$w@0o{CZhjlFSNM>K zIxHs`S)8JlyRc+w!R|*x6fw#g`&gfnP^Bg9FKFwshl4fWN{-Z2ukK|NmF7(!X0smV z6;5;W3`W-}miJLKC~AP#BvslnQ$e zk<7>#tD-H2* zU2XGml<+6sVExZ|=?mfoT>bIVbOHul~g8d)G4cGLMw7 zt=*qVThlmSq%S!3#^M>BN-ZVZV3o)VHQzH3!WUC+*DpDPRv7wP`^8Pd7gGncvfokC zG1hOg05G7d-Ut{6!X$0g^o$h-v^qLOt#+QosUy#PKoD^1b3dV6MFx&ELQwU6k^caQ zh72C)7S#Mw($byK&qJOj(&jf`)XgYea+*e>s=BW7^>c#}DoU!~VDu)NhStkpf)Kd! zoICWFVzWJ&Jxh~og8Tmfl2{ej3T+Hr_6=2ofwr=9yfXuQ8YxTYOi`0=>^jo;d%p?3 z#?EO&MO8ObpNVHVqB)-?y}6G(?efO0C${SU045a^`t2RC;BM5`Nv+L~ZxF(tP_x)=znZibmQqKnuS={yD#+2R|M;9cX1h}>AMGst_2OS{{SLz;AX9k-6k!j z*)FC$5YmVZ5HR_LmzCW(x$PR=3+;N7F|0cx=8IOL!B~!kn9MZ2yUSMto2-7NS#`{m zs4D==v4f1!I>8E?Jz)z3yQ_NPuu%<$t^lbi;}-NHfD+EB3+fxiZ3)qV@hj8-Qy}=> zF(x`OXzy>a4%i~tz_Mv@5J4+^$cgX2QeN&!-U~Crdg((1)a4 zG;*%}p(PUd#2ZFL@&6jq~BdX%9 z2w}@Q#W(?~E|qZ(=kgFKf6fXGlED(g;1Lt?? zEakjY#&w3csVxatA85YIT&Y^K%mNPOFv`BrLQQ+?qvV$0W-|W(gj@rB_Rzost#MfAR@rESus&81bU>uF~fkJ72ieGw_DxFuo;RwQ%S9=0R@% z0Ot)%g_BVN4PWA5I83s)3P)?v#X|EGxmmF!^BIqZ#|$p zU=OUMgLxO$1;as3&;5#k#i|3k#TR$gLaIOVo1<}z>*Duigw1tp1OUqK-U1)rt;Z-e zPt2|c16!dr%72MSY-&BDi&dmpP44RoS9|$oUgG*#77l~z7Lq716Sz=@j>wj z7`fz%Z4@RwB|YhIRpbt@{gZ$TO)-UUO`{l9ch{uqYWa?QFzd4b3yn=CHaYa3Tj7wN zYvMwG5QdV%-Cd=%>^N(AE7k~ocZ!3W3`{qANM}evjet6u!QD;tAM$O5^L2nq)Ol{2 zz_!ZatUU~=r4@~~d6e<(<AXe6AQf;KyFf`F|#m7)(lUP-=0K4J-L=df( z92L``QYis+k7EQ}UcVBbzg<>1pzw6ocyG%f0JYMzIf5IhPgs=e7SE&>vIy6Bg%;`J zgNdGQwm|uYD7ktd9wkOrh}&6QR!Qc_Ro0bGcST2P{nKn%U}07_DCw+PF|c`5FQiM2 zjjNZ|9*nV_ge7}2Z|sX`Gpp$`5aZmoENykDN+3FUnI&wuQVmOc)rL4dF)p{)ITU5% zSkGJ6qyGR*tV=_*tNnY-le^Y8Z=r}MSk3Jofu~uI5R1sSQKJx2OsdeQ)VW|j=LZtv z_KjkQH4$T^VipLqcewumj0ZJtG1B&0#IxAeU|^yJ@%ySSo|z-;r3-aEj7yBUx1~PO zg&L5xbwlqKwua}6xJa&L-k7O@PFtFNS{|~+Ko=ls*HlNB*cIU^AsSc|G00oeB+Q0e z3KilRMKq{to8^wv97D^eqJyNm@Gy=`X2#mXC6$yKbFPpbLg?k)UjZ=(8CIkHmG)Z0 zvj>@tC7am=@hJ>0X_p$ciNsO_tl$D-giorMG5OI%PMZD!pK=u2se(G|cQpn@G1E0kIUtS;=xe zA`1motHxnpun?<&HQA1@`O3E1v3_6|7o^f9Z)@wjWQ&&Y@e9*Tc7W$GzQyezF%nO;(IpaCGe^7%46ykx4zjA?<`6V&Dji)X<3rW) z2prpz{Olu=*xyO`QNp9O=i-vhB5IJvgcx-$BUmh+3Qw-$J*6zwZ;59H^ATEbgg^>C z4=|Wz7^3`;WxmOy zwfl*qV++IxZirddD{gQ%xl^n_CHjNjOM&$wUTI=kR~aEhEk` z9&qL?2wONZfj2?s2=OXb@cL`*5h%-9rWUU)K%k$5nC@iG= zl*|gSbS93^++i;vq3}U)@DECWqo{dHB2vcXKX*D7zSx*aM!nVXFsfi)`I4UP01#kA z8nqB)OEGRfuUMFIZhR3}S4>R~=sj+D-=sE+%Y11er24x_gZ}_pe;q8);ka_AC4;Hb zMpgLn2m`T&@&5pB65ijLjrlg#-b!>P7$&$O+rW#N>($6zBNCjKw?-lHtz zzg9oMxO>N6^ks2Gbh)cMu!?3!^k<7hhrArZihDFiH(ly0-cpKXqYGZd(u%J-6la)# zz|pdp35c&i(DaIkKn{uyt|R>1H1J|K5#zSC7)UCHH5KE`$~vkQjwk(%h-h>jC1k6# zhF9!FB4IU6E;g%8(w=u^6QW}_^<|dHtTL}x^%(=n)>-h$h`_rTCdJj>6DqK=LsHGM zU6!EuBV-|*X`vQaC~I_yhNPOxv$pN7R7^`;Y3_W^-l9xHi*Y#0$NN|Mjx^h?WAwzu zF{3@t8|c9^Gw{;ddThbOb5~JXPCA-(h33fDRxqayl33fA!L-siEhzl0eI*Tqr%JJM z;RX=h)1n-0LcPnb<|^LU3x3pFPf&s0FO~O|LTx`uuKndz>s8H3Y_Rq3mJGA6vL%{W z(^-~V?X3ci4mZrFN|oK6U~hWkupIG3Ym9zGbAGbjU={d?Io6WXT1UDLfKEY>!)<+I zUm~`$0<>=}`G%{xR~_al#6kKwCdNJVgBTXW(^*>giM>Omy`Eas0ejm7z8$^TytV1O9h53ZAmoW20lkd2e z1Tf~xj#|qkO5YI~Z$tZu8zGaZirit9W+tPd5O)pFc}V4$#*l!>-8q$j3*hM{Wuq|c zu;G^=O--N{bf-v?(V8aVV9epcgxXUHgPzjqre=Ln9D>2pCQojSmL9dDogu!lOn718 z51ctfF~np#MC$<~YDfA(WM&R&^D>YWO%1jf`9W21+(WDyB8#I$!qpNqwv#2OS>ii` zI>;|J!7aBn#2A{4wQVnc(I;zTTjnXQZQW(etE1UvTOcNVWr5S}@eyN(?guDWqY{f+x%F)sP01yRR+4o|*{><>dNvzIS#Dx1hLej`e zu-U}^PPV8gx+Q@y^-4N~F1PCtGGwPQX=}i}CUtcOY`;|@E@~hya%EofqfNIw?~*D* z2QNqblHu6;Z!i)nD%%Ya7E9*bxrBX*4kBL-m^?#-P@J~Ex%kmBdm}7PbzYnrt@9F_ zS9GL>ePp&uY{(1bn-bl&e88r9S*=f zqY-hdB%r?R5%*#kYuSNp$%?BL+oU&v7OJxiNmZj|YvwNsiDq7~4UDyF;(jT z71MUb3iclmfH{B`WtR3;G7QGk1@3%rJvVY*bj+)R-G=;B0Zvnz*8n2${Xtpq7tC0 zFTRq`U1TX`8qrUb2#nxCP6me2)Ol33W~shvEHvF&6%bO0 z=e!q`v0k$13cs12!&!y|y_uRtaX@^T#Tc!)wC52Jd(I(K5{KiUbyr}T6Dwn|$F$D2 zk7rTo5Wt8ot8nck2|o8kj6kwjJz}8M(+CX}s8w_FN%cCD@u%&yg$)s;cHFb^osNIV zkFlhQCerm&X|!pWxNJwPwJM($?l?zYVAx<|YyT+@G-4a(?s$$1= zQ?0{q3;AWGr8G?oKGk~?w;DdHV}%+_m+Dj5)t=hVyV0BrVcKNX9-ItCfGR_Sh?cFC z!yX6Hq0KGA`b@(Xo4la)w?rUU1?k#B9?||1&8n|zCJZr#_P~VH$p+Tka>@gJqXELA z0!?A9{O4^f_H=x9VvGBeoCJwNBW8q7FKCo3k`CQp>|wfEr~B zUixzFH72|xYP>(W6cjMq-XAmM6_-C+!QLUeGt9%*M661Eu-ED}4?l)H8BMDU)CpnM z;yG0AMWp)OCK!I`@y7C@?zFy_%p4puYYyJA&uWKOF)STXCh>5EvO4}?KA=s_F3~Qj={UIRr}no zlcHh4jiQgH(^uTa@d==aJtwG@A{K6z9}#`?8>`4H_!u zi#QZ6C_6#O33RQF@Ib05TGj^ftWuz)?knalU4d;?W&40>EVa&E;)8W|r3LyjyQ7us zm92D$1%ql&yf00&HInsfTg%>I z)~>?Kh89?Wb>3`ogL2vAj}V0@OzF~CRaV$Ok=X}*R1^xgDHQ3n3Y_-p%w*M2n`!GX zXhTz#IhrY+=yQ7N$Gp~V3bpRSDW?aBy?QRyyX`WfIO{*~kWH|9G;LW-Ir28H!J*ZF z0>@F)8=bqq3^9soy`nJy=k}g|SjLitzj^s0uiShh=x)NUTcg%~D?=jkD_S!fvC)UC zr|wV3+U+*iHN)3)vp+ZG7N6LIsxmrHGZAchPX!Go6mlt(ttN;~i7cD0XiY@bpK;P$ zN=5|B*A}xmXBtXYYKaNEvXyBsJ$H({)o@QC%;QJi5}hqBWhJkfQVJ>?<|2~xBhF!g zhYfImI+47=Zl`)<+A{AGKI@A}x9U!dd=nMAoDo;oqz1ymE;8zf#*ey)Hr$~vs>fEa zfMS!CtHj6G_?gJSTH;|7IjJ=B4bUu?7e&Qd{SSFoDg_;8f->X7wpW>`OSXkQ6%t5Nf5?bc>623mStyasE&E zV2}G9tqn2sOj;JYHlJo$b|2|39BIcn${}2>owb&1Dz>+ox*%2F#yZ}VkDt6n z?lLm0%_S`*iv#ZyDWLB+u%q5apqKc%eE}|s@}!^iOpm#fYs~XGMGJ*{?8#!B`Cf)WasWtCIMbSFzUF?;CZuaB+J_{@JY!9InqIlah#BZ;xQY_QIpHY@-Jnz4ik4^^t1aJXjH)u3Fl=|0FiXa5a%yHJfmsht zqOeljhDMGewSMe1k8PzcH5|$)IjWDbo2f-YOM|U*FxzwsRI0+Ew!!L!OI01W;$)}G z*T`to1fm2H=ngtv_ms^mCJ$CaEW*EBQ&_w7F%9ev43*V!s}w%_KgTl^w~^-IY!W$< zVuMyuKy+mj9@*yFQZt4nM@i*m`i^5qIx0Ll8Cbc&C{2WYH(5UOq^a__z}*^kn3=Y{< z%y{gwkU&dc~OL_;= zI+Zytcz*(9+?=5>S%cDDu7wUL245XV7o^WYSKUmjwn2XSO~Yn$jK@)$Z^ZM7N-{`X z1wmVxMh5IerriPVPVRn{4%w6JO$I2BkMdL5UCh8arbJLD9RxPvEl_Qk=GfJHO})1fUb{w$1YP zXkV!v_yUKC8%}0-!3Nh zNcEx~B+jr5X1BcCKF3H=P|o~I_x0T+z&dd8A}R%IxMCR{i0VNXie{e@p-R^08I6td zeQ_w6Tn8wOaZ8yhT+jlJ~5YH5I6FrCN6K*NF;@|6L22-NzNP9P>~ z&GzjrgBrUSz}^b-L!lTz0~af+;#Ejgv^JMFyEBr@iCV4mpd#T-LWW>BB|^vl0CLu9 z>=bs4e86v%E7YuCv?p@2)e}RlNMPRZ46>cHltubEf9(bdR%}wwRy@s=;oxVskrecm zL`%TEvjhaVA2Pr+s(m8&(`d9(+taS@b%zwHHBG-#v~%ohySI2aB88J0N|YNyy0%~C z6gaLpE z6+SBL>|^T7s6zryBOydh|U^nT>BmGK%SOX)S$Q5i~v z&%zi$D~C|VAkG-vHdGC|;zgqQT9L@vyqY#iHg)}F8cwQuoRqR zguy(lpHa+?V7SUPc>v5?XpZnS(OD;fgg9zTzOXNI5lAaAHi-h^VWS1FlKfn>tT#IL zg|oNRO9Nv&8A3H+?X)-sN8%oCzvNwDb#XJ`^(6qiW<+2MQpTn(sh%#qqhvQ~m+slj zIH4R;=ysuk6CT5l_rZyn8oQVzre}M&B7rW6F z@f`Mu-)G_*)FPLq)E$w2!gfJUwR0YIhtgX$RsR4WFM)~MVft| zxN8#(DV<}dP~+ZMO-p^DO&Aqi?>E%K1CQQ@!(@gwu*NmTN^q(NlW%~H78QH7FILN` zWhF9dYb{-)a3VSt+Tv4q+v_Yt3$JM>%6?H+tnQ=Tmm71#+qyu`VkNXF;IcIqt9a@XI z;ypG=Yj&TwWQ=LI7lW$DX7MH{g5F@D$$)KQEag2H&8YV~o@!Q1+mEWlY?#|5joiJT?8t5)hNhN|w^ zS+LAlA?s8A2(-uyu(%1F$knuR*3z`4K9j84T_uEOm$MNqm- zMoQRrn=q?wLa{mY^teQ(Sqww4SlKqwd&J1Z_A{7*P+V1R>y6_W0UKWOshDBE0jD>=w4w@cRMN8Bp)16q z>eh!W!!iyriOhCtw^TEONs6rldWCen!3xw-aP)(?x0W|039Z;YBE+AB8B+aWKNsbV zqq5pCrGfwohj^yDFYrXx!D^4kzMonn%plx?@C)ih%I#0X2&+>(Z^V#}lgP>R9LU^s z`wDo8;3-+Cl(=Sxc_=NoC6M-=Ohphhtm;4xVW1XR_e&??5FvGAz~-4Cn#fl*E3Q@6 zT0n1@7hMR#Izzp~(T=eU=EhvFMMtc*7-aZ}q3b+DAhjyB9oftb67BH|pt`z{_j33p z+^sQk?Pj+j8L8kg?nWs#%sYt%KuuUg*qMFVVhu`!?<+gK7$~-w;AJ3kej_&=hgq&G zUkP%XqS`BWOu{&7*7%)IUoDvHH(H*kJ~WMTwF~Fz3rJPk|Om{D51DWE$x*^~`N%lf%!o>oQd!1=0bT%nQp+T0^24Tn)9X@hK&iUF~5g zGNrP#W71L&9dD=kC|j@`Mb6fJib^WZg-xTY?Eu0g4!LeZs|^XFb;JdiP$CqP8qyC3 znOUU@c2;{_1Q}I|0&lbqb&cw>u7lZrqM=SRrQt5)SPSgTkV0Q)EWh%LchwEAASI}{uu!qocF>e)a5s)j z6Oi9x7+~0iS_H{9y=ZYTb!=Jlr=nEQ1E4OFCmoxIR%y<$ir_%t$%wMD`6g5&seAUl zwU0)%Gc+tiD~g5?i|-S%y00{Xv2dEJcxTvv)MkuTZfmR!P+o}?vxsd-(O8Niu!fdw z#oPwrDRdJzs~$izf$WMGft|pou);%JT}Xxv0vUO<2oYuquQw=$A)8;BU#pj4TA+wv zjZ;c4A`3>PJ0+OXo>x{N+cs@Va%f@FGQ|mnlZk*cv6=3sA!AgW)r5W9Snn&c+;Aqn zWoEme;K8S?9LYh*%$-058XCL$#1_A!X`3CUf)wdcQmxCzu{SFd@q#*E!47MEC-I>R zWsgE=>Ztyw;Zr|YjsxN(Fr-4IjH!EjsUUr?#7POFc^N*lnF2PgNUe=yB~u-9lRD|C8IU>uHf zKO2~(9w@j5H->!)bXlWmq#vrY0Y;;rSN=^}@jm?`%2n5@8pubbwfmLhSm{{($i;ht z>SJm4&a6}dAX;stJ0ly0k2ea<`bklgc@mub##G&_%o?U2qf$DUB5gzd!(~SV7(CAr zF)wl(qE=dkWB^G~0p^HT#<~$T#JmIo_zDS5?_r1O4v78NGG1k1=>ud(H?x5GnNH{z zBh22AMiyn6x?XA?x=O+Z(l>81sf8v83spKS|L-V{ARL z7V5x$BBVhTU^V7idT%-@#XTTx+S7YNi-ET&Qj3^kLAia$iZ|8-8F~eV=>Z-E3n|^*JRE8aly-p)Rw&7%~mgSS`4Ng^U=1z8zv`G-~obCZ4u}M#m35 zqto%|Jg)JxPK$auVQ}0SsL2%-cZJl7+zPsa*3J1{>zS!$0@h&7lGZHDsWe8LHlOS5 z2O?xTN77mYWv0Yl)h)7f+;JEvZg%4MBW288tCw@P#5LhfMvT0@<^754vz9AifU#D^ z9f%%kpRnCsb{c1Isxl_ zrHe*+HzYwhdtAzFSt$v2>pFRrNfh!Ucf{8;NR#b!PvKlhvRcrD`?(@X_Pb9nG81FW zU>hB0Sxq1ihUK%GnD##sWuURrUIH!Gc?FD$4hxYc<+c@plmNd+pQ7WTt;C;a#LQhk zbROw-xmBcc=p7xQm5vU*;V5B1PViwNiWoKN0W)Z0oHwQZ!*bYB*_2Hz8p4~Wd8RPy zqApz}rs1T$I!ALYOrW{3ceFyf>emcgZKQc(=rkh2Y_5@COny_~ ze8xANBqgIz7-2>2DK%=HOM(p=NMiU$93|vA*_ogrBi}{-rOl&U!B%6)l!de+SG<~g zObp{Ny+28OT~!-6t~I*JENM_VDtne4TQ+*X_8MqX){7n`3{zcdEQSW0mp3}kBz73m zrPF#Il@8`~7X_~H-s8$u6R^Ljn?e=TM4=NvtG)iFK!9(gr_42Q#i`Cud6eD@z~!ws zlzk;TNXr9lcfktK)@FAZ%BvEYxwz|5t8;WMKlD)4j(%s-=*b+CujMMB{R)g$qY>MA zXYe;*j(QQ-6G0hk-fbGH`o<=$UP~ngvK6jzKG#HLBsuASb0%=Emf3Ij3)utjYFXt0 zZ%jhVy7?v%+`7_2wOJ{hm@&(Uuc+GKyhmjP0k&8DfMBtCNmRv;3#DAPhAyN6(a!fRL^9BP`Oh@gfj=nCkn?Y|cp5&(bx3c_7M)TJ^&( zQB1Yil&RFQtxt$R3l?_$M22Zg3|Y!!`zBv&B&CWG8uLc#Vq!bZiAdo(4pAe%1H8Dn zM7YC05f<>o=(C8>G&cro>v>v&%UIcaRT7FduGGQ8J)-pM)-Ezdp(_Wx)upxQ7GnfL z)ylI#CTax`wf$1?RM#t`Xsubc>0;JC6pI`M)ktMSFw~~8HNW~xn2Mt&=|B$1-pNKd z??;FOD*6BxF!EEo{PuyY**^)DBkoT!w1itN*xl=RmFBHr(QWvbx;17VujrZJXfDZ{ znJ{9gWct2gUBMNqD@%jUrLCip_m`ka(4wQJ50 zUXZq(b}fo}J^(py>_w_%_bVT!Cz?D47UZ-Z?8MW_yJw++h!ToBA_ee+V$rr)@9l9^ zsB+b0+ieJy>n#o{`c%b$lkxYuC-OBEdQtRRp6Mzmr6sl|9V3D+#-@lfarf&s_J*)< zuAn`?#8N<}l7gWN6^?!8+tB{VfTR{_yjXOUI>Q3BWw3DhmSsl!F*F2&AzXqD720iN ztG>_=Qk9sPSYX$L)_%1bIyoXW_{6076!fhil|YpViT&W1g^;soF2$66XVW^)N&xiC zIO(_|y2^`mty4Ph24nNG)wNRRBTT!_k^~3U;tuvmE(%M~y^SFOYgLNDk=6BvVM6=H z;?>>voy5bo8HG>uOx<#6FPLuks3p0WhQrii0gw?&WryGgN2C}^zg7LsA^`j*wynCA z4O)ukI}RbmN^16iNX~OE)f}cp?nwFsl#~~Y`wnILMqX0lvSvk2811Y-dj9}mrFCas z?6h@0B#nPxl#(C8P-ttIsvT1TIbk12SajA^?eX7qcM8)i4>8zNCRbA$8^^&0#g)gu z`;hdJ`XRSLdmsBJ*>X&$hopz#U6^_ngm%Enf^8D^&ztm+ZM-_&nUtAbQ%mU=V)k)t zs%d`k#V(tdC9AIbPHvJ`wI1!KL*{tTiKF(`cp13ULM)E(15E*RumWl5XL$LI4L3UU z(hDpAal_1sn*x`_JSfp$TYSM`Hj0B$J|o~^yekiB_|=_2PZ6H7?y}0dYZ1LAI=CLy z4-?^r@t3y1mQI4SXy3KUmc`HJ322PKy5k)CAsv z*tE2|HxAxvQOU3}XoJ}ya5rPDtUAqqQnxUGYWO*fqP`KtZUzPOA2W^3u)rqrG+S8l zK8IAJ;KDVc4?3O#18FgEY6&73H~VqupnMpJqP43uh;+(xS1~;+Zny<1#zv-oS(`N1 znZ_=8dAKJ)xa(%#&XG_bLcWgs57cck%9YsnN3mwLHy1tY6Bm1cruwu(=Jf{HXkAth zWdllViMx$ZLBs0-N=$yUAhIg)v?{Bt%74VD!xGEQ{4+9hWrmS;=MbG~=r4=UST%-d zZgkj$FIwdCwSJRSG%c=er=%4xeRX+Rc7PdV-G{5vei&5}+PZ@Sw!=|&NFC~e;y=xc zZAfh|F}v;QDk&CiLt-cDnM!$^<@0wy-HM1C9Y#*z*O{4>VeA?R{GCPDe-S|GL;x=F z>&?r7YcDIv=-OwUqXbT9G55MB^3{E2zc@cK3MZ880bOegBiRJ zbf_6y%+#;J64L0Iy`ZGzg{>uy_|^ymh(f=*CDYrw+!RfbO|+Ic*=+?LYr?o+gW?R;7e|4t@Nox z4OO0riQFnPgGQrXcl4KUf5ri?s+8|M_o*t#vNo@(Dr;$<@h;(@^I!5(n6%bzQaR=m zL5A95wn+C%EtQCR5GgR&xqKCOyb|V%>bapZN#@{XS5Z{ETB)A1hs~$?JU7cKi@Xn` z7)^g)l-jjb^@FNjxTJF2{usICnwK7wT?G}7Rvpe`JJ~RvC_O19BT|Fc>pqV{8mvuCX$%&~29}T1 zyC6Nmp(2T=_RKjxu*|3pd|eX>xS5ME)d=9$E5*+X@ihLL&j%T$GY-_s+AB_}nCL5T z&9iU4dP@d1_uKrIksnAjCQ_H^TtWj4rlS6!^^4BSNG$6KI*buL7k2@7-Dc84tgd1L z-82}eij!6|=i&gxu|;Usy>Tm&D;?F+Vfi|Y1+2=OZnu8qIdB>xxF&?srXGB$CQE)O zBJHcEnBxIv8C_UARa=FSXyt37-C=fWcj7fncA;vmzt%l!EIAHQ;St^Rv)(lfi^5V` zy@+;<*(z7gU@T~`I_p0TNQlC1q^udu@70Zt17mfWDJ|i%s7CxukSPsT+nUywZA!j} zSdLXqSo=)d5#X;q1aMyy6d7xC*UTUs zMyuU#F|wt_3(B0WOsrXA0@uXY++2dX<_c_!PNZ~Vt#h^MHM_8GyRnOGZ3}~!yuI@M zf+hE;vrxnUa?u`ihx{eT~lZSe|BFC|n>9Xq)@Yi!&S; zlTS&b(D<00{Rkxvhe`QJ;#n)aw_wpBPznaOii*XmS+;?7FObq?VN~l4l@Ws2N^tZ= z(o=OAnP%zi=|2~ticG+n)4=N6^_baedq9e>3OLe?Qe#N^#2_n4%5MeDoiunNR;_TS z?fyjEzDG%7^nA?~_+)ee&f2xQdIdzGEKohu>%^Kf<6~HC;;fqMa&O zoak~?)oou@{{Udi$U1Wv-!uli%N`UDXjx0g(&eaeoH6fddt<^4`lg(V<`SlhT-*wr z>)IKp7C6B#UU$9CBjCoBaD}KFS3*@q3=MGzTeK66Gu~VI+}lKTGz3?o8Uv{Q2&u9f z?o^&*N-oJ-xzk>^G(=XO^5CGM?;Z=~i(^&Ksz}%M`A!y@Js`*cOW_mvjBJWBH;B5K z=bK}pvYM=Yn4nIhil#0YSag~` z%_oKUnm46$>4Usp&3WUscyH;c&YPhMVW45p@HF;#V28N=I0> z7jz`ZAyG@!O8XVvFksJ_Y)h*IP);B`vZx!?DMhyJJ&i$7r`5Dj?IE`ouiJQW9cSa{ zIiJX-D&h9uGx4M8wEka7#Du9edqT-9;^Qg^%3_qXw^2dsyh9#?#EQawpAc(F^c^SU zrV}aVE>&BuNSk$s5gauo0HO|zy9HHj$jwo4h_?!51~!PJ7|06@riiuSnGiTD(tav? z%vMwb+A|xA+B_SC`%h!t8IY}$t<2LaYh~BWrcRXS(q_`yrfYisgs`|)Z>D7rcRXSf zD3$VJexCCpw0;N|E?ahp{Y=+=AvsHyIjKayXaG0p?WA|2pYkxN*Y?6Wa{mCBp>(v* zq-D_tY9eQzjI;Fy0Sr#0sXUfLv_%Gh?NW`jDo(=wrVEC{qbedaW0+$1L6l@6orozd zHc4P?j{gAiHT+4o2&Hk_G>pA4>ziX+fIMd&Wn>P?F|%OTn4-40NHD*mUdDy?ArQ8$ zeuSFr_~2+Jgss1>CUH4hliV@&j|uY33ddF~fL1jHo zl8s{Bi*eE3>f4Fse{vOlh$=lK`VL6cwPwk(1FFUP7d75W2DrA7!=$m|CkUSRY539m zW^XurF?B_=i!6X;R@PcgF4B9#$Cqdi~z2-ryPTxP`WjDD%Y11u6XG zMg#<}_n%+MGzOQxx=K!sgCOpDFuItc_92kua58K(ylX0YF=F*Z+c{`wO{SXXSoidW zg^`X-dPbdd3R$Mw9=2E{4Pc=%rPFD8v~I%EB5{xh8(XbomSo8$@YU&|1|SV4)bi9~ zZLd2SNn=G8=^>VhK%|RZf8u<7{^ApfDQtt!tS-x8dT77$Ro`RV=lYEmvBIgi-OSS+ zXXETSpUUDf-(m9*$msfQ9+P8GJI~{Z8UjgA8bq%^XWs0{`AJVg3#UH>{C%GhEk)G& zj+666^(t6VuJPoRJIksKEa=M3LBA4X-I##h^Eg|!Iz(yiAdwIe(agwctL~KDLHKGa zU#uq6(3NYi{2?!5JypzAtBP?8t_gv|hHAtv_DYewR*U}1QLH#RK?yW3nd}$D$illF z8hvJ0mGDFZoe{q?S+YK60AnY3BbXaGncBbuoh2%pABf1TZ!YfN)?h_-9L+)30h2r@?jd7b-qD%44~d8-KdcdRKE$xBmLYv&C_<|aN5M$lyHT6VZ(;nHRuLeXa92GMnn;TY?d8n*THW);~>>a5So>3BBc zwO&;78%)qQtp&SHdQDHv9kDGd(w*Mg!932)!$D z#r2LYs`#Eq;DVYlH9B=xSoMaCz|709Jt4ECrCfwat!h*XGzX+`$Z5^ASx^mkZQ35X zs~P1o1O_Q?Woo9~*?TIXkaER!bkuQjq}q%cb(mwLd~9V!iE_B`VtLvI8qmL0=Mt zpj;;$Z{i1{bz>I?TTp_Io6Hkb{5r#{@}JA(o&)B7H2t=pVZ_T2%ctr^EFJr<=F$?q zm6<$gGlZJGpvGOysSv9sqlm-rq|ogAOWPXOrVb(PKF^6XeV0fnsR6LeY0~9S7?(d4 ztHqU4yHtE{P}I08RbqR`gY7l@#F|BI&~}Nc_Wh+DwXfPV6H;qV)rrbLdlJ>`nUB09 zvUSVMS49|_HiAZ1tPe53DHg*?h6Web4v$p#hP1;;gV!fS=mmFz*j+XC+83`=5}_Vn z2+&#%0U1u0`G_n08kFf}IHFiQ{6tw?ABjf9HPTkFH~Pm##S7H|`US-4Lj9%x0Imz% zNICg2=^mC?eOZGGrZQbaytb)`d8jdC8N{`&f%6teEOLz-719esM~k_i#%H2wDU?2` zfj9!)=H8{u&rxE>-Xj&~XW9a-9fru(>p<&J76Zjdr#*13n19D92Y+im{rz#Kdeh_x}K~5L#%3 zlS2hTq_ZQm?a>o7+155sh)5ySXW>ld)zzY4Tq0H)Lpa1H$d)G26C%~!nboK1fMx`a znI88qS)#avh>flxqqO^OBLW~Ao+Q^V7!A0&iNvQFvQ34yuUQE;klp&2pMb}7o-@oA z;^VPp_Ktp}BPXkR#(MUw6__VllQs)WV|fI!v_2X4oJxlhGOY~yv5nwo4OM+6y^v+7 z>3wl77_Yn9SxYU~S%$Fgz@pTjn&cKH=r0j6$OUyZh)U`ugLNovz%Oc*oxT$EPT>8M z7+40=dWC?c47kwtm9}6iE+}6f@zK>&KI5c(pMpb*29B|mUcbIhf`MQ!#9`1~SP%V$ zjhe!>YPGr6B{am?YCyEpeNjX828>Y(8?}Mwv;a4TZiP(($};u{N`HpO;<(qy#D3uzosM}hlg_`fQ4#SVAzj+kdmn%pC`;GJd9p1r}=O658X<4zF3JYn3P1b3c{oJZH>dq|x@; z5W3-^F)CxTGp!<1w>qr=%|J50^*4)ZnW+b{Drk^pq7@ zQ5VDUDr_Ve;M8U^udE{Dp;ve`h-DUMXc#7cVHgC}^DkBt>Qv@49+Zmj;Wex4L_kg; z2W2qznrhK}k(XSvpIElg1aOr_)kd=WVh4yLsZ-Yj;!;x8h)tTcI?Bzj{U&Z*uOtb{ z`iY(yKFkblmu4XF175HJnS1mRs?gT>tBV>>UopNejzvwPWWHTVmO$?U<*g^YqfqZT zd6^KdUZ{@JpXnM}sq%*4r9;l(DanHRM}24OGAnc9RaVGtFjN{9>8y)G+%D(R7~ZbN zlR*mO3aC0G_7lQw8CpX7klny2?3+XG#zKjNX*EHYK&eO?6g0 z!U69EOus$lXA;7rc^mbaup+%2X+I95mOiWel=-HZdZV*k5vx6h6QE12G!qtaHFif4 zs5y?x3k}QCWHQOQv`Eai;lj{w*_NlJw@#cH_k&=55oEIA%Z=$xCxIz;jUVDh>XoeP zDG1j`{9*Io90kCM+Z~5B6R_%*&%$6tHpTDK3JhV}N%%6_=s}HOt98ADN_3j<;gs&L zi?1XJHd<&rK=aDKv2!w_pN}z{dws|_mRejjw+U0XyV@jhM{&yG{{T-+rH0a-Fo{&X zM+KOkIB$i{)m!ryMS{_$?v9X{#c|ZuAYgY59zDb^5H=eyX z)VPHrTMjn#g7T=YhG3Pg(=6>TafX(~Tz66~B<0YLd2`UlgO^Eb`Np@dB)we%{t-#k z8fl8IAZWOY)W7yiT{7!aya0`x!DaQ58k5A5!XY(#O4X!vM+|pGX?cpRwGQ$xc`-ExTg)STUA=~VXA)%=r{Y8) zc7p!^^gyNQsF`=AC^J*@i*HmgG>kB`VWCPJ_`f6*q1e zX+uTNb|F@HNICqs>_Orp`I&W@78#u`5{PwJPP3T<=3c8`6D&cUWGyclRb@1>Q4MbK z1a#|KOBtd5VspF+0ZnXTtcRp{p;EozDXX%uH4>(5f6ftZuz(J1^@Lj5isab^m}`Zo zDXsiOUcw%_&B0|E#;C#6uhA?`p}A2zffX5aOOB>2iK$TH>L?P^kSeFyVDtma8-_k} zeJ1cw?|F`^@in|=wr4xaP}IM~RJ02{{{ZCOSQt8Q474O?6gKaem1yQv?@RZaO(_7f z^QG# zp7bFBD;7g4${<|aD6LHY0Ldn5I5q}2B{=SoYjr3v*d?WAI4E0|^@f}`%ymR4yi}`n z&hTsL6sGFl6T$Ec#(n*yYpNR#S=t*{$y;J^S3{bpplM6XEg@_hQ6{In!{}&>oWhP- z=S^6f7>0$_P+?zY8NEv`KyUoG515^EOK>bf2wQI;!vOiMzn=&FXBL?TnViea9C zHZtGLekO{=!)0b%h#MNp@zPe?bP89CjR5Z;7~3O1F9uIi0mjQh$&WbyB~=R#doaBkwYr=zw$n+?Qmo_ zieQl+fl<+1z^PzpUWts*!KnqY;zfajRQA=jel)0P zpMp2Ui4dN|R1~{G32$-_9QGW^=Oiye5!;PtRQe7iDJswLA_pbJ81{}&DOPg9M+9|~ z;(jJec_JC&qOPYAlMzJURb|AT3QHLfOY0%{W)phqIZp&u+}Rjyu=Y-rrY9@unLa*r zOv>K5h(kJ1L%P77a|XNR_lmn+RZHm5-V7RIl_K;9f?Wg*{-eNtteT6LLs4pIH|-U3 zrI8LyQ2CU3tsb(8)@|^Xl(swKUdI8a(kNNXOH?<<5MD-q%&ayP_kt_G`|AbwfXpGd z4yRh$I|{(Lkbq-u%xbQLjHca>Sz9)Ucfx5UjA$J(q!wcODg?IYZ&)}PQ_MH0DEj4@ z5FMvfPsAtFa+18i^v~t>{ba{v(`<#4u9An>rdDTi2q-jb(jHYZ9?#S)37L;9_>5ys zzQw@XWODBQp^1t*5NeC|i~j%whL0yg}McZ96jg;!|T3HVh-vub|h=FL; zcYuX(o|#MYA||A;wHw`1;{IgURgBP}3cq3jx6e4Z*BXFFz+#E#O@7c%nnA;vzA-$f z%qQ!@W>8H;Iyt{Fahc2QuDO`V1?SGEXtk}wuL~vB!#D=C24TWv>7;SlS?+!%;))gl zGgsAf*)g?-sHl^b7uJ&3^05lW88JEvTgc+`GLacge5Ks75vcQmglUK1D?w~&)kU>N zWl2d9XTk>Mak5jO1L;2tA|l4RN6Gjkdd+%3 zyY$4x+F9Im?*d}C)hrp(_KrQeV)y;^l~r9^V**f}WNpT<#x`8s+Uo$*F|me;ZA!gp zGYDHkYlbEYtlhPW&cwZyTVM8+1YD@Qh*1@!>kCKwg_G!))*q3VYyl}lzvt= z^Nh4mzo=Y!z96B%6*=$ISo!kBm~!wzDS*#Ia?hk4LAJ1KlRzzHEw~L;+rtP}uv*_S zw;yQrqLFw+8_o8PJ_0n9-m!kHtSqZuV}*`QXr?f(`Cn}&p~Pm4jQEU?$JBEJA+=Xd zVidrsI1RHn?A>pXvgI>#)j^tpu{^)hRu%x=2*oqz-qcNOW0nPci?aXT#=St>896h^Hy z;!){ARx%;f+3-zku5(i9`5`*`6Nrb_6MA&YcR(L_9+&%%3A(#L;sY16E_o=(;9C?- z5A`CwTIU9noF8mTm}A#jVa=1?5leYxfa|gxDye?(D5(+!BLd=s5|;JFxp9Mq0nLN zs7TQI_dHFt1Id!lX{*Vn6T*Ba)N+)9yVP+h{ZS(7#Cq9K&R8@$PJrinRC~%!B&KeI zGM8eg_C|)n^)>!LwM9o;#J;-n#c@$1W;k-aJ|9@gB7&_NgvrS(1%FUzS|iOyMQ97y zG$2>KZb)VKklU6~ zTW|W5)3Io}xQz~eE=LY$oU$_T5k=&>PP;BJrryOU2mOWZ#6BOiVY1lWx8i}(9Lra z!OfBnX?r`akEW7xyAmz`04CW6RNK!Lac{kfvE|!U`R7Gpd2nk8?NHkg{3wox0bwv&7 zD-NW7bn&qQ?Z{11)>edbv{~eu3B`3K&$0bkG`1_MlH$6>Pt)L<9p<2@9ug{zH~#<= zadddf8gAE~xQWb0+(D4A5$U>q)36FePB=Pzr!z@5M(ip(`n4l)wMt^(Z?+-BZAT6+ z8XKF;tcxo3Pm)ubXs1uvGQ2bPA+*rwm3ri0FR2I&1qWDeOUGKk$VF!!W($@hq$r9t zyO`SBKEw#x+$v;fiLSDZpL@nSRYS<@F=qRxc*6^{NyErt>gf?@9bC z)+O57MH|3<^p2y0bsXz6ZI&~_{3cM+|ipE8L?qHTaXBPA48dZmM4yBYxT0>MuThaIyC!E)i$ zPu!RRLW5TjUsxAOb&9Tan%6ZuK(i{N#VKuC#fj#=VgP{b*0JJJaA4xtbyVTP3YtE> zXE!yTR$i86xy`Vz^(AbwJ5846#6a!x>jLLjiciLfkiO26pi8#vQyup~aQw4c;$|p! z^_dg8dgbi`l0c2|av*e~iYyCfAXFCVw7n9373(%Ny@>&830#|bOOELFIroUv+d6V9 zyK&Tsmadn(Yv~P_eB2A1vx_;VvkOj;M-H}CP0d&$veYh34~Y3c1pIN{1zA51&i0N- zILtyU)EW)JGkYIv#13W+W4cGy*_W-yL~{alfu18^G6d@|^ystJ5CCidy(PxZ^tR7E zWp*?k&;689*+nH)2V>eC@w-90X{LFo+dQnQq2_(BC}Q-aMXq|+shh;$UCI3^|92+7m<+y?YQ6G)tN}R$A9!hpk11 zTHnmM7OOBhSCRs&-jDYYm%!*k>dBM@a{=&#iEbH4}OvNllu~OCR8L`Cx2P$Vt z45?D?L3y30;Ka5KX*{3I{s>oR?I9zf;@`CV{l_!QNvGODn3KkzjsF1Ilg&ny;GSxJ zF#0%2na)|85G&ePG}ceRu#wGU@m=_z5@zb$)*%R>RW;p7qmYWAYN@$02SoHptOXG? zgD%g(G$s$!_#+hPvDN_wuJibY1?xRjzBIgkCDUU?aLv|~SDR_~l>nTNtKu9zrbD9k zBSQ3t(SBtCS>!_LVvX+zP_Kh<-&lOk!8vu;k~HSLU4{%-5UpBAqS1!dP=f8@adqgi zn?K78E7BgQ%s`|^r89szEtyrxQud{nd69O(DP3Jj2?iQdN4#e{q4Iquf{UIl)+{=? zeFT5xs*Tq@ZU~yE+OAuLy5+F4*r{2wPqQx$>QNCzF|4Ax63%W@8P%zlYg3%uvxh7@ zAguv#^(M31PkB7dkFn<}FtcyGN~XP_P$?(o`$OhL6u3J1Kg^m1J%vq-m*70o95yG|{+^B?$#+eAsbz?diMk!u5c%$x@$}3wv zk)Xz360SGRH$tPPMpr2G3ex^ctsTf+~(Zc zI%aW#`qpN8Rh?n!`#hRYZh-7U+EuQB%^lph#7ts;)Z$*bBM% zbmreIH4iVl8NJYJW_(XI0c{0+(%2N{NE5x?5eDqL8J4QxeEp7eWUR29+#Km9<;3153P|p*PL}R!aDVhhbw_ zgs8ib{zCgQrP}GoW(qbmky1QDc(?V_u>onBv{&7-XY{y=^lF&XXhodvRb_8Wm;n*p z1jGJf?LvJu~wuAPBFlf5~Sg@Cv&Z$eKxK;{(sn9j{l+BdM*i);Gy~;@aqB zpM&flGw`lDH<)#wkEG^#X)yamO>$ty&TEi`OZg;T>IMY}S^;O^S~)%_helT^lQBs) z8y=9pp32^T21P28QfAi@UTWnxwhhT0Qn5|Cp_o=eMg$wwhDJpateDQA#I1s2UsxuW zc>M(UA`0Ou<#Dz7CQ<(YiIjVZB&zqP=)i$c{F6Evc}rcPc#H=1$}u^;F3Hn_o|5{7 zlKGft-YRXE(p`)PdSGltG`PI)yt`FjIUURwD7qpKX~(3gSgT4xvAL#DwouEe+&SPE z8^0VE8K(ZzBsz!EF;PPW1vv+n!jKZ2s;K>-!}jZ%rRO-fj3 zz9Vq3e9843$k+Pk398b@yc#dQ6ZjjLj9vRh)EuX24A+15Op%}5qx^xQI!kq+9Lcwg z%8Vd~Q*ng7>vYilPYv^s2EMmz@wZz7C=Fx9W%4@WQ7e< z)!mfT{{YmG+@u@fmbZBpPFm>G%P1cD)F4y>_nV5*WimzcZ*hn(^Doj83Y^yf~oA(1ypz zr^-ttb)RpcK9^ZCiVcMmcmD3cmnal2wbEQw(71)j0CjUB^5d$lWkEw`ue&f~Dw>e+ zDlaA9lAzlP(qvX?sKgDuS@~>sX*x6df*h0x6@JhRl$C61u*F9N8NT~R$^zlaxZTk$ zzGi+)#)3YxvduaNNb=<((M<_P8>A#e+C(yAocv+xjWyC)1r4X+;riBoE5k2vpP!`W zRP!6MIln3Z!TaJCF$M2y;dM%yl`-Y^%1 zIcb7sD?oZ{G%BkeNOl{Hc4JX!)?FpcJAS6f0+F3teIGD2!fTwYG$eN z1+cm!ARev0nX^HL8qFw|JLxgjfPJE?^tr8a9tLIl1$Zz+MD06057G^yVwOe-TWky}lAqc6A{7f9{``ig@uzcYKq6GVH zVKu(F$&m^JV(wPerQ&{71*Q~FE;tTxu7)I_vj%RcvoBjH3)QPP1lu?1D|H!rKhg@P z-jl|B=ED$IW&KRLFuY}-6A;)y#dr^DNa?SZX#FHHeLg?Y^_$-nPzQx zo1Z3pMN3%<=4_6@*dqop2%s2|U|^+VE1l!4fXrJZ=o_{6i@&cxMmGwq(%XAR@hp1E z!Nv0&T4il6(54IH9>sdZH3geUlt3AI!0k+_)v%^$bt*3UMAmui_b_y#4``ICDQ_8{ zhIBBVNl!B^CjS5sO4>GWsR&)s+U0r&s+Bcl<-AlLA=tXH(A})-Q2im?HRY^kz2qas z0u042)GF3s%l+8>&&lpBW&06`p{1)nmsxL&gJO;5XHcPwq>WWm5K^er^rQWbSt?f5 z>2b*c*C|+;`D=mb%Fne!s3}95vaYRjH-_c&Q84K4E5f^b%45(NOH%5hL;zC--5}hp zk%q7)oT`Dq-;X*U>=Xc9PKMk?IjdMO^yzJi{X?)IqV$pY7ibeEzjzFmI?Z+Mm{H99 zJwIB{#sS#BM1*@!q~>B5PUPP&NI~m>Z1@l}RsFMG??mIE?x`MNw5TKNfcd9L*f!A%;{~oSWtw>`cox=yLzOP_#>l&}Y#BZA^&RwAl?cW8g60Q^sl`anoGJmjOL92nGk~b448QG?t6Rt~JOu zV_e;Q5NdZb(=%z9TJ|cQCcl9-#nXxGegZqDbRB;r7Twvwj?iwmyZYOXuZ?vh(qK9wU5Bn54gec)_ z96cs&zW(H1hwPqT=6z={pL5P>D^G~fux||h9L02=Y%LC|GLpp*Oi_CKJ+I zE*m$s#;*~rrC>#}0eRs?Y7z;eg5XvT(vLm{+cq$RN4dt+o_7*jvN}0`r3Pe?v4{$(uMpvZUXw%jgsAkkw~|(JOIE}8 zFRL@)N-hc^c^FBuS$|VD)DLTsWgl>??==BaQLGw38ZTD~k{}QqCozy6Hgn1LlLai)~ z7VXn#Bh%Oft_K6ma2C&Qu%XNVuhU_}ZLDY}Bel<#3hcj5vfr6l1yFo_GB-Dqy z9#yR|t_k=qo`wq7+72C}ANQ6z<)Yekgu^C^-G?77`yBhp_B_wafvKiufuRl4q7-WS z%Gi51Gt5;eYf_o5=9BUt{O98aT1Iuc{ZGWPtg-P&;A&nwwXFOMK+r9N7|aIJ$93b} z{4$`rj|3W*o^8NX^@;9d^(6>(HR{Dca?V(Z`1`JAw{L{}APq+2LTmwy&9NN@jGDgN z&&S32C*g27o-gJVFub8bcu8@bGI^Q!RQ~{Lh@K(yBD4wln2_#hCCcQpJ;jjBo)WrAXx z=i(BpqE=mbN2~=HXfJ2}%;}n8Fv}9XA~muX-fY;^*Bb!YGK2O6L|SRf(i(ZMiJPj4 zejo2eJ9kyKiH(M`YAHg_D4RYOdRYpUgdU9`h8LHK)CU)R0Dbq4rL9`q1T#F0H_|9j z&%hXK1qVE7Doui|8c)Bu47kDdnD<{X(LlW}@Sj7@R3d(|6Q0%55gJNo=QgUX=Cd)F zKrXa8;W!OHN{E|u(a;-l=`i+v`h-Gfxu^Y(u{y%`LrT^Mu~3?5O6uw}`b~Q7RMwhm z>}dE{^z0_+#dgW3J)>RHIyR6mwO)~0DCqAJRB>_IYn5G_;t~2c;v|Yd-Ejho39O1V zbY-H7)|2`eZ7+}sC=D)I6WE07nq$m{sX?b#h|OyL_03023C%U7i?ddJDqz+v=jcsk zaSPFkTQRR%r}Z#hS=4StS#&#XtoS0jLV7iVkv66R*>uWiY&5}bkbsz%t*m>HxFCqV zHQO^s(X9LaV}vCJv}r9y5WUt{L{m||Fl{xXOYMdMJX4#gPl+V<3lI|=r9nux@lvg> zvBk9vnQ7}Ke#x%j+>$Tg-pl_ESLpm*K^S|F8(=8E9gQ!X80?%CJYR6+qxSbhGe4+!wgbOkohB5)uI^=Km^@! zd3HDqSzA1GhsYh!Sab7`D!v99=r7$c0qwpf#e*H|h)z2f5M;e0Pf}qurGb?ok5$aK z0{YY;C1DfV11QV+CX{OYAjYzxkxIZ%gaDC2r7kREI1Tzk!1@LX$E`ldaI6>Di;;9F z;tBv`AhUWIERASS9F)0Ke9raAV6z>q^8b&Q`TZIEWKgW)uh>ld}I$rjAKaZH;65( zSWptAs|u^XH||zRL1EV~#Bezk>Hh#GNr!rMOBaitWGOLN@j}9&z=6{djuf3&X*As; zEkN53v6FRce0$5ot!EP)Uno9Mtd;N`Ba}MI`dft7fSWIj6-e(p7plYkGWdf^TMu|qmffq0t>2-=(fNb5I$*4x<>6jBv z9Agm3lI0~sQ)3TFX&5v#?;8=O>$T4lg^~2 z){HC;uXq}Hjdzfj4G!Bu)z)ex)un37oRY4CFPOR+dMg`7;%OExw(m3afhrtamD;?% zC26Uz1OPL7Agk2Ilk;fh2LaKjDKT6svV^mMXwwg@qf0jXuT3E$9*rCX{2IW~Qctbs zeGe$=*g5M^!x|5>{{UbzqcNY6LApfOW)B+1VykN_N=_LL^%tMKbqt**zozn~M!n?| z@+(?%1~pgvOZTVaRGxR@em<+2JVWMwT6KgaP>T=3V|H#VmXjlB;@Gj~B}~t-{7=aS z9cRTMPi6o?d{QB3+=7jno7A(te|Gu?=StU6sgr<+iVBgCB7n>{0#A{$#1rH9DjgZ58uoMaQrhW*bZu z&SnEtAy`Ebbr240#=nRM_+;X00<}jA1dfEO@$r4apyhsfxH=c9mOoidft=qJlxq8O)OpP{*$jIME z%$J-gsrS5LD>Tn^x4}?$TNSqyy`=@V1-cwciD2JCH{xezsCqx_djKzU04Zcwds-&m zFL6zy(G;`V4+PY>qkF5LLClNT6+IB^D|ud}r>usQ@*piTjrSk97GN5=iQ-G;D9aae zUvd+z8h^+u;S%N3cpYQgpnSoUaw)jtY_pb_uIb}^lO?f}mFW_QtCe?<_N%a1(&ZF#H3Nma zMiJHs_$<}pRu8eJKIau%Y#Mv)Q z7+WJGeBYQYW*Fd#Bu_K(KOa@ho(c0JYAWXtZ<1r1jU|NR;E;@PD>sKYn+BM0gVP_m z6pc(ITtZnPx^l~nrN@1uC2g0WahV^!nGr^|Hq2OxQ_z{Mg~3&`c!2d=pF^ah(IBG@ zCp$objo!LK3^^b@^pCWxIuctQL{d!mA}|`D)dfpc_+-~wI-d!7JtfT1VEZgBaqoy} zy%;GQ3*nB(2r~WoYD|WGB*5p-{{SOJaCY!#Fb&I716n>H7Z`QZInAr|pw==@@#<4c zVI|#H?qD{j^)u@K0EQQ&)jlPOpfU1eL8^!E)>O;$Bf`86ahY=7A1r!Y1dR}@mOZrn zvn#L$EHJfOh7cM(qG)h>+_=61w~2b8*%Z};FR2?%;=Xa#eMc~#LCQI?0q-y=cFd)# zN%%5>LbN0`hf@H9yu)g6a}{-D`ks**1zZDpq85gPJIVy=&B}}d3*-q>!(;6;s6AEQ zP#wJNjdbEo)UYwpfSonBO6Fi7{ovGv5RL|gM`bC{#E1%I22Nl!(xjrGJ#mahkD}rL z+A;g%8Zz?~eF3cd-6lm@S8Hts;HvPBgs+Gog$qXw2J#-zEM@UFyIV@jm>NrbbK!*zJd&{%48!vBpTC0Ov zxlPuxz!aKSa?_;y-4h1q;!nbO6Chnv0Q3V2{{UDl7K@!!d(;qfp`uvu6n2)RO09^q z(kF-msi+$(dY_F$VB=z&=+ifZ)dWNU)nzkQ=q|VPmV@Kg8C#4tmSFVBM^u2TZC`r7 z)cgY78f!m-(yRiEX$l|{V?Z?(9E*ojzHLnD=I*4lQ9 zMVG;$Mm=#8h$@&3EiEcSjoMnNWRW(tt-s{Z%X(%aG?b9i4u1%JZSfq+0b)>6z%+5B zyXB1wXCCnjl2*v7pW+2;oR~NyetyH5_}w#FVh;tJnT5y;DTz#&Z*{+<(sRD}k zpMV}t?2{v0KMa}{^@?n5W^e>+KN+zOQIB)+KN*kO=NwBsA2J9RNiC|qWq!h}-)Ih} zB%pl7q5wnN-X+%PGZ8Y!UHAs>?tUFXWzU)>p}@u^OQ`?~;#tBWxV$6D*oXx!TO%lG zv_0enU19SGo2U7e2K1#yxvDhMWt`Adu+qkxlSb9n=02SSQ1(x|C>vu~RJN<;U^+8M zWk;nDbLdXu1Q~d7L_<=dLl{_Z8w<+2^p3l9^f%&W>NI$|UlUZ)Re)bgIj*eQ-HNJ4$bDWqlFU%W!c6Zv_sl28{X3#*Wgt1q~V?{6I+%o;|Tb(_w%`y{Mc_JRKZ zWjX`WE%<`SqOPkoT3rBAwIK5MM?(E7fUO!vJx>Xi;=(UFEAbbg>Xx!#R2n&E55=yAur<0%uoh8f z1YU^WqJ6%w@IF(>{F2LJ4|U2Rgd-BFLC*SA`nqOvHkUCn^^Yy4d5mAKAr~$Uw1CBnDTg-@VKsvf zizNIyqfqG_q$RB)wRD*$<$EdkiRWkI>^YObK4;~f1$c-V`=VG9Jt4R03oOCKXAWh0 zE33E&RAO2J;x${7SO(HvhcXOrrA4;q#}H)dVtlh37A|259|9J7z@fu6zSy1?AZO~J z3itwGeV$?*n$YnL2b1>|^q_AJn#(c=Bw7nq9U)^zl{0p%?BRf}d57Bk6L4?BG3>#^ zTS7^`ek0n}eIc3%T&;1W_Y3A651}kQ%Xwd*)@L1)Ff~zR%XqTAA{NH6H~?E7CF@2g z7g?!2VUKh22y)!LVuZ89w03EL6Br-})oP9C=|~h@C6<{$eQ}kt&*on&`anIkd&LuN zqHx8%ckUB&SZ21JD!%humHpHaqoh|DmBkDMmJsxVk7gr@_gtr$hiUl>K)#c3r!ojY z)<)|zz;l?JB?M;ZTYfUnuI4&UCATy2nP>&;sZrm=sIyj;=tt7Em0J2Rv1OUr91B*w z$|B^&SK$OOv2um){t+v(wwAasxcC|6eB#wpw>g!(%GGtCt?C~+t|V!wakMvzG**H37G3s>+G}Uq{{Uu=Ea+Fsr`zif2jw2l%q`a>)D77{R*~6YrR^;Jf>|`(LYz$nhh8pI zKioqN#V@WCG9hm+@DU=MR!0wS!gv{h5W>dsFnUrLrElvs{t7%u4#R0QUeSv|irZw2 z`_5uFcLM4-`ik%sS`wXDx~-jITC)EDP(03W>9qV)B^R#|^(J>cB)*|Eo$pUr*GvdI z$*Ua{($nT%$borr3_!ePeWO8Rv@*TpnF1(Q(qou@p3#a|fpb%XKGR+6gWg0+g6eB- zWfAIkVC^P%h^KnYKwzNZeD{dYZ8h$aope5?rt#jOX7x`xM-Loq*QS!bz8T^ajODK_eK$_xy zUbhu{gA>F2PsEmhx?Uygq7E>}&cVq)9wL4ZT$pK1ulp)D5oKm}A5Z zNhL%A*aYdBH6gVhu6C8~8866Qkz0Kv(VCHH`c#JGL84~|{!_qA)9(_-HBFCra_s|L z#s%0tC&rLE-qM56oA-a5N*04>R#5{)$GoFukA_wCT;2tk?1t*{sX+HID(q6SUH;QC ztN#EATQ{^$PEnb;K^E3S#IDY(;DW%_fFed*W&t5h{YHyN?mX zDR>=eFq{C6qygexm4Wz#Kl?@p0*FrZ#mi}%x^0J8{SXYHLsajUV?^I8O`6>_gz6tO zTuzUMQ#-RabqgpJ2x%zl-NQwzRmTUV9boEe&Nwxg+mz`fbo%Zmos9Py;(llaU2!52 ztWNr*J-HcG-pJSd-ct28okz}4t3=RsWFl*D7gm)6L*f&ktzdh3((Cztt+ z*B>OHgGyY`n^3sZAM#jR{^EEOdl5IKYQo>Q?t=1SZQXiI9EF_~s^bS#Nyks|AqY~2 zI)r*~mW$ZS?>`nXS>Sx9+4Da0k_5XT2y&DH-2D$SI66La?zly0^ZWkeg?3YDv*f<* z$4*mKH)G5Ywyn(xZPp$|*YOno$=Kl`R45tS zqPx$-4wXk?O1#3$2E{t(#7*riug|Pz5*K{#W;VR`+e1J&8><=G2DZjQuIxN>k_{w7 z26TmKYXM}e0IaIEX0~Fbish`Ma;>3oI}GYb7FrSYsZB!E%IWr{KcsICu8=efU5R_{ zyvaz~0~(vush|f02r?9o z0J!l1GxW@Wk|Z|WmR^f`EsY@63T73lRa4SuZ*)t|%Yca-DEUdGI^(E*;XglN%={!& zh~rYCwJa@ER_|K1F-W?Q%}L?@C*tJL+BJ{^Y!9gkae0c`emoQ;Ni*y?pO32MPZar| zoQF%E@~Ep=zLH9Wpb=PQ&0&K^T)CH{F@$0FE=%$$r)cRv2ATIdLGcFDr}rxb1lgV< z9fprKp-=@NcZ$5~RI6+UvJN8>ZM((_9p*Q4@|AZPo%w&W>vcwyN~J+(ag7e>915Ap z&$DDAzgbT$^9!dSTmb-B)3l(~qWwijlB#_`RCmR+`AUeG7B#yx^~4oHyYCp$aq%Lu zj9X?G%vvhm`X+<97S13mp$s7E{T3@Zm1;8;r0rU`d_X;bPLnMgpDb+OSy(Z!xw8rk zHJCm?X?s9jF1vQjxoY6wx>z_9l6ZfZYe^t`%#l_NguJF!?T`VQ3Pls^xPh{yjl!+uTGfcHz{}CDT=_=}C706?UE!qsrccJb8UCu-S9+OF&>8a{mBg(TP5U z-j)fbBh5lsnY@aBsVb`_Uu%Ry)@?|CkW46mbYi`SqOmX_bxw!0(ESaOq=R-=FZCHo zZMK?Z+TTQd*pHyQ=?g$nV)a64bvd@Q^d(}WajD1`nDK*ETF<~R(SRo}9_1#v+AGBV z3)nECfu7icEgA)6ia2;Kw0aTNUQwtTy(Us(Xu2<~X?3tTxMTtJFM9s~AZQCn`^Z&S zgWO3is=RSA&8Sl~GE^)DPk@W@03LOgy<#mSZwTG1Mq&X`OSXPK{{XCEthroxp`5JC z-U9U{mVR0IHXR36hzK2Us=afFkWi}>s@L91Ru{`#KxT2WlHAKPa6VQX(C zUF|E}o}8M(aA*ACVV70_!!wzVJeDcG6w8Jx8=XS*>#`YwVPwU^{Ip0fAcca`@d0`!iAMe9uTR zeNv;bnoke&7`;d)?MwH=0~0vkr1O(B`&>7lUBt*Zvr)Ma5CtN}ok{qs1FtC7(F@U^ zh8eE-aU2E99&$tC&@RjW0A;iqy1DiIND503C#=McnR8x9vuG;~7q-{=FjK>ESC70% z7(P!9{2H;TTk_2`*CnH7zG2@_Tf-Dk(75K0+}MC%yr7j~4qBfuq#1&m8dXrn1EJz* zN(BwzZZI&RYRf2}w=#`uqoVjk+aLQ6cT$y19pm#nXe4J9n=MNDy7^+s}@3 z09Vx~+;bBv7l!R`Ija|>s4@5|;(ZRO_|iA9^&+|}{a@robN-mX`s?oh0EqU=-s+$O zu_#R(A?UTwqA>=Dk8)a^#y3+X4Cc)KFJQxo_@+%5UL(g;w+u)jBHmIhTbQ;os|ll+ zkrzSPf(U3T^+Qx}jsVLQfNT{TPXkgc9VIt#Rt+6BfRLbt9)$ZnWJ48aCC7TWs>Mt$ z>D&?|YmX>mT0mWzYwIC@t>tSJM%LYApbEMKRHreoSOqi!xXT23O2ljf%Tw=V@h(<= zS@^@}lMUz?5{<5rLfw8+%^KUCqh(M6Qs@tv1)Lc*iVP3_29X@MrbH`-hBd?-Aa{#C zM9E$;3aqhlQGwBIBopvYp{zCr=jL2!dNsUgR+uh+Ln}mj5XVVUq)08Z)?Yh+?KS() z!84#d$S9FM>xuaKu4M5~nfOAj9c1_)5=#66rV4w;BEiYewEPzSX!f7WXt8mH$_ml5 z14o;d&Hp^Em!t4&T=^Ia0 zWyM%}aA|t7@O^16O1&p|=2S&rNEqiK zezNHs%U#kXn#wik%jwI5shHZBf9797CDEp0=QUgzo-zBFAmLxU(0U5=%QFT8tB?6S zKg?}t6neJJM+c5!su2ivo^nkS>$r)~v#TyBjcoi+N!)*$pLxkJHUN2Tm#8BrN-xB9WV}?-8dMGF zrxZWfX4R?gzjBCm4Y0Bi3DplU(xYTJI`)b_g>+*dF+#~}?4Q)MHZz{D`7Lu6tzsKx zyN)Fs5$Kr7FnW)qh@f>(S@yjnMKU;xQcAt%rrev3{$Z`9SG+6BJm*3StZ2v)*OkgQ zEIJZ&pxc6z`yx6mQYs={TTvME5)WEz6MPzmu5;d^rPKUTq8K-+WUi&th3^P(T7hCr zw3RwIb@4jDtZ{r?ihZuHNHL19rK;XG&hqO4d+aqeuby;4CfcIj{Qk;a}xjzy4VQZ}(@d>J| zVA?64$HV+j#uO5am$WulS5VoMuyUCuem={YDhULuKpv1Z2%3zaMa-TF^CCkxMOssG zK@;G7Ni*1bMWm>2bLLU@q8vsV)`rKk#-u~oR9q@OiV{?MfbOp%*WnPnL&sf z%qp$GLSI$PH{U>nAOsj@2aM45No>-1X+&Dn>$oKkkh^^;(1A9H)Sc2tUePg zSfqQ(Q?J36`xE#0uA2g(yqRalYmR&bp^R4KD&rUwoJxa{{UI}#O0=+)b&9!Qlz^a*HnBQg0)lb1KbzC1=N!~AN3|N!2 z-)oA%&3w*8U=IHPQ43HzUf1Vqsxc`Yxi17j^P=&i2Ueih0Y5C9>TP>wK$P(FcRK8?he5v z!QI^nPSD^G2yVfHJ7h2UcF*oR``-V2ea`)L-??2ibGqwR%T!nSV(soB?`Ipu7pKs^ zqS9u#mL>6-7j?^P9>`5`7FCbnFFIwWT9B$2W-;}+=EZqap>Zh005cE89u#WTbx(VY zws1qpyiM%I`({jHf33c&qcLYj4mzvixc<8N8zps{VyIvds7f1^!S3kRnzMn|+J!Et z;)_SJ@l>K_c;7_Bw?3L+j`>VT3}bmF-A9T=8(Ojd;@dAbD5xbb#A@9h&`YoXp}&{= zjamh>|07!?@hPa=A!A9Y1(Lig}e}$`HdJu*|bJR0NDj6v<@fhmB2| zE3(B2TIEfdbTnw`NZ77Ze{NT~pf}2|g0F~aZE)VFJ^dloX_JQX#ngkAz0@?Rka^_t zVx^^aTNCR5(eT5c2lY2$G=aYLA^9&dJx*fU^t{Tm-TUrEw;FhAHau#4xg0+`sRYk| zBl)LehTBdqA zJ7TlVs5L%yy}@ELD0%VbH8n+SScD9}f7Hw#@5+>wd3c83m|~E8kW)h~e9>86Tydw` zESXKuaws1{HyqMGG2>LA1AnP!!PQ22;=Pu-M1N{qBG#l?Krn($u2`zDdud4|vU9*n zJgDQI;2%C0nZL}tQAK&>1J}mM@={2g+!#H71U}KUt)5cH3iU_gG(Q=SUn{NzBA&G0 zgN|F0ez$ZrehGtVg@L`(H+cPbSWvDh876`a84X$2QK})?WJa7tCM?)0HJr+N4MH}O z3X(r=s)#x)o)$htGy!M(>07OdFZs)IiLF9pJy$iGdUdu$ZvBfDYuYCEUGN$C&Ym&8@;N&ILUgY43`b^;+c{MyZj>BIravDowSDrx#i41s`^ybLY0$sSU(+* zBE6Y0S|ecJ$RYc$=*k@EK@&tqW!+?BT?@}lag%)ZV)~(Bg*#YLpWsBg@;b&icR!nP zW`$ua{S@_;Yu+INkLS+D{0#7t(rvg&O(?n=Mwy9r(b-N^Eo%z052Q#<_b!Z%#);_T z)X?D)J-JkOMyZAOq&uD%>E6SZ29NxsYvVWS9yI$<>GuOpF7Oshed=%Rim<1tTz7;S zq;@a{TX-6Bze#UwA~@@yVbCKXQ1!1t5UE?Y|{om63uva zX1Pcx-1l|+wQ}%j+7;P2^qf5Vji|00dV~hz%u?gXZ=RFIOX5kmyKI~YWt0m)-t6Pl z0<|;vk-Mz$7>+7Cm18Rky;8KLs?^N5xI1zNYwizDX>AosvW_AN>%dO~PL34;pGt3v zb2pn7daNLEM=OCi-a*~S$rYA!8TRDWTnfx#vrod-6@?sMv&h8ltL2@GUtzJf+V}q9 zV#;o2MV6QwZdDkLmE?^?B!M?^oTAhSVUernZ-ULyICTHY1x8+ZNHL*WR)|qK^k~*M zA&4$1dEbu&FJ-0aBv@Ww#8a_<*FpQ|?OUy6&s0Tk7E$%1c3LZ0itPT`RPWqCN0<|g z9}{1Hli)?J(<8Af9O?O+&m2Z+mx}JRTzb|Z5i$t=hcd`RrfuW ze+P&XT?F9+uoW{c0o5#16Or`fnlGl*v1-dgkEeu^VJb6m6%mdIaV@1_Ez2zilF|4` zRW{dq8ogQhFoUD#{QUYGX<81x-%hj|4u23_>;U7um#F8|Dxvk;!jsZiVDVd&7k9CN zhV8OX)YKV;sJAIi=+RI8h5Q(bPes4?TjG&%2gmy&GlkAsn9MQGQgf^%uANy(8`4~3 zT~|mpeA(^@S=?2p#I@Q8p)tiX@6ryWYm&n*TilW16az5iEz0&>Mt)qTqj$Fv@go#y z&OhuBG(^2?3-4SPd64*M9!ODjgs-Y++1DL#cJWFksK+|TGrr+A9rrIFNtRJ69kRx< zI!P)17f|o}3+#_>Dn8&+=SfYk_2OdR|Kdr{ zxSJMvZ*ES?bkW$Unn#D5X^FeVOvfVl7eMP%rj78&k!KUeW=$>oNpWhYZ91j4ynAVZ z=^?t1ieFcwK_v{sZNIqYNfO(!6TirQ9ZPif7vRyIQsgHO{V9!9{(gKYWT#ZrS>1z+ zgvtrexFmuVw!Y;3J7KK)iE>E224IvlhY&+sAcaJON-2wWsP(p5Ck$Tv&AVz+=*@R; z!{MeLoib6vl(d_OD1wdL&n)cf9fb>@JZra5)yHH}#bSf_MAY5QWWX!m|0@rRx$3O@8s5?^^FM;qb;{H z8&T-~)jpNvb8C7;Y`+aFIjy~K@kr%wKZmV#SZS*3LFf+6AzTfjTj(i&M8T`n99{!44k?^tj61bEmoWrj7 z-XqfdCCza!oBvGw8myvW`$un`8ys*CFD=N0SG|Xg0-}(s~Uroww1sEGs=zF-y z0_|?e&E9<VcwpYy(xxS&;~VM^u~Vc(O#67@kw z`n%ZCCu(3eRY)Xb15H$q&-%mbN-~W1U_8+?HH0hjO){R2`iQowc$Q-^i!!AKwN-0w zN5j$UsNnIj`&`jK;a^Y?`}j^Ulo%IX5F9J$bree6I*=+KqpFFqFlH|>6FFVBV%dOn1zH7LNl>(Mp&B4?z^NX# zd^xL^B5*sc#^DVpM_j>)lGz7Jl-Bw z7s~5kw8%171B1;>y!~XxogW59xMe)GoN@cy(1>Ve^KvV8Pnj}Th{HC~<44+t)nk*!2BE;o_D;<`P9#^$1!o3ABL9vnC;i%CvKIVc&7@uPvbvWdT# zV7cjC-O)0y;+aEbw@TFKYi2r^+&z}t~+ru-t+%=kXH47UwwhGQ(QZ<6f)sz}!W(@nmxc|z&Ya^s9_yPpc%%kL}t z&Nzm8?N>m`=h1tY@asE<2124AXVv`k4Mn9I;TCN$Z3<<(Z#w=03CA8P1GIy%f1n6; zFgwL04L<}zi^8a(>~9?(w~$7~{lxS=7%)3wO9FLN?a zKw=%>p^k-`PVU0&VOP$PE_S9hZxHaOum*tx(~7kh2LBqa&i!n6mtf%6H#~N7IcEb~ z2qu$PY|w++M}4&--9+tWnN*~SS9j>9I%RgB>I^u)YeENUoYV^Yhc~STE~{4-zij~K zkls;?0@>ZGr}fHQ6JJg<5qUFE$ZsjpLd9_r7#anMEs7M%pD1)Td}!opiU|4QLtB!> zLgifcTjD}Qbw;2W+QC){R+RPe5I=9P$S4>!drtuZyNsR6siWA}*RHNu&Up3N(p zyb5Ts8wHA=ifvlA8{Vj3lYfidLH(oD*9uxQRVkOM?J!09Pn7zTHXZuuo{ME}-8s<5 zR$m8;N-4AX>mG7lN7`wGyyEDT&Y$J5O|{+=xS&_%94)h~#c7yfn?OM<2SW|KPQbq& zqM8vZD&b7cr!`g@lpiSX$QY#(wuxx|b_`{>yhwuT9YDzZD$}CaaaAJJ4k~D_k*4oW zh&&g!_$qyndFX-7`e%(!G$k&9VUGEZ@$Am0CJ!B2B375m;A~rI`O}5rjs6LPKv{Zp zHLC3hKSWnYTnhzc;MqzC3Vm-f0qM(lo4S7);v+8uH{- zK*sA&JJr^(6WrIPOF~LI?@KWD&rSV<38p9%;#}cX+65{gyR7UkFT^_ct>Sp5Wc|H9 zyJcAg!C03T7Qa-K_R!7rqXT0&Q7g1@me1UoIM4kB__28|^z;4*S!lhTm*EnIjBddc zPX?vd&U3Kpect*d$1t(SKe6b;!dZ|<)F8&pc}c(KP*KVsT;r7+@k0u>2Jwr3HY|Z; z)t5oduC0;_5e3eiu8xGt&;7sTYAlN9qpW=EM#QH$!Z7r1-;%>FgOYv5o6aK05PEv& zqY?IUZ1S*Qo2IcCch-0Cg+w9^4a z7nS7N;<=Bm!Z*2srKZotJi82MZq#+91R-%jYXnTULu%zAh4| zTg{jyIOKlgB`Y;NaGT=#oib+Tk;^Yd2_Ug|;l&56o}poOj{{2RBeU-5V(1I}Q4g9# zAD(`n-+Lq9+<)@@H(R#Y}_4GzT`NgtN^?jU-0dOUXc(R|I9&75#V<5!d0L zR|e%yiD!G9?t$<%T!nHV1MK;V$fm?Q`%m9o3`k z)x+1LcyE;RI{C*L6hV)Oj2&1}|E5>cyiNlVN4+9p1L;s9VeZDu0jV)M#7 zrL!b45u5ZrqjqZ(o9l#8?)p+G{MI?+pqdQlkp(|(BS^i;jewint0+OS)=_o`<+}c) z_dJ?fE4q|8sBa8(tbElQJFqMIt-WJs2&~-|k^gY#gy!p%%f4Mb#@2AB|0()dL3uzq zvrPXb^>=*$weqIe95D_lF?Z#?FJt5QJQSlrX|v)yqqzNv}k{OR)wvqFr$m$j9qIf zOp^SSV}%J#a~0vSJVemA;z$6t_yf`Sj}*sVX!_j^{m_;0pf^l4!lWEMm05V+l(FwZ zR#PecZ!DJt{TkF zFPbZjX)L0C7+J^3{<$n!G(5x3o_Fu%U7S(%nFJPt_JA#H8vJAHf-qlcs3IJ%S{|f@UGYTCQ@dgrnVVWDQD-=wd+nXFuEqUA z*<T~5t6_+e9zughO9_Zh&eYMCK| z74^O3txP)`nFP*`w5|M$FE5%3^_IygrjJ{wKf|W7HYHQ@^TLEQ7B(%X$^T$KLZTnP zkt9@xN+GpRw_$TRH#c0EgRH5m8?)1qI5$gi(k94L(B>W*{GTr#zI8F`N}V+4t?l6 zKDzxWpYE!_h+0i@XdUi*7jX>wc^e}zFGZ>4eU$G!qsF-;|8q^$p!L|j+m&s1^NVY) ztCH8QH~M?1Mrwy#sD_}-ilJu$t|Y0#;3IjqQoh+TlEiDRM84}tnzus!Lu{M5A$vIv z2|bt=9j~AIU%)fBmw6v|fQudr2SRK5&Y0ZdUWVrUCtsCez3a=!c&(L#CzW+c$j>sO zI%|N`IHDuP1nkW!;r*YHv?S;S+DxPN1M6gS%tz4hF#v{XLLPPYJNaf=X(5RTCwH_) ztpNPf_%=q}>FKl7KCT2kcwF>4(Rr> zV@zFfKE>}Wql#`k+QIMA31V~4%=5Bn5YE!*alf~Hy39}xq)a`#@OAkfUHM2qqzl0} zZV~^E%4M{bar%N>hmJe{j$9VWX}mj`J?M!*L;Z5c2L{C=an8LH#s~CgjQ$q@cZ-dd zS(bVL3;nef5lykI)TGLq*IRGuPgNapOuaAYTs>tM;BwrA*Am7Qo4sGH&RA;ZyXew2 zQGbn)PsZ9XIo^(D|5)jR=6!Sp&L^1QD}(6&6y=t@&6O}~@F2js8$k(&q3?CqOPjb3 zDO|dpD;0(NB*hRQHu?f)<3OZ<1Z!ja-kg z#Y2YzGe@O_cP5d?S5t}QeLQ8zy${*=4K3QEX3NDmOO9B^hGnGkl2zHg_feg07%%^m zI1LTqSxKqqC^1`5NL_DgSU3%Zi4*740NgYiC1&vx!38dlAV)cFxC+&nvGizmgQi&pvP z|L+vGv*so+h7%Pjrm}lzPieSF$KDZF;Q!3{Y=3f*aMY41?_QO*^F&t=PgD^ug^u)d zE4|iz&(8cii`WL2u$z};$66BAI^9*^FM>ao$C&O^%U=e#vlk?8dE8*wTF6&_Se=B; zE}Q9UFqF@B)~4@FvpKV1VNTNUlZvdKY15*cl%`v5aOC8q)Zb$mseg%Gy8B9d-#+{a zn;nv!{%!7@+cSEzRr|}rrZ}t237b1(t^4>fUzO|aD?%l8+)pT}i>K4&Mnv!*vtlcE zNK{H@f+T`fEVK_7A}lZTrz&gq_})n1>amz5$_Tzw!MYnPtA%bc*hIcS^=%jPojwO9hz zrLWfE>(E>jtD)})p0bv?J4S=_+lyUmm(6b@k~+R#wI>y49A7`G{G|R?m3<3U6#=W6PMV`3tBWDLAC)hY8j8>N z(ihZgPoQ3lsk?b>;z^_N{)l_Jkx8sZu0>%vvByw$fa9&hPBxC@~y(GvV{D@WU@0yisLEITkazPPjTGAr$VcJ8MR_x=P{EV zx=IRJG=WZKL0!~6en-Uu_nJ+d5%Kvpe#KA^B|~$V4=>nA%I){ix5?BlEGh*ahC(CS z7Ficn^THmfTIFm0AkreTQrhOrlrl`G<%NV$3!v4zw!K0q{dPkC3#o@N*(Z`*k$t~^H$eK6~TVTFT>{puD zbU6RAsU@G7$-L@L+n{{GX@s`P7JmY(=%Il~kOjH!LS`-^9A|jJo#vvVbtW7o>v}M( z=B1hV=lzEMmcIZ}>UL?Ze*|tGzh}1bo95x5(;` zCJ&_*6>Pzgxs|q0yuAH$-fGhN-QXdlWB00{=6JrhX__B`j{GA?CvN07;uJh=y51T= zf*u@cY10rX)iiy67t#xWFH=@1{48eyu5~ewmhC4uxH+7ZDr@6EJyr;6#A2~Ms2h+kP_Rqn~xkYE}o_fEZN1Ss_cZ4)jE z{q*d|^A}!DM9x>ZdA$&8lJgj)%C@QG#ci|`bsEVwn)wA?B2xPGfdi)Yay50gnF8VU zPsE-#67i$j$+4sMFw==n@2c7Zl;`Dgu6tfr(QHLf+3nskeo511CjWho1XJk`MR{J5 zW`v84r+rRXsCnYHu$TBPEcZTcq#efvCAgzaCGq|Tg0kHo zGG6^sjfqT{a1#G*ue-)Ys17|6Ie6KWWBFA#YD5fw{NR5 z@yQWC2yUraxrU(c^PJWjQ>mVYrMpM5+Kz_I?T^*hAqDWy{_isGl?-}a; zyneUg*n8=)+7_EaaT67rvSr_G_|-WO1!4zM8i4 zu=S?{Xo5;d0RA42<>I(nA;+Gzkndo8$I#iM%BIG7!SgV7?8>-#?3VR?uO%rlK`bzw zZ>1*WHJe*6#X41K({9w<;lx%2~@L`Jl=myx3mo`az z@}8JM_;0f=({uaXOnr{yI8ul*{UU14vh);0eOpQeS6Vv4tOy$OTvw_cOlmL-rX1b8 zlta8u;lCnYbpHqk!#w|N(Z#|M%n7j_!Ku46lh+B*K+c|$=&voBU9|SD&dSQ(!Ii2d zik5ztrZQuB-hHj1Hb*Ua>LMM}(U4elSI=mBFj@1LX0nhE=^SAUu$U*PJ3xXd|P4P{TN< zG>?o=>8he7E`$>(^7gB4LC@hgS^_W}*Giw$@p=l5<$im`rE{?qx4wI2tgmNt3eDi- zptWT&MklB|2xEoM&e9tVQQzN@#y`cav{lxu zU_bg$^p>!<^%9FBJ`H-c8ZiBBo8VCz(GLXeGLNM!-iUPRV#^G+jnyQ-Aj~}mMGGz> zjC~LG{{AbfpQ=UnH4*u8JcKHn1A5=zX3~jZj^1S&<<~cge}MIHgZ+pTd4wv;UOKj>`9+2hiB)+pMrG=e`FI&R)<8mgDz&YFJCLe87;^k+74so#-=)*Dnf zdZcO?Wai&hTFxG!tEXbz_Wb?}bi;cL2k>4#5p&u+&P*=fSO`@0#^X-wd&KT-GMAOh zT?v0~MQYd&U)S5tip{If7w*X2(z`>xIrEXDf#kPM9w7ODV7|&4Z#L9YsowEk#VwH_ zo|?4mWNZ0m+J$IF+b-paUpn-S$s@_V4CBxo1)btLZKf`k|qBpGQ z@Ah_}aCb50hh>y#c+(Qcoz1}t)vl(0T(kTjrsB44T$({!qrJ}3W!-o&EUqCsEobpL z2pO~aGrwxS_1#s#C8I`arQ`Q2nYFxUbDDhO3VmfRSUm5vc89K7vo-i1 zPpmxgDx_86ttK|SSM?r1Aq#ql>eGzV`_OcNv`1c&aILaC=Z}EaLO(pj_qeFC^(ACd zj=y^&5K8$e7c-B`r|42`z=!zZ$?V^B_GUHh25$;W)#X&>d*(v{?~hv*53jl#ca=1;d5_1qp6^F4hb>uJqq4BF3;cmtN;$3v??qnhz`#7kZfLevHkXX? z9*J*M;-kb#cQTcH~7OCG6*{{k_@ZiiDy=9810lRiU=B0VL*G2%8^dCFnmFh5oV zt*z+771?K66mAoxOcE7x=<7bease;g?FSxoIF-R0%jhi19q-I=nK$5Kg;kW3_t4dt zqr74xeOm6~Doe*|FNNk2_k0V~8gJtYU!iXO;+dlt+JmNXEIrm83Pt?|q`q$+3C5*O zjWd@Wj-Er2ufEVIyuh>4ORf8A_M2>4N5g((!{#Xoi35@M;3A86JvBq_+n7R%n z_w9pTz>il=ChRqb1Y#_`W4JXiNM?(YDHC*$Xk$owl;#h`RJ=Ijf1fF}qf#~z$Ry8Y zk1|S}fyuhZBDf>|E#JhU!;cobej;f#FA&*1Lx~O*3Gz1L(%)jcaH-#-g`{>yeuGk7 z`wi(|AWD|J48OZ5)zdee>Cz@qg2d?!@l8vquYuz1qeA#aYi_^}5AJEzqDMlHm!!>AOx+zAXvi8`cIc|oG3To@ zzdQc>oN@EeEvt_TwMSnAO6d)10+nHL>qD=R5{Jta2=03(i}cETat;1Z7Ait#<7?7< zKGy%bf7N;Pp2IRJD-zAgBVC6sLz4w`Y_rLiQ4!3Nj+IK>BO;heUA`~;O+6dk`X-{z z_moM;gN2?J{*NLyBjVkF9XP8GKpdUEdgW7lC-+c(5b)w!4SEpQJ(P!XVBAf^fn7^wGw`-PmKgatW!qGX2`96haRuHi;I_9 zV?~C|_WCQFYiCj^d83_RhQQyqb_rkAQb2@l4+SgK%XFamsOi3h)W1_E*=sRPTEWI=dKndYL zhGGE>Vb|@0Dg#y4GDIBUk+OZYrg-cy;@NtN8i?{0>4`MSUUk!Sdw!dB$wRjmSqCi` zzrOsb>f0u+(?aaL+@qmm9yDt-E4F6Nm$Gw8o=&B4!w2DN@RNf0&$U~|o&<$f@p6rn z(M%0+(s^mTWB9|f8ZI34;PjXYzM6!*$Ioiv!TSa8`yCb`h)B0?e`nZC91qfzTQ5DI z6Nw$!@RF_ApG%9316jF~8)ZgMy(DXoTY1tCLrIjMf{QNHOk%&{m+zbyopDtc#Ys7| zz+cj8A7Hh6X_Umfmy}IFnGgquW{N2lEL3XOx!S@$lSHwQg!`PNdp&%f8g7y-xZz<) zKQA|OooD=f_n9k2A|_bn``0r`sdSyD;~j2SpP`4T@Vsv(ZEv`K(9`G<VNO~9-Wt?##oIQzz;&S7@ zLyA2TAli^%fw)QOU5fM;+n6@8aHq;OAvc9P*mx^ga~9nMG=S?3NKu%rKCX703Yurb zU!eM}mSsJ0e8{`nuRHVDeFEjNX z0+Is@#nQkk?k}fP>iMq+7N4~uk`wMyktJbTbiCSR(C})O4yD+0zyGm*kVgHy`xn?? zZ>jS%7uHe873Jaalupo$8?DRB>3iTkzqsSQeb@tyZ7fgk$mxZWU1+>ha8JoeK7Lbk zagxhfr5Z7_Oa$i`r>Aq?l_if^Z%08(oMji#anQ|uj77WugkojZnYNPIYizQQ7J^Oj z4czUQ$i6ygt}*^k^1;1#Slabh8(R)u3*)nt9zF^8zY_=2aonH`Z&T}}t%bK2*(OE7 zP`Zp?&%a7Y^|_bu?|oVbX#U6=p+dQpV0f8d{Dm=uq)#o7Tja1XWT)m%FFuz2`yI_*90hRptxN{OpytBR{C}+D8Rj>2DQ3 z-7;`!$8?6<#MW@ThnUwr>Vc*g!5+?Tc&#zTE6c89VVQ^n;>Gag9StmaQz{jcn1yw2 zhLN$pcoG9Oj32j&f)gOs4kX$np)xFak_*M7u5x~apw;a<6efH6H|h7(iVTaOZ{**G z>1ACxPF3#ldbP8^V-La1^ICJ?+Ht_nGqG63a+45-wggXVS7bz;&uz`ovqy9+Z26p7 z$(OKKUuW6(MLpr6aNm*NjVxZYYH0?=#MNT=JErQew6VMo%E#kp@exZ%yPfc8oMg4eT_l6$B;|ZR^MDQ!r6%Ly1A?@{~`XvVgeMhWgX2R!rz7<4DPC>#N)!#el>=6vsbSuk zktXlGI!99ZJ`K)E&KNiM-LeK4H!PQ(p%gMItlJDlzi_vPWL_yE>KeAegU zmfYwahvlpb6uEqimLc0eR*z4GIGtlriH)pE^W#u^Ok-o+U1DOAx;UziYTKn4w!UlM z2)RapdP7DiuH zqEG3&-SrY$aBcD|2JhC5Un<}m2Q9i?s&KL&dtin+?wZI&GN#=PChmT|Hi;hV?Z7#j zu(G@pW1MtL=zrYisQ1ycqqH!9ODPmXz96?u!tHt(&)v%O9iuMKP|7J^rsY!pObME^ zXJXc5YqPwT`x$S0ms4;x=V926;Uln8jjuGXL_5h5Ow6>EH+l}niwX0%z*5!r58%Ne z`7UepcFrwz#!AOMDB7)$Eb7d4OSe0E(T@k6qGAv+PeOaP1sSfw-25XnUl^`-GJL>b z9N+NpNujj0l7os>n5R$N#YndsR)CLBr;IQ3Gn7)J{D~WiEsZ!g881w<&Sea_U2j`=Pc| zm+aeCPhMFfw!csc)E2M|&a#&m$W{{Ikv+EC8Xca#(aG3cuR;3cMK9cP;aqWWC;)$MdzWT2Yo_tbed@ zI+};hBq~GPy^DB~N3;}=sHG{+NL4&e4)yBg4 z6v@xLmD%ga+DbAvQv0d*y+0TW+rI4v>SBfkTVdh-TUSIaa83pGTx=xX1IqWnHD!-( zOc@Ia((Vm^gi7^=CN8N8jw}>b^qoUJ@~93)80-boi`F|{p}D;Gi)5F4x z$A3Q~2?nRVN{5Qy#06qZn`q<<5khY`fZ=>O%e&H+$0R6~;|s6cnAi35yYjZ>Pc)Bm z*x?J4;6}jA9uybcm%Rx9HxvDnW)oCeW#%uFIp}NfU!BZvz;%5+Ki!hMYAw1_`&2aT z0`AgW8Vq_B9Is^YYNszM{a#^!QBYr|9?p+VW6moVUT-0L%1Prd3TJ1FDeo6d{oS)e zQ@Xm7(%}-)n{&zux;I69y`y^V`7j{7D7u$b0ejq(eC;F4nIbP+lz4lC11ydPjAyJl zf4?gRE*R&XDGmD`ybJ?;u!9e9)SWMu2FMfJl%NKUma3CT7-6`d_$)K-2D3hn-aR2z zIbJzC&YX8*WlR$O3}aqXN|f@dkNDzk2aajAMbb1$@B~=h^Fi?m-4DHnZ|KgS++}-Z zTZ;7wU#Q_|@<(OzX|I($GOGv55b- zO#jtm3r7Vo6EwNxAXoxSC`N1pu!rF1kU@|$oN6N-f)xP3QvIu0+UoZ&|8HR!nVt#* zg2_D$p<+@@hY5KYw|1m2U{+IpNfM$Ejh4mWZ{)*iQfED(G z=!cO}fy7w(02ZJ=9S7`!H?se@WmEY5%l}*O;!veY=mH>n>?ceBYAOI{9YyubLHPs- zGqJ|P-+X2i_Y8Ph;?LQCorstaP`LL1c!>{dOaSmB2msd5xO=Rbx28L57Z zvTd{1`foxkvzdU0fOv5Lrxz{`kj3Jsb{fuC4R|I;dIozVzvm19=&(lrQ}~~eR$e#g zBW5L`5rD)kk~#zvgbbj_L%@a=>?(&bEgh_SCa3lTp`D`(L@@OMFjW5v|1;E!=wjM@ z2mx4*oWk0YEXBL%?SHpAuV+ zoSm@64{CokRl2$8UIc$CVK}e_5T8lI!r9<9qreg@3o^d=-t+?@ z3P1qm6Z`@I7R>(l>HE(Ii^N!%#^7M5mz?XYFixO;rRM7bkc%Y(cf1q1Ega&KoM{PMIjy!Hu20+x*WrgUt00==K zMDj1dSq%VOAQ26C{kaqe5io55^$Nu10}@z4I>ONMlI?0Dd(Dj_Uc@ z|B}$-kVk3oN@_mis?q@Pn*jWTAOHhP{}}+nsNO4RfIpZ@{2u|)Yxm~@?3o|f3QjO- z01$AcBW{(G4oC+1JM^#A{;T!>frYRu2Af$KJlT)kYXEElRY_M=OX&N^Fimo@E0-4X~dxA;^XWY7X%LaMaT10?DxbKmazM8=qe976lEC(TXNn z7mE@r59{^++LuuSUwgk{lEJN|LdL%!uaw>z=_K(Vq0f!3OJ`#Z1Z zq+h>TffdpF?g$=cG9J#__ADA!C z?*lFt6H?zZfjAZbNX0?2;VK#ZftPJ_k^!U}e3(C))!P+OQKr(mZyo==r(n$s4y_kk zFOXm$xeSnZIKm2)B*+>_%32+metr&|MZ*o7T*fKV=rQQ{OnPL`oGZagwG4I*W!?{f z;Nh@~^&q1TS}qm^PUey#;iAHC8WDdB0vihyBZLn#^&g$kEvF|=Ar#5()WaCFAutNV zy3DZB#+}V5n$8tc2Enu+UDpQx2^Jbi!|sQBy5qwI&`Rt5B$5E#JvSD-cOb>25O4Yo zTIfWu>l$t2f%WWksagknMugum3%(o;nwP}hg3Z#vOyD+3v9%NSpLIna9`%DE%z(CW zK0W^uL^^+QTw%Z033&McV#Ppbxk>L*fsX_gmr?XjhttKMcvOE{E+rlG+Vfx{PU41z zVT_|oI!uv%-22uU(FXae>-Ck<$t{Lh)bq<^XoMw!?()r8w6s*ZK+diLT?j7~lpa** z{KBPU0QPbX<1Bw9{=u!Vx$&x^gvpKpRu+F!hOA%J%^V@R74Rz4Wu1m(1mgJM0Y|h& z2ppyodHoMhrI1WW{RzVQJZ$$W6?l4v4ptoO%$-5wC)Gj|nb&BBi)3e^7vGDWPC~tN z=3o$+gRz1-ByN3d7gdeU-o!wTX&yhZO3z6TqQ2u(5s+lyla6^3xJ*oOVjMH!L#;)E zug2Rg$2IF>f;NN04TMuEy$gRb$7GFo^8or9B%YnA})%la&II@t{ zJzV_b#9FCUS`rZ~mn0X=S;nV1ye;YQI*SqwM@|$!n3DK#E(8@4>Hyu|e(4 zT-$r>m(+0*0v(LQeWiFMT7)hdO{Ka}!ji3uf&{~#j)HcQauitig)vE;nU^PSyuu=< z+V&(lm791b~Xpr_* zDFi0XU+0|_NZf>z>max0ai=Ft+N7h;!DA2kj4Pt~i$8djV@iaf44iuV!50q6w3@!b zMYuGog_6=_h?DaSHhSal?_Tkhh~4EI{f02j zJms2~8HcLM=C%tX=47yo7C`s8V;xehk7z0FN*3do3BHGAmPfa7E;@0NBdot_fH#s) z5gyYNWTHZQk$WQP()xi_S4z+}j&h{~>xp$v^@(h4WL5IMgy+Pp(Z2owbtGl28+&p> zyUY)O&m_`XM8nIWu0#mp`!b_2%y-DkdZ^FS!RO}`zk+4h+kn;86wo)vK&m`fPFJsOp>tB8BmfL@tG6;Pe7swPHG0J&28Ia=eVW62fBf}sgV?24(}MdlG7 ze2j#VB9Z>$1D8Vlh>~kX^O0k6poDbiWE&Ddu>JiJHkTgD^JFv+jVAE8w2;F|xEXor z;R~f=k3e0P02Z^jrIoziyz_@W7Lem#_Pt)CqqeZbXiGT0rj7@Qw>nT=pc zSKv!wSE1Z@szEdYCyhzk1cJ!CGvDm4RPKHYy)I~6$@bScr3c=#D92%&zg-K*&5fFR zAFc=MnO(`_iau-2R!?f5WH#ZDGqfjX5E1Z&+5a0_D;+y}4gH5dVlNGLHr`OO6xWwP zi0>!4ppFq476e&%njvfF*2R)#^VyvKR1EzoCg|-9xHN50|ES7}RI>_0>6I=(izp^h z6fPT5(<($Qahht(ZBiKW;%QgW8^4gh3*sx;G&%3j7hsrebmU_* zDASIf$e^4bO>5_mjiW@Lj#CeD7qx3~blSm~O z7qN(K;welK@#K<_arm;Kld^d}tjr(*9L;lqgh6^v6l5D)QYv_mq@Tn`g=r3+m?jZG z=1X}Nvis7&)){~g2pw=q!|?-Di@=#y6TDpGW)DEdx7Vx$`>RAn^{VFcfjrq{t;Q>s zlt^iYFFyYl0O~*$zt4aGbi)>)fyT(mO=#ygT%9!YM{V-Za;SwOIpwPwQqGvi_jU(j z>k14aHPlJ=mS5~MIq_fjz96|eg&&}9CZgQo=_($zyR1J zPf$^Td-pa1GhSdpt=N`)l=B1j^s0z^E(!w{_tRfe%_hUc5~%}ln905XFN#YlQowcc1V_yZS1Xh{ta@+7EW5|k>bs{jCk4`A-A*u(XD5cl~3h2`)Zq-u*mRJXM! zXEw0#W*G8Z0_ll)mKmwEZ>i0^*=+$HE`d1dhJm8bDzz*`#3mhV4F!m%#0b{6opo0C zWnMg7zp;jio8Rm}0Fa@J;7(yLI)=<5`2lzYHqM253bcTe%|)j|)nWiz#vtN3PX1Ey zUN&Z;o=izF>;OQ4V&NV|;D}Ng5D*3f#E~*nAUz&W{Bj{y-`Av$oIuxY6U7`}k$?k0 z2Xc8fEocWFhLG4ffOq8kC>-&yTZlfH%?Pn z()HrcM})As+=v|UGF25TkRX{Fp9w%903+xZcyU8Fe%cz;069{+u-8BzxI6)nxWF3T z^nBP7LD3B?564u|#`O@s=n|dOSxP_^3tpbc>Z=vNIvZE2{87saibYTm;Q90So~E2`JuqLV8~j-Bt$HfKvG7tf|lrT3tPc;(A(O(`&Lp1ALNP(h(AKT4BV124#p% zC?6yaAZS!O&jK(l(9>6zIJfz(9sbl7S4H z>sF$<5Oj4)NG;E=(1v;-QO z02r`E001Mr003l=000Bii~+?5fFP(ENB{r;jynJjx%eWqkJ@bZ_&cR*AE29sF(47B z1KvOY04ySmgP==#P;9hFn<^;hw6qVCP5m#3gPQ>&)?NS*j)1^S7{ve#syqM&=P-Z( z2+sfngJKpFg_wW<000040RSrqiG{ly|FdOlx{Dc5!06+vmsD_e}?b{EtTg=pvT0?m3uaE!?0=WnQK&~(VC?J3U3IYHCfV#1eE((AE7ytkO00AJe+1W%Rwj%b^ zEsgae<>r!V(o0tV06+i%8Nf2#Wrk!qR`?)@rUam1XlYG{Bmka3e!4IeUJL@10009h zzyJsUTmS&55P$#+0RRL&BqYuvqM!j4zyJUM0RU=p`Om?}(1hY{#^*rilZg?8YEJmT z00fRU3&>>LOW1Qt$VP}n+D+lE5?IPCKmH`x6sBlz7m^{v04T~Z005-X0F(+q01ANs z0qC?P(1mh<04P8J0001T)j3U0NI{lRbB5X&sh$IiTvGrEM8E(9KUkw`(UlK)>`a71 zv69IRdp{#26dEb9!W2MyolJ=Eb|U~N3w%*2#{!)E3V;9vH2?+S$^}VW??nJ0KmY&$ z0D3@ve+Kteopbx<+7)=TbpRC@KnaMz00k(36hkewbgG~%4>5{TxDV>VVE_OFtc7_i z{oRR$6extj2mk;B@Bjh`z=Q(I00=e!1Y!U+LPP`%3?M)N0009WS4|px2`1?Su%`x| zhQ$d$7!H67y+8l}-2fyC4(-coq2{X^H3=wnI8^`u005?%OMCSnUO=G?0000000000 z00030!~iN00RRF40tEyE0RaI40RR910RRypF+ovbae=Xsp~3JF(cvKRFi=4M+5iXv z0}%l~5EG=PU`R>a&ICyldG~IKr8wLp4AJQvUw36S3ZZtfGtJl5kO+)S!J}luxb4D3}@_yh*MT;D)i*ep&wjkJRZshs;6$0Nr7zNU%A% z@S0ip(e&PZM+P=$4Bn&^A4*B>&w zz=H4W3;mQ<{vXuIIs8q5ye6?L6Y|%uv|RrH!%OL;_PAHopZ(FZLr!rJWPwEC@QUt! zG<`RpQNfgBC_=TAXT1Bq2@G2Ygo2d(dq0*2Ezcj#ePoZmA1BE*Fc>-~`qF+0R;a5dS6W^wfT=D;(zx@9~(0m;jcM! zrQ}6cuoB4`Vht4g3`;4BmjoU$fKH4cQn)_iem%F!0!))orN3EX3S_y-g>_H#7Su{< zpM;6Y@jds!5ut;=QaM_X?pwt7KN3XaUosn1wYNX?`duYFVe-T%@0tGq-DN>@w>g2@ zThxrCi7|s@Cv)X7Jw7HxxFo0oK-~5o2`zh{hBa`9wFmRo?-P+ai+wRtXiaJV0H>Gn25-Ex$oQZA)l|V%lW-nEG=js#VayMM zGx}I(;E`%!1aX1kAOSw&ehM8QEGOVmvR61gG46k2y8FSMXZm3$mGK1!G)3_A>+==p zTs+<;^qbrvcZq9mf9dCZPOV3y{fMKl#Qy;9h^XqBa=s6e1&}USTZg@i;|?t`J(>75 zj64U>qDw@8@H~ zQ#10ZxnmRm01Y8%44w4%sqTs4X!i&v;BEfG%x)&)LGKg;(zo;Xc%Ag z(57{-A`z2{XN(lK^Pt&eAXEq_k(k_{%3iV>K6CMBE(13gQn7PQXXMb~Kh-EK-VK)_ zVRKfzp0EX>Uti{N27}bA7u&)X+mfgI#Qy*;r*-=Hnj-%I$P@;!XtCus!H$7~B9;nY z8fX6iLCbM8AEN+9wtA2qYC2*iLKgR5NL6lr=&Z=8xshF?Ltkg*6fo4;SV-@q^3SQt zIw8-eiTM<4fG)~=#(co~#(r1;RF)C6j4ri$iknAO_2no(c#l8K5uf-1&-3rRnWiRy z@t^pTtxN}JJ+UC2VZTV;tp5P$PYGEeQ`tRPe+2anWOMtZY&mM#KYU0EfLx_&t;<}- zM}GL0mOz4y$4oT(-DYT|^JT(73h?=2!1~16YwUQR;a?cvu3&V*=|9R@Q2=M*N!nDN zsqKGgg?{QhpE82FDgNl6>)v@LnY`)$0F5siPtIrm06j2Aqm7<1`t`#vss8{@baq_u zY;xU`tgO}Dxh6jQkg-eN?l$T}4*sCJT{JY_>xJ%Y+|B4GCf?Bo$x`DO7yba8rA5ZR zW&$ZWv87^WY5Ho;m#k*5PZRN@OrE*p`9JYRWV4YXS%p1V-W`XuZ}lgm4YU|gPLuxt z0)LNl)BgYfyl)bkpPQfSXVqQxpZtcp%GPl>=j02<%TN<){aAFE#^7nwwkmyd%Il0y%2 z9y9>xC`$v%3Zh@5uZ<}a#}d>ex91bY7f5_9pCrN%oKn>2L(0mvqj(i>X z%7`p0pPc7# z?{)79d{1IS+daSxy>1tzKf>Cx{5c?>5kJScfzS1btA>BQr}!d7WKP_UXPW5mvlBJN-{5$gdQZy`Uhpfq z;pQ%nQm=S=V*|{mM+>XrX|y`1HhRPl~%xU#o8xy z6JO4lnxpqw`LZ>ZdX)P!co^Pox&Hv{aK_m;`lq|8v zs2~`8DPqVP7_GfqUZ>lW-@as}2Vn6wbf17A@qx&_8zltyTH&Ynv_Mj*4?sR5akNn2 zwSEZfVWp+D(R2hU6`|_r^H1x6nfgk zZ@m?NW~F5vu^kSAy#m?!7MieM3w7-p+JE}&_z`3$+PbC%_i~jegATN>Nx+llHQ5#{ zh8>65KktzpY*KR`qvn1a*iF4B<3y(2u zQVXAuR)~dO@KRa1(;j6dxm5ZqfB(b=X{P6~Nkr(32G%+r#H_4t?YMi=Z#^}3&5->e+e z{A0Y}lWC%mSFB|=P~&JC?vRvymVN>iWOX@xFVbpkBh+dtMt_018pf_a01V ztKgSY{aR9go0t$^N$}6`A(Fy|5q3WE)&d$SGqKQvWyrWips*bpDCK&-k#AW*#vJ-f zI^!{1AO&fnb5JJcDbb_Xocv_S0lHP4hW@gEPzIf>v!=R7X+Zf;i8Bn({{R40Sj2D& zeyxagi)2`%x80(s;&_P-6Xc(Sia)I*0iREk3)Xx0%=`kMOcBa-Wi=osnl;z^7jR)v zBJEm^W&Zsk0oCpto@7F;I^g3ks-q>81@n3=z0qF#CvW4p){BqBGGFu0lJleZz*|+ zS^&S)xTdfwR6?&wboNjADXS%vj5^%ltgr>8(SEdFNHVmAx?0zv;xkx6-P2LYZlt!V z6doCbglX0yLXv;#mfS}%6eH@{Dhf9N{NV7@Q`Te($H^30(k_kSs@D-rjpaf*IOpi+ zh6SVFzGb(QL+OHFeod+s0RRn}5d_j?j^i`yKL{apsmCZ1qI^e}P8HeJ#K9_Cf-$Gu0FGjpB_te#^P*I#T;4J)w%jgS5gI&MUV_fO4;QT16%_MF}<7fI;aYT`P;3TUTFDhA$?0^CT0QeKG`qwu}sIsVD<=;i3)ONDl}d=&*B5K$7*e!ZXi3z?)rX5+k6CKPtd_8YdNI}Om*nW4Evd!Hd_9)1%N(kI z;=^p%^-;fS%=h)0Zr zs+v7tt+|kdu-~`t;<{@!=A#77Jd*)Fmoa!V=%3kkTi>h|9usStas_?il?NRA$65Gx zxF{-?91<#?!_A)K$q%ZVPx9+}f0i1NH_vZa091yqzY+>J0;#MQ-}y1LSh*BXcAuIt zjCz{Ak1;#Y7QZpUs8zmgo)}M9j)Syg;a(xe3K{LXvEQ%}nzNxk7;2+qLK)T9oj{ddDGksmC&$Dm9E4Lmal~K|Kn!#cHkS(}r2kCK?r*K3FZ@ zTFQ{k%owZvK&p*kD?vZr{2H_B*o8n{B|Ab``l2xK9!P~~k&=?n5MrQx0i;775I`*0qnNswIQE3<~eSRY*q9YTVBHn@3Wk94*5X0+(jTZInF=p^AOb(rF|Uf@~ojX;;O z{)A_n`B4S@J|=L+o^^-Tqdm2J@uVR}ht<(~OM*1Zz+3gM-J%r9&cH2=2OM$1dd#<7_hx8fog zG3qt=l>=3w$Di&LZXybf;fxLkmnrWF;#_B+cExTY3Q0!FU1Znbp3Lx-H$N%96Bk%n zwwgfJvF{xZ)+MDTvD-FByAaEG7EDC4@^bb$F#EfLV-|f(W62sDtd9}VYEq&?2rwo=CU}~t|li0 zF4!`~27rUWHS1RMSpNXSJcJr_x2tlsEP+~-G5-J!A9an^qNh=49CNR3EX%eoSpCa$ z3Z8oVS$y#lo(6ZpK#IEgP3oy`!(rZ-4B@rsORkvA%{a%pQx05s z=>QgAf-Nebt%j{|#`D%N1zOV}WnP?PB-I+wcDQOURO542sV%PE)!SQQ6wzXuv#8>` z%Is={$y|C?cQ9NY#n0qtAHqdDq2~5tJfd;L5gB{GoezoE;(M4M7E+OUSK)A1-C!#dm zmN~{tdiqM@r3G##r#!fKflA(6mu%by)_xtQQ2@(H~o=995SP$ z$g${Y^^Ja`#+3zZN_EutiD9exuXtNEAtJT}Xr+$O%h1$)*coL|j8|DY7tg#RmVkVo zW#)bzVg(;|mdTB~>*)y)3xCo!j(B}n6u47Q?Ee5a%YggoA2WYZ@$Ue6Z1>NJ7NXHr zl=J>aLN54pfi4<|6=jkhhaT#azuy z(E2{kr|#vC5f;EG`Ce-_mDs^10 zf_kx|C>+|iV)@{SAuXeBxt-I2o^Klx8CG(AapY?B4PcQX((uG>FSsdVC%NtQsGxKA@Xl4w+!*Riy z>WwB}{_8gcReDIHF|&y0^g2CpFHO;j4yFf#5r*+qo_P7p!3(T959%0rQTB=He-OIN zWpyk_ro009h^2S6n0uo};$J_>v=#5o8ERJ2rz<#x4O*u$Y+$Wy*QoxOtUM1#B&vj6 z*E~K#R>vFnmKU%^M#xd+PsL0mwN>I@m>?LZa>BhmSzMG^eJwoPVBE)SM-_AM)2yuW zh6R9Mz3~F2T>Bi;?sA^v;f>IIkLrJyL9_alC3?R2- ztKUyqa7BlnRqT&OIhAU9%&pJ}4SC=Yus-E_OstZfgYJaA6sMU%J{WHE<`nyq+FG}b zq0d=v%7M$}`c&1(=b$}SEUq%EU=CvH!<}qmLtvrE()E;Ez2?iWBE8v#9{!}hLeuTW zUz9ysn((E7zsMea2iH15#i;dhFBeBV-8;&o2tG)Ztw6gdb!msyUaO(VF$y~Y+(0_# z*_y?Vav60Nsh}F>I~&$6*;DnZbwa~Tj$9-t&C@FI=?IYR%PND=wRO(GU|aZA}vYm_3dD$8qbd`-eDm{58l=_(_TIO(5w3i5~>8U8~|>|;YO z4dBOJs{jJlhe^zWoW07_Af}U9pJwWS+6z=(ER@qRLTcY#Ns`(iT)>U&IzCUBw{klX z7^WZ92WM$Pu=$4}6^=&`(gGwv8~9UfqFn29oDKf~$uSWApVOF>O2;I`28UbI?}(08 z9G&GX;g^wMy{;t%P!1HX!=95fZ7b55V5H19AA)hFzPXG>Y^Mg+c{w35LDI;uS0?Q0 zG5N*^6%Wn!ia|{**l5#}`{OHbSm^^&wtaMp#$1BV^cAl4Qq@y&J1O-tN?n@t{^9bD&6M8$;l@tKF$~ zy~B-f6=-l`q_s-9Rn=hHXy2k>k%5wm8U~yu9b15-S|>}y+f)_Zub^-su`2Np#Tpu2 zYtNRvrbr;K8XE0)&S=y@who%x&4#nHN$=&>Hz?Kpuep~2p=kCFulBW-gv}kcj5+)5WhsOBve!=U$9Fon2kqEc$(`s0dEtO+7%Jl#|#s1 zNQPD&c#h<-!C8etB^0KyFEQ9+!Sa7mfZ-_ZXT$9~AIBZ8%!?_c$E2aJ(?R=}?Ey`! z(K?NEsbL&%f4-8(aC?y};sNwtNr~rew@z8hqz}eCxK~^=b;IjuIIw&sIN>i^Z5qai zV*S11Sy6zuFkOb;pYmx;b**5GmmIS>_bMuRTXv=TR8(76xpJYdq(0XuZr`BF!tBrR zRl?ZeRqL3yrWHf4>H_$q0Zwf6uiOxw+V4k;OP8Z1e}Yd>u7LCaEiQkw!}8#y#=^Ya$2VW6Vu{Q3I&|YOm`AlFwDB_ zS6yD=w8&pn907NrJFwYq8aM zm3!8;(&dsnrLSPmJLMj_m3i4wCD$)(dOBcZx^u@IDZGJcz_pDJ^=*S&E4o#d_gzJUm1OS-BaPe}wjk$o%o5DkpVguSWXl&$ii2lSmRai6@0Jnyud)dV}aK#>7p4>&gdoAO#_?3AG(FP z02+0GFr!VSY$sxS2~)SkhkN4;-B&ZvdF4hwJ3E%2$9 z5Z6VGcLp7KZTbPa=yD}fSXAtb3(If;Wj+qOM8~CZrMuTnID5)P;`R&plnyA)7#-Gu zX5Ll@T7}xbzk5cC7l*?sT5)p?;NI3M9$v((t4A7dF?3-60I^YmJWaKxp76Npnbu9c z_U$UzGz>*dTYjZvJ7?6HMEY6m8I79}qnTr2wQ}D$T9&@Y%yzbfcCJN@-#LUYXxPqI zv{XzuLG|YgV{tmuHMqWXg?($=Z?yabh`&FG>;J;oDh4G?Z(~$Mr1%dzvsAcuGRt>n;n!Y`%4X}q=RJ>KsSPLrWs)`-O)~)e{ zRYjb`+9>lPStW{iB?s230=TN~n)No|%QM?AdM!N$cjYt2!rq`L4JyZq=BAEe2LNU3 znR*qIUN+OxcE@#S?MAZC7X?*OL!b})1_wf2!t;4u0am|q#A!P?)O(E%_zE&w z+!UG@wf)Ark=qo9*fZ%H$wR-)w`M@aF8rrXrCztDp^Ewbo%E4yS(BHOqEqnsN2VwA(Mtv^QJC5}4o? zQLgA27JFY4Xah7yNw4Se17{<`3`2 zj7@qNu8wKuXu#fnX{qnk7I4W=u>h4iI^p>BsF0>L{Z6O%5crtqSG*R!5T;$yjJJ(# zE}45e#FS)A^e7^rVB2mGE$GX&sfkLM!%1jwUh?y)^8-c2c!V!MD66FLGasc*8$l=L z=HdhIZ?1DVU8~X+27Z$syXF$yQ(5m6BUQeQzY>(%ZVycPAUx&4%xcpG9)XN zgSxljE${G}HYsL1%;%mwA2PH`0pQlW)W{Tu*E#9&(p-)&2J81L4#54(3YHpjSu0oJTp+Okf%M5+{*T5A#pM3{gowQ6mb5(Tqdyv4r_MtbB+Ys z*j2*X&UB`4eWihu$S5@AB3|{RUR1F0ckF2zn}oFU@ivSHL-i>Tk8e^JbuJD?Us)E` z?anmG_`Zoc#DX0g`j5n-BMt@VbC?XwV32MAx`*9GfON9SU?F^X)R|v5@dMF3B|~uH zT|vIaKKG8g*c~dOSUwCT@^@ke7RBy=IeKt;Gw?Ax14+5C^k!nS^ujTHJWtIg88wpN zimQwxo$`wHBuR4v%zjQYfEPxCvLG2Zq99P=@Wd*(cp@t6@hz$W5ZvR`)Rv>T@Q6CV zdI?evu>%u`GFIY(S1TC2GE%r&d`l^CuE*+7IfQF;`o(?DlEoUu&&4ggKjZ^7iRJ(g zDOrqtxiI!m5z_rBluj)#t^WXL<*HyC*naQi))_CX!F4G+BPtb+u9-RBo{@^y&szTg zwG&Ji(6|EDZ)gkC7i-^6(HJ^`-u@wCQL(@Zd`87q*DXJcYEa4O)}F9?H*HDL?WPAa8UbsZt(P37 z#liSW=;E9})4WDjt$K4g6@z-W7)O1#o5M!eHEx_Z!x~1?@0Hc6UWMAwWoFv57F(Zf z`so12s(2p^vq(7Flh|fKU0B*z*Ihxf%el$!jwt%wU#$aMm%Z<~6 zwA?mip>z=ivM|m_;M2Y2{lqH_Mutbp{D5(r0c+wpEYY6G3ef~jQFqgf9i(;D{X)G) zW1=GFhJ!`$A@4JPhnXpwLjCk}7KjCjqB=kjFcj}pL;%Yg*lh2_?ZN~(4-UV$l^J!# zUYQd-HSMfFb(x2Q!w1lN5{TbF5~>!xbAQLuCkA1*bbi zC?Uj^y4R0Hej*{)4@z0-i-%W%>Vo^g6492{Tj%$TNN6Wxcck80Ta|)4D0Y}2q2aoY;~O3LeytG0MyoCw_o3+Q##yItvXTkpW6TZ^(( zbPsJJszE}v0Y#Z}d{uC5FKuv;;$w58p*FG!xgP?m+PbVwCECk{3%a(|8)CJC6iU@_ z7;&&&3~6@9b4+Pis+R==Ot+NMCIfgIW~%pny6Y@_s5r3G0j-zjt8MWO_Y1zGEr>b+ zO?BrK2CaL_z#2K#U!T-Q7OLoCP&7zj+oo`H=J1tz${aIt5{HA#EwYcTWg%EIrP*CK z&e6N3s^N>*bM9qHzvVKUhioS<5%-mSY%Yppvhz#g#chyykIxiiw9Me}g1X)WR|4)o z3~y!YXf;@PU$09dfGw)F)vJ-`(uB_uYm$L?*sDb@z41+L;nr$ zT*{nfIk&zVS8Z01l$PVufTc>)taMq`C_FL!r&} zX0O%5!#0jV4_jV|9GUU+t39*cRAx2Gt@I1&#v!l;8)uIe2OM5RBq&C@xQWVR(7HGJ zTr!z}?3)Ux_pZ*+NnS_qX`ibf zQD;iCzi4aVw(9eGJG;E%6M*97c)i%G3kBfe)ob5`RUprj)z_{i#<8_+X=bRgbVv8z zY=Vo<_Z8P84NXh2Y$kMqY-cWV+iyNOidASdXa?27*N#}JAaUWK^0`e-*!0%EC7@Li zI8~8YWmf^AODg2Y9A2qahB=yI+bK|@SNxLiuY zEW3%poGHK4iEoOXtxKma`$Sto#bIy(dL1>=6xB-aTWZ(kW>j=ID8zNO?#iY#&g5!? zjpH?*E+f>%KlqDwfTWC!ri)N zx7)A0FK`2WRM&kam2az5=IfqJZ^CMDOzEvZF!~e1Oq#OZ_X4VS!yjf_b+%Ogl?bqIy&8-?-F@o5BLTqy)o#5BT&alnI@#t>08!Gdn4&%(g|IU0s}@gdJmZ4jo)<`^^FpF9|mhM zgcn25{-6!v^O)8hui61+CS2_Ny<_0!9fVH=ahlij%tsx+L;@=4W7qo~4`JV{;F;r% zA4FxuO}p<9KIYS;{DWTy#I4NJo7toH>ngDr%rwzmvim@}2ud!}xK(TM-dT&R^BH%G91!YwTbz}!Z#qN}J=NW2JUr~P3Ry3o}IeHgd;wfiS zU;?|B+o=lHFyI2?-4PkAm8AxFCzfOk)^$~VjXK`a#MlRB;dh`8ZzQMHZY9AA;917( zxq>gVr%Nvq@NXSx)!Xi>+W5>Lh2%EQZRgWi{TzX-Z3;N+jk&R_+j%xGVfShqjY8^f zPC2KrTNI2625{%Tt9$xEDNX3>OvgYpB9&}%S3Di!Jz6w7jW6~6hUX92=3H5_aiCXs zEqJ_fEx~Vau>Sz8Z~(%uk($0)i4&E41$wwoc|f(Np&L?#9P+I8m=~MYHCbWX6&=TF zIvm>RipIKe9PKbx3sr+}JZ*w9EmwBR-uBH+)*?plO!GIk)#6yV9PB0NKw5IVR1+)3 zQrrbCjm%-*Si(>ZY16g+xvU?1v^XuDGtQccRv<0OX6sAdGQe}}ptX z&oQm!8kGXvZ#v_Q6$P6O09ABsXb~B3*gPo%lpbyv(1n6(p3CMJF{w@IT(0gmSm#ww zA^OE(BJ%3+_M^1+M}!+9I0u|b+Dfrbr($FUoMR&CdrI(ZiE6LF%onuEm3zQPvUrrV z(1nS}Z?gt$iqMRmSe-$eL%~f3k7dt%usg-Czv?0#ZSfRqj8r2H#WuMkbl;fGe?o98 z4xH-@amJ|hzrz)0LB2HC?mxiMFAI_R>4=C6JpeyG^C8+586NdsieFf<@!(~SdB-MS zI<6gu$u4IkQ_}}bz(E@u=U{Q!f=Q#`r^z{Mm&qn<1CEG-t#15xWz#`?df_i%b6%keE3f;Uf9?G!xmm@s?ah~~;Ym@TRJ zVCG$+xcFtG^>Kj(h#r(;KI_bl2fVwr))Y}Kcf4ZOHj*ix;hK3sBbv9O zU?8AA8HG6^t>XU3?Xbz6_!DsxUKGC9b7bLomu2FQq{oVTS$zTz)F9{>j$Hhp^(({% zv4eM3?y+^lSW!!stPQ$~9`cYBN2_HV=9%GUt|Q&4i~+A47zX{W9dfP17T3kXK&>xE zk}rJmWgTM!xZtj>^fMfM1r2Xi=r5dBL?0H{TFL>(XCdVq)I{+j(7m(qm>6zrVPIY= z3}Cx!IKa!jKm~3PH)v=BS*xMOF6d9I&N9{t23nvm+NN$q9e(Qq8eEapze#&t`f%H; zQ9;s}q07B-q}pM!sM7+0#pRyR*LLkIYrVeRBizj&gZCJ(WLAax31ZAy3efqWs^yhx z&Gz9Jkf#=$y4Jm7HJz-rb;D-|Hdg(u1`Dp&jMT*9gATkQ45@I~HK$W}b_=FV6k~=6 zxwSzvsMtBBZ-(j^njDhykj2}b3#fD)*SA~C6`q|~-%4SZ7%Kp2oGtD~w6cN_jvp{s zuz zv%R>Qb!XfA8COc=Do;<;r{@$E2cAU=Y;Kv}C!c$Emcr*Zg`ZvcCh=}-V{GIU4;*mZxyImA8hPfW!) z)(=)<>rmed516%93S$M+xtI?O$E5mUg=oT9-7I~PFaxFjpk7y{H}L_Fi{?CTeP#R( zZd9RFhy|PZC%O27L&5-OHhvju3}ZgO*rJmJWeZwsjWy!q3#!+yBIv@tkR{_)mXH}z2VNverC1Mij|T6AUx8}<)==Cc630@ap{t)a_jOXn1)RVNp6=1N=sMDW6f zj4Q#w=^Tx~Mi!kL&})#*XF~;Gb!QompNQ8tNFash4@<;wHH@8~`*5_GMa9?yZ#jFc zHXCDij&JT`2)54v3h=g${m8878+&cGoH5oOTIp%2VRgabF$gdg*P8Q`JaRZ(wcra{ z)rN+R4n1M~(?(l$mI>8+<{~r~pE$J{rLx^XMs=fV+VX3x*2E?t}OyiLVQ zdi|@Lpg4AGgi`h<8tWhA;W~n`L%FxjUIT7m~+wN5IbJ^fgMP%jd@Md z*gJW{%b25*UBK6C(z}F`(VOK^{Y7Qwi#%6hqv;0kAvje(Hw*P)IzI(99#Hl~tJ;^K z4|<%10mhuCtXcH6TuZN7h$ktFwFkR3x_tyy+K#c*WWPE0_lT)NJt%M9j1y z+{@n{V@%n2WqhhPzPR+yq&XbFc0p4A09|#mP$@UX%4c5V3#*mYSsUwhUmK?<9Bu6! zra4mL9JDRQlFF);vqRZ$nwTiF$2ij3N9aJ8wQbB}lL++-@W$*`y?>d;hXw_Dz|d9H)k*bj`(`peG=6>92UIXr8$P%m8m*(|A2)+K@Y2MtFZ9jEATU z{Bw>j{7_4s$!_G&Dqno!jA^CmV7;O=G%hqaXV)Jv6V2Y5_lWB>m1z2`W7WXr+sP=? zT0A1FnHa*jqV~Zq#ESHdV{~7FJBLCL1@hfdfoz~~M7rBUlxs?V?eyEM1-D7!4NB^{ z=@#gof@%7Z%twPa))`e~byyPTwY4{Z4>gJDN4fZbSb@s9zW7^?b{(!}`BL`b?^u{! zyGISLt67FjDxICEpbEk2>l0v0I9LaKyGjT$@RkEAo}mw0s4I(8fL*+fGhg8&Vk+cj z-2;l{Z&I9F0m!#8i{PGtR{BhC6h5%COBU!dfbCV)a}{NR+UGKWstdJ+psqpPS6FL} z1Cp)lm4JZOn#EeKLu*#vu?Gc%y5_qU$Hd@pwyZCO)-2UtF(g?T6x|L0$Ury0ftQBn zu)xL9$Y%P{YVV6!2Rf_j#YYEKoi5wu%PRpI0-OeL`mlR$J=}l*6nim^b&Y_); za)ZFM1Nd^4b94})WW4gB$`OXiqwCsLsI5i1D6bkuI&uJN>#%PS=z-!Sl|{avGQ_gw zc{Vu1SZH3=oO)g6YdTPRJ}<1d>qN%Nzb5@+*zj`Ed;@ne#36tT@;PalSe|N_>$^vQ z4;U1HMz_%+wgl1yz6aoiy~qZeqPN4~g_zGxtmO@`%v4x*b)&?%DQzZ`$HoP>QZKBp zhi?$ptA|QyFXZ&nqC4#jM&R)s=n7#B;kOT5!U%+eRsxM|jz`i{3WF^JPS_XI5g{tX z+;*|t`pP|ddrSK1M@#xkY(oz9?KH^5M(E1_08iS&{{WNe3HMlvS*A^{in_j70H(nn zHeL2?ipMn_t)xBAc!29enPYtTFAaj97$A`?=5LuI0`;#$`owcSt-lgD3TRi7Ad9_E!!A0|_kO7YZ9vZ|{Ua3Rc#Qjxy~IJ% zJz&R0tEHjhZpAS3UcO;wh~y0~@L8E_XiPJFW{!E>h(<9l<9g#<6CdtIF4xr-dq zvt0g*E9{tkKZ^mWyAKQsIl3O?0pN%svu4|#5m#KLcAKl)urFbTih`{i+t=+yFd7Rs zyYsAM3SPxuWnxj=xKIP0VR==9kRhaKhyd=ZFJ_JYZM9Dj*6`ZnL#hJR=<%p`g)-%_ z#Z&`zjSLlK=%AjKW3)xPCb!c`VL&gxtmy&oPwohT)1EPHTl|#dsF~y8^ge4 zs>O|0Vy~jaRo9mqacpNV{EuCuOb32Ha7M_-$vC@hDZ;cmvd0Yy7MO27-C3BifqhR^ z-}wvMT(!2)Tw1#v)L%DahZqN!x!C0Z6tMeyCaaRw$A)$^g4t9Jb+6P_ZO4(lBS~*Z zXx^J+q!if(neB3vG^aMSdb!4TnB=j6?r@Wb+UBTl3I z!f6^sUdiS&S7}k$PPV2s@`9QTTjM8DY~m8zz5R?`*Zx6ZQHu1KxXr=ifQ0)Is)s}c zcTjvD(u(!32u$aD1?i1iRAn54wkzIHjR`Pz^XC_1f9dltO7QnF2YSB2Pnh(uU4MQ$ z!oxy)QwSYf>206#BDp`F#8CRF20sBPa>>ee$ zY7bg`d4c8GqN7KuEL4lc3=VI$d`g7FUu~ssEWhbd)qT|h_oLo@=LQ(qryQw%g|V5? zXE1%R?6 zRRP$mkPKjkpaz1RpgZXT+pf#Uw5yj`OR1~fuYDs2TbThxHH$YoMUu^x=oCUV_Vr`p zDL^nQo~s@R8o>-ffTg+?)!Mv)neuYp`m1g9DlBq|R=IzipjnH%+XoEglE~zxIuhOQ zCEHVe&`y+a;^D9aU^4N6&W|uTYkLzmL;%kghS-?9f{l@N+7sSC09s=YUrI3?yeH+; zMxG)vnTx~YUh$}NWMerKTgc=Boz9(IF+c}6tG%sB%ymVCEJyrON zLEQDoF_BW;IhH*{U#tW)=*4T(;#A_Dxs%Mc8WGy)y)$uDVIO)PxGzeh%K(iKuS00h z$W`ZK$%I2icQp1$CNx)lz3Om~w@XXDSRT;~s}^%@?1|dt4$E&*C)D?e9R>8^eQ`J& z%EL^(aC+QYJc&tiE_&DM0<$%Q$Iy>`hqHo@A<((_W~E&Z6iQOz90Jk-_Ap9~1w7_D zOa>RxZ`}{OEVRprG}#vW#=g0MOI6DSHux*%JX=<;U1#4~Ffwd#c10S>H@NI|9`L26 z-*(Swi$k>)rt04R`>P79q?DDbL3lDHhD_Tw8uG$V<`$^9y|VCeD#unUcb$Ij8C z6a%#u0<_cFnUqn(&Q`6XfNJwO#7$uW(9CQQGPeY5R*JE2G7t{}hfSa%Mdv!#_udFZ z#Y{xY(cqUy0@^gir!Z>qxG}i-?GXhHNmU^OrOZ19*0e5w6n)+Vqd|Is6b7qDO<~o6 zwc``3qeFVW^_@4~F|7diFKLyyK4Px10#M4t=K9yC7!yHo#V4Q|uJXWS)l$GH?i#FK zDJqwxe7eOCYcUDA0XoQKu+4lI+BsAkSp|)OL8nPv5_@Nu{1EE5@=v@9Lv{?64Xv#n zwbo$^!_m<>k=hYbG^kbbP6G1w&rUF;)Cu(oOx$rG#e}YHCyekyYN!$1FkHX|zLKny zBA{=w{{W(EfK+W@waVNO?uNaU18b^N6RAbH~6%NwP1m*UWaD zP>NW`MeSjGzLZ05$){B}>L!G>9ShBOCD85rznICqS>lm52ws9G!gRQrDhFry%R_}8 z^8z@tu)AJJH!Bx05l)f1s38>d!!YFvttaB+qYmz*k0>~b`bndz&!2^MsEJU>!Y&|o zQH!M=D&eS8Z)W}>wvFWls8Pj1;@Ej98y;k|Hbc&b;rh#M_w7MnYY=AA0qPl;Sf%=# zQWqK;IfxhPCujqCK4aoEEL!@u9RnSqYlCXM({=Z!8J(@W?{}AsZ#HOLxn99+L8Kww zKs%`xLAYk=PfGQS5(+7;Fc-1S=nz}m+AHkbp%YF=n=oI&QQ>%`xB{{WKV?OyB!QLHfL zI0xoA3N#P~s%u&0d}gsitBTtc0be+t&|)Cgvz%dVt)M&R6GU8wmalJsB8Mu4$_Q4+b!=07yke>}Re1hp%0Heon(xt_BE zIWpDLqroyoYJ{GWz?MU3;R16+K11{{KrlwD4vcprKBXQA38-+CmOS`lZW1NLPOE36 zJS1;iG{n6YKFq_ov3p#s+)TExs(5naE=+>1Xfx7>m`Ji99;K(N1WSK#lp?g#-~N+u zD|`9x7%io%d%@p-&DVH9+hdiok92Yf%XL3U zUGG+)i+0K$wQ$G)PL^BWFc@JN(^WI`iqkOuYOB#udTSbzL9#pGCw<^M=|d#WHN}RS-PB_^R63T$-R8US<0z!Y?Mn^y;X%AA zC{Q&wRb42y_E@sVH?9N0#+t-Cy0#Nh+{Nl#HUeWnKjYUkS@gJ6s9^M_KX9mus4~;L zvG3Yl8CV?MJ>t|At-NV;ao5&*tK}5X>{w8&V>{^(8lsj`?nPd6@lYkhh=}eL9fMdn z>6i2o7g+)+s`EnSw21^BubyDJ$gR1s7T9?tEKeboD8n6wq?SHsnfII-v_*T{H6<{~ zPqIU_&)zWAgcA`cwFCFkXBzV1raS8aJ0%P{{$9`w3)#6@q}ltXW-NV(;~@Rmie=}~ z!W)fSc@7V2h8qxf6=uD%c7kzuu;H8+>Fo}Yb#VG2e$4n7;^eNHirw~&15K;DKKe|R z;7_L=xN{>~xUY%xEanj>HsjY3Mz6$|DSn~T_LZ8--wPjc_JUsp_h10n)3EtUfSyq6 zm+jgy4yJc?0Z@DCv@@`T>0`*vLno5BJbt!?Ii52DT*5KXU~HBfv`RBp-iiC3%3vGm z?>{bd{HqMI`(H_Nxjx0lTIl+ORW^L}1t>%NIbN_0wNm!cFWw=#y$fIkZL0X94`sMY z?wx&cVk1mMuJ!npq}~AiL>?+>b$(*)fhNK7TeqYPMi#3+mre4_Oh8wcV;(_*JA31| z!S^5BV`Gc&w+QM~vfbRg?Ot7T8k*j;G!E^Z-ZK9H0^q=;Y1bIxNgB2?`0b+Rjn;nwd~&rM=K(C6W&xCFcdb1hLm2u8BtxQ#gthHEdQ*@6HoU#^Y8eR>tw7o){T7uVub;#M#l~l?(TMBY7VpeV0 zmpe2x^|@g}P!u;~YfnxG2$c#0EV;U0e%eO-0vBmUmDpX{ArsQ|)pASC4+1)L16To1 ztFG%5B^I@S>kM-nI(2*Xl;GEOrWnqx^ommM@uwx;Jf*Ur7y6)^1is&R!f=9wGSfBhnqP&(n5E7hN&k|W~uZk5_F)Sw~r%;H)Rvyyn z&#Sx0`(Vb@af5^8?$*7c4XIC{iX3e6F(fKFI0_PrlwKASq-<96JwK=e7_30A(4jg} z?eP%^wfUeE%ZtGO0GRL!Iq}@(f(0F>94_nTBLtp)@v!d{dW=L!ND}+g8mH}K`g+3V6Z31B zJP>mY3)3g4$~&w2KXEzFpZ6%URY$13941ZT_0^80D)2Tbo}S_myxw>Lcko1mN$X$8 z`;UTC?rN<4_(CjZ(S&oTxxaTD!qaXsUfyk#271)c#Ukd69g4j{%@ZQ0Nky$C236_3 zvc&RNpx=APXzK>Ral?=Nl-6i2g$iFcweyCuvu4@OjRSYBL8^v22tA1qHfY2Y`Vk01iP%v{ZsXF2Qa#HF9QD zY+39y|Wuq%F5>ZkLPg77(Cl0Gb93GWy1Zu_RV( zm2C~1)_166x%SWK9bkh1v)lP7;o0FT0&*?$TKMX%dBQvpK)T6X;i?eyy#v=15x_cf zXu6oUJvzgMVrhdXtKQ!hK-~%qf1dq{xQ3X&H&59WxB& z6`xXQ%3ptuaZ?_aFXZICrvd82CcutPN*)cu#i=hkcj>oSqnd2}IYbp`isedsjq-p> z=?$%Kh8>G}70Q4Z#Q(5(XBULnA`JxoMYs+L^Xph9oH-Xdirg$`~ zYc2DAW2o&DH?#i$VEEB@TEs(}ura{CbJBU97*wjYm`92!%O2DtQ> z{a|3K&|9UUS55>vhXmG?;vC^x2VB;J0^tFj2Ce6=G?eQScJ9~;aC5A!@`9^PKc0~l z5tLgL(^fi-YC_b`Lg-z-FCpR!&bq=D9z&(47i!isRkSp2OM21al~G$;RanDd;@iTx z#tEud!s+uKl~rCgjT;y@W!l87I2G={FtgWE+zPistuXQ4Qb6FWhA?Oa-uil{Ap0pU zWzESztpvUEf4GNWTSEqKE`~VNq!DmKL6K>yrkpi^Wwpw3ie9e#v!p76aHR^qyr?EKE7q8r$zUtvObDknspy{?0oi-e^pon@X_aq|PGU>ta&r47t_$_LMc? z9`~55kX=@Fqi1hRg_u?NGu~sceLxSx6azGx(A5R@ujBg|D%?+J^#?co{q>ZCK%TXu z-Wi@IJz@Yg4`}+1B=(aCVy!w8@I6voBenZRZNrYU9_kz_k>$S7&fxie$PDP)?evO> zfE!=vQ_Ja9zW5`rY8R}fz+%oQkAa)1_g8;F?HyR*;L5r#+*DP(f%utC1$?X>>c;9C zXB>K=^BGVs+p0Hjku`?acgcJZMU*C-CCt`r3Yr|YIIcP4P`KumEN#R#1TQSN&$NkY zyI)`0;DQ35q-nic_mz>vimWr(G>!#)hb=3|k7-WfDM6{}FLy$y%-7ZD z#}`qh$M5bmrZo2j6Mcy3cI!9U}lUa7Ctt23iWx zwS~_u3^We)mmDIm3=RRYDcSiXE1|qm8?2bnq1H`Io+(u{1C?g`N+&h~)d;IXvbStu zid?3idTDsl1?tOFR%)|!Ii=HLpx^Jv#BP3+X@ue5I5tsJjA4Kc3^%Hj6CI#OL>TF3 z#6q7|mo=+Lt}DERN}|0v+EN@RwDON|d6&w+Qz2`j&ZG^KK47FNYTr~xoFu5(X-bSL zS%an0T=m zmJttKy{Z*f&$NRi)?U=tqW6HaX-zcV=NL{Y4%@!eHOs6R{{Zg)0N6h5etBwr;Vn)e zJG4=@moGxQScgV10kl?ykEl;_2p%b~L~U`(ue)Cev9B);v(Ha4g`g$zaQTaD53gD1 zjn+V~gZlZ4uhkCVfUKb(bka2k?J#^q5e5d1(j1{9ydSW8L$FK$U z-@z!=q`NqK5*2AQH~j(LQ54eP*aI&-q3tXj9-&hDHOCVVLi3gn%x-aogq5}6sY4ji;YlF)}n%_#^3dZGdHyi5^ z(*VP9m3g<|+C4z-7^QpbEy{**!&}+QrE388r5go-T-sJ=oxBJh#5n*(7}qv!ju0>? zH*K-PGK9;EppR1pyhD#v*UVBQLIhwUtsO|iXPCRH16**I2mVPG(zWXX@M<~qmHf$q z0A}db>iR>;XuziLEof{W@P?tJ-$b4>Dyk5)wv?*P2e+jVr=nro2K^==+5s(#v?{e$ z>y4$|hNn>tDU`;u#$<;lmQU0=b+9dLUf%s8l_X_YEro9S);(Y_UncAsOq2x%xP+r; z0>mh~>g$;cE@S8Q5Ham30~OuuMv$>qRpiq3?JBN{tIb<&YC>HdzGC{IRCpWBTsVoC z8f%_TZm)PQ5#s8K2C6+o1vFAx6t17&+`X_C?1J79TXIJs+6)%s%+vc*vkIo;(O4^_ zS3LQd)S51=FkyC%9AXCZp9Oc;N}y68-Ir>Jh>ma{Bk>aL_+4uTw+52Q-^u!6Rrq1H z?S11nIR2~RbcgDUUr_mP2(nq`>!!AnGkbon9epH=#l8Q}RQS^!m8Ywq7@!qQ@~n*C;{EcL`F zt>h~#D;$CEAEwLl7v`BrKniGNtZPDCSaPsny;?ScDb4tGdXqf`#u~d!ba##G)_In; z#XX1aCDl(eU!1~=L2nm<%GP;7DkXX_HR=BVB1UMfUNzRZ=`TPkRtvg1R{6dWBaXj~ z&}*evC?rONxpGZ;)*&>Qy44MP&B$dJKmmK`8GFl1XkLBch}z%_mPHUj3x_J{r>4;M z}5CxZYN40aw0@!!ue=?Oj>2 zxWvqhWvys74iJ=HLTU&KI2}wyXxyr*lUq@%92Zn(5{1?wV~5NiR9H zae&v7C%VM7VOPhG9lfGFwKU`i0lJ;9`Vx*8ljd1Y0qGp*$Ac&it3}`@j4VD z%w_b?>N1``Bo;i-Hgjj-6`~5DzzD>@YnzU8?NJeJ9O7%6o*fWooVtgPF0A+O&mU#&a=Nx4HNqco2=VbM-aE5HQ0JE+tzz?7my5G9v5s-A3&UQ0V`zjISuE7p z>mNHxH)e~@`CI3TDm3O8*w>^Fw^3+m0~zXIp7X~BT!8^-O%9{~03{gOI<3iCA2ld$ z(`%bipuF{?oD>qyif@thn2{l^+PP~p`!?{S+-u2>TDew0Knq)L-5PU&VpMT!X`zGO zQClUs;-9&b5FHAxr!Bd3w_^|x;)KXQOhs1M63$-PY%^RlW;TYz(TlYuXIOJRY7mEd&j>pWU({T^izOe<~?t3@O z6_q&hN`|*Q#DMs zwCZO70KLq&)IDZ#*!bGM-ca(9_2=svkXRy{+E;BNR840Q zlUxd;(8ew`Yr9=D-fI}|maj}RkU33W%PQ(!o@-p8<=%}2I!)HLI9!U%4F<0>W4CyX zEt_uXuZ}Im0A-Gn-3|ApJ;=1QUJzFx?hP63QELOB*RO4*ncu*TuuKdq)>n?GH&z1l zaYR-UWd8tjTKz#dV1H38(^}ndh?!8EWs>MC7_8vdRpJ}qELLbu9$H2VsVdwJ;_F^A z!z~8Y9oKrRkc?6dXfzA9+$E{JD)mGjUNNK}8giRx)oEEnH!bT5rsymj8>XBmKEdmW zQvi!`qp^$kj9*U>8WM&GdxyGf0DDL^q$REol(N-S`XkB}z|`Kn$5;S#Q_SHRde|Nk zpEKMZXVP$DRQ*Lrd&imLJP`ouW>q_W`ocWA{d~{MiJFL|i%2{h&Nfbw60dohh||Lt z;C*6Y7rmFocyHPPNE#`!sbAQvYjffVa4*Q0J1JZ&Jn}taEHBioj$hEyi_cWK6m114aMkGucs*JTFgS{ z*(bh20{(+fFQohu8#0<< z8fn?lsN(h}p%(DEaP!&&5)Cvg(CHA?l$ynfDdUrkCC8?2s_%hrF33%44Qb-$;_s9Y z%pEXHnT#D==U2RMkffs3radoMs)7*VtA6lmTkfjzjnj;;g7~|tQ{pl-6;`yB0j(is z_X@jd`i)a%D@9g3G>^qJMgrHc9?*@}9-py{g@3s$;Z!MMd+KL|SV|B8wfdvHB;wOT zQjM3s12giFKsLd6pf}&8!4wNnaP>Ec8ck=5gGS{%*h*E+9FJ*SUaW7g-VjQxuJ_lC z{7Dc%l&3j0Hh!TLx)<&rGR11xAR3mLv*jumgt`FxGcKT7N@(@)N$nnDc9x4A{WJPnhDbm!#TwrJ+9`FTj6z_&1wkEO273?y}cV1;Ik-%oFM$4UVOu`^2%e$oy z9NFtoeW(jtMLh-2oJt7FN`IheEVaWp)aq(!aGr(&maaO3mq_RoIZEWL7F7lu>!iDT zaxTq*wHmlwnng*@VeQXLpJB#O(O?HGWv0gNkjfEI-sg)$l!sj_8s928>n-4wTJ9CX zg0SI^(Yn zju!uF7PCX~4Eav2T25z>7ujGBMR zfJR|UXEchgIM-=>@O-eVi>z;3?XI%!eg>{8iLfi%;(j%ku8eFhs3t7NE8jXy0h07w<(=Ldq&@74F5D(Qo!iKmro<|fF!I4i|N zR=_dQSMLa!r@?Uuc{pUgCh@R+e+()vmFgD%03dLnDZnjjj8m^CjKMogrfHYA-eXkF zp0+$*AjQUAq%IYikv#-F{-YTw6gUn(nDmJ)++57Y zYOhEBMipp_->6p_U$>OwWIpNx(8FD{J2icl6JckqADDwL)SFLKogEf|ec-NHbk%_0 zok7*s&$sOwVXRXMLEguh8(o(GTB^NrTxc2EZ-6JLo*9D>w`XS@Uhw2lbyf^ITC>Ut zwZTU1#VuG}Rvki8%OGPxO1#=6u&$tYP?oLGJ9C#XW)*$Vn5IRpqh8RJ>kD05Eup4TG{1GP zBm-j*ti^aw>NivO8kuURs{oPGNF@QI;r^A!~q@oA%>uL**2fyg4g+OvEissi1-a?30gT1xHF>TTT2 zwU$@eFhJeSkcQ@+#o!kT$$cn}iBhJvN-=`BZd5eYwa_~{U3A_Ct%Qq37E)nvqkGGT zB*oob=UZUz*OaFTHmRUp0Px-@&4o@~MbIytQ(HxWZDr=F_jTn1q*xYVYsRt(Dz8>< z+i=er2vZ&$wRNjnTH3--cJjm}Fjp8_@xB{FK@ih00uUy2$y`W!0xiLicaH=mYQ@Uw zi_J%q*}(?vvWmWo8mKcFfRS|g$8ws#<@$Yo>k7;Kopm4=NA`Y z-~_!61!)i(9k;nl=C4TE*$>MkZSuo0oAQp+vliCGHgP=5z#$O51y1&${CdQ;%+*Pg zH%squ1p5qxJRs}UJw@f7Bf%P?L!4^y2N)`^U40-a43VXBF17U6(mP5vl(uV6qRST5 z@_;WE_CF9n+^&VTCLqW4mOJ|yC0mDw+q@UOXnEP|r^Hc4Qu|-TrL+G4Er@qV=3k0J zbgVME;OU!o&U!%w#(ez5%|#T}f(eGDjRbN1xovP$Y}@JkBRtL4dF%X*)2jCV!Ek@c zmrGzt)bdsGi$ASDNX41`1^AL#^m{hMRBXz9IKV0E=4*BNA|&PHir0(r_q_b&4vrp{ zKNH=)WWH@~4W=+@$Nog3w;ulhIyqW=hyy4bMnb%XooS8PD9~%FVsR8B(kQ4ZEVE3r za#S1m8J)p=lzze#D{6N=*HKBx4vY@KN(%^`kvuY{b%|Rxhq-c#%H`&OrsWbNMQhWf zrX|CGV(he}Ffh*&&6U4aRGa9Y;Wu)KDTh}#WP8UzJOO}F&3}r9Qz8=x3HTz2i9=3KHOLrx6Q-ac}tOj zaImnKhVht3aMS~T+K{%vv(n~k%4-sYz5~c5?_a#*>SC}AW6LY-8NO9=mfZDs0qT;Z z6>57g)Hk(@e#7Emyo0epdutr>R%>}5Hsx$9E>PFiw|HHd%{SQdEZ#T2&nYW^GY^0V zTEp3q|zA3Bkf9xYJWcy2POd56`Qa8gJr&-dqJ09l6d|}QjgNAe~uel z?!-(nXmN(x34E&$*LZbdXy%XdL|Xj^%v%{3EeF^>@ho#g>|@Mfn$h-{Mu)T^8u?ay z#x`om@I?0`^jKj@-Ze!mm%ZxqlBei8lztk+0=2%lg===NRu)a(hXTBrr+pj5=lX`j zruB7Dd`qLr#hlF5;^z8n&~6P?t}j}c-V_G7MRU`Xq(U8Dv@L~g!YfLjg~2hz<9l3W z;|HJyDKRrgtWsk|V; zrK~lhhY?UspDeSXj<6Qfb-rm>c(sX~!B*W>@frCeG+KjBtVE@<4ZSPed2o-w#a3~( zU(BcyohtP2PPYIHcBiFzziIeZz?)TME`xR>S{1er)YJmFqdwQMKLTNjAf*q;cVa$S zQiA-a;9pJTj>9Rbgj`QE>UhE!`wXsk^~_K;K3HhEyw4HfpXtSGdU`mCO6wpOezJlU zaQRCmaZgJ9z!v~}-i_-Q?JPfx8#X&MZVbh zC+6{07RMQI@q^Zl5xDm)2C>AWOcCq@jiS|XJqN_Pn$qHjfpOU3;6!Sx?f(GY9s%%E z-ae-+ak8g&Qy?ujw~V=F%jS!4hQ|9*T=lxB1y>^TZZqEHgL zM0B7KXn>t}yI3_*@IEqc$KGUZZ^A z*HpgEK4vXY8wD&2%XNcFh7f5WNEe1dmyX=tVQ}bYmAJkT2;Gm6nUgHkN~KqHKkgT9EFbXgM!#!9nS}W_1*%1W|r{L|~us&g0 z8mQ=X#!iz9sLf!;J|tGvLR6$Q;rXbu@>W>O{gd#ixjevXNN>6MMMvsLEU*4dOhF?c zEu779D7uQL4z8qjoZmCVcqA8hLIz-^DC#?b!-W3;Pz#sdsIfV}5h!)ut&8QyS)%0g zHBSX=r9AUQwvF)dU3@2@7O4=g)Zc5AgiL=}z-U|2mcHT@|5I3lge7k085lQhY z%BRH9_SFO}j31|@rt5jA=kp%QA29pe{IDHS>Uh)MR@&P=#5At8`{{97?upTXy3v`? zxR!D&*?94DaV&oH$GjQ*2dxtX*nOZK?EWJawKJ_>11Ur_>6Y*76NQ(k z1MhGqTa9e6zJ*14nO$b`hfWf!dgcbGUb~r$p{<8&Ota#e?4B^Vkl{ARAf>Q;D7wM<0-CydIOj+Gh zg3h`q%L7iLV!*rBl6#lRGElhUpnJjsOo@>>F-)sI6OeOyY> zjSeUF2u>^RJ%p#((pu9c7}hhU9*jzxC%XdIgW-j3HuJx5yWvCD{{T>lCO=e0ThDWc zu$2a)^FKK50{RdsUOy~acA53B)b~*)+vs_b4sqE_^A3oucgm4&Mc-8mD6iCfQl1D; zKj%oHD_ zwYawsHQ3OMwqBlY@4;1E;FnNbXQ6d6cFN927Wg(N1cx zbLj!>l-8Kx%6pa!h*QF^Kt5+6N1}(Z5aRFY{ZH_*XA@48{EQV`FA`(l@=wX9D+y=N zpPy`=_sV_^jmy;{w2Le0J-g;=r1(*L{)%5yB~4?p7mTSZm@~w9B(7a4<|V8$P-`XR zH%b1TJ$@5(rl#4ESwy3b71sBz2C)Kib5f_W~`^cCK8=BvK_$!mYp`U)cpL8lR0xC${jPpJblr%6=HFyu{tZCYy{$ zi_Fjn@)I&Q%9c2>4w?{dBlSE-f=548J<09Q3I4YA_)XHNYoN-U-CN$gF-^gF(>cDE z)>^b;%>L!FasB=05qALuRix`I$L$#pAu&`HUeH(Yw_JPm&o&TRw)O@06EGEHH>D!0 zdxrh!xMG?0!v$G4P$j)A_<#l4Y1!~V2h{OGs=EA(h)it_9ovr60VjhAM#aG2^r)Wy z0Ok;1%i=pz=(F;x?d2+eL3~FCG~_cDkFDV=!@zvTNN?txnXy4=Gn3iO87+@v=Hi)6 zd!fJqPPV({QS37R0AuE4Bx6SuDz>719&(}-#Kq*-bxZ`ib&j~nal>8vb(UTs1V=-Y zMgV0cT)d5OZZzUT-pvO^UHxJW;xn5rO2X;rnsSu3+BFRwxV#uKpc_Q~iv_AhwREYk z8Fm+v^`(q{;p{P(0Hsn}Y@A~ya^KZsHSBz*3_Ez>Qn)}i;56Sz-2tsBI^L0W7Oy4c zqXO?W$&8Dk(7G`2m59+KO|)oPcb2f}qZjZgZo03`((M*vA}1j84x z%p?VNPeh*F@Sp2%UxX%>;6>^%YPyHG__#_9+m0>1ntEvvO)6jBIzePDvRJq!X^Kbw zqm9%_2W?K)W#&YnehhiVyb}&>pAaw=LDH#e4hNa!o1w3) zsSiWe0t*2+C%*5DexwW4tMe@jsu$3>Ww&R!2}(~1bHr3C4OeYnr+Gd90L*34{YO;I zv-8AP?_<7__1z2DzevYI#Yc9<-N^S~f@)sp#2SZBPSY(8wSvKQ9}Go19txH|#y*eS z(Q)xhD*GNaDkUm=s)8Pbx)eJrIx^tt94NcaAQa-E(3kItMFz#wDDyqr!zB{wB1^<3 zDXmK@de6$`@fBZI85?}CRZxyF%f|0KBM3KaFGY&7En|vRf&)&?N&<)?Kxwko4K>!{ zW2VR_qYr=#0f0G3474MnmQhqKg4?oQjH;S#cSJ!o6$llkt9^J)a(cHbM!Er826F66 z(6iIw@c{sKI#mAv1V~OTfsMCy_MecHD(fxAKnV((@<6~=9$ENlcw&*bPrbKkr3P}>%{lxneERB{;6*835=vIXJ^VSetsA%rlWqi z>+>b_O&;;-p!h*=aY^^?(MoRnlHMS$-9GtC79=@33-;5{?Qre?0LE7u?qY_LqB(he z{{V>m;v}~5Jdvn<36;e0yu#0z`GJ2jPk-|s$K;f>(N8n-Z5OjW@-r^0=2(94j89Ya zq9*QNhzfaEw0E)(fR%F+eNPBlNsmgiD}JK|&Pv;aO75= z0Kfml04fmy00IF51_A;D0RaI40000101+WEK~Z6GfswJH!O`##AmQ;aP(c6M00;pB z5dl9Cb)haLYAS4Wi2{;974dgm&-*lX{lnAbzL)g^F7PMW?1o0mB09-MILARrHDnm~ zhWT%{MGlcCnY7>D@)Perr4dJj{;lKATtk03@qTe}TXTAaPG$OrvDSa9)fV%YTCUutP^PkZbk)O~*P+yG7ekg`-JUI7LiqiR`*$o#jsG)}zO<0uF z{#y07)@S}6=6pxCdsF`ay1R>BP|{(J=+2iYOU8bu@u#=$AlifKGS#SYO8)?3Ei-3~ z%uAEu$MZD09*Gp%q3n=biA_oIzR)RKlTs`lAAgyx1WN|IrQ)ac#56=TpU4W)8P3D* zXb#77C)|2mV0X+JKUg9TWYkS*{FZ{>rtpv__x3a5J+af?fA>`fJCiKsrzt@2kE#_s zz?DKnD)Re{7~=H+y(FmB$ImdUGf#YeAzo}>Fw#dvncf28PmT77gw{JPSTw;-QiYO^ zBla|%Cz5|^HL8Ki*o5gCdXxA>R|b5DO=av|FwxOxXCDls`?Mv)CkmFf=l-7dP`|9P zFrWR_SxcDV8ymu*4#rMapNVtm!1O;PU0^BVdLMFv>u*wWrMRM@b~<9#e)Nwx>C&7% zqrGA}B-fJcrUE>^+5D`fp~?hhV2>pF(dIMzYBKBBcfPautF?lMn;w9w?>MZdzK^J} z@E=ecjI5lRr_JAKG$yqEgH!waSbRThboZbA&@cizO|l`GD5+A@&SGBOSQXs0G3h?1 z@GOywzeZM^etCX5^_FenA*3_-7`G3$CJFovHxh?t{-RS+MB>%%y!(i$pVVqr@_Jb9 zIm161@3*LB?mtq6{a}uRa-NnyQX1k~+n@RmoAm~6Pq?KC{{Y=rWHV$b!xcn}l+m1@ ziHl8ZwydG{FwB>r{i zlJ0+N#YyUZr^;m$V0OQ&l)e}9U+jOQggO&a8DIqo{{W}C`h!0w>VNlvjZn~g7z+tx zxMZd$!tC(pHG98v-m%Mil=p_PQyLV2qTv)MyQFreqY2pA6mMjCen`kO_#~$fwqmCb zwm+;#n~J%HdJO(Xn~6+{xBH3xm1XIphrIa_1Abp}^}@{m0A_@ti57-`>+gP{)z|8O z=*2si@}E=x0HW;4^qY(PMkwKn4AIUK)!^5}(vpMAQCL!8CI>gtFb!C1jr2gTNf@2u z{BF+&_gE}bbNECFm9uH>jt@+8jVj!s8~bDz$oPvNae{HhLO((aYiw^(v?m`-v! zUNr9z>oEhWUyu7Zb9QucPu}E3w&Y|D3wm9B&+klB{-qCAY5g{z`2v8}4I0X`Mg!^s zji>(rLh;m<*mXYQk%1~B2)xV;1ZbA{gWZ$lln!UeGdkYy*W!F9x#)T%O;T&b+3Hu^ zVr)pjIP=W>p1VN+U}=6&OpeZvwk$mUri4^F9*DNw{sx;Rj{^{wp!xp*WJOH=1sfwn zX=}xGlVGYn%lxuvWWniSoAL_o{{U`&*CIhlO5QrVgzS|OQ$MhZXn)E5ep57l+eF3B z{8=qb2T{*#NPsq<{Tq_i=fsEp!nij%2KGZwh%tQM zsYozyment*tv>{giI4fvPh3LGyr(Aq#|_#KWbT)^1f-2xi}t)WjVsb!8QtsE&ShXM$QY#!!ZYoG<1Gvd|!DzN1{yF zv9UOgAMx3UgC~&nKboJ^hR4X^JD7!MsCk;f4SRqVhEBnos4V%9jU|%4WVNu`*NTMx zqMA?b@*i+z>-97z{s6;v3Q?cR-2U4}E~ozhB8kA#aKO~#JoGp-~nn@}U)NAunu))DPh?h{SH`udWJ0Hwm>d8<6- z%#jC)czcqJbDKO@oA{sAHdg*4L2YOB`46}QT)lm7q|UFAUNTkqv5 zwA*QaKcw8+fARFia_C^_%)!g&5Zi@HaCH43w=Bd#WT+M$NULgxsd(09E}>JRKdA^? zkbA)ltj3$I@}J1M8_E{tXy|M8KlrFIDTgQ*^D(}5MBbl;akH&&S*(-IhS6c0CMH>km2(CX5Nrz@WQzQ`3(<5 zsKZgOf~4AAW;{uAX25e2{{Y9F0jO1yjiRXHHYZ$(-hWI{qISFZif3#2i+q#RU6IM( z{h!6PQgcPWGx{P1q_Efk@)SK!>GPj(d8hssT;AvPR;>OU_Gxb}5K3r#{@nh9O_5-n z6ZxjDfACGiNvb1n54L4(<$|P$3>ALw>QOlr*&eK|N8$pIZxc~LN4}AeyvN*^$;FLT zb@-{c6>FmX{l#Am;pLlT1=2&4RJG7&@~pCVt)sRO>jy7bm!k)`zC;^qaE_PZ;?Q~QdH(LsF!y$GXmWq7Zu0EJ#)utQ4I zQIfDy`17Cs-UMO1;@IK$8kYr{jMo9`b9t7|lF!J4Dz@+aiEz(Lf06V}v-of;SgO^t(JRE%O@GgbiZCqf&Px3=CbKBr0O)D>=?lFocNgqe zKa?cDxv%{lohUULI>Xa4}OT{6mftMh_MXrZCvQtPJ)K2hpyxvwsB z2Hl)~S(?uU80rJn zV%JR_7r}3-O;mC0Z{MZwCXUa!QZ^I4-^@aH!VYF=E6qOT zx=-jthbOQ6sr>?{6#i+}d!E^Gc|9=_8;_=cW&ul>vz)g{{V9`#Xz%$60@|O&1!OJN z3U*rUKZ2XlXy?1*9%baKTHj^)u;|T%b{wrU*0C9~gF)3*>c6;*`X&eE_$IS;9kKra zdBK9{S3z&@8T^2zu7CR}89tJk@fBPBMFE7kJMl+a)V?DSq-i7fv`4VVK3!pSv5OOo zwSH&(yJ7;#@<{DDv-lz=-sk%^^qa01n_iK>0nv^FHQD{efB{lJE}zeNXDP5<2HuifdP#KNI*>ZHR!ijBTo4 zoj*O`v3h9@L4Y@I+;S`CQ(EYwq|+j-?&v;GZgFDxPy+nv(TF(~4qfMvaCa8+3H&CA zd$`RIOB@ffXOU18Z7t+v4!gahP)*{($}5l={o^rH{{YMh9bs-Sd3scgw@?~8kKx>k z4Xi?Hq3F0gkeHsWb=Bv8^z7Y+12$W$EyowTE} zl)FGBR4vfD&r9*zDb^?O3$k^=U8x;YjLPV@;Cz+y30LrAl+on)2hM{?@05&Y1h3!M5PQ{J!POl27iz0wbL#_Gk8Y%lyv8ztywa$mN%PHjgoexjn6Zmv!t?@$f(=k(W?h3Ad`7BhHLi%Tv z)Oeq{nk8KmbCJZ{gpA zf`-Yj&@Z&qHvFY;Ace$A+8U09`2PU2`T%htq-AQd_SE-h8j7R2~H{f*1EUaDPAKTag>25#X5<7$-9c zeGL#@G8=Gnj{f?`81kok8}Ezl5jBE5A3R`frKeKm1}Tu|n)&uXwuZNR>64?5mCk5U zbmDU8{6uVzx$%!=`JZV^665e1ExDFC)mXzbWQdAh7VZueIDOY0Wv&o>RnaF$E8g zXnTt|iB{f!0Id`H67;9TaiBb8_&(Fz_XYMn#8yx2MRQ)G;>A5r=z*xrHf202{YMzQ zO@4h(L0coO6N_Q{BrE65M@UXbVssE{}M=l9JG}^J~HC1mXht zyS)}mbb$wkZA4zEh|{e90Mq~(faVcJP4jUbKY9NE8fG{!tlDx+qtcPwYae{7Y;X#7 zqx>B7iWUO;oK80y4uLzsiI@wKsZO}mJ;f6xo=4PKxv{ojWOr^}=I11nOQGnORK$D~ z_trx=W+sLO>S%rbAgoNp9Lld`PjV4uuBT!p4iQeGighzx`{h590dZLH(Da>;xxl<*XG4co5Ae&r6m3BT^}jHj+@-=w3}d~M!j zZ)4ZikVUk;jAi6Q+FcxII2_=G*(j~ zOXfOR)Wj_3w_E$IA=VTiohu&^kmO3_pPP{IvnP?KxPlExiGDxqS4`gllaq_`0`n*E z0dy_ldOa=@Fw`_l{{U0Osw@cCe4XW0#Rr{l-xFEjdJVAd;QZ=)?F0o_Cq%LF4K*f7 zx!N{hDZO3CG^Uh6;46OId%}%Crwh9d<~US&`9_VQ?!YHPrxdScF)B zqiZShp0Nve0*Xr$sZBmhhIK?}{w-`#`r2Ns(S^?LUT?-T@-6eI$6 zxFxh;cSgT{CZHAvAjiL^*u5o+L3=nHoZn-+RhB0#r2?rWQ z^L?T5FiJjE)wR0YNa0ZXtEC*2%5@9*KQLEStyUneydHmguFgpJLhqz-=E-Ho78x8C$(Bi<|ZYLJ7?RN8X5er@5&u7yS z0Lu!KI{9Y3%nLXN7gytLJ=-|ylBESlDKy7Pu-(8}}QJ>Y170kAY2 z`Mc%<3T5-F5Vgf)mA`eEc5>CzKjD3*piNi3s8g8=289DPV0-y_#8(8iv}z7{@<6GV zpy2CDy=7>s)Z6{weM>M3~Xz8q=ZY9cAqIN~*p$t*WDR^UYR+&PYr5je*Y`l(^;C7h|r#%;9E;7Kb> zy*aDlcK2mL4r)O^-}xC@&aSjU zD|}?`$~sm50LYt=ufY71R`dsrQ}H(aP~nRm2IeZYZ3Du_JCD9nw`~v{hsYzS zw7mt5e0)SM!+6%Vt6r@>H|ZE{D_p~Gf+3|nH!F$EaPmp1>Zlea>+)B|vOL+3@;F(q zsYvemgjaeyW3_jHNa+m+Pjlx!=gWGCLAz7>s}EGqO&#v%^cf8cdTI9*X^?o(Q15Hs zl>R>OE>5z6ZOOn7!z^O9_;3doUo#;_^~KA*S89hu{ zwXU1La{?vMH*a+HIAp7CFji@*|{`_C(0&<_lpl z>I}+g=T!MDn^Vg%YmX+}c@vHz7_4jeKYv)9z3=zTY&AophgQy-O6!febcp@u4-yfz zei4zOhZ>o}bm7Ao)J2BNx1F9}E4&0arFwZ=juWk2R_E{3T|*RlA<&Y-Wbm9GBe?~; zHJkla_^bTN0$@opDp+6&H~@T&J(wujtRg9B^UZc~^E0Cek1U?*{**`GUvNr!AgBL%FxQN=tX|B^&bQ`S0i0Kx3*4tH=FW%&lQ>K(m5|yfVMFH{;|P z@hB@%*2}+tq_`A-l7X;)`L5)n&t^PZ_YgQ}>$O%7HxU7Mi(>?F6Z^N0>&>4H^%9k= z{*>KMijhha_~HZ{>42*0o+g6WJOL%0P!}KEMlLjC$$u7ijHEU#)W&OtTf|jsbNHsN zXyO{MQZDURYTg5k13d^ugZ73$uW6 zcmDt-XjUgPw-hV2$J7E4?)%N~nV<`!Lw^;6iaY5}@z9cgvt${1u#o6(AS$2j<4w(qbG2T6Phh~a6P^>KYp9|p5Jg;Bn^E1x+) z>c?#h3@;OYa^{m#CTAM~TG4pqF0(ZeP^r*iHcx@}$fE8(S?y%je9xkK{>hq9u-3fU zxsKy7%|--jInK`M*Lbz{@2Dh| zX0LAjCIraP$w{-h!ZaGk&T3i6Tqfdj?*kcRr*crO*gESmU@$zC9ttP$yW9r0c=*4F zz>H)(OH25Q2-i+>>EwDs2rTAN4#=G_Z32^GBXvM~KaHd6%MTq7ub4g(0j)8^ulp*^ z=Ww8K;fp;bF~R5!UkW^LXrL_`x>4IXIV2TGc>%M-e3-|28{Qr8OxP$V1iN&qJ(+8H z5H9F!;vY)6M3sXaeFq?AOB zsAap{!g!`+((0__--~m|sO^{+1fsvx{Z2&q{*fvR#ZTxdqynbWx@Ygk&;ly{!9E)8 z3KsPFRpQblaja{R5Kde>+++%8=z@pRK(-tTyy?dbzJR;vho6p+?pQSa*KH!c)PZeF zT+wv$UbWM1QHvvXUFj$~56>v${tx^4hol6*Gl$(*B2nGT-fIGUs8@YDO9pX4x>c?= z-dh(0YEq8nx99_e5pW)ur)my{Yro z(!6QlxC0olxYoQ&rzvYOs&iNSj+0Qt2J}!owfXEz!;tWY;y)YbE{tUC4@a884v?p9 zjC0eOnmT+rURLz z30Ki!JGRzzt2ohw(IRWh8fA@hrx6E>6LK$JhW-yV~x2?hkH}c2e{tMuJmo< z9~e>i;l>o?JohiDi`l~fjtztBoGctTY+vta)>RbN^`qj4o_C8_pr^y)pNL|bzHyOl zwbnZHf*`S=?v%Re=JtrMq9&N9-}wv5AhgDF@OXvugnz5 zEY++r92bo|v`mUQcRxtBuW9?7;`04NeI{u4^*^9AvrT8`n?10>xegtKLp(_BuhMg! zXRW_fMLX3@oV8Z>GCo!693x*U$Zw765F5c)8oi0xj9?|mmV)nakhfeiM;%A% zBnqtZ{mf{WO@+o?Fl*T38FQn6&9~LlrjVm+E12oX`yw%7i`zi&ukBYxp#b4k{$Gem zata(vLD5LJBnk!T*mw;A3 zwzsQ&59XE4uyRFvik@ttK?7b7%t>%dXue(&|dsbZf-fDY5?mM7CzR znoZd1b>5vVE0!HDBb8e#O07;#Q-+&IxlUZ#%a!ZO9`u$6PMsZ|j5SSQpS@$DHoGk!awKR548B_c7Tt*v{6E z(=Y&O7W5f^erN7;pDuo*gieJ1l;&U5U`;9k-W=B@2KjDr*(wambH`6r^C1G`Fo*oc@R6D5q#H!(By#N^VM?E1RvujFdcPu1MP;+UjrS{P22F#xW<$mHP zpjpvU)%w~7GPUcQ@E;P<4Tq8RvlyXcsG+K8wc?n`VLdO|l?v6DYkzvj0hM`DHFK+i z(cuh&$eHd!tJpQ-#$+a%##j_z74aQGNuEewh-%bo^GpZF=*Kc!X}t~CsB~(A^~gWh z#1k7;F0ot=e1F(&Ak^`250-5zf#%(}vjK*1+f}t=YinmsP8ol=Ysah1_!!3Hg zaC>Mp;0U$t?g(ICRds*KV7iK3Qt;vQOl!GwrR$D7_8}Jm9&J~;vX{N!k_UjVeO0|mMck>C(xa&&Ib*!^XnSscJrv=_tAR4--PIB)qylc*C9=}9V zH(q5+EHlKAiz>rSae7`afWXURy;sKFAe9`-u(V@wa#nh27VZKu*5xjqQO|p;`6kJ5 zUsj7e>B zHRcpv3x&A+c7O%JuC*_#O zh!%J!kv`%&^|xwYiij59i;~M@=Ff=wl>o7MpV84~Kka;z3d&x4RUIYJVNi2#(vU`O z#<@7mz1g;62C&CA{{Rc)oOz%FM%L4S(5s{(g2c|aN2!D_l1*spt%%Qrwa|r$b8XPY z@)GxF7=?~WPPXK5B^n7=gI_F?yuhog_(9I&Gh<)-50xz*N%Kq05Su`7vc0`3D+e`q zt$Z=-f}k}Fhnw(a@#!y!>UW-MpCZ!-NZ)n(R~HKRji@05#p)^DfJcW$hbNRjupEx;fNFn|E=b z%K{1jS8To8VJlFCt=o-j#=HD)0S^gP+i8v7QQf&Xe(e!nXXhKoO|%!p&DTRc=GX_dt$tqfWMU}F=K7W* z?Y8rLx^aejq7{J6m($c0fDzfMW43q^T2;91l?dwA85_zsw^E zTf09UC)B?X)}?F4w}Q}_7<)L<80R;q6XQQRM&i(PCb`?J0(C?Aj%a~=jXudP-6hc) z7Y6h=iLVZ_-BIj-dD*|6W|aotFbly)j%oMmGW#O=TbFFW_!ACT{Km2=Zi82)e8T&w zMeBjC)(%*W9gZp5kt@X=W)lQBy$v4x;wX=ROYHg(IOqYkA76g6Io1zatIqT0Wqipx zCH8O3c80WjmZpV%AxF==D8;dN!o3bXc|eUZYnnoDwWQz#p9}U2<24?c@3A@ zM88Iv`|SWxvfqmOVy!H5jun3rTB-#MO2k9qGtIZ^i9bV}`F~M(A5n;EzUT8;xpNCt z--pe4%&T6nHitc)KZ#BnBh;bq!azaM4>$OLIu9nn-)8IxHLIZOx^u5_TWOZwxG(p4 zoKa`JKk^e*DOas4m>x?TEk&5tidUWYF&V0yIjI#nxEymTl|b#bunO+3ydu+Cuf6+B zkIQf-a`aaOwk=bz)w5p5Y9r`I>D4}>k&er%1G$Tmtd|=<7L%4z&HiGa?;uj}W&n+{6OC>eYIWJWvjxAC?nfFwV4X()_~9 z6cxR_>=iTsTbyybK4PRG=gJUPc=U0 z@lf2X@V-2tm3YBzKiIb104yaud zs%F0vSF|gj+xeHj1rAPJ@hcaxQn5~#!q9#*>J$}d0|FMwb7VEgR6POPGMyQxT1}4@jcZC~1Ps1Je9>KDGwpvd#xX<52mOXXxL9$D zLB`5^+_>dc^S`+6)@VFq)EZZ5caTx=C$B`d#QPd$wHiGGcfLexj@aHBXbpToEaZ8C zY_z_fhfMkzV($~=`%lv4K4a7bYJ$4vy-(;D^sQZQbe-iYNW@hgFClfw6N$|-1ZTyrS8n=!khj%H_gPV*Jkzfx~HoVjh zP?=InJGDnjg$ZoV)Wz%yWY?ZFw`}@ud0kf0@YfWyU!#KGWu$55BB5Ux&gx_ zyzb^XZ=|Le;h;@2)fdg*_mrzzfeUp9rl809!D#eg5OEO5#|5X@Xc{EC^p1{V*<$i3ns9 z=4f0%m~Wu^ii1UGO25k)7OcpdQ4GaMDA}w!bW+8MlKj_6z2aBzM^2Mmrs~$95wOwY z&S0y(L5EX?)$+K3Z4L_;nAx4CaFnN`_!rE_69J7IYR=5rL>o8N9;SO#TqYLfneg93 zjMHzt@BaWu#n%E*;L#ps<7_*^-peW7`goi-Gec81&B{_)O3qR*f?-8a@dJxRT7se~ zU3YY$(!UWGcAh3YQgY=S-atd0YuIZ|-V*p~YdJ8g=4SQ0MQm_4-N)3)`s?!r94p*h z`Z*pX@e$+*A26^cb>xu?TYtz6@wxZ={{Uf#=6r{?Ew>qybLKm99-}5;mC~{1sss+V z?LT{z9yiqK!cXXdMJOIOk?QN5MjN$8gZ6RvFzY?c02UeHME6L@?EqPEaky{{W-@!vn~@REx&jb%n;#ml^>fcr-ZK!erM=tA#pn&z|!& zMojWjyB`w@KXyMhndqO2cS47*6lzl;o z+kG`xis{R=e5eOaEj=zXR|{q;F6?!KO3Vi;f_R(IvA$IMPfwy)F2uodkO`)K=xz|gc$Fh1plANR!w^bg0*{e40D&wIt?|sF6 z@2D1*iaupsw2#&nV*RjpfXd^D>=MF28f?+}{6thiq+;g0xI;L7!W39D$W{sK0+Uk` zr*iT{dD2k#SfuWXy}!><=LCI1!y+B($(e^(D0Dp#13E;9Ng+a^NGX6;xt3JhZaY7d z?oGF!`|%ZRfSd~Xw>?-=96iT&gZ7reR6Y1#cuI2()AD9w`D$~pC&2U}U|Se$B`=zwRq@ycuDu&n?D zdAEHCK(?`e&oP;R9G!LXvIyv1ai7J&HHXo6HGh$H zV!ty2)I{u$)FO3W<%=zXJke3otGwQ#Tg(l*+Ctbx&j7mgE?-ff)^5lZ!o^2I?dQrf z1PO9po$4T^2}eO2@usw!OU4m<74!Z^3yG$gLCMOitj?omHFvJSJHgt6aTm}P)07p_ zVasb0`(4Y+aiz{4gCSw8VvVJoUCP}504Nw7cWE}IHy+$wrkXo|&d^H+yF z1^SCuP|y{U*RFNVZthE6jsPYMbI|1)D^^g?3Joh`I(31$bh|7*Xgh2`@ZbiDCLMK- z8j!~J)_-2$DFC$9dh*fLhLTckior`)M;+erkSNsD%^xWMQF)cv9UkU?W*5U_zVWXEWyQ*M!}?2|R1=w`GaH=-)rDU{ zJx``K8HTmpc|YW4B@}i|4hP&e{XG)#B}U1c?n@TPHJE_VUS{W~k*KVwqaCD0dW&Gx zSZOPy%$Q;QYJ;m_Y2*8t=@MNqd&P@6apD>*aF9|jC)_7&A^wve({X^XFq~wMSS|wU z7zQx6sr0rS|j3Q~Bdxe9@PM4)*sWlF4d!m8gTp&K`d zZ%I~u?-il2H^N)tzA&Ru6qmVUjAR$nn+e(*L#w0V6137gF+rge91gtmXX0r{YF@SR zfqPCaynlWnEsVwhWvlRg+`%*#bqD4u>k{*!f4;in3kB`=K&`Qdl0ND)Z|dXo{ZESe zj;rE(jQ%lw+7Sli(0L90Oi9jM%3sC@tnI_(7BOm^r8~(})vq9N=hQpyfk@#YUNA9&w44fKz*T-F4OsTO z^--R1D{K^a#42jI7Hequq&(^{6okFyd0U%oHW6i3C@9ZejjOHPxfHINVBNH?lC$?k z>#B`w!JZIep;d2fb>`*i)@EoJacnSeN5oB3R}B~`4-POb^%fgyH?{%9WE6>$juM#E zb{>^?$AL910URi`T#L39fBg z*fZWKv8sb8DP2`pBD|Ets8?#gG2N5ln|zht1wd+gfDIh=y}HXYL9ZSE0Dfi4QuZaI z6+T1Vz>byDj8X5-CS0bWyPY`c9gQX)ydk6j6aj!C5}6Uy#;;u0#YE2aE33!1?z3mX zYqo$FyNx{U7jZ@7Y{M?nf(e4QcyaGZ=39RkxZty$0T#d5gl&G~z%|q2{9K`ZJrak| zlBUWv;hiOnlVTWygWCY(3w`X2pjfWE*RFF)w?3n}NGjGH@=Zjo16obaeJjK-!SZHR zx@ga7hsfg{h_u@hplvR~uV{8t_wE(_rTC~@C;2YT1NeXoZ{LY^h;qB@!QlR3Y8_dq zmL4$y0OYC(@%DL@T1={{YluF-1_*jZkOf!xF=^vZH`Gi+*zy#*Gek z7rEHDln5xY-w%*4I5)QYMw4Ry0FvU`+uIT{e*UuZXLmj6gi)WwNVseBN3?W+1H@rp z7or<3PpQsg0Q(yP$Ro$x+F0ukWw9Q4;M>{Jbilmoi`rCh`tv=%26c{}uk`kObM zc>To#2RD@tJj48B?BgrN`>0;|EzQ1N%)876f*T5*SBK+c<}_?qrKUS_#IiR(0LEf! zIMb(9&*B%jWNrBwlf*-irTWqaQm2>X)m;4h#00fW2of6s9?d1=WF*Evw`YR ziy{JY9N=ChFs#Z2s9)k?jYyTeB|al@+pmpm@IqH+N`61doJAawA*c*8ZSO8EhSkw$ z=k}*USCtBUlAir-_=cHHCkE_#Rg(lrl=+w^bvlLfSea409$P*$GoS5!wy=z zIEEWmu7(%!m|O}Y#kcWe(1KZZO)o~b(e)~-%WjK9uDd$7q`-7tM!g_A+$ylPm7Gy4 zme;I6ju+OkTO8rUwSe*!)NIbUWzM(M&1X|y$bIV1(eE8)Vrfsy^)H+>KR-&;=SzG< zTL@FxU*2$)X{T+zrF+`>%wnBg!R|aQZtJ`=#N${YvkiSZv&)mu;I z_O*=qW+2Ta@=E;qh>bF23&IYD*X1D@rZ~0DrEso4UE--O1}>J1%IjGKpce6rqL9Wd zz18Jf4$IvLUhLx<>n=E&Jks}ZE&YeVFNW*CAJ!#SgH3`5bu3C;Q3nef`Jx=CrRbtH zy)UUR28*dx_B7|6rt}MP#Rujy6k*1IA1l@&6=<#x7aU!&Gzt;P;_~UC2X+Gnfsy{i z0iyb=Kpg#Zmx9%}FxO*W(zOhhuV4zTHBA0vr8FAIX4Si{yRRsj%$k}FRr5f8V<=Es z{o?TLE{Rt~1z*XRcccfqcyK{Ww$;;-q}j1Xv$AKFR6>D8eJGU>XwCD_UX}7l+19}w5Ucrt2r&w zs_S<8Lv0a-WnJ_5fP@h1wz;12Ejb(xo!Z2tE*Ns(+Yp9TZ)g067PhgfZ4;uB+e)ju%@%-qBwvGVsIC#jykZ{MtO8QMb%)ds63hld_USdW)QA3njJZD% zjs{_CT`xuJGo{89Yk~z zRcw^&tzV90Oao1*r2$)MPBMpabGnt+NLq4HdRj1=nSQDftZLK1vwbl$Qtm+5A zq(qE^TfSeYXlnHO@fxnB@>AfrOx*o5pOU^|L^_{Yarw)o3>tUAq$GAX(QW?3E8CWS zT*euftE;3m^eB|Sz$G4{w2ZD=0s}rZV|LZxCG>0rdgz^^NLIlClJVuf@EBdVRZX8Y zajPsBgsgV583i#qGlF$Tp_~!dtBb7wX~(X_VoZ{`)j&AB^d3-Xt$CJC`hF_n!7_2t zLio@a((R~C;Ewtn^7ob+hLv|jHF(xuaJ0GcG8kp;qK#W6AO%6;no#MY=?**^ni$ui znMsDA?B#mxwM!LR>DZUMt8{YHGUyJF7da^89$exAwWDdqLAvF(CIbfaXfRho>FYC{ zWxa4Xu2y%1-A6mYo0Jf_o7V@U?p6i|m6cqt;tE=s&i4Q`8KJ-$UwEbdS6XdcmkgRg z6}ZhU9S9USV0csw6`%uLTI0DAs{+?mc7WMtwYrX7zjc~~+8bawaPt5NOH@%_ADHiC zp*kOIJYR&#iAY(3YewkN+9j#W<`rRG8sDEOR+ghv5Mv5C-ro_*fyRGv039^rv_qJ_ zcPVOd;fY%C&iFgZKo$X7&c88$aetVljgRk%L>h;fkkdoDQS$<6XMG*wGOP!dEPaxm z1{CH%S6hGVBAY7g>3`(DmI+*~{A~%Xg%gM^pAZwEBHe3c@eMp_5-E0m52fZ2VA5%` zOVP9DUgG`T8QMS<}>ElULe5 z(ZGvR4O)LFt{Co#XVe02kzf;#?3E)nmPXff*1xgUmg8@%1CPUTEEV+ z%8LI0B-FQekwtm6j1C=h$bE?Rk!8pIX#!}r%JcY`bXkTq8R1#?UL`4AYu!?Vs55^8 z9hH9*S_1Ef<}ggs9Cx}@t1%Yc;>G)^5DKuWuG)L0{6W-UYdNjgHS+S8v*QOU=GL;K zjEra{v)DPZ+ek~|?)EbCO=bm=z};wg$2E&gWb#Y+*Q^QI+qehBx$G4<1F)*DUPm%YsM1mi#j=zT{hEqXmzD2X^P2N&7gB#$%~-3eOGM` zN1hN(i&re`zi$^8Cm1gS3chV!>h`IR3kvP{iw>n)2Mm7ugQkU&v0CF}(GV#lr=F>f zZ~GW96$66BV8IZWS%uh2%g^H+W*ig+&g-rKe8sq|S8ZGC+6fv(=T?`&j5D_x3vy2XYFE2ZZ9Mm(pNUeQV01>UW3v7mIHmd1;od6%C9=l56$ zVNrEzj2&(lZfe93xP7wbCYnsGux7D}=?!5_ECBJoQYyZY096c~BCF(!G)Go#qhyGe zxISSK_F>9aA_?%t-uIgE_%IGpcq)R&ErMJBR&~pt45Gd+{<~Lr8r5K5QSn;!ii>{Y4vkD-a{b4E;Io}v4+8mRn{)ag zO76utVEM#Qxf<)a?SBMVslp?{mB*+0MYQE%Hz;d?R8Ka%FojScAH^o+w` z6^hLU+;b}>BYbg%t7{Gy$<_m$_rn3Cb~1x}KX-`%L&eqN!Vpb&mF5Z*51eZAm$)+r zkqU6W*=Dtbb{|Z&grIt|qy;P47}G1o#3e~A7gTwl0#v$7Gi3RMcC=Flm8u;&kwCnY z9T*R*XFwN02A%Qp^lRFa<<-%LXR}~g|CwJ+K1Zj?N+cSM#wu^Q!L zw$=Vh9RC1?`ilC`P(V71`F%%FUPAUU?;hq}E06cKyy4mi()iN=HM~#;qn?TRgF6U2 zoAP6>$2pPUFyvQ28+t_4a-K!c4m>)_SOP5Lrk+*b8ch2jeg$Q~7pKg6Th%-R2gQ8C zWo;XZ$8{?;hXK&8_Q4$(2KE*6th1mC>NfrNG-@pz)z3H79e_4>b*{y*wMwWlZD8qj zj;u#}z~}B-{UgGx8n5)}Y!GUfAw{+URq0fK?_ zW3D*EE_#67dAqvDiUnT<@Hr5{(+R!>`B{0QDDx?csTSzS?~AQ3q_GgF4eqz$P#~Zf z?fT29SZw9zECL-yw8h{!YYvtUSHG*?VD*O!&VClLnPoKy=}6e)XlJg`i~%9A1!eZf z$Go)OvtOLc5afZU>iJ8q?kx=>o#4b=6MJy?R3H z3Y~ILy>NB75Td$r)HIoQoaIz4Uv7N& z>l_@}@+7zI+5{azEa#`i#i_Jj-{Qj+qQ6ij8)L0A3_wuLlaN>DBrXYMi_k^*AO%eU z)K8gbpimY2mCFGsFmhX?>JpU!d~6gz!xXN&TDrR1y40?%Re{p-anj~g#EJ0*=S{Wm4B5FsrjO<@p}b!MMq_8%*FWTT0NFq$ zzqZL;qP>qqHRDZy!QZSPXaE~w{{WsA7>!m<>9y=}mTQ18f4{gRT)bP^Fy@<};H^5j zm448nb%b-KxH+=b!-;%U@~*X{wq@0$O2%D}nPW@BX|`T|r*^LcN+r%)d*@OsE_{yP zL>V~%h4JIkxw5Emo|RQDt)_oMCWD5W-#624aAH7l$kFSZ8Qy1#2*%eEXiwp6QN5Yh z26kK729EPX0wCdeTR{iV3C=6-}G@Z=Xc(l(Cxm2$-_50!iEZ@rNXIBdN z{KNtoU!(CkK-6P;svR<)yyA1nZ^!*T#Y+sk3RlrFMVXboUW2W6gVvQ7i=bXQe99UU zgMc`UT2(HBXxlG*aDjtB7b<7(50X$?tA5rVN6DFefXk*=((J3+3aWnuF%G!=!qEo556$+NuyOp$V(ng~$+~-;bC{RzSdpg&YBpvdjA8l5VzWHYvy9(MKLl9g z%?FK=?8VD zIR027m`8eUP@^MFF-3MNUL}#LmEZ-@)x>u+TU|DljbYS9hYVMn+q|z4KyIz+3zw@a zw+X0iuLBj;=kqSug7K?;;wfxD0KP>(Tw8mJ@eXs)M?4QfR?1Tn7{hL9KEHEsXGLO_dLh<3_1{fUZ4oKqK zgd{)$)$r}sTAeUNoQQ#1Lt|T;)zR~;)_G^++;rF@QnlLt zv(_+Nj5W=U=1cmN$4c1br^^2T$j4wgw`_D*;FTpYw^I*hG>ItFm1g@?TBZQgk&FG| zGY$)N;euer>+&@HZ5XChk8R+$QUY_z9rEeJ>&(~-TCFPaErHm5dpJZ$C>q=IP%AOx zasK7AeyE=oYCR|LM=OXCX22H+e#QvXrZYEmaRQDY`$`K;=>-@GZFA=}^B6&kAn3O& zntPgvTUaPLo|(#Y^$14svz6D}C{GwJFFyv3mj*0iTeC#9uAo0}gVC1*$6E{OUQRj|AD^#?#WHp1h+lN|22D(ja~s?6@CQF>H< z_OgK+pK1QYL=l%QhJVcVhHeoR&@6P&^&Togk4LtDCYAehF#3BTG+>NcnqjO9P3FG; z0I0HcCbMw*l%#YP8SO4s#B05=>LUbY#n;?KTCr)_5%C?3D7jvdXVeuAwoQ1ftRfso zs7h+c@G|(S@19^T5Ae6#8wQcglyKVzE*a-8`m1k>`+c;mn8Qr8aqN`OE_G#=RSey~B3 ze>EK~LN2uH81x8$?mv7%RTw`5Lza$T+(bPM-^}2O_JX;p5fC*dLT0{2`af<`R9N(S zWx_hq>I04{`Xdal0(7ZWU41frL@k9ut)!X1nPCA)MqWbHP#4t9q$^G|Y~# zNCtwPM-Epqq(9OIay{O1+$Q;fdYCt72`6~Ly=zgmBWo>u?)F7Q;(8=(BS7aqa1e;u zdOl_?D2s)^DG`DW!8{rIKtH|TGIG@Yd0Z+%P*G}xDco^6?@6;pUss) zA!b+(7zH9`%Zn(ROcaX??R7B*E-wj()DT8lx~z@w14GNy&W0KJ@8T&*5m`4NPf1jXI07 zUE+*5v1XK^-$bEs*8|W7Uc*PO&zOj{8S__tGo|pTf{od%76an?-dJJa5M5q5#We2% zRiRE+TT9Hm?Z-0S%4+%N{>lZz>EFyJi;tN2=(9gmf#>(vDVva0b+wuKhe1_6MEuoG z^Iq@jIfs1Q+ED8*%>cLrycPS z4F+%Gq7dPqh9#QH`#A1L-P+-MzGXV^+3%FQCDSI(a(I^@hd|P_kA6q$VG~2*1AMB3E_Zl*%3-y^)>$|? zZw7#XJngZ+86^jd363Xue09ym?{{WDJ!a;{a z+Y%bUI2ephA{tDLt)i|$GQnF@ky~-kxT$k;mTROX^lToWKNAw}hq&8o_b?*EZ+7Zb9uU9RGA(mf z&Fc-EHTj7Wtw8ViO1;+4XZbV&Q|`V}J!0EOf}4Kt7-gd0d)Bs$2Gy_|ZEqXWTdWG5 zFn&D83Bad4&p)|>pOl|?d<@d+wWdJDiajVHZ5%F!?rv{QHpz@ zwTv#o6j)JwZ&u>0Z8c$pxUZ)Bl{0hhOi(xbnf#Ovk#2s}v97Yu2jGhPCdp1;uCPV$ z-(gw2Ir;yL3;@J%-4vHgO4AXLgfpw&r6(Ht~M-U zGDNJIADEJyu++c-*0*EhkQ8@+Ga2CF(^o% zuqw5tSi&FdO%g1t=ZonBD8oI7R`5&ALg@@~^TqwBuqzkM*9lqX{_w53&aW4DePXNO zOWMvIrbM1Az-xott@vf%OZ_1=%hz3w-s5mxFmt=R_?eJ_179wmG1PEqwN>5W@Ioe~ z*Q(X)w`r!uiZCCpF>>lHY2FaXWWA2Bez7crcY6m8Z(>#RyVjju<fO*{iapzTkwLEIkE2;rxWJLYz&(BijNoB{?xd5F53Pt zoK7iIM?78mWveu(*Hrn6vEA|Y5sxN*NB+jLfL|Qoua45~c8msgZ%rv(_R=~aQ-wEP zb8|)xJLC%NeDjC`pL%1C*x_-hG$WSM=wwk`?xKXrXh%aZ&2gds0KKLZXr%mb{{Uqu zv?yMvKNlD+y8i%t#HG5w@&fwX*T=`)w&k#X>lDSlXvB)Jhm)Oi`Rs5xmxnZZ5?+i&~!%L*8xlr8&sopfnv)}hw0iHdmf>5<}8jU3rs+`w^rRc zO(ca5mlZdic|M>3f1p@EH;IxCwW-nq8kRNF{zBeqWv)dK&X5EYg$f=9bn_@vlkh|m zxVTY&QkRDOWiNbQ$k_@fLwBbb+C_>sDIivKnamAdmxJ>bZmP?76&iPfL+>8Z`&`2m$@AxYMAFF&#=q^ z+NKJ(A{k{qp`@^qlC`RXC2;j9ggVHfWe?LQHWD)1ZOS~bRr}^9;M8oNnCM=Tg1^v! ziaQ^!(OtKp&iVf4UVL9a<|Qh~HFy>5z;3A?dY)i%tkdTnpo^Pth4T`^tvc!XBcKwj z=PH=x%Yg(dG||HE-g+^>g^SxceCOs}bzk2}nOG~`S3bMzElWvH!hLJfRM39^0FW_Q z*R?ZTKqq#S#&P+L3nKWcuKFp-h^?3D{{XSuW@09+vvon69R15h%K;aO_Xm;ekpp+D zr2Ys4#wFlV)l=!&!1!VNSFrcZyo-T#_*-(UR-n3GDpW^K&}qd1T_vz2X8Cc}YH5IDOj{n4i-dZykAws+ z46SVS2E1OVWbIySjWXi_P~YMJb~f7vd#n{jbMt?f=1@AH75Rjxian{5OB(s=`1y%p0z(Up zaiRKmC4nJ~<0iQC76`}d2oTj*$ye{iLL;=)nForchTXpZ01+!BO8GrA<~@D@{EGg-EaO8t1X>o(S}@F#YcI8I$S|6N~2(>+|;-& zexJ(W3ZY@qO4GY925&lBUr_27Q15c9H3NN1i0^`Q3-ulfzdd3blV`~;b#zh8E5@`! z`paq2A!1RU+cxoaiD7kF>JQv(4R|boz?fpZp2)X4AO!yABBB@(MVZ0R;~T{$tl5li z=k<<2hnAmld5==7nV*Yh+LrR^C_2_JOUJ332lq)ze|M83b;0ENB+;cYx{DOL2xD7s z@%}}(luSb>I%e_LNu=?8#w>C6!l9Z^e4&NnxB`Q6)h~R87oWB>_1;D)RN-pFNvk!- z&OOE9biGJU7euy)8G}zHS=t)NXu_=4ROBk(_#&0xlQ12X8;fVyZ5M zIyj2Y8}WuK43xX^Ul-Vj33h1ZkADz9x<0<;;JepP)HH_0q3j{p94WrMUM1(BNn=h- z+TVvQ{PcpMYcH{uuz4}q>%iZ=RjjdVJ+?o{o!vu=)mwViUsH@gR#&GgeC_&00K^j! z#qhAt?(}aRJ`VeZFMm29?0{MAvATI%)1;gZDDyIDN5r-*X z`KR!xGUb_78!*aRp)1SUJ~v^GLG*W)Aa$6TgI>9>Q3yY7F~|ezaF|jRnlH9%iqA>$ ztZWjebOYHQ;{rWl09_!o(YOu(yy^eT%vddf3pyDqjwE& zj$JEQj+JU{R1a;+^AEJVEM%GpQS~snVO17c~si9J*`XEgEgSSDVXXF%4rhwW~E%OHQrI=}@9Fc`xxJCSaFfyG|bB zad~H75o!%hZ{npkJABK2t^(Khyi$@RWTkMt-_$@t+}@y^94M~PQ3b17;|2M3lCpYz z#SBBL(fNx72I}|Bq)W~(HF8ljIUd+xlGtvd2v)w>-v_y@%tCjVtckPc00lucvktP` z8|fm@YE;$g%na;$mRoNuOL@zeVh36s1S%mFLuOg(M|{-u{$O>&{TLwe%g5ZHZGNt5 z%n5u-S#?#BT`TOr`vcd#-_*1&mlnA{zY`qUW3nDlzLK<<&OBa@#mj-OA?EqR>Sx#; zIXU~X1&A`M(A(T1%9`KzzeuzP47}|Y_@!@UX)HeC-L5KG1%_^nv?=@2Uz>h7^7otD~kq?pWI@$SJ9MnQT%{8LIJ^!DxIg z{-%728tcQMnY|I#!UJbpuF}CWqvQP(CnDn;^6wKeQu^J*L8s&X%>ckZKXA=4UeDqy zqCPcMJOT9_mK3gQGgEQXOkv}AkjKors2Z^ragR9C8cSB)W!O~Eyir%!B_0G@1B5B1 zsLEx67oRO9u`Vg}eX)<MbzO6(Kgu8hE0GNawuifQYS$OCg#7?ER(jsNH+vBF) zB4DutxD5t568XtjxNlH!yOj#^s_wwcUEFE&HYkMxvsfNHX_}=Vz5wTI+TxwDEg}GT z9@$qgHKXtTM=qO+&i??J>3fGMQT$ZY!0`|%Dbuu48^kgLa!ux}G(9~_WkecC=7<$F z3871MB6LP!+7zo~mp;EOtT0h60jx&Az!*qZ1a_WJ)IK;f>pzWJhOsQZGRz_* zc7X)#QR56{F@Z*lcd0&jmTsD{6X`!JdpKe8uV5#0A8 z4=X%Ie>hXgVE8p>Rk!Xllw{+sogu=m@%jlE8>#a($5?ocOUyl*j(KztFyuYf{?=N7 zL0m1)ys9{$LDxGRF}$&kFS$)DJOyWlzwE~F?7hrw`I(M2z3ut9*tL7POAqiaoOQ(c zN3w8j2Nu@@%seYNt?+%+2~y#1_N^rWFKDLu9%bs7P3B{-MYZc*QCBR)cpwbjJG*?! z@d4V{g@%6#X^1F`71hpMu&#)9bp4E5%QN>4?|byz=?zB9LiJo}-d^Y^FKW*n-F1p8 zF^;-GlmNhU<12z`G2#!oa6|6L29J~8w7hzWpxKA^F)b6L(b@>H&B&upA_F0;d&1+(_1z9pcC z^tX_i`c2a)VPaU`eo%vRVK#Gqk(La!aJ-(FWV2gxL975PD^z>*054groCe} z^Y)3ejkv_mAd9-Sb&8RhQ2yxz;fN&CQ|2>Pvb&ikfm}C`%%Nk(t&GS9v(j6EwcTL- z)LEh_M;&5pTNK-EUb;;?!)wlNtA={Z<1Dn`4!%ju)I7v(fmM2Gz{FUksU41=m=pLy zuiVNL_Om~OS&tV0$*e&uY4cBU`QD@_&wb5)Jw#SYCBszyOyGdX$~iqV9%tN05pM`l zale{|tZW}7tEsPW8(aN8cY^6c!t^y4i7lnkhj#K;xR+bgFRfPg!|nmQ=g;W@uJ1=% zH}4yJWPWgGi-&(brA*!kop!Z}~Kxq6I<}&1aK7 zpHSHqEMEuNJ{tk^_D|xV#SJp$i8DF3EG-{l_Zlg}RtNMy)Vpx}SEk@haQsrjg4coR zh9s`v<7~@&J}@8@^M0Tw5<$2D+Q?+sCvdEIgeDUFf7zf0hwC57_Z6ItYbKWXmbGL3 zvto(&7(j$}5E^3N!5!8r?RN)aEm~u=#$6{nmX$CpFlb6Rv#HAT=@UBeK@#CLr;FoQ zafuGI^qDRVch{eprV3YkAbmk96ZTt9i3pWm-Rd5Y3Fc%90`JDx#I2-{Wn<>11_IE~ zzoJn){s-nIXN&Gsfoiju+|VPSYxsv)*x=DkIq4yn7{mjM)r}3{6*a*z82!WHmVp+n z-2U)^5RW`}iVsbB&*I^nN+MyvZ%}Lar%Xnyqvd|0&evgc*4A$SSUHZ z<=brjHK1Cj^GPCbG{30I97o(EsS5W!kyvFiZ(7ItG6~I%O=ZTtBZe_!zM7{{SFtGb;vwd@hIo5F7Z`^3^#Z$~@2mKqt;vL1uhlT;>FQb3LBX!1H95D%!r0H>a8+u$ z=|s;rN#0BddlV~<7=VaaDLDdu3HvKXXB|ZtGo#sMEC&zYFqv=yzj{R&-_a6rp<7#l z+U2g333{fv;JN7)5Cs#P<;zOvC>M&h-Q8#$D01_U33TTcE@Z2tnyud4II_AT;wR~EhL!n|hY%=0%*)K)K|?hAW9Q-SBGsOFh$Cs4OzGh@ zB|@7~n>hVLVa)d{VcGR9Nk~7o!Z_WZ$kcKpvG||Mt8fP?PUqA`>=5@91OT3Q5ZQBM z@(>iNMEiuB>fLrX$NYtWqOEPt#{3_NvvwNtTk~?!txsCI`iX)9ubD<@@8dnUj=k(w0y59Ua9Ik|kr8EsPJgT?txWic z3DK{Q@&PM0Pr3Sv`kzdFc|*+~a2pFfTww2m22BS407Bd`l_@-5}=Uvi|ym#J=(x2TOd# zwOK$qR4EfBuA^TQU8dWd#%MA<4E*UEm|BNFxZ9JoH1 zfv!>=*FO~-;a<}jEH2oht`&Jhh=jpEl2(=XEdx0BG$RD3ww>Y;%D-w3LY60S`Hym! z&FT&+Ek&DmpDCKWdY{gUr~qNj^1t>%YKv?EQ)j4r4@}0CpP64Lx!we|-QAjSFu(%c zv0R^3>Rbz{Yq5%eD4`8Hx951u4&)stH_hS$4c0u@s7-jc)%%=6j@6%QGohBN+c2e$evgPn7Pb5F5pUiTHK-EnM+fdJY;}~fWV$}d`?`=* zT-p4i!|paiE+M32tgkqZp?H11qSoNPBDy!I(iqjptPN^FdX@L23J|eA4~Sd}-zFx9 zH|iSTx5AekZh1(l;ID)7gwbKFOd20##5~%Bb7y6^}nfI01Ui3642xaJXdJ1 zE;1Kc@pS}jzGP-4Y0l~_kjf&=w!GrzYbVHJ8fjN*wd2wOO9h!_>(3Fb0S7qLmNGyL zINl)zOq&w*-(Ire2VPFR<2Iv&vMkc=F0<$SiKiEyk*-_XzvN3pp(8gQMk=O%G;6oq zP-%!X&0C-6gpXjcCKxReE~kQFu(;K;*YU#2|z zJu#@I1PVIJRMYSLtm^=V+!TUI*+H~Fe?f6OI6e4(iewV!&kHNR7{MT z^l|qMYG`2%yD`<0WKDjL)O5!$WJUF#(+Ac{TC|$PdcFsk*cHKxs8hE>uh*CkICbc2 zI20-U{njPMM61qQeZr-6`!jda&uY8vm?1RNT~RB(o~I7O!VyrkSCXEXP;XV``aq+f z)KG|*Uu>{68G1?}70?8Rn^PQWJ$GEG?E(|W?SeGOFS@;EB)yR7m5SEuCF-kC+0}la zSy)Y60rLm0jIXB-^1W}LFReLCq9&Zr)I?7Q&S6`?8>OD$$^}p;$K6Y*nJ%TmvM5R| zlU_enIA;a)kQYe8nWGt!TakJu?_O!?DItD|l4U zdGc=gI&;vJG!=rloAhs8W(4T_)4;d{Z#1yp*1G*iP47*0Zt5XMoEW1j__@Vi40p$J znQ#Xf1fXlXb_ZQ16u~HDyf|-;(#>G`wxU+*h;YaJCZsv~Bchjh{6Oj7C;JXD%0XrF zh-5_6==&$B?1Gn8e?%!Hz2=;3^uRiY$K;sL_cYdO?OdlV=}9YryX#@xxca`mrzK*D z7BzYM_OndFgynSTzw$U2FU%`=IK?f#?mS1NsM_nKHHMN2td4~?=@naKU`Kz+Hk?<~ z15-}_0C5T={uDSGt>K&!tDi)<{LKC;D7HK7C-UP`OK7Sl8yNX#x!F&s zDTOG=*QMD+N_)TKf!S0-(7(I&4)*%p7hk*%C(^c+RD;}tzX-1}5fZu)jW+c(R;WB^K5hv0 zRrYBH8G@FEmfdxXBeqL{P#iF4PdmztX#&O}dgc?XGZMJY!CE{oBm6$)+ zt(}-x(Tr#qKkNpHS}C8!_t1U7LsM(hGk+|C$YX9>#x>7@Ka>T*nKl#n797a9W!)x- z{O7oQPpAqwNr2@giOy^B>P!oiGJk41{{RU^x&1+`z)0x)!cpn&ErOKR`2IfOZO-O! zSRTivunI=kv2PW+K4VI(hoz`kvIj`%B{6n(LQbR7!)TkD<)2F=rLgmBk{{WCLPv+lJt#$Y=b)9-5%Hj0-guAUgTkcx) zQRu&$hhw@tq!(PD#AZ}W9BjXElyP8NQ#{g#pYuL5>McWTs-G1ZZc9#@;&FtYQv5Il z?5wZekYs>i-~LRJ;sZp>4h!2KwHv5F5DHT2!J_Y4#X$it$#rjeK3nOUiFkku1DjBi zSj)tBtn}shnjOt=71DnJcpBrRSU|Gt)WOzXpr+2%MaQa8*sR+SJ*<}S)P7`a%54z1 zpTms2@C5#TDFNd5KaY}okkRG{uQ|kE?-SfrPS2<(avU@ww)2|&dXrLm=k|1UdL{mx zrI~fZm1X&chl%pQ6V8n9{=~z&y5z4BOdx3Qe~455vlq%0!$!?MNce45d*6HW77VKV z9&6l2n5`ZbYuW&fw7bw~W1y3BWV|%0iR)(ix%ZtI7Phf*JfsK zg*<*P8*5?Q56Kd)N2!n-%TGZ0tdVMgCP=QT@TEZ@dqMlN4}a9WJz%175qxdGLoZ6!W~N7tRSyk!ik+t{YwA>qRjjV$A@>lkm1)i6^@)uG z)lpG}x0m7vI0h@2T-7{KCIg&vCTnBDvDf}Vurg`A9p!O$`&=4@w%%V%s;#n@DVkiU z1#-c>FYMTbEv?wI5VcH3;^Iy|m}>_Tx<;=aHHK&}V@+93iiu|?A<&rTeCD<%2`wqS zPtW2CsmJf;0?*}b@XyKlf)*3_!o|&Qg#Lac^u5pEp4~mojFG(5B%D6ryRHZV>NSua zi6yVcsWoID+i&Yh`*xE64#dzpNHW z){OyK?W_uo0ZnbIe9BF+XGa>>$08svPxO5dSQlc|YL%W<-aMl>ue$5J0%8|voGa!$ z>^byB2Pl%XZ5aJbKn)=&WyIF%_D5YGxbt&o^YI@{MIAobc&KQmzTWt4UJp180%{0A-`Vgv=W!!S@*28u>`SPZ>is0CUMNU0^z7%;Bsc z-=&~HEWfG90-VB-8ybP)-?>}Ll2_z_+$~I2z9vK#KBHeofVItBU=yNQF6nwiBp}lo z+*mpNu`qP|iobS}v@O7IpnXgI<=!Z!IhQq_7k2OQqYY+?rKD)+>hl|`H+;s{p*)Py zE35c}0k){~7UV{t+kLg`!;}P}{p;Q$HMPRh^c|#HQ4F9M$Y&hja`5|p;dKk^h~jE= zC-TQeDi1Gn`1nt93ZfE&Xi0G(3C%JD*J2ooIrhrtAht+9w%^v1_U#}JgW}i*)Hv>? zM1V}zoLb>-r*S6-#;gJ$jzScI2 zCOt(HvP8b6dkYJ3!uW&kI+PxJ=g#_v4=6GWydD#5Sc`O7{Vt8X;HO}Xtl3W}1hg0C zQH0A;9Ea2uE1q2+zi(&~I*l|VJe$=`GyL+;sMOB(~bef{&Le`o& zRAA(QfTM)|gGpzG@EF_7{y-|_vTDkNx9-FN+dqN<+9p%@_)lmZ|vYa-iiBmj9b!upx@)@mKD%bzx-_s4rjIk-dLTpDL>W2wxmBlzG40_i?4<) zG5-Jppiwvvre+Qg!S>u;98Z};fhY#zdT&Yji^ulEXiGd8YU_lCj3H}e*6H?07EW{d z*`E*XlUJ;D(~rf5hp(}K=sx0bS$?4+Z%4LXt+aeUs7rbvdNOYAKCCm&l;xlG^AZB! z(hS`Ne9`q8wUH<|{Y7pn7S&+E-;`a{BT|1|4vDXz^#E6UIaRaMhO#;)iK=`j)KzU~ zv+bW7?tkz9!~iQ00RRF50RsaB0|5a60RaF20RRypF+ovbae30V7C|bx)d~!5|t&#$rIAdqGDS89dK{6Qt%4&KYXM0(BG$B9n9L zzU*i9pc|ya{=-Y8ucrS1zYO|3fC|Oog-Apsc*+p|2Vmjl+{xmjKAUB8@vDK!FOawv z+_JllJ*53tOwJWex?58=-IC<^kG$so%Rik3R@+GU+Ka7rpV%+F=lWgJHN-%*jDMjn zPM>8v9dq=ZVEujO$@@ns^!-;-2z$xCNB+;H#_o|CpTd-)mzsg-_CIma zB!T|`-r%@{Wt9-@(|#hXyHd2|bkE>56`Qh$)@$)4!;z{~r%l6==?!`F>ofg9q9&Mo zqEIlU1Gvez@7(&KHDM=}e!24{)=1!kRQ7{XqICwp&q?&#DlPkz&@A}#?{!nM*RH9x4@bWHDsvumq!3_o@8=1;W%G4Bziag(|4F(tr42U1jF}YZLP%q5lBiQP7*; zr8DIcw_OTPxO>>T125F9D=ey(?W%_ zZ`Zl?v(5_DW3$AO4G>zn4%gvJF=rxvldQ|P{^PbgJx{$pn1=?PX}Qc~ zq20Ql(kf*_^~4mV-B14j1S=a6CRET>)TH}Q{_Xn{=rZJfgAlq8oa!46@3j6uuDta2>Zb%gdG8&%@!0aa*$!(R=KgadY}FX zRAPMTA@d$cS~LFux+;<~4ElbvqyjVn1(S5#{y((qH29H8*qD%+D7|YQVq43+uytSN zSfJSsp9VXfB!_)T4*C%~%De6g@ala{&xsZ(MS|b4!`Y5WC>|LC`a{2I(-;P{Q|}PB z7gHX92x|WT@PS%3v58h*e^G`QixZ;xpVEhHOo)v(J=5uCv>$}-s|=t5EL|$CE7n@s zNty3Ad6{%G%^<1#KVjB>gR4KG)IC9z9lHC%29*aypWiy1&zmIuA6#eu0Ca|u3XbKB zN&C){fjBc8w~73JZPsh?C(g-3!!a0=_|put{UP(JZ#c;c>e$Z`p?sJNQ**+ymX0`2_^&nMpag+ zsr`b*3pT5l^sNNvPJSo!e1x1mkCgf$od?Y&O6p1a?z8p$&6ur!dQYm&dFP7{%>5@> z`!1~hii{-sTxQ24;ckC?Yd_Hjara zB*q*-Ry;}C%P_I=5UVe;+3I|R{ijU&2w=3A%>C^sEf-J@u$w61do%k9o!su!0+r16 zXY+pcUmN#Fa$(s=)ClM_KNE-hGxq$)9Rh1GTzA*zpf)N6uP}=s0PdFO^pO<`&Po08 zCd|qLe#fqG5a!tFpZ(uG;z6j%EM8~uLqsTgLTIsaF)?=&>-$czpnFO1=KAHE88O7O z3kN#rK?9tyd&01!!#;!pjgr29&V3NSvvcW|>0FIJ_5@`3@%|-h38u@Iy*XVKeHlao zloU|2?E2566eL~8WZht3(*D#k$T%MC{@Y7!FO1{wHkSOlGx=0?GteK1%IvV&>Yqy) z*FBJg$LTu5U%#1Vz}vAAVy(*W6YGv;dySul07Z!t))G_zbS{5NlZ6_@P|!!BPwtI2 zpFQ^^{U20UF6q?V{{ZgoyEgz`nJ*um`%6&vmz?BfH)1r;*6lN7EYG2|)@!ASSRJ6I zd^x_T0HJ6*!qf&Hjmyc5QXy!!1?Rp6!p%TB{X3sp%=q$jhMa4OTKh-&UKQmP zZ8{zz3yHIebo|$>GN~yZ8T1;8)S%Dp6l`gZR;G9wx%{@jd_{l1nEG)c^28N0MNJUQamWAGUGEeT2cqh+&$j{jIzyVfL-qZg8yOxcP zVAyg+ryCUbW{(i2b#fGAfLb>{K;jeB44=5@kXa2MZ?`_F5gJWK2||x}+BROB)_l|g z!pA8US3l`7594RjfBFP_zbyU&wm33It-Ke~tv`^XVvlH0fr{J%@hVMM8P|_j+?Rd_ z80maLO?Qpb<=k-ikXSmxzcA}rvH73dqV+PdS<75c;w<+3bN0Ps=}X5U;FOD?KFpa1 zPxl?lO0wAFPr}56!5pbyVts!})_&`&KdXZo#&kz>`(jN}!za4W^3{r7c|&e&eEj27cdee;xeOE4Zd9vFQLjI*Pb7^^$-31O%`0 zXYt4$wD)5G{*l8(!Nui|LNW~gH-)N$r(aFOKOoOjtg@i8?$`2#hf+Jljxxm^9vCe} z4r^2UOjTD+>Iw$N&N!dLN9(D9{~O>4`C0dQ${VRjRzt?Lf9GTtuds z_0{|8e#fkRDsNNbRt{QwNdEwTccne1wjsKdXi-7Y-4`81Bf(EMT;9RDOe^1$>%}i)8rUZhs!X z{{RLe!#G}l!ZF~%I^$45q^q0HJbyAp`UpnLzW)H3{9&+H12P>46MrxZY{{K=pTv=s z9IahC_t&&wgi-#>__Pt~2c)26er-l>lBdfnzllQ$O zDWWSm#QGs_R6!<{M{<8#Mvie28cIq1k*o>;wbkV&Et1(n+MoU6Op${>>rB%2h8yoG zgHWODz*8$8CKO{ir-fc|jgDq0!{%7Cr`w;z4d?zd$j|09CrrC2K^?M63g=!?E@ctz zFo59B5^4gSf+uu*M9Tsw#KNr{m2wG zYI@J7?0Zkz^^c{^qdq0&`Ux14)P5L2*0y+`z3Cx_=6B0*$OtG3zOj?E2dQ)W2!+h? z%>Kw%hJNFu{{ZhrwHbDfrBnC47>aoaZao=MK48->ux?bPha;zXYkGa0u(NT5c@MTj zEk;CAZhbt+{vt;jOiAeCzs7Tvd_f~&st9i8M>->V-EH!c7zS||1g0!I};vNa^$C_nusBtd92U0dpt z{{W+rAjd(DNmuCMmTJs55GxPt09~8U3K; zCU4Tli`w_cto<)o`Wx*1f(sY+B>5k+F=%XOlQP4V_UhL&=qaY6ZRsO|-$($Kq0@5w zjGm=;pV;Z3({$;TwpGQ?>y38Kei`#pTZXRnKm4}hvUFHj_RPlVzHcHd{{ZNOqDXRX zEs6S`j99MIX{KKBFvAjTe$9@%iD9Mq@*%6`h%x z`}Y-yrg>x>cb~cFpT>5^M70N0(i9X#1bDfYpg7rZ!eKr3KSv_n&+0XVDP?0{KF!l#iJD1zzKMeV(;HeaFlGfn1{`$}V02#WO?Px{zm8+PR0J|%t;xIK; zP9|$m%&pB)0m18-1tT$@bWa8iwN6yeu!g!>E*8 znOWZUOp&GvSe@E8#&1{Yj*pn_1_ul5&!#>{?8SJ)<;?v=^gQ<>l}VoLSUpRE?sKqD zW;qH*IBsH7Q|TR_pz2T4>__gPZhW7(jHsNmQq~)*#Qs^75>?3VJ1yINP8k?+Vc{;P z(E}FtpUjFFEL`iQ(;;)#?000AWVU$ZCcx{;q!U#TlZ z6X8?)odx?`cR#D)Bk-KOGv=rN0F=?&WVMq|#mq{rt~k*>>!qC(voK1xIwlRa5#5v`?xBCG?mb=hKsd zd`sx<9~C6le*3I(F)5RN;6Ir_H)3>=1Z<9rQJ__2C-#zuZ1?sP;(u4bLoWUwwE5_k z`^Z^jFapicVDUfvLS%rHJ0Z?F<{%nI_eH_883vC1Wwj1fv+8AqVJz+qpLe4fwcyYn zY5xGwx`Lvt+#%WvM_WZkrB2~l3P4tARq5p7Dv|}UDLl=huM&%icSZP0(a$hyVT;)I zOSj;^#M9<{kIF_WtjmQx5+QYCaUuL8mG?m_%r$T{8~k{;Xy-|XNqp!Bp-oTR>`ARY zO36QE)Ss`~7h2k`wm*qJZ`@Cy@U2XTpB<<1lI5Z2SI&KVMxuW(e6Z2hm{3hL^vZo~ z(|sq?wMg}-EA#fG9_2Il-C|L%>c?b+MT`zGLrgeiQ%5zf)BBn%C_J{$>X18}{4?gH zAQqc3#n1l$3JBWK9D{kFDOJ;PVk@fKKZDZ2O28!}5^Zb)#sYuz7D2;IOM<8DdPR`J zCU46dPeiq@WnqB6hp+1~gONy-lS-Hqi`L#$byzh*jdvi=O|CG_JWDnq!esvAec36RaRY3>kSQZ@kzQD7xKgM^kNnuTE=xGMA6?E!~y0!G5U)c3QyfC#?f*c8(Ve=%C0rY*CR&fXw zCPcu7^+WS5TXY{{4_z=SY4t0pXfF(LM~U;k;(Y>u6?i0QBAz0vbaeFD@ddQC5}J^j z5ZI1J8Q8(S4f;FxpUembOf&lqf;YZQ3hbX~W%KtEP>w=MK$|lF{*pRm`M5$k9qA|0 zF}DHL(ghJn(n&(fTUTA@_M!rqbw8)#A<;Q_k%A-^%P8%W8L0-@3@~r3z{qEa5ywXuf{s-RbP0iF)D8An(5ko99XPgFGty6vq*{2 zpUti(_IVgRqTAt*beA7dB_GP*;=|bNYTV9T59vgcik{Hb_JN0K-Ma&^bK90HIXgB2>F){{Vz7qnV~eJyPrMD~WfT zpvN8W+GTVwu+oEHyP7jA%<8VU_J|olOdVF8T;G^UQz}tuUU;vGO&CLR%E;mhL&H=5 z0F75A**k_X`cuBp+$sTkP9vGbHJD~x{oE#7yh!Rsoufx7k=__=^_*EY@Wdjlx=+Nf zes~@5_Hksg+7}FzC2Nkf#z{Vy!Z$r`8q8;+LI#502_Q<)bfvLtD6gzfqSo~uV-BlQ z@>`3aO^zw+a`fkA(7O0!%gTYKTw<9zW_@;2LiPUuh9498mO{r26x9Bzo}@3U6-kj^ z)1lNpEhP=OG7$a`a+Z|4f6z~hqbR?bALv)8qwiDt(@Ljm@Tb$55u~WClnHclKGXVs z5*{JHhJM$kLLdGDK&sFMvCtwkY$(>Y?=$*vK8A%fmV6}sg`|oDnR%(nG;AKfd@n)3 zt18E}MP403+mL*)*^mXVmRyK7f}mhsowJ!-fOIaAtMr#{7Ff(R# zl3778!8y$Rw^UXKtj34xm_l&~V$zoWw4B_!OjMw0Wq}_?9nd0nR_*-E38{%_Jd0w2!dL-Q|W-wvM>VUNizZVEaejeJbRy^2DheY^$jtSXG@Kkznrq;zaCEa!DgV(8*WDz=KK4 z(h6mc)L`>OXVXzhco@c_Ae@&bUPOHcr`5x%eShQjV?KcZRcH=kR5f*y@H1Yzk$_Up zVd163=2=zNE`LJ=cyE$BDW*K3{G{CKB&1w}595GfP2&UYK7g$StO_EN2|uV%LUdYP zU)@NQ6zpPuN5n@Hcz~7*wpetl3XJ~b1TLze`XBi}t6>-UWQiJpsmst0c~8-8u#-Hv z^qi_F-tM#W27g1yFQrj|e-iOh_N#^TU%FLt#a+=s>ONEd0E#y>gOWcnvC^^d$1aIj zQB_~Vw5|^$5^)RMXY0Bn1v6LaxQ+~-$l29CWFxt(0Y@(U+J2X=RQ6>Ut!hH|$KiW)J2Q8%jHpNYmOxmv(we4vY_Se*s6KOLXZiCu*2JS45NQ zD9-qZjU`A-4PhN8Bt6t@cEm*4yv87aBD`djY$Tz=md~hE>R@nPUl*ve`agNrQmvYo zuRnH;rPI-76VPHaOPe0a{7|%yQhgdDV`O64!|Dt2v-*pr0WZvCuR(7dOq58ojTK%} ze@Dhdaex3Q1P>4t4T}0G{wMc>v=*~7v~7;Ob3dtNP}tdlXYmza)U}7X_u?tQmMj?O zwM#z5ZYT9J)1cMbKQM;DEd(prVgv$|E1S2x{{Z5R%EXpte5c%!;G<(n0<^lvbO#g- z(N;pr-yPzsVC0}LQmt~rHUv^UkrhTDdVjRA;p%nIwLoz9Pvm}m;jZ!Aaz#080R)OM zoimdoF@e^z>H9vJ26P}ZK&A6Z3yKarC7tVzz4Mc zE^N6c(Aa8Oc;tQkBt!Bw_u@qlYz6B@PvA;OFRPsURQ`|Jb(D)ny=F^??xLmz2EAPI zWUuuBKc>d6#}oR+=ppLJZ{lYv;CHb;)A~L#4JR0b!PC*fCr9sgr{{R64WC+e?W54c5;nhIqFa$=C;z8)TJvtC*wo)2cB3R*{Q548s z8=q_JO+>|NAS6a`f==x{S+A>tL zrs6UHmCXo4KB>}E>>rp}Sfg}Y%_mQ_9x0z(zLWSnBPe~R(x=dAmfF=v+DlytPPD^H ztMG7d^}{n#fOo0s#`Y^w3QG2SoZdwuH}czj^!^27o&= zUe_W&Lr+0tZO;7~pVBoB34~>gP{*W)&?Pk7{(l(|g}p6ZXxx+v)tGf3i=W+DHoC*+ zeJ!}5t>@Z*Gyz1i%jSOpvcYFnq8iJiOc8{>dG?N*9Sv39J|{wgF0HGU5EBXj40^$~ z<1HCI!BhKAF%$;a^qSv8x7eRc4y_snkGf39Wt|KUA9Rcm7Gc7-2LAv6y4JRbiHA%h;H_!YX=Nl1^cj_D zay{mc3VB#x%mfe=1B^*S_!V3QVtrnsfVJBb=xAUwGVn08B|t4+gk%VfBeH!lGjVQV z)7)4aXnJo?uDxbjuGpCt5vG49I}qzra3hj`FV}U44{{9Oy`*6jv6HMjj{g8h3H0AP z_-H6fdx-tyFwVJWl>VzNN{-t^hD|D~9Rb&g{QfcxB#xK-k_C%qJJ0TLDOR(MPp2of z*LnQkw1@C%Y6NbmHXfm3V;pu{O&x8+yh{)kt7>1RmL1lFGet{RYd^Rw&?p#ROW~*$ zUKbp&0op})E{ye9DC$f?QzK! zq%75Mb=nK^0{M@`eJ@uQp?xEoR)vsteeip-k+2@Axc0SOs(<~mH!P6{aXh3W(0YAlyB$NvDjDW+c#O9v9-76r5Jd_H1L5I+aU47FpmD=5=ALTnBzn& zURJ5|@=*Q*P)(+bXVWTab>1O~g)u4sudy3+c&}C$%>->CyQ`l_Lte2Af7|bI{o$i7 zDdL=Z%BVC{x|O8e4oN7BZeZ63)IG)lls%ni^EA+Pfy3HBrnagxd{5!}?xZ<;kYfGq zAS&15s{oN!ttg(jeG&Q}}1~Tb!oU`^6}VM~JpNJ!kXy$b<o9<+YgY zh0_Yp%6h?ULrk29%KOVdzc{&Q^;ioIK~Aav0JHd9VkDgwL6o>POUun*jUz-+yrTVB z7QoDf_#Iq)3Lsqu+5Z6cPg$(LByi?@_uPdXixXr}n7V)q?SRDo1{)#|x);=>V!Glq zT|lPI<|PUvkkIQkcz_xL!`}>d2$ozfqw`{CJBVk;5e1+N2SkY5kQVnphDjepHo7;n zs(mYfmNAMERYt7Zg^q%5{{Uog_O`sq!}#9XsZVlbS?eW7CA?Vf>!!Wu31sNf<6K4E z%;WH8U|z(_U!1~AYegg3mXM;GTt3(4USQNICos0`$>?__2uGjb>k@H^L` zrY&2dqh|io`P~Afv%FTVRmBfEtE@kFd+>8Uzqaa4*GieU?P)!F#10bLXYP6={Z~nd zzx+&2)sTq>3sGU_e@DhfvuXS8nKoJ0D4*KIU8@m9cx;w%f~dS1SQk1104ZL!Sr5R^ z+O;2*M$+5@-FnaJ7XVzZ6HHPt;cE+9OLwbaDPgV1294p@AB8Opj!wnC!#}a#)~;U9XEbH?A_|+*X*!Vz zv7aI`?sG0b*yku&x$jJNg>A+1MkJ7J43p^zeNxrQOsLdh>Or3ckdue<+my-;0^;Vs zUf}QFhr|HbNzsU&C3h-KmLvyJA^6#oDx*Y@2=X)-4webObQAW;SX z02GHxUB&f3#9}B>p1}N1=q2EXVb8fgsUp<{9N>jsZo5zC@sZ9>6>t|=y2^s`s$>EDfvHM81%tdsYj22q zKjbbTbnTn%EI(pW=)Y~9iS;p93wshg;Q_HU#)T8}T0Z7vD)XqFATw>M@MrX?Og+m| z`eF;2QPDqHoiMTEWcq&FsSO?_-><$%GWNkTRG>L#+z1aq+!KKAa$Y69g}MDCYK!u? z`GQR;9TI;@0E5b)gt;g1A+QGv%`@U7d9>(r`6XL{mu(+qji+kP9iKD%Y?!stx1OZO zl#JLGgL((FHN_=F{->w{wEYL&4sM)wSDqnYAmq4E1vYv@T-7_er@)EyQ3cVbRMGEI z%WV3q_n7B>dViDn;d|GDV!fz7sSViiMZdD65=d=#eGYSPp(#*_S4h~v4k1#lr*wEl z_hzyjfJZ%k-jNm-Ly%!`fnmYmcqsRX6be^noJ0dack?Rw@^o7ENeChUOH09b0sHih z=ke}Wxm~6>0g4p|y?V!ViUlxwcZ?BND)T;}02Oo`#xz+?HyybYf{~Xbx&^cU0Ox>+ zt`K)CY}8;g04{fDfI4`l5F@1nbk!{LJx2Q)MS6bk@B+%&UH<^X4W`QMS-&JKSXoVSPwZe7YguYkWvFp*nTcYN z&7uU<`a3)*6{_cqTxZaL)`7kNp!O%#fE9Ec z%vuGk^8WzJ_m7ysYeuQwoySokrCRrVnmt)p+~}nio|dHog)FmVDMM!Vfcgd_xG0IT zBApu}Zgc8;#F+k-7_~HLS|{3Ale(pDN*4oRVA{ME#vu!X$BXKhZ+1JM#4V|zRF%r2 zu<4XK$f#z5*TokLMhpef)$KY;w_)t;AA^`cFhaUnS6yYHQvsqAe*VzTKpY*{tf;Uo zH*T+sCB;#>2C0`fO~3YEo!xMPgTt$jf}!J;`$J_7XfQ(^cR&7Y+lXa}VmXwl`>3%^ zgNQP1R@Qot49w9^x^VPkK90popk$kVDSDNFY-L>u@iJD-^_1p;j_|6(70U>$rE@19 zC1Ka(K@!Z9V3(g*1bp@DB+sCuV1E@?@^A=70bSr%Mo01(N-E>P{LiP7m+=g0HXSGN zVCE$9v9Dp4ZFf1YuTR+{B5%12UdB4u3+rcCeW{N@ta&kW`ZPPB8e}+Qx1seMN&4=j z7e+FiedLuKFoJ?VYtaYWL7^#T&&!kN?*mL3j!FF#C>y=dr>Sx&RY%pT3izM?58QPp zT|)6MgNW}Za-C7V&fBj^{k9ZZEv^Wu-$AvAwUX2b7si}V>cCOfZRS?SlA%%!EplEw z#8q3tq7va^R;e;P{M;!u%oeRavECq^3z~ur!4jO`FNyrlxhNa~PoOakp+#Soi%|B6 z)mLjG0(2{*clnf^hklmSv!G!c14#92$iN<}LRn~EuB5Wai*`NAzgWd)DAf;Qh`EHF z)CaA^#JN#|_#&1H1*_1AltfLC%^a%QUOj62LQi2^PTBQP5^M|*EeUWoUOr)C=N!gt91194Jlwepn?SwFs`wx`iH{@jK*fCd21i2`-lL0L6Kd2~%g?Of zn>BoRpGC?T0?m@L-1_!i$$V{i%-&!`_AmNSSv?2Mnh>5lrA z`po30Oj%6v!Sv}B-uVY(r1WAaHmv?w9Wq}`LFCe(B&!+6!cAs1u7e9;$Z|6n=sxKV ze(3$LQeG;ud{SJ`3F*57>2rGPk|4 zUx^$ic^m%#c<*BaV$v_wC07ivIXutnS_=iSWQMvn^?^YV8b^o#b#r3&pA&M?9UwGX zdO+lg!xlUDkx3MRSYys^T(2)uuduh$JD*TH z05k`D=1RtG9z+kIda8BYrUoN-7*+d8dt*hkXoyCX!iPa_2iQd%A<{yP`KPSO32q|A z!oCdp$GeiitIg(HrdndI!@V+^E+XClg^H=z6vwrXS$G%~#oK7&*#7``jE3_wvdb5_ z^(0c^ZB^z4F-&NR!=alx|BMpO|GHheXUwtZ@tjiR^)KORQFD8sfOONt>R$-P8Wz=ykEo&Pm z(w{EiQKmv3m2q+T0q{?!?RsE=s--;hEONTe0*BrzE?6$;ehm2;PTMD?%R5=I>Tu8F zu>tV|>la@4EGj6V^KcTRr0B@(mr|R_%`8pIFK3WW3q`07}IW#B3CH&HiWgUeXK*UU)tt`)x&S(T}x2UkK2}eVRl+ zB%IQr?1M1&2xN;pZ70w`p!F5c(=4bY&UP+bcV8?j+lhnf5y!s+v1eB4!4+bk?;Z5kqVgmM5W#u4?6y&KA1 z7pFM9N1}UE0)fw`)TJ_>1H-DCT{S`4EKwWCf2@m+KpLL;*``U#VWPIaU?z z@)REO(M`&->v|8Yio;bGp~v6x9WKM{2-{x^iZ_~{P@oYoj}!P-#tJUqj$yW0iU3~+ zFcXFx6@z~h5iSjd!_ZIv0Fe`U$`~;-8qRv7ihe`>!~lu0k&tmCO(Vxh5S~X0yKXCe zKF$!bPl}h+&@3B{;cE_>h!?}Nr~I5Quew>2b59eLh8aYHUu75U)B`n|KBQYS3D&rQ z)vG&8_}zG&Ujy+MUV^*EMOBgz=;|Ug&)M~6<_Z?_f9ihItO0}$%iQ|jD-&G{AfsbU zpwUf_BvNx0c)lMIol*@Xx7i<<(^y8tkyHl^wQY#W`d*k6b42S1g(lB1KrLWvo<#D1 zJuNY}ZO`Rw83WOUoappy{{XN$LwIj4g-O13Tl0SQPvq%MDi#4 zPttXVX|#lYajg?pAQ^9&NTFoAN?*f2tz}#>E};4ddPRg-;Na_Vfe0wb$X9S<1ynXB zn&^h+9@e9PtZ|9`HzGb;vca(dPk!->O7&RYnfM!Ov)J~M!o~)~4i976Mx+QU7)PNP z2$4e3iLqbZc9L}>ce_@Bc3!x;-|$2FDgL>710TT!fLrM>WU>u;?}?>9P% z6$f{KzXTfyAXinuV@^b-WGGOvu594HT9LW~@Tw!=!{s_aF1_HYuC1Foma5=AkG8mv#_i-U8^2b!gyI%BA`(TiE4$5K=mH zpZ@?38Okz6OZr+GPbUd17$$G*z*`3iv3aRx??ck76WZfzGJwjo{{W1+}xO5tPA5(Tr&*zuh3FgSZ6lZF@EbjiF{V87AJ85IT-j4`#hHzVT62%1Nk^nQm7)s>ga zFI7sAXoEIUPrR|wc63OcSWR_)#(EB1kGz}QM}}FdA9d;d=1`o8vHt)dZ*B#Ih3v??Q}@H~UX$ppg2M6@@-f`{B`J5@pTX17 zvwC0leM!KmaagqcLa(O&$O`zMU(|J%+twQLpQP&!(`c+iQ0rs-hLzAcI($coHsq=s zpVn-Og5?XTZ}DKYu~ps*TN+xOp`)ums_^iog|xcsUF1XDsDRoioTf>|49q^nZpN*0 z;peQ5KcJm-V7sNQls zGzi3xj?+Z1p%RNGxl12Q!VBL*wm9{JQjpj_00BO?0m`E!SY_`PDSh8n?ngsR9Js_| zPy=N}Q^9rVHpPhJmIctg1ASH-kfs;{sCWCYrX_^6qk-=w$bOGa`@J#NXLg$QvUbW} zrH4+mzy^Xxi*95%J|IDUaTyzNm5qD#bbrY1U#)8Sx1T-cIVWbE-RKVz1dVeXOzE{j zpxYW709>d?-6#n&y%6C*CgVQL06ky!6Do0QBffL(0h|C9vhp>iE`>(bLqhB>2-u}b z%MGRBezN3-TR|_sNMVr`AkvQ=C7KG%q+V})R4%i*Ya(%8aWgcV46GBbe$aR=6#xz8 zpZ@>?JP4H_UDNL(ic2I2*kwBmdjW3TLk|ZO$<+S+`owcYA6lgX^;TAO*u&pvVON>L#Z`k)Lg@0Or$e17aWcQqrB*4~bkfSTl7GOm0h5bjYP2c-6#MPD@JdYCD`{?g`Ohy zHL3K)u|Q&ypAX;63&mx~7{1v^SyT9BpF$1y^A{>Sf>pO|bsWa2Ql+N^d1@Cb4H+Xt z5aCOEg!`T3{ZB+1L~5eH)3|`u7J{)WCF})cd};!;3iO{wC>YD?p#ijhC|9V+i2+>u znSn)s=f&5#3wt4SSnkA14-5cpTt)DozUq+U?vL8^Oey;2S^;RP^|?UXOZ8Sh@J+Km z4x>gK(oK)zUCnZiYE<1rsc*te9so}A1n9zOga-KsqjTwPR}<>iE7pGtXfFi%o0Yjv zQ+ce;E`5Jd)+(kzdpUiH`cAON;{$CqjrYuD<=*QTpPfe@6KNfduN$}m)`wOQ9Q2?||O!Q!`F zr67UW0`m6vB)GibWS8QT%pkrs;sRJZ{1AldUXVqvJ$+@zn@|>Z1G_}7tD@@5KBzqz zlPDWp^f=f<^*}=?3VcAeh0An}9fFTZ9E^ut6uS72(nz3WMxHqNnaRC6p-UPfxLX_?KTV8+XFZ!vte;LtGj3OZ+U;3%O@bLKhRgJdMkx#A;|#BoQ1F?_Au0!u9tH^<+diMP=_K3nS?HAhZH8M5z^t~< z5P)b z_gzv9r(9GE5b_8s(EaA`Exk(o#cGm)y_`PGroLZ35d!O4UXrJy%YH-mJ)p*DS(*hk z@#!N0!H);{pG4MY)|~-=mudYfHAO(v0*&m={wLS<9cS!!&)#*1X@sUhy)&#c`%S?4 z&8^=a*6Lp_F!TWUMt@4-K)q?p=vy|V`e5bj&$?c+oC^kR>F%R(uw)Ex9&IyWxZ_|g z3$EMO5FiU&1V}*xvDH74gs_@gzQ=iQp6`^ps#3BuQtytRZ)h~q2RZ@V2Z$V8z9=p7 zy^vcg^;A^v@(`%UBh~YdNGY;`*bGQ+J85izk@1K2ilbIy^p8PbSmV?i=X+sQB&Za2!>o9OIL-q^iuTy+}h4IpJ9`(lnbE z0cKZaa_6jVjS|rnSA*`d&?FJV(MMA2j7I7KS+!KP*2rvSww$0AzQV!)0D3Pl?!*2@ zkX0(>m9cOEXfBSdu*(NQFSUf!mfIa460mlk#8YSj{L5mc2!PUh*RP2A3AD>E8AwK% z>hq$sd&CB>OsQ>fbHf!%Cs%m@>%~leT$cJZKmB;a7SanNh_xfWQ4vI>*w3!~$v^^Q zNOWa-XdD!6>)kOf$ulUqIjBh$C0r%SR3&?|^N&XK*Ssf;RbA_u^!@i#<|JNoN&4N1 z@?WzO9pP6e1gjjz!p1*>8;@SRN&8NdF1LLzpZtOn@JFQ6950h|a1#OKnd>qxq^o0b znykBnvJuNzKCoQUh@2SLjP6(x--APBr*h=H4p(MWxo*mRLfttt3IfwMG{EQuJvRq9 zs=b*CT7Te?uo~IxA473$J{F(6UWsn<8hxr74v+6MJv&9b$gc_msdp#oc8;S~{xeV( zM9|(x ztTt)jIw+I&ooCtov-u+`Oe7nQ0?-JbVUued*j3DT2hfBwBu68_RdvA<0D^q z%7NnV=6!H1(AZug9g?ALl3q36e1QD2gQyGYwGFQUmTUu>R9|S;CGy;cS5mQoSK(hm zOX^zzYPNS{d1L_NJ-QtDWszW7P*CCP@<8qT;R1)dPqQ!Kc}1e!c#9>9G`1&>UeO}; zkQTn|Zw0|m7E`ez08$Dq(INoDd!9@9gdxhZ)m}2h4fQT;SmzixmADX14qEmMp0M_YCE(ssh8D5Z8)YwosQ9x*TO?hAbn665-57EudPqj%+&a z`HD6aQkffi#~V=qU<=1#fo3*{-B@e0kC+w%n6tF3Yz&8N;#dF+QtA17P18KuyK-z- z%$6z*2CpVZy^0F4Pod+h+jT(rpf#y*9$=t~CP=Z6sM@bGDsDVK$}+kE5tj2dm;x5Q z4_SaiFLfbqpwA?JAy)9~Km9TnHRO`UF2~9OV&h!)d(YrghKRt2(;X4RD9Jd1srj3n z6y(J|W0@Ra!NeE@q$W#m5TZ`kOCVoHhzf8+Lt^G!A+v2?NtLk_>Bo*?hR`YFC?Z*? z@+C|9{UNqPE=o84$F*7x&)m#3q1m{RltPpj)Hii0=?j&MpQhou=O zcr@G`ns+L4o%MByku?hopf0R|dlZr6t~`=}P#eGsuZZ&YyXz?R{{Y!4ycdUg{3{*h z?n}scM$y~CSTZ>4?Y0W7)H%b8$hb~R@n@xx60M?`;A7W5E&5Fw>E`^swT z6YKgNp=D7${{V9xCDk1C)Ml`0dR!MHCDuh!dSRN@50#CckKRRHJ4%dkeRaYi{{W@Q zW39*eEU;KQHDq!q3(0l&W?7=Ir5864zFpxoKohQ0BgV0%r1%CQHqF#x6gGC8hxsof zk3vL7l9~NPxMd=@fWNsuzp(2+bH0AZtaY1_ntud8v^`ibrWScH#TF=C5YISAwa@8$ zbR#LPh0)UCMF4R?ZoEI3Lt!k*K=xPC0z}_P9Mt4&_Rb?G>N>^EEgRwf6Znl$s+_&Y zHv1AQ5{hEB+$aRhcgqd)@fSp3BV;`b4%wNz*g)EF43^ituD}(S&-(k%;t1k}(B*pt zvWVkQQOEv;8CnH~aw3svBP%F%4ub#P&-;`yir`GFwTQ&~gH zC?ceZtkvd&;V*>oQ!E;DLFcSt%7T^u01C_`4$1|~; ziZfO6<~M3N-k?11+5+k?FaVuFZ&YOSeIZ{eigB=|-B#k8;9H|mZks1e#C(-n6LIS* z`+18+FU1yxYkVC700O3fGQbRK!Ag)_mbT?ym6U&-CPL?hy#D~@;XRP97H4McGZ9j) z=r{)eMYGRLO-`|%TC9To-TQn`uyllR#OvPdWb{1Lik`S-wGlcr| zbn`8dro8I!D)Q?@QymzSH+0IHo-7OCO0C}!a*@s`90y1Rf{u-D&NfM6Ik=*muCxCD z&45TwQea=Lq16gHn4ibYG#?)fb11@L*b<~d;Vr)>ZqbSWOW8O@5wJEczkI?IXRacw zhLCvA5ETT%a5^x6$TfP)E{%swLz5)5vOx5*tC1L(xV2wN2xSFAQA-PTJivsc)5y1u zu@p58<|}8R7IsM04^ysX4JwJJ8OdSTC3nbu;k-2&4WP#iH8o?hUU@FISz#W(H|j*H zo;<3@-e;nZ!bC44NNJrJ^%`zrbXS)_xO%1;&{{F@15(Y3eZ!6z0RVIr(*CdlLO3v=-6D#c80vlj-{ov-UgZ?>ffJ<07UDYQwuftff#VD!}gwqzM64 zLj05ZXzB~t?ZgKIje9IzGw({b)3PwRbY0$Eo}X@!-hDqo)StZSpTJQ;Le~lRej{Q6 zSiZRJrHiOi(n~DE+E8o4=}XiKh*1HB0_U~l>FFGgXsUu!inidbE7I7AAXC#h>py|G zIocG+{lxYO&$)4-_Z)gK>nn-0tEzkqvXs->Ep<^Wi1G1Vz^|P99K)xun>SR5pXn=D zx+QGJ%L6*FN(7ZEZfjRXT+Mh2%~*L(`RNX6jO2y5*i84iY(pWh8y!qtMMed;Mvlj6 zaB>Hmv4>S~JIc`akhvZUx242A@#Sn#bqBn^bv=*;#OP3+6Jm;<40Suf)?YHntRx+b zuYVGs2z^+=ee!F$5;WOpIai=VLSmFa3r<`y#yUV%JI6<9V%tf+4pedQL?=YyQ6xIRA?5l zdH5o=0naDAW00^0jp*ct|RP_mNah*c91$7Zl8hdI5K^Rz07J+_wmbyb1OzQls z#`>$4WhYn*=rgK+Iury0eoK8KK>;p>8s9G*%#%j4t8Ht#XSF#6N4bNc!3!N;o6xY( zrM&Bjpp;y0fQ=a#=`R?-2w*3?Tj7Eh4z{;_C1+<1jb3zOW&T?&C;;FKecqDBLv~o` z#}dFGFji|d>l#$AGi$3{9%ugmjx9r|CdNR!^|WwemD1v5OJKSD2InK+{gebm%uJYJ z9PT-UG02f9r(Puoe8ISPxi;6G2vYpp()5%Sn-L>&iGDk7$jv8fSWu_sp*voQC z-Pj#UPo{lZ-R56I5{U`S3_a%4b-L-CL2TOeoIYZ+h!<@_uNBbi4^%-tan{LkL>P3N!Y4xQ`WgXS}p zDwx4qTzfY@gb=h*!H4(EalfZ(0(?q`V1wL%$d)g80Yytg@Af1$2lTxV)jwRxNtcXu z7yd*H6xxgiSa^UO*pgu1Gdi++L6J#9_BBkS7B}ucc^ay*y4inuy~?HOGJFi?9Ryah zLVb%X6Bk|#9~D2B31fh(%w}NL9AbT5hQJ)^k^E2L`wp}AJLm5@#`AJA$!2XOO#Z@J zpn$ZsD^Me9piKY+19RX85;M)fN{g;8%T>~{g&1Dw6+n0Z z^noBw3W3GCT6#tc9%MOZYjxv@e3Umt7P-pR^-hqDQrm*ybg!8H%5D_RbT1^Fqd8k` z*ULVuwA9f6yx{x1OHnIu2sYj^m}W!?c?5g~o~Uj307B*p00%V;cf0;cV>}FJcE)SfH2D(0|S%QB_>4%q%5B&3EzE(E$=p2^lBHC9>}0^z*Z zPchFs09WX>&2)l4&(b2F0A{c+Sb)U@<)KS^RKF;Uv^a~!Z*VmcX<}0xJ1(=tq`17u zsSKDaHuqIIWhx0(V71oj6hnb7Eq?Zby(=0FIss{KFA*0#BGAA4YB=8cfG-zStnn%H zKr{nqMeCQ=R?y1YATEJekLb#(Mk6;`EoQ#WvqpvJ?E zwzKaw0aFEb%2M&LE*XMA;Ton_u?M>+ctUeCG@N$0#ua9H%}1ulGTWlUy50W(lHx#7 z4KpBFtF-r@#V6A->S{flYIM#R#;!ibAls*`>hf+gyBAX}eqta(JTO0)aneLN+44fw z`qBgrpLa3VyLX1_KSb_O-%Rd0ZW^CPo~i@7KG5&%F5%>s@VZ&EtOiT0{idBPd++_4 zs>#Y3R_OR({s&QN1G|{d=%;alhSC8~ciQF~5abJ`>+DJprJ~sgF!h2$j4Pl3 z!J-7OlWE`epHI|vpQh@cRZcZd0$zxpc;blqlg`?M9J(WwG~gPtnAn9C0fSYeST6af z!8$Mnce9806Zzx6YH0reU$Fz4E*)Tg2!G(T?TELXfJKjeh|3^A4n?@ZVc~?NwM8Gx zzgbk_oke&pMVxOi6thz%nc3#`ToXg98Vps{bl(yS^#dGXvms76=d2t6tItQk+ub@v z-O$*_c5z*t^iBWwL;~BysZJ%hCz~*ujr0DuX$4zcG6U} z9azhtfDiDPkGrsDZUNehyqc&)W|~N)=Earcj%9(hl{_yttojb(4$^`( zw7|7jW5yOTaT$qK7lRq?Ex^=K;5uM$HL8Xf^7+vEhHLM`N-Ol{;^eglB(xk49ctl1 zy2|;_Jp+A=z;+T8QqHm*%c=5@km(a-E@JqE-3R9k*(Tr&A4i@EddFH zWv#s1Z+LaQKFmsBqhv=o89aMn^_`=-WLpFZ75OGWvu7`({>YXevYn+WyvTsJ!co$g z4PXZ(I|WuI*GKuxVpzo1`})LER}Ape?=^{gg3Og@TLw^VR?+$>CA&DO-eIbfNi%lc&LO0tyc4+^_)BkTT}) z%x&(#9=np3ixmJ#L9^4mN7z6zDHZ7lkPIoSYx6L6A|h-{pF?nHLWa7Wl7gHgeI_+S zNQ3Cjk9}30M{X^C(2o)L$&UD5p%(`%FRV?^)*-Iw6HiD66x8ycNBX&5Px%g9FkRwl zs6D{H_u2sU8W+}?U=|^$$bycbt4FK=*^)0Dh1Nn%A44-Hf6KcrP4plLkH3v=T^D!b6&l#sRQOA0g9 ztBUqsi$1@o>pxA^K8)$PatKqtZ_*lR18l398v(4TN*p~*Gb6jiE~s6IT^9RdrrH+! zlA%HZ=(gy-3H*Z(M!}h1kGTmcLeK>Sj&54&^bYHZgE?)~fn1t#f#HET0eCMrfm(x_ zw2kU@245sg^IHNwih}udDNs}>*3{z~=_66<05_g4L1Uikf}VSGDYaU_iFCEr^#TH| zpk3b+djHYt=HM&B~Vw{E7L>dyk-<%aQ-Vyi*JPLfNid+>X zsPf^#=aM;OA{4Vupkv)Y%mRVR(eobAWNX(s%U7qHgTRF#x{0Ay$Ks&zw`l;Y4hul$ z1YlYgt<4-4YYx~%1p#-utQrdG34^Vo@Y_+<)eF0=B{&ZNWL4Fs35ty(XJ9Z|zjxKM(-ogr zzj|@=DU+Jo>%95`*3-v%!NXn1Ioy@n1(nhRgv?(O*u|w+qnOgglp3I8%fB#yZx3gZ zeJWeJEyG8^bW@-4gMHBBmO~YK(yITJ|(KJ7j**`fVZlr<`mk}UT^%F8c!s(h{;C3 zN3@P*JMDp|C+nwp!YQA5n@H-2L zM7k!(3mtoox0#Y!bw(RoU>sC#9C)TZ0QGY?42`V=*=ZWS=-NfoXday?nlFv)U<07Y z=Ms@9+zhJh6?9Z3qey^j+ARz55D|h=Bce)=2L4s5nmG&;Iaq*2?U9=6LD31a?g$8R zNyDp{p{{Q1wNDmWxY%uhMKyMdV>Yy}%zQP929;2NCA@j6T;=VUIu0y(9%>p39Q0XE zP-XPu7$q$lA?Dv`9CI@w;kC_Px1Gbh=#j8^EXmYJaW&<&M||{(63{wf z>VnrP%&F5qlp)3*2G}ImMs}q;!)RVM@d!=;u~iN-RWFYdZL1bkQgyJ`NYiQ%Xjgz< zT^5YT(70OOkFK7T;w@IbNLp}YZGHHQ1TZK~r=W*9Zsp=?A({zp^LX;hYLAq_jnb)t z@wb9)BH+SqMzQD>4My%2SxtdNHr7~Y27R5E*6TzF6UI{QS5~p2AXj2tfGs2iFokZW z+k`({9ql5P8J9(sI(E0Kyom~M^%Z$r_M!|0I!rqmZ*&{X0X~&LYm(KfEjwV1@!Xdo z)wt7EXs8=w?!is@R=3Wj**j!uL(5GY-w_0yk9t zWz9{?=byZ=(vPwrS0(0|uCnuKm;&9@Y&!Usx3KD`5+&{gB2N@BtfL)hP&QwS$72;{{TS5 zH$Q_pFb>$UpaZfn!Ps_R#KiSXPHw-(DCKD4@L$c#=mA&h&v^}t8FqMM?55&n*k2Q~ zO!}9`<2_kVB}0Hb8>0vz&d(66rMc6*0$Kk6tyO${#8p<2j9ljfNTNQ{D+zM;0$k9R z9*)o6KLmam+FZRMcn9pZJX~$kOR||wrvW^D51^!_Y zI=PBzNVHhz(l8iU1{U1?qN{6bFiHu!uwS_Q%wGlbp&DfhSIEzdo|5RWlf~KevOUHv zD@#b8%p9RR8f7p71E@cHpFyVOuHJJ#fz^smlM7q5RO&x4Q==S9m>RiZrTju_C4Uy5 zh#n=Q=(_vCsX$EkEAt}OteaI@o#>5m)XKx6`JcDn1jw+x7yX;fN&DT9k$KOGV<&P4 zQ-Z-%KIuQGri%-KgXQfKWR;B@H(s;)a+DcZM6a9=66zLA7nJ)5DXx?1pt@@6=juAo z({)K$fSXWB&oz-t?Hxd!#~4|Kx2tg%Wel`*lZ$ET3u}7=pu#D)7%AP3#l;rslEZbl?BEm@(fhdtW#Y=&D!I`V4J*|s9;nwBGQJ0Dpm#u&iOsJm z1FZ>tI>09U_Lp)EA5`fCQzL3g@LA3-4Pm?}Vym*p7$I&3Fe-cPSj@kF2zU`=mvo(O zn(I-84Py?FV5Xb7o>pDuQ);B%4O);6`T$Y06WseD+;_R ztBp)Y^jj9qj=IpY{&_Sd++o*FCmQrWxXTJHR(%j4KvcbpqckqBty-aiQlPrs6=!Ps znQ|~kF+*uW#vz#!Xy6NR=wb(0AGrWJBPpt*wmQhRS^(!L3}&FP8`7bRwH*SEx1W>K zN`N>Tla}$y<4`eA1C;|Nf{n~*D8QjtXcG>$i-)}5#yu@VgbhL^Z3~pW_6NkkyN3JVm7~6lMaCB13-{blghxxO z#U1cN2CuLyVdr%}m|}eadrC_?Lk2eVul!)@is8F)7zK+{`?#>y2MLTyn>ERzKX`&# zp0?w>3$&~UXAG%vX1daPPo`206zA5#6^UTSih!*g#z3Tkkqr*uBj>;y&oEjWfyJg) zi;ftE=1I(nQFQAyuue!G9i65LPpJ$Ibg!6`b|;+@tDjVV*<$PkYc+Eq2Eoygieq=j zN-OaI5IAAS;(a0{1c^w&{Sl+Os`z5IMJS|Ul-;wZayezui;u}7ju^10fxT1rl7h2O z6Y57})_17W!23ZcIq668Lnp#Bh1i>ekQO~|p72`KPL|2*lipzD1ZYqbwr0GSjZl3X zB?C}9Eo4#RfKtW4o{}mSScka?9n=poRV!i0gZIS!A23?M zioBtc!p%gpuR#9*NoIzN(jm6^bpo&AGMOo9-b&3yM^Z0QYi5;CkoTFPNr#yAr>qNQ zy`je*ZI;2w?xFXX zwrGOga}tZUFvD=D1g4=HKpuiGg^Z~gR@X9${D+EuV2CMG%$8~}A5tWIEtJ9!fOGDNQj98=b1wXTBQ2X{WqQU$@Ir2X#9i=&2GE(BI(rd9G#5Pg)8RaRz|2XQUp zLa_iqgMOZYgAPOn|Cr#7(XQO3yOoUaxXuLP(-tu>Qs`GiAJx4uG%-iZ!lBZTz}GACHxE zON)nO-4A?-R8>Ig$_P2s+zwNo0*bcWn{=)`4ux{FD1(u@ZzHz4*Ab0ONV43trY>HV zjj~=w6>xLwWJWX56}iqCuLCW!Fs^Q{#wx`_lvjBm-s`@?^0831^^UkZV04L^20>;u zs9IFH7KsuBFSS?LpC9bT*YRSJRx-Yl9HQH^r|2ummpoj0ORP=E+?L z`2+hBs&ZFXG{r0hY$*+4c`#yK02_igTFA%H0#v71E-;RI%gsh%H*p%)TO%=S3Aay0 zu8l(N36RMy!h?LEWoj6al4y!82gE7Tqyz<~7L;x0q(DaLrC61^P%n58YeXW`sIIHc zvVn|wqT7I!$OT&CK7r|r-C1wl5Sp%-4{Eb3_wIo z$8s;$^n%|=wi4;fr&2COAaAHfErbViYX zE`x80X~e?X+FpRr@pqtBuUaqW1PGyU11{&)2L&{Frs7_Pt=(Ix`i`+UiUFrC{i15= zE)}KTxWj%W5Ti|{4f$UPYQ_g>8-ftz7i>vmZq1lWFZ&v`d_J$opG99zU2l9X@MhXbIz&p7?XkB{CI}l$P4r3Lm zR>qOWEctbr7<+a!?t8tVm5)5p9+gjMBO`q)(S2&#=?Cwj#o<8RuGJ7wP_M>WwC3Fq z4zDEam%M)e zmnDumRA6)4F?!EtQP0_nh0_GO^_CW4vZpyv7{RU>Cl^+i(AvFv9U+BI04+#f_F*7H zpif!>C~z>AXG+W zQIg)(=`D=mj=)w$0~AdOhSDTA`jQ)1YVW~lc5`Ch2!xOUWCN-*ov|0F3ws3UXmaYj z6+*b6unul}6>oQ#*^16bWo2-7CABh}xSdul=fn;}FEYKy!Ro`bJi%L_6fK1vZ9`|8 z>XCf!q!t=ls(N+3Q>!Yz76H$tnavcF_%w$q&ym`?Hh_W0ZAO@XAnVUR%{Av=k8`eU9ouU zK91dCGSOwl1=lvW$5?G#ZdXO?hGF1SW%|@g21|z32Q_~3AjXiB<$n|Dl<^9X*-tw_o!>dWZ_F7{b|781xx+ZhMnXz+R@7;Fn-?iwh@I!0L21Vs_vStWj_H7}jD zagj`SI)n}JU+M(VLbTwH?V{(&buLa7I~y>-9jYn6Fb>ylB8gY2ATGpDY{=!o<0^M~ zuQL#ouvw*CV+gYiFY@QyX=J9}>-3 zM!@v*7#8U%yMyf^1z3uD;A>QU%d46Uw7G5;((GT1#zlf0(NEqA1%}?3fV2k4rs^}n zZGNHoiEUU(@XG>F2csFCC^bpHc&d{-J97*+Qu05EMkP=OX;RILd;%m#xfh^c#9((9 z3UNIfh8aknKzi%e0}f1~hgI4$7QNwt5m z>Q)>;;P0YUmQ;DH3jE1U4Pk(w04v0MvqM7+){G&Jll1)~U>JPJnor*BnSy(*0^WT| zr!eaGORvQKocFU|D`b8VOgagE#l<8boXBTLT_2A2C<4`p z5fG6wW)LNBn%B^{mjiAu7D{$iuGKSE`;IW7d@_sJrZYwR(B|9UEb--8 zv01>oBBpb27~)CW%(=%{LkLtk`i+Tt^3*cI_y z!*Oj|OKH`=fg{EH);*1Am5%)_=u_HJj6ylqFmN|gtg#xfZssUJCEHof;Cs=v`^Ljf zY%yI~U>#s(dBd|S0M(&f>E5P__4kQcyQ_2vYXo1u8g zYUn68mNv0bKpW?=z~Zg3l_i9G0aeWgl_qQzU|DSNRqrrVqg9ys?MHKI8+DYT%HD$o zwj43R(4~efV$EF&)LcGB0ixnsxV+}(fa8Q94y{`4eIb4TA{r=e@pHst1sIM|Il^KzAJv})yEf+Nf4%yvN)&Uf5q}{qXp@Qp(!3HTpQfL;Tog7`%gkk`0xdbh< zd}36iE6(<5l$q(dlBTPHQUhR2-AW2j*su+FI-yZ!=k`f+DZV*Hs;XOzOfllHV5Fik8^0I3@HE zTDx1sA?SCAoGo3M@ePL;R>sEA%8j)wd_x+jJg%C+t7Q}q9CiS_3#;a?P*g`~4n^az z%i=NC0TD|Xs-+FO+Xwc)nK3w3m zvSYD`+rMpx@ji;2+<*jb&p+hY8w-yR(07oIH#ye%jl322Nvw%YJA~wfGT@H8p}JH9 z7Uom}QI=M&&q-2HnjI)9`HZ509rIVi_li{j?o~1Z2MU2zHKllLj?iv7tboU&kTwTV zbW|s73!tF}jM9Br00B9AKMp;hdrD|%x5^|16pj&>bb5#ny~nX?bOT8lugE$wuxtjw zcleBG7uOWm=1OBegf=#=+{ZQYO5?1I`Hdf#&F6qPswkQS7CBYS>N#`b0Z;+!_R02{ zyjeI^aD#IK)M@a|NtHlGf!~HAx79vT7KHa^I&NXq{{RR@GmnL0Fg8=Mbo(-~DGzuo z)@Es^C$uW|(CNXiyrgkbOwcj%{6=|1_G=phkymW5+A_|in7pa%N0;=eK{cMCGJ24O zYbhaIzcE{pD8MPyyu!>ctD?i;L{BOXg{ajKtOp}C1lxmk#Ef!HJ|Z5Ye6;(44VnQ8 zUc>G%hR8=!%lkwdhS#Jishq`>vLm8M;sUFteP}WXVAZbvW=T*N$mxM482i&-H7#kW zF_4d6Ub2utSUU?n5+!mpOR&Z&to+DnMMcGvQ}>-C=6>i&Ej)e*ZaM|BL3XgOnf*1) zZmXHCSOu;F;bHJ0qiBFpMnEMQIfDYx?hz^m#uwR@=v*n1qpktIv-linKsi}=E7ja% z?tRfH;;FS{dk-#y4WJ=b4G-oZr4|q!4Bu;wJ5?RuaeBMM?WoEQ>}) zXd|FnflQr-6N`#0b`OP2`ISk0S{_a?tIc+RGN`Pr3p!?M;ZVVc0hST( zXVJTmMa{V#>Ruc+zyU*t2K&LtrSoi);SZ#Acmvr76oBN+1xeQkS#P=?%qAA&(5`)I z1!ok5iyjSSl#5|gWsObz{2i4n@|_-m*Z?~aUd2#cmNwwWlz*;kk}JR)e3KJEr50Mi zi&v__Ih^e(fEvLq(ogJJ2m}J%LBV}tuEUJLPa&_WrFQ;BW4?`M^9Tl=M^s&5xY}h%gxo^~^WKmI8b50nAns%iMvEB1~yvIh;kt(ak zEx+xRm$3jE0Ms&AxuI2~%K$f1ser4hQy=y>wr{t(CuQ?i(N|5hNDI83QrMl<@yth+ zfHIu|=-SJT+dW019W4)OY6gyu*p8j~ZUNB4K|h9->nom`TekJvg?tEQGKFG| z>r%%lTyB$GrPaEuM0K1c+8x{AS0rfXw6>-MWLVs5e{t-^X3>BFOqi5`qoO*bDGAWP zfxw}{xD=6qR4a9wvDj8?2QjpiOtKZa=^N<^Y6=&H4s=Xyz+0oXkR2`}Ra8?E7kxyl z)z!wL-_Esns5EByqL++G z6u~xE6#!L?_j+@~bVpg%A_(o6r3?WMKzquF*4$o6;*OHfa?nzuI4NAcx!0_1d%CDm zSC;sX+K?1HUA~qaMrf(F5Q&@s8NfmHU^R-*2|SBeSN1{x8WwUmU{5MBP2R)Mm-Mk( z^i_zsU0vb|U`!!>>cXmDXj@wBw_4U!lvZOp{atO;%iAxcR;fW?rDYv8$Zg_dcOi08 z#pDNo&w2(RSZFJpKmxEaEW33A{rs^4<}PFDjpG&8}pfMVd&Vy z?+UzW4iq8SEaiq#Pe;7PyAscGVF}RPGO0KdBjJUGWUk2b9r_l>Qc;AbXn2^@l{N;S zGQx7AZ5_@-PN9Q9Je*93+BqOC9nKh%IZqv>yttn6ieU!&W&%VFT4J6bXi5Srj_18p zb87V?yNkgJ?hLWoC~%AMGJGO#1-+wtVLxHj7On&yj8m+zdep#wSVb$!ksi0NSVr`% z=Qw~9I(sVSKSpHU629Kh1%eL%awAl`6W%@mf-JEP5}*8>sWx6UQQCEEU`N_&{Ka#t zf!3stV~)5ie*V%WsY@yE772iCdfY~>N!5wCD~ocim^m%C?=F1NI&D?$5dlgMQvU$R zpW`25@9l|#(5!BSuZi}V<*GNVjY>r@G*EGL7e1K`Pfe8kK(fpMOjT||Xf)qy zZUC{Oi*$6A-bV#pJCsX)wI3D&uUW6VFJ1)N@~!-&BgI~jZvOxiA+E}`Tp9Zgv-jO0 z5mQ&bB#@RzW8{q4h3vP2G@+qVI*0V84UO^A2Kp0VtoiX6HOVv}puR$Cc!NkCJztTA zRybj$C*m+@U4@QYd!y6JIWH3H}So8@K8eET6 z9;b*@6m!c@6vX(@&92F;AgBC)K{*dA>SrzR%r)bsnb7AdG!`ME16?8wIOb8HJz}6pE^PcG)+>&w>b?3wh=&8D z-@zwq1>O~_wZv5IrDzYl8jBTRi?h(&=1#DC9J_a5qJmG{7P-(u=f&}8sfwd(by=8VOg>E+4YCVKy%_KEtTicc_%%swT zM*<5*04i^b514%Ij$FHw#y zojRqgSZW7R%vtx0ICAcnmb&Ti+4Yn&$k^M#g)pThUFa|oqIUh}1k_zPUan~J^@-Ug z2jrK)qoZW5>zzvoZuV*NDz1a809#_y3424B&f$XWt!q4zPhfd!lx!lNXT`t?VIzm`vDgk z8zdBM76src{9uQW%B^c_y1R`p+(DQQca7gwv59WjF&zh!uZS!cHNmdxF1gL&qzu^< zAfO$rsZd-JJcSO`j$B-7NR9xQ13b_q}nN>!$U<|HEeu48qmBj}F87XfVF;S8rc>;s2 z@tB>#cojG*&!##>nJR|n1B6osg;)Y%7a$5da(QM!=dG%p*fLR&Hqa$zD^-vn9T&a` z#G4f5gmg8_Jj^y$xV}}|yH_kL(Lw^7PgPY|N7jZ4>dXF&G1!f&N@Ez7wdq@zJH+)B zBP9|+gS@Oohq#U1aRF}GT%YVNT~?Q)D4Y=2n}6h_1T?~fVA06Q0svA-Bn+ic;i!PC zSZ3GIN0zLOVd;E8trXfAFRUo(hYtCdh7opIh z5;TmTiV*c#{{X~tX#g)p%$mf4H)t%^ z{w1o4A$u6!xePT56q_r~2x-9hvg8o%mzhI480k>4Og#gim=;o>k!tF@jA;7+AZy-W zSvNp{{L6$hZFNWdm|!b+sPd2gkXZJ-pt`brq6D_Bqs*cjVidr;h&euB0DWMSbKqTc@&3 z$w&!OaMAk-A|UJjnCevDuPtxm1pt>M$8cqOM~gMQc*&9Idh z3GbP+vI4Vc-v}TX>ftNCfDSpe-*_KM%Vu)EJ|&jz5;?@v0D7+n zNIT_;7O-&KnI}CE4R@R+ONv7!vBa_zom+lspg0cj$k_}a ztIz-=ey*kJ1yzq(uJzMA0=uG?#gI8l=n?>KaMVW$EznS92)GNd9p^(1W=myuD<^0P zMlj+GzScxuu2L&js_Dorw9mTyj*J!LTgHzd;|CLbjd4 zSk9u*wdF~ZjF4Psh;{~OMOwSTVV4(05NM`#qhNGru-djkU}x8@PYrHfqF@j-cm4)k z!;t_uQ-@D$i18R}tDqc*t1jqTM7&$g5a2y!vn#wCDN&oXl$D`W0x7l2biz(H zWWqo-5m|=37Q|G{P&WF9s`r+e0gh^1t)|~{P*@DA(@(QC%X0 z7W77fUQ*&VaHgTW0FLE~`ItkQ1=zU_Xw5kBHhO+ht_oGXrL^;M(SRz#j!v1C+kFQ1 zxT(iB`==%AGMZDEG?zb1)?h)eadMex4z+Sc`Mo+6k) z&B7u1ipK>VB%;0egh>UgzB3Dyal{*~1Dv(5S%kzEFpH95E}b1;Teuj%bV+PBOf^D# zxgTh>!-KZ#r>@}84+Oa#xm+@ra`WjiK8Gwc>!eq}zrL%q%Guq+z{^9Bcay0Ir6xp| za4kvIf-E!+Wt%FUBI5msG-Y;$-=#|`DS5PhGFORSe!vDE(Irc&k2&HrKt0Z(^%$+x z^@{@n?@y-{dyEA(3fC38ip93x2A?REf`I24VUtkVbB2-bF)XUrFofe=s{a7VYB8zR zwD!1ShR-Dwz+Gt~yv&x3UOLDthQWX2R^tE~#Cl z#XG<$hu(c@T&#MvzYuLjyJiVizS_lG_JKf+8`;OrK+uB7_pE%!CumEJwA-%&xQOjq zrhdb${kKT{KUpT7gSXl#MHv>E9D74p6^KNt{{YGT1rW7pI>%P*S9!v((kSU$7$9G> z+9isW6x@1+LgNIlJXy{xxUDwbil?rF#HymaODv=2qgRbjrM#MnqJsTKLz;CIvIF0a z#2LSM&}n*!obVe0Ks5DAIz1W+q1{;nx`Q8~I>#l6QByUeUyzrpF-Azd5G$w36-5SH z^18c^5%4vd8IKLM#1jj3C|GWiy)uRUS!U`7Dj^4zAF?pb2oP!@021=L*%(!gV!7&cBzm1D+A)U zBf8YV88wT{@HB(7wU{IiEV5b9wSA@CWRIo_*Np`4OBPII^@^=$C%ja8su)K?R`mb{ zthvYDP*=)V8b}?cI-WN|*WxP!#{F5{yNMs+02YPw8_1Qr3*gG2E|)AZZrbw1n_e5B z0=7|Y8NEO+UJkH#2+&G#-B5>UsxFxQfe)nY#Inlu0aS9Q7ZglYf`B?M&Kz!2D+dZ5 zoqd6A2@c{nsAx;hoZ}0+CWfzKAbVK~rKV8SbudryO%b#?CTYpcnD~)i2_l?9YDBV@ti_U@ zwSWtiu@GRV1*_19velm2C|@e?GnNen_eUtBE#2hIkQe%1n+@lD9+6W1)P-#fQ+L4h zArvKP40mEKFdM-vR{+DNEtjw|8XzLB1)Y^ZRDA;tDOaYDO>+}V^x`jo9s)4P3QK5M z)x#|m(&FW}>_o|IC_EGGG#*j`r`jl_tk{CPtQA*+cm0_`bWSU85qxcx)#rdcE}$T& zQmYfa*5#eG8PZNh**O=1SB=D|?1;`Ip2 z$(%H;Ia2hhFLM6?YQkuBjyHJPx#IBVBwbBlS1#q?9?I(U7AalXZMJA7xVWiwWrwQP zp$c{l60HzS#>4{g%Peqhy&^=Ii#!< zC?2?j1u9J?s>G_ic-nuY!0(^kBR0B63=>W{BEc9;f_dPs_B3Q zXc4rWd`g=@YfHJ82pTS}-+Ih)(Uk00=3I}K^NoGt77S6!%ocaBdcW*fJ92?7=W{CF z8bNFCm{^Z)$NiX^TI47y`LulgdV2wby|jN z18fX;VW&a~a*?GQeJkD>61tePxU=lOM;7*@%md!!D%NY?5Mf4;QLoB;CM$+2vXo=9 z+<~<+!YC(EvwdX?&TZ0^9?JVcNpg{xdhBv2Bekcz0)d186feiTLe1y~JOpHSAq9}| zfK@KmyG3k$mRcOvFNdoHeKt_oamHD2pLVgC!acoGJJnA&8kcxOOcMIXJBARd#{mUE zIsun=qniY-0dr?UC_-I1axXTw)(pyB$2?|V3~9tU zq;uq?qp98@bp!)Jat5nQHP;tEv7t;>{KMGnfS{ zzaS6Gii6-qZnJr+tHdU=O7jMcA+^9!)>~tERZ7U<=ze6id_^$b3_Cchm%yM3CI_%` z$?$S(EEic=>Z@#ME%JcMZUTzWTAGHFSnX2^qU#s~xFDMqgUk@iAPf}X8m?8Ntg9{2 z2VT6fjYY`pXldVMbS~W0QNeFNq#A*8Eh(>>m}C~qWKe4KIJoKk*dhV~>};p;I@x}~ z7N;RcbB)5S<62(a`Ao)&vYcoqiXn)!4NlW}6d30&kU%F@)md5pd~_3tPn61Hb+6Y07UOyCacgu0O+3Q*t**@5d>SH&H6%359eR;9a< z3tGMjy{?$I1d$o#A|~g}eaN;IOsd5KoI90nu8`XYlbMYJJT(h% z&v};M(8{@t6hvxlk`>kpkh0M@P6zIp^vDlb1{f@~X((S6Rg@XDu!&5?KTC;bOmc#n zhch_ce$)58Q$IoWpGpd@V&|HQ@&~bcBz5!qB;L^uoYOC|Z04hw)%2ErW$?DOq$@ry zRtwnCwR*~0bOD$Nki*w8HmtXDqn%I4iRR%>dZk5DONES8Q=@r@H(~aJSXAHnJC$ar z`^sJ+u3RUKc!(W`0qN#ETtK9@pBbF#K_9dce&jLQ*Tx=a>UuKiQc#?D`Ir<51H@h_ z0F|U~)Rqm3he6yd-GMaxao%EznsO@0)?s7WN`KkU6HRp`SSZQvLZcC;xLB;)2X{oP zTD_~qA9NiJ?^kx^?F}9V`l}DTa)c;6QL7>qG|?0lsbR&6Vp24LB#1CuUKxra3dc7w zSlq1={owPMtkEeR86SFAU0~4)rt?LamCCQ-MKboc01k;Hgh0d@zXu^zRzH5j)mEZLoV= zo|E<+2+pai-waGhyOMTac~B{q0CmLvX;vueS$QyCSQkF*=&zZ(?nePiJ!}!y#EHTh z;h}~Wx$j8t|00l%bC5Ng~Hpt0*6 zj8Fi|`7xCx1zAyq7vVhySKmo!(o53((b_>K5nr-mLLHkd`jTa_9~UsMD#7Ok7)*7U zu!tm(L=#naQT8QgO7^!0aHVR&(cPogUgh5680lDgO4#hchgU>jNDb80@`jE8w-vHu zMSYi5S7Ko?o$;6BLXHk8>G z?6^~ny`^0!kVXplHhjxfd&^89Iw;23a_oe%urrzjRd)=rz2SRsgEmf}`;&;}dM%7h zu|10=$5fJ2*x1;>qleO zp^H*iB;xF&u^iztaDMwGkkVDg$kWibmmOe^so9NPaU7-J%jX*G8sZj&M!=DGYWKiA z%C6=?p0{I{qOl$U4$zJf&zUkeaD=PIEQSG0`zFsMS)z?+Rz?Is*qb2}U2$GTZ!M^y zYZbIlw4h$Bg+YK=TZ=<-%Sne4{Rc??9|t9*pdn%;2RCHL#@Klls~2{8h`wS#u&nKQ z)*>Wk_LXGvuN+lCjwcMeZF$3PqSkW2hzj3z27R;ofI1o=i#2GBITf29`6b?~)G?Rqi7d;|hmnCN8Z$I?I>eQ0gcL6> zOXg>Q!_Px!yfg`ucMia(BPc^AJ4Vj*Uu?nbnHgpgZHNqX^ZO-c0wQVc%Z`juIiPu~ zF$5A6&YyIrA9Ikz|;VV1ecRCQb>xU0X!r>uzdP_ztw zNEQSpc@kPJ2HgwX3e>1@0e=QnRQi`cH$INmSCwIQaPY487?9LkEenrnaH8F$tXHXC z)4e2yMc00ps28Xexh<=l8jhizeRE%Utf?s{)U|^_Ap+`$OQgS;iOUS*3HK)lC+HuE zW=eJBJB!I0B^{;lQi* ziFLhIQK!g@dZ2c_@G!}nY{T6UZ#9}Gbql`)A&_%IxtG$fl|BdyGVrN`O|xvvT?@`LFLF#6iZ=uq-7z!RCzyg@UlW;fDr073M#=AjZD zTs}Jh_O4>47^wr30H+&eKc2w1s99ms@h6fEe&xoL8R0pWW`KEP;nJ=PBlK6?el(J;y=aky!*#7FpMRBl*kOUlnGtWv;PD&j&^d4ir`H&_=}K z6k$(5SJF_z?!pt$GP)Jb)?f+4iWRFa-Mw&CKmoNHAra{Jodv2iF_#)Gk7~6O0g-#& z1Ek4tVA-rTmSZ==9%T{=u~$?j4Pnq$Q4hRUb9nccSI0=7Zvz0^=s91#L-dr#B@Ps= zlb>P@p^?J(ks-q}#RWJKOzgR@NCHNK_btT7ZbMy%18<~vA=Z|&cnjr%s}=wTv)I8N z4K*CV6z5lXnhUh*tUOf}(ukT}3sZW$vwzpA3?jah?%`-LGkM!WwXS4-l)94Kd1&Wx zx}``9V8v6ZW#dlsg=$5v;Bpk=<5EwxY}>U=xW=HSnzrnNWVHuP!aQ57wq@`!#3fy& zR%pUjS;R5)G@GTsUw6Dd&@MNQXJLXDoC9xuuXt9}F*PPS9bnoUq%E(01%ts>+yf4= z1R{be*cT9-S@;r`T&H}TYH>KedD!?RXeBhGs6utu!WWJ$ud zS%T{UnU5$I^_-o_mbS5Vyiji2MyMHgQ+22cHr{~4R|<~Xd1O}Ga>!vig>Nu!e23hh zOWV)!8s*VGnzDB3n_J1=K9NdR({+5yV5c^7QNuo%gWi49oRTBnH3=%zLa=X>^9JI% zBFb=jW-0f@bl`v3eXCy4Hi6G{2jLBJcI`fli?qJ_1)?G^c4gxzEY^tpO1O}l0vF>ayv#pqCtcL~r|&+vRA_0_8!2U8 z6(ST1z$ejcxqfa3&k>a^RhkJ;3@C6{*dqz6J=+xd&j0AD@-xy9QBDjYKqWq^Myz`w!wzLD)OlD zF7?+UVUo_KTy%l=L0tf}UDl-*3TC5&GNC!UNdo-Q=_qw0l19^c^=dWhP{hw{8m~w{ zl#xfUjAN_=V(SL01B4*CfMrh6$j8eJhOUMlzT%nXU>+Jn0jc43_nQ3mcsC&E9ud%5 zvIHGjZTKTU6Tm9@@&~K}k~fezx-I!mu%8S4t zYAXK#72K`?XbZf&EgwifE^Niu=zwHm!yVSvgf)eJ!u`1f3>4Q#WWam{+TYJ^5qtw+4$ z8lwQWg51VzYfS8Ph}Ojn(|YOhivileotcA?3K^~rgMGMni+2bv!#WPx!NE|r(5mT{ z9qI~DxfrRVs~xn9_2jd506cXBnOnb=^HmpsG|;m zOY`1RYKB%$m;fV8rod-qcI%x%u62-gKvna zVsur5{6T;K@~6l&cfqW<)3cZ`uTY!>x@s|dOI~M1xpqP1--iG zQSy2g8Xl7-2v;q~XqAUET~Cr6m(B~(xIwsNO9VJD)pNcfF^v~lkmVABk12#uRsrTr zREa@$FN+Z`9#ui6k8x)%j6^bEON*na*tCkJ0ih`a7+z#o+WV6lH98At(2WTV*otZ4 z!Rr7>${PWr-a1QwRo179N2xn#&1_){k;$GwI>!#M0$X(%85(q>eaVfpt%%E}jqe;n zgpDpMq4{m<#~nllM5TtRJCdyV*HOsEc2#zfBim28(l;v(^KKxNEUh(r zLyF$s0GG5y_1`j$%!zYd+e_M?`8vQsiI|0QWPPlR zkUwDzs^|*o`1pfl*=bsD2{5#xe9->@u?_Zj^^BXS{Kg8yBaGu4Y`Ast1VZvsxRwl> z9+|6wyOPN0QuuX<2w=A*C-Djbm|b_2r2$8|2nv)^Y(~h04fn)u$D>feRL7SjeZ~Uf zK+u(siDQ)qM+%(51zZLSOErFLjHG%(9j;q0qUcz^MmMZt7CzGh)PNA6gR2>pFv-+l z?OFGi3?g(}ud_a>L7m8)`WJ|yw^!{E=qkM2jVPqvgrnvVC_jzYW|Z*Kdcgxo zx*V+WpJjEFRDwE!HKtvpPc^Cp)f|0B1m$zh;+iTBzt&_t*tl@unRkPsub7UrFv7sKUIG6AxCOI{2*NII z{6J*r-fRY`ZCAEEXV4%YN%)v$-aBDEuTJxP(LrBQ(Fs>dS~?lMydT{aiZMhDh%smEku$d6$`+~3*hEW)PIoh6~zCfg0V8c`G_ zWCPl{hXa3Jpzu5gH-NqE~Q?#Cf=CSj1b)U#f@E4u$wis$jUH84}!PW zFFE0x33c-!Q?1ItiG?u(X{!T_J4$Ia7>h#P-HYk+!`GS( z0m5#)*D6cAdTynAt0dx%vAO}8grLQP%W2fK@V4g`+>}ZdW!cqpxXpB>B6$ML>xjZL z^06nO8avA8A(x;MieE7lOhBO2a3N{VeIuGIE%=qh{+Fb(0(w&$c%XaVGwF~W1tmFf z0OKyTa_QY`C{|<}y5vx-v{hm-!LsbCy>3BEF)(!;0zj}?b~n-J;zMvQ0u5ExE$=Qm z!hAdi)od}ArdNuaC>2^ItmSeyJ1_qLd9m04087gi+YCo=2#n}J@|b(eKb(ltu$rc` z5F)E;^8yos{K6C-z*$Dqwqu8od5%{#s%8}5BlHM6MuXl7mE6Y)suuu$Y=4?;D0#J^ zSUFs+nUJXq&O-emq}SsZo)j*F2S+SY*)tI6!f8hH9xCn&>^MHL<*;h-Y|pdW3R~VFZ3|`<}9y6r4LrTkB&wOuFD!9qgPxaIK{!v-ZXjzr?~Q&KKuzN&mAf`T0GeuJWZv!Opn z)^R6`+wT&dJtDyr?8-kg`Y$r28#FtR9BGeupG{0`LYP%BPUD9p5H8l^(1@UNzCtg3 z9@47>9>Bf(qqAjOZ5bUhq^TtLWFQ`>fxscvNL9Jd6^y{feIgJ%k4_~B27-uI4HV}7 z(=b=jONH@bdZTq>0FKX_e`q$v9$CeUI1|RDLliKqAIN4Tz`o^)ysC(?K<^1-#lFZG zflV%kbQ9)PNTI_Nf#RMI~I0OfSBRpk> z47y=@!#dIF(pQZ^nu+CIFjc!n^LBedbh`#OM7(Ii2_kUpUg*wcftMoNv$0U=MMlp& zIUvp4uOu3ln{BIBFfGlwgjf**iCh>5+2WgUD<(pP(*b{!VG#)2>JB4{sI^#2S!(xI zEen7uP1U}Sv?Q`(gyI8p9B9G!agDuyo`Wu-$I83qOOkJOl+yYn|3y z$joy}2nBdEIs=-`W9WWVXX$#P)hk;$e8$1udd&5RD*~Zw!D%izWURGKdr4MU#CT}` z03^}oe$%Y@({$~}s@ow z?kzka=4}KcTrj!w_mI29#=x(YhTb1^R|j%>QeD#R!PA*A`SiL=Fz+N%=NEnuP!8CI z8Z>J%wsRrf%HnudB$8eLUJ3%>f}|@3Xii%8Wt@7kK?`&<*tm+WC1QbY@uFN8BGBTE zqZYSpG}{~xH1>h9@K69%pE4^YRn|BSiSmWRZW+%K&X~)vt#+H2ft>Lj?yiknPn43{ z3R$=u5?h!$Z&qq3>l+ID2c1NpQ5Q;CPkAGWQba$M70CQSg5fEZbN796+N<2otp%@A zXz?9dU-}@9!n^SuMXH9|IQEH6GD1jD)uW~>FS1VKRlXz<@D{?VB(0|3b~M@nYfffc z7Aj)vm<|@lskYIa`bi7sn;g`m1UO3~X4 zVEUjoo}Td(U37PuL_j(kfQZs)>kE}2Y#YyvL6m8W(&s-hToI30pdO`MAcfWuHbT;c z7I}Up7?j0b*^SuY6g`rWa7Mb`A}13Hfoe3Ln0Hs9 z2SyA{1a9qScZm2L%%R=;m};vUtGFMSXun&S{uCgpRHLm0N0bHE4U~_g@h*{NTX-KL z!M|KHI+wLdR^D|YqNvg0{{ZY%Y#S3g$x(3GaxGxY+-}%n2!Zlf0Sw0y@m-(2VeJu$MX>Om zAjN~h$&0ytYm=l<1(<9;GOFhJ0(#ftBuo*#?>P9Mxagm>=ugr0hLdUb{{VRllt?j* zM|1hF*siqihAe=5I2U}TekELkt!YsI09;%*nNu+1hPiQ!tC#?5k*paj)`)mxON3&J zxk_?Ax|HYc+6o-i4>69UA|dl%tQsaaXrM0{%iN5Ntg;hCD5VjF1&UuaMlVc!EviVD zJVs8`omK#J#0^mtr=l&wp6r6pn}v|}Gy+e91r9)f2Ke=QP6yMu4SHJqC5yo<&~Ko> zJqUn^6@U*>XS^W+oic19Je-wXYPX zc2QYi>5}ttzYw-UdlplJ2D`DhFEDcvwZ1jhfIFv125y9%JB}Bwr%3H3L$0!*Xa_X0 z@n|B}26l&>1iZq-6^QPy7>3;=u3eC3)LhXPn@+#j-)E7_Nwuhy=or8%@0j-xN zFO=KSs5Tu1u8;ZzHaQ@0Q%5QtJtub|ocC?2+pQrNBs%k=^RCNtE(XBT^wWa{)q~iL zqB{jsbvx7tQz`*cEn`3fTk93pAC!wdSFccpK{LSD4XTQFtxO&t<`Bafa?4B77Bx4Q z6?I7|jFqUQ$hUDxO$OfHVmi$LFf7}S4BdmKz!sD>-O7(px+4Uzz~zQGC0d}`ZmGlH zq_Q9vbr%ioM>~N=%ep45qW<1Ym&^*n=OD&3YY`rEfB_470*><>sqC|pXj_d+%uu4t zd)t=ysd>RWx<;S0qJb#A3wpS(FDE1R1vb|=ym;A?vaX_O{{UuL3LXb=mfL!aB;bmYEU{oN_=Yj?QmKF& zTDlgDtke9o5(2DZ^1YD4y%j}5VDXt(o;z_M49caEVAGM9goc8J78hMvjOttgmA8Y$ zZ(CY>H67tz&S%gUM4Lxfc{2;&%+(1XGmOLu#zZXitMz|t*C0a0LtpCtVY0! zDI3(+;(qh0CZW@`9;KH`kaUI~vO1AAf`8Ngz<_vvWcu4xcp#Spk}*{&cVv1tv7Qbf zic;Abi4M;@Mr+pBvF+f8?$yl@2R)(59W@SzW% z*dCK7$Kyh{C?2K3aSN`q);gk4zV|4l%O19YtyVgYMgen!>m|z)byXRm50jP}LYc0R z6rgTk9@L)E2qR3rt|U{YRxe;zM}IRvLRsStOXT1p#czp@f^*GFniXyMl_9x(X{IGv zF`$Gi9??NtBy0059;uip9=v8YJW~X}j~KfTPZ1i9l!`R_)Ii;nC#0>(+cAVFjgV@F zM^)xZR>)p!bqE{g<+|cPSeB92UY)n;1TZchpfA{wyHKuM0DF>;(G|MDC#+JW0BP3$ z0LlA~iTlox`Yy9V8-zuu0nTQ%Q=5;{WD|Xj;h)fPR<%t`zd81d8ClSr*Q1CX!!$!6 zp%Agm;a_=)P$X5t2 zG)wI)BS@uX`E_l?aoc5>%W2{ej5$K;HB1{9Wrg)Z{1J7Nw6qiMXNR;ZkXfU!A&ag9*1tQ#T=gI`_1_NLNOp&b->U6MZst!SG%i1i&5p4vfxbbeX!rMUsaJN3aWig?|YVXkeuPi$7P_s;TrBa3Er8C|JI7Ym`j*zpAKfNcdV?`<@j!~+VAA4{Un z=;KWp#h_lp(5?>R4*^K)m+OKsy2boP!bix zXB;tI*VYjrZx1PU-s$M9-D{l!Zh#XDo2hlxX>CfP(ZR(L=b(1z0mG03MR6f4YI3gC zQB>~gwBTH-9=5y-n!8@Q)RkEVSgAl9<%-6_7*r37u6o-K;f~W=R{{S3z)c7#BS|nUow4RWk4$?EU9RPqjToi?@P0_wYOi0U|+*p*z<47hFNJDO3qd z>qXY%HCQ~#< z50r+oMT%5dmhYNFGXWMlsA)-ZK7c!B0e7G5FQj3ohf4>q*($le!5u$Owu;-VSXEUA)B%0c z2UZ#sVWkj)f;8A-3E`!RgF7KtjkvOr)RqGesNf*UWqSFTyjCiSHS1|4jRh%zjh(w~O8@URV;!u2B zya8B5)ji@z%!M%KmK5}kV8B;dXe^X5m)8oS@^IHNJ_8(Jef!G6GLsZ_{-%Sp{U=ml ziJy4xq=dhJxf+>g(-lI03u?HR5UeL@V&m@^o2a(Y!hI^1@JC6~R0U}0zCGiB))af+ z=0U<*J4(eC+H~;({{W$K=)h92i-O{XPnp$P`$2n%EOfJEv~*OBRhf!fyr+ta^}%_n zZ`uOMNcLu5K&UO~4wzx?sRPh(#B~Y**6QZ>JT;Co@0-|D{E65rLV+O`9rFX=CHV~d zK?$%uL|3QDHYW&=TwtFzll6!(3eu$CsFoY5(6Yk*(axEouPy#!m!m41ig(Kr%m8p{ zwrKL3>6iNlqCj(0xbeD*x}G4Y7Yr3*kC=&lnt&M4sIv|ZEm!gr=|hwfybG3B(xeUo z!G>pMA%!%*axzkOvFt;qL$XwN0CI|VU(EUOb~UAaJ08QBFaXmRsustF9ArOn8ED~z;wq6nlh!|3Hq+Hgf~BB z(JPI;nT5nO##V*>*|MkcxiAf!XKVzmC_1sL$=OCTW%Ry~Nlsf-8iZ&Y1z;IE2S=HO zi{Y$)ofn0grdUxQvlTIPP>xaFvwEf*9`Tjn&tkf`ti_r4|xFgMI=Lpt3gp4DEn0dC;3_mCMHhjJrIP?obmbzRj7B12qR z?%BKrZf&SCvXagNqy_D88;1vr5x2~VLhk{}np8lESI$^!{UwTU%9D>mx(2H@w?OPw z8t-+sQR)3nDAs5$HGS$1q!^{BbYNkgLI5;O0`jj~nleQ&ohL8WbcAJJWW_g6GNYE# z)YxZ71Dw8{WilTjprfL$*k;V_P>J%WwjofC&;SPjbTI^u=9g+aa>;{2`&~1|N`O)&Py- zGj7#Bsij;y5YHUJ;a2KZJ)AJW*D>c=hzcbhbo7BIT>5;M;!9;88l8n%;ix6o5C+ug z2Ut>d2|kd>l5tS(n~qzF*=obDNQFBDvrJQ|lnkIaCCPL!U#D*jw(&(3bfv*eZ&>c; zNq!u3gOul_xv0A>=Q+d($mZXOZ6&KYRx?d z$rp@usNwPz-xD3g9gBV?$|eiKZ9VQVhLvM0`$h1owphhh4!MQi+FRA!BcWx*mM5t# zov3M7W__DIB_@Ff7GJvokp^#NGa=+|1rN-yL1?!cCC&9&>WR53A;{`{!T!T=HD7(w zU%V*Wv3Iv%iIswB#dV5GkFY2Yw3rrXY$fSLm#!o)Q*C<9xYW_Ye8WIQYXfMf?-vAZ zdI1=NRF~G!Sx{;AUuZ_a?kbvDKVQ~ARn|u{6k6o;LE$)7{{Zlp7EbNZFXB6A@oOLf z!peJt=_?Q_^@DYCy(fB9Q`p7%lo_rAosPQv#I>(xSry}fCNj3~QB}+R5 zm7_KOAsb?a7Siw24{1S=)q@F~WuwC!9|&o0Muk=Qm&>JHscT)+z>gdPqLdDZ*Q(BR zs}`!RwO?s=6$B|%x9wyRxvyEB@DOZDJ3+i)`l+^~^xHb3#&WIuVZ>;v-xqJ1L=RTD zn^-9X&dgDbz@5oz#a=ti#%V2+MuBVB2S{|u##<|5@n{Fe_WlL^Q=@;A@CH-X;fva1n2Gs;8LT@5DS)u@hb|^LK zhKk-esOSJOOig48lN76LqgK@m7b{|i)H=5gpaDSD)aZ7m5^ww+k0AN+u=d&_(DX|h zlqK|IT0mzaIO#RnRcBUsIGEg00u7AC{(}>s18T#91W`ib@GimTnvw*m2@FIIL*9?fcu3oXp)D5=k_zve37%@<_gy^!?T&FRfQi(<}&Usf&)sqg)>Kl7QQG-Q$ z(89~;%U2TFR^90vCEV)Z3U1P<>o9Q9kwTWO;A%(hW(=IER@0LQJta^T z+`5@GRau45DIyMiWTX|NY^w!eFMXEw$J#2^9kjNy=v+plVU3rH+{EkFshDuqWdisz zPz3a6(&Ur1Za_HoOj;=E{!8yU0jM1q8<##589)}VF$B&vc_EW%Mub-_9b)UY*b7T) zjF>1V(uTopTF^`71zd#-^kl|oJ+%N{ISICRtB1mhIlz+MsIj9A)LE1&`Ixpts0ivn zP+Y%3KX^ebNS$*M*<+|Xoc-n68))CH!x^33sgIb20yLQa0H|%~YFbhjW627&Dx}i{ zEM%O0J}2)D#mlcyzsQGXCI+s#g2zbF+-eIH&{rv08+r17h|$c}j7mNp z5`P*?g5WZk>1ye^me~bwwBfGEtXXOYXsH?WV@gKJQqZX!(oi1}y8`AFQ|^?)Fa@c7 z=XM_vz$LLMIQvR$)2CHIMRk`!!IMpak|9bdXPACwnlZU@K|J52B#t7H zd0YcAXUZZ9wGf21G(hb1m;jVdA(!(UrCWig585}tQLYszhrb}v#xv@}^i)&Hf_q$C z@)lLiWL_YbMfX6!;A7v96a1^Y*YOxAB zRgHs5_F(Hkml>g6;~8vMQZUj3DcfcHz^DSQf-c!(s4;QaTMmk>#Br0!W%4i}7Wmop zKrVoG87X$cn$5N9SBOVYLY{$wnh-cg4k6aZcnfW?g6ET#g}H2SHwKn_Oy_gdEIN6` zPuKO2)pdsB_D|aH1XLiU;jMk(z%>p;+H%H!6aqF=4eC=sO)O7R6kydZ%in7u>)Uo& zmD>$Rg(bOGtykSw)>|xb?tshUXjsbMSYppuQD)8VM>}-bNj~SY1_m`iQg#Rp6)rg< zuDg57%<*dq-)t7>&hxSJLVCvNvO8C7TMx<255aHJQj<6~qNaVK^)-=9p819X zTt2b#Si25~>wTbhx67uXGx|kD1CHffvk})9L4KbkuS%Vd!wu(oLt<)ILg=#2Rcw;BX$I`I^Wt$`h!T z^^9DlXa#}JOLa@6aVx4=*tgN8Xl_G z2xM%1T)?@^33VK{(07ieen zTJgvLK$XP}(w5#5;%bbTnXoWwoey!47g>UI0VoHUjXW|3cF(G*nlE^a3$={{xRAo` zn{2mq2p9aQkzL$!@0!OKWHDQ|mgKQ2`t^&qV*pl$17Mf|g3#qajeI$KJ)=a>s&j_ z8#x*Q_=QJGEwTc+t4x{c5tiEK)N`lAF0LHl8t?xAOug~A$|7FI>O2cyE3)!oT=U`= zevQb`aWfmWC3)`bv!(QvNV{cQr&m_H_>wSFIdnj2PZq`Xjd28WvRQ#-<2eTzTy>e> zjtYE^GUe0=!9r<5*EV@?b2*z$%=AsX8Z*BU-1?9B=(rmlIAqLsBv~d^cD-lt>LuqM zPGf{7)=G1UZ3S{58K4!0ur=(l53#;tI$jP2-&FUG{CRysa>O>^K2lX>g*ZukhJx7d zBL&Qo?lZhXVGWmnULcd$!%7?6)|s&G$D2#p!{p{QpusXrPmFN^2^VQW7dF7M=9Su! z6exOj!TFBZ%xi{9KA#)+fRwLHF?}X$u%YB2`4;V{CO`9w$tDm7S%~(H-TwfxTh~y_ zSK*hY6SIlXPs)rnLBMSL#TrK?&+|e~p9?pg)vDKpSVQLgg8T6ED0BxLCU6 z;e={aYkHRzm1|?eHdZS9u#iQcGvU7Sjp*#`f%9j2D-nPJv?#SA8U*&tN7WMRn8yyk zyA4%R*G4(`Qyl640AnR|S4J}Xk<2rPDAv-z*v7@>e(XEgdf~xOQXKL%EtxrCK|;Ff zKkRV2Ml_CKC}z*t`)&aus#i9r;tH_^+*BXDqsB2(1mIEm#^!*Oo`C( zcz(nUQA1;fF@pI{Wub2wH4%YCohVJdVIiU?DE|OzC13-B(>-6jG&vY{i|;a6@3#K{ z!64G86RltVNs`Q85i-L=SYd|Z8rXuj)PFIQ6#+{|eMTTL9CDy@@ks#;(=G#`^Kd`E zxI;4zy3=1Z2>d3G>obyNS6H}ZmQ}0D2i`OJJbraypyun+H&n|B`{A@r%T~aVL@>jE zbr&u%R5lQ6*#tNmK`Ox4Yh8DcC<50+KBy`LckB%eMGl2Z4<xp7P89`HMyHd$5*^2GCIkxW8y!0Bjb%`@aMN*M=OWxx`fk zA+b+V&uK%!P^)rClsl#o3s}Ps-vc`kb!#xDayjH4b8wAZ%A~K|4_@)h8?$3byrL}k zl!qqnMLY5YS4}$slg>D9ni#aA*Oj&EnPG#@b{*CSh&IAQC4zTh9*iOj*JqOUp#K2L zO^XrYF22&c88=|z>TLW7jfa7VcJ4=HIU`^LSwbVo_84MP#+$~w9r8MGMGds2Y6Z%` zd2<@wAOYElY?8JTqgZG|^H>R0qK*_~^nu+&R;?*5X+3id zzT;KYtV$lMid8`4Le29PMQ=HSsA0J(B=tr^J@?IRaprt)CjwH$Pk zwV`HUL9AyUXB8jZr%RmMj%wg}vRbC-daUyb@q>j7S9IGQr6|dKj&h5(bJIb89yR24 z^N5p!eCl{PP4%{AmtjT7nxvQ zHo;3-EpLd`MQvJ#RM=)dAKUQcOVxb6sHI*r1mz+H5UJ%xIdkUdFVQpedK zzaQ@?3a}i;4Qak(SV&&(Avl5*)`PX@P!1Xbt2b~Ol>#uBrZ@{%E}Is5QjoZ*dFdu1 zrbH5$XnK9b6)iXo9cSyh!%0C4ah|DTxO_3K8hwKAysSHMc@6e)36G0ADj;Evt`%T?8OaNP=##PRVRD7`D#t&13g-!rgqc?}rQH+#IY0B>7 zr-(P0(E@r8SUg}pJDs9NvCRfn00Y*S)Mi-x^%ZsxPg;N3Ql;3a4x>Y<;$ZSqd`091D_H3tG!;il{{Tid zEh0Xx{$s`qV-)Y^QVv3m-YPr9nMB}f)iIPMr8ZyNag;IWT{iw^Qqv&kpRpsC7hGIy z?u^wJWAO}^tjZ{$nx*(hDo|a>9}?=8jk9`R=iXI$HFpnN_(lLCf?2~1H#SpnUs)Qu z3{`x`382NcySgb3@fIrEw{XU_#|G8#!1!6l*00*VqYB9Z>y*CyI4`m+J^uih5*FD< zLo9|~)Al>S9hMymv0pHdR>}+JJ7@A`m?%|`ciQH8K`y|rY)1Hn1<`kpRf8D(9ynB z6@Wdd972uegnZBviPc&tVCxtNAX|aU!Cl&c2THzAJe7uFraKIml=e!k5=u$OTTDXz z4Q|ms@N~qmqA>UOLE`){gMTrSR2Ai^x`K#XCGv11-^3VPS)G75SS{E~VoH3#QPfi^ z4(?8Jc9DCr5+DwPM1N(0i&ReA-zx&rEvt$)#g=#;u&xB@BW;|htLp(e!CWi_)`Ssr z!A}i#&R(+3*Dzfpi!L~o1SQIqZuz&EGUc$ zOK4s^Y6t-o7Q(JVvF}}BxK46n{CV`X$G8+;ug z&rYR{rc6<1wB>$07E@bSVS39v26St7x4U=F8qLlP>Nl*FHAq4t;Kd*vTg#APT>^)2 zcYv=WrKye|1!BXuXQWI`s5-zN0-e{GBp?dJS8=y43%((~xr(0Q2B3zMbhZL01qSoi zFt6~IviX-n@bayAN%D+;T7 z%)j=!%E6>*R*LHhh|*CtPc>iiP%S_uLc>;2=rZq(<^^_og`3H6z}Ee-!2FI5*uQS6Mcx@J7TNhX~!aB7vD&f|P z4ZWkF1ft(r%Gw-mUDQQDAyY#x{_=!exj<30>VrIJ$cnS4B3aRcRw2nkm2t_3rW=kz za~T&x`Y=zhR2l#sZQ?t_=Q*=^ZpCfZDkNtJ4^`q_(%^wAQuwkqg&adu%CpBvW5b{8 z5*i3YZ_L7)$6#8%4#fIWP=ioI2Q7|BBM4}nHeL%%7|i7STf{k7v7O5FIQV0lBFdt* zVT$b+eSt+XFEI5B*U-S_{Zc+)NbIZA#8`e06iK6a8Pgw6z%Uoa19^f!A)d?tT5m)7 z6sg*Kd{OsFd8@$9uC9~lDT47PfEiWALIAjFYZ^8UWqVA3JY6#>nl|<}N;7Ho<3Brs zAd$APO`~X{Pn!f56dB=&5h;OT(DGsnPXmZ5JDsL$Q%BJ6r2QVz-TD6jXv&IW^pobI zDD5j7s*@!e&UAG(SGWxLud4hZG%zWHSKfo?h=JRAmy z$Stk|huxW}S0K?t_lpgPt`OIa?opwEoEL7rVRI!WUaAt5`U1qS5V|dF+UkdLomo|b z*@eT{ablQ&AC&KyI`N_WL=v#m?U6`M4R)2ed+0~=QrQ4+M&<09dOhcsODUXU>x($szNN1?+N%qgpdPV zzYlqIaZB3JJ|MOgXA~zf-X*CDS?QSNMUXXCXWa#bURpZCrW7vwzmo;E0Osf3@$C<1 z9as5AUfom0tMflk)-m$F>Aa8F?;s!uAoSc5pl9UjUV5<&GH8K?_<8~jJ@^WZ0J3|zCqfX}$f{sR$#hiiRh-@8* zH33SZzLE}+0m)l$uzU8F%(|fU*NncM<}_F&It;$kTFecg$E+%1yqOa7nhwD$$bvkM zn6XY2rjsMnXoqNPiUOVL>M`zZWJ+IoTmcpqHNZ@0?Nu{q0*bQ=cL-jb9KIJ6lIq<%gaz4-TxCuY^6CU07ag69ko+%EK%x9OTAgP|DJvGIzl2M~$e}&~#9F zT=uI3rvXhOv1lxKWpV(dbj4`0j#pE%?0b3ze*zYG^+eu9Kikt7CK8NFgQb+=E||l1sRp;GeC7f zI7{{cOkI~^8JsF;RR-&LHJM(pun>A63fDK?n3p*PShq`9qfe~aX&`ji$WT;w-JF@i zsK#9-0q;T<+g`mP06jo4lZXsf72xes6tptt4j1=ph`6A$#EK)24cH&IOSZX>ax z92{?|81gib1qY3+*sm5un$pq1Vt4BR1(pT{0*g~DN7}tB6kD~R+(rez$g-}BH(TdX zYBqr7rgr}T;Ha#cAlYGjEEcNas|JW=(4wx;#ZJl+{5(y{?@Qth7>wIC3*WKbiCU1%R5)5e#juW5L!3DoN(>zeA=_e^fhdy=Hp!ln$dNP(^z&d$os}vOOPA|}RK!7iK>nNHl zYsnReMi>^Lb*b9=z*MIOw?a|cAYM+sVIhI7=08b{1-podC+{MuK(5s8GAw4Qxqz@u zw%A`2X$f*50@Z+7?H-8XoI#-ZR~0OZQZ_!27y^_qbBgkrd56op5eR9qp@R~Ry)Q@o zLr}^P0#(^E4g5)59z^pZsb0ol8DJ(unB-J12$?u@A^mO;#N+}CYDaW%Unm`7Uxr{; zE00ndPuTU!@9@nC+S#q=v-c({`5Fv-ER2Tv2aeXQT zyi)* z5Y8_56_a@%F!e-N)uaZlvhHSueS#~}?$hqv1w!Z!@q$L)bN>L6>B1!LT&NB%c!AqI zRvj1b8rg@N#3OV*^Zp?>EsvX*mf8!B2>=|d2n0rvgb4Q&YHBvaOs$}w6pZ!(XeDV1Cy(pwko z%HEM7gC-$@T7~n5p@ujJ#e%;6@GdUSu3wv$GOP+Sfc{~XI0r}>HWH#`1&x+pnZe?8 z!VBqlGi)V+zwjj(C@YJ>tM3J{Dh?(F+qlr*=7&I$T zozS6h?iUrSX!!to#s!fWXdZwcm^k!O)?Ga0mjFJ{yrJH`qADk-0qmBuf~6b9gpSLT zA=!hTGe)IvS4rCLae02uz@wFM!KjRD8_JL7R?&h%`8S1gk7$7+vTBjKbQ9bmCB#Q2@8Od2qF0 zNQxRVUL6ij*^9t6EdhJpa1VL29| z4lLfgV;xm~^q_3o8Z=p2=?pp>io&K=oQ*CjH^{zQh{0>+qlV+n3?lGTCMv6bU>k3& z$^({|9aXu)5tA0dOzq5u3wg(~Idvp1IIP1&<{2c`WR1&jl(gb4)Z5Th{d*xW(D zZCUb{dS!JERBC4a((#-ed5Y`45MoV(d^y3WJ9m|B3Hqh4A#q6}8pCyG+u zu$viN)fs9Kx_=O6qOz%E1};@JA=*&V@$C^QF6CX1$~7QEPKOwcd!YG7sIw-4LxY@3 zg1l9+V}^8ktUYG)*k~_f!#_#VR6Af6#MSm$oeEmWBY8KS%xPK@QE9@vXkU0w+OB&` zzEhYLUuK7r^R%nC9+HKc3&pmlj4v_n_K#p0Uc_eMXgC1)Bf#4h6wQ|_LCKne$51*m z?dt*_{yx~m;wp~$yh7>Qs3=ASd@Qtd8A|;M=irr<)@J~&4gnO%EhCsTxE;@9%az@& z#g%kK*AE4!eQ4OzYn~+`fiX?*W21g#F2;>H6XX(xFTJ(->+GT8MvBDazIevkk31l_1zF- zE<*vQ3?r5rtGoXI8G>OPk6C*%A8?#TCah)oLqQ1L*GFEFxoa;XM2mp5OCRy>OZ>Li zKj`lf;ZufX$8DXVs1delx(DW33$uH{A4Ngv+++l$vQ`Rpi?E{<0-n~&439caL&*V|ONT}4#K~9*s!`8;FujI#-}@7%WrbCd77n`Rx_HE- zAk^CIoU$y<2hHCRMi<;fj;0ojHHg^9R=#;lI*W#FZS?>ACcReFs^ z0KvxP$VGiY?fI7?4aE=6ZsQsb=q%&c_oQxGCc^D6(jcgYrf6)H)UWkuO8nDnmPd1` z1aU(((xux_?z_L4%+=j^`^{(7o3K@1nuOMC_6z%u5orN{@ap}UkZ#dU7+`Q0V$}vi zy(}{dTAInfJC1HagLKqL)npvlF8$}~I>H?Uh?~m-0LiCD<+AZ_9y21dM7QcdSFuoB zR0Eu`_Ltm?eW?AuWg5n;CUfEyN&tE?AfiomaI3F!HUj|NZd{|EcBN2s=3B!%T>!tl zI-z*wBljb+@DsZS=3)_U;)mTrZq&X2K1r{S+Rnz^c#CNriqMtvdqPpNH&Yfr5`ouE zl%+MV!Gl;7nnsV6k;5Xj<_eHbp+Sd?p|b)Cx}_KFKJ)Z_V3{pq%CU6K6IuH1s3HkA zYXnNl0)`p`@jsRI;uH_J;*TuETv%HaFFw(2#EuDb>lyVe4KbjttJ1EVJ)pXw4QSVB zQs`_=ab4mSZ3YOb2xtftY80tAUP_gKwuZ|#b)^IwO@P{7AF*#FAnjIKkiKw@_m@DV z7PKE@FzE?ER0aG8#QGp-il*o^>ed4uFMT2KUIG_&!)wS9Do~vSU0Kar2mP0jT|F}p z^%NO$qvkt3m9P*xT@!&gEf8e|q2QEl7kHfDr!jA&4-ttd zFjQUvbgdDJh6`D77cTRz72uU`L5e2$+SQ{T*-BN!UoIN3+gJ|q9fm+z3%mnC+P4%w z7BJLC?&|4^wT}M6g_c#Wis%PM>?Iz8I71gz4I0YAa&}duNu7zylI5$#18706Q*I;I zs!y*Q;m>KC>9x@J%g><|VEGv#=MTYrnG)Q(jcg7KWF8k5I+MXeL8!WED5r3ktrEm+ zfHp8il5(6dMS~$ZY9+Wlf~4lwORMD}PsdvdyByG4oa$t~S8KZ9Rh_1>5Rp1SFjm9^ zg~*&?&{Ehsk;%<5kgu==t9w%0%)UrOyUnx#LrT5WuOZ3>gvrVf*mga^)Gf`ThX6e8~ zs>K)=C&(N+ln%Qwf%6XXu_z*eq}gsI`ayXC&bpgk?7~J%g0N^Hy|Hdr>a6qvtHy5O zD9h9qvC77UaW8_toB@uuXy|2yhIEStrtxm~4-Fg{ zbljPPp-ofii9(?c2yH8orMb0&r6lqWf})n%7C1fO;uXx6ZYT-ez2lHVvfQ`y%hERO z5Z$Sxt%{f6P}-;qRg2HMWbE)Sg8VEPUD6lTZFgA1Ql?GMnFcO_k2f@@#-y7x=zgA0 zX!_X+V!n!))6~PpVS9t7;1HdkUmuE z=+L9g2C}S?$A_5Kl3a;0L}prYi+?PzI8zx%=)(*QV9poiELV(Iv~Wp6{H4*cVDHvX z+;xum$>AfnMFR|wA8>+hwr({XmKL1VZXqEE%7#G^8?b~nZ^Ogiw9|GQ=~w>8jXqtx zUujSv4@pMgqHv(2<|2n^YzXC_iI%j}zKMh(fOh2jOB@#1^%;#NQ=?vyE8D}dR(eXe zIkLwQ1!YTW&w^u>Fs$28NrA?o$B8|7^9mO1iii-Zkm}k4(5eq+Dtgt!Fw+yh5WgYi zB>`l!fDqvW5j*%e0e&;_7J;X`v-XCZTR!OeY9Of9h*`K>-AOV%(XuZ5VmPS#7+S;3 zS<_`R@jAc3lvROegt2`YMIlVSFn{TLConTo$+^22pKGWDp$LL*$icE!aQtn64i<8~BEz0KEmZ=~3^6 z8*93;NXYfJ->zlk#yW;VR})6QL_dk%MzM0#+sbt*6b6^i0A)a$zXdA2<@UfwY>3vsMh7s zVy?N4#9*OLvGex9On_5(7DfS9ys{G_u|5fjUEE(tCJByRf%t`5?)Zvf>I5@SV~(?Y z5hz-k)wsB&($Q+_%f3k5%JlJZVd`iP5wNN&$=*3{fzs{=7!OFhcvTx&pHuB0H$zqw z^+6>%8gMd+90gshGzr};^^DM#)-Yi8S#JnKJ6#SOIg3#_mQLq1EHImWuY~q9aP?upgIcqIJ^ik5GIl)#_zw`%CL zH^Bu8GOKh8`9aNfWoQR=V#y_|Kq+r3&r3l>zgB~`@{Z#SRq6x{9KE2KWp!1Q4-n)t zV!>4G8a?9`H|tP$P75n_@QmMwg~e&bfam~J5of?s(DPUBLKRc*BgwEdKl{abw@Itc-plfd{6u>B7V)+s$oHo0SUb4KlG z6I(6s8akfdfrlLX-q`drQ)mYlS90Z*iORKVleMpyZWOXYT zE?}h7nE<@5k1+iL%MrF3I(CE9gaI*JJHhKS5fvOsun|DsR}%UO)ui?t2Q0NKnhJ;z zR*f;u7RFs=Hlhb>bLE0WrzcgPou?MbRs;W6N>omf1oIXQGBvX#~qrxJg8#bh}$_ zH=woDudEQ@b$f;e$RkeF&GhT6xt+255%U1shkahg}t=yl??-i*Rqm7U>0{E`|YjMprc`1IhNA91ghbRK_)c`N>rm-cy*G z0*nsLo_rG9r~m|1bFH*$73Sk)r{+@Mz~0Mf=3 zxNj2_C}Ji1#Vor@EsL224YyHxza-%(7!a$6In+@6PfEoxd1Z57A0HNSBUeS14Fuex_R`URuj55=* z!$lc^HqC&r>^dwS^3RF|KsQ~%ze!sNtWo6X#MiMo67AW(qYbeOc2IGGGq`GfF>TqX z0kg0c4y;O-3UeEPVs?Q1oHH|)*l*q~fdk@B-U>HT9WORa^J*CZVBL#}racdw)V zL2=lPj}oBTi^NLY`cz@0(_vGqgi1dPG;}=T+)HYrM#h-9Iu3+=mXin5LHAb{1 zmX3PeEPaSYB>I5f9+z-pteK}X>U<`gDLXN7;-N!FDPaH+syvX`jg7if2-{NjDvJ4l za@uRL$pG)@5IYY>0dPmwv6uc)fqKL58YuXnE?@D(sY~^yJj#T=%o2OR3cr%&yktho zGw)K3Wp|N?;JSSjhJXv4DSr|4IMbx9TA4)1qxhD+icOr9$7pc^E$F3Z)}!{QZnQit2_h%OpU>yJJ+h^Lyiyu{{S)V;3ldKb3*#mN!60jrb(<+W8K!)y$fLi zyiET9A9yR}F{x5L2Ms(a2cWT<76)h@T=5$fd)T?P)ox$K^fyr0K&n^0Tf{jt5tO0-$juNjcj&p)!r&H>OV-PB9$ zD&Ckg4lokE6lD}Hyyn+{>qH-;;n}E0TC1$(#6htQIzaF)ULNs%ui-}EWmh!LxMBV% zxoSe_*8+;$G(!Os>>lVF&Co#C1QTH@4!m-)z z)csG9m8xA1QLPFDRi~OleC`Ct|@AfLI4)=ah5 z9?(Q!0JB>Ft*drbs&ow%U1%GW_HK;2Qz$1cEv&hhso=+~V4(G5MVK6%xyM;X3wTo` zh_Sd^%9B4Z;3n3;exn;4xDZ1q4F^o5KvP6j^YTg!E0!*25CGjnk(p&EkQ@PO^mKq_ zQ?6Go9@fj_xJN`V)O}GH;jR`95W7od1KGnMcw2b|4N*Rjg8fCvCy~h3io2ANz|!6L z0^AvEQw^N1)#%_*3#Y^o3*}QbBP*`NX%dL}uzq72^^esntX2!ipDP8e)l8vP#nlVX zv`z-vUszYGZ+PP71DpWhz{}eb&rehUR5o2zLsEx@wK^~P?>B&mgr6!2q_AsbSNb&@ zeHB~t5s(u~roBu{5VV1%u|F_Bf3uof@v;@bUe8(dMt)SNIf>lF<;Ri>rJZ>CX8R}H zF)?aeJ(7fl(qoh-4~Xq+5Lj7!OA{g;97FmX!-9URst*7ZU0}EoCQ7)93eImPAU}`$0rxonW`&#uG8kB_ev)LsxhpxRU%u_KG-R zO}b0E0=Wrp`!}UaC?RFH)a}|iOszHHCj*-=NmvP!wmqe8p>}#ks4chzqwN5;s?sg{ zGY!@bTkwv7LtC6BLy|qt9two9fNrcFxSC)kJqP&|<>$eF@*M`OcUmCArd8zC{L3y4 z4w}cbLh`9^rT!-yWlO48_lAEq)w}-y$Vq4^$2Iqf$`NR*{>9={M^x+Pp{g~OUF$y) zEGD%j(2qhGD%_EB_#s-LA-hsOFu>DI=fcwYU|9j9#$)EAR%Stx)^X@VMXJpWSe}X& z;$zu;%3vTSMyNlQQbBi4314V5z^d#%@Td*zW24?MdYU{5C#&%tf)?wVFU>?f7g1ra zc+%P^%&ki%3mcx7rowUUf|$DNA&Zf%`Ed=9)q1zxMzzFzhT)xm+cl z(aQPARn%*)V#C$@(=-CppF_NSv86AAq-}`b^*@yTKUm%9ZfSa_-u)*@4~qTLa2vjT z<$PRc@N^VKii&XC3W|n25UrhR`o<+~=}`k-J<-X179XHjTL2L{s*h;GX0Ry|(Cfxz zao}Mrse$amn!p|A*x)SCVpv$A&ITbQf`lnf8kjbs@`co?<3S2a(Oh`(128*EXr>DS zZSl3iU870^fOR72s5t;01uv{SPzIDm9--%~5o;heuV8HtTbJB{r6nIVJz#XXyNAjz zvO7>=c{h4tATLGNev!Ab&Qk#9uKWy2gV+R1>4cxW>lB7g(P}TXC>8=Kgjx@&?;5I& zhdDx~c`zC-ibtsgBR5s^d_%2Z3Q?7H6# zE5%~I0$~O&d@h#Q?B0Ea#za;FE(@kf*hTy@>KCa#l@U)+JTMa3B-0w!PsqY_g5x{elI52&J8+ zYFv4+w<%S34P;F%mph!fUW^%xiK5g6Pz+H=sSIyJK9t@C;}D`udPvmDE2y;<#aPEt zOHnE0z{pv7E39De8zwTUPIO;{IZc29Iny8=wg0XG*1FE6f)K|4>(9xY# z8?#o@Alepy{{STh0itQsoI${&T$I_1@4dtMRR%hWaBb}_B|&D|x}vR8s`A+q74-E2 zaI~!sT#;dg9WNJ|WYMM)rn-v}O~zsamo%52mmJASQF(b<0%50;$_Kz!vED4!-9qL- z0IHx3#Yd`VE|{%RdQ6a74my^Lm32=N{{VTRs}TX%q%^Z{s(a1VJrR_gBZD|b6E?n< zHG`Vw6wC%(ax?%jxkdY&Ts3X&&O8w>g;@GFthx#29Al?{1`Y1LW#rwP0c^(YUm2H( zReF?5UAbYkgs|IHq7=$%kqkr01gL9c<|sh|=~?PN(cr;H2;z0+BDo$SIEb)KYr~nH z3!<2}{5h~>^`Anf?rxL^`a=#Al4tskk-SET8cWHT*e2UnYk*(ZsT7e&d1@1X?qiu7 zk}U~&l#DSl&e=yci}4*2CzXWl!pEK%U8PLIBXhwZAxoqe2dr+;(A{GuXAYXLzY5 z#97nwK(XBKB``t<3nz%thB?ILC4fWz#pj7JCbLf+_<%+GN+YulHgXi{( z7$mvKlhpY~49m+-zXWBuTTPF=_=dq+&2X=n__0Ga13};4vsn45{D|04SWdv}2v=#Kp~j99qog5+7Zq1bhYku47mGGRl>(yS{7%i2JQ2-Bjkvfz+WWl>P- z2D`(=h^UoK?*U8%W&Z#Ly7ahQRb{SJ*@X6$6gDe3ed*~XwYLzgRxd?wu%1$2{T&F1 z9JRMq>n$xFjahiarBWKO3+mUb$3>1!Z`QAP!JU7I&7IhC&;?k-%G10+3b|J-{pVIP zalyfr(s?5VbI}y`Jr~v-49&7;ss}Q(unT(7FPJM(o!$s#W;8d)TrH)e17cs?nMsKT zg1>vrVl>d%+VNQPD~Q9o06VHd5yaUtYE5n^e>E7vh9}j1@N{I9w19fxUj^|lDjBn9 zSx9e|AZ~RDN^2NK-%SxzINmRidIi_7yKSkLb%WVu-Ym9EHtBjJJOx@I80BSU6EVWsTdx18Ev&Va3ADg%mR?Dy(&;Ga=i-MR<5Y6;$Odv&^rv2 zJwhh17zYC(Wf8T6xlkgU7m1N=tdxTD6bj}vt0B2ZmBx=bjgdNiFlv^n4p>T@KOC-5 zx;2K=7O2cBB12sPR^1nHB`zl>dW9l^KR_#JXnPnXoV&H~66B$lxzt>$aTo}lI0`WU&5-WV{76grgXt^^ z&?>>IE)tV7AziKY%r_i3nF)bkv@(}h`(vCyyh!ch0E!uUa>2NV$i?3VG}wJJ0BL3J zsT`nVmHB_k6EhoQk|t4uK55*C&SVeU-NLI$}RPALL70>@>Mwgdx0 z?+?Gk4xlM`aRySWFj$Hlc4ZM#qW2$_h}euq4Qd_K)YFLSREooxY{d`5{=>Jnis?)K zzz}6OLlfA2;JtYGMp6_l^4s52IZjK9hgA`?n?v&v%^6)Ymj;TyOFWn)nt^kACK!y# zNIh?A&CqE68Op zd6wIy{{YlOKpKq{%uaU%0l1=!1#)=5h;;yhU61w^Sf!&~VIWrq=xQEIF`f6LPi-hm z+C0V`yHll~h6y1QyEoUgHYL9BH}M0r0oZT<08yezN?p_YiE||sPS6T%Wj8{v-Iaq) zcEz7lGLc6@^-AS4Hfd1rSNVjHx^r!`_);i9=L$%DqFL7gOh)V7i0Xk-u5fx(DAZ+^ z(fN?-a$g*&T(WdZe8rQbDM*MrrOokzAy+$X1Nf+>TUmg|KG8u{L&dM=USV0$vi*iT z!VA=YkkOLV?#~a3`JE=RwwH0^H{yQNt2#1?c6lA+w>Lk6WQa|Yn;QZOVhDf&nr*&)qhoh2MGSk?v3O@CzhxuuIhWE#ifp5dQ^^w{a;LO0 z>>V~16z@#k7hQILApv`UwK@nHRvyV}O!IKujW5CkJ91g+F81P35d}7sThw6klxQo) z=-0APL=;kuQ*>pqN=hAEUgD>fF2&hVfhM>;`2|?7v6J{}7Blrt+ zhlGz44>XhmYm22uudP$znOg}fLzX(JlqKMh-is)uE}m)~9U-_u3V2_b%#{c)K@_cS zT~71ozWC@hjhdo?!-hCmB1gwu4_evkOp!MrJqhZZ7`7TfY}tVycdEh*Z{3;)d&%17 za0*?qNOqNMOoqLlw8XzRof!+QfaURJ?`1%s;t?BQFk3giOI5CSpmfhTFNj#6HipbE zq{>^b2w#gFbFAVU*vrt1YUzlBw#$@OV(#v-#HeMW<;vL|ED2B1iJ|iK??z+1?J;E3B_l&W+*$LGBz3H7Q06)9N0{Ph7XFU6UqQX7vr3k zq2Y|&G@lJt(PggPrap=4n+sf34Zt#-GqJ^oWD2cDU51H*1&fzeZ4D68sdxKu)dvQ{ zOvokK(^BM9RBoJe3c9*?Mu^z%1Z0Z}0ftrr4g<3g_5cWlu&I|y;&P&YB$U<^xE(Sp zNdtS?y7QdoKa>oz^l+>}gNTl(#B}L{?Y+Xg%^Cq~15T+xrH3lySB@k^SFZx40qWKd ze8yn|=!@0~cnuIqDbT3+@woSQVC4c~l_lZB)~Yf9ndRMz_?C*f=#4-KHXjl&Q&WMB zbg?MwJBtG~o(Zp5*oT9^4?dIVNTul=oss3u*#kK`o*=^KAZd*XT`UB3A#J9H>>;Sz zCi7tR#KiSTI}f=Wv*|z;wfL8F8vPLJ!HUdCGVu<^xqVrYx@mA@to~vl2=OaaRv{t0 zqw2~%d4ZspIapeHM?_yIVV5Sw>e;1G5#58Q4lu9;g!6+8MG}PiD+XPeo-h7O!1)SV&LegTXt5K0N1*aKkTS8P{CFoa#kA9Cz~b2pbNJ^XpWqq{8I1n2K*J> zS!`j}sJdF7ArQ96V+XCN=S6Zj>25z5e zq>%Z_4hHS{R#O3oz83*K>(*2fsW@yN`GTt>dPLaL zC+IpRZD>OO0A1k$3I@3nLxhM4UN>o+^Ju=ZX5g9>gt+<(2;I(ZOK!hktXO<$JPrC!v5r{ zsDxzqm{{%-#d}+z<$FPm7}dVOEyw=DA_ophzme^zD|8xCm+BK6XBhyITTq?hAu(&F z&xRvDq$=pL-j-bb4@Ae+F8OAk>1+kdFrzonfN!ip3=CK>WJO>oM=b-dh@;zyu~%?g zSUHJafc602cYd%!EZL=RupS62mI{Ki|Y(Mn2cRxxP1ar0P6BsE^}`e7ce$p zQxF3IxX-FON*ZlGa9YtQF9Fa9Qz8kBF0kL6$`+|sP#p~j9G%#R1Ay69CmAR>iUc1} zyaA1Cs`krmT(%%*nXle=?EOGrw=%7a>&7VTD)ZWQg6?XtzL9-FR?vyIg>CpFxmge@ zp>u6o^9ek@((tgQMSPm?(jxn)6c(KdHw22aYzlc5p{`KE27@&U)Zr{Nbj3>PksAd){e?8tDLErZgBF3=bVDE0pC0 z0C-+bl18kWsM5|d522_nkSn2Dji*vYawczE&SProvIx8Fd+-R=r19LL3JSU~;uRae zX*6|ZW~T#RF5<^3o6STV4VF9t(ud!?M&h&=4C4cDNH*m_b(O(kENdmv8nEwLYB6g@ zoKeytdRS_Wt?6Vpp~||DJyzddGZ|v7kFHjp(+XnkMV1w}6&!@g5iZw6*r;j>y#D}t zC^X8cbzDk^+{q55Eh{DK4>K&=y8$bMY2Q&*2&(ccl&Axgl;N;zjZ4P>miMR-9*_WB zyP)lM#l}_%P^Oq{O3hsyz+cEfjd5otT6m58QrmCuonWL(gh}kNYSYD%=V-yLDyz%Q zfi_dbD9*|QU>+>w&qn&tMKt9$>RJa-_SW8S-LvZ|rIv^cU*dVYxg#24L@%tpA& z1>T`lk2vQRM{8ps7#=tO3$53&tR&2biH&l5xRwsBMS9TOC`MX;0|SVi2ae9LHR z>gyKu37}`k>!5q!|oPInGZcI4#=p#vNuyW|%CYXD1_J zYa)*hUwLN2fx@%!$7Y2y9+fT+1MrS_5b1h7Y9q0ZDI1iD0*9e4(+1U~CbB zh1sOkfJKT`_LtCICPi0r!iYuKH7ge=y9J-#vl)@LFgX(;Mcb`t_bO4X-YHvLbq_{s zz6ht_7l0p|m!)M!h!>@$LIAc0*vrljSfNnl;0k;|6a`&X>jk1_p&!gcF_u+10>8SH zj_FMR+ww~Uq$~h3tdhrjKfYlL0jEbH@c{B5#|V2jIH-;JQ}2Iyc2+S!&4=1BU>fuU zHN|gqKtBvK3Oq7m8%14JaSsdT4`Z>MM#v(Pv`@qvL<7`pTlkmuqnA^7@)3j4-Lij> zyW(`{ui2c=ayiC$GhGX~EfGC7jlVPbICf}q>nT9e%B~RGL3p_5&LZDJ>s(6tAcCYI zjG8=HD~gR7SdNy<)kR5TR@!gzEjyLEH~jIQ(3H^Pmu7tH<`6{#L&`rZ8Qz130eFwwtWYp}+v>|$URH%J z6@v`JF+Ro|7Nf4Q)?Mgl?|K=7VeU#Jo{0)1}>pV&drD(gV)jrz{&)b6Bv5I*b;F zdGa58%-%T}r%sV@3mLj?`GQrZ8!h&8KTp+xepGbI4_ker0)$WB#jlNs=JdA3msd` zdaRowmcVgbwebrYacBb9j25xHte)-^V~2mezeTbIuJnTQ49bWQm4FBb2R|@r>7l$D zmXdXJk;2xdNSesGNzRe5C~822uPk!}#iNyonYUsC!xVcJT{_C#9AifgY~G9JS~t=o z%z?3pV7VPlcDY$UjcmJUuTD+n)A^H`PhB9uxt>}b__sfXQ-VJU4X<*I@~OJMQ~>2o#`6s4Wm zAT;qaycUg8R}{EWoe(OM^Je8&mfltc$zsG(nnxeJ z%o1Y(0q`dUxXjAx0Z{{30u85#Tj-cbi_2E6b5Wu;j{v!l2!b?a2FtXFvoo3=E?&rC zJk;5?`{{xYu=OIV4dKE?v!uloMb`(*#&Ea zt>kj^CB#!i30QVO@Lg$^L5SEY8zgbuFVO!0v1b?lKOki%ougzHWKQ2 z&m*p0lZ`^o3}ORDtPdsY+9*N{E7j6g3}tx=IpYjmOh z#Yz^G4>$ON*^A_}BxBIZ%b|iB8BbOzfZDcoT0Zarh%XK0CGDVGFPCyCV3S-W(tN{O z7e(`}L6C45vEPi+P1a4;zv^phf$Gr=WyAv2q6JiYjAd!~gtZAlfkeC$gPSmZV?nav z$PW92*i|NwJ?_3{^{(6CSGx{?A#rSa+bPW`7cH@V@tc8p)M@cwF;Fz{YbX=aUCl9i zs(v>L)3Uvn2ki(t0ZW3PzLDObX7(BUrJ!mnSjwFCfun={KwpxjAP_eJp!xy>TR75F zN$myI`>@ju%hm=((fn}#{7T1S z$5OD|0Y<1pWi0Rt{7ir?3$-f;yDA$R=o9@h-B@UDkIE_(p+ety4gr^H8T5eKg`(Qx zU5R94Hi7t-qOn_WABjh+HMTF5HVLZsj{fB4a*$ZT5LKNWK3Je}PQBjrLl~hN>1_TD zlL`S+l*5jWVu@H5`UQLt590ka0rr7i`R*s&hpl;3u}@l*94{AyUOQLWECATq+7q(y z1%+dp6^7;mmecCVO&WoE1d2NCuLYMcq&l{IGWic<=@oPJRVcmY^9ZS`7S$o>p92dX zGij0y_dEot(ok+#9ZwJuM?$Jlz8BpTPW?g5ZP-s)0bE9c#crnYIe6lr?qVj2K=^(T z$TGSl3OS-LL$mEgD|MINb7C7n6uaGgAf!pq9}(3veS?`_*wP}RUeX^%AKc~w0i(R% zBwRNbRWW&RUY2!=iK??B%e1+k5V47QUE}8VKu)^BQ6X`$b;Zs=p>Qm3R*C9MAfWnU z_1(wjCs(wOac_xU0OV~#`lF4MtDLcvKvKt(3^S6#7y!%_b!AHv0$D{@&JeM4Zgv#n z+n|_Dv#kb=X1eu=%LG?>cdFZ%q@p(fgX{uUkP=!0nG}JeII`JSB{VZZmZ|oHT%?02 z6}^|@BZ4swDSi^1_}bV`ooU~AM#+1vm|X^S&oO@lf?%#JQ9QF@#V8CAGRF|rf7ES| zHOjT{XpJhX@N?MrXIpS32&AWRn)(@ii@Xt#TAy&zW2HU6B zT7Of~5P=Y3e`VFe-MyIZFKE`%7)OEmFVY6405(?+#xs85gBU670r5T&M` z7$5-wl(o;iEp69a8>pGhQAnH+ck=$g zk3ty=L|(ayD%qQOCX@r>zgasKuTBt_Mw+x)9GZq@` zzzd-`f`o!L{xLUgG>^MV)eNVR4HSk{{ZYLZt@@jGS(8$Q>thk-VQ?sQFvpNv1{9q9vYXAXlF{L){47O7b?=(Z z^DT`9POrV(XI1B@F>^RmLzaD|UeF$p_HLjOrDIKVD`2WO$_hqc5^OU+WVLnj;Tim~ zC|1^2OZJagp=~9j-k`zJ0m_v1sFfRNDqW)|_q&BcKXtMaWc;A<0O7eUUX4YdW8C zk4%S3Fh2hPc%aS24c(*d92S8)v6bX_LWnrX!#3Qq-k2K!aCy29#LQ;67-|o*DU5|^ zvV|S<5X;E%kQ{l%%XeEV33(qIA zA1PRD-7~7ilqpot;d(_tO%RzoHz};mjM`_baaYreDWGvwMk{0uJPqXRbctHvXkhJ7E1>WIKPU=uN3cHey(Nb1LU>qtnTqFS032QfZ+T(C zImei5T{Tt&dZj!tcL(ljq~gu+&G}G*2-};~X9%JdMm^%9kcziD0U=g(J3}t9VMzvX z+A+y;g0=;9ZB8`o#J38JYW30V)h4m{R5QeyOWb;rM_%syA z;m)KotQCEw!-K2=5EW7bq2B8@Ljx>e8wOwyQorNLJ8LH)==vAZ9p4EDr{p-DCSj& zQgKaO2uT^10aeQ2-$FGmb~cPEP`O3+At^fmhJD!5v|2fe4&_)`Wp>}R00}TscAz`e zK(%1O#=BfU7We=Gvp}kQz=)A~EFMRRMFfmefMFGDMdwpe`a9_h202XYiAo{8S$vmv zzcIip1VCbqVXa^=N?Y2wHUq+r`KX-fz@l_e+I5cNDZ&&8c3O_X0-P0s7Ouu?(i>nR zWjQri+%kni?FUi{)FkAGWJPv^#71B*Z&lOAA^>E$fW*KlrBgxH zG3PZKZz=#3asz7syn5JT8t<75(bT+RCD01jNyFX|Z%5h>A+-|L%{W_*QH)zHnQd}~ zz|~M)S_ao4ZaWYuAL8q!;kX@#qXF<7hZ%fE?x${m73D{>0a^>VTw)tHTb%2(75oH( z*+S)3S6RetfV-4}mAlKgthx)<5?MJhFhlF51JY%TW*nH4!P&Ps9VoNFHc|O`J+)l#gm=$(soIBGovK z5x6F&T9i48Z1Bel!_=jZUX8uw@n2bE>@ zi5nD+Sl1Xx816v^g{pPQBMd^u*i#n>l^fAeDfyM17T9tWZe4YD7E}oe^ygWEk;=o9 zmMCP340hUuI}x7KaP+0a5J{de;O`rJd0p3;0~U#4w^qtRJ99waldOIQH@Maq84@c_ zN%JgH#ks(yx;cPLpgMpr;EP}vWo2>N?2QpoG?*&&ZWVIT1zm$P6z9d)H_SXWbU)6EOuB0FUNWODEwU@}h$RRCciarC>u6({cDr zYbfYu>VMR0KfH1te=mHMa$C?(~F25Cb%nouzjy zH#S0#diRT}7X|d(A%O;)>ni{aWlG$g`^_smB49+^cW8_=6^u7<7t9vLN9md@1HkOF z(YbnaJ#<^$tCd|{)s=r@UU6j%fp2boC0dHh?~_k?BNwD!Q&Zf&ar*Y7R4cDpk_ zfmVPIYnO?;pWf+E;C&p9FvLTfk{_Yl-mpF&T__mFlq2tep{-8@`2 zGTRS#pUhQMRpo}H4KOIs;1wnEu445oshI4^4GCW3* zO|P%{8G6rYr`24$MQfB`JM2=bxVfwtnNR0wJQxRLsoE zwHvQsh4A-_L!)p3-~t|(=`!l#>t-(C+{;G&WEv&mmb9nTh-`k8E0>@{=`2x>w9!{3 z7`dnybp$ZWAAGaBETg1NBGV;-;)CkuFM(%ZA$+-CdxQr|rx2k- zm;h2V-*=mNov((g$>_p+XGXDrF0GSn8e1#MuD|l zt9XZ?)=Pmcf{;2(?4rS|cA#4~lwvrY(hk6Ag}Me9RD;^(*QkOPp-ws`NHR3Ir-19@ ztOF3l04peSgKrRwH0sKkWdmM3Sg6S@S+z}$6uiA5Y;`6T6g9=RPA|O-&%&rW2P7RCen<+$S*Kxx*A*J7gBzy3~CZ-{G)M7_h)8Sy=a0d1g-> z5Tk~+qa_VxxO7iW%-J-fgdBK`gp!ShhufKM*bo8~EfisBD@0NCmJTCa28!Q_S`JLP zep?EbuDVAin^U1xumrcPXQ0O*Zu^Sy<}h2!^ua|qGvhmTHyD;^UuIxE*bIe1K`T_P z4p#9EiUSD^(NNOf@o=V48yIM!(=H|Sa||JSrZd9!%mHw_Gn?h7e6K9Y9|O>fL-O~7 zk?g9}spAV1It^-7tIHIDUoa|NVY{qDW?42A+gr`D!7l=Y-d!8)KwL0TE3EV_^pu9( z>lG$}cI52?x`PO%OWmrzRuY$qM*=gGmAvXCOKHZk-%3+$MHta&c)c}iKN5x|X=!xQ z9Vjk*isME73ijHADb&gr;8lgvrf^&08ZE#Z^#BWO91zX|O`%%!AdM}cwXcD#`acyOk(V<9d|Dbk2dWfQ#J;O6APJ-xx)-XmRZVGib%YTLT2Te;0wmvX*U1@>4BP zgM$bCfs6IS^dn(I)G)(i(h<8bjrzl?H43$EiDni!>lCP=hKv}%Fcc4IJ#hv^r zaS?QutvJ_4Jo$qj=+e$GtQSzCfgSFzh{Qz_ysAGj1aMPHlRpxSm)HLEibYKdv&<{R zV)aKqFoJME+92Y~p@x2ACAyeU6p#*ak`PF!>XAViPN3HORJa)PDRv-c9l%@;ZLdjD z;VH@wh!nUmSo=v`s+ZmQb9F-W2pwOjm3 zWl-crt=EzCgctw~^Vh{o7{~@H*tUf(oQrTp$RzP%*TXwj1Oga?K{9k0eh3YCGuj$d zDaNj|Hk%r?8~}dt@g`eod>?sH1~)_r)hjZJT`0Wa0)Uy+2zf0Gi%1IFK!1^72Ps)q zMA5O_H~#=?U5c&g?YH} zViOl&zP}lq&KtrVbsxOwA#9669K+K_FG6SUi2IWWt3U9W!dY6axP^gJdg`%D;3EtI z$|dvI8?jlw*SQchit+)QJxBzJ0D`0Gm?t&!t!uhYk*vI+>?*mu4Nc{5^8|%ru0(cA z2_=#^6k$JbPnCx=oYL~T>lI>+_~NfWiB99xae%4QTMnD_i-D&C6qn^$gC*CM zi`fthuCUO3+qcZ@?oROB3_n~@po`%L`vew6)rk40(re+KREqo`5fU>v%PXeT?)HJQ zH>ME1Y!~I3&{r3te&eh>Qz)));gV}6rRnsP8>e6w8D*3A>yv%Owei?j3ZXua;*{3U;)5ZrN?=O+1_OC$4N=C zn*lvh1Tes$i|JzEVLc)ztUi0Kam)dgFtST+E#|7C0aJ^z?|DE z0`k=Y%fJw*aU39wx>)v&(s->bG4N94wMHfC zz(#s>7TYb=I!l4KgCgL@Q{4?P+b)1~J%g>mcOF4TTF%6v%ysOldqoEsB>hKR8}Az< zv%e8#mYn1kcoC~}s4&DT0-RoAm~$0WZ>1qdHpg70@L@{9kt3nWDCy00p_<-y=5Wam zA+c@`qv>&X@zrb~;862<%&F@$;&8P>t5KtHAvIPbCUjfeh!I7q+QJQ> zmyr}MFPbv2X-ij2WnKnkIXm!POT8Kbdd5z)tfX0bGV<>#sobJA4o-@ zw#~MMQCrABJES6>YDNpr%7$7}Whp)tOf^Kb6;64HbF9#)qm|XzV2DO8nw23+;1?{& zxe(YHCDq?C69Y{8eEC0x;456ia4OYvvUlcRQiq`iWJ3}{GPN9t?T8_cv=BH=76$zx z+ecz)~wqvXU zgb~=n0OC*-SJrZC;qaRWhzm~V<|bn79d{Vd&{Fj(qhx4EY^6UC32S94?E6N5tRzPl zPhG$|1)H+1rZu)!Q@f#&5vLNVxhsdvDbjKIgT+;qj_bTDx9&CQU6JHaU^?7T^`{PDq?qra1rA}LS^)aR zU_~+A)X0l$qEfp|3cLVUq-};mFeOK@Mp9`?t0-foS@wX+1sglbi1I~PvnqX`Xb?qOrjIj_1H4l3Y@yasQSir( z0s|qxcHsd^6ZBLLgci2h55qF}uz4C!Mgwr<3qtVI)!rrdiMZBm_^H8dSKc%#ND~)& zJ|h9NBU#L|2##=H`lVv!I+i|7*TkcFXW~Xlh^SCgtM3xvw&QoU17u1^lVn3eq%&(t zafDQNq1Ts^Q%vt5`D3~M=fRc*q_+U`x%@Xs4GSMKi-LGX-B(Mjb|SHBJqd6()pQM6 z({lj4kS0npDuH-9ax7lY4uot{Y5 z#`4}>`alAL=9f|78;5vN1~_98FiUJ(p>szy7(LQxpgZ|JWAVVg=w=8R-#0TxBLTpt zmA1H!E9KfUvU6M}wkn1A0}4H{L`*{)EL}Y}t;Q-hyU2pqqX@YLTM!b#xv-l(S6Z5; zRORNYOZ77bSgj~xuDHH^I!`~2bgFZZcQ|QrzR*M=g$&Bql^6*ntE(gBCF41Dc){hF zT!{LSoY>22N9Lt`v#3n8oHTPD)o?TvQCEK>2O9*1uHsb&6IirWRkWpEqE#$nmyF9r zD3@*Aw1YGYPk~4VgEm>X-|N72YB9Gq;!-f9VHl=sCWBdmVpYq*w^8Kdf(?*FBFYfr zioGhKSFK5awF7xrl@2t-pt_*<7_aXOW^h8ZtE||%>rUkwDyvAfXenFqF&V491en2P zL={EWW&?)9w;6-^-8-EdJg4`5km@*a3zKY(!EGZIap-61Ih~1jbvsk_WiY=xV=76nm z$C&mZ$QlIEgObMLrJ~hfTm)s1U|7JX7?R!?<|kawpC|D*8qp2MSO7DE`aK{S2;A0S zs5UiYs3EvNycBGSOW>*W{U1bv77&#sX)*HYptokFat>;*KGBxnyhue0h?-EUN2v%n zNf$=1uHzmB6q?fkfPj8(zke`cJxZ^K%qE2A4y(Bdim#=ho^Cz0qP3yFQUpo~W|qDf zGu`lb=={lQ+_+^@14TxD;-?{(5J26F@Dihl zn&zp?=`#x7kpKgua<(m2UQN#xaoSe#%C^I(0D$#=WrE7%w?oWv3n{C0j9#0#{{W=D zRMPnX6dn>898xOiX~#r}s2UVev#HI>1cN6m@WTsG*Imap<*`|#S(R;2M?C)k*f`V8 zjT7=kAr8kNd6QmaMB_7IZ#0n}KtaeEK56)r^_M!e7xl>(+9=yYS$^|RMO%h9-rs2R zTqGJKu$i*ADdf3#CWbe(m1nU&RG+a1+&zqebUyOq%pprHYHsa~;g{M~x()O{#yCd> zu8O&jhzw?egV>c|y~c1pn?qo89?uR5#fOX&Z&}aQKW1EQ-R_I8W>G{q0vF-9)LUK( zpTn?+TDh+Atbr$Jd}bRE6>zUEc0$n%+-P3JO^RE9q~|J$Ro>==6`()^9+HT(o7@3G z-xNYX61CM+^Kw`bFQTw~y{1LkK|wC-!|70T?MEzP_q}qsuCY3|B3T^oO&rOrd;V)RZekXiz}f<@Q*|Mf$LxtLvVIlP0id zLr?2z-%3%6JTp{C0D{+dJ>vT6bzX2StlW+V7NC+3hlUshuI3aPG$H>0 zu`g;tgpLBj)IwB+b_-lB8fc-suIZDhAFaS8zC?Lx91qS&Swz2B>lP7Ft`?T*%oLB_9{RNR&lZ)#g^+pnzqyZ~!l) zNuEcqQp@NbV~Pey>b}GrF5peZL@ZdV%tOteiTsy66sHsSeOVBW{LmTvaS#3p-6W&; zUuege&Z7l|rtY$_4?Y~Kj;0k;5aokOFr};+<|cAyHVi)m$>9B%!d+sE<2U$>KtO4W z)wNKZy32s7zc7MA%b5C+wO%13-JC`P%7bDT z4QvsOk%5#aF*@M8i{_hwimg;203_`-{{Ub>ZqRU*Gu7MWvi|@dGI0?An1`A!QRds5 z#1#T4BMpOjKrWHdmA}j_w~7uEhopGz7ISO-mY5LDhhHSbLqT>lW7YCayZG?O^)HX>>PAsrQK_ie&eLSk*0Y zVJ;&pU24Gp0AV#xF9G|{&)>_BNG(Pj@&f$SYKAd+LH_`=9|+LooJM8bW&+Qw1o77n zVfyAB+*oxLzqEHFm&EjVmhT%mwNZt_8uIP$nN z(YP81#mvC#f|j$Ta}ipKBcm2RHkezz*fb#_928maaLPKKz%1uPFWdkewJxfrM)DQ) z2QXQ)uq~j^q_aqs?={8a%&u9OTY{f?Tn#{JQSVn?gh7-GW?+M`Y?c#%^{NQ>sHhb} z;;F2X&5#27j5=f@(nuBB>ep#-Bq}pU21MyvTQ@RR3-$OTxgQ=<<$zwYpsMtiR+`Cw z=uhHn9`k1i078BtH+duhmq7jh1sNTBz4)L)YwtN22VqD!DW53P7^HhKHKE^KwyBUw;XR zCJdJ+78DK(RXNr=L?#8$1sC3kzk8Vd&qVzvSeO=|a46n=q8#xbL24|r=gA|+1rthf zA4JjJ_wNM_ZH*$0g2t8YVSLwsga8Er(1xR_q)%+LppLx)x-OyBLL0+#;YZS5RH#;` zkR#R+$Tsy=Y;9cbTJ{iuR|gp!F$x38a`j$VfWI*maqKaCtUby|4lOE*t~hy!{(!VC z*V&AL6O`@OI8DV>Raa{zLF-vhPGII$Xa$u`l;Z)6$8fBIbwf&W=4I?O#RivjaWn8w zMcFvg24(kG=la{g7qr$P;g<%us=HF!&HF$w1y2gcwL|yyATW;Vs>B#tinJ8^T38M* z%olR%mSm{)<8a-eHc-AcMG6{KP<2{8k1$VZVTSPaXNf-vb0^sh6kQD3=cGi1jsnO9 zb_doMrSO0d2ex4;n9f*go|Ls6L_|g#E3$4Ps3XywjslJ0&A%FuWJt#dD;i-h(KAHQ zdq`sBc-MJE1C=th!N+&RCz)v6O6dU|)m;}fyfVV32INUzri$iGfFxZ5pzQ@LeQ`yu zxNbjj>m-YGyatPfQEU%dseRAIKi(-?BD=DJK=qMTi9eJUYx7!quvvQ@a4)x6t}v=w&;8;t&YUM_P@EUSHBaFF^= zKb7wa#W4{hkGhDCNj_XZm+d+v6^N7OzR-^X7Ez1m)+-?DRCv4``)t3NXx+=5V4%6O z4=s=46VpDJ+W!C`R@SHu&z>liGm=s(g(WWM0iU8w>KG2a+a%An^!Z;;pbfKfu z%Vwuk!9-`S` z(W;3Jsy#}6V|q+0RSWHMlndR^1^VU;R0lW>QQq$1fMkuVp~Kq{02{02zx<5Vg-y~2 z)*OhPZ6^=g+69%=W{^J8U!~GhqN~~n1ynFxQjwA~RPuCG;ref7j>ctWtJQzpkf@*r zM(DY_j>|7ls`w*qPQW^zUhZS4zC=A^&XW=GoX6EGS z=QjcZC9YtEG08nGR8)v2>2m&(U=BA&dW_dqz-yd#t^D?$=~y^NRy6&h1R{f)E%+G{ zsYcox8CN=4fR^{%bKsvsHy8f-dwEj}B_jL44>XY6B>eCE^;ILNqMkZs#E4>W-&q znrdcMW5o@kh^bDftF{+c5U@H%a5_v3%xM@_@K!2Ncy|>}=MVuAOf1WAU{5RD5~~aD z54i0G&H#cIDaoC7fJDX}TX?hOZrRe?!EuAOUJ=y_)QiI1I)^ZsyRBhU(5?a**v{S)-u624$JnK!pV~)h~S`eN4NcZon--uJGEoe(G3q zS=8VhZmOpC6<=t28eKI8T;VRUcc}qH6o++of|i4A^tL5=INxm1P8|0<%a$g!BPQF{ z`G`!?x~)KQ$t=K}31OzWjY!eu-nD%v((@EmF04&@#6)yq*5j5zZQk8zi6C7B)Cc*k zP_p^3ui%Z44aEYN?8an^1n-aq`aJ8XYN6}7uE16h zbo615RrJxB*=!Yb1;8|>3bw2a=dsLhQf+H7yp%FI$VN!4v}j4dRUV{0^)*6e87#Ml ziPyeC?=8JyU^1|1aC9UH0;@n9h%Xqj40W)g_t2J1^vm6LRz0o<##~KQ(U^2KnP=>X znHB(sfaWJ^HWmvr?M_uaHN7Oyu%Nc&A(SvSYbs783%FdwInB|!!6m@7jxkjzNvgffliZu=Z z$^MWyjW#bwqp3 zh(ZO5P}q-4+#EV;Q33G8;{aPVl#@l=ZfN67b+~YVj%D*nY$F2}KQ~x_`_RmBGV;;0r6&EcuvdYK;!M7hz<=g z^fLU%@E~io{g}W7+0P&1C0vFLnQ>uRQ>Fg^s^d!+<58uk za-z6;?jrR&MTr;Y00QFy4Ye{ULN2j=N?9(-tm4?OEA=jg@n0~0Z=T_|;2=;E=#@$G zF-uju!j^lJ0h_X~2)E8WM-j9d0FSO8ne-=NF;PqgAYBkGy}_j82E(RQ}=lL@SNW=~QqDbn@v zpIB1^H*{t3c#0Vm1*_1R9i{D}hf(VRMv)n?4|e?^;ol5LumjREBCSy3`o)CUplLoQ zz$P=0;n5hIQJ6(bVZ&$GeWg~Dh|2&$RiHC)q6n6c5NwrAR{hK(0P@3ANuh*!2%>Ww zxceQVU|sOFUf##cG6{{;8oB-EP+M_^x;TQ-)&K)lEJ>cF)ogSI4j|UR0(@V*#s%1& z@`w%C;$Rg_0n0FQlR;61`HF>GQdeN@+8tt3E=c+aEn%9z7>oIaaRZ#^4OdBb z2D6vh*Stu!6n8@Io6I55Y*@y~PE*;`7xOshfYVondRq1&m!{*2FH+=TU}%$u2CZrt zkr#ZLK+c>>+(YnCq;%pjzzG3&cJqVrEUh~L&_U#3M69Z!yyp;TVHW%X5?$kMt5xM_ z_LCafdzIQ^_r6|^UKe^d9w@!T*fO3{YqQvzAy6%a``p5g)0oLHI>D&msHK?NnwSd( z6;KV@MG9Tn#itjjPy;{!I}<2@fQtsxvqvb%%v-_~FDuH*PtQsPHoG9ltrDQ5s4T7qeyi(+dX4RN0FYa-EV^<=kT&|UfDP){+h1_LM=R@UV~ zxR{+Hst7@NvBxk3PP)n)W68Lt5F(#K6KY3nU&Q`jarmFP>Yq=aEWya!b;2B>=)KxD z@tLt*en5L91QiIXOOxY%(g-05msa~lc$yZIq`AZssKK$?O0Glj&afCM{hf4#b;N`SR(n(hP+K1t0Ih=1O)z;lmeot1pj2fD`65x| z8y=|Ur7*x{{XW803pD^1z}fJ;_f$@TAd=&m9TK|Y z;?=vHc}1Spe-iYJWcH{oEY~Vk>sK!%V{q8F;Ry(&Ztb)4It?0lA#PH-fy}(C>6k+y zn^$Okl@-`aa*|`ziDs8kmL)?&t3n%Y4CWQKWHBec(=YoZJP*7k2sT$l%Wmx<%Bw!m zu2+K~0=?LI@LbZ4yHrrh0euZk!O1UlnE8(q(qFJw;#$o~hD9EY8;Xl5Yi6b$M6EFO zM+%^qPV)#{Um>IH<`EmNmKIHSFWLeCQ$;g(+`nku={047`^N)k<-F+e0v3s0wGxc& z&H9X6#1DW|zYwAe82Q5cEXrywn;&MS54@eEwdRe=(5_b_@#0GefMS%er`9FyJOgmF zoN65~z^Sd`^;w2}22Miha#hN}A$`#ysSKe}rWUYGw7#?WJQx(-_mcR=U|C|p($;*< zvsUW&7T??6LdEBklUR2v=2IfqLXA|9LK2Hsw~n}EY!_|ec>A33AIlU68CUNb!fKYy zCGmxO#0tjUH>mdwrB*`o%PSAsJt0#@*y!+3iZluUrVBdg;D71^&seH<1 z!2y0z_JnN;QjCceA)d7xRqGwcXhe3daPz1sqp+a!g|Z!sr;kW`bTb7&x4P8$i6~9P z`dwefKG- zh+tYzNMfI@qOmk&s|Uc?9FUb%5Jmj-ZujAb8ybqvjAAaV=*03nU|2AlWpZZ)%+d-k zdR4Dj)N!q9A%jSX(Vtw1WMraf;N-4U8thxs*%W^f{GEHWv%SpuwV#8pzFFA+^fw4G(lDjBbXa%;fykrVSk>Ut? zOCF4=(U#RD8M;(h4q)fXVpMc6ORHR>lwDOVVtG5?64EsQ+o0fm2qEmSN?r$?CovFS z?`5cVC=-MjTyKl-P$Z>BZp>Q*OcJ&+rz#Q`gE;=M5Lsw67V6^*1+05&s``FnnE(T- zqwgWl&=H$aOwn#HnQoUMlLPC2_CD=EEekB}U$niv>9hlXu8bQSWo9*Qrj}U2d%p>0 zLc^o5!K%LV3)Y%yjNQ9g1+vk&ixjX77g)JaX7v~mg-$_g-v&IH+w74WM{`lAlZ8w4 zlNQeVnJf(#OLAi{mM)RbS4S}@D7ips&n618S946*O)WSpM7WoZv1*iIaOJqEth145 zA#@W(Ndoc55fVT@k)xvx+JEYX=jK)Tu><4ANMyM8j}I$ zaMvrkIgyJRT!gW0n2hFv^1*N^vIKGoioLBYnYL^zp%d3>H7|`@Dd^BenedgQ0ZWf#BEPEw>7)fiIO7{N%jKBjOiTl|w zK?pc2Fx(Mo@a8j{PMi_bpet6aGYi#Wsz2;SB?5LLnpcn;#47r6*BD_7Fyd~%_F)q5 zD?_9PMRrb8L@k%*1gSlxp@+n5Sc{{D`ImlwX- zv?wO*awKU>tHr{_5I0@D`E-hgsKs@Imaz*mMT+xfd|`dA7Lqtk7b z<_RD^0K4qX+_x&-i%@nTS8Ve>mo>JxhJLwu{3EwKU6%KFdS^@t9J3K~|hD(6h7 zia_eoUuW7rvcutRZ$iC@x<%5rM+MuCRzIW{-aFMwxyYJPMqYpu=*%B*2)pn>d`3ZP z3dLuN#ZRLLGPA7NIs*DchP>M#sot{O!v!x6_=(nli0a7N8WO7ftp(<(-sM zOXV6uTG|CytOqW5 zg%oB1LQ!(6JxeDTYJqf==%D6Do~=@^EEL^$)Ei6zm4duEddjirONCo^b1z7%z=llQ zOGS8Po|BXw0`iqw*13@y(_veeKp9wI>AP?}m7}_Z8w+F$9^#AZxG=nzQup&iRqsnwv5_5>lW^>vpH#;syoEGBf+%e)<=2eD|G)6AN8$|(q=z(a> z^XLIh&uU!?lsMnW#oS#JW)YEFy=d?deC0-KA5Fp(gZqe?uV z@)j;Na&ZpfO0z_$6J7qXq9T zb*g7g)%>xkP1sn758Q+mf?Lsl9YBYLeK1w|z=_t*zl$_o!{u zf#VOf3yN=V0m$P6?HD07Re^Ey1u_QoF%cjLSmieqDqIdx7x5k2vIQ1S*O_oEVSvS5 zb5Yet8{o2qb=(V4z~r`9Xf2GUD}SLnqB69o`GytRw;42WF4#}Dy&^tHH7Qf;s`r4k zSCs{&$C4{SzID5O;;*>Hmww_@&{YD%D_rup>jL*~fZORZu$B~uN^tjz(K-cpZ!9=V z+VTp~=)!F{Ebs(aY}5<&Pr3V90XVbDc}XK zu@8|-DRwn<vw>wS+~5S zTFnGJp^wU@9HAcSu}IrOg|NS9tcq|@r2MnGaU4`%mgNfIFrsz|0`d<9)MSbm5L?}~ z9^^zwMK)o9GKFLnVDnZ-H88x4+T}%OWurw(%EIl&d!YWqa15Fa@A!JI8Pv zB(kUwq!)F08DlTqul$fM09BwB-SJVEp>31`&u9uTS_`b!eNgp?kHi8XUd9oScF9AP z7ITH4QTBq+ET<=BkrYwWgb!gw9N&qI+aPivr>2uA?XF7xOe&Fk97GSWLeaJy)Q7VA z?GF@^p^bk-IQU7mz&mJhWy57(pCfr&=0VS|&1nhivVgFtIssm()|PpWBamHnZO-Nv ztSb~i;3zSu99#jMv9}|l)-Ir*Dl`Pip#3QVk7N ztM)~QA^@N}^A~%)CJ$mKXFt9lpg>G3YzC`qEXFB-hC?eno+35~D3NMlLXA9-7r>Rm z*khxH&wa$1btz`0gKabqM^f5~M$tekIDxv$8aR#&a-l$Jw=nZGP|*N2tyDzY&@0~{ z!8@uT3j)>jn2HQzm?CVq%bdpt0HY4pV&uLB#43oDxQdFKyA*hKL-j`NLhsY>m1DEO zDd*ldl~pW_8S^8bB57$v?5Guck3=jmQZHc%fD}AbCPAh3sRpswB=UHbHx_d~lMmo5 zJ0*E@58hAK^+pnWqu5KeF zH-R~kkx=n(Fc7h)xhRpp_Mg1ykl2B08nM4(B5??`IU{A-b!J^Qh6wR2735%CT_WJL z7Q4Yn=^?lKWi}PCdPJPTLcHA2{#Hv1BT$#;y8!j{c9M(tUC8JrLaL2dIB+NnkhT)b{wSy_Z|SR15nuc-m% zoD$VxPZoKYix!66SGXi~)%4$o#dHfn+f3ZBw|5LuL?4ak%r zDc}gyS!@<4En`fZgA`hQF|9&bP~O8U<{2v<4=Sklzeucs0)-eVZhYMMO=hf_!9LA1 z{!kMPs-a{6jSfSprOo#(IL3Aoomltu)+|oxDL)kw2?b z0pehyzQcn@p@h5j_=>=VuW+a^pWNX1Hw3_61pue8_m-yOp==LVJtg+RkSJlD+r)Z+ zfob=Gp3&8i0_+2mNp**$1_1?%9XxUGav%s;C7eL?G%-%4v}AXV*xRg(Nj6r1EtgF9 zPS21%rcCb{OavKxjJ4}Od$j$2@UE}mTb1%1{7pKs3Y6n<)8c-IsuER(n8^GJhpgl1 zVjy=?_O2ieR0Xd>E4XpJSV16(N*HLmQpK+QCBHPMpksaa>mFse*f}qWTC}X`!>?Ct zx5bl?cAMtosES_2y*XT=0iR3;4y|R|?EoM|FshJs#^aBu>lC|JP>e3rY-0wkxO&3v zW_=VlHSL)*wGOj62MSY~%<33zyrWlDgBUSblp>-qUj-S@I>rL!!1ZA0r1}q1XbV|l z=hvVCmOHi;u^LHfK!z-96cx*BY@u6M)#BlM!me01_JwRIg6+K!Rva6O779!nIBv(x zurL9VnrS+t@UKa6qa=B3QTw-T#!30 zSD1o{uvj6Qq1_kEX`Cp*5KDWH5|3Squ#4zh)W=A8$7{VvwU+H+Rh!~xMT6BI0HDUT z&Oe1l!lgKK6RVB|s0hFgkBLR@#HPkw4JvuPU9qDmltvbtq!k*3jNAaOhIw-gkeiLk zYX`F$fPo-U+m|dNP;W)8&8wi@LMQ`Do)A8oj?qV)8ivDxb=83s8KIL%8(gV3%mSu9 zsY1CqmK1JN*@CD8R@7RQWYxJ#NpxA=A}` z;US_&SAlRhNdOHhVPW?Y;30xXsk%>crx6nVu*!9f;*_!Xl*9pQsG}tq=OblH>kT|W zavu=c7@U`>UVJXGq3U+j9{j5`ow~b1Gb()>{{R+sn1@sgBw+e+e^7vOLft01@W5($|?0>P|RtYMRm>mM5ri~az7OcQC3&0@hqmz>NtwUZ=uaI zngLFkmc9p zUTGBQZePesAoUf46-SkDHO@?YMk;6>YY>yDct~1oU^xXfIgo^~p%AY!$T}8--dkgX zOa~%*gbs^h@Y=b8rQ>w1O>{`GmSX*75nlz)g1hHFvYlkMhlYFCytuabE>R2g4{4e! zObb~+VMbk&jrtO{iZ#8rY|D}tE(K(Km+dJUslbhj*7Y7WaHfUFLl}fw+?JLKSLPlD z@Azr5ypWCv*yc-2g8^l4+BeK;XbW{?x}eK&77EN7?H@>fTv#f_iIa}KV_?7mO!vTL zga{A^JJw(gm6eJw-XT`tnIV)V#l1pG>WU3K!p0!h0LiY=jSf{^>LQ`3!qqh$Z4kLalRjF{NZ|5AidT0<(o$bah$zm^ zjbDX{-3s6$v%9mL3crNKaHKN{SM)ob+RSC094cxhth+fcyx!AwX3M zzIoy`20?Vvux{qMv&0w%^@ zH>va#AnV=&`8iKogrF*-r^#rpvecN_=t0X;qk(R|&$Rm4d~8)z4Xg*5fdQcs2PIBj z7&v58++tL+bwY=`D1gO{zL~u*ydJ_yByQ~10KaOM8EPD^m*U@ef?F-pp!HS7YQP7Z zDe(#4Rmgw=wP7VF+9k+a206yz{b7y(myC*f&z_g=`lTV51ℜQqv@?GD6TXXE0L% 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 literal 0 HcmV?d00001 diff --git a/website/static/img/product-1.jpg b/website/static/img/product-1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..10372d739aa95ca133f8e1c0c3d342918abc38ec GIT binary patch literal 34157 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�jWqWIOt?O4N1D1nIFI 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 literal 0 HcmV?d00001 diff --git a/website/static/img/product-3.jpg b/website/static/img/product-3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b8a6e372077add387e5d5be409ba3d523f7126d7 GIT binary patch literal 24458 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 literal 0 HcmV?d00001 diff --git a/website/static/img/product-5.jpg b/website/static/img/product-5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6894829661b24f1d77b4b692d6dd1de218299e01 GIT binary patch literal 24574 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 literal 0 HcmV?d00001