{"version":3,"file":"createFeaturePage.mjs","sources":["../../../src/lib/feature/createFeaturePage.tsx"],"sourcesContent":["/* eslint-disable react-refresh/only-export-components */\n/* @refresh reset */\n/**\n * @file Create Feature Page\n * @description Factory to generate standardized feature pages (auth + flags + vm + view)\n * Performance optimized: static styles extracted to module-level constants\n */\n\nimport React, { Suspense, useMemo, memo, useCallback, type CSSProperties } from 'react';\nimport { useAuth } from '../auth/useAuth';\nimport { useFeatureFlag } from '../flags/useFeatureFlag';\nimport { QueryErrorBoundary } from '../monitoring/QueryErrorBoundary';\nimport { Spinner } from '../ui/feedback/Spinner';\nimport type { CreateFeatureOptions, FeatureConfig, FeatureViewModel } from './types';\nimport { hasFeatureAccess } from './types';\n\n// ============================================================================\n// STATIC STYLES - Extracted outside components to prevent re-creation\n// ============================================================================\n\n// Loading component styles\nconst loadingContainerStyle: CSSProperties = {\n  display: 'flex',\n  alignItems: 'center',\n  justifyContent: 'center',\n  minHeight: '200px',\n};\n\n// Error component styles\nconst errorContainerStyle: CSSProperties = {\n  display: 'flex',\n  flexDirection: 'column',\n  alignItems: 'center',\n  justifyContent: 'center',\n  padding: '2rem',\n  textAlign: 'center',\n};\n\nconst errorTitleStyle: CSSProperties = {\n  color: '#dc2626',\n  marginBottom: '1rem',\n};\n\nconst errorMessageStyle: CSSProperties = {\n  color: '#6b7280',\n  marginBottom: '1rem',\n};\n\nconst retryButtonStyle: CSSProperties = {\n  padding: '0.5rem 1rem',\n  backgroundColor: '#3b82f6',\n  color: 'white',\n  border: 'none',\n  borderRadius: '0.375rem',\n  cursor: 'pointer',\n};\n\n// Access denied / Feature not available component styles\nconst statusContainerStyle: CSSProperties = {\n  display: 'flex',\n  flexDirection: 'column',\n  alignItems: 'center',\n  justifyContent: 'center',\n  padding: '2rem',\n  textAlign: 'center',\n  minHeight: '300px',\n};\n\nconst warningIconStyle: CSSProperties = {\n  width: '4rem',\n  height: '4rem',\n  color: '#f59e0b',\n  marginBottom: '1rem',\n};\n\nconst grayIconStyle: CSSProperties = {\n  width: '4rem',\n  height: '4rem',\n  color: '#6b7280',\n  marginBottom: '1rem',\n};\n\nconst statusTitleStyle: CSSProperties = {\n  fontSize: '1.25rem',\n  fontWeight: '600',\n  marginBottom: '0.5rem',\n};\n\nconst statusDescriptionStyle: CSSProperties = {\n  color: '#6b7280',\n};\n\n// Page header styles\nconst pageHeaderContainerStyle: CSSProperties = {\n  marginBottom: '1.5rem',\n};\n\nconst tabContainerStyle: CSSProperties = {\n  display: 'flex',\n  gap: '0.5rem',\n  borderBottom: '1px solid #e5e7eb',\n};\n\nconst tabBadgeStyle: CSSProperties = {\n  marginLeft: '0.5rem',\n  padding: '0.125rem 0.5rem',\n  fontSize: '0.75rem',\n  backgroundColor: '#e5e7eb',\n  borderRadius: '9999px',\n};\n\n// ============================================================================\n// DEFAULT COMPONENTS\n// ============================================================================\n\n/**\n * Default loading component - memoized\n */\nconst DefaultLoading = memo(() => {\n  return (\n    <div style={loadingContainerStyle}>\n      <Spinner size=\"lg\" />\n    </div>\n  );\n});\n\nDefaultLoading.displayName = 'DefaultLoading';\n\n/**\n * Default error component - memoized\n */\nconst DefaultError = memo(({ error, retry }: { error: Error; retry: () => void }) => {\n  return (\n    <div style={errorContainerStyle}>\n      <h2 style={errorTitleStyle}>Failed to load</h2>\n      <p style={errorMessageStyle}>{error.message}</p>\n      <button onClick={retry} style={retryButtonStyle}>\n        Try Again\n      </button>\n    </div>\n  );\n});\n\nDefaultError.displayName = 'DefaultError';\n\n/**\n * Access denied component - memoized\n */\nconst AccessDenied = memo(({ reason }: { reason: string }) => {\n  return (\n    <div style={statusContainerStyle}>\n      <svg style={warningIconStyle} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n        <path\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n          strokeWidth={2}\n          d=\"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z\"\n        />\n      </svg>\n      <h2 style={statusTitleStyle}>Access Denied</h2>\n      <p style={statusDescriptionStyle}>{reason}</p>\n    </div>\n  );\n});\n\nAccessDenied.displayName = 'AccessDenied';\n\n/**\n * Feature not available component (feature flag disabled) - memoized\n */\nconst FeatureNotAvailable = memo(({ featureName }: { featureName: string }) => {\n  return (\n    <div style={statusContainerStyle}>\n      <svg style={grayIconStyle} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n        <path\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n          strokeWidth={2}\n          d=\"M18.364 18.364A9 9 0 005.636 5.636m12.728 12.728A9 9 0 015.636 5.636m12.728 12.728L5.636 5.636\"\n        />\n      </svg>\n      <h2 style={statusTitleStyle}>Feature Not Available</h2>\n      <p style={statusDescriptionStyle}>{featureName} is currently not available.</p>\n    </div>\n  );\n});\n\nFeatureNotAvailable.displayName = 'FeatureNotAvailable';\n\n/**\n * Page header component - memoized\n */\nconst PageHeader = memo(\n  ({\n    config,\n    activeTab,\n    onTabChange,\n  }: {\n    config: FeatureConfig;\n    activeTab?: string;\n    onTabChange?: (tab: string) => void;\n  }) => {\n    const { metadata, tabs, showTitle = true } = config;\n\n    // Memoize title style based on tabs presence\n    const titleStyle = useMemo<CSSProperties>(\n      () => ({\n        fontSize: '1.5rem',\n        fontWeight: '600',\n        marginBottom: (tabs?.length ?? 0) > 0 ? '1rem' : 0,\n      }),\n      [tabs?.length]\n    );\n\n    // Memoize tab button style generator\n    const getTabButtonStyle = useCallback(\n      (tab: { id: string; disabled?: boolean }): CSSProperties => ({\n        padding: '0.75rem 1rem',\n        border: 'none',\n        background: 'none',\n        cursor: (tab.disabled ?? false) ? 'not-allowed' : 'pointer',\n        opacity: (tab.disabled ?? false) ? 0.5 : 1,\n        borderBottom: activeTab === tab.id ? '2px solid #3b82f6' : '2px solid transparent',\n        color: activeTab === tab.id ? '#3b82f6' : '#6b7280',\n        fontWeight: activeTab === tab.id ? '500' : '400',\n      }),\n      [activeTab]\n    );\n\n    // Stable tab click handler using data-* attributes\n    const handleTabClick = useCallback(\n      (event: React.MouseEvent<HTMLButtonElement>): void => {\n        const { tabId } = event.currentTarget.dataset;\n        if (tabId !== undefined && onTabChange !== undefined) {\n          onTabChange(tabId);\n        }\n      },\n      [onTabChange]\n    );\n\n    return (\n      <div style={pageHeaderContainerStyle}>\n        {showTitle && <h1 style={titleStyle}>{metadata.name}</h1>}\n\n        {tabs !== undefined && tabs.length > 0 && (\n          <div style={tabContainerStyle}>\n            {tabs.map((tab) => (\n              <button\n                key={tab.id}\n                data-tab-id={tab.id}\n                onClick={handleTabClick}\n                disabled={tab.disabled}\n                style={getTabButtonStyle(tab)}\n              >\n                {tab.label}\n                {tab.badge !== undefined && <span style={tabBadgeStyle}>{tab.badge}</span>}\n              </button>\n            ))}\n          </div>\n        )}\n      </div>\n    );\n  }\n);\n\nPageHeader.displayName = 'PageHeader';\n\n// ============================================================================\n// FEATURE PAGE FACTORY\n// ============================================================================\n\n/**\n * Create a standardized feature page component\n */\nexport function createFeaturePage<\n  TData = unknown,\n  TViewModel extends FeatureViewModel<TData> = FeatureViewModel<TData>,\n>(options: CreateFeatureOptions<TData, TViewModel>): React.FC {\n  const {\n    config,\n    useViewModel,\n    View,\n    Loading = DefaultLoading,\n    Error: ErrorComponent = DefaultError,\n  } = options;\n\n  /**\n   * Inner feature content component\n   */\n  function FeatureContent(): React.ReactElement {\n    const viewModel = useViewModel();\n\n    if (viewModel.isLoading && viewModel.data === undefined) {\n      return <Loading />;\n    }\n\n    return (\n      <>\n        <PageHeader\n          config={config}\n          activeTab={viewModel.activeTab}\n          onTabChange={viewModel.setActiveTab}\n        />\n        <View viewModel={viewModel} isLoading={viewModel.isLoading} />\n      </>\n    );\n  }\n\n  /**\n   * Feature page component with guards\n   */\n  function FeaturePage(): React.ReactElement {\n    const { roles, isAuthenticated } = useAuth();\n    const featureFlagEnabled = useFeatureFlag(config.access.featureFlag ?? '');\n\n    // Collect all enabled flags for access check\n    const enabledFlags = useMemo(() => {\n      const flags: string[] = [];\n      if (config.access.featureFlag !== undefined && featureFlagEnabled) {\n        flags.push(config.access.featureFlag);\n      }\n      // In a real app, you'd check all required flags here\n      return flags;\n    }, [featureFlagEnabled]);\n\n    // Check access\n    const hasAccess = useMemo(() => {\n      return hasFeatureAccess(config.access, roles, enabledFlags);\n    }, [roles, enabledFlags]);\n\n    // Check feature flag\n    if (config.access.featureFlag !== undefined && !featureFlagEnabled) {\n      return <FeatureNotAvailable featureName={config.metadata.name} />;\n    }\n\n    // Check authentication\n    if ((config.access.requireAuth ?? false) && !isAuthenticated) {\n      return <AccessDenied reason=\"Please log in to access this feature.\" />;\n    }\n\n    // Check role-based access\n    if (!hasAccess) {\n      return <AccessDenied reason=\"You don't have permission to access this feature.\" />;\n    }\n\n    return (\n      <QueryErrorBoundary\n        queryKey={config.metadata.id}\n        fallback={({ error, retry }) => (\n          <ErrorComponent\n            error={error instanceof Error ? error : new Error(error?.message ?? 'Unknown error')}\n            retry={retry}\n          />\n        )}\n      >\n        <Suspense fallback={config.loadingFallback ?? <Loading />}>\n          <FeatureContent />\n        </Suspense>\n      </QueryErrorBoundary>\n    );\n  }\n\n  // Set display name for debugging\n  FeaturePage.displayName = `FeaturePage(${config.metadata.id})`;\n\n  return FeaturePage;\n}\n\n/**\n * Create a feature page with lazy loading\n */\nexport function createLazyFeaturePage<\n  TData = unknown,\n  TViewModel extends FeatureViewModel<TData> = FeatureViewModel<TData>,\n>(\n  optionsFactory: () => Promise<{ default: CreateFeatureOptions<TData, TViewModel> }>\n): React.LazyExoticComponent<React.FC> {\n  return React.lazy(async () => {\n    const { default: options } = await optionsFactory();\n    return { default: createFeaturePage(options) };\n  });\n}\n"],"names":["loadingContainerStyle","errorContainerStyle","errorTitleStyle","errorMessageStyle","retryButtonStyle","statusContainerStyle","warningIconStyle","grayIconStyle","statusTitleStyle","statusDescriptionStyle","pageHeaderContainerStyle","tabContainerStyle","tabBadgeStyle","DefaultLoading","memo","jsx","Spinner","DefaultError","error","retry","jsxs","AccessDenied","reason","FeatureNotAvailable","featureName","PageHeader","config","activeTab","onTabChange","metadata","tabs","showTitle","titleStyle","useMemo","getTabButtonStyle","useCallback","tab","handleTabClick","event","tabId","createFeaturePage","options","useViewModel","View","Loading","ErrorComponent","FeatureContent","viewModel","Fragment","FeaturePage","roles","isAuthenticated","useAuth","featureFlagEnabled","useFeatureFlag","enabledFlags","flags","hasAccess","hasFeatureAccess","QueryErrorBoundary","Suspense","createLazyFeaturePage","optionsFactory","React"],"mappings":";;;;;;;AAqBA,MAAMA,IAAuC;AAAA,EAC3C,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,WAAW;AACb,GAGMC,IAAqC;AAAA,EACzC,SAAS;AAAA,EACT,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,SAAS;AAAA,EACT,WAAW;AACb,GAEMC,IAAiC;AAAA,EACrC,OAAO;AAAA,EACP,cAAc;AAChB,GAEMC,IAAmC;AAAA,EACvC,OAAO;AAAA,EACP,cAAc;AAChB,GAEMC,IAAkC;AAAA,EACtC,SAAS;AAAA,EACT,iBAAiB;AAAA,EACjB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,QAAQ;AACV,GAGMC,IAAsC;AAAA,EAC1C,SAAS;AAAA,EACT,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,SAAS;AAAA,EACT,WAAW;AAAA,EACX,WAAW;AACb,GAEMC,IAAkC;AAAA,EACtC,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,cAAc;AAChB,GAEMC,IAA+B;AAAA,EACnC,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,cAAc;AAChB,GAEMC,IAAkC;AAAA,EACtC,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,cAAc;AAChB,GAEMC,IAAwC;AAAA,EAC5C,OAAO;AACT,GAGMC,IAA0C;AAAA,EAC9C,cAAc;AAChB,GAEMC,IAAmC;AAAA,EACvC,SAAS;AAAA,EACT,KAAK;AAAA,EACL,cAAc;AAChB,GAEMC,IAA+B;AAAA,EACnC,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,cAAc;AAChB,GASMC,IAAiBC,EAAK,MAExB,gBAAAC,EAAC,SAAI,OAAOf,GACV,4BAACgB,GAAA,EAAQ,MAAK,MAAK,EAAA,CACrB,CAEH;AAEDH,EAAe,cAAc;AAK7B,MAAMI,IAAeH,EAAK,CAAC,EAAE,OAAAI,GAAO,OAAAC,QAEhC,gBAAAC,EAAC,OAAA,EAAI,OAAOnB,GACV,UAAA;AAAA,EAAA,gBAAAc,EAAC,MAAA,EAAG,OAAOb,GAAiB,UAAA,kBAAc;AAAA,EAC1C,gBAAAa,EAAC,KAAA,EAAE,OAAOZ,GAAoB,YAAM,SAAQ;AAAA,oBAC3C,UAAA,EAAO,SAASgB,GAAO,OAAOf,GAAkB,UAAA,YAAA,CAEjD;AAAA,GACF,CAEH;AAEDa,EAAa,cAAc;AAK3B,MAAMI,IAAeP,EAAK,CAAC,EAAE,QAAAQ,QAEzB,gBAAAF,EAAC,OAAA,EAAI,OAAOf,GACV,UAAA;AAAA,EAAA,gBAAAU,EAAC,OAAA,EAAI,OAAOT,GAAkB,MAAK,QAAO,SAAQ,aAAY,QAAO,gBACnE,UAAA,gBAAAS;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,eAAc;AAAA,MACd,gBAAe;AAAA,MACf,aAAa;AAAA,MACb,GAAE;AAAA,IAAA;AAAA,EAAA,GAEN;AAAA,EACA,gBAAAA,EAAC,MAAA,EAAG,OAAOP,GAAkB,UAAA,iBAAa;AAAA,EAC1C,gBAAAO,EAAC,KAAA,EAAE,OAAON,GAAyB,UAAAa,EAAA,CAAO;AAAA,GAC5C,CAEH;AAEDD,EAAa,cAAc;AAK3B,MAAME,IAAsBT,EAAK,CAAC,EAAE,aAAAU,QAEhC,gBAAAJ,EAAC,OAAA,EAAI,OAAOf,GACV,UAAA;AAAA,EAAA,gBAAAU,EAAC,OAAA,EAAI,OAAOR,GAAe,MAAK,QAAO,SAAQ,aAAY,QAAO,gBAChE,UAAA,gBAAAQ;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,eAAc;AAAA,MACd,gBAAe;AAAA,MACf,aAAa;AAAA,MACb,GAAE;AAAA,IAAA;AAAA,EAAA,GAEN;AAAA,EACA,gBAAAA,EAAC,MAAA,EAAG,OAAOP,GAAkB,UAAA,yBAAqB;AAAA,EAClD,gBAAAY,EAAC,KAAA,EAAE,OAAOX,GAAyB,UAAA;AAAA,IAAAe;AAAA,IAAY;AAAA,EAAA,EAAA,CAA4B;AAAA,GAC7E,CAEH;AAEDD,EAAoB,cAAc;AAKlC,MAAME,IAAaX;AAAA,EACjB,CAAC;AAAA,IACC,QAAAY;AAAA,IACA,WAAAC;AAAA,IACA,aAAAC;AAAA,EAAA,MAKI;AACJ,UAAM,EAAE,UAAAC,GAAU,MAAAC,GAAM,WAAAC,IAAY,OAASL,GAGvCM,IAAaC;AAAA,MACjB,OAAO;AAAA,QACL,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,eAAeH,GAAM,UAAU,KAAK,IAAI,SAAS;AAAA,MAAA;AAAA,MAEnD,CAACA,GAAM,MAAM;AAAA,IAAA,GAITI,IAAoBC;AAAA,MACxB,CAACC,OAA4D;AAAA,QAC3D,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,QAASA,EAAI,YAAY,KAAS,gBAAgB;AAAA,QAClD,SAAUA,EAAI,YAAY,KAAS,MAAM;AAAA,QACzC,cAAcT,MAAcS,EAAI,KAAK,sBAAsB;AAAA,QAC3D,OAAOT,MAAcS,EAAI,KAAK,YAAY;AAAA,QAC1C,YAAYT,MAAcS,EAAI,KAAK,QAAQ;AAAA,MAAA;AAAA,MAE7C,CAACT,CAAS;AAAA,IAAA,GAINU,IAAiBF;AAAA,MACrB,CAACG,MAAqD;AACpD,cAAM,EAAE,OAAAC,EAAA,IAAUD,EAAM,cAAc;AACtC,QAAIC,MAAU,UAAaX,MAAgB,UACzCA,EAAYW,CAAK;AAAA,MAErB;AAAA,MACA,CAACX,CAAW;AAAA,IAAA;AAGd,WACE,gBAAAR,EAAC,OAAA,EAAI,OAAOV,GACT,UAAA;AAAA,MAAAqB,KAAa,gBAAAhB,EAAC,MAAA,EAAG,OAAOiB,GAAa,YAAS,MAAK;AAAA,MAEnDF,MAAS,UAAaA,EAAK,SAAS,KACnC,gBAAAf,EAAC,OAAA,EAAI,OAAOJ,GACT,UAAAmB,EAAK,IAAI,CAACM,MACT,gBAAAhB;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,eAAagB,EAAI;AAAA,UACjB,SAASC;AAAA,UACT,UAAUD,EAAI;AAAA,UACd,OAAOF,EAAkBE,CAAG;AAAA,UAE3B,UAAA;AAAA,YAAAA,EAAI;AAAA,YACJA,EAAI,UAAU,UAAa,gBAAArB,EAAC,UAAK,OAAOH,GAAgB,YAAI,MAAA,CAAM;AAAA,UAAA;AAAA,QAAA;AAAA,QAP9DwB,EAAI;AAAA,MAAA,CASZ,EAAA,CACH;AAAA,IAAA,GAEJ;AAAA,EAEJ;AACF;AAEAX,EAAW,cAAc;AASlB,SAASe,EAGdC,GAA4D;AAC5D,QAAM;AAAA,IACJ,QAAAf;AAAA,IACA,cAAAgB;AAAA,IACA,MAAAC;AAAA,IACA,SAAAC,IAAU/B;AAAA,IACV,OAAOgC,IAAiB5B;AAAA,EAAA,IACtBwB;AAKJ,WAASK,IAAqC;AAC5C,UAAMC,IAAYL,EAAA;AAElB,WAAIK,EAAU,aAAaA,EAAU,SAAS,2BACpCH,GAAA,EAAQ,IAIhB,gBAAAxB,EAAA4B,GAAA,EACE,UAAA;AAAA,MAAA,gBAAAjC;AAAA,QAACU;AAAA,QAAA;AAAA,UACC,QAAAC;AAAA,UACA,WAAWqB,EAAU;AAAA,UACrB,aAAaA,EAAU;AAAA,QAAA;AAAA,MAAA;AAAA,MAEzB,gBAAAhC,EAAC4B,GAAA,EAAK,WAAAI,GAAsB,WAAWA,EAAU,UAAA,CAAW;AAAA,IAAA,GAC9D;AAAA,EAEJ;AAKA,WAASE,IAAkC;AACzC,UAAM,EAAE,OAAAC,GAAO,iBAAAC,EAAA,IAAoBC,EAAA,GAC7BC,IAAqBC,EAAe5B,EAAO,OAAO,eAAe,EAAE,GAGnE6B,IAAetB,EAAQ,MAAM;AACjC,YAAMuB,IAAkB,CAAA;AACxB,aAAI9B,EAAO,OAAO,gBAAgB,UAAa2B,KAC7CG,EAAM,KAAK9B,EAAO,OAAO,WAAW,GAG/B8B;AAAA,IACT,GAAG,CAACH,CAAkB,CAAC,GAGjBI,IAAYxB,EAAQ,MACjByB,EAAiBhC,EAAO,QAAQwB,GAAOK,CAAY,GACzD,CAACL,GAAOK,CAAY,CAAC;AAGxB,WAAI7B,EAAO,OAAO,gBAAgB,UAAa,CAAC2B,IACvC,gBAAAtC,EAACQ,GAAA,EAAoB,aAAaG,EAAO,SAAS,MAAM,KAI5DA,EAAO,OAAO,eAAe,OAAU,CAACyB,IACpC,gBAAApC,EAACM,GAAA,EAAa,QAAO,wCAAA,CAAwC,IAIjEoC,IAKH,gBAAA1C;AAAA,MAAC4C;AAAA,MAAA;AAAA,QACC,UAAUjC,EAAO,SAAS;AAAA,QAC1B,UAAU,CAAC,EAAE,OAAAR,GAAO,OAAAC,QAClB,gBAAAJ;AAAA,UAAC8B;AAAA,UAAA;AAAA,YACC,OAAO3B,aAAiB,QAAQA,IAAQ,IAAI,MAAMA,GAAO,WAAW,eAAe;AAAA,YACnF,OAAAC;AAAA,UAAA;AAAA,QAAA;AAAA,QAIJ,UAAA,gBAAAJ,EAAC6C,GAAA,EAAS,UAAUlC,EAAO,qCAAoBkB,GAAA,CAAA,CAAQ,GACrD,UAAA,gBAAA7B,EAAC+B,GAAA,CAAA,CAAe,EAAA,CAClB;AAAA,MAAA;AAAA,IAAA,IAfK,gBAAA/B,EAACM,GAAA,EAAa,QAAO,oDAAA,CAAoD;AAAA,EAkBpF;AAGA,SAAA4B,EAAY,cAAc,eAAevB,EAAO,SAAS,EAAE,KAEpDuB;AACT;AAKO,SAASY,GAIdC,GACqC;AACrC,SAAOC,EAAM,KAAK,YAAY;AAC5B,UAAM,EAAE,SAAStB,EAAA,IAAY,MAAMqB,EAAA;AACnC,WAAO,EAAE,SAAStB,EAAkBC,CAAO,EAAA;AAAA,EAC7C,CAAC;AACH;"}