@pixzle/node 0.1.7 → 0.1.8
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/dist/fragmenter.d.ts +4 -7
- package/dist/fragmenter.js +21 -47
- package/dist/fragmenter.js.map +1 -1
- package/dist/{block.d.ts → image-buffer.d.ts} +13 -2
- package/dist/{block.js → image-buffer.js} +26 -27
- package/dist/image-buffer.js.map +1 -0
- package/dist/image-codec.d.ts +10 -0
- package/dist/image-codec.js +46 -0
- package/dist/image-codec.js.map +1 -0
- package/dist/index.js +3 -12
- package/dist/index.js.map +1 -1
- package/dist/restorer.d.ts +1 -5
- package/dist/restorer.js +8 -39
- package/dist/restorer.js.map +1 -1
- package/package.json +6 -3
- package/dist/block.js.map +0 -1
package/dist/fragmenter.d.ts
CHANGED
|
@@ -2,12 +2,9 @@ import { type FragmentationConfig, type FragmentationResult } from "@pixzle/core
|
|
|
2
2
|
export declare class ImageFragmenter {
|
|
3
3
|
private config;
|
|
4
4
|
constructor(config: FragmentationConfig);
|
|
5
|
-
private
|
|
5
|
+
private initializeConfig;
|
|
6
6
|
fragmentImages(paths: string[]): Promise<FragmentationResult>;
|
|
7
|
-
private
|
|
8
|
-
private
|
|
9
|
-
private
|
|
10
|
-
private _processImages;
|
|
11
|
-
private _processImage;
|
|
12
|
-
private _createImage;
|
|
7
|
+
private createManifest;
|
|
8
|
+
private loadSourceImage;
|
|
9
|
+
private createImageInfo;
|
|
13
10
|
}
|
package/dist/fragmenter.js
CHANGED
|
@@ -3,16 +3,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.ImageFragmenter = void 0;
|
|
4
4
|
const core_1 = require("@pixzle/core");
|
|
5
5
|
const seeded_shuffle_1 = require("@tuki0918/seeded-shuffle");
|
|
6
|
-
const block_1 = require("./block");
|
|
7
6
|
const constants_1 = require("./constants");
|
|
8
7
|
const file_1 = require("./file");
|
|
8
|
+
const image_buffer_1 = require("./image-buffer");
|
|
9
9
|
const utils_1 = require("./utils");
|
|
10
10
|
class ImageFragmenter {
|
|
11
11
|
config;
|
|
12
12
|
constructor(config) {
|
|
13
|
-
this.config = this.
|
|
13
|
+
this.config = this.initializeConfig(config);
|
|
14
14
|
}
|
|
15
|
-
|
|
15
|
+
initializeConfig(config) {
|
|
16
16
|
return {
|
|
17
17
|
blockSize: config.blockSize ?? core_1.DEFAULT_FRAGMENTATION_CONFIG.BLOCK_SIZE,
|
|
18
18
|
prefix: config.prefix ?? core_1.DEFAULT_FRAGMENTATION_CONFIG.PREFIX,
|
|
@@ -23,27 +23,18 @@ class ImageFragmenter {
|
|
|
23
23
|
};
|
|
24
24
|
}
|
|
25
25
|
async fragmentImages(paths) {
|
|
26
|
-
const
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
: blockCountsPerImage;
|
|
33
|
-
const fragmentedImages = await this._createImages(shuffled, blockCounts, manifest);
|
|
26
|
+
const manifestId = (0, utils_1.generateManifestId)();
|
|
27
|
+
const sources = await Promise.all(paths.map((path) => this.loadSourceImage(path)));
|
|
28
|
+
const imageInfos = paths.map((path, index) => this.createImageInfo(path, sources[index].width, sources[index].height));
|
|
29
|
+
(0, core_1.validateFileNames)(imageInfos, this.config.preserveName);
|
|
30
|
+
const fragmentedBuffers = (0, core_1.fragmentImageBuffers)(sources, this.config);
|
|
31
|
+
const fragmentedImages = await Promise.all(fragmentedBuffers.map((fragment) => (0, image_buffer_1.createPngFromImageBuffer)(Buffer.from(fragment.buffer), fragment.width, fragment.height)));
|
|
34
32
|
return {
|
|
35
|
-
manifest,
|
|
33
|
+
manifest: this.createManifest(manifestId, imageInfos),
|
|
36
34
|
fragmentedImages,
|
|
37
35
|
};
|
|
38
36
|
}
|
|
39
|
-
|
|
40
|
-
return await Promise.all(manifest.images.map(async (_, index) => {
|
|
41
|
-
const { start, end } = (0, core_1.calculateBlockRange)(blockCounts, index);
|
|
42
|
-
const imageBlocks = blocks.slice(start, end);
|
|
43
|
-
return await this._createImage(imageBlocks, manifest.config.blockSize);
|
|
44
|
-
}));
|
|
45
|
-
}
|
|
46
|
-
_createManifest(manifestId, imageInfos) {
|
|
37
|
+
createManifest(manifestId, imageInfos) {
|
|
47
38
|
return {
|
|
48
39
|
id: manifestId,
|
|
49
40
|
version: constants_1.VERSION,
|
|
@@ -52,40 +43,23 @@ class ImageFragmenter {
|
|
|
52
43
|
images: imageInfos,
|
|
53
44
|
};
|
|
54
45
|
}
|
|
55
|
-
async
|
|
56
|
-
const manifestId = (0, utils_1.generateManifestId)();
|
|
57
|
-
const { imageInfos, blocks } = await this._processImages(paths);
|
|
58
|
-
(0, core_1.validateFileNames)(imageInfos, this.config.preserveName);
|
|
59
|
-
const manifest = this._createManifest(manifestId, imageInfos);
|
|
60
|
-
const blockCountsForCrossImages = (0, core_1.calculateBlockCountsForCrossImages)(blocks.length, paths.length);
|
|
61
|
-
// Calculate actual block counts per image for per-image shuffle
|
|
62
|
-
const blockCountsPerImage = (0, core_1.calculateBlockCountsPerImage)(imageInfos, this.config.blockSize);
|
|
63
|
-
return { manifest, blocks, blockCountsForCrossImages, blockCountsPerImage };
|
|
64
|
-
}
|
|
65
|
-
async _processImages(paths) {
|
|
66
|
-
const results = await Promise.all(paths.map((path) => this._processImage(path)));
|
|
67
|
-
const imageInfos = results.map((r) => r.imageInfo);
|
|
68
|
-
const blocks = results.flatMap((r) => r.blocks);
|
|
69
|
-
return { imageInfos, blocks };
|
|
70
|
-
}
|
|
71
|
-
async _processImage(path) {
|
|
46
|
+
async loadSourceImage(path) {
|
|
72
47
|
const buffer = await (0, file_1.loadBuffer)(path);
|
|
73
|
-
const {
|
|
74
|
-
|
|
48
|
+
const { imageBuffer, width, height } = await (0, image_buffer_1.loadImageBuffer)(buffer);
|
|
49
|
+
return {
|
|
50
|
+
buffer: imageBuffer,
|
|
51
|
+
width,
|
|
52
|
+
height,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
createImageInfo(path, width, height) {
|
|
56
|
+
return {
|
|
75
57
|
w: width,
|
|
76
58
|
h: height,
|
|
77
59
|
name: this.config.preserveName
|
|
78
60
|
? (0, core_1.encodeFileName)((0, file_1.fileNameWithoutExtension)(path))
|
|
79
61
|
: undefined,
|
|
80
62
|
};
|
|
81
|
-
return { imageInfo, blocks };
|
|
82
|
-
}
|
|
83
|
-
async _createImage(blocks, blockSize) {
|
|
84
|
-
const blockCount = blocks.length;
|
|
85
|
-
const blocksPerRow = Math.ceil(Math.sqrt(blockCount));
|
|
86
|
-
const imageWidth = blocksPerRow * blockSize;
|
|
87
|
-
const imageHeight = Math.ceil(blockCount / blocksPerRow) * blockSize;
|
|
88
|
-
return await (0, block_1.blocksToPngImage)(blocks, imageWidth, imageHeight, blockSize);
|
|
89
63
|
}
|
|
90
64
|
}
|
|
91
65
|
exports.ImageFragmenter = ImageFragmenter;
|
package/dist/fragmenter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fragmenter.js","sourceRoot":"","sources":["../src/fragmenter.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"fragmenter.js","sourceRoot":"","sources":["../src/fragmenter.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,11 @@ interface ImageToBlocksResult {
|
|
|
6
6
|
blockCountX: number;
|
|
7
7
|
blockCountY: number;
|
|
8
8
|
}
|
|
9
|
+
interface ImageBufferResult {
|
|
10
|
+
imageBuffer: Buffer;
|
|
11
|
+
width: number;
|
|
12
|
+
height: number;
|
|
13
|
+
}
|
|
9
14
|
/**
|
|
10
15
|
* Split an RGBA image buffer into an array of blocks (Node.js Buffer wrapper)
|
|
11
16
|
* @param buffer Source image buffer (RGBA format)
|
|
@@ -31,6 +36,12 @@ export declare function blocksToImageBuffer(blocks: Buffer[], width: number, hei
|
|
|
31
36
|
* @returns Promise resolving to block data and image metadata
|
|
32
37
|
*/
|
|
33
38
|
export declare function imageToBlocks(input: string | Buffer, blockSize: number): Promise<ImageToBlocksResult>;
|
|
39
|
+
/**
|
|
40
|
+
* Load an image and return its raw RGBA buffer and dimensions
|
|
41
|
+
* @param input Path to the image file or Buffer containing image data
|
|
42
|
+
* @returns Promise resolving to image buffer and dimensions
|
|
43
|
+
*/
|
|
44
|
+
export declare function loadImageBuffer(input: string | Buffer): Promise<ImageBufferResult>;
|
|
34
45
|
/**
|
|
35
46
|
* Reconstruct a PNG image from blocks
|
|
36
47
|
* @param blocks Array of block buffers
|
|
@@ -41,7 +52,7 @@ export declare function imageToBlocks(input: string | Buffer, blockSize: number)
|
|
|
41
52
|
*/
|
|
42
53
|
export declare function blocksToPngImage(blocks: Buffer[], width: number, height: number, blockSize: number): Promise<Buffer>;
|
|
43
54
|
/**
|
|
44
|
-
* Extract raw RGBA image buffer from a PNG buffer
|
|
55
|
+
* Extract raw RGBA image buffer from a PNG buffer
|
|
45
56
|
* @param pngBuffer PNG image buffer
|
|
46
57
|
* @returns Promise resolving to image buffer and image dimensions
|
|
47
58
|
*/
|
|
@@ -51,7 +62,7 @@ export declare function extractImageBufferFromPng(pngBuffer: Buffer): Promise<{
|
|
|
51
62
|
height: number;
|
|
52
63
|
}>;
|
|
53
64
|
/**
|
|
54
|
-
* Create a PNG buffer from raw RGBA image buffer
|
|
65
|
+
* Create a PNG buffer from raw RGBA image buffer
|
|
55
66
|
* @param imageBuffer Raw RGBA image buffer
|
|
56
67
|
* @param width Image width in pixels
|
|
57
68
|
* @param height Image height in pixels
|
|
@@ -3,12 +3,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.splitImageToBlocks = splitImageToBlocks;
|
|
4
4
|
exports.blocksToImageBuffer = blocksToImageBuffer;
|
|
5
5
|
exports.imageToBlocks = imageToBlocks;
|
|
6
|
+
exports.loadImageBuffer = loadImageBuffer;
|
|
6
7
|
exports.blocksToPngImage = blocksToPngImage;
|
|
7
8
|
exports.extractImageBufferFromPng = extractImageBufferFromPng;
|
|
8
9
|
exports.createPngFromImageBuffer = createPngFromImageBuffer;
|
|
9
10
|
exports.blocksPerImage = blocksPerImage;
|
|
10
11
|
const core_1 = require("@pixzle/core");
|
|
11
|
-
const
|
|
12
|
+
const image_codec_1 = require("./image-codec");
|
|
12
13
|
/**
|
|
13
14
|
* Format error message consistently
|
|
14
15
|
* @param operation Description of the operation that failed
|
|
@@ -19,20 +20,6 @@ function formatErrorMessage(operation, error) {
|
|
|
19
20
|
const errorMessage = error instanceof Error ? error.message : "Unknown error";
|
|
20
21
|
return `${operation}: ${errorMessage}`;
|
|
21
22
|
}
|
|
22
|
-
/**
|
|
23
|
-
* Create a Jimp image from raw RGBA image buffer
|
|
24
|
-
* @param imageBuffer Raw RGBA image buffer
|
|
25
|
-
* @param width Image width in pixels
|
|
26
|
-
* @param height Image height in pixels
|
|
27
|
-
* @returns Jimp image instance
|
|
28
|
-
*/
|
|
29
|
-
function createJimpFromImageBuffer(imageBuffer, width, height) {
|
|
30
|
-
return new jimp_1.Jimp({
|
|
31
|
-
data: imageBuffer,
|
|
32
|
-
width,
|
|
33
|
-
height,
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
23
|
/**
|
|
37
24
|
* Split an RGBA image buffer into an array of blocks (Node.js Buffer wrapper)
|
|
38
25
|
* @param buffer Source image buffer (RGBA format)
|
|
@@ -66,11 +53,10 @@ function blocksToImageBuffer(blocks, width, height, blockSize) {
|
|
|
66
53
|
*/
|
|
67
54
|
async function imageToBlocks(input, blockSize) {
|
|
68
55
|
try {
|
|
69
|
-
|
|
70
|
-
const
|
|
71
|
-
const { width, height } = image.bitmap;
|
|
56
|
+
const image = await (0, image_codec_1.decodeImage)(input);
|
|
57
|
+
const { width, height } = image;
|
|
72
58
|
const channels = core_1.RGBA_CHANNELS;
|
|
73
|
-
const imageBuffer = image.
|
|
59
|
+
const imageBuffer = image.imageBuffer;
|
|
74
60
|
// Split image into blocks
|
|
75
61
|
const blocks = splitImageToBlocks(imageBuffer, width, height, blockSize);
|
|
76
62
|
const blockCounts = (0, core_1.calculateBlockCounts)(width, height, blockSize);
|
|
@@ -87,6 +73,21 @@ async function imageToBlocks(input, blockSize) {
|
|
|
87
73
|
throw new Error(`${formatErrorMessage("Failed to process image file", error)}. The manifest file may not match the image data.`);
|
|
88
74
|
}
|
|
89
75
|
}
|
|
76
|
+
/**
|
|
77
|
+
* Load an image and return its raw RGBA buffer and dimensions
|
|
78
|
+
* @param input Path to the image file or Buffer containing image data
|
|
79
|
+
* @returns Promise resolving to image buffer and dimensions
|
|
80
|
+
*/
|
|
81
|
+
async function loadImageBuffer(input) {
|
|
82
|
+
try {
|
|
83
|
+
const image = await (0, image_codec_1.decodeImage)(input);
|
|
84
|
+
const { width, height, imageBuffer } = image;
|
|
85
|
+
return { imageBuffer, width, height };
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
throw new Error(formatErrorMessage("Failed to load image buffer", error));
|
|
89
|
+
}
|
|
90
|
+
}
|
|
90
91
|
/**
|
|
91
92
|
* Reconstruct a PNG image from blocks
|
|
92
93
|
* @param blocks Array of block buffers
|
|
@@ -105,15 +106,14 @@ async function blocksToPngImage(blocks, width, height, blockSize) {
|
|
|
105
106
|
}
|
|
106
107
|
}
|
|
107
108
|
/**
|
|
108
|
-
* Extract raw RGBA image buffer from a PNG buffer
|
|
109
|
+
* Extract raw RGBA image buffer from a PNG buffer
|
|
109
110
|
* @param pngBuffer PNG image buffer
|
|
110
111
|
* @returns Promise resolving to image buffer and image dimensions
|
|
111
112
|
*/
|
|
112
113
|
async function extractImageBufferFromPng(pngBuffer) {
|
|
113
114
|
try {
|
|
114
|
-
const image = await
|
|
115
|
-
const { width, height } = image
|
|
116
|
-
const imageBuffer = Buffer.from(image.bitmap.data);
|
|
115
|
+
const image = await (0, image_codec_1.decodeImage)(pngBuffer);
|
|
116
|
+
const { width, height, imageBuffer } = image;
|
|
117
117
|
return { imageBuffer, width, height };
|
|
118
118
|
}
|
|
119
119
|
catch (error) {
|
|
@@ -121,7 +121,7 @@ async function extractImageBufferFromPng(pngBuffer) {
|
|
|
121
121
|
}
|
|
122
122
|
}
|
|
123
123
|
/**
|
|
124
|
-
* Create a PNG buffer from raw RGBA image buffer
|
|
124
|
+
* Create a PNG buffer from raw RGBA image buffer
|
|
125
125
|
* @param imageBuffer Raw RGBA image buffer
|
|
126
126
|
* @param width Image width in pixels
|
|
127
127
|
* @param height Image height in pixels
|
|
@@ -129,8 +129,7 @@ async function extractImageBufferFromPng(pngBuffer) {
|
|
|
129
129
|
*/
|
|
130
130
|
async function createPngFromImageBuffer(imageBuffer, width, height) {
|
|
131
131
|
try {
|
|
132
|
-
|
|
133
|
-
return await image.getBuffer(jimp_1.JimpMime.png);
|
|
132
|
+
return await (0, image_codec_1.encodePng)(imageBuffer, width, height);
|
|
134
133
|
}
|
|
135
134
|
catch (error) {
|
|
136
135
|
throw new Error(formatErrorMessage("Failed to create PNG from image buffer", error));
|
|
@@ -166,4 +165,4 @@ function blocksPerImage(allBlocks, fragmentBlocksCount, seed, processFunc) {
|
|
|
166
165
|
}
|
|
167
166
|
return processedBlocks.slice(0, globalOffset);
|
|
168
167
|
}
|
|
169
|
-
//# sourceMappingURL=
|
|
168
|
+
//# sourceMappingURL=image-buffer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-buffer.js","sourceRoot":"","sources":["../src/image-buffer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
interface DecodedImageResult {
|
|
2
|
+
imageBuffer: Buffer;
|
|
3
|
+
width: number;
|
|
4
|
+
height: number;
|
|
5
|
+
format?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function decodeImage(input: string | Buffer): Promise<DecodedImageResult>;
|
|
8
|
+
export declare function encodePng(imageBuffer: Buffer, width: number, height: number): Promise<Buffer>;
|
|
9
|
+
export declare function writePngFile(outputPath: string, imageBuffer: Buffer, width: number, height: number): Promise<void>;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,46 @@
|
|
|
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.decodeImage = decodeImage;
|
|
7
|
+
exports.encodePng = encodePng;
|
|
8
|
+
exports.writePngFile = writePngFile;
|
|
9
|
+
const core_1 = require("@pixzle/core");
|
|
10
|
+
const sharp_1 = __importDefault(require("sharp"));
|
|
11
|
+
function createRawImagePipeline(imageBuffer, width, height) {
|
|
12
|
+
return (0, sharp_1.default)(imageBuffer, {
|
|
13
|
+
raw: {
|
|
14
|
+
width,
|
|
15
|
+
height,
|
|
16
|
+
channels: core_1.RGBA_CHANNELS,
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
async function decodeImage(input) {
|
|
21
|
+
const image = (0, sharp_1.default)(input).ensureAlpha();
|
|
22
|
+
const metadata = await image.metadata();
|
|
23
|
+
const { data, info } = await image
|
|
24
|
+
.raw()
|
|
25
|
+
.toBuffer({ resolveWithObject: true });
|
|
26
|
+
if (!info.width || !info.height) {
|
|
27
|
+
throw new Error("Decoded image is missing dimensions");
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
imageBuffer: Buffer.from(data),
|
|
31
|
+
width: info.width,
|
|
32
|
+
height: info.height,
|
|
33
|
+
format: metadata.format ?? info.format,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
async function encodePng(imageBuffer, width, height) {
|
|
37
|
+
return await createRawImagePipeline(imageBuffer, width, height)
|
|
38
|
+
.png()
|
|
39
|
+
.toBuffer();
|
|
40
|
+
}
|
|
41
|
+
async function writePngFile(outputPath, imageBuffer, width, height) {
|
|
42
|
+
await createRawImagePipeline(imageBuffer, width, height)
|
|
43
|
+
.png()
|
|
44
|
+
.toFile(outputPath);
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=image-codec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-codec.js","sourceRoot":"","sources":["../src/image-codec.ts"],"names":[],"mappings":";;;;;AAwBA,kCAmBC;AAED,8BAQC;AAED,oCASC;AAhED,uCAA6C;AAC7C,kDAA0B;AAS1B,SAAS,sBAAsB,CAC7B,WAAmB,EACnB,KAAa,EACb,MAAc;IAEd,OAAO,IAAA,eAAK,EAAC,WAAW,EAAE;QACxB,GAAG,EAAE;YACH,KAAK;YACL,MAAM;YACN,QAAQ,EAAE,oBAAa;SACxB;KACF,CAAC,CAAC;AACL,CAAC;AAEM,KAAK,UAAU,WAAW,CAC/B,KAAsB;IAEtB,MAAM,KAAK,GAAG,IAAA,eAAK,EAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IACzC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC;IACxC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM,KAAK;SAC/B,GAAG,EAAE;SACL,QAAQ,CAAC,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC;IAEzC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IAED,OAAO;QACL,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;QAC9B,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM;KACvC,CAAC;AACJ,CAAC;AAEM,KAAK,UAAU,SAAS,CAC7B,WAAmB,EACnB,KAAa,EACb,MAAc;IAEd,OAAO,MAAM,sBAAsB,CAAC,WAAW,EAAE,KAAK,EAAE,MAAM,CAAC;SAC5D,GAAG,EAAE;SACL,QAAQ,EAAE,CAAC;AAChB,CAAC;AAEM,KAAK,UAAU,YAAY,CAChC,UAAkB,EAClB,WAAmB,EACnB,KAAa,EACb,MAAc;IAEd,MAAM,sBAAsB,CAAC,WAAW,EAAE,KAAK,EAAE,MAAM,CAAC;SACrD,GAAG,EAAE;SACL,MAAM,CAAC,UAAU,CAAC,CAAC;AACxB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -49,24 +49,15 @@ const pixzle = {
|
|
|
49
49
|
};
|
|
50
50
|
exports.default = pixzle;
|
|
51
51
|
function validateCommonOptions(options, context) {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
const { images, outputDir } = options;
|
|
55
|
-
if (!images || !Array.isArray(images) || images.length === 0)
|
|
56
|
-
throw new Error(`[${context}] images must be a non-empty array.`);
|
|
57
|
-
if (!outputDir || typeof outputDir !== "string")
|
|
58
|
-
throw new Error(`[${context}] outputDir is required and must be a string.`);
|
|
52
|
+
(0, core_1.validateOptionsWithImages)(options, context);
|
|
53
|
+
(0, core_1.validateOutputDirectoryOption)(options, context);
|
|
59
54
|
return options;
|
|
60
55
|
}
|
|
61
56
|
function validateShuffleOptions(options) {
|
|
62
57
|
return validateCommonOptions(options, "shuffle");
|
|
63
58
|
}
|
|
64
59
|
function validateRestoreOptions(options) {
|
|
65
|
-
|
|
66
|
-
if (!manifest && !manifestData)
|
|
67
|
-
throw new Error("[restore] Either manifest or manifestData is required.");
|
|
68
|
-
if (manifest && typeof manifest !== "string")
|
|
69
|
-
throw new Error("[restore] manifest must be a string.");
|
|
60
|
+
(0, core_1.validateManifestOptions)(options, "restore");
|
|
70
61
|
return validateCommonOptions(options, "restore");
|
|
71
62
|
}
|
|
72
63
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,uCAasB;AACtB,iCAA+D;AAO7D,sFAPkB,YAAK,OAOlB;AANP,6CAA+C;AAI7C,gGAJO,4BAAe,OAIP;AAHjB,yCAA2C;AAIzC,8FAJO,wBAAa,OAIP;AAMf,KAAK,UAAU,OAAO,CAAC,OAAuB;IAC5C,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAEtE,MAAM,UAAU,GAAG,IAAI,4BAAe,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;IACrD,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,GAClC,MAAM,UAAU,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAE1C,MAAM,IAAA,gBAAS,EAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACjC,MAAM,IAAA,gBAAS,EACb,SAAS,EACT,yBAAkB,EAClB,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAClC,CAAC;IAEF,MAAM,OAAO,CAAC,GAAG,CACf,gBAAgB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;QAC9B,MAAM,QAAQ,GAAG,IAAA,+BAAwB,EAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QACvD,OAAO,IAAA,gBAAS,EAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC7C,CAAC,CAAC,CACH,CAAC;IAEF,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,OAAuB;IAC5C,MAAM,EACJ,MAAM,EACN,QAAQ,EAAE,cAAc,EACxB,YAAY,EACZ,SAAS,GACV,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAEpC,IAAI,QAAsB,CAAC;IAC3B,IAAI,YAAY,EAAE,CAAC;QACjB,QAAQ,GAAG,YAAY,CAAC;IAC1B,CAAC;SAAM,IAAI,cAAc,EAAE,CAAC;QAC1B,QAAQ,GAAG,MAAM,IAAA,eAAQ,EAAe,cAAc,CAAC,CAAC;IAC1D,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IAED,IAAA,iCAA0B,EAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAE7C,MAAM,QAAQ,GAAG,IAAI,wBAAa,EAAE,CAAC;IACrC,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAEtE,MAAM,IAAA,gBAAS,EAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAEjC,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC;IACnC,MAAM,OAAO,CAAC,GAAG,CACf,cAAc,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;QAC5B,MAAM,QAAQ,GACZ,IAAA,uCAAgC,EAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAC/C,IAAA,+BAAwB,EAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QACxC,OAAO,IAAA,gBAAS,EAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC7C,CAAC,CAAC,CACH,CAAC;AACJ,CAAC;AAED,MAAM,MAAM,GAAG;IACb,OAAO;IACP,OAAO;CACR,CAAC;AAEF,kBAAe,MAAM,CAAC;AAEtB,SAAS,qBAAqB,CAC5B,OAAU,EACV,OAAe;IAEf,IAAA,gCAAyB,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC5C,IAAA,oCAA6B,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAChD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,sBAAsB,CAAC,OAAuB;IACrD,OAAO,qBAAqB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,sBAAsB,CAAC,OAAuB;IACrD,IAAA,8BAAuB,EAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC5C,OAAO,qBAAqB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AACnD,CAAC"}
|
package/dist/restorer.d.ts
CHANGED
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
import { type ManifestData } from "@pixzle/core";
|
|
2
2
|
export declare class ImageRestorer {
|
|
3
3
|
restoreImages(fragments: (string | Buffer)[], manifest: ManifestData): Promise<Buffer[]>;
|
|
4
|
-
private
|
|
5
|
-
private _prepareData;
|
|
6
|
-
private _readBlocksFromFragment;
|
|
7
|
-
private _readBlocks;
|
|
8
|
-
private _createImage;
|
|
4
|
+
private loadFragment;
|
|
9
5
|
}
|
package/dist/restorer.js
CHANGED
|
@@ -2,52 +2,21 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ImageRestorer = void 0;
|
|
4
4
|
const core_1 = require("@pixzle/core");
|
|
5
|
-
const seeded_shuffle_1 = require("@tuki0918/seeded-shuffle");
|
|
6
|
-
const block_1 = require("./block");
|
|
7
5
|
const file_1 = require("./file");
|
|
6
|
+
const image_buffer_1 = require("./image-buffer");
|
|
8
7
|
class ImageRestorer {
|
|
9
8
|
async restoreImages(fragments, manifest) {
|
|
10
|
-
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
return await this._reconstructImages(restored, manifest);
|
|
9
|
+
(0, core_1.validateFragmentImageCount)(fragments, manifest);
|
|
10
|
+
const fragmentImages = await Promise.all(fragments.map((fragment) => this.loadFragment(fragment)));
|
|
11
|
+
const restoredBuffers = (0, core_1.restoreImageBuffers)(fragmentImages, manifest);
|
|
12
|
+
return await Promise.all(restoredBuffers.map((buffer, index) => (0, image_buffer_1.createPngFromImageBuffer)(Buffer.from(buffer), manifest.images[index].w, manifest.images[index].h)));
|
|
15
13
|
}
|
|
16
|
-
async
|
|
17
|
-
const blockCountsPerImage = (0, core_1.calculateBlockCountsPerImage)(manifest.images, manifest.config.blockSize);
|
|
18
|
-
return await Promise.all(manifest.images.map(async (imageInfo, index) => {
|
|
19
|
-
const { start, end } = (0, core_1.calculateBlockRange)(blockCountsPerImage, index);
|
|
20
|
-
const imageBlocks = blocks.slice(start, end);
|
|
21
|
-
return await this._createImage(imageBlocks, manifest.config.blockSize, imageInfo);
|
|
22
|
-
}));
|
|
23
|
-
}
|
|
24
|
-
async _prepareData(fragments, manifest) {
|
|
25
|
-
const totalBlocks = (0, core_1.calculateTotalBlocks)(manifest.images, manifest.config.blockSize);
|
|
26
|
-
const blockCountsForCrossImages = (0, core_1.calculateBlockCountsForCrossImages)(totalBlocks, fragments.length);
|
|
27
|
-
// Calculate actual block counts per image for per-image unshuffle
|
|
28
|
-
const blockCountsPerImage = (0, core_1.calculateBlockCountsPerImage)(manifest.images, manifest.config.blockSize);
|
|
29
|
-
// Use blockCountsPerImage when crossImageShuffle is false
|
|
30
|
-
const blockCounts = manifest.config.crossImageShuffle
|
|
31
|
-
? blockCountsForCrossImages
|
|
32
|
-
: blockCountsPerImage;
|
|
33
|
-
const blocks = await this._readBlocks(fragments, manifest, blockCounts);
|
|
34
|
-
return { blocks, blockCountsPerImage };
|
|
35
|
-
}
|
|
36
|
-
// Extract an array of blocks (Buffer) from a fragment image
|
|
37
|
-
async _readBlocksFromFragment(fragment, manifest, expectedCount) {
|
|
14
|
+
async loadFragment(fragment) {
|
|
38
15
|
const buffer = Buffer.isBuffer(fragment)
|
|
39
16
|
? fragment
|
|
40
17
|
: await (0, file_1.loadBuffer)(fragment);
|
|
41
|
-
const {
|
|
42
|
-
return
|
|
43
|
-
}
|
|
44
|
-
async _readBlocks(fragments, manifest, blockCounts) {
|
|
45
|
-
const blockGroups = await Promise.all(fragments.map((fragment, i) => this._readBlocksFromFragment(fragment, manifest, blockCounts[i])));
|
|
46
|
-
return blockGroups.flat();
|
|
47
|
-
}
|
|
48
|
-
async _createImage(blocks, blockSize, imageInfo) {
|
|
49
|
-
const { w, h } = imageInfo;
|
|
50
|
-
return await (0, block_1.blocksToPngImage)(blocks, w, h, blockSize);
|
|
18
|
+
const { imageBuffer, width, height } = await (0, image_buffer_1.loadImageBuffer)(buffer);
|
|
19
|
+
return { buffer: imageBuffer, width, height };
|
|
51
20
|
}
|
|
52
21
|
}
|
|
53
22
|
exports.ImageRestorer = ImageRestorer;
|
package/dist/restorer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"restorer.js","sourceRoot":"","sources":["../src/restorer.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"restorer.js","sourceRoot":"","sources":["../src/restorer.ts"],"names":[],"mappings":";;;AAAA,uCAKsB;AACtB,iCAAoC;AACpC,iDAA2E;AAE3E,MAAa,aAAa;IACxB,KAAK,CAAC,aAAa,CACjB,SAA8B,EAC9B,QAAsB;QAEtB,IAAA,iCAA0B,EAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAEhD,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,GAAG,CACtC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CACzD,CAAC;QACF,MAAM,eAAe,GAAG,IAAA,0BAAmB,EAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;QAEtE,OAAO,MAAM,OAAO,CAAC,GAAG,CACtB,eAAe,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CACpC,IAAA,uCAAwB,EACtB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EACnB,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EACxB,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CACzB,CACF,CACF,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,YAAY,CACxB,QAAyB;QAEzB,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACtC,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,MAAM,IAAA,iBAAU,EAAC,QAAQ,CAAC,CAAC;QAC/B,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,IAAA,8BAAe,EAAC,MAAM,CAAC,CAAC;QACrE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAChD,CAAC;CACF;AAhCD,sCAgCC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pixzle/node",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.8",
|
|
4
4
|
"description": "Node.js implementation of image fragmentation and restoration",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -22,13 +22,16 @@
|
|
|
22
22
|
"directory": "packages/node"
|
|
23
23
|
},
|
|
24
24
|
"license": "MIT",
|
|
25
|
+
"engines": {
|
|
26
|
+
"node": ">=20"
|
|
27
|
+
},
|
|
25
28
|
"publishConfig": {
|
|
26
29
|
"access": "public"
|
|
27
30
|
},
|
|
28
31
|
"dependencies": {
|
|
29
32
|
"@tuki0918/seeded-shuffle": "^1.0.0",
|
|
30
|
-
"
|
|
31
|
-
"@pixzle/core": "0.1.
|
|
33
|
+
"sharp": "^0.34.4",
|
|
34
|
+
"@pixzle/core": "0.1.8"
|
|
32
35
|
},
|
|
33
36
|
"devDependencies": {
|
|
34
37
|
"@types/node": "^22.10.2",
|
package/dist/block.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"block.js","sourceRoot":"","sources":["../src/block.ts"],"names":[],"mappings":";;AAuDA,gDAQC;AAUD,kDAcC;AAQD,sCA4BC;AAUD,4CAcC;AAOD,8DAcC;AASD,4DAaC;AAUD,wCA8BC;AAtOD,uCAKsB;AACtB,+BAAsC;AAWtC;;;;;GAKG;AACH,SAAS,kBAAkB,CAAC,SAAiB,EAAE,KAAc;IAC3D,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;IAC9E,OAAO,GAAG,SAAS,KAAK,YAAY,EAAE,CAAC;AACzC,CAAC;AAED;;;;;;GAMG;AACH,SAAS,yBAAyB,CAChC,WAAmB,EACnB,KAAa,EACb,MAAc;IAEd,OAAO,IAAI,WAAI,CAAC;QACd,IAAI,EAAE,WAAW;QACjB,KAAK;QACL,MAAM;KACP,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,kBAAkB,CAChC,MAAc,EACd,KAAa,EACb,MAAc,EACd,SAAiB;IAEjB,MAAM,MAAM,GAAG,IAAA,yBAAsB,EAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IACxE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AACnD,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,mBAAmB,CACjC,MAAgB,EAChB,KAAa,EACb,MAAc,EACd,SAAiB;IAEjB,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IACjE,MAAM,WAAW,GAAG,IAAA,0BAAuB,EACzC,WAAW,EACX,KAAK,EACL,MAAM,EACN,SAAS,CACV,CAAC;IACF,OAAO,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AAClC,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,aAAa,CACjC,KAAsB,EACtB,SAAiB;IAEjB,IAAI,CAAC;QACH,oEAAoE;QACpE,MAAM,KAAK,GAAG,MAAM,WAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC;QACvC,MAAM,QAAQ,GAAG,oBAAa,CAAC;QAC/B,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;QAEtC,0BAA0B;QAC1B,MAAM,MAAM,GAAG,kBAAkB,CAAC,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QACzE,MAAM,WAAW,GAAG,IAAA,2BAAoB,EAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QAEnE,OAAO;YACL,MAAM;YACN,KAAK;YACL,MAAM;YACN,QAAQ;YACR,WAAW,EAAE,WAAW,CAAC,WAAW;YACpC,WAAW,EAAE,WAAW,CAAC,WAAW;SACrC,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,GAAG,kBAAkB,CAAC,8BAA8B,EAAE,KAAK,CAAC,mDAAmD,CAChH,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACI,KAAK,UAAU,gBAAgB,CACpC,MAAgB,EAChB,KAAa,EACb,MAAc,EACd,SAAiB;IAEjB,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,mBAAmB,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QAC1E,OAAO,MAAM,wBAAwB,CAAC,WAAW,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IACpE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,kBAAkB,CAAC,6CAA6C,EAAE,KAAK,CAAC,CACzE,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACI,KAAK,UAAU,yBAAyB,CAC7C,SAAiB;IAEjB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,WAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACzC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC;QACvC,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAEnD,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IACxC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,kBAAkB,CAAC,yCAAyC,EAAE,KAAK,CAAC,CACrE,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,wBAAwB,CAC5C,WAAmB,EACnB,KAAa,EACb,MAAc;IAEd,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,yBAAyB,CAAC,WAAW,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QACpE,OAAO,MAAM,KAAK,CAAC,SAAS,CAAC,eAAQ,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,kBAAkB,CAAC,wCAAwC,EAAE,KAAK,CAAC,CACpE,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,cAAc,CAC5B,SAAmB,EACnB,mBAA6B,EAC7B,IAAqB,EACrB,WAAkE;IAElE,yFAAyF;IACzF,4FAA4F;IAC5F,MAAM,eAAe,GAAa,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC9D,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,KAAK,MAAM,UAAU,IAAI,mBAAmB,EAAE,CAAC;QAC7C,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC,CAAC;QACjE,MAAM,SAAS,GAAG,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAEjD,+EAA+E;QAC/E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,eAAe,CAAC,YAAY,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC;QACD,YAAY,IAAI,SAAS,CAAC,MAAM,CAAC;QAEjC,MAAM,IAAI,UAAU,CAAC;IACvB,CAAC;IAED,0EAA0E;IAC1E,IAAI,YAAY,KAAK,eAAe,CAAC,MAAM,EAAE,CAAC;QAC5C,OAAO,eAAe,CAAC;IACzB,CAAC;IACD,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;AAChD,CAAC"}
|