From 04bb8696fe3125f0d2dd0d61e73465d988bec7d8 Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Mon, 22 Jan 2024 12:15:10 -0500 Subject: [PATCH 01/67] scaffold modal --- .../ui/modals/BadgeEdit/index.stories.tsx | 24 +++++++++++++++++++ packages/ui/modals/BadgeEdit/index.tsx | 13 ++++++++++ 2 files changed, 37 insertions(+) create mode 100644 packages/ui/modals/BadgeEdit/index.stories.tsx create mode 100644 packages/ui/modals/BadgeEdit/index.tsx diff --git a/packages/ui/modals/BadgeEdit/index.stories.tsx b/packages/ui/modals/BadgeEdit/index.stories.tsx new file mode 100644 index 0000000000..dcc3d47b08 --- /dev/null +++ b/packages/ui/modals/BadgeEdit/index.stories.tsx @@ -0,0 +1,24 @@ +import { type Meta } from '@storybook/react' + +import { Button } from '~ui/components/core' + +import { BadgeEditModal } from '.' + +export default { + title: 'Data Portal/Modals/Badge Edit', + component: BadgeEditModal, + parameters: { + layout: 'fullscreen', + layoutWrapper: 'centeredHalf', + msw: [], + rqDevtools: true, + whyDidYouRender: { collapseGroups: true }, + }, + args: { + component: Button, + children: 'Open Modal', + orgId: 'orgn_123456', + }, +} satisfies Meta + +export const Modal = {} diff --git a/packages/ui/modals/BadgeEdit/index.tsx b/packages/ui/modals/BadgeEdit/index.tsx new file mode 100644 index 0000000000..b79ed94013 --- /dev/null +++ b/packages/ui/modals/BadgeEdit/index.tsx @@ -0,0 +1,13 @@ +import { createPolymorphicComponent } from '@mantine/core' +import { forwardRef } from 'react' + +const _BadgeEditModal = forwardRef(({ orgId }, ref) => { + return <> +}) +_BadgeEditModal.displayName = 'BadgeEditModal' + +export const BadgeEditModal = createPolymorphicComponent<'button', Props>(_BadgeEditModal) + +interface Props { + orgId: string +} From 480cae14ae119e8268cccf22c6a47bdbf8844718 Mon Sep 17 00:00:00 2001 From: "InReach [bot]" <108850934+InReach-svc@users.noreply.github.com> Date: Mon, 22 Jan 2024 17:17:53 +0000 Subject: [PATCH 02/67] chore: lint & format Signed-off-by: InReach [bot] <108850934+InReach-svc@users.noreply.github.com> --- packages/ui/modals/index.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/ui/modals/index.ts b/packages/ui/modals/index.ts index ed6838b455..59d7a91adf 100644 --- a/packages/ui/modals/index.ts +++ b/packages/ui/modals/index.ts @@ -1,7 +1,8 @@ // codegen:start {preset: barrel, include: './{*,*/index}.ts*', exclude: "*.stories.tsx"} export * from './AccountVerified' +export * from './BadgeEdit/index' export * from './ClaimOrg' -export * from './CoverageArea' +export * from './CoverageArea/index' export * from './CreateNewList' export * from './DeleteModal' export * from './Example' From 1b78c590abc6624cd8dbd38c7e4ac65305973ce2 Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Mon, 22 Jan 2024 15:24:59 -0500 Subject: [PATCH 03/67] api routes / mock data --- packages/api/router/fieldOpt/index.ts | 18 ++++++++++++++ .../fieldOpt/query.getLeaderBadges.handler.ts | 24 +++++++++++++++++++ .../query.getServFocusBadges.handler.ts | 24 +++++++++++++++++++ packages/ui/mockData/fieldOpt.ts | 18 ++++++++++++-- .../json/fieldOpt.getLeaderBadges.json | 1 + .../json/fieldOpt.getServFocusBadges.json | 1 + 6 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 packages/api/router/fieldOpt/query.getLeaderBadges.handler.ts create mode 100644 packages/api/router/fieldOpt/query.getServFocusBadges.handler.ts create mode 100644 packages/ui/mockData/json/fieldOpt.getLeaderBadges.json create mode 100644 packages/ui/mockData/json/fieldOpt.getServFocusBadges.json diff --git a/packages/api/router/fieldOpt/index.ts b/packages/api/router/fieldOpt/index.ts index 11102c5a4c..e1a56fea07 100644 --- a/packages/api/router/fieldOpt/index.ts +++ b/packages/api/router/fieldOpt/index.ts @@ -16,6 +16,8 @@ type FieldOptHandlerCache = { countryGovDistMap: typeof import('./query.countryGovDistMap.handler').countryGovDistMap getSubDistricts: typeof import('./query.getSubDistricts.handler').getSubDistricts govDists: typeof import('./query.govDists.handler').govDists + getLeaderBadges: typeof import('./query.getLeaderBadges.handler').getLeaderBadges + getServFocusBadges: typeof import('./query.getServFocusBadges.handler').getServFocusBadges } export const fieldOptRouter = defineRouter({ /** All government districts by country (active for org listings). Gives up to 2 levels of sub-districts */ @@ -112,4 +114,20 @@ export const fieldOptRouter = defineRouter({ if (!HandlerCache.govDists) throw new Error('Failed to load handler') return HandlerCache.govDists({ ctx, input }) }), + getLeaderBadges: publicProcedure.query(async ({ ctx }) => { + if (!HandlerCache.getLeaderBadges) + HandlerCache.getLeaderBadges = await import('./query.getLeaderBadges.handler').then( + (mod) => mod.getLeaderBadges + ) + if (!HandlerCache.getLeaderBadges) throw new Error('Failed to load handler') + return HandlerCache.getLeaderBadges({ ctx }) + }), + getServFocusBadges: publicProcedure.query(async ({ ctx }) => { + if (!HandlerCache.getServFocusBadges) + HandlerCache.getServFocusBadges = await import('./query.getServFocusBadges.handler').then( + (mod) => mod.getServFocusBadges + ) + if (!HandlerCache.getServFocusBadges) throw new Error('Failed to load handler') + return HandlerCache.getServFocusBadges({ ctx }) + }), }) diff --git a/packages/api/router/fieldOpt/query.getLeaderBadges.handler.ts b/packages/api/router/fieldOpt/query.getLeaderBadges.handler.ts new file mode 100644 index 0000000000..85e7899e16 --- /dev/null +++ b/packages/api/router/fieldOpt/query.getLeaderBadges.handler.ts @@ -0,0 +1,24 @@ +import { prisma } from '@weareinreach/db' +import { handleError } from '~api/lib/errorHandler' +import { type TRPCHandlerParams } from '~api/types/handler' + +export const getLeaderBadges = async ({ ctx }: TRPCHandlerParams) => { + try { + const badges = await prisma.attribute.findMany({ + where: { + active: true, + categories: { some: { category: { tag: 'organization-leadership' } } }, + }, + select: { + id: true, + icon: true, + iconBg: true, + tsKey: true, + tsNs: true, + }, + }) + return badges + } catch (error) { + handleError(error) + } +} diff --git a/packages/api/router/fieldOpt/query.getServFocusBadges.handler.ts b/packages/api/router/fieldOpt/query.getServFocusBadges.handler.ts new file mode 100644 index 0000000000..9e4b5d87a8 --- /dev/null +++ b/packages/api/router/fieldOpt/query.getServFocusBadges.handler.ts @@ -0,0 +1,24 @@ +import { prisma } from '@weareinreach/db' +import { handleError } from '~api/lib/errorHandler' +import { type TRPCHandlerParams } from '~api/types/handler' + +export const getServFocusBadges = async ({ ctx }: TRPCHandlerParams) => { + try { + const badges = await prisma.attribute.findMany({ + where: { + active: true, + categories: { some: { category: { tag: 'service-focus' } } }, + }, + select: { + id: true, + icon: true, + iconBg: true, + tsKey: true, + tsNs: true, + }, + }) + return badges + } catch (error) { + handleError(error) + } +} diff --git a/packages/ui/mockData/fieldOpt.ts b/packages/ui/mockData/fieldOpt.ts index ddc7134d63..71b4f4edd4 100644 --- a/packages/ui/mockData/fieldOpt.ts +++ b/packages/ui/mockData/fieldOpt.ts @@ -1,7 +1,7 @@ import { z } from 'zod' import { type ApiOutput } from '@weareinreach/api' -import { getTRPCMock, type MockAPIHandler } from '~ui/lib/getTrpcMock' +import { getTRPCMock, type MockAPIHandler, type MockHandlerObject } from '~ui/lib/getTrpcMock' const queryAttributeCategories: MockAPIHandler<'fieldOpt', 'attributeCategories'> = async (query) => { const attributeCategories = (await import('./json/fieldOpt.attributeCategories.json')).default @@ -199,7 +199,21 @@ export const fieldOpt = { return formatted }, }), -} + getLeaderBadges: getTRPCMock({ + path: ['fieldOpt', 'getLeaderBadges'], + response: async () => { + const { default: data } = await import('./json/fieldOpt.getLeaderBadges.json') + return data + }, + }), + getServFocusBadges: getTRPCMock({ + path: ['fieldOpt', 'getServFocusBadges'], + response: async () => { + const { default: data } = await import('./json/fieldOpt.getServFocusBadges.json') + return data + }, + }), +} satisfies MockHandlerObject<'fieldOpt'> export const allFieldOptHandlers = Object.values(fieldOpt) diff --git a/packages/ui/mockData/json/fieldOpt.getLeaderBadges.json b/packages/ui/mockData/json/fieldOpt.getLeaderBadges.json new file mode 100644 index 0000000000..328473ae19 --- /dev/null +++ b/packages/ui/mockData/json/fieldOpt.getLeaderBadges.json @@ -0,0 +1 @@ +[{"id":"attr_01GW2HHFVNPKMHYK12DDRVC1VJ","icon":"🤎","iconBg":"#F1DD7F","tsKey":"orgleader.bipoc-led","tsNs":"attribute"},{"id":"attr_01GW2HHFVNHMF72WHVKRF6W4TA","icon":"️‍️‍🌎","iconBg":"#79ADD7","tsKey":"orgleader.immigrant-led","tsNs":"attribute"},{"id":"attr_01GW2HHFVN3JX2J7REFFT5NAMS","icon":"️‍️‍✊🏿","iconBg":"#C77E54","tsKey":"orgleader.black-led","tsNs":"attribute"},{"id":"attr_01GW2HHFVN3RYX9JMXDZSQZM70","icon":"️‍🏳️‍⚧️","iconBg":"#705890","tsKey":"orgleader.trans-led","tsNs":"attribute"}] diff --git a/packages/ui/mockData/json/fieldOpt.getServFocusBadges.json b/packages/ui/mockData/json/fieldOpt.getServFocusBadges.json new file mode 100644 index 0000000000..50f34ceb7f --- /dev/null +++ b/packages/ui/mockData/json/fieldOpt.getServFocusBadges.json @@ -0,0 +1 @@ +[{"id":"attr_01GW2HHFVRMQFJ9AMA633SQQGV","icon":"💛","iconBg":null,"tsKey":"srvfocus.hiv-comm","tsNs":"attribute"},{"id":"attr_01GW2HHFVQVEGH6W3A2ANH1QZE","icon":"🌱","iconBg":null,"tsKey":"srvfocus.trans-youth-focus","tsNs":"attribute"},{"id":"attr_01GW2HHFVQ7SYGD3KM8WP9X50B","icon":"🏳️‍⚧️","iconBg":null,"tsKey":"srvfocus.gender-nc","tsNs":"attribute"},{"id":"attr_01GW2HHFVN72D7XEBZZJXCJQXQ","icon":"️‍️‍✊🏿","iconBg":null,"tsKey":"srvfocus.bipoc-comm","tsNs":"attribute"},{"id":"attr_01GW2HHFVPTK9555WHJHDBDA2J","icon":"️‍️‍🌎","iconBg":null,"tsKey":"srvfocus.immigrant-comm","tsNs":"attribute"},{"id":"attr_01GW2HHFVPJERY0GS9D7F56A23","icon":"️‍️‍🌎","iconBg":null,"tsKey":"srvfocus.resettled-refugees","tsNs":"attribute"},{"id":"attr_01GW2HHFVPCVX8F3B7M30ZJEHW","icon":"️‍️‍🌎","iconBg":null,"tsKey":"srvfocus.asylum-seekers","tsNs":"attribute"},{"id":"attr_01GW2HHFVQEFWW42MBAD64BWXZ","icon":"🏳️‍⚧️","iconBg":null,"tsKey":"srvfocus.trans-masc","tsNs":"attribute"},{"id":"attr_01GW2HHFVQ8AGBKBBZJWTHNP2F","icon":"🗣️","iconBg":null,"tsKey":"srvfocus.spanish-speakers","tsNs":"attribute"},{"id":"attr_01GW2HHFVQCZPA3Z5GW6J3MQHW","icon":"🌱","iconBg":null,"tsKey":"srvfocus.lgbtq-youth-focus","tsNs":"attribute"},{"id":"attr_01GW2HHFVQX4M8DY1FSAYSJSSK","icon":"🏳️‍⚧️","iconBg":null,"tsKey":"srvfocus.trans-fem","tsNs":"attribute"},{"id":"attr_01GW2HHFVPSYBCYF37B44WP6CZ","icon":"🏳️‍⚧️","iconBg":null,"tsKey":"srvfocus.trans-comm","tsNs":"attribute"}] From 7073bc456c9020332cdc25fa0f4c3ba18976a356 Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Mon, 22 Jan 2024 15:59:51 -0500 Subject: [PATCH 04/67] fix (re-)build time --- packages/ui/.storybook/main.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/ui/.storybook/main.ts b/packages/ui/.storybook/main.ts index e069661de1..2a8521938f 100644 --- a/packages/ui/.storybook/main.ts +++ b/packages/ui/.storybook/main.ts @@ -11,7 +11,6 @@ import path, { dirname, join } from 'path' dotenv.config({ path: path.resolve(__dirname, '../../../.env') }) -const filePattern = '*.stories.@(ts|tsx)' // eslint-disable-next-line @typescript-eslint/no-unused-vars const isDev = process.env.NODE_ENV === 'development' @@ -23,7 +22,15 @@ const getAbsolutePath = (value: string) => { const publicStatic = path.resolve(__dirname, '../../../apps/app/public') const config: StorybookConfig = { - stories: [`../(components|hooks|icon|layouts|modals|other)/**/${filePattern}`, '../other/**/*.mdx'], + stories: [ + '../components/**/*.stories.{ts,tsx}', + '../hooks/**/*.stories.{ts,tsx}', + '../icon/**/*.stories.{ts,tsx}', + '../layouts/**/*.stories.{ts,tsx}', + '../modals/**/*.stories.{ts,tsx}', + '../other/**/*.stories.{ts,tsx}', + '../other/**/*.mdx', + ], staticDirs: [ { from: '../../../apps/app/public', From e59c5c2856af283ff4c875e183eabe34328b703e Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Mon, 22 Jan 2024 16:53:24 -0500 Subject: [PATCH 05/67] redo api routes --- packages/api/router/fieldOpt/index.ts | 23 +++++------------ .../fieldOpt/query.getLeaderBadges.handler.ts | 24 ------------------ ....handler.ts => query.orgBadges.handler.ts} | 6 +++-- .../router/fieldOpt/query.orgBadges.schema.ts | 4 +++ packages/api/router/fieldOpt/schemas.ts | 1 + packages/api/router/organization/index.ts | 10 ++++++++ .../query.forBadgeEditModal.handler.ts | 22 ++++++++++++++++ .../query.forBadgeEditModal.schema.ts | 9 +++++++ packages/api/router/organization/schemas.ts | 1 + packages/ui/mockData/fieldOpt.ts | 25 ++++++++++--------- ...pt.orgBadges.organization-leadership.json} | 0 ... => fieldOpt.orgBadges.service-focus.json} | 0 packages/ui/mockData/organization.ts | 16 ++++++++++++ 13 files changed, 86 insertions(+), 55 deletions(-) delete mode 100644 packages/api/router/fieldOpt/query.getLeaderBadges.handler.ts rename packages/api/router/fieldOpt/{query.getServFocusBadges.handler.ts => query.orgBadges.handler.ts} (65%) create mode 100644 packages/api/router/fieldOpt/query.orgBadges.schema.ts create mode 100644 packages/api/router/organization/query.forBadgeEditModal.handler.ts create mode 100644 packages/api/router/organization/query.forBadgeEditModal.schema.ts rename packages/ui/mockData/json/{fieldOpt.getLeaderBadges.json => fieldOpt.orgBadges.organization-leadership.json} (100%) rename packages/ui/mockData/json/{fieldOpt.getServFocusBadges.json => fieldOpt.orgBadges.service-focus.json} (100%) diff --git a/packages/api/router/fieldOpt/index.ts b/packages/api/router/fieldOpt/index.ts index e1a56fea07..880b3cbdf9 100644 --- a/packages/api/router/fieldOpt/index.ts +++ b/packages/api/router/fieldOpt/index.ts @@ -16,8 +16,7 @@ type FieldOptHandlerCache = { countryGovDistMap: typeof import('./query.countryGovDistMap.handler').countryGovDistMap getSubDistricts: typeof import('./query.getSubDistricts.handler').getSubDistricts govDists: typeof import('./query.govDists.handler').govDists - getLeaderBadges: typeof import('./query.getLeaderBadges.handler').getLeaderBadges - getServFocusBadges: typeof import('./query.getServFocusBadges.handler').getServFocusBadges + orgBadges: typeof import('./query.orgBadges.handler').orgBadges } export const fieldOptRouter = defineRouter({ /** All government districts by country (active for org listings). Gives up to 2 levels of sub-districts */ @@ -114,20 +113,10 @@ export const fieldOptRouter = defineRouter({ if (!HandlerCache.govDists) throw new Error('Failed to load handler') return HandlerCache.govDists({ ctx, input }) }), - getLeaderBadges: publicProcedure.query(async ({ ctx }) => { - if (!HandlerCache.getLeaderBadges) - HandlerCache.getLeaderBadges = await import('./query.getLeaderBadges.handler').then( - (mod) => mod.getLeaderBadges - ) - if (!HandlerCache.getLeaderBadges) throw new Error('Failed to load handler') - return HandlerCache.getLeaderBadges({ ctx }) - }), - getServFocusBadges: publicProcedure.query(async ({ ctx }) => { - if (!HandlerCache.getServFocusBadges) - HandlerCache.getServFocusBadges = await import('./query.getServFocusBadges.handler').then( - (mod) => mod.getServFocusBadges - ) - if (!HandlerCache.getServFocusBadges) throw new Error('Failed to load handler') - return HandlerCache.getServFocusBadges({ ctx }) + orgBadges: publicProcedure.input(schema.ZOrgBadgesSchema).query(async ({ ctx, input }) => { + if (!HandlerCache.orgBadges) + HandlerCache.orgBadges = await import('./query.orgBadges.handler').then((mod) => mod.orgBadges) + if (!HandlerCache.orgBadges) throw new Error('Failed to load handler') + return HandlerCache.orgBadges({ ctx, input }) }), }) diff --git a/packages/api/router/fieldOpt/query.getLeaderBadges.handler.ts b/packages/api/router/fieldOpt/query.getLeaderBadges.handler.ts deleted file mode 100644 index 85e7899e16..0000000000 --- a/packages/api/router/fieldOpt/query.getLeaderBadges.handler.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { prisma } from '@weareinreach/db' -import { handleError } from '~api/lib/errorHandler' -import { type TRPCHandlerParams } from '~api/types/handler' - -export const getLeaderBadges = async ({ ctx }: TRPCHandlerParams) => { - try { - const badges = await prisma.attribute.findMany({ - where: { - active: true, - categories: { some: { category: { tag: 'organization-leadership' } } }, - }, - select: { - id: true, - icon: true, - iconBg: true, - tsKey: true, - tsNs: true, - }, - }) - return badges - } catch (error) { - handleError(error) - } -} diff --git a/packages/api/router/fieldOpt/query.getServFocusBadges.handler.ts b/packages/api/router/fieldOpt/query.orgBadges.handler.ts similarity index 65% rename from packages/api/router/fieldOpt/query.getServFocusBadges.handler.ts rename to packages/api/router/fieldOpt/query.orgBadges.handler.ts index 9e4b5d87a8..b7a74822cc 100644 --- a/packages/api/router/fieldOpt/query.getServFocusBadges.handler.ts +++ b/packages/api/router/fieldOpt/query.orgBadges.handler.ts @@ -2,12 +2,14 @@ import { prisma } from '@weareinreach/db' import { handleError } from '~api/lib/errorHandler' import { type TRPCHandlerParams } from '~api/types/handler' -export const getServFocusBadges = async ({ ctx }: TRPCHandlerParams) => { +import { type TOrgBadgesSchema } from './query.orgBadges.schema' + +export const orgBadges = async ({ ctx, input }: TRPCHandlerParams) => { try { const badges = await prisma.attribute.findMany({ where: { active: true, - categories: { some: { category: { tag: 'service-focus' } } }, + categories: { some: { category: { tag: input.badgeType } } }, }, select: { id: true, diff --git a/packages/api/router/fieldOpt/query.orgBadges.schema.ts b/packages/api/router/fieldOpt/query.orgBadges.schema.ts new file mode 100644 index 0000000000..40d9ead213 --- /dev/null +++ b/packages/api/router/fieldOpt/query.orgBadges.schema.ts @@ -0,0 +1,4 @@ +import { z } from 'zod' + +export const ZOrgBadgesSchema = z.object({ badgeType: z.enum(['organization-leadership', 'service-focus']) }) +export type TOrgBadgesSchema = z.infer diff --git a/packages/api/router/fieldOpt/schemas.ts b/packages/api/router/fieldOpt/schemas.ts index 6fd7794f6e..7b506a54dd 100644 --- a/packages/api/router/fieldOpt/schemas.ts +++ b/packages/api/router/fieldOpt/schemas.ts @@ -7,4 +7,5 @@ export * from './query.govDists.schema' export * from './query.govDistsByCountry.schema' export * from './query.govDistsByCountryNoSub.schema' export * from './query.languages.schema' +export * from './query.orgBadges.schema' // codegen:end diff --git a/packages/api/router/organization/index.ts b/packages/api/router/organization/index.ts index 69e0035adb..b08b137c8c 100644 --- a/packages/api/router/organization/index.ts +++ b/packages/api/router/organization/index.ts @@ -28,6 +28,7 @@ type OrganizationHandlerCache = { forOrgPageEdits: typeof import('./query.forOrgPageEdits.handler').forOrgPageEdits getAttributes: typeof import('./query.getAttributes.handler').getAttributes getAlerts: typeof import('./query.getAlerts.handler').getAlerts + forBadgeEditModal: typeof import('./query.forBadgeEditModal.handler').forBadgeEditModal // #endregion // @@ -203,6 +204,15 @@ export const orgRouter = defineRouter({ if (!HandlerCache.getAlerts) throw new Error('Failed to load handler') return HandlerCache.getAlerts({ ctx, input }) }), + forBadgeEditModal: publicProcedure.input(schema.ZForBadgeEditModalSchema).query(async ({ ctx, input }) => { + if (!HandlerCache.forBadgeEditModal) + HandlerCache.forBadgeEditModal = await import('./query.forBadgeEditModal.handler').then( + (mod) => mod.forBadgeEditModal + ) + + if (!HandlerCache.forBadgeEditModal) throw new Error('Failed to load handler') + return HandlerCache.forBadgeEditModal({ ctx, input }) + }), // #endregion // diff --git a/packages/api/router/organization/query.forBadgeEditModal.handler.ts b/packages/api/router/organization/query.forBadgeEditModal.handler.ts new file mode 100644 index 0000000000..86ce9399d3 --- /dev/null +++ b/packages/api/router/organization/query.forBadgeEditModal.handler.ts @@ -0,0 +1,22 @@ +import { prisma } from '@weareinreach/db' +import { handleError } from '~api/lib/errorHandler' +import { type TRPCHandlerParams } from '~api/types/handler' + +import { type TForBadgeEditModalSchema } from './query.forBadgeEditModal.schema' + +export const forBadgeEditModal = async ({ ctx, input }: TRPCHandlerParams) => { + try { + const data = await prisma.organizationAttribute.findMany({ + where: { + organizationId: input.id, + attribute: { categories: { some: { category: { tag: input.badgeType } } } }, + }, + select: { + attributeId: true, + }, + }) + return data.map(({ attributeId }) => attributeId) + } catch (error) { + handleError(error) + } +} diff --git a/packages/api/router/organization/query.forBadgeEditModal.schema.ts b/packages/api/router/organization/query.forBadgeEditModal.schema.ts new file mode 100644 index 0000000000..966af3da09 --- /dev/null +++ b/packages/api/router/organization/query.forBadgeEditModal.schema.ts @@ -0,0 +1,9 @@ +import { z } from 'zod' + +import { prefixedId } from '~api/schemas/idPrefix' + +export const ZForBadgeEditModalSchema = z.object({ + id: prefixedId('organization'), + badgeType: z.enum(['organization-leadership', 'service-focus']), +}) +export type TForBadgeEditModalSchema = z.infer diff --git a/packages/api/router/organization/schemas.ts b/packages/api/router/organization/schemas.ts index b4882ce871..1b4faf245e 100644 --- a/packages/api/router/organization/schemas.ts +++ b/packages/api/router/organization/schemas.ts @@ -4,6 +4,7 @@ export * from './mutation.createNewQuick.schema' export * from './mutation.createNewSuggestion.schema' export * from './mutation.updateBasic.schema' export * from './query.checkForExisting.schema' +export * from './query.forBadgeEditModal.schema' export * from './query.forLocationPage.schema' export * from './query.forOrganizationTable.schema' export * from './query.forOrgPage.schema' diff --git a/packages/ui/mockData/fieldOpt.ts b/packages/ui/mockData/fieldOpt.ts index 71b4f4edd4..ae4c279f48 100644 --- a/packages/ui/mockData/fieldOpt.ts +++ b/packages/ui/mockData/fieldOpt.ts @@ -199,18 +199,19 @@ export const fieldOpt = { return formatted }, }), - getLeaderBadges: getTRPCMock({ - path: ['fieldOpt', 'getLeaderBadges'], - response: async () => { - const { default: data } = await import('./json/fieldOpt.getLeaderBadges.json') - return data - }, - }), - getServFocusBadges: getTRPCMock({ - path: ['fieldOpt', 'getServFocusBadges'], - response: async () => { - const { default: data } = await import('./json/fieldOpt.getServFocusBadges.json') - return data + orgBadges: getTRPCMock({ + path: ['fieldOpt', 'orgBadges'], + response: async (input) => { + switch (input.badgeType) { + case 'organization-leadership': { + const { default: data } = await import('./json/fieldOpt.orgBadges.organization-leadership.json') + return data + } + case 'service-focus': { + const { default: data } = await import('./json/fieldOpt.orgBadges.service-focus.json') + return data + } + } }, }), } satisfies MockHandlerObject<'fieldOpt'> diff --git a/packages/ui/mockData/json/fieldOpt.getLeaderBadges.json b/packages/ui/mockData/json/fieldOpt.orgBadges.organization-leadership.json similarity index 100% rename from packages/ui/mockData/json/fieldOpt.getLeaderBadges.json rename to packages/ui/mockData/json/fieldOpt.orgBadges.organization-leadership.json diff --git a/packages/ui/mockData/json/fieldOpt.getServFocusBadges.json b/packages/ui/mockData/json/fieldOpt.orgBadges.service-focus.json similarity index 100% rename from packages/ui/mockData/json/fieldOpt.getServFocusBadges.json rename to packages/ui/mockData/json/fieldOpt.orgBadges.service-focus.json diff --git a/packages/ui/mockData/organization.ts b/packages/ui/mockData/organization.ts index eb8ce1c449..af1a442fc4 100644 --- a/packages/ui/mockData/organization.ts +++ b/packages/ui/mockData/organization.ts @@ -122,4 +122,20 @@ export const organization = { return data as ApiOutput['organization']['searchDistance'] }, }), + forBadgeEditModal: getTRPCMock({ + path: ['organization', 'forBadgeEditModal'], + response: async (input) => { + return input.badgeType === 'organization-leadership' + ? ['attr_01GW2HHFVNPKMHYK12DDRVC1VJ'] + : [ + 'attr_01GW2HHFVPCVX8F3B7M30ZJEHW', + 'attr_01GW2HHFVPSYBCYF37B44WP6CZ', + 'attr_01GW2HHFVPTK9555WHJHDBDA2J', + 'attr_01GW2HHFVQ7SYGD3KM8WP9X50B', + 'attr_01GW2HHFVQ8AGBKBBZJWTHNP2F', + 'attr_01GW2HHFVQCZPA3Z5GW6J3MQHW', + 'attr_01GW2HHFVRMQFJ9AMA633SQQGV', + ] + }, + }), } satisfies MockHandlerObject<'organization'> & { searchDistanceLongTitle: HttpHandler } From bb7899ad8b34b444169d939537a75403338ccfdb Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Mon, 22 Jan 2024 16:55:16 -0500 Subject: [PATCH 06/67] layout options --- .../ui/modals/BadgeEdit/index.stories.tsx | 20 ++++++- packages/ui/modals/BadgeEdit/index.tsx | 58 ++++++++++++++++++- 2 files changed, 72 insertions(+), 6 deletions(-) diff --git a/packages/ui/modals/BadgeEdit/index.stories.tsx b/packages/ui/modals/BadgeEdit/index.stories.tsx index dcc3d47b08..4e18ae20f9 100644 --- a/packages/ui/modals/BadgeEdit/index.stories.tsx +++ b/packages/ui/modals/BadgeEdit/index.stories.tsx @@ -1,16 +1,19 @@ -import { type Meta } from '@storybook/react' +import { type Meta, type StoryObj } from '@storybook/react' import { Button } from '~ui/components/core' +import { fieldOpt } from '~ui/mockData/fieldOpt' +import { organization } from '~ui/mockData/organization' import { BadgeEditModal } from '.' +type StoryDef = StoryObj export default { title: 'Data Portal/Modals/Badge Edit', component: BadgeEditModal, parameters: { layout: 'fullscreen', layoutWrapper: 'centeredHalf', - msw: [], + msw: [fieldOpt.orgBadges, organization.forBadgeEditModal], rqDevtools: true, whyDidYouRender: { collapseGroups: true }, }, @@ -21,4 +24,15 @@ export default { }, } satisfies Meta -export const Modal = {} +export const OrgLeader = { + args: { + badgeType: 'organization-leadership', + orgId: 'orgn_123456', + }, +} satisfies StoryDef +export const ServiceFocus = { + args: { + badgeType: 'service-focus', + orgId: 'orgn_123456', + }, +} satisfies StoryDef diff --git a/packages/ui/modals/BadgeEdit/index.tsx b/packages/ui/modals/BadgeEdit/index.tsx index b79ed94013..e2e461a187 100644 --- a/packages/ui/modals/BadgeEdit/index.tsx +++ b/packages/ui/modals/BadgeEdit/index.tsx @@ -1,8 +1,59 @@ -import { createPolymorphicComponent } from '@mantine/core' +import { zodResolver } from '@hookform/resolvers/zod' +import { Box, createPolymorphicComponent, Modal, Stack } from '@mantine/core' +import { useDisclosure } from '@mantine/hooks' +import { useTranslation } from 'next-i18next' import { forwardRef } from 'react' +import { useForm } from 'react-hook-form' +import { Chip } from 'react-hook-form-mantine' +import { z } from 'zod' -const _BadgeEditModal = forwardRef(({ orgId }, ref) => { - return <> +import { type ApiInput } from '@weareinreach/api' +import { trpc as api } from '~ui/lib/trpcClient' + +import { ModalTitle } from '../ModalTitle' + +const FormSchema = z.object({ + id: z.string(), + badges: z.string().array(), +}) +const _BadgeEditModal = forwardRef(({ orgId, badgeType, ...props }, ref) => { + const { t } = useTranslation() + const [opened, handler] = useDisclosure(true) + const { data: badgeOptions } = api.fieldOpt.orgBadges.useQuery({ badgeType }) + + const apiUtil = api.useUtils() + const { control } = useForm>({ + resolver: zodResolver(FormSchema), + defaultValues: async () => { + const data = await apiUtil.organization.forBadgeEditModal.fetch({ id: orgId, badgeType }) + return { + id: orgId, + badges: data ?? [], + } + }, + }) + + return ( + <> + } + opened={opened} + onClose={handler.close} + > + + + {badgeOptions && + badgeOptions.map(({ id, tsKey, tsNs, icon }) => ( + + {`${icon} ${t(tsKey, { ns: tsNs })}`} + + ))} + + + + + + ) }) _BadgeEditModal.displayName = 'BadgeEditModal' @@ -10,4 +61,5 @@ export const BadgeEditModal = createPolymorphicComponent<'button', Props>(_Badge interface Props { orgId: string + badgeType: ApiInput['fieldOpt']['orgBadges']['badgeType'] } From 12f820d50b24d608142b429615b8f9f6109994dd Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Tue, 23 Jan 2024 13:37:32 -0500 Subject: [PATCH 07/67] create api route for badge edits --- packages/api/router/organization/index.ts | 11 ++++++ .../mutation.updateAttributesBasic.handler.ts | 35 +++++++++++++++++++ .../mutation.updateAttributesBasic.schema.ts | 10 ++++++ packages/api/router/organization/schemas.ts | 1 + packages/ui/mockData/organization.ts | 8 +++++ 5 files changed, 65 insertions(+) create mode 100644 packages/api/router/organization/mutation.updateAttributesBasic.handler.ts create mode 100644 packages/api/router/organization/mutation.updateAttributesBasic.schema.ts diff --git a/packages/api/router/organization/index.ts b/packages/api/router/organization/index.ts index b08b137c8c..58e9fd981c 100644 --- a/packages/api/router/organization/index.ts +++ b/packages/api/router/organization/index.ts @@ -39,6 +39,7 @@ type OrganizationHandlerCache = { createNewSuggestion: typeof import('./mutation.createNewSuggestion.handler').createNewSuggestion attachAttribute: typeof import('./mutation.attachAttribute.handler').attachAttribute updateBasic: typeof import('./mutation.updateBasic.handler').updateBasic + updateAttributesBasic: typeof import('./mutation.updateAttributesBasic.handler').updateAttributesBasic // #endregion } @@ -259,5 +260,15 @@ export const orgRouter = defineRouter({ if (!HandlerCache.updateBasic) throw new Error('Failed to load handler') return HandlerCache.updateBasic({ ctx, input }) }), + updateAttributesBasic: permissionedProcedure('attachOrgAttributes') + .input(schema.ZUpdateAttributesBasicSchema) + .mutation(async ({ ctx, input }) => { + if (!HandlerCache.updateAttributesBasic) + HandlerCache.updateAttributesBasic = await import('./mutation.updateAttributesBasic.handler').then( + (mod) => mod.updateAttributesBasic + ) + if (!HandlerCache.updateAttributesBasic) throw new Error('Failed to load handler') + return HandlerCache.updateAttributesBasic({ ctx, input }) + }), // #endregion }) diff --git a/packages/api/router/organization/mutation.updateAttributesBasic.handler.ts b/packages/api/router/organization/mutation.updateAttributesBasic.handler.ts new file mode 100644 index 0000000000..db8203633a --- /dev/null +++ b/packages/api/router/organization/mutation.updateAttributesBasic.handler.ts @@ -0,0 +1,35 @@ +import { getAuditedClient } from '@weareinreach/db' +import { handleError } from '~api/lib/errorHandler' +import { type TRPCHandlerParams } from '~api/types/handler' + +import { type TUpdateAttributesBasicSchema } from './mutation.updateAttributesBasic.schema' + +export const updateAttributesBasic = async ({ + ctx, + input, +}: TRPCHandlerParams) => { + try { + const prisma = getAuditedClient(ctx.actorId) + + const result = await prisma.$transaction(async (tx) => { + const { count: added } = input.createdVals + ? await tx.organizationAttribute.createMany({ + data: input.createdVals.map((id) => ({ organizationId: input.id, attributeId: id })), + skipDuplicates: true, + }) + : { count: 0 } + const { count: removed } = input.deletedVals + ? await tx.organizationAttribute.deleteMany({ + where: { + organizationId: input.id, + attributeId: { in: input.deletedVals }, + }, + }) + : { count: 0 } + return { added, removed } + }) + return result + } catch (error) { + handleError(error) + } +} diff --git a/packages/api/router/organization/mutation.updateAttributesBasic.schema.ts b/packages/api/router/organization/mutation.updateAttributesBasic.schema.ts new file mode 100644 index 0000000000..029be4e480 --- /dev/null +++ b/packages/api/router/organization/mutation.updateAttributesBasic.schema.ts @@ -0,0 +1,10 @@ +import { z } from 'zod' + +import { prefixedId } from '~api/schemas/idPrefix' + +export const ZUpdateAttributesBasicSchema = z.object({ + id: prefixedId('organization'), + createdVals: z.string().array().nullable(), + deletedVals: z.string().array().nullable(), +}) +export type TUpdateAttributesBasicSchema = z.infer diff --git a/packages/api/router/organization/schemas.ts b/packages/api/router/organization/schemas.ts index 1b4faf245e..a230e8a706 100644 --- a/packages/api/router/organization/schemas.ts +++ b/packages/api/router/organization/schemas.ts @@ -2,6 +2,7 @@ export * from './mutation.attachAttribute.schema' export * from './mutation.createNewQuick.schema' export * from './mutation.createNewSuggestion.schema' +export * from './mutation.updateAttributesBasic.schema' export * from './mutation.updateBasic.schema' export * from './query.checkForExisting.schema' export * from './query.forBadgeEditModal.schema' diff --git a/packages/ui/mockData/organization.ts b/packages/ui/mockData/organization.ts index af1a442fc4..710450e5a6 100644 --- a/packages/ui/mockData/organization.ts +++ b/packages/ui/mockData/organization.ts @@ -138,4 +138,12 @@ export const organization = { ] }, }), + updateAttributesBasic: getTRPCMock({ + path: ['organization', 'updateAttributesBasic'], + type: 'mutation', + response: (input) => ({ + added: input.createdVals.length, + removed: input.deletedVals.length, + }), + }), } satisfies MockHandlerObject<'organization'> & { searchDistanceLongTitle: HttpHandler } From 26b3ca6fcab7c3fbd4e053e5f373b3eb758717e9 Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Tue, 23 Jan 2024 13:39:24 -0500 Subject: [PATCH 08/67] add form/api handling to modal --- packages/ui/mockData/organization.ts | 4 +- .../ui/modals/BadgeEdit/index.stories.tsx | 10 ++-- packages/ui/modals/BadgeEdit/index.tsx | 47 ++++++++++++++----- 3 files changed, 41 insertions(+), 20 deletions(-) diff --git a/packages/ui/mockData/organization.ts b/packages/ui/mockData/organization.ts index 710450e5a6..9e2ac025ad 100644 --- a/packages/ui/mockData/organization.ts +++ b/packages/ui/mockData/organization.ts @@ -142,8 +142,8 @@ export const organization = { path: ['organization', 'updateAttributesBasic'], type: 'mutation', response: (input) => ({ - added: input.createdVals.length, - removed: input.deletedVals.length, + added: input.createdVals?.length ?? 0, + removed: input.deletedVals?.length ?? 0, }), }), } satisfies MockHandlerObject<'organization'> & { searchDistanceLongTitle: HttpHandler } diff --git a/packages/ui/modals/BadgeEdit/index.stories.tsx b/packages/ui/modals/BadgeEdit/index.stories.tsx index 4e18ae20f9..95a7fd7686 100644 --- a/packages/ui/modals/BadgeEdit/index.stories.tsx +++ b/packages/ui/modals/BadgeEdit/index.stories.tsx @@ -4,16 +4,16 @@ import { Button } from '~ui/components/core' import { fieldOpt } from '~ui/mockData/fieldOpt' import { organization } from '~ui/mockData/organization' -import { BadgeEditModal } from '.' +import { BadgeEdit } from '.' -type StoryDef = StoryObj +type StoryDef = StoryObj export default { title: 'Data Portal/Modals/Badge Edit', - component: BadgeEditModal, + component: BadgeEdit, parameters: { layout: 'fullscreen', layoutWrapper: 'centeredHalf', - msw: [fieldOpt.orgBadges, organization.forBadgeEditModal], + msw: [fieldOpt.orgBadges, organization.forBadgeEditModal, organization.updateAttributesBasic], rqDevtools: true, whyDidYouRender: { collapseGroups: true }, }, @@ -22,7 +22,7 @@ export default { children: 'Open Modal', orgId: 'orgn_123456', }, -} satisfies Meta +} satisfies Meta export const OrgLeader = { args: { diff --git a/packages/ui/modals/BadgeEdit/index.tsx b/packages/ui/modals/BadgeEdit/index.tsx index e2e461a187..bd7c35b397 100644 --- a/packages/ui/modals/BadgeEdit/index.tsx +++ b/packages/ui/modals/BadgeEdit/index.tsx @@ -1,6 +1,7 @@ import { zodResolver } from '@hookform/resolvers/zod' -import { Box, createPolymorphicComponent, Modal, Stack } from '@mantine/core' +import { Box, createPolymorphicComponent, Modal, Stack, Title } from '@mantine/core' import { useDisclosure } from '@mantine/hooks' +import { compareArrayVals } from 'crud-object-diff' import { useTranslation } from 'next-i18next' import { forwardRef } from 'react' import { useForm } from 'react-hook-form' @@ -8,6 +9,7 @@ import { Chip } from 'react-hook-form-mantine' import { z } from 'zod' import { type ApiInput } from '@weareinreach/api' +import { Button } from '~ui/components/core/Button' import { trpc as api } from '~ui/lib/trpcClient' import { ModalTitle } from '../ModalTitle' @@ -16,13 +18,16 @@ const FormSchema = z.object({ id: z.string(), badges: z.string().array(), }) +type FormData = z.infer const _BadgeEditModal = forwardRef(({ orgId, badgeType, ...props }, ref) => { const { t } = useTranslation() const [opened, handler] = useDisclosure(true) const { data: badgeOptions } = api.fieldOpt.orgBadges.useQuery({ badgeType }) + const { data: initialData } = api.organization.forBadgeEditModal.useQuery({ id: orgId, badgeType }) + const updateAttributes = api.organization.updateAttributesBasic.useMutation() const apiUtil = api.useUtils() - const { control } = useForm>({ + const form = useForm({ resolver: zodResolver(FormSchema), defaultValues: async () => { const data = await apiUtil.organization.forBadgeEditModal.fetch({ id: orgId, badgeType }) @@ -33,6 +38,14 @@ const _BadgeEditModal = forwardRef(({ orgId, badgeType }, }) + const handleSubmit = () => { + const data = form.getValues() + const changes = compareArrayVals([initialData ?? [], data.badges]) + updateAttributes.mutate({ id: orgId, ...changes }) + apiUtil.organization.forBadgeEditModal.invalidate() + form.reset() + } + return ( <> (({ orgId, badgeType opened={opened} onClose={handler.close} > - - - {badgeOptions && - badgeOptions.map(({ id, tsKey, tsNs, icon }) => ( - - {`${icon} ${t(tsKey, { ns: tsNs })}`} - - ))} - - + + {`Edit ${badgeType === 'organization-leadership' ? 'Organization Leadership' : 'Service Focus'} Badges`} + + + {badgeOptions && + badgeOptions.map(({ id, tsKey, tsNs, icon }) => ( + + {`${icon} ${t(tsKey, { ns: tsNs })}`} + + ))} + + + + @@ -57,7 +78,7 @@ const _BadgeEditModal = forwardRef(({ orgId, badgeType }) _BadgeEditModal.displayName = 'BadgeEditModal' -export const BadgeEditModal = createPolymorphicComponent<'button', Props>(_BadgeEditModal) +export const BadgeEdit = createPolymorphicComponent<'button', Props>(_BadgeEditModal) interface Props { orgId: string From e3c935130db46fc49ea23549b24cf72ce478010a Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Tue, 23 Jan 2024 14:20:25 -0500 Subject: [PATCH 09/67] implement BadgeEdit modal --- .../components/sections/ListingBasicInfo.tsx | 20 ++++++++-- packages/ui/modals/BadgeEdit/index.tsx | 40 ++++++++++++------- packages/ui/modals/BadgeEdit/styles.ts | 13 ++++++ 3 files changed, 54 insertions(+), 19 deletions(-) create mode 100644 packages/ui/modals/BadgeEdit/styles.ts diff --git a/packages/ui/components/sections/ListingBasicInfo.tsx b/packages/ui/components/sections/ListingBasicInfo.tsx index ada9014b31..aca042a14e 100644 --- a/packages/ui/components/sections/ListingBasicInfo.tsx +++ b/packages/ui/components/sections/ListingBasicInfo.tsx @@ -8,7 +8,9 @@ import { type ApiOutput } from '@weareinreach/api' import { BadgeGroup, type CustomBadgeProps } from '~ui/components/core/Badge' import { Rating } from '~ui/components/core/Rating' import { InlineTextInput } from '~ui/components/data-portal/InlineTextInput' -import { useCustomVariant, useFormattedAddress } from '~ui/hooks' +import { useCustomVariant } from '~ui/hooks/useCustomVariant' +import { useFormattedAddress } from '~ui/hooks/useFormattedAddress' +import { BadgeEdit } from '~ui/modals/BadgeEdit' export const ListingBasicDisplay = memo(({ data }: ListingBasicInfoProps) => { const { t, ready: i18nReady } = useTranslation(data.id) @@ -81,7 +83,6 @@ ListingBasicDisplay.displayName = 'ListingBasicDisplay' export const ListingBasicEdit = ({ data }: ListingBasicInfoProps) => { const form = useFormContext() const { attributes, isClaimed } = data - const leaderAttributes = attributes.filter(({ attribute }) => attribute.categories.some(({ category }) => category.tag === 'organization-leadership') ) @@ -102,6 +103,13 @@ export const ListingBasicEdit = ({ data }: ListingBasicInfoProps) => { tsKey: entry.attribute.tsKey, }) ) + } else { + output.push({ + variant: 'leader', + icon: '➕', + iconBg: '#FFF', + tsKey: 'Add leader badge', + }) } if (data.lastVerified) output.push({ @@ -130,7 +138,9 @@ export const ListingBasicEdit = ({ data }: ListingBasicInfoProps) => { fontSize='h2' data-isDirty={form.formState.dirtyFields['name']} /> - + + + { autosize data-isDirty={form.formState.dirtyFields['description']} /> - + + + ) diff --git a/packages/ui/modals/BadgeEdit/index.tsx b/packages/ui/modals/BadgeEdit/index.tsx index bd7c35b397..eed8cbd0f6 100644 --- a/packages/ui/modals/BadgeEdit/index.tsx +++ b/packages/ui/modals/BadgeEdit/index.tsx @@ -10,8 +10,10 @@ import { z } from 'zod' import { type ApiInput } from '@weareinreach/api' import { Button } from '~ui/components/core/Button' +import { Icon } from '~ui/icon' import { trpc as api } from '~ui/lib/trpcClient' +import { useStyles } from './styles' import { ModalTitle } from '../ModalTitle' const FormSchema = z.object({ @@ -20,30 +22,30 @@ const FormSchema = z.object({ }) type FormData = z.infer const _BadgeEditModal = forwardRef(({ orgId, badgeType, ...props }, ref) => { + const { classes } = useStyles() const { t } = useTranslation() - const [opened, handler] = useDisclosure(true) - const { data: badgeOptions } = api.fieldOpt.orgBadges.useQuery({ badgeType }) + const [opened, handler] = useDisclosure(false) const { data: initialData } = api.organization.forBadgeEditModal.useQuery({ id: orgId, badgeType }) - const updateAttributes = api.organization.updateAttributesBasic.useMutation() - - const apiUtil = api.useUtils() const form = useForm({ resolver: zodResolver(FormSchema), - defaultValues: async () => { - const data = await apiUtil.organization.forBadgeEditModal.fetch({ id: orgId, badgeType }) - return { - id: orgId, - badges: data ?? [], - } + values: { id: orgId, badges: initialData ?? [] }, + }) + const { data: badgeOptions } = api.fieldOpt.orgBadges.useQuery({ badgeType }) + + const updateAttributes = api.organization.updateAttributesBasic.useMutation({ + onSuccess: () => { + apiUtil.organization.invalidate() + form.reset() + handler.close() }, }) + const apiUtil = api.useUtils() + const handleSubmit = () => { const data = form.getValues() const changes = compareArrayVals([initialData ?? [], data.badges]) updateAttributes.mutate({ id: orgId, ...changes }) - apiUtil.organization.forBadgeEditModal.invalidate() - form.reset() } return ( @@ -67,12 +69,20 @@ const _BadgeEditModal = forwardRef(({ orgId, badgeType ))} - - + ) }) diff --git a/packages/ui/modals/BadgeEdit/styles.ts b/packages/ui/modals/BadgeEdit/styles.ts new file mode 100644 index 0000000000..47238634ab --- /dev/null +++ b/packages/ui/modals/BadgeEdit/styles.ts @@ -0,0 +1,13 @@ +import { createStyles, rem } from '@mantine/core' + +export const useStyles = createStyles((theme) => ({ + overlay: { + backgroundColor: theme.fn.lighten(theme.other.colors.secondary.teal, 0.9), + borderRadius: rem(16), + margin: rem(-8), + padding: rem(8), + ...theme.fn.hover({ + cursor: 'pointer', + }), + }, +})) From ac4315cd69f3df1f16b8ebfa3d3023d62f96a8e0 Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Tue, 23 Jan 2024 14:34:42 -0500 Subject: [PATCH 10/67] location card link for edit mode --- apps/app/src/pages/org/[slug]/edit.tsx | 2 +- packages/ui/components/sections/LocationCard.tsx | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/apps/app/src/pages/org/[slug]/edit.tsx b/apps/app/src/pages/org/[slug]/edit.tsx index d715b25f46..7845d55d1a 100644 --- a/apps/app/src/pages/org/[slug]/edit.tsx +++ b/apps/app/src/pages/org/[slug]/edit.tsx @@ -85,7 +85,7 @@ const OrganizationPage: NextPageWithOptions {locations.map((location) => ( - + ))} {hasRemote && } diff --git a/packages/ui/components/sections/LocationCard.tsx b/packages/ui/components/sections/LocationCard.tsx index ec0225989e..434c2d5353 100644 --- a/packages/ui/components/sections/LocationCard.tsx +++ b/packages/ui/components/sections/LocationCard.tsx @@ -26,7 +26,7 @@ const stopAnimations = (animationProcess: number) => { } } -export const LocationCard = ({ remoteOnly, locationId }: LocationCardProps) => { +export const LocationCard = ({ remoteOnly, locationId, edit }: LocationCardProps) => { const { map, mapIsReady, mapEvents, camera } = useGoogleMaps() const [initialPosition, setInitialPosition] = useState() const [canGetCenter, setCanGetCenter] = useState(map?.getCenter() !== undefined) @@ -238,7 +238,7 @@ export const LocationCard = ({ remoteOnly, locationId }: LocationCardProps) => { return ( Date: Tue, 23 Jan 2024 16:17:04 -0500 Subject: [PATCH 11/67] add "add new" options for ContactInfo --- .../orgEmail/query.forEditDrawer.handler.ts | 3 +- .../orgPhone/query.forEditDrawer.handler.ts | 3 +- .../query.forEditDrawer.handler.ts | 3 +- .../orgWebsite/query.forEditDrawer.handler.ts | 3 +- .../data-display/ContactInfo/Emails.tsx | 9 +- .../data-display/ContactInfo/PhoneNumbers.tsx | 9 +- .../data-display/ContactInfo/SocialMedia.tsx | 10 +- .../data-display/ContactInfo/Websites.tsx | 9 +- .../data-portal/EmailDrawer/index.tsx | 273 +++++++++-------- .../data-portal/PhoneDrawer/index.tsx | 44 ++- .../data-portal/SocialMediaDrawer/index.tsx | 278 +++++++++--------- .../data-portal/WebsiteDrawer/index.tsx | 250 ++++++++-------- .../sections/ContactSection/index.tsx | 2 +- 13 files changed, 481 insertions(+), 415 deletions(-) diff --git a/packages/api/router/orgEmail/query.forEditDrawer.handler.ts b/packages/api/router/orgEmail/query.forEditDrawer.handler.ts index 7eb8d2aaef..b819ead18e 100644 --- a/packages/api/router/orgEmail/query.forEditDrawer.handler.ts +++ b/packages/api/router/orgEmail/query.forEditDrawer.handler.ts @@ -6,7 +6,7 @@ import { type TForEditDrawerSchema } from './query.forEditDrawer.schema' export const forEditDrawer = async ({ ctx, input }: TRPCHandlerParams) => { try { - const result = await prisma.orgEmail.findUniqueOrThrow({ + const result = await prisma.orgEmail.findUnique({ where: input, select: { id: true, @@ -23,6 +23,7 @@ export const forEditDrawer = async ({ ctx, input }: TRPCHandlerParams { export const forEditDrawer = async ({ input }: TRPCHandlerParams) => { try { - const result = await prisma.orgPhone.findUniqueOrThrow({ + const result = await prisma.orgPhone.findUnique({ where: input, select: { id: true, @@ -53,6 +53,7 @@ export const forEditDrawer = async ({ input }: TRPCHandlerParams) => { try { - const result = await prisma.orgSocialMedia.findUniqueOrThrow({ + const result = await prisma.orgSocialMedia.findUnique({ where: input, select: { id: true, @@ -23,6 +23,7 @@ export const forEditDrawer = async ({ ctx, input }: TRPCHandlerParams) => { try { - const result = await prisma.orgWebsite.findUniqueOrThrow({ + const result = await prisma.orgWebsite.findUnique({ where: input, include: { description: { include: { tsKey: true } }, }, }) + if (!result) return const reformatted = { ...result, description: result.description?.tsKey?.text, diff --git a/packages/ui/components/data-display/ContactInfo/Emails.tsx b/packages/ui/components/data-display/ContactInfo/Emails.tsx index 64dda8b119..53a89f2e91 100644 --- a/packages/ui/components/data-display/ContactInfo/Emails.tsx +++ b/packages/ui/components/data-display/ContactInfo/Emails.tsx @@ -89,9 +89,9 @@ const EmailsEdit = ({ parentId = '' }: EmailsProps) => { const { classes } = useCommonStyles() const { data } = api.orgEmail.forContactInfoEdit.useQuery({ parentId }) - if (!data?.length) return null + // if (!data?.length) return null - for (const email of data) { + for (const email of data ?? []) { const { primary, title, description, email: address, published, deleted, id } = email const desc = title @@ -147,6 +147,11 @@ const EmailsEdit = ({ parentId = '' }: EmailsProps) => { {t('words.email')} {output} + + + ➕ Create new + + ) diff --git a/packages/ui/components/data-display/ContactInfo/PhoneNumbers.tsx b/packages/ui/components/data-display/ContactInfo/PhoneNumbers.tsx index 6a92531697..34d4a4ae6d 100644 --- a/packages/ui/components/data-display/ContactInfo/PhoneNumbers.tsx +++ b/packages/ui/components/data-display/ContactInfo/PhoneNumbers.tsx @@ -88,9 +88,7 @@ const PhoneNumbersEdit = ({ parentId = '' }: PhoneNumbersProps) => { const theme = useMantineTheme() const { classes } = useCommonStyles() - if (!data?.length) return null - - for (const phone of data) { + for (const phone of data ?? []) { const { country, ext, number, phoneType, primary, description } = phone const parsedPhone = parsePhoneNumber(number, country) if (!parsedPhone) continue @@ -153,6 +151,11 @@ const PhoneNumbersEdit = ({ parentId = '' }: PhoneNumbersProps) => { {t('words.phone')} {output} + + + ➕ Create new + + ) diff --git a/packages/ui/components/data-display/ContactInfo/SocialMedia.tsx b/packages/ui/components/data-display/ContactInfo/SocialMedia.tsx index 220381e02b..2c78eb2e37 100644 --- a/packages/ui/components/data-display/ContactInfo/SocialMedia.tsx +++ b/packages/ui/components/data-display/ContactInfo/SocialMedia.tsx @@ -44,14 +44,13 @@ const SocialMediaEdit = ({ parentId = '' }: SocialMediaProps) => { const { classes } = useCommonStyles() const variants = useCustomVariant() const theme = useMantineTheme() - if (!data?.length) return null return ( {t('social.group-header')} - {data.map((link) => { + {data?.map((link) => { const renderItem = () => { switch (true) { case link.deleted: { @@ -101,6 +100,13 @@ const SocialMediaEdit = ({ parentId = '' }: SocialMediaProps) => { ) })} + + + + ➕ Create new + + + diff --git a/packages/ui/components/data-display/ContactInfo/Websites.tsx b/packages/ui/components/data-display/ContactInfo/Websites.tsx index 813e0551fe..6d44211f02 100644 --- a/packages/ui/components/data-display/ContactInfo/Websites.tsx +++ b/packages/ui/components/data-display/ContactInfo/Websites.tsx @@ -86,9 +86,7 @@ const WebsitesEdit = ({ parentId = '' }: WebsitesProps) => { // eslint-disable-next-line no-useless-escape const domainExtract = /https?:\/\/([^:\/\n?]+)/ - if (!data?.length) return null - - for (const website of data) { + for (const website of data ?? []) { const { id, url, description, published, deleted } = website const urlMatch = url.match(domainExtract) const urlBase = urlMatch?.length ? urlMatch[1] : undefined @@ -125,13 +123,14 @@ const WebsitesEdit = ({ parentId = '' }: WebsitesProps) => { output.push(item) } - if (!output.length) return null - return ( {t('website', { count: output.length })} {output} + + ➕ Create new + ) diff --git a/packages/ui/components/data-portal/EmailDrawer/index.tsx b/packages/ui/components/data-portal/EmailDrawer/index.tsx index 75f586cf0a..b53afb231d 100644 --- a/packages/ui/components/data-portal/EmailDrawer/index.tsx +++ b/packages/ui/components/data-portal/EmailDrawer/index.tsx @@ -20,15 +20,17 @@ import { Checkbox, TextInput } from 'react-hook-form-mantine' import invariant from 'tiny-invariant' import { z } from 'zod' +import { generateId } from '@weareinreach/db/lib/idGen' import { Breadcrumb } from '~ui/components/core/Breadcrumb' import { Button } from '~ui/components/core/Button' +import { useOrgInfo } from '~ui/hooks/useOrgInfo' import { Icon } from '~ui/icon' import { trpc as api } from '~ui/lib/trpcClient' const FormSchema = z.object({ firstName: z.string().nullish(), lastName: z.string().nullish(), - primary: z.boolean(), + primary: z.boolean().optional(), email: z.string().email(), description: z.string().nullish(), titleId: z.string().nullish(), @@ -47,145 +49,158 @@ const useStyles = createStyles(() => ({ minWidth: '40vw', }, })) -export const _EmailDrawer = forwardRef(({ id, ...props }, ref) => { - const router = useRouter<'/org/[slug]/edit'>() - const { isFetching } = api.orgEmail.forEditDrawer.useQuery({ id }) - const [drawerOpened, drawerHandler] = useDisclosure(false) - const [modalOpened, modalHandler] = useDisclosure(false) - const { classes } = useStyles() - const apiUtils = api.useUtils() - const { control, handleSubmit, formState, reset, getValues } = useForm({ - resolver: zodResolver(FormSchema), - defaultValues: async () => { - const data = await apiUtils.orgEmail.forEditDrawer.fetch({ id }) - const { id: orgId } = await apiUtils.organization.getIdFromSlug.fetch({ slug: router.query.slug ?? '' }) - invariant(data, 'No data returned') - invariant(orgId, 'No orgId') - return { ...data, orgId } - }, - }) +export const _EmailDrawer = forwardRef( + ({ id, createNew, ...props }, ref) => { + const router = useRouter<'/org/[slug]/edit'>() + const emailId = createNew ? generateId('orgEmail') : id + const { id: orgId } = useOrgInfo() + const { data: initialData, isFetching } = api.orgEmail.forEditDrawer.useQuery( + { id: emailId }, + { + enabled: !!orgId, + select: (data) => (data ? { ...data, orgId: orgId ?? '' } : data), + } + ) + const [drawerOpened, drawerHandler] = useDisclosure(false) + const [modalOpened, modalHandler] = useDisclosure(false) + const { classes } = useStyles() + const apiUtils = api.useUtils() + const { control, handleSubmit, formState, reset, getValues } = useForm({ + resolver: zodResolver(FormSchema), + values: initialData, + }) - const { isDirty: formIsDirty } = formState - const [isSaved, setIsSaved] = useState(formIsDirty) + const { isDirty: formIsDirty } = formState + const [isSaved, setIsSaved] = useState(formIsDirty) - const emailUpdate = api.orgEmail.update.useMutation({ - onSettled: (data) => { - apiUtils.orgEmail.forEditDrawer.invalidate() - apiUtils.orgEmail.forContactInfoEdit.invalidate() - reset(data) - }, - onSuccess: () => { - setIsSaved(true) - }, - }) - useEffect(() => { - if (isSaved && formIsDirty) { - setIsSaved(false) + const emailUpdate = api.orgEmail.update.useMutation({ + onSettled: (data) => { + apiUtils.orgEmail.forEditDrawer.invalidate() + apiUtils.orgEmail.forContactInfoEdit.invalidate() + reset(data) + }, + onSuccess: () => { + setIsSaved(true) + }, + }) + useEffect(() => { + if (isSaved && formIsDirty) { + setIsSaved(false) + } + }, [formIsDirty, isSaved]) + const handleClose = () => { + if (formState.isDirty) { + return modalHandler.open() + } else { + return drawerHandler.close() + } } - }, [formIsDirty, isSaved]) - const handleClose = () => { - if (formState.isDirty) { - return modalHandler.open() - } else { - return drawerHandler.close() - } - } - return ( - <> - - - -
{ - emailUpdate.mutate(data) - }, - (error) => console.error(error) - )} - > - - - - - - - - - - Edit Email - - - - - - - - - - - - - - - - - - You have unsaved changes - + return ( + <> + + + + { + emailUpdate.mutate(data) + }, + (error) => console.error(error) + )} + > + + + - - - -
-
-
- - - - - ) -}) + + + + + {`${createNew ? 'Add New' : 'Edit'} Email`} + + + + + + + + + + + + + + + + + + You have unsaved changes + + + + + + + + + + + + + + ) + } +) _EmailDrawer.displayName = 'EmailDrawer' export const EmailDrawer = createPolymorphicComponent<'button', EmailDrawerProps>(_EmailDrawer) -interface EmailDrawerProps { +// interface EmailDrawerProps { +// id: string +// } +type EmailDrawerProps = EmailDrawerExisting | EmailDrawerNew +interface EmailDrawerExisting { id: string + createNew?: never +} +interface EmailDrawerNew { + id?: never + createNew: true } diff --git a/packages/ui/components/data-portal/PhoneDrawer/index.tsx b/packages/ui/components/data-portal/PhoneDrawer/index.tsx index 92d7edc3c2..c673007d72 100644 --- a/packages/ui/components/data-portal/PhoneDrawer/index.tsx +++ b/packages/ui/components/data-portal/PhoneDrawer/index.tsx @@ -20,6 +20,7 @@ import { useForm } from 'react-hook-form' import { Checkbox, Select, TextInput } from 'react-hook-form-mantine' import { z } from 'zod' +import { generateId } from '@weareinreach/db/lib/idGen' import { Breadcrumb } from '~ui/components/core/Breadcrumb' import { Button } from '~ui/components/core/Button' import { PhoneNumberEntry } from '~ui/components/data-portal/PhoneNumberEntry/withHookForm' @@ -28,7 +29,7 @@ import { parsePhoneNumber } from '~ui/hooks/usePhoneNumber' import { Icon } from '~ui/icon' import { trpc as api } from '~ui/lib/trpcClient' -const useStyles = createStyles((theme) => ({ +const useStyles = createStyles(() => ({ drawerContent: { borderRadius: `${rem(32)} 0 0 0`, minWidth: '40vw', @@ -49,14 +50,20 @@ const FormSchema = z.object({ serviceOnly: z.boolean(), }) type FormSchema = z.infer -const _PhoneDrawer = forwardRef(({ id, ...props }, ref) => { +const _PhoneDrawer = forwardRef(({ id, createNew, ...props }, ref) => { const { t } = useTranslation(['phone-type']) + const phoneId = createNew ? generateId('orgPhone') : id const { id: orgId } = useOrgInfo() const apiUtils = api.useUtils() - const { isFetching } = api.orgPhone.forEditDrawer.useQuery( - { id }, + const { data: initialData, isFetching } = api.orgPhone.forEditDrawer.useQuery( + { id: phoneId }, { - select: (data) => ({ ...data, orgId: orgId ?? '' }), + enabled: !!orgId, + select: (data) => { + if (!data) return data + const parsedPhone = parsePhoneNumber(data.number, data.country) + return { ...data, number: parsedPhone?.number ?? data.number } + }, } ) const { data: phoneTypes } = api.fieldOpt.phoneTypes.useQuery(undefined, { @@ -69,13 +76,13 @@ const _PhoneDrawer = forwardRef(({ id, ...p const { classes } = useStyles() const { control, handleSubmit, formState, reset, getValues, watch } = useForm({ resolver: zodResolver(FormSchema), - // values: data, - defaultValues: async () => { - const data = await apiUtils.orgPhone.forEditDrawer.fetch({ id }) - if (!data) throw new Error('Failed to fetch data') - const parsedPhone = parsePhoneNumber(data.number, data.country) - return { ...data, number: parsedPhone?.number ?? data.number } - }, + values: initialData, + // defaultValues: async () => { + // const data = await apiUtils.orgPhone.forEditDrawer.fetch({ id }) + // if (!data) throw new Error('Failed to fetch data') + // const parsedPhone = parsePhoneNumber(data.number, data.country) + // return { ...data, number: parsedPhone?.number ?? data.number } + // }, }) const { isDirty: formIsDirty } = formState const [isSaved, setIsSaved] = useState(formIsDirty) @@ -143,9 +150,9 @@ const _PhoneDrawer = forwardRef(({ id, ...p - + - Edit Phone + {`${createNew ? 'Add New' : 'Edit'} Phone`} (_PhoneDrawer) -interface PhoneDrawerProps { +type PhoneDrawerProps = PhoneDrawerExisting | PhoneDrawerNew + +interface PhoneDrawerExisting { id: string + createNew?: never +} +interface PhoneDrawerNew { + id?: never + createNew: true } diff --git a/packages/ui/components/data-portal/SocialMediaDrawer/index.tsx b/packages/ui/components/data-portal/SocialMediaDrawer/index.tsx index bf6f5ef66d..d2c9ab3e0d 100644 --- a/packages/ui/components/data-portal/SocialMediaDrawer/index.tsx +++ b/packages/ui/components/data-portal/SocialMediaDrawer/index.tsx @@ -19,6 +19,7 @@ import { Checkbox, Select, TextInput } from 'react-hook-form-mantine' import { z } from 'zod' import { prefixedId } from '@weareinreach/api/schemas/idPrefix' +import { generateId } from '@weareinreach/db/lib/idGen' import { Breadcrumb } from '~ui/components/core/Breadcrumb' import { Button } from '~ui/components/core/Button' import { Icon } from '~ui/icon' @@ -62,154 +63,163 @@ const SelectItem = forwardRef(({ value, label, icon, )) SelectItem.displayName = 'SelectItem' -const _SocialMediaDrawer = forwardRef(({ id, ...props }, ref) => { - const { data, isFetching } = api.orgSocialMedia.forEditDrawer.useQuery({ id }) - const [drawerOpened, drawerHandler] = useDisclosure(false) - const [modalOpened, modalHandler] = useDisclosure(false) - const { classes } = useStyles() - const { control, handleSubmit, formState, reset, getValues } = useForm({ - resolver: zodResolver(FormSchema), - values: data, - defaultValues: data, - }) - const apiUtils = api.useUtils() - const { data: services } = api.orgSocialMedia.getServiceTypes.useQuery(undefined, { - select: (data) => - data - ? data.map(({ id, name, logoIcon }) => ({ value: id, label: name, icon: })) - : [], - placeholderData: [], - }) +const _SocialMediaDrawer = forwardRef( + ({ id, createNew, ...props }, ref) => { + const socialId = createNew ? generateId('orgSocialMedia') : id + const { data, isFetching } = api.orgSocialMedia.forEditDrawer.useQuery({ id: socialId }) + const [drawerOpened, drawerHandler] = useDisclosure(false) + const [modalOpened, modalHandler] = useDisclosure(false) + const { classes } = useStyles() + const { control, handleSubmit, formState, reset, getValues } = useForm({ + resolver: zodResolver(FormSchema), + values: data, + }) + const apiUtils = api.useUtils() + const { data: services } = api.orgSocialMedia.getServiceTypes.useQuery(undefined, { + select: (data) => + data + ? data.map(({ id, name, logoIcon }) => ({ value: id, label: name, icon: })) + : [], + placeholderData: [], + }) - const { isDirty: formIsDirty } = formState - const [isSaved, setIsSaved] = useState(formIsDirty) + const { isDirty: formIsDirty } = formState + const [isSaved, setIsSaved] = useState(formIsDirty) - const databaseUpdate = api.orgSocialMedia.update.useMutation({ - onSettled: (data) => { - apiUtils.orgSocialMedia.forEditDrawer.invalidate() - apiUtils.orgSocialMedia.forContactInfoEdits.invalidate() - reset(data) - }, - onSuccess: () => { - setIsSaved(true) - }, - }) - useEffect(() => { - if (isSaved && formIsDirty) { - setIsSaved(false) + const databaseUpdate = api.orgSocialMedia.update.useMutation({ + onSettled: (data) => { + apiUtils.orgSocialMedia.forEditDrawer.invalidate() + apiUtils.orgSocialMedia.forContactInfoEdits.invalidate() + reset(data) + }, + onSuccess: () => { + setIsSaved(true) + }, + }) + useEffect(() => { + if (isSaved && formIsDirty) { + setIsSaved(false) + } + }, [formIsDirty, isSaved]) + const handleClose = () => { + if (formState.isDirty) { + return modalHandler.open() + } else { + return drawerHandler.close() + } } - }, [formIsDirty, isSaved]) - const handleClose = () => { - if (formState.isDirty) { - return modalHandler.open() - } else { - return drawerHandler.close() - } - } - return ( - <> - - - -
{ - databaseUpdate.mutate({ id, data }) - }, - (error) => console.error(error) - )} - > - - - - - - - - - - Edit Social Media - - + + + + + + + + + + + You have unsaved changes + + + + + + +
+
+
+ + + + + ) + } +) _SocialMediaDrawer.displayName = 'WebsiteDrawer' export const SocialMediaDrawer = createPolymorphicComponent<'button', SocialMediaDrawerProps>( _SocialMediaDrawer ) -interface SocialMediaDrawerProps { +type SocialMediaDrawerProps = SocialMediaExisting | SocialMediaNew + +interface SocialMediaExisting { id: string + createNew?: never +} +interface SocialMediaNew { + id?: never + createNew: true } diff --git a/packages/ui/components/data-portal/WebsiteDrawer/index.tsx b/packages/ui/components/data-portal/WebsiteDrawer/index.tsx index 7d79eef767..c6d09acfc8 100644 --- a/packages/ui/components/data-portal/WebsiteDrawer/index.tsx +++ b/packages/ui/components/data-portal/WebsiteDrawer/index.tsx @@ -18,6 +18,7 @@ import { useForm } from 'react-hook-form' import { Checkbox, TextInput } from 'react-hook-form-mantine' import { z } from 'zod' +import { generateId } from '@weareinreach/db/lib/idGen' import { Breadcrumb } from '~ui/components/core/Breadcrumb' import { Button } from '~ui/components/core/Button' import { Icon } from '~ui/icon' @@ -37,138 +38,147 @@ const FormSchema = z.object({ deleted: z.boolean(), }) type FormSchema = z.infer -const _WebsiteDrawer = forwardRef(({ id, ...props }, ref) => { - const { data, isFetching } = api.orgWebsite.forEditDrawer.useQuery({ id }) - const [drawerOpened, drawerHandler] = useDisclosure(false) - const [modalOpened, modalHandler] = useDisclosure(false) - const { classes } = useStyles() - const { control, handleSubmit, formState, reset, getValues } = useForm({ - resolver: zodResolver(FormSchema), - values: data, - defaultValues: data, - }) - const apiUtils = api.useUtils() +const _WebsiteDrawer = forwardRef( + ({ id, createNew, ...props }, ref) => { + const websiteId = createNew ? generateId('orgWebsite') : id + const { data, isFetching } = api.orgWebsite.forEditDrawer.useQuery({ id: websiteId }) + const [drawerOpened, drawerHandler] = useDisclosure(false) + const [modalOpened, modalHandler] = useDisclosure(false) + const { classes } = useStyles() + const { control, handleSubmit, formState, reset, getValues } = useForm({ + resolver: zodResolver(FormSchema), + values: data, + }) + const apiUtils = api.useUtils() - const { isDirty: formIsDirty } = formState - const [isSaved, setIsSaved] = useState(formIsDirty) + const { isDirty: formIsDirty } = formState + const [isSaved, setIsSaved] = useState(formIsDirty) - const siteUpdate = api.orgWebsite.update.useMutation({ - onSettled: (data) => { - apiUtils.orgWebsite.forEditDrawer.invalidate() - apiUtils.orgWebsite.forContactInfoEdit.invalidate() - reset(data) - }, - onSuccess: () => { - setIsSaved(true) - }, - }) - useEffect(() => { - if (isSaved && formIsDirty) { - setIsSaved(false) + const siteUpdate = api.orgWebsite.update.useMutation({ + onSettled: (data) => { + apiUtils.orgWebsite.forEditDrawer.invalidate() + apiUtils.orgWebsite.forContactInfoEdit.invalidate() + reset(data) + }, + onSuccess: () => { + setIsSaved(true) + }, + }) + useEffect(() => { + if (isSaved && formIsDirty) { + setIsSaved(false) + } + }, [formIsDirty, isSaved]) + const handleClose = () => { + if (formState.isDirty) { + return modalHandler.open() + } else { + return drawerHandler.close() + } } - }, [formIsDirty, isSaved]) - const handleClose = () => { - if (formState.isDirty) { - return modalHandler.open() - } else { - return drawerHandler.close() - } - } - return ( - <> - - - -
{ - siteUpdate.mutate({ id, data }) - }, - (error) => console.error(error) - )} - > - - - - - - - - - - Edit Website - - - - - - - - - - - - - You have unsaved changes - + return ( + <> + + + + { + siteUpdate.mutate({ id: websiteId, data }) + }, + (error) => console.error(error) + )} + > + + + - - - -
-
-
- - - - - ) -}) + + + + + {`${createNew ? 'Add New' : 'Edit'} Website`} + + + + + + + + + + + + + You have unsaved changes + + + + + + + + + + + + + + ) + } +) _WebsiteDrawer.displayName = 'WebsiteDrawer' export const WebsiteDrawer = createPolymorphicComponent<'button', WebsiteDrawerProps>(_WebsiteDrawer) -interface WebsiteDrawerProps { +type WebsiteDrawerProps = WebsiteExisting | WebsiteNew + +interface WebsiteExisting { id: string + createNew?: never +} +interface WebsiteNew { + id?: never + createNew: true } diff --git a/packages/ui/components/sections/ContactSection/index.tsx b/packages/ui/components/sections/ContactSection/index.tsx index bf00e4a5e1..dfbf624c89 100644 --- a/packages/ui/components/sections/ContactSection/index.tsx +++ b/packages/ui/components/sections/ContactSection/index.tsx @@ -10,7 +10,7 @@ export const ContactSection = ({ parentId, edit }: ContactSectionProps) => { const { isMobile, isTablet } = useScreenSize() const { data: hasContactInfo } = api.misc.hasContactInfo.useQuery(parentId) - if (!hasContactInfo) return null + if (!hasContactInfo && !edit) return null const body = ( From e6c4824fb53e54fde085a42d5644300592afb409 Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Tue, 23 Jan 2024 16:38:23 -0500 Subject: [PATCH 12/67] link HoursDrawer to Visit Card --- packages/api/router/location/index.ts | 12 +++ .../query.forVisitCardEdits.handler.ts | 42 +++++++++ .../query.forVisitCardEdits.schema.ts | 6 ++ packages/api/router/location/schemas.ts | 1 + packages/ui/components/data-display/Hours.tsx | 26 ++++-- .../data-portal/HoursDrawer/index.tsx | 10 ++- .../data-portal/HoursDrawer/styles.ts | 7 ++ packages/ui/components/sections/VisitCard.tsx | 87 ++++++++++++++++++- 8 files changed, 180 insertions(+), 11 deletions(-) create mode 100644 packages/api/router/location/query.forVisitCardEdits.handler.ts create mode 100644 packages/api/router/location/query.forVisitCardEdits.schema.ts diff --git a/packages/api/router/location/index.ts b/packages/api/router/location/index.ts index 447646637e..e314d51124 100644 --- a/packages/api/router/location/index.ts +++ b/packages/api/router/location/index.ts @@ -90,6 +90,17 @@ export const locationRouter = defineRouter({ if (!HandlerCache.getAlerts) throw new Error('Failed to load handler') return HandlerCache.getAlerts({ ctx, input }) }), + forVisitCardEdits: permissionedProcedure('createNewLocation') + .input(schema.ZForVisitCardEditsSchema) + .query(async ({ ctx, input }) => { + if (!HandlerCache.forVisitCardEdits) { + HandlerCache.forVisitCardEdits = await import('./query.forVisitCardEdits.handler').then( + (mod) => mod.forVisitCardEdits + ) + } + if (!HandlerCache.forVisitCardEdits) throw new Error('Failed to load handler') + return HandlerCache.forVisitCardEdits({ ctx, input }) + }), // #endregion // // MUTATIONS @@ -131,6 +142,7 @@ type LocationHandlerCache = { forGoogleMaps: typeof import('./query.forGoogleMaps.handler').forGoogleMaps forLocationPage: typeof import('./query.forLocationPage.handler').forLocationPage getAlerts: typeof import('./query.getAlerts.handler').getAlerts + forVisitCardEdits: typeof import('./query.forVisitCardEdits.handler').forVisitCardEdits // #endregion // // MUTATIONS diff --git a/packages/api/router/location/query.forVisitCardEdits.handler.ts b/packages/api/router/location/query.forVisitCardEdits.handler.ts new file mode 100644 index 0000000000..3129305340 --- /dev/null +++ b/packages/api/router/location/query.forVisitCardEdits.handler.ts @@ -0,0 +1,42 @@ +import { prisma } from '@weareinreach/db' +import { handleError } from '~api/lib/errorHandler' +import { globalWhere } from '~api/selects/global' +import { type TRPCHandlerParams } from '~api/types/handler' + +import { type TForVisitCardEditsSchema } from './query.forVisitCardEdits.schema' + +export const forVisitCardEdits = async ({ input }: TRPCHandlerParams) => { + try { + const result = await prisma.orgLocation.findUnique({ + where: { + id: input, + }, + select: { + id: true, + name: true, + street1: true, + street2: true, + city: true, + postCode: true, + country: { select: { cca2: true } }, + govDist: { select: { abbrev: true, tsKey: true, tsNs: true } }, + attributes: { + where: { attribute: { tsKey: 'additional.offers-remote-services' } }, + select: { attribute: { select: { tsKey: true, icon: true } } }, + }, + latitude: true, + longitude: true, + }, + }) + if (!result) return + const { attributes, ...rest } = result + const transformed = { + ...rest, + remote: attributes.find(({ attribute }) => attribute.tsKey === 'additional.offers-remote-services') + ?.attribute, + } + return transformed + } catch (err) { + return handleError(err) + } +} diff --git a/packages/api/router/location/query.forVisitCardEdits.schema.ts b/packages/api/router/location/query.forVisitCardEdits.schema.ts new file mode 100644 index 0000000000..d0984ae2f9 --- /dev/null +++ b/packages/api/router/location/query.forVisitCardEdits.schema.ts @@ -0,0 +1,6 @@ +import { type z } from 'zod' + +import { prefixedId } from '~api/schemas/idPrefix' + +export const ZForVisitCardEditsSchema = prefixedId('orgLocation') +export type TForVisitCardEditsSchema = z.infer diff --git a/packages/api/router/location/schemas.ts b/packages/api/router/location/schemas.ts index 1960e3fd22..d60a1729be 100644 --- a/packages/api/router/location/schemas.ts +++ b/packages/api/router/location/schemas.ts @@ -5,6 +5,7 @@ export * from './query.forGoogleMaps.schema' export * from './query.forLocationCard.schema' export * from './query.forLocationPage.schema' export * from './query.forVisitCard.schema' +export * from './query.forVisitCardEdits.schema' export * from './query.getAddress.schema' export * from './query.getAlerts.schema' export * from './query.getById.schema' diff --git a/packages/ui/components/data-display/Hours.tsx b/packages/ui/components/data-display/Hours.tsx index dab539a75e..914dc8db25 100644 --- a/packages/ui/components/data-display/Hours.tsx +++ b/packages/ui/components/data-display/Hours.tsx @@ -2,6 +2,7 @@ import { createStyles, List, rem, Skeleton, Stack, Table, Text, Title } from '@m import { Interval } from 'luxon' import { useTranslation } from 'next-i18next' +import { HoursDrawer } from '~ui/components/data-portal/HoursDrawer' import { useCustomVariant } from '~ui/hooks/useCustomVariant' import { useLocalizedDays } from '~ui/hooks/useLocalizedDays' import { trpc as api } from '~ui/lib/trpcClient' @@ -38,7 +39,7 @@ const nullObj = { 6: [], } -export const Hours = ({ parentId, label = 'regular' }: HoursProps) => { +export const Hours = ({ parentId, label = 'regular', edit }: HoursProps) => { const { t, i18n } = useTranslation('common') const variants = useCustomVariant() const { classes } = useStyles() @@ -79,21 +80,30 @@ export const Hours = ({ parentId, label = 'regular' }: HoursProps) => { }) return ( - - + +
{t(labelKey)} {timezone}
- - {hourTable} -
-
-
+ {edit ? ( + + + {hourTable} + +
+ ) : ( + + {hourTable} +
+ )} +
+ ) } export interface HoursProps { parentId: string label?: keyof typeof labelKeys + edit?: boolean } diff --git a/packages/ui/components/data-portal/HoursDrawer/index.tsx b/packages/ui/components/data-portal/HoursDrawer/index.tsx index 921d567a2e..313f4a2918 100644 --- a/packages/ui/components/data-portal/HoursDrawer/index.tsx +++ b/packages/ui/components/data-portal/HoursDrawer/index.tsx @@ -218,7 +218,13 @@ const _HoursDrawer = forwardRef(({ location return ( <> - + @@ -260,7 +266,7 @@ const _HoursDrawer = forwardRef(({ location - + diff --git a/packages/ui/components/data-portal/HoursDrawer/styles.ts b/packages/ui/components/data-portal/HoursDrawer/styles.ts index 44f6a5f34f..7b9337b521 100644 --- a/packages/ui/components/data-portal/HoursDrawer/styles.ts +++ b/packages/ui/components/data-portal/HoursDrawer/styles.ts @@ -20,4 +20,11 @@ export const useStyles = createStyles((theme) => ({ addNewText: { color: theme.other.colors.secondary.teal, }, + overlay: { + backgroundColor: theme.fn.lighten(theme.other.colors.secondary.teal, 0.9), + borderRadius: rem(16), + margin: rem(-4), + padding: rem(4), + ...theme.fn.hover({ cursor: 'pointer' }), + }, })) diff --git a/packages/ui/components/sections/VisitCard.tsx b/packages/ui/components/sections/VisitCard.tsx index e6c817302a..32cdb30706 100644 --- a/packages/ui/components/sections/VisitCard.tsx +++ b/packages/ui/components/sections/VisitCard.tsx @@ -12,7 +12,10 @@ import { useGoogleMaps } from '~ui/hooks/useGoogleMaps' import { validateIcon } from '~ui/icon' import { trpc as api } from '~ui/lib/trpcClient' -export const VisitCard = ({ locationId }: VisitCardProps) => { +export const VisitCard = ({ edit, ...props }: VisitCardProps) => + edit ? : + +const VisitCardDisplay = ({ locationId }: VisitCardProps) => { const { isMobile } = useScreenSize() const { t } = useTranslation(['common', 'attribute']) const { ref, width } = useElementSize() @@ -94,7 +97,89 @@ export const VisitCard = ({ locationId }: VisitCardProps) => { } // TODO: [IN-785] Create variant for Remote/Unpublished address +const VisitCardEdit = ({ locationId }: VisitCardProps) => { + const { isMobile } = useScreenSize() + const { t } = useTranslation(['common', 'attribute']) + const { ref, width } = useElementSize() + const variants = useCustomVariant() + const theme = useMantineTheme() + const isTablet = useMediaQuery(`(max-width: ${theme.breakpoints.sm})`) + const mapMarker = useGoogleMapMarker() + const { map, mapIsReady } = useGoogleMaps() + const { data } = api.location.forVisitCardEdits.useQuery(locationId) + + const formattedAddress = useFormattedAddress(data) + useEffect(() => { + if (data && data.latitude && data.longitude && data.name && formattedAddress && mapIsReady && map) { + mapMarker.add({ + id: locationId, + lat: data.latitude, + lng: data.longitude, + name: data.name, + address: formattedAddress, + map: map, + }) + } + return () => { + mapMarker.remove(locationId) + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [data, formattedAddress, map, mapIsReady]) + + // const isAccessible = location.attributes.some( + // (attribute) => attribute.attribute.tsKey === 'additional.wheelchair-accessible' + // ) + + if (!data) return null + + const address = formattedAddress && ( + + {t('address', { context: data.remote ? 'physical' : undefined })} + {formattedAddress} + + + ) + + const remoteSection = data.remote && ( + + + {t('remote-services')} + + ) + + const body = ( + + {t('visit')} + {address} + {remoteSection} + + {/* TODO: [IN-807] Validate accessibility data points before enabling. + + + + {t('accessible-building', { context: `${isAccessible}` })} + + */} + + ) + + return isTablet ? body : {body} +} + export type VisitCardProps = { locationId: string published?: boolean + edit?: boolean } From dc0418708351225881757e8a9eb5162c4bf0c027 Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Tue, 23 Jan 2024 16:43:24 -0500 Subject: [PATCH 13/67] update location page layout --- .../pages/org/[slug]/[orgLocationId]/edit.tsx | 95 +++++++++++++++---- packages/ui/components/sections/VisitCard.tsx | 6 +- 2 files changed, 78 insertions(+), 23 deletions(-) diff --git a/apps/app/src/pages/org/[slug]/[orgLocationId]/edit.tsx b/apps/app/src/pages/org/[slug]/[orgLocationId]/edit.tsx index b888e3b9ea..fb968eee81 100644 --- a/apps/app/src/pages/org/[slug]/[orgLocationId]/edit.tsx +++ b/apps/app/src/pages/org/[slug]/[orgLocationId]/edit.tsx @@ -1,17 +1,17 @@ -/* eslint-disable i18next/no-literal-string */ -import { Grid, Stack, Tabs, Title } from '@mantine/core' +import { createStyles, Divider, Grid, Skeleton, Stack, Tabs, useMantineTheme } from '@mantine/core' import { type GetServerSideProps, type NextPage } from 'next' +import Head from 'next/head' import { useRouter } from 'next/router' import { useTranslation } from 'next-i18next' -import { useEffect, useState } from 'react' +import { useEffect, useRef, useState } from 'react' import { z } from 'zod' import { trpcServerClient } from '@weareinreach/api/trpc' import { checkServerPermissions } from '@weareinreach/auth' +import { AlertMessage } from '@weareinreach/ui/components/core/AlertMessage' import { Toolbar } from '@weareinreach/ui/components/core/Toolbar' import { ContactSection } from '@weareinreach/ui/components/sections/ContactSection' import { ListingBasicInfo } from '@weareinreach/ui/components/sections/ListingBasicInfo' -// import {LocationCard } from '@weareinreach/ui/components/sections/LocationCard' import { PhotosSection } from '@weareinreach/ui/components/sections/Photos' import { ReviewSection } from '@weareinreach/ui/components/sections/Reviews' import { ServicesInfoCard } from '@weareinreach/ui/components/sections/ServicesInfo' @@ -20,6 +20,15 @@ import { OrgLocationPageLoading } from '@weareinreach/ui/loading-states/OrgLocat import { api } from '~app/utils/api' import { getServerSideTranslations } from '~app/utils/i18n' +const useStyles = createStyles((theme) => ({ + tabsList: { + position: 'sticky', + top: 0, + zIndex: 10, + backgroundColor: theme.other.colors.secondary.white, + }, +})) + const OrgLocationPage: NextPage = () => { const { t } = useTranslation() const router = useRouter<'/org/[slug]/[orgLocationId]'>() @@ -34,6 +43,17 @@ const OrgLocationPage: NextPage = () => { const { data: isSaved } = api.savedList.isSaved.useQuery(orgData?.id as string, { enabled: orgDataStatus === 'success' && Boolean(orgData?.id), }) + const { data: alertData } = api.location.getAlerts.useQuery( + { id: orgLocationId }, + { enabled: router.isReady } + ) + const hasAlerts = Array.isArray(alertData) && alertData.length > 0 + const { classes } = useStyles() + + const servicesRef = useRef(null) + const photosRef = useRef(null) + const reviewsRef = useRef(null) + useEffect(() => { if (data && status === 'success' && orgData && orgDataStatus === 'success') setLoading(false) }, [data, status, orgData, orgDataStatus]) @@ -52,8 +72,10 @@ const OrgLocationPage: NextPage = () => { return ( <> - EDIT MODE - + + {t('page-title.edit-mode', { ns: 'common', title: `${orgData.name} - ${data.name}` })} + + { backToText: orgData.name, onClick: () => router.push({ - pathname: '/org/[slug]', + pathname: '/org/[slug]/edit', query: { slug: orgData.slug }, }), }} @@ -69,6 +91,16 @@ const OrgLocationPage: NextPage = () => { saved={Boolean(isSaved)} /> + {hasAlerts && + alertData.map((alert) => ( + + ))} { attributes, isClaimed: orgData.isClaimed, }} + // edit /> - - + { + setActiveTab(tab) + switch (tab) { + case 'services': { + servicesRef.current?.scrollIntoView({ behavior: 'smooth' }) + break + } + case 'photos': { + photosRef.current?.scrollIntoView({ behavior: 'smooth' }) + break + } + case 'reviews': { + reviewsRef.current?.scrollIntoView({ behavior: 'smooth' }) + break + } + } + }} + > + {t('services')} {t('photo', { count: 2 })} {t('review', { count: 2 })} - - - - - - - - - + +
+ +
+
+ +
+
+ +
+
- - + + diff --git a/packages/ui/components/sections/VisitCard.tsx b/packages/ui/components/sections/VisitCard.tsx index 32cdb30706..4ef21ea6fc 100644 --- a/packages/ui/components/sections/VisitCard.tsx +++ b/packages/ui/components/sections/VisitCard.tsx @@ -12,8 +12,8 @@ import { useGoogleMaps } from '~ui/hooks/useGoogleMaps' import { validateIcon } from '~ui/icon' import { trpc as api } from '~ui/lib/trpcClient' -export const VisitCard = ({ edit, ...props }: VisitCardProps) => - edit ? : +export const VisitCard = (props: VisitCardProps) => + props.edit ? : const VisitCardDisplay = ({ locationId }: VisitCardProps) => { const { isMobile } = useScreenSize() @@ -178,7 +178,7 @@ const VisitCardEdit = ({ locationId }: VisitCardProps) => { return isTablet ? body : {body} } -export type VisitCardProps = { +export interface VisitCardProps { locationId: string published?: boolean edit?: boolean From a7c162e63f078674759b3d8c33564748260b96d9 Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Wed, 24 Jan 2024 14:06:36 -0500 Subject: [PATCH 14/67] cannot return undefined, return null instead --- packages/api/router/location/query.forVisitCardEdits.handler.ts | 2 +- packages/api/router/orgEmail/query.forEditDrawer.handler.ts | 2 +- packages/api/router/orgPhone/query.forEditDrawer.handler.ts | 2 +- .../api/router/orgSocialMedia/query.forEditDrawer.handler.ts | 2 +- packages/api/router/orgWebsite/query.forEditDrawer.handler.ts | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/api/router/location/query.forVisitCardEdits.handler.ts b/packages/api/router/location/query.forVisitCardEdits.handler.ts index 3129305340..55c234816b 100644 --- a/packages/api/router/location/query.forVisitCardEdits.handler.ts +++ b/packages/api/router/location/query.forVisitCardEdits.handler.ts @@ -28,7 +28,7 @@ export const forVisitCardEdits = async ({ input }: TRPCHandlerParams Date: Wed, 24 Jan 2024 14:07:05 -0500 Subject: [PATCH 15/67] alter config --- apps/app/lib/wdyr.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/apps/app/lib/wdyr.ts b/apps/app/lib/wdyr.ts index 8ad61c8c29..9d813ac400 100644 --- a/apps/app/lib/wdyr.ts +++ b/apps/app/lib/wdyr.ts @@ -1,15 +1,19 @@ +/* eslint-disable node/no-process-env */ /// import React from 'react' -// eslint-disable-next-line node/no-process-env -if (process.env.NODE_ENV === 'development' && !!process.env.WDYR) { +if ( + process.env.NODE_ENV === 'development' && + (!!process.env.WDYR || process.env.NEXT_PUBLIC_WDYR === 'true') +) { if (typeof window !== 'undefined') { const loadWdyr = async () => { + console.info('[WDYR] Loading plugin...') const { default: whyDidYouRender } = await import('@welldone-software/why-did-you-render') whyDidYouRender(React, { - trackAllPureComponents: true, + trackAllPureComponents: false, include: [/.*/], - exclude: [/.*mantine.*/i], + exclude: [/.*(?:mantine|ReactQueryDevtoolsPanel).*/i], logOnDifferentValues: false, logOwnerReasons: true, collapseGroups: true, From 33115d22b3532eead056be8002e5e9f1e237fe76 Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Wed, 24 Jan 2024 14:08:06 -0500 Subject: [PATCH 16/67] fix types --- packages/ui/hooks/useFormattedAddress.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/ui/hooks/useFormattedAddress.ts b/packages/ui/hooks/useFormattedAddress.ts index 74677569a3..11b12bb606 100644 --- a/packages/ui/hooks/useFormattedAddress.ts +++ b/packages/ui/hooks/useFormattedAddress.ts @@ -19,7 +19,7 @@ const AddressSchema = z.object({ }), }) -export const useFormattedAddressParts = (location?: UseFormattedAddressProps) => { +export const useFormattedAddressParts = (location?: UseFormattedAddressProps | null) => { const { t } = useTranslation('gov-dist') const addressParts = AddressSchema.safeParse(location) if (!addressParts.success) return null @@ -42,7 +42,7 @@ export const useFormattedAddressParts = (location?: UseFormattedAddressProps) => return formattedAddress } -export const useFormattedAddress = (location?: UseFormattedAddressProps) => { +export const useFormattedAddress = (location?: UseFormattedAddressProps | null) => { const address = useFormattedAddressParts(location) if (Array.isArray(address)) return address.join(', ') return address From cd87fffd0dab2412c60a4ef7222f6146f226e8e6 Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Wed, 24 Jan 2024 14:08:39 -0500 Subject: [PATCH 17/67] fix infinite render loop for "add new" item --- .../data-display/ContactInfo/Emails.tsx | 10 +++++----- .../data-display/ContactInfo/PhoneNumbers.tsx | 11 +++++------ .../data-display/ContactInfo/SocialMedia.tsx | 8 +++++++- .../data-display/ContactInfo/Websites.tsx | 15 +++++++-------- .../components/data-portal/EmailDrawer/index.tsx | 6 +++--- .../components/data-portal/PhoneDrawer/index.tsx | 12 +++--------- .../data-portal/SocialMediaDrawer/index.tsx | 9 ++++++--- .../data-portal/WebsiteDrawer/index.tsx | 11 +++++++---- 8 files changed, 43 insertions(+), 39 deletions(-) diff --git a/packages/ui/components/data-display/ContactInfo/Emails.tsx b/packages/ui/components/data-display/ContactInfo/Emails.tsx index 53a89f2e91..688ef741ef 100644 --- a/packages/ui/components/data-display/ContactInfo/Emails.tsx +++ b/packages/ui/components/data-display/ContactInfo/Emails.tsx @@ -80,7 +80,6 @@ const EmailsDisplay = ({ parentId = '', passedData, direct, locationOnly, servic } const EmailsEdit = ({ parentId = '' }: EmailsProps) => { - const output: ReactElement[] = [] const slug = useSlug() const { data: orgId } = api.organization.getIdFromSlug.useQuery({ slug }) const { t } = useTranslation(orgId?.id ? ['common', orgId.id, 'user-title'] : ['common', 'user-title']) @@ -91,7 +90,7 @@ const EmailsEdit = ({ parentId = '' }: EmailsProps) => { // if (!data?.length) return null - for (const email of data ?? []) { + const output = data?.map((email) => { const { primary, title, description, email: address, published, deleted, id } = email const desc = title @@ -140,15 +139,16 @@ const EmailsEdit = ({ parentId = '' }: EmailsProps) => { {renderItem().desc}
) - output.push(item) - } + return item + }) + return ( {t('words.email')} {output} - + ➕ Create new diff --git a/packages/ui/components/data-display/ContactInfo/PhoneNumbers.tsx b/packages/ui/components/data-display/ContactInfo/PhoneNumbers.tsx index 34d4a4ae6d..68e8222817 100644 --- a/packages/ui/components/data-display/ContactInfo/PhoneNumbers.tsx +++ b/packages/ui/components/data-display/ContactInfo/PhoneNumbers.tsx @@ -79,7 +79,6 @@ const PhoneNumbersDisplay = ({ parentId = '', passedData, direct, locationOnly } } const PhoneNumbersEdit = ({ parentId = '' }: PhoneNumbersProps) => { - const output: ReactElement[] = [] const slug = useSlug() const { data: orgId } = api.organization.getIdFromSlug.useQuery({ slug }) const { t } = useTranslation(orgId?.id ? ['common', 'phone-type', orgId.id] : ['common', 'phone-type']) @@ -88,10 +87,10 @@ const PhoneNumbersEdit = ({ parentId = '' }: PhoneNumbersProps) => { const theme = useMantineTheme() const { classes } = useCommonStyles() - for (const phone of data ?? []) { + const output = data?.map((phone) => { const { country, ext, number, phoneType, primary, description } = phone const parsedPhone = parsePhoneNumber(number, country) - if (!parsedPhone) continue + if (!parsedPhone) return null if (ext) parsedPhone.setExt(ext) const phoneNumber = parsedPhone.formatNational() @@ -144,15 +143,15 @@ const PhoneNumbersEdit = ({ parentId = '' }: PhoneNumbersProps) => { {itemDisplay.desc} ) - primary ? output.unshift(item) : output.push(item) - } + return item + }) return ( {t('words.phone')} {output} - + ➕ Create new diff --git a/packages/ui/components/data-display/ContactInfo/SocialMedia.tsx b/packages/ui/components/data-display/ContactInfo/SocialMedia.tsx index 2c78eb2e37..3d013b14dd 100644 --- a/packages/ui/components/data-display/ContactInfo/SocialMedia.tsx +++ b/packages/ui/components/data-display/ContactInfo/SocialMedia.tsx @@ -101,7 +101,13 @@ const SocialMediaEdit = ({ parentId = '' }: SocialMediaProps) => { ) })} - + ➕ Create new diff --git a/packages/ui/components/data-display/ContactInfo/Websites.tsx b/packages/ui/components/data-display/ContactInfo/Websites.tsx index 6d44211f02..eb66ce5772 100644 --- a/packages/ui/components/data-display/ContactInfo/Websites.tsx +++ b/packages/ui/components/data-display/ContactInfo/Websites.tsx @@ -75,7 +75,6 @@ const WebsitesDisplay = ({ parentId = '', passedData, direct, locationOnly, webs } const WebsitesEdit = ({ parentId = '' }: WebsitesProps) => { - const output: ReactElement[] = [] const slug = useSlug() const { data: orgId } = api.organization.getIdFromSlug.useQuery({ slug }) const { t } = useTranslation(orgId?.id ? ['common', orgId.id] : ['common']) @@ -86,12 +85,12 @@ const WebsitesEdit = ({ parentId = '' }: WebsitesProps) => { // eslint-disable-next-line no-useless-escape const domainExtract = /https?:\/\/([^:\/\n?]+)/ - for (const website of data ?? []) { + const output = data?.map((website) => { const { id, url, description, published, deleted } = website const urlMatch = url.match(domainExtract) const urlBase = urlMatch?.length ? urlMatch[1] : undefined - if (!isExternal(url)) continue - if (!urlBase) continue + if (!isExternal(url)) return null + if (!urlBase) return null const desc = description?.key ? t(description.key, { ns: orgId?.id, defaultText: description.defaultText }) : urlBase @@ -120,15 +119,15 @@ const WebsitesEdit = ({ parentId = '' }: WebsitesProps) => { {renderItem()} ) - output.push(item) - } + return item + }) return ( - {t('website', { count: output.length })} + {t('website', { count: output?.length ?? 1 })} {output} - + ➕ Create new diff --git a/packages/ui/components/data-portal/EmailDrawer/index.tsx b/packages/ui/components/data-portal/EmailDrawer/index.tsx index b53afb231d..9f03439f8e 100644 --- a/packages/ui/components/data-portal/EmailDrawer/index.tsx +++ b/packages/ui/components/data-portal/EmailDrawer/index.tsx @@ -52,12 +52,12 @@ const useStyles = createStyles(() => ({ export const _EmailDrawer = forwardRef( ({ id, createNew, ...props }, ref) => { const router = useRouter<'/org/[slug]/edit'>() - const emailId = createNew ? generateId('orgEmail') : id + const [emailId] = useState(createNew ? generateId('orgEmail') : id) const { id: orgId } = useOrgInfo() const { data: initialData, isFetching } = api.orgEmail.forEditDrawer.useQuery( { id: emailId }, { - enabled: !!orgId, + enabled: !!orgId || !createNew, select: (data) => (data ? { ...data, orgId: orgId ?? '' } : data), } ) @@ -67,7 +67,7 @@ export const _EmailDrawer = forwardRef( const apiUtils = api.useUtils() const { control, handleSubmit, formState, reset, getValues } = useForm({ resolver: zodResolver(FormSchema), - values: initialData, + values: initialData ? initialData : undefined, }) const { isDirty: formIsDirty } = formState diff --git a/packages/ui/components/data-portal/PhoneDrawer/index.tsx b/packages/ui/components/data-portal/PhoneDrawer/index.tsx index c673007d72..325190598f 100644 --- a/packages/ui/components/data-portal/PhoneDrawer/index.tsx +++ b/packages/ui/components/data-portal/PhoneDrawer/index.tsx @@ -52,13 +52,13 @@ const FormSchema = z.object({ type FormSchema = z.infer const _PhoneDrawer = forwardRef(({ id, createNew, ...props }, ref) => { const { t } = useTranslation(['phone-type']) - const phoneId = createNew ? generateId('orgPhone') : id + const [phoneId] = useState(createNew ? generateId('orgPhone') : id) const { id: orgId } = useOrgInfo() const apiUtils = api.useUtils() const { data: initialData, isFetching } = api.orgPhone.forEditDrawer.useQuery( { id: phoneId }, { - enabled: !!orgId, + enabled: !!orgId || !createNew, select: (data) => { if (!data) return data const parsedPhone = parsePhoneNumber(data.number, data.country) @@ -76,13 +76,7 @@ const _PhoneDrawer = forwardRef(({ id, crea const { classes } = useStyles() const { control, handleSubmit, formState, reset, getValues, watch } = useForm({ resolver: zodResolver(FormSchema), - values: initialData, - // defaultValues: async () => { - // const data = await apiUtils.orgPhone.forEditDrawer.fetch({ id }) - // if (!data) throw new Error('Failed to fetch data') - // const parsedPhone = parsePhoneNumber(data.number, data.country) - // return { ...data, number: parsedPhone?.number ?? data.number } - // }, + values: initialData ? initialData : undefined, }) const { isDirty: formIsDirty } = formState const [isSaved, setIsSaved] = useState(formIsDirty) diff --git a/packages/ui/components/data-portal/SocialMediaDrawer/index.tsx b/packages/ui/components/data-portal/SocialMediaDrawer/index.tsx index d2c9ab3e0d..b6461296b1 100644 --- a/packages/ui/components/data-portal/SocialMediaDrawer/index.tsx +++ b/packages/ui/components/data-portal/SocialMediaDrawer/index.tsx @@ -65,14 +65,17 @@ SelectItem.displayName = 'SelectItem' const _SocialMediaDrawer = forwardRef( ({ id, createNew, ...props }, ref) => { - const socialId = createNew ? generateId('orgSocialMedia') : id - const { data, isFetching } = api.orgSocialMedia.forEditDrawer.useQuery({ id: socialId }) + const [socialId] = useState(createNew ? generateId('orgSocialMedia') : id) + const { data, isFetching } = api.orgSocialMedia.forEditDrawer.useQuery( + { id: socialId }, + { enabled: !createNew } + ) const [drawerOpened, drawerHandler] = useDisclosure(false) const [modalOpened, modalHandler] = useDisclosure(false) const { classes } = useStyles() const { control, handleSubmit, formState, reset, getValues } = useForm({ resolver: zodResolver(FormSchema), - values: data, + values: data ? data : undefined, }) const apiUtils = api.useUtils() const { data: services } = api.orgSocialMedia.getServiceTypes.useQuery(undefined, { diff --git a/packages/ui/components/data-portal/WebsiteDrawer/index.tsx b/packages/ui/components/data-portal/WebsiteDrawer/index.tsx index c6d09acfc8..9422700203 100644 --- a/packages/ui/components/data-portal/WebsiteDrawer/index.tsx +++ b/packages/ui/components/data-portal/WebsiteDrawer/index.tsx @@ -40,14 +40,17 @@ const FormSchema = z.object({ type FormSchema = z.infer const _WebsiteDrawer = forwardRef( ({ id, createNew, ...props }, ref) => { - const websiteId = createNew ? generateId('orgWebsite') : id - const { data, isFetching } = api.orgWebsite.forEditDrawer.useQuery({ id: websiteId }) + const [websiteId] = useState(createNew ? generateId('orgWebsite') : id) + const { data, isFetching } = api.orgWebsite.forEditDrawer.useQuery( + { id: websiteId }, + { enabled: !createNew } + ) const [drawerOpened, drawerHandler] = useDisclosure(false) const [modalOpened, modalHandler] = useDisclosure(false) const { classes } = useStyles() const { control, handleSubmit, formState, reset, getValues } = useForm({ resolver: zodResolver(FormSchema), - values: data, + values: data ? data : undefined, }) const apiUtils = api.useUtils() @@ -171,7 +174,7 @@ const _WebsiteDrawer = forwardRef( _WebsiteDrawer.displayName = 'WebsiteDrawer' export const WebsiteDrawer = createPolymorphicComponent<'button', WebsiteDrawerProps>(_WebsiteDrawer) - +WebsiteDrawer.whyDidYouRender = true type WebsiteDrawerProps = WebsiteExisting | WebsiteNew interface WebsiteExisting { From 7c822735028607fcb27a80afcf5c4d705bc3e53a Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Wed, 24 Jan 2024 14:09:10 -0500 Subject: [PATCH 18/67] memoize Icon component --- packages/ui/icon/iconList.ts | 2 +- packages/ui/icon/index.tsx | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/ui/icon/iconList.ts b/packages/ui/icon/iconList.ts index 0c3c78ed6d..77297586cb 100644 --- a/packages/ui/icon/iconList.ts +++ b/packages/ui/icon/iconList.ts @@ -1,3 +1,3 @@ // generated file - do not modify directly // prettier-ignore -export const iconList = ["carbon:3d-cursor","carbon:3d-cursor-alt","carbon:3d-curve-auto-colon","carbon:3d-curve-auto-vessels","carbon:3d-curve-manual","carbon:3d-ica","carbon:3d-mpr-toggle","carbon:3d-print-mesh","carbon:3d-software","carbon:3rd-party-connected","carbon:4k","carbon:4k-filled","carbon:accessibility","carbon:accessibility-alt","carbon:accessibility-color","carbon:accessibility-color-filled","carbon:account","carbon:accumulation-ice","carbon:accumulation-precipitation","carbon:accumulation-rain","carbon:accumulation-snow","carbon:activity","carbon:add","carbon:add-alt","carbon:add-comment","carbon:add-filled","carbon:add-large","carbon:agriculture-analytics","carbon:ai","carbon:ai-governance-lifecycle","carbon:ai-governance-tracked","carbon:ai-governance-untracked","carbon:ai-results","carbon:ai-results-high","carbon:ai-results-low","carbon:ai-results-medium","carbon:ai-results-urgent","carbon:ai-results-very-high","carbon:ai-status","carbon:ai-status-complete","carbon:ai-status-failed","carbon:ai-status-in-progress","carbon:ai-status-queued","carbon:ai-status-rejected","carbon:airline-digital-gate","carbon:airline-manage-gates","carbon:airline-passenger-care","carbon:airline-rapid-board","carbon:airplay","carbon:airplay-filled","carbon:airport-01","carbon:airport-02","carbon:airport-location","carbon:alarm","carbon:alarm-add","carbon:alarm-subtract","carbon:align-box-bottom-center","carbon:align-box-bottom-left","carbon:align-box-bottom-right","carbon:align-box-middle-center","carbon:align-box-middle-left","carbon:align-box-middle-right","carbon:align-box-top-center","carbon:align-box-top-left","carbon:align-box-top-right","carbon:align-horizontal-center","carbon:align-horizontal-left","carbon:align-horizontal-right","carbon:align-vertical-bottom","carbon:align-vertical-center","carbon:align-vertical-top","carbon:analytics","carbon:analytics-custom","carbon:analytics-reference","carbon:angle","carbon:annotation-visibility","carbon:aperture","carbon:api","carbon:api-1","carbon:app","carbon:app-connectivity","carbon:app-switcher","carbon:apple","carbon:apple-dash","carbon:application","carbon:application-mobile","carbon:application-virtual","carbon:application-web","carbon:apps","carbon:archive","carbon:area","carbon:area-custom","carbon:arithmetic-mean","carbon:arithmetic-median","carbon:arrival","carbon:arrow-annotation","carbon:arrow-down","carbon:arrow-down-left","carbon:arrow-down-right","carbon:arrow-left","carbon:arrow-right","carbon:arrow-shift-down","carbon:arrow-up","carbon:arrow-up-left","carbon:arrow-up-right","carbon:arrows","carbon:arrows-horizontal","carbon:arrows-vertical","carbon:asleep","carbon:asleep-filled","carbon:assembly","carbon:assembly-cluster","carbon:assembly-reference","carbon:asset","carbon:asset-confirm","carbon:asset-digital-twin","carbon:asset-view","carbon:asterisk","carbon:async","carbon:at","carbon:attachment","carbon:audio-console","carbon:augmented-reality","carbon:auto-scroll","carbon:automatic","carbon:autoscaling","carbon:awake","carbon:back-to-top","carbon:badge","carbon:baggage-claim","carbon:bar","carbon:barcode","carbon:bare-metal-server","carbon:bare-metal-server-01","carbon:bare-metal-server-02","carbon:barrier","carbon:basketball","carbon:bastion-host","carbon:bat","carbon:batch-job","carbon:batch-job-step","carbon:battery-charging","carbon:battery-empty","carbon:battery-full","carbon:battery-half","carbon:battery-low","carbon:battery-quarter","carbon:bee","carbon:bee-bat","carbon:beta","carbon:bicycle","carbon:binoculars","carbon:bloch-sphere","carbon:block-storage","carbon:block-storage-alt","carbon:blockchain","carbon:blog","carbon:bluetooth","carbon:bluetooth-off","carbon:book","carbon:bookmark","carbon:bookmark-add","carbon:bookmark-filled","carbon:boolean","carbon:boot","carbon:boot-volume","carbon:boot-volume-alt","carbon:border-bottom","carbon:border-full","carbon:border-left","carbon:border-none","carbon:border-right","carbon:border-top","carbon:bot","carbon:bottles-01","carbon:bottles-01-dash","carbon:bottles-02","carbon:bottles-02-dash","carbon:bottles-container","carbon:box","carbon:box-extra-large","carbon:box-large","carbon:box-medium","carbon:box-plot","carbon:box-small","carbon:branch","carbon:breaking-change","carbon:brightness-contrast","carbon:bring-forward","carbon:bring-to-front","carbon:brush-freehand","carbon:brush-polygon","carbon:build-tool","carbon:building","carbon:building-insights-1","carbon:building-insights-2","carbon:building-insights-3","carbon:bullhorn","carbon:buoy","carbon:bus","carbon:business-processes","carbon:button-centered","carbon:button-flush-left","carbon:cabin-care","carbon:cabin-care-alert","carbon:cabin-care-alt","carbon:cad","carbon:cafe","carbon:calculation","carbon:calculation-alt","carbon:calculator","carbon:calculator-check","carbon:calendar","carbon:calendar-add","carbon:calendar-add-alt","carbon:calendar-heat-map","carbon:calendar-settings","carbon:calendar-tools","carbon:calibrate","carbon:calls","carbon:calls-all","carbon:calls-incoming","carbon:camera","carbon:camera-action","carbon:campsite","carbon:car","carbon:car-front","carbon:carbon","carbon:carbon-accounting","carbon:carbon-for-ibm-dotcom","carbon:carbon-for-ibm-product","carbon:carbon-for-mobile","carbon:carbon-ui-builder","carbon:caret-down","carbon:caret-left","carbon:caret-right","carbon:caret-sort","carbon:caret-sort-down","carbon:caret-sort-up","carbon:caret-up","carbon:carousel-horizontal","carbon:carousel-vertical","carbon:catalog","carbon:catalog-publish","carbon:categories","carbon:category","carbon:category-add","carbon:category-and","carbon:category-new","carbon:category-new-each","carbon:ccx","carbon:cd-archive","carbon:cd-create-archive","carbon:cd-create-exchange","carbon:cda","carbon:cell-tower","carbon:center-circle","carbon:center-square","carbon:center-to-fit","carbon:certificate","carbon:certificate-check","carbon:change-catalog","carbon:character-decimal","carbon:character-fraction","carbon:character-integer","carbon:character-lower-case","carbon:character-negative-number","carbon:character-patterns","carbon:character-sentence-case","carbon:character-upper-case","carbon:character-whole-number","carbon:charging-station","carbon:charging-station-filled","carbon:chart-3d","carbon:chart-area","carbon:chart-area-smooth","carbon:chart-area-stepper","carbon:chart-average","carbon:chart-bar","carbon:chart-bar-floating","carbon:chart-bar-overlay","carbon:chart-bar-stacked","carbon:chart-bar-target","carbon:chart-bubble","carbon:chart-bubble-packed","carbon:chart-bullet","carbon:chart-candlestick","carbon:chart-cluster-bar","carbon:chart-column","carbon:chart-column-floating","carbon:chart-column-target","carbon:chart-combo","carbon:chart-combo-stacked","carbon:chart-custom","carbon:chart-dual-y-axis","carbon:chart-error-bar","carbon:chart-error-bar-alt","carbon:chart-evaluation","carbon:chart-high-low","carbon:chart-histogram","carbon:chart-line","carbon:chart-line-data","carbon:chart-line-smooth","carbon:chart-logistic-regression","carbon:chart-marimekko","carbon:chart-maximum","carbon:chart-median","carbon:chart-minimum","carbon:chart-multi-line","carbon:chart-multitype","carbon:chart-network","carbon:chart-parallel","carbon:chart-pie","carbon:chart-planning-waterfall","carbon:chart-point","carbon:chart-population","carbon:chart-radar","carbon:chart-radial","carbon:chart-relationship","carbon:chart-ring","carbon:chart-river","carbon:chart-rose","carbon:chart-scatter","carbon:chart-spiral","carbon:chart-stacked","carbon:chart-stepper","carbon:chart-sunburst","carbon:chart-t-sne","carbon:chart-treemap","carbon:chart-venn-diagram","carbon:chart-violin-plot","carbon:chart-waterfall","carbon:chart-win-loss","carbon:chat","carbon:chat-bot","carbon:chat-launch","carbon:chat-off","carbon:chat-operational","carbon:checkbox","carbon:checkbox-checked","carbon:checkbox-checked-filled","carbon:checkbox-indeterminate","carbon:checkbox-indeterminate-filled","carbon:checkbox-undeterminate","carbon:checkbox-undeterminate-filled","carbon:checkmark","carbon:checkmark-filled","carbon:checkmark-filled-error","carbon:checkmark-filled-warning","carbon:checkmark-outline","carbon:checkmark-outline-error","carbon:checkmark-outline-warning","carbon:chemistry","carbon:chemistry-reference","carbon:chevron-down","carbon:chevron-down-outline","carbon:chevron-left","carbon:chevron-mini","carbon:chevron-right","carbon:chevron-sort","carbon:chevron-sort-down","carbon:chevron-sort-up","carbon:chevron-up","carbon:chevron-up-outline","carbon:chip","carbon:choices","carbon:choose-item","carbon:choropleth-map","carbon:cics-cmas","carbon:cics-db2-connection","carbon:cics-explorer","carbon:cics-program","carbon:cics-region","carbon:cics-region-alt","carbon:cics-region-routing","carbon:cics-region-target","carbon:cics-sit","carbon:cics-sit-overrides","carbon:cics-system-group","carbon:cics-transaction-server-zos","carbon:cics-wui-region","carbon:cicsplex","carbon:circle-dash","carbon:circle-filled","carbon:circle-measurement","carbon:circle-packing","carbon:circle-solid","carbon:circuit-composer","carbon:classification","carbon:classifier-language","carbon:clean","carbon:close","carbon:close-filled","carbon:close-large","carbon:close-outline","carbon:closed-caption","carbon:closed-caption-alt","carbon:closed-caption-filled","carbon:cloud","carbon:cloud-alerting","carbon:cloud-app","carbon:cloud-auditing","carbon:cloud-ceiling","carbon:cloud-data-ops","carbon:cloud-download","carbon:cloud-foundry-1","carbon:cloud-foundry-2","carbon:cloud-lightning","carbon:cloud-logging","carbon:cloud-monitoring","carbon:cloud-offline","carbon:cloud-rain","carbon:cloud-registry","carbon:cloud-satellite","carbon:cloud-satellite-config","carbon:cloud-satellite-link","carbon:cloud-satellite-services","carbon:cloud-service-management","carbon:cloud-services","carbon:cloud-snow","carbon:cloud-upload","carbon:cloudy","carbon:cobb-angle","carbon:code","carbon:code-hide","carbon:code-reference","carbon:code-signing-service","carbon:cognitive","carbon:collaborate","carbon:collapse-all","carbon:collapse-categories","carbon:color-palette","carbon:color-switch","carbon:column","carbon:column-delete","carbon:column-dependency","carbon:column-insert","carbon:commit","carbon:communication-unified","carbon:compare","carbon:compass","carbon:composer-edit","carbon:concept","carbon:condition-point","carbon:condition-wait-point","carbon:connect","carbon:connect-recursive","carbon:connect-reference","carbon:connect-source","carbon:connect-target","carbon:connection-receive","carbon:connection-send","carbon:connection-signal","carbon:connection-signal-off","carbon:connection-two-way","carbon:construction","carbon:container-registry","carbon:container-services","carbon:container-software","carbon:content-delivery-network","carbon:content-view","carbon:continue","carbon:continue-filled","carbon:continuous-deployment","carbon:continuous-integration","carbon:contour-draw","carbon:contour-edit","carbon:contour-finding","carbon:contrast","carbon:convert-to-cloud","carbon:cookie","carbon:copy","carbon:copy-file","carbon:copy-link","carbon:corn","carbon:corner","carbon:coronavirus","carbon:cost","carbon:cost-total","carbon:cough","carbon:course","carbon:covariate","carbon:credentials","carbon:crop","carbon:crop-growth","carbon:crop-health","carbon:cross-reference","carbon:cross-tab","carbon:crossroads","carbon:crowd-report","carbon:crowd-report-filled","carbon:csv","carbon:cu1","carbon:cu3","carbon:cube","carbon:cube-view","carbon:currency","carbon:currency-baht","carbon:currency-dollar","carbon:currency-euro","carbon:currency-lira","carbon:currency-pound","carbon:currency-ruble","carbon:currency-rupee","carbon:currency-shekel","carbon:currency-won","carbon:currency-yen","carbon:cursor-1","carbon:cursor-2","carbon:customer","carbon:customer-service","carbon:cut","carbon:cut-in-half","carbon:cut-out","carbon:cy","carbon:cyclist","carbon:cz","carbon:dashboard","carbon:dashboard-reference","carbon:data-1","carbon:data-2","carbon:data-accessor","carbon:data-analytics","carbon:data-backup","carbon:data-base","carbon:data-base-alt","carbon:data-bin","carbon:data-blob","carbon:data-categorical","carbon:data-center","carbon:data-check","carbon:data-class","carbon:data-collection","carbon:data-connected","carbon:data-definition","carbon:data-diode","carbon:data-enrichment","carbon:data-enrichment-add","carbon:data-error","carbon:data-format","carbon:data-player","carbon:data-quality-definition","carbon:data-reference","carbon:data-refinery","carbon:data-refinery-reference","carbon:data-regular","carbon:data-set","carbon:data-share","carbon:data-structured","carbon:data-table","carbon:data-table-reference","carbon:data-unreal","carbon:data-unstructured","carbon:data-view","carbon:data-view-alt","carbon:data-vis-1","carbon:data-vis-2","carbon:data-vis-3","carbon:data-vis-4","carbon:data-volume","carbon:data-volume-alt","carbon:database-datastax","carbon:database-elastic","carbon:database-enterprise-db2","carbon:database-enterprisedb","carbon:database-etcd","carbon:database-messaging","carbon:database-mongodb","carbon:database-postgresql","carbon:database-rabbit","carbon:database-redis","carbon:datastore","carbon:db2-buffer-pool","carbon:db2-data-sharing-group","carbon:db2-database","carbon:debug","carbon:decision-tree","carbon:delete","carbon:delivery","carbon:delivery-add","carbon:delivery-parcel","carbon:delivery-truck","carbon:demo","carbon:denominate","carbon:departure","carbon:deploy","carbon:deploy-rules","carbon:deployment-pattern","carbon:deployment-policy","carbon:deployment-unit-data","carbon:deployment-unit-execution","carbon:deployment-unit-installation","carbon:deployment-unit-presentation","carbon:deployment-unit-technical-data","carbon:deployment-unit-technical-execution","carbon:deployment-unit-technical-installation","carbon:deployment-unit-technical-presentation","carbon:desk-adjustable","carbon:development","carbon:devices","carbon:devices-apps","carbon:dew-point","carbon:dew-point-filled","carbon:diagram","carbon:diagram-reference","carbon:dicom-6000","carbon:dicom-overlay","carbon:direct-link","carbon:direction-bear-right-01","carbon:direction-bear-right-01-filled","carbon:direction-bear-right-02","carbon:direction-bear-right-02-filled","carbon:direction-curve","carbon:direction-curve-filled","carbon:direction-fork","carbon:direction-fork-filled","carbon:direction-loop-left","carbon:direction-loop-left-filled","carbon:direction-loop-right","carbon:direction-loop-right-filled","carbon:direction-merge","carbon:direction-merge-filled","carbon:direction-right-01","carbon:direction-right-01-filled","carbon:direction-right-02","carbon:direction-right-02-filled","carbon:direction-rotary-first-right","carbon:direction-rotary-first-right-filled","carbon:direction-rotary-right","carbon:direction-rotary-right-filled","carbon:direction-rotary-straight","carbon:direction-rotary-straight-filled","carbon:direction-sharp-turn","carbon:direction-sharp-turn-filled","carbon:direction-straight","carbon:direction-straight-filled","carbon:direction-straight-right","carbon:direction-straight-right-filled","carbon:direction-u-turn","carbon:direction-u-turn-filled","carbon:directory-domain","carbon:distribute-horizontal-center","carbon:distribute-horizontal-left","carbon:distribute-horizontal-right","carbon:distribute-vertical-bottom","carbon:distribute-vertical-center","carbon:distribute-vertical-top","carbon:dna","carbon:dns-services","carbon:doc","carbon:document","carbon:document-add","carbon:document-attachment","carbon:document-audio","carbon:document-blank","carbon:document-download","carbon:document-epdf","carbon:document-export","carbon:document-horizontal","carbon:document-import","carbon:document-multiple-01","carbon:document-multiple-02","carbon:document-pdf","carbon:document-preliminary","carbon:document-protected","carbon:document-security","carbon:document-sentiment","carbon:document-signed","carbon:document-sketch","carbon:document-subtract","carbon:document-tasks","carbon:document-unknown","carbon:document-unprotected","carbon:document-vertical","carbon:document-video","carbon:document-view","carbon:document-word-processor","carbon:document-word-processor-reference","carbon:dog-walker","carbon:dot-mark","carbon:double-integer","carbon:down-to-bottom","carbon:download","carbon:download-study","carbon:downstream","carbon:drag-horizontal","carbon:drag-vertical","carbon:draggable","carbon:draw","carbon:drill-back","carbon:drill-down","carbon:drill-through","carbon:drink-01","carbon:drink-02","carbon:driver-analysis","carbon:drone","carbon:drone-delivery","carbon:drone-front","carbon:drone-video","carbon:drop-photo","carbon:drop-photo-filled","carbon:drought","carbon:dvr","carbon:earth","carbon:earth-americas","carbon:earth-americas-filled","carbon:earth-europe-africa","carbon:earth-europe-africa-filled","carbon:earth-filled","carbon:earth-southeast-asia","carbon:earth-southeast-asia-filled","carbon:earthquake","carbon:edge-cluster","carbon:edge-device","carbon:edge-enhancement","carbon:edge-enhancement-01","carbon:edge-enhancement-02","carbon:edge-enhancement-03","carbon:edge-node","carbon:edge-node-alt","carbon:edge-service","carbon:edit","carbon:edit-filter","carbon:edit-off","carbon:edt-loop","carbon:education","carbon:email","carbon:email-new","carbon:encryption","carbon:energy-renewable","carbon:enterprise","carbon:equal-approximately","carbon:equalizer","carbon:erase","carbon:erase-3d","carbon:error","carbon:error-filled","carbon:error-outline","carbon:event","carbon:event-change","carbon:event-incident","carbon:event-schedule","carbon:event-warning","carbon:events","carbon:events-alt","carbon:exam-mode","carbon:executable-program","carbon:exit","carbon:expand-all","carbon:expand-categories","carbon:explore","carbon:export","carbon:eyedropper","carbon:face-activated","carbon:face-activated-add","carbon:face-activated-filled","carbon:face-add","carbon:face-cool","carbon:face-dissatisfied","carbon:face-dissatisfied-filled","carbon:face-dizzy","carbon:face-dizzy-filled","carbon:face-mask","carbon:face-neutral","carbon:face-neutral-filled","carbon:face-pending","carbon:face-pending-filled","carbon:face-satisfied","carbon:face-satisfied-filled","carbon:face-wink","carbon:face-wink-filled","carbon:factor","carbon:fade","carbon:favorite","carbon:favorite-filled","carbon:favorite-half","carbon:fetch-upload","carbon:fetch-upload-cloud","carbon:file-storage","carbon:filter","carbon:filter-edit","carbon:filter-remove","carbon:filter-reset","carbon:finance","carbon:fingerprint-recognition","carbon:fire","carbon:firewall","carbon:firewall-classic","carbon:fish","carbon:fish-multiple","carbon:fit-to-height","carbon:fit-to-screen","carbon:fit-to-width","carbon:flag","carbon:flag-filled","carbon:flagging-taxi","carbon:flash","carbon:flash-filled","carbon:flash-off","carbon:flash-off-filled","carbon:flight-international","carbon:flight-roster","carbon:flight-schedule","carbon:floating-ip","carbon:flood","carbon:flood-warning","carbon:floorplan","carbon:flow","carbon:flow-connection","carbon:flow-data","carbon:flow-logs-vpc","carbon:flow-modeler","carbon:flow-modeler-reference","carbon:flow-stream","carbon:flow-stream-reference","carbon:fog","carbon:folder","carbon:folder-add","carbon:folder-details","carbon:folder-details-reference","carbon:folder-move-to","carbon:folder-off","carbon:folder-open","carbon:folder-parent","carbon:folder-shared","carbon:folders","carbon:forecast-hail","carbon:forecast-hail-30","carbon:forecast-lightning","carbon:forecast-lightning-30","carbon:fork","carbon:forum","carbon:forward-10","carbon:forward-30","carbon:forward-5","carbon:foundation-model","carbon:fragile","carbon:friendship","carbon:fruit-bowl","carbon:function","carbon:function-math","carbon:fusion-blender","carbon:game-console","carbon:game-wireless","carbon:gamification","carbon:gas-station","carbon:gas-station-filled","carbon:gateway","carbon:gateway-api","carbon:gateway-mail","carbon:gateway-public","carbon:gateway-security","carbon:gateway-user-access","carbon:gateway-vpn","carbon:gender-female","carbon:gender-male","carbon:generate-pdf","carbon:gif","carbon:gift","carbon:global-loan-and-trial","carbon:globe","carbon:gradient","carbon:graphical-data-flow","carbon:grid","carbon:group","carbon:group-access","carbon:group-account","carbon:group-objects","carbon:group-objects-new","carbon:group-objects-save","carbon:group-presentation","carbon:group-resource","carbon:group-security","carbon:growth","carbon:gui","carbon:gui-management","carbon:h","carbon:hail","carbon:hanging-protocol","carbon:harbor","carbon:hardware-security-module","carbon:hashtag","carbon:haze","carbon:haze-night","carbon:hd","carbon:hd-filled","carbon:hdr","carbon:headphones","carbon:headset","carbon:health-cross","carbon:hearing","carbon:heat-map","carbon:heat-map-02","carbon:heat-map-03","carbon:heat-map-stocks","carbon:helicopter","carbon:help","carbon:help-desk","carbon:help-filled","carbon:hinton-plot","carbon:hl7-attributes","carbon:hole-filling","carbon:hole-filling-cursor","carbon:home","carbon:horizontal-view","carbon:hospital","carbon:hospital-bed","carbon:hotel","carbon:hourglass","carbon:html","carbon:html-reference","carbon:http","carbon:humidity","carbon:humidity-alt","carbon:hurricane","carbon:hybrid-networking","carbon:hybrid-networking-alt","carbon:ibm-ai-on-z","carbon:ibm-aiops-insights","carbon:ibm-bluepay","carbon:ibm-cloud","carbon:ibm-cloud-app-id","carbon:ibm-cloud-bare-metal-server","carbon:ibm-cloud-bare-metal-servers-vpc","carbon:ibm-cloud-citrix-daas","carbon:ibm-cloud-continuous-delivery","carbon:ibm-cloud-dedicated-host","carbon:ibm-cloud-direct-link-1-connect","carbon:ibm-cloud-direct-link-1-dedicated","carbon:ibm-cloud-direct-link-1-dedicated-hosting","carbon:ibm-cloud-direct-link-1-exchange","carbon:ibm-cloud-direct-link-2-connect","carbon:ibm-cloud-direct-link-2-dedicated","carbon:ibm-cloud-direct-link-2-dedicated-hosting","carbon:ibm-cloud-event-notification","carbon:ibm-cloud-event-streams","carbon:ibm-cloud-for-education","carbon:ibm-cloud-hpc","carbon:ibm-cloud-hsm","carbon:ibm-cloud-hyper-protect-crypto-services","carbon:ibm-cloud-hyper-protect-dbaas","carbon:ibm-cloud-hyper-protect-vs","carbon:ibm-cloud-internet-services","carbon:ibm-cloud-ipsec-vpn","carbon:ibm-cloud-key-protect","carbon:ibm-cloud-kubernetes-service","carbon:ibm-cloud-logging","carbon:ibm-cloud-mass-data-migration","carbon:ibm-cloud-pak-applications","carbon:ibm-cloud-pak-business-automation","carbon:ibm-cloud-pak-data","carbon:ibm-cloud-pak-integration","carbon:ibm-cloud-pak-manta-automated-data-lineage","carbon:ibm-cloud-pak-multicloud-mgmt","carbon:ibm-cloud-pak-netezza","carbon:ibm-cloud-pak-network-automation","carbon:ibm-cloud-pak-security","carbon:ibm-cloud-pak-system","carbon:ibm-cloud-pak-watson-aiops","carbon:ibm-cloud-pal","carbon:ibm-cloud-privileged-access-gateway","carbon:ibm-cloud-projects","carbon:ibm-cloud-resiliency","carbon:ibm-cloud-secrets-manager","carbon:ibm-cloud-security-compliance-center","carbon:ibm-cloud-security-compliance-center-workload-protection","carbon:ibm-cloud-subnets","carbon:ibm-cloud-sysdig-secure","carbon:ibm-cloud-transit-gateway","carbon:ibm-cloud-virtual-server-classic","carbon:ibm-cloud-virtual-server-vpc","carbon:ibm-cloud-vpc","carbon:ibm-cloud-vpc-endpoints","carbon:ibm-cloudant","carbon:ibm-content-services","carbon:ibm-data-product-exchange","carbon:ibm-data-replication","carbon:ibm-datastage","carbon:ibm-db2","carbon:ibm-db2-alt","carbon:ibm-db2-warehouse","carbon:ibm-dynamic-route-server","carbon:ibm-engineering-systems-design-rhapsody-model-manager","carbon:ibm-engineering-systems-design-rhapsody-sn1","carbon:ibm-engineering-systems-design-rhapsody-sn2","carbon:ibm-event-automation","carbon:ibm-event-endpoint-mgmt","carbon:ibm-event-processing","carbon:ibm-event-streams","carbon:ibm-ibv","carbon:ibm-instana","carbon:ibm-match-360","carbon:ibm-mq","carbon:ibm-open-enterprise-languages","carbon:ibm-openshift-container-platform-on-vpc-for-regulated-industries","carbon:ibm-power-vs","carbon:ibm-power-vs-private-cloud","carbon:ibm-power-with-vpc","carbon:ibm-private-path-services","carbon:ibm-process-mining","carbon:ibm-saas-console","carbon:ibm-sap-on-power","carbon:ibm-secure-infrastructure-on-vpc-for-regulated-industries","carbon:ibm-security","carbon:ibm-security-services","carbon:ibm-telehealth","carbon:ibm-tenet","carbon:ibm-toolchain","carbon:ibm-turbonomic","carbon:ibm-vpn-for-vpc","carbon:ibm-vsi-on-vpc-for-regulated-industries","carbon:ibm-watson-assistant","carbon:ibm-watson-discovery","carbon:ibm-watson-knowledge-catalog","carbon:ibm-watson-knowledge-studio","carbon:ibm-watson-language-translator","carbon:ibm-watson-machine-learning","carbon:ibm-watson-natural-language-classifier","carbon:ibm-watson-natural-language-understanding","carbon:ibm-watson-openscale","carbon:ibm-watson-orders","carbon:ibm-watson-query","carbon:ibm-watson-speech-to-text","carbon:ibm-watson-studio","carbon:ibm-watson-text-to-speech","carbon:ibm-watson-tone-analyzer","carbon:ibm-watsonx-assistant","carbon:ibm-watsonx-code-assistant","carbon:ibm-watsonx-code-assistant-for-z","carbon:ibm-watsonx-code-assistant-for-z-refactor","carbon:ibm-watsonx-orchestrate","carbon:ibm-wazi-deploy","carbon:ibm-z-cloud-mod-stack","carbon:ibm-z-cloud-provisioning","carbon:ibm-z-environments-dev-sec-ops","carbon:ibm-z-os","carbon:ibm-z-os-ai-control-interface","carbon:ibm-z-os-containers","carbon:ibm-z-os-package-manager","carbon:ibm-z-processor-capacity-reference","carbon:ica-2d","carbon:ice-accretion","carbon:ice-vision","carbon:id","carbon:id-management","carbon:idea","carbon:identification","carbon:image","carbon:image-copy","carbon:image-medical","carbon:image-reference","carbon:image-search","carbon:image-search-alt","carbon:image-service","carbon:import-export","carbon:improve-relevance","carbon:in-progress","carbon:in-progress-error","carbon:in-progress-warning","carbon:incomplete","carbon:incomplete-cancel","carbon:incomplete-error","carbon:incomplete-warning","carbon:increase-level","carbon:industry","carbon:infinity","carbon:infinity-symbol","carbon:information","carbon:information-disabled","carbon:information-filled","carbon:information-square","carbon:information-square-filled","carbon:infrastructure-classic","carbon:insert","carbon:insert-page","carbon:insert-syntax","carbon:inspection","carbon:instance-bx","carbon:instance-classic","carbon:instance-cx","carbon:instance-mx","carbon:instance-virtual","carbon:integration","carbon:intent-request-active","carbon:intent-request-create","carbon:intent-request-heal","carbon:intent-request-inactive","carbon:intent-request-scale-in","carbon:intent-request-scale-out","carbon:intent-request-uninstall","carbon:intent-request-upgrade","carbon:interactions","carbon:interactive-segmentation-cursor","carbon:intersect","carbon:intrusion-prevention","carbon:inventory-management","carbon:iot-connect","carbon:iot-platform","carbon:ip","carbon:iso","carbon:iso-filled","carbon:iso-outline","carbon:join-full","carbon:join-inner","carbon:join-left","carbon:join-outer","carbon:join-right","carbon:jpg","carbon:js-error","carbon:json","carbon:json-reference","carbon:jump-link","carbon:keep-dry","carbon:keyboard","carbon:keyboard-off","carbon:kubernetes","carbon:kubernetes-ip-address","carbon:kubernetes-pod","carbon:label","carbon:language","carbon:laptop","carbon:lasso","carbon:lasso-polygon","carbon:launch","carbon:launch-study-1","carbon:launch-study-2","carbon:launch-study-3","carbon:layers","carbon:legend","carbon:letter-aa","carbon:letter-aa-large","carbon:letter-bb","carbon:letter-cc","carbon:letter-dd","carbon:letter-ee","carbon:letter-ff","carbon:letter-gg","carbon:letter-hh","carbon:letter-ii","carbon:letter-jj","carbon:letter-kk","carbon:letter-ll","carbon:letter-mm","carbon:letter-nn","carbon:letter-oo","carbon:letter-pp","carbon:letter-qq","carbon:letter-rr","carbon:letter-ss","carbon:letter-tt","carbon:letter-uu","carbon:letter-vv","carbon:letter-ww","carbon:letter-xx","carbon:letter-yy","carbon:letter-zz","carbon:license","carbon:license-draft","carbon:license-global","carbon:license-maintenance","carbon:license-maintenance-draft","carbon:license-third-party","carbon:license-third-party-draft","carbon:lifesaver","carbon:light","carbon:light-filled","carbon:lightning","carbon:link","carbon:linux","carbon:linux-alt","carbon:list","carbon:list-boxes","carbon:list-bulleted","carbon:list-checked","carbon:list-checked-mirror","carbon:list-dropdown","carbon:list-numbered","carbon:list-numbered-mirror","carbon:load-balancer-application","carbon:load-balancer-classic","carbon:load-balancer-global","carbon:load-balancer-listener","carbon:load-balancer-local","carbon:load-balancer-network","carbon:load-balancer-pool","carbon:load-balancer-vpc","carbon:location","carbon:location-company","carbon:location-company-filled","carbon:location-current","carbon:location-filled","carbon:location-hazard","carbon:location-hazard-filled","carbon:location-heart","carbon:location-heart-filled","carbon:location-person","carbon:location-person-filled","carbon:location-save","carbon:location-star","carbon:location-star-filled","carbon:locked","carbon:logical-partition","carbon:login","carbon:logo-angular","carbon:logo-ansible-community","carbon:logo-delicious","carbon:logo-digg","carbon:logo-discord","carbon:logo-facebook","carbon:logo-figma","carbon:logo-flickr","carbon:logo-github","carbon:logo-gitlab","carbon:logo-glassdoor","carbon:logo-google","carbon:logo-instagram","carbon:logo-invision","carbon:logo-jupyter","carbon:logo-keybase","carbon:logo-kubernetes","carbon:logo-linkedin","carbon:logo-livestream","carbon:logo-mastodon","carbon:logo-medium","carbon:logo-npm","carbon:logo-openshift","carbon:logo-pinterest","carbon:logo-python","carbon:logo-quora","carbon:logo-r-script","carbon:logo-react","carbon:logo-red-hat-ansible","carbon:logo-sketch","carbon:logo-skype","carbon:logo-slack","carbon:logo-snapchat","carbon:logo-stumbleupon","carbon:logo-svelte","carbon:logo-tumblr","carbon:logo-twitter","carbon:logo-vmware","carbon:logo-vmware-alt","carbon:logo-vue","carbon:logo-wechat","carbon:logo-x","carbon:logo-xing","carbon:logo-yelp","carbon:logo-youtube","carbon:logout","carbon:loop","carbon:mac","carbon:mac-command","carbon:mac-option","carbon:mac-shift","carbon:machine-learning","carbon:machine-learning-model","carbon:magic-wand","carbon:magic-wand-filled","carbon:magnify","carbon:mail-all","carbon:mail-reply","carbon:mammogram","carbon:mammogram-stacked","carbon:manage-protection","carbon:managed-solutions","carbon:map","carbon:map-boundary","carbon:map-boundary-vegetation","carbon:map-center","carbon:map-identify","carbon:marine-warning","carbon:math-curve","carbon:matrix","carbon:maximize","carbon:media-cast","carbon:media-library","carbon:media-library-filled","carbon:medication","carbon:medication-alert","carbon:medication-reminder","carbon:menu","carbon:message-queue","carbon:meter","carbon:meter-alt","carbon:microphone","carbon:microphone-filled","carbon:microphone-off","carbon:microphone-off-filled","carbon:microscope","carbon:microservices-1","carbon:microservices-2","carbon:migrate","carbon:migrate-alt","carbon:milestone","carbon:military-camp","carbon:minimize","carbon:misuse","carbon:misuse-alt","carbon:misuse-outline","carbon:mixed-rain-hail","carbon:mobile","carbon:mobile-add","carbon:mobile-audio","carbon:mobile-check","carbon:mobile-crash","carbon:mobile-download","carbon:mobile-event","carbon:mobile-landscape","carbon:mobile-request","carbon:mobile-session","carbon:mobile-view","carbon:mobile-view-orientation","carbon:mobility-services","carbon:model","carbon:model-alt","carbon:model-builder","carbon:model-builder-reference","carbon:model-reference","carbon:model-tuned","carbon:money","carbon:monster","carbon:monument","carbon:moon","carbon:moonrise","carbon:moonset","carbon:mostly-cloudy","carbon:mostly-cloudy-night","carbon:mountain","carbon:mov","carbon:move","carbon:movement","carbon:mp3","carbon:mp4","carbon:mpeg","carbon:mpg2","carbon:music","carbon:music-add","carbon:music-remove","carbon:mysql","carbon:name-space","carbon:navaid-civil","carbon:navaid-dme","carbon:navaid-helipad","carbon:navaid-military","carbon:navaid-military-civil","carbon:navaid-ndb","carbon:navaid-ndb-dme","carbon:navaid-private","carbon:navaid-seaplane","carbon:navaid-tacan","carbon:navaid-vhfor","carbon:navaid-vor","carbon:navaid-vordme","carbon:navaid-vortac","carbon:need","carbon:network-1","carbon:network-2","carbon:network-3","carbon:network-3-reference","carbon:network-4","carbon:network-4-reference","carbon:network-admin-control","carbon:network-enterprise","carbon:network-interface","carbon:network-overlay","carbon:network-public","carbon:new-tab","carbon:next-filled","carbon:next-outline","carbon:no-image","carbon:no-ticket","carbon:nominal","carbon:nominate","carbon:non-certified","carbon:noodle-bowl","carbon:not-available","carbon:not-sent","carbon:not-sent-filled","carbon:notebook","carbon:notebook-reference","carbon:notification","carbon:notification-filled","carbon:notification-new","carbon:notification-off","carbon:notification-off-filled","carbon:number-0","carbon:number-1","carbon:number-2","carbon:number-3","carbon:number-4","carbon:number-5","carbon:number-6","carbon:number-7","carbon:number-8","carbon:number-9","carbon:number-small-0","carbon:number-small-1","carbon:number-small-2","carbon:number-small-3","carbon:number-small-4","carbon:number-small-5","carbon:number-small-6","carbon:number-small-7","carbon:number-small-8","carbon:number-small-9","carbon:object-storage","carbon:object-storage-alt","carbon:observed-hail","carbon:observed-lightning","carbon:omega","carbon:opacity","carbon:open-panel-bottom","carbon:open-panel-filled-bottom","carbon:open-panel-filled-left","carbon:open-panel-filled-right","carbon:open-panel-filled-top","carbon:open-panel-left","carbon:open-panel-right","carbon:open-panel-top","carbon:operation","carbon:operation-gauge","carbon:operation-if","carbon:operations-field","carbon:operations-record","carbon:order-details","carbon:ordinal","carbon:outage","carbon:outlook-severe","carbon:overflow-menu-horizontal","carbon:overflow-menu-vertical","carbon:overlay","carbon:package","carbon:package-text-analysis","carbon:page-break","carbon:page-first","carbon:page-last","carbon:page-number","carbon:page-scroll","carbon:paint-brush","carbon:paint-brush-alt","carbon:palm-tree","carbon:pan-horizontal","carbon:pan-vertical","carbon:panel-expansion","carbon:paragraph","carbon:parameter","carbon:parent-child","carbon:partition-auto","carbon:partition-collection","carbon:partition-repartition","carbon:partition-same","carbon:partition-specific","carbon:partly-cloudy","carbon:partly-cloudy-night","carbon:partnership","carbon:passenger-drinks","carbon:passenger-plus","carbon:password","carbon:paste","carbon:pause","carbon:pause-filled","carbon:pause-future","carbon:pause-outline","carbon:pause-outline-filled","carbon:pause-past","carbon:pcn-e-node","carbon:pcn-military","carbon:pcn-p-node","carbon:pcn-z-node","carbon:pdf","carbon:pdf-reference","carbon:pedestrian","carbon:pedestrian-child","carbon:pedestrian-family","carbon:pen","carbon:pen-fountain","carbon:pending","carbon:pending-filled","carbon:percentage","carbon:percentage-filled","carbon:person","carbon:person-favorite","carbon:pest","carbon:pet-image-b","carbon:pet-image-o","carbon:phone","carbon:phone-application","carbon:phone-block","carbon:phone-block-filled","carbon:phone-filled","carbon:phone-incoming","carbon:phone-incoming-filled","carbon:phone-ip","carbon:phone-off","carbon:phone-off-filled","carbon:phone-outgoing","carbon:phone-outgoing-filled","carbon:phone-settings","carbon:phone-voice","carbon:phone-voice-filled","carbon:phrase-sentiment","carbon:picnic-area","carbon:piggy-bank","carbon:piggy-bank-slot","carbon:pills","carbon:pills-add","carbon:pills-subtract","carbon:pin","carbon:pin-filled","carbon:plan","carbon:plane","carbon:plane-private","carbon:plane-sea","carbon:platforms","carbon:play","carbon:play-filled","carbon:play-filled-alt","carbon:play-outline","carbon:play-outline-filled","carbon:playlist","carbon:plug","carbon:plug-filled","carbon:png","carbon:point-of-presence","carbon:pointer-text","carbon:police","carbon:policy","carbon:popup","carbon:port-input","carbon:port-output","carbon:portfolio","carbon:power","carbon:ppt","carbon:presentation-file","carbon:pressure","carbon:pressure-filled","carbon:previous-filled","carbon:previous-outline","carbon:printer","carbon:process","carbon:process-automate","carbon:product","carbon:progress-bar","carbon:progress-bar-round","carbon:promote","carbon:prompt-session","carbon:prompt-template","carbon:property-relationship","carbon:purchase","carbon:qc-launch","carbon:qq-plot","carbon:qr-code","carbon:quadrant-plot","carbon:query","carbon:query-queue","carbon:queued","carbon:quotes","carbon:radar","carbon:radar-enhanced","carbon:radar-weather","carbon:radio","carbon:radio-button","carbon:radio-button-checked","carbon:radio-combat","carbon:radio-push-to-talk","carbon:rain","carbon:rain-drizzle","carbon:rain-drop","carbon:rain-heavy","carbon:rain-scattered","carbon:rain-scattered-night","carbon:raw","carbon:receipt","carbon:recently-viewed","carbon:recommend","carbon:recording","carbon:recording-filled","carbon:recording-filled-alt","carbon:recycle","carbon:redo","carbon:ref-evapotranspiration","carbon:reference-architecture","carbon:reflect-horizontal","carbon:reflect-vertical","carbon:region-analysis-area","carbon:region-analysis-volume","carbon:registration","carbon:reminder","carbon:reminder-medical","carbon:renew","carbon:repeat","carbon:repeat-one","carbon:replicate","carbon:reply","carbon:reply-all","carbon:repo-artifact","carbon:repo-source-code","carbon:report","carbon:report-data","carbon:request-quote","carbon:research-bloch-sphere","carbon:research-hinton-plot","carbon:research-matrix","carbon:reset","carbon:reset-alt","carbon:restart","carbon:restaurant","carbon:restaurant-fine","carbon:result","carbon:result-draft","carbon:result-new","carbon:result-old","carbon:retry-failed","carbon:return","carbon:review","carbon:rewind-10","carbon:rewind-30","carbon:rewind-5","carbon:road","carbon:road-weather","carbon:roadmap","carbon:rocket","carbon:rotate","carbon:rotate-180","carbon:rotate-360","carbon:rotate-clockwise","carbon:rotate-clockwise-alt","carbon:rotate-clockwise-alt-filled","carbon:rotate-clockwise-filled","carbon:rotate-counterclockwise","carbon:rotate-counterclockwise-alt","carbon:rotate-counterclockwise-alt-filled","carbon:rotate-counterclockwise-filled","carbon:router","carbon:router-voice","carbon:router-wifi","carbon:row","carbon:row-collapse","carbon:row-delete","carbon:row-expand","carbon:row-insert","carbon:rss","carbon:rule","carbon:rule-cancelled","carbon:rule-data-quality","carbon:rule-draft","carbon:rule-filled","carbon:rule-locked","carbon:rule-partial","carbon:rule-test","carbon:ruler","carbon:ruler-alt","carbon:run","carbon:run-mirror","carbon:running","carbon:s","carbon:s-alt","carbon:sailboat-coastal","carbon:sailboat-offshore","carbon:sales-ops","carbon:sankey-diagram","carbon:sankey-diagram-alt","carbon:satellite","carbon:satellite-radar","carbon:satellite-weather","carbon:save","carbon:save-annotation","carbon:save-image","carbon:save-model","carbon:save-series","carbon:scale","carbon:scales","carbon:scales-tipped","carbon:scalpel","carbon:scalpel-cursor","carbon:scalpel-lasso","carbon:scalpel-select","carbon:scan","carbon:scan-alt","carbon:scan-disabled","carbon:scatter-matrix","carbon:schematics","carbon:scis-control-tower","carbon:scis-transparent-supply","carbon:scooter","carbon:scooter-front","carbon:screen","carbon:screen-map","carbon:screen-map-set","carbon:screen-off","carbon:script","carbon:script-reference","carbon:sdk","carbon:search","carbon:search-advanced","carbon:search-locate","carbon:search-locate-mirror","carbon:security","carbon:security-services","carbon:select-01","carbon:select-02","carbon:select-window","carbon:send","carbon:send-alt","carbon:send-alt-filled","carbon:send-backward","carbon:send-filled","carbon:send-to-back","carbon:server-dns","carbon:server-proxy","carbon:server-time","carbon:service-desk","carbon:service-id","carbon:service-levels","carbon:session-border-control","carbon:settings","carbon:settings-adjust","carbon:settings-check","carbon:settings-edit","carbon:settings-services","carbon:settings-view","carbon:shape-except","carbon:shape-exclude","carbon:shape-intersect","carbon:shape-join","carbon:shape-unite","carbon:share","carbon:share-knowledge","carbon:shopping-bag","carbon:shopping-cart","carbon:shopping-cart-arrow-down","carbon:shopping-cart-arrow-up","carbon:shopping-cart-clear","carbon:shopping-cart-error","carbon:shopping-cart-minus","carbon:shopping-cart-plus","carbon:shopping-catalog","carbon:show-data-cards","carbon:shrink-screen","carbon:shrink-screen-filled","carbon:shuffle","carbon:shuttle","carbon:side-panel-close","carbon:side-panel-close-filled","carbon:side-panel-open","carbon:side-panel-open-filled","carbon:sight","carbon:sigma","carbon:signal-strength","carbon:sim-card","carbon:skill-level","carbon:skill-level-advanced","carbon:skill-level-basic","carbon:skill-level-intermediate","carbon:skip-back","carbon:skip-back-filled","carbon:skip-back-outline","carbon:skip-back-outline-filled","carbon:skip-back-outline-solid","carbon:skip-back-solid-filled","carbon:skip-forward","carbon:skip-forward-filled","carbon:skip-forward-outline","carbon:skip-forward-outline-filled","carbon:skip-forward-outline-solid","carbon:skip-forward-solid-filled","carbon:sleet","carbon:slisor","carbon:slm","carbon:smell","carbon:smoke","carbon:smoothing","carbon:smoothing-cursor","carbon:snooze","carbon:snow","carbon:snow-blizzard","carbon:snow-density","carbon:snow-heavy","carbon:snow-scattered","carbon:snow-scattered-night","carbon:snowflake","carbon:soccer","carbon:software-resource","carbon:software-resource-cluster","carbon:software-resource-resource","carbon:soil-moisture","carbon:soil-moisture-field","carbon:soil-moisture-global","carbon:soil-temperature","carbon:soil-temperature-field","carbon:soil-temperature-global","carbon:solar-panel","carbon:sort-ascending","carbon:sort-descending","carbon:sort-remove","carbon:spell-check","carbon:spine-label","carbon:split","carbon:split-discard","carbon:split-screen","carbon:spray-paint","carbon:sprout","carbon:sql","carbon:stack-limitation","carbon:stacked-move","carbon:stacked-scrolling-1","carbon:stacked-scrolling-2","carbon:stamp","carbon:star","carbon:star-filled","carbon:star-half","carbon:star-review","carbon:status-acknowledge","carbon:status-change","carbon:status-partial-fail","carbon:status-resolved","carbon:stay-inside","carbon:stem-leaf-plot","carbon:stethoscope","carbon:stop","carbon:stop-filled","carbon:stop-filled-alt","carbon:stop-outline","carbon:stop-outline-filled","carbon:stop-sign","carbon:stop-sign-filled","carbon:storage-pool","carbon:storage-request","carbon:store","carbon:storm-tracker","carbon:strawberry","carbon:stress-breath-editor","carbon:string-integer","carbon:string-text","carbon:study-next","carbon:study-previous","carbon:study-read","carbon:study-skip","carbon:study-transfer","carbon:study-unread","carbon:study-view","carbon:sub-volume","carbon:subdirectory","carbon:subflow","carbon:subflow-local","carbon:subnet-acl-rules","carbon:subtract","carbon:subtract-alt","carbon:subtract-filled","carbon:subtract-large","carbon:summary-kpi","carbon:summary-kpi-mirror","carbon:sun","carbon:sunny","carbon:sunrise","carbon:sunset","carbon:support-vector-machine","carbon:sustainability","carbon:svg","carbon:swim","carbon:switch-layer-2","carbon:switch-layer-3","carbon:switcher","carbon:sys-provision","carbon:t","carbon:t-alt","carbon:table","carbon:table-alias","carbon:table-built","carbon:table-of-contents","carbon:table-shortcut","carbon:table-split","carbon:tablet","carbon:tablet-landscape","carbon:tag","carbon:tag-edit","carbon:tag-export","carbon:tag-group","carbon:tag-import","carbon:tag-none","carbon:tank","carbon:task","carbon:task-add","carbon:task-approved","carbon:task-asset-view","carbon:task-complete","carbon:task-location","carbon:task-remove","carbon:task-settings","carbon:task-star","carbon:task-tools","carbon:task-view","carbon:taste","carbon:taxi","carbon:tcp-ip-service","carbon:temperature","carbon:temperature-celsius","carbon:temperature-celsius-alt","carbon:temperature-fahrenheit","carbon:temperature-fahrenheit-alt","carbon:temperature-feels-like","carbon:temperature-frigid","carbon:temperature-hot","carbon:temperature-inversion","carbon:temperature-max","carbon:temperature-min","carbon:temperature-water","carbon:template","carbon:tennis","carbon:tennis-ball","carbon:term","carbon:terminal","carbon:terminal-3270","carbon:test-tool","carbon:text-align-center","carbon:text-align-justify","carbon:text-align-left","carbon:text-align-mixed","carbon:text-align-right","carbon:text-all-caps","carbon:text-annotation-toggle","carbon:text-bold","carbon:text-clear-format","carbon:text-color","carbon:text-creation","carbon:text-fill","carbon:text-font","carbon:text-footnote","carbon:text-highlight","carbon:text-indent","carbon:text-indent-less","carbon:text-indent-more","carbon:text-italic","carbon:text-kerning","carbon:text-leading","carbon:text-line-spacing","carbon:text-link","carbon:text-link-analysis","carbon:text-long-paragraph","carbon:text-mining","carbon:text-mining-applier","carbon:text-new-line","carbon:text-scale","carbon:text-selection","carbon:text-short-paragraph","carbon:text-small-caps","carbon:text-strikethrough","carbon:text-subscript","carbon:text-superscript","carbon:text-tracking","carbon:text-underline","carbon:text-vertical-alignment","carbon:text-wrap","carbon:theater","carbon:this-side-up","carbon:threshold","carbon:thumbnail-1","carbon:thumbnail-2","carbon:thumbnail-preview","carbon:thumbs-down","carbon:thumbs-down-filled","carbon:thumbs-up","carbon:thumbs-up-filled","carbon:thunderstorm","carbon:thunderstorm-scattered","carbon:thunderstorm-scattered-night","carbon:thunderstorm-severe","carbon:thunderstorm-strong","carbon:ticket","carbon:tides","carbon:tif","carbon:time","carbon:time-filled","carbon:time-plot","carbon:timer","carbon:tool-box","carbon:tool-kit","carbon:tools","carbon:tools-alt","carbon:tornado","carbon:tornado-warning","carbon:touch-1","carbon:touch-1-down","carbon:touch-1-down-filled","carbon:touch-1-filled","carbon:touch-2","carbon:touch-2-filled","carbon:touch-interaction","carbon:tour","carbon:traffic-cone","carbon:traffic-event","carbon:traffic-flow","carbon:traffic-flow-incident","carbon:traffic-incident","carbon:traffic-weather-incident","carbon:train","carbon:train-heart","carbon:train-profile","carbon:train-speed","carbon:train-ticket","carbon:train-time","carbon:tram","carbon:transform-binary","carbon:transform-instructions","carbon:transform-language","carbon:transgender","carbon:translate","carbon:transmission-lte","carbon:transpose","carbon:trash-can","carbon:tree","carbon:tree-fall-risk","carbon:tree-view","carbon:tree-view-alt","carbon:trophy","carbon:trophy-filled","carbon:tropical-storm","carbon:tropical-storm-model-tracks","carbon:tropical-storm-tracks","carbon:tropical-warning","carbon:tsq","carbon:tsunami","carbon:tsv","carbon:tuning","carbon:two-factor-authentication","carbon:two-person-lift","carbon:txt","carbon:txt-reference","carbon:type-pattern","carbon:types","carbon:u1","carbon:u2","carbon:u3","carbon:umbrella","carbon:undefined","carbon:undefined-filled","carbon:undo","carbon:ungroup-objects","carbon:unknown","carbon:unknown-filled","carbon:unlink","carbon:unlocked","carbon:unsaved","carbon:up-to-top","carbon:update-now","carbon:upgrade","carbon:upload","carbon:upstream","carbon:url","carbon:usb","carbon:user","carbon:user-access","carbon:user-activity","carbon:user-admin","carbon:user-avatar","carbon:user-avatar-filled","carbon:user-avatar-filled-alt","carbon:user-certification","carbon:user-data","carbon:user-favorite","carbon:user-favorite-alt","carbon:user-favorite-alt-filled","carbon:user-filled","carbon:user-follow","carbon:user-identification","carbon:user-military","carbon:user-multiple","carbon:user-online","carbon:user-profile","carbon:user-profile-alt","carbon:user-role","carbon:user-service-desk","carbon:user-settings","carbon:user-simulation","carbon:user-speaker","carbon:user-sponsor","carbon:user-x-ray","carbon:uv-index","carbon:uv-index-alt","carbon:uv-index-filled","carbon:value-variable","carbon:van","carbon:vegetation-asset","carbon:vegetation-encroachment","carbon:vegetation-height","carbon:vehicle-api","carbon:vehicle-connected","carbon:vehicle-insights","carbon:vehicle-services","carbon:version","carbon:version-major","carbon:version-minor","carbon:version-patch","carbon:vertical-view","carbon:video","carbon:video-add","carbon:video-chat","carbon:video-filled","carbon:video-off","carbon:video-off-filled","carbon:video-player","carbon:view","carbon:view-filled","carbon:view-mode-1","carbon:view-mode-2","carbon:view-next","carbon:view-off","carbon:view-off-filled","carbon:virtual-column","carbon:virtual-column-key","carbon:virtual-desktop","carbon:virtual-machine","carbon:virtual-private-cloud","carbon:virtual-private-cloud-alt","carbon:visual-recognition","carbon:vlan","carbon:vlan-ibm","carbon:vmdk-disk","carbon:voice-activate","carbon:voicemail","carbon:volume-block-storage","carbon:volume-down","carbon:volume-down-alt","carbon:volume-down-filled","carbon:volume-down-filled-alt","carbon:volume-file-storage","carbon:volume-mute","carbon:volume-mute-filled","carbon:volume-object-storage","carbon:volume-up","carbon:volume-up-alt","carbon:volume-up-filled","carbon:volume-up-filled-alt","carbon:vpn","carbon:vpn-connection","carbon:vpn-policy","carbon:wallet","carbon:warning","carbon:warning-alt","carbon:warning-alt-filled","carbon:warning-alt-inverted","carbon:warning-alt-inverted-filled","carbon:warning-diamond","carbon:warning-filled","carbon:warning-hex","carbon:warning-hex-filled","carbon:warning-multiple","carbon:warning-other","carbon:warning-square","carbon:warning-square-filled","carbon:watch","carbon:watson","carbon:watson-machine-learning","carbon:watsonx","carbon:watsonx-ai","carbon:watsonx-data","carbon:watsonx-governance","carbon:wave-direction","carbon:wave-height","carbon:wave-period","carbon:weather-front-cold","carbon:weather-front-stationary","carbon:weather-front-warm","carbon:weather-station","carbon:web-services-cluster","carbon:web-services-container","carbon:web-services-definition","carbon:web-services-service","carbon:web-services-task","carbon:web-services-task-definition-version","carbon:webhook","carbon:websheet","carbon:wheat","carbon:white-paper","carbon:wifi","carbon:wifi-bridge","carbon:wifi-bridge-alt","carbon:wifi-controller","carbon:wifi-not-secure","carbon:wifi-off","carbon:wifi-secure","carbon:wikis","carbon:wind-gusts","carbon:wind-power","carbon:wind-stream","carbon:window-auto","carbon:window-base","carbon:window-black-saturation","carbon:window-overlay","carbon:window-preset","carbon:windy","carbon:windy-dust","carbon:windy-snow","carbon:windy-strong","carbon:winter-warning","carbon:wintry-mix","carbon:wireless-checkout","carbon:wmv","carbon:word-cloud","carbon:workflow-automation","carbon:workspace","carbon:workspace-import","carbon:worship","carbon:worship-christian","carbon:worship-jewish","carbon:worship-muslim","carbon:x","carbon:x-axis","carbon:xls","carbon:xml","carbon:y","carbon:y-axis","carbon:z","carbon:z-axis","carbon:z-lpar","carbon:z-systems","carbon:zip","carbon:zip-reference","carbon:zoom-area","carbon:zoom-fit","carbon:zoom-in","carbon:zoom-in-area","carbon:zoom-out","carbon:zoom-out-area","carbon:zoom-pan","carbon:zoom-reset","carbon:zos","carbon:zos-sysplex","fluent-mdl2:remove-from-trash","mdi:content-save","mdi:map-marker","ph:map-pin-fill","simple-icons:tiktok"] as const +export const iconList = ["carbon:3d-cursor","carbon:3d-cursor-alt","carbon:3d-curve-auto-colon","carbon:3d-curve-auto-vessels","carbon:3d-curve-manual","carbon:3d-ica","carbon:3d-mpr-toggle","carbon:3d-print-mesh","carbon:3d-software","carbon:3rd-party-connected","carbon:4k","carbon:4k-filled","carbon:accessibility","carbon:accessibility-alt","carbon:accessibility-color","carbon:accessibility-color-filled","carbon:account","carbon:accumulation-ice","carbon:accumulation-precipitation","carbon:accumulation-rain","carbon:accumulation-snow","carbon:activity","carbon:add","carbon:add-alt","carbon:add-comment","carbon:add-filled","carbon:add-large","carbon:agriculture-analytics","carbon:ai","carbon:ai-governance-lifecycle","carbon:ai-governance-tracked","carbon:ai-governance-untracked","carbon:ai-launch","carbon:ai-results","carbon:ai-results-high","carbon:ai-results-low","carbon:ai-results-medium","carbon:ai-results-urgent","carbon:ai-results-very-high","carbon:ai-status","carbon:ai-status-complete","carbon:ai-status-failed","carbon:ai-status-in-progress","carbon:ai-status-queued","carbon:ai-status-rejected","carbon:airline-digital-gate","carbon:airline-manage-gates","carbon:airline-passenger-care","carbon:airline-rapid-board","carbon:airplay","carbon:airplay-filled","carbon:airport-01","carbon:airport-02","carbon:airport-location","carbon:alarm","carbon:alarm-add","carbon:alarm-subtract","carbon:align-box-bottom-center","carbon:align-box-bottom-left","carbon:align-box-bottom-right","carbon:align-box-middle-center","carbon:align-box-middle-left","carbon:align-box-middle-right","carbon:align-box-top-center","carbon:align-box-top-left","carbon:align-box-top-right","carbon:align-horizontal-center","carbon:align-horizontal-left","carbon:align-horizontal-right","carbon:align-vertical-bottom","carbon:align-vertical-center","carbon:align-vertical-top","carbon:analytics","carbon:analytics-custom","carbon:analytics-reference","carbon:angle","carbon:annotation-visibility","carbon:aperture","carbon:api","carbon:api-1","carbon:app","carbon:app-connectivity","carbon:app-switcher","carbon:apple","carbon:apple-dash","carbon:application","carbon:application-mobile","carbon:application-virtual","carbon:application-web","carbon:apps","carbon:archive","carbon:area","carbon:area-custom","carbon:arithmetic-mean","carbon:arithmetic-median","carbon:arrival","carbon:arrow-annotation","carbon:arrow-down","carbon:arrow-down-left","carbon:arrow-down-right","carbon:arrow-left","carbon:arrow-right","carbon:arrow-shift-down","carbon:arrow-up","carbon:arrow-up-left","carbon:arrow-up-right","carbon:arrows","carbon:arrows-horizontal","carbon:arrows-vertical","carbon:asleep","carbon:asleep-filled","carbon:assembly","carbon:assembly-cluster","carbon:assembly-reference","carbon:asset","carbon:asset-confirm","carbon:asset-digital-twin","carbon:asset-view","carbon:asterisk","carbon:async","carbon:at","carbon:attachment","carbon:audio-console","carbon:augmented-reality","carbon:auto-scroll","carbon:automatic","carbon:autoscaling","carbon:awake","carbon:back-to-top","carbon:badge","carbon:baggage-claim","carbon:bar","carbon:barcode","carbon:bare-metal-server","carbon:bare-metal-server-01","carbon:bare-metal-server-02","carbon:barrier","carbon:basketball","carbon:bastion-host","carbon:bat","carbon:batch-job","carbon:batch-job-step","carbon:battery-charging","carbon:battery-empty","carbon:battery-full","carbon:battery-half","carbon:battery-low","carbon:battery-quarter","carbon:bee","carbon:bee-bat","carbon:beta","carbon:bicycle","carbon:binoculars","carbon:bloch-sphere","carbon:block-storage","carbon:block-storage-alt","carbon:blockchain","carbon:blog","carbon:bluetooth","carbon:bluetooth-off","carbon:book","carbon:bookmark","carbon:bookmark-add","carbon:bookmark-filled","carbon:boolean","carbon:boot","carbon:boot-volume","carbon:boot-volume-alt","carbon:border-bottom","carbon:border-full","carbon:border-left","carbon:border-none","carbon:border-right","carbon:border-top","carbon:bot","carbon:bottles-01","carbon:bottles-01-dash","carbon:bottles-02","carbon:bottles-02-dash","carbon:bottles-container","carbon:box","carbon:box-extra-large","carbon:box-large","carbon:box-medium","carbon:box-plot","carbon:box-small","carbon:branch","carbon:breaking-change","carbon:brightness-contrast","carbon:bring-forward","carbon:bring-to-front","carbon:brush-freehand","carbon:brush-polygon","carbon:build-tool","carbon:building","carbon:building-insights-1","carbon:building-insights-2","carbon:building-insights-3","carbon:bullhorn","carbon:buoy","carbon:bus","carbon:business-processes","carbon:button-centered","carbon:button-flush-left","carbon:cabin-care","carbon:cabin-care-alert","carbon:cabin-care-alt","carbon:cad","carbon:cafe","carbon:calculation","carbon:calculation-alt","carbon:calculator","carbon:calculator-check","carbon:calendar","carbon:calendar-add","carbon:calendar-add-alt","carbon:calendar-heat-map","carbon:calendar-settings","carbon:calendar-tools","carbon:calibrate","carbon:calls","carbon:calls-all","carbon:calls-incoming","carbon:camera","carbon:camera-action","carbon:campsite","carbon:car","carbon:car-front","carbon:carbon","carbon:carbon-accounting","carbon:carbon-for-ibm-dotcom","carbon:carbon-for-ibm-product","carbon:carbon-for-mobile","carbon:carbon-for-salesforce","carbon:carbon-ui-builder","carbon:caret-down","carbon:caret-left","carbon:caret-right","carbon:caret-sort","carbon:caret-sort-down","carbon:caret-sort-up","carbon:caret-up","carbon:carousel-horizontal","carbon:carousel-vertical","carbon:catalog","carbon:catalog-publish","carbon:categories","carbon:category","carbon:category-add","carbon:category-and","carbon:category-new","carbon:category-new-each","carbon:ccx","carbon:cd-archive","carbon:cd-create-archive","carbon:cd-create-exchange","carbon:cda","carbon:cell-tower","carbon:center-circle","carbon:center-square","carbon:center-to-fit","carbon:certificate","carbon:certificate-check","carbon:change-catalog","carbon:character-decimal","carbon:character-fraction","carbon:character-integer","carbon:character-lower-case","carbon:character-negative-number","carbon:character-patterns","carbon:character-sentence-case","carbon:character-upper-case","carbon:character-whole-number","carbon:charging-station","carbon:charging-station-filled","carbon:chart-3d","carbon:chart-area","carbon:chart-area-smooth","carbon:chart-area-stepper","carbon:chart-average","carbon:chart-bar","carbon:chart-bar-floating","carbon:chart-bar-overlay","carbon:chart-bar-stacked","carbon:chart-bar-target","carbon:chart-bubble","carbon:chart-bubble-packed","carbon:chart-bullet","carbon:chart-candlestick","carbon:chart-cluster-bar","carbon:chart-column","carbon:chart-column-floating","carbon:chart-column-target","carbon:chart-combo","carbon:chart-combo-stacked","carbon:chart-custom","carbon:chart-dual-y-axis","carbon:chart-error-bar","carbon:chart-error-bar-alt","carbon:chart-evaluation","carbon:chart-high-low","carbon:chart-histogram","carbon:chart-line","carbon:chart-line-data","carbon:chart-line-smooth","carbon:chart-logistic-regression","carbon:chart-marimekko","carbon:chart-maximum","carbon:chart-median","carbon:chart-minimum","carbon:chart-multi-line","carbon:chart-multitype","carbon:chart-network","carbon:chart-parallel","carbon:chart-pie","carbon:chart-planning-waterfall","carbon:chart-point","carbon:chart-population","carbon:chart-radar","carbon:chart-radial","carbon:chart-relationship","carbon:chart-ring","carbon:chart-river","carbon:chart-rose","carbon:chart-scatter","carbon:chart-spiral","carbon:chart-stacked","carbon:chart-stepper","carbon:chart-sunburst","carbon:chart-t-sne","carbon:chart-treemap","carbon:chart-venn-diagram","carbon:chart-violin-plot","carbon:chart-waterfall","carbon:chart-win-loss","carbon:chat","carbon:chat-bot","carbon:chat-launch","carbon:chat-off","carbon:chat-operational","carbon:checkbox","carbon:checkbox-checked","carbon:checkbox-checked-filled","carbon:checkbox-indeterminate","carbon:checkbox-indeterminate-filled","carbon:checkbox-undeterminate","carbon:checkbox-undeterminate-filled","carbon:checkmark","carbon:checkmark-filled","carbon:checkmark-filled-error","carbon:checkmark-filled-warning","carbon:checkmark-outline","carbon:checkmark-outline-error","carbon:checkmark-outline-warning","carbon:chemistry","carbon:chemistry-reference","carbon:chevron-down","carbon:chevron-down-outline","carbon:chevron-left","carbon:chevron-mini","carbon:chevron-right","carbon:chevron-sort","carbon:chevron-sort-down","carbon:chevron-sort-up","carbon:chevron-up","carbon:chevron-up-outline","carbon:chip","carbon:choices","carbon:choose-item","carbon:choropleth-map","carbon:cics-cmas","carbon:cics-db2-connection","carbon:cics-explorer","carbon:cics-program","carbon:cics-region","carbon:cics-region-alt","carbon:cics-region-routing","carbon:cics-region-target","carbon:cics-sit","carbon:cics-sit-overrides","carbon:cics-system-group","carbon:cics-transaction-server-zos","carbon:cics-wui-region","carbon:cicsplex","carbon:circle-dash","carbon:circle-filled","carbon:circle-measurement","carbon:circle-packing","carbon:circle-solid","carbon:circuit-composer","carbon:classification","carbon:classifier-language","carbon:clean","carbon:close","carbon:close-filled","carbon:close-large","carbon:close-outline","carbon:closed-caption","carbon:closed-caption-alt","carbon:closed-caption-filled","carbon:cloud","carbon:cloud-alerting","carbon:cloud-app","carbon:cloud-auditing","carbon:cloud-ceiling","carbon:cloud-data-ops","carbon:cloud-download","carbon:cloud-foundry-1","carbon:cloud-foundry-2","carbon:cloud-lightning","carbon:cloud-logging","carbon:cloud-monitoring","carbon:cloud-offline","carbon:cloud-rain","carbon:cloud-registry","carbon:cloud-satellite","carbon:cloud-satellite-config","carbon:cloud-satellite-link","carbon:cloud-satellite-services","carbon:cloud-service-management","carbon:cloud-services","carbon:cloud-snow","carbon:cloud-upload","carbon:cloudy","carbon:cobb-angle","carbon:code","carbon:code-hide","carbon:code-reference","carbon:code-signing-service","carbon:cognitive","carbon:collaborate","carbon:collapse-all","carbon:collapse-categories","carbon:color-palette","carbon:color-switch","carbon:column","carbon:column-delete","carbon:column-dependency","carbon:column-insert","carbon:commit","carbon:communication-unified","carbon:compare","carbon:compass","carbon:composer-edit","carbon:concept","carbon:condition-point","carbon:condition-wait-point","carbon:connect","carbon:connect-recursive","carbon:connect-reference","carbon:connect-source","carbon:connect-target","carbon:connection-receive","carbon:connection-send","carbon:connection-signal","carbon:connection-signal-off","carbon:connection-two-way","carbon:construction","carbon:container-registry","carbon:container-services","carbon:container-software","carbon:content-delivery-network","carbon:content-view","carbon:continue","carbon:continue-filled","carbon:continuous-deployment","carbon:continuous-integration","carbon:contour-draw","carbon:contour-edit","carbon:contour-finding","carbon:contrast","carbon:convert-to-cloud","carbon:cookie","carbon:copy","carbon:copy-file","carbon:copy-link","carbon:corn","carbon:corner","carbon:coronavirus","carbon:cost","carbon:cost-total","carbon:cough","carbon:course","carbon:covariate","carbon:credentials","carbon:crop","carbon:crop-growth","carbon:crop-health","carbon:cross-reference","carbon:cross-tab","carbon:crossroads","carbon:crowd-report","carbon:crowd-report-filled","carbon:csv","carbon:cu1","carbon:cu3","carbon:cube","carbon:cube-view","carbon:currency","carbon:currency-baht","carbon:currency-dollar","carbon:currency-euro","carbon:currency-lira","carbon:currency-pound","carbon:currency-ruble","carbon:currency-rupee","carbon:currency-shekel","carbon:currency-won","carbon:currency-yen","carbon:cursor-1","carbon:cursor-2","carbon:customer","carbon:customer-service","carbon:cut","carbon:cut-in-half","carbon:cut-out","carbon:cy","carbon:cyclist","carbon:cz","carbon:dashboard","carbon:dashboard-reference","carbon:data-1","carbon:data-2","carbon:data-accessor","carbon:data-analytics","carbon:data-backup","carbon:data-base","carbon:data-base-alt","carbon:data-bin","carbon:data-blob","carbon:data-categorical","carbon:data-center","carbon:data-check","carbon:data-class","carbon:data-collection","carbon:data-connected","carbon:data-definition","carbon:data-diode","carbon:data-enrichment","carbon:data-enrichment-add","carbon:data-error","carbon:data-format","carbon:data-player","carbon:data-quality-definition","carbon:data-reference","carbon:data-refinery","carbon:data-refinery-reference","carbon:data-regular","carbon:data-set","carbon:data-share","carbon:data-structured","carbon:data-table","carbon:data-table-reference","carbon:data-unreal","carbon:data-unstructured","carbon:data-view","carbon:data-view-alt","carbon:data-vis-1","carbon:data-vis-2","carbon:data-vis-3","carbon:data-vis-4","carbon:data-volume","carbon:data-volume-alt","carbon:database-datastax","carbon:database-elastic","carbon:database-enterprise-db2","carbon:database-enterprisedb","carbon:database-etcd","carbon:database-messaging","carbon:database-mongodb","carbon:database-postgresql","carbon:database-rabbit","carbon:database-redis","carbon:datastore","carbon:db2-buffer-pool","carbon:db2-data-sharing-group","carbon:db2-database","carbon:debug","carbon:decision-tree","carbon:delete","carbon:delivery","carbon:delivery-add","carbon:delivery-parcel","carbon:delivery-truck","carbon:demo","carbon:denominate","carbon:departure","carbon:deploy","carbon:deploy-rules","carbon:deployment-pattern","carbon:deployment-policy","carbon:deployment-unit-data","carbon:deployment-unit-execution","carbon:deployment-unit-installation","carbon:deployment-unit-presentation","carbon:deployment-unit-technical-data","carbon:deployment-unit-technical-execution","carbon:deployment-unit-technical-installation","carbon:deployment-unit-technical-presentation","carbon:desk-adjustable","carbon:development","carbon:devices","carbon:devices-apps","carbon:dew-point","carbon:dew-point-filled","carbon:diagram","carbon:diagram-reference","carbon:dicom-6000","carbon:dicom-overlay","carbon:direct-link","carbon:direction-bear-right-01","carbon:direction-bear-right-01-filled","carbon:direction-bear-right-02","carbon:direction-bear-right-02-filled","carbon:direction-curve","carbon:direction-curve-filled","carbon:direction-fork","carbon:direction-fork-filled","carbon:direction-loop-left","carbon:direction-loop-left-filled","carbon:direction-loop-right","carbon:direction-loop-right-filled","carbon:direction-merge","carbon:direction-merge-filled","carbon:direction-right-01","carbon:direction-right-01-filled","carbon:direction-right-02","carbon:direction-right-02-filled","carbon:direction-rotary-first-right","carbon:direction-rotary-first-right-filled","carbon:direction-rotary-right","carbon:direction-rotary-right-filled","carbon:direction-rotary-straight","carbon:direction-rotary-straight-filled","carbon:direction-sharp-turn","carbon:direction-sharp-turn-filled","carbon:direction-straight","carbon:direction-straight-filled","carbon:direction-straight-right","carbon:direction-straight-right-filled","carbon:direction-u-turn","carbon:direction-u-turn-filled","carbon:directory-domain","carbon:distribute-horizontal-center","carbon:distribute-horizontal-left","carbon:distribute-horizontal-right","carbon:distribute-vertical-bottom","carbon:distribute-vertical-center","carbon:distribute-vertical-top","carbon:dna","carbon:dns-services","carbon:doc","carbon:document","carbon:document-add","carbon:document-attachment","carbon:document-audio","carbon:document-blank","carbon:document-download","carbon:document-epdf","carbon:document-export","carbon:document-horizontal","carbon:document-import","carbon:document-multiple-01","carbon:document-multiple-02","carbon:document-pdf","carbon:document-preliminary","carbon:document-protected","carbon:document-security","carbon:document-sentiment","carbon:document-signed","carbon:document-sketch","carbon:document-subtract","carbon:document-tasks","carbon:document-unknown","carbon:document-unprotected","carbon:document-vertical","carbon:document-video","carbon:document-view","carbon:document-word-processor","carbon:document-word-processor-reference","carbon:dog-walker","carbon:dot-mark","carbon:double-integer","carbon:down-to-bottom","carbon:download","carbon:download-study","carbon:downstream","carbon:drag-horizontal","carbon:drag-vertical","carbon:draggable","carbon:draw","carbon:drill-back","carbon:drill-down","carbon:drill-through","carbon:drink-01","carbon:drink-02","carbon:driver-analysis","carbon:drone","carbon:drone-delivery","carbon:drone-front","carbon:drone-video","carbon:drop-photo","carbon:drop-photo-filled","carbon:drought","carbon:dvr","carbon:earth","carbon:earth-americas","carbon:earth-americas-filled","carbon:earth-europe-africa","carbon:earth-europe-africa-filled","carbon:earth-filled","carbon:earth-southeast-asia","carbon:earth-southeast-asia-filled","carbon:earthquake","carbon:edge-cluster","carbon:edge-device","carbon:edge-enhancement","carbon:edge-enhancement-01","carbon:edge-enhancement-02","carbon:edge-enhancement-03","carbon:edge-node","carbon:edge-node-alt","carbon:edge-service","carbon:edit","carbon:edit-filter","carbon:edit-off","carbon:edt-loop","carbon:education","carbon:email","carbon:email-new","carbon:encryption","carbon:energy-renewable","carbon:enterprise","carbon:equal-approximately","carbon:equalizer","carbon:erase","carbon:erase-3d","carbon:error","carbon:error-filled","carbon:error-outline","carbon:event","carbon:event-change","carbon:event-incident","carbon:event-schedule","carbon:event-warning","carbon:events","carbon:events-alt","carbon:exam-mode","carbon:executable-program","carbon:exit","carbon:expand-all","carbon:expand-categories","carbon:explore","carbon:export","carbon:eyedropper","carbon:face-activated","carbon:face-activated-add","carbon:face-activated-filled","carbon:face-add","carbon:face-cool","carbon:face-dissatisfied","carbon:face-dissatisfied-filled","carbon:face-dizzy","carbon:face-dizzy-filled","carbon:face-mask","carbon:face-neutral","carbon:face-neutral-filled","carbon:face-pending","carbon:face-pending-filled","carbon:face-satisfied","carbon:face-satisfied-filled","carbon:face-wink","carbon:face-wink-filled","carbon:factor","carbon:fade","carbon:favorite","carbon:favorite-filled","carbon:favorite-half","carbon:fetch-upload","carbon:fetch-upload-cloud","carbon:file-storage","carbon:filter","carbon:filter-edit","carbon:filter-remove","carbon:filter-reset","carbon:finance","carbon:fingerprint-recognition","carbon:fire","carbon:firewall","carbon:firewall-classic","carbon:fish","carbon:fish-multiple","carbon:fit-to-height","carbon:fit-to-screen","carbon:fit-to-width","carbon:flag","carbon:flag-filled","carbon:flagging-taxi","carbon:flash","carbon:flash-filled","carbon:flash-off","carbon:flash-off-filled","carbon:flight-international","carbon:flight-roster","carbon:flight-schedule","carbon:floating-ip","carbon:flood","carbon:flood-warning","carbon:floorplan","carbon:flow","carbon:flow-connection","carbon:flow-data","carbon:flow-logs-vpc","carbon:flow-modeler","carbon:flow-modeler-reference","carbon:flow-stream","carbon:flow-stream-reference","carbon:fog","carbon:folder","carbon:folder-add","carbon:folder-details","carbon:folder-details-reference","carbon:folder-move-to","carbon:folder-off","carbon:folder-open","carbon:folder-parent","carbon:folder-shared","carbon:folders","carbon:forecast-hail","carbon:forecast-hail-30","carbon:forecast-lightning","carbon:forecast-lightning-30","carbon:fork","carbon:forum","carbon:forward-10","carbon:forward-30","carbon:forward-5","carbon:foundation-model","carbon:fragile","carbon:friendship","carbon:fruit-bowl","carbon:function","carbon:function-math","carbon:fusion-blender","carbon:game-console","carbon:game-wireless","carbon:gamification","carbon:gas-station","carbon:gas-station-filled","carbon:gateway","carbon:gateway-api","carbon:gateway-mail","carbon:gateway-public","carbon:gateway-security","carbon:gateway-user-access","carbon:gateway-vpn","carbon:gender-female","carbon:gender-male","carbon:generate-pdf","carbon:gif","carbon:gift","carbon:global-loan-and-trial","carbon:globe","carbon:gradient","carbon:graphical-data-flow","carbon:grid","carbon:group","carbon:group-access","carbon:group-account","carbon:group-objects","carbon:group-objects-new","carbon:group-objects-save","carbon:group-presentation","carbon:group-resource","carbon:group-security","carbon:growth","carbon:gui","carbon:gui-management","carbon:h","carbon:hail","carbon:hanging-protocol","carbon:harbor","carbon:hardware-security-module","carbon:hashtag","carbon:haze","carbon:haze-night","carbon:hd","carbon:hd-filled","carbon:hdr","carbon:headphones","carbon:headset","carbon:health-cross","carbon:hearing","carbon:heat-map","carbon:heat-map-02","carbon:heat-map-03","carbon:heat-map-stocks","carbon:helicopter","carbon:help","carbon:help-desk","carbon:help-filled","carbon:hinton-plot","carbon:hl7-attributes","carbon:hole-filling","carbon:hole-filling-cursor","carbon:home","carbon:horizontal-view","carbon:hospital","carbon:hospital-bed","carbon:hotel","carbon:hourglass","carbon:html","carbon:html-reference","carbon:http","carbon:humidity","carbon:humidity-alt","carbon:hurricane","carbon:hybrid-networking","carbon:hybrid-networking-alt","carbon:ibm-ai-on-z","carbon:ibm-aiops-insights","carbon:ibm-bluepay","carbon:ibm-cloud","carbon:ibm-cloud-app-id","carbon:ibm-cloud-bare-metal-server","carbon:ibm-cloud-bare-metal-servers-vpc","carbon:ibm-cloud-citrix-daas","carbon:ibm-cloud-continuous-delivery","carbon:ibm-cloud-dedicated-host","carbon:ibm-cloud-direct-link-1-connect","carbon:ibm-cloud-direct-link-1-dedicated","carbon:ibm-cloud-direct-link-1-dedicated-hosting","carbon:ibm-cloud-direct-link-1-exchange","carbon:ibm-cloud-direct-link-2-connect","carbon:ibm-cloud-direct-link-2-dedicated","carbon:ibm-cloud-direct-link-2-dedicated-hosting","carbon:ibm-cloud-event-notification","carbon:ibm-cloud-event-streams","carbon:ibm-cloud-for-education","carbon:ibm-cloud-hpc","carbon:ibm-cloud-hsm","carbon:ibm-cloud-hyper-protect-crypto-services","carbon:ibm-cloud-hyper-protect-dbaas","carbon:ibm-cloud-hyper-protect-vs","carbon:ibm-cloud-internet-services","carbon:ibm-cloud-ipsec-vpn","carbon:ibm-cloud-key-protect","carbon:ibm-cloud-kubernetes-service","carbon:ibm-cloud-logging","carbon:ibm-cloud-mass-data-migration","carbon:ibm-cloud-pak-applications","carbon:ibm-cloud-pak-business-automation","carbon:ibm-cloud-pak-data","carbon:ibm-cloud-pak-integration","carbon:ibm-cloud-pak-manta-automated-data-lineage","carbon:ibm-cloud-pak-multicloud-mgmt","carbon:ibm-cloud-pak-netezza","carbon:ibm-cloud-pak-network-automation","carbon:ibm-cloud-pak-security","carbon:ibm-cloud-pak-system","carbon:ibm-cloud-pak-watson-aiops","carbon:ibm-cloud-pal","carbon:ibm-cloud-privileged-access-gateway","carbon:ibm-cloud-projects","carbon:ibm-cloud-resiliency","carbon:ibm-cloud-secrets-manager","carbon:ibm-cloud-security-compliance-center","carbon:ibm-cloud-security-compliance-center-workload-protection","carbon:ibm-cloud-subnets","carbon:ibm-cloud-sysdig-secure","carbon:ibm-cloud-transit-gateway","carbon:ibm-cloud-virtual-server-classic","carbon:ibm-cloud-virtual-server-vpc","carbon:ibm-cloud-vpc","carbon:ibm-cloud-vpc-endpoints","carbon:ibm-cloudant","carbon:ibm-content-services","carbon:ibm-data-product-exchange","carbon:ibm-data-replication","carbon:ibm-datastage","carbon:ibm-db2","carbon:ibm-db2-alt","carbon:ibm-db2-warehouse","carbon:ibm-dynamic-route-server","carbon:ibm-engineering-systems-design-rhapsody-model-manager","carbon:ibm-engineering-systems-design-rhapsody-sn1","carbon:ibm-engineering-systems-design-rhapsody-sn2","carbon:ibm-event-automation","carbon:ibm-event-endpoint-mgmt","carbon:ibm-event-processing","carbon:ibm-event-streams","carbon:ibm-ibv","carbon:ibm-instana","carbon:ibm-match-360","carbon:ibm-mq","carbon:ibm-open-enterprise-languages","carbon:ibm-openshift-container-platform-on-vpc-for-regulated-industries","carbon:ibm-power-vs","carbon:ibm-power-vs-private-cloud","carbon:ibm-power-with-vpc","carbon:ibm-private-path-services","carbon:ibm-process-mining","carbon:ibm-saas-console","carbon:ibm-sap-on-power","carbon:ibm-secure-infrastructure-on-vpc-for-regulated-industries","carbon:ibm-security","carbon:ibm-security-services","carbon:ibm-telehealth","carbon:ibm-tenet","carbon:ibm-toolchain","carbon:ibm-turbonomic","carbon:ibm-vpn-for-vpc","carbon:ibm-vsi-on-vpc-for-regulated-industries","carbon:ibm-watson-assistant","carbon:ibm-watson-discovery","carbon:ibm-watson-knowledge-catalog","carbon:ibm-watson-knowledge-studio","carbon:ibm-watson-language-translator","carbon:ibm-watson-machine-learning","carbon:ibm-watson-natural-language-classifier","carbon:ibm-watson-natural-language-understanding","carbon:ibm-watson-openscale","carbon:ibm-watson-orders","carbon:ibm-watson-query","carbon:ibm-watson-speech-to-text","carbon:ibm-watson-studio","carbon:ibm-watson-text-to-speech","carbon:ibm-watson-tone-analyzer","carbon:ibm-watsonx-assistant","carbon:ibm-watsonx-code-assistant","carbon:ibm-watsonx-code-assistant-for-z","carbon:ibm-watsonx-code-assistant-for-z-refactor","carbon:ibm-watsonx-orchestrate","carbon:ibm-wazi-deploy","carbon:ibm-z-cloud-mod-stack","carbon:ibm-z-cloud-provisioning","carbon:ibm-z-environments-dev-sec-ops","carbon:ibm-z-os","carbon:ibm-z-os-ai-control-interface","carbon:ibm-z-os-containers","carbon:ibm-z-os-package-manager","carbon:ibm-z-processor-capacity-reference","carbon:ica-2d","carbon:ice-accretion","carbon:ice-vision","carbon:id","carbon:id-management","carbon:idea","carbon:identification","carbon:image","carbon:image-copy","carbon:image-medical","carbon:image-reference","carbon:image-search","carbon:image-search-alt","carbon:image-service","carbon:import-export","carbon:improve-relevance","carbon:in-progress","carbon:in-progress-error","carbon:in-progress-warning","carbon:incomplete","carbon:incomplete-cancel","carbon:incomplete-error","carbon:incomplete-warning","carbon:increase-level","carbon:industry","carbon:infinity","carbon:infinity-symbol","carbon:information","carbon:information-disabled","carbon:information-filled","carbon:information-square","carbon:information-square-filled","carbon:infrastructure-classic","carbon:insert","carbon:insert-page","carbon:insert-syntax","carbon:inspection","carbon:instance-bx","carbon:instance-classic","carbon:instance-cx","carbon:instance-mx","carbon:instance-virtual","carbon:integration","carbon:intent-request-active","carbon:intent-request-create","carbon:intent-request-heal","carbon:intent-request-inactive","carbon:intent-request-scale-in","carbon:intent-request-scale-out","carbon:intent-request-uninstall","carbon:intent-request-upgrade","carbon:interactions","carbon:interactive-segmentation-cursor","carbon:intersect","carbon:intrusion-prevention","carbon:inventory-management","carbon:iot-connect","carbon:iot-platform","carbon:ip","carbon:iso","carbon:iso-filled","carbon:iso-outline","carbon:join-full","carbon:join-inner","carbon:join-left","carbon:join-outer","carbon:join-right","carbon:jpg","carbon:js-error","carbon:json","carbon:json-reference","carbon:jump-link","carbon:keep-dry","carbon:keyboard","carbon:keyboard-off","carbon:kubernetes","carbon:kubernetes-ip-address","carbon:kubernetes-pod","carbon:label","carbon:language","carbon:laptop","carbon:lasso","carbon:lasso-polygon","carbon:launch","carbon:launch-study-1","carbon:launch-study-2","carbon:launch-study-3","carbon:layers","carbon:legend","carbon:letter-aa","carbon:letter-aa-large","carbon:letter-bb","carbon:letter-cc","carbon:letter-dd","carbon:letter-ee","carbon:letter-ff","carbon:letter-gg","carbon:letter-hh","carbon:letter-ii","carbon:letter-jj","carbon:letter-kk","carbon:letter-ll","carbon:letter-mm","carbon:letter-nn","carbon:letter-oo","carbon:letter-pp","carbon:letter-qq","carbon:letter-rr","carbon:letter-ss","carbon:letter-tt","carbon:letter-uu","carbon:letter-vv","carbon:letter-ww","carbon:letter-xx","carbon:letter-yy","carbon:letter-zz","carbon:license","carbon:license-draft","carbon:license-global","carbon:license-maintenance","carbon:license-maintenance-draft","carbon:license-third-party","carbon:license-third-party-draft","carbon:lifesaver","carbon:light","carbon:light-filled","carbon:lightning","carbon:link","carbon:linux","carbon:linux-alt","carbon:list","carbon:list-boxes","carbon:list-bulleted","carbon:list-checked","carbon:list-checked-mirror","carbon:list-dropdown","carbon:list-numbered","carbon:list-numbered-mirror","carbon:load-balancer-application","carbon:load-balancer-classic","carbon:load-balancer-global","carbon:load-balancer-listener","carbon:load-balancer-local","carbon:load-balancer-network","carbon:load-balancer-pool","carbon:load-balancer-vpc","carbon:location","carbon:location-company","carbon:location-company-filled","carbon:location-current","carbon:location-filled","carbon:location-hazard","carbon:location-hazard-filled","carbon:location-heart","carbon:location-heart-filled","carbon:location-person","carbon:location-person-filled","carbon:location-save","carbon:location-star","carbon:location-star-filled","carbon:locked","carbon:logical-partition","carbon:login","carbon:logo-angular","carbon:logo-ansible-community","carbon:logo-delicious","carbon:logo-digg","carbon:logo-discord","carbon:logo-facebook","carbon:logo-figma","carbon:logo-flickr","carbon:logo-github","carbon:logo-gitlab","carbon:logo-glassdoor","carbon:logo-google","carbon:logo-instagram","carbon:logo-invision","carbon:logo-jupyter","carbon:logo-keybase","carbon:logo-kubernetes","carbon:logo-linkedin","carbon:logo-livestream","carbon:logo-mastodon","carbon:logo-medium","carbon:logo-npm","carbon:logo-openshift","carbon:logo-pinterest","carbon:logo-python","carbon:logo-quora","carbon:logo-r-script","carbon:logo-react","carbon:logo-red-hat-ansible","carbon:logo-sketch","carbon:logo-skype","carbon:logo-slack","carbon:logo-snapchat","carbon:logo-stumbleupon","carbon:logo-svelte","carbon:logo-tumblr","carbon:logo-twitter","carbon:logo-vmware","carbon:logo-vmware-alt","carbon:logo-vue","carbon:logo-wechat","carbon:logo-x","carbon:logo-xing","carbon:logo-yelp","carbon:logo-youtube","carbon:logout","carbon:loop","carbon:mac","carbon:mac-command","carbon:mac-option","carbon:mac-shift","carbon:machine-learning","carbon:machine-learning-model","carbon:magic-wand","carbon:magic-wand-filled","carbon:magnify","carbon:mail-all","carbon:mail-reply","carbon:mammogram","carbon:mammogram-stacked","carbon:manage-protection","carbon:managed-solutions","carbon:map","carbon:map-boundary","carbon:map-boundary-vegetation","carbon:map-center","carbon:map-identify","carbon:marine-warning","carbon:math-curve","carbon:matrix","carbon:maximize","carbon:media-cast","carbon:media-library","carbon:media-library-filled","carbon:medication","carbon:medication-alert","carbon:medication-reminder","carbon:menu","carbon:message-queue","carbon:meter","carbon:meter-alt","carbon:microphone","carbon:microphone-filled","carbon:microphone-off","carbon:microphone-off-filled","carbon:microscope","carbon:microservices-1","carbon:microservices-2","carbon:migrate","carbon:migrate-alt","carbon:milestone","carbon:military-camp","carbon:minimize","carbon:misuse","carbon:misuse-alt","carbon:misuse-outline","carbon:mixed-rain-hail","carbon:mobile","carbon:mobile-add","carbon:mobile-audio","carbon:mobile-check","carbon:mobile-crash","carbon:mobile-download","carbon:mobile-event","carbon:mobile-landscape","carbon:mobile-request","carbon:mobile-session","carbon:mobile-view","carbon:mobile-view-orientation","carbon:mobility-services","carbon:model","carbon:model-alt","carbon:model-builder","carbon:model-builder-reference","carbon:model-reference","carbon:model-tuned","carbon:money","carbon:monster","carbon:monument","carbon:moon","carbon:moonrise","carbon:moonset","carbon:mostly-cloudy","carbon:mostly-cloudy-night","carbon:mountain","carbon:mov","carbon:move","carbon:movement","carbon:mp3","carbon:mp4","carbon:mpeg","carbon:mpg2","carbon:music","carbon:music-add","carbon:music-remove","carbon:mysql","carbon:name-space","carbon:navaid-civil","carbon:navaid-dme","carbon:navaid-helipad","carbon:navaid-military","carbon:navaid-military-civil","carbon:navaid-ndb","carbon:navaid-ndb-dme","carbon:navaid-private","carbon:navaid-seaplane","carbon:navaid-tacan","carbon:navaid-vhfor","carbon:navaid-vor","carbon:navaid-vordme","carbon:navaid-vortac","carbon:need","carbon:network-1","carbon:network-2","carbon:network-3","carbon:network-3-reference","carbon:network-4","carbon:network-4-reference","carbon:network-admin-control","carbon:network-enterprise","carbon:network-interface","carbon:network-overlay","carbon:network-public","carbon:new-tab","carbon:next-filled","carbon:next-outline","carbon:no-image","carbon:no-ticket","carbon:nominal","carbon:nominate","carbon:non-certified","carbon:noodle-bowl","carbon:not-available","carbon:not-sent","carbon:not-sent-filled","carbon:notebook","carbon:notebook-reference","carbon:notification","carbon:notification-filled","carbon:notification-new","carbon:notification-off","carbon:notification-off-filled","carbon:number-0","carbon:number-1","carbon:number-2","carbon:number-3","carbon:number-4","carbon:number-5","carbon:number-6","carbon:number-7","carbon:number-8","carbon:number-9","carbon:number-small-0","carbon:number-small-1","carbon:number-small-2","carbon:number-small-3","carbon:number-small-4","carbon:number-small-5","carbon:number-small-6","carbon:number-small-7","carbon:number-small-8","carbon:number-small-9","carbon:object-storage","carbon:object-storage-alt","carbon:observed-hail","carbon:observed-lightning","carbon:omega","carbon:opacity","carbon:open-panel-bottom","carbon:open-panel-filled-bottom","carbon:open-panel-filled-left","carbon:open-panel-filled-right","carbon:open-panel-filled-top","carbon:open-panel-left","carbon:open-panel-right","carbon:open-panel-top","carbon:operation","carbon:operation-gauge","carbon:operation-if","carbon:operations-field","carbon:operations-record","carbon:order-details","carbon:ordinal","carbon:outage","carbon:outlook-severe","carbon:overflow-menu-horizontal","carbon:overflow-menu-vertical","carbon:overlay","carbon:package","carbon:package-text-analysis","carbon:page-break","carbon:page-first","carbon:page-last","carbon:page-number","carbon:page-scroll","carbon:paint-brush","carbon:paint-brush-alt","carbon:palm-tree","carbon:pan-horizontal","carbon:pan-vertical","carbon:panel-expansion","carbon:paragraph","carbon:parameter","carbon:parent-child","carbon:partition-auto","carbon:partition-collection","carbon:partition-repartition","carbon:partition-same","carbon:partition-specific","carbon:partly-cloudy","carbon:partly-cloudy-night","carbon:partnership","carbon:passenger-drinks","carbon:passenger-plus","carbon:password","carbon:paste","carbon:pause","carbon:pause-filled","carbon:pause-future","carbon:pause-outline","carbon:pause-outline-filled","carbon:pause-past","carbon:pcn-e-node","carbon:pcn-military","carbon:pcn-p-node","carbon:pcn-z-node","carbon:pdf","carbon:pdf-reference","carbon:pedestrian","carbon:pedestrian-child","carbon:pedestrian-family","carbon:pen","carbon:pen-fountain","carbon:pending","carbon:pending-filled","carbon:percentage","carbon:percentage-filled","carbon:person","carbon:person-favorite","carbon:pest","carbon:pet-image-b","carbon:pet-image-o","carbon:phone","carbon:phone-application","carbon:phone-block","carbon:phone-block-filled","carbon:phone-filled","carbon:phone-incoming","carbon:phone-incoming-filled","carbon:phone-ip","carbon:phone-off","carbon:phone-off-filled","carbon:phone-outgoing","carbon:phone-outgoing-filled","carbon:phone-settings","carbon:phone-voice","carbon:phone-voice-filled","carbon:phrase-sentiment","carbon:picnic-area","carbon:piggy-bank","carbon:piggy-bank-slot","carbon:pills","carbon:pills-add","carbon:pills-subtract","carbon:pin","carbon:pin-filled","carbon:plan","carbon:plane","carbon:plane-private","carbon:plane-sea","carbon:platforms","carbon:play","carbon:play-filled","carbon:play-filled-alt","carbon:play-outline","carbon:play-outline-filled","carbon:playlist","carbon:plug","carbon:plug-filled","carbon:png","carbon:point-of-presence","carbon:pointer-text","carbon:police","carbon:policy","carbon:popup","carbon:port-input","carbon:port-output","carbon:portfolio","carbon:power","carbon:ppt","carbon:presentation-file","carbon:pressure","carbon:pressure-filled","carbon:previous-filled","carbon:previous-outline","carbon:printer","carbon:process","carbon:process-automate","carbon:product","carbon:progress-bar","carbon:progress-bar-round","carbon:promote","carbon:prompt-session","carbon:prompt-template","carbon:property-relationship","carbon:purchase","carbon:qc-launch","carbon:qq-plot","carbon:qr-code","carbon:quadrant-plot","carbon:query","carbon:query-queue","carbon:queued","carbon:quotes","carbon:radar","carbon:radar-enhanced","carbon:radar-weather","carbon:radio","carbon:radio-button","carbon:radio-button-checked","carbon:radio-combat","carbon:radio-push-to-talk","carbon:rain","carbon:rain-drizzle","carbon:rain-drop","carbon:rain-heavy","carbon:rain-scattered","carbon:rain-scattered-night","carbon:raw","carbon:receipt","carbon:recently-viewed","carbon:recommend","carbon:recording","carbon:recording-filled","carbon:recording-filled-alt","carbon:recycle","carbon:redo","carbon:ref-evapotranspiration","carbon:reference-architecture","carbon:reflect-horizontal","carbon:reflect-vertical","carbon:region-analysis-area","carbon:region-analysis-volume","carbon:registration","carbon:reminder","carbon:reminder-medical","carbon:renew","carbon:repeat","carbon:repeat-one","carbon:replicate","carbon:reply","carbon:reply-all","carbon:repo-artifact","carbon:repo-source-code","carbon:report","carbon:report-data","carbon:request-quote","carbon:research-bloch-sphere","carbon:research-hinton-plot","carbon:research-matrix","carbon:reset","carbon:reset-alt","carbon:restart","carbon:restaurant","carbon:restaurant-fine","carbon:result","carbon:result-draft","carbon:result-new","carbon:result-old","carbon:retry-failed","carbon:return","carbon:review","carbon:rewind-10","carbon:rewind-30","carbon:rewind-5","carbon:road","carbon:road-weather","carbon:roadmap","carbon:rocket","carbon:rotate","carbon:rotate-180","carbon:rotate-360","carbon:rotate-clockwise","carbon:rotate-clockwise-alt","carbon:rotate-clockwise-alt-filled","carbon:rotate-clockwise-filled","carbon:rotate-counterclockwise","carbon:rotate-counterclockwise-alt","carbon:rotate-counterclockwise-alt-filled","carbon:rotate-counterclockwise-filled","carbon:router","carbon:router-voice","carbon:router-wifi","carbon:row","carbon:row-collapse","carbon:row-delete","carbon:row-expand","carbon:row-insert","carbon:rss","carbon:rule","carbon:rule-cancelled","carbon:rule-data-quality","carbon:rule-draft","carbon:rule-filled","carbon:rule-locked","carbon:rule-partial","carbon:rule-test","carbon:ruler","carbon:ruler-alt","carbon:run","carbon:run-mirror","carbon:running","carbon:s","carbon:s-alt","carbon:sailboat-coastal","carbon:sailboat-offshore","carbon:sales-ops","carbon:sankey-diagram","carbon:sankey-diagram-alt","carbon:satellite","carbon:satellite-radar","carbon:satellite-weather","carbon:save","carbon:save-annotation","carbon:save-image","carbon:save-model","carbon:save-series","carbon:scale","carbon:scales","carbon:scales-tipped","carbon:scalpel","carbon:scalpel-cursor","carbon:scalpel-lasso","carbon:scalpel-select","carbon:scan","carbon:scan-alt","carbon:scan-disabled","carbon:scatter-matrix","carbon:schematics","carbon:scis-control-tower","carbon:scis-transparent-supply","carbon:scooter","carbon:scooter-front","carbon:screen","carbon:screen-map","carbon:screen-map-set","carbon:screen-off","carbon:script","carbon:script-reference","carbon:sdk","carbon:search","carbon:search-advanced","carbon:search-locate","carbon:search-locate-mirror","carbon:security","carbon:security-services","carbon:select-01","carbon:select-02","carbon:select-window","carbon:send","carbon:send-alt","carbon:send-alt-filled","carbon:send-backward","carbon:send-filled","carbon:send-to-back","carbon:server-dns","carbon:server-proxy","carbon:server-time","carbon:service-desk","carbon:service-id","carbon:service-levels","carbon:session-border-control","carbon:settings","carbon:settings-adjust","carbon:settings-check","carbon:settings-edit","carbon:settings-services","carbon:settings-view","carbon:shape-except","carbon:shape-exclude","carbon:shape-intersect","carbon:shape-join","carbon:shape-unite","carbon:share","carbon:share-knowledge","carbon:shopping-bag","carbon:shopping-cart","carbon:shopping-cart-arrow-down","carbon:shopping-cart-arrow-up","carbon:shopping-cart-clear","carbon:shopping-cart-error","carbon:shopping-cart-minus","carbon:shopping-cart-plus","carbon:shopping-catalog","carbon:show-data-cards","carbon:shrink-screen","carbon:shrink-screen-filled","carbon:shuffle","carbon:shuttle","carbon:side-panel-close","carbon:side-panel-close-filled","carbon:side-panel-open","carbon:side-panel-open-filled","carbon:sight","carbon:sigma","carbon:signal-strength","carbon:sim-card","carbon:skill-level","carbon:skill-level-advanced","carbon:skill-level-basic","carbon:skill-level-intermediate","carbon:skip-back","carbon:skip-back-filled","carbon:skip-back-outline","carbon:skip-back-outline-filled","carbon:skip-back-outline-solid","carbon:skip-back-solid-filled","carbon:skip-forward","carbon:skip-forward-filled","carbon:skip-forward-outline","carbon:skip-forward-outline-filled","carbon:skip-forward-outline-solid","carbon:skip-forward-solid-filled","carbon:sleet","carbon:slisor","carbon:slm","carbon:smell","carbon:smoke","carbon:smoothing","carbon:smoothing-cursor","carbon:snooze","carbon:snow","carbon:snow-blizzard","carbon:snow-density","carbon:snow-heavy","carbon:snow-scattered","carbon:snow-scattered-night","carbon:snowflake","carbon:soccer","carbon:software-resource","carbon:software-resource-cluster","carbon:software-resource-resource","carbon:soil-moisture","carbon:soil-moisture-field","carbon:soil-moisture-global","carbon:soil-temperature","carbon:soil-temperature-field","carbon:soil-temperature-global","carbon:solar-panel","carbon:sort-ascending","carbon:sort-descending","carbon:sort-remove","carbon:spell-check","carbon:spine-label","carbon:split","carbon:split-discard","carbon:split-screen","carbon:spray-paint","carbon:sprout","carbon:sql","carbon:stack-limitation","carbon:stacked-move","carbon:stacked-scrolling-1","carbon:stacked-scrolling-2","carbon:stamp","carbon:star","carbon:star-filled","carbon:star-half","carbon:star-review","carbon:status-acknowledge","carbon:status-change","carbon:status-partial-fail","carbon:status-resolved","carbon:stay-inside","carbon:stem-leaf-plot","carbon:stethoscope","carbon:stop","carbon:stop-filled","carbon:stop-filled-alt","carbon:stop-outline","carbon:stop-outline-filled","carbon:stop-sign","carbon:stop-sign-filled","carbon:storage-pool","carbon:storage-request","carbon:store","carbon:storm-tracker","carbon:strawberry","carbon:stress-breath-editor","carbon:string-integer","carbon:string-text","carbon:study-next","carbon:study-previous","carbon:study-read","carbon:study-skip","carbon:study-transfer","carbon:study-unread","carbon:study-view","carbon:sub-volume","carbon:subdirectory","carbon:subflow","carbon:subflow-local","carbon:subnet-acl-rules","carbon:subtract","carbon:subtract-alt","carbon:subtract-filled","carbon:subtract-large","carbon:summary-kpi","carbon:summary-kpi-mirror","carbon:sun","carbon:sunny","carbon:sunrise","carbon:sunset","carbon:support-vector-machine","carbon:sustainability","carbon:svg","carbon:swim","carbon:switch-layer-2","carbon:switch-layer-3","carbon:switcher","carbon:sys-provision","carbon:t","carbon:t-alt","carbon:table","carbon:table-alias","carbon:table-built","carbon:table-of-contents","carbon:table-shortcut","carbon:table-split","carbon:tablet","carbon:tablet-landscape","carbon:tag","carbon:tag-edit","carbon:tag-export","carbon:tag-group","carbon:tag-import","carbon:tag-none","carbon:tank","carbon:task","carbon:task-add","carbon:task-approved","carbon:task-asset-view","carbon:task-complete","carbon:task-location","carbon:task-remove","carbon:task-settings","carbon:task-star","carbon:task-tools","carbon:task-view","carbon:taste","carbon:taxi","carbon:tcp-ip-service","carbon:temperature","carbon:temperature-celsius","carbon:temperature-celsius-alt","carbon:temperature-fahrenheit","carbon:temperature-fahrenheit-alt","carbon:temperature-feels-like","carbon:temperature-frigid","carbon:temperature-hot","carbon:temperature-inversion","carbon:temperature-max","carbon:temperature-min","carbon:temperature-water","carbon:template","carbon:tennis","carbon:tennis-ball","carbon:term","carbon:terminal","carbon:terminal-3270","carbon:test-tool","carbon:text-align-center","carbon:text-align-justify","carbon:text-align-left","carbon:text-align-mixed","carbon:text-align-right","carbon:text-all-caps","carbon:text-annotation-toggle","carbon:text-bold","carbon:text-clear-format","carbon:text-color","carbon:text-creation","carbon:text-fill","carbon:text-font","carbon:text-footnote","carbon:text-highlight","carbon:text-indent","carbon:text-indent-less","carbon:text-indent-more","carbon:text-italic","carbon:text-kerning","carbon:text-leading","carbon:text-line-spacing","carbon:text-link","carbon:text-link-analysis","carbon:text-long-paragraph","carbon:text-mining","carbon:text-mining-applier","carbon:text-new-line","carbon:text-scale","carbon:text-selection","carbon:text-short-paragraph","carbon:text-small-caps","carbon:text-strikethrough","carbon:text-subscript","carbon:text-superscript","carbon:text-tracking","carbon:text-underline","carbon:text-vertical-alignment","carbon:text-wrap","carbon:theater","carbon:this-side-up","carbon:threshold","carbon:thumbnail-1","carbon:thumbnail-2","carbon:thumbnail-preview","carbon:thumbs-down","carbon:thumbs-down-filled","carbon:thumbs-up","carbon:thumbs-up-filled","carbon:thunderstorm","carbon:thunderstorm-scattered","carbon:thunderstorm-scattered-night","carbon:thunderstorm-severe","carbon:thunderstorm-strong","carbon:ticket","carbon:tides","carbon:tif","carbon:time","carbon:time-filled","carbon:time-plot","carbon:timer","carbon:tool-box","carbon:tool-kit","carbon:tools","carbon:tools-alt","carbon:tornado","carbon:tornado-warning","carbon:touch-1","carbon:touch-1-down","carbon:touch-1-down-filled","carbon:touch-1-filled","carbon:touch-2","carbon:touch-2-filled","carbon:touch-interaction","carbon:tour","carbon:traffic-cone","carbon:traffic-event","carbon:traffic-flow","carbon:traffic-flow-incident","carbon:traffic-incident","carbon:traffic-weather-incident","carbon:train","carbon:train-heart","carbon:train-profile","carbon:train-speed","carbon:train-ticket","carbon:train-time","carbon:tram","carbon:transform-binary","carbon:transform-instructions","carbon:transform-language","carbon:transgender","carbon:translate","carbon:transmission-lte","carbon:transpose","carbon:trash-can","carbon:tree","carbon:tree-fall-risk","carbon:tree-view","carbon:tree-view-alt","carbon:trophy","carbon:trophy-filled","carbon:tropical-storm","carbon:tropical-storm-model-tracks","carbon:tropical-storm-tracks","carbon:tropical-warning","carbon:tsq","carbon:tsunami","carbon:tsv","carbon:tuning","carbon:two-factor-authentication","carbon:two-person-lift","carbon:txt","carbon:txt-reference","carbon:type-pattern","carbon:types","carbon:u1","carbon:u2","carbon:u3","carbon:umbrella","carbon:undefined","carbon:undefined-filled","carbon:undo","carbon:ungroup-objects","carbon:unknown","carbon:unknown-filled","carbon:unlink","carbon:unlocked","carbon:unsaved","carbon:up-to-top","carbon:update-now","carbon:upgrade","carbon:upload","carbon:upstream","carbon:url","carbon:usb","carbon:user","carbon:user-access","carbon:user-activity","carbon:user-admin","carbon:user-avatar","carbon:user-avatar-filled","carbon:user-avatar-filled-alt","carbon:user-certification","carbon:user-data","carbon:user-favorite","carbon:user-favorite-alt","carbon:user-favorite-alt-filled","carbon:user-filled","carbon:user-follow","carbon:user-identification","carbon:user-military","carbon:user-multiple","carbon:user-online","carbon:user-profile","carbon:user-profile-alt","carbon:user-role","carbon:user-service-desk","carbon:user-settings","carbon:user-simulation","carbon:user-speaker","carbon:user-sponsor","carbon:user-x-ray","carbon:uv-index","carbon:uv-index-alt","carbon:uv-index-filled","carbon:value-variable","carbon:van","carbon:vegetation-asset","carbon:vegetation-encroachment","carbon:vegetation-height","carbon:vehicle-api","carbon:vehicle-connected","carbon:vehicle-insights","carbon:vehicle-services","carbon:version","carbon:version-major","carbon:version-minor","carbon:version-patch","carbon:vertical-view","carbon:video","carbon:video-add","carbon:video-chat","carbon:video-filled","carbon:video-off","carbon:video-off-filled","carbon:video-player","carbon:view","carbon:view-filled","carbon:view-mode-1","carbon:view-mode-2","carbon:view-next","carbon:view-off","carbon:view-off-filled","carbon:virtual-column","carbon:virtual-column-key","carbon:virtual-desktop","carbon:virtual-machine","carbon:virtual-private-cloud","carbon:virtual-private-cloud-alt","carbon:visual-recognition","carbon:vlan","carbon:vlan-ibm","carbon:vmdk-disk","carbon:voice-activate","carbon:voicemail","carbon:volume-block-storage","carbon:volume-down","carbon:volume-down-alt","carbon:volume-down-filled","carbon:volume-down-filled-alt","carbon:volume-file-storage","carbon:volume-mute","carbon:volume-mute-filled","carbon:volume-object-storage","carbon:volume-up","carbon:volume-up-alt","carbon:volume-up-filled","carbon:volume-up-filled-alt","carbon:vpn","carbon:vpn-connection","carbon:vpn-policy","carbon:wallet","carbon:warning","carbon:warning-alt","carbon:warning-alt-filled","carbon:warning-alt-inverted","carbon:warning-alt-inverted-filled","carbon:warning-diamond","carbon:warning-filled","carbon:warning-hex","carbon:warning-hex-filled","carbon:warning-multiple","carbon:warning-other","carbon:warning-square","carbon:warning-square-filled","carbon:watch","carbon:watson","carbon:watson-machine-learning","carbon:watsonx","carbon:watsonx-ai","carbon:watsonx-data","carbon:watsonx-governance","carbon:wave-direction","carbon:wave-height","carbon:wave-period","carbon:weather-front-cold","carbon:weather-front-stationary","carbon:weather-front-warm","carbon:weather-station","carbon:web-services-cluster","carbon:web-services-container","carbon:web-services-definition","carbon:web-services-service","carbon:web-services-task","carbon:web-services-task-definition-version","carbon:webhook","carbon:websheet","carbon:wheat","carbon:white-paper","carbon:wifi","carbon:wifi-bridge","carbon:wifi-bridge-alt","carbon:wifi-controller","carbon:wifi-not-secure","carbon:wifi-off","carbon:wifi-secure","carbon:wikis","carbon:wind-gusts","carbon:wind-power","carbon:wind-stream","carbon:window-auto","carbon:window-base","carbon:window-black-saturation","carbon:window-overlay","carbon:window-preset","carbon:windy","carbon:windy-dust","carbon:windy-snow","carbon:windy-strong","carbon:winter-warning","carbon:wintry-mix","carbon:wireless-checkout","carbon:wmv","carbon:word-cloud","carbon:workflow-automation","carbon:workspace","carbon:workspace-import","carbon:worship","carbon:worship-christian","carbon:worship-jewish","carbon:worship-muslim","carbon:x","carbon:x-axis","carbon:xls","carbon:xml","carbon:y","carbon:y-axis","carbon:z","carbon:z-axis","carbon:z-lpar","carbon:z-systems","carbon:zip","carbon:zip-reference","carbon:zoom-area","carbon:zoom-fit","carbon:zoom-in","carbon:zoom-in-area","carbon:zoom-out","carbon:zoom-out-area","carbon:zoom-pan","carbon:zoom-reset","carbon:zos","carbon:zos-sysplex","fluent-mdl2:remove-from-trash","mdi:content-save","mdi:map-marker","ph:map-pin-fill","simple-icons:tiktok"] as const diff --git a/packages/ui/icon/index.tsx b/packages/ui/icon/index.tsx index ea5b0fef34..8d5a89f500 100644 --- a/packages/ui/icon/index.tsx +++ b/packages/ui/icon/index.tsx @@ -1,6 +1,6 @@ import { Icon as Iconify, type IconifyIconHTMLElement, type IconifyIconProps } from '@iconify-icon/react' import { createStyles } from '@mantine/core' -import { type Ref, type SVGProps } from 'react' +import { memo, type Ref, type SVGProps } from 'react' import { type LiteralUnion } from 'type-fest' import { iconList } from './iconList' @@ -19,11 +19,11 @@ const useStyles = createStyles((theme, { block }: IconStylesParams) => ({ }, })) -export const Icon = ({ icon, block, className, ref, ...props }: CustomIconProps) => { +export const Icon = memo(({ icon, block, className, ref, ...props }: CustomIconProps) => { const { classes, cx } = useStyles({ block }) Iconify.displayName = 'Iconify' return -} +}) Icon.displayName = '@weareinreach/ui/icon' export type IconList = (typeof iconList)[number] From 4c4dba98b704e20588b49d035bc63114456b09a8 Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Thu, 25 Jan 2024 13:51:17 -0500 Subject: [PATCH 19/67] create page shell for service edit --- .../[orgLocationId]/edit/[orgServiceId].tsx | 57 +++++++++++++++++++ .../{edit.tsx => edit/index.tsx} | 17 ++++-- apps/app/src/pages/org/[slug]/edit.tsx | 2 +- apps/app/src/types/nextjs-routes.d.ts | 1 + 4 files changed, 70 insertions(+), 7 deletions(-) create mode 100644 apps/app/src/pages/org/[slug]/[orgLocationId]/edit/[orgServiceId].tsx rename apps/app/src/pages/org/[slug]/[orgLocationId]/{edit.tsx => edit/index.tsx} (90%) diff --git a/apps/app/src/pages/org/[slug]/[orgLocationId]/edit/[orgServiceId].tsx b/apps/app/src/pages/org/[slug]/[orgLocationId]/edit/[orgServiceId].tsx new file mode 100644 index 0000000000..d6d9d7fb2b --- /dev/null +++ b/apps/app/src/pages/org/[slug]/[orgLocationId]/edit/[orgServiceId].tsx @@ -0,0 +1,57 @@ +import { useRouter } from 'next/router' +import { type GetServerSideProps } from 'nextjs-routes' +import { z } from 'zod' + +import { prefixedId } from '@weareinreach/api/schemas/idPrefix' +import { trpcServerClient } from '@weareinreach/api/trpc' +import { checkServerPermissions } from '@weareinreach/auth' +import { getServerSideTranslations } from '~app/utils/i18n' + +const EditServicePage = () => { + const router = useRouter() + + return <>Edit service page: {router.query.orgServiceId} +} + +export default EditServicePage + +export const getServerSideProps: GetServerSideProps = async ({ locale, params, req, res }) => { + const urlParams = z + .object({ + slug: z.string(), + orgLocationId: prefixedId('orgLocation'), + orgServiceId: prefixedId('orgService'), + }) + .safeParse(params) + if (!urlParams.success) return { notFound: true } + const { slug, orgLocationId, orgServiceId } = urlParams.data + const session = await checkServerPermissions({ + ctx: { req, res }, + permissions: ['dataPortalBasic'], + has: 'some', + }) + if (!session) { + return { + redirect: { + destination: '/', + permanent: false, + }, + } + } + const ssg = await trpcServerClient({ session }) + const { id: orgId } = await ssg.organization.getIdFromSlug.fetch({ slug }) + const [i18n] = await Promise.all([ + getServerSideTranslations(locale, ['common', 'services', 'attribute', 'phone-type', orgId]), + ssg.organization.getBySlug.prefetch({ slug }), + ssg.location.getById.prefetch({ id: orgLocationId }), + ]) + const props = { + session, + trpcState: ssg.dehydrate(), + ...i18n, + } + + return { + props, + } +} diff --git a/apps/app/src/pages/org/[slug]/[orgLocationId]/edit.tsx b/apps/app/src/pages/org/[slug]/[orgLocationId]/edit/index.tsx similarity index 90% rename from apps/app/src/pages/org/[slug]/[orgLocationId]/edit.tsx rename to apps/app/src/pages/org/[slug]/[orgLocationId]/edit/index.tsx index fb968eee81..2dbde3b5f6 100644 --- a/apps/app/src/pages/org/[slug]/[orgLocationId]/edit.tsx +++ b/apps/app/src/pages/org/[slug]/[orgLocationId]/edit/index.tsx @@ -6,6 +6,7 @@ import { useTranslation } from 'next-i18next' import { useEffect, useRef, useState } from 'react' import { z } from 'zod' +import { prefixedId } from '@weareinreach/api/schemas/idPrefix' import { trpcServerClient } from '@weareinreach/api/trpc' import { checkServerPermissions } from '@weareinreach/auth' import { AlertMessage } from '@weareinreach/ui/components/core/AlertMessage' @@ -165,15 +166,14 @@ const OrgLocationPage: NextPage = () => { } export const getServerSideProps: GetServerSideProps = async ({ locale, params, req, res }) => { - const urlParams = z.object({ slug: z.string(), orgLocationId: z.string() }).safeParse(params) + const urlParams = z.object({ slug: z.string(), orgLocationId: prefixedId('orgLocation') }).safeParse(params) if (!urlParams.success) return { notFound: true } - const { slug, orgLocationId } = urlParams.data + const { slug, orgLocationId: id } = urlParams.data const session = await checkServerPermissions({ ctx: { req, res }, permissions: ['dataPortalBasic'], has: 'some', }) - if (!session) { return { redirect: { @@ -183,12 +183,17 @@ export const getServerSideProps: GetServerSideProps = async ({ locale, params, r } } const ssg = await trpcServerClient({ session }) - await ssg.organization.getBySlug.prefetch({ slug }) - await ssg.location.getById.prefetch({ id: orgLocationId }) + const { id: orgId } = await ssg.organization.getIdFromSlug.fetch({ slug }) + const [i18n] = await Promise.all([ + getServerSideTranslations(locale, ['common', 'services', 'attribute', 'phone-type', orgId]), + ssg.organization.getBySlug.prefetch({ slug }), + ssg.location.forLocationPage.prefetch({ id }), + ssg.location.getAlerts.prefetch({ id }), + ]) const props = { session, trpcState: ssg.dehydrate(), - ...(await getServerSideTranslations(locale, ['common', 'services', 'attribute', 'phone-type', slug])), + ...i18n, } return { diff --git a/apps/app/src/pages/org/[slug]/edit.tsx b/apps/app/src/pages/org/[slug]/edit.tsx index 7845d55d1a..4ad8c2cecf 100644 --- a/apps/app/src/pages/org/[slug]/edit.tsx +++ b/apps/app/src/pages/org/[slug]/edit.tsx @@ -83,7 +83,7 @@ const OrganizationPage: NextPageWithOptions - + {locations.map((location) => ( ))} diff --git a/apps/app/src/types/nextjs-routes.d.ts b/apps/app/src/types/nextjs-routes.d.ts index 96bc95ed54..8ff841f0fb 100644 --- a/apps/app/src/types/nextjs-routes.d.ts +++ b/apps/app/src/types/nextjs-routes.d.ts @@ -30,6 +30,7 @@ declare module "nextjs-routes" { | DynamicRoute<"/api/trpc/[trpc]", { "trpc": string }> | StaticRoute<"/api/trpc-playground"> | StaticRoute<"/"> + | DynamicRoute<"/org/[slug]/[orgLocationId]/edit/[orgServiceId]", { "slug": string; "orgLocationId": string; "orgServiceId": string }> | DynamicRoute<"/org/[slug]/[orgLocationId]/edit", { "slug": string; "orgLocationId": string }> | DynamicRoute<"/org/[slug]/[orgLocationId]", { "slug": string; "orgLocationId": string }> | DynamicRoute<"/org/[slug]/edit", { "slug": string }> From bd2d084a769d66b906ee2d5c8c7db9aee39316cf Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Thu, 25 Jan 2024 13:52:23 -0500 Subject: [PATCH 20/67] fix leader badge section format/style --- .../components/sections/ListingBasicInfo.tsx | 51 ++++++++++++------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/packages/ui/components/sections/ListingBasicInfo.tsx b/packages/ui/components/sections/ListingBasicInfo.tsx index aca042a14e..fb2da25a87 100644 --- a/packages/ui/components/sections/ListingBasicInfo.tsx +++ b/packages/ui/components/sections/ListingBasicInfo.tsx @@ -1,4 +1,4 @@ -import { Skeleton, Stack, Text, Title } from '@mantine/core' +import { Divider, Group, Skeleton, Stack, Text, Title, useMantineTheme } from '@mantine/core' import { useTranslation } from 'next-i18next' import { memo } from 'react' import { useFormContext } from 'react-hook-form' @@ -83,6 +83,7 @@ ListingBasicDisplay.displayName = 'ListingBasicDisplay' export const ListingBasicEdit = ({ data }: ListingBasicInfoProps) => { const form = useFormContext() const { attributes, isClaimed } = data + const theme = useMantineTheme() const leaderAttributes = attributes.filter(({ attribute }) => attribute.categories.some(({ category }) => category.tag === 'organization-leadership') ) @@ -92,25 +93,28 @@ export const ListingBasicEdit = ({ data }: ListingBasicInfoProps) => { ) ) - const infoBadges = () => { - const output: CustomBadgeProps[] = [] + const leaderBadges = (): CustomBadgeProps[] => { if (leaderAttributes.length) { - leaderAttributes.forEach((entry) => - output.push({ - variant: 'leader', - icon: entry.attribute.icon ?? '', - iconBg: entry.attribute.iconBg ?? '#FFF', - tsKey: entry.attribute.tsKey, - }) - ) - } else { - output.push({ + return leaderAttributes.map(({ attribute }) => ({ variant: 'leader', - icon: '➕', - iconBg: '#FFF', - tsKey: 'Add leader badge', - }) + icon: attribute.icon ?? '', + iconBg: attribute.iconBg ?? '#FFF', + tsKey: attribute.tsKey, + })) + } else { + return [ + { + variant: 'leader', + icon: '➕', + iconBg: '#FFF', + tsKey: 'Add leader badge', + }, + ] } + } + + const infoBadges = () => { + const output: CustomBadgeProps[] = [] if (data.lastVerified) output.push({ variant: 'verified', @@ -138,9 +142,18 @@ export const ListingBasicEdit = ({ data }: ListingBasicInfoProps) => { fontSize='h2' data-isDirty={form.formState.dirtyFields['name']} /> - + + + + + - + Date: Thu, 25 Jan 2024 13:53:20 -0500 Subject: [PATCH 21/67] associate address drawer, fix styling --- .../ui/components/data-portal/AddressDrawer.tsx | 6 ++++++ packages/ui/components/sections/VisitCard.tsx | 17 +++++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/packages/ui/components/data-portal/AddressDrawer.tsx b/packages/ui/components/data-portal/AddressDrawer.tsx index 79bd3777fa..24f5cdc287 100644 --- a/packages/ui/components/data-portal/AddressDrawer.tsx +++ b/packages/ui/components/data-portal/AddressDrawer.tsx @@ -65,6 +65,12 @@ const useStyles = createStyles((theme) => ({ height: rem(16), width: rem(16), }, + overlay: { + backgroundColor: theme.fn.lighten(theme.other.colors.secondary.teal, 0.9), + borderRadius: rem(16), + margin: rem(-8), + padding: rem(8), + }, })) const FormSchema = z.object({ diff --git a/packages/ui/components/sections/VisitCard.tsx b/packages/ui/components/sections/VisitCard.tsx index 4ef21ea6fc..78adc9cb2e 100644 --- a/packages/ui/components/sections/VisitCard.tsx +++ b/packages/ui/components/sections/VisitCard.tsx @@ -1,11 +1,13 @@ -import { Card, Stack, Text, Title, useMantineTheme } from '@mantine/core' +import { Card, createStyles, rem, Stack, Text, Title, useMantineTheme } from '@mantine/core' import { useElementSize, useMediaQuery } from '@mantine/hooks' import { useTranslation } from 'next-i18next' import { useEffect } from 'react' import { Badge } from '~ui/components/core/Badge' import { GoogleMap } from '~ui/components/core/GoogleMap' +import { Link } from '~ui/components/core/Link' import { Hours } from '~ui/components/data-display/Hours' +import { AddressDrawer } from '~ui/components/data-portal/AddressDrawer' import { useCustomVariant, useFormattedAddress, useScreenSize } from '~ui/hooks' import { useGoogleMapMarker } from '~ui/hooks/useGoogleMapMarker' import { useGoogleMaps } from '~ui/hooks/useGoogleMaps' @@ -97,8 +99,17 @@ const VisitCardDisplay = ({ locationId }: VisitCardProps) => { } // TODO: [IN-785] Create variant for Remote/Unpublished address +const useEditStyles = createStyles((theme) => ({ + overlay: { + backgroundColor: theme.fn.lighten(theme.other.colors.secondary.teal, 0.9), + borderRadius: rem(16), + margin: rem(-8), + padding: rem(8), + }, +})) const VisitCardEdit = ({ locationId }: VisitCardProps) => { const { isMobile } = useScreenSize() + const { classes } = useEditStyles() const { t } = useTranslation(['common', 'attribute']) const { ref, width } = useElementSize() const variants = useCustomVariant() @@ -135,7 +146,9 @@ const VisitCardEdit = ({ locationId }: VisitCardProps) => { const address = formattedAddress && ( {t('address', { context: data.remote ? 'physical' : undefined })} - {formattedAddress} + + {formattedAddress} + ) From ed6fcee0171d46137117fe6fa819f3c057fc12e3 Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Thu, 25 Jan 2024 16:52:52 -0500 Subject: [PATCH 22/67] create location variant --- .../components/sections/ListingBasicInfo.tsx | 54 +++++++++++-------- 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/packages/ui/components/sections/ListingBasicInfo.tsx b/packages/ui/components/sections/ListingBasicInfo.tsx index fb2da25a87..0aba161da0 100644 --- a/packages/ui/components/sections/ListingBasicInfo.tsx +++ b/packages/ui/components/sections/ListingBasicInfo.tsx @@ -80,7 +80,7 @@ export const ListingBasicDisplay = memo(({ data }: ListingBasicInfoProps) => { }) ListingBasicDisplay.displayName = 'ListingBasicDisplay' -export const ListingBasicEdit = ({ data }: ListingBasicInfoProps) => { +export const ListingBasicEdit = ({ data, location }: ListingBasicInfoProps) => { const form = useFormContext() const { attributes, isClaimed } = data const theme = useMantineTheme() @@ -143,36 +143,44 @@ export const ListingBasicEdit = ({ data }: ListingBasicInfoProps) => { data-isDirty={form.formState.dirtyFields['name']} /> - - - - + {!location && ( + <> + + + + + + )} - - - - + {!location && ( + <> + + + + + + )} ) } ListingBasicEdit.displayName = 'ListingBasicEdit' -export const ListingBasicInfo = ({ data, edit }: ListingBasicInfoProps) => - edit ? : -export type ListingBasicInfoProps = { edit?: boolean } & OrgInfoProps +export const ListingBasicInfo = ({ edit, ...props }: ListingBasicInfoProps) => + edit ? : +export type ListingBasicInfoProps = { edit?: boolean; location?: boolean } & OrgInfoProps export interface OrgInfoProps { data: { From 313185137b11f8bf989fe04eb4b4d8895c191072 Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Thu, 25 Jan 2024 17:13:33 -0500 Subject: [PATCH 23/67] loc page api route --- packages/api/router/location/index.ts | 12 ++ .../query.forLocationPageEdits.handler.ts | 164 ++++++++++++++++++ .../query.forLocationPageEdits.schema.ts | 6 + packages/api/router/location/schemas.ts | 1 + 4 files changed, 183 insertions(+) create mode 100644 packages/api/router/location/query.forLocationPageEdits.handler.ts create mode 100644 packages/api/router/location/query.forLocationPageEdits.schema.ts diff --git a/packages/api/router/location/index.ts b/packages/api/router/location/index.ts index e314d51124..f84f63e6d0 100644 --- a/packages/api/router/location/index.ts +++ b/packages/api/router/location/index.ts @@ -101,6 +101,17 @@ export const locationRouter = defineRouter({ if (!HandlerCache.forVisitCardEdits) throw new Error('Failed to load handler') return HandlerCache.forVisitCardEdits({ ctx, input }) }), + forLocationPageEdits: permissionedProcedure('createNewLocation') + .input(schema.ZForLocationPageEditsSchema) + .query(async ({ ctx, input }) => { + if (!HandlerCache.forLocationPageEdits) { + HandlerCache.forLocationPageEdits = await import('./query.forLocationPageEdits.handler').then( + (mod) => mod.forLocationPageEdits + ) + } + if (!HandlerCache.forLocationPageEdits) throw new Error('Failed to load handler') + return HandlerCache.forLocationPageEdits({ ctx, input }) + }), // #endregion // // MUTATIONS @@ -143,6 +154,7 @@ type LocationHandlerCache = { forLocationPage: typeof import('./query.forLocationPage.handler').forLocationPage getAlerts: typeof import('./query.getAlerts.handler').getAlerts forVisitCardEdits: typeof import('./query.forVisitCardEdits.handler').forVisitCardEdits + forLocationPageEdits: typeof import('./query.forLocationPageEdits.handler').forLocationPageEdits // #endregion // // MUTATIONS diff --git a/packages/api/router/location/query.forLocationPageEdits.handler.ts b/packages/api/router/location/query.forLocationPageEdits.handler.ts new file mode 100644 index 0000000000..fe3ef9eb7c --- /dev/null +++ b/packages/api/router/location/query.forLocationPageEdits.handler.ts @@ -0,0 +1,164 @@ +import { prisma } from '@weareinreach/db' +import { handleError } from '~api/lib/errorHandler' +import { globalSelect } from '~api/selects/global' +import { type TRPCHandlerParams } from '~api/types/handler' + +import { type TForLocationPageEditsSchema } from './query.forLocationPageEdits.schema' + +export const forLocationPageEdits = async ({ input }: TRPCHandlerParams) => { + try { + const location = await prisma.orgLocation.findUniqueOrThrow({ + where: { + id: input.id, + }, + select: { + id: true, + primary: true, + name: true, + street1: true, + street2: true, + city: true, + postCode: true, + country: { select: { cca2: true } }, + govDist: { select: { abbrev: true, tsKey: true, tsNs: true } }, + longitude: true, + latitude: true, + description: globalSelect.freeText(), + attributes: { + select: { + attribute: { + select: { + id: true, + tsKey: true, + tsNs: true, + icon: true, + iconBg: true, + showOnLocation: true, + categories: { + select: { + category: { + select: { + tag: true, + icon: true, + }, + }, + }, + }, + _count: { + select: { + parents: true, + children: true, + }, + }, + }, + }, + supplement: { + select: { + id: true, + country: { + select: { + cca2: true, + cca3: true, + id: true, + name: true, + dialCode: true, + flag: true, + tsKey: true, + tsNs: true, + }, + }, + language: { + select: { + languageName: true, + nativeName: true, + }, + }, + text: { + select: { + key: true, + ns: true, + tsKey: { + select: { + text: true, + }, + }, + }, + }, + govDist: { + select: { + id: true, + name: true, + slug: true, + iso: true, + abbrev: true, + country: { + select: { + cca2: true, + cca3: true, + id: true, + name: true, + dialCode: true, + flag: true, + tsKey: true, + tsNs: true, + }, + }, + govDistType: { + select: { + tsKey: true, + tsNs: true, + }, + }, + isPrimary: true, + tsKey: true, + tsNs: true, + parent: { + select: { + id: true, + name: true, + slug: true, + iso: true, + abbrev: true, + country: { + select: { + cca2: true, + cca3: true, + id: true, + name: true, + dialCode: true, + flag: true, + tsKey: true, + tsNs: true, + }, + }, + govDistType: { + select: { + tsKey: true, + tsNs: true, + }, + }, + isPrimary: true, + tsKey: true, + tsNs: true, + }, + }, + }, + }, + boolean: true, + data: true, + }, + }, + }, + }, + reviews: { + where: { visible: true, deleted: false }, + select: { id: true }, + }, + services: { select: { serviceId: true } }, + }, + }) + return location + } catch (error) { + handleError(error) + } +} diff --git a/packages/api/router/location/query.forLocationPageEdits.schema.ts b/packages/api/router/location/query.forLocationPageEdits.schema.ts new file mode 100644 index 0000000000..4bb9d8ad75 --- /dev/null +++ b/packages/api/router/location/query.forLocationPageEdits.schema.ts @@ -0,0 +1,6 @@ +import { z } from 'zod' + +import { prefixedId } from '~api/schemas/idPrefix' + +export const ZForLocationPageEditsSchema = z.object({ id: prefixedId('orgLocation') }) +export type TForLocationPageEditsSchema = z.infer diff --git a/packages/api/router/location/schemas.ts b/packages/api/router/location/schemas.ts index d60a1729be..e2b24be4c6 100644 --- a/packages/api/router/location/schemas.ts +++ b/packages/api/router/location/schemas.ts @@ -4,6 +4,7 @@ export * from './mutation.update.schema' export * from './query.forGoogleMaps.schema' export * from './query.forLocationCard.schema' export * from './query.forLocationPage.schema' +export * from './query.forLocationPageEdits.schema' export * from './query.forVisitCard.schema' export * from './query.forVisitCardEdits.schema' export * from './query.getAddress.schema' From b73970d642f6b12d9f2a400e02859dedd000ea86 Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Thu, 25 Jan 2024 17:14:12 -0500 Subject: [PATCH 24/67] location page edits --- .../[orgLocationId]/edit/[orgServiceId].tsx | 10 +- .../org/[slug]/[orgLocationId]/edit/index.tsx | 229 +++++++++++------- 2 files changed, 148 insertions(+), 91 deletions(-) diff --git a/apps/app/src/pages/org/[slug]/[orgLocationId]/edit/[orgServiceId].tsx b/apps/app/src/pages/org/[slug]/[orgLocationId]/edit/[orgServiceId].tsx index d6d9d7fb2b..afe6813763 100644 --- a/apps/app/src/pages/org/[slug]/[orgLocationId]/edit/[orgServiceId].tsx +++ b/apps/app/src/pages/org/[slug]/[orgLocationId]/edit/[orgServiceId].tsx @@ -41,7 +41,15 @@ export const getServerSideProps: GetServerSideProps = async ({ locale, params, r const ssg = await trpcServerClient({ session }) const { id: orgId } = await ssg.organization.getIdFromSlug.fetch({ slug }) const [i18n] = await Promise.all([ - getServerSideTranslations(locale, ['common', 'services', 'attribute', 'phone-type', orgId]), + getServerSideTranslations(locale, [ + 'common', + 'services', + 'attribute', + 'phone-type', + 'country', + 'gov-dist', + orgId, + ]), ssg.organization.getBySlug.prefetch({ slug }), ssg.location.getById.prefetch({ id: orgLocationId }), ]) diff --git a/apps/app/src/pages/org/[slug]/[orgLocationId]/edit/index.tsx b/apps/app/src/pages/org/[slug]/[orgLocationId]/edit/index.tsx index 2dbde3b5f6..30b3cc10d5 100644 --- a/apps/app/src/pages/org/[slug]/[orgLocationId]/edit/index.tsx +++ b/apps/app/src/pages/org/[slug]/[orgLocationId]/edit/index.tsx @@ -1,9 +1,11 @@ -import { createStyles, Divider, Grid, Skeleton, Stack, Tabs, useMantineTheme } from '@mantine/core' -import { type GetServerSideProps, type NextPage } from 'next' +import { createStyles, Divider, Grid, Skeleton, Stack, Tabs, Title, useMantineTheme } from '@mantine/core' +import { type InferGetServerSidePropsType, type NextPage } from 'next' import Head from 'next/head' import { useRouter } from 'next/router' import { useTranslation } from 'next-i18next' +import { type GetServerSidePropsContext } from 'nextjs-routes' import { useEffect, useRef, useState } from 'react' +import { FormProvider, useForm } from 'react-hook-form' import { z } from 'zod' import { prefixedId } from '@weareinreach/api/schemas/idPrefix' @@ -20,6 +22,7 @@ import { VisitCard } from '@weareinreach/ui/components/sections/VisitCard' import { OrgLocationPageLoading } from '@weareinreach/ui/loading-states/OrgLocationPage' import { api } from '~app/utils/api' import { getServerSideTranslations } from '~app/utils/i18n' +import { MultiSelectPopover } from '~ui/components/data-portal/MultiSelectPopover' const useStyles = createStyles((theme) => ({ tabsList: { @@ -29,8 +32,16 @@ const useStyles = createStyles((theme) => ({ backgroundColor: theme.other.colors.secondary.white, }, })) - -const OrgLocationPage: NextPage = () => { +const formSchema = z + .object({ + name: z.string().nullable(), + services: z.string().array(), + }) + .partial() +type FormSchema = z.infer +const OrgLocationPage: NextPage> = ({ + organizationId, +}) => { const { t } = useTranslation() const router = useRouter<'/org/[slug]/[orgLocationId]'>() const { query } = router.isReady ? router : { query: { slug: '', orgLocationId: '' } } @@ -40,7 +51,7 @@ const OrgLocationPage: NextPage = () => { const { data: orgData, status: orgDataStatus } = api.organization.getBySlug.useQuery(query, { enabled: router.isReady, }) - const { data, status } = api.location.forLocationPage.useQuery({ id: orgLocationId }) + const { data, status } = api.location.forLocationPageEdits.useQuery({ id: orgLocationId }) const { data: isSaved } = api.savedList.isSaved.useQuery(orgData?.id as string, { enabled: orgDataStatus === 'success' && Boolean(orgData?.id), }) @@ -48,6 +59,20 @@ const OrgLocationPage: NextPage = () => { { id: orgLocationId }, { enabled: router.isReady } ) + const { data: orgServices } = api.service.getNames.useQuery( + { organizationId }, + { + select: (data) => data.map(({ id, defaultText }) => ({ value: id, label: defaultText })), + refetchOnWindowFocus: false, + } + ) + const formMethods = useForm({ + values: { + name: data?.name, + services: data?.services.map(({ serviceId }) => serviceId) ?? [], + }, + }) + const hasAlerts = Array.isArray(alertData) && alertData.length > 0 const { classes } = useStyles() @@ -76,96 +101,111 @@ const OrgLocationPage: NextPage = () => { {t('page-title.edit-mode', { ns: 'common', title: `${orgData.name} - ${data.name}` })} - - - router.push({ - pathname: '/org/[slug]/edit', - query: { slug: orgData.slug }, - }), - }} - organizationId={orgData.id} - saved={Boolean(isSaved)} - /> - - {hasAlerts && - alertData.map((alert) => ( - - ))} - + + + router.push({ + pathname: '/org/[slug]/edit', + query: { slug: orgData.slug }, + }), }} - // edit + organizationId={orgData.id} + saved={Boolean(isSaved)} /> - { - setActiveTab(tab) - switch (tab) { - case 'services': { - servicesRef.current?.scrollIntoView({ behavior: 'smooth' }) - break - } - case 'photos': { - photosRef.current?.scrollIntoView({ behavior: 'smooth' }) - break + + {hasAlerts && + alertData.map((alert) => ( + + ))} + + { + setActiveTab(tab) + switch (tab) { + case 'services': { + servicesRef.current?.scrollIntoView({ behavior: 'smooth' }) + break + } + case 'photos': { + photosRef.current?.scrollIntoView({ behavior: 'smooth' }) + break + } + case 'reviews': { + reviewsRef.current?.scrollIntoView({ behavior: 'smooth' }) + break + } } - case 'reviews': { - reviewsRef.current?.scrollIntoView({ behavior: 'smooth' }) - break - } - } - }} - > - - {t('services')} - {t('photo', { count: 2 })} - {t('review', { count: 2 })} - - -
- -
-
- -
-
- -
-
-
-
-
- - - - - - + }} + > + + {t('services')} + {t('photo', { count: 2 })} + {t('review', { count: 2 })} + + + + + {'Associate service(s) to this location'} + + + + {'Associated services'} + + + +
+ +
+
+ +
+
+ +
+
+ + + + + + + ) } -export const getServerSideProps: GetServerSideProps = async ({ locale, params, req, res }) => { +export const getServerSideProps = async ({ + locale, + params, + req, + res, +}: GetServerSidePropsContext<'/org/[slug]/[orgLocationId]/edit'>) => { const urlParams = z.object({ slug: z.string(), orgLocationId: prefixedId('orgLocation') }).safeParse(params) if (!urlParams.success) return { notFound: true } const { slug, orgLocationId: id } = urlParams.data @@ -185,12 +225,21 @@ export const getServerSideProps: GetServerSideProps = async ({ locale, params, r const ssg = await trpcServerClient({ session }) const { id: orgId } = await ssg.organization.getIdFromSlug.fetch({ slug }) const [i18n] = await Promise.all([ - getServerSideTranslations(locale, ['common', 'services', 'attribute', 'phone-type', orgId]), + getServerSideTranslations(locale, [ + 'common', + 'services', + 'attribute', + 'phone-type', + 'country', + 'gov-dist', + orgId, + ]), ssg.organization.getBySlug.prefetch({ slug }), - ssg.location.forLocationPage.prefetch({ id }), + ssg.location.forLocationPageEdits.prefetch({ id }), ssg.location.getAlerts.prefetch({ id }), ]) const props = { + organizationId: orgId, session, trpcState: ssg.dehydrate(), ...i18n, From 752886da6aa98a5a33ae857934a817aa84574561 Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Fri, 26 Jan 2024 12:43:44 -0500 Subject: [PATCH 25/67] create hook-form variant --- .../MultiSelectPopover/hook-form.stories.tsx | 60 +++++++++ .../MultiSelectPopover/hook-form.tsx | 120 ++++++++++++++++++ .../index.stories.tsx} | 2 +- .../index.tsx} | 25 +--- .../data-portal/MultiSelectPopover/styles.ts | 31 +++++ 5 files changed, 213 insertions(+), 25 deletions(-) create mode 100644 packages/ui/components/data-portal/MultiSelectPopover/hook-form.stories.tsx create mode 100644 packages/ui/components/data-portal/MultiSelectPopover/hook-form.tsx rename packages/ui/components/data-portal/{MultiSelectPopover.stories.tsx => MultiSelectPopover/index.stories.tsx} (95%) rename packages/ui/components/data-portal/{MultiSelectPopover.tsx => MultiSelectPopover/index.tsx} (80%) create mode 100644 packages/ui/components/data-portal/MultiSelectPopover/styles.ts diff --git a/packages/ui/components/data-portal/MultiSelectPopover/hook-form.stories.tsx b/packages/ui/components/data-portal/MultiSelectPopover/hook-form.stories.tsx new file mode 100644 index 0000000000..98d17cd45b --- /dev/null +++ b/packages/ui/components/data-portal/MultiSelectPopover/hook-form.stories.tsx @@ -0,0 +1,60 @@ +import { DevTool } from '@hookform/devtools' +import { type Meta, type StoryObj } from '@storybook/react' +import { useForm } from 'react-hook-form' +import { type FieldValues } from 'react-hook-form' + +import { MultiSelectPopover, type MultiSelectPopoverProps } from './hook-form' + +type FormSchema = { + formValue: string[] +} + +const StoryRender = (args: MultiSelectPopoverProps) => { + const form = useForm() + + return ( + <> + + + + ) +} + +export default { + title: 'Data Portal/Fields/Multi Select Popover (Hook Form)', + component: MultiSelectPopover, + args: { + data: [ + { value: '1', label: 'one one one one one one one one one one' }, + { value: '2', label: 'two two two two two two two' }, + { value: '3', label: 'three three three three three three three' }, + { value: '4', label: 'four four four four four' }, + ], + label: 'Dropdown target text', + name: 'formValue', + }, + argTypes: { + onChange: { action: 'Updated Values' }, + data: { + control: { type: 'radio' }, + options: ['Has data', 'Loading data'], + mapping: { + 'Has data': [ + { value: '1', label: 'one one one one one one one one one one' }, + { value: '2', label: 'two two two two two two two' }, + { value: '3', label: 'three three three three three three three' }, + { value: '4', label: 'four four four four four' }, + ], + 'Loading data': undefined, + }, + defaultValue: 'Has data', + }, + }, + // render: ComponentWithState, +} satisfies Meta + +type StoryDef = StoryObj + +export const Default = { + render: (args) => , +} satisfies StoryDef diff --git a/packages/ui/components/data-portal/MultiSelectPopover/hook-form.tsx b/packages/ui/components/data-portal/MultiSelectPopover/hook-form.tsx new file mode 100644 index 0000000000..d7e4e486c1 --- /dev/null +++ b/packages/ui/components/data-portal/MultiSelectPopover/hook-form.tsx @@ -0,0 +1,120 @@ +import { + type CheckboxGroupProps as $CheckboxGroupProps, + Checkbox, + createStyles, + Group, + LoadingOverlay, + Popover, + rem, + ScrollArea, + Text, + UnstyledButton, +} from '@mantine/core' +import { useDisclosure, useListState } from '@mantine/hooks' +import compare from 'just-compare' +import { type CSSProperties, useCallback, useEffect, useMemo } from 'react' +import { type FieldValues, useController, type UseControllerProps, useWatch } from 'react-hook-form' + +import { Icon } from '~ui/icon' + +import { useStyles } from './styles' + +export const MultiSelectPopover = ({ + name, + control, + defaultValue, + rules, + shouldUnregister, + onChange, + data, + label, + style, + labelClassName, + fullWidth, + indicateWhenDirty, + ...props +}: MultiSelectPopoverProps) => { + const { + field: { value, onChange: fieldOnChange, ...field }, + fieldState, + } = useController({ + name, + control, + defaultValue, + rules, + shouldUnregister, + }) + const selectedItems = useWatch({ name, control }) + const selected = selectedItems?.length ?? 0 + + const [opened, menuHandler] = useDisclosure() + const { classes, cx } = useStyles({ selectedCount: selected, dimmed: Boolean(labelClassName) }) + + const selectedCountIcon = {selected} + + return ( + <> + { + menuHandler.close() + }} + trapFocus + withinPortal + > + + + + + + {selectedCountIcon} + + {label} + + + + + + + + + { + fieldOnChange(e) + onChange?.(e) + }} + {...field} + > + {data?.map((props, index) => )} + + + + + + ) +} +//) +MultiSelectPopover.displayName = 'MultiSelectPopover (hook form)' +export interface MultiSelectPopoverProps extends UseControllerProps { + data?: { + value: string + label: string + [k: string]: string + }[] + label: string + value?: string[] + onChange?: (value: string[]) => void + style?: CSSProperties + labelClassName?: string + fullWidth?: boolean + indicateWhenDirty?: boolean +} diff --git a/packages/ui/components/data-portal/MultiSelectPopover.stories.tsx b/packages/ui/components/data-portal/MultiSelectPopover/index.stories.tsx similarity index 95% rename from packages/ui/components/data-portal/MultiSelectPopover.stories.tsx rename to packages/ui/components/data-portal/MultiSelectPopover/index.stories.tsx index 0c9280621e..d93f01631b 100644 --- a/packages/ui/components/data-portal/MultiSelectPopover.stories.tsx +++ b/packages/ui/components/data-portal/MultiSelectPopover/index.stories.tsx @@ -1,6 +1,6 @@ import { type Meta, type StoryObj } from '@storybook/react' -import { MultiSelectPopover } from './MultiSelectPopover' +import { MultiSelectPopover } from './index' export default { title: 'Data Portal/Fields/Multi Select Popover', diff --git a/packages/ui/components/data-portal/MultiSelectPopover.tsx b/packages/ui/components/data-portal/MultiSelectPopover/index.tsx similarity index 80% rename from packages/ui/components/data-portal/MultiSelectPopover.tsx rename to packages/ui/components/data-portal/MultiSelectPopover/index.tsx index b13dac26e6..eccba06184 100644 --- a/packages/ui/components/data-portal/MultiSelectPopover.tsx +++ b/packages/ui/components/data-portal/MultiSelectPopover/index.tsx @@ -15,30 +15,7 @@ import { type CSSProperties, useCallback, useEffect, useMemo } from 'react' import { Icon } from '~ui/icon' -const useStyles = createStyles( - (theme, { selectedCount, dimmed }: { selectedCount: number; dimmed: boolean }) => ({ - count: { - ...theme.other.utilityFonts.utility1, - background: dimmed ? theme.other.colors.secondary.darkGray : theme.other.colors.secondary.black, - borderRadius: '100%', - color: theme.other.colors.secondary.white, - width: rem(24), - height: rem(24), - textAlign: 'center', - display: 'inline-block', - verticalAlign: 'center', - lineHeight: 1.5, - opacity: selectedCount < 1 ? 0 : 1, - }, - button: { - padding: `${rem(14)} ${rem(16)}`, - backgroundColor: theme.other.colors.secondary.white, - borderRadius: rem(8), - border: `${theme.other.colors.tertiary.coolGray} ${rem(1)} solid`, - height: rem(48), - }, - }) -) +import { useStyles } from './styles' export const MultiSelectPopover = ({ data, diff --git a/packages/ui/components/data-portal/MultiSelectPopover/styles.ts b/packages/ui/components/data-portal/MultiSelectPopover/styles.ts new file mode 100644 index 0000000000..da72262eaa --- /dev/null +++ b/packages/ui/components/data-portal/MultiSelectPopover/styles.ts @@ -0,0 +1,31 @@ +import { createStyles, rem } from '@mantine/core' + +export const useStyles = createStyles( + (theme, { selectedCount, dimmed }: { selectedCount: number; dimmed: boolean }) => ({ + count: { + ...theme.other.utilityFonts.utility1, + background: dimmed ? theme.other.colors.secondary.darkGray : theme.other.colors.secondary.black, + borderRadius: '100%', + color: theme.other.colors.secondary.white, + width: rem(24), + height: rem(24), + textAlign: 'center', + display: 'inline-block', + verticalAlign: 'center', + lineHeight: 1.5, + opacity: selectedCount < 1 ? 0 : 1, + }, + button: { + padding: `${rem(14)} ${rem(16)}`, + backgroundColor: theme.other.colors.secondary.white, + borderRadius: rem(8), + border: `${theme.other.colors.tertiary.coolGray} ${rem(1)} solid`, + height: rem(48), + }, + indicateDirty: { + '&[data-isDirty=true]': { + backgroundColor: theme.fn.lighten(theme.other.colors.secondary.teal, 0.6), + }, + }, + }) +) From 6df495bdced67f7da2abd23c92174f69b2ab7984 Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Fri, 26 Jan 2024 12:45:40 -0500 Subject: [PATCH 26/67] remove devtool --- packages/ui/components/data-portal/HoursDrawer/index.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/ui/components/data-portal/HoursDrawer/index.tsx b/packages/ui/components/data-portal/HoursDrawer/index.tsx index 313f4a2918..65f4ba4384 100644 --- a/packages/ui/components/data-portal/HoursDrawer/index.tsx +++ b/packages/ui/components/data-portal/HoursDrawer/index.tsx @@ -1,4 +1,3 @@ -import { DevTool } from '@hookform/devtools' import { zodResolver } from '@hookform/resolvers/zod' import { Box, @@ -268,7 +267,6 @@ const _HoursDrawer = forwardRef(({ location - ) }) From 994c8d4995040a8e256edc837bca55f6ffa8416f Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Fri, 26 Jan 2024 13:17:43 -0500 Subject: [PATCH 27/67] tRPC handler import... handler --- packages/api/lib/trpc.ts | 43 +++++++++++++++++++ .../templates/handlers/handler.ts.hbs | 2 + 2 files changed, 45 insertions(+) diff --git a/packages/api/lib/trpc.ts b/packages/api/lib/trpc.ts index 75dd8dbe29..80058ea444 100644 --- a/packages/api/lib/trpc.ts +++ b/packages/api/lib/trpc.ts @@ -22,3 +22,46 @@ export const staffProcedure = baseProcedure.use(isStaff) /** Permissioned router */ export const permissionedProcedure = (procedure: PermissionedProcedure) => baseProcedure.use(hasPermissions).meta(getPermissions(procedure)) + +/** Handler Cache */ + +// eslint-disable-next-line @typescript-eslint/ban-types +const HANDLER_CACHE: Record = {} + +/** + * This function will import the module defined in importer just once and then cache the default export of + * that module. + * + * It gives you the default export of the module. + * + * **Note: It is your job to ensure that the name provided is unique across all routes.** + * + * @example + * + * ```ts + * const handler = await importHandler('myUniqueNameSpace', () => import('./getUser.handler')) + * return handler({ ctx, input }) + * ``` + */ +export const importHandler = async < + T extends { + // eslint-disable-next-line @typescript-eslint/ban-types + default: Function + }, +>( + /** + * The name of the handler in cache. It has to be unique across all routes + */ + name: string, + importer: () => Promise +) => { + const nameInCache = name as keyof typeof HANDLER_CACHE + + if (!HANDLER_CACHE[nameInCache]) { + const importedModule = await importer() + HANDLER_CACHE[nameInCache] = importedModule.default + return importedModule.default as T['default'] + } + + return HANDLER_CACHE[nameInCache] as unknown as T['default'] +} diff --git a/packages/api/turbo/generators/templates/handlers/handler.ts.hbs b/packages/api/turbo/generators/templates/handlers/handler.ts.hbs index 17299d45b3..2b27258ef3 100644 --- a/packages/api/turbo/generators/templates/handlers/handler.ts.hbs +++ b/packages/api/turbo/generators/templates/handlers/handler.ts.hbs @@ -17,3 +17,5 @@ export const {{name}} = async ({ctx}: TRPCHandlerParams) => { handleError(error) } } + +export default {{name}} From f2fcf9e0bdf30055fce245e1ca9bd3baa29be831 Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Fri, 26 Jan 2024 13:19:57 -0500 Subject: [PATCH 28/67] service associate dropdown --- .../org/[slug]/[orgLocationId]/edit/index.tsx | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/apps/app/src/pages/org/[slug]/[orgLocationId]/edit/index.tsx b/apps/app/src/pages/org/[slug]/[orgLocationId]/edit/index.tsx index 30b3cc10d5..b6f9ef6440 100644 --- a/apps/app/src/pages/org/[slug]/[orgLocationId]/edit/index.tsx +++ b/apps/app/src/pages/org/[slug]/[orgLocationId]/edit/index.tsx @@ -1,3 +1,4 @@ +import { DevTool } from '@hookform/devtools' import { createStyles, Divider, Grid, Skeleton, Stack, Tabs, Title, useMantineTheme } from '@mantine/core' import { type InferGetServerSidePropsType, type NextPage } from 'next' import Head from 'next/head' @@ -22,7 +23,7 @@ import { VisitCard } from '@weareinreach/ui/components/sections/VisitCard' import { OrgLocationPageLoading } from '@weareinreach/ui/loading-states/OrgLocationPage' import { api } from '~app/utils/api' import { getServerSideTranslations } from '~app/utils/i18n' -import { MultiSelectPopover } from '~ui/components/data-portal/MultiSelectPopover' +import { MultiSelectPopover } from '~ui/components/data-portal/MultiSelectPopover/hook-form' const useStyles = createStyles((theme) => ({ tabsList: { @@ -66,11 +67,12 @@ const OrgLocationPage: NextPage serviceId) } + : undefined + const formMethods = useForm({ - values: { - name: data?.name, - services: data?.services.map(({ serviceId }) => serviceId) ?? [], - }, + values: defaultFormValues, }) const hasAlerts = Array.isArray(alertData) && alertData.length > 0 @@ -172,7 +174,13 @@ const OrgLocationPage: NextPage {'Associate service(s) to this location'} - + {'Associated services'} @@ -195,6 +203,7 @@ const OrgLocationPage: NextPage + ) From cbb5d281d65d0f0833ba02faf1fe301ab412f201 Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Fri, 26 Jan 2024 13:20:42 -0500 Subject: [PATCH 29/67] create new routers: page & component --- packages/api/router/component/index.ts | 17 +++++++++++ .../component/query.serviceModal.handler.ts | 14 +++++++++ .../component/query.serviceModal.schema.ts | 6 ++++ packages/api/router/component/schemas.ts | 3 ++ packages/api/router/index.ts | 4 +++ packages/api/router/page/index.ts | 19 ++++++++++++ .../router/page/query.serviceEdit.handler.ts | 29 +++++++++++++++++++ .../router/page/query.serviceEdit.schema.ts | 6 ++++ packages/api/router/page/schemas.ts | 3 ++ 9 files changed, 101 insertions(+) create mode 100644 packages/api/router/component/index.ts create mode 100644 packages/api/router/component/query.serviceModal.handler.ts create mode 100644 packages/api/router/component/query.serviceModal.schema.ts create mode 100644 packages/api/router/component/schemas.ts create mode 100644 packages/api/router/page/index.ts create mode 100644 packages/api/router/page/query.serviceEdit.handler.ts create mode 100644 packages/api/router/page/query.serviceEdit.schema.ts create mode 100644 packages/api/router/page/schemas.ts diff --git a/packages/api/router/component/index.ts b/packages/api/router/component/index.ts new file mode 100644 index 0000000000..f483f3a3da --- /dev/null +++ b/packages/api/router/component/index.ts @@ -0,0 +1,17 @@ +import { defineRouter, importHandler, permissionedProcedure, publicProcedure } from '~api/lib/trpc' + +import * as schema from './schemas' + +const NAMESPACE = 'component' + +const namespaced = (s: string) => `${NAMESPACE}.${s}` + +export const componentRouter = defineRouter({ + serviceModal: publicProcedure.input(schema.ZServiceModalSchema).query(async (opts) => { + const handler = await importHandler( + namespaced('serviceModal'), + () => import('./query.serviceModal.handler') + ) + return handler(opts) + }), +}) diff --git a/packages/api/router/component/query.serviceModal.handler.ts b/packages/api/router/component/query.serviceModal.handler.ts new file mode 100644 index 0000000000..4fa96188d3 --- /dev/null +++ b/packages/api/router/component/query.serviceModal.handler.ts @@ -0,0 +1,14 @@ +import { prisma } from '@weareinreach/db' +import { handleError } from '~api/lib/errorHandler' +import { type TRPCHandlerParams } from '~api/types/handler' + +import { type TServiceModalSchema } from './query.serviceModal.schema' + +export const serviceModal = async ({ ctx, input }: TRPCHandlerParams) => { + try { + return null + } catch (error) { + handleError(error) + } +} +export default serviceModal diff --git a/packages/api/router/component/query.serviceModal.schema.ts b/packages/api/router/component/query.serviceModal.schema.ts new file mode 100644 index 0000000000..11b0a756b3 --- /dev/null +++ b/packages/api/router/component/query.serviceModal.schema.ts @@ -0,0 +1,6 @@ +import { z } from 'zod' + +import { prefixedId } from '~api/schemas/idPrefix' + +export const ZServiceModalSchema = z.object({ id: prefixedId('orgService') }) +export type TServiceModalSchema = z.infer diff --git a/packages/api/router/component/schemas.ts b/packages/api/router/component/schemas.ts new file mode 100644 index 0000000000..5636327fe3 --- /dev/null +++ b/packages/api/router/component/schemas.ts @@ -0,0 +1,3 @@ +// codegen:start {preset: barrel, include: ./*.schema.ts} +export * from './query.serviceModal.schema' +// codegen:end diff --git a/packages/api/router/index.ts b/packages/api/router/index.ts index 74a4a0ac85..d0a62d9c74 100644 --- a/packages/api/router/index.ts +++ b/packages/api/router/index.ts @@ -1,7 +1,9 @@ import { defineRouter } from '~api/lib/trpc' +import { pageRouter } from '~api/router/page' import { attributeRouter } from './attribute' import { authRouter } from './auth' +import { componentRouter } from './component' import { fieldOptRouter } from './fieldOpt' import { geoRouter } from './geo' import { internalNoteRouter } from './internalNote' @@ -25,6 +27,7 @@ import { userRouter } from './user' export const appRouter = defineRouter({ attribute: attributeRouter, auth: authRouter, + component: componentRouter, fieldOpt: fieldOptRouter, geo: geoRouter, internalNote: internalNoteRouter, @@ -37,6 +40,7 @@ export const appRouter = defineRouter({ orgPhoto: orgPhotoRouter, orgWebsite: orgWebsiteRouter, orgSocialMedia: orgSocialMediaRouter, + page: pageRouter, quicklink: quickLinkRouter, review: reviewRouter, savedList: savedListRouter, diff --git a/packages/api/router/page/index.ts b/packages/api/router/page/index.ts new file mode 100644 index 0000000000..5909d8a5b4 --- /dev/null +++ b/packages/api/router/page/index.ts @@ -0,0 +1,19 @@ +import { defineRouter, importHandler, permissionedProcedure, publicProcedure } from '~api/lib/trpc' + +import * as schema from './schemas' + +const NAMESPACE = 'page' + +const namespaced = (s: string) => `${NAMESPACE}.${s}` + +export const pageRouter = defineRouter({ + serviceEdit: permissionedProcedure('createOrgService') + .input(schema.ZServiceEditSchema) + .query(async (opts) => { + const handler = await importHandler( + namespaced('serviceEdit'), + () => import('./query.serviceEdit.handler') + ) + return handler(opts) + }), +}) diff --git a/packages/api/router/page/query.serviceEdit.handler.ts b/packages/api/router/page/query.serviceEdit.handler.ts new file mode 100644 index 0000000000..35067c6967 --- /dev/null +++ b/packages/api/router/page/query.serviceEdit.handler.ts @@ -0,0 +1,29 @@ +import { prisma } from '@weareinreach/db' +import { handleError } from '~api/lib/errorHandler' +import { type TRPCHandlerParams } from '~api/types/handler' + +import { type TServiceEditSchema } from './query.serviceEdit.schema' + +export const serviceEdit = async ({ ctx, input }: TRPCHandlerParams) => { + try { + const result = await prisma.orgService.findUnique({ + where: input, + select: { + id: true, + deleted: true, + published: true, + createdAt: true, + updatedAt: true, + serviceName: { select: { tsKey: { select: { key: true, text: true, ns: true } } } }, + }, + }) + const { serviceName, ...rest } = result ?? {} + return { + name: serviceName?.tsKey, + ...rest, + } + } catch (error) { + handleError(error) + } +} +export default serviceEdit diff --git a/packages/api/router/page/query.serviceEdit.schema.ts b/packages/api/router/page/query.serviceEdit.schema.ts new file mode 100644 index 0000000000..62f4cf2b4f --- /dev/null +++ b/packages/api/router/page/query.serviceEdit.schema.ts @@ -0,0 +1,6 @@ +import { z } from 'zod' + +import { prefixedId } from '~api/schemas/idPrefix' + +export const ZServiceEditSchema = z.object({ id: prefixedId('orgService') }) +export type TServiceEditSchema = z.infer diff --git a/packages/api/router/page/schemas.ts b/packages/api/router/page/schemas.ts new file mode 100644 index 0000000000..444cdfdd5d --- /dev/null +++ b/packages/api/router/page/schemas.ts @@ -0,0 +1,3 @@ +// codegen:start {preset: barrel, include: ./*.schema.ts} +export * from './query.serviceEdit.schema' +// codegen:end From 5b107f19aaed7604b956605093548185b41d4ef7 Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Fri, 26 Jan 2024 18:04:20 -0500 Subject: [PATCH 30/67] start separating badges --- InReach.code-workspace | 116 ++-- packages/ui/components/core/Badge.tsx | 586 ----------------- packages/ui/components/core/Badge/Group.tsx | 31 + packages/ui/components/core/Badge/Leader.tsx | 57 ++ .../ui/components/core/Badge/National.tsx | 72 +++ .../core/Badge/ServiceTag.styles.ts | 14 + .../ui/components/core/Badge/ServiceTag.tsx | 43 ++ .../ui/components/core/Badge/Verified.tsx | 54 ++ .../index.stories.tsx} | 20 +- packages/ui/components/core/Badge/index.tsx | 594 ++++++++++++++++++ packages/ui/components/core/Badge/styles.ts | 109 ++++ 11 files changed, 1042 insertions(+), 654 deletions(-) delete mode 100644 packages/ui/components/core/Badge.tsx create mode 100644 packages/ui/components/core/Badge/Group.tsx create mode 100644 packages/ui/components/core/Badge/Leader.tsx create mode 100644 packages/ui/components/core/Badge/National.tsx create mode 100644 packages/ui/components/core/Badge/ServiceTag.styles.ts create mode 100644 packages/ui/components/core/Badge/ServiceTag.tsx create mode 100644 packages/ui/components/core/Badge/Verified.tsx rename packages/ui/components/core/{Badge.stories.tsx => Badge/index.stories.tsx} (93%) create mode 100644 packages/ui/components/core/Badge/index.tsx create mode 100644 packages/ui/components/core/Badge/styles.ts diff --git a/InReach.code-workspace b/InReach.code-workspace index f0076511f0..6acb7231ab 100644 --- a/InReach.code-workspace +++ b/InReach.code-workspace @@ -16,106 +16,106 @@ "prisma.prisma", "riccardoforina.storybook-helper", "unifiedjs.vscode-mdx", - "yzhang.markdown-all-in-one" - ] + "yzhang.markdown-all-in-one", + ], }, "folders": [ { "name": "🚀 InReach App (@weareinreach/app)", - "path": "./apps/app" + "path": "./apps/app", }, { "name": "📦 Shared UI (@weareinreach/ui)", - "path": "./packages/ui" + "path": "./packages/ui", }, { "name": "📦 Centralized database (@weareinreach/db)", - "path": "./packages/db" + "path": "./packages/db", }, { "name": "📦 tRPC API (@weareinreach/api)", - "path": "./packages/api" + "path": "./packages/api", }, { "name": "🤷🏻 Analytics (@weareinreach/analytics)", - "path": "./packages/analytics" + "path": "./packages/analytics", }, { "name": "🔐 Authentication (@weareinreach/auth)", - "path": "./packages/auth" + "path": "./packages/auth", }, { "name": "🛠️ Utilities (@weareinreach/util)", - "path": "./packages/util" + "path": "./packages/util", }, { "name": "📦 Crowdin Client (@weareinreach/crowdin)", - "path": "./packages/crowdin" + "path": "./packages/crowdin", }, { "name": "⚙️ Environment Variables (@weareinreach/env)", - "path": "./packages/env" + "path": "./packages/env", }, { "name": "⚙️ Shared configs (@weareinreach/config)", - "path": "./packages/config" + "path": "./packages/config", }, { "name": "⚙️ ESLint Config (@weareinreach/eslint-config)", - "path": "./packages/eslint-config" + "path": "./packages/eslint-config", }, { "name": "🚀 InReach main site (@weareinreach/web)", - "path": "./apps/web" + "path": "./apps/web", }, { "name": "✨ InReach (root)", - "path": "./" + "path": "./", }, { "name": "🐑 AWS Lambdas", - "path": "./lambdas" + "path": "./lambdas", }, { "name": "🛠️ Patched packages", - "path": "./patches" + "path": "./patches", }, { "name": "📚 Documentation (@weareinreach/docs)", - "path": "./docs" + "path": "./docs", }, { "name": "🐳 Docker", - "path": "./docker" - } + "path": "./docker", + }, ], "settings": { "[javascript]": { "editor.autoClosingBrackets": "languageDefined", - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "esbenp.prettier-vscode", }, "[javascriptreact]": { "editor.autoClosingBrackets": "languageDefined", "editor.autoClosingOvertype": "always", - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "esbenp.prettier-vscode", }, "[json]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "esbenp.prettier-vscode", }, "[jsonc]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "esbenp.prettier-vscode", }, "[prisma]": { "editor.defaultFormatter": "Prisma.prisma", "editor.formatOnSave": true, - "editor.formatOnSaveMode": "file" + "editor.formatOnSaveMode": "file", }, "[typescript]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "esbenp.prettier-vscode", }, "[typescriptreact]": { "editor.autoClosingBrackets": "languageDefined", - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "esbenp.prettier-vscode", }, "[yaml]": { "editor.defaultFormatter": "redhat.vscode-yaml", @@ -123,44 +123,44 @@ "editor.formatOnPaste": true, "editor.formatOnSave": true, "editor.formatOnType": true, - "editor.insertSpaces": true + "editor.insertSpaces": true, }, "debug.javascript.terminalOptions": { - "skipFiles": ["/**/*", "**/node_modules/**/*@babel*/*"] + "skipFiles": ["/**/*", "**/node_modules/**/*@babel*/*"], }, "editor.codeActionsOnSave": { - "source.fixAll.eslint": "explicit" + "source.fixAll.eslint": "explicit", }, "editor.formatOnSave": true, "editor.tabSize": 2, "eslint.lintTask.enable": true, "eslint.options": { - "cache": true + "cache": true, }, "eslint.ignoreUntitled": true, "eslint.nodeEnv": "development", "eslint.rules.customizations": [ { "rule": "import/order", - "severity": "off" + "severity": "off", }, { "rule": "import/newline-after-import", - "severity": "off" + "severity": "off", }, { "rule": "import/no-extraneous-dependencies", - "severity": "off" + "severity": "off", }, { "rule": "@typescript-eslint/consistent-type-imports", - "severity": "off" + "severity": "off", }, { "rule": "@typescript-eslint/no-unused-vars", - "severity": "info" + "severity": "info", }, - { "rule": "sort-imports", "severity": "off" } + { "rule": "sort-imports", "severity": "off" }, ], "eslint.useESLintClass": true, "explorer.decorations.badges": true, @@ -168,13 +168,13 @@ "explorer.fileNesting.enabled": true, "explorer.fileNesting.expand": false, "explorer.fileNesting.patterns": { - "*.tsx": "${capture}.ts, ${capture}.stories.tsx", + "*.tsx": "${capture}.ts, ${capture}.stories.tsx, ${capture}.styles.ts, ${capture}.styles.tsx", "*.ts": "${capture}.ts, ${capture}.stories.tsx", "*eslintrc.js": ".eslintignore, .eslintcache", "package.json": "pnpm-lock*.yaml, pnpm-workspace.yaml, .nvmrc", "*prettierrc.js": ".prettierignore, .prettiercache, .editorconfig", "vercel.json": ".vercelignore", - "README.md": "LICENSE.md" + "README.md": "LICENSE.md", }, "files.exclude": { ".next/": true, @@ -192,7 +192,7 @@ "packages/": true, "patches/": true, "storybook-static/": true, - "lambdas/": true + "lambdas/": true, }, "files.watcherExclude": { "**/.git/objects/**": true, @@ -205,12 +205,12 @@ "**/storybook-static/**": true, "**/zod-schemas/**": true, "**/.turbo/**": true, - "**/generated/**": true + "**/generated/**": true, }, "search.exclude": { "**/node_modules": true, "**/*.code-search": true, - "pnpm-lock.yaml": true + "pnpm-lock.yaml": true, }, "i18n-ally.annotationInPlace": false, "i18n-ally.defaultNamespace": "common", @@ -220,11 +220,11 @@ "i18n-ally.extract.ignored": [ "1px solid ${theme.colorScheme === 'dark' ? theme.colors.dark[5] : theme.colors.gray[2]}", "${theme.spacing.md}px ${theme.spacing.md}px", - "0 ${theme.spacing.sm}px" + "0 ${theme.spacing.sm}px", ], "i18n-ally.extract.ignoredByFiles": { "../../packages/ui/.storybook/i18next.ts": ["*"], - "**/packages/db/**/*.ts": ["*"] + "**/packages/db/**/*.ts": ["*"], }, "i18n-ally.extract.keygenStrategy": "slug", "i18n-ally.extract.keygenStyle": "kebab-case", @@ -245,18 +245,18 @@ "json.format.enable": true, "json.validate.enable": true, "markdownlint.config": { - "MD033": false + "MD033": false, }, "prettier.resolveGlobalModules": false, "sonarlint.connectedMode.project": { "connectionId": "InReach", - "projectKey": "weareinreach_InReach" + "projectKey": "weareinreach_InReach", }, "tms.stringsCompletionFileExtensions": "ts,tsx,json", "typescript.preferences.importModuleSpecifier": "non-relative", "typescript.tsdk": "✨ InReach (root)/node_modules/typescript/lib", "typescript.enablePromptUseWorkspaceTsdk": true, - "typescript.workspaceSymbols.scope": "allOpenProjects" + "typescript.workspaceSymbols.scope": "allOpenProjects", }, "launch": { "configurations": [ @@ -265,7 +265,7 @@ "request": "launch", "type": "chrome", "url": "http://localhost:3000", - "webRoot": "${workspaceFolder}" + "webRoot": "${workspaceFolder}", }, { "name": "Attach by Process ID", @@ -274,7 +274,7 @@ "skipFiles": ["/**/*", "${workspaceFolder}/node_modules/**/*"], "type": "node", "autoAttachChildProcesses": true, - "restart": true + "restart": true, }, { "name": "Attach to :9229", @@ -283,7 +283,7 @@ "skipFiles": ["/**", "${workspaceFolder}/node_modules/**/*"], "type": "node", "autoAttachChildProcesses": true, - "restart": true + "restart": true, }, { "disableNetworkCache": true, @@ -296,7 +296,7 @@ "url": "http://localhost:3000", "userDataDir": true, "webRoot": "${workspaceFolder}", - "sourceMaps": true + "sourceMaps": true, }, { "command": "pnpm dev", @@ -305,11 +305,11 @@ "serverReadyAction": { "action": "startDebugging", "name": "Launch Brave", - "pattern": "http://localhost:([0-9]+)" + "pattern": "http://localhost:([0-9]+)", }, "skipFiles": ["/**/*", "${workspaceFolder}/node_modules/**/*"], "sourceMaps": true, - "type": "node-terminal" + "type": "node-terminal", }, { "command": "yarn dev", @@ -318,11 +318,11 @@ "serverReadyAction": { "action": "debugWithChrome", "pattern": "(?:(.*?\bserver.*ready\b)|(.*?\bready.*server\b)).*(\bhttps?://.+\b)", - "uriFormat": "%s" + "uriFormat": "%s", }, "sourceMaps": true, - "type": "node-terminal" - } - ] - } + "type": "node-terminal", + }, + ], + }, } diff --git a/packages/ui/components/core/Badge.tsx b/packages/ui/components/core/Badge.tsx deleted file mode 100644 index 9578c8996e..0000000000 --- a/packages/ui/components/core/Badge.tsx +++ /dev/null @@ -1,586 +0,0 @@ -import { - type BadgeProps, - type BadgeStylesNames, - ColorSwatch, - createStyles, - type CSSObject, - Divider, - List, - type ListProps, - Badge as MantineBadge, - type MantineTheme, - rem, - Text, - Tooltip, - type TooltipProps, - useMantineTheme, -} from '@mantine/core' -import { type PolymorphicComponentProps } from '@mantine/utils' -import { type TOptions } from 'i18next' -import { DateTime } from 'luxon' -import { merge } from 'merge-anything' -import { Trans, useTranslation } from 'next-i18next' -import { forwardRef, type ReactNode, useState } from 'react' - -import { Link } from '~ui/components/core/Link' -import { useCustomVariant } from '~ui/hooks' -import { Icon, type IconList, isValidIcon } from '~ui/icon' -import { ClaimOrgModal } from '~ui/modals/ClaimOrg' - -const badgeVariants: BadgeVariants = (theme, params) => { - switch (params.variant) { - case 'community': { - return { - root: { - backgroundColor: theme.other.colors.secondary.white, - borderColor: theme.other.colors.tertiary.coolGray, - }, - inner: { - fontSize: theme.fontSizes.sm, - [theme.fn.largerThan('sm')]: { - fontSize: theme.fontSizes.md, - }, - }, - leftSection: { - fontSize: theme.fontSizes.sm, - marginRight: rem(6), - [theme.fn.largerThan('sm')]: { - fontSize: theme.fontSizes.md, - }, - }, - } - } - case 'service': { - return { - root: { - backgroundColor: theme.other.colors.primary.lightGray, - borderColor: theme.other.colors.secondary.white, - }, - inner: { - fontSize: theme.fontSizes.sm, - [theme.fn.largerThan('sm')]: { - fontSize: theme.fontSizes.md, - }, - }, - } - } - case 'national': - case 'leader': { - return { - leftSection: { - '& *': { - fontSize: theme.fontSizes.xs, - borderRadius: theme.radius.xl, - height: rem(24), - width: rem(24), - margin: 0, - textAlign: 'center', - paddingBottom: rem(4), - }, - }, - inner: { - '& *': { - color: theme.other.colors.secondary.black, - marginLeft: theme.spacing.xs, - }, - }, - root: { - border: 0, - padding: 0, - '&[data-minify]': { - height: rem(40), - width: rem(40), - ['&:hover']: { - backgroundColor: theme.other.colors.primary.lightGray, - }, - radius: theme.radius.xl, - padding: 0, - }, - '&[data-hidebg]': { - backgroundColor: undefined, - height: undefined, - width: undefined, - paddingLeft: rem(6), - paddingRight: rem(6), - }, - }, - } - } - case 'privatePractice': - case 'claimed': - case 'unclaimed': - case 'verified': - case 'verifiedReviewer': - case 'attribute': { - return { - inner: { - '& *, span': { - ...theme.other.utilityFonts.utility1, - width: 'auto', - marginLeft: theme.spacing.xs, - textTransform: 'none', - }, - }, - root: { - border: 0, - minHeight: rem(24), - padding: '0', - lineHeight: 'inherit', - borderRadius: 0, - }, - leftSection: { - height: rem(24), - }, - } - } - case 'remote': { - return { - root: { - border: 0, - height: rem(20), - padding: '0', - lineHeight: 'inherit', - borderRadius: 0, - }, - leftSection: { - height: rem(20), - }, - } - } - - default: - return {} - } -} - -const useVariantStyles = createStyles((theme, params: BadgeStylesParams) => badgeVariants(theme, params)) -const useUnclaimedStyles = createStyles((theme) => ({ - root: theme.fn.hover({ cursor: 'pointer' }), -})) - -const customVariants = [ - 'community', - 'service', - 'leader', - 'verified', - 'claimed', - 'unclaimed', - 'attribute', - 'privatePractice', - 'verifiedReviewer', - 'remote', - 'national', -] as const - -const customVariantMap = { - community: undefined, - service: undefined, - leader: 'outline', - verified: 'outline', - claimed: 'outline', - unclaimed: 'outline', - attribute: 'outline', - privatePractice: 'outline', - verifiedReviewer: 'outline', - remote: 'outline', - national: 'outline', -} satisfies Record - -/** Badge variants `serviceTag` and `communityTag` are responsive - the sizing changes at the `sm` breakpoint. */ -export const Badge = forwardRef>( - ({ hideTooltip, ...props }, ref) => { - const variants = useCustomVariant() - const { t, i18n } = useTranslation( - props.variant === 'national' ? ['common', 'attribute', 'country'] : ['common', 'attribute'] - ) - const isCustom = (customVariants as ReadonlyArray).includes(props.variant ?? 'light') - const theme = useMantineTheme() - const { classes: baseClasses } = useVariantStyles({ - variant: props.variant ?? 'light', - ...(props.variant === 'leader' ? { minify: props.minify, hideBg: props.hideBg } : {}), - }) - const { classes: unclaimedClasses } = useUnclaimedStyles() - const { variant, classNames, ...others } = props as BadgeProps - const [modalOpen, setModalOpen] = useState(false) - - const leftSection = (() => { - switch (props.variant) { - case 'leader': { - return ( - - {props.icon} - - ) - } - case 'national': { - return ( - - ) - } - case 'verified': { - return ( - - ) - } - case 'attribute': { - return isValidIcon(props.icon) ? ( - - ) : null - } - case 'community': { - return props.icon - } - case 'claimed': { - return ( - - ) - } - case 'unclaimed': { - return - } - case 'privatePractice': { - return ( - - ) - } - case 'verifiedReviewer': { - return ( - - ) - } - case 'remote': { - return - } - } - })() - - let passedBadgeProps: BadgeProps = others - const children = (() => { - switch (props.variant) { - case 'leader': { - const { tsKey, minify, hideBg: _, variant: _variant, iconBg: _iconBg, ...rest } = props - passedBadgeProps = rest - return minify ? null : {t(tsKey, { ns: 'attribute' })} - } - case 'verified': { - return {t('verified-information')} - } - case 'attribute': { - const { tsKey, tsNs, tProps, variant: _variant, ...rest } = props - passedBadgeProps = rest - return {t(tsKey, { ns: tsNs, ...tProps })} - } - case 'community': { - const { tsKey, tProps, variant: _variant, ...rest } = props - passedBadgeProps = rest - return t(tsKey, { ns: 'attribute', ...tProps }) - } - case 'service': { - const { tsKey, tProps, variant: _variant, ...rest } = props - passedBadgeProps = rest - return t(tsKey, { ns: 'services', ...tProps }) - } - case 'claimed': { - return {t('claimed')} - } - case 'unclaimed': { - return {t('unclaimed')} - } - case 'privatePractice': { - return {t('privatePractice')} - } - case 'verifiedReviewer': { - return {t('in-reach-verified-reviewer')} - } - default: { - return props.children - } - } - })() - - const renderTooltip: Omit | undefined = (() => { - switch (props.variant) { - case 'community': { - return { - label: t('badge.community-tool-tip'), - } - } - case 'remote': { - return { - label: t('badge.remote-tool-tip'), - } - } - case 'service': { - return { - label: t('badge.service-tool-tip'), - } - } - case 'national': { - if (Array.isArray(props.tsKey)) { - const formatter = new Intl.ListFormat(i18n.resolvedLanguage, { - style: 'long', - type: 'conjunction', - }) - return { - label: t('badge.national-tool-tip', { - country: formatter.format(props.tsKey.map((country) => `$t(country:${country}.name)`)), - interpolation: { skipOnVariables: false }, - }), - } - } - return { - label: t('badge.national-tool-tip', { - country: `$t(country:${props.tsKey}.name)`, - interpolation: { skipOnVariables: false }, - }), - } - } - case 'leader': { - return { - label: t('adjective.organization', { ns: 'common', adjective: `$t(attribute:${props.tsKey})` }), //t(props.tsKey, { ns: 'attribute' }), - disabled: !props.minify, - } - } - case 'verified': { - const lastVerified = - props.lastverified instanceof Date ? props.lastverified : new Date(props.lastverified) - - const dateString = DateTime.fromJSDate(lastVerified) - .setLocale(i18n.resolvedLanguage ?? 'en') - .toLocaleString(DateTime.DATE_MED_WITH_WEEKDAY) - const label = t('verified-information-detail', { dateString }) - - return { - label, - multiline: true, - maw: { base: '90vw', xs: 600 }, - } - } - case 'claimed': { - const label = ( - - ), - }} - /> - ) - return { - label, - multiline: true, - closeDelay: 500, - style: { pointerEvents: 'auto' }, - maw: { base: '90vw', xs: 600 }, - } - } - } - })() - - const mantineVariant = isCustom - ? variant - ? customVariantMap[variant as CustomVariants] - : undefined - : (variant as BadgeVariant) - - const styleDataProps = { - ...(props.variant === 'leader' && props.minify ? { 'data-minify': true } : {}), - ...(props.variant === 'leader' && props.hideBg ? { 'data-hidebg': true } : {}), - } - - const badge = ( - - {children} - - ) - if (props.variant === 'unclaimed') { - const label = ( - setModalOpen(true)} variant={variants.Link.inheritStyle} />, - }} - /> - ) - return ( - - - {children} - - - ) - } - - if (renderTooltip) { - return ( - - {badge} - - ) - } - return badge - } -) -Badge.displayName = 'Badge' -export const BadgeGroup = ({ badges, withSeparator = false, ...props }: BadgeGroupProps) => { - const variants = useCustomVariant() - const theme = useMantineTheme() - const separator = ( - - ) - const badgeList = badges.map((item: CustomBadgeProps, idx) => ( - - - - )) - - return ( - - {badgeList} - - ) -} - -interface BadgeGroupProps extends Omit { - badges: CustomBadgeProps[] - withSeparator?: boolean -} -type BadgeVariant = BadgeProps['variant'] - -interface BadgeStylesParams { - variant?: BadgeVariant | CustomVariants - minify?: boolean - hideBg?: boolean -} -export type CustomBadgeProps = - | (Omit & { - /** Preset designs */ - variant?: - | Exclude - | 'outline' - /** - * Item rendered on the left side of the badge. Should be either an emoji unicode string or an Icon - * component - */ - leftSection?: ReactNode - hideTooltip?: boolean - }) - | LeaderBadgeProps - | VerifiedBadgeProps - | AttributeTagProps - | CommunityTagProps - | ServiceTagProps - | NationalBadgeProps -type CustomVariants = (typeof customVariants)[number] - -export type CustomBadgeStyles = Partial<{ [className in BadgeStylesNames]: CSSObject }> -type BadgeVariants = (theme: MantineTheme, params: BadgeStylesParams) => CustomBadgeStyles - -type LeaderBadgeProps = { - variant: 'leader' - /** Background color for icon */ - iconBg: string - /** Unicode emoji string */ - icon: string - /** I18n translation key */ - tsKey: string - /** Show icon only? */ - minify?: boolean - /** Hide light gray bg for mini */ - hideBg?: boolean - hideTooltip?: boolean -} -type NationalBadgeProps = { - variant: 'national' - /** Translation key for the country name(s) */ - tsKey: string | string[] - hideTooltip?: boolean -} - -type VerifiedBadgeProps = { - variant: 'verified' - lastverified: Date | string - hideTooltip?: boolean -} - -export type AttributeTagProps = { - variant: 'attribute' - icon: IconList | string - tsKey: string - tsNs: string - tProps?: Omit - hideTooltip?: boolean -} - -export type CommunityTagProps = { - variant: 'community' - icon: string - tsKey: string - tProps?: Omit - hideTooltip?: boolean -} -export type ServiceTagProps = { - variant: 'service' - tsKey: string - tProps?: Omit - hideTooltip?: boolean -} diff --git a/packages/ui/components/core/Badge/Group.tsx b/packages/ui/components/core/Badge/Group.tsx new file mode 100644 index 0000000000..5d193b6555 --- /dev/null +++ b/packages/ui/components/core/Badge/Group.tsx @@ -0,0 +1,31 @@ +import { Divider, List, type ListProps, useMantineTheme } from '@mantine/core' +import { Children, type ReactNode } from 'react' + +import { useCustomVariant } from '~ui/hooks/useCustomVariant' + +export const _BadgeGroup = ({ withSeparator, children, ...props }: BadgeGroupProps) => { + const variants = useCustomVariant() + const theme = useMantineTheme() + const separator = ( + + ) + + return ( + + {Children.map(children, (child, idx) => ( + {child} + ))} + + ) +} +_BadgeGroup.displayName = 'Badge.Group' + +export interface BadgeGroupProps extends ListProps { + withSeparator?: boolean + children: ReactNode +} diff --git a/packages/ui/components/core/Badge/Leader.tsx b/packages/ui/components/core/Badge/Leader.tsx new file mode 100644 index 0000000000..331d56f2ee --- /dev/null +++ b/packages/ui/components/core/Badge/Leader.tsx @@ -0,0 +1,57 @@ +import { Badge, type BadgeProps, ColorSwatch, Text, Tooltip } from '@mantine/core' +import { useTranslation } from 'next-i18next' +import { forwardRef, type ReactNode } from 'react' + +import { useCustomVariant } from '~ui/hooks/useCustomVariant' + +import { useSharedStyles } from './styles' + +export const _Leader = forwardRef( + ({ iconBg, icon, minify, hideBg, hideTooltip, children, ...props }, ref) => { + const { classes } = useSharedStyles('leader') + const { t } = useTranslation(['common', 'attribute']) + const variants = useCustomVariant() + + const leftSection = ( + + {icon} + + ) + + const badge = ( + + {minify ? null : {children}} + + ) + + return hideTooltip ? ( + badge + ) : ( + + {badge} + + ) + } +) +_Leader.displayName = 'Badge.Leader' + +export interface BadgeLeaderProps extends BadgeProps { + /** Background color for icon */ + iconBg: string + /** Unicode emoji string */ + icon: string + /** Show icon only? */ + minify?: boolean + /** Hide light gray bg for mini */ + hideBg?: boolean + hideTooltip?: boolean + children: ReactNode +} diff --git a/packages/ui/components/core/Badge/National.tsx b/packages/ui/components/core/Badge/National.tsx new file mode 100644 index 0000000000..db049f5358 --- /dev/null +++ b/packages/ui/components/core/Badge/National.tsx @@ -0,0 +1,72 @@ +import { Badge, type BadgeProps, ColorSwatch, rem, Text, Tooltip, useMantineTheme } from '@mantine/core' +import compact from 'just-compact' +import { useTranslation } from 'next-i18next' +import { forwardRef, type ReactNode } from 'react' + +import { useCustomVariant } from '~ui/hooks/useCustomVariant' +import { Icon } from '~ui/icon' + +import { useSharedStyles } from './styles' + +export const _National = forwardRef( + ({ hideTooltip, countries, ...props }, ref) => { + const { classes } = useSharedStyles('national') + const theme = useMantineTheme() + const { t, i18n } = useTranslation(['common', 'attribute']) + const variants = useCustomVariant() + + const leftSection = ( + + ) + + const badge = ( + + ) + + const listFormatter = new Intl.ListFormat(i18n.resolvedLanguage, { + style: 'long', + type: 'conjunction', + }) + + const countryNameFormatter = new Intl.DisplayNames(i18n.resolvedLanguage, { type: 'region' }) + + const translatedCountries = compact(countries.map((cca2) => countryNameFormatter.of(cca2))) + + const tooltipLabel = t('badge.national-tool-tip', { + country: listFormatter.format(translatedCountries), + }) + + return hideTooltip ? ( + badge + ) : ( + + {badge} + + ) + } +) +_National.displayName = 'Badge.National' + +export interface BadgeNationalProps extends BadgeProps { + hideTooltip?: boolean + /** + * Array of two letter country codes + * + * @example {undefined} 'US', 'CA' + */ + countries: string[] +} diff --git a/packages/ui/components/core/Badge/ServiceTag.styles.ts b/packages/ui/components/core/Badge/ServiceTag.styles.ts new file mode 100644 index 0000000000..61ba16c490 --- /dev/null +++ b/packages/ui/components/core/Badge/ServiceTag.styles.ts @@ -0,0 +1,14 @@ +import { createStyles, rem } from '@mantine/core' + +export const useStyles = createStyles((theme) => ({ + root: { + backgroundColor: theme.other.colors.primary.lightGray, + borderColor: theme.other.colors.secondary.white, + }, + inner: { + fontSize: theme.fontSizes.sm, + [theme.fn.largerThan('sm')]: { + fontSize: theme.fontSizes.md, + }, + }, +})) diff --git a/packages/ui/components/core/Badge/ServiceTag.tsx b/packages/ui/components/core/Badge/ServiceTag.tsx new file mode 100644 index 0000000000..be3731988d --- /dev/null +++ b/packages/ui/components/core/Badge/ServiceTag.tsx @@ -0,0 +1,43 @@ +import { Badge, type BadgeProps, Tooltip } from '@mantine/core' +import { useTranslation } from 'next-i18next' +import { forwardRef, type ReactNode } from 'react' + +import { useCustomVariant } from '~ui/hooks/useCustomVariant' + +import { useStyles } from './ServiceTag.styles' + +export const _ServiceTag = forwardRef( + ({ hideTooltip, children, ...props }, ref) => { + const { classes } = useStyles() + const variants = useCustomVariant() + const { t } = useTranslation(['common']) + + const badge = ( + + {children} + + ) + + return hideTooltip ? ( + badge + ) : ( + + {badge} + + ) + } +) +_ServiceTag.displayName = 'Badge.ServiceTag' + +export interface BadgeServiceTagProps extends BadgeProps { + children: ReactNode + hideTooltip?: boolean +} diff --git a/packages/ui/components/core/Badge/Verified.tsx b/packages/ui/components/core/Badge/Verified.tsx new file mode 100644 index 0000000000..2d87cf7b9a --- /dev/null +++ b/packages/ui/components/core/Badge/Verified.tsx @@ -0,0 +1,54 @@ +import { Badge, type BadgeProps, ColorSwatch, rem, Text, Tooltip, useMantineTheme } from '@mantine/core' +import compact from 'just-compact' +import { DateTime } from 'luxon' +import { useTranslation } from 'next-i18next' +import { forwardRef, type ReactNode } from 'react' + +import { useCustomVariant } from '~ui/hooks/useCustomVariant' +import { Icon } from '~ui/icon' + +import { useSharedStyles } from './styles' + +export const _Verified = forwardRef( + ({ hideTooltip, lastverified, ...props }, ref) => { + const { classes } = useSharedStyles('verified') + const theme = useMantineTheme() + const { t, i18n } = useTranslation(['common', 'attribute']) + const variants = useCustomVariant() + + const leftSection = ( + + ) + + const badge = ( + + {t('verified-information')} + + ) + const dateDisplay = lastverified instanceof Date ? lastverified : new Date(lastverified) + const dateString = DateTime.fromJSDate(dateDisplay) + .setLocale(i18n.resolvedLanguage ?? 'en') + .toLocaleString(DateTime.DATE_MED_WITH_WEEKDAY) + const label = t('verified-information-detail', { dateString }) + + const tooltipProps = { + label, + multiline: true, + maw: { base: '90vw', xs: 600 }, + } + + return hideTooltip ? ( + badge + ) : ( + + {badge} + + ) + } +) +_Verified.displayName = 'Badge.Verified' + +export interface BadgeVerifiedProps extends BadgeProps { + hideTooltip?: boolean + lastverified: Date | string +} diff --git a/packages/ui/components/core/Badge.stories.tsx b/packages/ui/components/core/Badge/index.stories.tsx similarity index 93% rename from packages/ui/components/core/Badge.stories.tsx rename to packages/ui/components/core/Badge/index.stories.tsx index bf6d4652e5..ffda6f0b23 100644 --- a/packages/ui/components/core/Badge.stories.tsx +++ b/packages/ui/components/core/Badge/index.stories.tsx @@ -2,7 +2,7 @@ import { type Meta, type StoryObj } from '@storybook/react' import { commonTheme as theme } from '~ui/theme/common' -import { Badge, BadgeGroup } from './Badge' +import { Badge, BadgeGroup } from './index' export default { title: 'Design System/Tags and Badges', @@ -271,15 +271,15 @@ export const ServiceGroup = { export const Verified = { args: { - variant: 'verified', lastverified: new Date(2023, 1, 15), }, parameters: { controls: { - include: ['lastverified', 'variant'], + include: ['lastverified'], }, }, -} satisfies StoryDef + render: (args) => , +} satisfies StoryObj export const Claimed = { args: { @@ -333,13 +333,13 @@ export const Remote = { export const National = { args: { - variant: 'national', - tsKey: 'USA.name', + countries: ['US'], }, -} satisfies StoryDef + render: (args) => , +} satisfies StoryObj export const NationalMultiple = { args: { - variant: 'national', - tsKey: ['USA.name', 'CAN.name'], + countries: ['US', 'CA'], }, -} satisfies StoryDef + render: (args) => , +} satisfies StoryObj diff --git a/packages/ui/components/core/Badge/index.tsx b/packages/ui/components/core/Badge/index.tsx new file mode 100644 index 0000000000..3cb71229eb --- /dev/null +++ b/packages/ui/components/core/Badge/index.tsx @@ -0,0 +1,594 @@ +import { + type BadgeProps, + type BadgeStylesNames, + ColorSwatch, + createStyles, + type CSSObject, + Divider, + List, + type ListProps, + Badge as MantineBadge, + type MantineTheme, + rem, + Text, + Tooltip, + type TooltipProps, + useMantineTheme, +} from '@mantine/core' +import { type PolymorphicComponentProps } from '@mantine/utils' +import { type TOptions } from 'i18next' +import { DateTime } from 'luxon' +import { merge } from 'merge-anything' +import { Trans, useTranslation } from 'next-i18next' +import { forwardRef, type ReactNode, useState } from 'react' + +import { Link } from '~ui/components/core/Link' +import { useCustomVariant } from '~ui/hooks' +import { Icon, type IconList, isValidIcon } from '~ui/icon' +import { ClaimOrgModal } from '~ui/modals/ClaimOrg' + +import { _BadgeGroup } from './Group' +import { _Leader } from './Leader' +import { _National } from './National' +import { _ServiceTag } from './ServiceTag' +import { _Verified } from './Verified' + +const badgeVariants: BadgeVariants = (theme, params) => { + switch (params.variant) { + case 'community': { + return { + root: { + backgroundColor: theme.other.colors.secondary.white, + borderColor: theme.other.colors.tertiary.coolGray, + }, + inner: { + fontSize: theme.fontSizes.sm, + [theme.fn.largerThan('sm')]: { + fontSize: theme.fontSizes.md, + }, + }, + leftSection: { + fontSize: theme.fontSizes.sm, + marginRight: rem(6), + [theme.fn.largerThan('sm')]: { + fontSize: theme.fontSizes.md, + }, + }, + } + } + case 'service': { + return { + root: { + backgroundColor: theme.other.colors.primary.lightGray, + borderColor: theme.other.colors.secondary.white, + }, + inner: { + fontSize: theme.fontSizes.sm, + [theme.fn.largerThan('sm')]: { + fontSize: theme.fontSizes.md, + }, + }, + } + } + case 'national': + case 'leader': { + return { + leftSection: { + '& *': { + fontSize: theme.fontSizes.xs, + borderRadius: theme.radius.xl, + height: rem(24), + width: rem(24), + margin: 0, + textAlign: 'center', + paddingBottom: rem(4), + }, + }, + inner: { + '& *': { + color: theme.other.colors.secondary.black, + marginLeft: theme.spacing.xs, + }, + }, + root: { + border: 0, + padding: 0, + '&[data-minify]': { + height: rem(40), + width: rem(40), + ['&:hover']: { + backgroundColor: theme.other.colors.primary.lightGray, + }, + radius: theme.radius.xl, + padding: 0, + }, + '&[data-hidebg]': { + backgroundColor: undefined, + height: undefined, + width: undefined, + paddingLeft: rem(6), + paddingRight: rem(6), + }, + }, + } + } + case 'privatePractice': + case 'claimed': + case 'unclaimed': + case 'verified': + case 'verifiedReviewer': + case 'attribute': { + return { + inner: { + '& *, span': { + ...theme.other.utilityFonts.utility1, + width: 'auto', + marginLeft: theme.spacing.xs, + textTransform: 'none', + }, + }, + root: { + border: 0, + minHeight: rem(24), + padding: '0', + lineHeight: 'inherit', + borderRadius: 0, + }, + leftSection: { + height: rem(24), + }, + } + } + case 'remote': { + return { + root: { + border: 0, + height: rem(20), + padding: '0', + lineHeight: 'inherit', + borderRadius: 0, + }, + leftSection: { + height: rem(20), + }, + } + } + + default: + return {} + } +} + +const useVariantStyles = createStyles((theme, params: BadgeStylesParams) => badgeVariants(theme, params)) +const useUnclaimedStyles = createStyles((theme) => ({ + root: theme.fn.hover({ cursor: 'pointer' }), +})) + +const customVariants = [ + 'community', + 'service', + 'leader', + 'verified', + 'claimed', + 'unclaimed', + 'attribute', + 'privatePractice', + 'verifiedReviewer', + 'remote', + 'national', +] as const + +const customVariantMap = { + community: undefined, + service: undefined, + leader: 'outline', + verified: 'outline', + claimed: 'outline', + unclaimed: 'outline', + attribute: 'outline', + privatePractice: 'outline', + verifiedReviewer: 'outline', + remote: 'outline', + national: 'outline', +} satisfies Record + +/** Badge variants `serviceTag` and `communityTag` are responsive - the sizing changes at the `sm` breakpoint. */ +export const Badge = ({ hideTooltip, ...props }: CustomBadgeProps & { children?: ReactNode }) => { + const variants = useCustomVariant() + const { t, i18n } = useTranslation( + props.variant === 'national' ? ['common', 'attribute', 'country'] : ['common', 'attribute'] + ) + const isCustom = (customVariants as ReadonlyArray).includes(props.variant ?? 'light') + const theme = useMantineTheme() + const { classes: baseClasses } = useVariantStyles({ + variant: props.variant ?? 'light', + ...(props.variant === 'leader' ? { minify: props.minify, hideBg: props.hideBg } : {}), + }) + const { classes: unclaimedClasses } = useUnclaimedStyles() + const { variant, classNames, ...others } = props as BadgeProps + const [modalOpen, setModalOpen] = useState(false) + + const leftSection = (() => { + switch (props.variant) { + case 'leader': { + return ( + + {props.icon} + + ) + } + case 'national': { + return ( + + ) + } + case 'verified': { + return ( + + ) + } + case 'attribute': { + return isValidIcon(props.icon) ? ( + + ) : null + } + case 'community': { + return props.icon + } + case 'claimed': { + return ( + + ) + } + case 'unclaimed': { + return + } + case 'privatePractice': { + return ( + + ) + } + case 'verifiedReviewer': { + return ( + + ) + } + case 'remote': { + return + } + } + })() + + let passedBadgeProps: object = others + const children = (() => { + switch (props.variant) { + case 'leader': { + const { tsKey, minify, hideBg: _, variant: _variant, iconBg: _iconBg, ...rest } = props + passedBadgeProps = rest + return minify ? null : {t(tsKey, { ns: 'attribute' })} + } + case 'verified': { + return {t('verified-information')} + } + case 'attribute': { + const { tsKey, tsNs, tProps, variant: _variant, ...rest } = props + passedBadgeProps = rest + return {t(tsKey, { ns: tsNs, ...tProps })} + } + case 'community': { + const { tsKey, tProps, variant: _variant, ...rest } = props + passedBadgeProps = rest + return t(tsKey, { ns: 'attribute', ...tProps }) + } + case 'service': { + const { tsKey, tProps, variant: _variant, ...rest } = props + passedBadgeProps = rest + return t(tsKey, { ns: 'services', ...tProps }) + } + case 'claimed': { + return {t('claimed')} + } + case 'unclaimed': { + return {t('unclaimed')} + } + case 'privatePractice': { + return {t('privatePractice')} + } + case 'verifiedReviewer': { + return {t('in-reach-verified-reviewer')} + } + default: { + return props.children + } + } + })() + + const renderTooltip: Omit | undefined = (() => { + switch (props.variant) { + case 'community': { + return { + label: t('badge.community-tool-tip'), + } + } + case 'remote': { + return { + label: t('badge.remote-tool-tip'), + } + } + case 'service': { + return { + label: t('badge.service-tool-tip'), + } + } + case 'national': { + if (Array.isArray(props.tsKey)) { + const formatter = new Intl.ListFormat(i18n.resolvedLanguage, { + style: 'long', + type: 'conjunction', + }) + return { + label: t('badge.national-tool-tip', { + country: formatter.format(props.tsKey.map((country) => `$t(country:${country}.name)`)), + interpolation: { skipOnVariables: false }, + }), + } + } + return { + label: t('badge.national-tool-tip', { + country: `$t(country:${props.tsKey}.name)`, + interpolation: { skipOnVariables: false }, + }), + } + } + case 'leader': { + return { + label: t('adjective.organization', { ns: 'common', adjective: `$t(attribute:${props.tsKey})` }), //t(props.tsKey, { ns: 'attribute' }), + disabled: !props.minify, + } + } + case 'verified': { + const lastVerified = + props.lastverified instanceof Date ? props.lastverified : new Date(props.lastverified) + + const dateString = DateTime.fromJSDate(lastVerified) + .setLocale(i18n.resolvedLanguage ?? 'en') + .toLocaleString(DateTime.DATE_MED_WITH_WEEKDAY) + const label = t('verified-information-detail', { dateString }) + + return { + label, + multiline: true, + maw: { base: '90vw', xs: 600 }, + } + } + case 'claimed': { + const label = ( + + ), + }} + /> + ) + return { + label, + multiline: true, + closeDelay: 500, + style: { pointerEvents: 'auto' }, + maw: { base: '90vw', xs: 600 }, + } + } + } + })() + + const mantineVariant = isCustom + ? variant + ? customVariantMap[variant as CustomVariants] + : undefined + : (variant as BadgeVariant) + + const styleDataProps = { + ...(props.variant === 'leader' && props.minify ? { 'data-minify': true } : {}), + ...(props.variant === 'leader' && props.hideBg ? { 'data-hidebg': true } : {}), + } + + const badge = ( + + {children} + + ) + if (props.variant === 'unclaimed') { + const label = ( + setModalOpen(true)} variant={variants.Link.inheritStyle} />, + }} + /> + ) + return ( + + + {children} + + + ) + } + + if (renderTooltip) { + return ( + + {badge} + + ) + } + return badge +} + +Badge.displayName = 'Badge' +export const BadgeGroup = ({ badges, withSeparator = false, ...props }: BadgeGroupProps) => { + const variants = useCustomVariant() + const theme = useMantineTheme() + const separator = ( + + ) + const badgeList = badges.map((item: CustomBadgeProps, idx) => ( + + + + )) + + return ( + + {badgeList} + + ) +} + +interface BadgeGroupProps extends Omit { + badges: CustomBadgeProps[] + withSeparator?: boolean +} +type BadgeVariant = BadgeProps['variant'] + +interface BadgeStylesParams { + variant?: BadgeVariant | CustomVariants + minify?: boolean + hideBg?: boolean +} +export type CustomBadgeProps = + | (Omit & { + /** Preset designs */ + variant?: + | Exclude + | 'outline' + /** + * Item rendered on the left side of the badge. Should be either an emoji unicode string or an Icon + * component + */ + leftSection?: ReactNode + hideTooltip?: boolean + }) + | LeaderBadgeProps + | VerifiedBadgeProps + | AttributeTagProps + | CommunityTagProps + | ServiceTagProps + | NationalBadgeProps +type CustomVariants = (typeof customVariants)[number] + +export type CustomBadgeStyles = Partial<{ [className in BadgeStylesNames]: CSSObject }> +type BadgeVariants = (theme: MantineTheme, params: BadgeStylesParams) => CustomBadgeStyles + +type LeaderBadgeProps = { + variant: 'leader' + /** Background color for icon */ + iconBg: string + /** Unicode emoji string */ + icon: string + /** I18n translation key */ + tsKey: string + /** Show icon only? */ + minify?: boolean + /** Hide light gray bg for mini */ + hideBg?: boolean + hideTooltip?: boolean +} +type NationalBadgeProps = { + variant: 'national' + /** Translation key for the country name(s) */ + tsKey: string | string[] + hideTooltip?: boolean +} + +type VerifiedBadgeProps = { + variant: 'verified' + lastverified: Date | string + hideTooltip?: boolean +} + +export type AttributeTagProps = { + variant: 'attribute' + icon: IconList | string + tsKey: string + tsNs: string + tProps?: Omit + hideTooltip?: boolean +} + +export type CommunityTagProps = { + variant: 'community' + icon: string + tsKey: string + tProps?: Omit + hideTooltip?: boolean +} +export type ServiceTagProps = { + variant: 'service' + tsKey: string + tProps?: Omit + hideTooltip?: boolean +} + +Badge.ServiceTag = _ServiceTag +Badge.Group = _BadgeGroup +Badge.Leader = _Leader +Badge.National = _National +Badge.Verified = _Verified diff --git a/packages/ui/components/core/Badge/styles.ts b/packages/ui/components/core/Badge/styles.ts new file mode 100644 index 0000000000..5322882df5 --- /dev/null +++ b/packages/ui/components/core/Badge/styles.ts @@ -0,0 +1,109 @@ +import { type BadgeStylesNames, createStyles, type CSSObject, type MantineTheme, rem } from '@mantine/core' + +export const useSharedStyles = (variant: SharedStyles) => { + const styles = (theme: MantineTheme): Partial<{ [className in BadgeStylesNames]: CSSObject }> => { + switch (variant) { + case 'leader': + case 'national': { + return { + leftSection: { + '& *': { + fontSize: theme.fontSizes.xs, + borderRadius: theme.radius.xl, + height: rem(24), + width: rem(24), + margin: 0, + textAlign: 'center', + paddingBottom: rem(4), + color: theme.other.colors.secondary.black, + }, + }, + inner: { + '& *': { + color: theme.other.colors.secondary.black, + marginLeft: theme.spacing.xs, + }, + }, + root: { + border: 0, + padding: 0, + '&[data-minify]': { + height: rem(40), + width: rem(40), + ['&:hover']: { + backgroundColor: theme.other.colors.primary.lightGray, + }, + radius: theme.radius.xl, + padding: 0, + }, + '&[data-hidebg]': { + backgroundColor: undefined, + height: undefined, + width: undefined, + paddingLeft: rem(6), + paddingRight: rem(6), + }, + }, + } + } + case 'privatePractice': + case 'claimed': + case 'unclaimed': + case 'verified': + case 'verifiedReviewer': + case 'attribute': { + return { + inner: { + '& *, span': { + ...theme.other.utilityFonts.utility1, + width: 'auto', + marginLeft: theme.spacing.xs, + textTransform: 'none', + }, + }, + root: { + border: 0, + minHeight: rem(24), + padding: '0', + lineHeight: 'inherit', + borderRadius: 0, + }, + leftSection: { + height: rem(24), + }, + } + } + case 'remote': { + return { + root: { + border: 0, + height: rem(20), + padding: '0', + lineHeight: 'inherit', + borderRadius: 0, + }, + leftSection: { + height: rem(20), + }, + } + } + } + } + + return createStyles(styles)() +} + +type SharedStyles = + | 'national' + | 'leader' + | 'privatePractice' + | 'claimed' + | 'unclaimed' + | 'verified' + | 'verifiedReviewer' + | 'attribute' + | 'remote' + +type CustomBadgeStyles = Partial<{ [className in BadgeStylesNames]: CSSObject }> + +type UseSharedStyles = (variant: SharedStyles) => CustomBadgeStyles From bce9d542fb293646ed4dcc7f400df250daa1035d Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Fri, 26 Jan 2024 18:05:08 -0500 Subject: [PATCH 31/67] service page work --- .../[orgLocationId]/edit/[orgServiceId].tsx | 65 ++++++++++++++++++- .../router/page/query.serviceEdit.handler.ts | 7 +- packages/ui/hooks/useEditMode.ts | 8 ++- 3 files changed, 76 insertions(+), 4 deletions(-) diff --git a/apps/app/src/pages/org/[slug]/[orgLocationId]/edit/[orgServiceId].tsx b/apps/app/src/pages/org/[slug]/[orgLocationId]/edit/[orgServiceId].tsx index afe6813763..befe9517f8 100644 --- a/apps/app/src/pages/org/[slug]/[orgLocationId]/edit/[orgServiceId].tsx +++ b/apps/app/src/pages/org/[slug]/[orgLocationId]/edit/[orgServiceId].tsx @@ -1,16 +1,77 @@ +import { Grid, Stack } from '@mantine/core' import { useRouter } from 'next/router' +import { useTranslation } from 'next-i18next' import { type GetServerSideProps } from 'nextjs-routes' +import { useForm } from 'react-hook-form' +import { Textarea, TextInput } from 'react-hook-form-mantine' import { z } from 'zod' import { prefixedId } from '@weareinreach/api/schemas/idPrefix' import { trpcServerClient } from '@weareinreach/api/trpc' import { checkServerPermissions } from '@weareinreach/auth' +import { api } from '~app/utils/api' import { getServerSideTranslations } from '~app/utils/i18n' +import { Badge } from '~ui/components/core/Badge' +import { InlineTextInput } from '~ui/components/data-portal/InlineTextInput' +const FreetextObject = z + .object({ + text: z.string().nullable(), + key: z.string().nullish(), + ns: z.string().nullish(), + }) + .nullish() + +const FormSchema = z.object({ + name: FreetextObject, + desription: FreetextObject, + services: z.object({ id: prefixedId('serviceTag'), tsKey: z.string(), tsNs: z.string() }).array(), + published: z.boolean(), + deleted: z.boolean(), +}) +type FormSchemaType = z.infer const EditServicePage = () => { - const router = useRouter() + const { t } = useTranslation() + const router = useRouter<'/org/[slug]/[orgLocationId]/edit/[orgServiceId]'>() + const { data } = api.page.serviceEdit.useQuery({ id: router.query.orgServiceId ?? '' }) + const form = useForm({ + values: data ? data : undefined, + }) + + const nameIsDirty = + typeof form.formState.dirtyFields.name === 'object' ? form.formState.dirtyFields.name.text : false - return <>Edit service page: {router.query.orgServiceId} + return ( + <> + + + + } + name='name.text' + control={form.control} + fontSize='h2' + data-isDirty={nameIsDirty} + /> + } + name='description.text' + control={form.control} + data-isDirty={nameIsDirty} + autosize + /> + + {!!data && ( + + {data.services.map((service) => ( + {t(service.tsKey, { ns: service.tsNs })} + ))} + + )} + + + + ) } export default EditServicePage diff --git a/packages/api/router/page/query.serviceEdit.handler.ts b/packages/api/router/page/query.serviceEdit.handler.ts index 35067c6967..724f1102b1 100644 --- a/packages/api/router/page/query.serviceEdit.handler.ts +++ b/packages/api/router/page/query.serviceEdit.handler.ts @@ -15,11 +15,16 @@ export const serviceEdit = async ({ ctx, input }: TRPCHandlerParams ({ ...service.tag, variant: 'service' as const })), ...rest, } } catch (error) { diff --git a/packages/ui/hooks/useEditMode.ts b/packages/ui/hooks/useEditMode.ts index 20b39fec31..411bd67119 100644 --- a/packages/ui/hooks/useEditMode.ts +++ b/packages/ui/hooks/useEditMode.ts @@ -9,7 +9,13 @@ export const useEditMode = () => { if (!ctx) { throw new Error('useEditMode must be used within a EditModeProvider') } - const isEditMode = router.pathname.endsWith('/edit') + const editPaths: (typeof router.pathname)[] = [ + '/org/[slug]/edit', + '/org/[slug]/[orgLocationId]/edit', + '/org/[slug]/[orgLocationId]/edit/[orgServiceId]', + ] + + const isEditMode = editPaths.includes(router.pathname) return { isEditMode, From f02f036e968d386f7a74b5e4c56da906055ec0bb Mon Sep 17 00:00:00 2001 From: "InReach [bot]" <108850934+InReach-svc@users.noreply.github.com> Date: Fri, 26 Jan 2024 23:20:39 +0000 Subject: [PATCH 32/67] chore: lint & format Signed-off-by: InReach [bot] <108850934+InReach-svc@users.noreply.github.com> --- packages/ui/components/core/index.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/ui/components/core/index.tsx b/packages/ui/components/core/index.tsx index ce4d903374..4ebc965d65 100644 --- a/packages/ui/components/core/index.tsx +++ b/packages/ui/components/core/index.tsx @@ -2,7 +2,6 @@ export * from './ActionButtons' export * from './AlertMessage' export * from './AntiHateMessage' -export * from './Badge' export * from './Breadcrumb' export * from './Button' export * from './GoogleMap' From f619cf6dcba2cc3336ba7984b98f8df4d438d900 Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Mon, 29 Jan 2024 12:01:44 -0500 Subject: [PATCH 33/67] update eslint & sb conf --- packages/ui/.eslintrc.js | 9 ++++++++- packages/ui/.storybook/preview.tsx | 17 +++++++++++++---- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/packages/ui/.eslintrc.js b/packages/ui/.eslintrc.js index f7ff599543..c9eb80767d 100644 --- a/packages/ui/.eslintrc.js +++ b/packages/ui/.eslintrc.js @@ -1,4 +1,3 @@ -/* eslint-disable import/no-unused-modules */ module.exports = { extends: ['@weareinreach/eslint-config/storybook', '@weareinreach/eslint-config/next'], // overrides: [ @@ -12,6 +11,14 @@ module.exports = { // }, // }, // ], + overrides: [ + { + files: ['./**/*.stories.*'], + rules: { + 'node/no-process-env': 'off', + }, + }, + ], root: true, ignorePatterns: ['storybook-static/'], } diff --git a/packages/ui/.storybook/preview.tsx b/packages/ui/.storybook/preview.tsx index 5b8a7bc29b..3aaf9176cf 100644 --- a/packages/ui/.storybook/preview.tsx +++ b/packages/ui/.storybook/preview.tsx @@ -111,10 +111,7 @@ declare module '@storybook/react' { locale?: LocaleCodes i18n?: typeof i18n viewport?: ViewportConfig - design?: { - type: 'figma' - url: `https://${string}` - } + design?: DesignParams | DesignParams[] msw?: RequestHandler[] | { handlers: RequestHandler[] | Record } nextAuthMock?: { session: keyof typeof authStates } badges?: BADGE[] @@ -136,3 +133,15 @@ type PseudoStates = | 'visited' | 'link' | 'target' + +type DesignParams = { name?: string } & ( + | { + type: 'figma' + url: `https://${string}` + } + | { + type: 'figspec' + url: `https://${string}` + accessToken: string + } +) From 1bce0ab1047650d02cf46d85ce4cde90c02ef289 Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Mon, 29 Jan 2024 12:25:06 -0500 Subject: [PATCH 34/67] Break out badges --- apps/app/public/locales/en/common.json | 18 +- .../[orgLocationId]/edit/[orgServiceId].tsx | 2 +- .../ui/components/core/Badge/Attribute.tsx | 31 +++ packages/ui/components/core/Badge/Claimed.tsx | 103 +++++++++ .../ui/components/core/Badge/Community.tsx | 46 ++++ packages/ui/components/core/Badge/Leader.tsx | 2 +- .../ui/components/core/Badge/National.tsx | 6 +- .../components/core/Badge/PrivatePractice.tsx | 32 +++ packages/ui/components/core/Badge/Remote.tsx | 34 +++ ...ServiceTag.styles.ts => Service.styles.ts} | 0 .../Badge/{ServiceTag.tsx => Service.tsx} | 10 +- .../ui/components/core/Badge/Verified.tsx | 13 +- .../core/Badge/VerifiedReviewer.tsx | 32 +++ .../components/core/Badge/index.stories.tsx | 198 +++++++++--------- packages/ui/components/core/Badge/index.tsx | 37 ++-- packages/ui/icon/index.tsx | 8 +- 16 files changed, 428 insertions(+), 144 deletions(-) create mode 100644 packages/ui/components/core/Badge/Attribute.tsx create mode 100644 packages/ui/components/core/Badge/Claimed.tsx create mode 100644 packages/ui/components/core/Badge/Community.tsx create mode 100644 packages/ui/components/core/Badge/PrivatePractice.tsx create mode 100644 packages/ui/components/core/Badge/Remote.tsx rename packages/ui/components/core/Badge/{ServiceTag.styles.ts => Service.styles.ts} (100%) rename packages/ui/components/core/Badge/{ServiceTag.tsx => Service.tsx} (74%) create mode 100644 packages/ui/components/core/Badge/VerifiedReviewer.tsx diff --git a/apps/app/public/locales/en/common.json b/apps/app/public/locales/en/common.json index 26df5b794a..437700540a 100644 --- a/apps/app/public/locales/en/common.json +++ b/apps/app/public/locales/en/common.json @@ -3,8 +3,6 @@ "access": { "sms-with-body": "Text {{body}} to {{code}}" }, - "accessible-building_false": "This building is NOT wheelchair accessible", - "accessible-building_true": "This building is wheelchair accessible", "account": "Account", "add": "Add {{item}}", "address": "Address", @@ -23,12 +21,20 @@ "title": "Anti-hate commitment" }, "badge": { + "accessible-building_false": "This building is NOT wheelchair accessible", + "accessible-building_true": "This building is wheelchair accessible", + "claimed": "Claimed", "claimed-tool-tip": "This organization has been claimed by a verified representative.
Learn more.", "community-tool-tip": "Community served by this organization.", "national-tool-tip": "Offers services throughout {{country}}.", + "privatePractice": "Private Practice", "remote-tool-tip": "Available remotely", "service-tool-tip": "Service(s) offered by this organization.", - "unclaimed-tool-tip": "This organization has not yet been claimed by a representative.
Claim this organization to build trust with our community, update your own information, and more." + "unclaimed": "Unclaimed", + "unclaimed-tool-tip": "This organization has not yet been claimed by a representative.
Claim this organization to build trust with our community, update your own information, and more.", + "verified-information": "Verified information", + "verified-information-detail": "The information on this page was last updated {{dateString}}. InReach prioritizes accuracy and user safety, and updates all information regularly. For more information on our vetting process, please visit our Vetting Process page on InReach.org.", + "verified-reviewer": "InReach Verified Reviewer" }, "breadcrumb": { "back-to-dynamic": "Back to {{page}}", @@ -40,7 +46,6 @@ "list": "🔗 Claim your organization’s profile page and build trust with your audience on InReach\n✍🏾 Update your organization's information on InReach\n📨 Invite other staff to join your organization on InReach\n🔑 Gain access to future features built specifically for affiliated service providers on InReach", "title": "🏠\nThis organization has not yet been claimed by a service provider.\nWith a free InReach Service Provider account, you will soon be able to:" }, - "claimed": "Claimed", "clear": "Clear", "close": "Close", "confirm-account": { @@ -137,7 +142,6 @@ "open24": "Open 24 hours" }, "in-reach-user": "InReach User", - "in-reach-verified-reviewer": "InReach Verified Reviewer", "include": "Include", "inreach": "InReach", "inreach-copyright": "InReach, Inc. {{year}} • All rights reserved • InReach ❤️ Open Source", @@ -237,7 +241,6 @@ ], "privacy-statement-foot": "Read our full privacy policy for more information", "privacy-statement-head": ["🔒", "Privacy statement"], - "privatePractice": "Private Practice", "profile": "Profile", "questions": "Questions?", "quick-promo-body": "💚 Save and share personalized resource lists\n💬 Leave public rating/reviews on organizations\n🏠 Suggest organizations in your area\n🔗 Claim your organization’s profile page (Coming soon!)", @@ -382,10 +385,7 @@ }, "take-action": "Take Action", "uncheck-all": "Uncheck all", - "unclaimed": "Unclaimed", "user-avatar": "User avatar", - "verified-information": "Verified information", - "verified-information-detail": "The information on this page was last updated {{dateString}}. InReach prioritizes accuracy and user safety, and updates all information regularly. For more information on our vetting process, please visit our Vetting Process page on InReach.org.", "verify-account": { "verified": "Account verified!", "verified-body": "Your account has been verified! Please login to start using InReach's additional features.", diff --git a/apps/app/src/pages/org/[slug]/[orgLocationId]/edit/[orgServiceId].tsx b/apps/app/src/pages/org/[slug]/[orgLocationId]/edit/[orgServiceId].tsx index befe9517f8..4cf157f7b7 100644 --- a/apps/app/src/pages/org/[slug]/[orgLocationId]/edit/[orgServiceId].tsx +++ b/apps/app/src/pages/org/[slug]/[orgLocationId]/edit/[orgServiceId].tsx @@ -64,7 +64,7 @@ const EditServicePage = () => { {!!data && ( {data.services.map((service) => ( - {t(service.tsKey, { ns: service.tsNs })} + {t(service.tsKey, { ns: service.tsNs })} ))} )} diff --git a/packages/ui/components/core/Badge/Attribute.tsx b/packages/ui/components/core/Badge/Attribute.tsx new file mode 100644 index 0000000000..47ec4cbb6b --- /dev/null +++ b/packages/ui/components/core/Badge/Attribute.tsx @@ -0,0 +1,31 @@ +import { Badge, type BadgeProps, Text, useMantineTheme } from '@mantine/core' +import { forwardRef, type ReactNode } from 'react' + +import { Icon, isValidIcon } from '~ui/icon' + +import { useSharedStyles } from './styles' + +export const _Attribute = forwardRef( + ({ icon, children, ...props }, ref) => { + const { classes } = useSharedStyles('attribute') + const theme = useMantineTheme() + + const leftSection = isValidIcon(icon) ? ( + + ) : null + + const badge = ( + + {typeof children === 'string' ? {children} : children} + + ) + + return badge + } +) +_Attribute.displayName = 'Badge.Attribute' + +export interface BadgeAttributeProps extends BadgeProps { + icon: string + children: ReactNode +} diff --git a/packages/ui/components/core/Badge/Claimed.tsx b/packages/ui/components/core/Badge/Claimed.tsx new file mode 100644 index 0000000000..c5e6b557d0 --- /dev/null +++ b/packages/ui/components/core/Badge/Claimed.tsx @@ -0,0 +1,103 @@ +import { Badge, type BadgeProps, Text, Tooltip, useMantineTheme } from '@mantine/core' +import { Trans, useTranslation } from 'next-i18next' +import { forwardRef, useState } from 'react' + +import { Link } from '~ui/components/core/Link' +import { useCustomVariant } from '~ui/hooks/useCustomVariant' +import { Icon } from '~ui/icon' +import { ClaimOrgModal } from '~ui/modals' + +import { useSharedStyles } from './styles' + +export const _Claimed = forwardRef( + ({ hideTooltip, isClaimed, ...props }, ref) => { + const { classes } = useSharedStyles(isClaimed ? 'claimed' : 'unclaimed') + const theme = useMantineTheme() + const { t } = useTranslation('common') + const variants = useCustomVariant() + const [modalOpen, setModalOpen] = useState(false) + + const leftSection = isClaimed ? ( + + ) : ( + + ) + const badgeProps = { + variant: 'outline', + classNames: classes, + leftSection, + ...(isClaimed ? { ref } : {}), + ...props, + } as const + + const badge = isClaimed ? ( + + {t('badge.claimed')} + + ) : ( + {t('badge.unclaimed')} + ) + const label = isClaimed ? ( + + ), + }} + /> + ) : ( + setModalOpen(true)} variant={variants.Link.inheritStyle} />, + }} + /> + ) + + const tooltipProps = { + label, + multiline: true, + maw: { base: '90vw', xs: 600 }, + closeDelay: 500, + style: { pointerEvents: 'auto' }, + events: { hover: true, focus: true, touch: true }, + variant: variants.Tooltip.utility1, + disabled: hideTooltip, + ...(!isClaimed + ? { + px: 16, + py: 10, + ref, + } + : {}), + } as const + + const claimOrgModalProps = { + component: Badge, + ...badgeProps, + w: 'fit-content', + externalOpen: modalOpen, + externalStateHandler: setModalOpen, + className: classes.root, + } as const + + return isClaimed ? ( + {badge} + ) : ( + + {badge} + + ) + } +) +_Claimed.displayName = 'Badge.Claimed' + +export interface BadgeClaimedProps extends BadgeProps { + hideTooltip?: boolean + isClaimed?: boolean +} diff --git a/packages/ui/components/core/Badge/Community.tsx b/packages/ui/components/core/Badge/Community.tsx new file mode 100644 index 0000000000..a6fd8dfafd --- /dev/null +++ b/packages/ui/components/core/Badge/Community.tsx @@ -0,0 +1,46 @@ +import { Badge, type BadgeProps, Text, Tooltip } from '@mantine/core' +import { useTranslation } from 'next-i18next' +import { forwardRef, type ReactNode } from 'react' + +import { useCustomVariant } from '~ui/hooks/useCustomVariant' + +import { useSharedStyles } from './styles' + +export const _Community = forwardRef( + ({ icon, hideTooltip, children, ...props }, ref) => { + const { classes } = useSharedStyles('leader') + const { t } = useTranslation('common') + const variants = useCustomVariant() + + const leftSection = icon + + const badge = ( + + {typeof children === 'string' ? {children} : children} + + ) + + return hideTooltip ? ( + badge + ) : ( + + {badge} + + ) + } +) +_Community.displayName = 'Badge.Community' + +export interface BadgeCommunityProps extends BadgeProps { + /** Unicode emoji string */ + icon: string + hideTooltip?: boolean + children: ReactNode +} diff --git a/packages/ui/components/core/Badge/Leader.tsx b/packages/ui/components/core/Badge/Leader.tsx index 331d56f2ee..52a094a86f 100644 --- a/packages/ui/components/core/Badge/Leader.tsx +++ b/packages/ui/components/core/Badge/Leader.tsx @@ -9,7 +9,7 @@ import { useSharedStyles } from './styles' export const _Leader = forwardRef( ({ iconBg, icon, minify, hideBg, hideTooltip, children, ...props }, ref) => { const { classes } = useSharedStyles('leader') - const { t } = useTranslation(['common', 'attribute']) + const { t } = useTranslation('common') const variants = useCustomVariant() const leftSection = ( diff --git a/packages/ui/components/core/Badge/National.tsx b/packages/ui/components/core/Badge/National.tsx index db049f5358..526e04439c 100644 --- a/packages/ui/components/core/Badge/National.tsx +++ b/packages/ui/components/core/Badge/National.tsx @@ -1,7 +1,7 @@ -import { Badge, type BadgeProps, ColorSwatch, rem, Text, Tooltip, useMantineTheme } from '@mantine/core' +import { Badge, type BadgeProps, rem, Tooltip, useMantineTheme } from '@mantine/core' import compact from 'just-compact' import { useTranslation } from 'next-i18next' -import { forwardRef, type ReactNode } from 'react' +import { forwardRef } from 'react' import { useCustomVariant } from '~ui/hooks/useCustomVariant' import { Icon } from '~ui/icon' @@ -12,7 +12,7 @@ export const _National = forwardRef( ({ hideTooltip, countries, ...props }, ref) => { const { classes } = useSharedStyles('national') const theme = useMantineTheme() - const { t, i18n } = useTranslation(['common', 'attribute']) + const { t, i18n } = useTranslation('common') const variants = useCustomVariant() const leftSection = ( diff --git a/packages/ui/components/core/Badge/PrivatePractice.tsx b/packages/ui/components/core/Badge/PrivatePractice.tsx new file mode 100644 index 0000000000..2cc168b11d --- /dev/null +++ b/packages/ui/components/core/Badge/PrivatePractice.tsx @@ -0,0 +1,32 @@ +import { Badge, type BadgeProps, Text, useMantineTheme } from '@mantine/core' +import { useTranslation } from 'next-i18next' +import { forwardRef } from 'react' + +import { Icon } from '~ui/icon' + +import { useSharedStyles } from './styles' + +export const _PrivatePractice = forwardRef( + ({ hideTooltip, ...props }, ref) => { + const { classes } = useSharedStyles('privatePractice') + const theme = useMantineTheme() + const { t } = useTranslation('common') + + const leftSection = ( + + ) + + const badge = ( + + {t('badge.privatePractice')} + + ) + + return badge + } +) +_PrivatePractice.displayName = 'Badge.PrivatePractice' + +export interface BadgePrivatePracticeProps extends BadgeProps { + hideTooltip?: boolean +} diff --git a/packages/ui/components/core/Badge/Remote.tsx b/packages/ui/components/core/Badge/Remote.tsx new file mode 100644 index 0000000000..0e58b24279 --- /dev/null +++ b/packages/ui/components/core/Badge/Remote.tsx @@ -0,0 +1,34 @@ +import { Badge, type BadgeProps, Tooltip, useMantineTheme } from '@mantine/core' +import { useTranslation } from 'next-i18next' +import { forwardRef } from 'react' + +import { useCustomVariant } from '~ui/hooks/useCustomVariant' +import { Icon } from '~ui/icon' + +import { useSharedStyles } from './styles' + +export const _Remote = forwardRef(({ hideTooltip, ...props }, ref) => { + const { classes } = useSharedStyles('remote') + const theme = useMantineTheme() + const { t } = useTranslation(['common']) + const variants = useCustomVariant() + + const leftSection = + + const badge = ( + + ) + const tooltipProps = { + label: t('badge.remote-tool-tip'), + multiline: true, + maw: { base: '90vw', xs: 600 }, + variant: variants.Tooltip.utility1, + } + + return {badge} +}) +_Remote.displayName = 'Badge.Remote' + +export interface BadgeRemoteProps extends BadgeProps { + hideTooltip?: boolean +} diff --git a/packages/ui/components/core/Badge/ServiceTag.styles.ts b/packages/ui/components/core/Badge/Service.styles.ts similarity index 100% rename from packages/ui/components/core/Badge/ServiceTag.styles.ts rename to packages/ui/components/core/Badge/Service.styles.ts diff --git a/packages/ui/components/core/Badge/ServiceTag.tsx b/packages/ui/components/core/Badge/Service.tsx similarity index 74% rename from packages/ui/components/core/Badge/ServiceTag.tsx rename to packages/ui/components/core/Badge/Service.tsx index be3731988d..46227445c8 100644 --- a/packages/ui/components/core/Badge/ServiceTag.tsx +++ b/packages/ui/components/core/Badge/Service.tsx @@ -4,13 +4,13 @@ import { forwardRef, type ReactNode } from 'react' import { useCustomVariant } from '~ui/hooks/useCustomVariant' -import { useStyles } from './ServiceTag.styles' +import { useStyles } from './Service.styles' -export const _ServiceTag = forwardRef( +export const _Service = forwardRef( ({ hideTooltip, children, ...props }, ref) => { const { classes } = useStyles() const variants = useCustomVariant() - const { t } = useTranslation(['common']) + const { t } = useTranslation('common') const badge = ( @@ -35,9 +35,9 @@ export const _ServiceTag = forwardRef( ) } ) -_ServiceTag.displayName = 'Badge.ServiceTag' +_Service.displayName = 'Badge.Service' -export interface BadgeServiceTagProps extends BadgeProps { +export interface BadgeServiceProps extends BadgeProps { children: ReactNode hideTooltip?: boolean } diff --git a/packages/ui/components/core/Badge/Verified.tsx b/packages/ui/components/core/Badge/Verified.tsx index 2d87cf7b9a..a50799a86a 100644 --- a/packages/ui/components/core/Badge/Verified.tsx +++ b/packages/ui/components/core/Badge/Verified.tsx @@ -1,10 +1,8 @@ -import { Badge, type BadgeProps, ColorSwatch, rem, Text, Tooltip, useMantineTheme } from '@mantine/core' -import compact from 'just-compact' +import { Badge, type BadgeProps, Text, Tooltip, useMantineTheme } from '@mantine/core' import { DateTime } from 'luxon' import { useTranslation } from 'next-i18next' -import { forwardRef, type ReactNode } from 'react' +import { forwardRef } from 'react' -import { useCustomVariant } from '~ui/hooks/useCustomVariant' import { Icon } from '~ui/icon' import { useSharedStyles } from './styles' @@ -13,8 +11,7 @@ export const _Verified = forwardRef( ({ hideTooltip, lastverified, ...props }, ref) => { const { classes } = useSharedStyles('verified') const theme = useMantineTheme() - const { t, i18n } = useTranslation(['common', 'attribute']) - const variants = useCustomVariant() + const { t, i18n } = useTranslation('common') const leftSection = ( @@ -22,14 +19,14 @@ export const _Verified = forwardRef( const badge = ( - {t('verified-information')} + {t('badge.verified-information')} ) const dateDisplay = lastverified instanceof Date ? lastverified : new Date(lastverified) const dateString = DateTime.fromJSDate(dateDisplay) .setLocale(i18n.resolvedLanguage ?? 'en') .toLocaleString(DateTime.DATE_MED_WITH_WEEKDAY) - const label = t('verified-information-detail', { dateString }) + const label = t('badge.verified-information-detail', { dateString }) const tooltipProps = { label, diff --git a/packages/ui/components/core/Badge/VerifiedReviewer.tsx b/packages/ui/components/core/Badge/VerifiedReviewer.tsx new file mode 100644 index 0000000000..0d3a7fdf44 --- /dev/null +++ b/packages/ui/components/core/Badge/VerifiedReviewer.tsx @@ -0,0 +1,32 @@ +import { Badge, type BadgeProps, Text, useMantineTheme } from '@mantine/core' +import { useTranslation } from 'next-i18next' +import { forwardRef } from 'react' + +import { Icon } from '~ui/icon' + +import { useSharedStyles } from './styles' + +export const _VerifiedReviewer = forwardRef( + ({ hideTooltip, ...props }, ref) => { + const { classes } = useSharedStyles('verifiedReviewer') + const theme = useMantineTheme() + const { t } = useTranslation(['common']) + + const leftSection = ( + + ) + + const badge = ( + + {t('badge.verified-reviewer')} + + ) + + return badge + } +) +_VerifiedReviewer.displayName = 'Badge.VerifiedReviewer' + +export interface BadgeVerifiedReviewerProps extends BadgeProps { + hideTooltip?: boolean +} diff --git a/packages/ui/components/core/Badge/index.stories.tsx b/packages/ui/components/core/Badge/index.stories.tsx index ffda6f0b23..199f0215c3 100644 --- a/packages/ui/components/core/Badge/index.stories.tsx +++ b/packages/ui/components/core/Badge/index.stories.tsx @@ -4,14 +4,19 @@ import { commonTheme as theme } from '~ui/theme/common' import { Badge, BadgeGroup } from './index' +const accessToken = process.env.STORYBOOK_FIGMA_ACCESS_TOKEN as string +const figmaSpec = (url: `https://${string}`) => ({ + type: 'figspec' as const, + url, + accessToken: process.env.STORYBOOK_FIGMA_ACCESS_TOKEN as string, +}) export default { title: 'Design System/Tags and Badges', component: Badge, parameters: { - design: { - type: 'figma', - url: 'https://www.figma.com/file/gl8ppgnhpSq1Dr7Daohk55/Design-System-(2023)?node-id=234%3A8505&t=sleVeGl2lJv7Df18-4', - }, + design: figmaSpec( + 'https://www.figma.com/file/gl8ppgnhpSq1Dr7Daohk55/Design-System-(2023)?node-id=234%3A8505&t=sleVeGl2lJv7Df18-4' + ), }, argTypes: { variant: { @@ -112,83 +117,74 @@ const groupParams = { export const Attribute = { args: { - variant: 'attribute', icon: 'carbon:piggy-bank', - tsKey: 'cost.cost-free', - tsNs: 'attribute', + children: 'Attribute Text', }, argTypes: { - variant: { - options: ['attribute'], - control: 'select', - }, icon: { options: ['carbon:piggy-bank', 'carbon:globe', 'carbon:accessibility', 'carbon:warning'], control: 'select', }, - tsKey: { - options: ['cost-cost-free', 'additional-remote', 'additional-accessible', 'additional-not-accessible'], - control: 'select', - }, - tsNs: { - options: ['attribute'], - control: 'select', - }, }, parameters: { controls: { - include: ['icon', 'tsKey', 'tsNs', 'variant'], + include: ['icon'], }, + design: figmaSpec( + 'https://www.figma.com/file/gl8ppgnhpSq1Dr7Daohk55/Design-System-(2023)?type=design&node-id=1566-7269&mode=design&t=P7ERsleiTj8PoFXM-4' + ), }, -} satisfies StoryDef + render: (args) => , +} satisfies StoryObj export const Community = { args: { icon: '✊🏿', - tsKey: 'srvfocus.bipoc-comm', - variant: 'community', + children: 'BIPOC Community', }, parameters: { - design: { - type: 'figma', - url: 'https://www.figma.com/file/gl8ppgnhpSq1Dr7Daohk55/Design-System-(2023)?node-id=234%3A8506&t=sleVeGl2lJv7Df18-4', - }, + design: figmaSpec( + 'https://www.figma.com/file/gl8ppgnhpSq1Dr7Daohk55/Design-System-(2023)?type=design&node-id=234-8506&mode=design&t=P7ERsleiTj8PoFXM-4' + ), controls: { - include: ['icon', 'tsKey', 'variant'], + include: ['icon'], }, }, -} satisfies StoryDef + render: (args) => , +} satisfies StoryObj export const CommunityGroup = { args: { - badges: [ - { - icon: '✊🏿', - tsKey: 'srvfocus.bipoc-comm', - variant: 'community', - }, - { - icon: '💛', - tsKey: 'srvfocus.hiv-comm', - variant: 'community', - }, - { - icon: '🗣', - tsKey: 'srvfocus.spanish-speakers', - variant: 'community', - }, + children: [ + + BIPOC Community + , + + HIV Community + , + + Spanish Speakers + , ], + withSeparator: true, }, - ...groupParams, -} satisfies GroupStory + parameters: { + controls: { + include: ['children', 'withSeparator'], + }, + design: figmaSpec( + 'https://www.figma.com/file/gl8ppgnhpSq1Dr7Daohk55/Design-System-(2023)?type=design&node-id=337-7074&mode=design&t=P7ERsleiTj8PoFXM-4' + ), + }, + render: (args) => , +} satisfies StoryObj export const Leader = { args: { - variant: 'leader', iconBg: theme.other.colors.tertiary.lightBlue, icon: '️‍️‍🌎', - tsKey: 'orgleader.immigrant-led', minify: false, + children: 'Immigrant-led', }, argTypes: { hideBg: { @@ -202,17 +198,20 @@ export const Leader = { }, parameters: { controls: { - include: ['variant', 'color', 'icon', 'tsKey', 'minify', 'hideBg'], + include: ['color', 'icon', 'children', 'minify', 'hideBg'], }, + design: figmaSpec( + 'https://www.figma.com/file/gl8ppgnhpSq1Dr7Daohk55/Design-System-(2023)?type=design&node-id=337-7072&mode=design&t=P7ERsleiTj8PoFXM-4' + ), }, -} satisfies StoryDef + render: (args) => , +} satisfies StoryObj export const LeaderMini = { args: { - variant: 'leader', iconBg: theme.other.colors.tertiary.orange, icon: '️‍️‍✊🏿', - tsKey: 'orgleader.black-led', + children: 'Black-led', minify: true, }, argTypes: { @@ -227,47 +226,43 @@ export const LeaderMini = { }, parameters: { controls: { - include: ['variant', 'color', 'icon', 'tsKey', 'minify', 'hideBg'], + include: ['color', 'icon', 'children', 'minify', 'hideBg'], }, }, -} satisfies StoryDef + render: (args) => , +} satisfies StoryObj export const Service = { args: { - tsKey: 'abortion-care.CATEGORYNAME', - variant: 'service', + children: 'Abortion Care', }, parameters: { - design: { - type: 'figma', - url: 'https://www.figma.com/file/gl8ppgnhpSq1Dr7Daohk55/Design-System-(2023)?node-id=234%3A8508&t=sleVeGl2lJv7Df18-4', - }, + design: figmaSpec( + 'https://www.figma.com/file/gl8ppgnhpSq1Dr7Daohk55/Design-System-(2023)?node-id=234%3A8508&t=sleVeGl2lJv7Df18-4' + ), controls: { include: ['tsKey', 'variant'], }, }, -} satisfies StoryDef + render: (args) => , +} satisfies StoryObj export const ServiceGroup = { args: { - badges: [ - { - tsKey: 'abortion-care.CATEGORYNAME', - variant: 'service', - }, - { - tsKey: 'education-and-employment.CATEGORYNAME', - variant: 'service', - }, - { - tsKey: 'food.CATEGORYNAME', - variant: 'service', - }, + children: [ + Abortion Care, + Education and Employment, + Food, ], withSeparator: false, }, - ...groupParams, -} satisfies GroupStory + parameters: { + controls: { + include: ['children', 'withSeparator'], + }, + }, + render: (args) => , +} satisfies StoryObj export const Verified = { args: { @@ -283,53 +278,52 @@ export const Verified = { export const Claimed = { args: { - variant: 'claimed', + isClaimed: true, + hideTooltip: false, }, parameters: { controls: { - include: ['variant'], + include: ['isClaimed', 'hideTooltip'], }, }, -} satisfies StoryDef + render: (args) => , +} satisfies StoryObj export const Unclaimed = { args: { - variant: 'unclaimed', + isClaimed: false, + hideTooltip: false, }, parameters: { controls: { - include: ['variant'], + include: ['isClaimed', 'hideTooltip'], }, }, -} satisfies StoryDef + render: (args) => , +} satisfies StoryObj export const PrivatePractice = { - args: { - variant: 'privatePractice', - }, + args: {}, parameters: { - controls: { - include: ['variant'], - }, + design: figmaSpec( + 'https://www.figma.com/file/gl8ppgnhpSq1Dr7Daohk55/Design-System-(2023)?type=design&node-id=2908-7383&mode=design&t=P7ERsleiTj8PoFXM-4' + ), }, -} satisfies StoryDef + render: (args) => , +} satisfies StoryObj export const VerifiedReviewer = { - args: { - variant: 'verifiedReviewer', - }, - parameters: { - controls: { - include: ['variant'], - }, - }, -} satisfies StoryDef + render: (args) => , +} satisfies StoryObj export const Remote = { - args: { - variant: 'remote', + render: (args) => , + parameters: { + design: figmaSpec( + 'https://www.figma.com/file/gl8ppgnhpSq1Dr7Daohk55/Design-System-(2023)?type=design&node-id=135-4631&mode=design&t=P7ERsleiTj8PoFXM-4' + ), }, -} satisfies StoryDef +} satisfies StoryObj export const National = { args: { diff --git a/packages/ui/components/core/Badge/index.tsx b/packages/ui/components/core/Badge/index.tsx index 3cb71229eb..8cf8a7f92a 100644 --- a/packages/ui/components/core/Badge/index.tsx +++ b/packages/ui/components/core/Badge/index.tsx @@ -15,23 +15,30 @@ import { type TooltipProps, useMantineTheme, } from '@mantine/core' -import { type PolymorphicComponentProps } from '@mantine/utils' import { type TOptions } from 'i18next' import { DateTime } from 'luxon' import { merge } from 'merge-anything' import { Trans, useTranslation } from 'next-i18next' -import { forwardRef, type ReactNode, useState } from 'react' +import { type ReactNode, useState } from 'react' import { Link } from '~ui/components/core/Link' -import { useCustomVariant } from '~ui/hooks' +import { useCustomVariant } from '~ui/hooks/useCustomVariant' import { Icon, type IconList, isValidIcon } from '~ui/icon' import { ClaimOrgModal } from '~ui/modals/ClaimOrg' +import { _Attribute } from './Attribute' +import { _Claimed } from './Claimed' +import { _Community } from './Community' import { _BadgeGroup } from './Group' import { _Leader } from './Leader' import { _National } from './National' -import { _ServiceTag } from './ServiceTag' +import { _PrivatePractice } from './PrivatePractice' +import { _Remote } from './Remote' +import { _Service } from './Service' import { _Verified } from './Verified' +import { _VerifiedReviewer } from './VerifiedReviewer' + +// TODO: [IN-942] Clean out dead code after Badge instances have been updated. const badgeVariants: BadgeVariants = (theme, params) => { switch (params.variant) { @@ -179,17 +186,17 @@ const customVariants = [ ] as const const customVariantMap = { + attribute: 'outline', + claimed: 'outline', community: undefined, - service: undefined, leader: 'outline', - verified: 'outline', - claimed: 'outline', - unclaimed: 'outline', - attribute: 'outline', + national: 'outline', privatePractice: 'outline', - verifiedReviewer: 'outline', remote: 'outline', - national: 'outline', + service: undefined, + unclaimed: 'outline', + verified: 'outline', + verifiedReviewer: 'outline', } satisfies Record /** Badge variants `serviceTag` and `communityTag` are responsive - the sizing changes at the `sm` breakpoint. */ @@ -587,8 +594,14 @@ export type ServiceTagProps = { hideTooltip?: boolean } -Badge.ServiceTag = _ServiceTag +Badge.Attribute = _Attribute +Badge.Claimed = _Claimed +Badge.Community = _Community Badge.Group = _BadgeGroup Badge.Leader = _Leader Badge.National = _National +Badge.PrivatePractice = _PrivatePractice +Badge.Remote = _Remote +Badge.Service = _Service Badge.Verified = _Verified +Badge.VerifiedReviewer = _VerifiedReviewer diff --git a/packages/ui/icon/index.tsx b/packages/ui/icon/index.tsx index 8d5a89f500..561b2ab2c8 100644 --- a/packages/ui/icon/index.tsx +++ b/packages/ui/icon/index.tsx @@ -13,14 +13,15 @@ export const validateIcon = (icon: unknown): IconList => { return 'carbon:unknown-filled' } -const useStyles = createStyles((theme, { block }: IconStylesParams) => ({ +const useStyles = createStyles((theme, { block, color }: IconStylesParams) => ({ root: { display: block ? 'block' : undefined, + color, }, })) -export const Icon = memo(({ icon, block, className, ref, ...props }: CustomIconProps) => { - const { classes, cx } = useStyles({ block }) +export const Icon = memo(({ icon, block, className, ref, color, ...props }: CustomIconProps) => { + const { classes, cx } = useStyles({ block, color }) Iconify.displayName = 'Iconify' return }) @@ -30,6 +31,7 @@ export type IconList = (typeof iconList)[number] interface IconStylesParams { /** Sets `display: 'block'` */ block?: boolean + color?: string } interface CustomIconifyIconProps extends IconifyIconProps, IconStylesParams { /** [Search available icons here](https://icon-sets.iconify.design/carbon/) */ From 02a4c2c81994da1866c4789e16b7a57801c34834 Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Mon, 29 Jan 2024 13:04:19 -0500 Subject: [PATCH 35/67] move to dir --- .../{Service.stories.tsx => Service/index.stories.tsx} | 2 +- packages/ui/modals/{Service.tsx => Service/index.tsx} | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) rename packages/ui/modals/{Service.stories.tsx => Service/index.stories.tsx} (96%) rename packages/ui/modals/{Service.tsx => Service/index.tsx} (98%) diff --git a/packages/ui/modals/Service.stories.tsx b/packages/ui/modals/Service/index.stories.tsx similarity index 96% rename from packages/ui/modals/Service.stories.tsx rename to packages/ui/modals/Service/index.stories.tsx index eb7ba58f85..df7df9b1b9 100644 --- a/packages/ui/modals/Service.stories.tsx +++ b/packages/ui/modals/Service/index.stories.tsx @@ -6,7 +6,7 @@ import { organization } from '~ui/mockData/organization' import { savedList } from '~ui/mockData/savedList' import { service } from '~ui/mockData/service' -import { ServiceModal } from './Service' +import { ServiceModal } from './index' const serviceId = 'svce_KLSDJFKLSJDF' diff --git a/packages/ui/modals/Service.tsx b/packages/ui/modals/Service/index.tsx similarity index 98% rename from packages/ui/modals/Service.tsx rename to packages/ui/modals/Service/index.tsx index 99f730e773..7fe4c3777d 100644 --- a/packages/ui/modals/Service.tsx +++ b/packages/ui/modals/Service/index.tsx @@ -31,7 +31,7 @@ import { getFreeText, useSlug } from '~ui/hooks' import { isValidIcon } from '~ui/icon' import { trpc as api } from '~ui/lib/trpcClient' -import { ModalTitle, type ModalTitleProps } from './ModalTitle' +import { ModalTitle, type ModalTitleProps } from '../ModalTitle' const useStyles = createStyles((theme) => ({ sectionDivider: { @@ -198,8 +198,8 @@ const ServiceModalBody = forwardRef(({ ser break } case 'phone': { - const country = locations.find(({ location }) => Boolean(location.country))?.location.country - .cca2 + const country = locations.find(({ location }) => Boolean(location.country))?.location?.country + ?.cca2 if (!country) break contactData.phones.push({ id, @@ -449,7 +449,7 @@ const ServiceModalBody = forwardRef(({ ser component='button' ref={ref} onClick={() => { - serviceModalEvent.opened({ serviceId, serviceName: serviceName?.tsKey.text, orgSlug: slug }) + serviceModalEvent.opened({ serviceId, serviceName: serviceName?.tsKey?.text, orgSlug: slug }) handler.open() }} {...props} From 2041bed8cac6d9efa2124997fea39a73d87d54bc Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Mon, 29 Jan 2024 13:04:42 -0500 Subject: [PATCH 36/67] update badging --- .../sections/CrisisSupport/index.tsx | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/packages/ui/components/sections/CrisisSupport/index.tsx b/packages/ui/components/sections/CrisisSupport/index.tsx index c945d521ad..135f5826df 100644 --- a/packages/ui/components/sections/CrisisSupport/index.tsx +++ b/packages/ui/components/sections/CrisisSupport/index.tsx @@ -28,12 +28,9 @@ export const CrisisSupport = ({ children, role }: ContainerProps) => { role === 'international' ? ( <> - + + {t('international-support.CATEGORTYNAME')} + {t('common:crisis-support.intl-we-recommend')} {t('common:crisis-support.intl-these-verified')} @@ -47,12 +44,9 @@ export const CrisisSupport = ({ children, role }: ContainerProps) => { ) : ( <> - + + {t('crisis-support.CATEGORYNAME')} + {t('common:crisis-support.natl-find-help-now')} }} />
From badfd2e763c87327b63892b94b7f9edc633fe172 Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Mon, 29 Jan 2024 17:02:44 -0500 Subject: [PATCH 37/67] create formatters, update api route --- packages/api/formatters/accessDetails.ts | 69 +++++++++++++++ packages/api/formatters/attributes.ts | 87 +++++++++++++++++++ packages/api/formatters/hours.ts | 54 ++++++++++++ .../router/page/query.serviceEdit.handler.ts | 66 +++++++++++++- 4 files changed, 272 insertions(+), 4 deletions(-) create mode 100644 packages/api/formatters/accessDetails.ts create mode 100644 packages/api/formatters/attributes.ts create mode 100644 packages/api/formatters/hours.ts diff --git a/packages/api/formatters/accessDetails.ts b/packages/api/formatters/accessDetails.ts new file mode 100644 index 0000000000..f8cd9d6ecf --- /dev/null +++ b/packages/api/formatters/accessDetails.ts @@ -0,0 +1,69 @@ +import { type Prisma } from '@weareinreach/db' +import { accessInstructions } from '@weareinreach/db/zod_util/attributeSupplement' +import { isSuperJSONResult, superjson } from '@weareinreach/util/transformer' + +const AccessSchema = accessInstructions.getAll() +export const formatAccessDetails = { + prismaSelect: (showAll?: boolean) => + ({ + ...(showAll + ? {} + : ({ + where: { + active: true, + attribute: { active: true }, + }, + } as const)), + select: { + attribute: { select: { id: true, tsKey: true, tsNs: true } }, + supplement: { + select: { + id: true, + data: true, + text: { select: { tsKey: { select: { key: true, text: true, ns: true } } } }, + }, + ...(showAll ? {} : { where: { active: true } }), + }, + }, + }) as const, + process: (data: AccessDetailData) => { + return data.flatMap(({ attribute, supplement }) => { + const { id: attrId, ...attrib } = attribute + if (supplement.length) { + return supplement.map(({ id: suppId, data, text, ...supp }) => { + const parsedData = AccessSchema.safeParse( + isSuperJSONResult(data) ? superjson.deserialize(data) : data + ) + return { + attrId, + ...attrib, + suppId, + data: parsedData.success ? parsedData.data : null, + text: text?.tsKey ?? null, + ...supp, + } + }) + } + return { attrId, suppId: '', data: null, text: null, ...attrib } + }) + }, +} + +type AccessDetailData = { + attribute: { + id: string + tsKey: string + tsNs: string + } + supplement: { + id: string + data: Prisma.JsonValue + text: { + tsKey: { + text: string + key: string + ns: string + } + } | null + }[] +}[] diff --git a/packages/api/formatters/attributes.ts b/packages/api/formatters/attributes.ts new file mode 100644 index 0000000000..356a85a832 --- /dev/null +++ b/packages/api/formatters/attributes.ts @@ -0,0 +1,87 @@ +import { type Prisma } from '@weareinreach/db' + +export const formatAttributes = { + prismaSelect: (showAll?: boolean) => + ({ + ...(showAll + ? {} + : ({ + where: { + active: true, + attribute: { active: true }, + }, + } as const)), + select: { + attribute: { + select: { + id: true, + tsKey: true, + tsNs: true, + icon: true, + iconBg: true, + categories: { select: { category: { select: { tag: true, ns: true } } } }, + }, + }, + supplement: { + ...(showAll ? {} : { where: { active: true } }), + select: { + active: true, + countryId: true, + data: true, + govDistId: true, + id: true, + languageId: true, + text: { select: { tsKey: { select: { key: true, text: true, ns: true } } } }, + boolean: true, + }, + }, + }, + }) as const, + process: (data: ReturnedData) => { + const flat = data.flatMap(({ attribute, supplement }) => { + const { categories, ...rest } = attribute + const flatAttribs = categories.map(({ category }) => ({ ...rest, category: category.tag })) + return supplement.flatMap(({ id: supplementId, ...supp }) => + flatAttribs.map(({ id: attributeId, ...attrib }) => ({ + attributeId, + supplementId, + ...attrib, + ...supp, + })) + ) + }) + return flat + }, +} + +type ReturnedData = { + attribute: { + id: string + tsKey: string + tsNs: string + categories: { + category: { + tag: string + ns: string + } + }[] + icon: string | null + iconBg: string | null + } + supplement: { + boolean: boolean | null + id: string + data: Prisma.JsonValue + active: boolean + text: { + tsKey: { + key: string + text: string + ns: string + } + } | null + countryId: string | null + govDistId: string | null + languageId: string | null + }[] +}[] diff --git a/packages/api/formatters/hours.ts b/packages/api/formatters/hours.ts new file mode 100644 index 0000000000..aab44d1e1a --- /dev/null +++ b/packages/api/formatters/hours.ts @@ -0,0 +1,54 @@ +import groupBy from 'just-group-by' +import { DateTime, Interval } from 'luxon' + +import { type Prisma } from '@weareinreach/db' +import { convertToLuxonWeekday } from '@weareinreach/util/luxon/weekday' + +const { weekYear, weekNumber } = DateTime.now() +export const formatHours = { + prismaSelect: (showAll?: boolean) => ({ + ...(showAll + ? {} + : ({ + where: { active: true }, + } as const)), + select: { id: true, dayIndex: true, start: true, end: true, closed: true, tz: true } as const, + orderBy: [ + { dayIndex: 'asc' }, + { start: 'asc' }, + ] satisfies Prisma.OrgHoursOrderByWithRelationAndSearchRelevanceInput[], + }), + process: (data: HoursData) => + groupBy( + data.map(({ start, end, tz, dayIndex, ...rest }) => { + const interval = Interval.fromDateTimes( + DateTime.fromJSDate(start, { zone: tz ?? 'America/New_York' }).set({ + weekday: convertToLuxonWeekday(dayIndex), + weekYear, + weekNumber, + }), + DateTime.fromJSDate(end, { zone: tz ?? 'America/New_York' }).set({ + weekday: convertToLuxonWeekday(start > end ? dayIndex + 1 : dayIndex), + weekYear, + weekNumber, + }) + ).toISO() + return { + tz, + dayIndex, + ...rest, + interval, + } + }), + ({ dayIndex }) => dayIndex + ), +} + +type HoursData = { + id: string + end: Date + dayIndex: number + start: Date + closed: boolean + tz: string | null +}[] diff --git a/packages/api/router/page/query.serviceEdit.handler.ts b/packages/api/router/page/query.serviceEdit.handler.ts index 724f1102b1..f5543affda 100644 --- a/packages/api/router/page/query.serviceEdit.handler.ts +++ b/packages/api/router/page/query.serviceEdit.handler.ts @@ -1,9 +1,14 @@ import { prisma } from '@weareinreach/db' +import { formatAccessDetails } from '~api/formatters/accessDetails' +import { formatAttributes } from '~api/formatters/attributes' +import { formatHours } from '~api/formatters/hours' import { handleError } from '~api/lib/errorHandler' import { type TRPCHandlerParams } from '~api/types/handler' import { type TServiceEditSchema } from './query.serviceEdit.schema' +const freeTextSelect = { select: { tsKey: { select: { key: true, text: true, ns: true } } } } as const + export const serviceEdit = async ({ ctx, input }: TRPCHandlerParams) => { try { const result = await prisma.orgService.findUnique({ @@ -14,17 +19,70 @@ export const serviceEdit = async ({ ctx, input }: TRPCHandlerParams ({ ...service.tag, variant: 'service' as const })), + services: services?.map(({ tag }) => tag), + emails: emails?.map(({ email: { title, ...rest } }) => ({ ...rest, title: title?.key ?? null })), + phones: phones?.map(({ phone: { description, ...rest } }) => ({ + ...rest, + description: description?.tsKey, + })), + accessDetails: formatAccessDetails.process(accessDetails), + hours: formatHours.process(hours), + attributes: formatAttributes.process(attributes), + locations: locations?.map(({ orgLocationId }) => orgLocationId), ...rest, } } catch (error) { From ecc4db57564148c71afa98305bcef38b05dfb5c7 Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Mon, 29 Jan 2024 17:03:47 -0500 Subject: [PATCH 38/67] start prisma extension for json --- packages/db/client/extensions/json.ts | 83 +++++++++++++++++++++++++++ packages/util/transformer/index.ts | 4 +- 2 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 packages/db/client/extensions/json.ts diff --git a/packages/db/client/extensions/json.ts b/packages/db/client/extensions/json.ts new file mode 100644 index 0000000000..b463b6a90f --- /dev/null +++ b/packages/db/client/extensions/json.ts @@ -0,0 +1,83 @@ +import { isSuperJSONResult, superjson } from '@weareinreach/util/transformer' +import { Prisma } from '~db/client' + +const deserialize = (data: unknown) => (isSuperJSONResult(data) ? superjson.deserialize(data) : data) + +const processData = (data: T) => (data ? superjson.stringify(data) : data) + +export const jsonExtension = Prisma.defineExtension((prisma) => { + return prisma.$extends({ + result: { + attributeSupplement: { + data: { + needs: { data: true }, + compute({ data }) { + return deserialize(data) + }, + }, + }, + suggestion: { + data: { + needs: { data: true }, + compute({ data }) { + return deserialize(data) + }, + }, + }, + }, + query: { + attributeSupplement: { + create({ args, query }) { + args.data.data = processData(args.data.data) + return query(args) + }, + createMany({ args, query }) { + args.data = Array.isArray(args.data) ? args.data : [args.data] + for (const item of args.data) { + item.data = processData(item.data) + } + return query(args) + }, + update({ args, query }) { + args.data.data = processData(args.data.data) + return query(args) + }, + updateMany({ args, query }) { + args.data.data = processData(args.data.data) + return query(args) + }, + upsert({ args, query }) { + args.create.data = processData(args.create.data) + args.update.data = processData(args.update.data) + return query(args) + }, + }, + suggestion: { + create({ args, query }) { + args.data.data = processData(args.data.data) + return query(args) + }, + createMany({ args, query }) { + args.data = Array.isArray(args.data) ? args.data : [args.data] + for (const item of args.data) { + item.data = processData(item.data) + } + return query(args) + }, + update({ args, query }) { + args.data.data = processData(args.data.data) + return query(args) + }, + updateMany({ args, query }) { + args.data.data = processData(args.data.data) + return query(args) + }, + upsert({ args, query }) { + args.create.data = processData(args.create.data) + args.update.data = processData(args.update.data) + return query(args) + }, + }, + }, + }) +}) diff --git a/packages/util/transformer/index.ts b/packages/util/transformer/index.ts index dfc678701b..3428de6a78 100644 --- a/packages/util/transformer/index.ts +++ b/packages/util/transformer/index.ts @@ -1,5 +1,5 @@ import { DateTime, Interval } from 'luxon' -import superjson from 'superjson' +import superjson, { type SuperJSONResult } from 'superjson' superjson.registerCustom( { @@ -17,6 +17,8 @@ superjson.registerCustom( }, 'LuxonInterval' ) +export const isSuperJSONResult = (data: unknown): data is SuperJSONResult => + !!data && typeof data === 'object' && !Array.isArray(data) && 'json' in data export { type SuperJSONResult } from 'superjson/dist/types' export const transformer = superjson From fbe78e581b6412ab9b5724b9a77133f4c3259767 Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Mon, 29 Jan 2024 17:08:24 -0500 Subject: [PATCH 39/67] create section components --- .../ui/components/core/Section/Divider.tsx | 31 +++++++++++++++++++ packages/ui/components/core/Section/Sub.tsx | 17 ++++++++++ .../components/core/Section/index.stories.tsx | 25 +++++++++++++++ packages/ui/components/core/Section/index.tsx | 11 +++++++ 4 files changed, 84 insertions(+) create mode 100644 packages/ui/components/core/Section/Divider.tsx create mode 100644 packages/ui/components/core/Section/Sub.tsx create mode 100644 packages/ui/components/core/Section/index.stories.tsx create mode 100644 packages/ui/components/core/Section/index.tsx diff --git a/packages/ui/components/core/Section/Divider.tsx b/packages/ui/components/core/Section/Divider.tsx new file mode 100644 index 0000000000..f816f49a07 --- /dev/null +++ b/packages/ui/components/core/Section/Divider.tsx @@ -0,0 +1,31 @@ +import { Box, createStyles, rem, Stack, type StackProps, Title } from '@mantine/core' +import { type ReactNode } from 'react' + +const useStyles = createStyles((theme) => ({ + sectionDivider: { + backgroundColor: theme.other.colors.primary.lightGray, + padding: rem(12), + }, +})) + +export const _Divider = ({ title, children, ...props }: SectionProps) => { + const { classes } = useStyles() + if (!children || (Array.isArray(children) && children.length === 0)) return null + + return ( + + + + {title} + + + {children} + + ) +} +_Divider.displayName = 'Section.Divider' + +interface SectionProps extends StackProps { + title?: string + children: ReactNode +} diff --git a/packages/ui/components/core/Section/Sub.tsx b/packages/ui/components/core/Section/Sub.tsx new file mode 100644 index 0000000000..a6884919fa --- /dev/null +++ b/packages/ui/components/core/Section/Sub.tsx @@ -0,0 +1,17 @@ +import { Stack, type StackProps, Title } from '@mantine/core' +import { type ReactNode } from 'react' + +export const _Sub = ({ title, children, ...props }: SubsectionProps) => { + return ( + + {title && {title}} + {children} + + ) +} +_Sub.displayName = 'Section.Sub' + +interface SubsectionProps extends StackProps { + title?: string + children: ReactNode +} diff --git a/packages/ui/components/core/Section/index.stories.tsx b/packages/ui/components/core/Section/index.stories.tsx new file mode 100644 index 0000000000..8986912d91 --- /dev/null +++ b/packages/ui/components/core/Section/index.stories.tsx @@ -0,0 +1,25 @@ +import { type Meta, type StoryObj } from '@storybook/react' + +import { Section } from './index' + +export default { + title: 'Design System/Section', + component: Section, +} satisfies Meta + +export const Divider = { + args: { + title: 'Section Name', + children: 'Section Content', + w: 500, + }, + render: (args) => , +} satisfies StoryObj + +export const Subsection = { + args: { + title: 'Section Name', + children: 'Section Content', + }, + render: (args) => , +} satisfies StoryObj diff --git a/packages/ui/components/core/Section/index.tsx b/packages/ui/components/core/Section/index.tsx new file mode 100644 index 0000000000..a7f41c301f --- /dev/null +++ b/packages/ui/components/core/Section/index.tsx @@ -0,0 +1,11 @@ +import { type HTMLProps } from 'react' + +import { _Divider } from './Divider' +import { _Sub } from './Sub' + +export const Section = ({ children, ...props }: HTMLProps) => { + return
{children}
+} + +Section.Divider = _Divider +Section.Sub = _Sub From c2fbfeb36769a1ebfef3aecd54f2ce711d3dca36 Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Mon, 29 Jan 2024 17:08:53 -0500 Subject: [PATCH 40/67] section --- .../[orgLocationId]/edit/[orgServiceId].tsx | 4 +- packages/ui/modals/Service/index.tsx | 97 ++++++++++--------- 2 files changed, 55 insertions(+), 46 deletions(-) diff --git a/apps/app/src/pages/org/[slug]/[orgLocationId]/edit/[orgServiceId].tsx b/apps/app/src/pages/org/[slug]/[orgLocationId]/edit/[orgServiceId].tsx index 4cf157f7b7..5084807fc8 100644 --- a/apps/app/src/pages/org/[slug]/[orgLocationId]/edit/[orgServiceId].tsx +++ b/apps/app/src/pages/org/[slug]/[orgLocationId]/edit/[orgServiceId].tsx @@ -12,6 +12,7 @@ import { checkServerPermissions } from '@weareinreach/auth' import { api } from '~app/utils/api' import { getServerSideTranslations } from '~app/utils/i18n' import { Badge } from '~ui/components/core/Badge' +import { Section } from '~ui/components/core/Section' import { InlineTextInput } from '~ui/components/data-portal/InlineTextInput' const FreetextObject = z @@ -45,7 +46,7 @@ const EditServicePage = () => { <> - + } name='name.text' @@ -68,6 +69,7 @@ const EditServicePage = () => { ))} )} + {t('service.get-help')} diff --git a/packages/ui/modals/Service/index.tsx b/packages/ui/modals/Service/index.tsx index 7fe4c3777d..b564b66f24 100644 --- a/packages/ui/modals/Service/index.tsx +++ b/packages/ui/modals/Service/index.tsx @@ -60,12 +60,63 @@ const useStyles = createStyles((theme) => ({ const CONTACTS = ['phone', 'email', 'website'] as const +const ModalText = ({ children }: ModalTextprops) => { + const { classes } = useStyles() + return ( + + {children} + + ) +} + +const SubSection = ({ title, children, li }: SubsectionProps) => { + const { t } = useTranslation('common') + + return ( + + {title && {t(`service.${title}`)}} + {li ? ( + + {typeof li === 'string' ? ( + + {li} + + ) : ( + li.map((item, i) => ( + + {item} + + )) + )} + + ) : ( + children + )} + + ) +} + +const SectionDivider = ({ title, children }: SectionProps) => { + const { classes } = useStyles() + const { t } = useTranslation('common') + if (!children || (Array.isArray(children) && children.length === 0)) return <> + + return ( + + + + {t(`service.${title}`)} + + + {children} + + ) +} const ServiceModalBody = forwardRef(({ serviceId, ...props }, ref) => { const slug = useSlug() const { data, status } = api.service.forServiceModal.useQuery(serviceId) const { data: orgId } = api.organization.getIdFromSlug.useQuery({ slug }) const { t, i18n } = useTranslation(orgId?.id ? ['common', 'attribute', orgId.id] : ['common', 'attribute']) - const { classes } = useStyles() const [opened, handler] = useDisclosure(false) const theme = useMantineTheme() const isMobile = useMediaQuery(`(max-width: ${theme.breakpoints.sm})`) @@ -109,50 +160,6 @@ const ServiceModalBody = forwardRef(({ ser ) } - const ModalText = ({ children }: ModalTextprops) => ( - - {children} - - ) - - const SubSection = ({ title, children, li }: SubsectionProps) => ( - - {title && {t(`service.${title}`)}} - {li ? ( - - {typeof li === 'string' ? ( - - {li} - - ) : ( - li.map((item, i) => ( - - {item} - - )) - )} - - ) : ( - children - )} - - ) - - const SectionDivider = ({ title, children }: SectionProps) => { - if (!children || (Array.isArray(children) && children.length === 0)) return <> - - return ( - - - - {t(`service.${title}`)} - - - {children} - - ) - } - const contactData: PassedDataObject = { phones: [], emails: [], From ff87328b21b66a0b0b16d0fb91176425fed69696 Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Tue, 30 Jan 2024 10:18:25 -0500 Subject: [PATCH 41/67] reduce zIndex --- packages/ui/components/sections/Navbar.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ui/components/sections/Navbar.tsx b/packages/ui/components/sections/Navbar.tsx index 8ec2396fc6..763dc4534d 100644 --- a/packages/ui/components/sections/Navbar.tsx +++ b/packages/ui/components/sections/Navbar.tsx @@ -25,7 +25,7 @@ const useStyles = createStyles((theme) => ({ top: 0, left: 0, right: 0, - zIndex: 10000, + zIndex: 1000, backgroundColor: theme.other.colors.secondary.white, }, mobileNav: { From 855dfbfb03380ef2ca48005f1700686cc31b1020 Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Tue, 30 Jan 2024 13:45:15 -0500 Subject: [PATCH 42/67] add banner text --- apps/app/public/locales/en/landingPage.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/app/public/locales/en/landingPage.json b/apps/app/public/locales/en/landingPage.json index 378bf8e3bc..ad796fa3b5 100644 --- a/apps/app/public/locales/en/landingPage.json +++ b/apps/app/public/locales/en/landingPage.json @@ -1,7 +1,8 @@ { "banner": { "donate": "Help keep InReach free for everyone. Donate now! 💝", - "redesign": "Read about the launch of the InReach App redesign on our blog. Learn more." + "redesign": "Read about the launch of the InReach App redesign on our blog. Learn more.", + "tmf": "Spread trans joy with #TransMascFutures 🏳️‍⚧️" }, "call-out": { "hear-from-users": "Hear from our users", From 1ed0c9fa7610e2d9552768ff54110de9285126da Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Tue, 30 Jan 2024 18:09:41 -0500 Subject: [PATCH 43/67] api route --- packages/api/router/component/index.ts | 7 +++ .../component/query.ServiceSelect.handler.ts | 50 +++++++++++++++++++ packages/ui/mockData/component.ts | 11 ++++ .../json/component.ServiceSelect.json | 1 + 4 files changed, 69 insertions(+) create mode 100644 packages/api/router/component/query.ServiceSelect.handler.ts create mode 100644 packages/ui/mockData/component.ts create mode 100644 packages/ui/mockData/json/component.ServiceSelect.json diff --git a/packages/api/router/component/index.ts b/packages/api/router/component/index.ts index f483f3a3da..6b61933919 100644 --- a/packages/api/router/component/index.ts +++ b/packages/api/router/component/index.ts @@ -14,4 +14,11 @@ export const componentRouter = defineRouter({ ) return handler(opts) }), + ServiceSelect: permissionedProcedure('updateOrgService').query(async (opts) => { + const handler = await importHandler( + namespaced('ServiceSelect'), + () => import('./query.ServiceSelect.handler') + ) + return handler(opts) + }), }) diff --git a/packages/api/router/component/query.ServiceSelect.handler.ts b/packages/api/router/component/query.ServiceSelect.handler.ts new file mode 100644 index 0000000000..a9b553872e --- /dev/null +++ b/packages/api/router/component/query.ServiceSelect.handler.ts @@ -0,0 +1,50 @@ +import { prisma } from '@weareinreach/db' +import { handleError } from '~api/lib/errorHandler' +import { type TRPCHandlerParams } from '~api/types/handler' + +export const ServiceSelect = async ({ ctx }: TRPCHandlerParams) => { + try { + const result = await prisma.serviceCategory.findMany({ + where: { + active: true, + OR: [{ crisisSupportOnly: null }, { crisisSupportOnly: false }], + }, + select: { + // id: true, + tsKey: true, + // tsNs: true, + services: { + where: { + active: true, + }, + select: { + serviceTag: { + select: { + id: true, + tsKey: true, + // tsNs: true, + }, + }, + }, + orderBy: { + serviceTag: { + name: 'asc', + }, + }, + }, + }, + orderBy: { + category: 'asc', + }, + }) + const transformed = result.map(({ services, ...rest }) => ({ + ...rest, + services: services.map(({ serviceTag }) => serviceTag), + })) + return transformed + } catch (error) { + handleError(error) + } +} + +export default ServiceSelect diff --git a/packages/ui/mockData/component.ts b/packages/ui/mockData/component.ts new file mode 100644 index 0000000000..a2dd655705 --- /dev/null +++ b/packages/ui/mockData/component.ts @@ -0,0 +1,11 @@ +import { getTRPCMock, type MockHandlerObject } from '~ui/lib/getTrpcMock' + +export const component = { + ServiceSelect: getTRPCMock({ + path: ['component', 'ServiceSelect'], + response: async () => { + const { default: data } = await import('./json/component.ServiceSelect.json') + return data + }, + }), +} satisfies MockHandlerObject<'component'> diff --git a/packages/ui/mockData/json/component.ServiceSelect.json b/packages/ui/mockData/json/component.ServiceSelect.json new file mode 100644 index 0000000000..5df0bd26d4 --- /dev/null +++ b/packages/ui/mockData/json/component.ServiceSelect.json @@ -0,0 +1 @@ +[{"tsKey":"abortion-care.CATEGORYNAME","services":[{"id":"svtg_01GW2HHFBN31248B3MH1486GE9","tsKey":"abortion-care.abortion-providers"},{"id":"svtg_01GW2HHFBNJ01JJT2ZGR52T4CM","tsKey":"abortion-care.financial-assistance"},{"id":"svtg_01GW2HHFBNE70TNNS3KMKEYG8C","tsKey":"abortion-care.lodging-assistance"},{"id":"svtg_01GW2HHFBNPM2CZ5S6A5GZ3CWY","tsKey":"abortion-care.mail-order-services"},{"id":"svtg_01GW2HHFBNM7GG79WYXK355RC2","tsKey":"abortion-care.mental-health-support"},{"id":"svtg_01GW2HHFBN1NBS5WWDSNB2D9DA","tsKey":"abortion-care.travel-assistance"}]},{"tsKey":"community-support.CATEGORYNAME","services":[{"id":"svtg_01H2738F1W23TZXB23VNPR9JM3","tsKey":"community-support.community-social-groups"},{"id":"svtg_01GW2HHFBND37W7E730QVADK0B","tsKey":"community-support.cultural-centers"},{"id":"svtg_01GW2HHFBN7GFWZJSATZDCK7EM","tsKey":"community-support.sponsors"},{"id":"svtg_01H273CH9YC9PXQWJ5RV349T2F","tsKey":"community-support.reentry-services"},{"id":"svtg_01GW2HHFBNJ4CGGZATZZS8DZWR","tsKey":"community-support.lgbtq-centers"},{"id":"svtg_01GW2HHFBN1CFQYR8RPA0KHSV0","tsKey":"community-support.spiritual-support"}]},{"tsKey":"computers-and-internet.CATEGORYNAME","services":[{"id":"svtg_01GW2HHFBN4B2F1W8HAWNK1HVS","tsKey":"computers-and-internet.computers-and-internet"}]},{"tsKey":"education-and-employment.CATEGORYNAME","services":[{"id":"svtg_01GW2HHFBP8GY6D2YJ8N1GYTNH","tsKey":"education-and-employment.career-counseling"},{"id":"svtg_01GW2HHFBPZFZF43FEHPV32JC8","tsKey":"education-and-employment.educational-support-for-lgbtq-youth"},{"id":"svtg_01GW2HHFBPC0P27MT0WMA3C4QH","tsKey":"education-and-employment.english-classes"},{"id":"svtg_01GW2HHFBP9GBJPZMWM9PA5DX0","tsKey":"education-and-employment.leadership-training-and-professional-development"},{"id":"svtg_01GW2HHFBPVH03WA49B1ABGW0F","tsKey":"education-and-employment.libraries"},{"id":"svtg_01GW2HHFBPBQ7XNCBG5AJF6W0X","tsKey":"education-and-employment.scholarships"}]},{"tsKey":"sports-and-entertainment.CATEGORYNAME","services":[{"id":"svtg_01H273BXC1T475GPEW4TXZ3Z20","tsKey":"sports-and-entertainment.art-music-literature"},{"id":"svtg_01GW2HHFBSYJJ8FRE5QRW4BQVR","tsKey":"sports-and-entertainment.sports-and-entertainment"}]},{"tsKey":"food.CATEGORYNAME","services":[{"id":"svtg_01GW2HHFBP9CP8V4WGA1QCWVKQ","tsKey":"food.food"}]},{"tsKey":"housing.CATEGORYNAME","services":[{"id":"svtg_01GW2HHFBPG92H7F9REAG9T2X5","tsKey":"housing.drop-in-centers-for-lgbtq-youth"},{"id":"svtg_01GW2HHFBPYW3BJXHHZSM33PMY","tsKey":"housing.emergency-housing"},{"id":"svtg_01GW2HHFBP3A2B8E5F070E9HR6","tsKey":"housing.housing-information-and-referrals"},{"id":"svtg_01GW2HHFBPC9YCGABHSSXEGN82","tsKey":"housing.short-term-housing"},{"id":"svtg_01GW2HHFBQ02KJQ7E5NPM3ERNE","tsKey":"housing.trans-housing"}]},{"tsKey":"hygiene-and-clothing.CATEGORYNAME","services":[{"id":"svtg_01GW2HHFBQYAZE13SSFJ1WZ7J8","tsKey":"hygiene-and-clothing.clothes"},{"id":"svtg_01GW2HHFBQ817GKC3K6D6JGMVC","tsKey":"hygiene-and-clothing.gender-affirming-items"},{"id":"svtg_01GW2HHFBQNARDK4H2W30GC1QR","tsKey":"hygiene-and-clothing.gender-neutral-bathrooms"},{"id":"svtg_01GW2HHFBQBV2YXAS0AQAFXY33","tsKey":"hygiene-and-clothing.haircuts-and-stylists"},{"id":"svtg_01GW2HHFBQ0J8FBM5SECT20H4K","tsKey":"hygiene-and-clothing.hygiene"}]},{"tsKey":"legal.CATEGORYNAME","services":[{"id":"svtg_01GW2HHFBQSF73S87ZRENXHKQV","tsKey":"legal.asylum-application"},{"id":"svtg_01GW2HHFBQ4R0QKMB5XKN0VPR3","tsKey":"legal.citizenship"},{"id":"svtg_01GW2HHFBQEVJCBZC1KSSEB8WN","tsKey":"legal.crime-and-discrimination"},{"id":"svtg_01GW2HHFBQMRW61WVCRR82EJ55","tsKey":"legal.deferred-action-for-childhood-arrivals-daca"},{"id":"svtg_01GW2HHFBQ053M5632FG5BEHAB","tsKey":"legal.deportation-or-removal"},{"id":"svtg_01GW2HHFBQWFR2KPXH7KPX96BD","tsKey":"legal.employment-authorization"},{"id":"svtg_01GW2HHFBQF6937029TNRN458W","tsKey":"legal.family-petitions"},{"id":"svtg_01GW2HHFBQ78QZGW7YAPDZ2YJS","tsKey":"legal.immigration-detention"},{"id":"svtg_01GW2HHFBRY1NC6GD7XAHG6AR8","tsKey":"legal.legal-hotlines"},{"id":"svtg_01GW2HHFBRB8R4AQVR2FYE72EC","tsKey":"legal.name-and-gender-change"},{"id":"svtg_01GW2HHFBR53GRFZYTNQ8DQ2WF","tsKey":"legal.residency"},{"id":"svtg_01GW2HHFBR3T44H6K1BKD38JYT","tsKey":"legal.special-immigrant-juvenile-status-sijs"},{"id":"svtg_01GW2HHFBR0YA6DR2VTE0KCE9N","tsKey":"legal.t-visa"},{"id":"svtg_01GW2HHFBRYVSPX4GA4RZY0XTA","tsKey":"legal.u-visa"}]},{"tsKey":"mail.CATEGORYNAME","services":[{"id":"svtg_01GW2HHFBT91CV2R6WKEX6MYPE","tsKey":"mail.mail"}]},{"tsKey":"medical.CATEGORYNAME","services":[{"id":"svtg_01GW2HHFBRJER29EH8BK4STRPE","tsKey":"medical.covid-19-services"},{"id":"svtg_01GW2HHFBRQ76SJBY7973FZFDC","tsKey":"medical.dental-care"},{"id":"svtg_01GW2HHFBRPBXSYN12DWNEAJJ7","tsKey":"medical.hiv-and-sexual-health"},{"id":"svtg_01GW2HHFBRJX151YFSTMPVN7CV","tsKey":"medical.medical-clinics"},{"id":"svtg_01GW2HHFBRDW97D7E0XAPA2XRN","tsKey":"medical.obgyn-services"},{"id":"svtg_01GW2HHFBRZB55NNQXGZDZSC8Y","tsKey":"medical.physical-evaluations-for-asylum-claim"},{"id":"svtg_01GW2HHFBR506BA0ZA7XZWX23Q","tsKey":"medical.trans-health-gender-affirming-surgery"},{"id":"svtg_01GW2HHFBSBVW6KJACB43FTFNQ","tsKey":"medical.trans-health-hormone-and-surgery-letters"},{"id":"svtg_01GW2HHFBSZJ7ZQD3AVMKQK83N","tsKey":"medical.trans-health-hormone-therapy"},{"id":"svtg_01GW2HHFBSG3BES4BKSW269M8K","tsKey":"medical.trans-health-primary-care"},{"id":"svtg_01GW2HHFBS5YQWBD8N2V56X5X0","tsKey":"medical.trans-health-speech-therapy"},{"id":"svtg_01HAD647BVMT10DWEXFG1EFM9J","tsKey":"medical.trans-health-youth-care"}]},{"tsKey":"mental-health.CATEGORYNAME","services":[{"id":"svtg_01GW2HHFBS2G776ZTE6R3ZCWEF","tsKey":"mental-health.bipoc-support-groups"},{"id":"svtg_01GW2HHFBSKZHCJT1X2KWXC8HB","tsKey":"mental-health.hotlines"},{"id":"svtg_01GW2HHFBSTS3SZNE3GBAF9N2B","tsKey":"mental-health.private-therapy-and-counseling"},{"id":"svtg_01GW2HHFBS617V01ANP6MXPSSX","tsKey":"mental-health.psychological-evaluations-for-asylum-claim"},{"id":"svtg_01GW2HHFBSX65WWRQ3BFXHWCJN","tsKey":"mental-health.substance-use"},{"id":"svtg_01GW2HHFBS72MEA9GWN7FWYWQA","tsKey":"mental-health.support-for-caregivers-of-trans-youth"},{"id":"svtg_01GW2HHFBS16CJP08CPDSNNVBY","tsKey":"mental-health.support-for-conversion-therapy-survivors"},{"id":"svtg_01GW2HHFBSTFJC21CK33S54BPZ","tsKey":"mental-health.support-groups"},{"id":"svtg_01GW2HHFBSPTXA7Q4W5RKFP53W","tsKey":"mental-health.trans-support-groups"}]},{"tsKey":"trans-focused-services.CATEGORYNAME","services":[{"id":"svtg_01GW2HHFBQ817GKC3K6D6JGMVC","tsKey":"hygiene-and-clothing.gender-affirming-items"},{"id":"svtg_01GW2HHFBQNARDK4H2W30GC1QR","tsKey":"hygiene-and-clothing.gender-neutral-bathrooms"},{"id":"svtg_01GW2HHFBRB8R4AQVR2FYE72EC","tsKey":"legal.name-and-gender-change"},{"id":"svtg_01GW2HHFBS72MEA9GWN7FWYWQA","tsKey":"mental-health.support-for-caregivers-of-trans-youth"},{"id":"svtg_01GW2HHFBR506BA0ZA7XZWX23Q","tsKey":"medical.trans-health-gender-affirming-surgery"},{"id":"svtg_01GW2HHFBSBVW6KJACB43FTFNQ","tsKey":"medical.trans-health-hormone-and-surgery-letters"},{"id":"svtg_01GW2HHFBSZJ7ZQD3AVMKQK83N","tsKey":"medical.trans-health-hormone-therapy"},{"id":"svtg_01GW2HHFBSG3BES4BKSW269M8K","tsKey":"medical.trans-health-primary-care"},{"id":"svtg_01GW2HHFBS5YQWBD8N2V56X5X0","tsKey":"medical.trans-health-speech-therapy"},{"id":"svtg_01HAD647BVMT10DWEXFG1EFM9J","tsKey":"medical.trans-health-youth-care"},{"id":"svtg_01GW2HHFBQ02KJQ7E5NPM3ERNE","tsKey":"housing.trans-housing"},{"id":"svtg_01HAD99DSF7TH2HDXNYC331BVN","tsKey":"trans-focused-services.transport-gacare"},{"id":"svtg_01HADA68N465FMV5P6XYD4VQBV","tsKey":"trans-focused-services.transport-relo-support"},{"id":"svtg_01GW2HHFBSPTXA7Q4W5RKFP53W","tsKey":"mental-health.trans-support-groups"}]},{"tsKey":"translation-and-interpretation.CATEGORYNAME","services":[{"id":"svtg_01GW2HHFBTPY48P18NZR9S3DC8","tsKey":"translation-and-interpretation.for-healthcare"},{"id":"svtg_01GW2HHFBTRAAMB3K1JQ2V41GH","tsKey":"translation-and-interpretation.for-legal-services"},{"id":"svtg_01GW2HHFBSA32322K840DVFNSW","tsKey":"translation-and-interpretation.general-translation-and-interpretation"}]},{"tsKey":"transportation.CATEGORYNAME","services":[{"id":"svtg_01GW2HHFBTM1JSTAQKF8DYS9V5","tsKey":"transportation.transit-passes-and-discounts"},{"id":"svtg_01GW2HHFBTQ73C86ARY7WV96WB","tsKey":"transportation.transportation-assistance"},{"id":"svtg_01HAD99DSF7TH2HDXNYC331BVN","tsKey":"trans-focused-services.transport-gacare"},{"id":"svtg_01HADA68N465FMV5P6XYD4VQBV","tsKey":"trans-focused-services.transport-relo-support"}]}] From 16d75ac748ec6dce31864b7baaba0c67d7325e58 Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Tue, 30 Jan 2024 18:12:15 -0500 Subject: [PATCH 44/67] service tag selection --- .../[orgLocationId]/edit/[orgServiceId].tsx | 100 +++++++++++------- .../ServiceSelect/index.stories.tsx | 38 +++++++ .../data-portal/ServiceSelect/index.tsx | 97 +++++++++++++++++ packages/ui/modals/index.ts | 2 +- 4 files changed, 195 insertions(+), 42 deletions(-) create mode 100644 packages/ui/components/data-portal/ServiceSelect/index.stories.tsx create mode 100644 packages/ui/components/data-portal/ServiceSelect/index.tsx diff --git a/apps/app/src/pages/org/[slug]/[orgLocationId]/edit/[orgServiceId].tsx b/apps/app/src/pages/org/[slug]/[orgLocationId]/edit/[orgServiceId].tsx index 5084807fc8..ca051bb754 100644 --- a/apps/app/src/pages/org/[slug]/[orgLocationId]/edit/[orgServiceId].tsx +++ b/apps/app/src/pages/org/[slug]/[orgLocationId]/edit/[orgServiceId].tsx @@ -1,7 +1,9 @@ -import { Grid, Stack } from '@mantine/core' +import { createStyles, Grid, rem, Stack } from '@mantine/core' +import dynamic from 'next/dynamic' import { useRouter } from 'next/router' import { useTranslation } from 'next-i18next' import { type GetServerSideProps } from 'nextjs-routes' +import { Suspense } from 'react' import { useForm } from 'react-hook-form' import { Textarea, TextInput } from 'react-hook-form-mantine' import { z } from 'zod' @@ -9,11 +11,14 @@ import { z } from 'zod' import { prefixedId } from '@weareinreach/api/schemas/idPrefix' import { trpcServerClient } from '@weareinreach/api/trpc' import { checkServerPermissions } from '@weareinreach/auth' +import { Badge } from '@weareinreach/ui/components/core/Badge' +import { Section } from '@weareinreach/ui/components/core/Section' +import { InlineTextInput } from '@weareinreach/ui/components/data-portal/InlineTextInput' +import { ServiceSelect } from '@weareinreach/ui/components/data-portal/ServiceSelect' import { api } from '~app/utils/api' import { getServerSideTranslations } from '~app/utils/i18n' -import { Badge } from '~ui/components/core/Badge' -import { Section } from '~ui/components/core/Section' -import { InlineTextInput } from '~ui/components/data-portal/InlineTextInput' + +const DevTool = dynamic(() => import('@hookform/devtools').then((mod) => mod.DevTool), { ssr: false }) const FreetextObject = z .object({ @@ -25,53 +30,73 @@ const FreetextObject = z const FormSchema = z.object({ name: FreetextObject, - desription: FreetextObject, - services: z.object({ id: prefixedId('serviceTag'), tsKey: z.string(), tsNs: z.string() }).array(), + description: FreetextObject, + services: prefixedId('serviceTag').array(), published: z.boolean(), deleted: z.boolean(), }) +const isObject = (x: unknown): x is object => typeof x === 'object' + type FormSchemaType = z.infer const EditServicePage = () => { const { t } = useTranslation() const router = useRouter<'/org/[slug]/[orgLocationId]/edit/[orgServiceId]'>() const { data } = api.page.serviceEdit.useQuery({ id: router.query.orgServiceId ?? '' }) + const { data: allServices } = api.service.getOptions.useQuery() const form = useForm({ - values: data ? data : undefined, + values: data ? { ...data, services: data.services.map(({ id }) => id) } : undefined, }) - const nameIsDirty = - typeof form.formState.dirtyFields.name === 'object' ? form.formState.dirtyFields.name.text : false + const dirtyFields = { + name: isObject(form.formState.dirtyFields.name) ? form.formState.dirtyFields.name.text : false, + description: isObject(form.formState.dirtyFields.description) + ? form.formState.dirtyFields.description.text + : false, + services: form.formState.dirtyFields.services ?? false, + } + const activeServices = form.watch('services') ?? [] return ( <> - } - name='name.text' - control={form.control} - fontSize='h2' - data-isDirty={nameIsDirty} - /> - } - name='description.text' - control={form.control} - data-isDirty={nameIsDirty} - autosize - /> + + } + name='name.text' + control={form.control} + fontSize='h2' + data-isDirty={dirtyFields.name} + /> + + + } + name='description.text' + control={form.control} + data-isDirty={dirtyFields.description} + autosize + /> + - {!!data && ( - - {data.services.map((service) => ( - {t(service.tsKey, { ns: service.tsNs })} - ))} - - )} + + + + {activeServices.map((serviceId) => { + const service = allServices?.find((s) => s.id === serviceId) + if (!service) return null + return ( + {t(service.tsKey, { ns: service.tsNs })} + ) + })} + + + {t('service.get-help')} + ) } @@ -104,17 +129,10 @@ export const getServerSideProps: GetServerSideProps = async ({ locale, params, r const ssg = await trpcServerClient({ session }) const { id: orgId } = await ssg.organization.getIdFromSlug.fetch({ slug }) const [i18n] = await Promise.all([ - getServerSideTranslations(locale, [ - 'common', - 'services', - 'attribute', - 'phone-type', - 'country', - 'gov-dist', - orgId, - ]), - ssg.organization.getBySlug.prefetch({ slug }), - ssg.location.getById.prefetch({ id: orgLocationId }), + getServerSideTranslations(locale, ['common', 'services', 'attribute', orgId]), + ssg.page.serviceEdit.prefetch({ id: orgServiceId }), + ssg.component.ServiceSelect.prefetch(), + ssg.service.getOptions.prefetch(), ]) const props = { session, diff --git a/packages/ui/components/data-portal/ServiceSelect/index.stories.tsx b/packages/ui/components/data-portal/ServiceSelect/index.stories.tsx new file mode 100644 index 0000000000..e848182269 --- /dev/null +++ b/packages/ui/components/data-portal/ServiceSelect/index.stories.tsx @@ -0,0 +1,38 @@ +import { DevTool } from '@hookform/devtools' +import { type Meta, type StoryObj } from '@storybook/react' +import { type FieldValues, useForm } from 'react-hook-form' + +import { component } from '~ui/mockData/component' + +import { ServiceSelect, type ServiceSelectProps } from './index' + +const StoryRender = (args: ServiceSelectProps) => { + const form = useForm() + + return ( + <> + + Open Drawer + + + + ) +} + +export default { + title: 'Data Portal/Drawers/Service Selection', + component: ServiceSelect, + parameters: { + msw: [component.ServiceSelect], + layout: 'fullscreen', + rqDevtools: true, + }, + args: { + name: 'services', + }, + render: StoryRender, +} satisfies Meta + +type StoryDef = StoryObj + +export const Default = {} satisfies StoryDef diff --git a/packages/ui/components/data-portal/ServiceSelect/index.tsx b/packages/ui/components/data-portal/ServiceSelect/index.tsx new file mode 100644 index 0000000000..93fe71e8dc --- /dev/null +++ b/packages/ui/components/data-portal/ServiceSelect/index.tsx @@ -0,0 +1,97 @@ +import { Box, type BoxProps, createStyles, Drawer, Group, rem, Stack, Text, Title } from '@mantine/core' +import { useDisclosure } from '@mantine/hooks' +import { useTranslation } from 'next-i18next' +import { type FieldValues, type UseControllerProps, useFormState } from 'react-hook-form' +import { Checkbox } from 'react-hook-form-mantine' + +import { Breadcrumb } from '~ui/components/core/Breadcrumb' +import { useCustomVariant } from '~ui/hooks/useCustomVariant' +import { trpc as api } from '~ui/lib/trpcClient' + +const useStyles = createStyles((theme) => ({ + drawerContent: { + borderRadius: `${rem(32)} 0 0 0`, + minWidth: '40vw', + }, + checkboxLabel: theme.other.utilityFonts.utility2, + box: { + backgroundColor: theme.fn.lighten(theme.other.colors.secondary.teal, 0.9), + width: '100%', + padding: rem(8), + // margin: rem(-8), + borderRadius: rem(8), + '&[data-isDirty=true]': { + backgroundColor: theme.fn.lighten(theme.other.colors.secondary.teal, 0.6), + }, + ...theme.fn.hover({ cursor: 'pointer' }), + }, +})) +export const ServiceSelect = ({ + name, + control, + defaultValue, + rules, + shouldUnregister, + ...props +}: ServiceSelectProps) => { + const [opened, handler] = useDisclosure(false) + const { data } = api.component.ServiceSelect.useQuery() + const { classes } = useStyles() + const { t } = useTranslation('services') + const variants = useCustomVariant() + const form = useFormState({ control, name }) + + const serviceGroups = data ? ( + + + {data.map((category) => ( + + {t(category.tsKey)} + {category.services.map((service) => ( + + ))} + + ))} + + + ) : null + + return ( + <> + + + + + + + + + + + Select Service Tags + {serviceGroups} + + + + + + + ) +} + +export interface ServiceSelectProps extends UseControllerProps, BoxProps {} diff --git a/packages/ui/modals/index.ts b/packages/ui/modals/index.ts index 9e4b8e495b..f2d669a6ec 100644 --- a/packages/ui/modals/index.ts +++ b/packages/ui/modals/index.ts @@ -14,7 +14,7 @@ export * from './PrivacyStatement' export * from './QuickPromotion' export * from './ResetPassword' export * from './Review' -export * from './Service' +export * from './Service/index' export * from './ServiceFilter/index' export * from './UserSurvey/index' // codegen:end From 3cc3a2cd63bfe682a85fddda0f851a84dc153282 Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Tue, 30 Jan 2024 18:12:40 -0500 Subject: [PATCH 45/67] disable in local dev --- apps/app/sentry.client.config.ts | 3 ++- apps/app/sentry.server.config.ts | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/app/sentry.client.config.ts b/apps/app/sentry.client.config.ts index f94b991115..8c5640abf8 100644 --- a/apps/app/sentry.client.config.ts +++ b/apps/app/sentry.client.config.ts @@ -9,7 +9,7 @@ const isVercelProd = process.env.VERCEL_ENV === 'production' Sentry.init({ dsn: 'https://3398c2248c86498ab42fa8533e4f83f1@o1412293.ingest.sentry.io/6751163', integrations: [ - new Sentry.Replay({ + Sentry.replayIntegration({ // Additional Replay configuration goes in here, for example: maskAllText: true, blockAllMedia: true, @@ -17,6 +17,7 @@ Sentry.init({ new Sentry.BrowserTracing(), new Sentry.BrowserProfilingIntegration(), ], + enabled: isVercelProd, // Adjust this value in production, or use tracesSampler for greater control tracesSampleRate: isVercelProd ? 0.5 : 1.0, diff --git a/apps/app/sentry.server.config.ts b/apps/app/sentry.server.config.ts index e9af9190bd..49dfaf7b3d 100644 --- a/apps/app/sentry.server.config.ts +++ b/apps/app/sentry.server.config.ts @@ -16,7 +16,7 @@ Sentry.init({ // Adjust this value in production, or use tracesSampler for greater control tracesSampleRate: isVercelProd ? 0.5 : 1.0, profilesSampleRate: isVercelProd ? 0.5 : 1.0, - + enabled: isVercelProd, // Setting this option to true will print useful information to the console while you're setting up Sentry. debug: !!process.env.SENTRY_DEBUG, // instrumenter: 'otel', From f81823f1a0103869930da309fb7918d49da6a697 Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Wed, 31 Jan 2024 13:28:38 -0500 Subject: [PATCH 46/67] add dep, update prettier ignore --- .prettierignore | 1 + packages/api/package.json | 1 + pnpm-lock.yaml | 3 +++ 3 files changed, 5 insertions(+) diff --git a/.prettierignore b/.prettierignore index 4c6848663d..b7f2fa1714 100644 --- a/.prettierignore +++ b/.prettierignore @@ -15,3 +15,4 @@ pnpm-lock.yaml *.hbs .trace/*.json packages/ui/mockData/json/*.json +packages/db/prisma/data-migrations/**/*.json diff --git a/packages/api/package.json b/packages/api/package.json index fc7f3b217c..37153def87 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -35,6 +35,7 @@ "geo-tz": "8.0.1", "geolib": "3.3.4", "just-compact": "3.2.0", + "just-filter-object": "3.2.0", "just-flush": "2.3.0", "just-group-by": "2.2.0", "just-map-values": "3.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 71976e7fce..aae487410b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -696,6 +696,9 @@ importers: just-compact: specifier: 3.2.0 version: 3.2.0 + just-filter-object: + specifier: 3.2.0 + version: 3.2.0 just-flush: specifier: 2.3.0 version: 2.3.0 From 8f06dad508abf240c85db36dd2cb9412a807c8ce Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Wed, 31 Jan 2024 13:29:18 -0500 Subject: [PATCH 47/67] reduce data sent --- packages/api/formatters/accessDetails.ts | 12 +++++++++--- packages/api/formatters/attributes.ts | 19 ++++++++++--------- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/packages/api/formatters/accessDetails.ts b/packages/api/formatters/accessDetails.ts index f8cd9d6ecf..5f1510ce33 100644 --- a/packages/api/formatters/accessDetails.ts +++ b/packages/api/formatters/accessDetails.ts @@ -15,7 +15,13 @@ export const formatAccessDetails = { }, } as const)), select: { - attribute: { select: { id: true, tsKey: true, tsNs: true } }, + attribute: { + select: { + id: true, + // tsKey: true, + // tsNs: true + }, + }, supplement: { select: { id: true, @@ -52,8 +58,8 @@ export const formatAccessDetails = { type AccessDetailData = { attribute: { id: string - tsKey: string - tsNs: string + // tsKey: string + // tsNs: string } supplement: { id: string diff --git a/packages/api/formatters/attributes.ts b/packages/api/formatters/attributes.ts index 356a85a832..a11e76ff87 100644 --- a/packages/api/formatters/attributes.ts +++ b/packages/api/formatters/attributes.ts @@ -15,10 +15,10 @@ export const formatAttributes = { attribute: { select: { id: true, - tsKey: true, - tsNs: true, - icon: true, - iconBg: true, + // tsKey: true, + // tsNs: true, + // icon: true, + // iconBg: true, categories: { select: { category: { select: { tag: true, ns: true } } } }, }, }, @@ -41,12 +41,13 @@ export const formatAttributes = { const flat = data.flatMap(({ attribute, supplement }) => { const { categories, ...rest } = attribute const flatAttribs = categories.map(({ category }) => ({ ...rest, category: category.tag })) - return supplement.flatMap(({ id: supplementId, ...supp }) => + return supplement.flatMap(({ id: supplementId, text, ...supp }) => flatAttribs.map(({ id: attributeId, ...attrib }) => ({ attributeId, supplementId, ...attrib, ...supp, + text: text?.tsKey ?? null, })) ) }) @@ -57,16 +58,16 @@ export const formatAttributes = { type ReturnedData = { attribute: { id: string - tsKey: string - tsNs: string + // tsKey: string + // tsNs: string categories: { category: { tag: string ns: string } }[] - icon: string | null - iconBg: string | null + // icon: string | null + // iconBg: string | null } supplement: { boolean: boolean | null From 896ef956ede1800562d40428cb0bc4b486c49514 Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Wed, 31 Jan 2024 13:29:44 -0500 Subject: [PATCH 48/67] fix middleware --- packages/db/lib/superjsonMiddleware.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/db/lib/superjsonMiddleware.ts b/packages/db/lib/superjsonMiddleware.ts index cdd663fdfe..b03ad9a287 100644 --- a/packages/db/lib/superjsonMiddleware.ts +++ b/packages/db/lib/superjsonMiddleware.ts @@ -2,7 +2,7 @@ import { Prisma } from '@prisma/client' import { z } from 'zod' import { createLoggerInstance } from '@weareinreach/util/logger' -import { superjson, type SuperJSONResult } from '@weareinreach/util/transformer' +import { isSuperJSONResult, superjson } from '@weareinreach/util/transformer' import { NullableJsonValue } from './zod' @@ -63,9 +63,6 @@ type ActionMap = { [k in ActionKeys]: (Prisma.PrismaAction | 'findUniqueOrThrow' | 'findFirstOrThrow')[] } -const isSuperJSON = (data: unknown): data is SuperJSONResult => - typeof data === 'object' && data !== null && Object.hasOwn(data, 'json') - const hasSuppData = (result: unknown): result is Results => ResultSchema.safeParse(result).success const hasSuppDataArr = (result: unknown): result is Results[] => ResultSchema.array().safeParse(result).success @@ -75,9 +72,10 @@ const hasJsonDataArr = (data: unknown): data is DataArray => DataArray.safeParse const processRead = (data?: z.infer) => { try { - if (isSuperJSON(data)) { + if (isSuperJSONResult(data)) { return superjson.deserialize(data) } + if (!data) return data const output = superjson.parse(JSON.stringify(data)) return output ?? data } catch (err) { @@ -86,9 +84,12 @@ const processRead = (data?: z.infer) => { } } const processWrite = (data?: z.infer) => { - if (data === Prisma.DbNull || data === Prisma.JsonNull || isSuperJSON(data)) { + if (data === Prisma.DbNull || data === Prisma.JsonNull || isSuperJSONResult(data)) { return data } + if (data === null) { + return Prisma.DbNull + } return superjson.serialize(data) as unknown as z.infer } From 16ed67e3bb9c5e7eb49b7337519f517a03750d4e Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Wed, 31 Jan 2024 13:30:46 -0500 Subject: [PATCH 49/67] data migrations --- .../2024-01-31_fix-attr-supp-json/index.ts | 82 +++++++++++++++++++ .../2024-01-31_fix-attr-supp-json/nulls.json | 1 + .../serialize.json | 1 + .../2024-01-31_target-population-attrib.ts | 79 ++++++++++++++++++ packages/db/prisma/data-migrations/index.ts | 2 + 5 files changed, 165 insertions(+) create mode 100644 packages/db/prisma/data-migrations/2024-01-31_fix-attr-supp-json/index.ts create mode 100644 packages/db/prisma/data-migrations/2024-01-31_fix-attr-supp-json/nulls.json create mode 100644 packages/db/prisma/data-migrations/2024-01-31_fix-attr-supp-json/serialize.json create mode 100644 packages/db/prisma/data-migrations/2024-01-31_target-population-attrib.ts diff --git a/packages/db/prisma/data-migrations/2024-01-31_fix-attr-supp-json/index.ts b/packages/db/prisma/data-migrations/2024-01-31_fix-attr-supp-json/index.ts new file mode 100644 index 0000000000..9b79722499 --- /dev/null +++ b/packages/db/prisma/data-migrations/2024-01-31_fix-attr-supp-json/index.ts @@ -0,0 +1,82 @@ +import { isSuperJSONResult, superjson } from '@weareinreach/util/transformer' +import { prisma, Prisma } from '~db/client' +import { formatMessage } from '~db/prisma/common' +import { type MigrationJob } from '~db/prisma/dataMigrationRunner' +import { createLogger, type JobDef, jobPostRunner } from '~db/prisma/jobPreRun' +/** Define the job metadata here. */ +const jobDef: JobDef = { + jobId: '2024-01-31_fix-attr-supp-json', + title: 'fix attr supp json', + createdBy: 'Joe Karow', + /** Optional: Longer description for the job */ + description: undefined, +} +/** + * Job export - this variable MUST be UNIQUE + */ +export const job20240131_fix_attr_supp_json = { + title: `[${jobDef.jobId}] ${jobDef.title}`, + task: async (_ctx, task) => { + /** Create logging instance */ + createLogger(task, jobDef.jobId) + const log = (...args: Parameters) => (task.output = formatMessage(...args)) + /** + * Start defining your data migration from here. + * + * To log output, use `task.output = 'Message to log'` + * + * This will be written to `stdout` and to a log file in `/prisma/migration-logs/` + */ + + // Do stuff + + const { default: nullIds } = await import('./nulls.json') + + const nullJson = await prisma.attributeSupplement.updateMany({ + where: { id: { in: nullIds } }, + data: { + data: Prisma.DbNull, + }, + }) + log(`Cleared ${nullJson.count} null fields`) + + const { default: suppIds } = await import('./serialize.json') + const data = await prisma.attributeSupplement.findMany({ + where: { + id: { in: suppIds }, + }, + select: { + id: true, + data: true, + }, + }) + + const correctedData = data.map(({ id, data }) => ({ + where: { id }, + data: { + data: (isSuperJSONResult(data) + ? superjson.deserialize(data) + : typeof data === 'string' + ? superjson.parse(data) + : data) as unknown as Prisma.InputJsonValue, + }, + })) + const total = correctedData.length + let i = 1 + while (correctedData.length) { + const batch = correctedData.splice(0, 100) + log(`[BATCH] Processing records ${i}-${i + batch.length - 1} of ${total}`) + const result = await prisma.$transaction(batch.map((args) => prisma.attributeSupplement.update(args))) + log(`Updated ${result.length} records`) + i = i + batch.length + } + + /** + * DO NOT REMOVE BELOW + * + * This writes a record to the DB to register that this migration has run successfully. + */ + await jobPostRunner(jobDef) + }, + def: jobDef, +} satisfies MigrationJob diff --git a/packages/db/prisma/data-migrations/2024-01-31_fix-attr-supp-json/nulls.json b/packages/db/prisma/data-migrations/2024-01-31_fix-attr-supp-json/nulls.json new file mode 100644 index 0000000000..6f36981ae5 --- /dev/null +++ b/packages/db/prisma/data-migrations/2024-01-31_fix-attr-supp-json/nulls.json @@ -0,0 +1 @@ +["atts_01GW2HTDRY4VJX8JY7R4N6WPJ9","atts_01GW2HTB0KZ7ZXVARQ79AVD5PK","atts_01GW2HTB0WX410Q27DFN8RTWGN","atts_01GW2HTM42PM9NHF05KB258HQ5","atts_01GW2HTB166FH0JZT3GMHGNVBR","atts_01GW2HTB1BTVFDB82AYBWTDTJ7","atts_01GW2HTB1GN5J2C4H1RM1GMTJM","atts_01GW2HTB1NFTHQXRFJNS3X328Q","atts_01GW2HTM403ZR7YFSW6ERKC7KZ","atts_01GW2HTM3SYRBV9Y1PCEP2M7AB","atts_01GW2HTB1Q1JBPDH28XY40Q414","atts_01GW2HTM3RA6V0YX561PZP339F","atts_01GW2HTB2KAKWAXB4MPR2XFSMA","atts_01GW2HTB3DS8D0254X64RCGXG5","atts_01GW2HTM3PDM295XT0PV55SEW6","atts_01GW2HTB4JN7WZH9QNXM8H1Z7F","atts_01GW2HTB4MPE99Y5C68X8NH5CE","atts_01GW2HTM3M0BWZ8MHWRJ7N2EPG","atts_01GW2HTM3KRNVVBWMYWGF4BZFR","atts_01GW2HTM3HBG6FCP6KP4C5FD5Q","atts_01GW2HTM3GXPQYG9X9PE2YPG2X","atts_01GW2HTM21X6ZBE87JJR6ABMJF","atts_01GW2HTB4P6NMADEX2TZ2YQ98K","atts_01GW2HTM0ZC53VP8WRR23DMW9T","atts_01GW2HTB4V38SQK386R0XY78DH","atts_01GW2HTB5FDFWNTAAGD4QB1MX3","atts_01GW2HTM07BVR214E4AT67PK71","atts_01GW2HTB76RMQRAZEWNC4ZXZF8","atts_01GW2HTB7A3MTC38ZCR92BF6YY","atts_01GW2HTB7DVRTGQ15A8QVD54HZ","atts_01GW2HTB7GF0QTE2EQF7J6F3WY","atts_01GW2HTKZPSRQC1WZK1ZY3RP2K","atts_01GW2HTB9XTTX9BNB2B62XJ4JJ","atts_01GW2HTKZNY5AJG7CM1KSAQPB4","atts_01GW2HTKZMKXP9A7XEW506JYWF","atts_01GW2HTKZK2GC7GK0S8XZ325Z8","atts_01GW2HTKZH9YDNNPKFVJPVCXPN","atts_01GW2HTKZAE5QRH9WS386GV7FY","atts_01GW2HTKZ9C7747DJTYCSJN0MY","atts_01GW2HTKZ7ZB3Z5PD564R3Q0A0","atts_01GW2HTKZ2XFY2QPCE6AP8YWPJ","atts_01GW2HTKY8NY6CCGTG21FZ428D","atts_01GW2HTKY6D8SPRCMZ60CHBCR3","atts_01GW2HTB9ZFCZ0M7A56AWSZEHJ","atts_01GW2HTKWHVF2FQ7R7YV0B5633","atts_01GW2HTKWGZD1CTMA4RSGSTGKZ","atts_01GW2HTKWE6KPSHEDM98T1WESK","atts_01GW2HTKVPYJ2986HD4CQ8KNV9","atts_01GW2HTKTRMMBRCB5VJJ1T36JV","atts_01GW2HTKSWWJCA32ZP8K31SVDY","atts_01GW2HTBA1WJ0HQ7A3R52VMC3D","atts_01GW2HTBA3JSDE5Q005J063VXE","atts_01GW2HTKSSB6MY7C2EMY2EAZNY","atts_01GW2HTKSN4TZG0Q90S8SRAMFJ","atts_01GW2HTBA5PC3G8YBHE16PAZ77","atts_01GW2HTBAPYDEWFKQTTA5D3R3M","atts_01GW2HTKSCTAX77Z8RCF9P5897","atts_01GW2HTBBJ73QJ8CTM4FXCTFTN","atts_01GW2HTKRVDRCFVNYA2G5T7SC9","atts_01GW2HTKRSYA0VBX967FBDKK27","atts_01GW2HTKRQCMNQHY30A3TM72SM","atts_01GW2HTBBPKJSGTYM1V4C10JJ0","atts_01GW2HTKRF5S3PW091ZE4EDNBT","atts_01GW2HTBBRR7A174VMHJTABTWR","atts_01GW2HTKREVZGCFVCCFKM750N3","atts_01GW2HTKQD67N7K8RKFJQYBKHJ","atts_01GW2HTKM3P639N9S5TRKTGEWN","atts_01GW2HTKM2TVPBQAJ7DB9CQQKS","atts_01GW2HTBC0C5B3KV0X2NQ4DJKG","atts_01GW2HTKM1XQ4GFPEVMGHR5SR6","atts_01GW2HTKKZTZE5QBW4PJSZ2SNK","atts_01GW2HTKKGD7STBRFPWHZCDEKK","atts_01GW2HTKJPVGQXQ3QZVSHZTGJ9","atts_01GW2HTBC31K4PD817WCFJEK4W","atts_01GW2HTKHVHE5RCMB20VA4ME4S","atts_01GW2HTBC578VRRQNGM6Q67YYA","atts_01GW2HTKHSR4DX8VHFNA6ZSFV3","atts_01GW2HTBDFSEWF3H8RXKJMBHCD","atts_01GW2HTKHFWN7ZP8M6N2YNJWY6","atts_01GW2HTKG4YFHDAAKS9F9QPB03","atts_01GW2HTKF3GA2S1XEHF2JCQ2W0","atts_01GW2HTKF2E9ZF5BJDQYZQFJDF","atts_01GW2HTKF1BS9FHK7CJV50MBG8","atts_01GW2HTKF0J8645DH10WRT70NK","atts_01GW2HTKDT5H3RWG7DPCR8NG47","atts_01GW2HTKDS759FNM904Z8GSC70","atts_01GW2HTKDRZZAD26VBW08PF1SV","atts_01GW2HTKDQJXW6EFWCNT67STHX","atts_01GW2HTKDP7BT4Q5PBCCW9EK4Z","atts_01GW2HTBDJMP02P20J34FCWDMR","atts_01GW2HTBEXH9BWWQZG75KSJDZR","atts_01GW2HTBEZ2V3JSR5DRR2YKKJ8","atts_01GW2HTBF3THNVCAH63KNH79QT","atts_01GW2HTBF41YTDTSVSXN5Y8C88","atts_01GW2HTKDKEWS7PPB3TTPH8967","atts_01GW2HTKCT63GE8QJAQM4WFKQ6","atts_01GW2HTBFKQ5F8CJWQ199KBWCB","atts_01GW2HTBFQDK8RBV4M0G8BPEEA","atts_01GW2HTBFVSG5VB4WFG11QCK60","atts_01GW2HTBJPZBDTG8V58AZHAW6F","atts_01GW2HTBKMD743W3EPZN8R39AH","atts_01GW2HTKCFPGV97Z349RW3VY2G","atts_01GW2HTKCCYAGK1G34HTMVS5QM","atts_01GW2HTKCAWY5R3BX1D8ZCTFTP","atts_01GW2HTKC8DMPCRXACMCV8P0QM","atts_01GW2HTBMEF9AMFE4S9PB0WR98","atts_01GW2HTBMHRJ1WEYPM5GMSAB1M","atts_01GW2HTBMKWZ2SSWHF7B0DSFPV","atts_01GW2HTKBJ82SHBAAHZWVGCKTF","atts_01GW2HTKBHTRG7Z4FA1ECPNN52","atts_01GW2HTBMSWR63Y8D380B83EA8","atts_01GW2HTKBE3XX3BJKEKA14CMYH","atts_01GW2HTBN1S7YSNKA1HY7CV8MH","atts_01GW2HTBN4TDEKEHGAGZ776W10","atts_01GW2HTBN614BWBM08RNCN0W8C","atts_01GW2HTBNXYDJ48WD3YTEQQ489","atts_01GW2HTBP3R7HHJNWX4MMCHCM1","atts_01GW2HTK9X2PJPQRV50DGK4YZ6","atts_01GW2HTK9W4MRKNHCBG2EC2EAP","atts_01GW2HTK9V7CKN7X37RMDZ62TY","atts_01GW2HTBP7PKWK573GDA7HTSF0","atts_01GW2HTBPB0PD166R3BRQ084K2","atts_01GW2HTK8QZQHYPXKGX111ZMA0","atts_01GW2HTK8HER531KQJ3WR92P3Z","atts_01GW2HTBPFJXSF24376MVCQV1H","atts_01GW2HTK8F0GM8FT98NZD7MAQT","atts_01GW2HTK8AD7C844QBC0Y3VAYT","atts_01GW2HTBPQQFGJ1QC1B28B0HNF","atts_01GW2HTBR4Z4H82S8Z4AYVF62H","atts_01GW2HTBR7JKSJR8Q7MTZ7R7Y8","atts_01GW2HTK82D7K05VY8Z7C1GGP6","atts_01GW2HTBRGB8Y8P0VACWM8EAHT","atts_01GW2HTBRN8VGVMC78YPBVGN6J","atts_01GW2HTBT7AECWJFAR2F7W47SV","atts_01GW2HTBTA1V92ZFA06EVMS8QB","atts_01GW2HTBTFKQQSG77HZQC2KJ0K","atts_01GW2HTK80YBEXHWNGYR1AQ73K","atts_01GW2HTK7ZX0RBFP6NSTJR1RPY","atts_01GW2HTK7YSXZFJ70FZVW4XS4T","atts_01GW2HTK7XKFCZ1JBPTBWWK6RG","atts_01GW2HTBTHRJE6ZR29CBV2ZVCK","atts_01GW2HTBTKN2CADYS1NE9CEQ6V","atts_01GW2HTK7WSS1A5TVZGHX1VF19","atts_01GW2HTK7TF91PAPXHT7VH0BKA","atts_01GW2HTK7GBR394ARYAQ72E5P8","atts_01GW2HTK7F0KFG5FD0Q4XN0553","atts_01GW2HTK79VRQP836TM8P57CV8","atts_01GW2HTK77D2RR383AQH910DD2","atts_01GW2HTBTM2H3D2GJSR1931X4K","atts_01GW2HTBVMZVQAKYVSHW85ME9N","atts_01GW2HTK73MF7249JMB9DWNH4A","atts_01GW2HTK723VYFDGCW0F0BCGTY","atts_01GW2HTK6YZNQCC984BY01VZN6","atts_01GW2HTK4D0K2CJZ8PDJNRA0RE","atts_01GW2HTK4BVA0VCJBENWM8EJGA","atts_01GW2HTBW4V6ESZ6YJGQQZ5SXW","atts_01GW2HTBWSFXQF031AG677P0VY","atts_01GW2HTK4901XFSPGQK1JB35F2","atts_01GW2HTBWWBWEXH0V8MTNF5JCP","atts_01GW2HTBX0PCSD1FAR06N6MJVV","atts_01GW2HTK489BAHKK04YRC6F1AW","atts_01GW2HTBXMF702FC3F08T9GAJW","atts_01GW2HTK46HADA4NZF0TPQH2GG","atts_01GW2HTK2SXK0QQ8Y1H8SECZQ4","atts_01GW2HTK2RB4W6MGG9S6ZTT9A8","atts_01GW2HTK2J59TC17ADK0DVFGE6","atts_01GW2HTK2HHG0WFN8RMHQQPR2N","atts_01GW2HTK2GTFS4TNF8B7J0C3PH","atts_01GW2HTK2CNWZYC70EJF99QEAY","atts_01GW2HTK1FM3J6BKX4NBX8PEH6","atts_01GW2HTK1E5WX18DF3A12BK8GE","atts_01GW2HTK0DEYY7PC3K94D32Y2X","atts_01GW2HTK0C87DY6E6AKKQ3S4BE","atts_01GW2HTK01P9EB5M8TMFE6HB68","atts_01GW2HTJZVJS074DFR3ND6V1RC","atts_01GW2HTJZMNQFMXXK1KB2T9XNV","atts_01GW2HTJZES4AEFSTE915B39NE","atts_01GW2HTJZ84P49JBDJ2VRGXZKY","atts_01GW2HTJZ6G35HXHR29G7TBH22","atts_01GW2HTJYS4H6P4FBKX6GWKG8Z","atts_01GW2HTJYRAC7H52QT0MNGK7RB","atts_01GW2HTJXWZHDCBNZS0GWV9S32","atts_01GW2HTJXPGX96MQ0RY00VZ30N","atts_01GW2HTJXJE2PW2717H1YACK35","atts_01GW2HTBXP74FB5N8NRKN1JT7T","atts_01GW2HTJXFCR7NPJQNSJD3B9BK","atts_01GW2HTJXDPSA63AZDZ928AAJH","atts_01GW2HTJXA9GJB77MSENFW593B","atts_01GW2HTBY18TWD7BH5PA0X0QB0","atts_01GW2HTBY3QXRX731SJED4C25M","atts_01GW2HTJW1DG4CNSV9V1G42W62","atts_01GW2HTJVZ5V9P8QV6TG8SDW35","atts_01GW2HTJVVYD55M1J1MPFD0DT6","atts_01GW2HTJV3F950Y12F6K7ETJZB","atts_01GW2HTJTSDFKJBKCKGVSGGNE0","atts_01GW2HTJTRPFGT7FZ2XREK4JBF","atts_01GW2HTJTPNAQGG1JDQDXGCE8F","atts_01GW2HTJTNP6MX9DBAVB3B9BWE","atts_01GW2HTJTKDBG7ZWT9KNKFHCPV","atts_01GW2HTJTJMMRMB2YXH0WWC9N2","atts_01GW2HTJTHQVW1F2Q379VQTKCH","atts_01GW2HTBYBYEG36Z686PNJF6HV","atts_01GW2HTJTGFYTEA5QX9FPBHA0S","atts_01GW2HTJSH9SHHRGR9MT072KJY","atts_01GW2HTJSE9M36N0WCMPCBQP7Y","atts_01GW2HTJSD4VCB995ZHDEN6W11","atts_01GW2HTJSBHAH138H2BP6E74K4","atts_01GW2HTJS9ZZ2K6HV39MMBJQH4","atts_01GW2HTJS5WDMQVMKBK5QZAVK6","atts_01GW2HTJS3MQP6KQB6E9MADG6R","atts_01GW2HTJS1MZJXGXRN0YAWQYJ0","atts_01GW2HTJRND0AEAA8NH55HV5PX","atts_01GW2HTJRKQCDG8YF0E987YCQE","atts_01GW2HTBYEM7EV5R3S07A48JMG","atts_01GW2HTJRF3W99FJ6YZCYZ105X","atts_01GW2HTJRDJ7XMJ5NC2HQ31K2N","atts_01GW2HTBYF12JNTMAV05TZSPY4","atts_01GW2HTJRC9FBNV7MVMCTSGR8M","atts_01GW2HTJR4ZJPMW3RXE1091D7V","atts_01GW2HTBZG5GX7S5XE37X1YQ7J","atts_01GW2HTJR3EJAXB3ZP237CHHAT","atts_01GW2HTBZKTXKWK60BKFR0R1G0","atts_01GW2HTJR2WVN30872CQXT0X39","atts_01GW2HTJR0YF93YZ34YTCD9BJM","atts_01GW2HTBZNCD51QJJGD4S15VE3","atts_01GW2HTJQPYTGYB8EY6NR3D2TG","atts_01GW2HTJP90ERCXAZJKV6PMT78","atts_01GW2HTJP7XK6RPRPZJT2SS7BJ","atts_01GW2HTJNPH4KAN7XM74J69J7R","atts_01GW2HTBZTRB61G2RJ2YFTRJ8Q","atts_01GW2HTJNNE2ED7WXQCA83VWS4","atts_01GW2HTJNKGSQD2Z5QW3053BM2","atts_01GW2HTJNHRGCVDVPVTCF1NX0X","atts_01GW2HTJN994DCCKMXGP7DKHHX","atts_01GW2HTC2EF68D96SA0NDTKJCX","atts_01GW2HTJN6P1HT1JEX3JYFRZ5R","atts_01GW2HTJN41T7VEYMQ8BH8VQVK","atts_01GW2HTJMPXV7HXM76EYVD40XW","atts_01GW2HTJMMCAPY0B59ZFX5S25C","atts_01GW2HTJMH3VTMF46XCERYB862","atts_01GW2HTJMBNT71WRX3VQBVX9T4","atts_01GW2HTJM5KJ050ZCG2JBH0JM7","atts_01GW2HTC2K34330W9WHRNCKCJE","atts_01GW2HTC2QFTT9MNW87GNT0QK6","atts_01GW2HTJJMECFZT9A52GEDG219","atts_01GW2HTJJA8SJ72VQR87Y820X7","atts_01GW2HTJGRASSQ46339K52Q870","atts_01GW2HTJGNZR4SDCM3KNJ7V3B0","atts_01GW2HTJGKNXG2H6TQ3XXDP097","atts_01GW2HTC2Y8751EZJEB3X133H5","atts_01GW2HTJFZT2GTG0BM6V1Y20WG","atts_01GW2HTJFDHB3Z80MT0V6YA5VE","atts_01GW2HTJF7S0D00VBMT4SYQ0BH","atts_01GW2HTJF6RG87A033DR3DX6D9","atts_01GW2HTC32G96P7627MWDBHRWK","atts_01GW2HTJF5MSC1FNN3YDJCZ4AJ","atts_01GW2HTJF46ZSGZB9BS786VY0G","atts_01GW2HTJEEAYK0XQ673GST2FKP","atts_01GW2HTJDSHWVB417P18NET22F","atts_01GW2HTJCJ9STJXHXVZ1KKNPGT","atts_01GW2HTJCHR8CZD5F86AFQ9N1R","atts_01GW2HTJCFFRE6QNMW46V2B9MN","atts_01GW2HTC36JYZ2C0JA4DT7Q5G8","atts_01GW2HTJCEHW9NWV6JS78NBQJ8","atts_01GW2HTC3ASAEC19HDXEW161PP","atts_01GW2HTC3DXSCM9PFAY04R6FR1","atts_01GW2HTJCCBK1ZZRZ1PQ4CYEZQ","atts_01GW2HTJCAGTSDG4F8Q3A6SK46","atts_01GW2HTJBWWP5JT9FWY9E8M1T6","atts_01GW2HTC3J6MDQMCWVTKGWRDNQ","atts_01GW2HTJBM5VCFZ50RVHY6C6PJ","atts_01GW2HTJB7Q78PRECXV90GSMFV","atts_01GW2HTJB629WFCYFWT2WEP2M0","atts_01GW2HTJB5M2MHFFNZ35ZBE5MK","atts_01GW2HTJB40WDRBYCEQBGVA3GY","atts_01GW2HTC6M51MQ2SGTH16K0Q9D","atts_01GW2HTJB2WZ2RNSMRTPG2W6M1","atts_01GW2HTJAWVX3Z2R1226PKXTGX","atts_01GW2HTJASP2VRQ44S3NAEYFKZ","atts_01GW2HTJAQV98019MA692KK5GJ","atts_01GW2HTJAFZV2WP1FS47SGEDEJ","atts_01GW2HTJAEG4V6ADQQF72N22EF","atts_01GW2HTJAAQJ8HT7EZ81JP0KGY","atts_01GW2HTJA99MQY3G2M7NPN8AQQ","atts_01GW2HTJA3P625AF0QNV2V1V8X","atts_01GW2HTJ9X2Q65NEWFCNWSCPJT","atts_01GW2HTJ9NWZNQW50505PGBXCB","atts_01GW2HTJ8R58Y1AQJXMFFQMJ5S","atts_01GW2HTJ8MJWTWT3WQXFBTF7A9","atts_01GW2HTJ8FGBQ2FSTVND0SM41G","atts_01GW2HTC6SA3NBZK1D3Q22D479","atts_01GW2HTJ8BK8738KG4A22NYX2S","atts_01GW2HTJ78C6NS89NY5DFWN0EV","atts_01GW2HTJ74HFZ4AWGGTF1K8TCK","atts_01GW2HTC6Y1Q5TNSFRVQHM5M5X","atts_01GW2HTJ6VYGHWV9C3MRSBX5RX","atts_01GW2HTC7DA882RREYM2J6R16V","atts_01GW2HTJ6S5RDQ9CVW4WYQ36TJ","atts_01GW2HTJ6K4HQJZZBBKZ0102VZ","atts_01GW2HTJ4PDPZXGWX3A19H9ZAF","atts_01GW2HTJ4KEMVD27PZ7YNYKR0Z","atts_01GW2HTJ4JWJYN42CW25FRHBVR","atts_01GW2HTJ4EF8450GZV7P4MVQK7","atts_01GW2HTJ4DR3VY994NYBVXNZ09","atts_01GW2HTJ4CFCBNRNHNDD4PADZY","atts_01GW2HTJ4ANR9V6JV4C9RE70FV","atts_01GW2HTJ44S3HPNC3TP1WRPKR4","atts_01GW2HTJ3AB2WA2PSD0D6S124V","atts_01GW2HTJ38B5F6K9M6B94S563A","atts_01GW2HTJ35XA56GGSBAK58FFCG","atts_01GW2HTJ32D9Y4DMKAW7GZHRQG","atts_01GW2HTJ2T0R54KJYNVVGK3ZHF","atts_01GW2HTCAKT6ZBA1MA6VX3T2P9","atts_01GW2HTJ2Q7DPMVAPYFWSWMRJ4","atts_01GW2HTJ2NNMBNA7RXZMRB6DVH","atts_01GW2HTJ1H3ZCJ74RMN5T5D21E","atts_01GW2HTJ0T8QEBGHQNN3YPJWTE","atts_01GW2HTJ0S6BBW4H4E94V6BZ8T","atts_01GW2HTJ0P6GQ57FRPJAP6R8A9","atts_01GW2HTJ0FZMM4AVGE5KAQCF4Y","atts_01GW2HTCAP6918JS3SMHDG1PVM","atts_01GW2HTJ0DSJEX41KPG8CEA922","atts_01GW2HTJ0B1HB497ZHARDT9F10","atts_01GW2HTHYVRQCA99JNTCNT2R7A","atts_01GW2HTHYSTDGST623FBTTGN18","atts_01GW2HTHYKBB3SAT842HAFWZ85","atts_01GW2HTHYJPCQR15KJ9ZAHXMPN","atts_01GW2HTHYGCZ9KGA8V22K2SY22","atts_01GW2HTHTH4ADYKGY1F0GSZ6PK","atts_01GW2HTCB17X16KFDZ3291K1AE","atts_01GW2HTHT5YJXZS7XG1R8HTY7C","atts_01GW2HTHSR29S2GZ05DR8Z87CD","atts_01GW2HTHSQAFC9B9CQBJ8F99AG","atts_01GW2HTHSN3NCQ09NG4DQS61MP","atts_01GW2HTHRE8F68JGNCPT3FMYRK","atts_01GW2HTHR3G01414E3CVH67V5C","atts_01GW2HTHQX6CVP40VD6FSR4P5Y","atts_01GW2HTHQNPF35RJZD4XWBBPQH","atts_01GW2HTHQFXD9K21F1KBS9DJEP","atts_01GW2HTHQ7EZ9YHNZRC6T1Q813","atts_01GW2HTHPMXZ1BMXVC44D3C9XB","atts_01GW2HTHKW8TSYTBR36Q05DDEY","atts_01GW2HTHKA86GNDD9M4NFQ6R9S","atts_01GW2HTHK4CAA1BVNDQ8M28NZC","atts_01GW2HTCB5TSVK2DNA35SGA1A7","atts_01GW2HTHHQM1AB71Q7GYKFWDC7","atts_01GW2HTHHM2K0F0MQ0V7P5T2CD","atts_01GW2HTCBECQ1571ZQX6T9A3WV","atts_01GW2HTHHH03JW2WERSXDMZSCX","atts_01GW2HTCCFZR1080RJF96MPD18","atts_01GW2HTHH4T4C2QKGD3KXQR02S","atts_01GW2HTHGXQAXBR3E6M15465M1","atts_01GW2HTHGHN5PBG97V37XAG8T2","atts_01GW2HTCENNRCQR3W9F7A7SQEV","atts_01GW2HTHGEX5XDA0X0T5TFQKZB","atts_01GW2HTCFAD2EDZ7YZB75JYJXT","atts_01GW2HTHGAG7NT64J4DK1QF2QR","atts_01GW2HTHG6Y2MDBTHQ6PWN5CE3","atts_01GW2HTCG1ZKZ3NF9TXF089BBN","atts_01GW2HTHG5XB08GHS9YJ48W0A3","atts_01GW2HTHF9CR04QYK0NKA9JPG8","atts_01GW2HTHETGV8JKX85MX0GJ53Y","atts_01GW2HTCG3VRVT9F2B2HQP8H1X","atts_01GW2HTHEHJCSYH6DRADA1DR0W","atts_01GW2HTHEGAMB6X2E54ACHZ0TK","atts_01GW2HTHE8Q5CEYGQ18WZV18ZG","atts_01GW2HTHDTF8HGDDDVHX4QN6FV","atts_01GW2HTHDG0FMN7A6X2NXMRF9X","atts_01GW2HTHCH7FFT1AKZCA9D8TKC","atts_01GW2HTHCDG6NRA29FDRE2QV82","atts_01GW2HTCGMFAZWP15SX9MN8XMF","atts_01GW2HTCGP9W4NDT1SABJ2DR2B","atts_01GW2HTCGQKE4ZGKVYQCNHGW3S","atts_01GW2HTHC3190Z9M7188Y6Q3C9","atts_01GW2HTHA80P8W5A1FP6KX84ZS","atts_01GW2HTHA07NSMZPBSD83704CK","atts_01GW2HTH98S6GW49FMEAKV6JNW","atts_01GW2HTH8VF3DX8X83TT5XKKK7","atts_01GW2HTH63BYRV2C8MJ5W0F682","atts_01GW2HTCGXFSA375V4CY2RC1H8","atts_01GW2HTCGYZ9EFVMBJGJQM5Z6V","atts_01GW2HTH61T7TV3NCB4FAFCHF0","atts_01GW2HTCHWYCG0AW1HH86QPGE2","atts_01GW2HTH60ZPAHGS5XDR019SYC","atts_01GW2HTH5Y9H3PZN658ED66P53","atts_01GW2HTH5WC2HW90Y0H9J18K4V","atts_01GW2HTH5V5512SRDKJ6VZTWJH","atts_01GW2HTH5S8HH557P21R3VGZ9D","atts_01GW2HTH5RKE5BZGHBGMJYMSVV","atts_01GW2HTH59N53W6EDWH4W2T1ZW","atts_01GW2HTH57PHCJ3A4PPTNTZA9S","atts_01GW2HTCHZB3ETZGD9K21SACHP","atts_01GW2HTH55SRD465EGKXDNZ8Q3","atts_01GW2HTCJ3HSVDQHVX187E6F2K","atts_01GW2HTH51460R75M74SGKMT43","atts_01GW2HTH4YNFVR59YGAVM0TMW8","atts_01GW2HTH25AB2JD0N60FQW9BZ2","atts_01GW2HTH24JJ9EP30NFNYWCQW2","atts_01GW2HTCJ4PPKN5W2HCXJBQVXH","atts_01GW2HTH22VT8RGX4BKVXXHF5K","atts_01GW2HTH1F31A1JFJP8J9ESWMK","atts_01GW2HTH1658W62HS4G0FRH2F8","atts_01GW2HTH0V54FM98JGK5BE6XMV","atts_01GW2HTH0SH544A2KXDJ46FS2S","atts_01GW2HTH0Q7110TXWVPW7M5140","atts_01GW2HTH0PRKQ3KWATESCQ8F0X","atts_01GW2HTCJ5DCRW43CZ2NJX2M2N","atts_01GW2HTCJ6NWAPJJR2CJ2WNEYW","atts_01GW2HTH03VQ9YKQM4SADARWXB","atts_01GW2HTCK8DFFWNP7D6RMGKH8Z","atts_01GW2HTH02R0Z09FTAA4WMJSRC","atts_01GW2HTGZNBYH2121PFZZVKPPA","atts_01GW2HTGZK4VVSYQHWY3GP9DR2","atts_01GW2HTGZCQ854GB60BHMN693H","atts_01GW2HTCR29JYJYZ3QBX498H6A","atts_01GW2HTCR4ZTWWT587MAQR7NND","atts_01GW2HTGZB8GJ4MCFTYW8MJ69C","atts_01GW2HTGZ93TGH7V35DESHF4W1","atts_01GW2HTGZ76MYRKKH36XYCJFSY","atts_01GW2HTCRHFWDY12KSM2C3X0WC","atts_01GW2HTGZ274EW0HDE7WF91ZFT","atts_01GW2HTFQF90HQVVVA7CQYWMHF","atts_01GW2HTFQC4VNEPP8QSHFY66BQ","atts_01GW2HTFQ9TRT6Y22VDFYHGER5","atts_01GW2HTFQ6NEA1ZQ5F7EM78CCY","atts_01GW2HTCS05G3KZ46RPGSABHWP","atts_01GW2HTFQ4RHTJCXGYVHJM2JG2","atts_01GW2HTCTZK9VH5VCJ3ZENJ21A","atts_01GW2HTCVA0FHJCG3K0DSVRS2J","atts_01GW2HTFQ14FDTEF01VD0QD1EK","atts_01GW2HTFNP3ZYQR58FVYDNZENW","atts_01GW2HTFMZKWR3PCNMZF35PGKV","atts_01GW2HTFMTVS4W19T3GP5MNC4X","atts_01GW2HTFMRX1EKMK74KA29MP5A","atts_01GW2HTFMPQ9HVY0F27QCKE6D8","atts_01GW2HTCVVVGAW1HMCBKP84969","atts_01GW2HTFMMB00T5214RQA19VC8","atts_01GW2HTFMFKEKP0M3FX528PK6A","atts_01GW2HTFM6DKNXJM1T9KMTH21N","atts_01GW2HTFKYQ290D13P9WQ9P4SM","atts_01GW2HTCW12D3Z8DG92P8Y60FQ","atts_01GW2HTFKQ47T2HTN4MEJMJ727","atts_01GW2HTFJWNJ64GT0JGH9YQ6PJ","atts_01GW2HTCW4WJ7PGFBGVHW4KF37","atts_01GW2HTFJB4QQRVK549KA0N8H8","atts_01GW2HTFJAD566WTHZ2WJECBHY","atts_01GW2HTFJ9FBBY0DBEBZJH0DZD","atts_01GW2HTFJ8S512620H8DDVDQ35","atts_01GW2HTFHW4NXVNKG6ZRC8K2ZQ","atts_01GW2HTFHTHMAJ6RXZCEY9A9A8","atts_01GW2HTFHS83GC085RP6VNVME2","atts_01GW2HTCW7N3N5533VNWEKTT4G","atts_01GW2HTCWA16QYQDN39TMJ3Q4C","atts_01GW2HTFH7QV205G7HNRVHHFJH","atts_01GW2HTFGA7Q7Q87MM8XHSFSYD","atts_01GW2HTFFBKDHKK2F4P5R84W93","atts_01GW2HTFE3XXKCPGPE9AXPT5EW","atts_01GW2HTCWB7N5FD1MSMC62SYFE","atts_01GW2HTFDS3P85ZHS8A1R2HPMS","atts_01GW2HTFDGCGB6XW8KTAR9QZP7","atts_01GW2HTFDD37WVW4E96ATRRFFF","atts_01GW2HTCWC5DC1K76A1SZFBE95","atts_01GW2HTFDBRG8HRDMR4298F6FN","atts_01GW2HTFD5EFD7324C3BHNFM3D","atts_01GW2HTFC1PHE1EM6M42KP3Q73","atts_01GW2HTFBZ69V7JSQZ5HJ25SHK","atts_01GW2HTFBTXVT0X3G97J51KCNQ","atts_01GW2HTFBPEMD5Q94J9YZ5MD3Y","atts_01GW2HTFBEEMBFM0CBVG6K5VNH","atts_01GW2HTFBB2Y4GH4SYCV0C3MPX","atts_01GW2HTFAAZKN7J8QMPC5R4H5G","atts_01GW2HTF9ZSNY4XXP9N5ZM5K9P","atts_01GW2HTF9WM49G9D3PPE9Y6EJW","atts_01GW2HTF9FQV0SK5F7KPSPBBDQ","atts_01GW2HTF99CSYTVWBE6F179GMF","atts_01GW2HTCY5R9MG784XV4DVSKYY","atts_01GW2HTF964SBXT7SBAKQN7MEV","atts_01GW2HTF8TDMKRJDG929CW7KA3","atts_01GW2HTF7F25F2XKGMWZ0B8N1K","atts_01GW2HTF71JZBHD3VZ3ZMXBHZQ","atts_01GW2HTF5SRVCVF1THJRPK2WK3","atts_01GW2HTF5P3YWR6MS4S30CR4SH","atts_01GW2HTF5MKYVWYVMEMYVH4TZ7","atts_01GW2HTF5HD2TP815NNNR66TZ2","atts_01GW2HTD4JGCC0PQZPETNBHJGA","atts_01GW2HTF5FX0HDEMYZPB29TNXD","atts_01GW2HTF5CSN09B3EGCAEM7B4Q","atts_01GW2HTXZV66VZ8HQSMJWHJD97","atts_01GW2HTD4PYAN5K3ZW4K2B5F33","atts_01GW2HTD4RK33JTHZNJJACX0FB","atts_01GW2HTD4SJ7F30D3CYT9BKYXN","atts_01GW2HTXZRZS6K7J0ED1VPP8F7","atts_01GW2HTXYQJD3ZYYQS7K308PXG","atts_01GW2HTXYM3QHM7C1TBBR6Y74C","atts_01GW2HTXYKZJZRYMN4XZ6BB0XS","atts_01GW2HTXYHD15YRNN4Q801KE86","atts_01GW2HTXYADDW933KJ8SW5GC6P","atts_01GW2HTXY95QD44VV8A1R9JAXA","atts_01GW2HTXY5E3NFGV4V34VJ3H76","atts_01GW2HTD5J5F8W7EMM9S9PBSTZ","atts_01GW2HTD5YVX3Y7YZYFHJXFEBE","atts_01GW2HTXY4ESTCJZHF2PSVGAPV","atts_01GW2HTXXV2HH126FE76ZSPVFK","atts_01GW2HTXWMG535336HJW4EF3DD","atts_01GW2HTD65G8CHQV5RZRT6KS4E","atts_01GW2HTXWJF3WPX3RZCA7ZP032","atts_01GW2HTXWHZGDPYDR87KN2TGY8","atts_01GW2HTXWGMN6GR9KMS54EGMEF","atts_01GW2HTXW6KP06P9ZX69YBJ11Z","atts_01GW2HTXW4ZBJS24BGMCRBWDRN","atts_01GW2HTD7WBK94B84TEDAV38H6","atts_01GW2HTXW1WWWEGNEHMQ7EYYKK","atts_01GW2HTXVJ16AXYKSBW3AGQP1A","atts_01GW2HTXRTM18X0Y47NWYRH4EF","atts_01GW2HTD874Q1Y13DEVJYZT43W","atts_01GW2HTXRBS578B4GB789CT3AB","atts_01GW2HTXP3FGVJ48E3ZMCY3ABS","atts_01GW2HTXP1E9PV10ZE26R4PXKK","atts_01GW2HTD888YAA7P1A2E5CTMFY","atts_01GW2HTD8BP388PG11Z3BSZ32Z","atts_01GW2HTF58KGDZW702K9X07X2B","atts_01GW2HTF4YDB0QFHKHBGH6BGP5","atts_01GW2HTF3ZAP4RWZG8CTDW97G0","atts_01GW2HTF3XE8HRZ9Z1MNE9XN6X","atts_01GW2HTF3WX34Y8JKTQZWFRSAS","atts_01GW2HTF3JD3BFV12WEMJVVDHQ","atts_01GW2HTF3EC4VBQGZRWB3X9YBX","atts_01GW2HTF1NBAB0B7SAE1ZCJX81","atts_01GW2HTF0Q9KHXE5CVVWYZWTG7","atts_01GW2HTD8DNVE2MA1BDBF58JS4","atts_01GW2HTD8FDHN4R9EN8MM3BX6W","atts_01GW2HTD8GJH0VBHYZSQ86SFV7","atts_01GW2HTEZ833543KQA9AHV4KZY","atts_01GW2HTD8J7KDT26GDGPTWW6HX","atts_01GW2HTEY62HH0F7A24C7WMP7Q","atts_01GW2HTDB008MWRA1GX0RKG0ZH","atts_01GW2HTDB5WM66Z9FT9SCWAFD3","atts_01GW2HTEXC6CEGQKHWN2A3K5X6","atts_01GW2HTEWXM3NQRBTMXX6JH08M","atts_01GW2HTDB82EXR218NN6CQB6PM","atts_01GW2HTDBBTWQAD46FGNGVYDJJ","atts_01GW2HTEWT0AGSNX37KBV4ZRZH","atts_01GW2HTEWPZ8MG8WKY0KZ7FCBR","atts_01GW2HTEWKPZ287RWEJ6D0HAP5","atts_01GW2HTEVXK0M4CEM26SJ8CYPB","atts_01GW2HTDBR8CEEAQ8RB59WS7PE","atts_01GW2HTDBXZJXNXHA5GW8F6YHE","atts_01GW2HTEVV7JZFBX6G36VGTHR2","atts_01GW2HTDC2BJ601YSPEGTY83G6","atts_01GW2HTEVHXD4MVH0D8PDKM465","atts_01GW2HTEVF78QJ6KQWYRW48ZBH","atts_01GW2HTEVE1KBF7VT44EYKQARN","atts_01GW2HTEVD00DMASZEVJ00020T","atts_01GW2HTDC8ZQ6XKCCKY25J1WZD","atts_01GW2HTEV89EETN7HXEMKCCTKJ","atts_01GW2HTDDCJN7YPDFS6X7NFMAZ","atts_01GW2HTEV7DK0KARY8KHKGCTNM","atts_01GW2HTESR1DM8MKDBY22YZ09Y","atts_01GW2HTESPE2DF6YDPVJ67TXBT","atts_01GW2HTESKFYBAHK0BJCSS3NHJ","atts_01GW2HTESG9BETA2RC82BZS1NG","atts_01GW2HTESDJNKCFRBNQC01BK8H","atts_01GW2HTES5SWM3TT6E20Y71BWH","atts_01GW2HTEQJHXZHT421DFSSXX6P","atts_01GW2HTDDEMR6SN8D2HWTS7D14","atts_01GW2HTEQG7Y48151E299ENK5S","atts_01GW2HTEPHGZ96MQJKA8NFMMWY","atts_01GW2HTEMCA9F2Q0CKMYBFY5ZR","atts_01GW2HTED9G3NF75R4AQAX86H9","atts_01GW2HTEBMRXG7VSB313278BQ3","atts_01GW2HTEBJWC5CHPJJBCSWJZCB","atts_01GW2HTEBFSHN4B1M6JDXEE1P3","atts_01GW2HTEBDAP4JW279JBTZ0B44","atts_01GW2HTEANYT597WNNPP79VMT9","atts_01GW2HTE9WDZH8MTG6MDDFCQTJ","atts_01GW2HTE9G688PZQJDJADZZYSR","atts_01GW2HTDDFVF7HZA5RRQ0EJF0J","atts_01GW2HTDDH97FZWXDY4DXY26AX","atts_01GW2HTDDSRNEJ9R9EXX9AEB9M","atts_01GW2HTE9ADCZ8KJM15B19D5J9","atts_01GW2HTDE6MGT1BBZWQFV5TQ6C","atts_01GW2HTDED44A8GF0XJREKH94K","atts_01GW2HTE92GM4GAJ6282WYE872","atts_01GW2HTE8TSRDAMGHT4WSXGJS4","atts_01GW2HTE77M3N4QSH1R0MMVDN7","atts_01GW2HTDFCE5C3N0ZW7WJR5M2X","atts_01GW2HTE74YWDV7EDQY0RSYB0G","atts_01GW2HTDFDGJZ29H6BQHMBK7VT","atts_01GW2HTDFFTK3JY99W2VXJSQXJ","atts_01GW2HTDGA5WD8J9ZDBJP291HW","atts_01GW2HTDGGR8RKGPCEBDDCJB1Q","atts_01GW2HTDGKWQSQGAEESPAV5R63","atts_01GW2HTE70K6QXR18NRM9ENAWY","atts_01GW2HTE6YEP9FQMBKSTF9774P","atts_01GW2HTE58HZ7306TEMD99N08M","atts_01GW2HTE4WV27Z4J07VN9KP70M","atts_01GW2HTDGN2KX0EXTR9D1MXMJ6","atts_01GW2HTDGRQPWH8DANRCS2ARK5","atts_01GW2HTE4V3PY26J935JFP4VAN","atts_01GW2HTE4SKCQ4YSHWSGA2J8RT","atts_01GW2HTE399Z9BTA3SJKJGC2N7","atts_01GW2HTE0E75J82Y3VHEHN0MW9","atts_01GW2HTE0C9HEQADASYKXMZ4AA","atts_01GW2HTDK9CF0EWVJ9FBNPZFX5","atts_01GW2HTE0A54XQH9YGHDYEQTYZ","atts_01GW2HTE08XEAQ6ZTQMMBDF4E2","atts_01GW2HTE06BX8BNAE83B53198Q","atts_01GW2HTE01RRVPRWZ725VKKV6N","atts_01GW2HTDZHVCT4GKCQ75YGS7VC","atts_01GW2HTDZFFPBK5303VM7ZQPXQ","atts_01GW2HTDZD51100B5CZZS2TDPM","atts_01GW2HTDMNQMGCW8NHFJ3Y5NAV","atts_01GW2HTDMRB9TKR5Y1Y90S6DHY","atts_01GW2HTDZBTDQBG7Q13FG96S86","atts_01GW2HTDMVS8QB0QDR9EYAEN19","atts_01GW2HTDMY0A40XV5793GTZ53K","atts_01GW2HTDN04X5DFMP854D5BPAE","atts_01GW2HTDN4ECY731SS6B94XZBH","atts_01GW2HTDZ8MW5W9FZH5ZRFZPSW","atts_01GW2HTDN6MX6JFQXGJYE0BJDE","atts_01GW2HTDN8VR9BA3A9JMM707N4","atts_01GW2HTDP407Z65AAHA7597ZYS","atts_01GW2HTDPAYTMCV90KXX9CYPYQ","atts_01GW2HTDPCR0KQP4WVWHE3BRHS","atts_01GW2HTDXPEFKQNMZRATT8NSB6","atts_01GW2HTDPGZK4PX6RQWE0AE5H8","atts_01GW2HTDXGJN1HM7470RG3C0F1","atts_01GW2HTDPHTM3Y25HT0HP8W0CR","atts_01GW2HTDPKAZCG0RVDJ1BCXQDV","atts_01GW2HTDQTE9KKC1J8ZM53QHWA","atts_01GW2HTDXDSXJ1AZK5QMV485KS","atts_01GW2HTDR0J3YX2CF8GZQ4YTNV","atts_01GW2HTDX75HSWAC8BD3ZXF339","atts_01GW2HTDWVW5A0YMTHVN4JNWXH","atts_01GW2HTDWSEYM6C6AT2X66CNND","atts_01GW2HTDWPYZC9TAC6TJ75NTYB","atts_01GW2HTDR1NVE0EAB543P9HKVN","atts_01GW2HTDWMPVZHN2PKR3TWMR3K","atts_01GW2HTDR6NMYHRT7E5NB5JTRW","atts_01GW2HTDVE94W4XG6MH903EBK0","atts_01GW2HTDRFJEPMY73E769F2YYC","atts_01GW2HTDRQAP07DHAZ7DFKS786","atts_01GW2HTDV4DQCPFDG4NWQGX12S","atts_01GW2HTDSDV1A6JKAPFV4SW9YR","atts_01GW2HTDS9WE4B1RHCN22JQJSV","atts_01GW2HTDS6W0ADFMPAD6EFSD9Y","atts_01GW2HTDS27TAJY0WA3W08KNRP","atts_01GW2HTDRTH7R0BNA7395AS1B3","atts_01GW2HVEEZDR9W43NXGVCPBKRN","atts_01GW2HVEE7VDAXTJY6MF70XZWR","atts_01GW2HVEB26PFBTXNHB5VYKT5N","atts_01GW2HVEB0V42Q009JFGE3QZDE","atts_01GW2HVEAYRM28SW7Z2YKH7H5C","atts_01GW2HVEAW1CS033A6P8H8F8AM","atts_01GW2HVEAC1ZYNHQ7G69S3860Q","atts_01GW2HVE88SGA75DCKZPMRTYAK","atts_01GW2HVE86WWR0QBPSN4R0EP41","atts_01GW2HVE859F7BX12HTKT0YP9Z","atts_01GW2HVE3YVPNJ25R0147N4H0T","atts_01GW2HVE3XWB54RBC32PJASYBE","atts_01GW2HVE3VFNTBTMQRW5W35C4V","atts_01GW2HVE3TPMG3BY3WJZWQV3N8","atts_01GW2HVE3R400WRND452P4MG90","atts_01GW2HVE2C6RAXSW3ESWYBVJM6","atts_01GW2HVE2A5YQ3SJ4SETXYEK9X","atts_01GW2HVE29YNK05GRZYFGW82MM","atts_01GW2HVE1FW4P447HER9KZ48WX","atts_01GW2HVE1E3YE5YYBDZ3X58MPE","atts_01GW2HVDZPYYG174V319VK033D","atts_01GW2HVDZ2YVZMG95JDQFT9R3X","atts_01GW2HVE831DYM4Z7QMSKZEJE9","atts_01GW2HVDZ0NQ3T43WQE6DFM9ZN","atts_01GW2HVDYZK7SQJ5JCW30NKMDR","atts_01GW2HVDYXV53399VNJ5TCYBHK","atts_01GW2HVDYT79B1MW96WXA82FXR","atts_01GW2HVDYS8P3TN00VMXK7BD8F","atts_01GW2HVDYR4JRKB89BTKB1ZYRD","atts_01GW2HVDYP6NTRY1M7PFH7GDCH","atts_01GW2HVDYNNHEPP4HNWY7N3XKF","atts_01GW2HVDY560DJA7ZJEWDH5XSK","atts_01GW2HVDXZDJQ4WTA1HKBHT1YQ","atts_01GW2HVDX54MZ2NXA2FE8GJJCM","atts_01GW2HVDWYMSQZXBBDS4F8WXYJ","atts_01GW2HVDWXEPHEMATX3PRHA0RS","atts_01GW2HVDWVE4PH91ZYJJD566T5","atts_01GW2HVDWSCMN51204YJ16F7R5","atts_01GW2HVDVZWPFD0AR70M6BZ5Y5","atts_01GW2HVE6E2XGE0BFXCHFAPP42","atts_01GW2HVE4JD6G8WEEHN8616BFD","atts_01GW2HVDTZ2DQ2D3TGXWJ8ZFP9","atts_01GW2HVDSFQ7DXP6TDPVTF73WE","atts_01GW2HVDQYZQAJ8RYRB1V48XFY","atts_01GW2HVDQXYTMXJWV57G3GZCSG","atts_01GW2HVDQWCNFKW8RE4JYPVWK5","atts_01GW2HVDQTCCQ9AVKM8P42BBR8","atts_01GW2HVDQMY6FJG4SQKDBXCPRT","atts_01GW2HVDQJ55NA2WD77Y8BFYZM","atts_01GW2HVDQGXXV9SWJPNZD11MM1","atts_01GW2HVDQEA4EFFKP9RQWWY3T8","atts_01GW2HVDQ99AY9CSKNF7Q5HZFQ","atts_01GW2HVDQ7E21JFY8Q2YTX6N9E","atts_01GW2HVDQ54X2RM21YNMTQM5W3","atts_01GW2HVDQ3PJMCGNHYTV8DB3CT","atts_01GW2HVDPK0RC3XBGSS0730QGX","atts_01GW2HVDP98XD0SMX4VCAFC4K6","atts_01GW2HVDP5JSRZB7607YVPCT0B","atts_01GW2HVDNG8ST2NSG7W3S03DVK","atts_01GW2HVDNEN83D9XY1R1K11X7G","atts_01GW2HVDMRN51A1RE2AVMH55Z4","atts_01GW2HVDMP0D1H3J9KDYSN5PWP","atts_01GW2HVDMM5Y3REG2YRAW5CH00","atts_01GW2HVDMJQ2B2E6ZYNZ3YDYPN","atts_01GW2HVDMGAP1YAVRPZZHVMVA0","atts_01GW2HVDMEHBJK9QKS6XD8FWX9","atts_01GW2HVDM5KWC9KBYHZX3V0KR6","atts_01GW2HVDM4TEAK1C5NJPYMY9RM","atts_01GW2HVDM2KXMGC1T464MF2MSY","atts_01GW2HVDM1W9V5NN3FMFKFZQX3","atts_01GW2HVDKZV61770952VRSQHSH","atts_01GW2HVDKXX32M71PP1Y92EK0T","atts_01GW2HVDJY02QF4ZH44T6D5S1D","atts_01GW2HVDJQ657YB0X8GG7MHGKT","atts_01GW2HVDJPZ5Z3N49ZA0MVX9CC","atts_01GW2HVDJDH79F5YDKMRQGXCPP","atts_01GW2HVDJC7YX6882DRW6TENV6","atts_01GW2HVDHRJ1VE03A39WZ81BGA","atts_01GW2HV8QEWAJV07J83TFWMXNA","atts_01GW2HV8Q5EH3Y9QRDAHJ9CYBS","atts_01GW2HV8PDRVCYCW31HR823A7P","atts_01GW2HV8P5XKRMF61PAV06M8VW","atts_01GW2HV8P2HC20MTTKMXVKECQR","atts_01GW2HV8P2PJ9H0N4G6EX7GQ9D","atts_01GW2HV8P1JS7PTGS4NDKP4SET","atts_01GW2HV8P0BZCED59RKNZ32YHC","atts_01GW2HV8NCB5HBSJMCZ01DQDGX","atts_01GW2HV8J30V2FKJQ1GY1WS4PC","atts_01GW2HV8HFW45M6S8CJBCVR4PT","atts_01GW2HV8HD20K4PW47HM776ZXB","atts_01GW2HV8G7H3RDAPDCQRQRMR58","atts_01GW2HV8G6RMB0NN35FP1R1DBG","atts_01GW2HV8G3479JA7BAEMFWMXQH","atts_01GW2HV8DSWYBZ8GDAHS9C2KRA","atts_01GW2HV8DK2BGDCJCNVTHS5MB1","atts_01GW2HV8D8A3EE7T8VD1FSYYMT","atts_01GW2HV8E376DN4KNTDK0QVXR7","atts_01GW2HV8CYFR0BNDW98WX1KH02","atts_01GW2HV8BPBZKKSZ75Z0NEYH46","atts_01GW2HV8BJT9KSDR91AZRJWWGW","atts_01GW2HV8BE6ACWTV3NCDWBCC5Q","atts_01GW2HV8AX7ZH2PKAK7AK5FF39","atts_01GW2HV88TPSPVQC9VQGJZ7XFA","atts_01GW2HV88NYZ1EYP48BRHEDQHK","atts_01GW2HV88DYKG4AF0ACB23JDRV","atts_01GW2HV88BERH3WQ2VQ6JNRSFQ","atts_01GW2HV86XZE3CNVAJG6QBNDEK","atts_01GW2HV86Q1C9279C1PR3BYT2T","atts_01GW2HV86BZ4V20XQ0336SAF3V","atts_01GW2HV866MD07HKHV6ZMTX5VB","atts_01GW2HV83NJQHF88VEVCQPEMY4","atts_01GW2HV83JC778A45E5M920EFQ","atts_01GW2HV83GFFBSQEN1128JQW3E","atts_01GW2HV83D8CXYP7W1Y1NEESMV","atts_01GW2HV83B9KKR0A1NCK6H8GRE","atts_01GW2HV838HF0D52E6VAJ1BYZB","atts_01GW2HV836S6CP9BTH7KGY4VD7","atts_01GW2HV82AC05TAJ4BY1JZXRT0","atts_01GW2HV81ADB4H7MS6DX76KQBT","atts_01GW2HV813WVJ33F6NV53C44PM","atts_01GW2HV811ZG51DKZCZ16JFWFA","atts_01GW2HV80WDW8VM8VHWF2539CP","atts_01GW2HV80T5SVZG6XDK46CGZGK","atts_01GW2HV80RQD07ZV57NNY6Y4EH","atts_01GW2HV80P8ZJZY6TBR4XKC8HN","atts_01GW2HV807324DNVK3HDH6TC88","atts_01GW2HV805GJXEGRD1TNS6SXVP","atts_01GW2HV803PQJ6VHZVRQHZ10VS","atts_01GW2HV7ZS88HS5A10PQ06R92T","atts_01GW2HV7ZQ402GWGC65JHSWA4A","atts_01GW2HV7ZP13MVGEPSN7P4X39N","atts_01GW2HV7WVWRH65D7GC8ZTA50K","atts_01GW2HV7WTN79EZZS78XM62C2G","atts_01GW2HV7WSXCDZFN4CQA7P6296","atts_01GW2HV7WRCNNGYG23NMY2KYPN","atts_01GW2HV7WPJSFCE335HJY2994E","atts_01GW2HV7WMSE7W91TT0BVN06XZ","atts_01GW2HV7WKPZS589G2ERJ0TQKM","atts_01GW2HV7V8NV19KST4KQJ0843C","atts_01GW2HV7T86S7ECAF2ERFCWJJN","atts_01GW2HV7SM8C36AY9MZ1Z0MS0E","atts_01GW2HV7SK6DE1W7255YWGY6C1","atts_01GW2HV7SHB7FNZGN774ZKSBTJ","atts_01GW2HV7SHZT4J74S2NNS7A5PV","atts_01GW2HV7SGTDGRGY5ZWN0TJECV","atts_01GW2HV7SFY1ZRB79S89PSZGVE","atts_01GW2HV7SE32YHJ8W6BJWN5FVK","atts_01GW2HV7RPDZYYV4DXSD2YP02R","atts_01GW2HV7R8N6Z4FB45ZVK1KADE","atts_01GW2HV7QNVSPZ04AQ1TGHQXT1","atts_01GW2HV7PQTNQ83WKR82CM1JCZ","atts_01GW2HV7PPW8K80EWPZRGFD1Q2","atts_01GW2HV7PKHZWH91VP12J2H4J1","atts_01GW2HV7PHZTRS43Z8HHH36GBS","atts_01GW2HV7NA250J80H877HXACPE","atts_01GW2HV7N9ZWQTRXNXJYJ9T2G4","atts_01GW2HV7MP13DRFB6PAKNYDFZG","atts_01GW2HV7K6Y94X5XY1PJGMG2VY","atts_01GW2HV7K4PNZW6KKTXKM1NMN6","atts_01GW2HV7K25WNN2MK0MHQXR3XA","atts_01GW2HV7K07VNDTX547461CVG3","atts_01GW2HV7JE5A2NSY1TN5FV9GKY","atts_01GW2HV7JD9C1AQPYA2KG6KKYQ","atts_01GW2HV7JAE3QAMK644HFD9GRJ","atts_01GW2HV7J1DH3CNBF5V6GXRDS8","atts_01GW2HV7HZ5NRKA95BM7WKPHZX","atts_01GW2HV7HYB5JGQ0HNEFDQWV41","atts_01GW2HV7HXWPTBVS1E10K7P0PY","atts_01GW2HV7HW0VG2MK6XSTNXQ6GZ","atts_01GW2HV7GBW6XPVXS0B7CBYSQ8","atts_01GW2HV7GA2W1RNPJFSK7517VK","atts_01GW2HV7G2M9FTZQHQMHJ4M2ZT","atts_01GW2HV7G1P8Q3N9A0P4XFS7YW","atts_01GW2HV7FZSYS5K9Z3KBDRH4X3","atts_01GW2HV7EXGD8W1XT0WPMQSHE0","atts_01GW2HV7C8KM4R6RHY071YZQT8","atts_01GW2HV7DV8WWHVCK2CE92G718","atts_01GW2HV7CEH7MJ4AFY9Q1MSWBN","atts_01GW2HV7CDWGN67S5EPFY4VHXK","atts_01GW2HV7C3RP9VZZ90Q808QY25","atts_01GW2HV7BHQPKCVRX69DXERWXW","atts_01GW2HV7BG5WANCX9873G5A9DF","atts_01GW2HV7B1EZ737H3H336ZECBD","atts_01GW2HV7AZBJD95C27RC7KGX7J","atts_01GW2HV77NXQ32AY8F5EWJT4XE","atts_01GW2HV77KHTEMG426TT2R92VB","atts_01GW2HV77JDVXPXRJ3ZP57FWK8","atts_01GW2HV74GMH82VD2RH26Q4202","atts_01GW2HV72QE611N811AK04266B","atts_01GW2HV71BSD6MEFJYBMEQ1VNX","atts_01GW2HV7194W1ZWW92TJ2B274C","atts_01GW2HV716SDGMCCV4PGMBBNET","atts_01GW2HV710ZDVA156VZVNPGTBZ","atts_01GW2HV70XA9MP5D0KWJB7ENXY","atts_01GW2HV70VEM393T2FNZEQBWT5","atts_01GW2HV70R7SDHASS823GKJM2Q","atts_01GW2HV6ZPTQXGN77DC7FCZ1C1","atts_01GW2HV6Z1REENYRZQZ5FBFHP1","atts_01GW2HV6YPYX4V26Q322R92Y0E","atts_01GW2HV6YNQKWM3VHVMEFZKSHN","atts_01GW2HV7C2K2CW1FCVS5A8W9Z2","atts_01GW2HV6YK4HXQ9CW3X0MGG02B","atts_01GW2HV6W96JYQT80023F997C5","atts_01GW2HV6V9M05EYKRZEXSW5B00","atts_01GW2HV6TY1BDB3HK6BFZ9DF6W","atts_01GW2HV6TR2W58DEB34D3TN60B","atts_01GW2HV6T8Q5JF4TVP2DA906ZM","atts_01GW2HV6T7JA5TRK2TH6WRVQVR","atts_01GW2HV6T6YG37EV2ERS576118","atts_01GW2HV6RYZKA6B44276Z47CMN","atts_01GW2HV6RM2ACHMZMR0E30TJEC","atts_01GW2HV6RA3QCD358CXMFF6Q22","atts_01GW2HV6QWMPQBW34JDWPGPTH3","atts_01GW2HV6QSD3HK073JAD8EMMAG","atts_01GW2HV6QPX8CZ8KZTDK2DMYJ3","atts_01GW2HV6QK7GZ1ER3JJWE014RQ","atts_01GW2HV6QH5RBX82PW350NRGKA","atts_01GW2HV6QEBF2P45CP0AWE7J5M","atts_01GW2HV6QBJB6CM94A50KQPCB5","atts_01GW2HV6Q3MD7Z77R4E0PVV9D9","atts_01GW2HV6PYFN140D022BG3NKZM","atts_01GW2HV6P7755HAKAN4H8ARJSA","atts_01GW2HV6P67C88B3CTFSZ1V2GF","atts_01GW2HV6P3E7K6VAYF05ZFN72N","atts_01GW2HV6N20GT9J4K783KK037K","atts_01GW2HV6H3CVKJBX6T38P8N1V0","atts_01GW2HV6H1MXF5BPHV47GWFCT0","atts_01GW2HV6J7H7DBMEH0BVAGDYGZ","atts_01GW2HV6G1MGG4QTHK8ZFCSCFV","atts_01GW2HV6FBN542WSH3A0C013YT","atts_01GW2HV6F9TT7JM5C03BAR8854","atts_01GW2HV6EWDRBJS5ZNRPNK4DMF","atts_01GW2HV6DGBTEM7Z325HK8QQ5Z","atts_01GW2HV6DGKQ5WG81PX4FMVMTR","atts_01GW2HV6DF8YXQ5PX1BAHMFJ3H","atts_01GW2HV6DDQZSBXAQ4424WQBP8","atts_01GW2HV6CZC3HGCJPQCA9J8VXY","atts_01GW2HV6CX4106D18FGKDT2HJS","atts_01GW2HV6CVWNA9VT3X78YWCBF7","atts_01GW2HV6CS96WNS5NSX5CQQFCQ","atts_01GW2HV6CQT47SJ1B7MQJHMN8E","atts_01GW2HV6CGBHT4D8A6CV8RGN32","atts_01GW2HV6CEGWX8Z65FA3HJMJ78","atts_01GW2HV6CDG053V93612SMDP59","atts_01GW2HV6CBNDBX3QF4Z2JTREV0","atts_01GW2HV6C3TEYN4BVZH4XBSWMQ","atts_01GW2HV6BYT9V0H72XPK4TNF5V","atts_01GW2HV6G0PMRNCQYM89VHFXES","atts_01GW2HV6BWARJAK569Z2AWZM4F","atts_01GW2HV6EQ730GXF1SEXSZBMPX","atts_01GW2HV6BV18QF41RBNB6XXNR8","atts_01GW2HV6BSVJRTGYWDR6DQGNHN","atts_01GW2HV6BPEFGFV68PCCVQ0SCG","atts_01GW2HV693D1PTXAG7TB57MB5V","atts_01GW2HV691F290Z9ZNEMEDP391","atts_01GW2HV686GP9KGACYYCYW31PK","atts_01GW2HV67P3ZXC8VV6W4KTGNKE","atts_01GW2HV67MT5Y1CNKY9RYAY0XH","atts_01GW2HV67KFGG1PB386PT5WQRV","atts_01GW2HV669TCZ332EXX01GK60F","atts_01GW2HV668QYQBZWMD9P1M6JHF","atts_01GW2HV6672DSGE30S4G2GYNJ7","atts_01GW2HV666R7Q9AK4EWNTFKWFV","atts_01GW2HV665BA5BMSTEYP83CZVF","atts_01GW2HV664VGFC6YM21FQ6FJZN","atts_01GW2HV643EFCXRZR60SDGV4RJ","atts_01GW2HV641TS32YED57JNMRPTX","atts_01GW2HV640EX0KBMXDAGYYHVA2","atts_01GW2HV63NAKNVP4PY4X05F5P0","atts_01GW2HV63J6SDBKMJ236FDRMVC","atts_01GW2HV63FTNA1W2M74MK9QV11","atts_01GW2HV62Z6DGBC8PCMHXNW5SW","atts_01GW2HV5ZJP2YZ53P17VQZGQRF","atts_01GW2HV5ZCGADAVHKXH7JD15T8","atts_01GW2HV5ZA0MC2SWK5B4212VHA","atts_01GW2HV5Z99279JYXCA3AKYBX1","atts_01GW2HV5Z4VHE5F453M9KVB34H","atts_01GW2HV5YMBYEYR7DJ98C1VRQQ","atts_01GW2HV5YK6JXMBZQAMFMTSHC3","atts_01GW2HV5YKPEK455CXF8QSK571","atts_01GW2HV5XKX6CN10K0HE7P3P4Z","atts_01GW2HV5XEQJNNKFEZRVTM9RSV","atts_01GW2HV5X9CR1ZJ313BMRGRW3T","atts_01GW2HV5WQ5VWQKZVNSTTM2MT9","atts_01GW2HV5WD3KR3JS2CZYV9FWE2","atts_01GW2HV5WB6WF5ZYEAA634ZMBZ","atts_01GW2HV5W94Q0KS1HMTG9YVWRW","atts_01GW2HV5W7XF0G5PME2PMV9SQ1","atts_01GW2HV5W55XYHE5H8D128BPZW","atts_01GW2HV5T625266ZZSTCYRPJGQ","atts_01GW2HV5SWDT8FBQRECVWCKTWW","atts_01GW2HV5STFWHWYFGW68BFSG40","atts_01GW2HV5SQQJK8Z1GFYY4WJ990","atts_01GW2HV5RW50RFFC83F4BZ9DV6","atts_01GW2HV5RVJGZTEJ1NXW34VP2J","atts_01GW2HV5RR386MSPZNX623798W","atts_01GW2HV5RQTDXEG2M2MQH41300","atts_01GW2HV5P33RFCHP7F0DYY2B1N","atts_01GW2HV5MWPQNM75QND9REY1D7","atts_01GW2HV5MGHDDARHKJA271RQ0G","atts_01GW2HV5KDGGE8YVRVBM5S8ZAC","atts_01GW2HV5K4TY05WQDCQ6AHEZM5","atts_01GW2HV5JZSXZ2A2A0SHZW6RZA","atts_01GW2HV5J7T46TG7Q08YK43AAY","atts_01GW2HV5J63JYFH426B9P9MG1S","atts_01GW2HV5J64QRYH5Y436TJZV33","atts_01GW2HV5HX8JQHRHC11T3SPGN1","atts_01GW2HV5HT0C2RN5ABE4AV3NWQ","atts_01GW2HV5HS1Z3VP0AZZ6SWY2R2","atts_01GW2HV5HQ979A6MGZ2AM583K5","atts_01GW2HV5FWKRMKXTXD7J0XPKQC","atts_01GW2HV5DPACC0SRW8PAF976QB","atts_01GW2HV5DMDBJ2J447RY7E0RFE","atts_01GW2HV5DHF945QKPDJ16WF3K0","atts_01GW2HV5D3ZE9JCCNWP6J9B91G","atts_01GW2HV5D22PBKPT6VDCABVEBZ","atts_01GW2HV5D1K10SR44P23MJVCNQ","atts_01GW2HV5BS5V87H3F8DJ6R65EP","atts_01GW2HV5BQC4TZ3RX17QFZ801G","atts_01GW2HV5BM3P4VGY4GE49DGXNB","atts_01GW2HV5BHVMY4PQ3SA4JZBKQ8","atts_01GW2HV5BFJ45Y8Z75147R1GGW","atts_01GW2HV5BCNY351VKTF2VAADSP","atts_01GW2HV59D0QYBGFXBXMPGGFCF","atts_01GW2HV57PWW1Z01NXEVCAN4TM","atts_01GW2HV5765WS3GJN4RG7J5V88","atts_01GW2HV574MD4R9PYB6DNQGK3Q","atts_01GW2HV56XP8ZRF8QX2EFDFFKQ","atts_01GW2HV56086DKQ0FC7CM22PKV","atts_01GW2HV55696NH1R88MBCQ0VAN","atts_01GW2HV54W5G7MYXJ8E21YQ9GZ","atts_01GW2HV54V66Q2ZJMY7SEC46XT","atts_01GW2HV54SGQ7ZFZMMFN3W9HZX","atts_01GW2HV54HXJ2V3GP0960E469D","atts_01GW2HV548ZMPDJPDV1WMGKT87","atts_01GW2HV53QV24J4B28TA351YAM","atts_01GW2HV53C0NR9Y5SSSV998Z2F","atts_01GW2HV52999NKVGHNGMXGM9KV","atts_01GW2HV51TJMZE2P949R6VWVAH","atts_01GW2HV50VP06C0XXQZVCX25YW","atts_01GW2HV50CD2KZC18VK0M1P2RJ","atts_01GW2HV508DEWYH06SB12EW9KN","atts_01GW2HV4ZVW5CFX4E58F3DC7SB","atts_01GW2HV4ZSMXHF55W0462VHQSF","atts_01GW2HV4ZN3FYPZWDZT5GVZ8A1","atts_01GW2HV4ZKRFYVEXP588ZRQ2D2","atts_01GW2HV4ZHJSSHTJA5GXBWXS5N","atts_01GW2HV4ZFR676MS5WZE0JN89P","atts_01GW2HV4ZDACKCHDYMYQRCFZW7","atts_01GW2HV4Z7NRK6YFDTW0P47EJG","atts_01GW2HV4Z6QNS0K3DDHGGA3R3N","atts_01GW2HV4Z485DN1XKBX4DWS264","atts_01GW2HV4Z3H2131W0K7S15K7JD","atts_01GW2HV4Z20WCZYDBS1W811G45","atts_01GW2HV4W94MD3VBYHXY05V177","atts_01GW2HV4W7K2S8SYM158YQHVFE","atts_01GW2HV4W51QCK0GGVZVN08YPN","atts_01GW2HV4W3548JXXH50967MK32","atts_01GW2HV4W1V87XQN5BY8JSDR3G","atts_01GW2HV4VYW0BPRN0N67DHM8QN","atts_01GW2HV4VD6WYEKP9XBES3HBHC","atts_01GW2HV4V8NPSZBDFKT48D06JW","atts_01GW2HV4TW32F39PNXQ7AKRZHA","atts_01GW2HV4SY3Z9MHXR9VJ3P28FG","atts_01GW2HV4SX0MWVS894T9Z76TC5","atts_01GW2HV4RYDT03M4Q7Y3CXR90J","atts_01GW2HV4RWCQSTRB3RX6DV5CNC","atts_01GW2HV4RG9X2WAGKEMHE9CFR3","atts_01GW2HV4RF30V1BJ8MDGZZQ6EJ","atts_01GW2HV4R6Q53WN3VW8VRMS9A1","atts_01GW2HV4R4017A675GKKF6RFWB","atts_01GW2HV4R3XB8EBJXGKJAG3DAD","atts_01GW2HV4Q41Q3V88PF6KCGM627","atts_01GW2HV4PGDYSVKTHYDPVVHZY2","atts_01GW2HV4PFMSQB9YVGCGPY6MAF","atts_01GW2HV4PDFD1K9Y3Y4QQBAZXK","atts_01GW2HV4MR9QHWRVA6F6XJWZG5","atts_01GW2HV4MQD3SJ77J1MBNME7Y7","atts_01GW2HV4MEXQ4MJ4BGATFNTVNZ","atts_01GW2HV4MDW9GG33Y5B5CQV80R","atts_01GW2HV4KWTPATNVC8X0EHC3KM","atts_01GW2HV4KVGJQVVNYQH9Q4MGGF","atts_01GW2HV4HSGC8H25QAP6SG652K","atts_01GW2HV4HR5DAWB05M0V94S0MF","atts_01GW2HV4HPJEXPQ3Y7QXGKB03N","atts_01GW2HV4HMSAH3YEBET2PF7T5Y","atts_01GW2HV4FDZJ88ZCB7HFA33BZB","atts_01GW2HV4FCG0EE2CY85STKK1RQ","atts_01GW2HV4FBYWVE4DDVN36NHY2C","atts_01GW2HV4F9YQRTRCJC74BHXHWA","atts_01GW2HV4F8ZJMF4GFHFNGPY0SN","atts_01GW2HV4F6TY9BCGCM38CG7TDC","atts_01GW2HV4F5VVTTR23SR1T0F9CF","atts_01GW2HV4F4T9WNNWNQT8FDFW7E","atts_01GW2HV4EAEHEKPCMW7X2TSE5J","atts_01GW2HV4DS2WX1ANE6D8WXSHY5","atts_01GW2HV4DN12609YMS7XYHF18K","atts_01GW2HV4DM2GMEH3PA5RCN58D7","atts_01GW2HV4DBPXQKSEPNDWA6KRSG","atts_01GW2HV4D9NJRY99VZEJ5PYVKW","atts_01GW2HV4D7CMWBDMWACSXE4TP3","atts_01GW2HV4D6XKNT8361V91C4JX3","atts_01GW2HV4D19KVCMZR6PYA4J411","atts_01GW2HV4D03XQYBXZXS2CEKWQB","atts_01GW2HV4CSS2FTWNQ221YVJ07R","atts_01GW2HV4CQX8VJ7PGQEJGH2MAN","atts_01GW2HV4BYDVXNYXEXZ6RQDJ84","atts_01GW2HV4AX0PAG5AZRJ5RNYAHQ","atts_01GW2HV4AWY3CJQNNVHN9S4JRG","atts_01GW2HV4AV62C16WM3TRQRPDQJ","atts_01GW2HV49HBY0V3VD01C6HSFKX","atts_01GW2HV49B5XRZKXSX2B8A2EFA","atts_01GW2HV499504AS7N00RV7V5M4","atts_01GW2HV48DPAA4EWGARBY2YXF8","atts_01GW2HV48AVFH82FXHYP0X470V","atts_01GW2HV487JJDYY8VZK1NPTBTG","atts_01GW2HV45JVXQP3FES4Q68FFAM","atts_01GW2HV45CXCP6GHAW8JZ6M4PJ","atts_01GW2HV45BH6T8J2PFBWRRGJ8W","atts_01GW2HV450CGXZGSWNV1KHJEM9","atts_01GW2HV44TTE11Q6BDZ5RK7ADF","atts_01GW2HV44RKQ65AMGADGYZHKP8","atts_01GW2HV44A534M3GGTMSMS77PD","atts_01GW2HV448TA66GHBKZ6AQQTTW","atts_01GW2HV41X7ZNGKDX4T1V2V0H9","atts_01GW2HV41TZZ7MKWNJ30ZBGYWY","atts_01GW2HV41RCKQQ8VZBRFS5DN3Z","atts_01GW2HV419A1KRJ5DF14HA3K9H","atts_01GW2HV41856FWZ98X3DHSQ783","atts_01GW2HV417TWQ0KSHETSYHT5WG","atts_01GW2HV416Z5GBA0RZGPVPRFRT","atts_01GW2HV415G3M7SKBE4EMW10TV","atts_01GW2HV413NAJFBJBR9Y726J18","atts_01GW2HV3XJNPRHRK8HMC5V4C43","atts_01GW2HV3XDJ8A20VT9FJJK201F","atts_01GW2HV3XCKJP5C9Q5MVB7EA3C","atts_01GW2HV3XANQZ48EAE3MBEGM9M","atts_01GW2HV3X9DKDWNY1YGYZRY669","atts_01GW2HV3X5AZDCC2DF2KH7R2QV","atts_01GW2HV3W86DCAGGDMJDK4GDC6","atts_01GW2HV3W7M41K0VS20QW387AM","atts_01GW2HV3W650ZGA3HJMD653333","atts_01GW2HV3W45NJYXCAAS3WC557T","atts_01GW2HV3W3VXRZN85204ZDJB21","atts_01GW2HV02YYBBEQ89S62WM972X","atts_01GW2HV02WZJS9QP5G921QEVN6","atts_01GW2HV02TXGQ2TQ49P08KARXA","atts_01GW2HV02Q5HGR97BH59E3WD5W","atts_01GW2HV02JY162HM5XTAP1DKG8","atts_01GW2HV02G50NTNZ41W8AYBPRB","atts_01GW2HV02EZ7VVXVT1CSXS9TRB","atts_01GW2HV024MAXZ8KV2D0ETC4CC","atts_01GW2HV01YEFW3GXJ865C17AEA","atts_01GW2HTZZSTHGM59E3H9H3ZV84","atts_01GW2HTZZM3TP2DF7J9H0DZJHD","atts_01GW2HTZY305SPR731SXMHF03X","atts_01GW2HTZXZJYW22MWQ19GXJPT8","atts_01GW2HTZXXW0VRDSMAJ60YBRNK","atts_01GW2HTZXTS5Y1KDE3RDBZY0EF","atts_01GW2HTZXB28KBBG3D6CY8NXZP","atts_01GW2HTZXAZT9NDFCPFVA51400","atts_01GW2HTZX3Z44HV697MT1F095B","atts_01GW2HTZVVXZSPZAPPZ6HXN7Q5","atts_01GW2HTZVQYG9KYJ86H3X4F1V8","atts_01GW2HTZVNV8P867NM9D2A8YNW","atts_01GW2HTZVKG479TGTV54ENQ23X","atts_01GW2HTZVH7YQZS452P76ZXXPM","atts_01GW2HTZVFECAHJ9EMMR8AZFWN","atts_01GW2HTZV2HHXAKH2B240XXZNZ","atts_01GW2HTZTMHN8WRMS707FGBEJJ","atts_01GW2HTZT98SAZCYC2V1JX4F53","atts_01GW2HTZT8TH5G8MMDE2FWYG4A","atts_01GW2HTZT6CA9K90P6344T634S","atts_01GW2HTZSV01RTCXNHCXXEZQ8F","atts_01GW2HTZSKE7TGEDDKX5Z4GTMF","atts_01GW2HTZQY9J15FFZT1S8TPZV6","atts_01GW2HTZQ8VEM923BCDDSANTJJ","atts_01GW2HTZQ7KMZFECNGGCMFHMNK","atts_01GW2HTZQ59E26ZEF9PKVYK8XM","atts_01GW2HTZPZENVX9XN47Z5AX94P","atts_01GW2HTZPS0C62MNPPY4ATXJEQ","atts_01GW2HTZPRJDDGADPY60M567Q5","atts_01GW2HTZPK5GJPCW2M6JRH6T3A","atts_01GW2HTZPKB8W3QQV84386R4X3","atts_01GW2HTZPJ094SQV13354W2XZE","atts_01GW2HTZPJQ3T87FRM8XBXH81Y","atts_01GW2HTZNVYXQ78X057CVPFAKX","atts_01GW2HTZNSMA6T6BYNT4F8Z1R8","atts_01GW2HTZNQEPV5K8AETPNENY0X","atts_01GW2HTZNPFH2EBQQQGVD9NFKJ","atts_01GW2HTZNN65K8TBMS0QE86067","atts_01GW2HTZN5T7R9WER9M0E1X0NT","atts_01GW2HTZN488JFZXMVV0FX17KW","atts_01GW2HTZN2ZVMZRP6EPXGPBKPQ","atts_01GW2HTZN1GMQ4RG3C8WHP6BYF","atts_01GW2HTZN0TMCAJJ0J8YGN843Y","atts_01GW2HTZMZ8469AFPVQ2Y6KA92","atts_01GW2HTZMY8HTB8TYQ0876T4TW","atts_01GW2HTZMWCSFTN6DAR3ST986N","atts_01GW2HTZHY1PMTWT7SYQ12NMM8","atts_01GW2HTZHTWFJ24PTA3GTTHTZZ","atts_01GW2HTZHMKS1FD4PR14WPTHPA","atts_01GW2HTZHD9CAM64W3Q3020J5F","atts_01GW2HTZHAFEFCXFG0QGD53GKH","atts_01GW2HTZGC6YNN7Z3F5EPY5N3E","atts_01GW2HTZGB8ZFT3DHAKM555TNT","atts_01GW2HTZFT4PHSGX0K895CQ197","atts_01GW2HTZFGYTXR6X4BH71RBTRA","atts_01GW2HTZFFMD924ZAXV72ZSY5G","atts_01GW2HTZFFNQRCGE0T5XFNCHVT","atts_01GW2HTZFEKK2YVG8VFTKYJ4RY","atts_01GW2HTZFDPEX2JKY00SDGNC4V","atts_01GW2HTZFCR5XWSFKZ9HQ7MF29","atts_01GW2HTZFB4J29MHAH71NW996Y","atts_01GW2HTZFAVSV7Q2Y9ZK14G1BK","atts_01GW2HTZF9EPFNR7NC70R019CC","atts_01GW2HTZF8H0PDTD9BW1XCRFJ4","atts_01GW2HTZF3TS8DXBQX5BPDWFJZ","atts_01GW2HTZF00T7GVXMCYER1D6QR","atts_01GW2HTZEYFWEANYJYXMK8EH3P","atts_01GW2HTZEX1JD8G0P0YRGCBP0F","atts_01GW2HTZEWS980RHCKTM0HHFCW","atts_01GW2HTZEVY0HJHBQBTBFZ9JG6","atts_01GW2HTZEMPDW04DKMKXEBZ8ZM","atts_01GW2HTZE5E18P1M0TN9EF6G6P","atts_01GW2HTZCC98FH377GHY7NE8R5","atts_01GW2HTZCBXH49MQN0TN01A32D","atts_01GW2HTZC8CYWSQ7MCRXMJXGCD","atts_01GW2HTZC7JR7496HCD9XZ6011","atts_01GW2HTZC54GR9MEK3BJQB96ER","atts_01GW2HTZA041NNC6T8ZH8BXASM","atts_01GW2HTZ9ZYEY54DGRR4ZTJDM0","atts_01GW2HTZ9Y89K8YFSQXHV2R5G7","atts_01GW2HTZCVN8XZEJEGY840JT19","atts_01GW2HTZ9WG8QTTHX5FA2G89N8","atts_01GW2HTZAKS9MQ006NGPMTA3CP","atts_01GW2HTZ9TY1MGACSHVJ0G6S6R","atts_01GW2HTZ9RV4BEP7A1HHJ38T5G","atts_01GW2HTZ82P3RJZ10CXWJT9808","atts_01GW2HTZ6N4YVZNAD061WG2TQZ","atts_01GW2HTZ6BDYAWM10ZEKTJZRED","atts_01GW2HTZ5Z8CSKSJA90Y29JM29","atts_01GW2HTZ5XKRB4PA55M7D5EXNB","atts_01GW2HTZ5RS4VPFR7ZH9E1JN3V","atts_01GW2HTZ5ATT6A54VTT1N6FMMT","atts_01GW2HTZ3J5KMJDJ8KJAH1Q5EK","atts_01GW2HTZ2SSC6G6RK2HM22N6AJ","atts_01GW2HTZ2Q14H433017260P04V","atts_01GW2HTZ2JHH7DGQBYZDWKTARX","atts_01GW2HTZ2HXW7WXKPFHJB5NFTJ","atts_01GW2HTZ2GVC5GFE240SP3TWWV","atts_01GW2HTZ1RRB0FZ07ZXK1TTZ2N","atts_01GW2HTZ038D79DGY6QW6QK883","atts_01GW2HTZ018TGYD42Y3QX9Q458","atts_01GW2HTYZZ3P95Y1QMCW8R88S6","atts_01GW2HTYZK6XSDZBBGSJRBQCWV","atts_01GW2HTYZAH6XG4F94D1BPEEYH","atts_01GW2HTYYNDY8845W3NMN5FYDK","atts_01GW2HTYYDSR8AEASK0X7F3GZJ","atts_01GW2HTYVWHG37VR2AE4B1BG65","atts_01GW2HTYVC5SVTA24T0QRXNWNV","atts_01GW2HTYV7YS8RMW333GH8AP6K","atts_01GW2HTYV6ECW8G5TKY9E8E5KK","atts_01GW2HTYV5HWY1Z0NZDZAE8982","atts_01GW2HTYV3MYW15HSTFV0PF4F8","atts_01GW2HTYV2GPACFJG2WM90AAYM","atts_01GW2HTYV0K3XWBRA7DG8EAXFE","atts_01GW2HTYS5QH1V2MKS92SR8WDW","atts_01GW2HTYS4FRQSJAA8DED98E7E","atts_01GW2HTYQJZYDYDFDQ9MXEK9YQ","atts_01GW2HTYQGRPW5PZDW3M6C2X9A","atts_01GW2HTYQEQVKV43ZCS4N8C2C3","atts_01GW2HTYQCPX69DQ1CJ21BFXTC","atts_01GW2HTYQBCTNJQMGTD3NX3BBM","atts_01GW2HTYQ9EKFZ6WM0DNDZQKYS","atts_01GW2HTYQ2J4PS3G0SR63D7GPZ","atts_01GW2HTYQ14X0N3DVE4B2G1ZY4","atts_01GW2HTYPZN23TR4VMYN3BNY2Q","atts_01GW2HTYPTAD3GXB7C3WYAM7PD","atts_01GW2HTYPQ3M9XSKK5H6GYFFGE","atts_01GW2HTYPHZFNW5XW4RG923G8K","atts_01GW2HTYN40738Q2BMQMGBT7V3","atts_01GW2HTYMG0J2ZYN1SWMXJHF4D","atts_01GW2HTYM1HVKX38HWM2FF6KZ1","atts_01GW2HTYKZPCN25RVYH1PXE65D","atts_01GW2HTYJ2V0H9MEVB9VR83PCP","atts_01GW2HTYJ0Z9ZFR13956WD9R9B","atts_01GW2HTYHY9C3GHWFW6ZN5TCCY","atts_01GW2HTYHBD2AZF8RBDM90JM7Q","atts_01GW2HTYH9DRR85JBMV7VG7GJQ","atts_01GW2HTYH75FBWSW1T5GEGNKS6","atts_01GW2HTYH67CJR3BN2Z3B328CE","atts_01GW2HTYG8V1XNESJ46WJZS5P8","atts_01GW2HTYG70F3Z9T090R8EKTD6","atts_01GW2HTYG4C6J2W0XNH9Q7SE41","atts_01GW2HTYG3K3QPVVEW48VNDHJA","atts_01GW2HTYG1E2NM4NXCDGDXRQFV","atts_01GW2HTYG0JMWWXY56C901XPB4","atts_01GW2HTYFS5WY86HMJDHZYDQXC","atts_01GW2HTYFKYG7HP0BDGXWTAWZ2","atts_01GW2HTYFH4BVR19Y6BREZ4SD9","atts_01GW2HTYF7JX6GCJK9DVAYTK5M","atts_01GW2HTYF3H76SDBXZ4YBN3KJC","atts_01GW2HTYDH5KHGAB7Y5Y6R13P9","atts_01GW2HTYDG20GD6P4STNKSMPCY","atts_01GW2HTYDF7SDGXY15MQWD2QQK","atts_01GW2HTYDER7KNZ8XT1PZQXBD9","atts_01GW2HTYDDZ141Q1M3WTKMWMXN","atts_01GW2HTYDCV9DWP99B4RQG1YPC","atts_01GW2HTYD1F6Q4DVDF5SSBVPH5","atts_01GW2HTYC8RN7KHZT84PWNEWBA","atts_01GW2HTYC6BEQSVX6YBX8N2X5E","atts_01GW2HTYC4Y18WK6P6YAVJ9N2B","atts_01GW2HTYBZMJ9SP1VKTSTEKH0C","atts_01GW2HTYBYAJPNN8N19EBKJ0BY","atts_01GW2HTYBWZ7MGBXT8YJ6QSVDG","atts_01GW2HTYBTSVBJFJ3ZVPM299GY","atts_01GW2HTYBSB18RPZW04DXZ3G46","atts_01GW2HTYBQ1KG5B7CVK0300QTQ","atts_01GW2HTYB545XH4BT0ZJNPAWM0","atts_01GW2HTYB3JAJ8JQCE2G2H5CPF","atts_01GW2HTYAYZ0BCN4CWZCQNV0WK","atts_01GW2HTYAVFSXWC7FRRF8VNJDX","atts_01GW2HTYAMHYM4604ZPW59G2SQ","atts_01GW2HTY9G8KCTD0BZKV25Q2RK","atts_01GW2HTY8BQM8ARXQCPRYQTZEH","atts_01GW2HTY6EG2VB1TCCSP4JRK4K","atts_01GW2HTY4R3PHWQ5X6SHGHRYA5","atts_01GW2HTY3RMJFHG56C333TCYEY","atts_01GW2HTY3A7JH1FW7K6CMSRFQ0","atts_01GW2HTY2G0R0MNMA5MEX5Y4A2","atts_01GW2HTY25AG1DS3XPAGQC07FV","atts_01GW2HTY1VKDYZHFQR6TKZQ37E","atts_01GW2HTXN87MGFVVPW0SA5SFJA","atts_01GW2HTXJ50JNBHKZVJY2HBB6R","atts_01GW2HTXGJGPRGFWX28BAFCQCW","atts_01GW2HTXEFKXA3CC0CHH4JDKQC","atts_01GW2HTXEE0KPV77BZD35BBRT7","atts_01GW2HTXEC3APCC394PMF18FWC","atts_01GW2HTXEBCDKP0GCP93P1EY5R","atts_01GW2HTXE37K7KM7KQDJRNJPD8","atts_01GW2HTXDKDV3XCFKJ0YTXRB3S","atts_01GW2HTXDJ38XFQ6M5F0YYDMAM","atts_01GW2HTXDBEPSDFHQCV86XHZ7Z","atts_01GW2HTXCZ9DJQ1ZNAYPZ66H20","atts_01GW2HTXCW5QTR11R88T61RT6W","atts_01GW2HTXCTXH5AFFNTSZKW2YF0","atts_01GW2HTXCNQMFAWQGHFEQHQ021","atts_01GW2HTXCKAW4K3AXA7ZK23YV4","atts_01GW2HTXCH09ZMQF1JZAHWYG8Y","atts_01GW2HTXBBT8X9B6S8PQRW2YCM","atts_01GW2HTXB4B4X013984XGX9T10","atts_01GW2HTXAD79P3G50R60K34PK9","atts_01GW2HTX9KQJ7BAFG9TDPTF6W4","atts_01GW2HTX98FRKWFABHX481QQJS","atts_01GW2HTX8WNYNW8Y3JDZ05JA4J","atts_01GW2HTX8TB28JDKHBDDN07Z9A","atts_01GW2HTX8SB5XGNZG9058EPN58","atts_01GW2HTX7PG333TJQKPMHB7X0Z","atts_01GW2HTX728TX89GSW0M7TNMEW","atts_01GW2HTX71ZAF0FGF16BNQDQAB","atts_01GW2HTX70GNRJKEQSAN6F63CX","atts_01GW2HTX6VYKD23SJ8TFP5AQDT","atts_01GW2HTX6TA36GC5PRBEJQNR9T","atts_01GW2HTX6SNX8GWWVNKDXX96AG","atts_01GW2HTX6R1PRP4MGN7VR3M42K","atts_01GW2HTX6P27M11FB9GFF7ZN2P","atts_01GW2HTX69VEBDVCK20YRAHMPE","atts_01GW2HTX661PAAW9QGZF359F1W","atts_01GW2HTX649HYBY6P9E6XZ9MZQ","atts_01GW2HTX61RX2JGTW5RTHSEV5F","atts_01GW2HTX5REXZND2SRPZ47ZKWF","atts_01GW2HTX5QHB89D33SY0JS6SNW","atts_01GW2HTX5EERFJBDSNNNG86MWN","atts_01GW2HTX59391JJGPEHRTCWRZK","atts_01GW2HTX2YM0CA61QCFG3065JP","atts_01GW2HTX2XE62DWBC4TRE227ZB","atts_01GW2HTX1NTRQZ74BZGAV9Z1WW","atts_01GW2HTX18DRV69Q0Z4JXCX4KG","atts_01GW2HTX161Z8M51MJTXDSQN37","atts_01GW2HTX15VW931HTNR94CKWSB","atts_01GW2HTX14R181ZXA97ZVM0QP3","atts_01GW2HTX13GS1A48Z7MM7J6DK1","atts_01GW2HTX0Z3DWXC70QBC838G7Q","atts_01GW2HTX0YWWWR9NJWVA2D3F33","atts_01GW2HTX0WWB6VWZXYX7KCFEDB","atts_01GW2HTX06EEBD86XSX072CDRG","atts_01GW2HTX01ANBJ83ZV4ATDQJW7","atts_01GW2HTWZY33RJ9WSWVCA7ESEX","atts_01GW2HTWZXQP2MMXETF2ZZG3ZV","atts_01GW2HTWZW2NPCYRVD26MNEMRH","atts_01GW2HTWZVZ53VBX3TT1ZV9A16","atts_01GW2HTWZT58JVXPPVJPHGSSKB","atts_01GW2HTWZKZH1NVQ5JP974DHCN","atts_01GW2HTWXQ86JXR8AXAAP916DR","atts_01GW2HTWXKKY05J1FTDWQ8NA1D","atts_01GW2HTWXGPRGW3N4CN0Y7E3E4","atts_01GW2HTWX9GWZB5G6H0A8BHEHP","atts_01GW2HTWX7EQK4EZQ20N21HHAK","atts_01GW2HTWWXTRYCEHDKV88JAQC9","atts_01GW2HTWWRQWEPB29N41DBRTYQ","atts_01GW2HTWWNY1ETEYRF1FM3443E","atts_01GW2HTWTT5GDQRDEXHHNC2Y1H","atts_01GW2HTWTHDKAQ99KRW4VKJGRG","atts_01GW2HTWT9R9XSW2DJQAVT83G8","atts_01GW2HTWT16DGA55429GT4EP1G","atts_01GW2HTWSRJVY1WDND4T5YGPZS","atts_01GW2HTWQRDT1404Z6N8GQGGXG","atts_01GW2HTWP5QA1588ST9BF9CGH8","atts_01GW2HTWP2G8Z4WGPQMGZNNNRJ","atts_01GW2HTWP2AG6EECTHSWXSZV8W","atts_01GW2HTWP15DNR6Q663GQ79VSD","atts_01GW2HTWNZQZR2HNB7CQFWXCP0","atts_01GW2HTWNXWGJ337QDQ4JM2T7T","atts_01GW2HTWN9YWSZ443PB0Y28GQQ","atts_01GW2HTWN60D0ACDDFBZ1SMJ5Z","atts_01GW2HTWN097HASCP9B8RQEVRX","atts_01GW2HTWMQ2JZYPFXK9ECHD6GG","atts_01GW2HTWMMH2XXYEY5GAV0SNS4","atts_01GW2HTWM51F4V1F61C9YJ84VK","atts_01GW2HTWKZBHSQC825TF9DZ2FV","atts_01GW2HTWKMZTD2GB0Y152J8B2B","atts_01GW2HTWKHVHGD28ECG5HEYW2E","atts_01GW2HTWKC1WEBD7WB83VYCP85","atts_01GW2HTWK42PK5C2GHW4AF45PP","atts_01GW2HTWK2FK5A66CV0APCWY43","atts_01GW2HTWK196PDTRV7DK91VFJB","atts_01GW2HTWJ4VTC7R5TNSWFNE7XM","atts_01GW2HTWJ3JH66B3G519B27QYY","atts_01GW2HTWHE7TG3AWV2RSGJKJGS","atts_01GW2HTWH29BSHG1VYFT60R2G8","atts_01GW2HTWGVBMCVQ1D7ASZY1KXC","atts_01GW2HTWGS4YV198TX6KM0KZKS","atts_01GW2HTWGPSMWNW0T7BDMVV784","atts_01GW2HTWE756M3TA8XZF21W34K","atts_01GW2HTWE2ZS8XGFN6FW5GDAZF","atts_01GW2HTWDTS75ZANVJ10R93252","atts_01GW2HTWDS73QJSSVRZ04HFJVW","atts_01GW2HTWBRPQVHFJBZHG2NSSWA","atts_01GW2HTWBNPVNRE8AP4FKPMAWA","atts_01GW2HTWBJFFZRBZRH261VQ6HX","atts_01GW2HTWBF7B85K535RD2KMMX7","atts_01GW2HTWBCRZYCEKK0NKBHFWBB","atts_01GW2HTWAX49T2870FK6V810H9","atts_01GW2HTWANFQ9VDS553RCMJJ38","atts_01GW2HTWAMCTTQ9YGHV8FJ868P","atts_01GW2HTWAJ4J4AFDC3KNXGWBPD","atts_01GW2HTW9Y53SKZJ2PBGJKQH4N","atts_01GW2HTW988DRE6SCRPM6NDM16","atts_01GW2HTW960VR4MRT6YTGFNNZT","atts_01GW2HTW94G9EV5NRC41FBMSWR","atts_01GW2HTW91WHQEKB22QX2ZJACZ","atts_01GW2HTW8ZCAR8TW8Z1M3WPCAH","atts_01GW2HTW74YRDBVE1SH5TC5SQV","atts_01GW2HTW73RAVVEW2VN8W5E1G1","atts_01GW2HTW6W0DGS6X0MSPYVM34G","atts_01GW2HTW6AHV8HTNQDXR5SVN4K","atts_01GW2HTW4YSSW7KGSTX2BKRZWQ","atts_01GW2HTW4P8VASFC0JB24CHKTZ","atts_01GW2HTW4N0H789SG6FXN4EMVP","atts_01GW2HTW4KNV0FY9GE70W8MYQK","atts_01GW2HTW4H1V7EZRBF8D247K8D","atts_01GW2HTW4FQ7NS7EXV897274RS","atts_01GW2HTW4DW5DTP8536Q7EHJ95","atts_01GW2HTW4B76D99ESHFFSR7PH2","atts_01GW2HTW48WAQ5X4P7GZAXEMF6","atts_01GW2HTW3RNAEHYRPX9FEJ5F89","atts_01GW2HTW3Q4WWQYTCH972BDWB2","atts_01GW2HTW3P23WAQV1W08T6D490","atts_01GW2HTW3M0MXY0T16DYPCQES4","atts_01GW2HTW3MMPG4RYYQFRKKQK1P","atts_01GW2HTW3KNDVTN47Q3V3KFHNZ","atts_01GW2HTW39W47FW73AF701TRAW","atts_01GW2HTW342A3HSEAT56CJ6N1D","atts_01GW2HTW323ME78J6CBSBD59YT","atts_01GW2HTW310D6AQYX03X4A8B3F","atts_01GW2HTW303PMH03944STC651F","atts_01GW2HTW2YM9GFMZTYBXH3TRAD","atts_01GW2HTW2XDS1CRH1KY37X4CQJ","atts_01GW2HTW2WPYQVBPF4BRPHGFNB","atts_01GW2HTW2T0J7KPVWH9HG59X2J","atts_01GW2HTW2SVEVYZCNDZKRAH0A8","atts_01GW2HTW2PNKF1WCNTWFHMJ094","atts_01GW2HTW2CQ5HTTX9J0F502BQ8","atts_01GW2HTW21N7VXAWZHRMAHVC71","atts_01GW2HTW1ZHPWKY42SNZXQP9DX","atts_01GW2HTW1E2MXDGDE58N99DZH4","atts_01GW2HTW1BWT5BK0Y30GK2CGCQ","atts_01GW2HTW0FRTP701BCA9730VM7","atts_01GW2HTW0DYAVPC4W0TXRR2ZXF","atts_01GW2HTW0B99VJHSCQ6W0W60XR","atts_01GW2HTW02ZVBKEXXY1JMH8RVN","atts_01GW2HTVZS0BST250N22H7XMFK","atts_01GW2HTVZQ08M12BQCXHR3J2PD","atts_01GW2HTVZN2KFZ9GK0XFHSECV4","atts_01GW2HTVZK08YVQKM4WKTVHHQF","atts_01GW2HTVZHY9S4XQVTMXAD5FJ3","atts_01GW2HTVYB482X039GB0WEE3N0","atts_01GW2HTVY9K6H0TNVZB085QWJN","atts_01GW2HTVVYX8HS36EDQ9M2G1E6","atts_01GW2HTVVNZD9W3W5KVBEG0V3G","atts_01GW2HTVVKTX5WH7C6A0NA1SXF","atts_01GW2HTVVJKF4VTXQMYEKY0PXN","atts_01GW2HTVVGHKW9REABKZMSAG6Z","atts_01GW2HTVVE70AWHJK6349GVET4","atts_01GW2HTVWR78Q1086VFZJX4T7Y","atts_01GW2HTVTYKN3KC4A6FMZC2S7P","atts_01GW2HTVTCTT77RPMG8MZTT8BS","atts_01GW2HTVR9CV1RKRZGZQX6AQDB","atts_01GW2HTVR08KAR3XZHQPR8MZQH","atts_01GW2HTVQY22V1WRTWVW1PRAK0","atts_01GW2HTVQX6CJVYKNF33Q5VM1Q","atts_01GW2HTVQWX6XJZXM2GVH7ZYR0","atts_01GW2HTVNKMTZ80MAX9CAKXAN9","atts_01GW2HTVMQMQ7XVTPDNSAQ3T3R","atts_01GW2HTVMN8ZHZWAQFKNFFFBYK","atts_01GW2HTVMK9NB8F63RBG7TBQ4S","atts_01GW2HTVMJKB2Q1AEYVJZF68Y9","atts_01GW2HTVKKFQ82MGT798C08D9G","atts_01GW2HTVKJ61KXKFXY7884GQY6","atts_01GW2HTVKGRWKZGS8HZ2DYNFSZ","atts_01GW2HTVKD0RGT48C6DWTV90SN","atts_01GW2HTVKC6YF4C9M2JT1NKMZT","atts_01GW2HTVKAWB2PJCV1Y1HHJKN1","atts_01GW2HTVK87DY3615CK2S2WMMA","atts_01GW2HTVJ90BM1DH9WWM14WTSC","atts_01GW2HTVJ7WY11VTZS67AKAC3R","atts_01GW2HTVJ6E46WQ2X90XSM78MD","atts_01GW2HTVTA7GP39GCRVK5JZHSV","atts_01GW2HTVJ4TVSF7SDBA344C9VQ","atts_01GW2HTVJ2YHS2HPJV1T08GCJ7","atts_01GW2HTVEXDP2CGV60EQPPN5AM","atts_01GW2HTVEWCXZ7P0BGE8W4XRKF","atts_01GW2HV7MX0QE8XHWYTJ71R8KB","atts_01GW2HTVDFTB940YVP5QJQZM7F","atts_01GW2HTVDE7B7Y7JY0GDQ759X5","atts_01GW2HTVDD87AJHNTNJX9HBJ2F","atts_01GW2HTVDB57V2BQDTE681C9FB","atts_01GW2HTVDARSEG3XWGDP5GRE07","atts_01GW2HTVCJ9N0F8WCEAMQ08SBN","atts_01GW2HTVBVAKTWA3EWS1P7JCDH","atts_01GW2HTVB9NZQWMYZ85RPFN6PK","atts_01GW2HTVB8TJ6BVY99CMZ1S4VG","atts_01GW2HTVAQTAYAW0DJN4QYGP8W","atts_01GW2HTV9VE41C8MNVJTAKYT89","atts_01GW2HTV9JVMBQV8SDJ0ASNBXE","atts_01GW2HTV9HM8DSW9XVC74WHRB1","atts_01GW2HTV9FXF9ZE5C9A74N53CG","atts_01GW2HTV993M9SZGXJ7T2DQRK3","atts_01GW2HTV972QHA1P7WSEHP7Y8P","atts_01GW2HTV8MR5KPBVGDKZDENM0S","atts_01GW2HTV8KKW922ZP7M86HBVSQ","atts_01GW2HTV7R7ANJQ2EXQX1QJT1P","atts_01GW2HTV7PGP8WVMZGB1A4MFMG","atts_01GW2HTV6P5975R93MD0N0HNXZ","atts_01GW2HTV6JT5N728ZJSSD2DEDN","atts_01GW2HTV6DZMC5MV9E57AAA0AP","atts_01GW2HTV6808JYYJ20SM1ZNSVY","atts_01GW2HTV65KYVKRFB5YGJB1EVD","atts_01GW2HTV4NFJGSAK1YE7EN5BYY","atts_01GW2HTV4KYT9GDH4MHGJN77AK","atts_01GW2HTV4HECHAQTFT6455YXY4","atts_01GW2HTV44G5QHX9MMA5BHZE3D","atts_01GW2HTV40GFTKZNNW04DWYB91","atts_01GW2HTV3WP86ZN88WR5VX2HWJ","atts_01GW2HTV3R5JZQMZFMM3RAJD66","atts_01GW2HTV3KJ093Z0N3E5ZAB387","atts_01GW2HT86360JMGB6NPFGJX8E1","atts_01GW2HT866RVW24T22E73B2TXD","atts_01GW2HT86AKBDN89G3JB3GDN61","atts_01GW2HTV38Z9ES2J4QRQ2YRMZE","atts_01GW2HT86FKTRWDKKYYM29EQBT","atts_01GW2HT86JCAXT0B5A2SNCEKPX","atts_01GW2HTV36V4G65DP7F3GYDF64","atts_01GW2HT86RV2AJSZT3Z671WEY8","atts_01GW2HTV2YE4F6E24P8C81V4Z6","atts_01GW2HT86XRZ8TK4MYKGC13QG5","atts_01GW2HT873NWEWN8Z7KG0F1E3C","atts_01GW2HT87D9QBFD215TNKJ66YD","atts_01GW2HTV2EX0ZYKQ1ZRKRFRS7Y","atts_01GW2HT87PVQ49VGN8R124J6VC","atts_01GW2HTV1EZA20TCHBPSSYADNY","atts_01GW2HTTYA7R3ZPDMR0BM99SX6","atts_01GW2HTTY8S99ZSRV8VVMB9FCA","atts_01GW2HTTY690DMACRQYY7WEPV4","atts_01GW2HTTY468SMCYZE9T2CTD5T","atts_01GW2HTV4F0SQTCTZR4AEJ72D7","atts_01GW2HT8851FRVRGRQP6CRWYFW","atts_01GW2HTTY2QHPKFS4CX0QDMF01","atts_01GW2HT8B68XY8GT8GRD7B3P60","atts_01GW2HT8CTMF2W5FF98FKA56B1","atts_01GW2HTV4BP4KAD5D9DBP22CJQ","atts_01GW2HTTY1VV54Z6R8FHPM8GX4","atts_01GW2HTTXNW6Q112TXDJZP5Q21","atts_01GW2HTTXKAMF412BHWHTXPTWT","atts_01GW2HTTXHMCVTB9P9QF44VZ0B","atts_01GW2HTTWP49Q1RRXCFFCQJ0CQ","atts_01GW2HT8CWKQE6BVHS3T4FTHN3","atts_01GW2HTTW4W06JXG7GDV0YM69G","atts_01GW2HTTVWE6NPAHQ3MV08PFQP","atts_01GW2HTTVVPGJ14YW7E19JHFQY","atts_01GW2HTTVT9YQNB1XGKWSD5C9D","atts_01GW2HTTVRWB2VFQMDDFB94BJF","atts_01GW2HTTVQHM37G6DY7W6W1MFZ","atts_01GW2HTTT1HQCG6TJ6AJQZSTR0","atts_01GW2HTTSZMEHNW6FQ5PHKDAWC","atts_01GW2HTTSYM453DAMXPF71CYQ3","atts_01GW2HTTSWSV0C3EXQBA5C7YVH","atts_01GW2HT8CY6GB93J4ZV15083B2","atts_01GW2HT8D1DNZ8A15WZ0YGQG6E","atts_01GW2HTTSVGAMHQ4YR3W9QMTM0","atts_01GW2HTTSS3NM4DYBCAPESVEFF","atts_01GW2HTTSK8JFP7A8RYGJRP375","atts_01GW2HTTSH8PTT7HYNQ6GM8RVH","atts_01GW2HT8D3F808AWGK24BCBTP6","atts_01GW2HTTS6H11GN1NVEV7N1XA5","atts_01GW2HTTS560W1CN3ZJV2RC0VC","atts_01GW2HT8D6QXGBQVNFV6M6FH9B","atts_01GW2HTTS2MTKHKHBXERN66NQQ","atts_01GW2HTTRNTZKE7YFXCWAFB3PW","atts_01GW2HT8D7XKRV2J3DKGHJSYMC","atts_01GW2HT8DAZEJ59BA9BT9F16PT","atts_01GW2HTTRK5Y1QFQ5KVFTPAK8R","atts_01GW2HTTRAMJY9WWK3YMSGGQJ8","atts_01GW2HTTR9MD2NBTY80FBRPGTM","atts_01GW2HTTR6EZKB6YQ3KQ5804PX","atts_01GW2HTTR4CVM3MMCKKFWEN76R","atts_01GW2HTTQEA3AXVT46Z9XTC56J","atts_01GW2HTTQDV3CYBPPJCWF1M4PF","atts_01GW2HTTQCJ2MR2FX1Q3ZXX99B","atts_01GW2HTTPHEJDSC4RJP7PNG689","atts_01GW2HTTMVGTGZV55XK0XRV95T","atts_01GW2HTTMTP3EV1ERBT0JCAATH","atts_01GW2HTTMQ8BM7H25YBW9ZD0GZ","atts_01GW2HT8EQR63DSQJE8X7VV956","atts_01GW2HTTMPYGRNR0B05MYQMWN6","atts_01GW2HT8EVCBV3QW63SHQQ3FHH","atts_01GW2HTTMJXMT8WQHDTJEH53AJ","atts_01GW2HTTM7BB73NCZTN8XRA3W6","atts_01GW2HT8EZBYDGVT915QP3FER8","atts_01GW2HTTM2JZJ5APQGH33112EQ","atts_01GW2HTTKY5HH8BMAGG7J8RVH0","atts_01GW2HT8F3PWATMYDP43TDEAAQ","atts_01GW2HT8F8ZHSCTW4423D52H1M","atts_01GW2HT8FDPECQ1HQ3RGE3J1J9","atts_01GW2HT8FHGRQ53EEPTF8C6BDA","atts_01GW2HTTKDD8RY14NX8F3V2X26","atts_01GW2HTTJQ2MYGESCHDWQXQKFH","atts_01GW2HTTJGV8TY8EB14KSTS359","atts_01GW2HTTJERG9TCVGV71RC89FT","atts_01GW2HT8FNCQXP5QTN98NHF4RE","atts_01GW2HT8H507C5T2GZ9QNBXWB0","atts_01GW2HTTJCKF52ZBR4MB2JQF3W","atts_01GW2HT8H7DNQ3YANNW786ED45","atts_01GW2HT8HA41XM7ZWDBEBS078F","atts_01GW2HTTJB4XNC6RD74KD8K6R4","atts_01GW2HTTJ90ME6QVGWNZ4PDE50","atts_01GW2HT8HCDHMDDAXDB4S0V42G","atts_01GW2HTTJ859R8N7Z0BAE4J9E4","atts_01GW2HT8HG4QSZVD6KS7YKQJMG","atts_01GW2HT8HJX5FK9JW2MT0MVB3W","atts_01GW2HT8HMMBJM9JGBQ2ABFHZ1","atts_01GW2HTTJ62D67Z8DPHY5J1DD6","atts_01GW2HT8K7D7226MJXJ01A7C6T","atts_01GW2HTTGZP8C11P5GR732SX47","atts_01GW2HTTGNFAW69DQHP1ZFXGV3","atts_01GW2HTTGK6SZ88R6XEC3BFT0Z","atts_01GW2HTTFRZ5EJFMRQMEB8HMF7","atts_01GW2HTTFQ8C9J0AFFBW2ZB2Z5","atts_01GW2HT8M0XC3Y05FCJX8NA6XK","atts_01GW2HTTF9E54AHS56BXCJATN2","atts_01GW2HTTEVFMFW1WPJJ5J3G3RP","atts_01GW2HTTERNYK8W03QK8JT48G1","atts_01GW2HTTED3HQY6R25WDTV118N","atts_01GW2HTTEB31CJ3PFE3NE92PDV","atts_01GW2HT8P6Q6KM57Y3E3PV5VE7","atts_01GW2HTTEA2JCQKBS5CQ50Q8ZV","atts_01GW2HTTDNBWVJ5MS2RNABV43D","atts_01GW2HTTDKSR157JJ2Y0SFA0RQ","atts_01GW2HTTDENPRTGVHAKKT0ERDA","atts_01GW2HTTBS6Y849F7M0HENM30X","atts_01GW2HTTBRZY7SHPN77DW98FFW","atts_01GW2HT8PCT55MYEDV0RZR1JYH","atts_01GW2HTTBPAM8SFG2931MQJC2C","atts_01GW2HT8PKAVEFKSNBM8QYK42J","atts_01GW2HTTBN3C2Z7EX91HPGS3YF","atts_01GW2HTTBGMVDBG48CKN0JKEN0","atts_01GW2HTTB03N7DZR022HQQR396","atts_01GW2HTTAGND5ZPK166DWS89VE","atts_01GW2HTTFMJ81F9H73JPBG4PH8","atts_01GW2HTT8HWAJXEASZ41J7N9YB","atts_01GW2HT8PSVH5F8NP2B5MAYEQ5","atts_01GW2HTT8G6VXZFSN6DKG51SKZ","atts_01GW2HTT8FVK4JJ4XCE06HHHBY","atts_01GW2HTT8EKC101408PFPWEBE1","atts_01GW2HTT8DMYXXH39BYQDQJP0N","atts_01GW2HTT79Z4TG78B92PBMWH9W","atts_01GW2HTT73FCSZPE6XS12Q7NNA","atts_01GW2HTT6JQ1TWBCBH1QQKJY7S","atts_01GW2HTT6H2EBYPFV4SB666DAN","atts_01GW2HTT6FX8AVFMHT5JBMCPK5","atts_01GW2HTT6E7N44GFXB9V3QPWKR","atts_01GW2HTT6CTXEMFBJJ42FKEXT7","atts_01GW2HTT6AGRZWBT8TEH93RN40","atts_01GW2HTT69T56KP7BFXND5VR1P","atts_01GW2HTT67WBYGTC1BAGMRSFYB","atts_01GW2HTT66R6JWDZX0NMD20AD3","atts_01GW2HT8PV0A8F7ZR76HTD0WNE","atts_01GW2HTQJ3A5KD6B3KN1M26NB8","atts_01GW2HTQJ2J7FFNR1TP65RFJZB","atts_01GW2HTQJ0YJAB2A3BZ4JQHF26","atts_01GW2HTQHVADWNHS0D633RZ056","atts_01GW2HT8Q6WGD9ZQYVW1ZGK2EZ","atts_01GW2HT8Q8AG8X3327CPR99CYP","atts_01GW2HTQHSBR1N7XK2KKCRRZG1","atts_01GW2HT8QT153390EXXSW9807M","atts_01GW2HTQHQ4652D4PTVYBFZW92","atts_01GW2HTQHNQBKTB16EN58ZZ7FG","atts_01GW2HTQGK815YADRJC0RPFK2Y","atts_01GW2HT8QYWK1DG3PC4KJ70FKQ","atts_01GW2HT8S2F13KN10Z0B89BPB6","atts_01GW2HT8SC65H2XA9F38BE3DW4","atts_01GW2HT8SREJPFYT3H8YP1EVEB","atts_01GW2HTQGAKT302K56Y1STTGBB","atts_01GW2HTQG1R036W6RSRS7TH5VX","atts_01GW2HT8T1FXFX5J5E570CNMMJ","atts_01GW2HTQFZDV9T4SB82TY4XT68","atts_01GW2HTQFXYMMMNRMQ7678RJZB","atts_01GW2HTQFT68BGFEZ6PEZXX3TB","atts_01GW2HTQF53NYHGP79F6Q3AYQ6","atts_01GW2HT8T5HC2S48R7VQ7GAXJH","atts_01GW2HTQF3HWHFM1T9K9BFY1ZN","atts_01GW2HTQF2ZYNYQ4FPRDVF48NC","atts_01GW2HTQF0AAV35VXQ7PVK94PX","atts_01GW2HTQDM26XE0MKCXYK4VJ61","atts_01GW2HT8T6AAZ89AA1K0TTTAW7","atts_01GW2HTQD31QSYYXSVTJBN8GYT","atts_01GW2HTQD2P8WYWGASETHHX08P","atts_01GW2HTQD1NWRNKNV645VXE9AV","atts_01GW2HT8TAYBMVYZZSJ35MWE61","atts_01GW2HTQD0K2ZQPTSNSRCAN1YS","atts_01GW2HTQCZYBG4FYRJ9FWH2S2J","atts_01GW2HTQCSPNMFAJ3K694Z2441","atts_01GW2HTQCNTCTQTSQQ84YWB8A4","atts_01GW2HT8TD3XD4VTWJ6N2M32H7","atts_01GW2HT8TG2RZZ65VTQ2GCVZ0J","atts_01GW2HTQBCW20CVVMFHBWW4Q61","atts_01GW2HTQAWEWDZQE3CKYMVHCPR","atts_01GW2HT8TM8MPEM52WQRCBMDN9","atts_01GW2HTQAVPACCGR6PG8N459B0","atts_01GW2HT8TP5SNSAYB3BRDA4HT0","atts_01GW2HTQAT9EYX6AK0KJGMM4BV","atts_01GW2HT8TSA5Y1C5YQ1G30KBMC","atts_01GW2HT8TV4CAZAB2DG0XT6942","atts_01GW2HT8TYSX03R6WH87BXP9ZF","atts_01GW2HT8V1JJQNT8W33V9M635D","atts_01GW2HT8XV5MSENRHAJRRGMCJP","atts_01GW2HTQARKDBZEVYHNW5V9242","atts_01GW2HTQA2Y03SMGFVBF76A5GC","atts_01GW2HTQ97M7Z4ZY7PMQHBSA4S","atts_01GW2HTQ7MJJR0J0TQPAJTPPCZ","atts_01GW2HT91BCCWMAC1487GTZX6B","atts_01GW2HTQ7H4WP3K7K4BGED1AZK","atts_01GW2HT91E7KYDQREFT12891G8","atts_01GW2HTQ7GRMMX95GWG37KDAGP","atts_01GW2HTQ7E2998SKC8GZHE2DB4","atts_01GW2HT91MHYT66ASGFCJH7S65","atts_01GW2HTQ67QNVS2MM9QNW6WMQG","atts_01GW2HTQ529SWP4S0T1QBY2TQ1","atts_01GW2HTQ4TF3JZMPXNZFQGEZ3J","atts_01GW2HTQ4532C79MFM0X9599CP","atts_01GW2HT9261XQYWP30PAXRMVEY","atts_01GW2HTQ3DDZMG8CAWDCWBPME1","atts_01GW2HTQ2D8CFTRSXME7AHYEZP","atts_01GW2HT93BQQST9XY06NRRZXTN","atts_01GW2HT93EQVHCSDFEWRRYNKYC","atts_01GW2HT93HHQ45D2TNZ2N7PV7H","atts_01GW2HTQ273MHX8EJ9TAVQXJMW","atts_01GW2HTQ26BRDWKQ3RJBFK54NH","atts_01GW2HTQ1SNJ6YM5SSM0EXVBN0","atts_01GW2HT93M8QVP3NM1D8H6H9GZ","atts_01GW2HTQ1QQ3QMWE0GF3ZVJAEC","atts_01GW2HTQ1PJEHY7HD8QYQ09HVZ","atts_01GW2HTQ1EZK2P07RGRDKFGZAY","atts_01GW2HT93PR3NBER91DV4FS951","atts_01GW2HTPZMWMTR3RDTXFRYEDQY","atts_01GW2HT93SSQK8QS8D6TY8A9Z7","atts_01GW2HT93V9BHAA7B2A530ZPTF","atts_01GW2HT9450G89J5TKGJ01HJHV","atts_01GW2HTPYXFC1G40AZ0N0CP6JN","atts_01GW2HTPYV0S9S8FBNA91YN6F3","atts_01GW2HTPYTFV4RCFYDC0RVC23C","atts_01GW2HTPY1JYEJJVSV1SEV1F35","atts_01GW2HT94ACP56K9X13RMWKFC5","atts_01GW2HTPY0RFHXQGSX7VK0K6VM","atts_01GW2HT94XQG192TW58DSBGEP2","atts_01GW2HTPXYJZGRABEH11Y9C5EA","atts_01GW2HT95HTD7A74H1T7PGJH7T","atts_01GW2HT95MP7HFMTGSSZ18C7CW","atts_01GW2HTPXWF5B31JN5WKJWK7QW","atts_01GW2HT95PRZGJ8DCB87MR9P0R","atts_01GW2HT967HM8KW3V7G2C4W3X7","atts_01GW2HTPXRC0Q0XXJYMCR9QJHP","atts_01GW2HTPXD203VB9B7DNCHT9TK","atts_01GW2HTPVPX96G4QRQ6BGTHC2W","atts_01GW2HTPVJ79D8KNC6QKDMMT54","atts_01GW2HTPVGXMNGYKNZHP0J4Z22","atts_01GW2HTPVE1X5MKJCGAMNFCTSC","atts_01GW2HTPVBPP6NC95Y3NF9ES1P","atts_01GW2HT97131FM8J9Q2HCERR94","atts_01GW2HTPV1GE7EZKKRK694MPP5","atts_01GW2HTPTGQWGX3GHE27FK3QKY","atts_01GW2HT9771A1ZN8RPY6RDTG7D","atts_01GW2HTPTDJTE82X9N2GXEJXTD","atts_01GW2HTPTCRD7K7217V09S5DDS","atts_01GW2HTPTB3RQ10Z7X3SRYTPMD","atts_01GW2HTPT9W7ZPSFQJX5ZNSW01","atts_01GW2HTPT84YTN2ZYPBRCWS4XC","atts_01GW2HT982G8FCC0NWXZX1WT5D","atts_01GW2HTPT48PYMJM2AYCN05TD0","atts_01GW2HTPSA6224GRXJ2SVY52P1","atts_01GW2HTPRCDX2DTYK4A2VR3NDB","atts_01GW2HT98K8R8G3DXVEWA9YAFQ","atts_01GW2HTPRA1TZESVEY7AD6HSSH","atts_01GW2HT98MVE8STTXV22FWRKN8","atts_01GW2HTPQZ3Y58EC7MXSPZTKS8","atts_01GW2HTPQV1SXWYSE516ETY531","atts_01GW2HTPQD578QK5357W3FV83P","atts_01GW2HTPQACESFW3JG66WSAS57","atts_01GW2HTPNYT5TBFS04WFXX2PW0","atts_01GW2HT98NCZT6TKAFDHEEBAT1","atts_01GW2HT98RH8JGJHR1WEQ2MP18","atts_01GW2HTPNX4KRPBF81YR1FEVXN","atts_01GW2HTPNJ4PZ4G3S7YTEFTXSM","atts_01GW2HT98Y37K0BR1KG2V8ZREP","atts_01GW2HTPNG193PQFSP7ZM9M49S","atts_01GW2HTPNEATHV1WH1W8VBHA64","atts_01GW2HTPN5SEXBWMYJZ084ZYYG","atts_01GW2HTPMMC6A55HZ0ZY7VSABM","atts_01GW2HTPM3F5W2NFWWGNVTRJ11","atts_01GW2HTPKYYS3KBB7NMKG0652A","atts_01GW2HTPKW8NT1HFSN95XQBSE6","atts_01GW2HTPKTGPYR4766CHVQKZ0V","atts_01GW2HTPKSEJXN66VKNTBKE7ZQ","atts_01GW2HTPKR8CVY70QWXCD9NARE","atts_01GW2HTPKQD0311BNRE8299ZEE","atts_01GW2HT997N8G3K8GH12Z2AZN2","atts_01GW2HTPJRVTD9D1JDF8SGCVPP","atts_01GW2HT999ZG8E86SZ7C3K8XYV","atts_01GW2HT99BM7X3E2WDQW516ZJH","atts_01GW2HT9AX1MG7W9CV4BA230V3","atts_01GW2HT9AY1E8QWN2S78C54MKF","atts_01GW2HTPJGASM0WC2XEY41WYA0","atts_01GW2HTPJDP10E944ANN79D9T1","atts_01GW2HT9B0ZVP7JC2VSZX7Y6TH","atts_01GW2HTPJ70G7JSM71KWHADVHW","atts_01GW2HTPGC49T9RWPCXXSM3FQR","atts_01GW2HTPGBRDM15WB0TQQMP15K","atts_01GW2HTPG9WZP0T9M5K1MK3EZW","atts_01GW2HTPG7NF9V4JXPX290PFRX","atts_01GW2HTPFYSRR4N8Q1KK3ECJ04","atts_01GW2HTPFXBZ8R518W26KKRQT0","atts_01GW2HTPFPZKDSRGC64JG1957N","atts_01GW2HT9B21HVNB0M13KXW99E9","atts_01GW2HTPEZQ3MBFWHHWQ63X92M","atts_01GW2HTPEYSGENB6ZXZS64B246","atts_01GW2HTPETXR1C3FPSW2715BWF","atts_01GW2HT9BZP69V2F8E108ZC5MS","atts_01GW2HT9CKWH56CBPWHFKFSWAG","atts_01GW2HTPES4NFQSR4D8SR6VGKW","atts_01GW2HT9CZVGG0B8KNF6AKN8M4","atts_01GW2HTPERRZZXD7NBHFJ4H7Y5","atts_01GW2HTPEQ63VZ94KJJDTWH9S1","atts_01GW2HT9DW0DMXSX5X51BNK9TG","atts_01GW2HTPE11RZGSCBZZS2F1D9S","atts_01GW2HT9E9YDMJBERZ0TCM9TKF","atts_01GW2HTPE0782ESMSNYWG907T2","atts_01GW2HT9EBRR1WXH7C4A5VZE8F","atts_01GW2HT9F29SAQ5XNN2Q9K4ZC0","atts_01GW2HT9FCP3N9GE0XX4JK8TC0","atts_01GW2HTPDVYW02QHNBK0QAZZ82","atts_01GW2HTPDKJA9JDKEPJQRZFHYP","atts_01GW2HT9FHDJG98PD82333SEV0","atts_01GW2HT9FKYRTJ0QZ2G84NZ33S","atts_01GW2HT9FVCK9A4Z5JTSGWE9AA","atts_01GW2HT9FX0208HHDMY338JK42","atts_01GW2HTPCY7JJPHVXSD6AMT8G7","atts_01GW2HT9HBK1PVJ89NPJK7F2AW","atts_01GW2HT9HEBCNXARPGPND4H7DN","atts_01GW2HTPB597MH686CHHG9AVGY","atts_01GW2HTPB4JWMZCDKKHQRWCG82","atts_01GW2HTPB32QZQ4KVNWJXWE7FD","atts_01GW2HT9HHM0C13Z96XZGKNWH3","atts_01GW2HTPARQTBH0M4GFJMVDDAW","atts_01GW2HTPAQKCAP1SGHN57NS8QB","atts_01GW2HT9HT6ATNQHJ6Z597TVJB","atts_01GW2HTPAP5AT89PEF784KQTWG","atts_01GW2HTPAM5E7P1MB1PA37967X","atts_01GW2HT9J3PT51WR5MJEEBRFA1","atts_01GW2HTPAKZPYWQBBKB4H3Y62D","atts_01GW2HTPADDWM8ZF0PAKAWM5PS","atts_01GW2HT9JSN1QR9M99Y7NDZ347","atts_01GW2HTPAC8F7A252RRZC3ZY74","atts_01GW2HTPAATBG0QF82F1F83E3K","atts_01GW2HTPA9ZSNAKT7Y0T2X0CMX","atts_01GW2HT9JV1FB5TZZNC18NZAGR","atts_01GW2HT9K8BH6Y5EKZEEWQSVM2","atts_01GW2HTPA83XJ0K5DER6Y29TPV","atts_01GW2HTPA662T7WGTE2R850070","atts_01GW2HT9KAECK3FB5ZYZZ4NW91","atts_01GW2HTPA03TS8TDJEZXXG6D90","atts_01GW2HTP9Z1JW5B4EJ1YE6BTQK","atts_01GW2HT9KGNECE3683EYNRJ9AF","atts_01GW2HTP9Z2HWJ2E3CV65ATQC3","atts_01GW2HT9KJQ1J4QMWYW3F8Y19A","atts_01GW2HT9KWNBSFK0W5HRQ6FZRG","atts_01GW2HT9KY4A0SHFXNPQHDDZDT","atts_01GW2HT9KZ55X1X135SZG3V1EK","atts_01GW2HTP9X5SWKTCH170F5BZWE","atts_01GW2HT9M42510V9N147CVABGD","atts_01GW2HTP9W304MY7RTVG8D4CEP","atts_01GW2HTP9C2G3XG8DSQ7ZFQF3W","atts_01GW2HTP98VHF6QDX0RSRD9JTP","atts_01GW2HTP96QJCAR9CG4ACAB7KN","atts_01GW2HTP94K448V4BJZV3M4FHP","atts_01GW2HT9M8T2T0PSAT2JNFCW40","atts_01GW2HT9MAQVSH4MFR319BV22R","atts_01GW2HTP773FSN3ES0PF07716G","atts_01GW2HTP6Q0PVKVQGQ6MDKWP1P","atts_01GW2HTP6EZEG6NPYY7M3W57A5","atts_01GW2HTP6B4K70FRBTY5KQBJZH","atts_01GW2HTP69XC2Y0NK5CRT0YGBS","atts_01GW2HTP5ZRRRVZ0FZGB84BXKH","atts_01GW2HTP5X0M6B98CD3NZYFWYG","atts_01GW2HTP5DMMVN2J77Q5WCSDZC","atts_01GW2HT9MWZ5NJR9RRFASRT2ZE","atts_01GW2HTP534E8FB28XF65AS7QE","atts_01GW2HTP51N92C65P5BN4C5QZV","atts_01GW2HTP3P03035B4N8DAMAEVJ","atts_01GW2HTP3HZQW1C5T6F1P1K2R6","atts_01GW2HTP34TWCZQ8NF2TQFYCXD","atts_01GW2HTP2XT4GYQAP158FZSXFN","atts_01GW2HT9QSEFED2DYR1XVZX6G4","atts_01GW2HTP1191JYTDCD7ZV6ERQM","atts_01GW2HTP0ZQJ6N24ZFF405JPP3","atts_01GW2HT9QW2TZE1T9EF7Q1NYPQ","atts_01GW2HT9R17941V9ZF07EJSZN5","atts_01GW2HT9RNPED524ME8HGMS225","atts_01GW2HT9V119AF2ZEBGFBG8Z5C","atts_01GW2HTP0YTXW7F4JRW7YMB6T4","atts_01GW2HTP0X3P08HZYEKFKX4XWW","atts_01GW2HTP0WZWED31T2H9JK5BEQ","atts_01GW2HTP0SGM5R7WB7J8TGVFQ8","atts_01GW2HT9W68TEZF8N1QGY8XZZM","atts_01GW2HTP0R9HR0A2Z7PCY4FVS4","atts_01GW2HTP0QBP6MYEQ1455F6PG2","atts_01GW2HT9W86TPGCX9BPF8C2T2Z","atts_01GW2HTP0PZW6QY07ZB2QJMVWG","atts_01GW2HT9XGYP6V1M5BTZ5R19DR","atts_01GW2HTP0NSD73Y7D1VPC70CA1","atts_01GW2HTP0M29P4HEZSJ754H6BG","atts_01GW2HTP0KFMVH20VX3NBSCWVB","atts_01GW2HT9Y3PZRYBSVZP3AJM9FF","atts_01GW2HTP0JZ61VRVWCRVS4B4DQ","atts_01GW2HTP0HM33DP80C3DT7YRSA","atts_01GW2HT9Y6PGG6VBQ3WTQCPBSD","atts_01GW2HT9Y841JKTYRCFKSQGYBT","atts_01GW2HTP0GA89BZ0KCJ7RDFK5T","atts_01GW2HT9YBMN87TF0SJW0J1QEP","atts_01GW2HTP0FEB7H5C8PSG9R7HAZ","atts_01GW2HTNZVD4QRDCMX51QNSJC2","atts_01GW2HTNZQ2591HJEJSF635PCD","atts_01GW2HTNYZMGFK6BRT3PC9R911","atts_01GW2HTNYSB69K21QPRMEHG2T1","atts_01GW2HTNWPEPPTK8BJHXN7SJJ4","atts_01GW2HTNW6D22CNGXDHS2YYERS","atts_01GW2HTNW5N2S1SWDTQRS8E6WE","atts_01GW2HTNW3GPAJX1PHQWQYBGJS","atts_01GW2HTNW1F8C5V5308WDXWBMS","atts_01GW2HT9YG13QBRSZK3K8G9NY7","atts_01GW2HTNVZRE73TKW8TE1VX3Z9","atts_01GW2HTNVYYWKSZYHWX88FDJJJ","atts_01GW2HTNVMAE380Z4XKYPP7BCE","atts_01GW2HTNVJ60J51BN2D3CJSB44","atts_01GW2HTNVGSRVRK5CR0J9ZQF5S","atts_01GW2HTNV5SY0SKT40CXMJ2JRF","atts_01GW2HTNV3YX4APKPFEMD0J3AH","atts_01GW2HTNV255477R0ZG6QC0QXC","atts_01GW2HTNV0GM7TJFE6REWATE52","atts_01GW2HT9ZMY5QSY12ADVVB0PG5","atts_01GW2HTNTPD2QQAZ5D0MJJQM2D","atts_01GW2HTNQR68GAGR1041ASMEHN","atts_01GW2HTNQMR7Y9M50NERW52VXG","atts_01GW2HTNQADN02MAF6RAZMXKPE","atts_01GW2HT9ZPHM0H6WNCH65CQ7MW","atts_01GW2HTNMZKRXFZZ7ED4NK0D05","atts_01GW2HTNMNMR9FR7PJ5HZA3GTX","atts_01GW2HTNEH18M10Q7GK0945HAM","atts_01GW2HTNEA0RSQR664FY8QHAXW","atts_01GW2HTNE8G89QRXG6G6QAY8MW","atts_01GW2HTNE63VRR8DN37RE7R1QM","atts_01GW2HT9ZYH34SCKNS1KV0M1W9","atts_01GW2HTA0V2519H2V24GQ457VN","atts_01GW2HTA0X27JYK28Z1B3FD840","atts_01GW2HTNDY4JEX2PM36VESH4ZA","atts_01GW2HTNDGNEK49WXSNP7BXDHM","atts_01GW2HTNDFJ1BJSGJKAFKMNH0Y","atts_01GW2HTNDECNMJK31VR5HP820Y","atts_01GW2HTND907XYEBZ17AX3Z0VE","atts_01GW2HTNCRAWWYFRVHAGZH29EY","atts_01GW2HTA16XQ4HDHD960CSR4M4","atts_01GW2HTA18XEKNFCD2R8TC68AG","atts_01GW2HTNCFCGGY8QB1WKMWEMMZ","atts_01GW2HTNASZ5FZ14VHNZQ4NA6Y","atts_01GW2HTA1E3H4RZV9E179XN69Y","atts_01GW2HTA1GRTBTAHABJH86NG4H","atts_01GW2HTA1H9AMFV2ZBH084PTD5","atts_01GW2HTA23XNHDWXTRXVJD94P2","atts_01GW2HTA2CBYCT6TANNCSJ3W6X","atts_01GW2HTA2EP3GRD9R776G3ZARF","atts_01GW2HTA2HF8VQVCSY8VB6AQYN","atts_01GW2HTA2K6YJ0HQ4S92MAKYK2","atts_01GW2HTA2P74R18R16AB50BJF0","atts_01GW2HTA2SYGKZ8EAY8DN1JDV5","atts_01GW2HTA2V091JHEFE0QS7SZ8H","atts_01GW2HTA3ZY7YADA2F64VX9RAQ","atts_01GW2HTA729AETAM9EVZARJS9V","atts_01GW2HTNARTJ2R5DKPX0YEBWF0","atts_01GW2HTA752NF19AG3EV36N1RQ","atts_01GW2HTA7D9F37WH7T91W7EC2T","atts_01GW2HTA8N8NNMC65V82488NM5","atts_01GW2HTNAPEKF0YSS761JVXPMY","atts_01GW2HTN87EPF7MGE5D8CF54MD","atts_01GW2HTA9C2CSH5EK9Z6QNYFM7","atts_01GW2HTA9M95FPZCNFERR2K9QY","atts_01GW2HTA9P4D8WKVNNN9J8B0KC","atts_01GW2HTA9RGYFE5SCRPWW1JAA5","atts_01GW2HTN6FK4ACVJ2FF71J6DQW","atts_01GW2HTA9TWBQ61RG0Y5DV5APN","atts_01GW2HTN6D6H1NBVAPA7WC38CK","atts_01GW2HTA9VQWJSXBTS1BBV7M07","atts_01GW2HTN6BVQDSCWT6NXP2R15T","atts_01GW2HTN697R6BK8DEGBQEM1YX","atts_01GW2HTN67850MYJM5B0TVHJ6B","atts_01GW2HTN61VQ7C7HPKQ4B3P8S6","atts_01GW2HTN5X3RZD7TKNK5SDA8BY","atts_01GW2HTN5WDQSDACFYK715KRHV","atts_01GW2HTN5V7Y0SAJHA9PXZAN50","atts_01GW2HTA9XN6DT0TT7DF7B9CGE","atts_01GW2HTN5SQFCWMVNS0XCDXS56","atts_01GW2HTN5KZW1KTZJEK6SNDDT9","atts_01GW2HTN4QV9J8E0FZ6R1PX3E5","atts_01GW2HTAA05T4A39E15VFM2G2M","atts_01GW2HTAC42EC12833DZBVXT78","atts_01GW2HTN3K41NCT46JV11XVJK8","atts_01GW2HTN3JW0KZ2H35WE486X8G","atts_01GW2HTN2D712GAC4AJ2F9W22B","atts_01GW2HTN1TTYWMPKEGJAGX52D1","atts_01GW2HTN1SY4YQZHPBSBXV21AV","atts_01GW2HTN1Q31XMSPBMX54HWEZ1","atts_01GW2HTN1EPBQA7VBMNCQ8KGTC","atts_01GW2HTAD6N281CVVVGBW8BCQ3","atts_01GW2HTN11HYDMG403Y98P7MDR","atts_01GW2HTN10ASEP0R0M2V5YXHNW","atts_01GW2HTAD8R9FNGVWMAW30JMJW","atts_01GW2HTADB90K4VCT3DDGVDR27","atts_01GW2HTN0XCTJSRV1ZT97NTXTB","atts_01GW2HTN0706VS2MJF7QSGJERC","atts_01GW2HTADNDCNCVCQ0CVVQMGA9","atts_01GW2HTN06BZDEJNCVFC4340VY","atts_01GW2HTADYMZGRB79ZJXRBYQ16","atts_01GW2HTN0021CTTMEPZNQ7FSN7","atts_01GW2HTAEJ7VRPKKJ4VXZ9D3CR","atts_01GW2HTAEPPCXKMJE90826STNX","atts_01GW2HTMZZ9PB2BV0H99TZ45KR","atts_01GW2HTAEQPTBGE5JSN63KGEME","atts_01GW2HTMZGY98HRK2WWRRJ5KZ5","atts_01GW2HTMZCTN9RNC8BAPT5N9PN","atts_01GW2HTAFPDY490XRWVKK3CS13","atts_01GW2HTMXKXXF87FA1HF13RBQ8","atts_01GW2HTAFQN2DG9BBK7724Y5RM","atts_01GW2HTAFWFGRD6QNEE5K355MC","atts_01GW2HTAFYES9X50321BHN79X2","atts_01GW2HTAGHQRVBWK0D43K22S8C","atts_01GW2HTAGQM2HD27XQVRBHYZ2Y","atts_01GW2HTAH72C8F1V5J84TFG9TW","atts_01GW2HTMXH517TZT571J6FSJVZ","atts_01GW2HTAHAXXYPYW44SWXX80CK","atts_01GW2HTMXB3DFK6ZQ6HPJHHY3P","atts_01GW2HTAN76Q0CR1SNZB2SYQGV","atts_01GW2HTMWT6DEFAHYTGT5XTAE6","atts_01GW2HTMVTTXBBSK28AKAW8WZZ","atts_01GW2HTMV3JGXDGFCBX0GKPKMG","atts_01GW2HTANTM52GB9RC0DJJARC1","atts_01GW2HTANXSDHH9PVX2A6TVRWW","atts_01GW2HTMV1Z48SQEGARS9FGF2N","atts_01GW2HTMTVYB4CAZ96JZ45T2V2","atts_01GW2HTMTSPDDC68EMBVCFQ1DY","atts_01GW2HTMTQ6CVEMYSY6PWKSPK6","atts_01GW2HTMTPQ95GDVRVSXQEERQ8","atts_01GW2HTMTMHP3K0M4WRQ2TKNME","atts_01GW2HTAP0RZZM0BME78HEF1GM","atts_01GW2HTMTJNHGH9XAJNJN6W3CJ","atts_01GW2HTMTHWY2W60GGGGMGBXE0","atts_01GW2HTAP2GV02B6DQ7HDSX2N4","atts_01GW2HTMS6A4YCFX4EXG7K2XA1","atts_01GW2HTMS4JB9G3RV9SJP4B23Z","atts_01GW2HTAP51DAN1B491H6ETGF5","atts_01GW2HTAPX058KQW1HRDR4PB7X","atts_01GW2HTAQ0YRFF14F5CHCY5NKS","atts_01GW2HTAQ2M3XY5ZXNYVTXWCP8","atts_01GW2HTAQ8NRKGW2QSNXY6W9DY","atts_01GW2HTAQAC4DY5XCP6R864MWA","atts_01GW2HTAQC62YD228T7JRAE5J5","atts_01GW2HTMS1K6W95X1RJY6HBGJD","atts_01GW2HTARM2FHJZ808Q1T4HS59","atts_01GW2HTMRZ483QWASRMW97W83E","atts_01GW2HTMRXQMNAFNCRXKNVBPWP","atts_01GW2HTMRWBMZMGK33EBG48BZB","atts_01GW2HTMRKX5K3AFD9CWE4YVN0","atts_01GW2HTMQVADMSBFKTFXXXBPZA","atts_01GW2HTMQMBA9E37WRPBZ52W4T","atts_01GW2HTMPX5GCM2FZ4DVTEMXA7","atts_01GW2HTARQ6TYZWSKFKQE5MV6A","atts_01GW2HTMPMY27S07NCVZ84S704","atts_01GW2HTMPGV45G78SW2CDK1EKV","atts_01GW2HTMPETZ22CR5HGE4Q3FBB","atts_01GW2HTMMZE97J63HGCSXK6D49","atts_01GW2HTAS5KA2JF0JVA117T7XZ","atts_01GW2HTMKZ8BQ771KZZ9EQTGFC","atts_01GW2HTMKRHBPMYBRSDSESVF41","atts_01GW2HTMKNR4SF1NWVCNRX73BS","atts_01GW2HTMK5MNSW3RC9MYY27PNE","atts_01GW2HTMK33C6481RPPSAZM6VG","atts_01GW2HTMK2K96VXEDSEDMYSNNA","atts_01GW2HTMK1G9ZVBGX69KX2MVH9","atts_01GW2HTASA0VZR39DBAP8RQ7SR","atts_01GW2HTASC4VZVRXJSFEDRSHH9","atts_01GW2HTMJKVSQZBY5J0T67V6NR","atts_01GW2HTMJEKKMRJFXSDJKJJCY0","atts_01GW2HTAT5Y9CM2HJAHS3RDTTZ","atts_01GW2HTAT85VFB4D5R5Q2SNJ9Z","atts_01GW2HTMJCVQ9P0QXVGY54J5WY","atts_01GW2HTATAG9CRHZ398430TD1S","atts_01GW2HTMJBPT2A8DMKSYKZWBDW","atts_01GW2HTAVSXXRCQW2CTN0RHZEG","atts_01GW2HTMJ9N9B6VT3KQ87JW390","atts_01GW2HTMGYH87SW3Q88S1JJH1M","atts_01GW2HTAVV5C8CNPKEK0JWW3XK","atts_01GW2HTMGWWYJ86KVGVPHFFPTQ","atts_01GW2HTMGVF32CMM7W0M6AKDWM","atts_01GW2HTMGS0C0QJYJ0JZBVBDMS","atts_01GW2HTAVYRYH2G7W9ZDC9873G","atts_01GW2HTMGK5RRDWAHQRMRTAK8P","atts_01GW2HTMGHMPV82VBSSE9QH6KJ","atts_01GW2HTMC2Z0MD6VV1HZ2H3V9F","atts_01GW2HTAW1233P3756NNN22PYG","atts_01GW2HTAW5351ES6VERYAQ1K5S","atts_01GW2HTAW72S7X4A8FMXG0YKAJ","atts_01GW2HTMC0986W7Z9DH1K5TBEH","atts_01GW2HTAW9M1NTK7T8VRJ5KNVZ","atts_01GW2HTMBYQKC3DS7ZMDY5V4QH","atts_01GW2HTAWXBX8GZ5ZPTA5B1C70","atts_01GW2HTMBW96EF2HHQGRQH6W79","atts_01GW2HTMBTWC0HYGZNG7P8DSWY","atts_01GW2HTMBGS13CBR475N3JP8KY","atts_01GW2HTAWYZPDH9B7JEAXANP1R","atts_01GW2HTMAF42V6VSZQDKHS4AD9","atts_01GW2HTAX3AYNPQNG2918VP3M4","atts_01GW2HTMAEHPPX6B2S31K1XQXS","atts_01GW2HTAX8EDSV1Y3GZP6WP42W","atts_01GW2HTMAC6VHSQ6VYJC73JY2S","atts_01GW2HTMA0JQ211C7GXMB66ZX1","atts_01GW2HTAX9DB7MSJBKC4CZAGBR","atts_01GW2HTM9ZBHJMV6SV2GG76EJ8","atts_01GW2HTM9YCVGDF14NZYAQTSTR","atts_01GW2HTM9X6JJYTF24R4J0FEGE","atts_01GW2HTM9W5647TVQ7120XTTFQ","atts_01GW2HTM9VSH0BN3EKE98VAJ5E","atts_01GW2HTAXAD7B41ZSVF5ZBGHAQ","atts_01GW2HTM9BDYA9TYSZ6MDG5Q62","atts_01GW2HTM931T9MXFPXN8T6XVDQ","atts_01GW2HTM91R30V4VCG2SRDD966","atts_01GW2HTAXBQN77ZTBZNAH81614","atts_01GW2HTAXC4WCR7TB41390MTFG","atts_01GW2HTM6VPW38B51J956EJQH8","atts_01GW2HTAXHFSGP7G2WF3W5S3T3","atts_01GW2HTM677M4D5XXFXM69NXHV","atts_01GW2HTM64AE3RQN97JHSZG7BH","atts_01GW2HTAXS53C2KVRJE3HFVHXV","atts_01GW2HTAXWNTF5BS8815T6AQXY","atts_01GW2HTM5XGJV8GHFR1P456N7D","atts_01GW2HTM5QNK149QVC474R29AT","atts_01GW2HTAYH9RA5VHTBQMXB2ERP","atts_01GW2HTM5NKA5MRF1F7X18Z3WY","atts_01GW2HTM5KWQSH9TC19JZENYC5","atts_01GW2HTAYVKVSBZN9R0F1WRWPK","atts_01GW2HTAYXTF8E4PD77QSX0KYH","atts_01GW2HTM4PPC9SK1ZNMXQ5KRA3","atts_01GW2HTM4NHAH423ENVW8G4DQS","atts_01GW2HTM4MYMC7535EMQNPR24W","atts_01GW2HTM4J9B4WE42CA6E0BXZR","atts_01GW2HTAZ4994KMX83NVNX51ER","atts_01GW2HTAZ8MCBHR511RMD2ZVZ8","atts_01GW2HTM4GPRQFJ3NAT6C65CN1","atts_01GW2HTAZKBKJ3Y46JEFBC7Z4M","atts_01GW2HTM4E2VS7QCVBH4PFNK29","atts_01GW2HTM4CJCAJ9NYP0GST24HT","atts_01GW2HTB0E8D5PF8FMGN2JG3S9","atts_01GW2HTESNMWK664AZ0W51WCRA","atts_01GW2HTBEV1ZS59ZGSYGBFPW64","atts_01GW2HTBWP16E40K1WY6JW3D0Q","atts_01GW2HT8XRZ5PR9ESPSNK2DDPP","atts_01GW2HTDZZJPYNAYJAYS394FVC","atts_01GW2HTE95PDGT9JKKFSFP399Z","atts_01GW2HTF7ZNEDKQASP6HJV0JWJ"] \ No newline at end of file diff --git a/packages/db/prisma/data-migrations/2024-01-31_fix-attr-supp-json/serialize.json b/packages/db/prisma/data-migrations/2024-01-31_fix-attr-supp-json/serialize.json new file mode 100644 index 0000000000..39de83a023 --- /dev/null +++ b/packages/db/prisma/data-migrations/2024-01-31_fix-attr-supp-json/serialize.json @@ -0,0 +1 @@ +["atts_01GW2HT85S4CKB5TD3Q7DYJPD6","atts_01GW2HT85XGBGQ2K5WNPQS6RK5","atts_01GW2HT86A395C1E96DFD8TFG4","atts_01GW2HT86F7QHR2RKV3MEJA8JF","atts_01GW2HT87HEND62AYA0VYV9B41","atts_01GW2HT87TXMWGY5YEY85FXCCK","atts_01GW2HT882EE65Z5Q07Q5K01MC","atts_01GW2HT88KPJBA8VE56MKQJDGA","atts_01GW2HT88N5G6DD4Q2KW7NPJZ8","atts_01GW2HT88T2Y7QHAZVDVNCWN8T","atts_01GW2HT88V96BHKH7T4VV6BARN","atts_01GW2HT88XZ59Y31JA1QZBCQXF","atts_01GW2HT892A440TMW6G97RZG2N","atts_01GW2HT8C4KZJ6TT85HC6X1KEV","atts_01GW2HT8AK06VR84QMJJZA8S6X","atts_01GW2HT8AYQQ0JWR1FR9FCHQD7","atts_01GW2HT8B78EF180ZPWXJ07857","atts_01GW2HT8BVP88PRWM5XGPHG856","atts_01GW2HT8C1J8AQAEHVGANCYRPB","atts_01GW2HT8C7JTQAK0QBDTC2VSXB","atts_01GW2HT8CB2G5DEQA76PMKJSCK","atts_01GW2HT8CD0NBEMWRFET03HGC5","atts_01GW2HT8CGWFQ9TW86JY889EZC","atts_01GW2HT8CJHV8EA0B0TK1ACGYM","atts_01GW2HT8DHEF4HQWJ1F2VM05Z0","atts_01GW2HT8DKJYWGJP0KQ1NSRXQ5","atts_01GW2HT8DP9GKR2B643B69A37R","atts_01GW2HT8DQNZCYHR1G45K5CY4R","atts_01GW2HT8DTKAKQTY6E8C4BX61Y","atts_01GW2HT8GDGFV6B1YT24BZ9DYV","atts_01GW2HT8GPM1V388G0EFX32F2N","atts_01GW2HT8GKTPFBJFCBK7CB2JYV","atts_01GW2HT8GS82JDS7F0P3EDVZSR","atts_01GW2HT8GVSY01B1TE41EE11TV","atts_01GW2HT8KBZYQXRQ89AY09HS1G","atts_01GW2HT8KH28G5XG7981CFF6DY","atts_01GW2HT8KRMTKXG1VT8J3DANNP","atts_01GW2HT8KMNVTAT1G7XRNKXBMP","atts_01GW2HT8KPZYAV89HEJ28HAAW7","atts_01GW2HT8KVKTJR4WXYQZVNN58G","atts_01GW2HT8KX6M9G7MQ1Y9KAA49J","atts_01GW2HT8M0QVGBEP4VGZ2CQ1W6","atts_01GW2HT8M2M9NKJB51W8CTDQ39","atts_01GW2HT8MZA243FK9A70965441","atts_01GW2HT8NREZ34R4HHPPWDSZDP","atts_01GW2HT8QSNYSXHMPH7JWTA1BF","atts_01GW2HT8QTCHCHHC33WRSBHH9W","atts_01GW2HT8R72ABE8K5BRYC284VN","atts_01GW2HT8RDCAB76XSZ973TTK8W","atts_01GW2HT8RGF74FCC2H98ATWKJ7","atts_01GW2HT8RJCHBYDD2SZJTNN1GW","atts_01GW2HT8RMHMVABYENCP2XX3EA","atts_01GW2HT8TCRHT47SF7MX0M33FM","atts_01GW2HT8RY7BH5VMQE8F3PD5YP","atts_01GW2HT8TEAD8KGNS0VB0T2KCP","atts_01GW2HT8TG4MHX55AHHEE6TQ2G","atts_01GW2HT8TJV8P0NS1C8D55SCJ8","atts_01GW2HT8TXRVSQVMRVDRY92NM9","atts_01GW2HT8V08JZ66HMRZNCDMFZA","atts_01GW2HT8V3HR8T1HHJMDM18XXC","atts_01GW2HT8WBQGC32DP67V89P2B9","atts_01GW2HT8WJXF8ZRKXNCV5E3BNW","atts_01GW2HT8WP34NWTSPXJ95EQQW1","atts_01GW2HT8WSEP9R9P5D4702ER2N","atts_01GW2HT8X7TMJKS6NB49VJ7WEB","atts_01GW2HT8XASZERMEMMGTQ7RAE0","atts_01GW2HT8XCBTQ2X4NMKYWGPFQ3","atts_01GW2HT8XKAPAS925BEMSB1A5Z","atts_01GW2HT8XRDP7VDW3V02ARSXQ3","atts_01GW2HT8XRZ5PR9ESPSNK2DDPP","atts_01GW2HT8XVH4MC9H3ATRPVSZR9","atts_01GW2HT8YXC178XJT6CVSEMN78","atts_01GW2HT94282Y9J6ZB4WDVJV1A","atts_01GW2HT90QFTQ5WQ8DSRKWCTBN","atts_01GW2HT90QH2VVT7QQBTG4F375","atts_01GW2HT90VM2W0BG986KF69EYW","atts_01GW2HT91M15ZR3F3J7DZDTSZG","atts_01GW2HT91T3F0X3RCST9QHNJCW","atts_01GW2HT91TM4RBEMR6VTNTER2Q","atts_01GW2HT91XMQJN705VPVS9J9EX","atts_01GW2HT9254BGENEQD79S0GMEJ","atts_01GW2HT92VT53EFE87PZN9VP0C","atts_01GW2HT9457CXAH2R4HV98CZYF","atts_01GW2HT947KG7C2Z2VZGMT60RX","atts_01GW2HT94KWJZNHA9BQWA5T084","atts_01GW2HT94AJM8ZR6J7YJ5G8E7S","atts_01GW2HT95HWK3C42RJMGJ32MYQ","atts_01GW2HT94DJTFZ278AVKVWRWWQ","atts_01GW2HT94KC1E3J6B28P0825GR","atts_01GW2HT957A6HCYCA4JH4WT19Z","atts_01GW2HT95BJ5ZWWGGYHC3N637S","atts_01GW2HT95MAE2N3YMM932NNJYJ","atts_01GW2HT95SD4WMVD8E0EWPEY84","atts_01GW2HT96BB51XTYZS8MQS14X4","atts_01GW2HT97AKWPQ4JEDZ4D7S93M","atts_01GW2HT97QG6ZYHMDAQCDDCXPZ","atts_01GW2HT97V9HHWK6JCP1A8Z49W","atts_01GW2HT9806M2C0RN2FVZ2Y7TT","atts_01GW2HT9822QEHBGGNGRFAT81J","atts_01GW2HT98V4PY10AQM1F2BEB6Q","atts_01GW2HT98XKBS0HJCNS619YSHT","atts_01GW2HT9952RG64JBW93W278FC","atts_01GW2HT9975PJ9B09BZDFQWJPA","atts_01GW2HT9C3XFAKBNZH9QDJK42R","atts_01GW2HT9B0E1FGYHA9T34TY8DB","atts_01GW2HT9B4VQ2JF9QDB5WDH71V","atts_01GW2HT9B469HCASAWQ538E8CJ","atts_01GW2HT9B9YZC7XYPQARJ6C09F","atts_01GW2HT9BB2ZTJWSRQKG1PMK5S","atts_01GW2HT9BD7NXVEAYPNP9ETFQJ","atts_01GW2HT9BERST0WWDEF8AR2QTJ","atts_01GW2HT9BEBDJEMERXEB8E0JHJ","atts_01GW2HT9BFSPBWSRNFVJN8T0WH","atts_01GW2HT9BF07127WPRF2DAXD7J","atts_01GW2HT9BGTRPCS6QD6SR5KYP8","atts_01GW2HT9C5HPMD0VNWNZH3YNC7","atts_01GW2HT9C7VDC4BYHBE79RS04F","atts_01GW2HT9C95NZ3VH0002ME4JB6","atts_01GW2HT9CBGC3PVJDR2R836XV9","atts_01GW2HT9CG5W9D7NGV3XAB0Y47","atts_01GW2HT9CH3FHFN8P2DRMNB52B","atts_01GW2HT9CZ3HC7634WH9Z3XK7C","atts_01GW2HT9DQHSKCSA8BG4KSGNNQ","atts_01GW2HT9E8WMTX783S934AME5N","atts_01GW2HT9F4BTH28ZQDRPH5PE16","atts_01GW2HT9F6H5R8TAQX1GWMDQRW","atts_01GW2HT9F8YBG3RW555BEJPX43","atts_01GW2HT9GJN1Y8VY33X288VVGM","atts_01GW2HT9GJMD1R3P5GC6MPYKPJ","atts_01GW2HT9GN36WD7TRWF3WCNK8G","atts_01GW2HT9GQCMM69FJCQZZNXZ2A","atts_01GW2HT9H8KB5Y3E7YBR8QMR0R","atts_01GW2HT9GZ07MFWFRDMKYVZA5K","atts_01GW2HT9H8YJ883SJB9401HSE8","atts_01GW2HT9H15A02V8FPDXAPPB9B","atts_01GW2HT9H2PXZD24WYCGYJZRGE","atts_01GW2HT9H4TBXEDVK359GYGS5N","atts_01GW2HT9H5S93D5GW5AM3A4JN6","atts_01GW2HT9HMBCFQB021JWEBN325","atts_01GW2HT9HMT0KGHTQNH4726Z75","atts_01GW2HT9HP6FVSADFQKC1KZHMK","atts_01GW2HT9JJPEXKBGZBMWM3J6AC","atts_01GW2HT9K19X6ZGQ7XAX342WSE","atts_01GW2HT9KPR4GKRTWPPVPBQFXR","atts_01GW2HT9KPYJZCYJ61D2P4688Q","atts_01GW2HT9KSJR3M6BYV3PAVW6BP","atts_01GW2HT9MN8W4N2H8RJ57DZNYK","atts_01GW2HT9N392QWC74F4XDP4E40","atts_01GW2HT9N3B6B4BGJ6XNV69BBW","atts_01GW2HT9PV3DQTKNZ0D2KY3E8F","atts_01GW2HT9NRANFGD78M97NERB50","atts_01GW2HT9NTZWTT3FKMQWP8PQVW","atts_01GW2HT9NXN4MP30XQGDX0HRY7","atts_01GW2HT9P0G6ZDW33PFXK3S2EX","atts_01GW2HT9PAQKHYY9WDWZFZ5P5D","atts_01GW2HT9PAN27YC53QY0VQCD1X","atts_01GW2HT9PF4R5T8N1755VZEFFP","atts_01GW2HT9PM8EJ26R8A8V5HR2EJ","atts_01GW2HT9PSC5HKF435TGH5SA6P","atts_01GW2HT9PYPP0BEC6BHMDFY2YC","atts_01GW2HT9Q17QVHPKKPM2SG0TMQ","atts_01GW2HT9Q45AMFTRGZTWB6YJ5C","atts_01GW2HT9QG9VRFDHDDCRCY062F","atts_01GW2HT9Q7JXY4P2DN65CJMFEV","atts_01GW2HT9QBR25975GHVEGGQWP5","atts_01GW2HT9QB7SGPKZBZJYNB71FZ","atts_01GW2HT9QGSHX9QCZ2Y5MJ50RC","atts_01GW2HT9TGH5WXGEJC25P5SCG0","atts_01GW2HT9SQC6RSPWPVK6290CYW","atts_01GW2HT9SY2VP1PQ4D6E84YR4A","atts_01GW2HT9T6J7JD4BAF37ES31JT","atts_01GW2HT9V3PSYT64C89EMQ6TW9","atts_01GW2HT9W3YRNJ43C7AMQ9ZQGH","atts_01GW2HT9W5GCTNWBZEMMH6TRVE","atts_01GW2HT9WC3RR5XHS8Y0XSCPST","atts_01GW2HT9WJPGNZRQNHSFME5PEP","atts_01GW2HT9WK5BKNT1YT7F73F3SN","atts_01GW2HT9WN03JAC56N3ARSWXKX","atts_01GW2HT9WRWBKH6EP6C6BJNMX2","atts_01GW2HT9XYDVJ7W3R78GG9RSRF","atts_01GW2HT9Y12N391JQXVZ6FV73E","atts_01GW2HT9Y4GDD3AGZGMEMNHAYG","atts_01GW2HT9Y4XR470YF0RCNKF7YD","atts_01GW2HT9ZGAYWED4CB96JJGHSM","atts_01GW2HT9ZGXXFY481FABTWJXWZ","atts_01GW2HTA04RFW5GFPGJMKC6Z83","atts_01GW2HTA0A7FGSKFTZTPMR4SX8","atts_01GW2HTA0HX8RYY35QE668CDE6","atts_01GW2HTA0KN0YPHDX22QCNNT83","atts_01GW2HTA16BEPMMG8Z4Q431K46","atts_01GW2HTA18Z9GKJCSTSVZK4SPH","atts_01GW2HTA1D6G230RZZEQW03B1E","atts_01GW2HTA1FJFH7CC44Q07H3R4S","atts_01GW2HTA1HJSSC26S03DAEDH12","atts_01GW2HTA1TWFJSAMAVJVP9RS98","atts_01GW2HTA2ZDT74C2F347F780VC","atts_01GW2HTA3YMM0KWS0PV7408YW4","atts_01GW2HTA324ZXCWM0BZ1NET6JH","atts_01GW2HTA344EE58PWNYN8Z6GBS","atts_01GW2HTA368THS23R50NVK3X52","atts_01GW2HTA38HV7VPC04FKZN5CAZ","atts_01GW2HTA3BXT41Z3ZQKP6HHJG7","atts_01GW2HTA3BMMD0GXE44DN1015R","atts_01GW2HTA3E21PDBY83R6H1TYK5","atts_01GW2HTA3G6MGDRET8P1B6FC9A","atts_01GW2HTA3J6F4QQQ5FXBN4RGG8","atts_01GW2HTA3SRYXGD2ERMB5VTXAG","atts_01GW2HTA3V5YEFKSPBQPWM1AP6","atts_01GW2HTA3V7EDAXX4GNNZKANF0","atts_01GW2HTA3Z03M7W5GNJFCGZPD0","atts_01GW2HTA423B35WA9M9HVTCPYS","atts_01GW2HTA43FKQ3E7M2R1PD8S2H","atts_01GW2HTA43F3A00QBRZCPNGA5F","atts_01GW2HTA45PMQ6WHC1R729P1WF","atts_01GW2HTA45PMD1TD3KD2H52Y0D","atts_01GW2HTA47SB5SRXDVQDGFV8DQ","atts_01GW2HTA47DS92WX6ES5NX6GFR","atts_01GW2HTA4AQ2Q8564Z6NVHG16V","atts_01GW2HTA4KM94WF7H7YBMCGAX1","atts_01GW2HTA4DF69YVV36DPJQMDJ2","atts_01GW2HTA4E598M76B5DX88E2QC","atts_01GW2HTA4EVDATQCXDMZG1VPHR","atts_01GW2HTA4HXTX1H377MZE4ZGZ8","atts_01GW2HTA4NAPS21R07MTTWADJJ","atts_01GW2HTA4NQDP30BDD0K4EEZYF","atts_01GW2HTA4R0RMZFFR0TP1RBPB4","atts_01GW2HTA4TTQKMK4WHSYAYXFSV","atts_01GW2HTA4W7ZF5VHJZZJDRN05J","atts_01GW2HTA4Y2S45VMN73N7BCT79","atts_01GW2HTA4Z0M3XG2VFTD0VX7VS","atts_01GW2HTA51PYMAWN59N447R9C0","atts_01GW2HTA537FXE9QB5273SV8J8","atts_01GW2HTA55N6QZSXXKPEWEWG29","atts_01GW2HTA55X3QHJBJAT5PDMA7T","atts_01GW2HTA5675HRX2BHGFG09HA6","atts_01GW2HTA5CQDVTEDVXV7J43TRB","atts_01GW2HTA5E3R5EKJQT4QSCQ9GP","atts_01GW2HTA5KVTV91FTZG88PQJ8E","atts_01GW2HTA5N5BRDH3HEJWXVSV9C","atts_01GW2HTA5R5ZSZDH3ZCAEWTQMX","atts_01GW2HTA5SHK04J3NZ7S6G3RQE","atts_01GW2HTA63R2W8VXFDX7SANK7T","atts_01GW2HTA6YXWH2VY4GTGVW5T9X","atts_01GW2HTA711X5JRFXG7RMPM3XZ","atts_01GW2HTA74HMJN9ZCXC7N1N45J","atts_01GW2HTA8SMF9CXBYD145D7RE3","atts_01GW2HTA8X4P4VNCWQV842RFP2","atts_01GW2HTA937S9ED2B9ADPFNHC1","atts_01GW2HTA9A1S5NPX92PHY2NPS5","atts_01GW2HTA9G5HE8YPDKJ5AV05MC","atts_01GW2HTA9W1NNXHGW8E3MNAZWS","atts_01GW2HTABYHPXW7RK8TS7FPK63","atts_01GW2HTAC1SKHEWE5D3KH9GTJ0","atts_01GW2HTAC6GY0Q5W9NCVC6JRGW","atts_01GW2HTACEJ7XYSY74CJV9C9BT","atts_01GW2HTACET2VQ8X4ZQVZ1RHHQ","atts_01GW2HTACR2GYH4BG5E0HE8WE5","atts_01GW2HTACSZMN75F65PFRAMSQJ","atts_01GW2HTACWFPXD12GX8CCQAK6G","atts_01GW2HTACYRYXGESRFGHWS9942","atts_01GW2HTAD06SVGXH2XBBTW1WT0","atts_01GW2HTAEMH43E9K1FA10D3S8D","atts_01GW2HTAF6XN72G950AZ9Z09JP","atts_01GW2HTAG6BV47NDV5NHDPMJW2","atts_01GW2HTAGSD89DBPE6H53MKQ18","atts_01GW2HTAJPWP4V5ZGN06GDP0KC","atts_01GW2HTAJSB510K15M98FBT90N","atts_01GW2HTAMK59T0C3QNC1RXZYRD","atts_01GW2HTAMN6YJX2RW0251RBD4F","atts_01GW2HTAPCJ9BNJFA86QA73VG0","atts_01GW2HTAPFF481RQ9V0978MTWW","atts_01GW2HTAPWECZN2AHTFNSR8TVR","atts_01GW2HTAQ0GRM19XVXJEGYX4RW","atts_01GW2HTAR13WH59DMGV1GM6ZH9","atts_01GW2HTARBCK6KEKTV9PX9DEY1","atts_01GW2HTAR83P9BSC44XPJPNGBG","atts_01GW2HTARW952JJ9YS45TMYSEF","atts_01GW2HTAS8K07DE12PF6YBY92D","atts_01GW2HTASEX7HX5XJ897C094VN","atts_01GW2HTASNN9H1VPNT8YB25VXJ","atts_01GW2HTASZ4ZYR7GC0QC8SR16T","atts_01GW2HTAVHBGBYCR0BZQKPY7X1","atts_01GW2HTAZ6MWK6EA1YTK6YA510","atts_01GW2HTB124X4909V9HGEKPD36","atts_01GW2HTAZK8FSB7SBB0YBA0W7F","atts_01GW2HTAZMPS6G6EM05DQYR17P","atts_01GW2HTAZNZ522YY9Y82NTT9RV","atts_01GW2HTAZX7X2ES73X6EP1E6M4","atts_01GW2HTB01XT57TQH1Q93T5EH8","atts_01GW2HTB1YNXSBETAY3NZ4S5DD","atts_01GW2HTB1ZP9D96KRJ9W4XR9YA","atts_01GW2HTB27APYRTB5HDEKDNBZ5","atts_01GW2HTB4PMDHTNMHT1NBXNECK","atts_01GW2HTB59GPV3ZEXF7EQVHTMY","atts_01GW2HTB68W60AY59CVR248S6N","atts_01GW2HTB8TR8V80VS4620DGM31","atts_01GW2HTBA5EW3W28ZWKT0NNX56","atts_01GW2HTBBPH2K57KCY3RHD22VQ","atts_01GW2HTBCC60CHM024ZPCQ7ENM","atts_01GW2HTBCNSNN99NKZA7TC8817","atts_01GW2HTBCPHMDW7RA754E9G3YH","atts_01GW2HTBCR1K423HSPH96A5Z8T","atts_01GW2HTBCT8N6WTYYR2KASPZTA","atts_01GW2HTBEV1ZS59ZGSYGBFPW64","atts_01GW2HTBDYD6GVREPZ6YJYABAP","atts_01GW2HTBE04E9G4F383FNRX8B3","atts_01GW2HTBE5MSQYD99ZQ6JHQP6J","atts_01GW2HTBE7J2GSG3R3DZRWPH67","atts_01GW2HTBE92B9XXKMSPH886R8B","atts_01GW2HTBEAP33CGQFVJ8JMYBYQ","atts_01GW2HTBECA8E94V5JYSWAJT8J","atts_01GW2HTBFA91895J0FG8V157GE","atts_01GW2HTBFQBVR30ARNXBHYR0QE","atts_01GW2HTBGVAJDRF9YP9RKGYDYN","atts_01GW2HTBFVR8X02JJRM3ZZYWNF","atts_01GW2HTBGATM9N1NTYH0SP6Q42","atts_01GW2HTBGC9RKTKXWKDG0GAFKJ","atts_01GW2HTBGJTEQQY35ZEYVAYE59","atts_01GW2HTBGMBZHAWT442TGNFENX","atts_01GW2HTBGPEAX025K2TJFY5S9Q","atts_01GW2HTBGS56NSX74G2JHZY0WH","atts_01GW2HTBHGWFFZF960FHANAZSE","atts_01GW2HTBHSFQT2DVGYVABEP5T8","atts_01GW2HTBJBRQD6AB8Q9DJNY529","atts_01GW2HTBJE1W4WHDMRYCXV4X7B","atts_01GW2HTBJHJYNBP02TR82V2MXD","atts_01GW2HTBKFN9457MGMFGZY7F7V","atts_01GW2HTBJM2R3YE68CMTHJNWB9","atts_01GW2HTBJSV6WQ3B2XVJGCKB97","atts_01GW2HTBJWREAXAJ1DXSQ2242J","atts_01GW2HTBK3KW04P7W5HZV6VFP9","atts_01GW2HTBMQF5PDMQTMH7Z44ZRH","atts_01GW2HTBQ25RFJD582MP870RJM","atts_01GW2HTBQ4CDKXTSGTM2660NNZ","atts_01GW2HTBQ5SZ0YAB59RF0J3DRD","atts_01GW2HTBQ7WTV4TFGX2F84BPAZ","atts_01GW2HTBQ9W73PKADB722VNE6K","atts_01GW2HTBRE4XHGYSQMHM2AB18B","atts_01GW2HTBS0CEC5A579G25RFCWM","atts_01GW2HTBVGMGG1DG02Q9091DDR","atts_01GW2HTBWP16E40K1WY6JW3D0Q","atts_01GW2HTBX1XAPWN6X55PMZS6VT","atts_01GW2HTC096Y5NEP4BKRANRH38","atts_01GW2HTC0B4N74X3KH4G72JVSH","atts_01GW2HTC1YPDC2AKGPMN7M42D7","atts_01GW2HTC21TDWZKAP5T7FPXT68","atts_01GW2HTC22G8WVEEAJMPAMQ35W","atts_01GW2HTC24BBSVV4G62VDWGBNC","atts_01GW2HTC3Z7PHWD9109F73XKC3","atts_01GW2HTC483W18K8NN60F02V9J","atts_01GW2HTC4ADSZ6PZBAAWW5E2R0","atts_01GW2HTC511S24QBV42M1P5CBV","atts_01GW2HTC67YBEAMW7TCSAQ5NM6","atts_01GW2HTC67V398VJTQAFKNGRJW","atts_01GW2HTC8775G10S7MN4D96NZZ","atts_01GW2HTC943Q4SCAVQYFSWQQP0","atts_01GW2HTC96BE82WK5DFARM77VH","atts_01GW2HTCBZZ7FPSKSKT00315WK","atts_01GW2HTCBM7MAE6NA3HKM6Q01K","atts_01GW2HTCBX736VDJ6MQ08EH3RA","atts_01GW2HTCFV82PNKVPEYZX405BN","atts_01GW2HTCFXGCJ2GVP1WEBSD3KD","atts_01GW2HTCG36QQC6BJ0N4GK1V90","atts_01GW2HTCH59D5GSAGQRVTY6YHV","atts_01GW2HTCH7RMYFGQWZ88008HNW","atts_01GW2HTCH9WY0YG66TDWQXDZ45","atts_01GW2HTCHD4V58JPMV8X7PYRBH","atts_01GW2HTCNVFQ4PBV7N62GMYXVG","atts_01GW2HTCNWDX9NE4QV1W9FM1GQ","atts_01GW2HTCNY5KZQ6BZVDN6BY9HN","atts_01GW2HTCNZCX4FD2XF559B4ZRW","atts_01GW2HTCPS863B5NG6KF02MCK9","atts_01GW2HTCPFJP2ZYP32NZMVTS8M","atts_01GW2HTCPKT190QTTTA7AAQDRE","atts_01GW2HTCPK1CS9ED842HVVDQNP","atts_01GW2HTCPQPAGDPRP1CQ156WHR","atts_01GW2HTCPYDSMBR9E2B92BM0SB","atts_01GW2HTCQ8FPY7K96DZCNP6KVW","atts_01GW2HTCQFR4J2T0PNVYYWRW0Y","atts_01GW2HTCSWYJ78TM2H9VZ4GA65","atts_01GW2HTCSZYKZBD9WAG01XPH20","atts_01GW2HTCT0DWA6BQTNMNMCE22X","atts_01GW2HTCT3KSTMRJWNADH1X0RT","atts_01GW2HTCT62PW49H9PBWV3P36B","atts_01GW2HTCTA9VKKRTDDAMECG0DV","atts_01GW2HTCTDGJH1VFWCD4V7DKDD","atts_01GW2HTCTFMAWARAV9C43JC24P","atts_01GW2HTCTHPQJWWYS2JDGXS6CM","atts_01GW2HTCTKA3Y7G2KE2PW94GPD","atts_01GW2HTCW3FTK6J87RA5ZM2H3B","atts_01GW2HTCW4SQ6SMAWCPF4DJPB8","atts_01GW2HTCW7P3XTYRH54Z9E10W5","atts_01GW2HTCWAFXW27M4RKXKHR1XY","atts_01GW2HTCWB0H7E6J8WYJGBYP84","atts_01GW2HTCWBWH78FVTM8E664QHY","atts_01GW2HTCWCB6YACVNK3PSE2A4K","atts_01GW2HTCWTEX7HTBX93JXKMWVB","atts_01GW2HTCWWDWQJM1BDVWFWPB55","atts_01GW2HTCWXX468PQTE1EZET0XG","atts_01GW2HTCXRYZM5Q3S90WP4HRWM","atts_01GW2HTCX2QMED0CV95VQQFK01","atts_01GW2HTCX3YSZ8A8ANHNT74P9Z","atts_01GW2HTCX5RTX4JT8PDNJAJPZ3","atts_01GW2HTCX6EHN5QMYCCEWEW4TX","atts_01GW2HTCX8GF5769QWTQDYQFE9","atts_01GW2HTCX9J9P5BS4PZRBYCG6N","atts_01GW2HTCXD5XATWVKF1TFHX2QT","atts_01GW2HTCXFQT5A456NY859CEFV","atts_01GW2HTCXMHZRVWGQFTCDGT88R","atts_01GW2HTCXP25XRS79QETEGG0DQ","atts_01GW2HTCY2YYBDC65JNDJD1DKG","atts_01GW2HTCYTR6AT8MW0C920SHBK","atts_01GW2HTD0MFGQDPMAZSKEJBFY0","atts_01GW2HTD0NR6C20XK4NQ6H8KH8","atts_01GW2HTD0QFH84H9RYYEW4378R","atts_01GW2HTD0WK48N2DKS9KA2RFTF","atts_01GW2HTD10S7XG59DT19AZYCPH","atts_01GW2HTD110REQJG43BGNTNPQ7","atts_01GW2HTD12CZ7TW8AZZB368M88","atts_01GW2HTD1443ZRAS091T8ZME3J","atts_01GW2HTD152769NF702KMP1YNM","atts_01GW2HTD16NS62ZDK7GXMR7BPM","atts_01GW2HTD186AP6J18Z4RFMJKKE","atts_01GW2HTD1BD5DHWWR7P0000NQ4","atts_01GW2HTD3588EWH73MP3ZTW2EX","atts_01GW2HTD3RRP3NH7HPH8J7MZSN","atts_01GW2HTD3T0KTRJKMN86BFMJ3Y","atts_01GW2HTD3T7X1NT7GANRZ2JX36","atts_01GW2HTD4573PSTVT4VAJJTMZS","atts_01GW2HTD46MS41GBRB9XC08J4N","atts_01GW2HTD4GBHGQGYJ1BRJSCBVG","atts_01GW2HTD4M0DZPJJ63YR9QWE8X","atts_01GW2HTD7C68DZ2KJA2M6GBM50","atts_01GW2HTD8BJHWCY9PJ9CKZRMCB","atts_01GW2HTD8FE6SX749FJM64TH3R","atts_01GW2HTD9V46AV4Z46QF8SFN78","atts_01GW2HTD8TVQANSF2RVSRDTHHX","atts_01GW2HTD8WJXDM2W656ZARC6JN","atts_01GW2HTD8YKG960H0HEFB3956V","atts_01GW2HTD9HJHDA88WHSSPY97DR","atts_01GW2HTD9KQ4S0R5S74PYG2ZBY","atts_01GW2HTD9X2HTSW4GYQK8SMKNC","atts_01GW2HTDAR95DN4DT2KNK3TVM8","atts_01GW2HTDB54BRBJ1B9M4AVCX2J","atts_01GW2HTDC2GDHMJTWK50EH06EV","atts_01GW2HTDC862WB93K8NDYDENSF","atts_01GW2HTDCM0QMH318SD108NC29","atts_01GW2HTDCYG1VZJ0CZ51GSVP3C","atts_01GW2HTDD20NTSV9T15DZBA7X5","atts_01GW2HTDD37WEC00YKXTE2CY9N","atts_01GW2HTDD5B1CZQ1XY94S83NXZ","atts_01GW2HTDD8CNGWBQ9KBSX44SHR","atts_01GW2HTDDTJYMXA6Q6PF09DGG8","atts_01GW2HTDFFN9ZT3FPHJVHAT1V9","atts_01GW2HTDHHGHJNZQWQXMSTRVM8","atts_01GW2HTDHW898D4TQX6ZWJYXPD","atts_01GW2HTDHKFGFNST58A40D13TW","atts_01GW2HTDHKYZRSQWTFQNCKBNYE","atts_01GW2HTDHN1E7J3A2JCDSJ4549","atts_01GW2HTDHQ7XKHF0F0GBZBJHK7","atts_01GW2HTDJD34KG60QJGBSCAH5X","atts_01GW2HTDJG2GNSS1SX69SPX801","atts_01GW2HTDJP6ECP44Q01QPKRS5X","atts_01GW2HTDJS1GX5M9S0ETGVPQAY","atts_01GW2HTDJZQBJZDD1J10WJ4JFG","atts_01GW2HTDK587ZFSXF8EX3Q5KBW","atts_01GW2HTDK7YVJHZE3GKKXV54AA","atts_01GW2HTDKFPX94WVBEP6FB305K","atts_01GW2HTDKHMFQ1DX4JWFGBC2PF","atts_01GW2HTDKKFQXAD00PZN385ANK","atts_01GW2HTDKNWCKG7MDX9NMB47M8","atts_01GW2HTDZZJPYNAYJAYS394FVC","atts_01GW2HTDKRJDA9326HKPCVNQDC","atts_01GW2HTDNFF2Z5G6101VDH3GPD","atts_01GW2HTDNG8GZT2FM9XX9Z15B2","atts_01GW2HTDNJ6WHPE5TDECY2Q550","atts_01GW2HTDNM2WRB73WKZ7162PD2","atts_01GW2HTDNPNREB9C6Z9EHBDSRK","atts_01GW2HTDNRSHWJV9PZDH6BADQV","atts_01GW2HTDNTTJP1XVJ2G3AC47GJ","atts_01GW2HTDNVX2HSN1N6FRQX2VVM","atts_01GW2HTDNWB0Y1776ZWH8Z58TG","atts_01GW2HTDPD2JC46B7N9207B6MS","atts_01GW2HTDPSZ5BY80MVHAH6Z43R","atts_01GW2HTDPXYN4KHENX43WASCAY","atts_01GW2HTDQMWE8YH0JAVBRZ7795","atts_01GW2HTDQQK3A1FYBSGBWDKC05","atts_01GW2HTDQTVQMQCPGMGKFXQ3BS","atts_01GW2HTDSP84BY2XH82Y56YCHC","atts_01GW2HTDSS7H37GWRQ919GG3MC","atts_01GW2HTDSV9WXB5RQA5E2V2NWE","atts_01GW2HTDSYB8B1KWNJGAVGPGBN","atts_01GW2HTDT1894N4D849HXC535Y","atts_01GW2HTDT4ZNZE9EFWPVWK5CHV","atts_01GW2HTDTJ4TM7JAMBDJ8SCF56","atts_01GW2HTDV4YXAG1VPEY8J3PA8S","atts_01GW2HTDV71MTJ8P7PHEY0EFZG","atts_01GW2HTDVT82B0X809G42Q5T28","atts_01GW2HTDVT5YSMX8Q3C2RNMX33","atts_01GW2HTDW9GNE1HXC1KXP0M8XN","atts_01GW2HTDWWA6CD0PZ9AVKD43JE","atts_01GW2HTDYFNQW3JDXGZ3X9K1VF","atts_01GW2HTDYNPR7005NW82N20MS0","atts_01GW2HTDYWPPVSTW4F757FB2WH","atts_01GW2HTE0SY2JHX3GB99VMC1YM","atts_01GW2HTE1N3ZV6650HJ68QZYGX","atts_01GW2HTE1QTDY8HVVP9M7B1TFJ","atts_01GW2HTE25N9NKFSX7MV2N95GT","atts_01GW2HTE284NQ0ZD2SWZ80EHVF","atts_01GW2HTE2DH0ZNHHTWQC8VY2C4","atts_01GW2HTE2GF62X9Q35FDH7TAQC","atts_01GW2HTE2MAKF3PA1VVV115PH7","atts_01GW2HTE2QK72Z2E5GERZGAY1P","atts_01GW2HTE2VC8XKK7TJH2XJF5YC","atts_01GW2HTE2ZZJMEBSYYMSQTZQFJ","atts_01GW2HTE33RV3TPAW7JW9TM13E","atts_01GW2HTE35MN2E9BTM1D1QNQZN","atts_01GW2HTE39SXM42CKP1E9YPJ69","atts_01GW2HTE3CC5K63P0E78TW24A5","atts_01GW2HTE4Y6QPSFQTCMDSG0RCY","atts_01GW2HTE5B889A2FXHS6BJTFH6","atts_01GW2HTE5RS3D6FSXWH78KFVKV","atts_01GW2HTE5THWJ8R5ZBHW6QMG7H","atts_01GW2HTE65NNBW8PAET09MK1PE","atts_01GW2HTE6NZS0DY3CK6CSJG57W","atts_01GW2HTE6RGN349FRHXCFCP57H","atts_01GW2HTE7V4YPDTXY4RZ9GEX9X","atts_01GW2HTE87NT1V51SKKRZ3X97A","atts_01GW2HTED77QVDZ8NZH15P2Q73","atts_01GW2HTE95PDGT9JKKFSFP399Z","atts_01GW2HTE99Y0XMZ9M3ZNVCYKM8","atts_01GW2HTE9A6SH0S3PA9NNNV5F1","atts_01GW2HTEB64TBRCN3ZQ96JY348","atts_01GW2HTEAQ976AVBZHJX4REQXK","atts_01GW2HTEAST478Y9JKYS19HPK2","atts_01GW2HTEB97THA8909GW20NQJQ","atts_01GW2HTEBS82SAGF33YDPX4HDK","atts_01GW2HTECGKZY7V81THV19B7TP","atts_01GW2HTED277ZPA8P1N1QRPMGJ","atts_01GW2HTECJ5VF4H6RFY084CYW9","atts_01GW2HTECNMXFBGV22R0SDDD7J","atts_01GW2HTECT779QYPQ1EANDKNPQ","atts_01GW2HTED1CHXXMFY8C22HH0FG","atts_01GW2HTED20ZQJ8TB4ZA3MDRRE","atts_01GW2HTEDVHTF2B8DCN2YTYEC9","atts_01GW2HTEE8ND355P3W94Y81CK2","atts_01GW2HTEEFY5FG1JB1FJQ0ZRDH","atts_01GW2HTEE9M5E0S5K25E9H9YCJ","atts_01GW2HTEEA4SFZT7XHBB70BC1J","atts_01GW2HTEEB7MEYPY1HQRM2Y63Q","atts_01GW2HTEEC5XKFCYCR5QK85WYH","atts_01GW2HTEEC635F10FS8AZ9RQ58","atts_01GW2HTEEDMBAGC7J479NGJYHE","atts_01GW2HTEEEEZZTYGAJ0VHMFSS4","atts_01GW2HTEEERGQXW0X5VTW5TK7W","atts_01GW2HTEFNB7PE6M9Y2R6X9S3B","atts_01GW2HTEEQC6XSBGGP8V22V41D","atts_01GW2HTEEX1YRMV269MCTJ8G2Z","atts_01GW2HTEF0S416P7PR77FRZPMK","atts_01GW2HTEF31ANBF8ETQ0SWSZ58","atts_01GW2HTEF6V3XA3Y262D1DSRY5","atts_01GW2HTEFNT7MMMZA9WNMZ66GN","atts_01GW2HTEFAFPRNGZEXB34TXKEG","atts_01GW2HTEFH4W6FGNEAVCAPH3CA","atts_01GW2HTEFHCHTE3CK7Q8G6WYZT","atts_01GW2HTEJC7FJ7VJQDY64RHE42","atts_01GW2HTEKKEYW0GAWZ4NW9S3G1","atts_01GW2HTEKK24AE67RYS77F75WK","atts_01GW2HTEKNZM9BVPS8EAHAEYWG","atts_01GW2HTEKNRQCRC280352AD498","atts_01GW2HTEKQRA8N985VYA4ZG9A7","atts_01GW2HTEKQP4GY6TJHMZX8YM23","atts_01GW2HTEKWTW3Z7S67VEHJRX5Q","atts_01GW2HTEM0VZFTZ66FRQ7MGYJ2","atts_01GW2HTEM0MJVMDYSDH2KCQZR3","atts_01GW2HTEM70JZ5GFEYMMQBMWFH","atts_01GW2HTEMZCAN60MQNA1F2MQ8R","atts_01GW2HTEN4YC8QDN3S8B7JT866","atts_01GW2HTEN1A7A6391MHZD7P28N","atts_01GW2HTEN2WRYN70Y3DMBTGFWX","atts_01GW2HTEN6M9ANW8S1GR9W98H7","atts_01GW2HTEN8PBX7KGC5QCAG1B17","atts_01GW2HTENA3QK4KSSJR4XC7NN1","atts_01GW2HTENBZW9BRWXTQP2YT074","atts_01GW2HTEND1V0T9GNPJGT2J0G9","atts_01GW2HTEP5CWXADC973XKYHHAT","atts_01GW2HTEP6HWAYS1SPRNCH08GD","atts_01GW2HTEPCF060GJY0C6F646FJ","atts_01GW2HTESNMWK664AZ0W51WCRA","atts_01GW2HTEQ4J64KNAC1M40TKR23","atts_01GW2HTEQ6WCXJB3YBYCH31GHK","atts_01GW2HTEQ8WEMGCHJZ2R3BDYMJ","atts_01GW2HTEQ8NW6VMY331W1W8Y0E","atts_01GW2HTEQAGWPT43NVB43V6QGG","atts_01GW2HTEQGNF9KEDY17M0130SW","atts_01GW2HTEQH68RVZCAMPMB05V0Y","atts_01GW2HTEQJ7EZ45723GW37ZWKV","atts_01GW2HTEQQGGM5TJYE1WHAWBS5","atts_01GW2HTEQS8ZRS25T2WHJZRHCS","atts_01GW2HTEQVVK15FF5YG8ACM2Z9","atts_01GW2HTEQX2T94ASQP4KNXXXNK","atts_01GW2HTEQYY61ZKN5QN6J8784P","atts_01GW2HTER0C1Z8GB0VAVR889X6","atts_01GW2HTER2STR72SN598AD4XM0","atts_01GW2HTER7TGVQX0FJZ6WD8R20","atts_01GW2HTES1VJRKZC3ETKGB00N0","atts_01GW2HTET37H6HQZACBR8G4QVV","atts_01GW2HTEVBVBND3P7VVYBHW39N","atts_01GW2HTEVMBPWPQJRCSFHTPNA7","atts_01GW2HTEWKWR6RX7GCV73XFEAC","atts_01GW2HTEXRS04XWJT80K5AZESH","atts_01GW2HTEWP5JANMNWB1AM42KK3","atts_01GW2HTEY5RMD39SYP918V7983","atts_01GW2HTEXK0QND0C7CYN95RJ1G","atts_01GW2HTEY009D3XJAD4FHG2C0V","atts_01GW2HTEY1VG8NZHK0SR5RF5B1","atts_01GW2HTF18K6BG04Z25ZBRKKM6","atts_01GW2HTEZ166BGXXGAAAJ0V92M","atts_01GW2HTEZ3479683H3V97YBWXC","atts_01GW2HTF0ZA006GZFK7KB7XY0C","atts_01GW2HTF12ZP5HX3S2E64FG2A5","atts_01GW2HTF15326YC0BH2JK9TEWM","atts_01GW2HTF1CH1W4ZZS84MMGGAYA","atts_01GW2HTF1FTC9RN61PM2XATSWY","atts_01GW2HTF1MAC3SR3352329NPQZ","atts_01GW2HTF1V3YTZMGV0RTD2YZ13","atts_01GW2HTF1W2ZVS90H7QD5YDVFD","atts_01GW2HTF3C6ETW3A2JNYTEBS36","atts_01GW2HTF3ZXKGGWM579P7XQ7HP","atts_01GW2HTF4N5PT87S9Q61Y4RJSR","atts_01GW2HTF58DTDB0ACKRPZ4Y8KT","atts_01GW2HTF5A4K7A91DJHFKNXBN9","atts_01GW2HTF6TF0XVGFAH5TRN8837","atts_01GW2HTF7ZNEDKQASP6HJV0JWJ","atts_01GW2HTF82X6JMEBDKASP3BFKZ","atts_01GW2HTF838DG53R8H6MVEF5KX","atts_01GW2HTF85G4F37Q97GDXP2BB0","atts_01GW2HTF86APRHYRG9X1SKMKVJ","atts_01GW2HTF88G2YE8BEX9GA9SRH9","atts_01GW2HTF8AE9BYRA09586JDPZG","atts_01GW2HTF8D9BHKY7VAESZN4H3Z","atts_01GW2HTF8EZRA15Y4E1TN11BWX","atts_01GW2HTF8GPJC6PK8ADBDD4RYG","atts_01GW2HTFAARE95V64TCCQFJHCQ","atts_01GW2HTFAA3W2PNM87WS41M3RN","atts_01GW2HTFBQ8XZFRKWK7NJ6WXHE","atts_01GW2HTFC16PN8D3HTBFEW170T","atts_01GW2HTFDGV3G9VE3ZWHZN35JP","atts_01GW2HTFEMBZ04VMPJ4D1KRW34","atts_01GW2HTFF04E5ZPJ3FJGYDN2SN","atts_01GW2HTFF4FS8YHM4VY4B8TRK2","atts_01GW2HTFFMDWT1JH39TNSSBHJN","atts_01GW2HTFG1NSMMD1KVM1ME5RBJ","atts_01GW2HTFJH3S877ASX3DMAGB2G","atts_01GW2HTFJXSVN6GQ21VRWH7BZ5","atts_01GW2HTFJZJ5W3JQ02K7DDSQ3H","atts_01GW2HTFKAKM2W4CB8SMS314G6","atts_01GW2HTFKCYSG650BP04NA2NTH","atts_01GW2HTFKEXX61CHRSHQWJ7PCT","atts_01GW2HTFKGDY10CD45XVZQM78F","atts_01GW2HTFKJA3XF8V802M48PNCF","atts_01GW2HTFKN95BA7PBQPDXCZ6TF","atts_01GW2HTFKRGC7QA1BWQZHFEC86","atts_01GW2HTFKT92P318P242TS1XY9","atts_01GW2HTFKYAY4FRTWR3EH6YJ49","atts_01GW2HTFM12RSZKA32WMTXRKWJ","atts_01GW2HTFN4B99YC0C1Z56Y6JV9","atts_01GW2HTFN61ZDHN2W8ADKV84BS","atts_01GW2HTFN74NSJSSY07WY8DS30","atts_01GW2HTFN8JDS9SHFT3TETEZS0","atts_01GW2HTFNAMH5D5C0B97AHM4EY","atts_01GW2HTFNB54EBCRMQJPD2TEB7","atts_01GW2HTFP87ZQFFR9EG86F1T0E","atts_01GW2HTFP6570T4KD0K8YWA83Q","atts_01GW2HTFPAX3GQCRYKQZSAJYX6","atts_01GW2HTGZE995K75CYV1CM241T","atts_01GW2HTH08EDCKVVGRTM0RBY4Q","atts_01GW2HTH0ADZEY5H357XGCKHEP","atts_01GW2HTH182P2YC8KBRQE8D0MT","atts_01GW2HTH1ATM6WEE6Q3GQECYJ1","atts_01GW2HTH3BDGN9RGYHKR56C9PD","atts_01GW2HTH3G7BXAA12H64YXTBS6","atts_01GW2HTH3YF6YJR7VVRGG5VP7B","atts_01GW2HTH4JKM584A43KWJAJVG3","atts_01GW2HTH4V60DTD514DQY6Q1KC","atts_01GW2HTH4XD414DQBN9F9H7MMT","atts_01GW2HTH4YGKA656M3ZACBH1C7","atts_01GW2HTH55G378A12VWNK7438G","atts_01GW2HTH57AFN6CRDAF21ZBC6H","atts_01GW2HTH5SQPP9TR17QXEH2KB7","atts_01GW2HTH5VJMJ0FFKRFS6ERSVH","atts_01GW2HTH6K75J6RH4SDFZ71KHC","atts_01GW2HTH88NZNNT4EAFM5TMD2D","atts_01GW2HTH6R2366RJ18J9B145KF","atts_01GW2HTH8BV1GB2DPHF4M21BJB","atts_01GW2HTH8DKW1HJFCHV2XZ0B31","atts_01GW2HTH8ESYNVCCY0X389T33D","atts_01GW2HTH8Z8TC56V8SPF5F5CKC","atts_01GW2HTH9CN508DDYS398QNPJK","atts_01GW2HTHAK1AEHR204CNQNRFYA","atts_01GW2HTHAS4BXCZH87VJVQP55P","atts_01GW2HTHAZDJM0Q9630DPJBNZV","atts_01GW2HTHB65MP3AWW4JVGJM63Y","atts_01GW2HTHCWMC9KQ4EXRS7BMV2K","atts_01GW2HTHCYB5X2GW7F454715R4","atts_01GW2HTHESPP12ZMKPFGPSBW58","atts_01GW2HTHFGNF26BKDPAVJ0J5H0","atts_01GW2HTHFT6P8NEF3VR6VZMER8","atts_01GW2HTHH5WF0QZ7QRCQ3Q420H","atts_01GW2HTHKH3R9GT775ZQ70JZZK","atts_01GW2HTHKHF4BHVHK52CT0GDPN","atts_01GW2HTHKJMSF0S15MTCDZSR1G","atts_01GW2HTHKKPCD7CAV2QWWCYASS","atts_01GW2HTHKM2CJCK98Y7GD7KNRW","atts_01GW2HTHKX5XW410R1QJK9XJ22","atts_01GW2HTHQEMHSFHE31GQRGH8MW","atts_01GW2HTHN94K2H3ZP3BE42F0A9","atts_01GW2HTHNZ66SJMD4ZHJ7KRFR2","atts_01GW2HTHT0GJ80YFTERCAJ525X","atts_01GW2HTHW8GCG1M5KBMZ65NH1A","atts_01GW2HTHVH6BVFCT2X9B1AXG5A","atts_01GW2HTHVKRD22ZPFPNT331VR3","atts_01GW2HTHVQSZG7W8T3GHRQD5Z7","atts_01GW2HTHVRWK4KK56Z5701FA3B","atts_01GW2HTHW03ACD2T8H2J9E8121","atts_01GW2HTHW3168DKC249NYAPBZ4","atts_01GW2HTHZ0YF2AQ28J72T2M872","atts_01GW2HTHZ0W42FZSR0MTZD7RBX","atts_01GW2HTHZ1QE4ABWV2D115C36Z","atts_01GW2HTHZ1NGGZBVHS5EF22EH0","atts_01GW2HTHZ2SMP4GBNKHPCR183X","atts_01GW2HTHZ24N4PXS2ZRGH0EWZK","atts_01GW2HTHZ3N3Q2K2Q2KW4AGM8F","atts_01GW2HTHZ48M22EJFEW353RWHP","atts_01GW2HTHZ4FZJ4GR44PP0K2SY0","atts_01GW2HTHZ5BCWD7KW744ZKSGST","atts_01GW2HTHZ5BAEW14Q0SEH9JS2Z","atts_01GW2HTHZ6WP914HY1BTTMXRWF","atts_01GW2HTHZ6FSDF8W5W2K2TT2JY","atts_01GW2HTHZ7VAEX04JW3DYT70Q7","atts_01GW2HTHZ7W1CKEVGXWAE3JSHF","atts_01GW2HTHZ8D3KPVZJRCX3ZWFJR","atts_01GW2HTJ19KTM3H35DZD2JZFMH","atts_01GW2HTJ3M07EK6YJKPF5F8WKW","atts_01GW2HTJ3TYN59B5126NATH53P","atts_01GW2HTJ5H5G4HN7CT2EFVA1CP","atts_01GW2HTJ6ADYTS0XZBQDJD242J","atts_01GW2HTJ69PK15V51X254M64JW","atts_01GW2HTJ6NJV87WVVRZ6HR6WJD","atts_01GW2HTJ76TESMD8KVDSQCET26","atts_01GW2HTJ7J0MTQRWGETQHA0YX3","atts_01GW2HTJ7J0F5G318HPE87ZWFG","atts_01GW2HTJ92FW7WZP5N2SBGV0T6","atts_01GW2HTJ9A7617XB85383DSRJY","atts_01GW2HTJ9BVR1MSP1YKT0PPS0N","atts_01GW2HTJ9C0ANJ5X7Q0Z03BG0D","atts_01GW2HTJ9DNEAF34JFGNZKHF8D","atts_01GW2HTJ9N9RBZD7M9ZSAFQSS6","atts_01GW2HTJA9P2PH05CFKENXYQEJ","atts_01GW2HTJBPNRMFSC7KHDX1NXCG","atts_01GW2HTJCEEWTYGS9P1TNEF244","atts_01GW2HTJCM2P8KSM39ZMKYYG17","atts_01GW2HTJCXF3F4R5T7WWE0ZVBT","atts_01GW2HTJD9YTYCHA70Y2YBNM8W","atts_01GW2HTJE7SCCV5YMVM4RPFXT7","atts_01GW2HTJEEF5TNV2FRV3X52PEC","atts_01GW2HTJFDED2NFV9A5PKNW6K0","atts_01GW2HTJFRPXSKCR76ZNKMDSFF","atts_01GW2HTJFSXQ9FP1EMCKT6S2XM","atts_01GW2HTJFTVG559M9EEDAXK1EN","atts_01GW2HTJFW1YZ76YKFAFMRWVRV","atts_01GW2HTJFXYEM39M27KR1T8NNF","atts_01GW2HTJFZPFVENKMTXZ934J5S","atts_01GW2HTJG5Q31NWAR8XZ9K9QC3","atts_01GW2HTJMM7PPZS0VKCPA15ZB5","atts_01GW2HTJM3J5SQH3ZXJRAZDTE6","atts_01GW2HTJMH0E85W16JCQV3QXTA","atts_01GW2HTJP6XSW7CWS1BTM77AGG","atts_01GW2HTJP7TH9Y88DH824CHHWT","atts_01GW2HTJP90KFS7SJ3FJ9P9F1Y","atts_01GW2HTJRFYFAA228AMT4AJ6F4","atts_01GW2HTJRC1V7FTDCNVFNG5FXB","atts_01GW2HTJWQD9834678N0T03JHP","atts_01GW2HTJWNSE6V8CZWZ52N35PB","atts_01GW2HTJWP8SY9TD40JJKSQT3M","atts_01GW2HTJY62SBV0DB8JRAS2QKZ","atts_01GW2HTJY8GPPQ908ATCEHSQ3T","atts_01GW2HTJYA830HSAWNF5Z32MEB","atts_01GW2HTJYCN85GSY175Z6G8MA1","atts_01GW2HTJYEV6KSGR635S63QPK7","atts_01GW2HTJYG7E1DMK1RQ7QCFSDY","atts_01GW2HTJYJ77BZ5W8WHMQVHK8C","atts_01GW2HTJZEQ60BDRQ9MD3NRAZC","atts_01GW2HTJZM2AHZD9GE94JEQDAB","atts_01GW2HTJZVKWGBA5Z3WM3365S3","atts_01GW2HTK01JX1ZFFAFCBAC8CQA","atts_01GW2HTK0PARF0KT044QFMTG10","atts_01GW2HTK3QKJZKNKZ4E3V7F2GR","atts_01GW2HTK8FTEYDH67RMSDG89XV","atts_01GW2HTK8PS8MP1H825KXPGMKC","atts_01GW2HTKA7DPGR14D4661JPG2Q","atts_01GW2HTKC6P0ZRD2HV29ADAJWC","atts_01GW2HTKENMTDSSDS81NK9P379","atts_01GW2HTKDT5W0KAK3XYJ16PMPW","atts_01GW2HTKE8S7E0DZD4PPX9HBAN","atts_01GW2HTKEJ920R30GV7XK3SASN","atts_01GW2HTKEKYQYDJK6H40MYCFRM","atts_01GW2HTKEQX35JBP3J54Q8MXB1","atts_01GW2HTKEZ3FFVKPE88PEH0Q2W","atts_01GW2HTKF00EER77DQQ7TZH53X","atts_01GW2HTKF10VCPZD74D9FPSSZG","atts_01GW2HTKF2YZWBBAA1W8VK79MZ","atts_01GW2HTKF38F3BAGAZZDP9B1JK","atts_01GW2HTKG2QKGT115H3B17V7E7","atts_01GW2HTKG4ZFFNXE6NAW00AFJ8","atts_01GW2HTKGPMGHV7FRM3RVMF02X","atts_01GW2HTKHFFT2REXQXSGE8S7Z0","atts_01GW2HTKHJSD6PVP9CCR4Q0BQG","atts_01GW2HTKJZTQ5KHWF4KD4SV8VP","atts_01GW2HTKMR6D2512NG6P1DX7C3","atts_01GW2HTKQ6GY14ZH8JRAMS71EP","atts_01GW2HTKQ78733H8H2PKM32963","atts_01GW2HTKRQ3MWKF99WES17EZ51","atts_01GW2HTKRS8ZJB8EF01KBW7RM4","atts_01GW2HTKRVYJ4958SJSE3CN2SD","atts_01GW2HTKSGTFXY76H3REEQA209","atts_01GW2HTKSZ3591QPQ1RWSDC50V","atts_01GW2HTKVYT3W6VC16KM5NFVGS","atts_01GW2HTKVZ1HXVW0AG30SQ8PCY","atts_01GW2HTKW17BV8YQ0HPDTYGF9S","atts_01GW2HTKW26XM24BHQ8PY4P7F7","atts_01GW2HTKW22BM54GZYBAVZ5FCX","atts_01GW2HTKWCGNB5YHTKYS8XABPM","atts_01GW2HTKWF64AQ58GMAEDXF2CG","atts_01GW2HTKWGQ1KTCW63DRMT3B1V","atts_01GW2HTKWQ5DC7GNDD35HN48AZ","atts_01GW2HTKWVMG1DFTNN34GRG7F8","atts_01GW2HTKYQJBRF3RPJYQX3N1WQ","atts_01GW2HTM01ACXTAK2AAV7MSAAY","atts_01GW2HTKYS1F0BQJS2AM967M03","atts_01GW2HTKYTM7NNXGZ04NV01M4W","atts_01GW2HTKYWY3JWQB6P3K816ZR1","atts_01GW2HTKZNK7XBNH6TK5HXY1Y7","atts_01GW2HTM139J32H3KMCJPM1ETX","atts_01GW2HTM298K0K0QPVMSMQC0RV","atts_01GW2HTM2BC6W9ERHG5MX3YCK3","atts_01GW2HTM2DV9DT3FX3FD4K6FPD","atts_01GW2HTM2EW7ZESP6KK0MPQC16","atts_01GW2HTM2JDRG09YPX1KAYQVVH","atts_01GW2HTM2KSSKT55GP0SV06RAV","atts_01GW2HTM2N5R0YAXDESST77BVR","atts_01GW2HTM2PPN7NWHGC8WMNZD35","atts_01GW2HTM2QYEZT0YFJJRW1NGPK","atts_01GW2HTM4DT37MEYP9M1SXNVAW","atts_01GW2HTM4E7VDG387EYW4ZXVSJ","atts_01GW2HTM4JNQDX6NFXV5M1T1SM","atts_01GW2HTM4WJ4051B7KY1QJMRMV","atts_01GW2HTM56NWDNN88QF1WW142M","atts_01GW2HTM5B2MB52P4HXTP2CX60","atts_01GW2HTMCT2W1CAXNFBFTQ9GQ8","atts_01GW2HTMD24QNKTNTD2FAGVECH","atts_01GW2HTMDNQWRN9GGFCA8F9P8Z","atts_01GW2HTMFYPX5MHA7TN3QXK3TX","atts_01GW2HTMGV66ZPFF2BJGQENP8Q","atts_01GW2HTMGWJM3HM31XPNGQPETA","atts_01GW2HTMN732R6CE9RJ1Q8AZ52","atts_01GW2HTMNB11HX8M5YG52QMEZ2","atts_01GW2HTMNN1E6YGK55QKMG9TC6","atts_01GW2HTMNQCDR7PK25RXCPW6TY","atts_01GW2HTMTGVSZSQJXRM03B082F","atts_01GW2HTMTJTFB3XRZ5A34X236E","atts_01GW2HTN063SQNMBAZQGYCDQ1H","atts_01GW2HTN07M39TVMK63D8H4N8H","atts_01GW2HTN08E5WF0D4G94GTZYB1","atts_01GW2HTN0N6BYBSJDKXEHJJT8E","atts_01GW2HTN0KCNWRCJRVAQZSK2KN","atts_01GW2HTN1XJK4YQ0YCGVA3TGK2","atts_01GW2HTN1YXB3H8NMR99A8NBKQ","atts_01GW2HTN3T6PW320ND546BDNP6","atts_01GW2HTN3XNR14VM83Q41WFJC2","atts_01GW2HTN4BYMCDG9RDQZDZR5JR","atts_01GW2HTN4C4KNFB988R72BRQ1T","atts_01GW2HTN4EY5P071ZX8R7J3B1B","atts_01GW2HTN6R3ED8QCFVC9EV4Q8Y","atts_01GW2HTN6Z61ZASDBV1KJ95E7T","atts_01GW2HTN7QX11NYX8NCE1DGMMF","atts_01GW2HTN8PNF232VCXDJDA32QW","atts_01GW2HTN97X6QC698ZDQHYQM50","atts_01GW2HTN9956HM7SP0RKV8G1VT","atts_01GW2HTN9BY5KJK1B1HR06TMY9","atts_01GW2HTN9MX1M9XFT9B01X17HH","atts_01GW2HTN9NB5GTZ1BVVS4QT7WK","atts_01GW2HTN9PWTVZXV148SM1AJRH","atts_01GW2HTNA59VN0G8S6XCYJACA1","atts_01GW2HTNA9DQ12TRH8SCMNEQZA","atts_01GW2HTNAZ3X6TNBQAQVBBE8DV","atts_01GW2HTNB0ZRPX1KKQ3B3V6A09","atts_01GW2HTNBRH9R429TSAY8KBH00","atts_01GW2HTNCKXEZCEZ325T8FVAT6","atts_01GW2HTNCMPJGZA7GYWVBDWWNA","atts_01GW2HTNCRSRWN0T6SQ1XZRDMA","atts_01GW2HTNEATE5DZ8HFJ80MTEP9","atts_01GW2HTNNJP4QXBN2HPGZ8PZ2C","atts_01GW2HTNK6D17E6JS3F4S1GSH4","atts_01GW2HTNSZRMEG3QPD9A02Z3SA","atts_01GW2HTNT1Z4MBNQ4ET3GSW3DQ","atts_01GW2HTNTBKVTTQ280KCE25MYY","atts_01GW2HTNTCXQ31067DK4H4HNAQ","atts_01GW2HTNVMYBCEY0Z6NGRM1GQQ","atts_01GW2HTP756AJ0Q3G90H6MEKAY","atts_01GW2HTP34J85494E8R9KTQ3N3","atts_01GW2HTP3Y6VTY1YNWR7P7G356","atts_01GW2HTP40V1KC13WWZ3N6XFSK","atts_01GW2HTP42RV8KR5G1CF6527XF","atts_01GW2HTP47HKA8VXYPHT0M4401","atts_01GW2HTP4BTR1XE2YJ8XJTS02T","atts_01GW2HTP7D5PC1QX6MDJK5JEC1","atts_01GW2HTP7FXXZ5QPZRND47AD9V","atts_01GW2HTP9AC860JF46JJ40A0KB","atts_01GW2HTP9CRCTTJ0EB87RDTWQV","atts_01GW2HTP9F2VWB36A265DQ9H1M","atts_01GW2HTP9GJJ3JYVAXHKVD704H","atts_01GW2HTP9J51M1ZXWJY31DJK5T","atts_01GW2HTP9KMY5X2Z29WN781CG8","atts_01GW2HTP9NJG0T3GAWZ7NXYV8C","atts_01GW2HTP9QSW75AP6AXY38QGM1","atts_01GW2HTPA7GGWDF2ABSYG24NQM","atts_01GW2HTPAAGN919MHP7JP67C93","atts_01GW2HTPBEAARXC13B3WQQ0N8E","atts_01GW2HTPBXP1ZR7MMRGW12YDC8","atts_01GW2HTPCQQF3G6A8Z4YD0MTXZ","atts_01GW2HTPCSXE1JSZD5QY8AXXPV","atts_01GW2HTPD2RETS77SR177E7MP4","atts_01GW2HTPDXZNC0Z0ZWXTHZX861","atts_01GW2HTPF1DCGJ8DNZED18Q5QF","atts_01GW2HTPFXTFHKWRY9T9FR6P5A","atts_01GW2HTPFYDTZ90499623V96SR","atts_01GW2HTPHDK1GS9TH5S8E1C2MX","atts_01GW2HTPJ7B5ZRX9FASYDCZ88V","atts_01GW2HTPJRV9RZBT2TJ974V8NC","atts_01GW2HTPJTV6ATC78TC8NSNSGE","atts_01GW2HTPJV4XE6M95P2JHRZ43Z","atts_01GW2HTPJWRDSXXFJSX14TZ47F","atts_01GW2HTPKDSXJHCW3SSR52T0Q7","atts_01GW2HTPKW1BEAC2EY012EHYMN","atts_01GW2HTPN5RDR2EXDEWJPFKR03","atts_01GW2HTPN6TGK70DCW58PQGMHE","atts_01GW2HTPNFA1WSRD5KG5N4SSTE","atts_01GW2HTPNKC3439QFGYZZJZ5WK","atts_01GW2HTPSJRWNP5QWV0YHBJKD2","atts_01GW2HTPSN1RG0AG2S80ATG03P","atts_01GW2HTPSQR6R4KCNMSAXK2PSS","atts_01GW2HTPSSDG036STR0VA2APC8","atts_01GW2HTPT5MBGYR46WVGPVM1NQ","atts_01GW2HTPV2F14JVYTTG3B030C1","atts_01GW2HTPV4PWE3RE4SFZSGJ47C","atts_01GW2HTPV5Q584WYN7BXEXSYFR","atts_01GW2HTPWTBDHXNW2QG156PPY9","atts_01GW2HTPW4MTMCKYA338W9SJQN","atts_01GW2HTPW5X9JG3F8TZ21SMDWP","atts_01GW2HTPW6XF7EBQT0NA7PCSCE","atts_01GW2HTPWGW8WYQTDN91RVK40Z","atts_01GW2HTPWRZ8JBJ28V1W7VREPR","atts_01GW2HTPWSVX32Z6Y7KVJ16EAJ","atts_01GW2HTPWV3NS39JRZQN8RWQ6D","atts_01GW2HTPWWFC5V326JBJVVAMB5","atts_01GW2HTPX5672X0SQWP0RRSQMD","atts_01GW2HTPXFCWACRPZ89N1VZS6K","atts_01GW2HTPX7WA3D5E0GWZGETZP3","atts_01GW2HTPX9XDVXZSM89KWEV6WY","atts_01GW2HTPXBFJ27XJ5EAMXGSKWW","atts_01GW2HTPXCEH53R221GZAAG13D","atts_01GW2HTPXDDRTME1GRDRCVSC51","atts_01GW2HTPXEVXWMEHGD8380KYQW","atts_01GW2HTPXRG58EZG3NT4AP4XAZ","atts_01GW2HTPZ1KK3SDZB7J2SBBB9Q","atts_01GW2HTPZWVRQ15S1HN9VWQ1VM","atts_01GW2HTQ06S38S05DK9GANP7MF","atts_01GW2HTQ2RTSDVDDHB7Z31QX0G","atts_01GW2HTQ2V54KZX2Y1R67DK7SC","atts_01GW2HTQ2XQPCTS2896N2Q32C3","atts_01GW2HTQ2Z0KT6X6GJAVMEM9QK","atts_01GW2HTQ32SD7RHG0GXP7PM64F","atts_01GW2HTQ4MQHCJZ1J6KE90Z65X","atts_01GW2HTQ4HRD19B2FVX7ZFNBAK","atts_01GW2HTQ3FWWPKYM1NG5NH3340","atts_01GW2HTQ3GEC6QN19CVVY326C6","atts_01GW2HTQ3H6025ZZBK5P1FKE0Y","atts_01GW2HTQ3R27TTKYRKXEC0WH67","atts_01GW2HTQ3SRDXDT0HJBVCS2GXE","atts_01GW2HTQ3VSY8NDQF4F1FS5NDP","atts_01GW2HTQ4C3P7DG6FZCRT10F3F","atts_01GW2HTQ4E4S90S9WWBN39HCSA","atts_01GW2HTQ4GP12159H8RYEN82CT","atts_01GW2HTQ4JVH8P1FF46AYB7A8C","atts_01GW2HTQ4N2MMZG8MMTPFVNZEH","atts_01GW2HTQ531YJVW5J6SB45DH63","atts_01GW2HTQ6N0E6B9Q4T7ZCE1FZ8","atts_01GW2HTQ7PW5SRPVEDJJJH7G0A","atts_01GW2HTQ8V33YZ0QWJJTE8G1NS","atts_01GW2HTQ807W90WQT21A855NP6","atts_01GW2HTQ85T27SE3T2A565J527","atts_01GW2HTQ87SB5HZN54YFT0GABH","atts_01GW2HTQ8A1Q9SVRC5W2E66905","atts_01GW2HTQ8B4YA4HXW1S1NYA2KR","atts_01GW2HTQ8D30QXENWCZAAF1B25","atts_01GW2HTQ8P2NDA569KN9DX8DW2","atts_01GW2HTQ8RFFJ68672RHBKE2DS","atts_01GW2HTQ8WXBNM0S8YP2M26CXW","atts_01GW2HTQ8ZWBR8W2RGDFJS2WGE","atts_01GW2HTQ9107PCPVVCZFH24VZH","atts_01GW2HTQ93B5X01P5RNTH9XCE4","atts_01GW2HTQ95C2YNYBVPRP9DSA3S","atts_01GW2HTQ9770J9B5V2XJN6NNBB","atts_01GW2HTQAGXR1499NDZC46K10R","atts_01GW2HTQ98SYQVFJWJ1ZD90E5P","atts_01GW2HTQA31CA3XM91XC8RZT76","atts_01GW2HTQJ9W8GHTMJ1DDR60K2Y","atts_01GW2HTQJBVWPC3Y2DCDRDDWSQ","atts_01GW2HTT6C42R70YFK8D33MR2Q","atts_01GW2HTT8VH021CQT495NMCEXR","atts_01GW2HTTB3QMJF17T5BNMMWEP8","atts_01GW2HTTBPTXZGF1RCXBXT27B6","atts_01GW2HTTCSR8RH0BSAZ58AVJW3","atts_01GW2HTTDMP7PEKM0NH8QZBQ26","atts_01GW2HTTE9MD9PRAX2ZJXCQSP4","atts_01GW2HTTES7R24R3MPRZSWF0FQ","atts_01GW2HTTH1K1PCBXKKWK923N7H","atts_01GW2HTTJ8W51F3AEF6TC5NR1Y","atts_01GW2HTTKR9MAXXS21Q97NT71M","atts_01GW2HTTM5KHCWSYHTWBE25166","atts_01GW2HTTN12J36DHYR9Q01S5Y8","atts_01GW2HTTN23JWEBCCMHG4PSP1R","atts_01GW2HTTN3B4GVF4VQCEDMFJYZ","atts_01GW2HTTN4Q8JAKZQ3GXTJ1NZP","atts_01GW2HTTP0807R8S57GHPT2EWE","atts_01GW2HTTPZ1FTHDQEG9ZMNE2ZS","atts_01GW2HTTQ0M20MGH5T52FCEC7B","atts_01GW2HTTS518JD7G6Q95H9V78D","atts_01GW2HTTT1B8AQ5422G6RVMTKX","atts_01GW2HTTT1MD4SDCYXNY2YTTET","atts_01GW2HTTV8Z6837G0J0HCE9N1Y","atts_01GW2HTTV84C1Q8CR0Y6NGXZ8K","atts_01GW2HTTV8DR4RHGJR9851ADPS","atts_01GW2HTTWH2NEEJJGKTEM8T9FG","atts_01GW2HTTWDNBT5EQ1963PT586Y","atts_01GW2HTTWEE0NS2M8M93D2Z8G0","atts_01GW2HTTWGP4XYW6ZXN07GMSJ6","atts_01GW2HTTWKXTJKFYCRSG72AW2N","atts_01GW2HTTXA25R4HE92EWEAQ1J3","atts_01GW2HTTZZ88ZJJGYPAFR7CWCN","atts_01GW2HTV00VYB9Y2MJXTZ1VWRA","atts_01GW2HTV01P3C56RNHYAXA8SDW","atts_01GW2HTV02ANJC548BT8FRTJMF","atts_01GW2HTV1KMPSZG59JGFVVV7SX","atts_01GW2HTV23C1XDCG7274WTT0Z9","atts_01GW2HTV4NEWV6FZJAR3A3SEK8","atts_01GW2HTV39WTAV4ZVXH21VCJQB","atts_01GW2HTV4KEEMBA5G7CZY38Q4Z","atts_01GW2HTV86AB4NRX9FNW6Z6PNP","atts_01GW2HTVA7RTD57TKYX0E4Q0NC","atts_01GW2HTVA8SZSPSP4SAYG6THQX","atts_01GW2HTVA8BJGEPE45MG8AMH90","atts_01GW2HTVDBXYXB68W5DYQW911C","atts_01GW2HTVBF251H3FCGXHYFCC3H","atts_01GW2HTVBGTKS7P6SHS9F22G7C","atts_01GW2HTVBJ3WN3RR1BAPT2CHBS","atts_01GW2HTVBVWBABHSGN9C96Z69Z","atts_01GW2HTVCAVEXCYBZZQYSTBXN8","atts_01GW2HTVCZNC2JK8RP0SS7E38A","atts_01GW2HTVHFQ5MC4C8EY9G6VW4N","atts_01GW2HTVKFHTPPHFHNZSRNAE59","atts_01GW2HTVKCEKN7J1NJ7KFHY5GV","atts_01GW2HTVMJ7YA6WD446S9M33F4","atts_01GW2HTVMKJNGY98EJZ0EEPQA8","atts_01GW2HTVMNCCFC743NB27DV7NA","atts_01GW2HTVNGRG733HDCP1YWT4NS","atts_01GW2HTVNJCGXNJ2HQG4J5T9H9","atts_01GW2HTVNK9SHEBKSNBKP8B5D5","atts_01GW2HTVPZE6ZT3CBPS1NDNWCT","atts_01GW2HTVR0N68JY1RW8J5ZJ68J","atts_01GW2HTVRGVPN1SXF30SFVZ6T6","atts_01GW2HTVRHF29DK1CPZTJ7SKH3","atts_01GW2HTVSGD4ESSNDXRH0QD2N8","atts_01GW2HTVSJGJ5ARCKJ0C1D9SE4","atts_01GW2HTVSKXEQB8MV22Q7T8QFN","atts_01GW2HTVSN4XC5F02MYKHQ14GS","atts_01GW2HTVSPVC684GA5VS33SENE","atts_01GW2HTVSQZYRT4V6AXB3509YH","atts_01GW2HTVSRBYCT6AGE22FA7JT1","atts_01GW2HTVT85NAEYR4E8TAKVGT7","atts_01GW2HTVT9ETD9E3YWMWQ0NFSX","atts_01GW2HTVTBFBQ8HRR42NCQ3R3E","atts_01GW2HTVTCYGXWM9TH9SPWDQVN","atts_01GW2HTVVCMD3A7XV8RNK814B4","atts_01GW2HTVVEJBBHCS75D1QK591H","atts_01GW2HTVVGEAYG5G0EN0J96XCX","atts_01GW2HTVVJHW7NACGR1GP0QZN4","atts_01GW2HTVVK16433CE3ZDG0K5AW","atts_01GW2HTVW00ADVA3BWX140ZTHV","atts_01GW2HTVW2HH598GQ4A2TK9F0C","atts_01GW2HTVWDZMT5PG1HYBZWQG5X","atts_01GW2HTVWJT25068ART91Y8HZD","atts_01GW2HTVWPEPNHH15Z57H10P4Z","atts_01GW2HTVYB0PP02P1PP5HEYXFA","atts_01GW2HTVYSZGFFJ8F6QJ5SX8QQ","atts_01GW2HTW02W9VDM3GAENCP7QVG","atts_01GW2HTW0CQAX5TZT8NFXKYEK8","atts_01GW2HTW0FX1G8RC77Z33FMEK3","atts_01GW2HTW0GV1N2MMPPPDV48G5D","atts_01GW2HTW3206QAJP2TJS63Z58W","atts_01GW2HTW35WWKJGF9P9Z8TXWXG","atts_01GW2HTW5A9ZEVFWMQQRGT8X4A","atts_01GW2HTW5NRSX9K1W6CCP01HQ8","atts_01GW2HTW5T2EZTZ9DMF7ZS9055","atts_01GW2HTW7TAAH2YSS8B77W04DX","atts_01GW2HTW82X0HXDFD7BREJW0VA","atts_01GW2HTW89V4WDN5SCRGD1RE8R","atts_01GW2HTWAJTJX4CX82Y5NJMGWD","atts_01GW2HTWAMHBWM5PV62ZD5N9DV","atts_01GW2HTWANDB6HZ7QBD9PVM0NC","atts_01GW2HTWFAP7C12PGFHNF7TGQP","atts_01GW2HTWFC79QZKTAW87PA5Y38","atts_01GW2HTWGS68VTY6T5DW7ZHAFX","atts_01GW2HTWGVBPBK68YSV1TAS6RF","atts_01GW2HTWGWWXPDE1XX32EYA6XG","atts_01GW2HTWGYC1T8XHPPEN88Z2R8","atts_01GW2HTWK0FQ7G7PPVXFP0YMA5","atts_01GW2HTWKH89QYK8874PKWZP98","atts_01GW2HTWKMXTGMTQA2GNVX7VEN","atts_01GW2HTWMKVVQPE7BM9GD9CYYE","atts_01GW2HTWNXCYAC77MQMP0XDRYX","atts_01GW2HTWP5DG8F8T5HXHFMT65E","atts_01GW2HTWPB2B1G5FP8CPMQH3ZD","atts_01GW2HTWR2HWCA2SB29C3YACYM","atts_01GW2HTWVN3EC5TBXVX5PFBJR6","atts_01GW2HTWWXH47ESHRW9YR4SP7V","atts_01GW2HTWXJCNWPQGA2BR5CF1RA","atts_01GW2HTWXS4N76V7QX683TAR4S","atts_01GW2HTX16DTFZR09J2CNEXZEY","atts_01GW2HTWXTMHPZ68GG951G1V64","atts_01GW2HTWXVXFRKPKQM31BB9Y0S","atts_01GW2HTXDXPYKGNWJ6JVPVPTBF","atts_01GW2HTWZ6DH0BY1910SCCXNGQ","atts_01GW2HTWZ7NR02K49W6PZN1G1F","atts_01GW2HTWZ855KBSJ9ERSEKXHD0","atts_01GW2HTX0TA5NEM1PGD93JJ6BR","atts_01GW2HTX0JRAE62C96M2V3X2Y2","atts_01GW2HTX28X5VEB2096MVCF9XF","atts_01GW2HTX2EAA5SHAAYQDAGAA3X","atts_01GW2HTX2HJX36A0DQXABVXY6B","atts_01GW2HTX2PKW94NT625RNPAZF5","atts_01GW2HTX2RT2WRHX4SHTD1XXCC","atts_01GW2HTX357533B18XBGW2D73F","atts_01GW2HTX369DZ4G3TWVE6CEXGE","atts_01GW2HTX6FHQVFC1E94Q69Q4ND","atts_01GW2HTX6RBGVCYTS3BSRMDZ2H","atts_01GW2HTX89EKDY9SXGJ1V9DCXH","atts_01GW2HTXAK2M11HQX1YAS2BQ07","atts_01GW2HTXAQBJM9V83Z0YE83FJM","atts_01GW2HTXCN7FQWY5HX7EETHAVH","atts_01GW2HTXCZADGX3J91PEBCE7RA","atts_01GW2HTXDCST0B0HPYR92SYG6A","atts_01GW2HTXDYBMXADP1HSEM1EZQC","atts_01GW2HTXE0PTM9TKB4N4W6E7KZ","atts_01GW2HTXE1VBYFDD6CFHSNNXQX","atts_01GW2HTXE275XSP2BC2XJV035Z","atts_01GW2HTXE90DDKCBKF75ET2NA5","atts_01GW2HTXF4Z9QY3GPVSSRJ2D2C","atts_01GW2HTXF5T0NWET5F97R6DRS9","atts_01GW2HTXF6V4QQSCMA6TPHW64S","atts_01GW2HTXGEXCF585RHEGRY2J0G","atts_01GW2HTXGFFNV4QKD8M5RC7MGC","atts_01GW2HTXGQXP94D63MY8725XN3","atts_01GW2HTXGSYC4HSNA0D6GC0J7E","atts_01GW2HTXH652KMXR1SVMBPGH14","atts_01GW2HTXH6BDK8XW9AFJ029KQD","atts_01GW2HTXJ5FSDCZJB92TKZ3R5K","atts_01GW2HTXKYJ97MS2VY1VH0T0G5","atts_01GW2HTXKYABZM45BKV9HDBM6P","atts_01GW2HTXMFA5T26NVR0EXZ3EEJ","atts_01GW2HTXMG5DJEFTHGFC45GPYS","atts_01GW2HTXMPXYADJ1VQWWYHVFGG","atts_01GW2HTXPJB3RDCFRYE3PS42S5","atts_01GW2HTXPK8AYVZ5G8MAJ7QA0W","atts_01GW2HTXPMF362TGVAP10AKX07","atts_01GW2HTXPSBSABFB6K8FZF39C9","atts_01GW2HTXQ5JRKCF362HC4GARS4","atts_01GW2HTXQGZFYNXJJV6XRFVMRD","atts_01GW2HTXQKXA6NRWPGAG58SNVY","atts_01GW2HTXQMRHHYMCYNAZTHN0RN","atts_01GW2HTXQPNS66CDH3XZSHHK2R","atts_01GW2HTXQQKXD0ZG29Z2C4910S","atts_01GW2HTXQS6A8XSVGN0HYG3VWM","atts_01GW2HTXR1EQFVT12S6DB23RHV","atts_01GW2HTXR8NFYDP67KF6RP1CHN","atts_01GW2HTXSF9K0GDDNKYAMMVRG5","atts_01GW2HTXSK2ESBJSZPVGATG473","atts_01GW2HTXSYK1QRR4FPR6259N2Q","atts_01GW2HTXT69SG4Z5V9D9WDKDKG","atts_01GW2HTXTX4XHXP1MR8ZKFA384","atts_01GW2HTXTX4EK9WRAKHR2YJJGV","atts_01GW2HTXTX1JZ3R7RRPWQRX87N","atts_01GW2HTXTZHD2385R8PYW6D9VY","atts_01GW2HTXVGXGDJ9C96KH1H0CZN","atts_01GW2HTXVJ8N9TZ2F84M6G432X","atts_01GW2HTXXV0CAYGSKB0T2X98MX","atts_01GW2HTXYK59QPEV22P6F5QFZZ","atts_01GW2HTXYY0N54YNPJHX4D3CNJ","atts_01GW2HTXYN8Y0YXBRBNQCK6TDD","atts_01GW2HTXYP7WDCQ3ZBJF0Y2QYR","atts_01GW2HTXYYBDQXGPJWC4R0YKKZ","atts_01GW2HTXZ54FJY7263SMH4MNT9","atts_01GW2HTXZ6EJZZVS1Q3FGGN6KD","atts_01GW2HTXZ64DHZEKA5V58RRQN2","atts_01GW2HTY254VXKW4TTMWK3RP77","atts_01GW2HTY39FQJ7WFAGACAC3Z3D","atts_01GW2HTY3CBJC0Y6Z1SBBEQNV4","atts_01GW2HTY85FBE4JQVYRZMRBS63","atts_01GW2HTY6E4XKG8V4CWQXB63XC","atts_01GW2HTY6NH8332PBF9K5SJQ73","atts_01GW2HTY6P9G60TH8P8ACBMD75","atts_01GW2HTY6RJS1VB3W8ZNQZZ4QB","atts_01GW2HTY7CC2NDJBVXHHY9Y8MV","atts_01GW2HTY7FZ3200F10GDH3WVJ8","atts_01GW2HTY7HQ1C85ZJ13VPPJ7TX","atts_01GW2HTY7K9SF12CX7NNT3SK8H","atts_01GW2HTY7N86B1XV9RDVP8S6A9","atts_01GW2HTY8356EG7EWXJBT96AHR","atts_01GW2HTY846F3NZRSMAW0GFNTG","atts_01GW2HTY8BK8DNRTP2R4S2HH52","atts_01GW2HTY8BZ3BC6R5J10WBDY40","atts_01GW2HTY9Z4A5DAFVX4H20HE93","atts_01GW2HTYAAAZY2QR4SXB2HJQRQ","atts_01GW2HTYAAAQGRH6ZTF7JST091","atts_01GW2HTYDDGD4YASDVTJ8ZF8NS","atts_01GW2HTYBCA48MEKX1Q52236CX","atts_01GW2HTYBE7X4P14R310YQJN50","atts_01GW2HTYBGBQ504YD5Q7KM3M4E","atts_01GW2HTYCJ9RSJKKX9VAANMFTQ","atts_01GW2HTYDC64345HCX2QND44E2","atts_01GW2HTYDEGFM5MDWZ16MNEKGB","atts_01GW2HTYDFT71B4Q61T5878KZT","atts_01GW2HTYDGRAWG5CGWZ7VAM7PD","atts_01GW2HTYDHD9RYCXBVH6MF8Q1V","atts_01GW2HTYDTKWQEYY93AG0XH6BX","atts_01GW2HTYDYFVPJJ8TQH7320SK1","atts_01GW2HTYDZB5FS0H0XCGRFZ0AQ","atts_01GW2HTYE1TD3PEWNJ7D01ZTNV","atts_01GW2HTYE2DYSEC0KAZN3HCXK2","atts_01GW2HTYE42XGJ2998RAS0HVQJ","atts_01GW2HTYE585RMM71E5MVD3JH7","atts_01GW2HTYF2BRJE439374D2AX39","atts_01GW2HTYKMJJMFNPZF046GKWKT","atts_01GW2HTYKV6ZJRXY8NRAEA40Y0","atts_01GW2HTYMTC9M3RQA8WPJMNB2G","atts_01GW2HTYMWZVAFWSDWBM2P6684","atts_01GW2HTYP1FSR5S5HY5HMN0DKW","atts_01GW2HTYPS4M8Y6B60DEWD2CR3","atts_01GW2HTYVCC9SQPTZB9GM4V61Y","atts_01GW2HTYVE4DK74KAC94VTJWH4","atts_01GW2HTYZ1D170AJ430JN1MGKR","atts_01GW2HTYYX2XKQVA65M02377JB","atts_01GW2HTYZ0NTGV0B356YYFVH30","atts_01GW2HTYZ5NMK92WWJHB0CA9PC","atts_01GW2HTYZF91TPJ4XJ91MS2KJW","atts_01GW2HTYZHM1GNWT9X6JMBFQV4","atts_01GW2HTZ00JVWADMYXSHWS5GAK","atts_01GW2HTZ02YNBWH8K1C7FRR2DJ","atts_01GW2HTZ03DCWZP7NH1PFS6YDD","atts_01GW2HTZ0ZNQKXV66GS1THW6W4","atts_01GW2HTZ10YJFXWN33B4DNS895","atts_01GW2HTZ3X4HH7VPB5GA79DQ53","atts_01GW2HTZ1Y07A19D0CRRDMZ65M","atts_01GW2HTZ2Q6F22W38C4N5CR86V","atts_01GW2HTZ2SAPSS3MJQVSAT76NX","atts_01GW2HTZ3554AHWJVCEZPS91G4","atts_01GW2HTZ3XQJHETGCD88JP6GQ7","atts_01GW2HTZ3ZAZJQD47VTYENE8AB","atts_01GW2HTZ46HV10AYFS87WWA0SQ","atts_01GW2HTZ47HXBQ3AWVMV94Q4ME","atts_01GW2HTZ48KAJ27NZ0S47X226C","atts_01GW2HTZ5BJ0NQAXTZCHQQZGFP","atts_01GW2HTZ5RV6ZZHPEQY1TMT14N","atts_01GW2HTZ5YXZ0KCY38MV4CC3X9","atts_01GW2HTZ6KFF3PK1X7M5RYSVYR","atts_01GW2HTZ6N1SD5GHWAF8VMXZRZ","atts_01GW2HTZ6RE0MABB2W59B6P37W","atts_01GW2HTZ725SYH3D4DJG5DJ0J9","atts_01GW2HTZ73W3ECN4VNZ0PR2TH5","atts_01GW2HTZ749B4FD4T3Q6K5H583","atts_01GW2HTZ76HHT0F3NDP2SBNE3N","atts_01GW2HTZ777RA48YQ8SJDFEZ69","atts_01GW2HTZ7AAJ3CJJG5B7CCAPJF","atts_01GW2HTZ7A1DFQMJ0R13EE591G","atts_01GW2HTZ7BBJGXJ04E4N4KJPA1","atts_01GW2HTZ7HKJY575V482NYT19N","atts_01GW2HTZ7NPJFD1ZGYGDW2CHCX","atts_01GW2HTZ7P594N8RNDRC5S0Q1W","atts_01GW2HTZBNWFCGT518BQ81JT03","atts_01GW2HTZBRFZ9APV4EHSN66XEZ","atts_01GW2HTZC55WM6K67E8KKVA5Z0","atts_01GW2HTZC94TRWJMTS05J467R5","atts_01GW2HTZCBNNW4Q9BAJV4S676K","atts_01GW2HTZCPD3WTNNNH89K1K222","atts_01GW2HTZDKAH2PVNB5BQFXD3N5","atts_01GW2HTZDMCGXT5KPQJGSX0GRM","atts_01GW2HTZDN48684JHT7XQ3Y9M5","atts_01GW2HTZDQCPR6NDYW7SKCEXP3","atts_01GW2HTZDRVHKVXZWQTW4QR7ES","atts_01GW2HTZE06AX56EVKBFQ956T4","atts_01GW2HTZE1BKHEJ371CDZ2GAT6","atts_01GW2HTZE2K2QPSP5PGA2TWW3B","atts_01GW2HTZEDC3JRX38A80PBWAAC","atts_01GW2HTZGWKSV4Z1YHPH5JZYBF","atts_01GW2HTZMBMHAW7YHS4DF7865A","atts_01GW2HTZMG0M1X4GJ2SRSPZJT7","atts_01GW2HTZMKQPBCTGZGF9GX4NXQ","atts_01GW2HTZMNW6JJS2W7Y5TDDCJP","atts_01GW2HTZN516EBH20AGNZ5657A","atts_01GW2HTZN57EBVQRKQMT3DBWF6","atts_01GW2HTZN5GG2S6H7JFWS3ZF5D","atts_01GW2HTZTVARXR8SY56VCHJ0YK","atts_01GW2HTZTX6KS8K6R9Y2JNNGTM","atts_01GW2HTZVFGJRWX113R8WVZF8M","atts_01GW2HTZX3PMA8XX2FBK116DFG","atts_01GW2HV01A9H140HADJP9XKDBD","atts_01GW2HTZZNBN3MH6V5RHFT0H1X","atts_01GW2HV003VY6VVA9N4GMAD815","atts_01GW2HV0092DMX5K04KXRBFKXX","atts_01GW2HV01504QECN7431P5AFC8","atts_01GW2HV01DVHWJ09RB8E6C710A","atts_01GW2HV01G81BCPJS01AJJ5BCN","atts_01GW2HV01KN5KB08DH0QE5MEZE","atts_01GW2HV03Q6FFZXG3HZAXNCAQZ","atts_01GW2HV3XWWGBZJJ706RGXC7HK","atts_01GW2HV4781GFQ43D2VHVN0QGX","atts_01GW2HV45Y69K6YSRTDC5RHVYG","atts_01GW2HV46C92T3BR4K84RA4HHR","atts_01GW2HV46QMCFSGA83H8K6JW7G","atts_01GW2HV487MVBKEHRDSB776KS1","atts_01GW2HV48A88FMPCBFTCX87STZ","atts_01GW2HV48ESGMWDM7G0QPEZSX6","atts_01GW2HV4ETN063VZWH406GQHZN","atts_01GW2HV4FWZRH8ZWNBEFCDGQRW","atts_01GW2HV4GXN3X5YAGG35JFE58B","atts_01GW2HV4H4JD0AHMSVFPRWJGWA","atts_01GW2HV4H5SY89W96BDZBFW31M","atts_01GW2HV4H69WSK5ASYV9PTFZJ8","atts_01GW2HV4H7N1GHGJE6N7E71KJZ","atts_01GW2HV4H8CRP21BY8TVT4C4EV","atts_01GW2HV4H9KR2SVHK9V03N50J6","atts_01GW2HV4HAT2PHZVPXMZZS37SR","atts_01GW2HV4HBBRXSS6FSHK14D49G","atts_01GW2HV4M9EQTC1NE4HNPW80F0","atts_01GW2HV4MQS12Q5D8GB7N93Z0K","atts_01GW2HV4MRNDSEFRSJ9QCPTPF5","atts_01GW2HV4MX807FB8GTX6RFVXGZ","atts_01GW2HV4MZ88TFSVQJ40NMF448","atts_01GW2HV4N1V2486ERJ4TC9D40F","atts_01GW2HV4QX0ACMWXF1QZHTPY8E","atts_01GW2HV4TFQV4PPZEWXF79PXQV","atts_01GW2HV4TAVBYJMP1KG2W8MAS1","atts_01GW2HV4TAT59270CE0F41YT63","atts_01GW2HV4TCCXTSS8FK513NWWWN","atts_01GW2HV4TCD0E1MS5XWASFHV5S","atts_01GW2HV4TEN9GQC66AERTDAFTE","atts_01GW2HV4TET83DDV1SDJ2KY4KE","atts_01GW2HV4TF98RKY4W1G7BFJ5Y9","atts_01GW2HV4TWGSTPHGGB28J9VWMQ","atts_01GW2HV4XH0GCP3546ZTDC3JRT","atts_01GW2HV4XJGQCJNDH5J90W2AGK","atts_01GW2HV4XKCGXPS7EDM2ZNP3CM","atts_01GW2HV507E9JWF4XKTR9X1YJY","atts_01GW2HV51CVAP9CWJ0PRZPWXV7","atts_01GW2HV51F9TFGCR9VGCG9EXYY","atts_01GW2HV50605PRWT84SRCXSQGH","atts_01GW2HV508QXR8T4VTZCNGA293","atts_01GW2HV50HQ0QAST8ES9329HW2","atts_01GW2HV50JA0PJRW076B5A4TXM","atts_01GW2HV50K6997PMA1M6VJ1J76","atts_01GW2HV50NPH19QF0RWE0PZSQ9","atts_01GW2HV50PXWQBRGYKM89RC5NE","atts_01GW2HV50QDRXHJVSZ4K9KF9Z0","atts_01GW2HV50RNMECVE9SX3WCC84S","atts_01GW2HV50TGTHAD44WVTVDMYSJ","atts_01GW2HV50VYHTW7Z00PZYS2FPW","atts_01GW2HV50XBKQ47W2M5CR8P7CA","atts_01GW2HV50Z65K2SVYKPBTEAS6X","atts_01GW2HV511XW45TK954ES39P31","atts_01GW2HV5138YZKYA1THVKBHVRD","atts_01GW2HV515PFKE7VESACBG7DNA","atts_01GW2HV517B4GFV5VH3X7J9N78","atts_01GW2HV51DAE70SRVYY9TYG9FJ","atts_01GW2HV51RFBHB5Q5HBQRDWCWF","atts_01GW2HV53925MA96KJS3500Q4B","atts_01GW2HV53775MHXTN5Y83DEJRY","atts_01GW2HV53Q2VEPEFR5H2A9NEPT","atts_01GW2HV55QH9GSA5K6DTB9PZ6G","atts_01GW2HV59V68NSFT7KHFFK56B9","atts_01GW2HV59SXGNT1BMDC1VC425X","atts_01GW2HV59XFCDNSPNC66W1EHVJ","atts_01GW2HV59ZV1D4H455A6BY68A7","atts_01GW2HV5A0MZK4PFC86P0BZ2BG","atts_01GW2HV5CWJ6SSXNEFE2RJGXVK","atts_01GW2HV5EQG0YHM1P0X19HS579","atts_01GW2HV5ER8NJTV641NDRHBBNX","atts_01GW2HV5HQPM3T3CHJPE2EQDX7","atts_01GW2HV5M00P6S18JPRVFX2E75","atts_01GW2HV5MG0T5YG9RDB9JHXER1","atts_01GW2HV5MHJ66V5KPY8KG9JKV9","atts_01GW2HV5MWCYMNT3MNDC71STP9","atts_01GW2HV5NKJ5S7P1CCRHZY7SPT","atts_01GW2HV5NNDSS6ERAQAPVCAN2F","atts_01GW2HV5NQCPE0FH1QZGGNY9T4","atts_01GW2HV5RWAZQWXZQHZGSN72PB","atts_01GW2HV5ST9P478CKAC972V0N0","atts_01GW2HV5SQ0ZVKGR1HVBPPPGP3","atts_01GW2HV5SRSRHVFNJJ5RNFHEMW","atts_01GW2HV5SW5CRQG5D63FADAQRT","atts_01GW2HV5TCMYP49PJ9FC3M0JBJ","atts_01GW2HV5YVEM4M580KE5ME99Q6","atts_01GW2HV60QE6TAEJM1ZBQ6P22M","atts_01GW2HV60S0YBJDEJXSEFXFBN8","atts_01GW2HV60XG43YM47T1YSVN2T3","atts_01GW2HV60YASXTD3GGH8A0EK61","atts_01GW2HV60ZRHYTSTT55YTSNTAT","atts_01GW2HV6130GQT6A7V97T6DXMV","atts_01GW2HV613ZMD15AXX8WXQF2W3","atts_01GW2HV61PH315MZ6D979ENR3R","atts_01GW2HV61ZFFX63A6862JSW4VK","atts_01GW2HV62C416ZBRPTGEBZDV27","atts_01GW2HV62JMYMAJY4464CD35FX","atts_01GW2HV62PHP1D9V5MS933HDAK","atts_01GW2HV699JXK7TDVWBZ6XMHT1","atts_01GW2HV646V996Z89N0SCVN725","atts_01GW2HV64P421JJ8T0HGP6YE9W","atts_01GW2HV64R2ZGWHSR025BYBQ9B","atts_01GW2HV685EM9V642CQT1C0WCP","atts_01GW2HV685K6TE82AAWAJS80FD","atts_01GW2HV68650WT5JWATHCDVK54","atts_01GW2HV6981C3R9WMPZXENKDJF","atts_01GW2HV69ABHQEE1JSYQD7ZPK6","atts_01GW2HV6AW4JGWX8F7H6QDKR1P","atts_01GW2HV6DPG2R1C3CGEW0BDQMX","atts_01GW2HV6DPPP1NSPR0MXMMR984","atts_01GW2HV6DQYXSDKTYP2Y73JR5Y","atts_01GW2HV6DR8HQKDYRXSATPV0ZR","atts_01GW2HV6DRTSQ8NSWWSN8WWP1Y","atts_01GW2HV6DR614W72YK9J1H9TD3","atts_01GW2HV6EJR24SZMVNN4N1FJ8V","atts_01GW2HV6EQAF71N45X9V50WHWR","atts_01GW2HV6FNYGDKGF0GXWCZJP8W","atts_01GW2HV6FQJGWFA7A63S4DGFC0","atts_01GW2HV6FRXHFFPG1X2MAHYS1G","atts_01GW2HV6GYZ9TQF9BG53TPAS53","atts_01GW2HV6H19418ZYA7ACGYD8WF","atts_01GW2HV6HJZ3XEZB27Q6VD5W36","atts_01GW2HV6N8CXCSYB07X4HWZ8YS","atts_01GW2HV6MVB3Q7SW7WMKNY75C1","atts_01GW2HV6MWNNF04X7310EE1SC4","atts_01GW2HV6NAV3XEKB0AGDHV1SMF","atts_01GW2HV6NBA5NT1Z3ZP29RB4PR","atts_01GW2HV6P3AHMHPSMJ8GEEEHWA","atts_01GW2HV6P6BTHTS9G7DGWT1T3K","atts_01GW2HV6P7M3SC7BM22STD1CH4","atts_01GW2HV6P8MSPD1Z7M3FRX269R","atts_01GW2HV6T8K29YVSTC182FHD8Q","atts_01GW2HV6VR0NDN500PX2NF3R45","atts_01GW2HV6W38K1ES00Y2Y61EHA0","atts_01GW2HV6W42XH63JDYDNQP4SCS","atts_01GW2HV6W9J8F8JZCVQ1J6QJ57","atts_01GW2HV6W9XYKPRAYJY5P21RQB","atts_01GW2HV6XK776A78FXXCF3J3KW","atts_01GW2HV6XHXZ1G1SV5FR6NTKBJ","atts_01GW2HV6XNFE9PGYEEHGDP9MSS","atts_01GW2HV77A3Y0E7K24Q834F4P1","atts_01GW2HV6XQTNYGZFHPVH2R1T5N","atts_01GW2HV7238YWXM2YDN00WKDZY","atts_01GW2HV774V73590PMX8TSXRR0","atts_01GW2HV776CSAYB7WDN6BWFQ4K","atts_01GW2HV7785CBS0MQBH9SM9QF4","atts_01GW2HV7DEX18T61PQ71XXXHAH","atts_01GW2HV7DFMVQZYHHDW0R6N0FG","atts_01GW2HV7DGB6D4HXZKHVPXRF5C","atts_01GW2HV7EEATZRTDPMXQ5HSRD6","atts_01GW2HV7EPMC69J2PCWCPKQTJG","atts_01GW2HV7F00TQ5ZHGTBZPJFW94","atts_01GW2HV7GGP97RT7CNCE8AWH16","atts_01GW2HV7GK459D8WTT6GNHZTJ5","atts_01GW2HV7GN8HWTH68DBKXM32XB","atts_01GW2HV7GQ2KP27X69Q62AKJZH","atts_01GW2HV7GT1MN82X1WGS6WDG18","atts_01GW2HV7GWK9H354Q23HBASHXN","atts_01GW2HV7NZ3CP8F4TY25TJJS53","atts_01GW2HV7P3Y0GVY8BJDTXMF9W5","atts_01GW2HV7P559VJHGEB5G3QQ5HJ","atts_01GW2HV7P7XN2GKY92NF7DCJ7S","atts_01GW2HV7P8206AT5VVK3D5SGFV","atts_01GW2HV7PA12M0BTGZ7DWFW3A7","atts_01GW2HV7PKM894ZGCCKVWQ3MMX","atts_01GW2HV7PM1TXMW3XWCPTVASHG","atts_01GW2HV7Q0H017XT3NC33DMFT8","atts_01GW2HV7QCJGR7ND5VRGRDWQFD","atts_01GW2HV7QN38X8G547Q5Q4EZJ1","atts_01GW2HV7QVNCD2PGJZNX92E039","atts_01GW2HV7QXM9GCEH9X92YA4121","atts_01GW2HV7RT8EAQDSRFBZPWGCYF","atts_01GW2HV7RVK3ZAD452KJPET09J","atts_01GW2HV7RWB29S7K51JY4PNVY6","atts_01GW2HV7RX8G190QT2ETS2GFBV","atts_01GW2HV7RZ5D6GBG4ZZYQJPVCZ","atts_01GW2HV7S329MK7DESJVRFR9AF","atts_01GW2HV7S48KMQF57D6PY2RMPH","atts_01GW2HV7S5976HZJAD2WRM32R2","atts_01GW2HV7S6FMTX89YEA8KR920E","atts_01GW2HV7SSKRKCG1G503BB1DTT","atts_01GW2HV7T13G7Q1S88Y6E1CE14","atts_01GW2HV7T80YK052WV9PKG2XHV","atts_01GW2HV7TKHK933CZRNZKNC43J","atts_01GW2HV7TMNV9515CWZGYS15HS","atts_01GW2HV7X1SH3TZB14THW6W6E3","atts_01GW2HV7TT2C05C4N3XMX13EG0","atts_01GW2HV7V1MGP8EC0KTYA8ZXQW","atts_01GW2HV7WA2BT5AAWDRSG58SZJ","atts_01GW2HV7WC3CFWFRC9YGVCS7FD","atts_01GW2HV7WR5AHD7XJFTJ5BDVP7","atts_01GW2HV7X26RKE0BEYGSWNNTTW","atts_01GW2HV7X4PG0QP4YP97WBTGT8","atts_01GW2HV7X58B5WEZ5G1KNXVYB6","atts_01GW2HV7X73JNCJTTDEGT3413M","atts_01GW2HV7X8C3G2B7M95XQ8J51G","atts_01GW2HV7X9TJ8DW6KYKGXD6PHD","atts_01GW2HV7XA9WCK6KDR47XEMQGJ","atts_01GW2HV7XCM0WX0Y1F03RBQGDE","atts_01GW2HV7XDV9J1XK81R0S4GX8W","atts_01GW2HV7XEWFFSGX35RSH1X1VD","atts_01GW2HV7XFNK8KPTQD2983P66Z","atts_01GW2HV7XHXD1697G7VMXP755J","atts_01GW2HV7YFEVBN4NK55WJGK1H0","atts_01GW2HV7YR6A4MCNGACM1PABPN","atts_01GW2HV7YSQNBF1AS87QNS0YEF","atts_01GW2HV7YTRPEX2NAF826EDDSF","atts_01GW2HV7YVMA78CGHAARMDCT0M","atts_01GW2HV7YWBQX06VCWY4PZ5KEF","atts_01GW2HV7YXDNE1E5Z8MK19V48S","atts_01GW2HV7Z3RE8KAV7GKJ346TCY","atts_01GW2HV7Z4MDEWMXB3XR8HX8Q8","atts_01GW2HV7Z69671NXVC0XGMHCS2","atts_01GW2HV7Z78GQMMY2X9T7JNXVD","atts_01GW2HV7Z8NJ76X328SFCVPBY9","atts_01GW2HV7ZACGTVB52KSRBS1QDM","atts_01GW2HV7ZC764K2T4PB87ANAW4","atts_01GW2HV7ZDF6751039KSS2AZGG","atts_01GW2HV81ZVCEVTBBSM51PRFSW","atts_01GW2HV820X94BBNC0H0GCF60V","atts_01GW2HV841KM59W6XFB2HKHS0H","atts_01GW2HV85JA0WP252JRXM4V646","atts_01GW2HV86B9R7EB720N5P3XCB8","atts_01GW2HV86DSGQV2N0QZHS16XWK","atts_01GW2HV86EJY54QVW4YAWB7FCH","atts_01GW2HV89CWZF583C6T0TQCEN7","atts_01GW2HV88293KGPC6CJAGW7483","atts_01GW2HV883DNW2SE6AZ7P2Z9MD","atts_01GW2HV8BJQMKFV0S57MB1TQ8G","atts_01GW2HV8BMRJBN6HXSNMJMEJ09","atts_01GW2HV8BXNCF84YWQRJ7RJY4E","atts_01GW2HV8BZ4FZRFGRKHXZ5PKJX","atts_01GW2HV8C291GTZFHXGEZH86WT","atts_01GW2HV8C3XGCRZWWVMPPV5PGS","atts_01GW2HV8C557WKH5JZSVBWX3GN","atts_01GW2HV8C6NHTXHS4XDANZ822D","atts_01GW2HV8CYBWRGEMSCE14ZEDA2","atts_01GW2HV8D2E98SZQCSPV37DEF2","atts_01GW2HV8DVZX204C72KDS7WTQN","atts_01GW2HV8DVCHNAPBD80G98ARQE","atts_01GW2HV8ESRPMQZGHED0EC0R1F","atts_01GW2HV8ENMNTMPKTSF8EQNEDX","atts_01GW2HV8ESK4G5XG00Q300NJFK","atts_01GW2HV8ETQXB2QQZMVHTPF8Y8","atts_01GW2HV8EY1YZYV1BDE90JW98P","atts_01GW2HV8GTW93QEF2DXKQ4FPEM","atts_01GW2HV8HWZWR8KMVB6WGK13GA","atts_01GW2HVE3YHJQRC2HVWH5E3XXN","atts_01GW2HVDJFZEGMEKFC8T8D7XA1","atts_01GW2HVDMZT5BGDVB4HEMH84FN","atts_01GW2HVDN0KVFS4QNFSF9VZYC0","atts_01GW2HVDN3FAG6XRXPXYGRSWPC","atts_01GW2HVDRK5YW75YVKR6QMZX7W","atts_01GW2HVDTABNCSPMZHFXYKV14D","atts_01GW2HVDYPVMRH9B94C49GZ9B4","atts_01GW2HVDYS15NTGMR0Z61WN77Y","atts_01GW2HVDZTT99K1KYSN6CF35X3","atts_01GW2HVDZVFZ8E4TPMKVYE6628","atts_01GW2HVE0002Q4HF38700QDHBZ","atts_01GW2HVE12FF3KSR4W9D751Y8T","atts_01GW2HVE2ZDA04FVCHRG35F987","atts_01GW2HVE3A2H0TX297Z3HZB3J4","atts_01GW2HVE3RHN9DNJKA6S5HF585","atts_01GW2HVE3TZHWJ7R67VRNT95CW","atts_01GW2HVE3VR99DBYSXFBB9AMMC","atts_01GW2HVE5FN676WRV48ZWXX6HG","atts_01GW2HVE6EZA7QQYE277F6EGSZ","atts_01GW2HVE6N5PAS6YRHWGJ8K0MG","atts_01GW2HVE6PEBP1F7GXBZE573JJ","atts_01GW2HVE6RSV5B9966BQKQ8A5Y","atts_01GW2HVEC3JB9BG6RRNF96KMF5","atts_01GW2HVECEED7V3H1Y2CRTP7ZR","atts_01GW2HVECM2DRFVSHCR36TXMQJ","atts_01GW2HVECNM8T08Y3T7J45D217","atts_01GW2HVED8BP3CKB4ZTF1VTXGQ","atts_01GW2HVECTC8H2RQHDHPD4EC3F","atts_01GW2HVECVXE1JKSH7Y8Y9PXDG","atts_01GW2HVECX301JMG6SA6HA5510","atts_01GW2HVED9Y92X5BR594ABDMVZ","atts_01GW2HVEDAGKBE8MW8HTAZXS0W","atts_01GW2HVEDGG4M4GKSD8V7VWE9J","atts_01GW2HVEDHVZCKZ7QN6R8FYZT1","atts_01GW2HVEE1AGKQJN8A9812P69Y","atts_01GW2HVEE26MMGS2YDXWQXWDSQ","atts_01GW2HVEE4SH89ZBMM277QCCB9","atts_01GW2HVEE72NMHCNCMJSN1XN1F","atts_01GW2HVEFVWCGEQWB2MD3QHA7Q","atts_01GW2HVEFWPJ9ENAPHRQM5NSGC","atts_01H29ENGPYPAMC76WR8AGH9WV8","atts_01H29ENG8E43D69GB5Z8MG1VFG","atts_01H29ENG89K0V6MRPG4JWMX738","atts_01H29ENG8SM40WHHYCS3RJW4MD","atts_01H29ENFW8A9REERT26JRBR3G6","atts_01H29ENFDX0JK9YAZVX5HKYV0P","atts_01H29ENGMZ4Z6SMPQME79KSKY0","atts_01GW2HTDFA99488BXAG5D8Y9PF","atts_01GW2HTDFE52TVX8XJCPV0X4K5","atts_01GW2HTCX55CRCW5Y77AQ129J0","atts_01GW2HTCX4SMTQ5VE4N8RQEV1E","atts_01GW2HTXQF4T9X65GK0RMH7E4Z","atts_01H29ENFDB8KYC5GW82PVNXC3Y","atts_01H29ENFCZPG5FC4021TW76JPX","atts_01H29ENFK6T2QHGWTKF4F2BCRG","atts_01H29ENFDKSZ3M230YGC3434DV","atts_01H29ENGPPG968XEBYZK798Q8W","atts_01H29ENFRBMVXSHMB0XRBGASRJ","atts_01H29ENGPQN36WGYM3Q55VDMXG","atts_01H29ENFWXNQCPCCNKWN082DNK","atts_01H29ENF9G4QEA13XP9JD40K39","atts_01H29ENFNA6KCP9VW242H3KAJ7","atts_01H29ENGPW9V3HC4D2TGH6X2PZ","atts_01H29ENG9ZN03DSWZ8ZF2X0CJE","atts_01H29ENGR41VXCXME1KG0XARDV","atts_01H29ENGPQ4FC92V6J85T3BQJ6","atts_01H29ENFD8RKFNHTAVMTM8QT3Y","atts_01H29ENFEJQ4VEV1HQM8EACCG6","atts_01H29ENFE9TS0HGG5NJSSETJ1W","atts_01H29ENFEEKCSWJ1MJVCG45GKV","atts_01GW2HT85N7CM6VZKCV548TXMY","atts_01H29ENFCXFPA566YW612M45C8","atts_01H29ENG451NBEXYY97XRBKFPZ","atts_01H29ENGTNNB828MSJNRZCMCPH","atts_01H29ENGTRDB89GWEGM0SSKBDP","atts_01H29ENFB9QRSYDMRKPJ2E9CQ5","atts_01H29ENG4DDJPM803QDPBC45AV","atts_01H29ENGB6R0KYM5NYY96EGX07","atts_01H29ENGTJ1TNEHJ8EN8FTEWV4","atts_01H29ENFCK6DVC3JZG5VEZFZ0D","atts_01H29ENGQYB9C8PQKR2KNM811M","atts_01H29ENGR1YNR0TR06T30EPZ76","atts_01H29ENG2FR5M47418NNTYNDHB","atts_01H29ENG2P0E6YM7JV1FSQPF17","atts_01H29ENG2K01PDT2MNV3PNM04K","atts_01H29ENFTDZJG3WYD1JC1F9Y33","atts_01H29ENGR28QF0D10GE4K3M8J7","atts_01H29ENG2HYTZNMYSF817NHGAJ","atts_01H29ENG2D9EQAC74B6RQ43B02","atts_01H29ENFKHTEEVFGPAFZC9C9NS","atts_01H29ENF9BFWAG2SW5EZG7H8E3","atts_01H29ENG9NRNRSP8A8EPW2FV4C","atts_01H29ENF9MC5WXYFDD9DDZM2R3","atts_01H29ENGPBG9TWBZQF10ZGJJ84","atts_01H29ENGRTG7JW4RTZE32WACTV","atts_01H29ENFFCP578HVADCA0TXY34","atts_01GW2HT8X7BDRED4KHP26EX40C","atts_01GW2HT8MYK5P8VWCPDZ056ZQ0","atts_01GW2HT9GN9P7RXH566QSP5FQE","atts_01GW2HT9GPA6MWTCZSRAMQ959F","atts_01GW2HT9GKSJC46F4J0XMKBKEV","atts_01GW2HT9GMDP2MS1CBX64TWV8H","atts_01GW2HTA2D276VB6G93T163538","atts_01GW2HTA2RRJ2KPRYPWHGY0WZQ","atts_01GW2HTA2GGKVG434H8HXF649S","atts_01GW2HTA2NM8EE977DJ9BZ2J3P","atts_01GW2HTA2JS3SRKTFXWWYXRZRR","atts_01GW2HTAQA6M29HY3ERXPEZDET","atts_01GW2HTAQ81PFXQSRB61XC4H9H","atts_01GW2HTAQB6BEA8TMY9A6A6YPM","atts_01GW2HTB68GKC6H4E4JBE5TDP6","atts_01GW2HTBQ4NDHJ0YX0K5CSPH7W","atts_01GW2HTBB53MRPRHK9EXF5PQN5","atts_01GW2HTBB5F4CYS1GXPZ6AW9QY","atts_01GW2HTBB29H7DMWDB35B06CQV","atts_01GW2HTBB25372V71D9EXNNMYC","atts_01GW2HTBB24H1WERCW4YNANF8Q","atts_01GW2HTBB3YN8PSZVK8EN81S2E","atts_01GW2HTBB49N2Y7FZ1EGSD1DGQ","atts_01GW2HTBB050N9AD67HQ5QK1SF","atts_01GW2HTBB1H4F4R3ST7EYF0WYR","atts_01GW2HTBAZS45RS8QH8D90QGS5","atts_01GW2HTBHH5Z52H5A5SCF2XEQT","atts_01GW2HTBHH436GCQRHWBEE5NW3","atts_01GW2HTBHRS6YC5YG7Z60XESMP","atts_01GW2HTBHMZN1YV4K6W2S0ATQ3","atts_01GW2HTBHNJWSAHA4JCM4QRBKG","atts_01GW2HTBKD6DB2AQ0W9DMCTT4X","atts_01GW2HTB6W5NTKJFZ0N594VJB1","atts_01GW2HTB6WP4BB5SFX3ZXFN01Q","atts_01GW2HTBX4AKRGERPPXEQBDCFD","atts_01GW2HTBX5HHK2A431NH3SXHJC","atts_01GW2HTC2120S1FFVYB6TFM4TW","atts_01GW2HTC21MNGX21QRS2XHJ15E","atts_01GW2HTCS44V8GZ9XYRMW8Y9DQ","atts_01GW2HTCS4YY7T7V42NC1H62TV","atts_01GW2HTCNWPATQ4GQGPFHF9KS0","atts_01GW2HTCNWD1H2KHP70P6F9ZPY","atts_01GW2HTCSGWAM4HTQ29BQRNQHK","atts_01GW2HTCSEASKQE47RM9PY9T90","atts_01GW2HTCKAQ8QPXDA7SJADQ7FF","atts_01GW2HTCNH0VMH8FTA9BWV2XT8","atts_01GW2HTCNDDD68EP7DTMA41K09","atts_01GW2HTCRK7NJ4NK3BS7Y48TM2","atts_01GW2HTCJJ5KKB3SGDRYH0PS5D","atts_01GW2HTCQDRQ27VJN49TK8B3TD","atts_01GW2HTD3T2MGY6TEM240YHRZ4","atts_01GW2HTE8RA9QZ3VH7F5CMX8QW","atts_01GW2HTEMBJ1CVZCD9KQAVE5QZ","atts_01GW2HTESZQEBVA8QK8SCK1BHZ","atts_01GW2HTET2SY79KA5Q8514CRKX","atts_01GW2HTESX39RHA0G0A0EZECVX","atts_01GW2HTDVQHB3T05NEQ9G0HQ9Z","atts_01GW2HTDVV95C5T7TXXFA3QT2K","atts_01GW2HTDVG84K8JJE9RSV1R7W0","atts_01GW2HTDVJHPZV0EM9RQ93T8AR","atts_01GW2HTE46P3TQCSCCZ8DRB6J1","atts_01GW2HTE4MDQ2XFHEEHPCXDAPR","atts_01GW2HTGZY21TX8Q6EFXK177GW","atts_01GW2HTFM0DBSEMRHHP3X0ZK5A","atts_01GW2HTFKW1QH5FAFDAFVZE336","atts_01GW2HTJCDGAA2W11DNX35YT09","atts_01GW2HTK0YJXX2EQ8NFR0Z9FYE","atts_01GW2HTK4KCT6FRRCCEFA74W01","atts_01GW2HTKRSG7FVPHV39V6NGSS6","atts_01GW2HTKRNM8YNX9A8A449RGBG","atts_01GW2HTKRQ96XMPWJFJ9ZY8WK6","atts_01GW2HTKP6DTYSKQBRWH6GFRP3","atts_01GW2HTTPY3ZQ1XMYRM1E1Y49T","atts_01GW2HTBXZ6FVXV4TARHXKEYYZ","atts_01GW2HT9PRDFXWCQMFWPV11T5Y","atts_01GW2HTMZFJXRHRBP105WH5ZVW","atts_01GW2HTW5EHRVB6CN0BFZATZFV","atts_01GW2HTBZ9WAKFCHVMMTNXDFEM","atts_01GW2HTWK3TNXEQ0G69TBNF908","atts_01GW2HTWN7YBKXGNZ88RZ8AGRN","atts_01GW2HTWMYNV29S1WZM7NYVAVZ","atts_01GW2HTWMNDRSYM5QY5XR84ME9","atts_01GW2HTWMR5CTGE5JYM70BN0S2","atts_01GW2HTWMV0X63XT5F71Q6J5V7","atts_01GW2HTWN43P3MEDDBG4DYWV3X","atts_01GW2HTWQ1N2P5H2C7J7TVRYKM","atts_01GW2HTWQ2CFQFH6Q93F5BFS7V","atts_01GW2HTWPZ8QF1BV4AT2JARQPW","atts_01GW2HTWQ0J7BHCAQJ9QBYGTQF","atts_01GW2HTWQ1QM07QPTAJX4619X1","atts_01GW2HTWQ2KG5DZG7XX3S71880","atts_01GW2HTXFVKS73PZJSP5073AKH","atts_01GW2HTXFKPCZR20JFA6MM35ET","atts_01GW2HTXMF6DF535WXYGBAPP42","atts_01GW2HTXQQYS7XGRQMNNDGD4BW","atts_01GW2HTXQRQVFEKGVRQK3A87RY","atts_01GW2HTXQNT6P5TFE82606SD6T","atts_01GW2HTKZAJQDBFSTNB9PK4EG1","atts_01GW2HTXSE1XCP0R6ZHTBHJPDM","atts_01GW2HTXSKWEFC7FPAWXMKHWZY","atts_01GW2HTXSMGN4TKZJXVA8SDK1W","atts_01GW2HTKZ1Y5TZWC7A5C41JFPP","atts_01GW2HTKZ3BXKY8PF00XBE098W","atts_01GW2HTKZ8AS4WDAYFRPZ680JE","atts_01GW2HTXHP084NVGH8PRPGDXZ4","atts_01GW2HTJG1ADQAE515E2E6D2W3","atts_01GW2HTPB5N1ABFWVHGBJ5P7MA","atts_01GW2HTYJK23FSHMNRP7CK3VFF","atts_01GW2HTTQFFXNE60CM8KKAB65H","atts_01GW2HTA61TB1CCTR6685732X3","atts_01GW2HTZCB2HEWQE90P4RER055","atts_01GW2HTZC9GH2MVD4HTWWW0BKQ","atts_01GW2HTJT6YQB8JY10PB3B83ZB","atts_01GW2HTMHMRR8MKGRBRQGY61X2","atts_01GW2HV641Y9ABWJ09505K89ZQ","atts_01GW2HTH0AMWMZXMQ9RQSXRS54","atts_01GW2HV4VXQ54C4RGQYZ02HNVS","atts_01GW2HV4W2H46FYMQGQEVK62PR","atts_01GW2HV5MFP35EHT7SV1JHW4QJ","atts_01GW2HTE4NFZ3AYCEP0W5MRHEH","atts_01GW2HV5MVB78B0NPZBVTW0144","atts_01GW2HTD78MGPG68T9X3JXEAKE","atts_01GW2HV6P8PTRXQGH3481CNCF3","atts_01GW2HTKYFJMHAJWFT725DFNRK","atts_01GW2HTEAEC1GBG7HVFVWQMZP8","atts_01GW2HTPX1F7K43027AWBBT0QM","atts_01GW2HTNQA71PCNJE314ZZHXTV","atts_01GW2HTNQAP7H9P63MHDNC110N","atts_01GW2HV7H45ND10HQTHK68DWJ4","atts_01GW2HV7HCJE1B8FJBBSWQK3X3","atts_01GW2HV7HB82S9QPDVA7604QVW","atts_01GW2HV7HEDFG7JM1E9HCD87K8","atts_01GW2HV7HF300SB9YQKAS6KRGF","atts_01GW2HT8S1ZXEFMF1SEZ7EBA0G","atts_01GW2HV7SG7N174M4MBBMSX7VG","atts_01GW2HV7YTFJNXYZ3G9AG3DS2J","atts_01GW2HV81F15TTV6SB5D9A2JAH","atts_01GW2HV81HMK8APJS23W975XAM","atts_01GW2HTBNFJQR08H5A3M0FS9WG","atts_01GW2HV8ETXJWZQ776HVH1HQB2","atts_01GW2HVDRM5B7KQ4C79421NHA1","atts_01GW2HTMZZ38FFDD4G2Q6RXFB9","atts_01GW2HTMZYHMNBEHPXA4KHYM4F","atts_01GW2HTPW60JNAVZ12JX9DRMG5","atts_01GW2HT8HB3WZJMM9993879GKY","atts_01GW2HT8HDMGFZH21B94Z4NA2F","atts_01GW2HT8HFBW955D20AATKEM28","atts_01GW2HT8GK0SQPY3K6GPEYQN7N","atts_01GW2HT8GRVMGWZAFMGQPG9TPX","atts_01GW2HT8X95G5YJPD3X2FD8QEP","atts_01GW2HT8PRDA4C4YCAV14SV9A1","atts_01GW2HT9C2YH13YAB8C7EE0DXX","atts_01GW2HT91ST46QKN6PFM310GV3","atts_01GW2HT93T9R0W5SKD3TX1HQBC","atts_01GW2HT93QGK7N25A6NVF898H3","atts_01GW2HT93166V6HGK0E2HZZH5M","atts_01GW2HT9315PPZBCR61JXSWNWF","atts_01GW2HT933CJ27CNSP5BM6V91S","atts_01GW2HT9510E3Y1RYAZXZVR6BY","atts_01GW2HT923M28NYJY657BVN5HY","atts_01GW2HT9245YE6605MES7JE09R","atts_01GW2HT9248GQH8KBR3422DCQ7","atts_01GW2HT9FE5ARCNCQHREG91V57","atts_01GW2HTA1EDXZ2JP5B4RPJ7FXP","atts_01GW2HTA16QF746FWVEM0CRXAG","atts_01GW2HT9FT9PJD2C7051029JGS","atts_01GW2HT9FTMEY3992R0S6A2NR5","atts_01GW2HT9GPWW8KZ4D4Z7TDVW8X","atts_01GW2HTA4957GSX50N5VS5S3YT","atts_01GW2HTA5PW77004H08Y4QC9E6","atts_01GW2HTA2EMM582059NS7M8HA1","atts_01GW2HTA2GEJNZ7HYGZJXMG525","atts_01GW2HT9PE8XBBB4XGP7C3XZX2","atts_01GW2HT9PHXB8140HG2Q1DZJRX","atts_01GW2HT9PHJSQ85QXKJP71GBK7","atts_01GW2HT9Y8X0MZA5PWZ2J68A17","atts_01GW2HTA7YB5Y2XQESR7F4HT85","atts_01GW2HTA7Y72R0V7283CK2G25K","atts_01GW2HT9Z04X74EQ1M2BSDKJA4","atts_01GW2HT9R0FGQQJBCZ7M6FKWKY","atts_01GW2HTAP7FWDW4GMFPJDWRF63","atts_01GW2HTAMXWVTP1YFN0NDPBXG1","atts_01GW2HTAMY77E5766WT88D53P3","atts_01GW2HTAT5D1T89CM9HB9HJVPN","atts_01GW2HTAWF6H3SWNACHPK9RRRY","atts_01GW2HTAWMNYRHBGXN3PJHSZE0","atts_01GW2HTAZW5DTX8Q2QAWSN2C3D","atts_01GW2HTB6217VBK6V5YV66VQEY","atts_01GW2HTB5P5PQCCPDCRHABMHAG","atts_01GW2HTB5ZWRX48E2EJFXE5XMF","atts_01GW2HTB5RRF8H6P5Y6BWHC0BN","atts_01GW2HTB5VND8T7E1EQVBK7YCC","atts_01GW2HTB64D7CJY5RA56B8VG8W","atts_01GW2HTBRAWQZW8R58HPAPMTQM","atts_01GW2HTBDCXYHGC2C6KAGZ9EDE","atts_01GW2HTBDC74HRVDZ6REN8V2BR","atts_01GW2HTBD8DWXC2SYQF5QM5NDP","atts_01GW2HTB39GD42W2ACQ7QZSDDY","atts_01GW2HTB3ADEN0MHJDZB30GJ51","atts_01GW2HTB3B6SPR2X904HT4GYV1","atts_01GW2HTBGH2A63BDYFBS3ZJ8S9","atts_01GW2HTBGH338F7K9MKK3JDT40","atts_01GW2HTBE9VT2DMAPQFA04MEM1","atts_01GW2HTBE1ZA9476Z6SEBD9NV8","atts_01GW2HTBE1BM4X15PMHVNVBQ04","atts_01GW2HTBE5YC93NAED34HAW3Z0","atts_01GW2HTBH60VWXB6Z92EKW95KT","atts_01GW2HTBH2YWZDATKKPQF3JAYP","atts_01GW2HTBH4S904X752PG7J1T7R","atts_01GW2HTBH2VF90MT2JTD2Y88EV","atts_01GW2HTBH4D8DNMR3MCESPT6ND","atts_01GW2HTB46QYKSACYDW00H69TC","atts_01GW2HTB47DE0JWTEA43WFKN5C","atts_01GW2HTB45D0M9SFHJMMWMQ684","atts_01GW2HTBASQJY5A45G49G93NYS","atts_01GW2HTB2C6DBJ8A0D9KWV8JDE","atts_01GW2HTB2D9Y7R0SHGJKAVAWRY","atts_01GW2HTBD30A3BMR4NRTHRJDAJ","atts_01GW2HTBQ6FY2CPWNE9QV03B90","atts_01GW2HTBQ68SQ70ZFWQPT70SH3","atts_01GW2HTBQ2NS1J79CR6ZC22CQ2","atts_01GW2HTBQ3XRETXV6EJYNXYWCA","atts_01GW2HTBQ11NF18TNKDVJHATV9","atts_01GW2HTBQ1PS1V5SMZRDFYEK9V","atts_01GW2HTBB49NHSJ9YE7V2FC9RM","atts_01GW2HTBB1S7K6Y8PZ0ZBK314D","atts_01GW2HTBHHQY29SZRJ1JM5EEH6","atts_01GW2HTBHFPQJ7EFQ3Q1K8G0C7","atts_01GW2HTBHQG2P3K9NVVK7P0XSP","atts_01GW2HTBHFXKPPRAY49G3QCVWM","atts_01GW2HTBHRDSP06KDSR2ZKK4DQ","atts_01GW2HTBHN2E4MNQS8PKNXWX63","atts_01GW2HTBHESKSQJRB0J14MZ5SX","atts_01GW2HTB4T42B3BA62DN7GT1RS","atts_01GW2HTB4T5R6FY74H3CYZSAGN","atts_01GW2HTB4NY6F57T4K4T9M9ZEC","atts_01GW2HTB4NVKX5NK993RXQS3VX","atts_01GW2HTB4P419YGX4VJA11PHT6","atts_01GW2HTB4KYY70TE1XQRZ64ZZF","atts_01GW2HTB4K6081ZD89R4E279H9","atts_01GW2HTB4K1EGZNFCS3H6P6W25","atts_01GW2HTB4HXYFEAD89VQKPVE7N","atts_01GW2HTB4H51V5YX7F5WTMQZ8C","atts_01GW2HTBQCJDZ55ZTR6CH52K4E","atts_01GW2HTBQF3NEMTJQG9NPVWVH6","atts_01GW2HTBK4V7FJGY5CWPMSSXHE","atts_01GW2HTBJQJHF62MAK6YRNQR2J","atts_01GW2HTBJ9YEB1NMYA9N9EE9MW","atts_01GW2HTBSV7F3Y64V4SRJ23ENR","atts_01GW2HTBFAJNMN0F8JJ1FG1Q4Y","atts_01GW2HTBCRHPGQPHTTGK42FK54","atts_01GW2HTBCSYNSDZN9SND3VQ5J6","atts_01GW2HTBCP5K8NFZ06B20NGFNT","atts_01GW2HTBCPTQAH4V8N1YZW7EVA","atts_01GW2HTBNAFRSJYNWPX9PR3EVC","atts_01GW2HTC5V9ZPQ612F91H3HM18","atts_01GW2HTC0R5JE1D89FJKHG61GQ","atts_01GW2HTC44CXW9WKJJGR4S3GPS","atts_01GW2HTC44C89FZHX1K3JFZ0BT","atts_01GW2HTC48GWDH49G2H7CT2HER","atts_01GW2HTC494MSS56QW0CHFP8DH","atts_01GW2HTC472D1E4DE3YH05SM96","atts_01GW2HTC57G2R3BENN953J3V8A","atts_01GW2HTC9AX3T1EXMEAEKSEYEG","atts_01GW2HTC9FM044PPJVQCEZ9JFC","atts_01GW2HTC9GYFDG7YEM5VC61VV1","atts_01GW2HTCA2MX90G81S81PA4G1J","atts_01GW2HTCE5HR4S85N4DAQA6XKM","atts_01GW2HTC94XK80X4FHQ8QEHJ71","atts_01GW2HTC95H0F19C1CAS584KGT","atts_01GW2HTCFEEPZGWDZ27JX76JQT","atts_01GW2HTCNPE8HKZZWRH4Q9NHT1","atts_01GW2HTCM4GV96QYA2QGTFFGRP","atts_01GW2HTCSFMA2XAFC21CEP1W8K","atts_01GW2HTCSNX6H5GW1Y33ABFQ59","atts_01GW2HTCSDPRWH0WGVE6BR5CKV","atts_01GW2HTCH3EF814B6CGN064V77","atts_01GW2HTCPZGV5FG3BTHX2G5FP6","atts_01GW2HTCPW3H25MCVXA6V95ZXT","atts_01GW2HTCQ1N39H23ND45B249WV","atts_01GW2HTCQ6PY02MYBD6C6G9KX8","atts_01GW2HTCQ79M0Y6T40X3XG27NS","atts_01GW2HTCR192V0NRHA5ZH58Z1W","atts_01GW2HTCR5QYQ2WVXR7HNHV29K","atts_01GW2HTCR6Z2W7H9QKDHQ58216","atts_01GW2HTCP86R6S6ZGSVNEVA0EP","atts_01GW2HTCP8EYPRKKWWBD6CCC42","atts_01GW2HTCP3F3AKD7KSW33PS80Y","atts_01GW2HTCQSK6C6J3Y50AWAY6ZT","atts_01GW2HTCND914XQ30ZH3W0V08B","atts_01GW2HTCJHC6STSFWYTH8WGRRR","atts_01GW2HTCKH3MT60MPPH4JCFS0H","atts_01GW2HTCKHDJAF93BQX3EG7ZX3","atts_01GW2HTCKH3EM74VVDZD04WREV","atts_01GW2HTCJRA8NBK4MPZ79KZVQE","atts_01GW2HTCJZSTHSJ6FN7M0789QV","atts_01GW2HTD37FTNPBNKN2M6T68R2","atts_01GW2HTCVRYAMPGWZ9NGZZ0S3K","atts_01GW2HTCVSXMAXP40KZFKPAWX6","atts_01GW2HTCVSP0Q9XNJ3TR01HMMM","atts_01GW2HTDMZK9ZXAFHG9DRHY6Y9","atts_01GW2HTD7YHQ3DT2YSRR55BXZD","atts_01GW2HTCZT7FT3QES8Z4GE273F","atts_01GW2HTD0YG14W7SSFFCS28GP9","atts_01GW2HTD1KP9TWP2EQDYC23EXE","atts_01GW2HTD1R49RDNY3FT76DZDJA","atts_01GW2HTDPANFSTHGYJTRA2W0X2","atts_01GW2HTDPADKXR358XN6JZVQQT","atts_01GW2HTDPB2BV2WTQ3AB6MSAN8","atts_01GW2HTDPCFE6RVDJZHRCA0RH8","atts_01GW2HTDP3PW1AZ3VW8RER8FWQ","atts_01GW2HTDP527ZZZJ3Y6DCJH2XZ","atts_01GW2HTDAZDG8SXJ37G3MSVCBW","atts_01GW2HTDKMJZJ8M1ZYB9G7Z3W4","atts_01GW2HTDK5JCZV0R3Q65E5N7Q8","atts_01GW2HTDK8DTPC3XK9435A15BG","atts_01GW2HTDKPPG2G7RP51FTTHHTP","atts_01GW2HTDKD4VFQGF2RVC5EEXCG","atts_01GW2HTDK6H52VB4NBT3RQCMDJ","atts_01GW2HTDKEF9V5487CD547086X","atts_01GW2HTDKGQ8RNR1BTHZJSPSCS","atts_01GW2HTDKJBQ67B4HHGKENNF41","atts_01GW2HTDKPDY6XQ63S2BSCCPMA","atts_01GW2HTDK61E9M42VNNSMADZVZ","atts_01GW2HTDKGS9Q1QCN7M058RCG5","atts_01GW2HTDK6WE2QS9YW64E4HJQV","atts_01GW2HTDKQPQQMY6GHKX6QXMMC","atts_01GW2HTDKE273G7ZZA18DAT12M","atts_01GW2HTDKJSR4D2MHZV3TQ6HVP","atts_01GW2HTD6E0TQJ7QF53FJPC69N","atts_01GW2HTDQPGADQA8DAK6M1346R","atts_01GW2HTDQPG4WQPAAGGAMJR4T1","atts_01GW2HTCX2PYTC13PBSNG6VYQ4","atts_01GW2HTCX71AAHEK57BPBA9ZPV","atts_01GW2HTCX7J1EW9GV46M4Q2CZS","atts_01GW2HTCX6F05XM4WC8NP5S7CK","atts_01GW2HTCX4PK0DK8P6NVRH8NQ2","atts_01GW2HTECMBQTWKY42J4JSDYKP","atts_01GW2HTECEAPH2K5H38C8CH37W","atts_01GW2HTDT8K9Q5GRZ0P146NP2R","atts_01GW2HTDT91NXTV295ZKADHPZT","atts_01GW2HTEQRAK3DZKYGMNVYDS1S","atts_01GW2HTEQT80VWV0YCQFYP27DA","atts_01GW2HTEQZ518BZK7HTPFNFXK2","atts_01GW2HTEQYAMBGYK1DBAN4F5TY","atts_01GW2HTEQWQGZPK7ZCWK7TJFXK","atts_01GW2HTEJEDKQYS2NDPFS8FPX5","atts_01GW2HTEW01MYJ42GDN8V4EXW9","atts_01GW2HTEW1G94RHJ2J0YHTRFFB","atts_01GW2HTEW1KF906WE1Q1G95NW8","atts_01GW2HTEW1VYW758HFSV9C80JR","atts_01GW2HTEW20KXGWJ5Y9TT2WF9H","atts_01GW2HTE4XD7DP0T68F000PN06","atts_01GW2HTE4SMN8SYTHA3JG4332N","atts_01GW2HTDXKHZVE03WJTYN0HMY0","atts_01GW2HTEDJBBGBA4V3AD1PWA3S","atts_01GW2HTEDGVNVATZG7Q4DBXG1S","atts_01GW2HTE0KMRH0E8202C5KTFPR","atts_01GW2HTE11DV9Y5CKHVZZ7WEFT","atts_01GW2HTDTK09X4M0TQT6M82RFC","atts_01GW2HTET11AK2P9YR38M6APMK","atts_01GW2HTESZH1145K8HYBQKF127","atts_01GW2HTER5W73XJJ2APGSR446Y","atts_01GW2HTE9P9PZ4VEJ63NF0XTH6","atts_01GW2HTE9T7RNWAENC8KPCTNN0","atts_01GW2HTE9MA0NYF3B3NZMME5CP","atts_01GW2HTDW1F9GVSM39TPAASYT6","atts_01GW2HTEX80RY5QGYC37T4WPV5","atts_01GW2HTEXH7768KMHEE1KHN68Y","atts_01GW2HTEXB476VM23EJGWYVE6S","atts_01GW2HTEXEDVXR7VNCP5PECK0M","atts_01GW2HTF1KR8G9C05VF29YF9VB","atts_01GW2HTEAD32S9KTJPRMHMV030","atts_01GW2HTEAN3X53XA4MC1X21X6A","atts_01GW2HTEAKVJ3FKTPM353W0AAV","atts_01GW2HTEAPRB5ERC5YCN391CJ7","atts_01GW2HTEMHD7DAGC0R30KK4218","atts_01GW2HTEMKBJAQWRWEAS5BQBX2","atts_01GW2HTEMH7KEA8VQRVPRVP0KZ","atts_01GW2HTEMKECE1TRKAHQJWNW75","atts_01GW2HTEMHFGXH2K41ZS9V48RT","atts_01GW2HTDYK8KPXGWT0GC6RSZA4","atts_01GW2HTDYVXFVS37NAQY1ETFYN","atts_01GW2HTDYX4HZE0BYDCECR9MYK","atts_01GW2HTFAW2QDY74VZ4B3RNE56","atts_01GW2HTFAZ8Y9VZ5YRXKQQVWMM","atts_01GW2HTFB400CM1YSJ6EE0NQ2X","atts_01GW2HTFANNNR9P1GZVJ4XZYC5","atts_01GW2HTFAZ8G9E4NE50XHV7G4R","atts_01GW2HTFB4NM1E0FVWQHRG4K0V","atts_01GW2HTFB1N63Q9GRABM0FJ9XA","atts_01GW2HTF6YY4B0PZ94Y1F4V533","atts_01GW2HTF963SNWSF74B1FYMH5G","atts_01GW2HTF9ENP4CQJN5XCM2KKZS","atts_01GW2HTFA7K3B4NJG1VK8R6YG3","atts_01GW2HTF7PVJ628KZ7TRX01F7G","atts_01GW2HTF7BBJ7KN3WXR87GHYVM","atts_01GW2HTF7E7CZKVJTWCMV7DW9D","atts_01GW2HTF7GA3TEV6XT35TDRBE5","atts_01GW2HTE1P38E68K5A27G3D93H","atts_01GW2HTEDXD8744D54C732E8VS","atts_01GW2HTEE0PD2JT4QQHHEF0D2A","atts_01GW2HTCY34Y91WKFXEMNG7F87","atts_01GW2HTCY190D7YFE2DA6618Z4","atts_01GW2HTCY0FTD0XHW2514KXZ8B","atts_01GW2HTHDT88TTZYDQDVFSCCP4","atts_01GW2HTHDFNZBXJEZ9MS592XWW","atts_01GW2HTHEGZ6JDWKDF28JRCHR1","atts_01GW2HTFM0GGJV0VJ6QB8KQAP6","atts_01GW2HTFKS7Z98WPANADS06H70","atts_01GW2HTFKH47Y1XR11SWVTMQ84","atts_01GW2HTH6HJH4D9WYJTW6MBSBG","atts_01GW2HTFDW745R10XA7VZJ0YQP","atts_01GW2HTFDTS7JBYRZ7QYT733R1","atts_01GW2HTFCKEFYD0GMWHRF94Y31","atts_01GW2HTAN3JA5P564S6TJGV9J7","atts_01GW2HTJTJWXRRWEF4DNJVVK4T","atts_01GW2HTJTKJ8AFM1FAKHY7F9A9","atts_01GW2HTJTFCG67825S9DMHE4B5","atts_01GW2HTJTPD6Z1BJ5Q3B3XA2NE","atts_01GW2HTJTSEEKK4YRTVFXF2Y48","atts_01GW2HTJTNCN99YCE2BEB84NFX","atts_01GW2HTJTQS91C79Y1C5KW295F","atts_01GW2HTD7C98PY9PF1B1P18891","atts_01GW2HTDXEATB4DAA1EG5CX927","atts_01GW2HTDX9J5K7YHBFX6JPFACS","atts_01GW2HTCZ319DR84PDY09GCJWJ","atts_01GW2HTEPKAE3V2QQJQXBDYJZE","atts_01GW2HTEPHADTZKQ0WNMT4V5QX","atts_01GW2HTEPD6Z3J31ZSXC6T4ETH","atts_01GW2HTEPDGPTEW4HS68JNN48W","atts_01GW2HTEPF46GBV2RFD63XRMJB","atts_01GW2HTCSX8F59T4VCHJMN7SWV","atts_01GW2HTCSVMYHX63X8FX3DA1C3","atts_01GW2HTCSZAR4JVYXP56MTFNXQ","atts_01GW2HTCT7EDATF4WMW02NHJX2","atts_01GW2HTK157DKF01D1CZ8YDYD5","atts_01GW2HTK16N7BMHR78JP90ZYKS","atts_01GW2HTK15PKP2N3QVJYT8ZM1A","atts_01GW2HTK17E9E73MRXQMP285YN","atts_01GW2HTCT1G5P4TDPKKW480VWC","atts_01GW2HTCTD1JSGQC7KA6P28XQ8","atts_01GW2HTCTFZYH26X21P3EBMMBW","atts_01GW2HTCTH72YN06ENBJ29KQ7H","atts_01GW2HTDDD2AGHMZTM69DR2M0R","atts_01GW2HTDDGGDSYCC1QZJN5W6XT","atts_01GW2HTEP51HYSFTSN0FZQP4C6","atts_01GW2HTJ16EJ0Y6WNM8N3GB763","atts_01GW2HTJ16D4J4BZTQNX37JP18","atts_01GW2HTJ18JVFMM5Q5N3D0MB3R","atts_01GW2HTJY0VFDBECSZPNGYC6XT","atts_01GW2HTJ55M93ND2VDPQK2H0BD","atts_01GW2HTJAR5FXY5K8Q6V1A5SNM","atts_01GW2HTAWHJ4DT4WM9PN2KH834","atts_01GW2HTAWKTGE5RK6K5M63D50Q","atts_01GW2HTHVGR68HXJVP0FZ88C0G","atts_01GW2HTHZG1WE5VR5BAEJ71NVR","atts_01GW2HTHZEEEQZH78XY0FS4NPK","atts_01GW2HTK0NDCAM69EF879BYHDC","atts_01GW2HTK0NJGQKW27DZ0TSYHRP","atts_01GW2HTKE0Z51WQN8YVN7P5T28","atts_01GW2HTM1QJAYPMNNDXE70Y11B","atts_01GW2HTM1NPY1QHP6W1JB58931","atts_01GW2HTKWZ085HXW6YFY63XC4B","atts_01GW2HTM5V6CY99QCYZ84QRD9V","atts_01GW2HTKWCNNQ7AMW2AWZ6MYAK","atts_01GW2HTM5N7Z7P4SAETS13RBMY","atts_01GW2HTM5KSXGM592WP29V1DQB","atts_01GW2HTM5HBQAPP4PFKFE905W7","atts_01GW2HTKAW4MHM6X28QB5D30JQ","atts_01GW2HTKB0XCQVBD07650B9NW4","atts_01GW2HTKPGBG76HJFH0PK52C93","atts_01GW2HTKPEEF168K0N7KWHAJ41","atts_01GW2HTM4MVJGZFQ8JJBAPRBRJ","atts_01GW2HTM4ME7T029ZQTNVKFW1Z","atts_01GW2HTKE7Q9D66A02BF2AQA2G","atts_01GW2HTM70J8Y1P5P5YTGNYQ6M","atts_01GW2HTKTPN6PTYAX47ZYTR5KD","atts_01GW2HTKFWJYN38R3WWX0A9D4S","atts_01GW2HTKFVJJAETFJFVP3DHPAC","atts_01GW2HTKAF272ZWS4243ESTHH6","atts_01GW2HTKAED49MCG012MHJ4W2R","atts_01GW2HTM4WPZRE59724N2YRVF9","atts_01GW2HTKJN0FP1P087NNSV1QQT","atts_01GW2HTKJP0GRKEW5D6RMAYRSX","atts_01GW2HTKJQ4W505CXDMMRX397V","atts_01GW2HTKVPP2HBAFCABS0W7E1V","atts_01GW2HTKVPJXGJSR3JX9EBZTMX","atts_01GW2HTKK6MF0Q3EWXJ5JJFRTQ","atts_01GW2HTKVW8KH5RT53XTG29X60","atts_01GW2HTBATGNH44BNJ49CCNS0G","atts_01GW2HTBPTRAXHM7A6AAK0QGX5","atts_01GW2HTBPV1GEMWJTJ2JRYFSAT","atts_01GW2HTCRFHGE1CESP9B7P3YVN","atts_01GW2HTCRMKX06P6605M2TJQ0H","atts_01GW2HTN7CYZ6ASPX160FH5WYC","atts_01GW2HTN7976S0X1NEBDZWQ6DT","atts_01GW2HTN4XRWQQMJKZDR14V01Z","atts_01GW2HTNC2GZ2JG4T32WY2FYSS","atts_01GW2HTNC0B66RVT4PVN00X7CS","atts_01GW2HTNC09HSDTHWQWJ15XJDG","atts_01GW2HTN9WR2SG7QNPA9MXDY5G","atts_01GW2HTD53C7T8VGGWH2KM97AP","atts_01GW2HTP9MHMVN3DQFNHBGG30D","atts_01GW2HTP9B9JKZVPR62JDFEHK4","atts_01GW2HTP99T69QHG2R32FVD41G","atts_01GW2HTP9P8MVGMSES3MNGV4FP","atts_01GW2HTPF8PKAJZMRZBZY7B7MQ","atts_01GW2HTPFAXS0FH7CDDSHS99RR","atts_01GW2HTNPYYVT5WRCWVH8CWYT7","atts_01GW2HTPH9XJSHFE8FGAVCD0BH","atts_01GW2HTPHAP3WZH4NCR840XZWB","atts_01GW2HTPJWMYMMRGPZA4F4JZZK","atts_01GW2HTM92PJQ7FYCHSSQVQAWG","atts_01GW2HTM925GFKVVW4M539X5PT","atts_01GW2HTPMJ9JCYBQ064CK3FY25","atts_01GW2HTBSDNHNY46DV1A8K790P","atts_01GW2HTBSR9RKWDFS9970WXA3T","atts_01GW2HTBSJM0E08XV2QPFD8BH7","atts_01GW2HTBSGPHE32FJF4DJJPSFG","atts_01GW2HTDWA06G5Y83PPCXHMV1S","atts_01GW2HTDW8X83XJ1Y9RF8D4PE0","atts_01GW2HTQ1M1HF7585MNJEJDQGA","atts_01GW2HTQ1DZT824K5B30HMQKBV","atts_01GW2HTQ1R4C8KC0TM8V81Z9Y9","atts_01GW2HTQ1R0Z522EPNW7RMDC4V","atts_01GW2HTQ1F1BAS1FY9BCKT1EPJ","atts_01GW2HTQ1KQWZW63PG4NH7SKKE","atts_01GW2HTQ3Z0QAEGN3GS645GYBH","atts_01GW2HTPM838TDY0WV4HFP1P39","atts_01GW2HTQCHZ21XX49MYW2J3WQ3","atts_01GW2HTQCHA2R7WW0E1XKH1V81","atts_01GW2HTQJ8SGD7363G3MPRS8RE","atts_01GW2HTT9GED3C9H84GFRTP76C","atts_01GW2HTT9EBE90ZF8WYC1EE3ED","atts_01GW2HTT9G9Z9R8A38B6605MTW","atts_01GW2HTT9EE70WZFYYEG54A6JS","atts_01GW2HTT9CE92VH2SVKQ6GZNH8","atts_01GW2HTT9WZCW5FJ9K42CNCYS6","atts_01GW2HTTBJ15TNSDM2JGZNA29Z","atts_01GW2HTTBM18K4R8R0S7KTR2TJ","atts_01GW2HTTBNFM105STH2HRM8MAW","atts_01GW2HTTBQRC943W5QX6PS4Z9V","atts_01GW2HTTBSH9GSRF6MX28SMRNC","atts_01GW2HTTB8DBDPQEP3MW8513TZ","atts_01GW2HTTFWVV8R3MWJEXFD7PP4","atts_01GW2HTTFTRNHB6H94GWWSRYPK","atts_01GW2HTTFX5C2JESMSCCS9AJT6","atts_01GW2HTTFT4EDMEX0AA4YXEPHV","atts_01GW2HTTFTXV0EBNZJE4T3Z3YT","atts_01GW2HTTF8CD2JND1V0H13A9EC","atts_01GW2HTTF48E3KPFA91QGH9G1V","atts_01GW2HTTJPARCN6E8K9J8YS1ZY","atts_01GW2HTTKCMTCSK1A5S06BWDF3","atts_01GW2HTTKCXC9RRNTW4C27HQ02","atts_01GW2HTTMH2T2KMGX6GYJPPXZH","atts_01GW2HTTESDZ5PX8C904JCPBZ9","atts_01GW2HTTQB9MXBV4JXARR1KTAN","atts_01GW2HTTPZG0C4YAVVH5Y71XF7","atts_01GW2HT86CQP9F0ENNE6X31REZ","atts_01GW2HT8700FK21SH4EZ7XAPB4","atts_01GW2HTTV697AX8M3YADXXYZ2V","atts_01GW2HTFKQPSJ3S3TERG7ECQ7H","atts_01GW2HTFKG69HACB3XXQZTKSRM","atts_01GW2HTEJ6Y3K3F3CW9BN9B550","atts_01GW2HTF6RC3GVNR1W1NCYD2V5","atts_01GW2HTF6Z9PR7F5R7S721PQZS","atts_01GW2HTE6EJA9A51VAQBDGTBBJ","atts_01GW2HTEP76W3MRH34FYY8JM16","atts_01GW2HTBXW8NNFH7N02DQWZ74M","atts_01GW2HTV1AM1HBJ9C1WWNHDEJY","atts_01GW2HTV11AGWKSK6YVADWHHSY","atts_01GW2HTV1D9A270M79E1NQRK4X","atts_01GW2HTV1195C9R5WSAT2GGJEB","atts_01GW2HTV1DX2YNFR38NYFZSK9Y","atts_01GW2HTV12WJX1MK2AMXKFA5DG","atts_01GW2HTV1B2SMSRDKQRW5G2C76","atts_01GW2HTV4JZGPZG5SE0WEK9V15","atts_01GW2HTV4KHFSWPHFTPWSAE8CP","atts_01GW2HTV8HMFPQF92E7G5RC1S6","atts_01GW2HTV8PH7HQMJY0AX7YBKHW","atts_01GW2HTC4RDDWB534544ZXYZA6","atts_01GW2HTFD45EEQVWJ9552MBXP1","atts_01GW2HTFD274S7982HWM38N367","atts_01GW2HTK1TBVJAR4SE8BFBDY19","atts_01GW2HTDZEXZ2164CGKQD5NVR5","atts_01GW2HTCSVM95QFEFYCR77YVEV","atts_01GW2HTCSYMZ6EYDATHWSACF2Z","atts_01GW2HTCT1NYY09HC8Q1HQQWZA","atts_01GW2HTCT2BRRVXB5619C23XMS","atts_01GW2HTCTDN47BT31YQPQF1P3V","atts_01GW2HTCTJ5ZJ6BSPDWW17162Z","atts_01GW2HTCTE974MG27SX254PE6J","atts_01GW2HTCTG2A3G5GA4W7F9HCMY","atts_01GW2HTCTCC1Q42A50HSSCZERS","atts_01GW2HTJVR1KG6T3EC12SDVASC","atts_01GW2HTJVQ1B509AHVDASE09AE","atts_01GW2HTJVWG487HR7Y5MPB3G5D","atts_01GW2HT9HT7JQQCYCNW65F6Y97","atts_01GW2HTBD249DP37GBJBREA8G8","atts_01GW2HTEPFTC22Q273ZZDJ1CXA","atts_01GW2HTDX5A91Z8F47D1J70EDT","atts_01GW2HTDK97HADMNKAZS9STAY9","atts_01GW2HTDK1E4J5CMSK935HR0EC","atts_01GW2HTDK3KM1NAHKJ98MBBT1H","atts_01GW2HTDJZ44VE75RA6B8DCNQW","atts_01GW2HTDKN3RVPJVR9GFCP7Y9Y","atts_01GW2HTDKEGT67W4MRSK2GEC74","atts_01GW2HTVJY097NVN7N4Z0BXAZ0","atts_01GW2HTC5QHVDQ60FYS4VTK2HY","atts_01GW2HT94QCGV0C8HK0YH70500","atts_01GW2HTF8ZMKST1ZDXSRWHTG21","atts_01GW2HTF9G0CGR0V3ENC9Y6A7B","atts_01GW2HTF9A27Y1DEPXGDVRAF8N","atts_01GW2HTVP1Q1NNRDY67YYKMJDP","atts_01GW2HTVP3X0MZPAS4HDAZ8Q61","atts_01GW2HTCNT9WVZ39XABWMW3QF2","atts_01GW2HTVQTPJQHEJ9Y3EX1A7Q4","atts_01GW2HTVT91FNGCS0T4WHP937C","atts_01GW2HTDTEE45H99BJJSGSVQ3V","atts_01GW2HTDTEWEKHRD9A2GS2R9W3","atts_01GW2HTEM7GV7HAM2AK9BXKS4T","atts_01GW2HTCXX76SKC5F82H61K6NP","atts_01GW2HTVWNE2X921MRK5VC2JP0","atts_01GW2HTC23NCCZTY0VX25QPGEQ","atts_01GW2HT8Y5RCDR6QDAWDCXZ5TP","atts_01GW2HT8Y5659TSSH8GQAKHPNE","atts_01GW2HTVXQ3GQSK14CHA3GNZKG","atts_01GW2HTD9QC002Q3H3Y0TBJSWX","atts_01GW2HTC49KYXVAV2114BNWB69","atts_01GW2HTPNCQW0GW2902M6VCQPD","atts_01GW2HTPNC4GEB17H8FJ1NG18Y","atts_01GW2HTMZFX9HCEDJM9V30Z5QD","atts_01GW2HTW1A2CN4PC138XQWGMXM","atts_01GW2HTEDYTBZPEVM37FTZZYB1","atts_01GW2HTEDY8FMC0JYQ36BCSX10","atts_01GW2HTJYBGCYW2PA3M7VKC6Z0","atts_01GW2HTJYB3R2F8XZHZN34AAS1","atts_01GW2HTJYF8XMRXFAZDWCEMHYQ","atts_01GW2HTJYJVXWKP4TDC8HH0J1F","atts_01GW2HTJYG0QCFKPEW7PRNT5M4","atts_01GW2HTJYD76FQAZX85FS0TYQ1","atts_01GW2HTJY6HDD8RXRG3W1CNY4Q","atts_01GW2HTPT62PE4RW37DJT2P9YC","atts_01GW2HTPT38FBMD0S4PJ9TNV1D","atts_01GW2HTPTAE5WQ557BJGD6X593","atts_01GW2HTPTANQPTM3W7W2SDDJXQ","atts_01GW2HTPT3STS6321CA4VD7KDJ","atts_01GW2HTW3YCKAQXM2KQ68NMAQ9","atts_01GW2HTW59152PYQRTE7KZ1SRV","atts_01GW2HTDVW7GQ38A9NXPG6RC80","atts_01GW2HTDVRHHF0P32QDYSD7K93","atts_01GW2HTW8Y73D39MFMQSY4ZXCZ","atts_01GW2HTCX3N8EZ8NYHE2P6VP56","atts_01GW2HTWB0XVRNQB4VBSQ64Y5D","atts_01GW2HTWE3HRFY5VEKH8ADC9DB","atts_01GW2HTBF4WTAGHDKEC14WFRC0","atts_01GW2HTD6Z9AP539Z9WR73RESH","atts_01GW2HTPNZ3CVCYDBP2XMGPQXZ","atts_01GW2HTPNYWZ0259C4AWA15MBG","atts_01GW2HTPNWRQTZ3YZ012JF5DE4","atts_01GW2HTPNVBXR1VSTQB8XZZ7EJ","atts_01GW2HTPP0K87DFWVQC1K3MFG7","atts_01GW2HTPNV1K5PRJP82KYETVXQ","atts_01GW2HTBZJVNHBQ16JSSGXED5Y","atts_01GW2HTBZMQ8T169HQNQ5K8EQ9","atts_01GW2HTBZSB1E1ZT20SFJVR3BE","atts_01GW2HTWK53386Y3S2TS369FNX","atts_01GW2HTWN6MWA11XBPMJXFTF2N","atts_01GW2HTWN73Q4MPPX2PPF251A8","atts_01GW2HTWN7RXKF7NMEMDYCG2FK","atts_01GW2HTWNV5V71D8WYH8PB9A77","atts_01GW2HTWNXPHCJYX91A6977JCP","atts_01GW2HTWPM9N816N888B735X5J","atts_01GW2HTWX90W5XJ2J0CEGN8GJK","atts_01GW2HTX4FT3502PJDSEDXMR41","atts_01GW2HTX4GPKWEC2RD5J9R1XW3","atts_01GW2HTX4J6KMR88V3ASDJZ82K","atts_01GW2HTX3QSCFZW74TDTJCV7XG","atts_01GW2HTX3PYZPQPRESRQTGE2E3","atts_01GW2HTX57962F60Z43T68C5BK","atts_01GW2HTX5732316314QZD5FZ7X","atts_01GW2HTX56BC2C6ENS778P2DM3","atts_01GW2HTX5QV8JCTJ7HJVGDAQG1","atts_01GW2HTX8HJGGF0DH2YTXZWFZN","atts_01GW2HTXCJDCSSPGW270H65S4J","atts_01GW2HTXCP1BSZSEQW0SYS8CWH","atts_01GW2HTXCFZG8V8XHBCQESB6G0","atts_01GW2HTXCX5D9YJX7AAMJ93H98","atts_01GW2HTXCJS6KZF8E0YNWYWFHV","atts_01GW2HTXCYCTYFRTVK20T625RC","atts_01GW2HTXDZCMMWN4MT9K7BZN26","atts_01GW2HTM53MS4E55RFNWT2FPA2","atts_01GW2HTXFJXV5W78ESP1THYX5K","atts_01GW2HTXGGSANVX8WDJK40T1M2","atts_01GW2HTXGHS60M5QTJ0AQXJDJA","atts_01GW2HTTBGWD44SBY2CRNJWT64","atts_01GW2HTTBHPVGQ78WPRVN1XA2S","atts_01GW2HTMR4SD6PFEYYZCN9XE9D","atts_01GW2HTVGNMNG623FPFWPGZN6S","atts_01GW2HTVGQJPJFXNC054N2C019","atts_01GW2HTXHNHDA50THPNFPZSBDN","atts_01GW2HTXHZQQ03ZA30M1QGTFKJ","atts_01GW2HTXJ5GYEN7NWH8HDJPZBE","atts_01GW2HTVGSNT67TDNFNJT9099F","atts_01GW2HTTVQZPMGPZ7332ZGXCK7","atts_01GW2HTXGTAZ1FBVW24TWMSMRN","atts_01GW2HTXH50GBNT058A65N0MZG","atts_01GW2HTXH7E80FH4W4N61E4KZC","atts_01GW2HT8VNHV6R836WS20MBJ9Q","atts_01GW2HTDW3WDFC3GWDY2AERBQN","atts_01GW2HTXMDTNY4QNVQGV5AH3BT","atts_01GW2HTBC7AW11AN21A22JN2T5","atts_01GW2HTMDRFRYPN2F95RTZB8J8","atts_01GW2HTTS4C9PEX6SKKQJZQ885","atts_01GW2HTTS64CFT26WQX37RWHCB","atts_01GW2HTVQXTH0P3N3NZP7Y2F5S","atts_01GW2HTVQZZ61PBVGHWQV4ATWN","atts_01GW2HTTFRRE9997865DHNYW09","atts_01GW2HTTFNDNEC5KRT7QHPE4RQ","atts_01GW2HTTSHAMSY61331128V2FA","atts_01GW2HTTSJWK1TXQJ9DGFNDFXF","atts_01GW2HTTSYC663358ZTGCDA8TQ","atts_01GW2HTTT0Z5SBR4QCWHPW71XQ","atts_01GW2HTVJTRNDV8N8CR827CQFB","atts_01GW2HTXPMHN59SFAEEVGS7VQF","atts_01GW2HTXQMQFPE4W9CNABYHBHZ","atts_01GW2HTXQQCF415XD6TS2D2BZZ","atts_01GW2HTXQR1TQMHP3DKN9N6WNC","atts_01GW2HTXQK1HMW3ERM9KGAJR0B","atts_01GW2HTXQF2WVC9W55CCE1DPPW","atts_01GW2HTEQHGKAEG9E9N96D8VD3","atts_01GW2HTEQBK58WVV5Q91BWVDQT","atts_01GW2HTEQEHZ714KRXP8DFPVHF","atts_01GW2HTEQFSSRJRQP42CWNNNPJ","atts_01GW2HTXS3S5MNPWJPKSH4CD83","atts_01GW2HTXDXXWV2XET87EMA2NR1","atts_01GW2HTXHMGAWHWHP2S3JCR8TD","atts_01GW2HT8FZJB6YFZ6E9SNMX82R","atts_01GW2HTTBHY3HQX8YDTF9YWNE3","atts_01GW2HTMVKFV0KTQHRDXV6SAPS","atts_01GW2HTKNGER1PQDV93V7Z8MBK","atts_01GW2HTMG4SDGZBPVHDT8RPS30","atts_01GW2HTJFX0MJQAN4T32KXSP7Q","atts_01GW2HTEBT9RB5T93KHK2XTMDX","atts_01GW2HTEBXP1E5ZXG85Y30QNES","atts_01GW2HTPB27WPRXSY8ZHK01GDA","atts_01GW2HTPB64HEG76G86PM03JGC","atts_01GW2HTPB69CY9B9HYYR2JWEJ6","atts_01GW2HTV5GM7RB8CEGY2J2AZS8","atts_01GW2HTXPMSXS4E0X989EWDCS3","atts_01GW2HTXPJ6PZ27A0V9GH97552","atts_01GW2HTXPKY1CW1YKJSS2K2GDY","atts_01GW2HTPDYKVDYZYWNCWG5F5YC","atts_01GW2HTY4SHTAJVNMWWN47005E","atts_01GW2HTY4QTBH2VW9RXAC34639","atts_01GW2HTY4H87HJPMEW8MH1EVXX","atts_01GW2HTPABHRYAXCDDP91DA29Q","atts_01GW2HTPA9MBMDJAEB5YWB8VA8","atts_01GW2HTPA67NQ8H9XR1RVQVXM8","atts_01GW2HTPFBSFJ23H2VMQAQPGAK","atts_01GW2HTTQ84VZ5H0V13DGT6936","atts_01GW2HTTQ91VDMC8F2V5ZAFB2K","atts_01GW2HTTQAB9PG448QC6CEZ4SP","atts_01GW2HTJW0P45SZYNBYMG76EA3","atts_01GW2HTJVT6W9SKCVS1N0TVGJS","atts_01GW2HTJVTM8Q6P16K2Y6YRVKM","atts_01GW2HTJW0NK0Z8SYWDHT6E7HM","atts_01GW2HTFAV7HJJDVQDCDK6T4JN","atts_01GW2HTE13YF79MX6T3ZYCSV0F","atts_01GW2HTY85KDQ0YMAWWCX97T7M","atts_01GW2HTY84XX1HPNYZ6S5BWQ1F","atts_01GW2HTYBD1KHNPY98R35BADRV","atts_01GW2HTYBEESENFXN6YE2MG9ZH","atts_01GW2HTYBCFPWJAQYPFGE68HER","atts_01GW2HTYBFBMG1Y5WP6N02RW6A","atts_01GW2HTYBE73ENH5XENBN8245K","atts_01GW2HTYBFGND9F3ETPMX2XYQM","atts_01GW2HTYBCNPGAJJSSVC0YGR68","atts_01GW2HTMF74M35SKKE28EHERXA","atts_01GW2HTMF8TFA03508VQE1X7SV","atts_01GW2HTYF3ZR3PF0C10HVH2E83","atts_01GW2HTFCVSSV26XXQBCHCP3HH","atts_01GW2HTYNSNBRTPHFX54CKXF3P","atts_01GW2HTK8JR3A4GRYSDXJRCKWD","atts_01GW2HTTEQZVNAJJ1T1VT9ZW7S","atts_01GW2HT9PJPGX7XFFVWWDH3AAP","atts_01GW2HT9PJ9VZBJEYQV5JBFBQ5","atts_01GW2HTFAZSE3CWJ797C107W5Z","atts_01GW2HTJZ5X6RM61VH4R7ZFE2W","atts_01GW2HTQ1DS40B2X72TN9P8CWS","atts_01GW2HTQ1NWH14RQN8N5SHCQNJ","atts_01GW2HTQ1R9A4Z5CKJT4CP3B4W","atts_01GW2HTPEBFYGTKDZ2ZG5N8CX4","atts_01GW2HTPEC04CXGM7592H7Z85Y","atts_01GW2HTPEC51EHC3GPSYWZRAE7","atts_01GW2HTYXWTFVV8ZW0JNG24Z26","atts_01GW2HTYY2PRJE35VH8HGM8YXD","atts_01GW2HTYYEQAF979P3Q9Q2X42G","atts_01GW2HTJG3V3B8ZA737KX5CTBX","atts_01GW2HTPXQK9Z4RZD88E88KDYB","atts_01GW2HTJWRA3FEK22BTNVT0JMS","atts_01GW2HTYYYZ9WWH6NHPGCHKDSA","atts_01GW2HTYYW0VWV0ZHCG06SCS28","atts_01GW2HTYYW48K7AX7HEN7KX4YG","atts_01GW2HTYZ93GNNSJHPX4Q9SJDE","atts_01GW2HTYZFEGG6MQN8DMDYY084","atts_01GW2HTYZFT0A1DH0W0DNPQA6Y","atts_01GW2HTYZK4GPZR7Z6327XNADD","atts_01GW2HTYZKFP161XBFY1K0AK0J","atts_01GW2HTYZGHKDAC3MBVHDF3D58","atts_01GW2HTYZGYQXPFABEYE3F4P2D","atts_01GW2HTYZH48HXTG59MQQXZ8X0","atts_01GW2HTPYVVC4T3WKSQWTJ81BE","atts_01GW2HTZ2P4CS2XENG9QP22SAC","atts_01GW2HTZ49GA0E4VM4FZHDSC4Y","atts_01GW2HTZ49FV7PNMB4MJN9ANYS","atts_01GW2HTZ49D8QCE1D1K75EJBHG","atts_01GW2HTZ47P2ANBDPVAJEXW62V","atts_01GW2HTZ47398YE7NTSH00P342","atts_01GW2HTZ48SJ1FHZK44ZM7Y0G8","atts_01GW2HTZ4AHNPSSYTBT9Q9J84D","atts_01GW2HTPE0VVPBCZ8HH7MADHXW","atts_01GW2HTCPJR7BVDZNW94K56KJB","atts_01GW2HTZ7507SQVS44AJSH9TS6","atts_01GW2HTZ764M8GW9WQFJTE91QD","atts_01GW2HTZ73VZ66JQYS9HTM3EF5","atts_01GW2HTZ766WWVPHTZ3A9C3ZQK","atts_01GW2HTZ79D87F7FS01MANNB2T","atts_01GW2HTZ787RXW132HH6NSHH3M","atts_01GW2HTZ774WVCS5DZFHDK3G1C","atts_01GW2HTZ7A83SYVG1EG0MGW1RY","atts_01GW2HTAG7YZTPDBAFWV159T69","atts_01GW2HTAG3CKS96Y81S657D5QC","atts_01GW2HTZ7KBNB9G41V8DKRWXHX","atts_01GW2HTZ7VP8VFJ4DF6B0HC1F5","atts_01GW2HTZ7V05JAW1DRZC2NGCNY","atts_01GW2HTZ7YVZYJ8XPR5Y5YKS0F","atts_01GW2HTZAKXFHKW3NM9JF9VDDT","atts_01GW2HTZAH5D01Z03NDD0WENHT","atts_01GW2HTZB04YSFYCWBD3HSPMEK","atts_01GW2HTZAYC58AE8R27GGMJ28C","atts_01GW2HTZBNZEZF97R95VPYPQ55","atts_01GW2HTZBMJPT19EX4KSC8Z38R","atts_01GW2HTZBM8HGCNTZ1SEY2AQ9W","atts_01GW2HTZC7ZZJ5P6B3CYP23TAM","atts_01GW2HTCSZYSDK833Q8ZFFSCTQ","atts_01GW2HTZDQ1JXAHWCH3X05RPVG","atts_01GW2HTZF749ZDPRBJXPC9HB4Q","atts_01GW2HTZF8GRWQC57QVKRT28F5","atts_01GW2HTZGAWVMF5JF2CTPFS1B6","atts_01GW2HTZJ6NPKT8CDXMN5AY62Q","atts_01GW2HTFNB63Z2041J5ABTZS96","atts_01GW2HTZN3TAM3A34MK36EXR70","atts_01GW2HTZN33QQPANCFHKDFV060","atts_01GW2HTZMZXV6Z2W10MGAJNF8V","atts_01GW2HTZN14JCJFNQVY728J8K1","atts_01GW2HTZMWARFGKQSA6F2W1K1P","atts_01GW2HTZMW346EWRS78TAPKH59","atts_01GW2HTZN1XMBT2E48MZHH3XXY","atts_01GW2HTZN0A9HDVFVJQ3YWHZXY","atts_01GW2HTZMXQCY3Z9CC4BC5MRFD","atts_01GW2HTZMX6A04H29ADZY5X9PS","atts_01GW2HTZMYZZ8D10REA914VJGV","atts_01GW2HTZMYQC7RXWXKD0S9QCBF","atts_01GW2HTZN2SX89EK1DC7HCNH2E","atts_01GW2HTZN22HSHMA876C6SH9YJ","atts_01GW2HTZN4VAZJXYST22M5D2F4","atts_01GW2HTWZ9KT6RKCYG5VWS319Q","atts_01GW2HTWZAA6BK7Y0Q2BXAF3N7","atts_01GW2HTWZA0AG11DD2YA669G7C","atts_01GW2HTK3Q6453S03YXKC3ZFDE","atts_01GW2HTXHY2APR0DCTRHPMGKXS","atts_01GW2HTXHZ24YBM0ENJX8C4818","atts_01GW2HTDVDNXYJTSC5X6NBFMTE","atts_01GW2HTKQCAB8T9NGZ6WJAJ324","atts_01GW2HTYBYG30FX3Z9CCQH0NGR","atts_01GW2HV42E8BZT47JKZEVB4TJ8","atts_01GW2HV42GNK93Q2RVKV6T0MJH","atts_01GW2HV435V9VKXR2BQB5PSFJW","atts_01GW2HV439XZ495THD45HE24ET","atts_01GW2HT9C2T0KR8Z0VQWX316RJ","atts_01GW2HTZCV76H0KW1CSKVX18C0","atts_01GW2HTXDT5AD5WVY6AYM9HMXZ","atts_01GW2HTXDX6RETM5RWVJF0XRAX","atts_01GW2HTXDW8F2TQT2PSD0BNRA5","atts_01GW2HTXDZ9ZVSN4WJGKDZV90E","atts_01GW2HTXE17BHAP2TKCYR3KBQP","atts_01GW2HTXE20AKCR4YEG2FM667S","atts_01GW2HTXE2F0TDPWF23F3VWQSV","atts_01GW2HTXE466MZBV607J3NEKXA","atts_01GW2HTXEA4RHSD4P9EJB0QM6H","atts_01GW2HTXGFVYXP3C6Q3D31NZGF","atts_01GW2HTXGGMZQDQNSMBX2S8H0T","atts_01GW2HTYP1KE3VMEMXY8BVETGD","atts_01GW2HV4G4XQ8PD58MW6221870","atts_01GW2HV4G6471Z8NBFB6CTRY5Y","atts_01GW2HV4H3F1DRD064N4QBZK7T","atts_01GW2HV4KTD5750NN1NT0F1SZR","atts_01GW2HV4TB7TV7F2PZNZMXCH6D","atts_01GW2HV4WVTDNY059M0KVFD5ZP","atts_01GW2HV4WWR2ZJ75C8XSPAA621","atts_01GW2HV4WY9T89F5E9JA9MZSTV","atts_01GW2HV4WYNYMNJRVWW0BDSTE8","atts_01GW2HV4ZCK1XKD7KNQYVW2ZYQ","atts_01GW2HV4ZE63KXH9WR7QB9KKRW","atts_01GW2HV4ZJ41SWR3FBN4EBE9YG","atts_01GW2HV4ZPK9WWXWW691NRQP8A","atts_01GW2HV4ZV671WWQJYSCHZ6C7A","atts_01GW2HV4ZMZZ5H983NR45NJ5TA","atts_01GW2HV512PKNH809JW30NYP6P","atts_01GW2HV514PXYFTS28MRJY2H17","atts_01GW2HV518ENDTNR4DBGJT3YHP","atts_01GW2HV516PJZW3C8XNJ4KX11A","atts_01GW2HV51092DT2WY3Y2PWQD04","atts_01GW2HV50WCE6J3SFZWQ5N8XWV","atts_01GW2HV50YFNYY9SDJHN5MRW8J","atts_01GW2HV51DMEJ1KZKMYQKNNPYS","atts_01GW2HTTSHW3407QSDQAKEMXWN","atts_01GW2HV52SC8EXWC6BH8PBB7MK","atts_01GW2HTW827G065JEM3Y5KD1SD","atts_01GW2HTW83RD4DV1MB10T65NYB","atts_01GW2HTW83WMWFZPCP5CKA6VDN","atts_01GW2HTW83D74G3YV7AYXD34Q9","atts_01GW2HTW864JJ7060K82FBFYF9","atts_01GW2HTW87RTK3082WHZ1KJ3MS","atts_01GW2HTW87ZGPH5XPQM5XSKYQ6","atts_01GW2HTERMCED9CS905Q15BJAR","atts_01GW2HTKHKNCRSYDVQ9DRFTR18","atts_01GW2HV59VV6Q43RYQCJTK8ATE","atts_01GW2HV5A7P4S75A7XB3VRMSG3","atts_01GW2HTW7ZD3G2JXT686PGAYH7","atts_01GW2HTW7ZSKFAZDF8WFZN6VVJ","atts_01GW2HT9Z1TJF7Q96MTNDR9VRA","atts_01GW2HT9YVMPFZGNHJZNWJ858R","atts_01GW2HTK8NEYCQAZ0BX1RA6N14","atts_01GW2HTK8N5BTSRE5KSH9KGA7F","atts_01GW2HTK8NSDD7VE5D2V0JEX9F","atts_01GW2HTK892BFMEWTFHX7R1R6W","atts_01GW2HTK8B7KR40N3EFBKP50ZQ","atts_01GW2HTK8E22R15ZDYB78C2HM3","atts_01GW2HTK8G8EKCWH1PM9CSW3EQ","atts_01GW2HTK8GV3ZQJXNFWSKB6PV8","atts_01GW2HTK8EDEZEWYN52Q9J9E1M","atts_01GW2HTK8JQ7Y4TT4G6CWPQT5G","atts_01GW2HTK8M5TTW6GM21SRK7EG0","atts_01GW2HTDRPNXZW16JTVF12BGMM","atts_01GW2HTDRTZ9T032J9YBCQ6CG7","atts_01GW2HTDRYMWDQ5X04J1G3YGPF","atts_01GW2HTDS1P1BEGZJAV55ZWF1N","atts_01GW2HTDS5EPFRQEAWJVJQ8DBY","atts_01GW2HTDS9814A4FV53VNFYVBH","atts_01GW2HTDSDBZKSAHXWYAF77G1Z","atts_01GW2HTDRFCPRYVQHYKZQGJ7SC","atts_01GW2HTYNS9101RTM3AXFRWBTP","atts_01GW2HTZ7VCC0DKS9NYJHA5PR4","atts_01GW2HTZ7XJEAXECW0KR620ZMA","atts_01GW2HTB1HB04XXE18KB8FEAB8","atts_01GW2HTHT4QM6E49WJ2J1AFF0A","atts_01GW2HTK9BKYCT3KWV9MHAJNXE","atts_01GW2HTK9J4QKW3310CBJE2B90","atts_01GW2HTVGB0KYPDY3RV86EQ28X","atts_01GW2HV5GDRYNGPA48XC3YYPKJ","atts_01GW2HV5GBBY2Q9BB1A6TT77FV","atts_01GW2HV5HQF7B8X5W1T7MAG2GB","atts_01GW2HV5HV5BQWKG0BRFVXQG4K","atts_01GW2HTBY0GCDSYWK13CZ7G1R7","atts_01GW2HTC4EY349PZ0SYB8RVFQA","atts_01GW2HTC4EMP9EHHS7J7RN2872","atts_01GW2HTC4G6CPXGF3HYHMTZRMP","atts_01GW2HTC4H33VG76PAN1DTFNQ9","atts_01GW2HTC4KH44Z43G9SK1DAMVK","atts_01GW2HTC4N85RD2CJNA05JCW5V","atts_01GW2HTC4RN9KGCSGX6B9AX4K7","atts_01GW2HTDDFM6FPHGP8HWGPPXWW","atts_01GW2HTDDGJMA4YM4EN2WS9QC1","atts_01GW2HTCSW157755EPBJDJS0E8","atts_01GW2HTCT0WR5B1TRD8QWZNPK8","atts_01GW2HTCTA3D05JZFNJP1A69VF","atts_01GW2HTEPH003SS3YKEBXYT4XG","atts_01GW2HTEPMVW85YFX9SHDPBNT2","atts_01GW2HTEPS8EFD8KDM97P25A18","atts_01GW2HTE6X5CM2AJ50B0YGPRQ2","atts_01GW2HTE7016BMTC12YKM0P33V","atts_01GW2HTE73ZQCHJVKGB6D0939N","atts_01GW2HTE76P9AXP2MFFNAC6B47","atts_01GW2HTDX5WHG7B9WW858K2664","atts_01GW2HTDX5ZF71ACPF3ZS4V558","atts_01GW2HTDX6WCSVM4VGQ3W71CDJ","atts_01GW2HTDXFJ4P991PS4HEZDAD7","atts_01GW2HTDXM8BBKPR4136P52EFY","atts_01GW2HTDXN6MFYMGQ8YCH5Y2C4","atts_01GW2HTXCJB3DMCKM1C5074A5S","atts_01GW2HTXCQQH9Y6FVM03W31B0R","atts_01GW2HTXCY3DDPMXMD68Y97BKZ","atts_01GW2HTXCYMKQQCVKXS5HFYCGH","atts_01GW2HTXE7TSK28SM4W8NWVPZH","atts_01GW2HTXE9Z0BFQAYDYQ10GVB0","atts_01GW2HTXE9CMWA2Z8N5HE2YRF3","atts_01GW2HTXECNWH1KS7VWRKHY2VS","atts_01GW2HTXED4CK80A45KGGJBND0","atts_01GW2HTXEF36X9VWTZSYTWPX87","atts_01GW2HTXGR3VAEQC4KWJHF4JBY","atts_01GW2HTXGSWA0A7NBS9WD5XWDJ","atts_01GW2HTE88KHY85QMP5KBM7MGM","atts_01GW2HTE889ER2D2C7RT9M6GRF","atts_01GW2HTDT9N5PWXCXQW6HCANG0","atts_01GW2HTPE7R3D75JVRBBV2P8VN","atts_01GW2HTPE87ZT3EN7BYT93BCY4","atts_01GW2HTPE93W70VR2QZ892Z1T8","atts_01GW2HTPEAD3JAXNBCTDTND1HE","atts_01GW2HTPEB4H19DGPMKR6GBAZ4","atts_01GW2HTPECKVJQF0ZK37MNSC94","atts_01GW2HTV8NBZM4WVFBB3KNY4CC","atts_01GW2HTV8P1Z50R7AYR5KBE2TB","atts_01GW2HTV8PEM83SV2RF8NP9E4Q","atts_01GW2HTV8QWB7Z3CD1B30PEGHW","atts_01GW2HTV8JRWCNJ3YJ7R53ZZBK","atts_01GW2HTXGEAGHQJMRH432F2XGV","atts_01GW2HTXGJ8CK0C8WD7CRHKTE1","atts_01GW2HTXGGGJARDTDJJWYF5S3A","atts_01GW2HTDK37AG0S8MVNFZFMTE5","atts_01GW2HTE6ES64C2S522RAKXYSV","atts_01GW2HTE6FKSN7KAWEMD7NJY6E","atts_01GW2HTE6FEJ224YH84ACAGH05","atts_01GW2HTEF5XT4J83F59E75Q090","atts_01GW2HTJ5F2NTPXMDXETBFE643","atts_01GW2HTJ5DT19BQG47QABQWJSA","atts_01GW2HTJ5J1NK68QPFTKQ93DDM","atts_01GW2HV5PEW0AAD357P2HYE2HD","atts_01GW2HTPNDKJZ83W7FYA1HY299","atts_01GW2HTPNDN1R30MXAEGVJT9D7","atts_01GW2HTPNEF4G5BC40M28E0CWC","atts_01GW2HV4YEBST76EPXW8ZFKH9R","atts_01GW2HV4YCFMQQAD3V99VFAKVZ","atts_01GW2HV4YGDZKCPGWDNDWC878H","atts_01GW2HV4YD2MD7QW88CBPK6WNX","atts_01GW2HTPNEM1EP4FPNQ76BH1YA","atts_01GW2HTPNF8SV8S9JCRYKJFH25","atts_01GW2HTPNK4EPAGGJ292H6WPBS","atts_01GW2HTPNGTFQC375P6SRRTX93","atts_01GW2HTPNKDJF57F15SZGK0W1E","atts_01GW2HTPNHYB7QA8GBCB452PPD","atts_01GW2HTPNKYJRSCAAB0NTN7Q7V","atts_01GW2HTPNHWVR553QPN0G22HYP","atts_01GW2HTPNJCGFR17FP1RCYFSG7","atts_01GW2HTPNJC9YPSAFH7YXVRVCF","atts_01GW2HTPNVMN1HK91875AHWDW0","atts_01GW2HTPNXD90KZCCRMG2MKF7C","atts_01GW2HTPNY5DSH25PHS9PBTED6","atts_01GW2HTPNZ6974P858JMN4SV3G","atts_01GW2HTPNZ6DF8K8G7VA06KBBW","atts_01GW2HV57BGJB6N1NPWVK0BKTK","atts_01GW2HV57HGVTYG1S01WKRRTSR","atts_01GW2HV57Q1MYEHX6AYCFAGWMT","atts_01GW2HV57J3X31FPYRKA26PJWA","atts_01GW2HV4E4CTPP65FJG453Y0TD","atts_01GW2HV5RMP06MDFW5T2AF1J3Y","atts_01GW2HV4G6ZXJFC16KXXQ8M2EC","atts_01GW2HV4G7236SRY5PQ1X9EF07","atts_01GW2HV4QMJ9E8NE81M5SFZMCA","atts_01GW2HV5TGQ3BSTTC4QWG2GTXM","atts_01GW2HV5TK608SF4EF35K2AP9M","atts_01GW2HV5TWKFDY6AYVE15J7HSV","atts_01GW2HV5XDS75MQ52Y001P3PVR","atts_01GW2HV5ZMDGQE8SVS2SK05DM7","atts_01GW2HV60DQW5M7T00W98YGKD4","atts_01GW2HTX5QFT92Z0C86TSHR0SV","atts_01GW2HTTHCW9KPZ0R6J88VSW1C","atts_01GW2HTTHD46TZ4A5VSNPFMZDK","atts_01GW2HTTB1GA7VKYKDJAPR48AS","atts_01GW2HV62BGPXJ5BQW2RW94G16","atts_01GW2HV62B4FF9ET34KQ7H4MT5","atts_01GW2HV62CVRK28MSGQRS7ZQ7P","atts_01GW2HTAP9S87KVMH21JC805CZ","atts_01GW2HTQFY67KW5GN7098WYCGQ","atts_01GW2HTQG07V4Q3S2ZFH0FDZXG","atts_01GW2HTQFW8JW5GGN4856DM5NJ","atts_01GW2HTQFTTWPBE4X75XJV2K30","atts_01GW2HTQFTN857E4A8GF85K75J","atts_01GW2HTQFZ8NDM291B47F45ZM0","atts_01GW2HTQG1TZ2RTZKNVQ9315C0","atts_01GW2HTQFW9FSHVPE8NQR2QMQD","atts_01GW2HV5TKFXJN4WW6JRNYQFPN","atts_01GW2HV61KZCPJYMVRDEBGEYFZ","atts_01GW2HV64DP92N7A6EFQ8QMME3","atts_01GW2HV64QYDP26RFTSS84PGF8","atts_01GW2HV63CJPFD4WK2NYDXHD35","atts_01GW2HV63DAJ4QYQ6PYT5JTS6B","atts_01GW2HV63D5Z0GHES77E5KS7CB","atts_01GW2HV63K3E1ME5P2V0865RKA","atts_01GW2HV63GR7ST0JGDEAMS2PTT","atts_01GW2HV63GBRCHDPAEZN28T081","atts_01GW2HV63KA25X0JBGBXRC25F2","atts_01GW2HV63G5Z5AV7S78PX1MBDR","atts_01GW2HV63KQHQM01EM9G32SRC4","atts_01GW2HV63HJ5WY1RTBH8C8TPSS","atts_01GW2HV63M5ET7E9HXJ9R28SK7","atts_01GW2HV63HQ595H53N2Y8BYMB9","atts_01GW2HV63MVFT6Y9FJBNYCHZ8B","atts_01GW2HV63HX3R54T4WZFNTT0XE","atts_01GW2HV63MN7368915Z0TCNDWZ","atts_01GW2HV63N2RP4JBSCNZE3G5QQ","atts_01GW2HV63J533KNW8TX2MG1807","atts_01GW2HTDV68JS5W06S0HQYKBRB","atts_01GW2HTDV717FGKBCDK0J8N2ZM","atts_01GW2HV691PA5Y5S0JEVD5ZGCQ","atts_01GW2HTEKW7FB3KVEWHYGHSS29","atts_01GW2HTAWK473WKTPGD067DG3D","atts_01GW2HTAWPY882RD49BQ55GS8G","atts_01GW2HTD17XZX2AXPT7J8SY1E5","atts_01GW2HV6B2QMWJY5C8T808VPK9","atts_01GW2HTZ2QEKDVB2RNEJKES2F5","atts_01GW2HTZ2R8YD1M9RQEJF41AWP","atts_01GW2HV6BVWN2A1HKBVDDB7E6P","atts_01GW2HTWE6PVZ4Z17BXX4HXK63","atts_01GW2HTW8YYTR955MFXKV5CH8J","atts_01GW2HTW8YJ2SRNPBVCRR5VRC2","atts_01GW2HTWRTJQGDN9K6G3DTERA3","atts_01GW2HTWRTHD6AMM9G6TRTZY0Z","atts_01GW2HTWRWRFKBACHW9JRA3WQF","atts_01GW2HTWRWTRM662EBQ980RA4W","atts_01GW2HTYBZDG2EWRHK8WFEPAGM","atts_01GW2HTYBZCAXV7936Q76BP53R","atts_01GW2HTYBZ8396DP1HB31TQ3CQ","atts_01GW2HTYS46Y3VBB9WG2DFR0CC","atts_01GW2HV6EEMWD0H6QXG7RNTC2G","atts_01GW2HV6ECC7XVDH7XRCRHS61Y","atts_01GW2HV6EQGR87VF0GY281TH53","atts_01GW2HTYS5XFX793A3FJAHK6J5","atts_01GW2HTYW4ZFZ4JZ89GN57NEKA","atts_01GW2HTW88934RVJYWDGGK8FCV","atts_01GW2HTZQXBVGVJ9E3W5M43C08","atts_01GW2HTW615BKX5KW17CPH05SD","atts_01GW2HTW62PSVJ2VWG415YEXFC","atts_01GW2HTW633APXNAG9K7ZBGN91","atts_01GW2HTW647BX9GHXQFVQE76ZN","atts_01GW2HTK79FAC0CYWNC3DKK063","atts_01GW2HTNCNSHTFS8ARZ5QNZ4T6","atts_01GW2HTZT4A1W631M29QJ4181H","atts_01GW2HTZT6G70EZK3A7PJQPHWZ","atts_01GW2HTYQWY2760NB1HEPMAKSC","atts_01GW2HTYQXDP6CM37A2DGWV7QH","atts_01GW2HTYQYFAYVNQ6RK0C85ESS","atts_01GW2HTYR0AE7VX1QAZ811TSYG","atts_01GW2HTW6DGP3T445N4C1VWVN7","atts_01GW2HTW69Z55BTX4628FBZ915","atts_01GW2HTW71B0SJP7M6Q9Z4D3QS","atts_01GW2HTW71M73X6ZSVPQJ6BXJG","atts_01GW2HTEREJVDYHC25F0B74FN3","atts_01GW2HTBCD6XSE8FHXNZKPXE8W","atts_01GW2HT9S4GF68FW2XCXZMYJCT","atts_01GW2HTFH7JY1Y7V44JVJ6Y7QG","atts_01GW2HTDZPSNXH2525A91BSV3M","atts_01GW2HTDZRSF985BXJ41JPEQE9","atts_01GW2HTBWGDPRG3DFBXMVNNSH1","atts_01GW2HTBWG0XT0DC6WPYK8CSM6","atts_01GW2HTKFQB4AKG8M9RRRKA4GB","atts_01GW2HTAPE7AYP38AJPZAMRSYR","atts_01GW2HTAPCQZCYKTD5816KM9FF","atts_01GW2HTV6SDFETQAVKPTA0T6Q3","atts_01GW2HT9VPKP7TH097WY5MJP39","atts_01GW2HTZPSRRJ48CVQMQ528EZ5","atts_01GW2HV4WK0K2NEE0XNJKRTHT5","atts_01GW2HV4WMFV9Z1ZG7QBV16X7H","atts_01GW2HV4WG3NGGFSS4GQH78P5P","atts_01GW2HV4WHPK1JQP1TYGJTHDHX","atts_01GW2HV56BTKFZ4BXFG2Q6ENS0","atts_01GW2HTWB3GFBXC1CHKQMYVFYP","atts_01GW2HT9BCG5H2FXK0QJFMCA5H","atts_01GW2HT9BDHHP32WW0PC0D9XNN","atts_01GW2HT9BDYRH5WWTCESJJ82Y8","atts_01GW2HTWHDRZFF7N3VVCMZG83P","atts_01GW2HTWHEZT3G04TH1NDVT880","atts_01GW2HV6HJ60WQ908RFG2JMA06","atts_01GW2HTTMAZN7V02K0FGE1QMV4","atts_01GW2HTTM9GGVR4JJS1SY5P7FV","atts_01GW2HTTMABADTGC5J2TE4AMH2","atts_01GW2HTV44VVXH6Z129JQMBWW8","atts_01GW2HTW0EDEA74W66VNGZN8Q3","atts_01GW2HV5MBDD845B9T0W225FKY","atts_01GW2HTJYS80GKXDMFKT8EQ584","atts_01GW2HTJYS5GRFXHMYZA58QJ3G","atts_01GW2HV6HSQARNJM3HFXTQJMRC","atts_01GW2HV6HT451PG0MR8YY2K52W","atts_01GW2HV6J6HQ89YGAMRRDCK7AA","atts_01GW2HT92N27J88HP6NPXC3505","atts_01GW2HTJD8RP5DW9ZV12EAN0EX","atts_01GW2HTE4NRS2FM2AGY7CYQ3F9","atts_01GW2HV5MT567VCHANA6TYGSXY","atts_01GW2HTDZ0AN1QFAXH1FYK4Y5R","atts_01GW2HTDZ1PEBZT6EXV4747XT9","atts_01GW2HTDZ1V2TTYKFANA3RA13B","atts_01GW2HTDZ262DW96VXGX1YVF0S","atts_01GW2HTDZ2A5DQNDJBQA41WM5W","atts_01GW2HTDZ2CDG7ZKNWAK03D62C","atts_01GW2HTA14XS44HDM45K3TR2R2","atts_01GW2HTKWGXMH9WFSAB33VV4F8","atts_01GW2HTJWMMFSNKCH2VCDGDPDP","atts_01GW2HTB1P3S2R5Z0V24K59YZZ","atts_01GW2HTWPQ299SGGW1Y3G7V8PG","atts_01GW2HTWPQ7YD2AKQ6757438A1","atts_01GW2HTWPQE40VKBKJ0WMT1QNC","atts_01GW2HTWPSN3P53PRKWSJTRN3K","atts_01GW2HTWPSR45QP56H4BFYDW3A","atts_01GW2HTWPKPN1JCD7J35WGQN72","atts_01GW2HTC8N18Q9XC15ASXDFJE2","atts_01GW2HV5M2EA7PBH7P6NYSD3MQ","atts_01GW2HTWR779NN2DJ6M2J1Z3GJ","atts_01GW2HTWR7T7N2GK5CTBA1D5FH","atts_01GW2HTBEWD34SE1EWECQPKWDP","atts_01GW2HV4H8R4GQ602VFWXG6X52","atts_01GW2HV4HANSEB1Z8QGDJDE58Y","atts_01GW2HTF59WDGEC62YGBH677ZQ","atts_01GW2HV6GZP20NNE9JV78S3XBQ","atts_01GW2HV6MK0TXCF5GB6890YHMC","atts_01GW2HV6MM2V1FD4861WCYH4V3","atts_01GW2HV6MQAMHP1D8N3GRAC4A7","atts_01GW2HV6MRK6VCQ3R45P2YC24A","atts_01GW2HV6MV467X4BK692PY100K","atts_01GW2HV6MWV6SBFPA9MTWG6XWH","atts_01GW2HV6MTNC22TE4ZJNTY7TGS","atts_01GW2HTYYYW57Z4PRJSHKFR5DB","atts_01GW2HV6P26F9QVHJNNQ0Y99W7","atts_01GW2HV6P3X79EN59HVMMY8SN5","atts_01GW2HV6P7R7N6ZHWEEC5PH8KV","atts_01GW2HTF4J00JM1ESVXHB0VMG4","atts_01GW2HTF4QGBZN9QSR786MTA3N","atts_01GW2HV6RS78ZGGVC0QP53FB3A","atts_01GW2HV6S96ZWBBFJZZ0HJ6XQB","atts_01GW2HTKNVHTRNHVE1BD8WHD29","atts_01GW2HTXGQBS5FFFA9WSCZF2VT","atts_01GW2HTXGY5JKQW0B31QW5VF1Z","atts_01GW2HTXR9XCPRT1GX5Z9ANHAE","atts_01GW2HTXRA8WWVANDTYYPZGC3Q","atts_01GW2HTXR7MZ670H401NYMBBST","atts_01GW2HTZJK97HXZT37NEBXQFPT","atts_01GW2HTKE3C69Y9GC6H8Z782ZH","atts_01GW2HTZJCVDESSP5ZZFJGYP66","atts_01GW2HTZJDCDFMHJABE0MSXY29","atts_01GW2HTZJATKMQ1WCPHDB2NCHJ","atts_01GW2HTZJA0T6S6DN3PCN2BVPF","atts_01GW2HV3ZQMKJAEEK3K27NT33N","atts_01GW2HTM5XM8NN02F0ADS1JPCR","atts_01GW2HTQ1NJZW20ZNKAESEKX8Q","atts_01GW2HTB5FKFBC01X2EQAMTX6G","atts_01GW2HV427GVJA7NXH4GYCQ15V","atts_01GW2HV427DK3BRHC70E1KS2QS","atts_01GW2HV42773EJ5VD9WME9MPSA","atts_01GW2HV428R5T66B7M9CHGYWWK","atts_01GW2HV42921YAPZPWATM6TZQ6","atts_01GW2HV42E58B29HXJ5KYPMHGK","atts_01GW2HV43ADR208A20BEXSDBEY","atts_01GW2HV43BBPKBZZCFN49TSC36","atts_01GW2HV43BK030K63FFPTFFM5P","atts_01GW2HV43C238J6BEV9W9TJ5PR","atts_01GW2HV43CME9RZ3Z5QN358Z1W","atts_01GW2HV43C63XB6RJZSRKV7N4F","atts_01GW2HV43CGFJ4NSM03RSSPQ8V","atts_01GW2HV43DCN3CQDXQKQX1THD7","atts_01GW2HV43F96VC0PXBT14S8Q5E","atts_01GW2HTCZ3PQGZT9491MFF8338","atts_01GW2HV4405R9182D8MB19S36R","atts_01GW2HV43W3X6N6VW2Z7MT7AJW","atts_01GW2HV43TP1TH83YKY1DQ3STA","atts_01GW2HV43XTGGGEFXCKENBH7NW","atts_01GW2HTNW31KBQ1WB6HP8VFW5Q","atts_01GW2HTNVZWQ39TZNRD93RE3HS","atts_01GW2HTNW4MPRSKTEWEXDQGKGA","atts_01GW2HTNW61TTN4G82ET68XV30","atts_01GW2HTPJ60HBAJBKF02M9QQ5A","atts_01GW2HTPJ9X3EJ06JAQZ45D17D","atts_01GW2HTPJEEC4RJ66NAQYQ31NX","atts_01GW2HTQJ8W976MPNE6WHJEHG7","atts_01GW2HT9PT62BGG6GT34WKFDJJ","atts_01GW2HT9PVZR5B2AH1TK1ENP7M","atts_01GW2HT9PVBZ9P638XS80S89WD","atts_01GW2HT957M39WVFQHB5QSMC12","atts_01GW2HTQ45QETE5XXZ3R1VHR0S","atts_01GW2HTQ45QRCMDB8EJPZ46NPD","atts_01GW2HV6TQ18T22RPR5BCZMBW7","atts_01GW2HV6TQYXD2C5GGSKKKGVGT","atts_01GW2HV6TQMT6X4ENSDXVD18NQ","atts_01GW2HTP3X654RR0VNYD628JW0","atts_01GW2HTP4AWM1S3JAVTZS1WRDF","atts_01GW2HTP41Y53HMADN9W38FND6","atts_01GW2HTP46PGD1SP37J6KBR023","atts_01GW2HTA62XCJAW964KRXMQEXS","atts_01GW2HTA62KCQPF2KS8CENQJ9H","atts_01GW2HT934JR6649HB9B4BHEJ0","atts_01GW2HV6TXJZM3JJTWNGS6RE34","atts_01GW2HT8WAXWM6TQY3RR6F7SMB","atts_01GW2HTMS2K779PD9YR8NYJXSS","atts_01GW2HTMS2Y3JRG3YD53PTF1NG","atts_01GW2HTM0YRMC3N2PV7E8VCTFA","atts_01GW2HTV7RGHP3QH37NY6GTXNR","atts_01GW2HTFC4FJWGNGARB16NDEQD","atts_01GW2HTTHC5ASRF3HXW9T082FV","atts_01GW2HTTHDZ06DD5CZ90EZVD65","atts_01GW2HTTHE585JBG3D2WH87GQ7","atts_01GW2HTMSEAWCW5G9XA3V44X9G","atts_01GW2HTA9GQ8D70SNBD9QN94KN","atts_01GW2HTH4WEGFDJ72VY6JZXGH8","atts_01GW2HTCW9TVR9NZS1FHF5P6PN","atts_01GW2HV6FMJ885M3D0CW83Z3MP","atts_01GW2HV6FNPSRQH0G3EC4MCWHG","atts_01GW2HV6FQGE1C9VY8D3ERZ6F2","atts_01GW2HTC031SANY36D9Y9HR3CM","atts_01GW2HV5370K4W88TEW4WWPGRX","atts_01GW2HTJG4VQWQFA3E46NZB5WS","atts_01GW2HV6KMF8BG34XV65XE0098","atts_01GW2HV6KSAJSJ1266ZGEGWW3W","atts_01GW2HV6KSB7YSMNT845WTXD63","atts_01GW2HTTE8RNNSC9F6GPQTJJY2","atts_01GW2HTTE831PCWFXAACBCM5G0","atts_01GW2HTTED1ERY8A9S5RBV5FW5","atts_01GW2HTTEE4HB2QRB82TQXX9A6","atts_01GW2HTTEFGHCZ609Q99BXA234","atts_01GW2HTVEBP9KFMSVGPJ28NWC2","atts_01GW2HTVEG3G52JHZYAB57BR80","atts_01GW2HTVEGXZRPA37CMK3CBETN","atts_01GW2HTVBJ16CQ8JXSE88AV1J7","atts_01GW2HTTN4D0KRPZNV92K7S14B","atts_01GW2HTTN4HZ1M357QGT0498JK","atts_01GW2HTQD2VS6DKQ5M3B61FH9Y","atts_01GW2HV57X9581QA1YCA5N5XJS","atts_01GW2HV57TJFB4VGB38QPJFD6H","atts_01GW2HV4D913BH3MT3S72ZZMSF","atts_01GW2HV6XNA0B35A4K0Z68PEQP","atts_01GW2HTKJRREERY90H6ENPQ16S","atts_01GW2HTTHXZQ7K365KJPEXWQAW","atts_01GW2HTTHYF7QWWF6WR12P5V91","atts_01GW2HTTWKRJ730Y38N3EN6SRC","atts_01GW2HTTWMZA35PN64XT0HKDFQ","atts_01GW2HTTWNR5VFY84C8WM5JYWT","atts_01GW2HTTWPGFQNXQJQPWKBFPBH","atts_01GW2HTTGRQ2KMNJHTQ8Q7N3E7","atts_01GW2HTVJ1S36K3Y58YE45VHHD","atts_01GW2HTV2DTPC2K4D9BSWGG92Z","atts_01GW2HTD0N38MWJGYJVY3T1AC8","atts_01GW2HTZRJW6WS43DE35SW4VM9","atts_01GW2HTMNP72G9JKAM779N8D1Z","atts_01GW2HTMNRBSRW42BAYW65W11B","atts_01GW2HTWVK12MR9QBDYKKBG77Z","atts_01GW2HTZZK20F30XKQKRDSPNER","atts_01GW2HV02VTRY0KG819P5E8X6Y","atts_01GW2HV02V6MT21YB8WED2YH0M","atts_01GW2HV02X11SV0K7NXPQ5DWNH","atts_01GW2HV02XCX5NM52D9GA68BH0","atts_01GW2HTZ5YXMDNXNB7R1P699N4","atts_01GW2HTZ5YF0NC8FP29Q9FXKYM","atts_01GW2HTPBZMFGSSCD696D41BM3","atts_01GW2HTTG4GD0TXXM75BRTFK33","atts_01GW2HTVZG0RGT3TG9C5E4KJ91","atts_01GW2HTT5R6Y8W52SF5TH555FD","atts_01GW2HV3YC3CWKNVA0P69F6T2J","atts_01GW2HV3YCDXCHWR1GZ2GRDV3T","atts_01GW2HV761WBW6JF5KZN7M887A","atts_01GW2HV4XE5Z3T1DWW4PCCBV80","atts_01GW2HV4XM4GTESNFADSG5JS34","atts_01GW2HV4XNKY2KKZ54XGMPHJGN","atts_01GW2HV4XN8JS6RFEKMBZWDJVJ","atts_01GW2HTA7G0RJ3JZ4V4KNE545B","atts_01GW2HTA7VGS76XZJJF43FFB29","atts_01GW2HTA8MKVK0Y750JAECW19E","atts_01GW2HTA8M4A3J1TA1QYCR0M6F","atts_01GW2HTA8NW7407K9M2KRNTF7X","atts_01GW2HTA8PVT6C4BN8NJHWDFMS","atts_01GW2HTDEB2VPCPC4K3C9CPF6X","atts_01GW2HTDEFGVSF4E0WDZ4BD8J9","atts_01GW2HTDEF4709ZQV5B4GQXT7P","atts_01GW2HTDEF2Z8EBK29GV9SK1DW","atts_01GW2HTJT6Q8PN9BM41PSWFBT9","atts_01GW2HTJT77JBPY4R18HXG7J75","atts_01GW2HTKCVDBHYE3Q0DQW8HV7F","atts_01GW2HTKCY8X5FFK549YD8N5T5","atts_01GW2HTKD0FBGTSQ1RE7XG2T2R","atts_01GW2HTKD0X8V27XRP2Y6QMDCH","atts_01GW2HTKD1YDGR1FNYQ6BP03VX","atts_01GW2HTKD2HX6A2KN2368ECCJ6","atts_01GW2HTKD3A6YF9G7KGC236E6A","atts_01GW2HTKD5GKNFZZR48RKWMMBF","atts_01GW2HTE23QQBFCDNVE31PQD2S","atts_01GW2HTE2PEW2VH3QPQF9Y0AR7","atts_01GW2HTE2TKKASFKYY8RWKPR3J","atts_01GW2HTJ76T23PMCN54RE0TJFK","atts_01GW2HTJ77D1EN3Q4YB3ZXTMT7","atts_01GW2HTJ79117X5P7MX9KJPPAJ","atts_01GW2HTJ7BEZ71JVE08RC0N02T","atts_01GW2HTJ7BVA0RDDQZ5MDZK0X2","atts_01GW2HTJ7C8MF4M38Z7Y46XXCV","atts_01GW2HTEZEDQ6YVA9QBH2X6AKW","atts_01GW2HV7CM34R0ABHR6DN42V4B","atts_01GW2HTQ2007SZTAGXGY3ANC1A","atts_01GW2HTZ15A7RN9XMYVP6HYPNS","atts_01GW2HTZ15RZSB4HJQX3TSRRH1","atts_01GW2HTZ18XNXXDWWAC7JCGK7J","atts_01GW2HTZ1CWY1RA503F3284J05","atts_01GW2HTZ1C8B3Z4EBDXB1ASTFW","atts_01GW2HTZ1D1HRAHEV4W8QR8W3A","atts_01GW2HTZ1GXZ5X436WB31Q9XJ3","atts_01GW2HTZQNDB5S905EM0K3VQF6","atts_01GW2HTZQQAX16DY8N7MHS98PJ","atts_01GW2HTZR6QSH0R54K0DK44WPN","atts_01GW2HTZR8QRCTJG1WKNFC08XM","atts_01GW2HTZRB66R9D698T98XHPQ2","atts_01GW2HTZRBDDZCKG84AXZNKZG7","atts_01GW2HTZRGNRWDE21XYJHW9VJ7","atts_01GW2HTZRJ69W76NMC4239B3A6","atts_01GW2HTZRJX5G74FR9GXP7KKXV","atts_01GW2HTF0X5HNRRKVW7TQ2341G","atts_01GW2HTF11VDNMPRHEWCCRHMX2","atts_01GW2HTF14PEXEENAKN2ZC7V42","atts_01GW2HTF179P4J269NGDGH5HQ3","atts_01GW2HTF1B3HY5MSGBSQXRB0MY","atts_01GW2HTF1E48RK0KTZK12HJHCT","atts_01GW2HV7CVKYVKZWXC936NGYXA","atts_01GW2HV7CWKN8NR3N4894784KV","atts_01GW2HV7DFB258KXNYG8HH2TR9","atts_01GW2HTZYGN09E5Q2RC03XT9DS","atts_01GW2HTZYM8XDX5PS7TKC4RKJR","atts_01GW2HTZYY25WAS72G1H5JCZNQ","atts_01GW2HTZYPHRVNEJR1YEYWBKMJ","atts_01GW2HTZYTQ3DPSXSVCJ18GTDM","atts_01GW2HTZYWFS74EWW6DJY56HA6","atts_01GW2HTJAP4ZMANMETVFD1WDAD","atts_01GW2HTC20QA0KVW9F1W3PZQGF","atts_01GW2HTC20H21MBFD5EFVPMSQ5","atts_01GW2HTC1YVDTGV0CYP3GN6A90","atts_01GW2HTABBQZSM74WFNZ4GGQEK","atts_01GW2HV6WEJMD6CGPYZR58YV4T","atts_01GW2HV6WK1QVWPHHXBWNBX4PB","atts_01GW2HTJ5JMET4B4MYC12HQAY0","atts_01GW2HTZAH4P8FQ84T7P0905CX","atts_01GW2HTZAJS1209P9F2YBHXRMK","atts_01GW2HTZAK2PQAHCEYCCBDRNJ4","atts_01GW2HTZANG0QZYZYFZYKWKSBQ","atts_01GW2HTZAPMSM60MGR24HWTDFD","atts_01GW2HTZAPB1WXAZF6ZQPW3P58","atts_01GW2HTZCV6HPCZ8V8FPPZYVFH","atts_01GW2HTM6JBZM2V9MNQ43P7VAA","atts_01GW2HTM6QYNKHM1N7PXNPMEGV","atts_01GW2HTEKWK6CSBSS9HDXZASEF","atts_01GW2HTNPYZM781KVTXTJN3R69","atts_01GW2HTNPW9XVX1JGXFBTPZVRG","atts_01GW2HTNQ2B07PYR4DNCPPV7G8","atts_01GW2HTNQ4G99A8M00CDEHXHEF","atts_01GW2HTNQ7JHPAR3Y4JJX5QPGA","atts_01GW2HTNQ88JPMF50S94C4TZ80","atts_01GW2HTCRRJSGNZVWXXCA65F0V","atts_01GW2HTB98JVG23A50E9JFAHJP","atts_01GW2HTB9B05ZK24HQW5Y1B3M3","atts_01GW2HTB9ME7HE05GVB9K00JEK","atts_01GW2HTC5K558B86RXR68PZND2","atts_01GW2HTC5M4QFWCBXSW4ZMHP27","atts_01GW2HV6VY3AN60BMCHA9CN4QY","atts_01GW2HTVXS8Z2MKK1WPR4HYYSH","atts_01GW2HTBCDN2H2KH84Q2P87N9M","atts_01GW2HTARK24REG9PGTMMX6120","atts_01GW2HTARNMFAVXAJDXPPEN3ZR","atts_01GW2HV7EDVR8061S4456X49P4","atts_01GW2HV7EDSXEXY1B1RQW6TYB4","atts_01GW2HV7EEX7VBQVS16V2VYMZE","atts_01GW2HTAP9GAK2FDG7NHFW8K55","atts_01GW2HTAP9W4WS5GRMRJF3Z37Q","atts_01GW2HV7EKFZS1E3PZQD47RHN5","atts_01GW2HTAPFCWDK0CWT5H66F35T","atts_01GW2HTJFWMEG9YYDK1K6R9X4B","atts_01GW2HTN1WN8CEEW7HFAE3SP6T","atts_01GW2HTH50V98RZCXNDNTJMP6W","atts_01GW2HTVWCXCE91K8RMZGQGNPJ","atts_01GW2HTVWNK4JK9F6B8D8345R3","atts_01GW2HTVWP0GA2JE4X055HVKDA","atts_01GW2HTVWDPQ9VZ0TGV57HT0TN","atts_01GW2HTNEGFJ5XEB01NNW0TP0A","atts_01GW2HTYYYZZ6N6YYNB0GNA7J6","atts_01GW2HTD1SW67SBH8ZW30CCVAY","atts_01GW2HTDA5E413GVKY5Z54ARYW","atts_01GW2HTBW8A2ZDXQTKMH9ZY6BC","atts_01GW2HV7GAQZYD0W1ZZNKT6J05","atts_01GW2HV7G9XHPYPEM6JHNDYHQD","atts_01GW2HV7G94EVKKDDASHNA8PHM","atts_01GW2HV7GAC93HXMR4P26FQQYQ","atts_01GW2HV7GMR94XV6WWP7P7V15Z","atts_01GW2HV7GFVDDMAXY8FVG2KQHB","atts_01GW2HV7GQKRMMB86AHJ0NDVS1","atts_01GW2HV7GSXQ2KBRFZPE84EDDT","atts_01GW2HV7GVJ78JDNPDHPRN9CWZ","atts_01GW2HV7GJ3C8F1FNBZSFYJV96","atts_01GW2HV6GZKF826WMTHZ11GK03","atts_01GW2HV6H20VGD0M693FCZ2R3B","atts_01GW2HV6H2A274BVXAKPHYKWET","atts_01GW2HV7EZD6E49PXREP9GYC12","atts_01GW2HV7JNE1XAS57TFPACJ32R","atts_01GW2HV7K2FZ27XE4Q105EEBA0","atts_01GW2HV7KBT6J66AM5Y2CDRXHM","atts_01GW2HV7KCBKDZJWMR40K57NVJ","atts_01GW2HV7KDY1D7VVEE98TJR0GT","atts_01GW2HV7KE1WBNYRV8T653XX3K","atts_01GW2HV7M2VQFHAEFRJJBJ8F7E","atts_01GW2HV7M301JBDRBHDRVY7545","atts_01GW2HV7M3TPPK6046N7V5ZAMY","atts_01GW2HTBK3NQY6W0GBGEH8BHNB","atts_01GW2HV7MPPN67KR2C7B9A5DBM","atts_01GW2HV7MP5HRD9GJAGMM491ES","atts_01GW2HV7MWK1GM60AE0351PWBW","atts_01GW2HV7MY3S8EPR293ADSTQB7","atts_01GW2HTDBWGJSFZZEYPNQWYV4B","atts_01GW2HTDC7RPTNM5SBPM5F5WFF","atts_01GW2HTDC173PGFCF8QVMBE72R","atts_01GW2HTDBWAJ99CPKK437NT35S","atts_01GW2HTAEYF1ZFHR345EA2CEAP","atts_01GW2HTAF6ZVPBXKG2ECE91GNX","atts_01GW2HV7NA26RQX2JQ5AT5Q4AW","atts_01GW2HT8ZES8CFF1Q1Z4XSMNHJ","atts_01GW2HV7NH71SQPXT1QAZ278CG","atts_01GW2HV7NGC97ASS0MFV3NT5Z2","atts_01GW2HV7NHY80BT4GES1857172","atts_01GW2HV7NG0QVE5TCJ8C26S94N","atts_01GW2HV7NKRKW76C7RY27KH7VX","atts_01GW2HV7NK3PKRVJX1F3H85YVP","atts_01GW2HTCYMG89P7KFGR7CTT0JB","atts_01GW2HTHSNDSZNAWCFKHTZNG3Q","atts_01GW2HTHSPHRSZD9QSDB59T4C6","atts_01GW2HTHSRDETRZTR50PTCEAPC","atts_01GW2HTJ06AV35TGPSZSC5VR58","atts_01GW2HTJ09EDYE383SP2BV8EY5","atts_01GW2HTJ0B0C5Y6NSS0FS90EB0","atts_01GW2HTJ0DJAV4SS28GC64EYVX","atts_01GW2HTJ0FZY6REAFAM7EYJ6NC","atts_01GW2HTNCZ31M98F10GN0F039B","atts_01GW2HTND03T3A99MXCGW4JVTW","atts_01GW2HTND1VP23DSTTCXQM8N90","atts_01GW2HTND16PRJFNDQDG0Q10C9","atts_01GW2HTE59FG78VJENBAD7NNJ7","atts_01GW2HV4TABSNT8D1KXB8463VH","atts_01GW2HV4VJK69BZ5GTHY98MZS6","atts_01GW2HV4VJ5PYW0F0M8CK5RHY9","atts_01GW2HV4VYRM7BS3ZE1D6R22Q2","atts_01GW2HV4W0FP4HERCK0YXCYJ5T","atts_01GW2HV4W0NW3D3J4SBE07MBD6","atts_01GW2HV4W29GZXCMWVG0WWEQ3K","atts_01GW2HV4W277R816AF8GWC4N65","atts_01GW2HV4W4RN0MZWXK1VT4W0G2","atts_01GW2HV4W4B7MCDCM92K1QCEEW","atts_01GW2HV4W6T5VZBBRAHSC63GPF","atts_01GW2HV4W7H9BQV8DHB6A3VYFV","atts_01GW2HV4W85XM05ZMCDGPK0KPT","atts_01GW2HV4W9XW83YFHNGHPB3CQA","atts_01GW2HV4WJ7T0W2NAHMQAN1V6D","atts_01GW2HV4WMKZ458ASWXA6F8B3C","atts_01GW2HV5MCFN2KYGYKG0Y8TANK","atts_01GW2HV5MKSF0JMQEE9YDMA637","atts_01GW2HV7QAM1XKVJHC1T5EVH34","atts_01GW2HV7QB66MKQ8HRV0GR76EC","atts_01GW2HV4WT5FP0MDXDBNKNP7T1","atts_01GW2HV4WX15A4DKG70NSQA5K6","atts_01GW2HTKH5V4BJ91Z0GV7D5DXP","atts_01GW2HTKZ19N9FSWAYMBQC30FG","atts_01GW2HV56BFPZW81P9MECK0XGP","atts_01GW2HV56D338YT72C5S5T1MX7","atts_01GW2HV56GST0KE62Y58CART37","atts_01GW2HV56B6MMJCSK1EB6DHX04","atts_01GW2HV56DCE01MZTM2VKX3AQ9","atts_01GW2HV56GJVEVAYYPK10H8GE9","atts_01GW2HV56C48YPAZNV18J87HWX","atts_01GW2HV56DX4YS6Z0740M43P6Q","atts_01GW2HV56DH7BA6DHWBE8K6C26","atts_01GW2HV56EPZ7TPKH9BBB7X7VZ","atts_01GW2HV56QNXFA5SWT7TNVR9XM","atts_01GW2HV56RE3CTGEWKXWVP3258","atts_01GW2HV56SX3AEG0Q2K063S5H3","atts_01GW2HV56V5ZKMEYS4NRHWMY16","atts_01GW2HV56VM60CD0M6YSAHPKFW","atts_01GW2HV56WWBGH0MCD5S9GCTBM","atts_01GW2HV56W7APAWVPC7GYGAKXR","atts_01GW2HV7PZ08BY9VBZ4J2R7W8T","atts_01GW2HTJ3JKZ7N07QZJQNV5W0T","atts_01GW2HTJ3K9ZATE62BT90TNG2P","atts_01GW2HTJ3NC2DTF1WX4G749Z81","atts_01GW2HTJ3PHJSV1FTH2PZBA890","atts_01GW2HTJ3VA4BXQQNES9Z6H8PQ","atts_01GW2HTJ3VX4HHQ0MJSMVK9XSG","atts_01GW2HTDGFK9GQ6DYRPSNZ3ERF","atts_01GW2HV7R048TKN9F8VGG82BGT","atts_01GW2HV7R2EHS8A19YG6JD8E30","atts_01GW2HV7R4P4RNPQC31FR3J5BC","atts_01GW2HTH5VS1NK5PA801DHVDG7","atts_01GW2HTH62RECHAT1P9PYGAC6J","atts_01GW2HTBTJJD49JG4C66P4PTQN","atts_01GW2HTBTJ9YSEGESNSXN0X3CE","atts_01GW2HTBTK7WPHEFC40F29A1CA","atts_01GW2HV7RSXRW2BWN16CVRB224","atts_01GW2HV7RT89RZVECW6J403KE1","atts_01GW2HTNAYRC0SNJCJ63AQQGSF","atts_01GW2HV7V9CWJ3ARM53CAXCQEW","atts_01GW2HV7VBRB0XRWKXMQSG4ZQ8","atts_01GW2HV7VCK7N0JEGKJPDHEJFM","atts_01GW2HV7V76MQHKKQEEPBHKADG","atts_01GW2HV7VD074H3AR8HGWC91HN","atts_01GW2HV7VCM4MJT3M17Z7SVVDW","atts_01GW2HV7VES1027VB0C5Q0X60P","atts_01GW2HV7V9YVEK4RAN8SX7G52K","atts_01GW2HV7VBMA4ZAAT6PK1HTRZW","atts_01GW2HV7V73G17TN0AM3ZSQQY9","atts_01GW2HV7VBXBZ40XRQFDSFM9HJ","atts_01GW2HV7VEMS2TBKGGXXSFNFRC","atts_01GW2HV7TNGAW0WVFKFHR147BM","atts_01GW2HV7TPZER0QG6G49M4QAHJ","atts_01GW2HV7W943SX9Z0ZWWV8YCNZ","atts_01GW2HV7WBRAFGKSMG20GM1M9F","atts_01GW2HV7WBP8ESS8RD4YEP3TY5","atts_01GW2HV7W9H2PE8MRJP0YX2SNB","atts_01GW2HV7WK68D5A8TV9H7R8196","atts_01GW2HV7WMNM276KNCYVFCCNYE","atts_01GW2HV7WNAEPT18QR9YV1C7QC","atts_01GW2HV7WQW5F8VMF67ZDR06SE","atts_01GW2HV7WS2PRG09XWCYD32D7Q","atts_01GW2HTW0AEQ7J4QFWP9C2AGT4","atts_01GW2HTW0B47AVSTG79S170HBR","atts_01GW2HTW0BSH50G7CVBP60PW5D","atts_01GW2HV7YEBJR40990B0PQT93S","atts_01GW2HV7YEC3TRZS4HBFHS5A4N","atts_01GW2HV7YFCB9H2JRVWZ6PYJCC","atts_01GW2HV7YVBWTADTS975TPHW6B","atts_01GW2HV7Y7QHPC6HQ52C4S2D1F","atts_01GW2HV7Y4WRNWMCSYXGZBR2X5","atts_01GW2HTVWYZ2MAJDRFR6WWFK5V","atts_01GW2HV7Z3R1GVR2RFPA580XGC","atts_01GW2HV7ZDQ395BJCTQ82CAMYC","atts_01GW2HV7ZB12K8FFS0SK4176A8","atts_01GW2HV7Z9XAB7AFY7GE3EEGTK","atts_01GW2HV7Z8RVK40T6A9WJ9F0JZ","atts_01GW2HV7Z6KVNZ7AVXYVXDCAB2","atts_01GW2HV7Z59JX3ENMCRCYFDE0Y","atts_01GW2HV7Z2V68ESQ7ZPZW7R9XM","atts_01GW2HV7ZA3VXNZER9GB2P8V41","atts_01GW2HV7Z4YSAJB22AY7KRW19Z","atts_01GW2HV7Z5GS9AGH1ZKBEMG890","atts_01GW2HV7Z2812129KA3BJW20EM","atts_01GW2HV7ZBC0KFS5CTE03K1W5M","atts_01GW2HV7ZDFTDYDSSQKPWRNNZM","atts_01GW2HV7Z7V61KSK85AD18S66Y","atts_01GW2HV7Z8ARXK8VJENYJMW3TQ","atts_01GW2HV7ZN2D6Z265RQPAENPFA","atts_01GW2HV7ZPVXW08F45MESY0GFM","atts_01GW2HV7ZR0W6HZJ8Z7HXCFSF8","atts_01GW2HTF72SDNYPZZ2HR80XN47","atts_01GW2HV80Z579SZSZAGRZRNQFA","atts_01GW2HV80N58D5Y4GK2F36SS9S","atts_01GW2HV80QVBHV8H9K6XF8S7B9","atts_01GW2HV80S0DY2J012R1BS3WW9","atts_01GW2HV80VPGPZG33YYZR5ZA0G","atts_01GW2HV8126QFVFBH2SWNW1MTM","atts_01GW2HV81J0S92AGZJFMTFZJB1","atts_01GW2HV81HVCGC36KG3Z3WT6A6","atts_01GW2HV81F5AVM1XHY132N870W","atts_01GW2HV820T8RRQ9N7SVRB640K","atts_01GW2HV81R2PCP55AWF4XAT1WC","atts_01GW2HV81QNMFR96R07PASJJ2R","atts_01GW2HV81Z1TYSPE9JQ235982X","atts_01GW2HV81SH5BPRR5R58ZZJXPE","atts_01GW2HV81X638MV5AEKE1217Y4","atts_01GW2HV81WM37D5YE0CGBE9FEK","atts_01GW2HV81V4Y6SZFHM1JXF4WNF","atts_01GW2HV81VZCAXSN03ZTH62A46","atts_01GW2HV81WREZMBD0S04AT40MR","atts_01GW2HV81TC8BKD3ZQVSXBSPT6","atts_01GW2HV81RV1713KDWRMMZPQ5Z","atts_01GW2HV81QHZZZDDB6BDM0AMWN","atts_01GW2HV83G7GNG81MCBPXZ14MZ","atts_01GW2HV83CJ0DQZ38XWWVKMF41","atts_01GW2HV839P1DF1NSBBAXW5RR1","atts_01GW2HV83KH5H7H0FGCRAAQK47","atts_01GW2HV834DZP8KSSNJ15GVHTC","atts_01GW2HV8363HRKJNN1XBSWVKXD","atts_01GW2HV83E2EE8YP38MR9B9S7B","atts_01GW2HV83MCA2TKMQSHCMHS7E0","atts_01GW2HV8428KK8GQYW2F8QXCPS","atts_01GW2HV84CZSBHZKCS4C9837BQ","atts_01GW2HV84A5A0986WWVEZQWSS3","atts_01GW2HV849N1AD9XW9301RH9BM","atts_01GW2HV84BWNTAB6D7KYCZNMN3","atts_01GW2HV847VVTAMQYPJ84TCP0X","atts_01GW2HV855HD3TVM5C39SRD8GH","atts_01GW2HV8538RRH20HDJM4ZEV42","atts_01GW2HV857D2WH3BC0B84CG5CR","atts_01GW2HV854WMW1872D7XKM6GMB","atts_01GW2HV851792P4ND897C1AG7X","atts_01GW2HV854QKZ0R3S821MC59A1","atts_01GW2HV852P1J68BMTK9MW6H9K","atts_01GW2HV8579QCFR9G1B0TCMPW7","atts_01GW2HV855DVY8FGEKN2EXR0EV","atts_01GW2HV8568MYSD7SWT5R642EH","atts_01GW2HV851YGEM9FWR2EP2XMPR","atts_01GW2HV85X5FGCE600TRHRRCY0","atts_01GW2HV85S35FW48B8QCV6CWSY","atts_01GW2HV85VCCDQR3JPH08ZP8SE","atts_01GW2HV85TFMTPWFSCH8Q3GK47","atts_01GW2HV868MRSTE5T86H8T3TY3","atts_01GW2HV864QPAPJDXAB4KM4FF4","atts_01GW2HV86PSGWZPH91XY5HKYFD","atts_01GW2HTKF1M3F2YJ441TNPE77Y","atts_01GW2HTKF2FFAX1TY4VNNZJETD","atts_01GW2HTKF3EPZJ3VJQXKJNAXEP","atts_01GW2HTWK2JMFEB4Q2PBCFSKW1","atts_01GW2HTWK4E16D21EWX373H2PS","atts_01GW2HTWPSYR6CB2A1F6WXT7GJ","atts_01GW2HV86W5D6Z1PA2EKPSSM1N","atts_01GW2HV87C1AZ5PB2SCCANP5JZ","atts_01GW2HV8776GBJPK386G4390H4","atts_01GW2HV87D50MQJX218DFZM6Y5","atts_01GW2HV87A2DKW0DMKXN35PJT8","atts_01GW2HV87EMBCH3FMPRFA081XT","atts_01GW2HV87C1BXK683NT5NEFZE4","atts_01GW2HV87APJKC1AW818071C0B","atts_01GW2HV87CVT78T9HBBXEHGS1C","atts_01GW2HV87EC8D0NQ5RCDZ3WKRV","atts_01GW2HTEH48FPRAA45GF7ZHMDA","atts_01GW2HTDCNQNNV4Q9Y36B0WVHD","atts_01GW2HTW739FJE76D5VQRHVNBF","atts_01GW2HTW74GAKCD02NW22JKZMM","atts_01GW2HV87SGP5478ZST7ZRB45B","atts_01GW2HV87PSF27DT9YGGGG30JG","atts_01GW2HV87NFBNHYN2PKTE2SEFA","atts_01GW2HV87Q2Y1A6RS7TJJ744KX","atts_01GW2HV87MD52WEM33TMQQJ340","atts_01GW2HV87ZEZW4TXXE355BK3JN","atts_01GW2HV8827Q2X7WTXKZ6Q1SN2","atts_01GW2HV881439VKGX7XAA0XZ01","atts_01GW2HV881S12FR981GJ5MBH03","atts_01GW2HV87ZQ1W6KB1R2CDMX9SX","atts_01GW2HV883V7F91HRNTH8X3FQ0","atts_01GW2HV88A1R32RY0GJRVMKD23","atts_01GW2HV88EAX5FHRWGFXHYSWCR","atts_01GW2HV88CHYWFN0QQC75R5E91","atts_01GW2HV88AXPWDWAZNQ9KGCX7D","atts_01GW2HV88CP31M54PXHMKJYN45","atts_01GW2HV88P5AN7WR4YJ1EV365Y","atts_01GW2HV88MZV1BF0TRPNJFA2EF","atts_01GW2HV88MDMJVASYH839Z95WR","atts_01GW2HV88PR4EN6E8TZZV46A6W","atts_01GW2HV88Q08BHKAJZD7Y45JAR","atts_01GW2HV89Y35CRS5WV4ASMVNG3","atts_01GW2HV89Y8CM3PRCER22ZG56M","atts_01GW2HV8CQJTXZJM215M3H864K","atts_01GW2HV8CDY7PN8MZS2YR4441M","atts_01GW2HV8CMGEZWPKDE9CXAQTAF","atts_01GW2HV8CH1MEPE4SGD3YRWRSH","atts_01GW2HV8CFBYTFK828Q3YQQ29F","atts_01GW2HV8CN1D1NXY7GWRHVM02N","atts_01GW2HV8CJ0VK9648WN647K98D","atts_01GW2HV8CE8HT1B4T83BC6YBFH","atts_01GW2HV8D0NTR97AW98XG8NAKM","atts_01GW2HV8D5GF2AJYSW6B1N2K8G","atts_01GW2HV8D3JY28EKF2WDW6CDPR","atts_01GW2HT9H0WA8C5EJPEQ1EWE0K","atts_01GW2HV8E2HK6CVQ4HQJ9EDSXR","atts_01GW2HTP9E6YF1WY71WM0DJ5HR","atts_01GW2HTFD1HXD0M0C12RJ903JW","atts_01GW2HV8FRQWBNBNQCK1X4K1GF","atts_01GW2HV8FM8X51A9NNG6Y37879","atts_01GW2HV8FK4PNH4ZMCQXQ41D8A","atts_01GW2HV8FQ5RHPTMJ2HYYTP47T","atts_01GW2HV8FPN34BFR3TE2QENTTS","atts_01GW2HV8FRTMYKZJ71B32923R0","atts_01GW2HV8FQG4WW6W64S163Q7FQ","atts_01GW2HV8FKBJ6FK9138Q9BPE2D","atts_01GW2HV8FPJA6GSXDWP3XDCK18","atts_01GW2HV8FMYKWWZ3CHR2KXT9YQ","atts_01GW2HV8G7FA973TW2XVFKNR9W","atts_01GW2HV8G6VZGW24KGJ4DX1N64","atts_01GW2HV8GAZP0PF87HJ7P4T109","atts_01GW2HV8HW37ZBCJ0AP5W40QSS","atts_01GW2HV8J2BN8MMBPVP27VFXAM","atts_01GW2HV8HVNMBQ6CZBATDA65W1","atts_01GW2HV8J14KR1MSJSZ5CWFG9C","atts_01GW2HV8HX00MRXSG4BJSS8XX0","atts_01GW2HV8HX9Z3SNCTZJ66SX7RZ","atts_01GW2HV8J2F9SXQDB43484225Z","atts_01GW2HTEAKW0GX7YMFNN8NF0PK","atts_01GW2HTEAPAG04AA6ZZEXD39CT","atts_01GW2HTEASZEJCPKJSWZ6XK2VR","atts_01GW2HTEAVHAZP1G1QBSHDB7S6","atts_01GW2HV8JFF8RR08NDQ7535ZFE","atts_01GW2HV8JDT815BGY8E4XGM4KJ","atts_01GW2HV8JC25NX0M4DN57HAAC2","atts_01GW2HV8JAHYYMYY7TT266KZ07","atts_01GW2HV8KDXH6S073D00RNRHGS","atts_01GW2HV8KBM20X76RRD785JG4F","atts_01GW2HV8K9B3XYC0GH13W0EZS2","atts_01GW2HV8M9V74Z3PQR4EFYNT0A","atts_01GW2HV8M7PW06K8B7X3KSK3XY","atts_01GW2HV8MNW3GKVR4YDMSJFHNS","atts_01GW2HV8MQKCV6RBMVEJCM8CC8","atts_01GW2HV8MJNJXCWZ1H4RA387FB","atts_01GW2HV8MG8V4FRBZ4AXWH2FDK","atts_01GW2HV8ME9HFSJF7B168WEKMN","atts_01GW2HV8MCKD2X24AK606KDFPZ","atts_01GW2HV8MAJCGENP49FF2N1RK1","atts_01GW2HV8M7GBG4P8NFX1GEV15Z","atts_01GW2HV8NTP615KZSCRG4ABSXR","atts_01GW2HV8NTGEE6RZH7A9NC30MP","atts_01GW2HV8P002W77RR95HMZD2CG","atts_01GW2HV8P3XGEM4SK3T8C669DM","atts_01GW2HV8P3981DR43MSX01MSR6","atts_01GW2HV8P4M01RR5XXRE4DC6G7","atts_01GW2HV8PK7Q1B3S7PB3MSRTM1","atts_01GW2HVDHPZVKZM2MY37Z8XDP2","atts_01GW2HVDHCPHMVAMJNAA44BZJ0","atts_01GW2HVDHH1SS3FV1V6Z33WDY3","atts_01GW2HVDHFMBWVCBTBTXZVBBYJ","atts_01GW2HVDJW9HGVH3RWRV3TB843","atts_01GW2HVDK4JG2Q9PPXRS7FY4M2","atts_01GW2HVDK9W7JFA90FJ6P86CQG","atts_01GW2HVDK7SV59JAFS8SBHPA3Y","atts_01GW2HVDK6E2W3PJZDH3NHP9QH","atts_01GW2HVDK9K8ZHT4CYRHGM02DV","atts_01GW2HVDK4FA83CV3RZ1GFKSM3","atts_01GW2HVDK7WD5DGJF91QXG8K08","atts_01GW2HVDK6DEHCF6Q4AX2XEF45","atts_01GW2HVDKFWX7VB9HNZA191MQJ","atts_01GW2HVDKMVWHQ5V1G3TS34QBJ","atts_01GW2HVDKJCYS7F6NQAAQBAZG1","atts_01GW2HVDKH1JN9X83PM2HXMSYG","atts_01GW2HVDKK0ANNBAR1XPFRJCYQ","atts_01GW2HVDKF7945S66PPHSNAR0A","atts_01GW2HVDKHC7N2AXMMDRMN2VZK","atts_01GW2HVDKMRRBGR27MNBC8QPGK","atts_01GW2HVDMY14452V06GR57YHN4","atts_01GW2HVDMX5NBP0J9J6WA1520B","atts_01GW2HTP7PZA6TTC537YTYXA5A","atts_01GW2HTMJJPYS4EVYD1FSR4AHM","atts_01GW2HTMJKNMMP2V95Q4CJGQJJ","atts_01GW2HVDPGAJ08DAMP8J8NN40S","atts_01GW2HVDP7EFPAE4S3TCAQN175","atts_01GW2HVDP3AYXJX6P3RB8BCP4Q","atts_01GW2HVDPDCFYNXCN8EJWKVRG1","atts_01GW2HVDPAJ1FV749P6Z5ARHM0","atts_01GW2HVDPH4DAB0GF4C2PY3471","atts_01GW2HVDP77FXN7KCVESJFSC22","atts_01GW2HVDPBR5FVEKBBACVW7VMH","atts_01GW2HVDPE5C9B248VWXM7N26B","atts_01GW2HVDP3GRQ2DNC45KTQXSJY","atts_01GW2HVDQ8MZNEX9WJ18K3R8TQ","atts_01GW2HVDQ6JG2ZNJ0CR55J8C19","atts_01GW2HVDQ4M56D9JYDAWPH9QAV","atts_01GW2HVDQK6H3HRZJM16YB0AFF","atts_01GW2HVDQ2V76HN34R5RGBYH1M","atts_01GW2HVDQHEYD4B2TKQSTNDT70","atts_01GW2HVDQAMBP4R242DH3DW9W2","atts_01GW2HVDQFG5HW8CJC4PD4V3DJ","atts_01GW2HVDQBZBP6MNH5AJ5B62XA","atts_01GW2HVDQK8J6EB2VC4Q6AYYVJ","atts_01GW2HVDQHJAM8Y677ECYNABQT","atts_01GW2HVDQFH9K8JWNEY4HMXQTM","atts_01GW2HVDQ30W4AB2M0WEMK9N0G","atts_01GW2HVDQ4NAFT2S2G5WYEK7TK","atts_01GW2HVDQ7TRMHN2E79Q6RHBYK","atts_01GW2HVDQ97XN495AYEWYB1NTG","atts_01GW2HVDQYNHXJY3JR715V4GNP","atts_01GW2HVDQZ69P68HXPNADN4CZA","atts_01GW2HVDQSZ41DF17DBK3W2JRK","atts_01GW2HVDQV7AR8T0PTYWB09CX6","atts_01GW2HVDQWJH4R5E9E61DW6MJA","atts_01GW2HVDR4XPYA37BASBJGPWGA","atts_01GW2HTAB3D8FW35P64WBRHT53","atts_01GW2HTA8Q9GAET021CJPT28ZZ","atts_01GW2HTA8RVSQ9633VSY4ZN1DT","atts_01GW2HVDRKEMEE8XXMJ55ZJ4H1","atts_01GW2HVDRTRMDPVYEB7KBJ0PAZ","atts_01GW2HVDPSDAAWZRHSNQPSCQ4X","atts_01GW2HVDPVK3SB549Q8J8VJB9E","atts_01GW2HVDPV2XP0V4E7Z1CRCVKS","atts_01GW2HTJXBBMGQ121860GNRRM2","atts_01GW2HTTPR2PYXKYSZH44WVM2T","atts_01GW2HVDVT4A3QYXVGQHFZNFR3","atts_01GW2HVDVTS1EBTHY8801D16CC","atts_01GW2HVDVYV2E1E72PCWJM864Y","atts_01GW2HVDVZYP0G65N0JBGTWJVQ","atts_01GW2HV6F1HQ5B8XG8C7H5RP8W","atts_01GW2HV6F2VGRTCV698YZXFJEJ","atts_01GW2HTHFAZ3YQ2PYCR3ZE2WWP","atts_01GW2HVDX2WBTT1E8682CK1Q6Q","atts_01GW2HVDX2V018MKEDFMDPVE29","atts_01GW2HVDX3H3C6F5EX97XYBQ2A","atts_01GW2HVDWWWKFJMHXAGN4XC6BE","atts_01GW2HVDWX6FFA5EXDH3SWY5V2","atts_01GW2HVDWN8RVH9RK1C3HH1R3N","atts_01GW2HVDWT6QSCABSS5ZJST9R3","atts_01GW2HVDWQ8NWSW1A61EZSXZAF","atts_01GW2HVDX01E1P1XM28JPJB9BV","atts_01GW2HVDWR3627XQZZWBSZMAQV","atts_01GW2HVDWM0FVVKJTBDM78XYCH","atts_01GW2HVDWZC20VZHVD680A90HW","atts_01GW2HVDX5V09M1HYDQX1Y4ABY","atts_01GW2HVDWTBN4ZKDP6E44W9P68","atts_01GW2HVDWMMJJGR9A53TB01P09","atts_01GW2HVDWNT3ZDMQ8N9KNDFCNH","atts_01GW2HVDWQ1DACN7KHM4P3G5EP","atts_01GW2HVDWR2QFY7QV49KSP6QDB","atts_01GW2HVDWWT8G44E6SC3ND6GVJ","atts_01GW2HVDWY3VXZ32Y3TW35EVBN","atts_01GW2HVDWZD2HZQDT6ES8VGYPV","atts_01GW2HVDX1PFNABVWV0QF79BNW","atts_01GW2HVDX2CQCBA6ME99R11E2C","atts_01GW2HVDX6X0T0YMD18KP1C71P","atts_01GW2HVDX43T6W2WSM1GE9YJAE","atts_01GW2HVDWWNATPYN3B647WQB80","atts_01GW2HTE91VD3T7TC92CN9E5TX","atts_01GW2HVDHM0SVWEHC9BSJ12RJ1","atts_01GW2HVDHXEP9SD7653R2Y7Q2T","atts_01GW2HV8KSCMNJ8Y5YEV0QEAAT","atts_01GW2HTN35RHJ78H8573E3RSXX","atts_01GW2HVDYYG2R2Y896H1YMM2WD","atts_01GW2HV51TXT9J3XGN2DE3ESM7","atts_01GW2HVDZFGV2KEJG9KQWQ7DTP","atts_01GW2HVDZFS3SB6YP6AE4DRP9S","atts_01GW2HVDZS76SXSF5FE1V4ZE4S","atts_01GW2HVDZZT1H6VPAQFP616372","atts_01GW2HVE04Y62X6JE4H434YGGD","atts_01GW2HVE0C32MG2RHX9H8745BF","atts_01GW2HVE0EF14M1W4A5NBFZDC6","atts_01GW2HVE0GE3GV26W5QQPFH8WW","atts_01GW2HVE0TA73E5MRQRAHZWBJ4","atts_01GW2HVE0VA0C08XM70PM0GQMC","atts_01GW2HVE0X1XN4AH0DQ8V8ESTN","atts_01GW2HVE11PQGJG3PKM4QTJD00","atts_01GW2HVE1APA9A83C6M9174D0K","atts_01GW2HVE1F00QA3NE4FM22SFRB","atts_01GW2HVE2NBE9HZM7KD5ZN9PYP","atts_01GW2HVE2M78FCFBDA1VXE7NKZ","atts_01GW2HVE32VKC4WBTJMHDHTGHF","atts_01GW2HVE30KMYQFN2H3VN40AXK","atts_01GW2HVE31SSVYD0YEFQJ85B8V","atts_01GW2HTZW9D4K2VJZWV5A8APVA","atts_01GW2HTZWBRDCC69GPTR9275FW","atts_01GW2HTZWCG7KT0P7B40GQDCBN","atts_01GW2HTZWDPHXJZKF3XBFVAG1R","atts_01GW2HTZWE5X76R3ZE8NG59WMB","atts_01GW2HTHYTP3X44FJK97H34NQV","atts_01GW2HTB69VMPE1K4TSBRAFXM4","atts_01GW2HTB6A5BR9CMERA9SAG2TK","atts_01GW2HTHW52HHYFG4ZAZA1H6MX","atts_01GW2HVE3R1AYKHAV96EXFC1FN","atts_01GW2HVE3SRN3YGA72XNGBJD5N","atts_01GW2HVE3VTAY73SDH9KJ1JHR3","atts_01GW2HVE3WCWA5RQYG1G56HSKM","atts_01GW2HVE4GEVWWXDG8EA5VNW51","atts_01GW2HVE4TCJ9WM0KH05QJ9JWC","atts_01GW2HVE4VPPA3TS3BHPKZN9MD","atts_01GW2HVE5157K4RSYKPWY4PZS4","atts_01GW2HVE5DR6TPDBB7MHYFZS5E","atts_01GW2HVE5CGH2VTKAGMX74T92N","atts_01GW2HVE5EW4A7PKY0HR1JM27V","atts_01GW2HVE5BBBE6KAE47HJJZYE4","atts_01GW2HVE5FESPTDPFG17CVBNQB","atts_01GW2HVE5JX55090XCM802XYGA","atts_01GW2HVE5Q7RHE3CS8T5MMMRFM","atts_01GW2HVE5X14YBP9SFFF107T8A","atts_01GW2HVE5X13HACPHG05NJTGA5","atts_01GW2HVE5XF3EQHCVKXH721958","atts_01GW2HVE5Y9XN2ZK2DVQ82EEKF","atts_01GW2HVE6M8YSYR3H3VEB771T4","atts_01GW2HVE6MFKS9F1ED7RGSWAN0","atts_01GW2HVE6N0FYE9F42522FB7WE","atts_01GW2HVE6SSX35NVP21B6EXPAG","atts_01GW2HVE6S1AEH22DP6NVG3CAZ","atts_01GW2HTY24TG563FJ9ZMBGXKAB","atts_01GW2HVE76Z9WM0W1TJPZSZVQH","atts_01GW2HVE791X6GV0XM91KGSMT7","atts_01GW2HVE77RJ43E303JZSKFHBM","atts_01GW2HTPT9ADY7JRD0NP3E92EP","atts_01GW2HTPTAMP3ZBMEWFTKCS7YZ","atts_01GW2HTPT3N9BJXJT18D7QWXC3","atts_01GW2HTPTE72PK0HPHH2N1ECDZ","atts_01GW2HVE7R2C9AV57SF5JVWDNX","atts_01GW2HTPW60V0SPY57M15V8KFJ","atts_01GW2HTPW3S36EMBQAB49BVJ0D","atts_01GW2HTPW6JVDDHRF6Q6S875KW","atts_01GW2HTPX7ZYW6ZM5S2Z3W2YXC","atts_01GW2HTPX81M40SE4K61AW97YR","atts_01GW2HVE9PHKW4YNY3ZX5NCYRR","atts_01GW2HVE9PA5FY033X5YKM5Q1E","atts_01GW2HVE9Q38WE3XQJ5CK18M1C","atts_01GW2HVE9VPAHEHWD00ZWRCKSF","atts_01GW2HVE7D2Y0F77D5Z1H5SFA0","atts_01GW2HVEAVM0BH9C1Q7V2F7NEN","atts_01GW2HVEB18WZ3E3ZFZQY51BB9","atts_01GW2HVEAZWENZVFS21D5YQQZK","atts_01GW2HVEAX5RKZAJTXG9QR2M0S","atts_01GW2HVEAVBGR5WWWPW89ZM9AK","atts_01GW2HVEAX7YJCHDZQHR62DGMB","atts_01GW2HVEB18BD7HVE96RRE3SET","atts_01GW2HVEAZ2MW0RRHP3G17WH6R","atts_01GW2HVEB1J5ADFJVSGSNEJ3Z2","atts_01GW2HVEAX9TDG452D1C6R9AAE","atts_01GW2HVEAVGVQ71VMRY1087V12","atts_01GW2HVEAZZ2VAR2G45S728GDE","atts_01GW2HVEB6TM60R9PZY2HPFQ4X","atts_01GW2HVEB6HE6NVVW7W91BN028","atts_01GW2HVEBRE13T40ERVV9WWNVH","atts_01GW2HVEBR38KKHFJZJS1SAB2N","atts_01GW2HVEBBQ7CQE5QMVQH45N79","atts_01GW2HVEBWPCS77G8ZFHWEC1RG","atts_01GW2HVEBXP6KKBBS0171H3TB8","atts_01GW2HTQ08P0B3008THAM2N2WF","atts_01GW2HTQ09FENP2MNAZFMJQXJN","atts_01GW2HTQ0BC5H73TYT59T64J4G","atts_01GW2HTQ3G0M8MRBKNBA6AH1Y8","atts_01GW2HVEC836QYH7K1DTFG93AT","atts_01GW2HVECNPMER8HFRP0KS20DC","atts_01GW2HVECKV1B8346MQ6VTC0J0","atts_01GW2HVECNXZYWRK9QZPJ5S9QR","atts_01GW2HVECK9SVFRDW5DRK6T32Q","atts_01GW2HVED96Q4ZHWXR60GPTYS9","atts_01GW2HVEDAAQV2F1QFQ26HX4R9","atts_01GW2HVED8G9HQSK9YQHYAQ3EC","atts_01GW2HVE61HBCMQE6BPHXD7AG7","atts_01GW2HVE61KHTCVX56YNWQC03G","atts_01GW2HVE616H1GYG4M7JRFCCJB","atts_01GW2HVDSXBNZ4MHFNY0S382TK","atts_01GW2HVEE6AQ3XPMF4X793KTS7","atts_01GW2HVEE60MEJKX1A8AKTYCD7","atts_01GW2HVEEFGX293HMPGFYR0Z6F","atts_01GW2HVEEB6CDRN6BK15D8TD11","atts_01GW2HVEEZ3EPZZ9C893DDWGF5","atts_01GW2HTC3VVX2KYYWYAERF7ZSC","atts_01GW2HVEEKP63FXPKHV9YVAKK8","atts_01GW2HVEEMNBWRY2XRTJ4S5GK0","atts_01GW2HVEEPECZYP22M4F71F841","atts_01GW2HV7CYX700Z2X4NQ5SATE0","atts_01GW2HV60KECH25QRSBH9NENXP","atts_01GW2HV61367SKVSBMP36VJHB0","atts_01GW2HV4XPHT1YJP7ZB2PCHRV7","atts_01GW2HTKPG9TRD7QZH7H3W16QX","atts_01GW2HTKTT3852ENRANC547R35","atts_01GW2HTZS53C1EYCHQ7XHQN9HQ","atts_01GW2HTKTWPWBFS8CFGYJJ0HJT","atts_01GW2HTKTYG2YRQWDEZVG528E9","atts_01GW2HTKTM814D5PZ3DT5RQPXH","atts_01GW2HVE65FGBYV1X8JSXD825S","atts_01GW2HVE65DYQ37NJA145NM04K","atts_01GW2HVEFHJHKK7ET8TXXH3KWS","atts_01GW2HVEFHNFT38TB2Y8CMJ0PD","atts_01GW2HTHH6D9437BHF0MHRBA9T","atts_01GW2HTHH7RJ87XYNBM0848S5Q","atts_01GW2HTHH76R75KNC09S9M8YTX","atts_01GW2HTHH7EA25PNN1FN5N9KY6","atts_01GW2HTHH860N8GQJ0H8C2QB70","atts_01GW2HTHH9CJCDB03E2DH5MM64","atts_01GW2HTVQSQCYB91C9SKZDG1T3","atts_01GW2HTVQS9735FHRDW2BGDFZG","atts_01GW2HTHKSF653NECVFJ41MC7Y","atts_01GW2HTHX8XQNXKA9P41F383W5","atts_01GW2HV5RQQ3KNBZS25XACEDV9","atts_01GW2HV5RR02ZEJTYYM9NE9Z2Z","atts_01GW2HV5RSB1Q7W2MNJQBXCE1Z","atts_01GW2HVEFQB5MWSB429HNZA1FP","atts_01H29ENFHSKPRBRK49S4MM8MPK","atts_01H29ENFHTZDH9J9EXB8NZ5SEH","atts_01H29ENFKAKKX9QHM15B08PFKK","atts_01H29ENFK7E1K3HZ81BSR83BES","atts_01H29ENFK4K0RQ5MGX15A9658B","atts_01H29ENFHB3QDGGK6S363M60RZ","atts_01H29ENFJV0P0GZKZHAPC16MT7","atts_01H29ENFJFW1RWEHKG5C3N3PD2","atts_01H29ENFJCKDQEDJWXDRGSSAC2","atts_01H29ENFJKRGYCNX44AF88R3DZ","atts_01H29ENFJAXPJGHCW5CQ73D0D4","atts_01H29ENFJPTASHJEXERVC1RA8F","atts_01H29ENFJS56P4KJGCD90KJJWV","atts_01H29ENFJ7PY509QX4NZV5F70C","atts_01H29ENFJX5ZHZRDCNE41GKG7C","atts_01H29ENFJ42FJYC4GDPYPS3P29","atts_01H29ENFJ4ZAQXP7PTM96V63NN","atts_01H29ENFJDN15EV6J46WHBN4VM","atts_01H29ENFJAGM66H8JESHR65CJR","atts_01H29ENFJM4WF0F0K8W18TMXRD","atts_01H29ENFJGXR6YJ3BC7ZGVNMJT","atts_01H29ENFJPM5MWHAKYT3DDD5Y1","atts_01H29ENFJY37EJDWZ1P6WRDRRE","atts_01H29ENFJVPNJ0N19FWKMMEYQM","atts_01H29ENFJS7F85DV07GH9GN69E","atts_01H29ENFJ7H1S9EB0ZQVY2KK35","atts_01H29ENFJ5NRQY5JNX7QGQPXGB","atts_01H29ENFYDDBHDMFZ77TYZ2PDH","atts_01H29ENFYF21XFA537DGZZAZHZ","atts_01H29ENFZCPENE806TVBGTY9A7","atts_01H29ENFZSHNJAKZ4YS112M0TS","atts_01H29ENG081PZYM2QHH6XSPS2E","atts_01H29ENG04CF40ST4S1B34ZTQN","atts_01H29ENG08T8H46CHTANKZ52MH","atts_01H29ENG04RFVVTX59WR1PVC4D","atts_01H29ENFWTWFRDMEKBQWB3716F","atts_01H29ENFXQ7SQ9QKCJS63WN0ZF","atts_01H29ENFXY99M7CMDA4WKX2WS5","atts_01H29ENFX1NY12Z4VDA690DHB4","atts_01H29ENFXTW6M597H5YECCC924","atts_01H29ENFWYF6VGNM9PMKQV3PX1","atts_01H29ENFXDEMA0DJ3GA6KVZ06M","atts_01H29ENFX9KCQCDPHAS8S72GNV","atts_01H29ENFX6G1TFMTEVYH03B3AS","atts_01H29ENG1CTEX1NYECY5M8DTYH","atts_01H29ENG336S079YGZB088X37D","atts_01H29ENG53QMC45CPR4R0KR4QT","atts_01H29ENG54GJN0AZ4ZQJ4NKQZJ","atts_01H29ENG9ESKM3FRQ4R8Q2537X","atts_01H29ENG9GPQB52E78GK34QJQ4","atts_01H29ENG9BN78EZXCG9QJQ04ZP","atts_01H29ENG99828CFMADPKJPETWT","atts_01H29ENGA86BYJEMGMC6WEY3F1","atts_01H29ENGAA3QRZFV1N69CDK8CX","atts_01H29ENGAEYT6H60XXV1JZGQHF","atts_01H29ENG8SKCGR782T12J64XHP","atts_01H29ENG8FYYMVDV4DAD4XXG4C","atts_01H29ENG8MT1G6K52664PJ6XCQ","atts_01H29ENG8AFFPDQJV5WQR5QFH3","atts_01H29ENG84NK8SEAY2X424KMK4","atts_01H29ENGBVR34DY98XB3CJZR2Y","atts_01H29ENFA2XX9QEWE3YJ6KHT3P","atts_01H29ENF9YV0V7PAAEH7CJ0ZCQ","atts_01H29ENF9P93XASTXV2T1JKQQX","atts_01H29ENF9C57R0GJQWAKECP5Q2","atts_01H29ENF98SPF737VN2004GACZ","atts_01H29ENF9HK6K37SMXS3QX94J8","atts_01H29ENFAJ3T1ZACHFPNJCVB40","atts_01H29ENFB7X1YWJFDB85J6CS5E","atts_01H29ENFD97Z9FF16T2QY0CMD8","atts_01H29ENFCV7BAGH8SKBER0H2M9","atts_01H29ENFD08ZCZWHKXDPZW30YZ","atts_01H29ENFCRNBXZTA1KGRNY9EMB","atts_01H29ENFCXNESRV5CSXTE7KZ1W","atts_01H29ENFE7E1TDREP8H9A32BP9","atts_01H29ENFHKP1GHGJN8VZD8PD84","atts_01H29ENFKBF6DBJJF6XMFAH759","atts_01H29ENFKYPZDJZAC0NK54KHBB","atts_01H29ENFKHKESMSA0ZSAFD0ZHH","atts_01H29ENFKK5QCP00R8J00GR7A4","atts_01H29ENFMR5MCX978SGGN7D61C","atts_01H29ENFMNKDNNFV8DJ7HXA04Q","atts_01H29ENFMHW6F8W7X8XHCEM5QY","atts_01H29ENFMENWMW99EJ8QA8NSDA","atts_01H29ENFNTXNWJAHCNJV9X9C4Y","atts_01H29ENFNX9973KDK7VPKMNDZJ","atts_01H29ENFPC3D36W7YRAYJV3CX0","atts_01H29ENFQ1A0VNKTP7K4E3SKM2","atts_01H29ENFT32GTFNCN4W5EWEBER","atts_01H29ENFT14H9BC8JQWMJYGHE5","atts_01H29ENFT6A1QZTKYEP57BQ32P","atts_01H29ENFTKATE629G9T6S51N66","atts_01H29ENFTZK5BXWFF1QC8D2QR8","atts_01H29ENFTVGC16YBPFW3SPTR9H","atts_01H29ENFWJH9PSYPYD92087MB1","atts_01H29ENGCTRXP12XRW61NGB672","atts_01H29ENGCTJ2C0Z7YXJ1EC68H3","atts_01H29ENGCZ7M30Y2YNA4469E5E","atts_01H29ENFVVPQHXDMBFCM786M2T","atts_01H29ENFVQA05FHF8QD4D9314R","atts_01H29ENFVW8NSD84P3DZK4PPN3","atts_01H29ENFS1ZPD5S579SHHTPKB6","atts_01H29ENFRSM2WANMM50S9ZGR7Q","atts_01H29ENFRPP95Z65MV3VR33J9S","atts_01H29ENFRVJB9TFFN60B8HNXN0","atts_01H29ENFS8CM29SZEFW1AQANG2","atts_01H29ENFSB7Q9DRNPG0CCK75BW","atts_01H29ENFR2X1XD30W4CKAXCXKB","atts_01H29ENFSC3G3PG4XA3ZD1QRRS","atts_01H29ENFR3WZY7YC1VKBHY0ECP","atts_01H29ENFRKN4YVXS6JT1Q815WB","atts_01H29ENFSM0WMVTFFTJ2R669T1","atts_01H29ENFSEP7C6ZFJH6FX8W1KS","atts_01H29ENGDD5FCH84JRH8S6BQ4V","atts_01H29ENGDT8SHMN5W6FR236ZV3","atts_01H29ENGDNWWHBRBA82DV03CJT","atts_01H29ENGDXA7Z8WZY9TWEB1EF3","atts_01H29ENGE0C0X79FSPYBB4NWAV","atts_01H29ENGDK05HVRW5NQ5QA4VCQ","atts_01H29ENGDRR6QPT2H3Q296YK4C","atts_01H29ENGE34E9MMCR3Q3DCBN6V","atts_01H29ENGDVYETZR5MNFBDDBRBM","atts_01H29ENGE3CWF9QPXBG75AK2G1","atts_01H29ENGE0GGB12YEQG59WWB6F","atts_01H29ENGDXNRFNWGEYTM1EWABY","atts_01H29ENGDK3TNMM24TBDS7ZKCC","atts_01H29ENGDPQHJNS9HDWC6XQ9PV","atts_01H29ENGDR493Q7W19CFKWPQVQ","atts_01H29ENGEA4A34F52ZY9P21J87","atts_01H29ENFF8DEPVTDETSTN8YSDE","atts_01H29ENFFFW3JE753JNR73A2N6","atts_01H29ENG9QG6FMJRW0000ETPV5","atts_01H29ENG9XA48CM9JXGTVN19JT","atts_01H29ENG6851KEQ4W3V6054YG8","atts_01H29ENG7GTSCTBGYPA28X9H41","atts_01H29ENG7PX689EFSR05AH8EDX","atts_01H29ENG8YX7EYTWN4KKQNK19F","atts_01H29ENG4CPKZR3SZBHFXW9BHE","atts_01H29ENGAZ8XQKHK4YD0DMAAX6","atts_01H29ENGB0PW0GYPS65Q5K4HZM","atts_01H29ENGB3CJY9ZMTJP128VRMN","atts_01H29ENGB52TK0GMPVQ1SZMBW9","atts_01H29ENGBFJQ0W7K46VVHN9X3R","atts_01H29ENGEM9SA1PM0DCBX39DP7","atts_01H29ENGEGTGXRD9S81HH5FZR4","atts_01H29ENGES1PMMTA2QEKBF6NCM","atts_01H29ENGFV80G7MW76BX4AWDWB","atts_01H29ENGG59EA3077BY5PTNYZN","atts_01H29ENGGA2GBMB3KRRZVX6B9R","atts_01H29ENGH9ZNCZM0BCPTAPTV43","atts_01H29ENGHFMN04M0BKD4C5BDT1","atts_01H29ENGM11SGVH44KNX2B8132","atts_01H29ENGKQZRB7NRXNFX2S7CXK","atts_01H29ENGKSQWGHGJ5PP1XXEQEK","atts_01H29ENGKWEK7MQSWAHMF0GDTF","atts_01H29ENGKZP499RAT5P2Y5GVB1","atts_01H29ENGM5TJD0WHN1MXG9BR4Y","atts_01H29ENGMYRYCVRQ42T0ZZAG94","atts_01H29ENGN7KNQMJVDMYZNFQRNJ","atts_01H29ENGQPYTT249CVM4JFMCZC","atts_01H29ENGQXBC1P9P2E7RHR9FTJ","atts_01H29ENGR14A7R14KYEYNHX5RV","atts_01H29ENGR35XQT0K6DMWYZQYDD","atts_01H29ENGRXNV4K2Z5MPY7QGJGD","atts_01H29ENGRNBPMRN3DPVXBNGA08","atts_01H29ENGRC6WZBAXA2BMKZG90F","atts_01H29ENGR930F09JTMR8QTPR9V","atts_01H29ENGRE7QK75MFV7TKV3E2M","atts_01H29ENGRHJPSHMZVZD1RCWXG0","atts_01H29ENGTAY9EV2BZB9BZ6C2HQ","atts_01GW2HT8T7T4JZFNTPTXDN5SD7","atts_01GW2HT8W02BBH506DPT3184S5","atts_01GW2HT8RQVQV6AAD3HY3Y5GD2","atts_01GW2HT8RQYWH3PKQ3JWHEFA6J","atts_01GW2HT8RN7ESDRD8J3E9RS62C","atts_01GW2HT8NJKXX2VBZ15ABHWMZA","atts_01GW2HT8ND0ZJ5HRHHZTFZPGMD","atts_01GW2HT8MYBK0DZTW8KQ64DCR3","atts_01GW2HT8ZADQAJG24JHCF0AY7P","atts_01GW2HT8ZA51NJVHJWZZ1Y6254","atts_01GW2HT8ZC0XB6MW9GR8D2QNE3","atts_01GW2HT8ZCZAPSWPZAE7ZFJ4A8","atts_01GW2HT9KHKDEMSHN9VPXDDECQ","atts_01GW2HTA7DY97P4YV7TM0ACDH0","atts_01GW2HTA7KRMP758DJ1BGJ6H2K","atts_01GW2HTA7RZ1ZVKG5GW3D3AG27","atts_01GW2HTA7VYC94YRAV82QXQKCS","atts_01GW2HTA8HRGKNY9PA3CC4MC4N","atts_01GW2HT9QEJCC8XNXCNERQB9NB","atts_01GW2HTAP15ZDBRP5M6F45NQN1","atts_01GW2HTASB9DVA7YBVDM5VSRGW","atts_01GW2HTAS96HD5AH4A0X88JMNK","atts_01GW2HTASCWCPCDZK3KNDGZT06","atts_01GW2HTASDSNGX5F1GR7C1RD01","atts_01GW2HTACZEX7M1JGNHJZFN756","atts_01GW2HTACSWQAMDZKGJ0BZ8F45","atts_01GW2HTACXBN9ZYH24ST86AVVP","atts_01GW2HTACVXHGEMN4N3BWXA5NJ","atts_01GW2HTAH0NXPC9G770WJ7CNEA","atts_01GW2HTAH69J6M132MXKCKC49Y","atts_01GW2HTBJHQ7V0C0PZXBFJM5VV","atts_01GW2HTBT8A970A5QMWVJEYDHV","atts_01GW2HTBTG04R63HMZ4EEKA44J","atts_01GW2HTC6GAMBYR50ZX5KZXMHD","atts_01GW2HTC6NPJKPHGV73P0QB0NC","atts_01GW2HTC33MZVPAXJNJXP7GVQY","atts_01GW2HTC60FKGXTNP72ZK2K4EZ","atts_01GW2HTC5YP3WDS339PHE874V1","atts_01GW2HTC5YQN6FZZ8XC0V5YG10","atts_01GW2HTCX1DKR2NX0NYP7CYQ8C","atts_01GW2HTDSC5KT14MB46PSAYR2Z","atts_01GW2HTDRJCVYK40S534J8JYY8","atts_01GW2HTDS5Z4MGTKVCJDHDJMC7","atts_01GW2HTDS9SN359E9MK6HDX627","atts_01GW2HTER1QW8XRJ3HJBAVANXY","atts_01GW2HTER1A55A00V8VRMXZV0K","atts_01GW2HTDZQ4YJESJBVYCXP1QA3","atts_01GW2HTE5SM0EP4Q7VHKZ843M4","atts_01GW2HTE5VYMZGSXPEDPH7C9ZW","atts_01GW2HTEZGFGGY93CP9EWMKWZ3","atts_01GW2HTEZET0SJ6HEH729KS1ZQ","atts_01GW2HTEB6W25BASRAEWZQ245E","atts_01GW2HTF9GP5D9PN9THHWE57DY","atts_01GW2HTF9GTQPVXYNCHCSH3JES","atts_01GW2HTF9CEKG1Q2NSPKS72MCM","atts_01GW2HTF9HG7AMB0EC5BY1X9HF","atts_01GW2HTF9AKYVH6W1XTC6BQFBA","atts_01GW2HTF76WDGJZJKRWZWJA22Y","atts_01GW2HTFHGXPPA8T7B1YFAS0CM","atts_01GW2HTFHFJXXRF2GQD4T9WPVW","atts_01GW2HTFHF8JWYG1SDCYZ61GWV","atts_01GW2HTFE459CFCFW245E688D4","atts_01GW2HTGZJXW0JXEEKAMMHF6JC","atts_01GW2HTJ9W61D2MSWF7FQPCZA4","atts_01GW2HTHWTK8P3NRWDESDCDPDC","atts_01GW2HTDDRPC0A65NEQYKTD765","atts_01GW2HTDDR4NRNFTYM095ETQ6S","atts_01GW2HTDE5560D0SMP9PZS6M2N","atts_01GW2HTDE6D79TE5F5TH6A2KE9","atts_01GW2HTJ6931QNP2VP6EXEQD8X","atts_01GW2HT92JSR44TPGE3Y6NB4PP","atts_01GW2HTM13E2HWB7HSF47YDT8M","atts_01GW2HTK9XJSAA207YMK1Z5E02","atts_01GW2HTKCBSV8ACKAFE3BE8HM3","atts_01GW2HTKCD5CWNEZ5RT6J4BW2Y","atts_01GW2HTKC9QMF8C0B9AW9TE39F","atts_01GW2HTKCKT65CH7DG136BD4KK","atts_01GW2HTKCFEQJP4G8S3MAFBNEF","atts_01GW2HTKCRNQR95C54TXJXRMZW","atts_01GW2HTKC7K5FBTTDQ6YM2HQ4M","atts_01GW2HTKCHX83MH3MYTZ7QA6HG","atts_01GW2HTM0KHXB5QT5D49J4CVDQ","atts_01GW2HTM8PYZXQ842NYK1SNWGT","atts_01GW2HTKEJ1ERE98QW0KE5EMZB","atts_01GW2HTKEQ6Z4915JN3Q8CRWKX","atts_01GW2HTKEQ0JTSK41RFJBDGQH7","atts_01GW2HTKERR3M1Q0756YN5YTBE","atts_01GW2HTKEJJ3H58AG6Y4Z7W0GK","atts_01GW2HTMSXTADTKBN7EJYYH6W3","atts_01GW2HTMSSDJ57TPSA9QR7HF2Q","atts_01GW2HTMSMR6WXPKR010WD5WFZ","atts_01GW2HTMZBNJEXDDCKQCD4AYFK","atts_01GW2HTMZDXMJZE1GMVRKKRFEG","atts_01GW2HTMZD3JTGNQ2JS5GZ81VS","atts_01GW2HTND19X3NDD1XBZ1M8357","atts_01GW2HT8AM741RR6SH6Z5VGDV1","atts_01GW2HTE5F7V432T260PVYZY3D","atts_01GW2HTF8SDCSP03G0EZ6MY942","atts_01GW2HTPJ6WYZGQSPEC7P0W9AK","atts_01GW2HTPJCZDZ1HE914AC1MX3W","atts_01GW2HTC5WDHJ4721QF168C77J","atts_01GW2HTC614K0K5SEBGVRSPD0Z","atts_01GW2HTQGJPGST4MHZM5H8VCNT","atts_01GW2HTTH1850CQXJE1HX6SRZQ","atts_01GW2HTF1T0JMS79KTPK9B94N2","atts_01GW2HTCYCABC7GP133GZ57SY1","atts_01GW2HTAXBB3Y4QKABJ0WMC7XH","atts_01GW2HTDZTMQ0NVMZ74C9YCT3N","atts_01GW2HTDCKDFJNN9XBJAW2NDQE","atts_01GW2HTDCKF32FVQCS0N2ETYG1","atts_01GW2HT8NG1G8A6G7ERBZCW65H","atts_01GW2HT8NG9SC0B85SJXZGKF5E","atts_01GW2HT8NKJDSE1S41N98JN8SK","atts_01GW2HTJT31NHM7H973R9G1XY5","atts_01GW2HTJT3VKR4ZEZME0TJHWWR","atts_01GW2HTJSY30K24F4371HPM3VR","atts_01GW2HTD56C3Y5RB3GPYRX5BAX","atts_01GW2HTKCMDY59HE10F9P3YTVT","atts_01GW2HTKCFGE6PW3HWTHTQ5A1F","atts_01GW2HTKCJ3MMF3REVCWBT6JDF","atts_01GW2HTKCRQ7V186PH0KK8A5F9","atts_01GW2HTF6GMTCQC465KHP2Y6CG","atts_01GW2HTKGZE1HT7F98FRYRSWYX","atts_01GW2HTKGV92VZ2K7DX4B52CQB","atts_01GW2HTA8FBX16GAJNRZ7MZPGV","atts_01GW2HTAS9G9YFW3SD0Y1R713Q","atts_01GW2HTAS909DMBYFGRWVPJST9","atts_01GW2HT8BC9BRWVHF9WJYB5SV9","atts_01GW2HTAH3EGP44DJN1JVMRN7N","atts_01GW2HTAGY94J1J1K3T29HYCBQ","atts_01GW2HTBJJNF8XZAC1XX6RH5FS","atts_01GW2HTDCKY937X7GBX8FXEXEC","atts_01GW2HTPTBHS1QK35WQMASJEFC","atts_01GW2HTPT4M0J577G0XSZVNAPS","atts_01GW2HTPT4EW3F6A2AWF22ERHN","atts_01GW2HTPTBNJWFX7TD0VP9EMTB","atts_01GW2HTD0HA9SFD6ZGER1NK2RW","atts_01GW2HTD0P65WMNX5XQRK36NGD","atts_01GW2HTD0PWPHJF2WC8JZFF7TF","atts_01GW2HTE5Q0JBVWTFQS4QBJXCR","atts_01GW2HTE5SF0M6RPNVF836Z0FK","atts_01GW2HTE5V2H9ZBZ6AAX00DWMQ","atts_01GW2HTCWNYNXFVZGR83PCMKBJ","atts_01GW2HTCWJNQ7TK67AP6B8K29K","atts_01GW2HTCWGQECK2SRW25TJ92QE","atts_01GW2HTBZVV98PD4D4QEN7HB8H","atts_01GW2HTWX83QN066S0KVH36A53","atts_01GW2HTWZWCEVJE8PGWN8SC0JH","atts_01GW2HTHJGEWD7TKSW13NSNTH5","atts_01GW2HTAS62WA6X5NERJY61JGX","atts_01GW2HT8B74KR5FSJ8TD1P9JNM","atts_01GW2HT8KAAVBPFRN68TM7ZBMG","atts_01GW2HTVGAKZN0SMYXSYZYR8A3","atts_01GW2HTD2PF8HGPP37PXS156XE","atts_01GW2HT9CGXKCV5GW235E0KWV3","atts_01GW2HTF8QJZ34MFRZ2Z510Z3V","atts_01GW2HTA850N4MNGRP01YJGVEB","atts_01GW2HT989F0HZJFR2S25RSKQM","atts_01GW2HTVE07M444HA46NJSRKW0","atts_01GW2HTVE3S30YR2AX2HEMDSP0","atts_01GW2HTVDXTVBXQ44XM4PS0ZBP","atts_01GW2HTBS1T82MSYHMZSC6YCCC","atts_01GW2HTBS1A3FSHACH0M9Z6SQB","atts_01GW2HTJG2XGGAZT0B54KYDDFY","atts_01GW2HTJFYTNN8NB4JTA6CYE0P","atts_01GW2HTJG4YYJ4ZNWXECAFMPCS","atts_01GW2HTQBNFGRG6B0WYATHQR0A","atts_01GW2HTZ5W04SAQAM4STZJB5BC","atts_01GW2HTZ5XJR1M9NZFXV175W18","atts_01GW2HTZGARMEGWW501BXC7ZTT","atts_01GW2HTTHTBFNAWSS3X1SAQFTM","atts_01GW2HTTHTWMDPB6BEPX5PBYZM","atts_01GW2HTTHV3ECD84WEVBBWP1A3","atts_01GW2HTTHWWK3KBSTAQXF88F8S","atts_01GW2HTZY965K36E70GJYPW905","atts_01GW2HTZZMHMZ3JDVP4RRDE60C","atts_01GW2HV47DWNDWR5EE3XCP75PE","atts_01GW2HV4MY92CA2JCTCFS9S3JR","atts_01GW2HT8RFNZGBNYWEJKV0N7XP","atts_01GW2HTF6D5NJ84AS9NHYK73E8","atts_01GW2HTF6R9DAD3EAGB2F33XDS","atts_01GW2HTF6R5SCMW0ZBJV3WEXF9","atts_01GW2HV51TPKT702M0RT912XVD","atts_01GW2HV51VAGN1ZDYSYH2YZJZG","atts_01GW2HTD2TGXAQFNA60HTM674R","atts_01GW2HT8Z5AEQZ3K8SQNF49JSE","atts_01GW2HTAC0XT5EC26V2NP3MGRT","atts_01GW2HTAC0H65BHAGPR3DEPPQ9","atts_01GW2HTAC2J2W9Y4ZERPGYNMBF","atts_01GW2HTKHNW1QXHCSZJ9V0JJP6","atts_01GW2HTMSXV05TY00S9X1BZ447","atts_01GW2HTMSTGTE3JBSQA7MNGG0Z","atts_01GW2HTKEGX8S1TFM9GNGBZM0X","atts_01GW2HTKER3K0Y3FP1FKPT5GVM","atts_01GW2HTTH0DJ3WNMD3FRHPK37M","atts_01GW2HTVWCPX3A96YPD1Z8WJ70","atts_01GW2HV6BQWG8KH45SM6XA6V3J","atts_01GW2HV6BYT99NXWMVND04PSQM","atts_01GW2HT8N6N3BEWFD4016EA897","atts_01GW2HV6FZQ7KK3KHT7YFSVDR1","atts_01GW2HTTNPEV9D21WF71RFSAAQ","atts_01GW2HTFHMFDQ82DV54Q6GA2Y9","atts_01GW2HTAHS05AVQQRV2W6YEP9N","atts_01GW2HV55HDMTC6XGTCNWZK4MH","atts_01GW2HV59Z7TP6HMYQBJY2FXVY","atts_01GW2HV5KCB6T1SXPZFWR6QJNC","atts_01GW2HV5KSR1S8VZFX5899CZ03","atts_01GW2HV5KZNT3GECS7E7QPQACZ","atts_01GW2HV5M25GK9G7WJJ85WCK21","atts_01GW2HV5M1TNCZGX8TN72KNMMG","atts_01GW2HTKE3PKJVNMSJJG0YMB6N","atts_01GW2HV6VK8TBNYCH7HNE79BPD","atts_01GW2HTCW7FCDKNMPXF439QDX5","atts_01GW2HTJT73MZ0N2CD15467R5H","atts_01GW2HTAKYWT9H248CW8JXRWCJ","atts_01GW2HTFD6DFTC3QTYNF8ETYS0","atts_01GW2HTFHMXZH6MEAFKR6ZDNX4","atts_01GW2HVDTAHZRJKQXJTV0AZ8F4","atts_01GW2HVE3FMND4QYTXYDVBVGYE","atts_01GW2HVE3HCP8F3SRGZ2QZ07MM","atts_01GW2HTY647WF71G8KABDGGGEK","atts_01GW2HTY64Y9471CGWEYFKGA6W","atts_01GW2HTY652TJK8KGNZ37CQ7ND","atts_01GW2HVE3JPD33JFYNX86V7KXC","atts_01GW2HVE3J9EV9Q9DZV66JK1G9","atts_01GW2HTN187RHSJQ3G519RFTQW","atts_01GW2HTHX7GKAXS67W01SFTA59","atts_01GW2HTHX7JKZQ33003XCG8QRZ","atts_01GW2HTHX6JSDSQSAM6ZZK558W","atts_01GW2HT8D3WJF1QK1JTCZ4YFPQ","atts_01GW2HT8D03WRX5QP5R2EH6BFS","atts_01GW2HT8CVY6T5MCFWDKTB6HA2","atts_01GW2HT8BTWQ5ZW4AQND1F7RNN","atts_01GW2HT8CADFZTJY72C4S1RASY","atts_01GW2HT8CA6Z0KY4HJAACMEKG2","atts_01GW2HT8C5XT03RCXZ9PNZ3HFQ","atts_01GW2HT8C2151VS8G6S1Z0G1TW","atts_01GW2HT8CH76PXN9MY47RFG6HP","atts_01GW2HT86M9SEPSV33D5CTBXFS","atts_01GW2HT86TQ0904BP3WR2FX743","atts_01GW2HT8704MGG44GJCMZXJXTY","atts_01GW2HT886THFB9P9N2CY1GPYG","atts_01GW2HT8HAA9HKDH3R2ZE3PBK3","atts_01GW2HT8HDJ91JK67YCE2P4VR7","atts_01GW2HT8HESZGG4WD8PFTCDBX5","atts_01GW2HT8H68925V9S4AZQT6XJX","atts_01GW2HT8HHZW1R6HBZ3WMY5F2N","atts_01GW2HT8H6VHXVYKRCVXY9RKEE","atts_01GW2HT8H9ZEVE2AJ88PZ3ZSTF","atts_01GW2HT8HG362F054WS3ZCPD7S","atts_01GW2HT8J06C0NSZ28B95X1GYE","atts_01GW2HT8HXYR425B5NVKN6DBM1","atts_01GW2HT8AAESQJEF9CG2TFP56F","atts_01GW2HT88YEWSRYX6VPV7JSW9Z","atts_01GW2HT8FW29E0X6ZWXWY0DF8Z","atts_01GW2HT8FZS0B6EWSQ3099JT4Y","atts_01GW2HT8G17Q6C56MW6V2ZCKVG","atts_01GW2HT8G1A5F5R435PSBRCSZ9","atts_01GW2HT8G5Z6R0S1SF6WGTDH6D","atts_01GW2HT8G5P4Y1B41GADQ225VZ","atts_01GW2HT89MN0EK0BNVK8KYZ5HH","atts_01GW2HT89DRZSHT2ZXAXX110HW","atts_01GW2HT89HQA71CDWV431ZBM6J","atts_01GW2HT89DV8WFAN6K00GM4X12","atts_01GW2HT89HRHC0JJG4XRM73T84","atts_01GW2HT8DQ9BS5RMT0GV56DSXC","atts_01GW2HT8DKRT3RCZN247NPPH2Q","atts_01GW2HT8DNKMDSPGCN735QZTPX","atts_01GW2HT8APGYTVMPHR1K2867FJ","atts_01GW2HT8BGFQR551KG92WNYVAH","atts_01GW2HT8AM9KXX49CJGZHRNF1K","atts_01GW2HT8AJRJ2JVSM5N8K5SVNH","atts_01GW2HT8BC2H9MBDYYX2DNRMCH","atts_01GW2HT8KW701PP27BH5F3WP42","atts_01GW2HT8KG7M8EDHXQ82TWDJZY","atts_01GW2HT8KGHJVG21F48802274Q","atts_01GW2HT8KW9M1430ZX5NPNG469","atts_01GW2HT8KJEN0WXFCTAPY7QBJ5","atts_01GW2HT8KNEZCD6S0MV1R9SZTT","atts_01GW2HT8M1YRNF4DPA0C0ATPNR","atts_01GW2HT8KYFSVDWH1KVMR0711Z","atts_01GW2HT8N2ENVY9TQJ9JANM4QH","atts_01GW2HT8N3QNBDH9ZE2YQ97G66","atts_01GW2HT8N4SJZ5P30DMKQB0YR7","atts_01GW2HT8WEQJGB8CJFFFRKD67D","atts_01GW2HT8T4W8VJJ9DA7GMTXF24","atts_01GW2HT8TWWB4Z03XGZYFBRPY1","atts_01GW2HT8TB25YJA4GYS4YGQB9B","atts_01GW2HT8TCEBCRZ83ZBHBWTVGR","atts_01GW2HT8T6G8PAVYDX9GZFS6Z7","atts_01GW2HT8TN85QZ691V3FG7W55J","atts_01GW2HT8TNCWT0HKXV3G1D6DMB","atts_01GW2HT8TRC6X581842CEXNEWS","atts_01GW2HT8TY2WNHYF80Z3JY4472","atts_01GW2HT8TK0GBKA6FB259M5T78","atts_01GW2HT8TK1KDY16PN1BSKZS96","atts_01GW2HT8TFJPJ2DTNX0Z49VFYY","atts_01GW2HT8TDE4QHCDA7SZT3V78J","atts_01GW2HT8TDB01KJD42TYPAW2FZ","atts_01GW2HT8TQ7D1RBDMBX3BXVJNR","atts_01GW2HT8TTYCKW7PM91HYAHGPJ","atts_01GW2HT8T9V2K0S44CQYKBGG52","atts_01GW2HT8QVYT5MYK5XTKK79BVJ","atts_01GW2HT8RRMQ0P0669ASEY8KRS","atts_01GW2HT8R53AXKE0PHTGN41CYX","atts_01GW2HT8RWRTW8WHY64EDNB6FP","atts_01GW2HT8RMCE2NQW0ZTA758R53","atts_01GW2HT8QWSHCWAHCP4BY3J35W","atts_01GW2HT8RN9EDES80VQMGVAWKQ","atts_01GW2HT8RP9WJK13Z0WKVAHVKJ","atts_01GW2HT8RG5YF6YSKCMJAYMY21","atts_01GW2HT8RG613T2SH6ZT8BBNF5","atts_01GW2HT8QYDM09VC8P29EVVKYS","atts_01GW2HT8QSR0NNWJZFQATTFDGY","atts_01GW2HT8QSPGQN9JRGP26FXZYR","atts_01GW2HT8QNAA7ZCJRKZ2EBVTZM","atts_01GW2HT8QNBF6GNB42EG4VTXVS","atts_01GW2HT8R326561H0F9P8VMABT","atts_01GW2HT8RAHQ8BBDPTQYREHPER","atts_01GW2HT8RJJ9GYBBS6S91D94YV","atts_01GW2HT8QQ7GN9GBVPA2GS36QJ","atts_01GW2HT8R8WG0HCA8C7Z0ZBRRV","atts_01GW2HT8NJ5WDRJ4TYK6K79WKS","atts_01GW2HT8K45ZJJ84MC5FP5JE8F","atts_01GW2HT8K429BEAGDFTAYCWEEP","atts_01GW2HT8WM8VKE0RBQE5PHAD7D","atts_01GW2HT8WTWCZKPFMEDY65ENNX","atts_01GW2HT8XTETKPSBQ6RZFEYEJH","atts_01GW2HT8SQWJFEKNH3D4H17E6P","atts_01GW2HT8SA573X3Y375C5M4F3Y","atts_01GW2HT8SQJ2ZBF8V8VH40D6VR","atts_01GW2HT8SBN8JGRT1SP7BMK21Q","atts_01GW2HT8SDGP29KZ1ER7PJ7Y23","atts_01GW2HT8SF435E80GBASR4YMHX","atts_01GW2HT8MVD2GAP9ZJZHX8WBW9","atts_01GW2HT8PYFCC3G5RSPQPDZ1XR","atts_01GW2HT8YAXWXDCH9HY83P1W5G","atts_01GW2HT8Y8DJ9R8CED2BZ5V4ZB","atts_01GW2HT8YFVPEDVETYH1QGEG80","atts_01GW2HT8Y6MGD7ZYNQ440DJA71","atts_01GW2HT8YD9F3NKV26F5A207VQ","atts_01GW2HT8YE91AJCZT673NNKF89","atts_01GW2HT90HPREH9RS07GKK88HN","atts_01GW2HT90JZVZ7705Z1AGC3E9P","atts_01GW2HT90KXWQM4YV33F2M52N5","atts_01GW2HT90PRE61CKFRS2PWY86W","atts_01GW2HT90T5WCMPNQS7R5QYAV8","atts_01GW2HT90WPS7ERCZ8ES5NFDTC","atts_01GW2HT90ZP9DXH29HR613AY1D","atts_01GW2HT913QS4NAZ5CNZXRA6XE","atts_01GW2HT916J8PFFKC8PKG02VTY","atts_01GW2HT919Q221AV8X0DB7V56M","atts_01GW2HT91C92MFSGC9W6EK8F92","atts_01GW2HT9CB0C9PR4Y81ZQK9CWG","atts_01GW2HT9CXP1FDQJKXXC30E1YD","atts_01GW2HT9CT2RA4E520EB7EXAJF","atts_01GW2HT96YKBKZG4H834H2MSVD","atts_01GW2HT92F9BFMJ8QET4GYXJ5R","atts_01GW2HT963ZTCZW7YAN55GEJY9","atts_01GW2HT9AYG1ENSED61N0EW7VQ","atts_01GW2HT91JA0EB219BCVXNJDDE","atts_01GW2HT99H9W0ZPFVAEVNB3C5B","atts_01GW2HT99RGVE1J6GMZWE3R9S8","atts_01GW2HT9A63PFD6CX2PZG9KERS","atts_01GW2HT93NGCVYCG8563D3KRBG","atts_01GW2HT93G6DCX7JRFTSW7PZBT","atts_01GW2HT93DB0KK68XEJ6PDWQTD","atts_01GW2HT9962WW60WQGJEBPS2X5","atts_01GW2HT98WX0J3R2N1E8C5F0XG","atts_01GW2HT95GQX1TSYZDKXKE6T59","atts_01GW2HT95GCH43CE0N4H6X3S60","atts_01GW2HT97CFJTN6NVAJ37G57SH","atts_01GW2HT97ZEDGF1B18SHF0W05T","atts_01GW2HT97W4S857K50VSCGWJXX","atts_01GW2HT97TM7WTNKSZM12SMF2Q","atts_01GW2HT981N4YMPFZ3V46E88H4","atts_01GW2HT981AS25A9K58XMWA96Z","atts_01GW2HT98K7XQZPQ9DCYZY69SX","atts_01GW2HT98MN12690NWBST86GAH","atts_01GW2HT98MEY9E11R5XTS1V4GZ","atts_01GW2HT9F01W2M7FBSKSXAQ9R4","atts_01GW2HT9F09GFRWM3JK2A43AWG","atts_01GW2HT9F94A2CZJA09MNFDGA1","atts_01GW2HT9F9NJXJYDCW6JZH6QPE","atts_01GW2HT9FB82602PRFFPWMABZ4","atts_01GW2HT9FJVN6X0NCHDMQRNH1J","atts_01GW2HT9F2A8ET62KSWFPDA6C9","atts_01GW2HT9NV3NXDHCRKVT9WW4T7","atts_01GW2HT9NP208ZYY3EWMKH0KF1","atts_01GW2HTA0BH3GDN7RNK7KBW6H4","atts_01GW2HTA0DHWGV3N0DTMABPFXN","atts_01GW2HTA09W4Y3DCRCNAF18N5B","atts_01GW2HTA0G0Y6YMDBPAE09XSK1","atts_01GW2HT9GD2MQW6SY9FKRW4D9Z","atts_01GW2HT9N6MHFMVPV8DDMSE2KH","atts_01GW2HTA1WC5Q6K5AANEWEEKCS","atts_01GW2HTA1WPZ7QXR1RB1XPTSA9","atts_01GW2HTA1SX185XNBFBRYX3A61","atts_01GW2HT9W4JY2SJ9BTR8WG6NRD","atts_01GW2HT9W4RKZ9P6K44XWKTXER","atts_01GW2HTA4PC2A6JFXQJAYD6SC4","atts_01GW2HTA4FFWHABCNF0AJ0QC0X","atts_01GW2HTA4H71412RD43YA4524F","atts_01GW2HTA4JT0KZW5G0K7VHYJDS","atts_01GW2HTA49X089XNE8BMY356M3","atts_01GW2HTA4B9SJTWD3QAXKG6SHW","atts_01GW2HTA44NJ7NXKTNA0K67B2M","atts_01GW2HTA3DJYPN732YVJYTD0F7","atts_01GW2HT9ZHVA4XS6CJCP4V1TT9","atts_01GW2HT9ZH9HA8F6H9830PENZB","atts_01GW2HT9WMYV1SQ88KWDH26QFW","atts_01GW2HT9DB0D6WZXGE74KNCXJA","atts_01GW2HT9DCKETDJN8DQ4PRA3N5","atts_01GW2HT9DF1D80NZSTZ3PHGB0A","atts_01GW2HT9DGHT8V344KPNHZTJDN","atts_01GW2HT9DD9KPA3ZR0CJBFNC6J","atts_01GW2HT9JE22HWVE8183Y1719J","atts_01GW2HT9T77H94SJPBC957W1GA","atts_01GW2HT9K3P6VQHHRTQJCDRH55","atts_01GW2HT9K944ZW5RE9S0NKMWWS","atts_01GW2HT9K78E319XS7P7FHW5XW","atts_01GW2HT9K05PJFTQZYRDSJB1BH","atts_01GW2HT9JY471A0QXDAVBB1KXT","atts_01GW2HT9JWTY2VDZBPPRFAYRAB","atts_01GW2HT9VGCWDBF1P16PF3FRJ0","atts_01GW2HT9VNQA46SEB813N7QC2B","atts_01GW2HT9VQ6S7E33QPD15XV4AH","atts_01GW2HT9M7QY1MF3WNVHFRPN8B","atts_01GW2HTA030A6GQKYDG3XG483D","atts_01GW2HT9GWEW3RZMDJZ02SWJ3N","atts_01GW2HT9ME69JGNC3EZCVGT5RF","atts_01GW2HT9MQJ15VH453ZSEV7PMP","atts_01GW2HT9MQWJ46D0T0M6M4926P","atts_01GW2HT9YF58DD5VCYFZC0J4W7","atts_01GW2HT9KEXBZW84KXSA7ZV3E9","atts_01GW2HTA30AC8QNH27312978YG","atts_01GW2HTA7K8WC1DFN7EDGBZFMM","atts_01GW2HT9QECR9X9KBY58KTHZ7E","atts_01GW2HT9YTWQ3X0M82XMQCPMKG","atts_01GW2HT9QQ3W5H4GH4GEVW9PA3","atts_01GW2HT9QV8PSCX1CTHXDW935J","atts_01GW2HT9RZ87V1F5FJ4EW0041T","atts_01GW2HT9S42AF5MGBVHG98RRCH","atts_01GW2HTAP4TKRM8MRQ4EH4HPS8","atts_01GW2HTANRBCFSSZQ71DDAZE5S","atts_01GW2HTANVTEEGDQ13Y0R8ZKEX","atts_01GW2HTAP4QRZFVTW85T4XDCVC","atts_01GW2HTANWWZZ3V1AKPSYY8ST3","atts_01GW2HTANSYGKQXVHHDB121MP3","atts_01GW2HTAP1CW64DS37R4NDRA2H","atts_01GW2HTASPXPKD0JGA1Y5E1X51","atts_01GW2HTAQ0T2N3EHT99R86BVVR","atts_01GW2HTAPXEA3KRZS028FFW8C8","atts_01GW2HTARDDVBQH3P4E9W5SF41","atts_01GW2HTARDVH1RKW1V8VJ9TA1B","atts_01GW2HTAR51Y37KXF4W8ZP2HEE","atts_01GW2HTAR28KMJD2145MVZZZD8","atts_01GW2HTAR92NJHTETRA2PBQBAE","atts_01GW2HTAX8JNZZPMVQA5TX5XJ5","atts_01GW2HTAS7BK49V05ENQZTS1TJ","atts_01GW2HTAS77D7C83CG18Q11D35","atts_01GW2HTABQ6EVCJEH3KSM97BEQ","atts_01GW2HTABQEHT1BHP323CW7D7C","atts_01GW2HTAC8HGJ5C53PV3Q0RP03","atts_01GW2HTAD1PSB8CCZ8M2S5CXQC","atts_01GW2HTARJKKNN4Y83BFEDZJVB","atts_01GW2HTAK8V7WB5GR42HVCHM6Q","atts_01GW2HTAK9CJRJPR7NWPY4DDEW","atts_01GW2HTAKDT0PFYYR1YYSC1WXX","atts_01GW2HTAKFAA846FBPCTMEDJ39","atts_01GW2HTAJHMA8C2HRRGEMX49S8","atts_01GW2HTAJBJ811NHBJGKSW0S9E","atts_01GW2HTAJBZRTEXVRH4BS407V2","atts_01GW2HTAJE2QN0A19ZHS52516M","atts_01GW2HTAJT2DKGAMMDH0RMGZFS","atts_01GW2HTAJEDWJZ3EJA73JY18XV","atts_01GW2HTAARYS4VBCGH6VR9T2RW","atts_01GW2HTAVKJG1FJJTQNKJNCAZV","atts_01GW2HTAVK3ZYQB71GYP88Y2PQ","atts_01GW2HTAVMNFETYXA37K353RAP","atts_01GW2HTAVFYS6F3DGV61NGFZ75","atts_01GW2HTAFEGQ1M3KZYESKFGF6C","atts_01GW2HTAN19DT91WTF5Z1927AM","atts_01GW2HTAN1EFHK6ZR0AWBA90WC","atts_01GW2HTAN2MNBJJ7S259Z2S3Q0","atts_01GW2HTAN2F82D6R3HB0BTVKMT","atts_01GW2HTAMZNT79C741A1DDXJ29","atts_01GW2HTAN0N9AMS9NDCZA0WFAS","atts_01GW2HTAN6N640ZQ83QNBVVGNK","atts_01GW2HTAQ9SPKMKZXA02ZKST3B","atts_01GW2HTAQ7SEA5H4HBPTSNMAS1","atts_01GW2HTAQ7B2GEGTRSFN9DCBCA","atts_01GW2HTAQ7RCW2X1ES7HHPCM0Z","atts_01GW2HTAQB6YXXZHT5BQM7XVW4","atts_01GW2HTAQCFC5E1FHY7517SG3N","atts_01GW2HTAQDVTRA5F74MB5KQNAP","atts_01GW2HTA9MD2ZEJZHKX7ZAWCJ8","atts_01GW2HTAVTDC4VPRANT9WVW5CF","atts_01GW2HTAD61BRXCAXYR2VFT23P","atts_01GW2HTADAH51Z0QVGDF351FD9","atts_01GW2HTADAKKQQG4CWVK3MNJBB","atts_01GW2HTAD8C5ZSA7E9XB8FNND6","atts_01GW2HTAW5KHJW18MMQABF5AGF","atts_01GW2HTAW5YR80DJDY42JTED7R","atts_01GW2HTAYWXWEN9F8HMJA8TDNX","atts_01GW2HTAA46GD6YN53GNTC6YFH","atts_01GW2HTAAAVJGPTEW8GNTDCR9V","atts_01GW2HTAT7N4VX67S6SKDHE69Z","atts_01GW2HTAT80F6HG9QDBTWR1HGQ","atts_01GW2HTAT4E3R8R0Y8SZ06S2WA","atts_01GW2HTAZ9X5W3MTB0MXRXD2P8","atts_01GW2HTAZAG1DNJGF2H6MYQPS4","atts_01GW2HTAZG02EG1RHM933PR5P4","atts_01GW2HTAZG0NQAP58WBG66T878","atts_01GW2HTAZ8CNCBDXYN4RGRQV6E","atts_01GW2HTAZ8X6RXFDMZZEJ1GX95","atts_01GW2HTAZHGM74HEFH4GSVS86W","atts_01GW2HTAZJA4Z4Q2KN8TAK4RTE","atts_01GW2HTAZ52VZ2E85RB1MRQ564","atts_01GW2HTAZ5XZ3BM3WW1FEP5W9D","atts_01GW2HTAZ7ZBDXWD76N1YJJAQ7","atts_01GW2HTAZ7KRAEQSKANVVWNCWB","atts_01GW2HTARVCW5660TJPNDP823C","atts_01GW2HTADMDP6B70GR784SM7KQ","atts_01GW2HTADMKHKXTKFG7A01M4QD","atts_01GW2HTADNFVQX3XWYP43FXZ9J","atts_01GW2HTADXPXE85H278WSM050H","atts_01GW2HTAKPQ54ZHFHSGF8KJM2T","atts_01GW2HTAKY4MF7PV1VEMZ699JY","atts_01GW2HTAM0SYZKW0Z0705B4QDR","atts_01GW2HTAKREC7DEZQWXZ75707Z","atts_01GW2HTATGST8J5A7V380V24MK","atts_01GW2HTATMAW42J7ZPWAV4RH52","atts_01GW2HTAV0MMQBTMGMJC80EXV4","atts_01GW2HTAME47ER5B9B6D735CQ0","atts_01GW2HTAME4TCEBM1CWBYTJQP9","atts_01GW2HTAMCY23R8JSHT5CTGJ6C","atts_01GW2HTAM9FH5KKVRE1YTTEA4T","atts_01GW2HTAM9HCK41MGM4GY9YJV3","atts_01GW2HTAM94KFV0V64YQGBDDHX","atts_01GW2HTAQQEZX8H1ZSMKN9BB73","atts_01GW2HTB7PRGT4FN4R7K9WZSBS","atts_01GW2HTB7QHXC0YWJ7DFFC7P4P","atts_01GW2HTBV0TVG9KQA59MVX8FXE","atts_01GW2HTB610NP65P3E9ZKSEHFG","atts_01GW2HTB62RPA93MEDVF4T1VGK","atts_01GW2HTB5Y1RMADRMPXT51R0NZ","atts_01GW2HTB5VP2FA084WMKQ5AJ1W","atts_01GW2HTB65QPZBFAHPXWCZ72W2","atts_01GW2HTB66T2SFW35CQXQ9SYH1","atts_01GW2HTBRKC9KP6PCX4HG87CWK","atts_01GW2HTBDH5J18Y5ET40DBZ43Y","atts_01GW2HTB2STKVB92FM9GDSK1HX","atts_01GW2HTB9A1RP4MHJZ4Y8SNF40","atts_01GW2HTB98P9J650V0FDNYPCPK","atts_01GW2HTBGGGHF8YVSY813C1961","atts_01GW2HTBE9DV3PX8GXQ1FBN3XC","atts_01GW2HTBE6DA9N5SW0E1D8DEZH","atts_01GW2HTBDZ6YHZ02W5QK2NAQ2M","atts_01GW2HTB8BD34TC9DBGR5WHJ44","atts_01GW2HTB8FKC5HDNGW0G7RHNT2","atts_01GW2HTB9W8BXZB8967V0ZYH3K","atts_01GW2HTB9YJM767JKMSPWB9P04","atts_01GW2HTBVF3ZJSHTPSJS5VYQ3E","atts_01GW2HTBP8Y1HWSG3VK413G112","atts_01GW2HTBVKP9B2BG9GCSE9391N","atts_01GW2HTBEMEPRJ9M8Q59AV0MWB","atts_01GW2HTB2JRH7BKV839KBHMK9G","atts_01GW2HTB2J7Z7A4YVAZ101GZA4","atts_01GW2HTB2CXY7NKW5XG0FP2WCV","atts_01GW2HTB2GM5C8EQJX2NQGQNRG","atts_01GW2HTB2GV35ZWQ5BF01RGFKR","atts_01GW2HTB2HGAK194TKA5564RZQ","atts_01GW2HTB2FGEC7P9NGA6N5DERF","atts_01GW2HTB2K006YNV6DW50NSBT8","atts_01GW2HTBRZTPQR8EEN28WK34PF","atts_01GW2HTBRV7D0JW85S0WHC351C","atts_01GW2HTBRXT7V3B4T7P3Y6S11B","atts_01GW2HTBRXHPF077Q5BDM5A69F","atts_01GW2HTBS7CWG1M2HR32TYM022","atts_01GW2HTBS7HKDF3ZTGM37J3KS6","atts_01GW2HTBVVZ6RNBYKCBJDMHM3M","atts_01GW2HTB6KX1JWW5XWA81V4CX1","atts_01GW2HTB6MA1J1M2SJ2SM3TYTD","atts_01GW2HTB6GAED58524A9W45Y6T","atts_01GW2HTBBAVE4VW3FRMVB2GE96","atts_01GW2HTBBMT31S62ZCM1SSXFJX","atts_01GW2HTBC22Q7QECS8JSD8254Y","atts_01GW2HTBBT4VV4N7A8MFJCSP1S","atts_01GW2HTBBTYJYAWH8V9THW6S7E","atts_01GW2HTBBJETNGKY2R99VER4CX","atts_01GW2HTB0DM3VPRJ86CGWNH6P7","atts_01GW2HTB10W4WFSQ308TJK82JQ","atts_01GW2HTBV72PE6PWNM280ENKKJ","atts_01GW2HTBV7SW4CRBYEN3P8547H","atts_01GW2HTBVB6A63K7JKDVWCR05A","atts_01GW2HTBJFAEAHMERHQ0ZRB3KP","atts_01GW2HTB79AHJQ8KMAT9NH1HEF","atts_01GW2HTC2KVMQ9VFWMVJGNKTD6","atts_01GW2HTC2R9R5DGNT7CAZ2XJV8","atts_01GW2HTC3A8DBJ4ST5DS9YH59S","atts_01GW2HTC3BMXMETKJH5RFX574Z","atts_01GW2HTC2YYKRRG680V7FA57PE","atts_01GW2HTC3EQMAJF7DV6XM2G9Z2","atts_01GW2HTC2SJQ59JYWTPZ4JG3CN","atts_01GW2HTC2T2Y9YPJ8F7CH0WZ7K","atts_01GW2HTC3E4HD5BHYR9WV15TKN","atts_01GW2HTC2BGDX4PRPHSD5PMXJ2","atts_01GW2HTC2BXXWJT1VAJV3NE60Q","atts_01GW2HTC3735GC2DFFA6GVBZWX","atts_01GW2HTC3799CN8S3WCCGTWYT5","atts_01GW2HTC33F8RWW4C8WHM6D891","atts_01GW2HTCBNJH2SR9ZBMMQN0HD5","atts_01GW2HTBYMMVETEDZMR0K9TSQQ","atts_01GW2HTBYXH8HGWH173X0ST233","atts_01GW2HTBYQQV9GVCHHFF1EJEKH","atts_01GW2HTBYT0MZPPAMQG8TCA2V0","atts_01GW2HTBYZ6KG9CWMY0WT3YDCG","atts_01GW2HTC5WVX8AZ16DWVWBW5HQ","atts_01GW2HTC616ZYTQXQ713R5CJJ7","atts_01GW2HTC50K8B7DME1K4C60APE","atts_01GW2HTCDDPY81030C8DSXGYQV","atts_01GW2HTCDDGXZ2G5DXTYPDG29P","atts_01GW2HTCE5QJCTHG56N1VTP2XS","atts_01GW2HTCE5D4KNB9377559XGVT","atts_01GW2HTCE64J13HQJ998AR7HGX","atts_01GW2HTCE7W5CN6YJ8T9J3MS5E","atts_01GW2HTCE7FB9CXMJZV3A368XB","atts_01GW2HTCM28J46ZKNFBSHHT9W9","atts_01GW2HTCM3V5JAHHP884T145CT","atts_01GW2HTCM4S1SQ9D8VCW9411XP","atts_01GW2HTCM4QK70R14Q1H71BFXA","atts_01GW2HTCM1T9K2XP5WQYK0FTP3","atts_01GW2HTCHS69EESMAAPEVRQW27","atts_01GW2HTD89PEDC01RA62NERPBD","atts_01GW2HTD8AG77ZK7F1CGPZVNC1","atts_01GW2HTD88FQVZ0WZ9K1Z6CH22","atts_01GW2HTD882956JNM456BDYT4B","atts_01GW2HTD884T44RBN2N3V6CSCM","atts_01GW2HTD8HZTZFD9QJJANRTNNH","atts_01GW2HTDFBQQRQ37HYDX4JS2DB","atts_01GW2HTDFD3V90J7PH7QNF6EJ5","atts_01GW2HTDFEGX3MTXCZ3YHGC181","atts_01GW2HTDMTNRCEJZ3TZJAVZ8KC","atts_01GW2HTD7WGQF7RHBBD9NM67AT","atts_01GW2HTDA4QX5CWJ4APH73GS5Z","atts_01GW2HTCZYT2X8QPVGVKWXTTPM","atts_01GW2HTD054R5P9RT043DXBPQC","atts_01GW2HTD02REG7X4Z0VG4A4CA3","atts_01GW2HTCZC9D6MBM951RTWP5YC","atts_01GW2HTCZCC8W4RGRV32FWK268","atts_01GW2HTCZPKXR2FM2ZHR2BVQF3","atts_01GW2HTD090MJH69JN67CQPVDH","atts_01GW2HTCZJ1RDC1TB3QYAT5DQ6","atts_01GW2HTDBWGZ9DXPRZSGDZG8H9","atts_01GW2HTDEX4T6GRYQJW3RAX2QF","atts_01GW2HTDEXSZQ7CFAF19W7NM2G","atts_01GW2HTDHRRGW1V8649MAF5F3B","atts_01GW2HTDCG5F831DQCWRVRY7EK","atts_01GW2HTDCMM0ZCT3R5QP9BZEZT","atts_01GW2HTCV4Y51DZC092549JH77","atts_01GW2HTCV40NYX4XKNFSJJW9NA","atts_01GW2HTDAJAFBG7345B0WPTE18","atts_01GW2HTCWG9A3YPNJ0ATH6HZH2","atts_01GW2HTCWMSZNKTDXPABAVRRSY","atts_01GW2HTDP5Q9GM8EXHEXFPC0PX","atts_01GW2HTDQA64WQZ5MS53RGZ7MJ","atts_01GW2HTDQBAAV92K8YRVGNR1ZT","atts_01GW2HTDQ7TC83J20EG7TWM7SZ","atts_01GW2HTDQDYQ8SQ2XSC52STRQP","atts_01GW2HTDPVBWTVYB40J2Y1TYPP","atts_01GW2HTD2TSWKCH69WPCYP30S6","atts_01GW2HTD6A4FWNCPM2YN06GZED","atts_01GW2HTDQPW23BGMMHNB9434HB","atts_01GW2HTDQKP7XZ4J06JXZHKN79","atts_01GW2HTCX19A9CQ3D0Y7TAFADR","atts_01GW2HTCX6RVMTR1YDEVB3J9PY","atts_01GW2HTCX49D3TKYJH25VFM4E8","atts_01GW2HTCXDQ7XG6YAG0HT5RBMP","atts_01GW2HTD4G09W1BP9K0FNCN352","atts_01GW2HTDGMKEJ9RFZTY38A4V9N","atts_01GW2HTDQZFF1XXZQ9Y7NT0Q8H","atts_01GW2HTD75AXFNESE117XWA6E3","atts_01GW2HTD73J0KXWQN5CKDW4CZK","atts_01GW2HTD76S6QJ90EJ707BF127","atts_01GW2HTD73DXC8CEYC8RQPJ7WV","atts_01GW2HTD77Z61JHA4WVBKST6FA","atts_01GW2HTD75V57YGREYYAR61ZS9","atts_01GW2HTD6XXXRXJ6TSR5DZY9VY","atts_01GW2HTD6XA1HN22B9PC96Y0EN","atts_01GW2HTD6V6S9G5DMN1VMAH1X5","atts_01GW2HTCYH68RGVRJT0DBW2RP8","atts_01GW2HTCYEJ4BPZF7ETVR898AC","atts_01GW2HTCYCANESPFF60K0DJW14","atts_01GW2HTCYP44FPVKDHPWNVV95K","atts_01GW2HTENMQZR5M093684ZK3Y9","atts_01GW2HTEHE520WAXB4JA6QJ39M","atts_01GW2HTEHER3RY07V2JADTVN43","atts_01GW2HTES52B5Z6M524Q7360XT","atts_01GW2HTEXPD38TBYHS9FYD09BV","atts_01GW2HTEY21RGQQ6SE24FGWJWJ","atts_01GW2HTEXW8WVB4JQW6TSVET2H","atts_01GW2HTEXXY0TGKKM7C80XTXVG","atts_01GW2HTEXRZE9V0E49DGMCJP8S","atts_01GW2HTEXYEQSG1C9BQ63EG8DC","atts_01GW2HTEXYN9Z4QRVBXKEHZ5ZZ","atts_01GW2HTEXZTG2M9PMWREHM1SSX","atts_01GW2HTERQ0BFRJ463T7TR3Q21","atts_01GW2HTERR12KBP7X9V4FT9X0J","atts_01GW2HTERDRMT3B7GEREH2QHEZ","atts_01GW2HTERV875JBRARFX8PN78Z","atts_01GW2HTESFRKCR23ABD0GJCXX4","atts_01GW2HTDSZ2WXXVWJW65Q3NQEA","atts_01GW2HTDSZXCV146JGR278KMC8","atts_01GW2HTDSMFJ1G7X8X4WZG2QY3","atts_01GW2HTENYEHX7XS13T9102G6K","atts_01GW2HTDRE9FB74B24XWF2M102","atts_01GW2HTDS1N9WT0TV145SBHTCG","atts_01GW2HTEQRJ0KB4D0GN2QHCVPZ","atts_01GW2HTEQP8JP9H7SCGYJQ0K50","atts_01GW2HTEQWJ1HG8CRBE9F6BQ1T","atts_01GW2HTEV7FPYK80JC3GABZA22","atts_01GW2HTEHRNE0C4MNW55HEQBAY","atts_01GW2HTEHR47YJDPFEDH815WAE","atts_01GW2HTEJ9ACT11HRQZ9DH56AX","atts_01GW2HTEJ1V3KA4TQ4DR4YB4QM","atts_01GW2HTEJ66M5EHHF1CG10YG14","atts_01GW2HTEHX680VYWSVXTN0EMFQ","atts_01GW2HTEYQR25GZSVM10QFMV7N","atts_01GW2HTEYYHY03YCW2MY1CKBWV","atts_01GW2HTEZ18KMFTPBQ9186NY3E","atts_01GW2HTEYVJ4P3W97JS8AKWCAG","atts_01GW2HTEZ6M2FM7JG0955QH53M","atts_01GW2HTDZQCZ1TZ9F034QY4ZRE","atts_01GW2HTDZQCHSX87B0RAAZ83G9","atts_01GW2HTEJP9H4XE4K099TYE367","atts_01GW2HTE7BJSAHV6XYXMF06H0B","atts_01GW2HTE0RVFFSAJVG12Q042EV","atts_01GW2HTE5A676AW62DQB2DNX7X","atts_01GW2HTEWH8ER7E1JFRVB6C31S","atts_01GW2HTEWRQBPVGHQ2VFPP0XRV","atts_01GW2HTEWNAYGFS3X4G9ZQ6X01","atts_01GW2HTEWVSCRM33KEJZDRMMDJ","atts_01GW2HTEWHND4DH5MDZ02VWXMV","atts_01GW2HTE5R4A2FTF3QGP9KR4ZV","atts_01GW2HTE5P5PA2T78YEYY8A22E","atts_01GW2HTDTZBHKTPS754VV31VJ0","atts_01GW2HTEDNHV24P9723K910P5B","atts_01GW2HTE7RYEKS9TQH4QN4PBZ5","atts_01GW2HTE1JKX9YJS1PKPCHYJQT","atts_01GW2HTE1JJV8753KGX49E8W1A","atts_01GW2HTE8WV5WYE45FFYKVRHCW","atts_01GW2HTDY47Y5DH2K8M0KRZSE0","atts_01GW2HTE2J7STCGAH87WGZQ324","atts_01GW2HTE2A06ZXDZWHAP6YHP02","atts_01GW2HTE2SR1ESQVDN77CB87XH","atts_01GW2HTE275HZHE772GWEV6ZFJ","atts_01GW2HTE2N2K7AV217QFS2TZ0M","atts_01GW2HTE2JG95VV5SHTSE4C6FZ","atts_01GW2HTE2F6BQY0XE97STV5QCM","atts_01GW2HTE37RY4KP0TZDPCPREDS","atts_01GW2HTE34RZH3V57QTSP2WZBT","atts_01GW2HTE3AKEPVFB3PC9NGMVJ2","atts_01GW2HTE3STABJM35PCGQTMMWE","atts_01GW2HTE3NYP9867MDN5M4B342","atts_01GW2HTE3WRKS6X15PK32H6W6G","atts_01GW2HTE3Q4ZGASD7BD8DDDDV4","atts_01GW2HTDWNYPA40QQQXRZKRWQ1","atts_01GW2HTET9HSM7RR992C7AH4CV","atts_01GW2HTETV7S0WDJBWDR1TYZR6","atts_01GW2HTETW767ZG4MJVWAA1N2R","atts_01GW2HTETRPQKA8DQQX9JYYTWB","atts_01GW2HTETTSSGWNQJ4VQH7XZ91","atts_01GW2HTEB8ZX3ER80FWPHSC07H","atts_01GW2HTF638QMTNP71EMKFJDC3","atts_01GW2HTF218EZ8JMCA7DWRQCF9","atts_01GW2HTF8F99N0JJ56Q6ZC9J2W","atts_01GW2HTF8FPPA4PW0W0P9NP59V","atts_01GW2HTF8FWVD3KVVHH4CFVQ4T","atts_01GW2HTF97M6VCQZV28A75TF9K","atts_01GW2HTF9CN1RZ8TG3RW9NS946","atts_01GW2HTF8ZHR5Q4ECX57S6B466","atts_01GW2HTF91X8BJCPA9DY6FKCMH","atts_01GW2HTF9JVHRH7F3DR6H1JGNZ","atts_01GW2HTF9A8FMJDDNHQ7ABVN67","atts_01GW2HTFA95EEPS905BXFKQ2W3","atts_01GW2HTF560VW1FB639C7VHEJK","atts_01GW2HTF56BA2AADAJ5Q2TCC0M","atts_01GW2HTF53A8CMQEX9MM79AJTE","atts_01GW2HTF5J0DHEQQ0J89TT9GVV","atts_01GW2HTF5NVKF6M64GREGSCG5K","atts_01GW2HTF5GQMTV1JS6AAV4VZG8","atts_01GW2HTF5BB3VMZ0FEVK5FY06B","atts_01GW2HTF5D9ER1DYNJTN6EW0ZQ","atts_01GW2HTF5DGFT0P4EF93K8PWMV","atts_01GW2HTF5N762ZFA56Q2C61X1P","atts_01GW2HTF5GNCXASMDJ3R5GVRJY","atts_01GW2HTF5BHCMXTTCNCB9FRASM","atts_01GW2HTF5JWVA0P360M6P43FZ8","atts_01GW2HTF50FNHVC5XR17PFXDE1","atts_01GW2HTF50T26MQ474W9VVQNRP","atts_01GW2HTF2Y6HPWGFHQ2W8PTHRA","atts_01GW2HTF317B1DDVFZ6BCX9CHG","atts_01GW2HTF2P2MZRPJQ1EQ4N5XBP","atts_01GW2HTF2QCDFNV4HN5ATV4PSH","atts_01GW2HTF4E62QMWV94MGCCJWKF","atts_01GW2HTEHE57S0QNZV6DGTKB2R","atts_01GW2HTECBXRCH36P9VKYHC2G6","atts_01GW2HTFH4HQ2MCTSCYM9EEFJY","atts_01GW2HTH52JPC1XVZ07FEZYMK9","atts_01GW2HTH5AQEA4E97TMC6EG30Q","atts_01GW2HTH557D75ZKPWDD8KFK4M","atts_01GW2HTH4YY0N9F9QCMV86GDS6","atts_01GW2HTH23XW81FH2VB8X9KNE4","atts_01GW2HTFJFZAQWFRMYDNR4S05H","atts_01GW2HTFJJ6G79JYEX7X0PV7WE","atts_01GW2HTFJJPZJQ7HC2P0D897KG","atts_01GW2HTFJ6MZ9481XZAZS9ZM1T","atts_01GW2HTFJ7PVJ5S7KMXDWFY9M9","atts_01GW2HTFJ8QH8FA5WN6X7A73XC","atts_01GW2HTFJ8WN9F59G6VYDQMP06","atts_01GW2HTFJAVPFV13GY0AXWBSQ9","atts_01GW2HTGZWQ80A305XPBETGB0Y","atts_01GW2HTGZVXQWVBMQZB6KGB23Y","atts_01GW2HTH5YAZSX15RG50T7WFM1","atts_01GW2HTH5RA6HX69XKXCDK2V33","atts_01GW2HTH609R2GSFW4DA7Z95DJ","atts_01GW2HTH5X39GN96ME9D3SDV4Z","atts_01GW2HTH5QZKVX6RVV0AQ09B1X","atts_01GW2HTH5W1ZJ97MQPVB5RGSA0","atts_01GW2HTFP7V87TAE4MFJ1P7D41","atts_01GW2HTFP9F3ATTRHRFT7V8K5W","atts_01GW2HTFP589CP4HJB3GXT9PAE","atts_01GW2HTFP7SJVTHSMKY2T1Y56D","atts_01GW2HTFPA1ZYC8FGPT321VAVK","atts_01GW2HTFDAPKCJQQ1HA5K7H6H0","atts_01GW2HTFDH8PERCDVKJK9FT1JE","atts_01GW2HTFDED3RD8Z3A6Q4HJXRN","atts_01GW2HTFDCV4CFD99540Z26XY3","atts_01GW2HTH6PK7RWNXFDY7SBA241","atts_01GW2HTH6P90QGETX3NCWE9YCC","atts_01GW2HTH9J2X39G009101K1FVW","atts_01GW2HTH9XX9958YXBHBEMG41H","atts_01GW2HTFG5MCCG1G0MHY0RX6ST","atts_01GW2HTH0FW5WZ9KYYX1EW56MZ","atts_01GW2HTFM5ETRQ4V2YXR7KEYBD","atts_01GW2HTH7T80DJ691WM42V7WB5","atts_01GW2HTFC90N1J0PSK171AC5VD","atts_01GW2HTFDP6TZFZVNS8T14T1S8","atts_01GW2HTH0RAN50Z0B9TNEPCT8R","atts_01GW2HTH0TA5N1DEPX06G5DMMD","atts_01GW2HTBE7QT1DMTGKZ7YT6443","atts_01GW2HTFCD7F3P9K4X9EKDR3FG","atts_01GW2HTFQCV2MZN3J181ES6ZAB","atts_01GW2HTFHS6BTFW05EQ47542JC","atts_01GW2HTFHRNX2YG6DRKG7QS8J7","atts_01GW2HTFHVZQ94REX6CPMEZTMD","atts_01GW2HTFHR0RZFDFFZZY34WERP","atts_01GW2HTFHWFMX2RW422G8BAJNK","atts_01GW2HTFHTMZR2YZC2D9ADKVMY","atts_01GW2HTB6JA8NQGPFQYJH9E0GD","atts_01GW2HTFGT4K2E9SWJF2SSZENX","atts_01GW2HTFGRNMMTZKGY0MVEY6H2","atts_01GW2HT8H2NB6M6SYY9P5KDRH4","atts_01GW2HTAFQ2HNKBR04516ZT25X","atts_01GW2HTDAKCNCJA8WJMH5AKGX5","atts_01GW2HTAYTZZSGJA297718GANG","atts_01GW2HTAVXHN6KY2R8RWFC3TKY","atts_01GW2HTAGVQ6MSTEBQN1CBH0ZH","atts_01GW2HTAQECA1CCZTZXWH2QRT8","atts_01GW2HTJ3Q5CCB0XMDSVCB4K7P","atts_01GW2HTDA4WWWD2FF64FEV77ER","atts_01GW2HTBC5MTWPE73G6CHY11CS","atts_01GW2HTAMVZQVHFHPS5VR9HB1G","atts_01GW2HTJJ48HR7TN4CGZRVQ8NG","atts_01GW2HTJJ0DGK21JFHFBCXJVGA","atts_01GW2HTJHYNK52KTFH7JQBPHYP","atts_01GW2HTJHVC47VCKNZXF37TS6E","atts_01GW2HTJHS7350FYBYVZ9B74MN","atts_01GW2HTJJ20HYPSXYJ6BE063S9","atts_01GW2HTJHWS3E45ESWKMB3RBER","atts_01GW2HTJJ5BMKPHZV3Y74X1X11","atts_01GW2HTJHYZXRSHPSR399MZEKZ","atts_01GW2HTJJ1736YJQAW08J0VRB9","atts_01GW2HTJHTEHRTZV5AX3QBB3TC","atts_01GW2HTJJ3EY04FTCCHH1T692N","atts_01GW2HTJ6THJBG4TWMQ40A9DH4","atts_01GW2HTHS16G4J8NW84JT5748G","atts_01GW2HTHRVVD60AFQ6N5N1GE9Y","atts_01GW2HTJM394C4079ZT52ZEQMD","atts_01GW2HTJM2HT0ADHMWNFMNXKGC","atts_01GW2HTDNH2YKX07VMWWEB7SZG","atts_01GW2HTDND4EZ8YQSBSV8XBGBK","atts_01GW2HTHK2R4XK1EW1DQ6C97N2","atts_01GW2HTHK7B0D6CKAS4PNG60V4","atts_01GW2HT9T7TZEESTRE630BH6MT","atts_01GW2HTE0J1SH7RMXNXDAPFMQE","atts_01GW2HTCHTWF9C29BRK506BHX4","atts_01GW2HTK1MZRH6MFKXB90G6EG9","atts_01GW2HTJEQMKJJSM0HFHBSDW96","atts_01GW2HTJCGACW4YESKYGXEEHB0","atts_01GW2HTAEF9J0ESP34DD43WRCE","atts_01GW2HTJNKVHVP8570K186CCCA","atts_01GW2HTJ87CFQ7V4WPRR6X0P07","atts_01GW2HTJ2VY4G81FK6QE3HHDBP","atts_01GW2HTJ36M1H4HN50J6WVW7WZ","atts_01GW2HTJ31FA2CE18ACD5ANWBD","atts_01GW2HTJ2RGWJKW6S8M19CX7J6","atts_01GW2HTJ340VS7DHAW9QRQMEQX","atts_01GW2HTJ2VEGZ5SAJD7WR704ZP","atts_01GW2HTJ2Y6VQ3KG39Z1CZQZGT","atts_01GW2HTJ37ZH9RAWSMC91WJ6PR","atts_01GW2HTJNWK55XJ44ZCREED3TK","atts_01GW2HTJNZW8DN8HX96J3P6X2C","atts_01GW2HTJNYYZZJZ30W426Q0SNH","atts_01GW2HTJNXVG2V5S7M57FQC2DT","atts_01GW2HTJCZZ9RD8X3DK4NXMWZQ","atts_01GW2HTHTSY5KPRDHR8ERVTQ5T","atts_01GW2HTHV3B1G2157K2T9WZFA9","atts_01GW2HTAEJQ4D888EBGT8QJ2W8","atts_01GW2HTJ4Z6NC7W7GV53B5K9TY","atts_01GW2HTHVXMMJHADWYW4FHM86G","atts_01GW2HTHVY2316SPE4J8N71ZQT","atts_01GW2HTHVYTGGFEV959W8V8BTF","atts_01GW2HTHVYF2TVRZH9QVS1N1TS","atts_01GW2HTHVYEDPM1T7DHWRYWV83","atts_01GW2HTHVZPNFYX6H2KYYW1EEH","atts_01GW2HTHVFPAC7TT4VQ6QJMYVM","atts_01GW2HTHVFVVV2GW5H1DPPEPTK","atts_01GW2HTHVMP4DSG1NR3K0XDART","atts_01GW2HTD1YWZ70KGZDBR5R8T6K","atts_01GW2HTAM78WJVEGYS2VZD210R","atts_01GW2HTDMNKD9YBQ07VJWHHNKJ","atts_01GW2HTDN2VPBGRKAR2JDTR01M","atts_01GW2HTDMKBZATXP4BA2V4TFWN","atts_01GW2HTHW1JSEYQ919MEA1BJSJ","atts_01GW2HTHVTFC7DZ44GXZR1Z0PP","atts_01GW2HTAJMMP6VSDBGCBREXZH3","atts_01GW2HTK08FVTQJSWQJS4EPQPS","atts_01GW2HTK09ZY3HDS8TEBXVXDPS","atts_01GW2HTHX5AP5F5CJBKBKPC6RV","atts_01GW2HTHX44M3BW2R90HGB3199","atts_01GW2HTJFVP4C3BB0BF86T8FGJ","atts_01GW2HTJFVJY0VAMBC0Q1V4HDV","atts_01GW2HTJFVEG17HSF702ZFBWDN","atts_01GW2HTJFTKAJ4B9F5VF4X0XW5","atts_01GW2HTJP6F8Y8X3EG5SB14146","atts_01GW2HTJP62DC8G179QFN7Y68P","atts_01GW2HTJV7SMPKZ3TSPMX3YR8H","atts_01GW2HTJ0EV5TC9T4SPPKXZTTT","atts_01GW2HT8TTEHYJ953M8X2ZW8Q4","atts_01GW2HTJ0CWGD8Q61TJ31KYW87","atts_01GW2HT8T0DEJVB3T2DQY13865","atts_01GW2HTF81TSCCEA58HEJABEYS","atts_01GW2HTJWCQPAD8E52P8SDE1B3","atts_01GW2HTBJRCXXJ9VRWDV7DSN3S","atts_01GW2HTBFPY4YB21TAMSHSS305","atts_01GW2HTA85YS3KP80CER6HG6ZB","atts_01GW2HT8GNN7XDYWANEJ4SE1N9","atts_01GW2HT89B4F03F4A69XB7M98A","atts_01GW2HTK7XG2TXRQKB4CF47EES","atts_01GW2HTK815561H01014MADG29","atts_01GW2HTK80728CHTP6N3V9E3R5","atts_01GW2HTK7TK4VG8GKYSM4ZBVR0","atts_01GW2HTK7SNNBYCPY01G52RFHF","atts_01GW2HTKWTA5NR7B8NDH5M14W6","atts_01GW2HTKWPPR02MYA33JNYSFH3","atts_01GW2HTKWSXVADW7Q87XCME742","atts_01GW2HTKWQG4QYSBACTFT84W26","atts_01GW2HTKWR7ZK84RG6D1GKS356","atts_01GW2HTKDJTX1GS0NNFYE5TYVM","atts_01GW2HTKDSA022SZ3DCP26QGEW","atts_01GW2HTKDRE0SXKKPMBCQXFX21","atts_01GW2HTKDQD88XXB2ES90XE0GE","atts_01GW2HTKDPJG5P5Z53RY7NG8HF","atts_01GW2HTKDNRWKXT5DBJK982XVF","atts_01GW2HTKDK9R4F1P08TEQ2905R","atts_01GW2HTJT20T4BKJDK6C3GH3Q3","atts_01GW2HTJSYMTZGD9XEQ2KXKTJP","atts_01GW2HTK9WRRYZB60T63HBGN04","atts_01GW2HTKQRFH2D2JT6D2WZS8HR","atts_01GW2HTEK962YDNMMXHEKVMPF7","atts_01GW2HTEK3F00MHYPG7FS3E0W9","atts_01GW2HTEK0DJKZH3VBS1FJ8WWP","atts_01GW2HTM00RQYJM35XGJA1RYPC","atts_01GW2HTM6S56RAPGTR6GS66K75","atts_01GW2HTM6H6C57T9PKNGF3H0F6","atts_01GW2HTM6FV6WCX2BWSQ2MTKBY","atts_01GW2HTKBS2GNCVY5MTH1ZDPFS","atts_01GW2HTKBX1AAVWZ6YG4V213H4","atts_01GW2HTKC034954MH85SNXP4N2","atts_01GW2HTKCD42KBZEM20R3SW70N","atts_01GW2HTKBV8M41M5HH1D8B35EY","atts_01GW2HTKBSHQM77EKRCY8M7837","atts_01GW2HTKT5PQWNCCWJXQGX62G5","atts_01GW2HTKDBH2MNCYGQPCWVYP9R","atts_01GW2HTKXZWZ2SNVKRPVQF15TW","atts_01GW2HTKY76CKSM846QFVZPAZM","atts_01GW2HTKY5B1PTS2PK95S3NFQM","atts_01GW2HTM7WHDQAYVXAW3HD2GQ6","atts_01GW2HTKG34G7C8KTDE0PZD51F","atts_01GW2HTKBDK2HV8HRY3F8PPTET","atts_01GW2HTKBDZY1039XYF25WEQD6","atts_01GW2HTKBD2E7HAB3KDW85QCCZ","atts_01GW2HTKBBKT9GRVC5E8QVP080","atts_01GW2HTH2V33SXKHDCHTKZZ48S","atts_01GW2HTKJY7AHNZF0XZS9ZSTT2","atts_01GW2HTM4B3K9A4H5HFKX5CZA9","atts_01GW2HTM4C2ABZMQTH3A7F3NAH","atts_01GW2HTM4D6D07BX308C87WS04","atts_01GW2HTM4EVHX022CXA40DDZSP","atts_01GW2HTM4H5KZ42YN86SEK5WXK","atts_01GW2HTM4H3AECAQWXZQCJN95R","atts_01GW2HTM4FA1J58480FB84REBX","atts_01GW2HTM4GKPZJ9HTNW9T76TYP","atts_01GW2HTM4J3BZ9MPNH05RN68HW","atts_01GW2HTM4KF0QW30ENM8PGT8Y2","atts_01GW2HTK3VW3BQRWXDQQVSW27C","atts_01GW2HTK3RAY7F2RGBQBKHRYS6","atts_01GW2HTK740EPRASCVXSHMHV5P","atts_01GW2HTK6XHJNSAVRVKP6KEXPP","atts_01GW2HTKEP2GW6EJFCATHD4ZJ8","atts_01GW2HTKEMARY72XBFA5M1W4A2","atts_01GW2HTKEP3NVNCEC14FQ3GRPK","atts_01GW2HTKEM6DA65GQJTEWV9KE0","atts_01GW2HTME1X1B4E4EPSE52PPJG","atts_01GW2HTMBGF0EDCJMN0HTK3S08","atts_01GW2HTMFXJ4XS7HWCEW8CS09H","atts_01GW2HTMG0MR6PB24WYX3AKVJE","atts_01GW2HTMFWE4TPTV0Z8H1Y8DBY","atts_01GW2HTMG4JZC7QPMDMFYS518Y","atts_01GW2HTMG3EB43B9HS32H8MSRY","atts_01GW2HTMG171VEFZBWXPD3848W","atts_01GW2HTMFYGRD2JDRW7WY6GMC4","atts_01GW2HTM9MTRD43JGPHW98ZVPH","atts_01GW2HTM9KKP50ZZP6ZT6HBWZP","atts_01GW2HTM9N4YQ1Q0AQ2M59H776","atts_01GW2HTM9KN6KJ5HN71V7D6743","atts_01GW2HTMJ1W1S7B9NCKQTY6R2G","atts_01GW2HTMHZ5CKNTS3PZR9HHEAA","atts_01GW2HTMJ267JBXDN9MCTY23D5","atts_01GW2HTMHWRSGCPGFEX7PKC8RH","atts_01GW2HTMMSZ13GYHCW3EVM91EY","atts_01GW2HTMPH382Y4F19RC2A5210","atts_01GW2HTMPF9D7QD158QGNCECJ8","atts_01GW2HTMPB446G32DV1EM1JRX9","atts_01GW2HTMBXB1GVFCXM2XHXE8F0","atts_01GW2HTMBSEQXRBY4WXXRP02N3","atts_01GW2HTMC12EQD05ZM79KZACVM","atts_01GW2HTMBZK2JVZZ7C96G4MW2T","atts_01GW2HTMBVCS0SD9RC5B72G9GY","atts_01GW2HTB29D3CMPE9A6NRYM3C0","atts_01GW2HTMQ9WCH2X7RE3A3G0MR7","atts_01GW2HTMQ7J35Q3ZBT2RDKK530","atts_01GW2HTMQCMMWTY5XWSETJ7DDJ","atts_01GW2HTCPHN858ZJA2P85YGA2A","atts_01GW2HTCPHAC5MRWY9EPC6JMCA","atts_01GW2HTMXD8R27VRG0NTDX87H1","atts_01GW2HTMXE4HDXGSPKQPY2W2NC","atts_01GW2HTMXB6KFPPCJTXRPHPCZG","atts_01GW2HTMX9WRCGCB5Z08GJDMGH","atts_01GW2HTMX657VAXD94JAHMD8VZ","atts_01GW2HTMY5Q939EVEA7VH9533B","atts_01GW2HTN1T2X80YX0Z4827KH0R","atts_01GW2HTN1R7AZKC71SF37FBABS","atts_01GW2HTN315Y9ZKHK7X1KKH6XK","atts_01GW2HTN331M1RY1YSW22354VP","atts_01GW2HTN31YE1CH9Y5JG8T32XS","atts_01GW2HTN4EM5BX3JST9P7XBDYR","atts_01GW2HTN4CT8WYTRFYQ1XSV782","atts_01GW2HTN23BTP5H3FGXXE1M9WN","atts_01GW2HTN6Q0YB5A79G00GEZDKN","atts_01GW2HTN6N3DQ7YQDE4HZ77M24","atts_01GW2HTNCEXC6Y07VGD5NPBWRZ","atts_01GW2HTNCDRGK08VDZ3CEKW6NP","atts_01GW2HTNCDM90D0CVZ15HGT2VV","atts_01GW2HTNDPQFM3FH2N6D32WFHT","atts_01GW2HTNE5218G8W1P5DVS58MM","atts_01GW2HTAS5YNB3YEN1BVAVWZJG","atts_01GW2HT8AN9BAQRE3TWEZ84TM2","atts_01GW2HTNKC0HEEQHCC4MRP04QH","atts_01GW2HTNKDGDS2AFYFF09FCDEM","atts_01GW2HTNM2GAAS03C35A9MXG50","atts_01GW2HTNMAW79QTE7DYR7FT4AV","atts_01GW2HTMW7M9BN7T58V6RP7QYT","atts_01GW2HTNNZJY003RJDYD0X02C2","atts_01GW2HTNP3PQN6Z03400CTJ7Z7","atts_01GW2HTNP70KBXKEPP4W92GW0Q","atts_01GW2HTNPGCEPS4BF54N556YYE","atts_01GW2HTNQS812QBFAVYSFFAFPQ","atts_01GW2HTNQP5EDXBXECY8744FNR","atts_01GW2HTNQHWW6KX4XP7TMNP95A","atts_01GW2HTNQQNNZ0KP29QTNENF4R","atts_01GW2HTNQQ3G614T69JTDSXJZ3","atts_01GW2HT8Z83GFC5812STSE05DV","atts_01GW2HTNRQ5PJ9Y96KSK9DW09R","atts_01GW2HTNRNQD42P9MYWC6FB58J","atts_01GW2HTNRYW1T41J32YB5E7BZ2","atts_01GW2HTNS082D7V74RK4C6CJKF","atts_01GW2HTNSK0354T2CG9J02NXKE","atts_01GW2HTNSPM02RFRGHSHW2C5DJ","atts_01GW2HTNTM8BHGFDNKS8TH1GME","atts_01GW2HTNV24DEZ55PSPCCE943A","atts_01GW2HTNTXG8MCMW4M86GSZJEZ","atts_01GW2HTNTZ6TYV1RZT3ZE85SE2","atts_01GW2HTNV1NMDYBYS6ZXW71Y6H","atts_01GW2HTNV4BN9H2N2GQV4JG5TS","atts_01GW2HTNWZ5RBXKAGQZR55KC76","atts_01GW2HTNX3VQETMJEKB9CKHNWZ","atts_01GW2HTNX07ZEH2YAR2YD2JAM1","atts_01GW2HTNRB8YX12TA78VK8VA95","atts_01GW2HTNR9EXEKQA4GPN2YC94S","atts_01GW2HTNXH4QGKZ4XKM5TKN3N8","atts_01GW2HTNXHQ8YYQYX2725ZR3BD","atts_01GW2HTNYGC5N3W40K8XGHMCN5","atts_01GW2HTNYH5YT9CGG8JQQWD0B7","atts_01GW2HTNY8KGHHQTW6FB80BFM7","atts_01GW2HTNZRP7P8A29H7J4T18EA","atts_01GW2HTNZSF5ZSGY0TJYK2Z4RY","atts_01GW2HTNZM53RVDBDHXTXZ3W2Z","atts_01GW2HTNZPZ4B16VJ7947Z0AHJ","atts_01GW2HTNZJSB4SXN2CYE5ETK29","atts_01GW2HTNZGD61V1EQCC6BAFYG4","atts_01GW2HTP0FE3DZJY5NJM1HRK79","atts_01GW2HTP0X8MJH3AVVY7GEH1WB","atts_01GW2HTP0JKMECNGN88S822HSQ","atts_01GW2HTP0HEFX1FRR4Y5BWT7PT","atts_01GW2HTP0MAJ9N0M8XT1WH3N1J","atts_01GW2HTP0N3QW67BGVQ764CSBG","atts_01GW2HTP0PQHRQ9SY26W18B183","atts_01GW2HTP0Q5M9YVNTAV8MBP9VF","atts_01GW2HTP0KJEWPZRZYPV7KQHXB","atts_01GW2HTP0YEHDDDH8EFMNZ8410","atts_01GW2HTP0YF5EYEYFB5XEWEFCV","atts_01GW2HTP1WZJR7EE9PAH6N6YV9","atts_01GW2HTP1Z6XESAC8NKNBS7G6W","atts_01GW2HTP1YC8AN8BBPSFX3DWD5","atts_01GW2HTP0WAT0JS73KV8X6AEXK","atts_01GW2HTP0R0HBFTY50D68MRZZ5","atts_01GW2HTP2JWBBMZM9K0QT2HHJE","atts_01GW2HTP2JA70QFB4BDR5XGVMP","atts_01GW2HTP0SGVM7CVW2JF99NARX","atts_01GW2HTP10GGJ9QEDMXGTTTN1G","atts_01GW2HTP0ZTJF4R4EV6KPDACPV","atts_01GW2HTP2YFMCFF93ENQT636EG","atts_01GW2HTP4QX3D1TPNFNKY5ADC0","atts_01GW2HTP4G4Q25F1P7C4GYPY4C","atts_01GW2HTP4J219M90VXRGCAKTPJ","atts_01GW2HTP4NJZ73QXE8VTYXE9HQ","atts_01GW2HTP4MQ51X30TKDCCQXQH9","atts_01GW2HTP5NXBRSHPVX1EAMFRNH","atts_01GW2HTP68C0CNT02FBZCQTSK3","atts_01GW2HTP6XW65N9W5K14G6NB6B","atts_01GW2HTP7C1ZVB3WMRW800E3EK","atts_01GW2HTP7DE65Y8HD5Y4C7VKE6","atts_01GW2HTP7ET5MCF0NM85DTM4K7","atts_01GW2HTBRBNZ8V96WQCRKBM2JY","atts_01GW2HTNFV4WN8YM03TG800BH9","atts_01GW2HTP82FHXRHVJF6B3D28K6","atts_01GW2HTP02YWVX2XZ6QS66YPQA","atts_01GW2HTP056AANPH1H9RVHHD10","atts_01GW2HTP04E81H8VARQFQRPA32","atts_01GW2HTP00KWT1GYHD6211KDDY","atts_01GW2HTP8GT4SAZ1NK86B65K80","atts_01GW2HTP8EAR9C13SQB4D18PXJ","atts_01GW2HTP8CSAT1TRF8YA8DFP26","atts_01GW2HTP8AN3DXR3XH20SCY6BZ","atts_01GW2HT8A887Z1HTEB57NMZ00Q","atts_01GW2HT8A6169C3D5QWMRSX6TQ","atts_01GW2HTPANH4RPE2RKSMZGJSQJ","atts_01GW2HTPAN3Q8Q09284B8NCAGT","atts_01GW2HTPBDCPBNAMZHTHMPFTFP","atts_01GW2HTPCCHX7S05GCT900JH11","atts_01GW2HTPEXG0N8P9K8TPH94VM3","atts_01GW2HTP6QY3ZSB6Y3NP5TE99S","atts_01GW2HTP6R56YKVHZR2T4G13Q2","atts_01GW2HTPGAF0WZ5YAK37T44EF1","atts_01GW2HTPGV18JJ7ABVY3K4F9VX","atts_01GW2HTPGWHQN85P7YDECFFVXJ","atts_01GW2HTPCFQ3Z7HAK6R0ZRAEYF","atts_01GW2HTPCEW4E8V93RB8BPWNZ3","atts_01GW2HTPHR1J13CBTXSMQZ2496","atts_01GW2HTPHRXY8VGT2YDMVYSWSD","atts_01GW2HTPJ49CSX75158ZE2DQ8M","atts_01GW2HTPJAY11P0JT1XZ476XDG","atts_01GW2HTPJ8GQE0E7R4ZDC11M18","atts_01GW2HTBZ8QQGPM114SFA9AW15","atts_01GW2HTBF1FZHRVRZXGFZCNZMY","atts_01GW2HTPMV4CTW3YRZBGQFCTAW","atts_01GW2HTD6S41EQ3SKTKRNF2JTJ","atts_01GW2HTPPHRZAYMP6MP3EN6P1R","atts_01GW2HTPP8JA23MH0WQRGBD12Z","atts_01GW2HTPPD75EHMNC3TM7360XF","atts_01GW2HTPPB3S3SW5K3ZXVJXE1E","atts_01GW2HTES5E1PGNV6RF3D5FKWS","atts_01GW2HTPQWZV0PV7DSM9860ZGH","atts_01GW2HTPQX32XSS5R7T0HV7786","atts_01GW2HTN1RQXC1B25651K001JD","atts_01GW2HTN1Q9CKB35SMFVR0FGJA","atts_01GW2HTPV0V97P5110DQMYF1J5","atts_01GW2HTPVW7BN3M7TFNTJ854ND","atts_01GW2HTPVVSSRDX1VX4SGE41VC","atts_01GW2HTPX1P61C3S96A273R9AJ","atts_01GW2HTPWPYKAS34DMME1RNZ3N","atts_01GW2HTPWMCK51WGQBQKDTY7NM","atts_01GW2HTPZ0X26ZHDQ0SRDE4D8T","atts_01GW2HTQ13C6B45WD83FM6N0AT","atts_01GW2HTQ0X3TYPF9FNRWBXYNJ0","atts_01GW2HTQ0YEB864K3PNYK200HY","atts_01GW2HTQ2Q8TKRMD5BNEMEGZ28","atts_01GW2HTN3W51HQ23ZKH2EKGB6H","atts_01GW2HTN3SMEDXYHXWP2B92QGK","atts_01GW2HTN41MF299HCPGS7EN2CY","atts_01GW2HTN4C7JT6MV4GQTRZF006","atts_01GW2HTB9R5QWGQA489V9HFNJV","atts_01GW2HTQ69PXMS33D5BS4SE4EF","atts_01GW2HTQ69VFCDSFZKTQM2723Q","atts_01GW2HTQ6ACMKF5CS858M1WE5W","atts_01GW2HTQ68RGYZ1YDY4JPP2RX8","atts_01GW2HTQ681GPKWN94KF15Z03M","atts_01GW2HTQ68S5EN6M0MDVGTS2D6","atts_01GW2HTQ67CXCXW8DDF79XEPA0","atts_01GW2HTQ67F7AF0RVT0C96CBKK","atts_01GW2HTN3HD2NZM46PD3D6KZCW","atts_01GW2HTN3KNC309C3NN81E0W99","atts_01GW2HTQ8SN875JA2KFH2590S5","atts_01GW2HTQ8S93PHWTFECDK7FJZJ","atts_01GW2HTQ8VZGCYVQ6ZW5MFF399","atts_01GW2HTQ8WDWGHN0H9Z3X2VAQY","atts_01GW2HTQ8XZ7DE0Y1JNB0QG4CG","atts_01GW2HTQ8XV1MWYQ4SRJXWAE6D","atts_01GW2HTQ8ZR1FJXVX09PYAYZGA","atts_01GW2HTQ904ZRH9E6E276AWV6H","atts_01GW2HTQ92RQ4RNKRTQ9MERFCP","atts_01GW2HTQ92T6WKXZST3VP230J9","atts_01GW2HTQ8NX1C6HP9AHK59MCKX","atts_01GW2HTQ8QCHBY1KE0SWQ48Q2S","atts_01GW2HTQ4GCREQQ0XN2F4D43Q2","atts_01GW2HTQ4HEY83HXKB8Q1JX6XD","atts_01GW2HTQ4KEAQEBB80FGTN22CX","atts_01GW2HTQ4M05NSGJJ9CCN4PPEX","atts_01GW2HTQ4CPCCJJ9NTVTASJME4","atts_01GW2HTQAQQKG4VSJZPVMPHHB0","atts_01GW2HTQBBWD4T5PE5PM06PFWH","atts_01GW2HTQC174R4SF7NTW828VWT","atts_01GW2HTQC04R9MW4SJ6FT7MAFR","atts_01GW2HTQBZPSJMZWVG9DHKV8E3","atts_01GW2HTQC6HVVV85FB6AGMZZ97","atts_01GW2HTQC7SZMRCJRB9QQ4MRTR","atts_01GW2HTQC7DFDVKG1R9G92M0GE","atts_01GW2HTQCPXQVWQ4ZBJJK1C3ET","atts_01GW2HTQBKR18TPKJHBCSDJJN3","atts_01GW2HTQBKM03DTW1H1J3PF50B","atts_01GW2HTQBKNVHVFQT8VVXAHJ1Z","atts_01GW2HTQBHNGVFB3JRCJCQXEKC","atts_01GW2HTQBJNVPWT93J3WQX5QHP","atts_01GW2HTQBJST454G9GT0NSW7Q1","atts_01GW2HTQEDZRKR8HV5Z7YEBPEV","atts_01GW2HTQHB5VSP4YGZCAA41A4G","atts_01GW2HTT57QJEWYR14CT2NRCET","atts_01GW2HTT5EJWVN2FPNZ0JJG7MP","atts_01GW2HTT5CTEDXHEQH7PFV4MWZ","atts_01GW2HTT5QJA3FK0RBYZ8VMT4B","atts_01GW2HTT4MSY5BEWSCNRBRSFCW","atts_01GW2HTT5QZ1BKY5YWYSQX5597","atts_01GW2HTT5Q50NME4TDXWW5HEKM","atts_01GW2HTT5RC04DHJR1SBRAGJQ7","atts_01GW2HTT5RBVPY3MT4FPQ8HVZQ","atts_01GW2HTT5SR3NW1VNKVMBZ7NJK","atts_01GW2HTT5VA3K32KWJJ63H9QEN","atts_01GW2HTT5SB22VTTB6VW4QZRAT","atts_01GW2HTT5TX9YXJF4VAZ5PSHHS","atts_01GW2HTT5VX9KPE5JZJTP8WPJD","atts_01GW2HTT5T942J9YM7TCX4TCQA","atts_01GW2HTT5T1EJJAMKJE3HQ44S2","atts_01GW2HTT5VF40T61E2YVCSMN2V","atts_01GW2HTT66VJ76DEVSWPCVPJ32","atts_01GW2HTT65NV8YSGGGMXM3RMJN","atts_01GW2HTT5N68XRE8MB2KHT6NX4","atts_01GW2HTT5PPG7JA290N7C7Z2SB","atts_01GW2HTT8TFRK82T2ZK8891FZQ","atts_01GW2HTT91QDE4QWJWYG0NG74E","atts_01GW2HTTAD055YNV5KXQS5DGPN","atts_01GW2HTTCBC746W4NE6XP0TX6C","atts_01GW2HTGZVAAJR7GTK072RAHK8","atts_01GW2HTECZTYQP39G0PJ695XCQ","atts_01GW2HTTDVVJ0Z027KYSTY3N1Q","atts_01GW2HTTDWQZ7QTRD3K2Q8JYGW","atts_01GW2HTTDW8SQJ10J1S3WXBDYB","atts_01GW2HTTDYSGS4BPWE9R4KF8K9","atts_01GW2HTTDYGHEC0YYXY9TZZ5XS","atts_01GW2HTTDZED0QCGGG05HFECAG","atts_01GW2HTTE0ZYZGRX07M6AG4SNH","atts_01GW2HTTE79VFHV4H31641JDWJ","atts_01GW2HTTG4TYZBCHNAE53X8FXZ","atts_01GW2HTTGCGWPPNEP22THYWWNE","atts_01GW2HTTGBN986VBZQ3ZAYKENW","atts_01GW2HTTGP8PX42HTQ35GNE36B","atts_01GW2HTTJ5RH6Q6CPT606Z6W8N","atts_01GW2HTTM1ASQNWP5186A40ATN","atts_01GW2HTTNMV89BC9BY0PYYCWVM","atts_01GW2HTC2Y3WR5ACFKAWGJCPT3","atts_01GW2HTC2Z2HWH2GSZFB9DVMTR","atts_01GW2HTTC33E2WGFAXYDMC0K6X","atts_01GW2HTKA474K4KNMZD1BH8N3B","atts_01GW2HTKA4N3R5QBDRQZ48GSWF","atts_01GW2HTKA4358QGPBEH9Q0HVVN","atts_01GW2HTEQT1JS0FGF1C8K43D49","atts_01GW2HTKA6FHMHJWFCAQT0XE75","atts_01GW2HTKA79S6Z4EWV9XPB0P62","atts_01GW2HTMHGTDJA8YCVT9WDJHSJ","atts_01GW2HTTQPTZBVM0ZST1E6Q7WZ","atts_01GW2HTTQXSPTYW893BK69H8HZ","atts_01GW2HTJMKA12CC1WEHGG7W2G5","atts_01GW2HTTR54BRJ5SN8N4Z9RWJY","atts_01GW2HTJMKQP7RKY90PE6DVD2C","atts_01GW2HTH8AKXAD6M1MHH70JCZB","atts_01GW2HTH6JT2JMTR205CM84JMF","atts_01GW2HTEY1GYTX311HGXFY907H","atts_01GW2HTEBF31GC1WP3NXBZ5GMF","atts_01GW2HTEBD2XAAWSQRMPK63SV3","atts_01GW2HTEBHM87GA2SES3ZEWTPJ","atts_01GW2HTEBK0Y4CBBFPWWFDECZ1","atts_01GW2HTF4XNTJVGT8ZA9ZR2JTN","atts_01GW2HTF4XXJPCVP6AXQ2RT5YX","atts_01GW2HTF4YX81095D2AEC7DXZG","atts_01GW2HTAEYRNEZ547GABYSJC3D","atts_01GW2HTMBHY0DQSXB7YS9NEQGT","atts_01GW2HTMBJ2YKYR6NFZHCVH9T2","atts_01GW2HTMBJZHJT8BM8Q4KREKY0","atts_01GW2HTBR55JDT3ADTRG4ECKP7","atts_01GW2HTBR2T90VSV0WSS1C4M52","atts_01GW2HTBR35WBPPGXEB2T1CDN8","atts_01GW2HTHVGD04ZGVNC8XEN77N0","atts_01GW2HTCYV1Z9NBWF6D389P1DK","atts_01GW2HTCYWJB6JWJPSQWBZ6Y5Y","atts_01GW2HTDZVE01D5MXFJ6DN0XKT","atts_01GW2HTDZS0D0SNSJX11MVZFFQ","atts_01GW2HTDZTK6RGRPHJGK75WN3H","atts_01GW2HTTTMV8YPFWCGY1RE3XR6","atts_01GW2HTF7E406RCFF5N9H3B30C","atts_01GW2HTF7EB135WBSX2QZ771R4","atts_01GW2HT87K25NMK21ZJ310HSP1","atts_01GW2HT87AACNDMGBPG13PYDQH","atts_01GW2HT87BDV2JKWZWTS8WJ75H","atts_01GW2HT8875VSWZNBAK803YEWQ","atts_01GW2HT888BCKACKT98AB4MVFV","atts_01GW2HT876MWVM1NJZJ3JG7N5W","atts_01GW2HTTTY38W2SW5SPMHHEJW5","atts_01GW2HTFBD42RWZ45BA5Z99XTF","atts_01GW2HTFBBGZGS6FZ0NBN9MBPK","atts_01GW2HT88453JSAAMS1EK6NR8G","atts_01GW2HT86NN71N9QTTMZSN84A2","atts_01GW2HT86NS6R7HMJ4JF8NEX4Q","atts_01GW2HT86HZXN870MRV05Z0HP8","atts_01GW2HTTVEE2EH5H0ZJ9EQBDBM","atts_01GW2HTTVEJ54S9ZMGGSR4KAJP","atts_01GW2HT89JPCSM18V12GZGJGZX","atts_01GW2HT89FYAMNXSN8QJ25EPHR","atts_01GW2HTBW5ARGT1GEC5ZH6ZC60","atts_01GW2HTBW5NYYS44Z1PMQXKFD0","atts_01GW2HTAVT2B2SBVXENK2BPR8S","atts_01GW2HTDCHHMSHKMA057KB0FRW","atts_01GW2HT8NF8H0W1BPTZ5MFJA4Z","atts_01GW2HTTW2S4FQ2WWFQ50T7AJ0","atts_01GW2HTJSYMCS1S7N67TJACZ6E","atts_01GW2HTD55W6KEBF4ZY256D2D3","atts_01GW2HTF8EK5Z8WV41YYKQJSX3","atts_01GW2HT8T4T063QVJRWTC4KK5X","atts_01GW2HTKBSE82WHF1ARY5V0G5E","atts_01GW2HTKBYR99A8TJKF1Y3R86X","atts_01GW2HTKC02JNQQM9MPS84RZ9K","atts_01GW2HTE23BHXABCJ28WZ58XYH","atts_01GW2HTE2Y6ZER1HMS8TMX4TWX","atts_01GW2HTE23WXS0VMD5BB3RW314","atts_01GW2HTE31V0RKJQ32SMSH9JAK","atts_01GW2HTF70STDVXPJJTY89WM5X","atts_01GW2HTF716FYEF2NYVGTT3BM5","atts_01GW2HTF6XK93G4RGPRD25B23J","atts_01GW2HTKGTPGRH1SP2E96Z8PH3","atts_01GW2HTKGY2MNE217EP0YZ9F72","atts_01GW2HTEYGPPSWDQZZ32EZQBKT","atts_01GW2HTEGJC98MTH4Z0YT0RKQF","atts_01GW2HTTXNZRV4RCJAEXJ1END7","atts_01GW2HTKS7F4FTP7ZADXJH5HHK","atts_01GW2HTKSQ0HD5S0DH9KAEAEXA","atts_01GW2HTMXGXXJKS8YZYRAJHSYN","atts_01GW2HTMX72CDF8ATJDR6NV9TE","atts_01GW2HTMXJ5XZMQ83W0FYP5MZ7","atts_01GW2HTMXA97FQ4CHZEX2NK184","atts_01GW2HTTY9TWXBPRA02CEKFW5M","atts_01GW2HTTY5M41X4XBAVMG14NTE","atts_01GW2HTTYX5SK282AS4E58E4CZ","atts_01GW2HTTZB6585HKK32J50J92G","atts_01GW2HTTXH6SP74MZY0J9MS059","atts_01GW2HTTXGR96ATGAB8SHZMSR2","atts_01GW2HTBP67BM00B1K7RXWAT0X","atts_01GW2HTBPEZC9MW7QX6RDPDT6N","atts_01GW2HTTZQ0597HMGQ66RNHKSH","atts_01GW2HTTYKR9JK8C2A9YFCVVXK","atts_01GW2HTDAKGAH4BJWWYKMPK6CR","atts_01GW2HTDAQDMKYMX4TMTX8MV1Z","atts_01GW2HTA0EYMKH0F7SHQPKSMCP","atts_01GW2HTA0JJY30K43DJGQTBVBV","atts_01GW2HTA0JQHTEAACDQXGA7CC2","atts_01GW2HTA0KJT1NXDKRDYK8NF3A","atts_01GW2HTA0KKPARS9FEHNWQ9TCD","atts_01GW2HTA09BZAMFTT0X8T7VKWF","atts_01GW2HTA0E557TTH7AQFKWME2A","atts_01GW2HTMM7C2M6J1XZRCK84ZT8","atts_01GW2HTMM714RT5J2HXQG1Z85X","atts_01GW2HTDNM91Q8REPWKN7EEWCN","atts_01GW2HTV2C8HGXGEXZH0NWN111","atts_01GW2HTV35QSWJSXAB81CR8RN7","atts_01GW2HTV5ENGJJZ1ZNT9CPP9KM","atts_01GW2HTV5GQ010KSJKQSS4QMZA","atts_01GW2HTJG0VBH52108GC3KSXQG","atts_01GW2HTJG1DVD6F5CE6MFVDKNV","atts_01GW2HTV780YV1H9D0AV2WGVK9","atts_01GW2HTV78ZNZBRZCKM6E7E97W","atts_01GW2HTV756TB0SJ2FRCX1WZWS","atts_01GW2HTV765VBWM1NNK0B4SSY5","atts_01GW2HTV73E6J3Q6KCN36GNPJE","atts_01GW2HTV73J6HF8ZY9NFHXNKXK","atts_01GW2HT9MXB40JRTDVE3EYK6WY","atts_01GW2HT9MVRK79Q9RW61CP9V9G","atts_01GW2HT9MSDWXN0STDWP0YJTJ7","atts_01GW2HTV97P8D126VP9ZD3J25X","atts_01GW2HTV9G2Z2WKA0B7KKQCEDQ","atts_01GW2HTV99HHKQ7VGBKK1B1VEA","atts_01GW2HTV9DDE8J8Q0J2K1NBMY5","atts_01GW2HTV94SS6X4B5JA8MJYJTC","atts_01GW2HTV9EK39T1WPCP49XDG89","atts_01GW2HTV9B4XB3SDAV5V4P62T4","atts_01GW2HTV6785TFYP323KR3QWT2","atts_01GW2HTV63Q51Z44SA0VRWX13F","atts_01GW2HTV6HAMJQPA7CVP5SYZN0","atts_01GW2HTV83MDA7G6YJ8SNN07XN","atts_01GW2HT9GWGDENW6MC300D0VE0","atts_01GW2HTC15338VS8083GEJS65T","atts_01GW2HTD8BG0KQ8CZPXTZ3TRMB","atts_01GW2HTVB8ABXRBA3X94NPEK2R","atts_01GW2HTVB78X57EGQY7NKFZF4J","atts_01GW2HT93DQDS30FWVC2AD1NF7","atts_01GW2HT93G3F81VTNZZTQ64KGH","atts_01GW2HTVBSAJN8XXEF8Y70704H","atts_01GW2HTMABC4HR8JXPNXNRJ4D5","atts_01GW2HTMADTW8PRP8Q3FYY6FGQ","atts_01GW2HTMAFK1VG40DYBT7642YP","atts_01GW2HTVCXV5YYJCT2B874XCSH","atts_01GW2HTVCTWZD2172HBQC9S1YZ","atts_01GW2HTVCWW0DW30ZRKSZNMQEQ","atts_01GW2HTVCXCMFQJY1HQ4HZTCH5","atts_01GW2HTVCTAA0XSQWHPKAQYZNM","atts_01GW2HTVCWC8822TTZGH25AW33","atts_01GW2HTJB2H9JKA8EQQA99EJH0","atts_01GW2HTJB3Z8FMZA3M2HBQAN22","atts_01GW2HTJB4CW7T2WTYZCHSENAV","atts_01GW2HTJB5SGGJQZMMT5GC59WP","atts_01GW2HTJB61D6NSXX8CEGYWSGK","atts_01GW2HTFJGY9Y3WN0RVRZQ07Q0","atts_01GW2HTVD9X7FM614Y0PNRM6VB","atts_01GW2HTVDGT9TYQCX36VQTD6B2","atts_01GW2HTNH483FGJ0573JNXMFV8","atts_01GW2HTVEPKP0KZR1XSXQ7P5EQ","atts_01GW2HTVEMJ9YJ4S8M3H5KY0AG","atts_01GW2HTVF3SVN05HATE7V74K29","atts_01GW2HTVF9P5HW9X5VZG8GNSE7","atts_01GW2HTDYB732JYQXPA07G3Q2T","atts_01GW2HTMNHAG576CS5QJJNMA88","atts_01GW2HTDHKQH88EMHAYV5W3609","atts_01GW2HT8B9J4FZ2H8J0M41KM62","atts_01GW2HT8B9KJ0CXYA7XS249H5T","atts_01GW2HTVG3E21AVA2J1FPB33F4","atts_01GW2HTVG4PCSX1RED9SAN2TK5","atts_01GW2HTVG5XKJQZVXW5H17D6K9","atts_01GW2HTVGS95HR6JZ2FVDDNCBK","atts_01GW2HTVGK44ZSGAZ2MB6YCQZS","atts_01GW2HTVGHG0C95ZS54RPN82BN","atts_01GW2HTVHEAQ8KXT00J2Z7H7KV","atts_01GW2HTVHMF735FMG3M4S99AG9","atts_01GW2HTVHFRNFMWJ5F2F6SZKCP","atts_01GW2HTVHG9DD2X9TT8RNM7WTF","atts_01GW2HTVHM4W1BD7XJ99QS03DF","atts_01GW2HTVHRGZKAZ0Q52SV7YZKP","atts_01GW2HTVHN76W944PHZXW5GABM","atts_01GW2HTVHMAZR5JAHJM33HJMM4","atts_01GW2HTVM8M35PJ8BSKM7PV509","atts_01GW2HTE5DQ7J88TWG59TTTR3X","atts_01GW2HTE57FV4DPWJARJV0S3XS","atts_01GW2HT8K5MDC7XHSY97W68E5B","atts_01GW2HTVN6CK5K2KS3NPXG0G6F","atts_01GW2HTVNFP3G2AS850PSQCZKV","atts_01GW2HTVNHJN69TTBMRY1RGYFN","atts_01GW2HTAFW2KZPRD1HJ3X4Y92S","atts_01GW2HTBJV6MVAFA3JKGHFZED5","atts_01GW2HTBJVPX727A1NZYPR874D","atts_01GW2HTBJPN8DZXPYHN5PSJNDE","atts_01GW2HTEYDBHXY05E215SJMH65","atts_01GW2HTVPF007M7B55S1PGJAWQ","atts_01GW2HTVNAV3RHNR1HCHSSN376","atts_01GW2HTNHQ786SVJP3ZF5ZZ6TB","atts_01GW2HTNHEZ5X07GFDTREPQDJM","atts_01GW2HTNHGQ5Q1J733Q0APD6MP","atts_01GW2HTNHKAK5V7PXR343BQ3BJ","atts_01GW2HTNHE33D28N7WFXH4HYV2","atts_01GW2HTNHR9CKXJ7SJ3MGQBH1Q","atts_01GW2HTNHK2CMNP4CT6FZSK7KR","atts_01GW2HTNHGD5RAYKTMD39N90ZX","atts_01GW2HTNHN416VV3YJXYT9FM0D","atts_01GW2HTMAYFNK2F0BE1P25QRGR","atts_01GW2HTMB6ZYZQ36872EJJQRYX","atts_01GW2HTMB2ZX6X9KBC77WPNH1C","atts_01GW2HTVQ4RXBBJSAA0XVNM38K","atts_01GW2HTVPT99YJDQ6RXZ69WXMT","atts_01GW2HTVPTA51TN2KEC8QPHDAP","atts_01GW2HTVQCMYJRWMQQMJ5PBM4T","atts_01GW2HTVPVE25B3X7VPTRQPQNC","atts_01GW2HTNR0GZMW6MCYB3AJJSBC","atts_01GW2HTVRSPSW8K83TZ5QSZ63E","atts_01GW2HTVRSC8ZW0TZFC8WG95EG","atts_01GW2HTVRSN9XDQ2WGPW5H146N","atts_01GW2HTVRQXGSJKK1TG09HX7VV","atts_01GW2HTVRRG9C77XHFP58SQ0F8","atts_01GW2HTVRRRAMM24A78Q7WNNC5","atts_01GW2HTVRPJSKC0E08RA5GYTEZ","atts_01GW2HTVRPEXX6HTPS044ATNA2","atts_01GW2HTVRP52B6V5P7ZK16G11B","atts_01GW2HTNY4MC1TY3876JVXSX1A","atts_01GW2HTNY6R7SB1YPZA4YCBAC1","atts_01GW2HTVS07M5HNAKB47C09REA","atts_01GW2HTVS0ZFKNMM4KXZKKZ8GM","atts_01GW2HTVS0EPK0088ZRNHZ5XD8","atts_01GW2HTVS2DA04T7D9V4ZDW630","atts_01GW2HTVS38RPXQXVA3M53VRDC","atts_01GW2HTVS3SBT1N1PPBXN0H7CE","atts_01GW2HTVS4BJHCQG72V37RKJWR","atts_01GW2HTVS5D2F8ESCX84J4MD8S","atts_01GW2HTVS5D8N7FG4B1D630NZ6","atts_01GW2HTAY6S2Z59DJ7Z9MY8VXJ","atts_01GW2HTVS7G08HYNXZ6CMP0ZKJ","atts_01GW2HTVS79TT29X334HGYNHGS","atts_01GW2HTVS71BA5009QDA3B144Y","atts_01GW2HTVS921QAEDWMS5FXFJ7N","atts_01GW2HTVS9VH664ET240FMJPQ8","atts_01GW2HTVS9TS33VHM52E4PBKHS","atts_01GW2HTVSZDTN73G59EK6679P7","atts_01GW2HTVTWTHQCPQMCRDFK2Q61","atts_01GW2HTVTWSPWXN9MPAHVGVNC7","atts_01GW2HTVV07X8WZQH9V6DV9NKZ","atts_01GW2HTVV3D2RKYGQRJADTV3DV","atts_01GW2HTVV5MM8JZ3WDQZ82HKP2","atts_01GW2HTVVBPT1DNX8R2KCFGFM4","atts_01GW2HTVVDKY0N4FSTHJWBG48E","atts_01GW2HTVVXC7HKG5D6D75VWTFB","atts_01GW2HTVX80F36Z7JZVJNRH99J","atts_01GW2HTVYGBVGGYYH1EQSMBPYW","atts_01GW2HTVXJ1CTCB90M3YNS36MD","atts_01GW2HTVYHS01PC8Y59VHHH56H","atts_01GW2HTVXJRJC9D7H288YSJVH4","atts_01GW2HTVB71Z15G1EZXGW41ZZP","atts_01GW2HTVY26KBVFPBJ86EF1SXG","atts_01GW2HTVXPW726PPNYEYEXSHW6","atts_01GW2HTTJFHDEZ4ANH9XGXEVGZ","atts_01GW2HTTJ73DXCK59ZB1MKB71N","atts_01GW2HTTJD0KNQPK2Q39F797M2","atts_01GW2HTTJCR9GA5VAA886K0HZX","atts_01GW2HTTJD1T1AP0S23GXKQ7X1","atts_01GW2HTDFH0YV1Z6TZFPY7CPY0","atts_01GW2HTN4FMRZYKVB57P28P983","atts_01GW2HTVC71X4F9GRGKEQ5A1XR","atts_01GW2HTJVCM3BQDATKZQC9VYF8","atts_01GW2HTJ5ZVNN319GVH9488B4V","atts_01GW2HTJ612E0DAT53TM3CV92M","atts_01GW2HTTY2Q4Z4N3W6QV9K9VAW","atts_01GW2HTHTQ62Z085VRDY7YWFFP","atts_01GW2HTHTR6WMVCGYPQVHY8NXG","atts_01GW2HTQF3Z8SN9PS3XJSP6A5X","atts_01GW2HTETJJCZE645Y871Z975T","atts_01GW2HTTB2ZHEMFW1WTHMSBBDD","atts_01GW2HTJXPG3E0Y1QXXP3WMT89","atts_01GW2HTJXJ75FFCJ75K5725SKH","atts_01GW2HTJX908C8P3XVAKZQT1PB","atts_01GW2HTHRVPW7A1WCB9DKRFWYF","atts_01GW2HTJH5QDRX42EY7DYY81T5","atts_01GW2HTTPQSAWMAV47TJ0PMXWF","atts_01GW2HTQ8NXJNHMBSMX0T7QRXV","atts_01GW2HTN0JWZG8XJWQY9AFSBNT","atts_01GW2HTN0M2CAJ04PXMP3Q5DJC","atts_01GW2HTN0P8HH05CQ07T7JJ39E","atts_01GW2HTN123PCENJY385EK42EJ","atts_01GW2HTN10FMVMEFMDPB9EZEB4","atts_01GW2HTN17MTC2F7M070MVQMEQ","atts_01GW2HTK7XW5TZGFZMHBKERP0A","atts_01GW2HTK81R816XDGB3KN7TZQS","atts_01GW2HTK80FXCGFW64XCDWC259","atts_01GW2HTFHHZXSQY7V0S1AN51WV","atts_01GW2HTJM1NE3SCYTK0WYQHETV","atts_01GW2HTJM20RGAATFHNDWVA8EY","atts_01GW2HTW47QZEDWR3SC4H4YW4T","atts_01GW2HTETRK6R923WZSY3F3AWR","atts_01GW2HTFG670WJEZTTJKES0973","atts_01GW2HTFG6ZK01M45RQWC0F0GE","atts_01GW2HTM2ASXCBSPW21TA3K413","atts_01GW2HTM2M1Z7A6AN1QXJRQP83","atts_01GW2HTM2KJ365J5DCJDXCW10C","atts_01GW2HTM2DD1D3N5Q6BBSSY65K","atts_01GW2HTW6MV4FV9YVXKAVTKDZE","atts_01GW2HTW6KPGD6A2RKAVZR4NJH","atts_01GW2HTDPJJY7ZQCQSAP99046C","atts_01GW2HTW7D5T2MDWFJDH675ATZ","atts_01GW2HTVDDEYCGSWCJMKWSCVXH","atts_01GW2HTTE6P695AKXA34KB6YB3","atts_01GW2HTW7SEP5BQ3W7G34TVB58","atts_01GW2HTW8FVVACVTA9ASG3VAFB","atts_01GW2HTW8NNMG3C9BZK88WM6A4","atts_01GW2HTD0HZMM202X2NJRVMBP1","atts_01GW2HTD0KP9XGMR13YN1TRXEV","atts_01GW2HTD0K0PESA9J376HY022M","atts_01GW2HTWAKV1GV49DFXB576FKR","atts_01GW2HTWAJPV87AMJEH9BAB9CB","atts_01GW2HTWAMKZG9VYGCTQR6VAHE","atts_01GW2HTWAKGZHP3YSRXD2NTDW6","atts_01GW2HTWAN7A2P9KQ2V3TKJ7KS","atts_01GW2HTWAJ9SSF5SD3H3DTCAKT","atts_01GW2HTWANCGJBAV58D20BPY7Q","atts_01GW2HTWC0EA1ZD5V2ND6AKKV3","atts_01GW2HTWC4NPT9C35WP0ZF8RWJ","atts_01GW2HTWCEBWSV0936JD64XZ67","atts_01GW2HTWDSH0VXPY6JWBQW2ECA","atts_01GW2HTWDTWM9Y2DQ7JMQ29FZX","atts_01GW2HTWC3S39RHK56BE5NJ2P4","atts_01GW2HTD6ZW4PA9WDSZX3P1778","atts_01GW2HTD71QZXDJQ0SV2VSG4B0","atts_01GW2HTD71JVVK3704TV726EKN","atts_01GW2HTWEWCB1ZV2WRT19DSHT0","atts_01GW2HTWEVHN380CKQKXZ3CY5H","atts_01GW2HTWESN83NKBXWTRMS3VAE","atts_01GW2HTWFBP267GDZXQ492A8B0","atts_01GW2HTWFA192D0AQK5GX5EZY7","atts_01GW2HTWFZAR6S263NVP705B4G","atts_01GW2HTWG6168E4E9MKM6V359Z","atts_01GW2HTWG18J8WV3T174Z9E7W8","atts_01GW2HTKQ3N73QZGAMBP4G92SZ","atts_01GW2HTWGDWJYTXTPKCCEHH4GK","atts_01GW2HTWGDANCBG4YZY3XNVMGC","atts_01GW2HTWJCM57HSYN3609W04DE","atts_01GW2HTWJDSNQHGVHZEEZSQDZT","atts_01GW2HTWJBTPN6EWRBNR95V3PZ","atts_01GW2HTWJBXE9XCD7W558NAMC6","atts_01GW2HTWFB8S32EVWR0A7CPXK4","atts_01GW2HTWFBKBFKE0QZNPQ56YCX","atts_01GW2HTWFCE8RH7EMQ287Z2YNN","atts_01GW2HTWFCBVSVMBGF36BBRBQ7","atts_01GW2HTWFD36WH8KN0V46BQ7SX","atts_01GW2HTWFENVR3FYPVAT1W00VV","atts_01GW2HTWP0WDEJYK8DFV7ZA21Y","atts_01GW2HTWP0Y6RZDH7B4BVWKFHB","atts_01GW2HTWP09P5X4S31SQTV969X","atts_01GW2HTWRNNTNRH7JGS52BY32C","atts_01GW2HTWVBAEYT45RSEZCCE687","atts_01GW2HTWV81XE8S4ZBRZPXAYEB","atts_01GW2HTWVJCPX4VR92EE2S9RKV","atts_01GW2HTWVFR8ND437YM7SGE1MH","atts_01GW2HTWVJKKDW7VSRKNVB4JNE","atts_01GW2HTWV8V873PT9X3353S06H","atts_01GW2HTWWXGXTRCWDAPMJ40R2W","atts_01GW2HTWX10K2BAZZF128HC0K8","atts_01GW2HTWW4HJPR0EN3CM5XYERM","atts_01GW2HTWY4W8ED9M2VPNYAPWCH","atts_01GW2HTWYYWMRDRY3NX3VXY831","atts_01GW2HTWZ69W7A4WX2K4ZDMT5Y","atts_01GW2HTWZ53YT9PHJZN9N45DE1","atts_01GW2HTWZ6C0FSNWZ9F1CXB6TT","atts_01GW2HTWZ8KXHBHAD62NNDM6Z1","atts_01GW2HTWZM79S34ZW6Q19ZHFNA","atts_01GW2HTWZK9K1KHJW1Y2X77ZV9","atts_01GW2HTWZSN1XY1TWWM3CPW3SK","atts_01GW2HTX0CD4KXGGCSG4EJZEXB","atts_01GW2HTX0HYEDFRYNSDX6ANVRW","atts_01GW2HTX0JY7XV365DF1TRJBZD","atts_01GW2HTWW523VEVND4SA9WGD3T","atts_01GW2HTX2XKJN8QZFS0TX98KMN","atts_01GW2HTX35GPTV4QFQ60G24Z0M","atts_01GW2HTX3462GQ35QFP91S2FRG","atts_01GW2HTX4R9PMTY49RCDC5VHTZ","atts_01GW2HTX3RSFXTZ4DW3G1NJ4YD","atts_01GW2HTX3C19ZK464R9VR84B9K","atts_01GW2HTX7NPVMKR1YAWS52WE5R","atts_01GW2HTX7PRWVM8XB49RMNFFP1","atts_01GW2HTX7MDJBB34YFR6KX30FN","atts_01GW2HTX7MZFCXD6ZD8Z4S0YH6","atts_01GW2HTX7J1482XASRPFS0DRG9","atts_01GW2HTX7K0DG2KTY639SZNQ0Z","atts_01GW2HTX95FDYX7R5E6C970RQ8","atts_01GW2HTX6Q6VJW640WM9JKSCJG","atts_01GW2HTX6PX7TXX6RCZSA3K0RC","atts_01GW2HTXA4K1D65HT2GFG8T0NX","atts_01GW2HTXA5MFEYE5P2FJ42483C","atts_01GW2HTXACGPFSQMTQ6C0NN8FP","atts_01GW2HTXADDCSQQNTXNBMQQ0B0","atts_01GW2HTXAD6NVJHS5BHY2MT4ZH","atts_01GW2HTXAB8Y0HY18JF4S4FDVS","atts_01GW2HTXABX8TFKPBYAPWBJWJ4","atts_01GW2HTXABWRPCB4CY4GS4WA78","atts_01GW2HTX8797SS8VE040E8MJSG","atts_01GW2HTV6J3JJKBSS0K5AW922R","atts_01GW2HTNKTYM893XHT698EJPMW","atts_01GW2HTNYEK7DTHJJ1FHG62R1J","atts_01GW2HTNYC21E9FNVRP0VKJQNX","atts_01GW2HTBMA1DE491QXGP4Y4V86","atts_01GW2HTXDA1WDNYTGFVCTQW785","atts_01GW2HTV63V87Z6GGC63WN7Q82","atts_01GW2HTXET2W5AE9XXES18R4VE","atts_01GW2HTXF41Q02R6QFENGFC5FP","atts_01GW2HTXEP77S1TR5SCY13MJQH","atts_01GW2HTXF3KBHC6KZTXS2GWSA8","atts_01GW2HTXF5GNGX0G9FCQ4CQF7X","atts_01GW2HTXF5T9VFHZ42WDBNKZ9T","atts_01GW2HTHJFQ6KGZ9YRASM17VQP","atts_01GW2HTHJG7QGTQ6H32JS6Q5W6","atts_01GW2HTF9VNEW5538N9BVBZCFS","atts_01GW2HTFQ24MSRMHYSMP32MVP6","atts_01GW2HTAS488CWZK08KJ6FMRDA","atts_01GW2HT8AVGM9XCQN87NAG33KF","atts_01GW2HTAVGTFB7WVZEJ18EW3JM","atts_01GW2HTMAXB1XFWZS0KZPRPTRF","atts_01GW2HTFPFPD211P1BCFN5S7AV","atts_01GW2HTFPJ55ZAXC9ZWYPSGSBH","atts_01GW2HTFPF63DAJ2PC669XRDCM","atts_01GW2HTFPJQYY9FAXXNDRX2RJX","atts_01GW2HTWG4B251J52W6P0N9ZRR","atts_01GW2HTFPHBKG2AGRVTR96DSBN","atts_01GW2HTFPHYB75R6XHXNYRWQKM","atts_01GW2HTWG2P61E70JMKQXAZK5Y","atts_01GW2HTBRHGJ269VPSKM5HKK62","atts_01GW2HT8AQ916RJKJ5CWY3WZJW","atts_01GW2HTVG8TAW1XJ3BMQRXXW3R","atts_01GW2HTVG8AYM72JX8CMYKD4FT","atts_01GW2HTVG8FRAPZWCWMHDP1WY7","atts_01GW2HTVG60CW6TN76CXC3MABQ","atts_01GW2HTNFWQYPSGSX4S6WX0D7J","atts_01GW2HTNFTE0QFJADA37YGR3F3","atts_01GW2HTNFKWNP0QVJPP7RXBPMB","atts_01GW2HTNFNZYH27B6D41QEDWW7","atts_01GW2HTNFQ19EPW5MWWHVYVS81","atts_01GW2HTBR1HRBB25MZ588EP03D","atts_01GW2HTVFW80ZCAYSAXBNM731K","atts_01GW2HTNEB126B6E27D7JT8NG8","atts_01GW2HTHKHNWH9889Z2CQPQ7E1","atts_01GW2HTV3VY8WTGE616E431KRC","atts_01GW2HTV3JBKP77J1QA8JZGT5W","atts_01GW2HTV3ZYNB6VMPJE8JZ2BGA","atts_01GW2HTV3QVKRG889YMMNMWJCR","atts_01GW2HTXP5G00Q3GXFB7MT2829","atts_01GW2HTNYRV14ERCEG2HQMA5KT","atts_01GW2HTNYTTFMS475TJBSP22FX","atts_01GW2HTND88YB0YHPPS3K8ND61","atts_01GW2HTBW6NENM0Q5M0WC05SFE","atts_01GW2HTBWD8HM4BQNXTAVCN6BQ","atts_01GW2HTNQNNCX471KAYDH1FFV7","atts_01GW2HTNQNWAH48XMP3JW8EKKA","atts_01GW2HTM19X7997B0X5H5E6N5K","atts_01GW2HTM1B84A8DDBZBZW0H27K","atts_01GW2HTP0EX3HMS4BBAKJEW927","atts_01GW2HTJ39AB9CTFF7YJYQ5575","atts_01GW2HTJ2PCNQP31FZMR321WSS","atts_01GW2HTXR03W9G2DBYFM1DKC4X","atts_01GW2HTXS4R0Y16V74TNPXAV2C","atts_01GW2HTXWVF2CS2B0E8BFM00WV","atts_01GW2HTXWV4E015MEXQ0DFQ1D5","atts_01GW2HTF25QCSKAHN4G39BK8NS","atts_01GW2HTNSM4FJ0FTVCQHX5WG44","atts_01GW2HTNSMKFWTBJ34PMA9F8TF","atts_01GW2HTNSQSFGC1F52THTKSC15","atts_01GW2HTK2BGPQ3EN1JDS2AYSC6","atts_01GW2HTA9FQPZF2A38NWPW8FX9","atts_01GW2HTA9FZTSY8Z7PD2EKJAEC","atts_01GW2HTPDBGFHPDF1V8W6PBS6V","atts_01GW2HTPDDNP8CNBKQ9MQ23RDE","atts_01GW2HTQBZY0FQN97MER6MNDDX","atts_01GW2HTQC0033Q780Y4H3WXR5Q","atts_01GW2HTXZEVKD80SSZP7AQA529","atts_01GW2HTH54CD1R8QJSDCSWVJP7","atts_01GW2HTAZDXQJ1CVQSX60M2C71","atts_01GW2HTAZD64QXE17SFDDKW0MP","atts_01GW2HTJFNK8DY1B8S8DGGGAM6","atts_01GW2HTJFRDQPA14B6N8JMRA6S","atts_01GW2HTJFZW4GT9R9PB1KY40MR","atts_01GW2HTJFS6XZ7RDYKNXXEDGCS","atts_01GW2HTY107B93R2GGV6D3B14B","atts_01GW2HTY12EY4ZR0ZVWH1VCQFY","atts_01GW2HTY0NGZ9RKZTT97J53J10","atts_01GW2HTY0RT97K5SNH277NHA40","atts_01GW2HTY0XQ7MY895XN02GYBMG","atts_01GW2HTY0X20ST930B82TX8EF7","atts_01GW2HTY10W7V6MNT5P5MJX1X3","atts_01GW2HTY0P7Y6F7B4ZAVGBHPCR","atts_01GW2HTY0SAJHRNHMG57B6WWB3","atts_01GW2HTY13ZA31GKN10CJ43TRM","atts_01GW2HTJFXH0PDPRNTG685APZX","atts_01GW2HTJB4CFFDECNB6JA2YJSV","atts_01GW2HTJB5VZX074JCVJT5V5TR","atts_01GW2HTJB761P4YJT13HK5D9QF","atts_01GW2HTJB25WKGSKB3KM5P5QT3","atts_01GW2HTTX45XW5GJ15SSRNYS9R","atts_01GW2HTTWX3X6MMFBHH9G0RQM5","atts_01GW2HTTX29CBCM6ADZXMAPCZK","atts_01GW2HTTX1Q4MP4ARKKPCP68VV","atts_01GW2HTY2EW7VTG6G9D1GJDK8K","atts_01GW2HTY2C392N25E20SGJD681","atts_01GW2HTY2C64DZDRES8KK01854","atts_01GW2HTY2EAP2P51SJKZ3M9TZD","atts_01GW2HTY2PXQ60PDC0S7TAHC0E","atts_01GW2HTY2QK3BBVC6X3R6DEKKQ","atts_01GW2HTY2D1NA456Y0H9PD5GDH","atts_01GW2HTY2FN3MBR1AZPAS6F8RT","atts_01GW2HTVENM54158M2AXY4S557","atts_01GW2HTVEN4B02W7D7NV5ZKF3C","atts_01GW2HTV4WGHF346XA22WBXB0C","atts_01GW2HTV4WXRKMXWH24KGM6NKD","atts_01GW2HTV55HQM10W3SREH1T08C","atts_01GW2HTV58ZBNB1TN1EVMGTGBC","atts_01GW2HTV5006YCKXDX1BXS0FGW","atts_01GW2HT98AH1FNFERJK08KWKZZ","atts_01GW2HTY3ZY1787RB8GQKEQS3M","atts_01GW2HTY3ZCNT2DDENZ6T62VXD","atts_01GW2HTY3Z3GTD6467PMRJXG6F","atts_01GW2HTY42HY84H22JG12VRF1N","atts_01GW2HTY43VTFF21RP16YG3972","atts_01GW2HTY41C2TDVJK9P1F3D1GJ","atts_01GW2HTY428CX24D350N5CT1SD","atts_01GW2HTY40P2R71QPW8EYJ64SD","atts_01GW2HTY402Z9MND6W1NQ2D8PM","atts_01GW2HTX9VS5WHA7X7MXZRHJSB","atts_01GW2HTKRDJEJ9AYM70ANW28MF","atts_01GW2HTY5H3MGDN9TYW64QE51E","atts_01GW2HTY5GEXSPDQY0MHBJZCAH","atts_01GW2HTPJ4R154WSH7BR3TQA6H","atts_01GW2HTT8GNND7ZFGDE5TH83ZH","atts_01GW2HTT8H7J5W45MJ9KM63BRG","atts_01GW2HTV5EFDGHY5NAFK019FC4","atts_01GW2HTT51M1KXK5VRNKVWV9BF","atts_01GW2HTH20N7RA3YEFVWVC4XQC","atts_01GW2HTH21M1APYYS199ZKXW7Q","atts_01GW2HTH23ZR4NVHCQ4VBD9Z7Z","atts_01GW2HTH23ZTZ0XT0D1EXP8TN9","atts_01GW2HTH21VTC0XKDY2DX75BZT","atts_01GW2HTY7VJYRAGP4M6KM18JG4","atts_01GW2HTY7SGJGVGKY9TW7VCW1K","atts_01GW2HTY7VERBVB87H4PZ04CYZ","atts_01GW2HTY7T2CFTHMW3T4PVQSWB","atts_01GW2HT9JTZKE1JGHBC95TD7WZ","atts_01GW2HT9JRHH918JVN0BGYM4ME","atts_01GW2HTH5AJDY0A55RQCZHVDKE","atts_01GW2HTH52M71J5EV5RYJP4WKS","atts_01GW2HTH5BMHGQ8V1S10MEYRV1","atts_01GW2HTH5227GTBJWJ196HDPQS","atts_01GW2HTH56BH94DNVV1X603SKJ","atts_01GW2HTD86SDFF2ZSFSW9WJQ2Y","atts_01GW2HTY90WZEEQ9WW28WYZG7R","atts_01GW2HTY8WBZK4HSNN5SSMMW1R","atts_01GW2HTY8YC32S9G2M44B76GCQ","atts_01GW2HTY9CBWCKG837PNHG5VNY","atts_01GW2HTY9XNA0T4BW6ZC05XPTN","atts_01GW2HTAFBPKX37FX7B1Z12M8R","atts_01GW2HTBRXP8DMNEWESCZ458VJ","atts_01GW2HTGZ55JWJYW7Y8MW2NG2N","atts_01GW2HTGZ2QPFM5PX24E7AGG8X","atts_01GW2HTGZ1W8E4J39F323H1PV2","atts_01GW2HTD5YGC3N8KDNWP13G9TB","atts_01GW2HTY3DKCJ1EW72T2DNF53T","atts_01GW2HTHBHD7KJ625M5KAYAZZZ","atts_01GW2HTYCZFE4QEX128DCN80KX","atts_01GW2HTYCZTV6ARGJ2HWRJQ9TJ","atts_01GW2HTYCXQSHS44JQGQW4H6AX","atts_01GW2HTYCXEM7WQP6NWQMQMDWK","atts_01GW2HTYCVVHJ1HSA9YGZEATE0","atts_01GW2HTYCVGJ4RJ0B082ZMF5Z2","atts_01GW2HTYCS7JPYREVWT07CRZSD","atts_01GW2HTYCS3B73XS0YQNPWQDS7","atts_01GW2HTYE3QRW849FQFC1NTKSB","atts_01GW2HTYE4B20JRRZZNZ2Z58FN","atts_01GW2HTYE2N834AKJ0Y92NV6PN","atts_01GW2HTYE0YNM9TPY9Z8B9SBWF","atts_01GW2HTYDZ0C97KTRPMP672GW1","atts_01GW2HTYDVAPYTNGMFM9AFPEQP","atts_01GW2HTYDVTXV5YX3WY80CYQRV","atts_01GW2HTYDVVSE9HE7RT5W3Q14H","atts_01GW2HTYEEQVEDV1GF19YJBKWN","atts_01GW2HTYEEHN1627NWJF6P3JQ3","atts_01GW2HTYECN65JQQF58RM2XHS3","atts_01GW2HTYECW45P5AJ991ZWR7QG","atts_01GW2HTYFEN5VE12HNJPCGTBJY","atts_01GW2HTYFG58RKYKAN4Y5G6P2E","atts_01GW2HTYG7WXHA8BF801N6RMCA","atts_01GW2HTYG1A27AC71XJNTE07HS","atts_01GW2HTYG6FN1MD0Z1STY0JD7T","atts_01GW2HTYB2BKVGJZCK17SSRT31","atts_01GW2HTMSQH9737X9YPHJGFHWS","atts_01GW2HTMSEDNNEQR5NAJEAJZ6H","atts_01GW2HTKEGQ28G83DJ7BRCQB2G","atts_01GW2HTKEG2B3H168G6CJMSZTH","atts_01GW2HTYJ3ZMBPMJ362JD2ZW2N","atts_01GW2HTYJ1WV8BFS2D3HDP9CBF","atts_01GW2HTYHW7C78CE291KMHTVPV","atts_01GW2HTYHZAPJPTRC6D1VESENJ","atts_01GW2HTYHBW836QYE6VFC05SCN","atts_01GW2HTVMZJP394Y29S49FRB7A","atts_01GW2HTYK3N0V2Z9Q784SAN17V","atts_01GW2HTYK7A2848JHRA35JE3AM","atts_01GW2HTYJZ1Z1MT6B0258RWXWE","atts_01GW2HTVF3VD80J4CQ9X99THTG","atts_01GW2HTJ2JWCKT677Q71QXVEHY","atts_01GW2HTYJVJYQW0H67ZE1F6MD6","atts_01GW2HTYJVD3R3S94PS19MJR7K","atts_01GW2HTYJS79A76A60FR9W3N6P","atts_01GW2HTYJWWPMJPN5BKY7853Y2","atts_01GW2HTYJWHT2GWF90CETF9MN1","atts_01GW2HTYJW608BZWF672FGHFFQ","atts_01GW2HTYJXS5W95TDFMN7D54VG","atts_01GW2HTYJXF451P28W9X3PAKNW","atts_01GW2HTYJXTF1754JJCVQMR43Y","atts_01GW2HTYJXRS9WP6CVENAEAKSQ","atts_01GW2HTYJSJY690WB3F7NHNP85","atts_01GW2HTYK8HCM8WHGEWQF79PJ3","atts_01GW2HTYK83DWPPMEFM7NT7YWW","atts_01GW2HTYK8SHN21VX3HXQJZHD8","atts_01GW2HTYK855YJ3SD2V0YN6N6R","atts_01GW2HTYK9GWQDR8NYJ8VJWEZW","atts_01GW2HTYK9BG89K1FEGX31ZBEJ","atts_01GW2HTYK9RVWX7YVNNVT0YWFW","atts_01GW2HTYK9RP18F7DCNCFSCVQ9","atts_01GW2HTYK4MHZPV72S93H5FD3E","atts_01GW2HTYK45VXAMSF5MM78WHAW","atts_01GW2HTYK49B2YH4NMCXQRAW0A","atts_01GW2HTYK4D9FWZ3GXREYZ35PP","atts_01GW2HTYK5F6C4805CF65YHCP2","atts_01GW2HTYK57V36MJWVM5NXY2SY","atts_01GW2HTYK5ZJC0X1A4A8C7ZWF0","atts_01GW2HTYK5JKXXYKMF4A7N9HJ5","atts_01GW2HTYJZGJ3T9AJ3MRKQTPAD","atts_01GW2HTYK0BGBR33PVX7FZJKHV","atts_01GW2HTYK0XCFFN1TVCRE2YCEB","atts_01GW2HTYK02WZ5PS2KV8445RE0","atts_01GW2HTYK0WAJQ62SV2NYJKYY1","atts_01GW2HTYK1BMQGPR9CJAV8JHSE","atts_01GW2HTYK1QSTXD9TYNXVV0NJB","atts_01GW2HTYK1K9KMB3AB91AQEPNQ","atts_01GW2HTYM2M35N149T0BPAKDXD","atts_01GW2HTYKTBREQE19YK4HVZACE","atts_01GW2HTYKWT6V3YK9WB1GGKWCY","atts_01GW2HTYKYPXKHNXW9NAANQN7N","atts_01GW2HTYM05KD2YPRJ5PEDG90C","atts_01GW2HTYMEWXADG0PAK0F40D5D","atts_01GW2HTYMCG9H5079RFMQBP9TF","atts_01GW2HTYM95WKNYWR2SH4ACSY7","atts_01GW2HTYMHH50R9ZKX9ZR1PWMF","atts_01GW2HTJ6FXHKHG4TH0TMNJW6A","atts_01GW2HTYME35VYT7FY5XD0QV2A","atts_01GW2HTYMAV4VS1226T31GER2Y","atts_01GW2HTYMCSEHCQ6P5X84PTG19","atts_01GW2HTYMFB8ZC74YS70QP7VK0","atts_01GW2HTYMCMRVFM8DV4YYCA634","atts_01GW2HTYMA3KGTYVDDCR3GC8XQ","atts_01GW2HTYMFP1DWEKTWSJJE5SMK","atts_01GW2HTYMC1P4WVX4YTHFPA9K6","atts_01GW2HTYNJXJFEH90H1VTNQFB3","atts_01GW2HTYNE4W3QEXZ8HNXTP2VN","atts_01GW2HTYNCSEAEQNQD8NZN01S9","atts_01GW2HTYNGG8EKP6E0ZA0PECTM","atts_01GW2HTYNF9FNCDZ4M2D2J7J0V","atts_01GW2HTYNHAN15CSA332HP197T","atts_01GW2HTYNKBQKJD1WCYHPM8DAJ","atts_01GW2HTYNCZ0TYMBHX3DD82E5J","atts_01GW2HTYNFKTC9G72J3FJR198P","atts_01GW2HTYND4Q2NQ7ED975T0YSC","atts_01GW2HTYNH6RF7A0HHN2EPPZF4","atts_01GW2HTYNK6ZQ214Y00G2FJTFT","atts_01GW2HTYSA2KR5D3AV7GZGT20R","atts_01GW2HTYSEZAYMQP4M0D9HDJP6","atts_01GW2HTYSHTNDJ167AWK7RH481","atts_01GW2HTYSCAVJWXT2T8Z2920C6","atts_01GW2HTYSGHFDN75FJHVEMXY8E","atts_01GW2HTYSJA55MQH0AMFKGXNCD","atts_01GW2HTYSGAXBTK072W5RW4D6W","atts_01GW2HTYSEBSFK5J04Q32M2DWR","atts_01GW2HTA0W80Z5BJKK2HNXRYBN","atts_01GW2HTA0WQXZ15AGWRGTMMVJB","atts_01GW2HTA0X1ADTCVW2ZAW9JCAW","atts_01GW2HTYSC1VMZEV5HPMFQ7198","atts_01GW2HTYSBMXFWCQXS6BRQTQQX","atts_01GW2HTYSRJET02Y756D2MH863","atts_01GW2HTYSTJEZVV11VFVA4NKAS","atts_01GW2HTYT3CJ38V0KP8BAQMEJ6","atts_01GW2HTYST6EX6H9K41KMX2TJV","atts_01GW2HTYSWK89HRHDAZ1NHH7WD","atts_01GW2HTYTQBGV3G024AWPWEW26","atts_01GW2HTYTSMRCWT258B7T37NEJ","atts_01GW2HTYVFDP8NJ1W73KJ0F36V","atts_01GW2HTYVEDTTAWHM9RN6H0BJG","atts_01GW2HTYVC2X0GK45RKH7ZFCHN","atts_01GW2HTYVCEHSCY3CC1FJ4QT9V","atts_01GW2HTYVFW7RJ74JY7N9SCQQN","atts_01GW2HTYVESJF6PT4M48XG5RPT","atts_01GW2HTPJGJX5BGNT3KY81PHJ4","atts_01GW2HTPJGPFCXA4NHT0NGNZY2","atts_01GW2HTT595RQAKAHY340PATXC","atts_01GW2HTYVV99AVC3JPSRA03QH6","atts_01GW2HTYVN1YTS0EF8JAYVTPJZ","atts_01GW2HTYVSJPV0770K6YN3FQQK","atts_01GW2HTYVVTTNXB8X86YF69AFH","atts_01GW2HTYVQ2B2TSB0JQX5MJBEY","atts_01GW2HTYVVGA5XTDKSKA547CZ4","atts_01GW2HTYVQYSQ4PEA0WAMBMAWS","atts_01GW2HTYVNAE6DJR0418NEMYKD","atts_01GW2HTYVSXH5J95XHBC2F5MS4","atts_01GW2HTYVVM1FWM7AQ5SKM0AXY","atts_01GW2HTYWB030S2XA8WDMK444C","atts_01GW2HTYWB5JESN1A6RY9P00BK","atts_01GW2HTYWJCT6NXCE9GZXPGNZH","atts_01GW2HTYWHQVA0JT3QB2GAKZZE","atts_01GW2HTYWFP8ZV2S41MZFNRAAN","atts_01GW2HTYWDVX2J4XM2X019E42N","atts_01GW2HTYWQ204A57B341Y5P5ZP","atts_01GW2HTYWSGGZMX6K2856TSAE5","atts_01GW2HTYWTBAAZ72T7F91V0Q91","atts_01GW2HTYWWR15WZQKVX0FTYH7R","atts_01GW2HTYXD4YNYBJ6V7BQEJ0E0","atts_01GW2HTYXDHNZVG5J7J9ADR6N5","atts_01GW2HTYX3GSG81E5730V52WH0","atts_01GW2HTYX3TXH2MGMDJ8817RMA","atts_01GW2HTYXBN4MT9Q3620WNXSBJ","atts_01GW2HTYXB089X75EJR4SZ57Z6","atts_01GW2HTYX8242F1YGXV4TFQDDH","atts_01GW2HTYX9QCAEW9KYDEVZHQWQ","atts_01GW2HTYX6VVNCTZ95HQ5RV5YM","atts_01GW2HTYX7AH0SGJ1Z55D3ZQRP","atts_01GW2HTYX5JFDHZD0MM9SPTQS5","atts_01GW2HTYX5W07171GD4A1J3JSW","atts_01GW2HTBS3KXEQS3CK9Y4DFNZH","atts_01GW2HTYXMV9TF4RRM2CHJJN4S","atts_01GW2HTYY4QK7XZRQD4YNS76Q3","atts_01GW2HTYXX13M8X0YWN9D9YAS2","atts_01GW2HTYY23YDBERR8HPETF8NX","atts_01GW2HTYY2A7JVEHX7F866ZAYE","atts_01GW2HTYY4WS99C0S2SES6TEME","atts_01GW2HTYY0SP450ZT7EEBYY681","atts_01GW2HTH268G448PZ437XGA7QM","atts_01GW2HTE7BMSQJ6QH2XBSSM5AK","atts_01GW2HTCWVJEJ2D1GCT78EPT2B","atts_01GW2HTCWW6EBXNTET6HJYK4CB","atts_01GW2HTCWXHDMPHAP4WKEXPVTK","atts_01GW2HTQBRJANNBF91D1KA6WSV","atts_01GW2HTZ1Z8VWD97HPYCR2ZHA6","atts_01GW2HTZ20C6T9HWXC1JC5YYSA","atts_01GW2HTZ21S4J2ZER2XSSZXGXD","atts_01GW2HTZ23DHG6AAAJWKHRZVCK","atts_01GW2HTZ4S2N56NZDBQRPSNBNE","atts_01GW2HTZ4XG157VQ606V4QZ8XZ","atts_01GW2HTZ4WJVA980XKZSXNG7CF","atts_01GW2HTZ4TBCSGN18361CSAR5J","atts_01GW2HTZ4SS8807RJ3WN81PSNR","atts_01GW2HTZ4VVBAZ1SFPEBYKV4MJ","atts_01GW2HTZ4WG7ZPGPPXN5ZYDQ5Y","atts_01GW2HTZ4XZX1GBH4VHYCT7HEK","atts_01GW2HTP1PTAAABN7243A5XEAS","atts_01GW2HT9GE1S7YRXZTX40KTDH7","atts_01GW2HT9GFVM7Y2010C7C5AKR1","atts_01GW2HT9GB5FTB7DNCB71ZSCBR","atts_01GW2HTZ69R5K3XVY5CQD4S57X","atts_01GW2HTCPQKDVJDC55RYZJZB71","atts_01GW2HTZ65NNPYWDS86SWBT183","atts_01GW2HTZ678Q2AYXYV6MZJN4VY","atts_01GW2HTZ6CZJ3CJTYABBKCM22V","atts_01GW2HTCGB95DD3Q6XSF3V5EFR","atts_01GW2HTCGCKQ11XH77AD054H7B","atts_01GW2HTCGCXTBA37YTPVF83ZG3","atts_01GW2HTCGCN29MGAXFTZ7SCBPX","atts_01GW2HT9NZWNN03FDSREGX9D45","atts_01GW2HT9NZRJRQ68WEDSHMDWBR","atts_01GW2HTZ8B8KJQFQW71GXZA3D1","atts_01GW2HTZ8DG2KA8WRWXXWRDZ8N","atts_01GW2HTZ8P6XG4SAH4K8H8AZTJ","atts_01GW2HTZ8RA8FRWM8ZGEY6EN8Y","atts_01GW2HTZ9JDRSAJM9VH72GAKJH","atts_01GW2HTZ9J34TYN7MPT5CMX04V","atts_01GW2HTA1WC4Y4782JC34R7HVX","atts_01GW2HTA1Z917EBTKWEE1DXEND","atts_01GW2HTA26TKGRJ5DQ96FSYN0C","atts_01GW2HTA265RM5HXG2AM8XN4E5","atts_01GW2HTA26WF7ZJ2HDGKKR9CMP","atts_01GW2HTZB89PJARCX1VW6QB6BW","atts_01GW2HT9ZN3CWW19QBN237P2RY","atts_01GW2HT9ZN6NBZS18J50T9N4RZ","atts_01GW2HT9ZP7KB6SNJN4Q1YB276","atts_01GW2HT9ZKB76MPSYT64X9F7A3","atts_01GW2HT9YD5QMF9JWSM2HQ22DW","atts_01GW2HTZF142GYDZMG2P73VEDX","atts_01GW2HTZEZFMHTEGJ2C47S39X0","atts_01GW2HTZEYT9HX37KB19KG7R7Z","atts_01GW2HTZEW3GMK9G18JF0QN2X8","atts_01GW2HTZEVAHWX9X0CAP0E6CPT","atts_01GW2HTZETHYW1E1M89VSA2ZR7","atts_01GW2HTZET45X2H568JCVA0ZBE","atts_01GW2HTZF98K5EQ8CDDCTK9Q5Y","atts_01GW2HTZF9MQSGPJ20J1847704","atts_01GW2HTZFBZ32JKSTYQE9MPXCX","atts_01GW2HTZGDG3RDQ9FEN1WSP9MY","atts_01GW2HTZGDXA6SBDH993NGZ7D2","atts_01GW2HTZHMDEX21DNCXTFJ8KHN","atts_01GW2HTZH990PFX7CQ1FHTP3MN","atts_01GW2HTZJYZ75K6YT0XQE2PHQ8","atts_01GW2HTZMHT8B26Z7PEMA1FAFJ","atts_01GW2HTZMMN41D5ZK0S1NSC2ER","atts_01GW2HTZTGH5SC53WM0KGB5JZ1","atts_01GW2HTZTSYF4FG5WGTHK2MT2D","atts_01GW2HTJ1CHRNRSF712N2TQ9PZ","atts_01GW2HTVNSA7KM6VEHY9VGXQA6","atts_01GW2HTWWD9HHKMZZB4GKQHH3C","atts_01GW2HTJNM3SJFBH3XYH90NA3N","atts_01GW2HTWWE5F5BBKAH5DBZCVFG","atts_01GW2HTTE6JXY85TEPFE5KS455","atts_01GW2HTVB9WPHS29P5BHQ71NZQ","atts_01GW2HTVB2FVKKQZYM004E3WFH","atts_01GW2HTZWSHDDGNN7P3W4EACNW","atts_01GW2HTTN2W53SXEQ55FGHRAXD","atts_01GW2HTTN3EGYBPBTEMEHE9955","atts_01GW2HTJP50RQ9WJ63NKDCBS7C","atts_01GW2HTZXGXY61SFE0BZVF30MN","atts_01GW2HTY5J8E0686SZ0DRHT9RE","atts_01GW2HTZXWNMXVPJ3JPB67E2KN","atts_01GW2HTMDE11Y6TJQBBHSYQ0AP","atts_01GW2HV014DWTH2DBNWBQ4KM2C","atts_01GW2HV0172H07K12DW0SSEZSV","atts_01GW2HV01R699E152W6BHBCEVJ","atts_01GW2HTBN3NDVXBM9X1ESEPW90","atts_01GW2HTY59A481YH1KHGFFWNN4","atts_01GW2HTDV2B3SZANBQZSQ1ZNX0","atts_01GW2HTZBEVS86YQF1C3JBJ8Z6","atts_01GW2HTMXRVTX0WQ39Y336MJNE","atts_01GW2HV03NESRGG8QNJMAVA2R7","atts_01GW2HV3XAPS3XHH4GTX2EG3VR","atts_01GW2HV3X8CTQ88K189QFD2F4W","atts_01GW2HV3YYVTJZJ52FCDF3CFGV","atts_01GW2HTYYMYHCX3YP3RCQSEVTY","atts_01GW2HTYYMGVYJZVAKRAMZ97DS","atts_01GW2HTVTS04W92PCP0SKF74XJ","atts_01GW2HTVTP06CW3PFJ33X7KT7Z","atts_01GW2HTVYTEWWVGG5B9EN69NBV","atts_01GW2HTW4XTNMTR5PQBC81RN6S","atts_01GW2HTCMSHZ3JA4EY9FNZFQGB","atts_01GW2HTCMJTDMMP016A54PNFYP","atts_01GW2HTY9PAF7PX1CZ2RYFWWHY","atts_01GW2HTZ3W2RNE7CBPXKJQT58R","atts_01GW2HTYBP1HAME37CS0CVBSZ9","atts_01GW2HTYBXY8GK2PM45CD03SXQ","atts_01GW2HTYC3ED1CB342TJ2PK8CN","atts_01GW2HTYC5MXRT2MEV8M05JBEA","atts_01GW2HTYGR5B2EPB71K5M8SK7R","atts_01GW2HTYGNPWYV7CE3HGJ55XMN","atts_01GW2HTPWJDJVFKY35F2NQ4206","atts_01GW2HV44SRAF2SF4CZE47G8FS","atts_01GW2HV47215BZRMP5WXZPAS4K","atts_01GW2HV46QDC1G7GAME3YCXDM8","atts_01GW2HV477KGS0JYWY5QZ8GZYK","atts_01GW2HV48DZ5979PQZM58WY107","atts_01GW2HV486F3C8E0G1ADRKR6DM","atts_01GW2HV489N9F7GEZTDS5GH6CY","atts_01GW2HV486K25CJ7G0QA9ZFF5C","atts_01GW2HV48DP0MRB1SFAA96FD0R","atts_01GW2HV48A63TJCMV44J93NJ43","atts_01GW2HV48AMV0K0DK6H2AHJDH8","atts_01GW2HV48D0Y9S9EPEKHG7VVP5","atts_01GW2HV486W591GD1EGWNFBEXH","atts_01GW2HTA4MB6WEG8TS48QPBQC8","atts_01GW2HTA4STJPQE0WVY7NHWN4B","atts_01GW2HTA4XNKHDPVZZC3MZX0JD","atts_01GW2HTA542MHAJGT49XFHTME5","atts_01GW2HTA56CEVT8TJRXP35YM72","atts_01GW2HTAEC3H11F8CRY5EKM0CW","atts_01GW2HT9DE6DGEZK8HA00HDCXD","atts_01GW2HT9DE0S6XZND8PV535M62","atts_01GW2HV4BT8DXWXA6GSY9TP4YS","atts_01GW2HTXNMVTZPKQFFCNJKTQ07","atts_01GW2HTXP4GTSW2EDX89DQ6Y6B","atts_01GW2HTYP1G6Y5AP7F9QKZVG0B","atts_01GW2HV4EPHD217NF5QC8JK6BM","atts_01GW2HV4J6T7BFMZR5DTZX5E63","atts_01GW2HV4JGQXEPR3MBPAMRFYE4","atts_01GW2HV4MCMG4CHFQBZJZTZCQ8","atts_01GW2HTHCGPBAWSP240A03V0BM","atts_01GW2HTHCGCADK2W27XW7JYNAJ","atts_01GW2HTF8C1VRWTJ3EJABEBEA9","atts_01GW2HT8NMHFCPHZB96RB8AKPW","atts_01GW2HT8NMC9QXFNC7S6N0BMEB","atts_01GW2HT8V426EXXMAEWJWS596A","atts_01GW2HTAYGGMXMXK1TRF45RVCR","atts_01GW2HTD4FEGPP7ASYMQ8YVTT5","atts_01GW2HTD4D6D7MBEY4DVM26XZ5","atts_01GW2HTBR96PPF9XGQ05D9Q35T","atts_01GW2HTBR66QEBKRWMB28K5B1J","atts_01GW2HTASZ0V3JZF49B2ZK5A0Q","atts_01GW2HTKZ1G52XDDMWH31A4Q1B","atts_01GW2HV4RXZYTEE1K2A4XXFRQ1","atts_01GW2HV4RX0R2CW2K0D2P1S1SX","atts_01GW2HV4RV92K6MW81N6Y6SBKP","atts_01GW2HV4RW5TM23A07BV3HY9HK","atts_01GW2HV4RXDR8SWVMSVG5JDTCH","atts_01GW2HV4RWKVBRQWXP1MMBAYZA","atts_01GW2HV4FJ89XEX9J8XSVJDYYC","atts_01GW2HV4YTGF8J30AB2KFBQKDP","atts_01GW2HV4Y50ABKBAPCPZVRQBE7","atts_01GW2HV4Z1FT8E1Z1E80DQ8F3N","atts_01GW2HV50KMFSB1GJAEFB77X64","atts_01GW2HV50K66N2JKTK1NRH9FZ2","atts_01GW2HV50N4G2C08A729N6G6JE","atts_01GW2HV522NF6Z1VB89XV038M0","atts_01GW2HV529EVV8Y7JEBEG948SG","atts_01GW2HTD2N0R1J2YF50PMF5JX2","atts_01GW2HTVXBPR50MW7S1K8ZSCZV","atts_01GW2HTVXM8G5KSPPZJ6NMJF9W","atts_01GW2HTVXMHT1XX3EF1JJX6HZY","atts_01GW2HTBBNEZ60Y6DC7027VS48","atts_01GW2HTABSK1PGS957FN3BQT2E","atts_01GW2HTED0Z5X0R0JE1YJT6V54","atts_01GW2HTDGQJPW3S5WJEZMET8AX","atts_01GW2HTVKGD088N70JMRESQEVB","atts_01GW2HTVPZ6WNRA5DGEPTQ75SM","atts_01GW2HT9FHVJFJBZP4EX2Q02D6","atts_01GW2HTEGWTAX21CH5CG1CKVV7","atts_01GW2HTQC24BAE6K4PSVSFSHGA","atts_01GW2HT8MWES8ZTSWM32PVZRBP","atts_01GW2HTC6PDK05WRD6AZ9WNVJ3","atts_01GW2HTJ6G770N8CWPS58W4DVZ","atts_01GW2HTNZVRX7D443AP9K15KVT","atts_01GW2HTJ2K18J6PNZWM3R3KJJN","atts_01GW2HTJ2SF9T799HX9NDB5V3R","atts_01GW2HTJ31FC08B85X7C4MVT57","atts_01GW2HTJ34JXA2T8RPXQ216BHH","atts_01GW2HTJ37HQXVGJSG79Y0FHW0","atts_01GW2HTHNJGYQ5PPPSEW0CGXXC","atts_01GW2HTKEMG12KGKM2H5DKP4HR","atts_01GW2HTP4MDN1CEK95VGB690V7","atts_01GW2HTZ0TDHSN0BBQ1JPVQN63","atts_01GW2HV5FXY1RCTN5V9WSJ0F43","atts_01GW2HT9SH14WNFHJ0CWQJHN47","atts_01GW2HV01YRSVRCZ7GXWKQY743","atts_01GW2HTDNJ7CN2KHXAFBKK6RTJ","atts_01GW2HTXP0XPRG6Y0WGBSJPNQH","atts_01GW2HTXP0FH1B1GQ1XR7H4X45","atts_01GW2HTXP3HKT2SJV0JEAHBH50","atts_01GW2HTXP97YKWKNCY16WAVXVH","atts_01GW2HTXY1TQK5DW1NRDEANMZ2","atts_01GW2HTXY7K8FMXJ1GY4VP8V47","atts_01GW2HTXY53Z5GCSG9D05PAE80","atts_01GW2HTPD802HV22PNWV7N6NNK","atts_01GW2HTPD9KCTBKFQ1KZ0RQZ7R","atts_01GW2HTPDGGM0VRMZWVW8QCW6Y","atts_01GW2HTD8DDEJG7S5BZWT9DRGM","atts_01GW2HTBRV8Z6K8845021QS9EJ","atts_01GW2HTBRYBQQF8NBJMZBPEPX7","atts_01GW2HTBRZNT1TEMMBVG896GV4","atts_01GW2HTBS35J1CRGQ4V35VGMR2","atts_01GW2HTBS3N044DWJY845015J6","atts_01GW2HTXNQYZ0Z3GWD8BV449HW","atts_01GW2HTXNMJBX12WCNES4NRF4G","atts_01GW2HTQ7M3C2PEH8VNQEGC2SW","atts_01GW2HTPKXYZVEN5NQVK9NWWZQ","atts_01GW2HTPKWRWQVJ9REPW770DRP","atts_01GW2HT9JRPMXY2A38EP9HN2RB","atts_01GW2HT9JTZQHTD7BSAKTEH743","atts_01GW2HT9JXDAV4BTGKTY133HR7","atts_01GW2HT9K1J9R3J7391MDD0RNG","atts_01GW2HT9K1J1A9WT8AFW0Q7H3Q","atts_01GW2HT9K31CVKNB55BXAP9H4W","atts_01GW2HT9K5NN2VH66PEGEFGMKQ","atts_01GW2HT9KA8XH53QMDDCZE29JH","atts_01GW2HT9K8XZTD56JJS6X4P8VR","atts_01GW2HT9KQXHP6KT2HQ4KBZAC8","atts_01GW2HT9KRDQT8ZK7FJTB61TJG","atts_01GW2HT9KT09FM5DJJPA8EAK7J","atts_01GW2HT9KTFAFJH8K569GSM0YE","atts_01GW2HT9KZ7ET5VCYXQSTXZ0P9","atts_01GW2HTTAH6REWJ57YMJB8AYDQ","atts_01GW2HT97XHGFPCG52VTMSV6DA","atts_01GW2HT97R2AZX98XX2FXDTTM6","atts_01GW2HT97ZRQ0KBDZA6W9FTXP8","atts_01GW2HT981RQ5E5B9TCWJ43104","atts_01GW2HT98EJT1DZZY2KSXM62K9","atts_01GW2HT98A4CZQS78HWS635MVK","atts_01GW2HT983QXVK0XKQFVC98JJ5","atts_01GW2HT98DBR7DDQHQASDHYGE2","atts_01GW2HT985D9Z5ET7T6V15QBCK","atts_01GW2HT985S2M0QQEDDY88PS3A","atts_01GW2HT987HQ8KS1NE7CZJ7N3T","atts_01GW2HT9871YJ4G1M7H5DA955Y","atts_01GW2HT9894Q3JPAX58FX1GFBP","atts_01GW2HT98B9BEVTCKND8Z9RWT2","atts_01GW2HTQ31KZ1A4N8E28X2MBJ0","atts_01GW2HV5JGDN1N7KA2FZ17MRTC","atts_01GW2HV5JGH7XQDA659CJTG734","atts_01GW2HV5JH7A9D6YGH10WSHVPT","atts_01GW2HV5JH55GZKNWHNJQ8Q0HH","atts_01GW2HTN0NTPWXAGGXC8WDZGE7","atts_01GW2HTN0K3RVXP9PD8HSHFX7P","atts_01GW2HTN0QWKTYY8PBRNSSA3TA","atts_01GW2HTN1157YEQ0AAHNYEMENS","atts_01GW2HTN1727KRY5YKSA6HJ5AC","atts_01GW2HTK7S4BF8Z3NV3QRH2XVF","atts_01GW2HTK7Y7SN3HHHXQ3BKBPY8","atts_01GW2HTK7YZHEG44D4F9M2PYN4","atts_01GW2HTK7ZMFG2YVQPDQ6FMPQ5","atts_01GW2HTK7Z55QGMVA82YHSHJJJ","atts_01GW2HTM648G1MWCKKFM0TCG7H","atts_01GW2HTM65J0J2M7J3KGHNGMDR","atts_01GW2HTM66H68NBMS47F8J6S83","atts_01GW2HV5RFGJX8SFWQQJD2ARNX","atts_01GW2HTJ4JG1RQX57J2C4ZEVE8","atts_01GW2HTJ494P0M58H9T477DNM9","atts_01GW2HTJ4JYNXWM4BG64V00MGE","atts_01GW2HTJ49RHX25QKN5B2FBXHC","atts_01GW2HTJ4K6B87A74SPV8AQRXW","atts_01GW2HTJ49EPA3R3T4CXXVC757","atts_01GW2HTJ4A1CRZK1WW44WJP6MK","atts_01GW2HTJ4KMFM7GYCJ3YYNYZFS","atts_01GW2HTJ4BJH2AMX1RPE15X6P9","atts_01GW2HTJ4BP5GMH9H4QQ7PBQJ5","atts_01GW2HTJ4BWTR6M9FNKAZ282XC","atts_01GW2HTJ4BFF9H35PT5925N12R","atts_01GW2HTJ4MMWE9C6YFRN5ENMND","atts_01GW2HTJ4CDQBF9ATD13W5NWRD","atts_01GW2HTJ4QX2FM8214CQKSSCJA","atts_01GW2HTJ4QGDBGD3WAJRQ1SQ6N","atts_01GW2HTJ4CDM207RH8Q2CT2GDJ","atts_01GW2HTJ4MZTAP7RDB56CS4RG4","atts_01GW2HTJ4QQ60JWRRPRG66T7P2","atts_01GW2HTJ4MTPCF4XGDTM64J7TG","atts_01GW2HTJ4DKAAB1YGJWADVW34B","atts_01GW2HTJ4Q173C3XFTP2141HY3","atts_01GW2HTJ4NN6GZQ9EA4EJCMHFH","atts_01GW2HTJ4D0Z5900SYBG9AH9X8","atts_01GW2HTJ4HMWJZGY43VXQRQVKV","atts_01GW2HTJ4PSJKX1Z09A5S2EYYP","atts_01GW2HTJ4H3A534W9Y47VQX1VY","atts_01GW2HTJ4P5SMXB6EQ7X7YCRTP","atts_01GW2HTJ4PVW8KEJYEQAM68FMF","atts_01GW2HTJ4H806SBGTDT9N7EEQH","atts_01GW2HTJ4FWS9PWQFX7R8MS095","atts_01GW2HTJ4F9S7JAVXJ3QFN963H","atts_01GW2HTJ4G5V23PFETBSX28ANF","atts_01GW2HTJ4GYEBHCH1BVYV2QF6B","atts_01GW2HTKZHAEDKGGTGX5PN1E8S","atts_01GW2HTKZH4J6T852Y4NPV438W","atts_01GW2HTKZJMAJWS03P12WWG5D4","atts_01GW2HTKZJ441J90ARTVV9QHCZ","atts_01GW2HTKZKS7GDMZAHSKXQ25FC","atts_01GW2HTKZN8B0G8XVY61NJXJ1N","atts_01GW2HTKZPXR5BSM5KJVC2AZJ0","atts_01GW2HV5SS4R6HBYNW39HVB8MJ","atts_01GW2HV5SVWRQ7AVGERFF67003","atts_01GW2HV5SQVPBE81C90DQ27YDK","atts_01GW2HV5SS58E17V0PY0ZEJ8Z4","atts_01GW2HV5SVT3M7677MA7DA1X93","atts_01GW2HV5T68365GDSYAJNKHWDG","atts_01GW2HV5TE4KD7ZQ58X4X6WSWV","atts_01GW2HV5TE18RZXZV4C4WAF515","atts_01GW2HV5V7MK70YTB5VY3WDAKS","atts_01GW2HV5V8XXDT1P0WW99WNCJM","atts_01GW2HV5V8BZ8S27R9Q60YGSF0","atts_01GW2HV5V9CEX0NVV9QN3HFTV5","atts_01GW2HV5V9VJBSMPHAKTZY2K6K","atts_01GW2HV5VDDNY88TM2P9VP9B8Q","atts_01GW2HV5VEQRVVQT6CHTXY4CTV","atts_01GW2HV5VV5G3FB3XQYCBJWVKJ","atts_01GW2HV5VVN9Z6RDYK0XDATKHB","atts_01GW2HTH0GETZ2R3AHY6RGMXG3","atts_01GW2HTV38SBXA63Q136WDEBEG","atts_01GW2HTV395DQRVWX64AK436PE","atts_01GW2HTV39NMYJEA59CP70Y8PG","atts_01GW2HTV377S5TD1QQVB1WRC5J","atts_01GW2HTV37CG57EP4GRNSK86G6","atts_01GW2HTV37E5MGV2ZP15JJCQQZ","atts_01GW2HTV36Q75SXQ4RS18K64KE","atts_01GW2HTV362CYP612RTPKY3R66","atts_01GW2HTV34XB9FNHE84EVGNBXV","atts_01GW2HTVCZKS1N6134RJYYQJB5","atts_01GW2HTVCS9VM3RW8B3GPDVF6J","atts_01GW2HTVCTGM28NS8YGRS2K6ZT","atts_01GW2HTVCYVN6NVH3BBRN4DSB1","atts_01GW2HTVCVM6ECMG97E6Q6R1HD","atts_01GW2HTVCW4KZPMRA6C8BHN228","atts_01GW2HTV9T2GA412FWJJTN89BQ","atts_01GW2HTVDCGX5CK151XQ72YYVR","atts_01GW2HTVD9837XC8D708X54RDG","atts_01GW2HTVDG1MHJ6JTHCK88901Z","atts_01GW2HTFMA10H7R5CK40QAEXFG","atts_01GW2HTFMAPKB45K96X61J6KWY","atts_01GW2HTFMB4D6NEWV1P65BAZA9","atts_01GW2HTFMBWYCJXH4Z0K312X53","atts_01GW2HTFMCM84XMEWKQABWXG5S","atts_01GW2HTFMC9VYY4T30537RQS3D","atts_01GW2HTFMDC7JSTPG5E8CR1E4E","atts_01GW2HTFMD5YQCGB5M922PCEM9","atts_01GW2HTFME9V49KB7Y4BXRH7B9","atts_01GW2HTFMEYFMEYTQDVYJ3DY1V","atts_01GW2HTFMFE76CWBGMM5HVWYNS","atts_01GW2HTFMFY5JGKECVMYSCE2Y9","atts_01GW2HV5XT5W9X0H90EHYV3317","atts_01GW2HV5XV44D9F670EGFZ4Q83","atts_01GW2HTV9C3VTV3BKBX6C63GPX","atts_01GW2HTV978V6W8299QKXQSD4K","atts_01GW2HTV9AMRM2TEDQGNQF1ZCF","atts_01GW2HTV9FEZM7D7TWKB51VFYN","atts_01GW2HTV9GJKJ144KVE1VAM83R","atts_01GW2HTV94BKGZ1DQ46DN1R1B2","atts_01GW2HTV9DQMNSPEC3AVVXAGG7","atts_01GW2HTV96GASBNS9DGMFSCC6C","atts_01GW2HTWV8HMH3YT8JH779HRHD","atts_01GW2HTWVJ5C016WEJBX5Q7GEE","atts_01GW2HTWVJX8ZF8E1Y95ADA7T0","atts_01GW2HTX36KRSA99HZ193KSNJH","atts_01GW2HTX36KW813ABX59EF9D1S","atts_01GW2HTX5P5TXEN7E9Q23SCVW1","atts_01GW2HTX8RWCKTK8SFQ1HQEWKP","atts_01GW2HTX8V9TN0SVRRDXG3XMVH","atts_01GW2HTY8WBPXY1MHJTKD7R1Y2","atts_01GW2HTY8YZ664ND2Y12N2QCQY","atts_01GW2HTY8YZGTX8KB62QYHZBPX","atts_01GW2HTY91EE4R77ACC8J2VYHJ","atts_01GW2HTX8VSWPKR8GGWDV5YAVX","atts_01GW2HTX8R4VQ8X5KSAR9TZAFP","atts_01GW2HTX8SZRNCCVKWTFZNJ5NG","atts_01GW2HTX8TEK370MWT9FNDBD4X","atts_01GW2HTTAYRA5W4XDB9CQMDNDD","atts_01GW2HTTB3NHAC4E0D4A3CXCWS","atts_01GW2HTPVWEP2PQZC2Z05A2SSK","atts_01GW2HTPVVNH3X5F2KV38JKC0D","atts_01GW2HTPVW4V97E402ZFPXSX6T","atts_01GW2HTPWPHDEVK93VY9HEHV6R","atts_01GW2HTPWM8F9BF0G4T8QH7NAG","atts_01GW2HTPWH3K51F7W26Z66YHPT","atts_01GW2HTPWH8WJVXS06XBDXAXS9","atts_01GW2HTPWHYAZPD23QMRMBB2T1","atts_01GW2HTPWJJPAZMM2TK2G0STHJ","atts_01GW2HTPWKEXS2HDZT5N3YEYTW","atts_01GW2HTPWPEX93PKVBN4TZ283K","atts_01GW2HTPWN23CWJE16WNZD6Y33","atts_01GW2HTPWPTJG34K73NVMA4H6M","atts_01GW2HTTPQS6T4010JV8BTXXDW","atts_01GW2HTQA2CHCZ80HJXN2Q7HSN","atts_01GW2HTQA2K5SQHYYC91TBWBJ2","atts_01GW2HTM4P234DDQK302VE1YHX","atts_01GW2HTM4PVBM5R7F49NRZ2PBH","atts_01GW2HV5T58AWN1501S44XHAD8","atts_01GW2HV5TDFQW1NE3F0AGMGQVQ","atts_01GW2HV5THENMP0CX6HB78436Q","atts_01GW2HV5TBCWS2G7YQK5CZFPJY","atts_01GW2HV5T9EF1S383FN7G9G017","atts_01GW2HV5T7AEXZG41CBHEAKSWC","atts_01GW2HTTC3PDY11MS2Z5HB3PXJ","atts_01GW2HTTC3KCBXAPYR1TGTFK5Z","atts_01GW2HTTC1RH2J2G7BP09TWM1N","atts_01GW2HTTC2M9M5ZTR4CAVG3G64","atts_01GW2HTQ8NJCG37E4NM94M2TTT","atts_01GW2HTQ8NF5414WA4D0SMEWAJ","atts_01GW2HTQ8QWDB6C3B44W5YSMMH","atts_01GW2HTQ99ZNABXQ2588QV665X","atts_01GW2HTQ97MYCFVJYPX2CBEHE4","atts_01GW2HTQ8Q043WVAM4QF0Y0NP7","atts_01GW2HTQ99FQZ2MPBYDCMZQBZ3","atts_01GW2HTQ98D8WK1A5SY1SYSQRF","atts_01GW2HTQ98RYG00HQFKK9RVJME","atts_01GW2HTQ8R6RSTFAN83CAZRPKE","atts_01GW2HTQ8TX18NHBRSK47G8T82","atts_01GW2HTQ8W92JY8J95MJDY997P","atts_01GW2HTQ8PDHJPTT6MVZ0VQF4Q","atts_01GW2HTQ8RE706H6A5G6X8VB5H","atts_01GW2HTQ98RJ372QR489Q7E0RB","atts_01GW2HTQ8TQ8G9S1VS7QMTHA3K","atts_01GW2HTQ8Y4ZP0TKM4HKG9DEQ2","atts_01GW2HTQ90J6QADH0ZQC1F66Y4","atts_01GW2HTQ90EF7KBFS902D690XR","atts_01GW2HTQ92SPA63X1PCM9RF06G","atts_01GW2HTQ93H1TWQNR3KTZGM19W","atts_01GW2HTQ94TT3TEBJNTSJRRYJ4","atts_01GW2HTQ947WB6FA07YFP1RYP8","atts_01GW2HTQ952WBBTHNWGQ0R3NE3","atts_01GW2HTQ95B0FC554APD5QHW34","atts_01GW2HTQ9678WYA35M86FM8HD0","atts_01GW2HTQ963VGQXA7HWN9EGCZQ","atts_01GW2HTQ9645ABQ6JQQZTJ6A9V","atts_01GW2HTQ968A4RNB3CPDBY8NYM","atts_01GW2HTZWT606Y0MED5RS3HSCP","atts_01GW2HTZWTNR2S04YB6ZZX0Z6D","atts_01GW2HTT5WJ6Q6C8K82PM36B45","atts_01GW2HTWM2MSSZEZKW67QGNZPS","atts_01GW2HTYAB3449TV85TA91C9B9","atts_01GW2HTJMAXFHVSWCS2VT4ZJ2W","atts_01GW2HTJMAW6S96SDKPJ666YA6","atts_01GW2HTN8Z5AZMZVYTXQHYVR1Q","atts_01GW2HTH1PN2CJVMD43CYBDVXB","atts_01GW2HTPZ1P6HJR945GFFV9D64","atts_01GW2HTDV0Q1KHZWBZAJ3PHRKH","atts_01GW2HTHS1KV8JX8EB8ZCM3809","atts_01GW2HTHRP18HKV3HPWDQ1110E","atts_01GW2HTHRWGR0CTTNVVPCKF0TH","atts_01GW2HTHRY0PNYKFXD166PFD6R","atts_01GW2HTHS1M54PVTBMG8THFQBH","atts_01GW2HTJH698GF84ZXJ60FS0ZD","atts_01GW2HTJH6SX1H27HEMN2J1G0X","atts_01GW2HV64YXMWCFE1T41M6FEQ4","atts_01GW2HV66MQSY6CKYJR3MKFT0X","atts_01GW2HV66PQTSM9EE78W5QA5R4","atts_01GW2HV66R9Z33FGPRQEW8APQP","atts_01GW2HV66SRF8VRPFC4ES9D1GJ","atts_01GW2HV66SY1A0YGM21QSTNN1G","atts_01GW2HV66RNN3CPPXBZ505XQKK","atts_01GW2HV66MGRDG2B998T0XJJ4F","atts_01GW2HV66PCJAQ04TV0D59A92C","atts_01GW2HTJM1B2PGJK1H2H1K92X8","atts_01GW2HTJM469S8KX5NM1QWZMA0","atts_01GW2HTETTQGKBCNVQWPA4RCYF","atts_01GW2HTETR0TA3VMT6B81TGDTT","atts_01GW2HTETWJNSEB1V0CEHWJNC1","atts_01GW2HTEWWSJNQK70R9PJNMPRN","atts_01GW2HTEWSW3X3QWNDWFRZ6EED","atts_01GW2HTEWN0E84VS8XMQB6D3CQ","atts_01GW2HTEWJQXWWZGEE7SGTRA1J","atts_01GW2HTEWSMQFW0W8ME0MC5CF3","atts_01GW2HTPYJXTFV6HT7NRDSQ71F","atts_01GW2HTEJQ5HR5JMVQ9K23YVY9","atts_01GW2HTEKV26YK2CWF5W2E1XJM","atts_01GW2HTBG0TF0M5KJMYB266ZX5","atts_01GW2HTNNHWVWGK52C38TR8ZHW","atts_01GW2HTES0J3KEXY7Z296H9MQA","atts_01GW2HTERN4ZVKEQP5NAB3S5NN","atts_01GW2HTNVKDR0Z11BB4DT7PTHF","atts_01GW2HV69N1A3E80EAM0H56B2G","atts_01GW2HV69N1T7R8DS33F83CBFA","atts_01GW2HV69PW3XVC0QWTBGV8J26","atts_01GW2HV69SVE16CTPSS0KPSKG7","atts_01GW2HV69SEXVJPGN0Q6FEBNTQ","atts_01GW2HTM6FAW0FXSYEXCCEWZQQ","atts_01GW2HTM6GPCSSXHP0HYFAGNJ4","atts_01GW2HTM6JNVJKJ71PXGCJZR9Q","atts_01GW2HTM6JRJRSG5665E9PHT23","atts_01GW2HTM6SD4T0ECFDV70G0XBJ","atts_01GW2HTM6MAFZFEMWJZEGBZPHW","atts_01GW2HTM6N4806MKZ23FKF8JK3","atts_01GW2HTM6SC27HC4KEGT7JQQV6","atts_01GW2HTM6NYNAYY731RX2TN0X0","atts_01GW2HTM6QGNP9N0QMV7D9NKER","atts_01GW2HTM6Q4Y2AR274KGTEP18S","atts_01GW2HTAV2N7F9V391TQFEGX0B","atts_01GW2HTAV3GV0RM1B6ZHF8Q3EZ","atts_01GW2HTJ9J1QF84HS37EVPW3EB","atts_01GW2HTJ9KHE5MH95TSF6NX4G6","atts_01GW2HTD1A3WSM0CQSSC1262W3","atts_01GW2HTVYTGM0DDZCA1V6GRT1K","atts_01GW2HTW4X00RFBPFZKDNJF3CJ","atts_01GW2HV03TAARSPRJ073GQWN5J","atts_01GW2HV4988ED38NJYX7FV79PB","atts_01GW2HV498RVC4R0Y6X4E37TXE","atts_01GW2HV4981K5VYJ6EZTPMN5EA","atts_01GW2HV498G3XDC7C23AJJ3FCK","atts_01GW2HV499HW74038XEQR6H58T","atts_01GW2HV49A18EJMT8WW8QQF9JH","atts_01GW2HV49AQH2FWVNV7D72WZKS","atts_01GW2HV49G62MEKBW7GX5AZGNC","atts_01GW2HV49GD652TD8AHTBHQN16","atts_01GW2HV49G1AEJ90JZ49Y2W3P6","atts_01GW2HTTJEZAH8BXV84JX2BJG0","atts_01GW2HTTJ75WQJZNNXBWH2QJ0M","atts_01GW2HTAMAJDSNBEAD2V8M3DZX","atts_01GW2HTKT6AH34CM4V2WQWHZDJ","atts_01GW2HTKTBC2RFP3X42AGV3K30","atts_01GW2HTKT8AD7KYRZHXV643JBK","atts_01GW2HTKTDC97ACBF3ER6Z7M6Q","atts_01GW2HTKT67DTAZCZBJQ60QNKV","atts_01GW2HTKT8M1EFPM1XSTSCMDK6","atts_01GW2HTKTBCA3Y3611DBRWP1F7","atts_01GW2HTKTDG01PNYRRX6MEGC8H","atts_01GW2HTY9SG50D9Y3TXA8W8FBH","atts_01GW2HTY9VEKY33QZ9MXK4VXB0","atts_01GW2HTY9WZSFA3QFSSQAGCRB4","atts_01GW2HTZ3GCY64XVH9QMMXAPZJ","atts_01GW2HTZ3GA36JE0GGM1VRCHES","atts_01GW2HTZ3HT0NT76PZX5693V9T","atts_01GW2HTZ3HX8T7Z0J03ABN5N93","atts_01GW2HTZ3EEZPH3MSDQ61QBTAF","atts_01GW2HTZ3EN87AB42HKRGNHFYA","atts_01GW2HTZ3E1QKPMSAD9CPCABDB","atts_01GW2HTZ3TZW91E4W2SN5B3SV6","atts_01GW2HTZ3Y3WH3P7DBA62EHW51","atts_01GW2HTZ3YD0ZF7H8Z7NNV71ZD","atts_01GW2HTZ3RXWVK4J6J0M8RXD7M","atts_01GW2HTZ3SJ8E0FQ7XNYFHFH6C","atts_01GW2HTW90S265THPJ9QP81SPY","atts_01GW2HTW922H465QEVFV7KHX2S","atts_01GW2HTW92WQ80D7SXEY8HBT2M","atts_01GW2HTW9441ZSKN09XY795Y3J","atts_01GW2HTW95BV70S3KJK6PS3ZKN","atts_01GW2HTW97XGC1HJEM9BJP84AQ","atts_01GW2HTWRXC83YSJHT1FCA12TE","atts_01GW2HTWRXS3A0C0GFVP79ANG2","atts_01GW2HTWRXCN0R7GKVE0EWBXBW","atts_01GW2HTWRXKVHDTSXFBM3NME2C","atts_01GW2HTWRZ6ZW1HNDXYP4NY35Z","atts_01GW2HTWRZCNKBQSNQM64AY9MJ","atts_01GW2HTWXSGA8BPPS2H2S60BM3","atts_01GW2HTWXVEC3Z1XYAEK4DQP7M","atts_01GW2HTWXJT1K0M52916YXGSFP","atts_01GW2HTWXJGH1XGG369S96VQ4P","atts_01GW2HTWXTZ9AM73N8MSEXYYKX","atts_01GW2HTWXVK0YKVYR2P0DVESF8","atts_01GW2HTWXKG6JT27GEW1MMC5XV","atts_01GW2HTWXTV0NX5CFFD23WDJZ7","atts_01GW2HTWXQTAD1CWNKMA15X4CJ","atts_01GW2HTWXQ466KM1AF03J0NR50","atts_01GW2HTWXKEVZ9TW6VK479ZJNW","atts_01GW2HTWXPH92WRPMX8CF8W71M","atts_01GW2HTWXW79586R40D0Y7E3BG","atts_01GW2HTWXRRGP0EV5QFWXWTPFP","atts_01GW2HTWXRFQMK62NVRYPBG9MM","atts_01GW2HTWXWHTWJ7YY7173M21YN","atts_01GW2HTWXHGZDSVPVYTPQERBES","atts_01GW2HTWXHP6WC5D8HEEZFA5FM","atts_01GW2HTWXH8PSJV9G3WNEQDVB4","atts_01GW2HTWXGZH721CW7FKZTW7ZW","atts_01GW2HTXBXAXW0AKDK5XJRYRN6","atts_01GW2HTXBXS1ZCM2S9QV92BTZ7","atts_01GW2HTXBYW106GDCW7AK34B0K","atts_01GW2HTXC1TYVE7NM9CDZNFMF8","atts_01GW2HTXC159GAA8201X246DTG","atts_01GW2HTXC1YA9ZGKHVD93T4Q29","atts_01GW2HTXBZEP3HSRHZZ1DR7Y2V","atts_01GW2HTXBZYK5X5D42ZW6QMVVR","atts_01GW2HTXC0DTERX86CG0XZFJAP","atts_01GW2HTYBPXBDYQP8WA70Z0GXB","atts_01GW2HTYBQ5JR7AR7D990KQTS9","atts_01GW2HTYBQ3H43F4P2DV4ZCZ33","atts_01GW2HTYC7PS79TRX8FG4HRZD7","atts_01GW2HTYBSF9D7MTWR4RJSWCMY","atts_01GW2HTYBTZ886M9JTRPZPVBNA","atts_01GW2HTYC7C0E9JJ80D27RRY27","atts_01GW2HTYBTX83R4KX10S12VFE1","atts_01GW2HTYC7SKXVJM0R0E4K623M","atts_01GW2HTYBVQN1FD9ZYS7261HXQ","atts_01GW2HTYBWAA83M6RXKR1NBSPM","atts_01GW2HTYC3XB5494XK0J0Y1C08","atts_01GW2HTYBXX0QG5YB0CCWCT1YW","atts_01GW2HTYC507PP97CWKEC1MG9P","atts_01GW2HTYC5S1A0XDY8VNFXY5W4","atts_01GW2HTYC3AYPXG8Q49VDCVMR5","atts_01GW2HTYBXKFFEQJ0VRBY4NKV0","atts_01GW2HTYGS0TKG6G9Z4SB69807","atts_01GW2HTYGNW50M3BM1DCYKE0R0","atts_01GW2HTYGP4QVD025P5TRQ81WQ","atts_01GW2HTYGSRE8XC831JTAWGXP7","atts_01GW2HTYGT8SGDMBWA74EBHW5K","atts_01GW2HTYGM4R9W4WPBWM869JCW","atts_01GW2HTYGWK7MNPS8MJ8DNGTY9","atts_01GW2HTYGV6MACYGVZ4428ZP5Z","atts_01GW2HTYGMMW3WGB5CCB4JJ322","atts_01GW2HTYGW3T1MHBWGCGE9RCXF","atts_01GW2HTYGQHHHNAJARNP6KB7JC","atts_01GW2HTYGQGJ8EDH4PTKWGT58C","atts_01GW2HTAJT74HJ96VSH51FAYGC","atts_01GW2HTAJT6ARSFZG2456CHTK1","atts_01GW2HTCMKZMHHKDJV8BKC601P","atts_01GW2HTCMWXEWM5RBN8BMQMBZ5","atts_01GW2HTCMZ5K8806SGMPRADE9X","atts_01GW2HTCMN1H081Y6G5V2YWAP6","atts_01GW2HTCMZYNZPGXEW0WCH1Z3C","atts_01GW2HTCMNZTACTACQT96WV8M4","atts_01GW2HTCMWNN48DDAQAC2GCCTJ","atts_01GW2HTCMQYSAN46S1KB8W4APF","atts_01GW2HTCMQHWM7Q9HPNE0MGCVE","atts_01GW2HTCMTNP00FV9VYBPJME0Q","atts_01GW2HTVV3SN9GN2ST4E58Y9Y5","atts_01GW2HTVV5HVTX9X8D7EXJ1BAR","atts_01GW2HTVV1HTAT3S3M9ES4WVA8","atts_01GW2HTVV1JFY1N21H9BARPZA9","atts_01GW2HTVV3FQCYZQHJBT3VA8Q2","atts_01GW2HTVV522MV81DRZ6DFH45A","atts_01GW2HTX0TT5AVNSQCPE86E1WT","atts_01GW2HTX1A491R9C0ATPM2F80Z","atts_01GW2HTX17ED37XMWZX4P39W1E","atts_01GW2HTX152024V2FVP8EBQE3C","atts_01GW2HTX19FC0CBXBPS4235ZGS","atts_01GW2HTX18R2W793DXAD0Y1WEE","atts_01GW2HTX13Y9TSYXHB4ZFYE04P","atts_01GW2HTX0Z4FBA7ZQ4R5XFSPM4","atts_01GW2HTX0V305E3E4K4ZB9ZSM6","atts_01GW2HTX0X9J080320KCAGP9EY","atts_01GW2HTX0YACHDT14WCVNEFQ9N","atts_01GW2HTX141SBH5BV1B8S7WWDY","atts_01GW2HTX0SHRPZKW1JKT81F4BQ","atts_01GW2HTX1ACFMFJBJE0RZ968QY","atts_01GW2HTX19SPKY23Q7KVX5G36X","atts_01GW2HTX18687F2BGXYB6PK54R","atts_01GW2HTX0TGJ7AJBFM88P0P9FP","atts_01GW2HTX0X2S34Z00WE2JADKD8","atts_01GW2HTX0W7X43FGSNYXXNNMQH","atts_01GW2HTX17KF285TFSM5RCY4RB","atts_01GW2HTX16F8M1B4GFFKG6QZFP","atts_01GW2HTX1464PYXP74DJB54SRP","atts_01GW2HTX13HJ9W56N8J0AR2M9Q","atts_01GW2HTX122W8B50SA7V74P41A","atts_01GW2HTX0YKT1PMKG31K4807CK","atts_01GW2HTX0S1MF50TB4AYR3FKCY","atts_01GW2HTX1BQQ35D4TX05T12860","atts_01GW2HTZK1Z8TTN8YV76Q5BZQC","atts_01GW2HTZKNYDPTQFTD6BPF2NK3","atts_01GW2HTJF5TR1CWXMT644MWV3D","atts_01GW2HV45TRG27BWR2A6AMJ3AP","atts_01GW2HTZ592GPPP3ZS13B7X2JZ","atts_01GW2HTZSSGMSAS97P136R5M70","atts_01GW2HTZT8J746VKYN1KJW244P","atts_01GW2HTZTS75DSJN5X8Y0K4GX1","atts_01GW2HTZTV4A58AGVVTBWRTZN5","atts_01GW2HTYV3F7XQK1AEVP4XQBQD","atts_01GW2HTYV4EFY5MYCD2NX3NHF6","atts_01GW2HV6G50MVGQHMYZHAFPBGQ","atts_01GW2HV6G5GRBVRCZVSEK7H8XQ","atts_01GW2HV6G6RNGJ4X7MZX022CJS","atts_01GW2HV6G6E0PAQBK5ERGNRE0F","atts_01GW2HV6G7139BWYWAGKZYQAPQ","atts_01GW2HV6G77WKQCTX71K1JWCBD","atts_01GW2HV6G8W74QF92E4KA1QG1D","atts_01GW2HTKH4DN7N8A7PCKKTNPT9","atts_01GW2HV3WFEQXE1RCH5W34N6RV","atts_01GW2HTDQF1V11JVKB0TNE3AE7","atts_01GW2HTE53EFSGW97FX87H0KEK","atts_01GW2HTM8FQPVKRH30J3W2V57P","atts_01GW2HTY38E6SD4EJBQ2BQDXP0","atts_01GW2HTY3F6HHSMF2F531VF76A","atts_01GW2HV4N6S86GXC1RZ39HCC2S","atts_01GW2HT8PFG2045Z6PPGFGJV1M","atts_01GW2HV6JX7FNKTX2G1S0DPVR2","atts_01GW2HV6JXYMGSD5JBFJTX25WF","atts_01GW2HV6JY0VB0DM23WJR6CZFV","atts_01GW2HV6JZ3C7A7JV4R52SR7ZX","atts_01GW2HV6JZDGK18R27XWC4ZPT4","atts_01GW2HV6JZ7CK5W2HHBYSY9XJD","atts_01GW2HV6JZ2A3KXZQ5F5P93MG3","atts_01GW2HV6K051WB2ZE9YCD8HNZ4","atts_01GW2HV6K075JQGM6QXCBBQDQT","atts_01GW2HV6K8KKYJVG996CN6YA27","atts_01GW2HV6K80KXKZEQ8Z1FWCGQT","atts_01GW2HTQEDPX48FXZ82WS4WHVX","atts_01GW2HT8Q87PET9B38ER7V0P95","atts_01GW2HT9NH3BNEZJ8KVFFE0B44","atts_01GW2HTPARGNHC3879B57V2YWV","atts_01GW2HV6NQP0W313A3V508YAVX","atts_01GW2HV6NR0347SAGABVZ0RMRE","atts_01GW2HTWJKGFJ24FQNRYY4M75H","atts_01GW2HT9E0A18GFSPCATEYDEYZ","atts_01GW2HT9DY8GW2CXGXCF29G91H","atts_01GW2HT9DSD01GG1XEY98XQTEE","atts_01GW2HTA1Q86P1XB15X6KBEZS6","atts_01GW2HTMMMDQ5CGENGR33XA1KD","atts_01GW2HTY44MAAN7292NFN8TCWT","atts_01GW2HTY44PBHM1E17JEHSXK00","atts_01GW2HTY44EGMF6S0YVHB9Z47J","atts_01GW2HV6PDVQE462VSF2BF612N","atts_01GW2HV6PGY4DXWZ2DPF5SX4XV","atts_01GW2HV4NDSRVWPV85S1SGMF3Y","atts_01GW2HTYSYKV87B7JRWPZJVFTC","atts_01GW2HV4NWKRDKABY79DF8NXXR","atts_01GW2HV4NPZPC67XDS73M0T2F3","atts_01GW2HV4NPCZH1JHGNAHNHMN05","atts_01GW2HV4P6VTPA4Y8ZB0SCF00Q","atts_01GW2HV4PCAZJJPE75HA80X0DK","atts_01GW2HV4PEVWYEEMW99V3QR9MV","atts_01GW2HV4PF21FFX9JQWP47D8EZ","atts_01GW2HV4B7NCDYKTPV3RFW3480","atts_01GW2HV4B84B0HZQFMVVH2ZTQ2","atts_01GW2HV4B85PJFKAETD687GKW5","atts_01GW2HTMAHET3KP3T5TRD4XH3G","atts_01GW2HTMAHW9BF289VP2HTDSS9","atts_01GW2HTX99FFHXWG335ST8PJ51","atts_01GW2HTBPP6WNJ91VDZ972F6RD","atts_01GW2HTCGYK0H4TGEQRDPJZBFP","atts_01GW2HTCGYSKK1S40TE0G5WYKA","atts_01GW2HTCGXV5DTFVBH58Z8E63Z","atts_01GW2HTX3G2Y3BG3B2WRTB54P2","atts_01GW2HTCHYXRXS7Z229JJY2XVS","atts_01GW2HTMY76YCG5CJ757VZ44X4","atts_01GW2HTWRNJ85EFTR27E5ATC5M","atts_01GW2HV5DF920S1A4J8G0TTQNX","atts_01GW2HTWZNCZ13GA3P45N828Q6","atts_01GW2HTWZN422T38SAK27QAFT7","atts_01GW2HTWZN0XCJH6TJX5A0SSBR","atts_01GW2HTW6KYPHZA8N5BWXB1GTR","atts_01GW2HTW6MBTRNZCSJ9WXB5XVK","atts_01GW2HTQDEV39Z5RD6TNY61WPP","atts_01GW2HTQDE27Q9ZHWTX9ZTVVTD","atts_01GW2HTQDF6HHFAE1G0QTPZPV9","atts_01GW2HTX06ZNTXRJ0TCBBCXX68","atts_01GW2HTKBGRFBQXWTNKS3PNEA5","atts_01GW2HTKBG0CVR1K4G3760DPPN","atts_01GW2HTKBGE5BRB3DJVZM4353S","atts_01GW2HTX0CRB2TCWASH5PHPWGD","atts_01GW2HTJBBM6JHHKSSVZT5W869","atts_01GW2HTJB991E296M6QZNDG0DE","atts_01GW2HTX2YPD0RYXNP5AYZP93K","atts_01GW2HTX2YS706WNFNMJZZ59YK","atts_01GW2HV6WZPF7DPDEEAG095PBJ","atts_01GW2HTC7MDZFZAZWBM7C153NR","atts_01GW2HTC7PGQ95HQSQAPDMJ191","atts_01GW2HTC7RJPGGP62P7Q908YG7","atts_01GW2HTC7TKTF08EA3E5P5HXDR","atts_01GW2HTC80J9689AQRRJYRWJW7","atts_01GW2HTC82FHSAKV2KCE7ZFP70","atts_01GW2HTC84DGEXE2FTVHGV43EK","atts_01GW2HTBMGW38PB14RDFPK8071","atts_01GW2HTJ2KT4SSWKQNWF5FYGJM","atts_01GW2HTJ2MVVVAP47E87CM57NP","atts_01GW2HTJ2MV6H772FCWD74EVY1","atts_01GW2HTX6QM2P024E4W7YE9E5N","atts_01GW2HTX6SHSWHW03W9JVPVZBJ","atts_01GW2HV4C3MEC0CS82BVFCDBQ5","atts_01GW2HV00CC3J5Z7NZ3PRGQG4J","atts_01GW2HV3W3RZEAAAZNCGGAPTGG","atts_01GW2HV3W8C6D1GYV3W85MCZBA","atts_01GW2HV414XGRT5DBZHM4JNJ3H","atts_01GW2HV419NCWS488HADEWT8SS","atts_01GW2HV41A2BNBBD8YSGR86GXA","atts_01GW2HV6XXVVACFAW7QFFG5XFC","atts_01GW2HTDN3QK67XG4P26EYFQJX","atts_01GW2HTVB7F4P3YNT96F7QC8X1","atts_01GW2HV45X17KHKK6KWVT5BKF5","atts_01GW2HV45ZFSFTJFBZ9AN4N9RK","atts_01GW2HV45ZTF3BAZZH5V9GZH86","atts_01GW2HV460ZG5SAAJVF029E8D4","atts_01GW2HV47SZMG1H24GQXVR4RZ8","atts_01GW2HV4BD3PTWX0AVV5KBBD6Q","atts_01GW2HV4BE9W4RS35PXNJP75A9","atts_01GW2HV4BFRJZ9ZTS7PA2HHH2M","atts_01GW2HV4BJ3C9VX7B1BS050D1S","atts_01GW2HV4BKC58J5PYYWA403E41","atts_01GW2HV4BMFM9WKYNH3ARHKCX0","atts_01GW2HV6Y08DVKBEJG2NPQTBR0","atts_01GW2HTX7AWXEK7P0HH1M84HKC","atts_01GW2HT94AE1HEHA5NRP00RQYH","atts_01GW2HTMZ27Z0S8782HCSBX9A7","atts_01GW2HTMZ3A494S7FEJEAWKMET","atts_01GW2HT8WN0AN0K2W5PFSNPPK6","atts_01GW2HT8WN75YCEJB81QRVAQGX","atts_01GW2HV4RETB2H3FTJ0HAM2XE3","atts_01GW2HV4RG4MXN8ZY6CTWJCGK4","atts_01GW2HTMZ1TY66YFH1X8B40Z0G","atts_01GW2HV6ZZME48Q47G8NYGNAJZ","atts_01GW2HTJR5PQWHFA6Y2GH1E886","atts_01GW2HTWED1EMHMZZ79RBR1JYX","atts_01GW2HTWEESV0GC9KNK4TZSZ76","atts_01GW2HTWEHTVW56W32J45Q7RT4","atts_01GW2HTWEFHEYAETCFYK1NYQ23","atts_01GW2HTWEGPPWPVCVF7HA9PZSH","atts_01GW2HV7008AJD4J5EK6CPZCRG","atts_01GW2HTEFP54KMSA1DFCNFS9BQ","atts_01GW2HTEFQ55ZJDA1F9946BFEK","atts_01GW2HTX0KQ1ME99QN9BSFFECG","atts_01GW2HTX0KAQ4V21G13YZZBHVC","atts_01GW2HTX0K0C8HM6RH2K5Y2A3N","atts_01GW2HV4SYKD48B0DJ27G3QRAA","atts_01GW2HV4SXCQSR9ZGK7R06RGPK","atts_01GW2HV48TVAD6A09GN152ZAV9","atts_01GW2HV48WEX79ENRBCTQXZ790","atts_01GW2HV48YG9NPESMJK62MFSF7","atts_01GW2HV7177XV0A7VTP21HCB5T","atts_01GW2HV74P5AVSHPE95KQAMXEB","atts_01GW2HV75ASHV4413FTSCDK25P","atts_01GW2HV75AM9XDECGFKY12FGCW","atts_01GW2HV75CGE4B5JQN8PE6SJTT","atts_01GW2HV75CC0M0APPWY90JF9CT","atts_01GW2HV75G2FH3X62NQSC5Z1KE","atts_01GW2HV75GHVDS0NGET1HXSG05","atts_01GW2HV75JC6PCKNR96SZ3ZW3X","atts_01GW2HV75JKMZTM8BDTG0VP4RB","atts_01GW2HV75MDSZWHYB3WDRHQGK2","atts_01GW2HV75MGRANBGC9XTA7TGZW","atts_01GW2HV76AHSX5PPVZNACGBRG6","atts_01GW2HV76AXH5KDXG5PEXQR0HJ","atts_01GW2HV76DYP9MAQBDYC4WQS84","atts_01GW2HV76PN470TTYYHA0GM9WQ","atts_01GW2HV76R12G1681CMTX1X4KP","atts_01GW2HV76SNDJD9ECEPMDBDKSA","atts_01GW2HV76VMMM0QJY0WY354NTC","atts_01GW2HV76V3ANAXB6TWXS3NQB9","atts_01GW2HV773PBHQHKV7MJGSCPAW","atts_01GW2HV773WKJ3T1MCAX67ZY07","atts_01GW2HV775921NVYVP8T4ZJPQG","atts_01GW2HV775V0BB2EP71T4GSSXV","atts_01GW2HV777Q3RKAV0JKP8HBMGF","atts_01GW2HV777DBKAKY59GXK745BQ","atts_01GW2HV779DE24RG5B49VHBQY2","atts_01GW2HV779FNYQ4F465ZTSG4CT","atts_01GW2HV77H3SMK0KPJW77P6Y94","atts_01GW2HV77JFRW2XDPKVF376YB2","atts_01GW2HV77MAHS61ASR7E44THNG","atts_01GW2HV77W735JJXBTKJ0C475A","atts_01GW2HV77XP0VJF5TD8BDM26H7","atts_01GW2HV799G2451GAQBWSG6SEM","atts_01GW2HV7990GWW7ETSACPB61V2","atts_01GW2HTJJSNXKA4ZJZEXYVFNNG","atts_01GW2HTJJWZYTMR0VHHYM2D4N4","atts_01GW2HTJJY10SBC33V23STFYX3","atts_01GW2HTJJZVJ8FKNQ5AETGQ0NS","atts_01GW2HTJK4P7WFPEPNTXZZQC5A","atts_01GW2HTJK6EDFXBAM9K40GY4E6","atts_01GW2HTBJY50QX2Z7T9EXQA7DB","atts_01GW2HV79HVN6CJSNX0N3AW7EQ","atts_01GW2HV79JE237M61BQFE07EH4","atts_01GW2HTA05F99KF7M1V22H1952","atts_01GW2HTA05YJX45RXMV9ADPZQG","atts_01GW2HV4EMA812QA02WXGHQNN0","atts_01GW2HV4EVVDQW399C3WZ2EJX2","atts_01GW2HV4EXMQ72K702R1VF2V8W","atts_01GW2HV4EXKS8PFBRX8RV4E670","atts_01GW2HV4FKXG3F9AZBY20CX88K","atts_01GW2HV4FM7ZFNSVEWK4FXF54R","atts_01GW2HV4FNRE0SA85QTBNFX2XK","atts_01GW2HV4FP4Y1W94F5YSJBM066","atts_01GW2HTETTHVSGMZTWRFRA9GZH","atts_01GW2HTETWHFY9PTPGDG9H6NWX","atts_01GW2HTETRC3PBTB676HB7F7SB","atts_01GW2HV7E261Y5XACR1M26YPDR","atts_01GW2HV7E38EF6DY361H01HK2V","atts_01GW2HV5JG18ZPCQ8WRHPNT9CY","atts_01GW2HV5JJ0REP55ZP4T5TMS0X","atts_01GW2HTQC770542VZ19XQ0BEDD","atts_01GW2HTQ6A103EF9K50DDJGWK3","atts_01GW2HTCM1J7H01NXA3QN7F73N","atts_01GW2HTVPG1MTKGQ75CBMPG3T0","atts_01GW2HTVPEJVTV5DT9QCYTCJTJ","atts_01GW2HTK2GM5SFZ0PF2MK18FG5","atts_01GW2HTVYRHC7DFMCDZFQW9PPT","atts_01GW2HTVYT8TT21BCAMD1V30S3","atts_01GW2HTVYR2HCFAD8BYER5HQVG","atts_01GW2HT9FKR1P5XFFG4QR14FT8","atts_01GW2HTAYC134E514GASW3H2MM","atts_01GW2HT8DSWWW8KD3E3WTNSPCE","atts_01GW2HV5MVDED61TJJMKS3Y97X","atts_01GW2HTBJZE567P7N2CAPWP32B","atts_01GW2HTJMN87Z4D6R3M0ZT582T","atts_01GW2HTF7TFBDG2BZNSJFX89X8","atts_01GW2HTKXQ87CTV58A7J50M3PE","atts_01GW2HTX45A389GRAPXX0ZQ0TX","atts_01GW2HV3XJH8AM0168TK92RXM4","atts_01GW2HV5HCYXJPP1KCSB3VM1WM","atts_01GW2HV6DRFDW3EC5ZG99NEEDF","atts_01GW2HV6DS2D4XT0X26K3VS7V1","atts_01GW2HTX82PJCHNH61A16PMJNP","atts_01GW2HTEC2XT81DFJTDSRCF8TW","atts_01GW2HTJBNZS2GXSBD9X53M6M0","atts_01GW2HTJBVY9RSM438VZRA327P","atts_01GW2HTJBVPQA98K37K45GTD9P","atts_01GW2HTJBNCQGYED7KYHWHB2AE","atts_01GW2HTGZ1XC4Q5V3KMSTMS2HH","atts_01GW2HTV026AJCSSKF9MWS174K","atts_01GW2HTTYPW12BNHYRFQMCFZMV","atts_01GW2HTTYQSQGX18WB79NFTRZW","atts_01GW2HT9H40QH5E6J850ZJJAP2","atts_01GW2HT8NP541XCPD8SHDAE86T","atts_01GW2HT8NPSMA96YDXFKJKTSYQ","atts_01GW2HT8NQ61VVB8Z9ZPF93K1J","atts_01GW2HT8NQ87VE42NCRR76FYCQ","atts_01GW2HT9ZXEK2ZSGVGPS1QA691","atts_01GW2HT9ZXREB5WBK7BBFB2PA0","atts_01GW2HV722BMMQX9EWAZ3CW0V7","atts_01GW2HV5QZX1PSH3YJZDA5962P","atts_01GW2HTWFEDTN8547S3F8BKN9D","atts_01GW2HTXV7M1PV1EZV0R8F22JB","atts_01GW2HTXYJD4MN98A3BEX33G4X","atts_01GW2HTY62EW8CX54T83EBTHNZ","atts_01GW2HTY6609SSWN4R8KPAC68S","atts_01GW2HTKDCGN8DACBR0DGS9JD2","atts_01GW2HTKDC12708781YP1ET2M5","atts_01GW2HTY7CG9S59W9BMSYF71YZ","atts_01GW2HTY7D70J4Q92KJHEN5PR0","atts_01GW2HTY7D4AY6VN2954PQKAS6","atts_01GW2HTY7DFKRD0W9AYQFVVVK3","atts_01GW2HTY7EZPRTNFTFSMCW8J1B","atts_01GW2HTY7E6WPQWKDBV04GY1XJ","atts_01GW2HTY7E4YAQBXGT28ERAMTB","atts_01GW2HT9XKK17DNWAV391KME9T","atts_01GW2HTHX4H19H0SN404PHP3P5","atts_01H56EGJ4SSWAS4F39G58BBACY","atts_01H56ER5X5BGF4SQS8EY7T9XTQ","atts_01H56E03NT9EWXPMZZJCAEAFX7","atts_01H56EGHA4GQYKWFYTYD54Y48G","atts_01H56EGGPPJ7DT1BRWVSP4NWVR","atts_01H56EMAVE4VN48BN4E27A6TDD","atts_01H56EGGWRPAWS09PDHAHMGGRP","atts_01H56EGGRHGHVJTNY4M5F1M87Y","atts_01H56ENBKGX5WNZXFMSWDK4CRY","atts_01H56ER253MWC3VH586F67GVZP","atts_01H56EAFEEFM4X1WXRVNMVTMPR","atts_01H56EQYFFZBK11W1T5A9GNS7W","atts_01H56EQ6ZJ6QQZATHEGW8G92BQ","atts_01H56EG75VQQEMN0AGBFWXGHBP","atts_01H56EGHYRRNP8GAKF88D8MWQ5","atts_01H56EPP6EMPCS3SHD65GVQ6MQ","atts_01H56EGHMET2PK0WEKN4HWK04W","atts_01H56ERDX8GEXD2GHRDRNC6BHC","atts_01H56EKVX6M4NX0AZFAS4RY2WQ","atts_01H56EKMM6RHDQTEDWRNK202RD","atts_01H56EQ6J3EVRGMHBWJ5VXRVG6","atts_01H56EGH28HWBK91EWAK60DVQQ","atts_01H56EKMJ2447CWK7YA077CXYX","atts_01H56ERE552B96KEB9VNZAS1WH","atts_01H56EKMGM516A4HXBGED6VM57","atts_01H56ECBKT3MA3AYP4584ENW41","atts_01H56EP5KZWVTKN4HZ1QZKH1D1","atts_01H56EMAYGP2Q54F1X9Q1DZCXW","atts_01H56ERE795AX5R6XSX3FP4AZ3","atts_01H56ERE2EM7XPNSEDB2V8GR1M","atts_01H56EGJ60JKD89C8VKSNN77JW","atts_01H56EPPH2KVS2N5JAJBC4WV2W","atts_01H56ER3WZJB74839VSCYWDD66","atts_01H56EG6PTJ8X499J6N6AQ315M","atts_01H56EG6GXARJ5T5SM02GRWQ0A","atts_01H56EMFWXYC7PHW2NR2EDS8TJ","atts_01H56EMFTDYX01HKKFD73P4278","atts_01H56ERDZRFKTA0ZGCZNH17ZM7","atts_01H56EG6T0A5BXEA328HVCJVZ8","atts_01H56EGH52A120BGN0115QT7Q6","atts_01H56EKMP2NJEAVVMPXGSAGDKV","atts_01H56ERBTB2J87B1Y69PF90MTS","atts_01H56EEN8P6XD0Z1BB9J2PQ1C2","atts_01H56EGJ1AKNHFTHD228AMD7GA","atts_01H56EQYCQRZC9EBHD8T1EGYA1","atts_01H56EMAX0CEA7EF0B1KN1F8M9","atts_01H56EEMHBEGDXNHPV76NY0V1M","atts_01H56EEMKVKHWGJFPW5576RV54","atts_01H56EEN2GEH9AXZ6088Z82XM4","atts_01H56EG6WZWF5J0ZB4DDR0HX0N","atts_01H56ENHG9C7KG67QC1FE7CW1C","atts_01H56ENK71SDFHKKWYWMKRTTS2","atts_01H56ENQMTVNGP5NGEV6N1T2N4","atts_01H56E03QW4GXVS5A0GAH71PQW","atts_01H56ERBXD28668FMEM0BABPWJ","atts_01H56ERBVMQVNP4J5DMMYXFCDV","atts_01H56ERBRM03KAARGRWHRSVYZS","atts_01H56EMADG11WPE960CTB8AR2V","atts_01H56DQ1YESPE9ZSDMRKW4JV60","atts_01H56EGH0143MM3CWV09KW1C1N","atts_01H56DYWM0E62XQ5PEQDD8BNDV","atts_01H56EKNV1BCM9DF19QDCV61XF","atts_01H56ENK556NSBNP8THAJ6NMMQ","atts_01H56EMG32RAQX6Z1X167T8K05"] \ No newline at end of file diff --git a/packages/db/prisma/data-migrations/2024-01-31_target-population-attrib.ts b/packages/db/prisma/data-migrations/2024-01-31_target-population-attrib.ts new file mode 100644 index 0000000000..cbd08849d2 --- /dev/null +++ b/packages/db/prisma/data-migrations/2024-01-31_target-population-attrib.ts @@ -0,0 +1,79 @@ +import { prisma } from '~db/client' +import { formatMessage } from '~db/prisma/common' +import { type MigrationJob } from '~db/prisma/dataMigrationRunner' +import { createLogger, type JobDef, jobPostRunner } from '~db/prisma/jobPreRun' + +/** Define the job metadata here. */ +const jobDef: JobDef = { + jobId: '2024-01-31_target-population-attrib', + title: 'target population attrib', + createdBy: 'Joe Karow', + /** Optional: Longer description for the job */ + description: undefined, +} +/** + * Job export - this variable MUST be UNIQUE + */ +export const job20240131_target_population_attrib = { + title: `[${jobDef.jobId}] ${jobDef.title}`, + task: async (_ctx, task) => { + /** Create logging instance */ + createLogger(task, jobDef.jobId) + const log = (...args: Parameters) => (task.output = formatMessage(...args)) + /** + * Start defining your data migration from here. + * + * To log output, use `task.output = 'Message to log'` + * + * This will be written to `stdout` and to a log file in `/prisma/migration-logs/` + */ + + // Do stuff + + const targetPopCat = await prisma.attributeCategory.createMany({ + data: [ + { + id: 'attc_01HNG5BPYJADWX4YFVNENS3TRD', + name: 'Target Population', + tag: 'target-population', + active: true, + ns: 'attribute', + }, + ], + skipDuplicates: true, + }) + log(`Created category: ${targetPopCat.count}`) + const tPopAttrTKey = await prisma.translationKey.createMany({ + data: [ + { + key: 'tpop.other', + ns: 'attribute', + text: 'Target Population - Other', + }, + ], + }) + log(`Created tKey: ${tPopAttrTKey.count}`) + + const targetPopAttr = await prisma.attribute.createMany({ + data: [ + { + id: 'attr_01HNG5GDC5MXW30F32FWJNJ98C', + name: 'Target Population - Free Text', + tag: 'tpop-other', + tsKey: 'tpop.other', + tsNs: 'attribute', + requireText: true, + }, + ], + }) + log(`Created attribute: ${targetPopAttr.count}`) + + /** + * DO NOT REMOVE BELOW + * + * This writes a record to the DB to register that this migration has run successfully. + */ + await jobPostRunner(jobDef) + }, + def: jobDef, +} satisfies MigrationJob diff --git a/packages/db/prisma/data-migrations/index.ts b/packages/db/prisma/data-migrations/index.ts index f1a5da56d3..b62c792250 100644 --- a/packages/db/prisma/data-migrations/index.ts +++ b/packages/db/prisma/data-migrations/index.ts @@ -66,4 +66,6 @@ export * from './2023-11-21_add-missing-phones/index' export * from './2023-11-22_ad-hoc-updates/index' export * from './2023-11-22_update-alert-messages/index' export * from './2023-12-05_alert-messages' +export * from './2024-01-31_fix-attr-supp-json/index' +export * from './2024-01-31_target-population-attrib' // codegen:end From c153bbb6ae3b4594936ba89dcb4d927f17ba80df Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Wed, 31 Jan 2024 13:31:19 -0500 Subject: [PATCH 50/67] add/update api route --- packages/api/router/attribute/index.ts | 35 ++++++++--------- .../query.getFilterOptions.handler.ts | 1 + .../router/attribute/query.getOne.handler.ts | 1 + .../api/router/attribute/query.map.handler.ts | 38 +++++++++++++++++++ 4 files changed, 56 insertions(+), 19 deletions(-) create mode 100644 packages/api/router/attribute/query.map.handler.ts diff --git a/packages/api/router/attribute/index.ts b/packages/api/router/attribute/index.ts index da141861ff..62ace84b17 100644 --- a/packages/api/router/attribute/index.ts +++ b/packages/api/router/attribute/index.ts @@ -1,28 +1,25 @@ -import { defineRouter, publicProcedure, staffProcedure } from '~api/lib/trpc' +import { defineRouter, importHandler, publicProcedure, staffProcedure } from '~api/lib/trpc' import * as schema from './schemas' -type AttributeQueryHandlerCache = { - getFilterOptions: typeof import('./query.getFilterOptions.handler').getFilterOptions - getOne: typeof import('./query.getOne.handler').getOne -} +const NAMESPACE = 'attribute' + +const namespaced = (s: string) => `${NAMESPACE}.${s}` -const HandlerCache: Partial = {} export const attributeRouter = defineRouter({ getFilterOptions: publicProcedure.query(async () => { - if (!HandlerCache.getFilterOptions) - HandlerCache.getFilterOptions = await import('./query.getFilterOptions.handler').then( - (mod) => mod.getFilterOptions - ) - - if (!HandlerCache.getFilterOptions) throw new Error('Failed to load handler') - return HandlerCache.getFilterOptions() + const handler = await importHandler( + namespaced('getFilterOptions'), + () => import('./query.getFilterOptions.handler') + ) + return handler() }), - getOne: staffProcedure.input(schema.ZGetOneSchema).query(async ({ ctx, input }) => { - if (!HandlerCache.getOne) - HandlerCache.getOne = await import('./query.getOne.handler').then((mod) => mod.getOne) - - if (!HandlerCache.getOne) throw new Error('Failed to load handler') - return HandlerCache.getOne({ ctx, input }) + getOne: staffProcedure.input(schema.ZGetOneSchema).query(async (opts) => { + const handler = await importHandler(namespaced('getOne'), () => import('./query.getOne.handler')) + return handler(opts) + }), + map: publicProcedure.query(async (opts) => { + const handler = await importHandler(namespaced('all'), () => import('./query.map.handler')) + return handler(opts) }), }) diff --git a/packages/api/router/attribute/query.getFilterOptions.handler.ts b/packages/api/router/attribute/query.getFilterOptions.handler.ts index 2473a30773..fe5775223c 100644 --- a/packages/api/router/attribute/query.getFilterOptions.handler.ts +++ b/packages/api/router/attribute/query.getFilterOptions.handler.ts @@ -23,3 +23,4 @@ export const getFilterOptions = async () => { return result } +export default getFilterOptions diff --git a/packages/api/router/attribute/query.getOne.handler.ts b/packages/api/router/attribute/query.getOne.handler.ts index 3a0f395a34..b82f3e6bb1 100644 --- a/packages/api/router/attribute/query.getOne.handler.ts +++ b/packages/api/router/attribute/query.getOne.handler.ts @@ -24,3 +24,4 @@ export const getOne = async ({ input }: TRPCHandlerParams) => { }) return result } +export default getOne diff --git a/packages/api/router/attribute/query.map.handler.ts b/packages/api/router/attribute/query.map.handler.ts new file mode 100644 index 0000000000..c8dd58c72b --- /dev/null +++ b/packages/api/router/attribute/query.map.handler.ts @@ -0,0 +1,38 @@ +import filterObj from 'just-filter-object' + +import { prisma } from '@weareinreach/db' +import { handleError } from '~api/lib/errorHandler' +import { type TRPCHandlerParams } from '~api/types/handler' + +export const map = async ({ ctx: _ }: TRPCHandlerParams) => { + try { + const result = await prisma.attribute.findMany({ + where: { + active: true, + }, + select: { + id: true, + tsKey: true, + tsNs: true, + icon: true, + iconBg: true, + }, + }) + if (!result) return null + const mapped = new Map( + result.map(({ id, ...rest }) => [id, filterObj(rest, (_key, value) => Boolean(value)) as MapValue]) + ) + return mapped + } catch (error) { + handleError(error) + } +} + +type MapValue = { + tsKey: string + tsNs: string + icon?: string + iconBg?: string +} + +export default map From 7a09f8f08f5c49cff01fb5e4a4b4d587796ff15a Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Wed, 31 Jan 2024 14:16:24 -0500 Subject: [PATCH 51/67] update migration --- .../[orgLocationId]/edit/[orgServiceId].tsx | 34 +++++++++++++++++++ .../2024-01-31_target-population-attrib.ts | 20 +++++++++-- 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/apps/app/src/pages/org/[slug]/[orgLocationId]/edit/[orgServiceId].tsx b/apps/app/src/pages/org/[slug]/[orgLocationId]/edit/[orgServiceId].tsx index ca051bb754..8e1ae068d3 100644 --- a/apps/app/src/pages/org/[slug]/[orgLocationId]/edit/[orgServiceId].tsx +++ b/apps/app/src/pages/org/[slug]/[orgLocationId]/edit/[orgServiceId].tsx @@ -27,11 +27,37 @@ const FreetextObject = z ns: z.string().nullish(), }) .nullish() +const literalSchema = z.union([z.string(), z.number(), z.boolean(), z.null()]) +type Literal = z.infer +type Json = Literal | { [key: string]: Json } | Json[] +const JsonSchema: z.ZodType = z.lazy(() => + z.union([literalSchema, z.array(JsonSchema), z.record(JsonSchema)]) +) const FormSchema = z.object({ name: FreetextObject, description: FreetextObject, services: prefixedId('serviceTag').array(), + attributes: z + .object({ + text: z + .object({ + key: z.string(), + text: z.string(), + ns: z.string(), + }) + .nullable(), + boolean: z.boolean().nullable(), + data: z.any(), + active: z.boolean(), + countryId: z.string().nullable(), + govDistId: z.string().nullable(), + languageId: z.string().nullable(), + category: z.string(), + attributeId: z.string(), + supplementId: z.string(), + }) + .array(), published: z.boolean(), deleted: z.boolean(), }) @@ -41,12 +67,15 @@ type FormSchemaType = z.infer const EditServicePage = () => { const { t } = useTranslation() const router = useRouter<'/org/[slug]/[orgLocationId]/edit/[orgServiceId]'>() + const { data: attributeMap } = api.attribute.map.useQuery() const { data } = api.page.serviceEdit.useQuery({ id: router.query.orgServiceId ?? '' }) const { data: allServices } = api.service.getOptions.useQuery() const form = useForm({ values: data ? { ...data, services: data.services.map(({ id }) => id) } : undefined, }) + console.log(form.getValues()) + const dirtyFields = { name: isObject(form.formState.dirtyFields.name) ? form.formState.dirtyFields.name.text : false, description: isObject(form.formState.dirtyFields.description) @@ -94,6 +123,11 @@ const EditServicePage = () => { {t('service.get-help')} + {t('service.clients-served')} + {t('service.cost')} + {t('service.eligibility')} + {t('service.languages')} + {t('service.extra-info')}
diff --git a/packages/db/prisma/data-migrations/2024-01-31_target-population-attrib.ts b/packages/db/prisma/data-migrations/2024-01-31_target-population-attrib.ts index cbd08849d2..39ff1a03a7 100644 --- a/packages/db/prisma/data-migrations/2024-01-31_target-population-attrib.ts +++ b/packages/db/prisma/data-migrations/2024-01-31_target-population-attrib.ts @@ -30,10 +30,13 @@ export const job20240131_target_population_attrib = { // Do stuff + const attributeId = 'attr_01HNG5GDC5MXW30F32FWJNJ98C' + const categoryId = 'attc_01HNG5BPYJADWX4YFVNENS3TRD' + const targetPopCat = await prisma.attributeCategory.createMany({ data: [ { - id: 'attc_01HNG5BPYJADWX4YFVNENS3TRD', + id: categoryId, name: 'Target Population', tag: 'target-population', active: true, @@ -51,13 +54,14 @@ export const job20240131_target_population_attrib = { text: 'Target Population - Other', }, ], + skipDuplicates: true, }) log(`Created tKey: ${tPopAttrTKey.count}`) const targetPopAttr = await prisma.attribute.createMany({ data: [ { - id: 'attr_01HNG5GDC5MXW30F32FWJNJ98C', + id: attributeId, name: 'Target Population - Free Text', tag: 'tpop-other', tsKey: 'tpop.other', @@ -65,9 +69,19 @@ export const job20240131_target_population_attrib = { requireText: true, }, ], + skipDuplicates: true, }) log(`Created attribute: ${targetPopAttr.count}`) - + const attrToCat = await prisma.attributeToCategory.createMany({ + data: [ + { + attributeId, + categoryId, + }, + ], + skipDuplicates: true, + }) + log(`Created Attribute/Category link: ${attrToCat.count}`) /** * DO NOT REMOVE BELOW * From 97c14d9c8ed3ff5ce5098347492bfff2e6b38e1e Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Wed, 31 Jan 2024 19:44:50 -0500 Subject: [PATCH 52/67] generated data --- packages/db/generated/allAttributes.ts | 12 +++++++++++ packages/db/generated/attributeCategory.ts | 1 + packages/db/generated/attributesByCategory.ts | 20 +++++++++++++++++++ 3 files changed, 33 insertions(+) diff --git a/packages/db/generated/allAttributes.ts b/packages/db/generated/allAttributes.ts index 32c35dfb0f..fa62175182 100644 --- a/packages/db/generated/allAttributes.ts +++ b/packages/db/generated/allAttributes.ts @@ -1103,6 +1103,18 @@ export const allAttributes = [ filterType: null, showOnLocation: null, }, + { + id: 'attr_01HNG5GDC5MXW30F32FWJNJ98C', + tag: 'tpop-other', + name: 'Target Population - Free Text', + icon: null, + iconBg: null, + tsNs: 'attribute', + tsKey: 'tpop.other', + active: true, + filterType: null, + showOnLocation: null, + }, { id: 'attr_01GW2HHFVPSYBCYF37B44WP6CZ', tag: 'trans-comm', diff --git a/packages/db/generated/attributeCategory.ts b/packages/db/generated/attributeCategory.ts index 6cf6be6c9c..6252c438dc 100644 --- a/packages/db/generated/attributeCategory.ts +++ b/packages/db/generated/attributeCategory.ts @@ -11,6 +11,7 @@ export const attributeCategory = [ { id: 'attc_01GW2HHFVNXMNJNV47BF2BPM1R', tag: 'service-focus', icon: null, ns: 'attribute' }, { id: 'attc_01GW2HHFVSQWE2Y2RF3DT2VEYX', tag: 'service-provider-options', icon: null, ns: 'attribute' }, { id: 'attc_01GW2HHFVKM2PSHFWVFM0TWX1P', tag: 'system', icon: null, ns: 'attribute' }, + { id: 'attc_01HNG5BPYJADWX4YFVNENS3TRD', tag: 'target-population', icon: null, ns: 'attribute' }, ] as const export type AttributeCategory = (typeof attributeCategory)[number] diff --git a/packages/db/generated/attributesByCategory.ts b/packages/db/generated/attributesByCategory.ts index 43f65650ea..4c12255a46 100644 --- a/packages/db/generated/attributesByCategory.ts +++ b/packages/db/generated/attributesByCategory.ts @@ -887,6 +887,26 @@ export const attributesByCategory = [ }, ], }, + { + id: 'attc_01HNG5BPYJADWX4YFVNENS3TRD', + tag: 'target-population', + icon: null, + ns: 'attribute', + attributes: [ + { + attribute: { + id: 'attr_01HNG5GDC5MXW30F32FWJNJ98C', + icon: null, + tag: 'tpop-other', + tsKey: 'tpop.other', + tsNs: 'attribute', + showOnLocation: null, + filterType: null, + iconBg: null, + }, + }, + ], + }, ] as const export type AttributesByCategory = (typeof attributesByCategory)[number] From fb8fd5a1b0d4a9ed5729eeed397c9d57a80baec1 Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Wed, 31 Jan 2024 19:45:51 -0500 Subject: [PATCH 53/67] start attribs --- .../[orgLocationId]/edit/[orgServiceId].tsx | 105 +++++++++++++++++- 1 file changed, 100 insertions(+), 5 deletions(-) diff --git a/apps/app/src/pages/org/[slug]/[orgLocationId]/edit/[orgServiceId].tsx b/apps/app/src/pages/org/[slug]/[orgLocationId]/edit/[orgServiceId].tsx index 8e1ae068d3..d23f2341ee 100644 --- a/apps/app/src/pages/org/[slug]/[orgLocationId]/edit/[orgServiceId].tsx +++ b/apps/app/src/pages/org/[slug]/[orgLocationId]/edit/[orgServiceId].tsx @@ -3,20 +3,23 @@ import dynamic from 'next/dynamic' import { useRouter } from 'next/router' import { useTranslation } from 'next-i18next' import { type GetServerSideProps } from 'nextjs-routes' -import { Suspense } from 'react' -import { useForm } from 'react-hook-form' +import { Suspense, useEffect, useState } from 'react' +import { type Path, useFieldArray, useForm } from 'react-hook-form' import { Textarea, TextInput } from 'react-hook-form-mantine' +import { type Merge } from 'type-fest' import { z } from 'zod' import { prefixedId } from '@weareinreach/api/schemas/idPrefix' import { trpcServerClient } from '@weareinreach/api/trpc' import { checkServerPermissions } from '@weareinreach/auth' +import { generateId } from '@weareinreach/db/lib/idGen' import { Badge } from '@weareinreach/ui/components/core/Badge' import { Section } from '@weareinreach/ui/components/core/Section' import { InlineTextInput } from '@weareinreach/ui/components/data-portal/InlineTextInput' import { ServiceSelect } from '@weareinreach/ui/components/data-portal/ServiceSelect' import { api } from '~app/utils/api' import { getServerSideTranslations } from '~app/utils/i18n' +import { Button } from '~ui/components/core/Button' const DevTool = dynamic(() => import('@hookform/devtools').then((mod) => mod.DevTool), { ssr: false }) @@ -27,6 +30,10 @@ const FreetextObject = z ns: z.string().nullish(), }) .nullish() + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +type MapValue = A extends Map ? V : never + const literalSchema = z.union([z.string(), z.number(), z.boolean(), z.null()]) type Literal = z.infer type Json = Literal | { [key: string]: Json } | Json[] @@ -73,8 +80,9 @@ const EditServicePage = () => { const form = useForm({ values: data ? { ...data, services: data.services.map(({ id }) => id) } : undefined, }) + const attribFields = useFieldArray({ control: form.control, name: 'attributes', keyName: '_rhfId' }) - console.log(form.getValues()) + console.log(`🚀 ~ EditServicePage ~ attribFields:`, attribFields.fields) const dirtyFields = { name: isObject(form.formState.dirtyFields.name) ? form.formState.dirtyFields.name.text : false, @@ -83,8 +91,58 @@ const EditServicePage = () => { : false, services: form.formState.dirtyFields.services ?? false, } - + const dataAttributes = form.watch('attributes') ?? [] const activeServices = form.watch('services') ?? [] + + type AttrSectionKeys = 'clientsServed' | 'cost' | 'eligibility' | 'languages' | 'additionalInfo' + type AttrSectionVals = Merge< + FormSchemaType['attributes'][number], + { _rhfName: Path; _rhfLabel: string } + > + + const attributeBase: { + [key in AttrSectionKeys]: AttrSectionVals[] + } = { + clientsServed: [], + cost: [], + eligibility: [], + languages: [], + additionalInfo: [], + } + const [attributes, setAttributes] = useState(attributeBase) + + useEffect(() => { + if (!attributeMap) return + const attrToSet = attributeBase + + for (const [i, item] of dataAttributes.entries()) { + const attribDef = attributeMap.get(item.attributeId) + + console.log(`🚀 ~ useEffect ~ attribDef:`, attribDef) + + if (!attribDef) continue + + const attribNs = attribDef.tsKey.split('.').length + ? (attribDef.tsKey.split('.').shift() as string) + : attribDef.tsKey + console.log(`🚀 ~ useEffect ~ attribNs:`, attribNs) + + switch (attribNs) { + case 'tpop': { + attrToSet.clientsServed.push({ + ...item, + _rhfName: `attributes.${i}.text.text`, + _rhfLabel: 'Target Population', + }) + break + } + } + } + setAttributes(attrToSet) + + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [dataAttributes, attributeMap]) + return ( <> @@ -123,13 +181,50 @@ const EditServicePage = () => { {t('service.get-help')} - {t('service.clients-served')} + + {attributes.clientsServed.length ? ( + attributes.clientsServed.map(({ _rhfName, _rhfLabel, ...item }) => ( + } + name={_rhfName} + control={form.control} + label={_rhfLabel} + data-isDirty={form.getFieldState(_rhfName).isDirty} + autosize + /> + )) + ) : ( + + )} + {t('service.cost')} {t('service.eligibility')} {t('service.languages')} {t('service.extra-info')}
+ {/* @ts-expect-error Hush, devtool. */} ) From a0f15df31450213fc5bec27718ef1258398d6fa2 Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Mon, 5 Feb 2024 12:26:44 -0500 Subject: [PATCH 54/67] update routes --- .../mutation.updateAttributesBasic.handler.ts | 12 ++++++++---- .../organization/query.forBadgeEditModal.handler.ts | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/api/router/organization/mutation.updateAttributesBasic.handler.ts b/packages/api/router/organization/mutation.updateAttributesBasic.handler.ts index dec454751b..9133b6d6f6 100644 --- a/packages/api/router/organization/mutation.updateAttributesBasic.handler.ts +++ b/packages/api/router/organization/mutation.updateAttributesBasic.handler.ts @@ -1,4 +1,4 @@ -import { getAuditedClient } from '@weareinreach/db' +import { generateId, getAuditedClient } from '@weareinreach/db' import { handleError } from '~api/lib/errorHandler' import { type TRPCHandlerParams } from '~api/types/handler' @@ -13,13 +13,17 @@ export const updateAttributesBasic = async ({ const result = await prisma.$transaction(async (tx) => { const { count: added } = input.createdVals - ? await tx.organizationAttribute.createMany({ - data: input.createdVals.map((id) => ({ organizationId: input.id, attributeId: id })), + ? await tx.attributeSupplement.createMany({ + data: input.createdVals.map((id) => ({ + id: generateId('attributeSupplement'), + organizationId: input.id, + attributeId: id, + })), skipDuplicates: true, }) : { count: 0 } const { count: removed } = input.deletedVals - ? await tx.organizationAttribute.deleteMany({ + ? await tx.attributeSupplement.deleteMany({ where: { organizationId: input.id, attributeId: { in: input.deletedVals }, diff --git a/packages/api/router/organization/query.forBadgeEditModal.handler.ts b/packages/api/router/organization/query.forBadgeEditModal.handler.ts index ef5d9032a0..ed1fb057f9 100644 --- a/packages/api/router/organization/query.forBadgeEditModal.handler.ts +++ b/packages/api/router/organization/query.forBadgeEditModal.handler.ts @@ -6,7 +6,7 @@ import { type TForBadgeEditModalSchema } from './query.forBadgeEditModal.schema' export const forBadgeEditModal = async ({ ctx, input }: TRPCHandlerParams) => { try { - const data = await prisma.organizationAttribute.findMany({ + const data = await prisma.attributeSupplement.findMany({ where: { organizationId: input.id, attribute: { categories: { some: { category: { tag: input.badgeType } } } }, From 93f59291f6b1de7f074b9a71f325cb17fd9dc82b Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Mon, 5 Feb 2024 12:42:50 -0500 Subject: [PATCH 55/67] disable sherif rule --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 7263061154..df8d4893fa 100644 --- a/package.json +++ b/package.json @@ -26,8 +26,8 @@ "knip": "knip -c ./knip.config.ts", "lint": "TIMING=1 turbo run lint --parallel", "lint:fix": "TIMING=1 turbo run lint:fix --parallel", - "lint:pkg": "sherif", - "lint:pkg:fix": "sherif --fix", + "lint:pkg": "sherif -r multiple-dependency-versions", + "lint:pkg:fix": "sherif --fix -r multiple-dependency-versions", "lint:staged": "lint-staged", "notify:install": "tsx ./lib/runInstall.ts", "prepare": "husky", From b5aba84478338d894b9630c498f9266295346233 Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Mon, 5 Feb 2024 13:17:06 -0500 Subject: [PATCH 56/67] restore modal --- packages/ui/modals/Service/index.tsx | 509 +++++++++++++++++++++++++++ 1 file changed, 509 insertions(+) diff --git a/packages/ui/modals/Service/index.tsx b/packages/ui/modals/Service/index.tsx index e69de29bb2..0246dab7ff 100644 --- a/packages/ui/modals/Service/index.tsx +++ b/packages/ui/modals/Service/index.tsx @@ -0,0 +1,509 @@ +import { + Box, + type ButtonProps, + createPolymorphicComponent, + createStyles, + List, + Modal, + Stack, + Text, + Title, + useMantineTheme, +} from '@mantine/core' +import { useDisclosure, useMediaQuery } from '@mantine/hooks' +import { useRouter } from 'next/router' +import { useTranslation } from 'next-i18next' +import { forwardRef, type JSX, type ReactNode } from 'react' + +import { serviceModalEvent } from '@weareinreach/analytics/events' +import { supplementSchema } from '@weareinreach/api/schemas/attributeSupplement' +import { AlertMessage } from '~ui/components/core/AlertMessage' +import { + type AttributeTagProps, + Badge, + BadgeGroup, + type CommunityTagProps, + type ServiceTagProps, +} from '~ui/components/core/Badge' +import { ContactInfo, hasContactInfo, Hours } from '~ui/components/data-display' +import { type PassedDataObject } from '~ui/components/data-display/ContactInfo/types' +import { getFreeText, useSlug } from '~ui/hooks' +import { isValidIcon } from '~ui/icon' +import { trpc as api } from '~ui/lib/trpcClient' + +import { ModalTitle, type ModalTitleProps } from '../ModalTitle' + +const useStyles = createStyles((theme) => ({ + sectionDivider: { + backgroundColor: theme.other.colors.primary.lightGray, + padding: 12, + }, + timezone: { + ...theme.other.utilityFonts.utility4, + color: theme.other.colors.secondary.darkGray, + }, + blackText: { + color: '#000000', + margin: 0, + whiteSpace: 'pre-line', + }, +})) + +/** + * TODO: [IN-797] Service Modal updates + * + * - Fix 'at capacity' layout/spacing + * - Community focus to use badges with short name & icon + * - Cost to use attribute badge + * - Validate data display against finalized data structure. + */ + +const CONTACTS = ['phone', 'email', 'website'] as const + +const ServiceModalBody = forwardRef(({ serviceId, ...props }, ref) => { + const slug = useSlug() + const { data, status } = api.service.forServiceModal.useQuery(serviceId) + const { data: orgId } = api.organization.getIdFromSlug.useQuery({ slug }) + const { t, i18n } = useTranslation(orgId?.id ? ['common', 'attribute', orgId.id] : ['common', 'attribute']) + const { classes } = useStyles() + const [opened, handler] = useDisclosure(false) + const theme = useMantineTheme() + const isMobile = useMediaQuery(`(max-width: ${theme.breakpoints.sm})`) + + const ServiceModalTitle = () => { + const icons = ['share', 'save'] satisfies ModalTitleProps['icons'] + const router = useRouter<'/org/[slug]' | '/org/[slug]/[orgLocationId]'>() + const { orgLocationId } = router.query + const apiQuery = typeof orgLocationId === 'string' ? { orgLocationId } : { slug } + const { data, status } = api.service.getParentName.useQuery(apiQuery) + + if (isMobile || status === 'loading') + return ( + + ) + + if (data && status === 'success') + return ( + + ) + + return ( + + ) + } + + const ModalText = ({ children }: ModalTextprops) => ( + + {children} + + ) + + const SubSection = ({ title, children, li }: SubsectionProps) => ( + + {title && {t(`service.${title}`)}} + {li ? ( + + {typeof li === 'string' ? ( + + {li} + + ) : ( + li.map((item, i) => ( + + {item} + + )) + )} + + ) : ( + children + )} + + ) + + const SectionDivider = ({ title, children }: SectionProps) => { + if (!children || (Array.isArray(children) && children.length === 0)) return <> + + return ( + + + + {t(`service.${title}`)} + + + {children} + + ) + } + + const contactData: PassedDataObject = { + phones: [], + emails: [], + websites: [], + socialMedia: [], + } + + if (data && status === 'success') { + const { serviceName, services, hours, accessDetails, attributes, description, locations } = data + + const serviceBadges: ServiceTagProps[] = services.map(({ tag }) => ({ + tsKey: tag.tsKey, + variant: 'service', + })) + + const baseDetails: AccessDetails = { publicTransit: [] } + + const { publicTransit } = accessDetails.reduce((details, { supplement }) => { + const { data, text, id } = supplement + const parsed = supplementSchema.accessInstructions.safeParse(data) + if (parsed.success) { + const { access_type, access_value } = parsed.data + switch (access_type) { + case 'publicTransit': { + if (!text) break + const { key, options } = getFreeText(text) + details[access_type].push({t(key, options)}) + break + } + case 'email': { + contactData.emails.push({ + id, + title: null, + description: null, + email: parsed.data.access_value, + // legacyDesc: parsed.data.instructions, + // firstName: null, + // lastName: null, + primary: false, + locationOnly: false, + serviceOnly: false, + }) + break + } + case 'phone': { + const country = locations.find(({ location }) => Boolean(location.country))?.location?.country + ?.cca2 + if (!country) break + contactData.phones.push({ + id, + number: parsed.data.access_value, + phoneType: null, + country, + primary: false, + locationOnly: false, + ext: null, + description: null, + }) + break + } + case 'link': + case 'file': { + contactData.websites.push({ + id, + description: null, + isPrimary: false, + // orgLocationId: null, + orgLocationOnly: false, + url: parsed.data.access_value, + }) + } + } + + const accessKey = CONTACTS.find((category) => category === access_type) + if (accessKey) details[accessKey] ||= {access_value} + } + return details + }, baseDetails) + + const attributeCategories: Attributes = { + cost: [], + lang: [], + clientsServed: { + srvfocus: [], + targetPop: [], + }, + eligibility: { + requirements: [], + freeText: [], + }, + misc: [], + miscWithIcons: [], + } + + const { eligibility, clientsServed, cost, lang, misc, miscWithIcons, atCapacity } = attributes.reduce( + (subsections, { attribute, supplement }) => { + const { tsKey, icon, tsNs, id } = attribute + /* + Since the tsKeys follow a sort of pattern with the namespace being the first part of the + string before the '.', would it be alright to check for the category that way? + It avoids having to iterate through the categories array with: + categories.find(({ category }) => tsKey.includes(category.tag)) + */ + const namespace = tsKey.split('.').shift() as string + + switch (namespace) { + /** Clients served */ + case 'srvfocus': { + if (typeof icon === 'string' && attribute._count.parents === 0) { + subsections.clientsServed[namespace].push({ icon, tsKey, variant: 'community' }) + } + break + } + /** Target Population & Eligibility Requirements */ + case 'eligibility': { + const type = tsKey.split('.').pop() as string + switch (type) { + case 'elig-age': { + const { data, id } = supplement + const parsed = supplementSchema.age.safeParse(data) + if (!parsed.success) break + const { min, max } = parsed.data + const context = min && max ? 'range' : min ? 'min' : 'max' + subsections[namespace]['age'] = ( + {t('service.elig-age', { ns: 'common', context, min, max })} + ) + break + } + case 'other-describe': { + const { text, id } = supplement + if (!text) break + const { key, options } = getFreeText(text) + subsections.clientsServed.targetPop.push({t(key, options)}) + + break + } + } + + break + } + case 'cost': { + if (!isValidIcon(icon)) break + const costDetails: CostDetails = { description: [] } + + const { text, data, id } = supplement + if (text) { + const { key, options } = getFreeText(text) + costDetails.description.push({t(key, options)}) + } + const parsed = supplementSchema.cost.safeParse(data) + if (parsed.success) { + const { cost, currency } = parsed.data + costDetails.price = new Intl.NumberFormat(i18n.language, { + style: 'currency', + currency: currency ?? undefined, + }).format(cost) + } + + const { price, description } = costDetails + const badgeProps = { icon, tsKey, tsNs, tProps: { price: price ?? undefined } } + subsections[namespace].push() + + if (description.length > 0) + subsections[namespace].push( + + {description} + + ) + break + } + + case 'lang': { + const { language } = supplement + if (!language) break + const { languageName } = language + subsections[namespace].push(languageName) + break + } + case 'additional': { + if (tsKey.includes('at-capacity')) + subsections['atCapacity'] = ( + + ) + else { + isValidIcon(icon) + ? subsections[`miscWithIcons`].push({ + tsKey, + icon, + tsNs, + variant: 'attribute', + }) + : subsections['misc'].push(t(tsKey, { ns: tsNs })) + } + break + } + default: { + break + } + } + return subsections + }, + attributeCategories + ) + + const eligibilityItems: JSX.Element[] = [] + + if (eligibility.age) + eligibilityItems.push( + + {eligibility.age} + + ) + + if (eligibility.requirements.length > 0) + eligibilityItems.push() + + if (eligibility.freeText.length > 0) + eligibilityItems.push( + + {eligibility.freeText} + + ) + + const languages = lang.length === 0 ? undefined : + + const extraInfo: JSX.Element[] = [] + + if (miscWithIcons.length > 0) + extraInfo.push( + + + + ) + + if (misc.length > 0) extraInfo.push() + + return ( + <> + } + opened={opened} + onClose={() => handler.close()} + zIndex={100} + fullScreen={isMobile} + > + + + {atCapacity} + {serviceName && ( + + {t(serviceName.key, { ns: orgId?.id, defaultValue: serviceName.tsKey.text })} + + )} + {description && ( + {t(description.key, { ns: orgId?.id, defaultValue: description.tsKey.text })} + )} + + + {(hasContactInfo(contactData) || Boolean(hours.length)) && ( + + {hasContactInfo(contactData) && ( + + )} + {Boolean(hours.length) && } + + )} + {(Boolean(clientsServed.srvfocus.length) || Boolean(clientsServed.targetPop.length)) && ( + + {Boolean(clientsServed.srvfocus.length) && ( + + + + )} + {Boolean(clientsServed.targetPop.length) && ( + {clientsServed.targetPop} + )} + + )} + {cost} + {eligibilityItems} + {languages} + {extraInfo} + {publicTransit} + + + { + serviceModalEvent.opened({ serviceId, serviceName: serviceName?.tsKey?.text, orgSlug: slug }) + handler.open() + }} + {...props} + /> + + ) + } + + return +}) +ServiceModalBody.displayName = 'ServiceModal' + +export const ServiceModal = createPolymorphicComponent<'button', ServiceModalProps>(ServiceModalBody) +export interface ServiceModalProps extends ButtonProps { + serviceId: string +} + +type SubsectionProps = { + title?: string + children?: ReactNode + li?: string[] | string +} + +type SectionProps = { + title?: string + children?: ReactNode +} + +type Attributes = { + directEmail?: string + directPhone?: string + directWebsite?: string + cost: JSX.Element[] + lang: string[] + clientsServed: { + srvfocus: CommunityTagProps[] + targetPop: JSX.Element[] + } + atCapacity?: JSX.Element + eligibility: { + age?: JSX.Element + requirements: string[] + freeText: JSX.Element[] + } + misc: string[] + miscWithIcons: AttributeTagProps[] +} + +type AccessDetails = { + phone?: JSX.Element + email?: JSX.Element + website?: JSX.Element + atCapacity?: JSX.Element + publicTransit: JSX.Element[] +} + +type CostDetails = { + price?: number | string + description: JSX.Element[] +} + +type ModalTextprops = { + children: ReactNode +} From 1d8e5e67186a09a221a50dc2eae5690b5062b31e Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Mon, 5 Feb 2024 13:22:01 -0500 Subject: [PATCH 57/67] update for new schema --- packages/api/formatters/accessDetails.ts | 46 +++---- packages/api/formatters/attributes.ts | 121 ++++++++++++------ .../router/page/query.serviceEdit.handler.ts | 9 +- 3 files changed, 107 insertions(+), 69 deletions(-) diff --git a/packages/api/formatters/accessDetails.ts b/packages/api/formatters/accessDetails.ts index 5f1510ce33..394f639d4d 100644 --- a/packages/api/formatters/accessDetails.ts +++ b/packages/api/formatters/accessDetails.ts @@ -33,24 +33,18 @@ export const formatAccessDetails = { }, }) as const, process: (data: AccessDetailData) => { - return data.flatMap(({ attribute, supplement }) => { + return data.flatMap(({ attribute, ...supplement }) => { const { id: attrId, ...attrib } = attribute - if (supplement.length) { - return supplement.map(({ id: suppId, data, text, ...supp }) => { - const parsedData = AccessSchema.safeParse( - isSuperJSONResult(data) ? superjson.deserialize(data) : data - ) - return { - attrId, - ...attrib, - suppId, - data: parsedData.success ? parsedData.data : null, - text: text?.tsKey ?? null, - ...supp, - } - }) + const { id: suppId, data, text, ...supp } = supplement + const parsedData = AccessSchema.safeParse(isSuperJSONResult(data) ? superjson.deserialize(data) : data) + return { + attrId, + ...attrib, + suppId, + data: parsedData.success ? parsedData.data : null, + text: text?.tsKey ?? null, + ...supp, } - return { attrId, suppId: '', data: null, text: null, ...attrib } }) }, } @@ -61,15 +55,13 @@ type AccessDetailData = { // tsKey: string // tsNs: string } - supplement: { - id: string - data: Prisma.JsonValue - text: { - tsKey: { - text: string - key: string - ns: string - } - } | null - }[] + id: string + data: Prisma.JsonValue + text: { + tsKey: { + text: string + key: string + ns: string + } + } | null }[] diff --git a/packages/api/formatters/attributes.ts b/packages/api/formatters/attributes.ts index a11e76ff87..b75813e0f0 100644 --- a/packages/api/formatters/attributes.ts +++ b/packages/api/formatters/attributes.ts @@ -22,36 +22,62 @@ export const formatAttributes = { categories: { select: { category: { select: { tag: true, ns: true } } } }, }, }, - supplement: { - ...(showAll ? {} : { where: { active: true } }), - select: { - active: true, - countryId: true, - data: true, - govDistId: true, - id: true, - languageId: true, - text: { select: { tsKey: { select: { key: true, text: true, ns: true } } } }, - boolean: true, - }, - }, + active: true, + countryId: true, + data: true, + govDistId: true, + id: true, + languageId: true, + text: { select: { tsKey: { select: { key: true, text: true, ns: true } } } }, + boolean: true, }, }) as const, - process: (data: ReturnedData) => { - const flat = data.flatMap(({ attribute, supplement }) => { - const { categories, ...rest } = attribute - const flatAttribs = categories.map(({ category }) => ({ ...rest, category: category.tag })) - return supplement.flatMap(({ id: supplementId, text, ...supp }) => - flatAttribs.map(({ id: attributeId, ...attrib }) => ({ + process: (data: ReturnedData, separateAccessDetails?: boolean) => { + if (!separateAccessDetails) { + const flat = data.flatMap(({ attribute, ...supplement }) => { + const { categories, ...rest } = attribute + const flatAttribs = categories.map(({ category }) => ({ ...rest, category: category.tag })) + const { id: supplementId, text, ...supp } = supplement + return flatAttribs.map(({ id: attributeId, ...attrib }) => ({ attributeId, supplementId, ...attrib, ...supp, text: text?.tsKey ?? null, })) - ) - }) - return flat + }) + return flat + } else { + const output: ReturnSegmented = { + attributes: [], + accessDetails: [], + } + for (const { attribute, ...supplement } of data) { + const { categories, ...rest } = attribute + const flatAttribs = categories.map(({ category }) => ({ ...rest, category: category.tag })) + const { id: supplementId, text, ...supp } = supplement + for (const { id: attributeId, ...attrib } of flatAttribs) { + if (attrib.category === 'service-access-instructions') { + output.accessDetails.push({ + attributeId, + supplementId, + ...attrib, + ...supp, + text: text?.tsKey ?? null, + }) + } else { + output.attributes.push({ + attributeId, + supplementId, + ...attrib, + ...supp, + text: text?.tsKey ?? null, + }) + } + } + } + return output + } }, } @@ -69,20 +95,39 @@ type ReturnedData = { // icon: string | null // iconBg: string | null } - supplement: { - boolean: boolean | null - id: string - data: Prisma.JsonValue - active: boolean - text: { - tsKey: { - key: string - text: string - ns: string - } - } | null - countryId: string | null - govDistId: string | null - languageId: string | null - }[] + boolean: boolean | null + id: string + data: Prisma.JsonValue + active: boolean + text: { + tsKey: { + key: string + text: string + ns: string + } + } | null + countryId: string | null + govDistId: string | null + languageId: string | null }[] + +type DataOutput = { + text: { + key: string + text: string + ns: string + } | null + boolean: boolean | null + data: Prisma.JsonValue + active: boolean + countryId: string | null + govDistId: string | null + languageId: string | null + category: string + attributeId: string + supplementId: string +} +type ReturnSegmented = { + attributes: DataOutput[] + accessDetails: DataOutput[] +} diff --git a/packages/api/router/page/query.serviceEdit.handler.ts b/packages/api/router/page/query.serviceEdit.handler.ts index f5543affda..fabe8200d7 100644 --- a/packages/api/router/page/query.serviceEdit.handler.ts +++ b/packages/api/router/page/query.serviceEdit.handler.ts @@ -50,7 +50,7 @@ export const serviceEdit = async ({ ctx, input }: TRPCHandlerParams orgLocationId), + // accessDetails: formatAccessDetails.process(accessDetails), + // attributes: formatAttributes.process(attributes), + ...formatAttributes.process(attributes, true), ...rest, } } catch (error) { From adab8a20ab4f7acb2e5018b9f8be456ba437227f Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Mon, 5 Feb 2024 16:17:49 -0500 Subject: [PATCH 58/67] update api --- packages/api/formatters/attributes.ts | 88 ++++++++++--------- .../api/router/attribute/query.map.handler.ts | 31 ++++++- .../router/page/query.serviceEdit.handler.ts | 6 +- 3 files changed, 76 insertions(+), 49 deletions(-) diff --git a/packages/api/formatters/attributes.ts b/packages/api/formatters/attributes.ts index b75813e0f0..ce8fc579b9 100644 --- a/packages/api/formatters/attributes.ts +++ b/packages/api/formatters/attributes.ts @@ -15,6 +15,7 @@ export const formatAttributes = { attribute: { select: { id: true, + tag: true, // tsKey: true, // tsNs: true, // icon: true, @@ -32,58 +33,58 @@ export const formatAttributes = { boolean: true, }, }) as const, - process: (data: ReturnedData, separateAccessDetails?: boolean) => { - if (!separateAccessDetails) { - const flat = data.flatMap(({ attribute, ...supplement }) => { - const { categories, ...rest } = attribute - const flatAttribs = categories.map(({ category }) => ({ ...rest, category: category.tag })) - const { id: supplementId, text, ...supp } = supplement - return flatAttribs.map(({ id: attributeId, ...attrib }) => ({ - attributeId, - supplementId, - ...attrib, - ...supp, - text: text?.tsKey ?? null, - })) - }) - return flat - } else { - const output: ReturnSegmented = { - attributes: [], - accessDetails: [], - } - for (const { attribute, ...supplement } of data) { - const { categories, ...rest } = attribute - const flatAttribs = categories.map(({ category }) => ({ ...rest, category: category.tag })) - const { id: supplementId, text, ...supp } = supplement - for (const { id: attributeId, ...attrib } of flatAttribs) { - if (attrib.category === 'service-access-instructions') { - output.accessDetails.push({ - attributeId, - supplementId, - ...attrib, - ...supp, - text: text?.tsKey ?? null, - }) - } else { - output.attributes.push({ - attributeId, - supplementId, - ...attrib, - ...supp, - text: text?.tsKey ?? null, - }) - } + process: (data: ReturnedData) => { + const flat = data.flatMap(({ attribute, ...supplement }) => { + const { categories, ...rest } = attribute + const flatAttribs = categories.map(({ category }) => ({ ...rest, category: category.tag })) + const { id: supplementId, text, ...supp } = supplement + return flatAttribs.map(({ id: attributeId, ...attrib }) => ({ + attributeId, + supplementId, + ...attrib, + ...supp, + text: text?.tsKey ?? null, + })) + }) + return flat + }, + processAndSeparateAccessDetails: (data: ReturnedData) => { + const output: ReturnSegmented = { + attributes: [], + accessDetails: [], + } + for (const { attribute, ...supplement } of data) { + const { categories, ...rest } = attribute + const flatAttribs = categories.map(({ category }) => ({ ...rest, category: category.tag })) + const { id: supplementId, text, ...supp } = supplement + for (const { id: attributeId, ...attrib } of flatAttribs) { + if (attrib.category === 'service-access-instructions') { + output.accessDetails.push({ + attributeId, + supplementId, + ...attrib, + ...supp, + text: text?.tsKey ?? null, + }) + } else { + output.attributes.push({ + attributeId, + supplementId, + ...attrib, + ...supp, + text: text?.tsKey ?? null, + }) } } - return output } + return output }, } type ReturnedData = { attribute: { id: string + tag: string // tsKey: string // tsNs: string categories: { @@ -124,6 +125,7 @@ type DataOutput = { govDistId: string | null languageId: string | null category: string + tag: string attributeId: string supplementId: string } diff --git a/packages/api/router/attribute/query.map.handler.ts b/packages/api/router/attribute/query.map.handler.ts index c8dd58c72b..5a233621aa 100644 --- a/packages/api/router/attribute/query.map.handler.ts +++ b/packages/api/router/attribute/query.map.handler.ts @@ -16,23 +16,46 @@ export const map = async ({ ctx: _ }: TRPCHandlerParams) => { tsNs: true, icon: true, iconBg: true, + tag: true, + requireBoolean: true, + requireData: true, + requireDataSchema: true, + requireGeo: true, + requireLanguage: true, + requireText: true, }, }) if (!result) return null - const mapped = new Map( - result.map(({ id, ...rest }) => [id, filterObj(rest, (_key, value) => Boolean(value)) as MapValue]) + const byId = new Map( + result.map(({ id, ...rest }) => [id, filterObj(rest, (_key, value) => value !== null) as MapById]) ) - return mapped + const byTag = new Map( + result.map(({ tag, ...rest }) => [tag, filterObj(rest, (_key, value) => value !== null) as MapByTag]) + ) + return { byId, byTag } } catch (error) { handleError(error) } } -type MapValue = { +interface MapValueBase { tsKey: string tsNs: string icon?: string iconBg?: string + requireBoolean: boolean + requireData: boolean + requireDataSchema: object + requireGeo: boolean + requireLanguage: boolean + requireText: boolean +} + +interface MapById extends MapValueBase { + tag: string +} +interface MapByTag extends MapValueBase { + id: string } export default map diff --git a/packages/api/router/page/query.serviceEdit.handler.ts b/packages/api/router/page/query.serviceEdit.handler.ts index fabe8200d7..d325df329b 100644 --- a/packages/api/router/page/query.serviceEdit.handler.ts +++ b/packages/api/router/page/query.serviceEdit.handler.ts @@ -65,11 +65,12 @@ export const serviceEdit = async ({ ctx, input }: TRPCHandlerParams orgLocationId), // accessDetails: formatAccessDetails.process(accessDetails), // attributes: formatAttributes.process(attributes), - ...formatAttributes.process(attributes, true), + attributes, + accessDetails, ...rest, } } catch (error) { From 9ab967b3d46f423b20fc0f7009e0bd057ae4c0f8 Mon Sep 17 00:00:00 2001 From: Joe Karow <58997957+JoeKarow@users.noreply.github.com> Date: Mon, 5 Feb 2024 16:19:31 -0500 Subject: [PATCH 59/67] how to handle attributes?! --- .../[orgLocationId]/edit/[orgServiceId].tsx | 61 +++++++++++++------ 1 file changed, 42 insertions(+), 19 deletions(-) diff --git a/apps/app/src/pages/org/[slug]/[orgLocationId]/edit/[orgServiceId].tsx b/apps/app/src/pages/org/[slug]/[orgLocationId]/edit/[orgServiceId].tsx index d23f2341ee..caaec5e089 100644 --- a/apps/app/src/pages/org/[slug]/[orgLocationId]/edit/[orgServiceId].tsx +++ b/apps/app/src/pages/org/[slug]/[orgLocationId]/edit/[orgServiceId].tsx @@ -3,7 +3,7 @@ import dynamic from 'next/dynamic' import { useRouter } from 'next/router' import { useTranslation } from 'next-i18next' import { type GetServerSideProps } from 'nextjs-routes' -import { Suspense, useEffect, useState } from 'react' +import { type ReactNode, Suspense, useEffect, useState } from 'react' import { type Path, useFieldArray, useForm } from 'react-hook-form' import { Textarea, TextInput } from 'react-hook-form-mantine' import { type Merge } from 'type-fest' @@ -101,7 +101,7 @@ const EditServicePage = () => { > const attributeBase: { - [key in AttrSectionKeys]: AttrSectionVals[] + [key in AttrSectionKeys]: ReactNode[] } = { clientsServed: [], cost: [], @@ -111,12 +111,14 @@ const EditServicePage = () => { } const [attributes, setAttributes] = useState(attributeBase) + console.log(`🚀 ~ EditServicePage ~ attributes:`, attributes) + useEffect(() => { if (!attributeMap) return const attrToSet = attributeBase for (const [i, item] of dataAttributes.entries()) { - const attribDef = attributeMap.get(item.attributeId) + const attribDef = attributeMap.byId.get(item.attributeId) console.log(`🚀 ~ useEffect ~ attribDef:`, attribDef) @@ -129,13 +131,33 @@ const EditServicePage = () => { switch (attribNs) { case 'tpop': { - attrToSet.clientsServed.push({ - ...item, - _rhfName: `attributes.${i}.text.text`, - _rhfLabel: 'Target Population', - }) + // attrToSet.clientsServed.push({ + // ...item, + // _rhfName: `attributes.${i}.text.text`, + // _rhfLabel: 'Target Population', + // }) + attrToSet.clientsServed.push( + } + name={`attributes.${i}.text.text`} + control={form.control} + label='Target Population' + data-isDirty={form.getFieldState(`attributes.${i}.text.text`).isDirty} + autosize + /> + ) break } + case 'cost': { + if (attribDef.tag === 'cost-free') + // attrToSet.cost.push({ + // ...item, + // _rhfName: `attributes.${i}`, + // _rhfLabel: 'Cost', + // }) + break + } } } setAttributes(attrToSet) @@ -183,17 +205,18 @@ const EditServicePage = () => { {t('service.get-help')} {attributes.clientsServed.length ? ( - attributes.clientsServed.map(({ _rhfName, _rhfLabel, ...item }) => ( - } - name={_rhfName} - control={form.control} - label={_rhfLabel} - data-isDirty={form.getFieldState(_rhfName).isDirty} - autosize - /> - )) + // attributes.clientsServed.map(({ _rhfName, _rhfLabel, ...item }) => ( + // } + // name={_rhfName} + // control={form.control} + // label={_rhfLabel} + // data-isDirty={form.getFieldState(_rhfName).isDirty} + // autosize + // /> + // )) + attributes.clientsServed ) : (