@kb0912/notification-brevo 1.0.17 → 2.0.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.
- package/.medusa/server/src/admin/index.js +1004 -3
- package/.medusa/server/src/admin/index.mjs +1004 -3
- package/.medusa/server/src/api/admin/brevo-plugin-settings/analytics/route.js +78 -0
- package/.medusa/server/src/api/admin/brevo-plugin-settings/route.js +27 -0
- package/.medusa/server/src/api/hooks/brevo-webhook/route.js +40 -0
- package/.medusa/server/src/jobs/abandoned-cart.js +5 -11
- package/.medusa/server/src/jobs/promotion-expiry-reminder.js +122 -0
- package/.medusa/server/src/jobs/review-request.js +106 -0
- package/.medusa/server/src/jobs/winback.js +108 -0
- package/.medusa/server/src/modules/brevo-settings/index.js +13 -0
- package/.medusa/server/src/modules/brevo-settings/migrations/Migration20260306173214.js +15 -0
- package/.medusa/server/src/modules/brevo-settings/migrations/Migration20260307045432.js +14 -0
- package/.medusa/server/src/modules/brevo-settings/migrations/Migration20260307075811.js +14 -0
- package/.medusa/server/src/modules/brevo-settings/models/brevo-settings.js +79 -0
- package/.medusa/server/src/modules/brevo-settings/service.js +114 -0
- package/.medusa/server/src/providers/notifications-brevo/services.js +321 -176
- package/.medusa/server/src/workflows/index.js +25 -0
- package/.medusa/server/src/workflows/send-abandoned-cart.js +37 -8
- package/.medusa/server/src/workflows/send-customer-created.js +159 -4
- package/.medusa/server/src/workflows/send-order-canceled.js +27 -3
- package/.medusa/server/src/workflows/send-order-confirmation.js +63 -10
- package/.medusa/server/src/workflows/send-order-delivered.js +52 -0
- package/.medusa/server/src/workflows/send-review-request.js +37 -0
- package/.medusa/server/src/workflows/send-shipment-confirmation.js +33 -10
- package/.medusa/server/src/workflows/send-winback.js +34 -0
- package/.medusa/server/src/workflows/steps/check-abandoned-carts.js +184 -58
- package/.medusa/server/src/workflows/steps/resolve-locale.js +25 -0
- package/.medusa/server/src/workflows/steps/send-multi-channel.js +81 -0
- package/.medusa/server/src/workflows/steps/send-notification.js +1 -1
- package/.medusa/server/src/workflows/steps/sync-brevo-contact.js +57 -0
- package/.medusa/server/src/workflows/steps/track-brevo-event.js +47 -0
- package/README.md +315 -60
- package/package.json +21 -24
- package/.medusa/server/src/api/admin/plugin/route.js +0 -7
- package/.medusa/server/src/config.js +0 -12
- package/.medusa/server/src/loaders/brevo.js +0 -13
- package/.medusa/server/src/subscribers/password-reset.js +0 -18
- package/.medusa/server/src/subscribers/promotion-new-customer-created.js +0 -21
- package/.medusa/server/src/workflows/send-password-reset.js +0 -30
- package/.medusa/server/src/workflows/send-promotion-notification.js +0 -24
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
4
|
+
const BrevoSettings = utils_1.model.define("brevo_settings", {
|
|
5
|
+
id: utils_1.model.id().primaryKey(),
|
|
6
|
+
// ─── Email Template IDs ───
|
|
7
|
+
order_placed_template_id: utils_1.model.text().nullable(),
|
|
8
|
+
order_canceled_template_id: utils_1.model.text().nullable(),
|
|
9
|
+
order_delivered_template_id: utils_1.model.text().nullable(),
|
|
10
|
+
customer_created_template_id: utils_1.model.text().nullable(),
|
|
11
|
+
promotion_new_customer_template_id: utils_1.model.text().nullable(),
|
|
12
|
+
shipment_confirmed_template_id: utils_1.model.text().nullable(),
|
|
13
|
+
abandoned_cart_template_id: utils_1.model.text().nullable(),
|
|
14
|
+
review_request_template_id: utils_1.model.text().nullable(),
|
|
15
|
+
winback_template_id: utils_1.model.text().nullable(),
|
|
16
|
+
// ─── Sender ───
|
|
17
|
+
sender_name: utils_1.model.text().nullable(),
|
|
18
|
+
// ─── Enable/disable per event ───
|
|
19
|
+
order_placed_enabled: utils_1.model.boolean().default(true),
|
|
20
|
+
order_canceled_enabled: utils_1.model.boolean().default(true),
|
|
21
|
+
order_delivered_enabled: utils_1.model.boolean().default(true),
|
|
22
|
+
customer_created_enabled: utils_1.model.boolean().default(true),
|
|
23
|
+
promotion_enabled: utils_1.model.boolean().default(true),
|
|
24
|
+
shipment_confirmed_enabled: utils_1.model.boolean().default(true),
|
|
25
|
+
// ─── Promotion New Customer Config ───
|
|
26
|
+
promotion_auto_create: utils_1.model.boolean().default(false),
|
|
27
|
+
promotion_discount_type: utils_1.model.text().default("percentage"),
|
|
28
|
+
promotion_discount_value: utils_1.model.number().default(10),
|
|
29
|
+
promotion_expiry_days: utils_1.model.number().default(30),
|
|
30
|
+
promotion_excluded_currencies: utils_1.model.json().nullable(),
|
|
31
|
+
promotion_code_prefix: utils_1.model.text().default("WELCOME"),
|
|
32
|
+
// ─── Discount Expiry Reminder ───
|
|
33
|
+
promotion_expiry_reminder_enabled: utils_1.model.boolean().default(false),
|
|
34
|
+
promotion_expiry_reminder_template_id: utils_1.model.text().nullable(),
|
|
35
|
+
promotion_expiry_reminder_days_before: utils_1.model.number().default(3),
|
|
36
|
+
// ─── Abandoned Cart ───
|
|
37
|
+
abandoned_cart_enabled: utils_1.model.boolean().default(false),
|
|
38
|
+
abandoned_cart_intervals: utils_1.model.json().nullable(),
|
|
39
|
+
abandoned_cart_max_emails: utils_1.model.number().default(3),
|
|
40
|
+
// ─── Abandoned Cart Discount ───
|
|
41
|
+
abandoned_cart_discount_enabled: utils_1.model.boolean().default(false),
|
|
42
|
+
abandoned_cart_discount_type: utils_1.model.text().default("percentage"),
|
|
43
|
+
abandoned_cart_discount_value: utils_1.model.number().default(10),
|
|
44
|
+
abandoned_cart_discount_max_uses: utils_1.model.number().default(1),
|
|
45
|
+
abandoned_cart_discount_expires_hours: utils_1.model.number().default(48),
|
|
46
|
+
abandoned_cart_discount_template_id: utils_1.model.text().nullable(),
|
|
47
|
+
abandoned_cart_discount_excluded_currencies: utils_1.model.json().nullable(),
|
|
48
|
+
abandoned_cart_discount_code_prefix: utils_1.model.text().default("COMEBACK"),
|
|
49
|
+
// ─── Brevo Contact Sync ───
|
|
50
|
+
contact_sync_enabled: utils_1.model.boolean().default(false),
|
|
51
|
+
contact_sync_list_id: utils_1.model.number().nullable(),
|
|
52
|
+
// ─── Event Tracking ───
|
|
53
|
+
event_tracking_enabled: utils_1.model.boolean().default(false),
|
|
54
|
+
// ─── Review Request ───
|
|
55
|
+
review_request_enabled: utils_1.model.boolean().default(false),
|
|
56
|
+
review_request_days_after: utils_1.model.number().default(7),
|
|
57
|
+
// ─── Win-back Campaign ───
|
|
58
|
+
winback_enabled: utils_1.model.boolean().default(false),
|
|
59
|
+
winback_days_inactive: utils_1.model.number().default(30),
|
|
60
|
+
// ─── Multi-language Templates ───
|
|
61
|
+
// JSON map: { "vi": { "order.placed": 101, "order.canceled": 102 }, "en": { ... } }
|
|
62
|
+
multilang_enabled: utils_1.model.boolean().default(false),
|
|
63
|
+
multilang_templates: utils_1.model.json().nullable(),
|
|
64
|
+
// ─── Webhook ───
|
|
65
|
+
webhook_enabled: utils_1.model.boolean().default(false),
|
|
66
|
+
webhook_secret: utils_1.model.text().nullable(),
|
|
67
|
+
// ─── WhatsApp ───
|
|
68
|
+
whatsapp_enabled: utils_1.model.boolean().default(false),
|
|
69
|
+
whatsapp_order_placed_template: utils_1.model.text().nullable(),
|
|
70
|
+
whatsapp_shipment_template: utils_1.model.text().nullable(),
|
|
71
|
+
whatsapp_abandoned_cart_template: utils_1.model.text().nullable(),
|
|
72
|
+
// ─── SMS ───
|
|
73
|
+
sms_enabled: utils_1.model.boolean().default(false),
|
|
74
|
+
sms_sender: utils_1.model.text().nullable(),
|
|
75
|
+
sms_order_placed_content: utils_1.model.text().nullable(),
|
|
76
|
+
sms_shipment_content: utils_1.model.text().nullable(),
|
|
77
|
+
});
|
|
78
|
+
exports.default = BrevoSettings;
|
|
79
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJldm8tc2V0dGluZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9icmV2by1zZXR0aW5ncy9tb2RlbHMvYnJldm8tc2V0dGluZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxxREFBaUQ7QUFFakQsTUFBTSxhQUFhLEdBQUcsYUFBSyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRTtJQUNuRCxFQUFFLEVBQUUsYUFBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRTtJQUUzQiw2QkFBNkI7SUFDN0Isd0JBQXdCLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUNqRCwwQkFBMEIsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ25ELDJCQUEyQixFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDcEQsNEJBQTRCLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUNyRCxrQ0FBa0MsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQzNELDhCQUE4QixFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDdkQsMEJBQTBCLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUNuRCwwQkFBMEIsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ25ELG1CQUFtQixFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFFNUMsaUJBQWlCO0lBQ2pCLFdBQVcsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBRXBDLG1DQUFtQztJQUNuQyxvQkFBb0IsRUFBRSxhQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFD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
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
7
|
+
const brevo_settings_1 = __importDefault(require("./models/brevo-settings"));
|
|
8
|
+
// All writable fields from the brevo_settings model
|
|
9
|
+
const ALLOWED_FIELDS = new Set([
|
|
10
|
+
"order_placed_template_id",
|
|
11
|
+
"order_canceled_template_id",
|
|
12
|
+
"order_delivered_template_id",
|
|
13
|
+
"customer_created_template_id",
|
|
14
|
+
"promotion_new_customer_template_id",
|
|
15
|
+
"shipment_confirmed_template_id",
|
|
16
|
+
"abandoned_cart_template_id",
|
|
17
|
+
"review_request_template_id",
|
|
18
|
+
"winback_template_id",
|
|
19
|
+
"sender_name",
|
|
20
|
+
"order_placed_enabled",
|
|
21
|
+
"order_canceled_enabled",
|
|
22
|
+
"order_delivered_enabled",
|
|
23
|
+
"customer_created_enabled",
|
|
24
|
+
"promotion_enabled",
|
|
25
|
+
"promotion_auto_create",
|
|
26
|
+
"promotion_discount_type",
|
|
27
|
+
"promotion_discount_value",
|
|
28
|
+
"promotion_expiry_days",
|
|
29
|
+
"promotion_excluded_currencies",
|
|
30
|
+
"promotion_code_prefix",
|
|
31
|
+
"promotion_expiry_reminder_enabled",
|
|
32
|
+
"promotion_expiry_reminder_template_id",
|
|
33
|
+
"promotion_expiry_reminder_days_before",
|
|
34
|
+
"shipment_confirmed_enabled",
|
|
35
|
+
"abandoned_cart_enabled",
|
|
36
|
+
"abandoned_cart_intervals",
|
|
37
|
+
"abandoned_cart_max_emails",
|
|
38
|
+
"abandoned_cart_discount_enabled",
|
|
39
|
+
"abandoned_cart_discount_type",
|
|
40
|
+
"abandoned_cart_discount_value",
|
|
41
|
+
"abandoned_cart_discount_max_uses",
|
|
42
|
+
"abandoned_cart_discount_expires_hours",
|
|
43
|
+
"abandoned_cart_discount_template_id",
|
|
44
|
+
"abandoned_cart_discount_excluded_currencies",
|
|
45
|
+
"abandoned_cart_discount_code_prefix",
|
|
46
|
+
"contact_sync_enabled",
|
|
47
|
+
"contact_sync_list_id",
|
|
48
|
+
"event_tracking_enabled",
|
|
49
|
+
"review_request_enabled",
|
|
50
|
+
"review_request_days_after",
|
|
51
|
+
"winback_enabled",
|
|
52
|
+
"winback_days_inactive",
|
|
53
|
+
"multilang_enabled",
|
|
54
|
+
"multilang_templates",
|
|
55
|
+
"webhook_enabled",
|
|
56
|
+
"webhook_secret",
|
|
57
|
+
"whatsapp_enabled",
|
|
58
|
+
"whatsapp_order_placed_template",
|
|
59
|
+
"whatsapp_shipment_template",
|
|
60
|
+
"whatsapp_abandoned_cart_template",
|
|
61
|
+
"sms_enabled",
|
|
62
|
+
"sms_sender",
|
|
63
|
+
"sms_order_placed_content",
|
|
64
|
+
"sms_shipment_content",
|
|
65
|
+
]);
|
|
66
|
+
class BrevoSettingsModuleService extends (0, utils_1.MedusaService)({
|
|
67
|
+
BrevoSettings: brevo_settings_1.default,
|
|
68
|
+
}) {
|
|
69
|
+
/**
|
|
70
|
+
* Get the singleton settings record, or create a default one if none exists.
|
|
71
|
+
*/
|
|
72
|
+
async getSettings() {
|
|
73
|
+
const [settings] = await this.listBrevoSettings({}, { take: 1 });
|
|
74
|
+
if (settings) {
|
|
75
|
+
return settings;
|
|
76
|
+
}
|
|
77
|
+
const created = await this.createBrevoSettings({});
|
|
78
|
+
return created;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Upsert settings - always update the singleton record.
|
|
82
|
+
* Strips unknown fields to prevent MikroORM errors.
|
|
83
|
+
*/
|
|
84
|
+
async upsertSettings(data) {
|
|
85
|
+
const existing = await this.getSettings();
|
|
86
|
+
// Only keep fields that exist in the model
|
|
87
|
+
const cleanData = {};
|
|
88
|
+
for (const [key, value] of Object.entries(data)) {
|
|
89
|
+
if (ALLOWED_FIELDS.has(key)) {
|
|
90
|
+
cleanData[key] = value;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// MikroORM deep-merges JSON objects, which means deleting keys
|
|
94
|
+
// from a JSON field (e.g. removing a locale from multilang_templates)
|
|
95
|
+
// has no effect — the old keys persist.
|
|
96
|
+
// Fix: nullify JSON fields first, then set the new value.
|
|
97
|
+
const JSON_FIELDS = ["multilang_templates", "abandoned_cart_intervals", "promotion_excluded_currencies", "abandoned_cart_discount_excluded_currencies"];
|
|
98
|
+
for (const field of JSON_FIELDS) {
|
|
99
|
+
if (field in cleanData) {
|
|
100
|
+
await this.updateBrevoSettings({
|
|
101
|
+
id: existing.id,
|
|
102
|
+
[field]: null,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
const updated = await this.updateBrevoSettings({
|
|
107
|
+
id: existing.id,
|
|
108
|
+
...cleanData,
|
|
109
|
+
});
|
|
110
|
+
return updated;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
exports.default = BrevoSettingsModuleService;
|
|
114
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2JyZXZvLXNldHRpbmdzL3NlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxxREFBeUQ7QUFDekQsNkVBQW1EO0FBRW5ELG9EQUFvRDtBQUNwRCxNQUFNLGNBQWMsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUMzQiwwQkFBMEI7SUFDMUIsNEJBQTRCO0lBQzVCLDZCQUE2QjtJQUM3Qiw4QkFBOEI7SUFDOUIsb0NBQW9DO0lBQ3BDLGdDQUFnQztJQUNoQyw0QkFBNEI7SUFDNUIsNEJBQTRCO0lBQzVCLHFCQUFxQjtJQUNyQixhQUFhO0lBQ2Isc0JBQXNCO0lBQ3RCLHdCQUF3QjtJQUN4Qix5QkFBeUI7SUFDekIsMEJBQTBCO0lBQzFCLG1CQUFtQjtJQUNuQix1QkFBdUI7SUFDdkIseUJBQXlCO0lBQ3pCLDBCQUEwQjtJQUMxQix1QkFBdUI7SUFDdkIsK0JBQStCO0lBQy9CLHVCQUF1QjtJQUN2QixtQ0FBbUM7SUFDbkMsdUNBQXVDO0lBQ3ZDLHVDQUF1QztJQUN2Qyw0QkFBNEI7SUFDNUIsd0JBQXdCO0lBQ3hCLDBCQUEwQjtJQUMxQiwyQkFBMkI7SUFDM0IsaUNBQWlDO0lBQ2pDLDhCQUE4QjtJQUM5QiwrQkFBK0I7SUFDL0Isa0NBQWtDO0lBQ2xDLHVDQUF1QztJQUN2QyxxQ0FBcUM7SUFDckMsNkNBQTZDO0lBQzdDLHFDQUFxQztJQUNyQyxzQkFBc0I7SUFDdEIsc0JBQXNCO0lBQ3RCLHdCQUF3QjtJQUN4Qix3QkFBd0I7SUFDeEIsMkJBQTJCO0lBQzNCLGlCQUFpQjtJQUNqQix1QkFBdUI7SUFDdkIsbUJBQW1CO0lBQ25CLHFCQUFxQjtJQUNyQixpQkFBaUI7SUFDakIsZ0JBQWdCO0lBQ2hCLGtCQUFrQjtJQUNsQixnQ0FBZ0M7SUFDaEMsNEJBQTRCO0lBQzVCLGtDQUFrQztJQUNsQyxhQUFhO0lBQ2IsWUFBWTtJQUNaLDBCQUEwQjtJQUMxQixzQkFBc0I7Q0FDekIsQ0FBQyxDQUFBO0FBRUYsTUFBTSwwQkFBMkIsU0FBUSxJQUFBLHFCQUFhLEVBQUM7SUFDbkQsYUFBYSxFQUFiLHdCQUFhO0NBQ2hCLENBQUM7SUFDRTs7T0FFRztJQUNILEtBQUssQ0FBQyxXQUFXO1FBQ2IsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQ2hFLElBQUksUUFBUSxFQUFFLENBQUM7WUFDWCxPQUFPLFFBQVEsQ0FBQTtRQUNuQixDQUFDO1FBQ0QsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDbEQsT0FBTyxPQUFPLENBQUE7SUFDbEIsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBeUI7UUFDMUMsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUE7UUFFekMsMkNBQTJDO1FBQzNDLE1BQU0sU0FBUyxHQUF3QixFQUFFLENBQUE7UUFDekMsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM5QyxJQUFJLGNBQWMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDMUIsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQTtZQUMxQixDQUFDO1FBQ0wsQ0FBQztRQUVELCtEQUErRDtRQUMvRCxzRUFBc0U7UUFDdEUsd0NBQXdDO1FBQ3hDLDBEQUEwRDtRQUMxRCxNQUFNLFdBQVcsR0FBRyxDQUFDLHFCQUFxQixFQUFFLDBCQUEwQixFQUFFLCtCQUErQixFQUFFLDZDQUE2QyxDQUFDLENBQUE7UUFDdkosS0FBSyxNQUFNLEtBQUssSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUM5QixJQUFJLEtBQUssSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDckIsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUM7b0JBQzNCLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRTtvQkFDZixDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUk7aUJBQ2hCLENBQUMsQ0FBQTtZQUNOLENBQUM7UUFDTCxDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUM7WUFDM0MsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFO1lBQ2YsR0FBRyxTQUFTO1NBQ2YsQ0FBQyxDQUFBO1FBQ0YsT0FBTyxPQUFPLENBQUE7SUFDbEIsQ0FBQztDQUNKO0FBRUQsa0JBQWUsMEJBQTBCLENBQUEifQ==
|