@lodashventure/medusa-hero 1.0.1

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,129 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DELETE = exports.POST = exports.GET = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const upload_category_image_1 = require("../../../../../workflows/upload-category-image");
6
+ const gcs_direct_upload_1 = require("../../../../../services/gcs-direct-upload");
7
+ // GET - Get category hero image
8
+ const GET = async (req, res) => {
9
+ const { id } = req.params;
10
+ const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
11
+ try {
12
+ const { data: categories } = await query.graph({
13
+ entity: "product_category",
14
+ fields: ["id", "name", "metadata"],
15
+ filters: { id },
16
+ });
17
+ if (!categories || categories.length === 0) {
18
+ return res.status(404).json({ error: "Category not found" });
19
+ }
20
+ return res.json({
21
+ hero: categories[0].metadata?.hero || null,
22
+ });
23
+ }
24
+ catch (error) {
25
+ console.error("Error fetching category hero:", error);
26
+ return res.status(500).json({ error: "Failed to fetch category hero" });
27
+ }
28
+ };
29
+ exports.GET = GET;
30
+ // POST - Upload category hero image
31
+ const POST = async (req, res) => {
32
+ const { id } = req.params;
33
+ const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
34
+ const logger = req.scope.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
35
+ try {
36
+ const { data: categories } = await query.graph({
37
+ entity: "product_category",
38
+ fields: ["id", "metadata"],
39
+ filters: { id },
40
+ });
41
+ if (!categories || categories.length === 0) {
42
+ return res.status(404).json({ error: "Category not found" });
43
+ }
44
+ const file = req.file;
45
+ if (!file) {
46
+ return res.status(400).json({ error: "No file uploaded" });
47
+ }
48
+ // Validate file type
49
+ const allowedMimeTypes = ['image/jpeg', 'image/jpg', 'image/png', 'image/gif', 'image/webp'];
50
+ if (!allowedMimeTypes.includes(file.mimetype)) {
51
+ return res.status(400).json({
52
+ error: "Invalid file type. Only JPEG, PNG, GIF, and WebP images are allowed."
53
+ });
54
+ }
55
+ // Validate file size (max 5MB)
56
+ if (file.size > 5 * 1024 * 1024) {
57
+ return res.status(400).json({
58
+ error: "File size too large. Maximum allowed size is 5MB."
59
+ });
60
+ }
61
+ const result = await (0, upload_category_image_1.uploadCategoryImageWorkflow)(req.scope).run({
62
+ input: {
63
+ categoryId: id,
64
+ imageType: "hero",
65
+ fileData: {
66
+ filename: file.originalname,
67
+ mimeType: file.mimetype,
68
+ content: file.buffer.toString("base64"),
69
+ },
70
+ },
71
+ });
72
+ return res.json({
73
+ category: {
74
+ id,
75
+ hero: result.result.imageUrl,
76
+ },
77
+ });
78
+ }
79
+ catch (error) {
80
+ logger.error("Error uploading category hero:", error);
81
+ return res.status(500).json({ error: "Failed to upload category hero" });
82
+ }
83
+ };
84
+ exports.POST = POST;
85
+ // DELETE - Delete category hero image
86
+ const DELETE = async (req, res) => {
87
+ const { id } = req.params;
88
+ const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
89
+ const logger = req.scope.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
90
+ const gcsUploadService = new gcs_direct_upload_1.GcsDirectUploadService();
91
+ try {
92
+ const { data: categories } = await query.graph({
93
+ entity: "product_category",
94
+ fields: ["id", "metadata"],
95
+ filters: { id },
96
+ });
97
+ if (!categories || categories.length === 0) {
98
+ return res.status(404).json({ error: "Category not found" });
99
+ }
100
+ const heroUrl = categories[0].metadata?.hero;
101
+ if (!heroUrl) {
102
+ return res.status(404).json({ error: "No hero image found for this category" });
103
+ }
104
+ // Delete the file from GCS
105
+ if (heroUrl.includes('storage.googleapis.com')) {
106
+ try {
107
+ const parts = heroUrl.split('/');
108
+ const bucketIndex = parts.indexOf('sangaroon');
109
+ if (bucketIndex !== -1 && bucketIndex < parts.length - 1) {
110
+ const filename = parts.slice(bucketIndex + 1).join('/');
111
+ await gcsUploadService.deleteFile(filename);
112
+ }
113
+ }
114
+ catch (deleteError) {
115
+ logger.error("Error deleting file from GCS:", deleteError);
116
+ // Continue even if file deletion fails
117
+ }
118
+ }
119
+ return res.json({
120
+ message: "Category hero image deleted successfully",
121
+ });
122
+ }
123
+ catch (error) {
124
+ logger.error("Error deleting category hero:", error);
125
+ return res.status(500).json({ error: "Failed to delete category hero" });
126
+ }
127
+ };
128
+ exports.DELETE = DELETE;
129
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2NhdGVnb3JpZXMvW2lkXS9oZXJvL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUdBLHFEQUFzRTtBQUN0RSwwRkFBNkY7QUFDN0YsaUZBQW1GO0FBR25GLGdDQUFnQztBQUN6QixNQUFNLEdBQUcsR0FBRyxLQUFLLEVBQ3RCLEdBQTBCLEVBQzFCLEdBQW1CLEVBQ25CLEVBQUU7SUFDRixNQUFNLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztJQUMxQixNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUVqRSxJQUFJLENBQUM7UUFDSCxNQUFNLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxHQUFHLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQztZQUM3QyxNQUFNLEVBQUUsa0JBQWtCO1lBQzFCLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsVUFBVSxDQUFDO1lBQ2xDLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRTtTQUNoQixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsVUFBVSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDM0MsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxvQkFBb0IsRUFBRSxDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUVELE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQztZQUNkLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLElBQUksSUFBSSxJQUFJO1NBQzNDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFBQyxPQUFPLEtBQUssRUFB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
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DELETE = exports.POST = exports.GET = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const upload_category_image_1 = require("../../../../../workflows/upload-category-image");
6
+ const gcs_direct_upload_1 = require("../../../../../services/gcs-direct-upload");
7
+ // GET - Get category thumbnail
8
+ const GET = async (req, res) => {
9
+ const { id } = req.params;
10
+ const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
11
+ try {
12
+ const { data: categories } = await query.graph({
13
+ entity: "product_category",
14
+ fields: ["id", "name", "metadata"],
15
+ filters: { id },
16
+ });
17
+ if (!categories || categories.length === 0) {
18
+ return res.status(404).json({ error: "Category not found" });
19
+ }
20
+ return res.json({
21
+ thumbnail: categories[0].metadata?.thumbnail || null,
22
+ });
23
+ }
24
+ catch (error) {
25
+ console.error("Error fetching category thumbnail:", error);
26
+ return res.status(500).json({ error: "Failed to fetch category thumbnail" });
27
+ }
28
+ };
29
+ exports.GET = GET;
30
+ // POST - Upload category thumbnail
31
+ const POST = async (req, res) => {
32
+ const { id } = req.params;
33
+ const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
34
+ const logger = req.scope.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
35
+ try {
36
+ const { data: categories } = await query.graph({
37
+ entity: "product_category",
38
+ fields: ["id", "metadata"],
39
+ filters: { id },
40
+ });
41
+ if (!categories || categories.length === 0) {
42
+ return res.status(404).json({ error: "Category not found" });
43
+ }
44
+ const file = req.file;
45
+ if (!file) {
46
+ return res.status(400).json({ error: "No file uploaded" });
47
+ }
48
+ // Validate file type
49
+ const allowedMimeTypes = ['image/jpeg', 'image/jpg', 'image/png', 'image/gif', 'image/webp'];
50
+ if (!allowedMimeTypes.includes(file.mimetype)) {
51
+ return res.status(400).json({
52
+ error: "Invalid file type. Only JPEG, PNG, GIF, and WebP images are allowed."
53
+ });
54
+ }
55
+ // Validate file size (max 5MB)
56
+ if (file.size > 5 * 1024 * 1024) {
57
+ return res.status(400).json({
58
+ error: "File size too large. Maximum allowed size is 5MB."
59
+ });
60
+ }
61
+ const result = await (0, upload_category_image_1.uploadCategoryImageWorkflow)(req.scope).run({
62
+ input: {
63
+ categoryId: id,
64
+ imageType: "thumbnail",
65
+ fileData: {
66
+ filename: file.originalname,
67
+ mimeType: file.mimetype,
68
+ content: file.buffer.toString("base64"),
69
+ },
70
+ },
71
+ });
72
+ return res.json({
73
+ category: {
74
+ id,
75
+ thumbnail: result.result.imageUrl,
76
+ },
77
+ });
78
+ }
79
+ catch (error) {
80
+ logger.error("Error uploading category thumbnail:", error);
81
+ return res.status(500).json({ error: "Failed to upload category thumbnail" });
82
+ }
83
+ };
84
+ exports.POST = POST;
85
+ // DELETE - Delete category thumbnail
86
+ const DELETE = async (req, res) => {
87
+ const { id } = req.params;
88
+ const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
89
+ const logger = req.scope.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
90
+ const gcsUploadService = new gcs_direct_upload_1.GcsDirectUploadService();
91
+ try {
92
+ const { data: categories } = await query.graph({
93
+ entity: "product_category",
94
+ fields: ["id", "metadata"],
95
+ filters: { id },
96
+ });
97
+ if (!categories || categories.length === 0) {
98
+ return res.status(404).json({ error: "Category not found" });
99
+ }
100
+ const thumbnailUrl = categories[0].metadata?.thumbnail;
101
+ if (!thumbnailUrl) {
102
+ return res.status(404).json({ error: "No thumbnail found for this category" });
103
+ }
104
+ // Delete the file from GCS
105
+ if (thumbnailUrl.includes('storage.googleapis.com')) {
106
+ try {
107
+ const parts = thumbnailUrl.split('/');
108
+ const bucketIndex = parts.indexOf('sangaroon');
109
+ if (bucketIndex !== -1 && bucketIndex < parts.length - 1) {
110
+ const filename = parts.slice(bucketIndex + 1).join('/');
111
+ await gcsUploadService.deleteFile(filename);
112
+ }
113
+ }
114
+ catch (deleteError) {
115
+ logger.error("Error deleting file from GCS:", deleteError);
116
+ // Continue even if file deletion fails
117
+ }
118
+ }
119
+ return res.json({
120
+ message: "Category thumbnail deleted successfully",
121
+ });
122
+ }
123
+ catch (error) {
124
+ logger.error("Error deleting category thumbnail:", error);
125
+ return res.status(500).json({ error: "Failed to delete category thumbnail" });
126
+ }
127
+ };
128
+ exports.DELETE = DELETE;
129
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2NhdGVnb3JpZXMvW2lkXS90aHVtYm5haWwvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBR0EscURBQXNFO0FBQ3RFLDBGQUE2RjtBQUM3RixpRkFBbUY7QUFHbkYsK0JBQStCO0FBQ3hCLE1BQU0sR0FBRyxHQUFHLEtBQUssRUFDdEIsR0FBMEIsRUFDMUIsR0FBbUIsRUFDbkIsRUFBRTtJQUNGLE1BQU0sRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDO0lBQzFCLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRWpFLElBQUksQ0FBQztRQUNILE1BQU0sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEdBQUcsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQzdDLE1BQU0sRUFBRSxrQkFBa0I7WUFDMUIsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxVQUFVLENBQUM7WUFDbEMsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFO1NBQ2hCLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxVQUFVLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMzQyxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLG9CQUFvQixFQUFFLENBQUMsQ0FBQztRQUMvRCxDQUFDO1FBRUQsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDO1lBQ2QsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsU0FBUyxJQUFJLElBQUk7U0FDckQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUFDLE9BQU8sS0FB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
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.POST = void 0;
4
+ const reorder_heroes_1 = require("../../../../workflows/reorder-heroes");
5
+ const POST = async (req, res) => {
6
+ const { ids } = req.body;
7
+ const { result: reorderedHeroes } = await (0, reorder_heroes_1.reorderHeroesWorkflow)(req.scope).run({
8
+ input: {
9
+ ids,
10
+ },
11
+ });
12
+ res.setHeader("Content-Type", "application/json; charset=utf-8");
13
+ res.json({
14
+ reorderedHeroes,
15
+ });
16
+ };
17
+ exports.POST = POST;
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2hlcm9lcy9yZW9yZGVyL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUlBLHlFQUE2RTtBQUV0RSxNQUFNLElBQUksR0FBRyxLQUFLLEVBQ3ZCLEdBQWtELEVBQ2xELEdBQW1CLEVBQ25CLEVBQUU7SUFDRixNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztJQUV6QixNQUFNLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxHQUFHLE1BQU0sSUFBQSxzQ0FBcUIsRUFDN0QsR0FBRyxDQUFDLEtBQUssQ0FDVixDQUFDLEdBQUcsQ0FBQztRQUNKLEtBQUssRUFBRTtZQUNMLEdBQUc7U0FDSjtLQUNGLENBQUMsQ0FBQztJQUVILEdBQUcsQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLGlDQUFpQyxDQUFDLENBQUM7SUFDakUsR0FBRyxDQUFDLElBQUksQ0FBQztRQUNQLGVBQWU7S0FDaEIsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBbEJXLFFBQUEsSUFBSSxRQWtCZiJ9
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DELETE = exports.POST = void 0;
4
+ exports.GET = GET;
5
+ const upload_heroes_1 = require("../../../workflows/upload-heroes");
6
+ const utils_1 = require("@medusajs/framework/utils");
7
+ const framework_1 = require("@medusajs/framework");
8
+ const hero_1 = require("../../../modules/hero");
9
+ const delete_heroes_1 = require("../../../workflows/delete-heroes");
10
+ const POST = async (req, res) => {
11
+ const inputFiles = req.files;
12
+ if (!inputFiles?.length) {
13
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "No files were uploaded");
14
+ }
15
+ const { result: files } = await (0, upload_heroes_1.uploadHeroesWorkflow)(req.scope).run({
16
+ input: {
17
+ files: inputFiles?.map((f) => ({
18
+ /**
19
+ * docs: https://github.com/expressjs/multer/issues/1104#issuecomment-1152987772
20
+ */
21
+ filename: Buffer
22
+ .from(f.originalname, "latin1")
23
+ .toString("utf-8"),
24
+ mimeType: f.mimetype,
25
+ content: f.buffer.toString("binary"),
26
+ access: "public",
27
+ })),
28
+ },
29
+ });
30
+ res.setHeader("Content-Type", "application/json; charset=utf-8");
31
+ res.json({
32
+ files,
33
+ });
34
+ };
35
+ exports.POST = POST;
36
+ async function GET(req, res) {
37
+ const heroService = framework_1.container.resolve(hero_1.HERO_MODULE);
38
+ const [heroes, count] = await heroService.listAndCountHeroes({}, {
39
+ order: {
40
+ order: "DESC",
41
+ },
42
+ });
43
+ res.setHeader("Content-Type", "application/json; charset=utf-8");
44
+ res.json({
45
+ heroes,
46
+ count,
47
+ });
48
+ }
49
+ const DELETE = async (req, res) => {
50
+ const { ids } = req.body;
51
+ const { result: deletedHeroes } = await (0, delete_heroes_1.deleteHeroesWorkflow)(req.scope).run({
52
+ input: {
53
+ ids,
54
+ },
55
+ });
56
+ res.setHeader("Content-Type", "application/json; charset=utf-8");
57
+ res.json({
58
+ deletedHeroes,
59
+ });
60
+ };
61
+ exports.DELETE = DELETE;
62
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2hlcm9lcy9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUErQ0Esa0JBbUJDO0FBOURELG9FQUF3RTtBQUN4RSxxREFBd0Q7QUFDeEQsbURBQWdEO0FBQ2hELGdEQUFvRDtBQUNwRCxvRUFBd0U7QUFPakUsTUFBTSxJQUFJLEdBQUcsS0FBSyxFQUFFLEdBQWtCLEVBQUUsR0FBbUIsRUFBRSxFQUFFO0lBQ3BFLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUM7SUFFN0IsSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsQ0FBQztRQUN4QixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5Qix3QkFBd0IsQ0FDekIsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sSUFBQSxvQ0FBb0IsRUFBQyxHQUFHLENBQUMsS0FBWSxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQ3pFLEtBQUssRUFBRTtZQUNMLEtBQUssRUFBRSxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUM3Qjs7bUJBRUc7Z0JBQ0gsUUFBUSxFQUFHLE1BQWM7cUJBQ3RCLElBQUksQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQztxQkFDOUIsUUFBUSxDQUFDLE9BQU8sQ0FBQztnQkFDcEIsUUFBUSxFQUFFLENBQUMsQ0FBQyxRQUFRO2dCQUNwQixPQUFPLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO2dCQUNwQyxNQUFNLEVBQUUsUUFBUTthQUNqQixDQUFDLENBQUM7U0FDSjtLQUNGLENBQUMsQ0FBQztJQUVILEdBQUcsQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLGlDQUFpQyxDQUFDLENBQUM7SUFDakUsR0FBRyxDQUFDLElBQUksQ0FBQztRQUNQLEtBQUs7S0FDTixDQUFDLENBQUM7QUFDTCxDQUFDLENBQUM7QUE5QlcsUUFBQSxJQUFJLFFBOEJmO0FBRUssS0FBSyxVQUFVLEdBQUcsQ0FDdkIsR0FBK0IsRUFDL0IsR0FBbUI7SUFFbkIsTUFBTSxXQUFXLEdBQUcscUJBQVMsQ0FBQyxPQUFPLENBQW9CLGtCQUFXLENBQUMsQ0FBQztJQUN0RSxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxHQUFHLE1BQU0sV0FBVyxDQUFDLGtCQUFrQixDQUMxRCxFQUFFLEVBQ0Y7UUFDRSxLQUFLLEVBQUU7WUFDTCxLQUFLLEVBQUUsTUFBTTtTQUNkO0tBQ0YsQ0FDRixDQUFDO0lBRUYsR0FBRyxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsaUNBQWlDLENBQUMsQ0FBQztJQUNqRSxHQUFHLENBQUMsSUFBSSxDQUFDO1FBQ1AsTUFBTTtRQUNOLEtBQUs7S0FDTixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRU0sTUFBTSxNQUFNLEdBQUcsS0FBSyxFQUN6QixHQUFrRCxFQUNsRCxHQUFtQixFQUNuQixFQUFFO0lBQ0YsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7SUFFekIsTUFBTSxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsR0FBRyxNQUFNLElBQUEsb0NBQW9CLEVBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FDekU7UUFDRSxLQUFLLEVBQUU7WUFDTCxHQUFHO1NBQ0o7S0FDRixDQUNGLENBQUM7SUFFRixHQUFHLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDO0lBQ2pFLEdBQUcsQ0FBQyxJQUFJLENBQUM7UUFDUCxhQUFhO0tBQ2QsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBbEJXLFFBQUEsTUFBTSxVQWtCakIifQ==
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.POST = void 0;
4
+ const framework_1 = require("@medusajs/framework");
5
+ const hero_1 = require("../../../../modules/hero");
6
+ const POST = async (req, res) => {
7
+ const { id, link } = req.body;
8
+ const heroService = framework_1.container.resolve(hero_1.HERO_MODULE);
9
+ const updatedHero = await heroService.updateHeroes({
10
+ id,
11
+ link,
12
+ });
13
+ res.setHeader("Content-Type", "application/json; charset=utf-8");
14
+ res.json({
15
+ hero: updatedHero,
16
+ });
17
+ };
18
+ exports.POST = POST;
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2hlcm9lcy91cGRhdGUtbGluay9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFJQSxtREFBZ0Q7QUFDaEQsbURBQXVEO0FBR2hELE1BQU0sSUFBSSxHQUFHLEtBQUssRUFDdkIsR0FBb0UsRUFDcEUsR0FBbUIsRUFDbkIsRUFBRTtJQUNGLE1BQU0sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztJQUU5QixNQUFNLFdBQVcsR0FBRyxxQkFBUyxDQUFDLE9BQU8sQ0FBb0Isa0JBQVcsQ0FBQyxDQUFDO0lBRXRFLE1BQU0sV0FBVyxHQUFHLE1BQU0sV0FBVyxDQUFDLFlBQVksQ0FBQztRQUNqRCxFQUFFO1FBQ0YsSUFBSTtLQUNMLENBQUMsQ0FBQztJQUVILEdBQUcsQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLGlDQUFpQyxDQUFDLENBQUM7SUFDakUsR0FBRyxDQUFDLElBQUksQ0FBQztRQUNQLElBQUksRUFBRSxXQUFXO0tBQ2xCLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQztBQWpCVyxRQUFBLElBQUksUUFpQmYifQ==
@@ -0,0 +1,49 @@
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 http_1 = require("@medusajs/framework/http");
7
+ const multer_1 = __importDefault(require("multer"));
8
+ const upload = (0, multer_1.default)({
9
+ storage: multer_1.default.memoryStorage(),
10
+ limits: {
11
+ fileSize: 10 * 1024 * 1024, // 10MB
12
+ },
13
+ fileFilter: (req, file, cb) => {
14
+ const allowedMimeTypes = [
15
+ "image/jpeg",
16
+ "image/jpg",
17
+ "image/png",
18
+ "image/gif",
19
+ "image/webp",
20
+ ];
21
+ if (allowedMimeTypes.includes(file.mimetype)) {
22
+ cb(null, true);
23
+ }
24
+ else {
25
+ cb(new Error("Invalid file type. Only JPEG, PNG, GIF, and WebP are allowed."));
26
+ }
27
+ },
28
+ });
29
+ exports.default = (0, http_1.defineMiddlewares)({
30
+ routes: [
31
+ {
32
+ method: "POST",
33
+ matcher: "/admin/heroes",
34
+ middlewares: [
35
+ // @ts-ignore
36
+ upload.array("files"),
37
+ ],
38
+ },
39
+ {
40
+ method: "POST",
41
+ matcher: "/admin/categories/:id/hero",
42
+ middlewares: [
43
+ // @ts-ignore
44
+ upload.single("file"),
45
+ ],
46
+ },
47
+ ],
48
+ });
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpL21pZGRsZXdhcmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsbURBQTZEO0FBQzdELG9EQUE0QjtBQUU1QixNQUFNLE1BQU0sR0FBRyxJQUFBLGdCQUFNLEVBQUM7SUFDcEIsT0FBTyxFQUFFLGdCQUFNLENBQUMsYUFBYSxFQUFFO0lBQy9CLE1BQU0sRUFBRTtRQUNOLFFBQVEsRUFBRSxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksRUFBRSxPQUFPO0tBQ3BDO0lBQ0QsVUFBVSxFQUFFLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRTtRQUM1QixNQUFNLGdCQUFnQixHQUFHO1lBQ3ZCLFlBQVk7WUFDWixXQUFXO1lBQ1gsV0FBVztZQUNYLFdBQVc7WUFDWCxZQUFZO1NBQ2IsQ0FBQztRQUNGLElBQUksZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQzdDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakIsQ0FBQzthQUFNLENBQUM7WUFDTixFQUFFLENBQ0EsSUFBSSxLQUFLLENBQ1AsK0RBQStELENBQ2hFLENBQ0YsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0NBQ0YsQ0FBQyxDQUFDO0FBRUgsa0JBQWUsSUFBQSx3QkFBaUIsRUFBQztJQUMvQixNQUFNLEVBQUU7UUFDTjtZQUNFLE1BQU0sRUFBRSxNQUFNO1lBQ2QsT0FBTyxFQUFFLGVBQWU7WUFDeEIsV0FBVyxFQUFFO2dCQUNYLGFBQWE7Z0JBQ2IsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7YUFDdEI7U0FDRjtRQUNEO1lBQ0UsTUFBTSxFQUFFLE1BQU07WUFDZCxPQUFPLEVBQUUsNEJBQTRCO1lBQ3JDLFdBQVcsRUFBRTtnQkFDWCxhQUFhO2dCQUNiLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO2FBQ3RCO1NBQ0Y7S0FDRjtDQUNGLENBQUMsQ0FBQyJ9
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GET = GET;
4
+ const framework_1 = require("@medusajs/framework");
5
+ const hero_1 = require("../../../modules/hero");
6
+ async function GET(req, res) {
7
+ const heroService = await framework_1.container.resolve(hero_1.HERO_MODULE);
8
+ const [heroes, count] = await heroService.listAndCountHeroes({}, {
9
+ order: {
10
+ order: "DESC",
11
+ },
12
+ });
13
+ res.setHeader("Content-Type", "application/json; charset=utf-8");
14
+ res.json({
15
+ heroes,
16
+ count,
17
+ });
18
+ }
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2hlcm8vcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFPQSxrQkFvQkM7QUF0QkQsbURBQWdEO0FBQ2hELGdEQUFvRDtBQUM3QyxLQUFLLFVBQVUsR0FBRyxDQUN2QixHQUErQixFQUMvQixHQUFtQjtJQUVuQixNQUFNLFdBQVcsR0FDZixNQUFNLHFCQUFTLENBQUMsT0FBTyxDQUFvQixrQkFBVyxDQUFDLENBQUM7SUFDMUQsTUFBTSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsR0FBRyxNQUFNLFdBQVcsQ0FBQyxrQkFBa0IsQ0FDMUQsRUFBRSxFQUNGO1FBQ0UsS0FBSyxFQUFFO1lBQ0wsS0FBSyxFQUFFLE1BQU07U0FDZDtLQUNGLENBQ0YsQ0FBQztJQUVGLEdBQUcsQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLGlDQUFpQyxDQUFDLENBQUM7SUFDakUsR0FBRyxDQUFDLElBQUksQ0FBQztRQUNQLE1BQU07UUFDTixLQUFLO0tBQ04sQ0FBQyxDQUFDO0FBQ0wsQ0FBQyJ9
@@ -0,0 +1,13 @@
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
+ exports.HERO_MODULE = void 0;
7
+ const utils_1 = require("@medusajs/framework/utils");
8
+ const service_1 = __importDefault(require("./service"));
9
+ exports.HERO_MODULE = "hero";
10
+ exports.default = (0, utils_1.Module)(exports.HERO_MODULE, {
11
+ service: service_1.default,
12
+ });
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9oZXJvL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHFEQUFtRDtBQUNuRCx3REFBMEM7QUFFN0IsUUFBQSxXQUFXLEdBQUcsTUFBTSxDQUFDO0FBRWxDLGtCQUFlLElBQUEsY0FBTSxFQUFDLG1CQUFXLEVBQUU7SUFDakMsT0FBTyxFQUFFLGlCQUFpQjtDQUMzQixDQUFDLENBQUMifQ==
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Migration20250414070000 = void 0;
4
+ const migrations_1 = require("@medusajs/framework/mikro-orm/migrations");
5
+ class Migration20250414070000 extends migrations_1.Migration {
6
+ async up() {
7
+ this.addSql(`create table if not exists "hero" ("id" text not null, "url" text not null, "order" integer not null, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), "deleted_at" timestamptz null, constraint "hero_pkey" primary key ("id"));`);
8
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_hero_deleted_at" ON "hero" (deleted_at) WHERE deleted_at IS NULL;`);
9
+ }
10
+ async down() {
11
+ this.addSql(`drop table if exists "hero" cascade;`);
12
+ }
13
+ }
14
+ exports.Migration20250414070000 = Migration20250414070000;
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNTA0MTQwNzAwMDAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9oZXJvL21pZ3JhdGlvbnMvTWlncmF0aW9uMjAyNTA0MTQwNzAwMDAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUVBQXFFO0FBRXJFLE1BQWEsdUJBQXdCLFNBQVEsc0JBQVM7SUFFM0MsS0FBSyxDQUFDLEVBQUU7UUFDZixJQUFJLENBQUMsTUFBTSxDQUFDLG9SQUFvUixDQUFDLENBQUM7UUFDbFMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtR0FBbUcsQ0FBQyxDQUFDO0lBQ25ILENBQUM7SUFFUSxLQUFLLENBQUMsSUFBSTtRQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLHNDQUFzQyxDQUFDLENBQUM7SUFDdEQsQ0FBQztDQUVGO0FBWEQsMERBV0MifQ==
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Migration20251024170000 = void 0;
4
+ const migrations_1 = require("@medusajs/framework/mikro-orm/migrations");
5
+ class Migration20251024170000 extends migrations_1.Migration {
6
+ async up() {
7
+ this.addSql(`alter table if exists "hero" add column if not exists "link" text null;`);
8
+ }
9
+ async down() {
10
+ this.addSql(`alter table if exists "hero" drop column if exists "link";`);
11
+ }
12
+ }
13
+ exports.Migration20251024170000 = Migration20251024170000;
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNTEwMjQxNzAwMDAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9oZXJvL21pZ3JhdGlvbnMvTWlncmF0aW9uMjAyNTEwMjQxNzAwMDAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUVBQXFFO0FBRXJFLE1BQWEsdUJBQXdCLFNBQVEsc0JBQVM7SUFDM0MsS0FBSyxDQUFDLEVBQUU7UUFDZixJQUFJLENBQUMsTUFBTSxDQUNULHlFQUF5RSxDQUMxRSxDQUFDO0lBQ0osQ0FBQztJQUVRLEtBQUssQ0FBQyxJQUFJO1FBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsNERBQTRELENBQUMsQ0FBQztJQUM1RSxDQUFDO0NBQ0Y7QUFWRCwwREFVQyJ9
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const utils_1 = require("@medusajs/framework/utils");
4
+ const Hero = utils_1.model.define("hero", {
5
+ id: utils_1.model.id().primaryKey(),
6
+ url: utils_1.model.text(),
7
+ link: utils_1.model.text().nullable(),
8
+ order: utils_1.model.number(),
9
+ });
10
+ exports.default = Hero;
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVyby5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2hlcm8vbW9kZWxzL2hlcm8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxxREFBa0Q7QUFFbEQsTUFBTSxJQUFJLEdBQUcsYUFBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUU7SUFDaEMsRUFBRSxFQUFFLGFBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLEVBQUU7SUFDM0IsR0FBRyxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUU7SUFDakIsSUFBSSxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDN0IsS0FBSyxFQUFFLGFBQUssQ0FBQyxNQUFNLEVBQUU7Q0FDdEIsQ0FBQyxDQUFDO0FBRUgsa0JBQWUsSUFBSSxDQUFDIn0=
@@ -0,0 +1,13 @@
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 hero_1 = __importDefault(require("./models/hero"));
8
+ class HeroModuleService extends (0, utils_1.MedusaService)({
9
+ Hero: hero_1.default,
10
+ }) {
11
+ }
12
+ exports.default = HeroModuleService;
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2hlcm8vc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHFEQUEwRDtBQUMxRCx5REFBaUM7QUFFakMsTUFBTSxpQkFBa0IsU0FBUSxJQUFBLHFCQUFhLEVBQUM7SUFDNUMsSUFBSSxFQUFKLGNBQUk7Q0FDTCxDQUFDO0NBQUc7QUFFTCxrQkFBZSxpQkFBaUIsQ0FBQyJ9
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GcsDirectUploadService = void 0;
4
+ const storage_1 = require("@google-cloud/storage");
5
+ class GcsDirectUploadService {
6
+ constructor() {
7
+ // Initialize GCS client with credentials from env
8
+ this.storage = new storage_1.Storage({
9
+ credentials: {
10
+ client_email: process.env.CLIENT_EMAIL,
11
+ private_key: process.env.PRIVATE_KEY.replace(/\\n/g, '\n'),
12
+ },
13
+ });
14
+ this.bucketName = process.env.BUCKET_NAME || 'sangaroon';
15
+ this.baseUrl = process.env.GCP_STORAGE_BASE_PUBLIC_URL || 'https://storage.googleapis.com';
16
+ }
17
+ async uploadFile(filename, buffer, mimeType) {
18
+ try {
19
+ const bucket = this.storage.bucket(this.bucketName);
20
+ const file = bucket.file(filename);
21
+ await file.save(buffer, {
22
+ metadata: {
23
+ contentType: mimeType,
24
+ },
25
+ public: true,
26
+ resumable: false,
27
+ });
28
+ // Return the public URL
29
+ return `${this.baseUrl}/${this.bucketName}/${filename}`;
30
+ }
31
+ catch (error) {
32
+ console.error('Error uploading to GCS:', error);
33
+ const message = error instanceof Error ? error.message : String(error);
34
+ throw new Error(`Failed to upload file to GCS: ${message}`);
35
+ }
36
+ }
37
+ async deleteFile(filename) {
38
+ try {
39
+ const bucket = this.storage.bucket(this.bucketName);
40
+ const file = bucket.file(filename);
41
+ const [exists] = await file.exists();
42
+ if (exists) {
43
+ await file.delete();
44
+ }
45
+ }
46
+ catch (error) {
47
+ console.error('Error deleting from GCS:', error);
48
+ // Don't throw on delete errors
49
+ }
50
+ }
51
+ }
52
+ exports.GcsDirectUploadService = GcsDirectUploadService;
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2NzLWRpcmVjdC11cGxvYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvZ2NzLWRpcmVjdC11cGxvYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbURBQWdEO0FBRWhELE1BQWEsc0JBQXNCO0lBS2pDO1FBQ0Usa0RBQWtEO1FBQ2xELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxpQkFBTyxDQUFDO1lBQ3pCLFdBQVcsRUFBRTtnQkFDWCxZQUFZLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFhO2dCQUN2QyxXQUFXLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFZLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7YUFDNUQ7U0FDRixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxJQUFJLFdBQVcsQ0FBQztRQUN6RCxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsMkJBQTJCLElBQUksZ0NBQWdDLENBQUM7SUFDN0YsQ0FBQztJQUVELEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBZ0IsRUFBRSxNQUFjLEVBQUUsUUFBZ0I7UUFDakUsSUFBSSxDQUFDO1lBQ0gsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3BELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFbkMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDdEIsUUFBUSxFQUFFO29CQUNSLFdBQVcsRUFBRSxRQUFRO2lCQUN0QjtnQkFDRCxNQUFNLEVBQUUsSUFBSTtnQkFDWixTQUFTLEVBQUUsS0FBSzthQUNqQixDQUFDLENBQUM7WUFFSCx3QkFBd0I7WUFDeEIsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUMxRCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMseUJBQXlCLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDaEQsTUFBTSxPQUFPLEdBQUcsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZFLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDOUQsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsVUFBVSxDQUFDLFFBQWdCO1FBQy9CLElBQUksQ0FBQztZQUNILE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNwRCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRW5DLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNyQyxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNYLE1BQU0sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3RCLENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsMEJBQTBCLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDakQsK0JBQStCO1FBQ2pDLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUF0REQsd0RBc0RDIn0=