sweetcorn 0.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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025-present, delucis
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,30 @@
1
+ # `sweetcorn`
2
+
3
+ JavaScript image dithering tools for Sharp
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install sweetcorn
9
+ ```
10
+
11
+ ## Basic usage
12
+
13
+ ```js
14
+ import sharp from 'sharp';
15
+ import sweetcorn from 'sweetcorn';
16
+
17
+ const inputImage = await sharp('input.png');
18
+ const ditheredImage = await sweetcorn(inputImage, {
19
+ algorithm: 'floyd-steinberg',
20
+ });
21
+ ditheredImage.webp({ lossless: true }).toFile('output.webp');
22
+ ```
23
+
24
+ ## Documentation
25
+
26
+ Learn more in the [Sweetcorn documentation site](https://delucis.github.io/sweetcorn/).
27
+
28
+ ## License
29
+
30
+ [MIT](https://github.com/delucis/sweetcorn/blob/main/LICENSE)
@@ -0,0 +1,44 @@
1
+ type Kernel = number[][];
2
+ /**
3
+ * Error diffusion dither kernels.
4
+ *
5
+ * Each kernel uses a 2D array to represent how the error from a pixel’s quantization should be
6
+ * distributed to neighbouring pixels. The central pixel in the first row is the current pixel,
7
+ * so its value is always 0, same for any preceding pixels as we process pixels from left to right
8
+ * and error should only be distributed to unvisited pixels.
9
+ *
10
+ * For example, the simplest kernel here distributes half the error to the pixel on the right, and
11
+ * half the error to the pixel directly below:
12
+ * ```
13
+ * ┌─────┬─────┐
14
+ * │ * │ 0.5 │
15
+ * ├─────┼─────┤
16
+ * │ 0.5 │ │
17
+ * └─────┴─────┘
18
+ * ```
19
+ * In our code this is represented as:
20
+ * ```js
21
+ * [
22
+ * [0, 0.5],
23
+ * [0.5, 0],
24
+ * ]
25
+ * ```
26
+ *
27
+ * Each non-zero value in the kernel represents the fraction of the error to distribute to that
28
+ * pixel. The sum of all values in a kernel is usually ≤1.
29
+ *
30
+ */
31
+ declare const _default: {
32
+ 'simple-diffusion': Kernel;
33
+ 'floyd-steinberg': Kernel;
34
+ 'false-floyd-steinberg': Kernel;
35
+ 'jarvis-judice-ninke': Kernel;
36
+ stucki: Kernel;
37
+ burkes: Kernel;
38
+ atkinson: Kernel;
39
+ pigeon: Kernel;
40
+ sierra: Kernel;
41
+ 'sierra-two-row': Kernel;
42
+ 'sierra-lite': Kernel;
43
+ };
44
+ export default _default;
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Error diffusion dither kernels.
3
+ *
4
+ * Each kernel uses a 2D array to represent how the error from a pixel’s quantization should be
5
+ * distributed to neighbouring pixels. The central pixel in the first row is the current pixel,
6
+ * so its value is always 0, same for any preceding pixels as we process pixels from left to right
7
+ * and error should only be distributed to unvisited pixels.
8
+ *
9
+ * For example, the simplest kernel here distributes half the error to the pixel on the right, and
10
+ * half the error to the pixel directly below:
11
+ * ```
12
+ * ┌─────┬─────┐
13
+ * │ * │ 0.5 │
14
+ * ├─────┼─────┤
15
+ * │ 0.5 │ │
16
+ * └─────┴─────┘
17
+ * ```
18
+ * In our code this is represented as:
19
+ * ```js
20
+ * [
21
+ * [0, 0.5],
22
+ * [0.5, 0],
23
+ * ]
24
+ * ```
25
+ *
26
+ * Each non-zero value in the kernel represents the fraction of the error to distribute to that
27
+ * pixel. The sum of all values in a kernel is usually ≤1.
28
+ *
29
+ */
30
+ export default {
31
+ 'simple-diffusion': [
32
+ [0, 0.5],
33
+ [0.5, 0],
34
+ ],
35
+ 'floyd-steinberg': [
36
+ [0, 0, 7 / 16],
37
+ [3 / 16, 5 / 16, 1 / 16],
38
+ ],
39
+ 'false-floyd-steinberg': [
40
+ [0, 3 / 8],
41
+ [3 / 8, 2 / 8],
42
+ ],
43
+ 'jarvis-judice-ninke': [
44
+ [0, 0, 0, 7 / 48, 5 / 48],
45
+ [3 / 48, 5 / 48, 7 / 48, 5 / 48, 3 / 48],
46
+ [1 / 48, 3 / 48, 5 / 48, 3 / 48, 1 / 48],
47
+ ],
48
+ stucki: [
49
+ [0, 0, 0, 8 / 42, 4 / 42],
50
+ [2 / 42, 4 / 42, 8 / 42, 4 / 42, 2 / 42],
51
+ [1 / 42, 2 / 42, 4 / 42, 2 / 42, 1 / 42],
52
+ ],
53
+ burkes: [
54
+ [0, 0, 0, 8 / 32, 4 / 32],
55
+ [2 / 32, 4 / 32, 8 / 32, 4 / 32, 2 / 32],
56
+ ],
57
+ atkinson: [
58
+ [0, 0, 1 / 8, 1 / 8],
59
+ [1 / 8, 1 / 8, 1 / 8, 0],
60
+ [0, 1 / 8, 0, 0],
61
+ ],
62
+ // see: https://hbfs.wordpress.com/2013/12/31/dithering/
63
+ pigeon: [
64
+ [0, 0, 0, 2 / 14, 1 / 14],
65
+ [0, 2 / 14, 2 / 14, 2 / 14, 0],
66
+ [1 / 14, 0, 1 / 14, 0, 1 / 14],
67
+ ],
68
+ sierra: [
69
+ [0, 0, 0, 5 / 32, 3 / 32],
70
+ [2 / 32, 4 / 32, 5 / 32, 4 / 32, 2 / 32],
71
+ [0, 2 / 32, 3 / 32, 2 / 32, 0],
72
+ ],
73
+ 'sierra-two-row': [
74
+ [0, 0, 0, 4 / 16, 3 / 16],
75
+ [1 / 16, 2 / 16, 3 / 16, 2 / 16, 1 / 16],
76
+ ],
77
+ 'sierra-lite': [
78
+ [0, 0, 2 / 4],
79
+ [1 / 4, 1 / 4, 0],
80
+ ],
81
+ };
@@ -0,0 +1,7 @@
1
+ import type { Sharp } from 'sharp';
2
+ import type { DitheringAlgorithm } from './types';
3
+ export type { DitheringAlgorithm };
4
+ interface SweetcornOptions {
5
+ algorithm: DitheringAlgorithm;
6
+ }
7
+ export default function sweetcorn(image: Sharp, { algorithm }: SweetcornOptions): Promise<Sharp>;
package/dist/index.js ADDED
@@ -0,0 +1,96 @@
1
+ import thresholdMaps from './threshold-maps.json' with { type: 'json' };
2
+ import diffusionKernels from './diffusion-kernels';
3
+ let sharp;
4
+ async function loadSharp() {
5
+ let sharpImport;
6
+ try {
7
+ sharpImport = (await import('sharp')).default;
8
+ }
9
+ catch {
10
+ throw new Error('Missing sharp module');
11
+ }
12
+ // Disable the `sharp` `libvips` cache as it errors when the file is too small and operations are happening too fast (runs into a race condition) https://github.com/lovell/sharp/issues/3935#issuecomment-1881866341
13
+ sharpImport.cache(false);
14
+ return sharpImport;
15
+ }
16
+ export default async function sweetcorn(image, { algorithm }) {
17
+ if (!sharp)
18
+ sharp = await loadSharp();
19
+ // Convert image to greyscale before dithering.
20
+ // We use gamma to linearize the colorspace, and improve the perceptual quality.
21
+ image.gamma(2.2, 1).greyscale();
22
+ // Get raw pixel data for this image.
23
+ const rawPixels = await image.raw().toBuffer({ resolveWithObject: true });
24
+ const thresholdMap = thresholdMaps[algorithm];
25
+ const diffusionKernel = diffusionKernels[algorithm];
26
+ if (thresholdMap) {
27
+ applyThresholdMap(rawPixels, thresholdMap);
28
+ }
29
+ else if (diffusionKernel) {
30
+ applyDiffusionKernel(rawPixels, diffusionKernel);
31
+ }
32
+ else if (algorithm === 'white-noise') {
33
+ // White noise dithering (pretty rough and ugly)
34
+ for (let index = 0; index < rawPixels.data.length; index++) {
35
+ const pixelValue = rawPixels.data[index];
36
+ rawPixels.data[index] = pixelValue / 255 < Math.random() ? 0 : 255;
37
+ }
38
+ }
39
+ else if (algorithm === 'threshold') {
40
+ // Basic quantization
41
+ for (let index = 0; index < rawPixels.data.length; index++) {
42
+ const pixelValue = rawPixels.data[index];
43
+ rawPixels.data[index] = pixelValue < 128 ? 0 : 255;
44
+ }
45
+ }
46
+ // Astro supports outputting different formats, but dithered images like this respond quite
47
+ // predictably to different compression methods. PNG and lossless WebP outperform lossy
48
+ // formats for this type of image, with lossless WebP producing slightly smaller images, so we
49
+ // use that here.
50
+ const outputImage = sharp(rawPixels.data, { raw: rawPixels.info });
51
+ return outputImage;
52
+ }
53
+ function applyDiffusionKernel(rawPixels, kernel) {
54
+ const kernelWidth = kernel[0].length;
55
+ const kernelHeight = kernel.length;
56
+ const kernelRadius = Math.floor((kernelWidth - 1) / 2);
57
+ for (let index = 0; index < rawPixels.data.length; index++) {
58
+ const original = rawPixels.data[index];
59
+ const quantized = original < 128 ? 0 : 255;
60
+ rawPixels.data[index] = quantized;
61
+ const error = original - quantized;
62
+ const [x, y] = [index % rawPixels.info.width, Math.floor(index / rawPixels.info.width)];
63
+ const width = rawPixels.info.width;
64
+ const height = rawPixels.info.height;
65
+ for (let diffX = 0; diffX < kernelWidth; diffX++) {
66
+ for (let diffY = 0; diffY < kernelHeight; diffY++) {
67
+ const diffusionWeight = kernel[diffY][diffX];
68
+ if (diffusionWeight === 0)
69
+ continue;
70
+ const offsetX = diffX - kernelRadius;
71
+ const offsetY = diffY;
72
+ const neighborX = x + offsetX;
73
+ const neighborY = y + offsetY;
74
+ // Ensure we don't go out of bounds
75
+ if (neighborX >= 0 && neighborY >= 0 && neighborX < width && neighborY < height) {
76
+ const neighborIndex = neighborY * width + neighborX;
77
+ rawPixels.data[neighborIndex] = clamp(rawPixels.data[neighborIndex] + error * diffusionWeight);
78
+ }
79
+ }
80
+ }
81
+ }
82
+ }
83
+ function clamp(value, min = 0, max = 255) {
84
+ return Math.min(Math.max(value, min), max);
85
+ }
86
+ /** Applies a threshold map to the raw pixel data for ordered dithering. */
87
+ function applyThresholdMap(rawPixels, thresholdMap) {
88
+ const mapWidth = thresholdMap[0].length;
89
+ const mapHeight = thresholdMap.length;
90
+ for (let index = 0; index < rawPixels.data.length; index++) {
91
+ const pixelValue = rawPixels.data[index];
92
+ const [x, y] = [index % rawPixels.info.width, Math.floor(index / rawPixels.info.width)];
93
+ const threshold = thresholdMap[y % mapHeight][x % mapWidth];
94
+ rawPixels.data[index] = pixelValue < threshold ? 0 : 255;
95
+ }
96
+ }
@@ -0,0 +1,426 @@
1
+ {
2
+ "bayer-2": [
3
+ [0, 128],
4
+ [192, 64]
5
+ ],
6
+ "bayer-4": [
7
+ [0, 128, 32, 160],
8
+ [192, 64, 224, 96],
9
+ [48, 176, 16, 144],
10
+ [240, 112, 208, 80]
11
+ ],
12
+ "bayer-8": [
13
+ [0, 128, 32, 160, 8, 136, 40, 168],
14
+ [192, 64, 224, 96, 200, 72, 232, 104],
15
+ [48, 176, 16, 144, 56, 184, 24, 152],
16
+ [240, 112, 208, 80, 248, 120, 216, 88],
17
+ [12, 140, 44, 172, 4, 132, 36, 164],
18
+ [204, 76, 236, 108, 196, 68, 228, 100],
19
+ [60, 188, 28, 156, 52, 180, 20, 148],
20
+ [252, 124, 220, 92, 244, 116, 212, 84]
21
+ ],
22
+ "bayer-16": [
23
+ [0, 128, 32, 160, 8, 136, 40, 168, 2, 130, 34, 162, 10, 138, 42, 170],
24
+ [192, 64, 224, 96, 200, 72, 232, 104, 194, 66, 226, 98, 202, 74, 234, 106],
25
+ [48, 176, 16, 144, 56, 184, 24, 152, 50, 178, 18, 146, 58, 186, 26, 154],
26
+ [240, 112, 208, 80, 248, 120, 216, 88, 242, 114, 210, 82, 250, 122, 218, 90],
27
+ [12, 140, 44, 172, 4, 132, 36, 164, 14, 142, 46, 174, 6, 134, 38, 166],
28
+ [204, 76, 236, 108, 196, 68, 228, 100, 206, 78, 238, 110, 198, 70, 230, 102],
29
+ [60, 188, 28, 156, 52, 180, 20, 148, 62, 190, 30, 158, 54, 182, 22, 150],
30
+ [252, 124, 220, 92, 244, 116, 212, 84, 254, 126, 222, 94, 246, 118, 214, 86],
31
+ [3, 131, 35, 163, 11, 139, 43, 171, 1, 129, 33, 161, 9, 137, 41, 169],
32
+ [195, 67, 227, 99, 203, 75, 235, 107, 193, 65, 225, 97, 201, 73, 233, 105],
33
+ [51, 179, 19, 147, 59, 187, 27, 155, 49, 177, 17, 145, 57, 185, 25, 153],
34
+ [243, 115, 211, 83, 251, 123, 219, 91, 241, 113, 209, 81, 249, 121, 217, 89],
35
+ [15, 143, 47, 175, 7, 135, 39, 167, 13, 141, 45, 173, 5, 133, 37, 165],
36
+ [207, 79, 239, 111, 199, 71, 231, 103, 205, 77, 237, 109, 197, 69, 229, 101],
37
+ [63, 191, 31, 159, 55, 183, 23, 151, 61, 189, 29, 157, 53, 181, 21, 149],
38
+ [255, 127, 223, 95, 247, 119, 215, 87, 253, 125, 221, 93, 245, 117, 213, 85]
39
+ ],
40
+ "blue-noise": [
41
+ [
42
+ 134, 22, 92, 59, 163, 190, 12, 155, 181, 119, 233, 47, 175, 12, 113, 141, 47, 183, 111, 196,
43
+ 40, 213, 63, 237, 35, 54, 175, 76, 121, 166, 74, 141, 196, 61, 222, 100, 45, 253, 182, 226,
44
+ 27, 131, 150, 93, 65, 235, 108, 219, 42, 91, 230, 71, 173, 210, 134, 55, 192, 28, 149, 174,
45
+ 123, 88, 1, 103
46
+ ],
47
+ [
48
+ 48, 248, 173, 7, 240, 76, 109, 251, 67, 203, 7, 103, 225, 65, 200, 237, 89, 215, 28, 74, 135,
49
+ 97, 16, 186, 141, 217, 110, 200, 24, 52, 226, 20, 241, 85, 183, 16, 138, 65, 124, 163, 83,
50
+ 200, 41, 252, 180, 11, 191, 78, 132, 200, 162, 25, 245, 12, 103, 227, 168, 77, 237, 15, 215,
51
+ 141, 203, 234
52
+ ],
53
+ [
54
+ 82, 145, 112, 216, 128, 40, 208, 20, 136, 87, 150, 195, 132, 157, 40, 172, 9, 131, 158, 227,
55
+ 179, 245, 159, 119, 69, 7, 88, 145, 245, 186, 131, 104, 164, 36, 115, 236, 156, 210, 12, 49,
56
+ 116, 231, 5, 106, 137, 54, 152, 27, 250, 58, 121, 99, 146, 81, 185, 42, 3, 127, 105, 46, 72,
57
+ 181, 29, 161
58
+ ],
59
+ [
60
+ 209, 16, 67, 193, 95, 150, 171, 55, 221, 34, 246, 53, 17, 92, 219, 110, 67, 253, 99, 52, 3,
61
+ 81, 44, 199, 228, 166, 236, 33, 65, 96, 2, 201, 54, 136, 215, 25, 76, 177, 97, 245, 186, 70,
62
+ 171, 215, 76, 204, 238, 103, 172, 3, 221, 182, 47, 203, 118, 253, 146, 199, 218, 165, 244,
63
+ 108, 59, 121
64
+ ],
65
+ [
66
+ 37, 227, 177, 49, 24, 230, 82, 120, 188, 161, 109, 76, 184, 241, 28, 145, 208, 38, 191, 123,
67
+ 151, 220, 107, 27, 93, 47, 128, 208, 178, 160, 230, 78, 247, 173, 63, 193, 108, 35, 218, 148,
68
+ 23, 135, 45, 155, 25, 119, 39, 84, 138, 195, 37, 77, 238, 17, 160, 71, 96, 56, 24, 87, 134, 7,
69
+ 231, 187
70
+ ],
71
+ [
72
+ 103, 152, 85, 254, 133, 200, 1, 245, 97, 22, 202, 223, 141, 116, 59, 180, 85, 162, 20, 241,
73
+ 60, 183, 140, 252, 154, 191, 78, 11, 115, 45, 140, 31, 118, 8, 93, 149, 250, 133, 56, 84, 201,
74
+ 110, 242, 86, 228, 185, 162, 217, 64, 231, 116, 155, 129, 60, 221, 28, 178, 238, 156, 192, 41,
75
+ 207, 145, 74
76
+ ],
77
+ [
78
+ 242, 124, 6, 164, 108, 67, 175, 44, 145, 63, 128, 8, 42, 168, 213, 4, 231, 113, 73, 207, 95,
79
+ 13, 209, 67, 17, 106, 217, 147, 250, 88, 218, 191, 157, 211, 229, 48, 14, 198, 169, 2, 224,
80
+ 63, 179, 14, 132, 60, 8, 112, 24, 166, 90, 11, 208, 171, 101, 138, 209, 10, 112, 68, 250, 97,
81
+ 173, 17
82
+ ],
83
+ [
84
+ 44, 216, 60, 193, 37, 224, 152, 80, 214, 238, 173, 92, 251, 74, 101, 130, 50, 197, 139, 35,
85
+ 172, 132, 43, 121, 181, 234, 60, 26, 197, 66, 13, 99, 42, 73, 130, 185, 82, 119, 239, 99, 128,
86
+ 34, 148, 212, 104, 246, 195, 142, 239, 46, 189, 251, 34, 80, 243, 48, 122, 80, 229, 147, 22,
87
+ 125, 56, 201
88
+ ],
89
+ [
90
+ 112, 175, 143, 239, 97, 19, 116, 189, 11, 108, 52, 193, 146, 23, 189, 245, 156, 17, 238, 103,
91
+ 225, 75, 243, 88, 160, 39, 130, 164, 102, 172, 127, 237, 179, 110, 19, 158, 233, 62, 29, 157,
92
+ 186, 253, 95, 44, 169, 30, 74, 93, 206, 125, 68, 107, 144, 194, 1, 152, 189, 31, 171, 50, 186,
93
+ 224, 83, 158
94
+ ],
95
+ [
96
+ 26, 92, 12, 76, 134, 204, 250, 40, 135, 162, 31, 227, 119, 216, 64, 34, 91, 185, 59, 160, 7,
97
+ 187, 143, 217, 1, 205, 84, 244, 48, 225, 34, 148, 60, 254, 200, 36, 101, 140, 213, 49, 79, 11,
98
+ 199, 68, 121, 223, 177, 38, 152, 12, 224, 180, 52, 118, 232, 68, 217, 92, 135, 207, 105, 3,
99
+ 134, 246
100
+ ],
101
+ [
102
+ 67, 197, 225, 182, 48, 163, 64, 90, 210, 234, 68, 86, 6, 163, 105, 141, 222, 123, 82, 209,
103
+ 115, 54, 27, 104, 62, 118, 185, 21, 142, 203, 79, 193, 2, 137, 84, 221, 176, 6, 191, 120, 230,
104
+ 172, 134, 234, 154, 3, 109, 249, 55, 169, 86, 25, 209, 91, 167, 40, 111, 254, 12, 66, 240,
105
+ 163, 41, 210
106
+ ],
107
+ [
108
+ 151, 123, 35, 106, 236, 5, 123, 180, 21, 106, 145, 176, 206, 51, 241, 180, 3, 45, 254, 30,
109
+ 149, 238, 201, 169, 251, 150, 221, 73, 110, 12, 120, 230, 96, 166, 48, 125, 66, 247, 88, 153,
110
+ 24, 106, 57, 26, 87, 215, 135, 197, 102, 235, 129, 149, 248, 14, 136, 204, 21, 155, 178, 122,
111
+ 30, 78, 185, 101
112
+ ],
113
+ [
114
+ 16, 253, 168, 143, 73, 196, 152, 244, 53, 200, 15, 252, 98, 132, 24, 76, 159, 198, 130, 177,
115
+ 92, 70, 128, 40, 89, 17, 51, 175, 241, 158, 54, 177, 31, 236, 206, 20, 163, 110, 34, 220, 71,
116
+ 204, 248, 165, 189, 62, 32, 78, 10, 211, 33, 75, 176, 48, 227, 71, 187, 53, 84, 224, 200, 143,
117
+ 231, 54
118
+ ],
119
+ [
120
+ 216, 85, 58, 18, 213, 96, 27, 113, 78, 168, 122, 62, 34, 195, 226, 114, 214, 97, 60, 11, 223,
121
+ 161, 15, 184, 229, 135, 100, 211, 39, 89, 219, 130, 69, 108, 151, 78, 228, 198, 57, 178, 126,
122
+ 5, 139, 43, 118, 239, 144, 166, 185, 116, 58, 194, 103, 124, 159, 90, 119, 234, 138, 42, 95,
123
+ 10, 114, 175
124
+ ],
125
+ [
126
+ 136, 188, 118, 233, 176, 40, 227, 138, 213, 42, 229, 186, 158, 85, 143, 55, 16, 151, 232, 190,
127
+ 108, 48, 214, 117, 59, 196, 153, 4, 124, 172, 17, 202, 247, 7, 186, 44, 132, 13, 142, 242, 96,
128
+ 192, 77, 212, 96, 14, 207, 93, 40, 228, 156, 244, 7, 201, 31, 242, 3, 211, 24, 194, 169, 243,
129
+ 72, 38
130
+ ],
131
+ [
132
+ 2, 242, 44, 90, 125, 157, 57, 186, 1, 89, 144, 108, 7, 243, 38, 189, 238, 74, 35, 135, 79,
133
+ 249, 142, 86, 30, 235, 72, 183, 249, 62, 146, 101, 49, 139, 222, 90, 252, 104, 168, 26, 46,
134
+ 160, 227, 23, 154, 179, 52, 254, 132, 76, 19, 138, 85, 221, 61, 144, 174, 99, 69, 153, 55,
135
+ 124, 210, 158
136
+ ],
137
+ [
138
+ 106, 67, 163, 205, 9, 77, 241, 100, 166, 249, 26, 216, 70, 204, 125, 170, 101, 122, 166, 206,
139
+ 24, 171, 5, 202, 162, 127, 24, 111, 85, 227, 30, 183, 79, 165, 118, 31, 192, 61, 212, 82, 234,
140
+ 119, 58, 106, 233, 72, 121, 1, 162, 214, 105, 181, 38, 166, 101, 191, 45, 131, 247, 111, 223,
141
+ 16, 90, 192
142
+ ],
143
+ [
144
+ 132, 227, 29, 139, 224, 190, 22, 127, 68, 197, 55, 133, 177, 95, 23, 66, 220, 1, 245, 53, 115,
145
+ 230, 66, 106, 246, 53, 218, 194, 45, 161, 114, 199, 234, 14, 213, 71, 156, 1, 116, 188, 147,
146
+ 8, 174, 195, 37, 140, 219, 187, 62, 30, 199, 236, 69, 122, 250, 20, 82, 208, 9, 176, 36, 144,
147
+ 251, 49
148
+ ],
149
+ [
150
+ 201, 86, 180, 103, 39, 112, 150, 212, 36, 153, 106, 234, 41, 161, 253, 149, 45, 178, 80, 146,
151
+ 94, 188, 151, 41, 181, 96, 147, 14, 132, 213, 19, 67, 128, 45, 178, 97, 230, 134, 242, 35, 68,
152
+ 215, 130, 89, 244, 18, 83, 110, 240, 91, 134, 49, 154, 10, 205, 139, 233, 151, 63, 94, 203,
153
+ 80, 168, 24
154
+ ],
155
+ [
156
+ 152, 11, 243, 63, 171, 254, 52, 91, 236, 182, 8, 86, 207, 16, 109, 213, 90, 126, 196, 15, 214,
157
+ 32, 129, 225, 9, 75, 170, 233, 62, 97, 254, 152, 89, 242, 143, 27, 197, 51, 88, 177, 101, 249,
158
+ 28, 51, 150, 170, 202, 41, 149, 175, 20, 108, 223, 174, 90, 58, 31, 108, 184, 239, 128, 57,
159
+ 221, 110
160
+ ],
161
+ [
162
+ 235, 52, 129, 211, 82, 7, 192, 131, 20, 115, 217, 145, 65, 131, 52, 182, 17, 237, 39, 162,
163
+ 252, 61, 88, 206, 119, 243, 37, 110, 203, 181, 36, 171, 4, 204, 56, 122, 165, 18, 217, 144,
164
+ 14, 160, 204, 114, 221, 64, 125, 8, 214, 57, 251, 190, 77, 36, 117, 193, 165, 226, 46, 23,
165
+ 159, 4, 183, 70
166
+ ],
167
+ [
168
+ 192, 96, 167, 22, 119, 159, 223, 64, 170, 77, 47, 249, 168, 198, 231, 76, 142, 205, 100, 72,
169
+ 135, 177, 22, 155, 54, 191, 135, 79, 8, 142, 55, 116, 188, 100, 224, 77, 252, 107, 65, 202,
170
+ 118, 56, 81, 173, 12, 100, 236, 181, 85, 120, 141, 6, 150, 241, 215, 134, 2, 86, 122, 216,
171
+ 101, 248, 139, 31
172
+ ],
173
+ [
174
+ 214, 146, 38, 196, 235, 97, 28, 146, 243, 201, 124, 30, 100, 9, 117, 33, 170, 56, 120, 224, 7,
175
+ 107, 199, 232, 99, 15, 218, 160, 245, 87, 231, 212, 68, 33, 151, 11, 182, 134, 227, 41, 189,
176
+ 233, 136, 38, 253, 142, 46, 156, 226, 32, 69, 205, 94, 53, 21, 71, 254, 203, 142, 74, 196, 50,
177
+ 86, 116
178
+ ],
179
+ [
180
+ 9, 75, 249, 56, 143, 72, 213, 43, 104, 2, 157, 189, 80, 239, 155, 194, 94, 246, 27, 188, 153,
181
+ 241, 69, 42, 141, 179, 61, 33, 114, 197, 23, 133, 162, 245, 117, 198, 45, 87, 26, 155, 94, 2,
182
+ 180, 211, 92, 195, 72, 16, 105, 192, 169, 232, 115, 183, 159, 100, 174, 57, 14, 179, 30, 151,
183
+ 229, 173
184
+ ],
185
+ [
186
+ 222, 127, 181, 108, 4, 172, 126, 182, 86, 230, 57, 218, 136, 43, 64, 222, 15, 129, 212, 48,
187
+ 89, 29, 123, 167, 85, 253, 126, 190, 70, 169, 50, 102, 9, 86, 219, 64, 144, 237, 173, 113,
188
+ 247, 76, 124, 61, 23, 165, 122, 212, 247, 55, 131, 24, 42, 213, 129, 233, 36, 149, 225, 109,
189
+ 239, 126, 25, 63
190
+ ],
191
+ [
192
+ 157, 19, 87, 202, 229, 49, 252, 16, 197, 143, 114, 21, 178, 204, 109, 145, 83, 161, 70, 175,
193
+ 143, 214, 187, 5, 205, 26, 101, 222, 1, 149, 215, 237, 187, 53, 169, 17, 103, 212, 9, 57, 201,
194
+ 34, 151, 239, 107, 228, 35, 144, 91, 1, 160, 84, 246, 65, 6, 81, 117, 192, 69, 41, 165, 80,
195
+ 199, 104
196
+ ],
197
+ [
198
+ 46, 240, 138, 33, 151, 76, 111, 159, 67, 37, 244, 72, 96, 5, 254, 31, 188, 236, 1, 113, 248,
199
+ 58, 97, 231, 71, 158, 45, 139, 244, 90, 118, 36, 137, 209, 122, 249, 158, 73, 126, 184, 138,
200
+ 217, 171, 17, 199, 82, 186, 62, 173, 203, 223, 110, 190, 148, 172, 203, 25, 248, 133, 98, 215,
201
+ 3, 252, 185
202
+ ],
203
+ [
204
+ 83, 171, 65, 222, 96, 194, 23, 220, 134, 207, 174, 154, 223, 130, 168, 60, 120, 43, 206, 82,
205
+ 20, 129, 41, 145, 112, 216, 177, 77, 21, 202, 62, 178, 78, 22, 89, 43, 192, 30, 232, 85, 14,
206
+ 98, 69, 118, 50, 133, 11, 239, 119, 45, 71, 137, 13, 98, 46, 223, 91, 161, 12, 183, 60, 145,
207
+ 36, 124
208
+ ],
209
+ [
210
+ 22, 214, 113, 10, 178, 125, 236, 48, 85, 11, 100, 28, 52, 81, 200, 102, 215, 154, 134, 189,
211
+ 221, 167, 238, 182, 25, 57, 236, 107, 188, 132, 27, 254, 152, 219, 181, 143, 100, 209, 52,
212
+ 153, 254, 41, 225, 182, 245, 151, 208, 99, 23, 147, 253, 34, 201, 241, 126, 67, 145, 39, 207,
213
+ 238, 119, 175, 95, 233
214
+ ],
215
+ [
216
+ 191, 54, 157, 246, 38, 63, 165, 105, 181, 250, 127, 196, 238, 148, 20, 244, 9, 91, 57, 31,
217
+ 102, 66, 9, 87, 201, 129, 13, 152, 42, 226, 165, 95, 4, 115, 62, 228, 8, 132, 175, 105, 191,
218
+ 124, 146, 3, 89, 36, 72, 163, 225, 189, 95, 157, 60, 167, 21, 186, 235, 111, 55, 85, 17, 222,
219
+ 69, 148
220
+ ],
221
+ [
222
+ 129, 99, 207, 78, 144, 216, 1, 139, 210, 43, 68, 166, 112, 40, 190, 74, 162, 228, 178, 252,
223
+ 140, 205, 121, 154, 244, 72, 170, 89, 206, 68, 110, 50, 203, 239, 33, 164, 83, 242, 28, 70,
224
+ 21, 208, 59, 109, 203, 175, 235, 53, 126, 79, 16, 214, 113, 83, 208, 101, 7, 170, 138, 199,
225
+ 158, 47, 202, 7
226
+ ],
227
+ [
228
+ 251, 42, 15, 120, 198, 95, 239, 73, 29, 153, 232, 6, 88, 218, 120, 140, 45, 109, 23, 77, 161,
229
+ 39, 228, 53, 28, 190, 116, 250, 5, 126, 233, 189, 140, 72, 125, 198, 49, 111, 218, 161, 235,
230
+ 83, 165, 248, 28, 130, 103, 6, 197, 43, 178, 130, 234, 36, 149, 53, 219, 74, 253, 27, 100,
231
+ 241, 111, 172
232
+ ],
233
+ [
234
+ 61, 162, 234, 184, 24, 52, 173, 113, 193, 94, 123, 209, 61, 176, 26, 235, 185, 206, 130, 218,
235
+ 3, 91, 180, 109, 142, 224, 38, 58, 182, 149, 19, 37, 91, 176, 13, 247, 148, 184, 39, 141, 119,
236
+ 9, 186, 46, 153, 66, 213, 147, 249, 107, 221, 57, 3, 175, 248, 124, 194, 37, 121, 188, 66,
237
+ 135, 32, 81
238
+ ],
239
+ [
240
+ 221, 140, 107, 69, 154, 129, 221, 19, 247, 50, 171, 22, 146, 252, 96, 68, 11, 87, 59, 171,
241
+ 114, 240, 63, 204, 10, 94, 160, 213, 99, 239, 80, 216, 153, 226, 105, 60, 88, 2, 199, 94, 56,
242
+ 212, 128, 95, 223, 13, 179, 83, 29, 167, 70, 146, 195, 106, 78, 20, 144, 92, 162, 2, 231, 152,
243
+ 209, 182
244
+ ],
245
+ [
246
+ 4, 90, 32, 210, 249, 84, 40, 161, 139, 81, 228, 198, 105, 46, 164, 224, 136, 158, 244, 40,
247
+ 191, 134, 21, 166, 249, 74, 123, 23, 137, 46, 170, 122, 55, 21, 200, 162, 133, 224, 69, 251,
248
+ 176, 33, 237, 71, 192, 115, 239, 56, 136, 232, 18, 92, 242, 47, 166, 226, 58, 240, 208, 110,
249
+ 45, 87, 21, 121
250
+ ],
251
+ [
252
+ 198, 232, 169, 57, 9, 194, 102, 206, 4, 118, 32, 70, 133, 5, 189, 115, 32, 216, 104, 16, 75,
253
+ 222, 151, 105, 37, 190, 220, 176, 66, 207, 10, 192, 252, 116, 44, 234, 31, 169, 114, 18, 146,
254
+ 104, 161, 19, 142, 42, 164, 98, 190, 117, 201, 161, 126, 11, 211, 115, 155, 13, 77, 180, 218,
255
+ 168, 239, 55
256
+ ],
257
+ [
258
+ 75, 134, 112, 187, 144, 121, 241, 51, 181, 237, 147, 174, 210, 230, 59, 81, 199, 53, 178, 128,
259
+ 205, 48, 86, 235, 59, 140, 1, 90, 244, 109, 156, 92, 70, 144, 183, 78, 99, 209, 50, 232, 77,
260
+ 218, 53, 198, 254, 79, 25, 211, 4, 51, 81, 35, 228, 67, 186, 87, 41, 192, 127, 29, 65, 131,
261
+ 98, 157
262
+ ],
263
+ [
264
+ 254, 43, 18, 217, 65, 32, 153, 74, 98, 214, 56, 90, 19, 120, 156, 247, 10, 148, 89, 253, 156,
265
+ 117, 27, 202, 170, 114, 230, 49, 143, 27, 227, 39, 212, 4, 242, 127, 13, 148, 193, 125, 183,
266
+ 11, 133, 89, 120, 176, 225, 131, 156, 250, 216, 140, 174, 109, 29, 137, 251, 220, 100, 149,
267
+ 246, 10, 193, 27
268
+ ],
269
+ [
270
+ 176, 148, 100, 237, 87, 180, 226, 14, 166, 25, 112, 194, 240, 39, 96, 172, 126, 227, 30, 65,
271
+ 3, 225, 183, 130, 16, 77, 205, 162, 195, 79, 131, 187, 162, 101, 58, 172, 220, 70, 29, 93, 44,
272
+ 245, 164, 210, 6, 60, 107, 45, 84, 177, 62, 20, 93, 244, 201, 161, 61, 18, 167, 50, 184, 80,
273
+ 214, 110
274
+ ],
275
+ [
276
+ 224, 71, 193, 159, 8, 133, 107, 203, 127, 247, 43, 159, 77, 143, 207, 22, 71, 196, 112, 189,
277
+ 165, 98, 73, 44, 250, 99, 33, 121, 15, 249, 53, 114, 23, 225, 200, 32, 110, 250, 168, 212,
278
+ 150, 109, 69, 37, 231, 151, 202, 240, 30, 104, 125, 195, 153, 52, 2, 80, 119, 208, 85, 234,
279
+ 115, 35, 140, 54
280
+ ],
281
+ [
282
+ 1, 124, 32, 55, 207, 251, 36, 59, 84, 187, 137, 216, 1, 184, 51, 222, 103, 43, 237, 133, 51,
283
+ 240, 145, 211, 173, 152, 234, 67, 179, 97, 155, 236, 73, 135, 88, 154, 50, 137, 1, 79, 232,
284
+ 22, 174, 127, 188, 78, 19, 141, 191, 232, 10, 214, 76, 224, 133, 238, 180, 44, 141, 5, 203,
285
+ 164, 243, 93
286
+ ],
287
+ [
288
+ 154, 211, 244, 139, 75, 96, 174, 147, 219, 19, 99, 65, 123, 254, 81, 137, 179, 153, 9, 83,
289
+ 203, 34, 17, 117, 59, 4, 136, 212, 39, 219, 5, 200, 43, 178, 10, 232, 195, 96, 204, 123, 56,
290
+ 193, 94, 242, 50, 115, 170, 93, 55, 136, 165, 46, 118, 31, 169, 103, 21, 223, 190, 98, 66,
291
+ 128, 22, 184
292
+ ],
293
+ [
294
+ 38, 106, 83, 164, 21, 196, 121, 4, 240, 50, 177, 233, 30, 166, 109, 15, 242, 67, 217, 174,
295
+ 109, 158, 218, 92, 183, 199, 84, 110, 170, 139, 82, 105, 146, 254, 118, 75, 176, 20, 243, 38,
296
+ 142, 218, 14, 149, 27, 210, 250, 0, 221, 72, 98, 254, 182, 87, 206, 60, 154, 73, 125, 253, 42,
297
+ 215, 79, 235
298
+ ],
299
+ [
300
+ 59, 195, 12, 181, 233, 41, 213, 64, 164, 117, 140, 196, 92, 47, 227, 193, 36, 95, 122, 25, 59,
301
+ 248, 74, 131, 239, 32, 52, 251, 21, 64, 232, 184, 17, 62, 209, 34, 132, 57, 157, 102, 171, 76,
302
+ 117, 200, 90, 62, 128, 152, 184, 33, 201, 18, 141, 229, 10, 136, 240, 34, 173, 14, 151, 177,
303
+ 104, 135
304
+ ],
305
+ [
306
+ 162, 228, 115, 51, 131, 101, 156, 86, 193, 32, 77, 7, 212, 157, 128, 62, 171, 142, 198, 230,
307
+ 137, 185, 44, 13, 148, 105, 208, 157, 124, 196, 47, 120, 224, 164, 98, 150, 238, 86, 190, 225,
308
+ 6, 248, 53, 164, 234, 179, 36, 79, 105, 241, 123, 158, 68, 41, 113, 187, 96, 201, 83, 114,
309
+ 223, 53, 6, 205
310
+ ],
311
+ [
312
+ 20, 91, 147, 253, 69, 219, 26, 248, 106, 221, 171, 246, 111, 19, 80, 209, 8, 251, 45, 84, 0,
313
+ 104, 202, 165, 229, 64, 179, 10, 95, 240, 150, 28, 87, 44, 198, 5, 217, 120, 24, 66, 127, 185,
314
+ 32, 135, 8, 108, 216, 195, 15, 166, 48, 91, 218, 170, 248, 56, 17, 160, 232, 63, 191, 140,
315
+ 247, 74
316
+ ],
317
+ [
318
+ 126, 210, 30, 190, 5, 175, 141, 56, 15, 133, 43, 62, 146, 187, 240, 107, 161, 72, 114, 176,
319
+ 155, 216, 79, 118, 28, 88, 129, 226, 39, 76, 177, 210, 133, 247, 114, 73, 169, 48, 199, 149,
320
+ 84, 209, 99, 220, 75, 158, 54, 237, 136, 65, 229, 203, 6, 126, 79, 150, 208, 44, 122, 25, 94,
321
+ 35, 111, 185
322
+ ],
323
+ [
324
+ 233, 42, 83, 158, 111, 79, 207, 119, 234, 160, 204, 87, 219, 27, 52, 139, 33, 218, 194, 23,
325
+ 242, 37, 56, 252, 173, 215, 49, 194, 140, 111, 2, 69, 168, 19, 188, 145, 31, 252, 106, 228,
326
+ 17, 155, 58, 174, 253, 122, 24, 88, 174, 114, 29, 147, 104, 194, 28, 223, 102, 138, 250, 171,
327
+ 204, 230, 159, 55
328
+ ],
329
+ [
330
+ 172, 138, 239, 202, 48, 245, 29, 189, 71, 98, 10, 177, 127, 101, 169, 228, 90, 128, 60, 146,
331
+ 98, 131, 189, 143, 5, 108, 155, 18, 249, 186, 217, 46, 229, 102, 57, 211, 93, 138, 63, 175,
332
+ 43, 236, 113, 13, 41, 192, 146, 207, 3, 246, 187, 71, 39, 238, 176, 61, 0, 187, 68, 12, 148,
333
+ 80, 21, 97
334
+ ],
335
+ [
336
+ 2, 63, 99, 14, 127, 150, 92, 165, 46, 144, 225, 37, 251, 66, 204, 4, 183, 236, 13, 207, 70,
337
+ 234, 25, 86, 201, 67, 232, 84, 54, 93, 153, 127, 82, 158, 243, 14, 180, 219, 0, 128, 89, 187,
338
+ 138, 205, 95, 69, 230, 106, 52, 83, 124, 220, 156, 89, 134, 113, 242, 87, 217, 115, 51, 130,
339
+ 215, 191
340
+ ],
341
+ [
342
+ 123, 220, 165, 186, 229, 63, 215, 6, 238, 197, 116, 80, 159, 20, 148, 82, 50, 106, 154, 179,
343
+ 35, 112, 171, 228, 124, 41, 181, 120, 170, 27, 241, 15, 202, 33, 135, 116, 49, 82, 159, 243,
344
+ 210, 25, 73, 244, 167, 131, 31, 182, 158, 213, 22, 172, 54, 13, 207, 163, 45, 150, 32, 180,
345
+ 235, 167, 41, 252
346
+ ],
347
+ [
348
+ 152, 29, 75, 43, 113, 23, 178, 103, 128, 28, 60, 183, 211, 108, 238, 196, 123, 28, 253, 84,
349
+ 220, 142, 59, 18, 161, 246, 11, 221, 137, 211, 64, 113, 182, 225, 72, 168, 235, 191, 39, 117,
350
+ 61, 105, 156, 50, 6, 223, 61, 250, 12, 136, 98, 229, 111, 255, 73, 25, 226, 125, 199, 94, 74,
351
+ 14, 112, 84
352
+ ],
353
+ [
354
+ 206, 102, 246, 132, 204, 82, 138, 255, 74, 168, 231, 0, 131, 54, 31, 141, 222, 167, 62, 125,
355
+ 5, 194, 96, 212, 77, 143, 98, 69, 35, 102, 196, 144, 46, 96, 8, 210, 102, 20, 147, 200, 10,
356
+ 231, 185, 121, 197, 101, 150, 117, 77, 196, 63, 34, 181, 137, 194, 102, 172, 59, 8, 248, 155,
357
+ 211, 184, 53
358
+ ],
359
+ [
360
+ 9, 169, 190, 16, 235, 162, 35, 188, 49, 206, 104, 152, 247, 90, 187, 68, 8, 94, 204, 42, 160,
361
+ 243, 37, 175, 117, 51, 205, 184, 255, 159, 4, 81, 173, 249, 150, 57, 136, 70, 255, 87, 170,
362
+ 134, 35, 86, 214, 40, 180, 26, 220, 164, 245, 149, 85, 4, 51, 237, 81, 213, 106, 133, 30, 66,
363
+ 137, 233
364
+ ],
365
+ [
366
+ 125, 64, 145, 47, 95, 61, 226, 8, 91, 142, 20, 76, 42, 169, 216, 116, 245, 179, 139, 229, 107,
367
+ 76, 131, 227, 2, 237, 152, 19, 115, 50, 231, 213, 26, 117, 197, 33, 226, 164, 121, 49, 220,
368
+ 67, 248, 18, 160, 73, 240, 93, 128, 46, 16, 120, 190, 219, 157, 128, 19, 146, 189, 47, 178,
369
+ 220, 93, 38
370
+ ],
371
+ [
372
+ 243, 86, 222, 111, 197, 150, 122, 211, 111, 244, 163, 226, 198, 105, 16, 157, 38, 80, 23, 58,
373
+ 192, 18, 156, 64, 190, 90, 40, 129, 75, 177, 93, 133, 64, 163, 78, 107, 180, 3, 198, 28, 148,
374
+ 102, 191, 126, 227, 144, 2, 193, 58, 206, 100, 229, 66, 29, 109, 206, 40, 243, 70, 228, 116,
375
+ 16, 151, 198
376
+ ],
377
+ [
378
+ 163, 30, 179, 2, 250, 26, 169, 71, 182, 37, 61, 117, 27, 140, 64, 231, 130, 210, 114, 168,
379
+ 248, 95, 218, 32, 112, 167, 222, 193, 240, 147, 32, 186, 245, 11, 206, 236, 51, 91, 241, 112,
380
+ 211, 12, 167, 58, 97, 44, 112, 163, 232, 138, 174, 40, 159, 243, 75, 181, 97, 164, 2, 88, 170,
381
+ 255, 75, 108
382
+ ],
383
+ [
384
+ 52, 208, 122, 59, 137, 88, 49, 236, 15, 129, 219, 191, 85, 246, 202, 97, 54, 188, 225, 6, 143,
385
+ 49, 179, 135, 251, 73, 15, 102, 58, 8, 224, 104, 48, 122, 148, 24, 132, 157, 70, 183, 47, 85,
386
+ 239, 24, 209, 185, 255, 71, 31, 83, 7, 195, 91, 130, 10, 226, 58, 123, 203, 144, 25, 57, 188,
387
+ 6
388
+ ],
389
+ [
390
+ 233, 82, 153, 230, 187, 214, 108, 199, 147, 80, 173, 11, 151, 43, 175, 3, 163, 29, 89, 66,
391
+ 118, 209, 81, 9, 198, 51, 139, 163, 210, 125, 197, 70, 166, 215, 93, 65, 194, 222, 35, 136,
392
+ 159, 223, 115, 147, 78, 127, 18, 149, 212, 123, 246, 145, 214, 51, 172, 140, 196, 34, 246,
393
+ 107, 212, 127, 220, 142
394
+ ],
395
+ [
396
+ 176, 18, 103, 38, 73, 13, 159, 40, 99, 252, 48, 107, 235, 121, 79, 137, 255, 110, 149, 240,
397
+ 164, 35, 237, 100, 154, 217, 88, 245, 39, 81, 154, 22, 238, 37, 185, 251, 113, 15, 101, 247,
398
+ 7, 61, 188, 38, 174, 217, 56, 95, 186, 47, 107, 65, 25, 104, 253, 82, 19, 153, 72, 49, 163,
399
+ 79, 36, 116
400
+ ],
401
+ [
402
+ 64, 249, 205, 167, 119, 246, 132, 224, 21, 195, 156, 71, 208, 18, 223, 184, 67, 215, 44, 200,
403
+ 17, 130, 172, 47, 121, 30, 177, 18, 111, 182, 229, 118, 139, 80, 7, 160, 48, 176, 207, 81,
404
+ 197, 130, 94, 249, 4, 109, 237, 160, 13, 229, 167, 221, 154, 200, 39, 119, 231, 99, 188, 235,
405
+ 26, 183, 241, 92
406
+ ],
407
+ [
408
+ 155, 47, 136, 5, 184, 54, 83, 174, 66, 123, 0, 181, 139, 58, 102, 37, 124, 14, 173, 80, 104,
409
+ 191, 74, 227, 195, 68, 231, 135, 205, 64, 3, 55, 175, 202, 105, 137, 230, 63, 120, 38, 167,
410
+ 22, 208, 155, 72, 141, 34, 202, 129, 75, 33, 94, 0, 129, 178, 63, 205, 166, 5, 132, 100, 147,
411
+ 12, 201
412
+ ],
413
+ [
414
+ 29, 112, 75, 236, 98, 209, 26, 143, 206, 242, 97, 219, 33, 193, 155, 233, 204, 94, 138, 222,
415
+ 54, 251, 26, 145, 0, 103, 160, 46, 94, 148, 255, 92, 217, 42, 243, 73, 26, 153, 216, 142, 242,
416
+ 75, 114, 47, 228, 195, 88, 60, 247, 112, 207, 184, 241, 78, 223, 15, 141, 44, 84, 225, 194,
417
+ 55, 120, 226
418
+ ],
419
+ [
420
+ 180, 197, 219, 147, 36, 124, 230, 93, 50, 29, 161, 78, 126, 250, 81, 22, 165, 61, 244, 6, 154,
421
+ 117, 168, 91, 205, 129, 248, 13, 222, 192, 32, 113, 157, 12, 126, 170, 199, 89, 0, 103, 56,
422
+ 185, 220, 16, 168, 125, 23, 156, 179, 9, 143, 51, 116, 34, 159, 92, 247, 113, 208, 65, 33,
423
+ 252, 167, 68
424
+ ]
425
+ ]
426
+ }
@@ -0,0 +1,3 @@
1
+ import type diffusionKernels from './diffusion-kernels';
2
+ import type thresholdMaps from './threshold-maps.json';
3
+ export type DitheringAlgorithm = keyof typeof thresholdMaps | keyof typeof diffusionKernels | 'white-noise' | 'threshold';
package/dist/types.js ADDED
@@ -0,0 +1 @@
1
+ export {};
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "sweetcorn",
3
+ "version": "0.0.1",
4
+ "license": "MIT",
5
+ "description": "JavaScript image dithering tools for Sharp",
6
+ "keywords": [
7
+ "image",
8
+ "dither",
9
+ "sharp",
10
+ "libvips"
11
+ ],
12
+ "type": "module",
13
+ "files": [
14
+ "dist"
15
+ ],
16
+ "exports": {
17
+ ".": "./dist/index.js"
18
+ },
19
+ "devDependencies": {
20
+ "sharp": "^0.34.5",
21
+ "typescript": "^5.9.3"
22
+ },
23
+ "peerDependencies": {
24
+ "sharp": ">=0.33.0"
25
+ },
26
+ "engines": {
27
+ "node": ">=20.10.0"
28
+ },
29
+ "publishConfig": {
30
+ "access": "public"
31
+ },
32
+ "homepage": "https://github.com/delucis/sweetcorn",
33
+ "repository": {
34
+ "type": "git",
35
+ "url": "https://github.com/delucis/sweetcorn.git",
36
+ "directory": "packages/sweetcorn"
37
+ },
38
+ "bugs": "https://github.com/delucis/sweetcorn/issues",
39
+ "scripts": {
40
+ "build": "tsc"
41
+ }
42
+ }