···
1
1
-
import { beforeAll, bench, describe } from "vitest";
2
2
-
import { createInput, type Input } from "../input.ts";
1
1
+
import { Bench } from "tinybench";
2
2
+
import { withCodSpeed } from "@codspeed/tinybench-plugin";
3
3
+
import { createInput } from "../input.ts";
3
4
4
5
function bytes(...values: number[]): Uint8Array {
5
6
return new Uint8Array(values);
···
9
10
return new TextEncoder().encode(s);
10
11
}
11
12
12
12
-
describe("input parsing", () => {
13
13
-
let input: Input;
13
13
+
let input = await createInput({ escLatency: 25 });
14
14
15
15
-
beforeAll(async () => {
16
16
-
input = await createInput({ escLatency: 25 });
17
17
-
});
15
15
+
let longBurst = new Uint8Array(200);
16
16
+
for (let i = 0; i < 200; i++) {
17
17
+
longBurst[i] = 0x61 + (i % 26);
18
18
+
}
18
19
19
19
-
bench("printable ASCII (single char)", () => {
20
20
+
let bench = withCodSpeed(new Bench());
21
21
+
22
22
+
bench
23
23
+
.add("printable ASCII (single char)", () => {
20
24
input.scan(bytes(0x61));
21
21
-
});
22
22
-
23
23
-
bench("printable ASCII (short string)", () => {
25
25
+
})
26
26
+
.add("printable ASCII (short string)", () => {
24
27
input.scan(str("hello world"));
25
25
-
});
26
26
-
27
27
-
bench("arrow key (CSI sequence)", () => {
28
28
+
})
29
29
+
.add("arrow key (CSI sequence)", () => {
28
30
input.scan(bytes(0x1b, 0x5b, 0x41));
29
29
-
});
30
30
-
31
31
-
bench("modifier combo (Ctrl+Shift+Arrow)", () => {
31
31
+
})
32
32
+
.add("modifier combo (Ctrl+Shift+Arrow)", () => {
32
33
input.scan(bytes(0x1b, 0x5b, 0x31, 0x3b, 0x38, 0x41));
33
33
-
});
34
34
-
35
35
-
bench("SGR mouse press", () => {
34
34
+
})
35
35
+
.add("SGR mouse press", () => {
36
36
input.scan(str("\x1b[<0;35;12M"));
37
37
-
});
38
38
-
39
39
-
bench("multi-event burst (arrows + text)", () => {
40
40
-
input.scan(
41
41
-
bytes(0x1b, 0x5b, 0x41, 0x1b, 0x5b, 0x42, 0x68, 0x69),
42
42
-
);
43
43
-
});
44
44
-
45
45
-
bench("UTF-8 3-byte character", () => {
37
37
+
})
38
38
+
.add("multi-event burst (arrows + text)", () => {
39
39
+
input.scan(bytes(0x1b, 0x5b, 0x41, 0x1b, 0x5b, 0x42, 0x68, 0x69));
40
40
+
})
41
41
+
.add("UTF-8 3-byte character", () => {
46
42
input.scan(bytes(0xe4, 0xb8, 0xad));
47
47
-
});
48
48
-
49
49
-
bench("UTF-8 4-byte emoji", () => {
43
43
+
})
44
44
+
.add("UTF-8 4-byte emoji", () => {
50
45
input.scan(bytes(0xf0, 0x9f, 0x8e, 0x89));
51
51
-
});
52
52
-
53
53
-
bench("Kitty protocol (CSI u with modifiers)", () => {
46
46
+
})
47
47
+
.add("Kitty protocol (CSI u with modifiers)", () => {
54
48
input.scan(str("\x1b[97;3u"));
49
49
+
})
50
50
+
.add("long input burst (200 bytes)", () => {
51
51
+
input.scan(longBurst);
55
52
});
56
53
57
57
-
let longBurst = new Uint8Array(200);
58
58
-
for (let i = 0; i < 200; i++) {
59
59
-
longBurst[i] = 0x61 + (i % 26);
60
60
-
}
61
61
-
62
62
-
bench("long input burst (200 bytes)", () => {
63
63
-
input.scan(longBurst);
64
64
-
});
65
65
-
});
54
54
+
await bench.run();
55
55
+
console.table(bench.table());
···
1
1
+
import "./input.bench.ts";
2
2
+
import "./render.bench.ts";
3
3
+
import "./ops.bench.ts";
···
1
1
-
import { bench, describe } from "vitest";
1
1
+
import { Bench } from "tinybench";
2
2
+
import { withCodSpeed } from "@codspeed/tinybench-plugin";
2
3
import { close, fixed, grow, open, pack, rgba, text } from "../ops.ts";
3
4
import type { Op } from "../ops.ts";
4
5
···
6
7
return new ArrayBuffer(size);
7
8
}
8
9
9
9
-
describe("pack", () => {
10
10
-
let simpleOps: Op[] = [
11
11
-
open("root", {
12
12
-
layout: { width: grow(), height: grow(), direction: "ttb" },
13
13
-
}),
14
14
-
text("Hello, World!"),
15
15
-
close(),
16
16
-
];
10
10
+
let simpleOps: Op[] = [
11
11
+
open("root", {
12
12
+
layout: { width: grow(), height: grow(), direction: "ttb" },
13
13
+
}),
14
14
+
text("Hello, World!"),
15
15
+
close(),
16
16
+
];
17
17
18
18
-
bench("simple tree (root + text)", () => {
19
19
-
let buf = makeBuf(4096);
20
20
-
pack(simpleOps, buf, 0);
21
21
-
});
18
18
+
let complexOps: Op[] = [
19
19
+
open("root", {
20
20
+
layout: { width: grow(), height: grow(), direction: "ttb" },
21
21
+
}),
22
22
+
open("header", {
23
23
+
layout: {
24
24
+
width: grow(),
25
25
+
height: fixed(3),
26
26
+
padding: { left: 1, right: 1 },
27
27
+
direction: "ltr",
28
28
+
},
29
29
+
bg: rgba(30, 30, 40),
30
30
+
border: {
31
31
+
color: rgba(100, 100, 120),
32
32
+
bottom: 1,
33
33
+
},
34
34
+
}),
35
35
+
text("Title", { color: rgba(255, 255, 255), fontSize: 1 }),
36
36
+
close(),
37
37
+
open("body", {
38
38
+
layout: {
39
39
+
width: grow(),
40
40
+
height: grow(),
41
41
+
direction: "ltr",
42
42
+
gap: 1,
43
43
+
},
44
44
+
}),
45
45
+
open("sidebar", {
46
46
+
layout: {
47
47
+
width: fixed(20),
48
48
+
height: grow(),
49
49
+
direction: "ttb",
50
50
+
padding: { left: 1, right: 1, top: 1 },
51
51
+
},
52
52
+
bg: rgba(25, 25, 35),
53
53
+
border: {
54
54
+
color: rgba(60, 60, 80),
55
55
+
right: 1,
56
56
+
},
57
57
+
}),
58
58
+
text("Menu Item 1"),
59
59
+
text("Menu Item 2"),
60
60
+
text("Menu Item 3"),
61
61
+
close(),
62
62
+
open("main", {
63
63
+
layout: {
64
64
+
width: grow(),
65
65
+
height: grow(),
66
66
+
direction: "ttb",
67
67
+
padding: { left: 2, top: 1 },
68
68
+
},
69
69
+
}),
70
70
+
text("Main content area with longer text to exercise the encoder"),
71
71
+
close(),
72
72
+
close(),
73
73
+
open("footer", {
74
74
+
layout: {
75
75
+
width: grow(),
76
76
+
height: fixed(1),
77
77
+
padding: { left: 1 },
78
78
+
direction: "ltr",
79
79
+
},
80
80
+
bg: rgba(30, 30, 40),
81
81
+
}),
82
82
+
text("Status: OK"),
83
83
+
close(),
84
84
+
close(),
85
85
+
];
22
86
23
23
-
let complexOps: Op[] = [
24
24
-
open("root", {
25
25
-
layout: { width: grow(), height: grow(), direction: "ttb" },
26
26
-
}),
27
27
-
open("header", {
28
28
-
layout: {
29
29
-
width: grow(),
30
30
-
height: fixed(3),
31
31
-
padding: { left: 1, right: 1 },
32
32
-
direction: "ltr",
33
33
-
},
34
34
-
bg: rgba(30, 30, 40),
35
35
-
border: {
36
36
-
color: rgba(100, 100, 120),
37
37
-
bottom: 1,
38
38
-
},
39
39
-
}),
40
40
-
text("Title", { color: rgba(255, 255, 255), fontSize: 1 }),
41
41
-
close(),
42
42
-
open("body", {
43
43
-
layout: {
44
44
-
width: grow(),
45
45
-
height: grow(),
46
46
-
direction: "ltr",
47
47
-
gap: 1,
48
48
-
},
49
49
-
}),
50
50
-
open("sidebar", {
51
51
-
layout: {
52
52
-
width: fixed(20),
53
53
-
height: grow(),
54
54
-
direction: "ttb",
55
55
-
padding: { left: 1, right: 1, top: 1 },
56
56
-
},
57
57
-
bg: rgba(25, 25, 35),
58
58
-
border: {
59
59
-
color: rgba(60, 60, 80),
60
60
-
right: 1,
61
61
-
},
62
62
-
}),
63
63
-
text("Menu Item 1"),
64
64
-
text("Menu Item 2"),
65
65
-
text("Menu Item 3"),
66
66
-
close(),
67
67
-
open("main", {
68
68
-
layout: {
69
69
-
width: grow(),
70
70
-
height: grow(),
71
71
-
direction: "ttb",
72
72
-
padding: { left: 2, top: 1 },
73
73
-
},
74
74
-
}),
75
75
-
text("Main content area with longer text to exercise the encoder"),
76
76
-
close(),
77
77
-
close(),
78
78
-
open("footer", {
87
87
+
let listOps: Op[] = [
88
88
+
open("root", {
89
89
+
layout: { width: grow(), height: grow(), direction: "ttb" },
90
90
+
}),
91
91
+
...Array.from({ length: 50 }, (_, i) => [
92
92
+
open(`item-${i}`, {
79
93
layout: {
80
94
width: grow(),
81
95
height: fixed(1),
82
82
-
padding: { left: 1 },
96
96
+
padding: { left: 2 },
83
97
direction: "ltr",
84
98
},
85
85
-
bg: rgba(30, 30, 40),
99
99
+
bg: i % 2 === 0 ? rgba(30, 30, 40) : rgba(35, 35, 45),
86
100
}),
87
87
-
text("Status: OK"),
101
101
+
text(`List item ${i}: some description text`),
88
102
close(),
89
89
-
close(),
90
90
-
];
103
103
+
]).flat(),
104
104
+
close(),
105
105
+
];
106
106
+
107
107
+
let bench = withCodSpeed(new Bench());
91
108
92
92
-
bench("complex layout (header + sidebar + main + footer)", () => {
109
109
+
bench
110
110
+
.add("simple tree (root + text)", () => {
111
111
+
let buf = makeBuf(4096);
112
112
+
pack(simpleOps, buf, 0);
113
113
+
})
114
114
+
.add("complex layout (header + sidebar + main + footer)", () => {
93
115
let buf = makeBuf(8192);
94
116
pack(complexOps, buf, 0);
95
95
-
});
96
96
-
97
97
-
let listOps: Op[] = [
98
98
-
open("root", {
99
99
-
layout: { width: grow(), height: grow(), direction: "ttb" },
100
100
-
}),
101
101
-
...Array.from({ length: 50 }, (_, i) => [
102
102
-
open(`item-${i}`, {
103
103
-
layout: {
104
104
-
width: grow(),
105
105
-
height: fixed(1),
106
106
-
padding: { left: 2 },
107
107
-
direction: "ltr",
108
108
-
},
109
109
-
bg: i % 2 === 0 ? rgba(30, 30, 40) : rgba(35, 35, 45),
110
110
-
}),
111
111
-
text(`List item ${i}: some description text`),
112
112
-
close(),
113
113
-
]).flat(),
114
114
-
close(),
115
115
-
];
116
116
-
117
117
-
bench("large list (50 items)", () => {
117
117
+
})
118
118
+
.add("large list (50 items)", () => {
118
119
let buf = makeBuf(32768);
119
120
pack(listOps, buf, 0);
120
121
});
121
121
-
});
122
122
+
123
123
+
await bench.run();
124
124
+
console.table(bench.table());
···
1
1
-
import { beforeAll, bench, describe } from "vitest";
2
2
-
import { createTerm, type Term } from "../term.ts";
1
1
+
import { Bench } from "tinybench";
2
2
+
import { withCodSpeed } from "@codspeed/tinybench-plugin";
3
3
+
import { createTerm } from "../term.ts";
3
4
import { close, fixed, grow, open, rgba, text } from "../ops.ts";
4
5
import type { Op } from "../ops.ts";
5
6
6
6
-
describe("render", () => {
7
7
-
let term: Term;
7
7
+
let term = await createTerm({ width: 80, height: 24 });
8
8
+
let termPtr = await createTerm({ width: 80, height: 24 });
8
9
9
9
-
beforeAll(async () => {
10
10
-
term = await createTerm({ width: 80, height: 24 });
11
11
-
});
10
10
+
let helloOps: Op[] = [
11
11
+
open("root", {
12
12
+
layout: { width: grow(), height: grow(), direction: "ttb" },
13
13
+
}),
14
14
+
text("Hello, World!"),
15
15
+
close(),
16
16
+
];
12
17
13
13
-
let helloOps: Op[] = [
14
14
-
open("root", {
15
15
-
layout: { width: grow(), height: grow(), direction: "ttb" },
16
16
-
}),
17
17
-
text("Hello, World!"),
18
18
-
close(),
19
19
-
];
18
18
+
let borderedOps: Op[] = [
19
19
+
open("root", {
20
20
+
layout: { width: grow(), height: grow(), direction: "ttb" },
21
21
+
}),
22
22
+
open("box", {
23
23
+
layout: {
24
24
+
width: grow(),
25
25
+
height: grow(),
26
26
+
padding: { left: 1, right: 1, top: 1, bottom: 1 },
27
27
+
direction: "ttb",
28
28
+
},
29
29
+
border: {
30
30
+
color: rgba(0, 255, 0),
31
31
+
left: 1,
32
32
+
right: 1,
33
33
+
top: 1,
34
34
+
bottom: 1,
35
35
+
},
36
36
+
cornerRadius: { tl: 1, tr: 1, bl: 1, br: 1 },
37
37
+
}),
38
38
+
text("Bordered content"),
39
39
+
close(),
40
40
+
close(),
41
41
+
];
20
42
21
21
-
bench("simple text", () => {
22
22
-
term.render(helloOps);
23
23
-
});
24
24
-
25
25
-
let borderedOps: Op[] = [
26
26
-
open("root", {
27
27
-
layout: { width: grow(), height: grow(), direction: "ttb" },
28
28
-
}),
29
29
-
open("box", {
43
43
+
let dashboardOps: Op[] = [
44
44
+
open("root", {
45
45
+
layout: { width: grow(), height: grow(), direction: "ttb" },
46
46
+
}),
47
47
+
open("header", {
48
48
+
layout: {
49
49
+
width: grow(),
50
50
+
height: fixed(3),
51
51
+
padding: { left: 1 },
52
52
+
direction: "ltr",
53
53
+
},
54
54
+
bg: rgba(30, 30, 40),
55
55
+
border: { color: rgba(80, 80, 100), bottom: 1 },
56
56
+
}),
57
57
+
text("Dashboard", { color: rgba(255, 255, 255) }),
58
58
+
close(),
59
59
+
open("body", {
60
60
+
layout: { width: grow(), height: grow(), direction: "ltr" },
61
61
+
}),
62
62
+
open("sidebar", {
63
63
+
layout: {
64
64
+
width: fixed(20),
65
65
+
height: grow(),
66
66
+
direction: "ttb",
67
67
+
padding: { left: 1, top: 1 },
68
68
+
},
69
69
+
bg: rgba(25, 25, 35),
70
70
+
border: { color: rgba(60, 60, 80), right: 1 },
71
71
+
}),
72
72
+
text("Nav 1"),
73
73
+
text("Nav 2"),
74
74
+
text("Nav 3"),
75
75
+
text("Nav 4"),
76
76
+
close(),
77
77
+
open("main", {
78
78
+
layout: {
79
79
+
width: grow(),
80
80
+
height: grow(),
81
81
+
direction: "ttb",
82
82
+
padding: { left: 2, top: 1 },
83
83
+
},
84
84
+
}),
85
85
+
...Array.from({ length: 10 }, (_, i) => [
86
86
+
open(`row-${i}`, {
30
87
layout: {
31
88
width: grow(),
32
32
-
height: grow(),
33
33
-
padding: { left: 1, right: 1, top: 1, bottom: 1 },
34
34
-
direction: "ttb",
35
35
-
},
36
36
-
border: {
37
37
-
color: rgba(0, 255, 0),
38
38
-
left: 1,
39
39
-
right: 1,
40
40
-
top: 1,
41
41
-
bottom: 1,
89
89
+
height: fixed(1),
90
90
+
direction: "ltr",
42
91
},
43
43
-
cornerRadius: { tl: 1, tr: 1, bl: 1, br: 1 },
92
92
+
bg: i % 2 === 0 ? rgba(35, 35, 45) : undefined,
44
93
}),
45
45
-
text("Bordered content"),
94
94
+
text(`Row ${i}: data value ${i * 42}`),
46
95
close(),
47
47
-
close(),
48
48
-
];
96
96
+
]).flat(),
97
97
+
close(),
98
98
+
close(),
99
99
+
open("footer", {
100
100
+
layout: {
101
101
+
width: grow(),
102
102
+
height: fixed(1),
103
103
+
padding: { left: 1 },
104
104
+
},
105
105
+
bg: rgba(30, 30, 40),
106
106
+
}),
107
107
+
text("Ready"),
108
108
+
close(),
109
109
+
close(),
110
110
+
];
49
111
50
50
-
bench("bordered box with corner radius", () => {
51
51
-
term.render(borderedOps);
52
52
-
});
112
112
+
let uiOps: Op[] = [
113
113
+
open("root", {
114
114
+
layout: { width: grow(), height: grow(), direction: "ttb" },
115
115
+
}),
116
116
+
open("button", {
117
117
+
layout: {
118
118
+
width: fixed(20),
119
119
+
height: fixed(3),
120
120
+
padding: { left: 1, right: 1 },
121
121
+
},
122
122
+
bg: rgba(50, 50, 200),
123
123
+
border: {
124
124
+
color: rgba(100, 100, 255),
125
125
+
left: 1,
126
126
+
right: 1,
127
127
+
top: 1,
128
128
+
bottom: 1,
129
129
+
},
130
130
+
cornerRadius: { tl: 1, tr: 1, bl: 1, br: 1 },
131
131
+
}),
132
132
+
text("Click me"),
133
133
+
close(),
134
134
+
close(),
135
135
+
];
53
136
54
54
-
let dashboardOps: Op[] = [
55
55
-
open("root", {
56
56
-
layout: { width: grow(), height: grow(), direction: "ttb" },
57
57
-
}),
58
58
-
open("header", {
59
59
-
layout: {
60
60
-
width: grow(),
61
61
-
height: fixed(3),
62
62
-
padding: { left: 1 },
63
63
-
direction: "ltr",
64
64
-
},
65
65
-
bg: rgba(30, 30, 40),
66
66
-
border: { color: rgba(80, 80, 100), bottom: 1 },
67
67
-
}),
68
68
-
text("Dashboard", { color: rgba(255, 255, 255) }),
69
69
-
close(),
70
70
-
open("body", {
71
71
-
layout: { width: grow(), height: grow(), direction: "ltr" },
72
72
-
}),
73
73
-
open("sidebar", {
74
74
-
layout: {
75
75
-
width: fixed(20),
76
76
-
height: grow(),
77
77
-
direction: "ttb",
78
78
-
padding: { left: 1, top: 1 },
79
79
-
},
80
80
-
bg: rgba(25, 25, 35),
81
81
-
border: { color: rgba(60, 60, 80), right: 1 },
82
82
-
}),
83
83
-
text("Nav 1"),
84
84
-
text("Nav 2"),
85
85
-
text("Nav 3"),
86
86
-
text("Nav 4"),
87
87
-
close(),
88
88
-
open("main", {
89
89
-
layout: {
90
90
-
width: grow(),
91
91
-
height: grow(),
92
92
-
direction: "ttb",
93
93
-
padding: { left: 2, top: 1 },
94
94
-
},
95
95
-
}),
96
96
-
...Array.from({ length: 10 }, (_, i) => [
97
97
-
open(`row-${i}`, {
98
98
-
layout: {
99
99
-
width: grow(),
100
100
-
height: fixed(1),
101
101
-
direction: "ltr",
102
102
-
},
103
103
-
bg: i % 2 === 0 ? rgba(35, 35, 45) : undefined,
104
104
-
}),
105
105
-
text(`Row ${i}: data value ${i * 42}`),
106
106
-
close(),
107
107
-
]).flat(),
108
108
-
close(),
109
109
-
close(),
110
110
-
open("footer", {
111
111
-
layout: {
112
112
-
width: grow(),
113
113
-
height: fixed(1),
114
114
-
padding: { left: 1 },
115
115
-
},
116
116
-
bg: rgba(30, 30, 40),
117
117
-
}),
118
118
-
text("Ready"),
119
119
-
close(),
120
120
-
close(),
121
121
-
];
137
137
+
let bench = withCodSpeed(new Bench());
122
138
123
123
-
bench("dashboard layout", () => {
139
139
+
bench
140
140
+
.add("simple text", () => {
141
141
+
term.render(helloOps);
142
142
+
})
143
143
+
.add("bordered box with corner radius", () => {
144
144
+
term.render(borderedOps);
145
145
+
})
146
146
+
.add("dashboard layout", () => {
124
147
term.render(dashboardOps);
125
125
-
});
126
126
-
127
127
-
bench("diff render (second frame)", () => {
128
128
-
// First render populates the front buffer
148
148
+
})
149
149
+
.add("diff render (second frame)", () => {
129
150
term.render(dashboardOps);
130
130
-
// Second render exercises the diff path
131
151
term.render(dashboardOps);
132
132
-
});
133
133
-
});
134
134
-
135
135
-
describe("render with pointer", () => {
136
136
-
let term: Term;
137
137
-
138
138
-
beforeAll(async () => {
139
139
-
term = await createTerm({ width: 80, height: 24 });
152
152
+
})
153
153
+
.add("render with pointer hit testing", () => {
154
154
+
termPtr.render(uiOps, { pointer: { x: 10, y: 1, down: false } });
140
155
});
141
156
142
142
-
let uiOps: Op[] = [
143
143
-
open("root", {
144
144
-
layout: { width: grow(), height: grow(), direction: "ttb" },
145
145
-
}),
146
146
-
open("button", {
147
147
-
layout: {
148
148
-
width: fixed(20),
149
149
-
height: fixed(3),
150
150
-
padding: { left: 1, right: 1 },
151
151
-
},
152
152
-
bg: rgba(50, 50, 200),
153
153
-
border: {
154
154
-
color: rgba(100, 100, 255),
155
155
-
left: 1,
156
156
-
right: 1,
157
157
-
top: 1,
158
158
-
bottom: 1,
159
159
-
},
160
160
-
cornerRadius: { tl: 1, tr: 1, bl: 1, br: 1 },
161
161
-
}),
162
162
-
text("Click me"),
163
163
-
close(),
164
164
-
close(),
165
165
-
];
166
166
-
167
167
-
bench("render with pointer hit testing", () => {
168
168
-
term.render(uiOps, { pointer: { x: 10, y: 1, down: false } });
169
169
-
});
170
170
-
});
157
157
+
await bench.run();
158
158
+
console.table(bench.table());
···
8
8
"build:npm": "deno run -A tasks/build-npm.ts",
9
9
"build:jsr": "deno run -A tasks/build-jsr.ts",
10
10
"demo": "deno run demo/keyboard.ts",
11
11
-
"bench": "deno run -A npm:vitest bench --run"
11
11
+
"bench": "deno run -A bench/mod.ts"
12
12
},
13
13
"imports": {
14
14
"@std/testing": "jsr:@std/testing@1",
···
17
17
"dnt": "jsr:@deno/dnt@0.42.3",
18
18
"effection": "npm:effection@^4.0.2",
19
19
"@std/encoding": "jsr:@std/encoding@1",
20
20
-
"@codspeed/vitest-plugin": "npm:@codspeed/vitest-plugin@^5.4.0",
21
21
-
"vitest": "npm:vitest@^4.1.7"
20
20
+
"@codspeed/tinybench-plugin": "npm:@codspeed/tinybench-plugin@^5.4.0",
21
21
+
"tinybench": "npm:tinybench@^6.0.2"
22
22
},
23
23
"exports": {
24
24
".": "./mod.ts",
···
20
20
"jsr:@std/testing@1": "1.0.17",
21
21
"jsr:@ts-morph/bootstrap@0.27": "0.27.0",
22
22
"jsr:@ts-morph/common@0.27": "0.27.0",
23
23
-
"npm:@codspeed/vitest-plugin@^5.4.0": "5.4.0_tinybench@2.9.0_vite@7.3.3_vitest@4.1.7__vite@7.3.3",
23
23
+
"npm:@codspeed/tinybench-plugin@^5.4.0": "5.4.0_tinybench@6.0.2",
24
24
"npm:@sinclair/typebox@*": "0.34.48",
25
25
"npm:@sinclair/typebox@0.34": "0.34.48",
26
26
"npm:effection@^4.0.2": "4.0.2",
27
27
-
"npm:valrs@*": "0.1.0",
28
28
-
"npm:vitest@^4.1.7": "4.1.7_vite@7.3.3"
27
27
+
"npm:tinybench@^6.0.2": "6.0.2",
28
28
+
"npm:valrs@*": "0.1.0"
29
29
},
30
30
"jsr": {
31
31
"@david/code-block-writer@13.0.3": {
···
120
120
"node-gyp-build"
121
121
]
122
122
},
123
123
-
"@codspeed/vitest-plugin@5.4.0_tinybench@2.9.0_vite@7.3.3_vitest@4.1.7__vite@7.3.3": {
124
124
-
"integrity": "sha512-Xa9HaZHUjYXn1T39bTipV5hmguk1vIuDZs3Gc5OYA8X4ohftYbKfyoFtBqVFfB/ii/p1ihuwt+tltraKMcRDsA==",
123
123
+
"@codspeed/tinybench-plugin@5.4.0_tinybench@6.0.2": {
124
124
+
"integrity": "sha512-jzuFoyyoGxc3Lc+TTl54PnRsgqO3CYbbbnwYSVp/m/4rqvCwSUZChY9EuQJ6uZFbamT3UhWF2N6tDEGShkvsrw==",
125
125
"dependencies": [
126
126
"@codspeed/core",
127
127
-
"tinybench",
128
128
-
"vite",
129
129
-
"vitest"
127
127
+
"stack-trace",
128
128
+
"tinybench"
130
129
]
131
130
},
132
132
-
"@esbuild/aix-ppc64@0.27.7": {
133
133
-
"integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==",
134
134
-
"os": ["aix"],
135
135
-
"cpu": ["ppc64"]
136
136
-
},
137
137
-
"@esbuild/android-arm64@0.27.7": {
138
138
-
"integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==",
139
139
-
"os": ["android"],
140
140
-
"cpu": ["arm64"]
141
141
-
},
142
142
-
"@esbuild/android-arm@0.27.7": {
143
143
-
"integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==",
144
144
-
"os": ["android"],
145
145
-
"cpu": ["arm"]
146
146
-
},
147
147
-
"@esbuild/android-x64@0.27.7": {
148
148
-
"integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==",
149
149
-
"os": ["android"],
150
150
-
"cpu": ["x64"]
151
151
-
},
152
152
-
"@esbuild/darwin-arm64@0.27.7": {
153
153
-
"integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==",
154
154
-
"os": ["darwin"],
155
155
-
"cpu": ["arm64"]
156
156
-
},
157
157
-
"@esbuild/darwin-x64@0.27.7": {
158
158
-
"integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==",
159
159
-
"os": ["darwin"],
160
160
-
"cpu": ["x64"]
161
161
-
},
162
162
-
"@esbuild/freebsd-arm64@0.27.7": {
163
163
-
"integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==",
164
164
-
"os": ["freebsd"],
165
165
-
"cpu": ["arm64"]
166
166
-
},
167
167
-
"@esbuild/freebsd-x64@0.27.7": {
168
168
-
"integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==",
169
169
-
"os": ["freebsd"],
170
170
-
"cpu": ["x64"]
171
171
-
},
172
172
-
"@esbuild/linux-arm64@0.27.7": {
173
173
-
"integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==",
174
174
-
"os": ["linux"],
175
175
-
"cpu": ["arm64"]
176
176
-
},
177
177
-
"@esbuild/linux-arm@0.27.7": {
178
178
-
"integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==",
179
179
-
"os": ["linux"],
180
180
-
"cpu": ["arm"]
181
181
-
},
182
182
-
"@esbuild/linux-ia32@0.27.7": {
183
183
-
"integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==",
184
184
-
"os": ["linux"],
185
185
-
"cpu": ["ia32"]
186
186
-
},
187
187
-
"@esbuild/linux-loong64@0.27.7": {
188
188
-
"integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==",
189
189
-
"os": ["linux"],
190
190
-
"cpu": ["loong64"]
191
191
-
},
192
192
-
"@esbuild/linux-mips64el@0.27.7": {
193
193
-
"integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==",
194
194
-
"os": ["linux"],
195
195
-
"cpu": ["mips64el"]
196
196
-
},
197
197
-
"@esbuild/linux-ppc64@0.27.7": {
198
198
-
"integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==",
199
199
-
"os": ["linux"],
200
200
-
"cpu": ["ppc64"]
201
201
-
},
202
202
-
"@esbuild/linux-riscv64@0.27.7": {
203
203
-
"integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==",
204
204
-
"os": ["linux"],
205
205
-
"cpu": ["riscv64"]
206
206
-
},
207
207
-
"@esbuild/linux-s390x@0.27.7": {
208
208
-
"integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==",
209
209
-
"os": ["linux"],
210
210
-
"cpu": ["s390x"]
211
211
-
},
212
212
-
"@esbuild/linux-x64@0.27.7": {
213
213
-
"integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==",
214
214
-
"os": ["linux"],
215
215
-
"cpu": ["x64"]
216
216
-
},
217
217
-
"@esbuild/netbsd-arm64@0.27.7": {
218
218
-
"integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==",
219
219
-
"os": ["netbsd"],
220
220
-
"cpu": ["arm64"]
221
221
-
},
222
222
-
"@esbuild/netbsd-x64@0.27.7": {
223
223
-
"integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==",
224
224
-
"os": ["netbsd"],
225
225
-
"cpu": ["x64"]
226
226
-
},
227
227
-
"@esbuild/openbsd-arm64@0.27.7": {
228
228
-
"integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==",
229
229
-
"os": ["openbsd"],
230
230
-
"cpu": ["arm64"]
231
231
-
},
232
232
-
"@esbuild/openbsd-x64@0.27.7": {
233
233
-
"integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==",
234
234
-
"os": ["openbsd"],
235
235
-
"cpu": ["x64"]
236
236
-
},
237
237
-
"@esbuild/openharmony-arm64@0.27.7": {
238
238
-
"integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==",
239
239
-
"os": ["openharmony"],
240
240
-
"cpu": ["arm64"]
241
241
-
},
242
242
-
"@esbuild/sunos-x64@0.27.7": {
243
243
-
"integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==",
244
244
-
"os": ["sunos"],
245
245
-
"cpu": ["x64"]
246
246
-
},
247
247
-
"@esbuild/win32-arm64@0.27.7": {
248
248
-
"integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==",
249
249
-
"os": ["win32"],
250
250
-
"cpu": ["arm64"]
251
251
-
},
252
252
-
"@esbuild/win32-ia32@0.27.7": {
253
253
-
"integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==",
254
254
-
"os": ["win32"],
255
255
-
"cpu": ["ia32"]
256
256
-
},
257
257
-
"@esbuild/win32-x64@0.27.7": {
258
258
-
"integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==",
259
259
-
"os": ["win32"],
260
260
-
"cpu": ["x64"]
261
261
-
},
262
262
-
"@jridgewell/sourcemap-codec@1.5.5": {
263
263
-
"integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="
264
264
-
},
265
265
-
"@rollup/rollup-android-arm-eabi@4.60.4": {
266
266
-
"integrity": "sha512-F5QXMSiFebS9hKZj02XhWLLnRpJ3B3AROP0tWbFBSj+6kCbg5m9j5JoHKd4mmSVy5mS/IMQloYgYxCuJC0fxEQ==",
267
267
-
"os": ["android"],
268
268
-
"cpu": ["arm"]
269
269
-
},
270
270
-
"@rollup/rollup-android-arm64@4.60.4": {
271
271
-
"integrity": "sha512-GxxTKApUpzRhof7poWvCJHRF51C67u1R7D6DiluBE8wKU1u5GWE8t+v81JvJYtbawoBFX1hLv5Ei4eVjkWokaw==",
272
272
-
"os": ["android"],
273
273
-
"cpu": ["arm64"]
274
274
-
},
275
275
-
"@rollup/rollup-darwin-arm64@4.60.4": {
276
276
-
"integrity": "sha512-tua0TaJxMOB1R0V0RS1jFZ/RpURFDJIOR2A6jWwQeawuFyS4gBW+rntLRaQd0EQ4bd6Vp44Z2rXW+YYDBsj6IA==",
277
277
-
"os": ["darwin"],
278
278
-
"cpu": ["arm64"]
279
279
-
},
280
280
-
"@rollup/rollup-darwin-x64@4.60.4": {
281
281
-
"integrity": "sha512-CSKq7MsP+5PFIcydhAiR1K0UhEI1A2jWXVKHPCBZ151yOutENwvnPocgVHkivu2kviURtCEB6zUQw0vs8RrhMg==",
282
282
-
"os": ["darwin"],
283
283
-
"cpu": ["x64"]
284
284
-
},
285
285
-
"@rollup/rollup-freebsd-arm64@4.60.4": {
286
286
-
"integrity": "sha512-+O8OkVdyvXMtJEciu2wS/pzm1IxntEEQx3z5TAVy4l32G0etZn+RsA48ARRrFm6Ri8fvqPQfgrvNxSjKAbnd3g==",
287
287
-
"os": ["freebsd"],
288
288
-
"cpu": ["arm64"]
289
289
-
},
290
290
-
"@rollup/rollup-freebsd-x64@4.60.4": {
291
291
-
"integrity": "sha512-Iw3oMskH3AfNuhU0MSN7vNbdi4me/NiYo2azqPz/Le16zHSa+3RRmliCMWWQmh4lcndccU40xcJuTYJZxNo/lw==",
292
292
-
"os": ["freebsd"],
293
293
-
"cpu": ["x64"]
294
294
-
},
295
295
-
"@rollup/rollup-linux-arm-gnueabihf@4.60.4": {
296
296
-
"integrity": "sha512-EIPRXTVQpHyF8WOo219AD2yEltPehLTcTMz2fn6JsatLYSzQf00hj3rulF+yauOlF9/FtM2WpkT/hJh/KJFGhA==",
297
297
-
"os": ["linux"],
298
298
-
"cpu": ["arm"]
299
299
-
},
300
300
-
"@rollup/rollup-linux-arm-musleabihf@4.60.4": {
301
301
-
"integrity": "sha512-J3Yh9PzzF1Ovah2At+lHiGQdsYgArxBbXv/zHfSyaiFQEqvNv7DcW98pCrmdjCZBrqBiKrKKe2V+aaSGWuBe/w==",
302
302
-
"os": ["linux"],
303
303
-
"cpu": ["arm"]
304
304
-
},
305
305
-
"@rollup/rollup-linux-arm64-gnu@4.60.4": {
306
306
-
"integrity": "sha512-BFDEZMYfUvLn37ONE1yMBojPxnMlTFsdyNoqncT0qFq1mAfllL+ATMMJd8TeuVMiX84s1KbcxcZbXInmcO2mRg==",
307
307
-
"os": ["linux"],
308
308
-
"cpu": ["arm64"]
309
309
-
},
310
310
-
"@rollup/rollup-linux-arm64-musl@4.60.4": {
311
311
-
"integrity": "sha512-pc9EYOSlOgdQ2uPl1o9PF6/kLSgaUosia7gOuS8mB69IxJvlclko1MECXysjs5ryez1/5zjYqx3+xYU0TU6R1A==",
312
312
-
"os": ["linux"],
313
313
-
"cpu": ["arm64"]
314
314
-
},
315
315
-
"@rollup/rollup-linux-loong64-gnu@4.60.4": {
316
316
-
"integrity": "sha512-NxnomyxYerDh5n4iLrNa+sH+Z+U4BMEE46V2PgQ/hoB909i8gV1M5wPojWg9fk1jWpO3IQnOs20K4wyZuFLEFQ==",
317
317
-
"os": ["linux"],
318
318
-
"cpu": ["loong64"]
319
319
-
},
320
320
-
"@rollup/rollup-linux-loong64-musl@4.60.4": {
321
321
-
"integrity": "sha512-nbJnQ8a3z1mtmrwImCYhc6BGpThAyYVRQxw9uKSKG4wR6aAYno9sVjJ0zaZcW9BPJX1GbrDPf+SvdWjgTuDmnw==",
322
322
-
"os": ["linux"],
323
323
-
"cpu": ["loong64"]
324
324
-
},
325
325
-
"@rollup/rollup-linux-ppc64-gnu@4.60.4": {
326
326
-
"integrity": "sha512-2EU6acNrQLd8tYvo/LXW535wupT3m6fo7HKo6lr7ktQoItxTyOL1ZCR/GfGCuXl2vR+zmfI6eRXkSemafv+iVg==",
327
327
-
"os": ["linux"],
328
328
-
"cpu": ["ppc64"]
329
329
-
},
330
330
-
"@rollup/rollup-linux-ppc64-musl@4.60.4": {
331
331
-
"integrity": "sha512-WeBtoMuaMxiiIrO2IYP3xs6GMWkJP2C0EoT8beTLkUPmzV1i/UcOSVw1d5r9KBODtHKilG5yFxsGRnBbK3wJ4A==",
332
332
-
"os": ["linux"],
333
333
-
"cpu": ["ppc64"]
334
334
-
},
335
335
-
"@rollup/rollup-linux-riscv64-gnu@4.60.4": {
336
336
-
"integrity": "sha512-FJHFfqpKUI3A10WrWKiFbBZ7yVbGT4q4B5o1qKFFojqpaYoh9LrQgqWCmmcxQzVSXYtyB5bzkXrYzlHTs21MYA==",
337
337
-
"os": ["linux"],
338
338
-
"cpu": ["riscv64"]
339
339
-
},
340
340
-
"@rollup/rollup-linux-riscv64-musl@4.60.4": {
341
341
-
"integrity": "sha512-mcEl6CUT5IAUmQf1m9FYSmVqCJlpQ8r8eyftFUHG8i9OhY7BkBXSUdnLH5DOf0wCOjcP9v/QO93zpmF1SptCCw==",
342
342
-
"os": ["linux"],
343
343
-
"cpu": ["riscv64"]
344
344
-
},
345
345
-
"@rollup/rollup-linux-s390x-gnu@4.60.4": {
346
346
-
"integrity": "sha512-ynt3JxVd2w2buzoKDWIyiV1pJW93xlQic1THVLXilz429oijRpSHivZAgp65KBu+cMcgf1eVVjdnTLvPxgCuoQ==",
347
347
-
"os": ["linux"],
348
348
-
"cpu": ["s390x"]
349
349
-
},
350
350
-
"@rollup/rollup-linux-x64-gnu@4.60.4": {
351
351
-
"integrity": "sha512-Boiz5+MsaROEWDf+GGEwF8VMHGhlUoQMtIPjOgA5fv4osupqTVnJteQNKJwUcnUog2G55jYXH7KZFFiJe0TEzQ==",
352
352
-
"os": ["linux"],
353
353
-
"cpu": ["x64"]
354
354
-
},
355
355
-
"@rollup/rollup-linux-x64-musl@4.60.4": {
356
356
-
"integrity": "sha512-+qfSY27qIrFfI/Hom04KYFw3GKZSGU4lXus51wsb5EuySfFlWRwjkKWoE9emgRw/ukoT4Udsj4W/+xxG8VbPKg==",
357
357
-
"os": ["linux"],
358
358
-
"cpu": ["x64"]
359
359
-
},
360
360
-
"@rollup/rollup-openbsd-x64@4.60.4": {
361
361
-
"integrity": "sha512-VpTfOPHgVXEBeeR8hZ2O0F3aSso+JDWqTWmTmzcQKted54IAdUVbxE+j/MVxUsKa8L20HJhv3vUezVPoquqWjA==",
362
362
-
"os": ["openbsd"],
363
363
-
"cpu": ["x64"]
364
364
-
},
365
365
-
"@rollup/rollup-openharmony-arm64@4.60.4": {
366
366
-
"integrity": "sha512-IPOsh5aRYuLv/nkU51X10Bf75Bsf6+gZdx1X+QP5QM6lIJFHHqbHLG0uJn/hWthzo13UAc2umiUorqZy3axoZg==",
367
367
-
"os": ["openharmony"],
368
368
-
"cpu": ["arm64"]
369
369
-
},
370
370
-
"@rollup/rollup-win32-arm64-msvc@4.60.4": {
371
371
-
"integrity": "sha512-4QzE9E81OohJ/HKzHhsqU+zcYYojVOXlFMs1DdyMT6qXl/niOH7AVElmmEdUNHHS/oRkc++d5k6Vy85zFs0DEw==",
372
372
-
"os": ["win32"],
373
373
-
"cpu": ["arm64"]
374
374
-
},
375
375
-
"@rollup/rollup-win32-ia32-msvc@4.60.4": {
376
376
-
"integrity": "sha512-zTPgT1YuHHcd+Tmx7h8aml0FWFVelV5N54oHow9SLj+GfoDy/huQ+UV396N/C7KpMDMiPspRktzM1/0r1usYEA==",
377
377
-
"os": ["win32"],
378
378
-
"cpu": ["ia32"]
379
379
-
},
380
380
-
"@rollup/rollup-win32-x64-gnu@4.60.4": {
381
381
-
"integrity": "sha512-DRS4G7mi9lJxqEDezIkKCaUIKCrLUUDCUaCsTPCi/rtqaC6D/jjwslMQyiDU50Ka0JKpeXeRBFBAXwArY52vBw==",
382
382
-
"os": ["win32"],
383
383
-
"cpu": ["x64"]
384
384
-
},
385
385
-
"@rollup/rollup-win32-x64-msvc@4.60.4": {
386
386
-
"integrity": "sha512-QVTUovf40zgTqlFVrKA1uXMVvU2QWEFWfAH8Wdc48IxLvrJMQVMBRjuQyUpzZCDkakImib9eVazbWlC6ksWtJw==",
387
387
-
"os": ["win32"],
388
388
-
"cpu": ["x64"]
389
389
-
},
390
131
"@sinclair/typebox@0.34.48": {
391
132
"integrity": "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA=="
392
133
},
393
393
-
"@standard-schema/spec@1.1.0": {
394
394
-
"integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="
395
395
-
},
396
396
-
"@types/chai@5.2.3": {
397
397
-
"integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==",
398
398
-
"dependencies": [
399
399
-
"@types/deep-eql",
400
400
-
"assertion-error"
401
401
-
]
402
402
-
},
403
403
-
"@types/deep-eql@4.0.2": {
404
404
-
"integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw=="
405
405
-
},
406
406
-
"@types/estree@1.0.8": {
407
407
-
"integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="
408
408
-
},
409
409
-
"@vitest/expect@4.1.7": {
410
410
-
"integrity": "sha512-1R+tw0ortHEbZDGMymm+pN7/AFQ/RkFFdtd7EN+VBpynKmLbP8A3rpEXdshBJ7+8hQ9zBJh/i1s0yKNtxAnU7w==",
411
411
-
"dependencies": [
412
412
-
"@standard-schema/spec",
413
413
-
"@types/chai",
414
414
-
"@vitest/spy",
415
415
-
"@vitest/utils",
416
416
-
"chai",
417
417
-
"tinyrainbow"
418
418
-
]
419
419
-
},
420
420
-
"@vitest/mocker@4.1.7_vite@7.3.3": {
421
421
-
"integrity": "sha512-vY7nuamKgfvpA1Koa3oYIw/k7D6kZnpGyNMZW8loow2bsBYla1TFdqTaXncWdRn4pgwNs+90RhnXhJScDwQeJA==",
422
422
-
"dependencies": [
423
423
-
"@vitest/spy",
424
424
-
"estree-walker",
425
425
-
"magic-string",
426
426
-
"vite"
427
427
-
],
428
428
-
"optionalPeers": [
429
429
-
"vite"
430
430
-
]
431
431
-
},
432
432
-
"@vitest/pretty-format@4.1.7": {
433
433
-
"integrity": "sha512-umgCarTOYQWIaDMvGDRZij+6b9oVeLIyJzfN+AS88e0ZOU3QTgNNSTtjQOpcvWr3np1N0j4WgZj+sb3oYBDscw==",
434
434
-
"dependencies": [
435
435
-
"tinyrainbow"
436
436
-
]
437
437
-
},
438
438
-
"@vitest/runner@4.1.7": {
439
439
-
"integrity": "sha512-BapjmAQ2aI78WdMEfeUWivnfVzB+VPGwWRQcJE0OUq7qEeEcBsCSf+0T5iREBNE5nBb4wA5Ya0W6IA+sghdEFw==",
440
440
-
"dependencies": [
441
441
-
"@vitest/utils",
442
442
-
"pathe"
443
443
-
]
444
444
-
},
445
445
-
"@vitest/snapshot@4.1.7": {
446
446
-
"integrity": "sha512-ZacLzja+TmJeZ1h14xW2FB/WpeimUD3haBXQPyJqxvo8jQTmfeA8zv58mtjN2C7EHXZDYVcVYdYmAxjkWVvKCw==",
447
447
-
"dependencies": [
448
448
-
"@vitest/pretty-format",
449
449
-
"@vitest/utils",
450
450
-
"magic-string",
451
451
-
"pathe"
452
452
-
]
453
453
-
},
454
454
-
"@vitest/spy@4.1.7": {
455
455
-
"integrity": "sha512-kbkI5LMWakyuTIvs6fUJ5qdIVb1XVKsYJAT4OJ938cHMROYMSfmoQdZy0aaAnjbbc8F61vkoTqz/Az+/HiIu5Q=="
456
456
-
},
457
457
-
"@vitest/utils@4.1.7": {
458
458
-
"integrity": "sha512-T532WBu791cBxJlCl6SO+J14l81DQx6uQHm1bQbmCDY7nqlEIgkza/UFnSBNaUtSf41unldDFjdOBYEQC4b5Hw==",
459
459
-
"dependencies": [
460
460
-
"@vitest/pretty-format",
461
461
-
"convert-source-map",
462
462
-
"tinyrainbow"
463
463
-
]
464
464
-
},
465
134
"agent-base@6.0.2": {
466
135
"integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
467
136
"dependencies": [
468
137
"debug"
469
138
]
470
470
-
},
471
471
-
"assertion-error@2.0.1": {
472
472
-
"integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA=="
473
139
},
474
140
"asynckit@0.4.0": {
475
141
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
···
489
155
"es-errors",
490
156
"function-bind"
491
157
]
492
492
-
},
493
493
-
"chai@6.2.2": {
494
494
-
"integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg=="
495
158
},
496
159
"combined-stream@1.0.8": {
497
160
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
···
499
162
"delayed-stream"
500
163
]
501
164
},
502
502
-
"convert-source-map@2.0.0": {
503
503
-
"integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="
504
504
-
},
505
165
"debug@4.4.3": {
506
166
"integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
507
167
"dependencies": [
···
528
188
"es-errors@1.3.0": {
529
189
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="
530
190
},
531
531
-
"es-module-lexer@2.1.0": {
532
532
-
"integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ=="
533
533
-
},
534
191
"es-object-atoms@1.1.2": {
535
192
"integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==",
536
193
"dependencies": [
···
546
203
"hasown"
547
204
]
548
205
},
549
549
-
"esbuild@0.27.7": {
550
550
-
"integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==",
551
551
-
"optionalDependencies": [
552
552
-
"@esbuild/aix-ppc64",
553
553
-
"@esbuild/android-arm",
554
554
-
"@esbuild/android-arm64",
555
555
-
"@esbuild/android-x64",
556
556
-
"@esbuild/darwin-arm64",
557
557
-
"@esbuild/darwin-x64",
558
558
-
"@esbuild/freebsd-arm64",
559
559
-
"@esbuild/freebsd-x64",
560
560
-
"@esbuild/linux-arm",
561
561
-
"@esbuild/linux-arm64",
562
562
-
"@esbuild/linux-ia32",
563
563
-
"@esbuild/linux-loong64",
564
564
-
"@esbuild/linux-mips64el",
565
565
-
"@esbuild/linux-ppc64",
566
566
-
"@esbuild/linux-riscv64",
567
567
-
"@esbuild/linux-s390x",
568
568
-
"@esbuild/linux-x64",
569
569
-
"@esbuild/netbsd-arm64",
570
570
-
"@esbuild/netbsd-x64",
571
571
-
"@esbuild/openbsd-arm64",
572
572
-
"@esbuild/openbsd-x64",
573
573
-
"@esbuild/openharmony-arm64",
574
574
-
"@esbuild/sunos-x64",
575
575
-
"@esbuild/win32-arm64",
576
576
-
"@esbuild/win32-ia32",
577
577
-
"@esbuild/win32-x64"
578
578
-
],
579
579
-
"scripts": true,
580
580
-
"bin": true
581
581
-
},
582
582
-
"estree-walker@3.0.3": {
583
583
-
"integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
584
584
-
"dependencies": [
585
585
-
"@types/estree"
586
586
-
]
587
587
-
},
588
588
-
"expect-type@1.3.0": {
589
589
-
"integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA=="
590
590
-
},
591
591
-
"fdir@6.5.0_picomatch@4.0.4": {
592
592
-
"integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
593
593
-
"dependencies": [
594
594
-
"picomatch"
595
595
-
],
596
596
-
"optionalPeers": [
597
597
-
"picomatch"
598
598
-
]
599
599
-
},
600
206
"find-up@6.3.0": {
601
207
"integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==",
602
208
"dependencies": [
···
616
222
"hasown",
617
223
"mime-types"
618
224
]
619
619
-
},
620
620
-
"fsevents@2.3.3": {
621
621
-
"integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
622
622
-
"os": ["darwin"],
623
623
-
"scripts": true
624
225
},
625
226
"function-bind@1.1.2": {
626
227
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="
···
678
279
"p-locate"
679
280
]
680
281
},
681
681
-
"magic-string@0.30.21": {
682
682
-
"integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
683
683
-
"dependencies": [
684
684
-
"@jridgewell/sourcemap-codec"
685
685
-
]
686
686
-
},
687
282
"math-intrinsics@1.1.0": {
688
283
"integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="
689
284
},
···
699
294
"ms@2.1.3": {
700
295
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
701
296
},
702
702
-
"nanoid@3.3.12": {
703
703
-
"integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==",
704
704
-
"bin": true
705
705
-
},
706
297
"node-gyp-build@4.8.4": {
707
298
"integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==",
708
299
"bin": true
709
709
-
},
710
710
-
"obug@2.1.1": {
711
711
-
"integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ=="
712
300
},
713
301
"p-limit@4.0.0": {
714
302
"integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==",
···
725
313
"path-exists@5.0.0": {
726
314
"integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ=="
727
315
},
728
728
-
"pathe@2.0.3": {
729
729
-
"integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="
730
730
-
},
731
731
-
"picocolors@1.1.1": {
732
732
-
"integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="
733
733
-
},
734
734
-
"picomatch@4.0.4": {
735
735
-
"integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="
736
736
-
},
737
737
-
"postcss@8.5.15": {
738
738
-
"integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==",
739
739
-
"dependencies": [
740
740
-
"nanoid",
741
741
-
"picocolors",
742
742
-
"source-map-js"
743
743
-
]
744
744
-
},
745
316
"proxy-from-env@2.1.0": {
746
317
"integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA=="
747
318
},
748
748
-
"rollup@4.60.4": {
749
749
-
"integrity": "sha512-WHeFSbZYsPu3+bLoNRUuAO+wavNlocOPf3wSHTP7hcFKVnJeWsYlCDbr3mTS14FCizf9ccIxXA8sGL8zKeQN3g==",
750
750
-
"dependencies": [
751
751
-
"@types/estree"
752
752
-
],
753
753
-
"optionalDependencies": [
754
754
-
"@rollup/rollup-android-arm-eabi",
755
755
-
"@rollup/rollup-android-arm64",
756
756
-
"@rollup/rollup-darwin-arm64",
757
757
-
"@rollup/rollup-darwin-x64",
758
758
-
"@rollup/rollup-freebsd-arm64",
759
759
-
"@rollup/rollup-freebsd-x64",
760
760
-
"@rollup/rollup-linux-arm-gnueabihf",
761
761
-
"@rollup/rollup-linux-arm-musleabihf",
762
762
-
"@rollup/rollup-linux-arm64-gnu",
763
763
-
"@rollup/rollup-linux-arm64-musl",
764
764
-
"@rollup/rollup-linux-loong64-gnu",
765
765
-
"@rollup/rollup-linux-loong64-musl",
766
766
-
"@rollup/rollup-linux-ppc64-gnu",
767
767
-
"@rollup/rollup-linux-ppc64-musl",
768
768
-
"@rollup/rollup-linux-riscv64-gnu",
769
769
-
"@rollup/rollup-linux-riscv64-musl",
770
770
-
"@rollup/rollup-linux-s390x-gnu",
771
771
-
"@rollup/rollup-linux-x64-gnu",
772
772
-
"@rollup/rollup-linux-x64-musl",
773
773
-
"@rollup/rollup-openbsd-x64",
774
774
-
"@rollup/rollup-openharmony-arm64",
775
775
-
"@rollup/rollup-win32-arm64-msvc",
776
776
-
"@rollup/rollup-win32-ia32-msvc",
777
777
-
"@rollup/rollup-win32-x64-gnu",
778
778
-
"@rollup/rollup-win32-x64-msvc",
779
779
-
"fsevents"
780
780
-
],
781
781
-
"bin": true
782
782
-
},
783
783
-
"siginfo@2.0.0": {
784
784
-
"integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g=="
785
785
-
},
786
786
-
"source-map-js@1.2.1": {
787
787
-
"integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="
788
788
-
},
789
789
-
"stackback@0.0.2": {
790
790
-
"integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw=="
791
791
-
},
792
792
-
"std-env@4.1.0": {
793
793
-
"integrity": "sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ=="
794
794
-
},
795
795
-
"tinybench@2.9.0": {
796
796
-
"integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg=="
797
797
-
},
798
798
-
"tinyexec@1.2.2": {
799
799
-
"integrity": "sha512-M/Q0B2cp4K7kynaT/vnED1j8TlLY+Pp7C6Wl2bl/7u/F0mUVwdyOpwomQb8JpYLitHUssAJRmLZdMCGsrx7i+g=="
800
800
-
},
801
801
-
"tinyglobby@0.2.16": {
802
802
-
"integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==",
803
803
-
"dependencies": [
804
804
-
"fdir",
805
805
-
"picomatch"
806
806
-
]
319
319
+
"stack-trace@1.0.0-pre2": {
320
320
+
"integrity": "sha512-2ztBJRek8IVofG9DBJqdy2N5kulaacX30Nz7xmkYF6ale9WBVmIy6mFBchvGX7Vx/MyjBhx+Rcxqrj+dbOnQ6A=="
807
321
},
808
808
-
"tinyrainbow@3.1.0": {
809
809
-
"integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw=="
322
322
+
"tinybench@6.0.2": {
323
323
+
"integrity": "sha512-FlHoQpcFvCzeXK5kVPvV7IVgW/hs/B36QWTz876iSdeJguBDfdTSRQmYmaHX+fQNt4hp+gEFB2XXw+8hT4/y8A=="
810
324
},
811
325
"valrs@0.1.0": {
812
326
"integrity": "sha512-BqVkjx3qhsRLHerblLDoqEx0OEx7ms0DB6LPv40oWkMfFKUVKrqVuklaGdrPrHyubC5hSHYfEtUiQXrCkC6xHQ=="
813
327
},
814
814
-
"vite@7.3.3": {
815
815
-
"integrity": "sha512-/4XH147Ui7OGTjg3HbdWe5arnZQSbfuRzdr9Ec7TQi5I7R+ir0Rlc9GIvD4v0XZurELqA035KVXJXpR61xhiTA==",
816
816
-
"dependencies": [
817
817
-
"esbuild",
818
818
-
"fdir",
819
819
-
"picomatch",
820
820
-
"postcss",
821
821
-
"rollup",
822
822
-
"tinyglobby"
823
823
-
],
824
824
-
"optionalDependencies": [
825
825
-
"fsevents"
826
826
-
],
827
827
-
"bin": true
828
828
-
},
829
829
-
"vitest@4.1.7_vite@7.3.3": {
830
830
-
"integrity": "sha512-flYyaFd2CgoCoU+0UKt3pxksgC+S02iTDN0n3LtqaMeXsI9SBcdNujc2k0DeFLzUn/0k538yNjOSdwgCqcrwJA==",
831
831
-
"dependencies": [
832
832
-
"@vitest/expect",
833
833
-
"@vitest/mocker",
834
834
-
"@vitest/pretty-format",
835
835
-
"@vitest/runner",
836
836
-
"@vitest/snapshot",
837
837
-
"@vitest/spy",
838
838
-
"@vitest/utils",
839
839
-
"es-module-lexer",
840
840
-
"expect-type",
841
841
-
"magic-string",
842
842
-
"obug",
843
843
-
"pathe",
844
844
-
"picomatch",
845
845
-
"std-env",
846
846
-
"tinybench",
847
847
-
"tinyexec",
848
848
-
"tinyglobby",
849
849
-
"tinyrainbow",
850
850
-
"vite",
851
851
-
"why-is-node-running"
852
852
-
],
853
853
-
"bin": true
854
854
-
},
855
855
-
"why-is-node-running@2.3.0": {
856
856
-
"integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==",
857
857
-
"dependencies": [
858
858
-
"siginfo",
859
859
-
"stackback"
860
860
-
],
861
861
-
"bin": true
862
862
-
},
863
328
"yocto-queue@1.2.2": {
864
329
"integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ=="
865
330
}
···
870
335
"jsr:@std/encoding@1",
871
336
"jsr:@std/expect@1",
872
337
"jsr:@std/testing@1",
873
873
-
"npm:@codspeed/vitest-plugin@^5.4.0",
338
338
+
"npm:@codspeed/tinybench-plugin@^5.4.0",
874
339
"npm:@sinclair/typebox@0.34",
875
340
"npm:effection@^4.0.2",
876
876
-
"npm:vitest@^4.1.7"
341
341
+
"npm:tinybench@^6.0.2"
877
342
]
878
343
}
879
344
}