@downcity/services 0.1.47 → 0.1.49

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.
@@ -0,0 +1,625 @@
1
+ /**
2
+ * Downcity Creem 一次性充值服务。
3
+ *
4
+ * 关键说明(中文)
5
+ * - 当前版本只处理 Creem Checkout 一次性充值
6
+ * - 不处理 entitlement,也不处理 subscription
7
+ * - 支付成功后统一调用 balance.finishTopup() 完成到账
8
+ */
9
+ import { creemEvents, creemPayments } from "./schema.js";
10
+ import { createCreemCheckoutSession, normalizeCreemApiBaseURL, normalizeOptionalText, normalizeRequired, parseCreemWebhookEvent, readMetadata, verifyCreemSignature, } from "./creem.js";
11
+ /**
12
+ * Creem 服务对外暴露的运行时环境变量。
13
+ *
14
+ * 关键说明(中文)
15
+ * - api key / product id 是创建 Checkout 的最小必要配置
16
+ * - webhook secret 用于校验 creem-signature
17
+ * - success / cancel URL 用于 CLI 或纯后端场景下的默认跳转地址
18
+ */
19
+ const creemPaymentEnv = [
20
+ {
21
+ key: "CREEM_API_KEY",
22
+ description: "Creem API key,用于创建 Checkout Session",
23
+ required: true,
24
+ },
25
+ {
26
+ key: "CREEM_PRODUCT_ID",
27
+ description: "Creem product_id,用于创建 Checkout Session",
28
+ required: true,
29
+ },
30
+ {
31
+ key: "CREEM_WEBHOOK_SECRET",
32
+ description: "Creem webhook signing secret,用于校验 creem-signature",
33
+ required: false,
34
+ },
35
+ {
36
+ key: "CREEM_SUCCESS_URL",
37
+ description: "默认支付成功跳转地址;未在请求里传 success_url 时使用",
38
+ required: false,
39
+ },
40
+ {
41
+ key: "DOWNCITY_CITY_BASE_URL",
42
+ description: "City 对外访问地址;未显式配置 success URL 时,会自动生成 Creem 默认跳转页地址",
43
+ required: false,
44
+ },
45
+ {
46
+ key: "CREEM_CURRENCY",
47
+ description: "默认结算币种,例如 usd;仅用于支付目录展示和本地记录",
48
+ required: false,
49
+ },
50
+ {
51
+ key: "CREEM_API_BASE_URL",
52
+ description: "可选的 Creem API 基础地址覆写,通常只用于测试环境",
53
+ required: false,
54
+ },
55
+ ];
56
+ export { creemEvents, creemPayments } from "./schema.js";
57
+ /**
58
+ * 创建 Creem 一次性充值服务。
59
+ */
60
+ export function creemPaymentService(options) {
61
+ const normalized = normalizeOptions(options);
62
+ return {
63
+ id: "payment.creem",
64
+ name: "Creem Payment",
65
+ version: "0.1.0",
66
+ env: creemPaymentEnv,
67
+ schema: {
68
+ payments: creemPayments,
69
+ events: creemEvents,
70
+ },
71
+ instruction: [
72
+ "使用 Creem 创建一次性充值 Checkout,并在 webhook 成功后完成 balance topup。",
73
+ "这个服务不处理 entitlement,也不处理 subscription。",
74
+ "当 options 未显式传入时,会回退读取 CREEM_API_KEY / CREEM_PRODUCT_ID / CREEM_WEBHOOK_SECRET / CREEM_SUCCESS_URL。",
75
+ "如果 success URL 仍未配置,会继续尝试基于 DOWNCITY_CITY_BASE_URL 自动生成默认跳转页地址。",
76
+ `currency=${normalized.currency},success_url=${normalized.success_url || "read from CREEM_SUCCESS_URL or route input"}。`,
77
+ "支付成功后统一通过 balance.finishTopup() 完成到账。",
78
+ ].join("\n"),
79
+ install(ctx) {
80
+ const payments = ctx.table("payments");
81
+ const events = ctx.table("events");
82
+ const balance = normalized.balance;
83
+ ctx.route({
84
+ method: "POST",
85
+ path: "/checkout/create",
86
+ auth: ["user"],
87
+ async handler(requestCtx) {
88
+ const body = await requestCtx.json();
89
+ const userId = normalizeRequired(requestCtx.user?.user_id, "user_id");
90
+ const topup = await balance.readTopup(normalizeRequired(body.topup_id, "topup_id"));
91
+ if (topup.user_id !== userId) {
92
+ return requestCtx.jsonResponse({ error: "Topup does not belong to current user" }, 403);
93
+ }
94
+ if (topup.status !== "pending") {
95
+ return requestCtx.jsonResponse({ error: `Topup is already ${topup.status}` }, 409);
96
+ }
97
+ const existing = await findActivePaymentByTopup(payments, topup.topup_id);
98
+ if (existing) {
99
+ return requestCtx.jsonResponse(toCheckoutResult(existing));
100
+ }
101
+ const apiKey = normalized.api_key ?? ctx.env("CREEM_API_KEY");
102
+ if (!apiKey) {
103
+ return requestCtx.jsonResponse({ error: "Creem API key is not configured" }, 500);
104
+ }
105
+ const productId = normalized.product_id ?? ctx.env("CREEM_PRODUCT_ID");
106
+ if (!productId) {
107
+ return requestCtx.jsonResponse({ error: "Creem product id is not configured" }, 500);
108
+ }
109
+ const paymentId = `pay_${randomId()}`;
110
+ const currency = resolveCurrency(normalized, ctx);
111
+ const created = await createCreemCheckoutSession(apiKey, resolveApiBaseURL(normalized, ctx), {
112
+ payment_id: paymentId,
113
+ topup,
114
+ product_id: productId,
115
+ success_url: resolveCheckoutRedirectURL({
116
+ value: body.success_url,
117
+ fallback: normalized.success_url ?? ctx.env("CREEM_SUCCESS_URL"),
118
+ label: "success_url",
119
+ redirectPath: "/v1/payment.creem/redirect/success",
120
+ ctx,
121
+ request: requestCtx.request,
122
+ }),
123
+ });
124
+ const now = new Date().toISOString();
125
+ const row = {
126
+ payment_id: paymentId,
127
+ topup_id: topup.topup_id,
128
+ user_id: topup.user_id,
129
+ creem_checkout_id: created.checkout_id,
130
+ creem_order_id: "",
131
+ amount: topup.amount,
132
+ currency,
133
+ status: "pending",
134
+ checkout_url: created.checkout_url,
135
+ metadata_json: JSON.stringify({
136
+ unit: topup.unit,
137
+ note: topup.note,
138
+ product_id: productId,
139
+ }),
140
+ created_at: now,
141
+ updated_at: now,
142
+ };
143
+ await payments.insert(row);
144
+ return requestCtx.jsonResponse(toCheckoutResult(row));
145
+ },
146
+ });
147
+ ctx.route({
148
+ method: "GET",
149
+ path: "/payments/me",
150
+ auth: ["user"],
151
+ async handler(requestCtx) {
152
+ const userId = normalizeRequired(requestCtx.user?.user_id, "user_id");
153
+ const rows = sortPayments(await payments.select({ user_id: userId }));
154
+ return requestCtx.jsonResponse({ items: rows });
155
+ },
156
+ });
157
+ ctx.route({
158
+ method: "GET",
159
+ path: "/payments",
160
+ auth: ["admin"],
161
+ async handler(requestCtx) {
162
+ return requestCtx.jsonResponse({ items: sortPayments(await payments.select()) });
163
+ },
164
+ });
165
+ ctx.route({
166
+ method: "GET",
167
+ path: "/events",
168
+ auth: ["admin"],
169
+ async handler(requestCtx) {
170
+ return requestCtx.jsonResponse({ items: sortEvents(await events.select()) });
171
+ },
172
+ });
173
+ ctx.route({
174
+ method: "POST",
175
+ path: "/webhook",
176
+ auth: [],
177
+ async handler(requestCtx) {
178
+ const raw = await requestCtx.text();
179
+ const webhookSecret = normalized.webhook_secret ?? ctx.env("CREEM_WEBHOOK_SECRET");
180
+ if (webhookSecret) {
181
+ const signature = requestCtx.request.headers.get("creem-signature");
182
+ const valid = await verifyCreemSignature(raw, signature, webhookSecret);
183
+ if (!valid)
184
+ return requestCtx.jsonResponse({ error: "Invalid Creem signature" }, 400);
185
+ }
186
+ const event = parseCreemWebhookEvent(raw);
187
+ const eventId = normalizeRequired(event.id, "creem event id");
188
+ const eventType = readEventType(event);
189
+ const existing = (await events.select({ event_id: eventId }))[0];
190
+ if (existing) {
191
+ return requestCtx.jsonResponse({
192
+ received: true,
193
+ event_id: eventId,
194
+ sync_status: existing.sync_status,
195
+ });
196
+ }
197
+ const eventRow = {
198
+ event_id: eventId,
199
+ type: eventType,
200
+ payload_json: JSON.stringify(event),
201
+ sync_status: "pending",
202
+ sync_error: "",
203
+ created_at: new Date().toISOString(),
204
+ };
205
+ await events.insert(eventRow);
206
+ try {
207
+ const syncStatus = await syncCreemEvent({
208
+ event,
209
+ payments,
210
+ balance,
211
+ });
212
+ await updateEvent(events, eventId, syncStatus, "");
213
+ return requestCtx.jsonResponse({
214
+ received: true,
215
+ event_id: eventId,
216
+ sync_status: syncStatus,
217
+ });
218
+ }
219
+ catch (error) {
220
+ const message = error instanceof Error ? error.message : String(error);
221
+ await updateEvent(events, eventId, "failed", message);
222
+ return requestCtx.jsonResponse({
223
+ received: true,
224
+ event_id: eventId,
225
+ sync_status: "failed",
226
+ error: message,
227
+ }, 500);
228
+ }
229
+ },
230
+ });
231
+ ctx.route({
232
+ method: "GET",
233
+ path: "/redirect/success",
234
+ auth: [],
235
+ handler(requestCtx) {
236
+ return htmlResponse(renderRedirectPage({
237
+ title: "Payment successful",
238
+ heading: "Payment completed",
239
+ description: "Your Creem payment has been accepted. If the balance view has not refreshed yet, close this page and return to your app.",
240
+ request: requestCtx.request,
241
+ }));
242
+ },
243
+ });
244
+ ctx.route({
245
+ method: "GET",
246
+ path: "/redirect/cancel",
247
+ auth: [],
248
+ handler(requestCtx) {
249
+ return htmlResponse(renderRedirectPage({
250
+ title: "Payment canceled",
251
+ heading: "Payment canceled",
252
+ description: "No charge was completed. You can close this page and return to your app to try again later.",
253
+ request: requestCtx.request,
254
+ }));
255
+ },
256
+ });
257
+ },
258
+ };
259
+ }
260
+ /**
261
+ * 统一同步 Creem webhook 事件。
262
+ */
263
+ async function syncCreemEvent(input) {
264
+ const { event, payments, balance } = input;
265
+ switch (readEventType(event)) {
266
+ case "checkout.completed":
267
+ return await syncCheckoutCompleted(event, payments, balance);
268
+ case "checkout.expired":
269
+ return await syncCheckoutExpired(event, payments);
270
+ case "checkout.failed":
271
+ case "payment.failed":
272
+ return await syncCheckoutFailed(event, payments);
273
+ default:
274
+ return "ignored";
275
+ }
276
+ }
277
+ /**
278
+ * 同步 `checkout.completed`。
279
+ */
280
+ async function syncCheckoutCompleted(event, payments, balance) {
281
+ const object = readEventObject(event);
282
+ const payment = await findPaymentByEventObject(payments, object);
283
+ if (!payment)
284
+ return "ignored";
285
+ if (payment.status === "paid")
286
+ return "applied";
287
+ const orderId = readObjectId(readMetadata(object.order)) || normalizeOptionalText(object.order_id);
288
+ const topup = await balance.readTopup(payment.topup_id);
289
+ if (topup.status === "pending") {
290
+ await balance.finishTopup(payment.topup_id, {
291
+ note: "creem topup",
292
+ ref: orderId || readObjectId(object) || payment.creem_checkout_id,
293
+ meta: {
294
+ creem_event_id: normalizeOptionalText(event.id),
295
+ creem_checkout_id: readObjectId(object) || payment.creem_checkout_id,
296
+ creem_order_id: orderId,
297
+ creem_payment_id: payment.payment_id,
298
+ },
299
+ });
300
+ }
301
+ await updatePayment(payments, payment.payment_id, {
302
+ status: "paid",
303
+ creem_order_id: orderId || payment.creem_order_id,
304
+ });
305
+ return "applied";
306
+ }
307
+ /**
308
+ * 同步 `checkout.expired`。
309
+ */
310
+ async function syncCheckoutExpired(event, payments) {
311
+ const object = readEventObject(event);
312
+ const payment = await findPaymentByEventObject(payments, object);
313
+ if (!payment)
314
+ return "ignored";
315
+ if (payment.status !== "pending")
316
+ return "ignored";
317
+ await updatePayment(payments, payment.payment_id, { status: "expired" });
318
+ return "applied";
319
+ }
320
+ /**
321
+ * 同步支付失败事件。
322
+ */
323
+ async function syncCheckoutFailed(event, payments) {
324
+ const object = readEventObject(event);
325
+ const payment = await findPaymentByEventObject(payments, object);
326
+ if (!payment)
327
+ return "ignored";
328
+ if (payment.status !== "pending")
329
+ return "ignored";
330
+ await updatePayment(payments, payment.payment_id, {
331
+ status: "failed",
332
+ creem_order_id: readObjectId(readMetadata(object.order)) || normalizeOptionalText(object.order_id),
333
+ });
334
+ return "applied";
335
+ }
336
+ /**
337
+ * 根据 webhook 对象寻找支付记录。
338
+ */
339
+ async function findPaymentByEventObject(payments, object) {
340
+ const metadata = readMetadata(object.metadata);
341
+ const paymentId = normalizeOptionalText(metadata.payment_id) || normalizeOptionalText(object.request_id);
342
+ if (paymentId) {
343
+ const record = (await payments.select({ payment_id: paymentId }))[0];
344
+ if (record)
345
+ return record;
346
+ }
347
+ const checkoutId = readObjectId(object) || normalizeOptionalText(object.checkout_id);
348
+ if (checkoutId) {
349
+ const record = (await payments.select({ creem_checkout_id: checkoutId }))[0];
350
+ if (record)
351
+ return record;
352
+ }
353
+ const topupId = normalizeOptionalText(metadata.topup_id);
354
+ if (topupId) {
355
+ return await findActivePaymentByTopup(payments, topupId);
356
+ }
357
+ return undefined;
358
+ }
359
+ /**
360
+ * 查询某个 topup 当前的活跃支付记录。
361
+ */
362
+ async function findActivePaymentByTopup(payments, topupId) {
363
+ const rows = sortPayments(await payments.select({ topup_id: topupId }));
364
+ return rows.find((row) => row.status === "pending");
365
+ }
366
+ /**
367
+ * 更新支付记录。
368
+ */
369
+ async function updatePayment(payments, paymentId, input) {
370
+ await payments.update({
371
+ where: { payment_id: paymentId },
372
+ values: {
373
+ status: input.status,
374
+ creem_order_id: normalizeOptionalText(input.creem_order_id),
375
+ updated_at: new Date().toISOString(),
376
+ },
377
+ });
378
+ }
379
+ /**
380
+ * 更新 webhook 同步状态。
381
+ */
382
+ async function updateEvent(events, eventId, syncStatus, syncError) {
383
+ await events.update({
384
+ where: { event_id: eventId },
385
+ values: {
386
+ sync_status: syncStatus,
387
+ sync_error: syncError.trim(),
388
+ },
389
+ });
390
+ }
391
+ /**
392
+ * 将支付记录裁剪为创建 Checkout 的返回结构。
393
+ */
394
+ function toCheckoutResult(row) {
395
+ return {
396
+ payment_id: row.payment_id,
397
+ topup_id: row.topup_id,
398
+ creem_checkout_id: row.creem_checkout_id,
399
+ checkout_url: row.checkout_url,
400
+ status: row.status,
401
+ };
402
+ }
403
+ /**
404
+ * 统一排序支付记录。
405
+ */
406
+ function sortPayments(rows) {
407
+ return [...rows].sort((left, right) => {
408
+ if (left.updated_at === right.updated_at)
409
+ return right.created_at.localeCompare(left.created_at);
410
+ return right.updated_at.localeCompare(left.updated_at);
411
+ });
412
+ }
413
+ /**
414
+ * 统一排序 webhook 事件记录。
415
+ */
416
+ function sortEvents(rows) {
417
+ return [...rows].sort((left, right) => right.created_at.localeCompare(left.created_at));
418
+ }
419
+ /**
420
+ * 读取 webhook 事件类型。
421
+ */
422
+ function readEventType(event) {
423
+ return normalizeOptionalText(event.eventType) || normalizeOptionalText(event.type) || "unknown";
424
+ }
425
+ /**
426
+ * 读取 webhook 事件主体。
427
+ */
428
+ function readEventObject(event) {
429
+ const directObject = readMetadata(event.object);
430
+ if (Object.keys(directObject).length > 0)
431
+ return directObject;
432
+ return readMetadata(event.data?.object);
433
+ }
434
+ /**
435
+ * 读取对象 ID。
436
+ */
437
+ function readObjectId(object) {
438
+ return normalizeOptionalText(object.id);
439
+ }
440
+ /**
441
+ * 选择跳转地址。
442
+ */
443
+ function pickRedirectURL(value, fallback, label) {
444
+ const candidate = normalizeOptionalText(value);
445
+ if (candidate)
446
+ return candidate;
447
+ return normalizeRequired(fallback, label);
448
+ }
449
+ /**
450
+ * 解析 Checkout 跳转地址。
451
+ *
452
+ * 关键说明(中文)
453
+ * - 优先使用请求级显式传入值
454
+ * - 再回退到服务配置或 runtime env
455
+ * - 再回退到 DOWNCITY_CITY_BASE_URL
456
+ * - 最后使用当前请求 origin 自动生成服务内置结果页
457
+ */
458
+ function resolveCheckoutRedirectURL(input) {
459
+ const configured = normalizeOptionalText(input.fallback);
460
+ const fromBaseURL = buildBaseURLRedirect(input.ctx.env("DOWNCITY_CITY_BASE_URL"), input.redirectPath);
461
+ const fromRequestOrigin = buildRequestOriginRedirect(input.request, input.redirectPath);
462
+ return pickRedirectURL(input.value, configured || fromBaseURL || fromRequestOrigin, input.label);
463
+ }
464
+ /**
465
+ * 规范化服务配置。
466
+ */
467
+ function normalizeOptions(options) {
468
+ if (!options?.balance)
469
+ throw new TypeError("Creem payment service requires a balance service instance");
470
+ return {
471
+ ...options,
472
+ balance: options.balance,
473
+ currency: normalizeCurrency(options.currency) || "usd",
474
+ api_base_url: normalizeCreemApiBaseURL(options.api_base_url),
475
+ };
476
+ }
477
+ /**
478
+ * 规范化币种。
479
+ */
480
+ function normalizeCurrency(value) {
481
+ return normalizeOptionalText(value).toLowerCase();
482
+ }
483
+ /**
484
+ * 解析当前请求最终使用的币种。
485
+ */
486
+ function resolveCurrency(options, ctx) {
487
+ return normalizeCurrency(ctx.env("CREEM_CURRENCY")) || options.currency || "usd";
488
+ }
489
+ /**
490
+ * 解析当前请求最终使用的 Creem API 基础地址。
491
+ */
492
+ function resolveApiBaseURL(options, ctx) {
493
+ return normalizeCreemApiBaseURL(ctx.env("CREEM_API_BASE_URL") || options.api_base_url);
494
+ }
495
+ /**
496
+ * 基于 City 对外地址生成默认跳转页 URL。
497
+ */
498
+ function buildBaseURLRedirect(baseURL, path) {
499
+ const normalizedBaseURL = normalizeOptionalText(baseURL).replace(/\/+$/, "");
500
+ if (!normalizedBaseURL)
501
+ return "";
502
+ return `${normalizedBaseURL}${path}`;
503
+ }
504
+ /**
505
+ * 基于当前请求 origin 生成默认跳转页 URL。
506
+ *
507
+ * 关键说明(中文)
508
+ * - 多域名或 workers.dev / 自定义域混用时,当前请求 origin 往往最准确
509
+ * - 这里保留为最后兜底,避免开发者必须手动配置 BASE URL
510
+ */
511
+ function buildRequestOriginRedirect(request, path) {
512
+ try {
513
+ return new URL(path, request.url).toString();
514
+ }
515
+ catch {
516
+ return "";
517
+ }
518
+ }
519
+ /**
520
+ * 返回最小 HTML 页面,避免 Creem 跳回后出现 404。
521
+ */
522
+ function htmlResponse(html) {
523
+ return new Response(html, {
524
+ status: 200,
525
+ headers: { "content-type": "text/html; charset=utf-8" },
526
+ });
527
+ }
528
+ /**
529
+ * 渲染支付完成/取消结果页。
530
+ */
531
+ function renderRedirectPage(input) {
532
+ const homeURL = escapeHTML(new URL("/", input.request.url).toString());
533
+ const title = escapeHTML(input.title);
534
+ const heading = escapeHTML(input.heading);
535
+ const description = escapeHTML(input.description);
536
+ return `<!doctype html>
537
+ <html lang="en">
538
+ <head>
539
+ <meta charset="utf-8" />
540
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
541
+ <title>${title}</title>
542
+ <style>
543
+ :root {
544
+ color-scheme: light;
545
+ --bg: #f5f7fb;
546
+ --card: #ffffff;
547
+ --text: #142033;
548
+ --muted: #5a6a85;
549
+ --border: #d9e2f1;
550
+ --accent: #1f6feb;
551
+ }
552
+ * { box-sizing: border-box; }
553
+ body {
554
+ margin: 0;
555
+ min-height: 100vh;
556
+ display: grid;
557
+ place-items: center;
558
+ padding: 24px;
559
+ background:
560
+ radial-gradient(circle at top, #e9f1ff 0, rgba(233, 241, 255, 0) 42%),
561
+ linear-gradient(180deg, #f8fbff 0%, var(--bg) 100%);
562
+ color: var(--text);
563
+ font: 16px/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
564
+ }
565
+ main {
566
+ width: min(100%, 560px);
567
+ padding: 32px;
568
+ border: 1px solid var(--border);
569
+ border-radius: 20px;
570
+ background: var(--card);
571
+ box-shadow: 0 18px 60px rgba(16, 24, 40, 0.08);
572
+ }
573
+ h1 {
574
+ margin: 0 0 12px;
575
+ font-size: 28px;
576
+ line-height: 1.2;
577
+ }
578
+ p {
579
+ margin: 0;
580
+ color: var(--muted);
581
+ }
582
+ a {
583
+ display: inline-block;
584
+ margin-top: 24px;
585
+ color: #fff;
586
+ background: var(--accent);
587
+ text-decoration: none;
588
+ padding: 12px 16px;
589
+ border-radius: 999px;
590
+ font-weight: 600;
591
+ }
592
+ </style>
593
+ </head>
594
+ <body>
595
+ <main>
596
+ <h1>${heading}</h1>
597
+ <p>${description}</p>
598
+ <a href="${homeURL}">Return to Downcity</a>
599
+ </main>
600
+ </body>
601
+ </html>`;
602
+ }
603
+ /**
604
+ * 最小 HTML 转义,避免文本直接拼进页面时破坏结构。
605
+ */
606
+ function escapeHTML(value) {
607
+ return value
608
+ .replaceAll("&", "&amp;")
609
+ .replaceAll("<", "&lt;")
610
+ .replaceAll(">", "&gt;")
611
+ .replaceAll('"', "&quot;")
612
+ .replaceAll("'", "&#39;");
613
+ }
614
+ /**
615
+ * 生成随机 ID。
616
+ */
617
+ function randomId() {
618
+ const buffer = new Uint8Array(12);
619
+ crypto.getRandomValues(buffer);
620
+ return btoa(String.fromCharCode(...buffer))
621
+ .replace(/\+/g, "-")
622
+ .replace(/\//g, "_")
623
+ .replace(/=+$/, "");
624
+ }
625
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/payment-creem/index.ts"],"names":[],"mappings":"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"}