diff --git a/apps/www/package.json b/apps/www/package.json index 06030894..cf37fbbf 100644 --- a/apps/www/package.json +++ b/apps/www/package.json @@ -21,11 +21,12 @@ }, "dependencies": { "@morev/vue-transitions": "^2.3.6", + "@vitejs/plugin-vue-jsx": "^3.0.2", "@vueuse/core": "^10.2.1", "class-variance-authority": "^0.6.1", "clsx": "^2.0.0", "lucide-vue-next": "^0.268.0", - "radix-vue": "file:../../../radix-vue/packages/radix-vue", + "radix-vue": "latest", "tailwindcss-animate": "^1.0.6", "vue": "^3.3.4" }, diff --git a/apps/www/src/App.vue b/apps/www/src/App.vue index 4f97a104..7b0960d1 100644 --- a/apps/www/src/App.vue +++ b/apps/www/src/App.vue @@ -3,6 +3,7 @@ import AccordionDemo from '@/registry/default/examples/AccordionDemo.vue' import PopoverDemo from '@/registry/default/examples/PopoverDemo.vue' import DialogDemo from '@/registry/default/examples/DialogDemo.vue' import AlertDialogDemo from '@/registry/default/examples/AlertDialogDemo.vue' +import SelectDemo from '@/registry/default/examples/SelectDemo.vue' diff --git a/apps/www/src/lib/registry/default/examples/SelectDemo.vue b/apps/www/src/lib/registry/default/examples/SelectDemo.vue new file mode 100644 index 00000000..99b6a33e --- /dev/null +++ b/apps/www/src/lib/registry/default/examples/SelectDemo.vue @@ -0,0 +1,39 @@ + + + diff --git a/apps/www/src/lib/registry/default/ui/select.tsx b/apps/www/src/lib/registry/default/ui/select.tsx new file mode 100644 index 00000000..7f4534ce --- /dev/null +++ b/apps/www/src/lib/registry/default/ui/select.tsx @@ -0,0 +1,112 @@ +import { defineComponent } from 'vue' +import { + type SelectContentEmits, SelectContent as SelectContentPrimitive, type SelectContentProps, + SelectGroup as SelectGroupPrimitive, + SelectIcon, SelectItemIndicator, + SelectItem as SelectItemPrimitive, type SelectItemProps, + SelectItemText, + SelectLabel as SelectLabelPrimitive, type SelectLabelProps, + SelectPortal, SelectRoot, + SelectSeparator as SelectSeparatorPrimitive, type SelectSeparatorProps, + SelectTrigger as SelectTriggerPrimitive, type SelectTriggerProps, + SelectValue as SelectValuePrimitive, SelectViewport, +} from 'radix-vue' +import { Check, ChevronDown } from 'lucide-vue-next' +import type { ParseEmits } from '@/utils' +import { cn, convertToComponent, useEmitAsProps } from '@/utils' + +export const Select = SelectRoot +export const SelectGroup = SelectGroupPrimitive +export const SelectValue = SelectValuePrimitive + +// Convert Functional component to valid VNode to be use in JSX +const IChevrondown = convertToComponent(ChevronDown) +const ICheck = convertToComponent(Check) + +export const SelectTrigger = defineComponent( + (props, { attrs, slots }) => { + return () => ( + + { slots.default?.() } + + + + + + ) + }, { + name: 'SelectTrigger', + }, +) + +export const SelectContent = defineComponent>( + (props, { emit, attrs, slots }) => { + const position = props.position ?? 'popper' + const emitsAsProps = useEmitAsProps(emit) + return () => ( + + + + { slots.default?.()} + + + + ) + }, { name: 'SelectContent', emits: SelectContentPrimitive.emits }, +) + +export const SelectLabel = defineComponent( + (props, { attrs, slots }) => { + return () => ( + + { slots.default?.() } + + ) + }, { name: 'SelectLabel' }, +) + +export const SelectItem = defineComponent( + (props, { attrs, slots }) => { + return () => ( + + + + + + + + + { slots.default?.() } + + + ) + }, { name: 'SelectItem' }, +) + +export const SelectSeparator = defineComponent( + (props, { attrs, slots }) => { + return () => ( + + { slots.default?.() } + + ) + }, { name: 'SelectSeparator' }, +) diff --git a/apps/www/src/lib/utils.ts b/apps/www/src/lib/utils.ts index e1d860eb..b9c1660e 100644 --- a/apps/www/src/lib/utils.ts +++ b/apps/www/src/lib/utils.ts @@ -1,7 +1,8 @@ import type { ClassValue } from 'clsx' import { clsx } from 'clsx' import { twMerge } from 'tailwind-merge' -import { camelize, getCurrentInstance, toHandlerKey } from 'vue' +import type { FunctionalComponent } from 'vue' +import { camelize, defineComponent, getCurrentInstance, h, toHandlerKey } from 'vue' export type ParseEmits> = { [K in keyof T]: (...args: T[K]) => void; @@ -31,3 +32,9 @@ export function useEmitAsProps( }) return result } + +export function convertToComponent(component: FunctionalComponent) { + return defineComponent({ + setup() { return () => h(component) }, + }) +} diff --git a/apps/www/vite.config.ts b/apps/www/vite.config.ts index ce34753d..2cf539f4 100644 --- a/apps/www/vite.config.ts +++ b/apps/www/vite.config.ts @@ -1,6 +1,7 @@ import path from 'node:path' import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' +import vueJsx from '@vitejs/plugin-vue-jsx' // https://vitejs.dev/config/ export default defineConfig({ @@ -19,7 +20,7 @@ export default defineConfig({ }, }, }, - plugins: [vue()], + plugins: [vue(), vueJsx()], resolve: { alias: { '@': path.resolve(__dirname, './src/lib'), diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ee7b23b4..326488f1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -35,6 +35,9 @@ importers: '@morev/vue-transitions': specifier: ^2.3.6 version: 2.3.6(vue@3.3.4) + '@vitejs/plugin-vue-jsx': + specifier: ^3.0.2 + version: 3.0.2(vite@4.3.9)(vue@3.3.4) '@vueuse/core': specifier: ^10.2.1 version: 10.2.1(vue@3.3.4) @@ -101,7 +104,7 @@ packages: engines: {node: '>=6.0.0'} dependencies: '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.9 + '@jridgewell/trace-mapping': 0.3.19 dev: false /@antfu/eslint-config-basic@0.39.7(@typescript-eslint/eslint-plugin@5.62.0)(@typescript-eslint/parser@5.62.0)(eslint@8.43.0)(typescript@5.0.2): @@ -253,6 +256,13 @@ packages: jsesc: 2.5.2 dev: false + /@babel/helper-annotate-as-pure@7.22.5: + resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.10 + dev: false + /@babel/helper-compilation-targets@7.22.10: resolution: {integrity: sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==} engines: {node: '>=6.9.0'} @@ -264,6 +274,24 @@ packages: semver: 6.3.1 dev: false + /@babel/helper-create-class-features-plugin@7.22.10(@babel/core@7.22.10): + resolution: {integrity: sha512-5IBb77txKYQPpOEdUdIhBx8VrZyDCQ+H82H0+5dX1TmuscP5vJKEE3cKurjtIw/vFwzbVH48VweE78kVDBrqjA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-member-expression-to-functions': 7.22.5 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.10) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + semver: 6.3.1 + dev: false + /@babel/helper-environment-visitor@7.22.5: resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} engines: {node: '>=6.9.0'} @@ -284,6 +312,13 @@ packages: '@babel/types': 7.22.10 dev: false + /@babel/helper-member-expression-to-functions@7.22.5: + resolution: {integrity: sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.10 + dev: false + /@babel/helper-module-imports@7.22.5: resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} engines: {node: '>=6.9.0'} @@ -305,6 +340,30 @@ packages: '@babel/helper-validator-identifier': 7.22.5 dev: false + /@babel/helper-optimise-call-expression@7.22.5: + resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.10 + dev: false + + /@babel/helper-plugin-utils@7.22.5: + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helper-replace-supers@7.22.9(@babel/core@7.22.10): + resolution: {integrity: sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-member-expression-to-functions': 7.22.5 + '@babel/helper-optimise-call-expression': 7.22.5 + dev: false + /@babel/helper-simple-access@7.22.5: resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} @@ -312,6 +371,13 @@ packages: '@babel/types': 7.22.10 dev: false + /@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.22.10 + dev: false + /@babel/helper-split-export-declaration@7.22.6: resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} @@ -368,6 +434,39 @@ packages: dependencies: '@babel/types': 7.22.10 + /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.22.10): + resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.22.10): + resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-typescript@7.22.10(@babel/core@7.22.10): + resolution: {integrity: sha512-7++c8I/ymsDo4QQBAgbraXLzIM6jmfao11KgIBEYZRReWzNWH9NtNgJcyrZiXsOPh523FQm6LfpLyy/U5fn46A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.22.10(@babel/core@7.22.10) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.22.10) + dev: false + /@babel/standalone@7.22.10: resolution: {integrity: sha512-VmK2sWxUTfDDh9mPfCtFJPIehZToteqK+Zpwq8oJUjJ+WeeKIFTTQIrDzH7jEdom+cAaaguU7FI/FBsBWFkIeQ==} engines: {node: '>=6.9.0'} @@ -588,7 +687,6 @@ packages: cpu: [arm64] os: [android] requiresBuild: true - dev: true optional: true /@esbuild/android-arm@0.17.19: @@ -597,7 +695,6 @@ packages: cpu: [arm] os: [android] requiresBuild: true - dev: true optional: true /@esbuild/android-x64@0.17.19: @@ -606,7 +703,6 @@ packages: cpu: [x64] os: [android] requiresBuild: true - dev: true optional: true /@esbuild/darwin-arm64@0.17.19: @@ -615,7 +711,6 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true - dev: true optional: true /@esbuild/darwin-x64@0.17.19: @@ -624,7 +719,6 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true - dev: true optional: true /@esbuild/freebsd-arm64@0.17.19: @@ -633,7 +727,6 @@ packages: cpu: [arm64] os: [freebsd] requiresBuild: true - dev: true optional: true /@esbuild/freebsd-x64@0.17.19: @@ -642,7 +735,6 @@ packages: cpu: [x64] os: [freebsd] requiresBuild: true - dev: true optional: true /@esbuild/linux-arm64@0.17.19: @@ -651,7 +743,6 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-arm@0.17.19: @@ -660,7 +751,6 @@ packages: cpu: [arm] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-ia32@0.17.19: @@ -669,7 +759,6 @@ packages: cpu: [ia32] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-loong64@0.17.19: @@ -678,7 +767,6 @@ packages: cpu: [loong64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-mips64el@0.17.19: @@ -687,7 +775,6 @@ packages: cpu: [mips64el] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-ppc64@0.17.19: @@ -696,7 +783,6 @@ packages: cpu: [ppc64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-riscv64@0.17.19: @@ -705,7 +791,6 @@ packages: cpu: [riscv64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-s390x@0.17.19: @@ -714,7 +799,6 @@ packages: cpu: [s390x] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-x64@0.17.19: @@ -723,7 +807,6 @@ packages: cpu: [x64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/netbsd-x64@0.17.19: @@ -732,7 +815,6 @@ packages: cpu: [x64] os: [netbsd] requiresBuild: true - dev: true optional: true /@esbuild/openbsd-x64@0.17.19: @@ -741,7 +823,6 @@ packages: cpu: [x64] os: [openbsd] requiresBuild: true - dev: true optional: true /@esbuild/sunos-x64@0.17.19: @@ -750,7 +831,6 @@ packages: cpu: [x64] os: [sunos] requiresBuild: true - dev: true optional: true /@esbuild/win32-arm64@0.17.19: @@ -759,7 +839,6 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true - dev: true optional: true /@esbuild/win32-ia32@0.17.19: @@ -768,7 +847,6 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true - dev: true optional: true /@esbuild/win32-x64@0.17.19: @@ -777,7 +855,6 @@ packages: cpu: [x64] os: [win32] requiresBuild: true - dev: true optional: true /@eslint-community/eslint-utils@4.4.0(eslint@8.43.0): @@ -1188,6 +1265,22 @@ packages: eslint-visitor-keys: 3.4.3 dev: true + /@vitejs/plugin-vue-jsx@3.0.2(vite@4.3.9)(vue@3.3.4): + resolution: {integrity: sha512-obF26P2Z4Ogy3cPp07B4VaW6rpiu0ue4OT2Y15UxT5BZZ76haUY9guOsZV3uWh/I6xc+VeiW+ZVabRE82FyzWw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.0.0 + vue: ^3.0.0 + dependencies: + '@babel/core': 7.22.10 + '@babel/plugin-transform-typescript': 7.22.10(@babel/core@7.22.10) + '@vue/babel-plugin-jsx': 1.1.5(@babel/core@7.22.10) + vite: 4.3.9(@types/node@20.4.7) + vue: 3.3.4 + transitivePeerDependencies: + - supports-color + dev: false + /@vitejs/plugin-vue@4.1.0(vite@4.3.9)(vue@3.3.4): resolution: {integrity: sha512-++9JOAFdcXI3lyer9UKUV4rfoQ3T1RN8yDqoCLar86s0xQct5yblxAE+yWgRnU5/0FOlVCpTZpYSBV/bGWrSrQ==} engines: {node: ^14.18.0 || >=16.0.0} @@ -1243,6 +1336,29 @@ packages: - typescript dev: true + /@vue/babel-helper-vue-transform-on@1.1.5: + resolution: {integrity: sha512-SgUymFpMoAyWeYWLAY+MkCK3QEROsiUnfaw5zxOVD/M64KQs8D/4oK6Q5omVA2hnvEOE0SCkH2TZxs/jnnUj7w==} + dev: false + + /@vue/babel-plugin-jsx@1.1.5(@babel/core@7.22.10): + resolution: {integrity: sha512-nKs1/Bg9U1n3qSWnsHhCVQtAzI6aQXqua8j/bZrau8ywT1ilXQbK4FwEJGmU8fV7tcpuFvWmmN7TMmV1OBma1g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-module-imports': 7.22.5 + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.10) + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.10 + '@babel/types': 7.22.10 + '@vue/babel-helper-vue-transform-on': 1.1.5 + camelcase: 6.3.0 + html-tags: 3.3.1 + svg-tags: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: false + /@vue/compiler-core@3.3.4: resolution: {integrity: sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==} dependencies: @@ -1637,6 +1753,11 @@ packages: engines: {node: '>=6'} dev: true + /camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + dev: false + /caniuse-lite@1.0.30001522: resolution: {integrity: sha512-TKiyTVZxJGhsTszLuzb+6vUZSjVOAhClszBr2Ta2k9IwtNBT/4dzmL6aywt0HCgEZlmwJzXJd8yNiob6HgwTRg==} @@ -2140,7 +2261,6 @@ packages: '@esbuild/win32-arm64': 0.17.19 '@esbuild/win32-ia32': 0.17.19 '@esbuild/win32-x64': 0.17.19 - dev: true /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} @@ -2936,6 +3056,11 @@ packages: lru-cache: 6.0.0 dev: true + /html-tags@3.3.1: + resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} + engines: {node: '>=8'} + dev: false + /htmlparser2@8.0.2: resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} dependencies: @@ -4158,7 +4283,6 @@ packages: hasBin: true optionalDependencies: fsevents: 2.3.3 - dev: true /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -4429,6 +4553,10 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + /svg-tags@1.0.0: + resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} + dev: false + /tailwind-merge@1.14.0: resolution: {integrity: sha512-3mFKyCo/MBcgyOTlrY8T7odzZFx+w+qKSMAmdFzRvqBfLlSigU6TZnlFHK0lkMwj9Bj8OYU+9yW9lmGuS0QEnQ==} dev: true @@ -4796,7 +4924,6 @@ packages: rollup: 3.28.1 optionalDependencies: fsevents: 2.3.3 - dev: true /vue-demi@0.14.5(vue@3.3.4): resolution: {integrity: sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==}