@lodashventure/medusa-brand 1.2.20 → 1.2.23

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.
Files changed (48) hide show
  1. package/.medusa/server/src/admin/index.js +1191 -556
  2. package/.medusa/server/src/admin/index.mjs +1165 -530
  3. package/.medusa/server/src/api/admin/brands/[id]/image/route.js +178 -0
  4. package/.medusa/server/src/api/admin/brands/[id]/logo/route.js +179 -0
  5. package/.medusa/server/src/api/admin/brands/[id]/products/route.js +55 -0
  6. package/.medusa/server/src/api/admin/brands/[id]/route.js +251 -0
  7. package/.medusa/server/src/api/admin/brands/route.js +276 -0
  8. package/.medusa/server/src/api/admin/products/[id]/brand/route.js +117 -0
  9. package/.medusa/server/src/api/middlewares/attach-brand-to-products.js +110 -0
  10. package/.medusa/server/src/api/middlewares.js +53 -0
  11. package/.medusa/server/src/api/store/brands/[id]/route.js +31 -0
  12. package/.medusa/server/src/api/store/brands/route.js +99 -0
  13. package/.medusa/server/{index.js → src/index.js} +1 -1
  14. package/.medusa/server/{modules → src/modules}/brand/index.js +1 -1
  15. package/.medusa/server/src/modules/brand/models/brand.js +40 -0
  16. package/.medusa/server/{modules → src/modules}/brand/service.js +1 -1
  17. package/.medusa/server/src/services/gcs-direct-upload.js +93 -0
  18. package/.medusa/server/src/workflows/upload-brand-image.js +66 -0
  19. package/package.json +11 -10
  20. package/.medusa/server/api/admin/brands/[id]/image/route.d.ts +0 -5
  21. package/.medusa/server/api/admin/brands/[id]/image/route.js +0 -119
  22. package/.medusa/server/api/admin/brands/[id]/logo/route.d.ts +0 -5
  23. package/.medusa/server/api/admin/brands/[id]/logo/route.js +0 -119
  24. package/.medusa/server/api/admin/brands/[id]/products/route.d.ts +0 -2
  25. package/.medusa/server/api/admin/brands/[id]/products/route.js +0 -52
  26. package/.medusa/server/api/admin/brands/[id]/route.d.ts +0 -5
  27. package/.medusa/server/api/admin/brands/[id]/route.js +0 -112
  28. package/.medusa/server/api/admin/brands/route.d.ts +0 -4
  29. package/.medusa/server/api/admin/brands/route.js +0 -76
  30. package/.medusa/server/api/admin/products/[id]/brand/route.d.ts +0 -5
  31. package/.medusa/server/api/admin/products/[id]/brand/route.js +0 -117
  32. package/.medusa/server/api/middlewares/attach-brand-to-products.d.ts +0 -2
  33. package/.medusa/server/api/middlewares/attach-brand-to-products.js +0 -105
  34. package/.medusa/server/api/middlewares.d.ts +0 -6
  35. package/.medusa/server/api/middlewares.js +0 -27
  36. package/.medusa/server/api/store/brands/route.d.ts +0 -2
  37. package/.medusa/server/api/store/brands/route.js +0 -53
  38. package/.medusa/server/index.d.ts +0 -1
  39. package/.medusa/server/modules/brand/index.d.ts +0 -35
  40. package/.medusa/server/modules/brand/migrations/Migration20251021070648.d.ts +0 -5
  41. package/.medusa/server/modules/brand/migrations/Migration20251021070648.js +0 -28
  42. package/.medusa/server/modules/brand/models/brand.d.ts +0 -16
  43. package/.medusa/server/modules/brand/models/brand.js +0 -43
  44. package/.medusa/server/modules/brand/service.d.ts +0 -21
  45. package/.medusa/server/services/gcs-direct-upload.d.ts +0 -8
  46. package/.medusa/server/services/gcs-direct-upload.js +0 -55
  47. package/.medusa/server/workflows/upload-brand-image.d.ts +0 -15
  48. package/.medusa/server/workflows/upload-brand-image.js +0 -57
@@ -0,0 +1,178 @@
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_brand_image_1 = require("../../../../../workflows/upload-brand-image");
6
+ const gcs_direct_upload_1 = require("../../../../../services/gcs-direct-upload");
7
+ // GET - Get brand image
8
+ const GET = async (req, res) => {
9
+ const { id } = req.params;
10
+ const brandService = req.scope.resolve("brandCustom");
11
+ try {
12
+ const brand = await brandService.retrieveBrand(id);
13
+ if (!brand) {
14
+ return res.status(404).json({ error: "Brand not found" });
15
+ }
16
+ return res.json({
17
+ image: brand.image || null,
18
+ });
19
+ }
20
+ catch (error) {
21
+ console.error("Error fetching brand image:", error);
22
+ return res.status(500).json({ error: "Failed to fetch brand image" });
23
+ }
24
+ };
25
+ exports.GET = GET;
26
+ // POST - Upload brand image
27
+ const POST = async (req, res) => {
28
+ const { id } = req.params;
29
+ const brandService = req.scope.resolve("brandCustom");
30
+ const logger = req.scope.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
31
+ try {
32
+ const brand = await brandService.retrieveBrand(id);
33
+ if (!brand) {
34
+ return res.status(404).json({ error: "Brand not found" });
35
+ }
36
+ const payload = prepareFilePayload(req);
37
+ if (!payload.success) {
38
+ return res.status(payload.status).json({ error: payload.error });
39
+ }
40
+ const { filename, mimeType, buffer, base64 } = payload.data;
41
+ // Validate file type
42
+ const allowedMimeTypes = [
43
+ "image/jpeg",
44
+ "image/jpg",
45
+ "image/png",
46
+ "image/webp",
47
+ ];
48
+ if (!allowedMimeTypes.includes(mimeType)) {
49
+ return res.status(400).json({
50
+ error: "Invalid file type. Only JPEG, PNG, and WebP images are allowed.",
51
+ });
52
+ }
53
+ // Validate file size (max 10MB)
54
+ if (buffer.length > 10 * 1024 * 1024) {
55
+ return res.status(400).json({
56
+ error: "File size too large. Maximum allowed size is 10MB.",
57
+ });
58
+ }
59
+ const result = await (0, upload_brand_image_1.uploadBrandImageWorkflow)(req.scope).run({
60
+ input: {
61
+ brandId: id,
62
+ imageType: "image",
63
+ fileData: {
64
+ filename,
65
+ mimeType,
66
+ content: base64,
67
+ },
68
+ },
69
+ });
70
+ return res.json({
71
+ brand: {
72
+ id,
73
+ image: result.result.imageUrl,
74
+ },
75
+ });
76
+ }
77
+ catch (error) {
78
+ logger.error("Error uploading brand image:", error);
79
+ return res.status(500).json({ error: "Failed to upload brand image" });
80
+ }
81
+ };
82
+ exports.POST = POST;
83
+ const prepareFilePayload = (req) => {
84
+ if (req.file) {
85
+ return {
86
+ success: true,
87
+ data: {
88
+ filename: req.file.originalname,
89
+ mimeType: req.file.mimetype,
90
+ buffer: req.file.buffer,
91
+ base64: req.file.buffer.toString("base64"),
92
+ },
93
+ };
94
+ }
95
+ const body = req.body;
96
+ if (!body || typeof body !== "object") {
97
+ return {
98
+ success: false,
99
+ status: 400,
100
+ error: "Invalid payload",
101
+ };
102
+ }
103
+ const { filename, mimeType, content } = body;
104
+ if (!filename || !mimeType || !content) {
105
+ return {
106
+ success: false,
107
+ status: 400,
108
+ error: "Missing file data",
109
+ };
110
+ }
111
+ try {
112
+ const buffer = Buffer.from(content, "base64");
113
+ if (!buffer.length) {
114
+ return {
115
+ success: false,
116
+ status: 400,
117
+ error: "Invalid file content",
118
+ };
119
+ }
120
+ return {
121
+ success: true,
122
+ data: {
123
+ filename,
124
+ mimeType,
125
+ buffer,
126
+ base64: content,
127
+ },
128
+ };
129
+ }
130
+ catch (error) {
131
+ return {
132
+ success: false,
133
+ status: 400,
134
+ error: "Failed to decode file",
135
+ };
136
+ }
137
+ };
138
+ // DELETE - Delete brand image
139
+ const DELETE = async (req, res) => {
140
+ const { id } = req.params;
141
+ const brandService = req.scope.resolve("brandCustom");
142
+ const logger = req.scope.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
143
+ const gcsUploadService = new gcs_direct_upload_1.GcsDirectUploadService();
144
+ try {
145
+ const brand = await brandService.retrieveBrand(id);
146
+ if (!brand) {
147
+ return res.status(404).json({ error: "Brand not found" });
148
+ }
149
+ if (!brand.image) {
150
+ return res.status(404).json({ error: "No image found for this brand" });
151
+ }
152
+ // Delete the file from GCS
153
+ if (brand.image.includes("storage.googleapis.com")) {
154
+ try {
155
+ const parts = brand.image.split("/");
156
+ const bucketIndex = parts.indexOf("sangaroon");
157
+ if (bucketIndex !== -1 && bucketIndex < parts.length - 1) {
158
+ const filename = parts.slice(bucketIndex + 1).join("/");
159
+ await gcsUploadService.deleteFile(filename);
160
+ }
161
+ }
162
+ catch (deleteError) {
163
+ logger.error("Error deleting file from GCS:", deleteError);
164
+ // Continue even if file deletion fails
165
+ }
166
+ }
167
+ await brandService.updateBrands([{ id: brand.id, image: null }]);
168
+ return res.json({
169
+ message: "Brand image deleted successfully",
170
+ });
171
+ }
172
+ catch (error) {
173
+ logger.error("Error deleting brand image:", error);
174
+ return res.status(500).json({ error: "Failed to delete brand image" });
175
+ }
176
+ };
177
+ exports.DELETE = DELETE;
178
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2JyYW5kcy9baWRdL2ltYWdlL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHFEQUFzRTtBQUN0RSxvRkFBdUY7QUFDdkYsaUZBQW1GO0FBR25GLHdCQUF3QjtBQUNqQixNQUFNLEdBQUcsR0FBRyxLQUFLLEVBQUUsR0FBMEIsRUFBRSxHQUFtQixFQUFFLEVBQUU7SUFDM0UsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUM7SUFDMUIsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFRLENBQUM7SUFFN0QsSUFBSSxDQUFDO1FBQ0gsTUFBTSxLQUFLLEdBQUcsTUFBTSxZQUFZLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRW5ELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO1FBQzVELENBQUM7UUFFRCxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFDZCxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssSUFBSSxJQUFJO1NBQzNCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNwRCxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLDZCQUE2QixFQUFFLENBQUMsQ0FBQztJQUN4RSxDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBbEJXLFFBQUEsR0FBRyxPQWtC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
@@ -0,0 +1,179 @@
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_brand_image_1 = require("../../../../../workflows/upload-brand-image");
6
+ const gcs_direct_upload_1 = require("../../../../../services/gcs-direct-upload");
7
+ // GET - Get brand logo
8
+ const GET = async (req, res) => {
9
+ const { id } = req.params;
10
+ const brandService = req.scope.resolve("brandCustom");
11
+ try {
12
+ const brand = await brandService.retrieveBrand(id);
13
+ if (!brand) {
14
+ return res.status(404).json({ error: "Brand not found" });
15
+ }
16
+ return res.json({
17
+ logo: brand.logo || null,
18
+ });
19
+ }
20
+ catch (error) {
21
+ console.error("Error fetching brand logo:", error);
22
+ return res.status(500).json({ error: "Failed to fetch brand logo" });
23
+ }
24
+ };
25
+ exports.GET = GET;
26
+ // POST - Upload brand logo
27
+ const POST = async (req, res) => {
28
+ const { id } = req.params;
29
+ const brandService = req.scope.resolve("brandCustom");
30
+ const logger = req.scope.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
31
+ try {
32
+ const brand = await brandService.retrieveBrand(id);
33
+ if (!brand) {
34
+ return res.status(404).json({ error: "Brand not found" });
35
+ }
36
+ const payload = prepareFilePayload(req);
37
+ if (!payload.success) {
38
+ return res.status(payload.status).json({ error: payload.error });
39
+ }
40
+ const { filename, mimeType, buffer, base64 } = payload.data;
41
+ // Validate file type
42
+ const allowedMimeTypes = [
43
+ "image/jpeg",
44
+ "image/jpg",
45
+ "image/png",
46
+ "image/webp",
47
+ "image/svg+xml",
48
+ ];
49
+ if (!allowedMimeTypes.includes(mimeType)) {
50
+ return res.status(400).json({
51
+ error: "Invalid file type. Only JPEG, PNG, WebP, and SVG images are allowed.",
52
+ });
53
+ }
54
+ // Validate file size (max 5MB for logos)
55
+ if (buffer.length > 5 * 1024 * 1024) {
56
+ return res.status(400).json({
57
+ error: "File size too large. Maximum allowed size is 5MB.",
58
+ });
59
+ }
60
+ const result = await (0, upload_brand_image_1.uploadBrandImageWorkflow)(req.scope).run({
61
+ input: {
62
+ brandId: id,
63
+ imageType: "logo",
64
+ fileData: {
65
+ filename,
66
+ mimeType,
67
+ content: base64,
68
+ },
69
+ },
70
+ });
71
+ return res.json({
72
+ brand: {
73
+ id,
74
+ logo: result.result.imageUrl,
75
+ },
76
+ });
77
+ }
78
+ catch (error) {
79
+ logger.error("Error uploading brand logo:", error);
80
+ return res.status(500).json({ error: "Failed to upload brand logo" });
81
+ }
82
+ };
83
+ exports.POST = POST;
84
+ const prepareFilePayload = (req) => {
85
+ if (req.file) {
86
+ return {
87
+ success: true,
88
+ data: {
89
+ filename: req.file.originalname,
90
+ mimeType: req.file.mimetype,
91
+ buffer: req.file.buffer,
92
+ base64: req.file.buffer.toString("base64"),
93
+ },
94
+ };
95
+ }
96
+ const body = req.body;
97
+ if (!body || typeof body !== "object") {
98
+ return {
99
+ success: false,
100
+ status: 400,
101
+ error: "Invalid payload",
102
+ };
103
+ }
104
+ const { filename, mimeType, content } = body;
105
+ if (!filename || !mimeType || !content) {
106
+ return {
107
+ success: false,
108
+ status: 400,
109
+ error: "Missing file data",
110
+ };
111
+ }
112
+ try {
113
+ const buffer = Buffer.from(content, "base64");
114
+ if (!buffer.length) {
115
+ return {
116
+ success: false,
117
+ status: 400,
118
+ error: "Invalid file content",
119
+ };
120
+ }
121
+ return {
122
+ success: true,
123
+ data: {
124
+ filename,
125
+ mimeType,
126
+ buffer,
127
+ base64: content,
128
+ },
129
+ };
130
+ }
131
+ catch (error) {
132
+ return {
133
+ success: false,
134
+ status: 400,
135
+ error: "Failed to decode file",
136
+ };
137
+ }
138
+ };
139
+ // DELETE - Delete brand logo
140
+ const DELETE = async (req, res) => {
141
+ const { id } = req.params;
142
+ const brandService = req.scope.resolve("brandCustom");
143
+ const logger = req.scope.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
144
+ const gcsUploadService = new gcs_direct_upload_1.GcsDirectUploadService();
145
+ try {
146
+ const brand = await brandService.retrieveBrand(id);
147
+ if (!brand) {
148
+ return res.status(404).json({ error: "Brand not found" });
149
+ }
150
+ if (!brand.logo) {
151
+ return res.status(404).json({ error: "No logo found for this brand" });
152
+ }
153
+ // Delete the file from GCS
154
+ if (brand.logo.includes("storage.googleapis.com")) {
155
+ try {
156
+ const parts = brand.logo.split("/");
157
+ const bucketIndex = parts.indexOf("sangaroon");
158
+ if (bucketIndex !== -1 && bucketIndex < parts.length - 1) {
159
+ const filename = parts.slice(bucketIndex + 1).join("/");
160
+ await gcsUploadService.deleteFile(filename);
161
+ }
162
+ }
163
+ catch (deleteError) {
164
+ logger.error("Error deleting file from GCS:", deleteError);
165
+ // Continue even if file deletion fails
166
+ }
167
+ }
168
+ await brandService.updateBrands([{ id: brand.id, logo: null }]);
169
+ return res.json({
170
+ message: "Brand logo deleted successfully",
171
+ });
172
+ }
173
+ catch (error) {
174
+ logger.error("Error deleting brand logo:", error);
175
+ return res.status(500).json({ error: "Failed to delete brand logo" });
176
+ }
177
+ };
178
+ exports.DELETE = DELETE;
179
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2JyYW5kcy9baWRdL2xvZ28vcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EscURBQXNFO0FBQ3RFLG9GQUF1RjtBQUN2RixpRkFBbUY7QUFHbkYsdUJBQXVCO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLEtBQUssRUFBRSxHQUEwQixFQUFFLEdBQW1CLEVBQUUsRUFBRTtJQUMzRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztJQUMxQixNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQVEsQ0FBQztJQUU3RCxJQUFJLENBQUM7UUFDSCxNQUFNLEtBQUssR0FBRyxNQUFNLFlBQVksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFbkQsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxDQUFDLENBQUM7UUFDNUQsQ0FBQztRQUVELE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQztZQUNkLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxJQUFJLElBQUk7U0FDekIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLDRCQUE0QixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ25ELE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsNEJBQTRCLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7QUFDSCxDQUFDLENBQUM7QUFsQlcsUUFBQSxHQUFHLE9Ba0Jk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
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GET = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ // GET - Get all products for a brand
6
+ const GET = async (req, res) => {
7
+ const { id } = req.params;
8
+ const brandService = req.scope.resolve("brandCustom");
9
+ const productModuleService = req.scope.resolve(utils_1.Modules.PRODUCT);
10
+ const logger = req.scope.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
11
+ try {
12
+ const parsedLimit = Number(req.query.limit);
13
+ const parsedOffset = Number(req.query.offset);
14
+ const limit = Math.min(Math.max(Number.isFinite(parsedLimit) ? parsedLimit : 20, 1), 100);
15
+ const offset = Math.max(Number.isFinite(parsedOffset) ? parsedOffset : 0, 0);
16
+ // Verify brand exists
17
+ const brand = await brandService.retrieveBrand(id);
18
+ if (!brand) {
19
+ return res.status(404).json({ error: "Brand not found" });
20
+ }
21
+ // Get all product-brand associations for this brand
22
+ const productBrands = await brandService.listProductBrands({
23
+ brand_id: id,
24
+ });
25
+ const total = productBrands.length;
26
+ if (total === 0) {
27
+ return res.json({
28
+ products: [],
29
+ count: 0,
30
+ offset,
31
+ limit,
32
+ });
33
+ }
34
+ const paginatedAssociations = productBrands.slice(offset, offset + limit);
35
+ // Get product IDs
36
+ const productIds = paginatedAssociations.map((pb) => pb.product_id);
37
+ // Fetch products from product module
38
+ const products = await productModuleService.listProducts({
39
+ id: productIds,
40
+ });
41
+ const count = total;
42
+ return res.json({
43
+ products,
44
+ count,
45
+ offset,
46
+ limit,
47
+ });
48
+ }
49
+ catch (error) {
50
+ logger.error(`Error getting products for brand ${id}:`, error);
51
+ return res.status(500).json({ error: "Failed to get brand products" });
52
+ }
53
+ };
54
+ exports.GET = GET;
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2JyYW5kcy9baWRdL3Byb2R1Y3RzL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHFEQUErRTtBQUcvRSxxQ0FBcUM7QUFDOUIsTUFBTSxHQUFHLEdBQUcsS0FBSyxFQUFFLEdBQWtCLEVBQUUsR0FBbUIsRUFBRSxFQUFFO0lBQ25FLE1BQU0sRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDO0lBQzFCLE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBUSxDQUFDO0lBQzdELE1BQU0sb0JBQW9CLEdBQTBCLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUNuRSxlQUFPLENBQUMsT0FBTyxDQUNoQixDQUFDO0lBQ0YsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFbkUsSUFBSSxDQUFDO1FBQ0gsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUMsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FDcEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFDNUQsR0FBRyxDQUNKLENBQUM7UUFDRixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUNyQixNQUFNLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDaEQsQ0FBQyxDQUNGLENBQUM7UUFFRixzQkFBc0I7UUFDdEIsTUFBTSxLQUFLLEdBQUcsTUFBTSxZQUFZLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRW5ELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO1FBQzVELENBQUM7UUFFRCxvREFBb0Q7UUFDcEQsTUFBTSxhQUFhLEdBQUcsTUFBTSxZQUFZLENBQUMsaUJBQWlCLENBQUM7WUFDekQsUUFBUSxFQUFFLEVBQUU7U0FDYixDQUFDLENBQUM7UUFFSCxNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDO1FBQ25DLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2hCLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQztnQkFDZCxRQUFRLEVBQUUsRUFBRTtnQkFDWixLQUFLLEVBQUUsQ0FBQztnQkFDUixNQUFNO2dCQUNOLEtBQUs7YUFDTixDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsTUFBTSxxQkFBcUIsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUM7UUFFMUUsa0JBQWtCO1FBQ2xCLE1BQU0sVUFBVSxHQUFHLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRXBFLHFDQUFxQztRQUNyQyxNQUFNLFFBQVEsR0FBRyxNQUFNLG9CQUFvQixDQUFDLFlBQVksQ0FBQztZQUN2RCxFQUFFLEVBQUUsVUFBVTtTQUNmLENBQUMsQ0FBQztRQUVILE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQztRQUVwQixPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFDZCxRQUFRO1lBQ1IsS0FBSztZQUNMLE1BQU07WUFDTixLQUFLO1NBQ04sQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixNQUFNLENBQUMsS0FBSyxDQUFDLG9DQUFvQyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMvRCxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLDhCQUE4QixFQUFFLENBQUMsQ0FBQztJQUN6RSxDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBaEVXLFFBQUEsR0FBRyxPQWdFZCJ9