@edx/frontend-plugin-advertisements 2.16.0 → 2.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -9,6 +9,7 @@ var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
|
9
9
|
var _analytics = require("@edx/frontend-platform/analytics");
|
|
10
10
|
var _auth = require("@edx/frontend-platform/auth");
|
|
11
11
|
var _i18n = require("@edx/frontend-platform/i18n");
|
|
12
|
+
var _logging = require("@edx/frontend-platform/logging");
|
|
12
13
|
var _paragon = require("@openedx/paragon");
|
|
13
14
|
var _icons = require("@openedx/paragon/icons");
|
|
14
15
|
var _modelStore = require("@src/generic/model-store");
|
|
@@ -21,7 +22,46 @@ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbol
|
|
|
21
22
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
22
23
|
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
23
24
|
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
24
|
-
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } /* eslint import/no-unresolved: 0 */
|
|
25
|
+
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } /* eslint import/no-unresolved: 0 */
|
|
26
|
+
const trackOptimizelyEventWhenReady = async (optimizely, eventKey, userId, eventTags) => {
|
|
27
|
+
(0, _logging.logInfo)('AuditExpiry trackOptimizelyEventWhenReady start', {
|
|
28
|
+
eventKey,
|
|
29
|
+
userId,
|
|
30
|
+
hasOptimizely: Boolean(optimizely),
|
|
31
|
+
eventTags
|
|
32
|
+
});
|
|
33
|
+
if (!optimizely) {
|
|
34
|
+
(0, _logging.logInfo)('AuditExpiry trackOptimizelyEventWhenReady no optimizely', {
|
|
35
|
+
eventKey
|
|
36
|
+
});
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
if (typeof optimizely.onReady === 'function') {
|
|
40
|
+
(0, _logging.logInfo)('AuditExpiry trackOptimizelyEventWhenReady waiting onReady', {
|
|
41
|
+
eventKey
|
|
42
|
+
});
|
|
43
|
+
const readyResult = await optimizely.onReady();
|
|
44
|
+
(0, _logging.logInfo)('AuditExpiry trackOptimizelyEventWhenReady onReady result', {
|
|
45
|
+
eventKey,
|
|
46
|
+
readyResult
|
|
47
|
+
});
|
|
48
|
+
if (!readyResult?.success) {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
(0, _logging.logInfo)('AuditExpiry trackOptimizelyEventWhenReady calling track', {
|
|
53
|
+
eventKey,
|
|
54
|
+
userId,
|
|
55
|
+
eventTags
|
|
56
|
+
});
|
|
57
|
+
optimizely.track(eventKey, userId, eventTags);
|
|
58
|
+
(0, _logging.logInfo)('AuditExpiry trackOptimizelyEventWhenReady track called', {
|
|
59
|
+
eventKey
|
|
60
|
+
});
|
|
61
|
+
return true;
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
/**
|
|
25
65
|
* Access Expiration top-of-courseware banner.
|
|
26
66
|
*
|
|
27
67
|
* This is the plugin-architecture equivalent of the Learning MFE's
|
|
@@ -48,27 +88,80 @@ const AccessExpirationAlert = _ref => {
|
|
|
48
88
|
const experimentKey = accessExpiration?.experimentKey;
|
|
49
89
|
const expiryDays = accessExpiration?.expiryDays;
|
|
50
90
|
const variant = accessExpiration?.variant;
|
|
91
|
+
(0, _logging.logInfo)('AuditExpiry render', {
|
|
92
|
+
courseId,
|
|
93
|
+
hasAccessExpiration: Boolean(accessExpiration),
|
|
94
|
+
experimentKey,
|
|
95
|
+
variant,
|
|
96
|
+
expiryDays,
|
|
97
|
+
masqueradingExpiredCourse: accessExpiration?.masqueradingExpiredCourse
|
|
98
|
+
});
|
|
51
99
|
(0, _react.useEffect)(() => {
|
|
100
|
+
(0, _logging.logInfo)('AuditExpiry useEffect entered', {
|
|
101
|
+
courseId,
|
|
102
|
+
experimentKey,
|
|
103
|
+
variant,
|
|
104
|
+
expiryDays,
|
|
105
|
+
alreadyTracked: hasTrackedBannerView.current
|
|
106
|
+
});
|
|
52
107
|
if (!experimentKey || !variant || hasTrackedBannerView.current) {
|
|
53
|
-
|
|
108
|
+
(0, _logging.logInfo)('AuditExpiry useEffect skipped', {
|
|
109
|
+
courseId,
|
|
110
|
+
experimentKey,
|
|
111
|
+
variant,
|
|
112
|
+
alreadyTracked: hasTrackedBannerView.current
|
|
113
|
+
});
|
|
114
|
+
return undefined;
|
|
54
115
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
116
|
+
let isMounted = true;
|
|
117
|
+
const trackBannerShown = async () => {
|
|
118
|
+
try {
|
|
119
|
+
const optimizely = (0, _optimizely.getOptimizely)();
|
|
120
|
+
(0, _logging.logInfo)('AuditExpiry trackBannerShown getOptimizely', {
|
|
121
|
+
hasOptimizely: Boolean(optimizely),
|
|
122
|
+
hasOnReady: typeof optimizely?.onReady === 'function',
|
|
123
|
+
hasTrack: typeof optimizely?.track === 'function'
|
|
124
|
+
});
|
|
125
|
+
if (!optimizely) {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
58
128
|
const {
|
|
59
129
|
userId
|
|
60
130
|
} = (0, _auth.getAuthenticatedUser)();
|
|
61
|
-
|
|
131
|
+
(0, _logging.logInfo)('AuditExpiry trackBannerShown user', {
|
|
132
|
+
userId
|
|
133
|
+
});
|
|
134
|
+
const didTrack = await trackOptimizelyEventWhenReady(optimizely, 'audit_expiry_urgency_banner_shown', userId.toString(), {
|
|
62
135
|
experimentKey,
|
|
63
136
|
variant,
|
|
64
137
|
expiryDays,
|
|
65
138
|
courseId
|
|
66
139
|
});
|
|
67
|
-
|
|
140
|
+
if (didTrack && isMounted) {
|
|
141
|
+
hasTrackedBannerView.current = true;
|
|
142
|
+
(0, _logging.logInfo)('AuditExpiry trackBannerShown marked tracked', {
|
|
143
|
+
courseId,
|
|
144
|
+
experimentKey,
|
|
145
|
+
variant
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
} catch (error) {
|
|
149
|
+
(0, _logging.logError)(error, {
|
|
150
|
+
source: 'AuditExpiry trackBannerShown',
|
|
151
|
+
courseId,
|
|
152
|
+
experimentKey,
|
|
153
|
+
variant
|
|
154
|
+
});
|
|
155
|
+
// Never break the banner experience if analytics fails.
|
|
68
156
|
}
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
|
|
157
|
+
};
|
|
158
|
+
trackBannerShown();
|
|
159
|
+
return () => {
|
|
160
|
+
isMounted = false;
|
|
161
|
+
(0, _logging.logInfo)('AuditExpiry useEffect cleanup', {
|
|
162
|
+
courseId
|
|
163
|
+
});
|
|
164
|
+
};
|
|
72
165
|
}, [courseId, experimentKey, expiryDays, variant]);
|
|
73
166
|
|
|
74
167
|
// Match original MFE logic.
|
|
@@ -81,6 +174,12 @@ const AccessExpirationAlert = _ref => {
|
|
|
81
174
|
upgradeUrl
|
|
82
175
|
} = accessExpiration;
|
|
83
176
|
const logClick = () => {
|
|
177
|
+
(0, _logging.logInfo)('AuditExpiry logClick entered', {
|
|
178
|
+
courseId,
|
|
179
|
+
experimentKey,
|
|
180
|
+
variant,
|
|
181
|
+
expiryDays
|
|
182
|
+
});
|
|
84
183
|
// Keep analytics identical to the temporary in-course wiring:
|
|
85
184
|
// analyticsPageName === 'in_course'
|
|
86
185
|
const analyticsPageName = 'in_course';
|
|
@@ -95,11 +194,19 @@ const AccessExpirationAlert = _ref => {
|
|
|
95
194
|
if (experimentKey && variant) {
|
|
96
195
|
try {
|
|
97
196
|
const optimizely = (0, _optimizely.getOptimizely)();
|
|
197
|
+
(0, _logging.logInfo)('AuditExpiry logClick getOptimizely', {
|
|
198
|
+
hasOptimizely: Boolean(optimizely),
|
|
199
|
+
hasOnReady: typeof optimizely?.onReady === 'function',
|
|
200
|
+
hasTrack: typeof optimizely?.track === 'function'
|
|
201
|
+
});
|
|
98
202
|
if (optimizely) {
|
|
99
203
|
const {
|
|
100
204
|
userId
|
|
101
205
|
} = (0, _auth.getAuthenticatedUser)();
|
|
102
|
-
|
|
206
|
+
(0, _logging.logInfo)('AuditExpiry logClick user', {
|
|
207
|
+
userId
|
|
208
|
+
});
|
|
209
|
+
trackOptimizelyEventWhenReady(optimizely, 'audit_expiry_urgency_upgrade_clicked', userId.toString(), {
|
|
103
210
|
experimentKey,
|
|
104
211
|
variant,
|
|
105
212
|
expiryDays,
|
|
@@ -107,6 +214,12 @@ const AccessExpirationAlert = _ref => {
|
|
|
107
214
|
});
|
|
108
215
|
}
|
|
109
216
|
} catch (error) {
|
|
217
|
+
(0, _logging.logError)(error, {
|
|
218
|
+
source: 'AuditExpiry logClick',
|
|
219
|
+
courseId,
|
|
220
|
+
experimentKey,
|
|
221
|
+
variant
|
|
222
|
+
});
|
|
110
223
|
// Never block the click-through path if analytics fails.
|
|
111
224
|
}
|
|
112
225
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AccessExpirationAlert.js","names":["_react","_interopRequireWildcard","require","_propTypes","_interopRequireDefault","_analytics","_auth","_i18n","_paragon","_icons","_modelStore","_optimizely","_messages","_jsxRuntime","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","ownKeys","keys","getOwnPropertySymbols","filter","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","_toPropertyKey","value","configurable","writable","_toPrimitive","Symbol","toPrimitive","TypeError","String","Number","AccessExpirationAlert","_ref","courseId","intl","useIntl","hasTrackedBannerView","useRef","org","userTimezone","useModel","accessExpiration","timezoneFormatArgs","timeZone","experimentKey","expiryDays","variant","useEffect","current","optimizely","getOptimizely","userId","getAuthenticatedUser","track","toString","error","masqueradingExpiredCourse","expirationDate","upgradeDeadline","upgradeUrl","logClick","analyticsPageName","sendTrackEvent","org_key","courserun_key","linkCategory","linkName","linkType","pageName","deadlineMessage","jsxs","Fragment","children","jsx","FormattedMessage","id","defaultMessage","description","values","date","FormattedDate","day","month","year","Hyperlink","className","style","textDecoration","destination","onClick","formatMessage","messages","upgradeNow","Alert","icon","Info","propTypes","PropTypes","string","isRequired","_default","exports"],"sources":["../../src/access-expiration-alert/AccessExpirationAlert.jsx"],"sourcesContent":["/* eslint import/no-unresolved: 0 */\nimport React, { useEffect, useRef } from 'react';\nimport PropTypes from 'prop-types';\n\nimport { sendTrackEvent } from '@edx/frontend-platform/analytics';\nimport { getAuthenticatedUser } from '@edx/frontend-platform/auth';\nimport { FormattedMessage, FormattedDate, useIntl } from '@edx/frontend-platform/i18n';\nimport { Alert, Hyperlink } from '@openedx/paragon';\nimport { Info } from '@openedx/paragon/icons';\n\nimport { useModel } from '@src/generic/model-store';\nimport { getOptimizely } from '../data/optimizely';\n\nimport messages from './messages';\n\n/**\n * Access Expiration top-of-courseware banner.\n *\n * This is the plugin-architecture equivalent of the Learning MFE's\n * `src/alerts/access-expiration-alert/AccessExpirationAlert.jsx`.\n *\n * It renders directly as a plugin widget (does NOT use the Learning MFE alert registration system).\n */\nconst AccessExpirationAlert = ({\n courseId,\n}) => {\n const intl = useIntl();\n const hasTrackedBannerView = useRef(false);\n\n const { org, userTimezone } = useModel('courseHomeMeta', courseId);\n const { accessExpiration } = useModel('coursewareMeta', courseId);\n\n const timezoneFormatArgs = userTimezone ? { timeZone: userTimezone } : {};\n const experimentKey = accessExpiration?.experimentKey;\n const expiryDays = accessExpiration?.expiryDays;\n const variant = accessExpiration?.variant;\n\n useEffect(() => {\n if (!experimentKey || !variant || hasTrackedBannerView.current) {\n return;\n }\n\n try {\n const optimizely = getOptimizely();\n if (optimizely) {\n const { userId } = getAuthenticatedUser();\n optimizely.track('audit_expiry_urgency_banner_shown', userId.toString(), {\n experimentKey,\n variant,\n expiryDays,\n courseId,\n });\n hasTrackedBannerView.current = true;\n }\n } catch (error) {\n // Never break the banner experience if analytics fails.\n }\n }, [courseId, experimentKey, expiryDays, variant]);\n\n // Match original MFE logic.\n if (!accessExpiration || accessExpiration.masqueradingExpiredCourse) {\n return null;\n }\n\n const {\n expirationDate,\n upgradeDeadline,\n upgradeUrl,\n } = accessExpiration;\n\n const logClick = () => {\n // Keep analytics identical to the temporary in-course wiring:\n // analyticsPageName === 'in_course'\n const analyticsPageName = 'in_course';\n sendTrackEvent('edx.bi.ecommerce.upsell_links_clicked', {\n org_key: org,\n courserun_key: courseId,\n linkCategory: 'FBE_banner',\n linkName: `${analyticsPageName}_audit_access_expires`,\n linkType: 'link',\n pageName: analyticsPageName,\n });\n\n if (experimentKey && variant) {\n try {\n const optimizely = getOptimizely();\n if (optimizely) {\n const { userId } = getAuthenticatedUser();\n optimizely.track('audit_expiry_urgency_upgrade_clicked', userId.toString(), {\n experimentKey,\n variant,\n expiryDays,\n courseId,\n });\n }\n } catch (error) {\n // Never block the click-through path if analytics fails.\n }\n }\n };\n\n let deadlineMessage = null;\n if (upgradeDeadline && upgradeUrl) {\n deadlineMessage = (\n <>\n <br />\n <FormattedMessage\n id=\"learning.accessExpiration.deadline\"\n defaultMessage=\"Upgrade by {date} to get unlimited access to the course as long as it exists on the site.\"\n description=\"Warning shown to learner to upgrade while they are enrolled on the audit version and it's possible to upgrade\"\n values={{\n date: (\n <FormattedDate\n key=\"accessExpirationUpgradeDeadline\"\n day=\"numeric\"\n month=\"short\"\n year=\"numeric\"\n value={upgradeDeadline}\n {...timezoneFormatArgs}\n />\n ),\n }}\n />\n \n <Hyperlink\n className=\"font-weight-bold\"\n style={{ textDecoration: 'underline' }}\n destination={upgradeUrl}\n onClick={logClick}\n >\n {intl.formatMessage(messages.upgradeNow)}\n </Hyperlink>\n </>\n );\n }\n\n return (\n <Alert variant=\"info\" icon={Info}>\n <span className=\"font-weight-bold\">\n <FormattedMessage\n id=\"learning.accessExpiration.header\"\n defaultMessage=\"Audit Access Expires {date}\"\n description=\"Headline for auditing deadline\"\n values={{\n date: (\n <FormattedDate\n key=\"accessExpirationHeaderDate\"\n day=\"numeric\"\n month=\"short\"\n year=\"numeric\"\n value={expirationDate}\n {...timezoneFormatArgs}\n />\n ),\n }}\n />\n </span>\n <br />\n <FormattedMessage\n id=\"learning.accessExpiration.body\"\n defaultMessage=\"You lose all access to this course, including your progress, on {date}.\"\n description=\"Message body to tell learner the consequences of course expiration.\"\n values={{\n date: (\n <FormattedDate\n key=\"accessExpirationBodyDate\"\n day=\"numeric\"\n month=\"short\"\n year=\"numeric\"\n value={expirationDate}\n {...timezoneFormatArgs}\n />\n ),\n }}\n />\n {deadlineMessage}\n </Alert>\n );\n};\n\nAccessExpirationAlert.propTypes = {\n courseId: PropTypes.string.isRequired,\n};\n\nexport default AccessExpirationAlert;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"AccessExpirationAlert.js","names":["_react","_interopRequireWildcard","require","_propTypes","_interopRequireDefault","_analytics","_auth","_i18n","_logging","_paragon","_icons","_modelStore","_optimizely","_messages","_jsxRuntime","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","ownKeys","keys","getOwnPropertySymbols","filter","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","_toPropertyKey","value","configurable","writable","_toPrimitive","Symbol","toPrimitive","TypeError","String","Number","trackOptimizelyEventWhenReady","optimizely","eventKey","userId","eventTags","logInfo","hasOptimizely","Boolean","onReady","readyResult","success","track","AccessExpirationAlert","_ref","courseId","intl","useIntl","hasTrackedBannerView","useRef","org","userTimezone","useModel","accessExpiration","timezoneFormatArgs","timeZone","experimentKey","expiryDays","variant","hasAccessExpiration","masqueradingExpiredCourse","useEffect","alreadyTracked","current","undefined","isMounted","trackBannerShown","getOptimizely","hasOnReady","hasTrack","getAuthenticatedUser","didTrack","toString","error","logError","source","expirationDate","upgradeDeadline","upgradeUrl","logClick","analyticsPageName","sendTrackEvent","org_key","courserun_key","linkCategory","linkName","linkType","pageName","deadlineMessage","jsxs","Fragment","children","jsx","FormattedMessage","id","defaultMessage","description","values","date","FormattedDate","day","month","year","Hyperlink","className","style","textDecoration","destination","onClick","formatMessage","messages","upgradeNow","Alert","icon","Info","propTypes","PropTypes","string","isRequired","_default","exports"],"sources":["../../src/access-expiration-alert/AccessExpirationAlert.jsx"],"sourcesContent":["/* eslint import/no-unresolved: 0 */\nimport React, { useEffect, useRef } from 'react';\nimport PropTypes from 'prop-types';\n\nimport { sendTrackEvent } from '@edx/frontend-platform/analytics';\nimport { getAuthenticatedUser } from '@edx/frontend-platform/auth';\nimport { FormattedMessage, FormattedDate, useIntl } from '@edx/frontend-platform/i18n';\nimport { logError, logInfo } from '@edx/frontend-platform/logging';\nimport { Alert, Hyperlink } from '@openedx/paragon';\nimport { Info } from '@openedx/paragon/icons';\n\nimport { useModel } from '@src/generic/model-store';\nimport { getOptimizely } from '../data/optimizely';\n\nimport messages from './messages';\n\nconst trackOptimizelyEventWhenReady = async (optimizely, eventKey, userId, eventTags) => {\n logInfo('AuditExpiry trackOptimizelyEventWhenReady start', {\n eventKey,\n userId,\n hasOptimizely: Boolean(optimizely),\n eventTags,\n });\n\n if (!optimizely) {\n logInfo('AuditExpiry trackOptimizelyEventWhenReady no optimizely', { eventKey });\n return false;\n }\n\n if (typeof optimizely.onReady === 'function') {\n logInfo('AuditExpiry trackOptimizelyEventWhenReady waiting onReady', { eventKey });\n const readyResult = await optimizely.onReady();\n logInfo('AuditExpiry trackOptimizelyEventWhenReady onReady result', {\n eventKey,\n readyResult,\n });\n if (!readyResult?.success) {\n return false;\n }\n }\n\n logInfo('AuditExpiry trackOptimizelyEventWhenReady calling track', {\n eventKey,\n userId,\n eventTags,\n });\n optimizely.track(eventKey, userId, eventTags);\n logInfo('AuditExpiry trackOptimizelyEventWhenReady track called', { eventKey });\n return true;\n};\n\n/**\n * Access Expiration top-of-courseware banner.\n *\n * This is the plugin-architecture equivalent of the Learning MFE's\n * `src/alerts/access-expiration-alert/AccessExpirationAlert.jsx`.\n *\n * It renders directly as a plugin widget (does NOT use the Learning MFE alert registration system).\n */\nconst AccessExpirationAlert = ({\n courseId,\n}) => {\n const intl = useIntl();\n const hasTrackedBannerView = useRef(false);\n\n const { org, userTimezone } = useModel('courseHomeMeta', courseId);\n const { accessExpiration } = useModel('coursewareMeta', courseId);\n\n const timezoneFormatArgs = userTimezone ? { timeZone: userTimezone } : {};\n const experimentKey = accessExpiration?.experimentKey;\n const expiryDays = accessExpiration?.expiryDays;\n const variant = accessExpiration?.variant;\n\n logInfo('AuditExpiry render', {\n courseId,\n hasAccessExpiration: Boolean(accessExpiration),\n experimentKey,\n variant,\n expiryDays,\n masqueradingExpiredCourse: accessExpiration?.masqueradingExpiredCourse,\n });\n\n useEffect(() => {\n logInfo('AuditExpiry useEffect entered', {\n courseId,\n experimentKey,\n variant,\n expiryDays,\n alreadyTracked: hasTrackedBannerView.current,\n });\n\n if (!experimentKey || !variant || hasTrackedBannerView.current) {\n logInfo('AuditExpiry useEffect skipped', {\n courseId,\n experimentKey,\n variant,\n alreadyTracked: hasTrackedBannerView.current,\n });\n return undefined;\n }\n\n let isMounted = true;\n\n const trackBannerShown = async () => {\n try {\n const optimizely = getOptimizely();\n logInfo('AuditExpiry trackBannerShown getOptimizely', {\n hasOptimizely: Boolean(optimizely),\n hasOnReady: typeof optimizely?.onReady === 'function',\n hasTrack: typeof optimizely?.track === 'function',\n });\n if (!optimizely) {\n return;\n }\n\n const { userId } = getAuthenticatedUser();\n logInfo('AuditExpiry trackBannerShown user', { userId });\n const didTrack = await trackOptimizelyEventWhenReady(\n optimizely,\n 'audit_expiry_urgency_banner_shown',\n userId.toString(),\n {\n experimentKey,\n variant,\n expiryDays,\n courseId,\n },\n );\n\n if (didTrack && isMounted) {\n hasTrackedBannerView.current = true;\n logInfo('AuditExpiry trackBannerShown marked tracked', {\n courseId,\n experimentKey,\n variant,\n });\n }\n } catch (error) {\n logError(error, {\n source: 'AuditExpiry trackBannerShown',\n courseId,\n experimentKey,\n variant,\n });\n // Never break the banner experience if analytics fails.\n }\n };\n\n trackBannerShown();\n\n return () => {\n isMounted = false;\n logInfo('AuditExpiry useEffect cleanup', { courseId });\n };\n }, [courseId, experimentKey, expiryDays, variant]);\n\n // Match original MFE logic.\n if (!accessExpiration || accessExpiration.masqueradingExpiredCourse) {\n return null;\n }\n\n const {\n expirationDate,\n upgradeDeadline,\n upgradeUrl,\n } = accessExpiration;\n\n const logClick = () => {\n logInfo('AuditExpiry logClick entered', {\n courseId,\n experimentKey,\n variant,\n expiryDays,\n });\n // Keep analytics identical to the temporary in-course wiring:\n // analyticsPageName === 'in_course'\n const analyticsPageName = 'in_course';\n sendTrackEvent('edx.bi.ecommerce.upsell_links_clicked', {\n org_key: org,\n courserun_key: courseId,\n linkCategory: 'FBE_banner',\n linkName: `${analyticsPageName}_audit_access_expires`,\n linkType: 'link',\n pageName: analyticsPageName,\n });\n\n if (experimentKey && variant) {\n try {\n const optimizely = getOptimizely();\n logInfo('AuditExpiry logClick getOptimizely', {\n hasOptimizely: Boolean(optimizely),\n hasOnReady: typeof optimizely?.onReady === 'function',\n hasTrack: typeof optimizely?.track === 'function',\n });\n if (optimizely) {\n const { userId } = getAuthenticatedUser();\n logInfo('AuditExpiry logClick user', { userId });\n trackOptimizelyEventWhenReady(\n optimizely,\n 'audit_expiry_urgency_upgrade_clicked',\n userId.toString(),\n {\n experimentKey,\n variant,\n expiryDays,\n courseId,\n },\n );\n }\n } catch (error) {\n logError(error, {\n source: 'AuditExpiry logClick',\n courseId,\n experimentKey,\n variant,\n });\n // Never block the click-through path if analytics fails.\n }\n }\n };\n\n let deadlineMessage = null;\n if (upgradeDeadline && upgradeUrl) {\n deadlineMessage = (\n <>\n <br />\n <FormattedMessage\n id=\"learning.accessExpiration.deadline\"\n defaultMessage=\"Upgrade by {date} to get unlimited access to the course as long as it exists on the site.\"\n description=\"Warning shown to learner to upgrade while they are enrolled on the audit version and it's possible to upgrade\"\n values={{\n date: (\n <FormattedDate\n key=\"accessExpirationUpgradeDeadline\"\n day=\"numeric\"\n month=\"short\"\n year=\"numeric\"\n value={upgradeDeadline}\n {...timezoneFormatArgs}\n />\n ),\n }}\n />\n \n <Hyperlink\n className=\"font-weight-bold\"\n style={{ textDecoration: 'underline' }}\n destination={upgradeUrl}\n onClick={logClick}\n >\n {intl.formatMessage(messages.upgradeNow)}\n </Hyperlink>\n </>\n );\n }\n\n return (\n <Alert variant=\"info\" icon={Info}>\n <span className=\"font-weight-bold\">\n <FormattedMessage\n id=\"learning.accessExpiration.header\"\n defaultMessage=\"Audit Access Expires {date}\"\n description=\"Headline for auditing deadline\"\n values={{\n date: (\n <FormattedDate\n key=\"accessExpirationHeaderDate\"\n day=\"numeric\"\n month=\"short\"\n year=\"numeric\"\n value={expirationDate}\n {...timezoneFormatArgs}\n />\n ),\n }}\n />\n </span>\n <br />\n <FormattedMessage\n id=\"learning.accessExpiration.body\"\n defaultMessage=\"You lose all access to this course, including your progress, on {date}.\"\n description=\"Message body to tell learner the consequences of course expiration.\"\n values={{\n date: (\n <FormattedDate\n key=\"accessExpirationBodyDate\"\n day=\"numeric\"\n month=\"short\"\n year=\"numeric\"\n value={expirationDate}\n {...timezoneFormatArgs}\n />\n ),\n }}\n />\n {deadlineMessage}\n </Alert>\n );\n};\n\nAccessExpirationAlert.propTypes = {\n courseId: PropTypes.string.isRequired,\n};\n\nexport default AccessExpirationAlert;\n"],"mappings":";;;;;;AACA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AACA,IAAAC,UAAA,GAAAC,sBAAA,CAAAF,OAAA;AAEA,IAAAG,UAAA,GAAAH,OAAA;AACA,IAAAI,KAAA,GAAAJ,OAAA;AACA,IAAAK,KAAA,GAAAL,OAAA;AACA,IAAAM,QAAA,GAAAN,OAAA;AACA,IAAAO,QAAA,GAAAP,OAAA;AACA,IAAAQ,MAAA,GAAAR,OAAA;AAEA,IAAAS,WAAA,GAAAT,OAAA;AACA,IAAAU,WAAA,GAAAV,OAAA;AAEA,IAAAW,SAAA,GAAAT,sBAAA,CAAAF,OAAA;AAAkC,IAAAY,WAAA,GAAAZ,OAAA;AAAA,SAAAE,uBAAAW,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAAA,SAAAd,wBAAAc,CAAA,EAAAG,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAlB,uBAAA,YAAAA,CAAAc,CAAA,EAAAG,CAAA,SAAAA,CAAA,IAAAH,CAAA,IAAAA,CAAA,CAAAC,UAAA,SAAAD,CAAA,MAAAO,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAR,OAAA,EAAAF,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAS,CAAA,MAAAF,CAAA,GAAAJ,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAE,CAAA,CAAAI,GAAA,CAAAX,CAAA,UAAAO,CAAA,CAAAK,GAAA,CAAAZ,CAAA,GAAAO,CAAA,CAAAM,GAAA,CAAAb,CAAA,EAAAS,CAAA,gBAAAN,CAAA,IAAAH,CAAA,gBAAAG,CAAA,OAAAW,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAG,CAAA,OAAAK,CAAA,IAAAD,CAAA,GAAAS,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAG,CAAA,OAAAK,CAAA,CAAAI,GAAA,IAAAJ,CAAA,CAAAK,GAAA,IAAAN,CAAA,CAAAE,CAAA,EAAAN,CAAA,EAAAK,CAAA,IAAAC,CAAA,CAAAN,CAAA,IAAAH,CAAA,CAAAG,CAAA,WAAAM,CAAA,KAAAT,CAAA,EAAAG,CAAA;AAAA,SAAAgB,QAAAnB,CAAA,EAAAK,CAAA,QAAAF,CAAA,GAAAa,MAAA,CAAAI,IAAA,CAAApB,CAAA,OAAAgB,MAAA,CAAAK,qBAAA,QAAAd,CAAA,GAAAS,MAAA,CAAAK,qBAAA,CAAArB,CAAA,GAAAK,CAAA,KAAAE,CAAA,GAAAA,CAAA,CAAAe,MAAA,WAAAjB,CAAA,WAAAW,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAK,CAAA,EAAAkB,UAAA,OAAApB,CAAA,CAAAqB,IAAA,CAAAC,KAAA,CAAAtB,CAAA,EAAAI,CAAA,YAAAJ,CAAA;AAAA,SAAAuB,cAAA1B,CAAA,aAAAK,CAAA,MAAAA,CAAA,GAAAsB,SAAA,CAAAC,MAAA,EAAAvB,CAAA,UAAAF,CAAA,WAAAwB,SAAA,CAAAtB,CAAA,IAAAsB,SAAA,CAAAtB,CAAA,QAAAA,CAAA,OAAAc,OAAA,CAAAH,MAAA,CAAAb,CAAA,OAAA0B,OAAA,WAAAxB,CAAA,IAAAyB,eAAA,CAAA9B,CAAA,EAAAK,CAAA,EAAAF,CAAA,CAAAE,CAAA,SAAAW,MAAA,CAAAe,yBAAA,GAAAf,MAAA,CAAAgB,gBAAA,CAAAhC,CAAA,EAAAgB,MAAA,CAAAe,yBAAA,CAAA5B,CAAA,KAAAgB,OAAA,CAAAH,MAAA,CAAAb,CAAA,GAAA0B,OAAA,WAAAxB,CAAA,IAAAW,MAAA,CAAAC,cAAA,CAAAjB,CAAA,EAAAK,CAAA,EAAAW,MAAA,CAAAE,wBAAA,CAAAf,CAAA,EAAAE,CAAA,iBAAAL,CAAA;AAAA,SAAA8B,gBAAA9B,CAAA,EAAAK,CAAA,EAAAF,CAAA,YAAAE,CAAA,GAAA4B,cAAA,CAAA5B,CAAA,MAAAL,CAAA,GAAAgB,MAAA,CAAAC,cAAA,CAAAjB,CAAA,EAAAK,CAAA,IAAA6B,KAAA,EAAA/B,CAAA,EAAAoB,UAAA,MAAAY,YAAA,MAAAC,QAAA,UAAApC,CAAA,CAAAK,CAAA,IAAAF,CAAA,EAAAH,CAAA;AAAA,SAAAiC,eAAA9B,CAAA,QAAAK,CAAA,GAAA6B,YAAA,CAAAlC,CAAA,uCAAAK,CAAA,GAAAA,CAAA,GAAAA,CAAA;AAAA,SAAA6B,aAAAlC,CAAA,EAAAE,CAAA,2BAAAF,CAAA,KAAAA,CAAA,SAAAA,CAAA,MAAAH,CAAA,GAAAG,CAAA,CAAAmC,MAAA,CAAAC,WAAA,kBAAAvC,CAAA,QAAAQ,CAAA,GAAAR,CAAA,CAAAe,IAAA,CAAAZ,CAAA,EAAAE,CAAA,uCAAAG,CAAA,SAAAA,CAAA,YAAAgC,SAAA,yEAAAnC,CAAA,GAAAoC,MAAA,GAAAC,MAAA,EAAAvC,CAAA,KAdlC;AAgBA,MAAMwC,6BAA6B,GAAG,MAAAA,CAAOC,UAAU,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,SAAS,KAAK;EACvF,IAAAC,gBAAO,EAAC,iDAAiD,EAAE;IACzDH,QAAQ;IACRC,MAAM;IACNG,aAAa,EAAEC,OAAO,CAACN,UAAU,CAAC;IAClCG;EACF,CAAC,CAAC;EAEF,IAAI,CAACH,UAAU,EAAE;IACf,IAAAI,gBAAO,EAAC,yDAAyD,EAAE;MAAEH;IAAS,CAAC,CAAC;IAChF,OAAO,KAAK;EACd;EAEA,IAAI,OAAOD,UAAU,CAACO,OAAO,KAAK,UAAU,EAAE;IAC5C,IAAAH,gBAAO,EAAC,2DAA2D,EAAE;MAAEH;IAAS,CAAC,CAAC;IAClF,MAAMO,WAAW,GAAG,MAAMR,UAAU,CAACO,OAAO,CAAC,CAAC;IAC9C,IAAAH,gBAAO,EAAC,0DAA0D,EAAE;MAClEH,QAAQ;MACRO;IACF,CAAC,CAAC;IACF,IAAI,CAACA,WAAW,EAAEC,OAAO,EAAE;MACzB,OAAO,KAAK;IACd;EACF;EAEA,IAAAL,gBAAO,EAAC,yDAAyD,EAAE;IACjEH,QAAQ;IACRC,MAAM;IACNC;EACF,CAAC,CAAC;EACFH,UAAU,CAACU,KAAK,CAACT,QAAQ,EAAEC,MAAM,EAAEC,SAAS,CAAC;EAC7C,IAAAC,gBAAO,EAAC,wDAAwD,EAAE;IAAEH;EAAS,CAAC,CAAC;EAC/E,OAAO,IAAI;AACb,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMU,qBAAqB,GAAGC,IAAA,IAExB;EAAA,IAFyB;IAC7BC;EACF,CAAC,GAAAD,IAAA;EACC,MAAME,IAAI,GAAG,IAAAC,aAAO,EAAC,CAAC;EACtB,MAAMC,oBAAoB,GAAG,IAAAC,aAAM,EAAC,KAAK,CAAC;EAE1C,MAAM;IAAEC,GAAG;IAAEC;EAAa,CAAC,GAAG,IAAAC,oBAAQ,EAAC,gBAAgB,EAAEP,QAAQ,CAAC;EAClE,MAAM;IAAEQ;EAAiB,CAAC,GAAG,IAAAD,oBAAQ,EAAC,gBAAgB,EAAEP,QAAQ,CAAC;EAEjE,MAAMS,kBAAkB,GAAGH,YAAY,GAAG;IAAEI,QAAQ,EAAEJ;EAAa,CAAC,GAAG,CAAC,CAAC;EACzE,MAAMK,aAAa,GAAGH,gBAAgB,EAAEG,aAAa;EACrD,MAAMC,UAAU,GAAGJ,gBAAgB,EAAEI,UAAU;EAC/C,MAAMC,OAAO,GAAGL,gBAAgB,EAAEK,OAAO;EAEzC,IAAAtB,gBAAO,EAAC,oBAAoB,EAAE;IAC5BS,QAAQ;IACRc,mBAAmB,EAAErB,OAAO,CAACe,gBAAgB,CAAC;IAC9CG,aAAa;IACbE,OAAO;IACPD,UAAU;IACVG,yBAAyB,EAAEP,gBAAgB,EAAEO;EAC/C,CAAC,CAAC;EAEF,IAAAC,gBAAS,EAAC,MAAM;IACd,IAAAzB,gBAAO,EAAC,+BAA+B,EAAE;MACvCS,QAAQ;MACRW,aAAa;MACbE,OAAO;MACPD,UAAU;MACVK,cAAc,EAAEd,oBAAoB,CAACe;IACvC,CAAC,CAAC;IAEF,IAAI,CAACP,aAAa,IAAI,CAACE,OAAO,IAAIV,oBAAoB,CAACe,OAAO,EAAE;MAC9D,IAAA3B,gBAAO,EAAC,+BAA+B,EAAE;QACvCS,QAAQ;QACRW,aAAa;QACbE,OAAO;QACPI,cAAc,EAAEd,oBAAoB,CAACe;MACvC,CAAC,CAAC;MACF,OAAOC,SAAS;IAClB;IAEA,IAAIC,SAAS,GAAG,IAAI;IAEpB,MAAMC,gBAAgB,GAAG,MAAAA,CAAA,KAAY;MACnC,IAAI;QACF,MAAMlC,UAAU,GAAG,IAAAmC,yBAAa,EAAC,CAAC;QAClC,IAAA/B,gBAAO,EAAC,4CAA4C,EAAE;UACpDC,aAAa,EAAEC,OAAO,CAACN,UAAU,CAAC;UAClCoC,UAAU,EAAE,OAAOpC,UAAU,EAAEO,OAAO,KAAK,UAAU;UACrD8B,QAAQ,EAAE,OAAOrC,UAAU,EAAEU,KAAK,KAAK;QACzC,CAAC,CAAC;QACF,IAAI,CAACV,UAAU,EAAE;UACf;QACF;QAEA,MAAM;UAAEE;QAAO,CAAC,GAAG,IAAAoC,0BAAoB,EAAC,CAAC;QACzC,IAAAlC,gBAAO,EAAC,mCAAmC,EAAE;UAAEF;QAAO,CAAC,CAAC;QACxD,MAAMqC,QAAQ,GAAG,MAAMxC,6BAA6B,CAClDC,UAAU,EACV,mCAAmC,EACnCE,MAAM,CAACsC,QAAQ,CAAC,CAAC,EACjB;UACEhB,aAAa;UACbE,OAAO;UACPD,UAAU;UACVZ;QACF,CACF,CAAC;QAED,IAAI0B,QAAQ,IAAIN,SAAS,EAAE;UACzBjB,oBAAoB,CAACe,OAAO,GAAG,IAAI;UACnC,IAAA3B,gBAAO,EAAC,6CAA6C,EAAE;YACrDS,QAAQ;YACRW,aAAa;YACbE;UACF,CAAC,CAAC;QACJ;MACF,CAAC,CAAC,OAAOe,KAAK,EAAE;QACd,IAAAC,iBAAQ,EAACD,KAAK,EAAE;UACdE,MAAM,EAAE,8BAA8B;UACtC9B,QAAQ;UACRW,aAAa;UACbE;QACF,CAAC,CAAC;QACF;MACF;IACF,CAAC;IAEDQ,gBAAgB,CAAC,CAAC;IAElB,OAAO,MAAM;MACXD,SAAS,GAAG,KAAK;MACjB,IAAA7B,gBAAO,EAAC,+BAA+B,EAAE;QAAES;MAAS,CAAC,CAAC;IACxD,CAAC;EACH,CAAC,EAAE,CAACA,QAAQ,EAAEW,aAAa,EAAEC,UAAU,EAAEC,OAAO,CAAC,CAAC;;EAElD;EACA,IAAI,CAACL,gBAAgB,IAAIA,gBAAgB,CAACO,yBAAyB,EAAE;IACnE,OAAO,IAAI;EACb;EAEA,MAAM;IACJgB,cAAc;IACdC,eAAe;IACfC;EACF,CAAC,GAAGzB,gBAAgB;EAEpB,MAAM0B,QAAQ,GAAGA,CAAA,KAAM;IACrB,IAAA3C,gBAAO,EAAC,8BAA8B,EAAE;MACtCS,QAAQ;MACRW,aAAa;MACbE,OAAO;MACPD;IACF,CAAC,CAAC;IACF;IACA;IACA,MAAMuB,iBAAiB,GAAG,WAAW;IACrC,IAAAC,yBAAc,EAAC,uCAAuC,EAAE;MACtDC,OAAO,EAAEhC,GAAG;MACZiC,aAAa,EAAEtC,QAAQ;MACvBuC,YAAY,EAAE,YAAY;MAC1BC,QAAQ,EAAE,GAAGL,iBAAiB,uBAAuB;MACrDM,QAAQ,EAAE,MAAM;MAChBC,QAAQ,EAAEP;IACZ,CAAC,CAAC;IAEF,IAAIxB,aAAa,IAAIE,OAAO,EAAE;MAC5B,IAAI;QACF,MAAM1B,UAAU,GAAG,IAAAmC,yBAAa,EAAC,CAAC;QAClC,IAAA/B,gBAAO,EAAC,oCAAoC,EAAE;UAC5CC,aAAa,EAAEC,OAAO,CAACN,UAAU,CAAC;UAClCoC,UAAU,EAAE,OAAOpC,UAAU,EAAEO,OAAO,KAAK,UAAU;UACrD8B,QAAQ,EAAE,OAAOrC,UAAU,EAAEU,KAAK,KAAK;QACzC,CAAC,CAAC;QACF,IAAIV,UAAU,EAAE;UACd,MAAM;YAAEE;UAAO,CAAC,GAAG,IAAAoC,0BAAoB,EAAC,CAAC;UACzC,IAAAlC,gBAAO,EAAC,2BAA2B,EAAE;YAAEF;UAAO,CAAC,CAAC;UAChDH,6BAA6B,CAC3BC,UAAU,EACV,sCAAsC,EACtCE,MAAM,CAACsC,QAAQ,CAAC,CAAC,EACjB;YACEhB,aAAa;YACbE,OAAO;YACPD,UAAU;YACVZ;UACF,CACF,CAAC;QACH;MACF,CAAC,CAAC,OAAO4B,KAAK,EAAE;QACd,IAAAC,iBAAQ,EAACD,KAAK,EAAE;UACdE,MAAM,EAAE,sBAAsB;UAC9B9B,QAAQ;UACRW,aAAa;UACbE;QACF,CAAC,CAAC;QACF;MACF;IACF;EACF,CAAC;EAED,IAAI8B,eAAe,GAAG,IAAI;EAC1B,IAAIX,eAAe,IAAIC,UAAU,EAAE;IACjCU,eAAe,gBACb,IAAArG,WAAA,CAAAsG,IAAA,EAAAtG,WAAA,CAAAuG,QAAA;MAAAC,QAAA,gBACE,IAAAxG,WAAA,CAAAyG,GAAA,UAAK,CAAC,eACN,IAAAzG,WAAA,CAAAyG,GAAA,EAAChH,KAAA,CAAAiH,gBAAgB;QACfC,EAAE,EAAC,oCAAoC;QACvCC,cAAc,EAAC,2FAA2F;QAC1GC,WAAW,EAAC,+GAA+G;QAC3HC,MAAM,EAAE;UACNC,IAAI,eACF,IAAA/G,WAAA,CAAAyG,GAAA,EAAChH,KAAA,CAAAuH,aAAa,EAAArF,aAAA;YAEZsF,GAAG,EAAC,SAAS;YACbC,KAAK,EAAC,OAAO;YACbC,IAAI,EAAC,SAAS;YACdhF,KAAK,EAAEuD;UAAgB,GACnBvB,kBAAkB,GALlB,iCAML;QAEL;MAAE,CACH,CAAC,QAEF,mBAAAnE,WAAA,CAAAyG,GAAA,EAAC9G,QAAA,CAAAyH,SAAS;QACRC,SAAS,EAAC,kBAAkB;QAC5BC,KAAK,EAAE;UAAEC,cAAc,EAAE;QAAY,CAAE;QACvCC,WAAW,EAAE7B,UAAW;QACxB8B,OAAO,EAAE7B,QAAS;QAAAY,QAAA,EAEjB7C,IAAI,CAAC+D,aAAa,CAACC,iBAAQ,CAACC,UAAU;MAAC,CAC/B,CAAC;IAAA,CACZ,CACH;EACH;EAEA,oBACE,IAAA5H,WAAA,CAAAsG,IAAA,EAAC3G,QAAA,CAAAkI,KAAK;IAACtD,OAAO,EAAC,MAAM;IAACuD,IAAI,EAAEC,WAAK;IAAAvB,QAAA,gBAC/B,IAAAxG,WAAA,CAAAyG,GAAA;MAAMY,SAAS,EAAC,kBAAkB;MAAAb,QAAA,eAChC,IAAAxG,WAAA,CAAAyG,GAAA,EAAChH,KAAA,CAAAiH,gBAAgB;QACfC,EAAE,EAAC,kCAAkC;QACrCC,cAAc,EAAC,6BAA6B;QAC5CC,WAAW,EAAC,gCAAgC;QAC5CC,MAAM,EAAE;UACNC,IAAI,eACF,IAAA/G,WAAA,CAAAyG,GAAA,EAAChH,KAAA,CAAAuH,aAAa,EAAArF,aAAA;YAEZsF,GAAG,EAAC,SAAS;YACbC,KAAK,EAAC,OAAO;YACbC,IAAI,EAAC,SAAS;YACdhF,KAAK,EAAEsD;UAAe,GAClBtB,kBAAkB,GALlB,4BAML;QAEL;MAAE,CACH;IAAC,CACE,CAAC,eACP,IAAAnE,WAAA,CAAAyG,GAAA,UAAK,CAAC,eACN,IAAAzG,WAAA,CAAAyG,GAAA,EAAChH,KAAA,CAAAiH,gBAAgB;MACfC,EAAE,EAAC,gCAAgC;MACnCC,cAAc,EAAC,yEAAyE;MACxFC,WAAW,EAAC,qEAAqE;MACjFC,MAAM,EAAE;QACNC,IAAI,eACF,IAAA/G,WAAA,CAAAyG,GAAA,EAAChH,KAAA,CAAAuH,aAAa,EAAArF,aAAA;UAEZsF,GAAG,EAAC,SAAS;UACbC,KAAK,EAAC,OAAO;UACbC,IAAI,EAAC,SAAS;UACdhF,KAAK,EAAEsD;QAAe,GAClBtB,kBAAkB,GALlB,0BAML;MAEL;IAAE,CACH,CAAC,EACDkC,eAAe;EAAA,CACX,CAAC;AAEZ,CAAC;AAED7C,qBAAqB,CAACwE,SAAS,GAAG;EAChCtE,QAAQ,EAAEuE,kBAAS,CAACC,MAAM,CAACC;AAC7B,CAAC;AAAC,IAAAC,QAAA,GAAAC,OAAA,CAAAlI,OAAA,GAEaqD,qBAAqB","ignoreList":[]}
|