@girs/mtk-17 4.0.4

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/README.md ADDED
@@ -0,0 +1,85 @@
1
+
2
+ # Mtk-17
3
+
4
+ ![version](https://img.shields.io/npm/v/@girs/mtk-17)
5
+ ![downloads/week](https://img.shields.io/npm/dw/@girs/mtk-17)
6
+
7
+
8
+ GJS TypeScript type definitions for Mtk-17, generated from library version 17.0.0 using [ts-for-gir](https://github.com/gjsify/ts-for-gir) v4.0.4.
9
+
10
+ ## Install
11
+
12
+ To use this type definitions, install them with NPM:
13
+ ```bash
14
+ npm install @girs/mtk-17
15
+ ```
16
+
17
+ ## Usage
18
+
19
+ You can import this package into your project like this:
20
+ ```ts
21
+ import Mtk from '@girs/mtk-17';
22
+ ```
23
+
24
+ ### Ambient Modules
25
+
26
+ You can also use [ambient modules](https://github.com/gjsify/ts-for-gir/tree/main/packages/cli#ambient-modules) to import this module like you would do this in JavaScript.
27
+ For this you need to include `@girs/mtk-17` or `@girs/mtk-17/ambient` in your `tsconfig` or entry point Typescript file:
28
+
29
+ `index.ts`:
30
+ ```ts
31
+ import '@girs/mtk-17'
32
+ ```
33
+
34
+ `tsconfig.json`:
35
+ ```json
36
+ {
37
+ "compilerOptions": {
38
+ ...
39
+ },
40
+ "include": ["@girs/mtk-17"],
41
+ ...
42
+ }
43
+ ```
44
+
45
+ Now you can import the ambient module with TypeScript support:
46
+
47
+ ```ts
48
+ import Mtk from 'gi://Mtk?version=17';
49
+ ```
50
+
51
+ ### Global import
52
+
53
+ You can also import the module with Typescript support using the global `imports.gi` object of GJS.
54
+ For this you need to include `@girs/mtk-17` or `@girs/mtk-17/import` in your `tsconfig` or entry point Typescript file:
55
+
56
+ `index.ts`:
57
+ ```ts
58
+ import '@girs/mtk-17'
59
+ ```
60
+
61
+ `tsconfig.json`:
62
+ ```json
63
+ {
64
+ "compilerOptions": {
65
+ ...
66
+ },
67
+ "include": ["@girs/mtk-17"],
68
+ ...
69
+ }
70
+ ```
71
+
72
+ Now you have also type support for this, too:
73
+
74
+ ```ts
75
+ const Mtk = imports.gi.Mtk;
76
+ ```
77
+
78
+ ### Bundle
79
+
80
+ Depending on your project configuration, it is recommended to use a bundler like [esbuild](https://esbuild.github.io/). You can find examples using different bundlers [here](https://github.com/gjsify/ts-for-gir/tree/main/examples).
81
+
82
+ ## Other packages
83
+
84
+ All existing pre-generated packages can be found on [gjsify/types](https://github.com/gjsify/types).
85
+
package/index.d.ts ADDED
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Type Definitions for Gjs (https://gjs.guide/)
3
+ *
4
+ * These type definitions are automatically generated, do not edit them by hand.
5
+ * If you found a bug fix it in `ts-for-gir` or create a bug report on https://github.com/gjsify/ts-for-gir
6
+ *
7
+ * This template is used to generate the index.d.ts file of each GIR module like Gtk-4.0, GObject-2.0, ...
8
+ */
9
+
10
+ import './mtk-17-ambient.d.ts';
11
+
12
+
13
+ import Mtk from './mtk-17.js';
14
+ export default Mtk;
15
+
package/index.js ADDED
@@ -0,0 +1,5 @@
1
+
2
+ // @ts-expect-error
3
+ import Mtk from './mtk-17.js';
4
+ export default Mtk;
5
+
@@ -0,0 +1,12 @@
1
+
2
+ declare module 'gi://Mtk?version=17' {
3
+ import Mtk17 from '@girs/mtk-17';
4
+ export default Mtk17;
5
+ }
6
+
7
+ declare module 'gi://Mtk' {
8
+ import Mtk17 from 'gi://Mtk?version=17';
9
+ export default Mtk17;
10
+ }
11
+
12
+
@@ -0,0 +1,2 @@
1
+ export {}
2
+
@@ -0,0 +1,2 @@
1
+ // Module import type definition not generated, otherwise this would cause a type conflict, this is because several GIR modules were generated with the same namespace: "Mtk"
2
+
@@ -0,0 +1,3 @@
1
+ const gi = globalThis.imports?.gi || {};
2
+ export default gi;
3
+
package/mtk-17.d.ts ADDED
@@ -0,0 +1,549 @@
1
+
2
+ /**
3
+ * Type Definitions for Gjs (https://gjs.guide/)
4
+ *
5
+ * These type definitions are automatically generated, do not edit them by hand.
6
+ * If you found a bug fix it in `ts-for-gir` or create a bug report on https://github.com/gjsify/ts-for-gir
7
+ *
8
+ * The based EJS template file is used for the generated .d.ts file of each GIR module like Gtk-4.0, GObject-2.0, ...
9
+ */
10
+
11
+ import '@girs/gjs';
12
+
13
+ // Module dependencies
14
+ import type Graphene from '@girs/graphene-1.0';
15
+ import type GObject from '@girs/gobject-2.0';
16
+ import type GLib from '@girs/glib-2.0';
17
+
18
+ export namespace Mtk {
19
+
20
+ /**
21
+ * Mtk-17
22
+ */
23
+
24
+
25
+ /**
26
+ * @gir-type Enum
27
+ */
28
+ enum AnonymousFileMapmode {
29
+ PRIVATE,
30
+ SHARED,
31
+ }
32
+
33
+
34
+ /**
35
+ * @gir-type Struct
36
+ */
37
+ class MonitorTransform {
38
+ static $gtype: GObject.GType<MonitorTransform>;
39
+
40
+ // Static fields
41
+ static NORMAL: number;
42
+
43
+ static "90": number;
44
+
45
+ static "180": number;
46
+
47
+ static "270": number;
48
+
49
+ static FLIPPED: number;
50
+
51
+ static FLIPPED_90: number;
52
+
53
+ static FLIPPED_180: number;
54
+
55
+ static FLIPPED_270: number;
56
+ }
57
+
58
+
59
+ /**
60
+ * @gir-type Enum
61
+ */
62
+ enum RegionOverlap {
63
+ OUT,
64
+ IN,
65
+ PART,
66
+ }
67
+
68
+
69
+ /**
70
+ * @gir-type Enum
71
+ */
72
+ enum RoundingStrategy {
73
+ SHRINK,
74
+ GROW,
75
+ ROUND,
76
+ }
77
+
78
+
79
+ const MONITOR_ALL_TRANSFORMS: number;
80
+
81
+ const MONITOR_N_TRANSFORMS: number;
82
+
83
+ const RECTANGLE_MAX_STACK_RECTS: number;
84
+
85
+ const REGION_BUILDER_MAX_LEVELS: number;
86
+
87
+ /**
88
+ * @param matrix
89
+ * @param width
90
+ * @param height
91
+ * @param scale
92
+ * @param transform
93
+ * @param src_rect
94
+ */
95
+ function compute_viewport_matrix(matrix: Graphene.Matrix, width: number, height: number, scale: number, transform: MonitorTransform, src_rect: Graphene.Rect): void;
96
+
97
+ /**
98
+ * @param base_us
99
+ * @param interval_us
100
+ */
101
+ function extrapolate_next_interval_boundary(base_us: bigint | number, interval_us: bigint | number): number;
102
+
103
+ /**
104
+ * @param name
105
+ */
106
+ function monitor_transform_from_string(name: string): MonitorTransform;
107
+
108
+ /**
109
+ * @param transform
110
+ */
111
+ function monitor_transform_invert(transform: MonitorTransform): MonitorTransform;
112
+
113
+ /**
114
+ * @param transform
115
+ */
116
+ function monitor_transform_to_string(transform: MonitorTransform): string;
117
+
118
+ /**
119
+ * @param transform
120
+ * @param other
121
+ */
122
+ function monitor_transform_transform(transform: MonitorTransform, other: MonitorTransform): MonitorTransform;
123
+
124
+ /**
125
+ * @param transform
126
+ * @param matrix
127
+ */
128
+ function monitor_transform_transform_matrix(transform: MonitorTransform, matrix: Graphene.Matrix): void;
129
+
130
+ /**
131
+ * @param transform
132
+ * @param area_width
133
+ * @param area_height
134
+ * @param point_x
135
+ * @param point_y
136
+ */
137
+ function monitor_transform_transform_point(transform: MonitorTransform, area_width: number, area_height: number, point_x: number, point_y: number): void;
138
+
139
+ /**
140
+ * @param rect A rectangle
141
+ * @param rounding_strategy The rounding strategy
142
+ */
143
+ function rectangle_from_graphene_rect(rect: Graphene.Rect, rounding_strategy: RoundingStrategy): Rectangle;
144
+
145
+ function region_create(): Region;
146
+
147
+ /**
148
+ * @param rect
149
+ */
150
+ function region_create_rectangle(rect: Rectangle): Region;
151
+
152
+ /**
153
+ * @param rects
154
+ * @param n_rects
155
+ */
156
+ function region_create_rectangles(rects: Rectangle, n_rects: number): Region;
157
+
158
+ function x11_errors_deinit(): void;
159
+
160
+ /**
161
+ * @gir-type Struct
162
+ */
163
+ abstract class AnonymousFile {
164
+ static $gtype: GObject.GType<AnonymousFile>;
165
+
166
+ // Methods
167
+ /**
168
+ * Free the resources used by an anonymous read-only file.
169
+ */
170
+ free(): void;
171
+ }
172
+
173
+
174
+ /**
175
+ * @gir-type Struct
176
+ */
177
+ abstract class DbusPidfd {
178
+ static $gtype: GObject.GType<DbusPidfd>;
179
+
180
+ // Methods
181
+ free(): void;
182
+
183
+ get_pid(): never;
184
+
185
+ get_pidfd(): number;
186
+ }
187
+
188
+
189
+ /**
190
+ * @gir-type Struct
191
+ */
192
+ class Rectangle {
193
+ static $gtype: GObject.GType<Rectangle>;
194
+
195
+ // Fields
196
+ x: number;
197
+
198
+ y: number;
199
+
200
+ width: number;
201
+
202
+ height: number;
203
+
204
+ // Constructors
205
+
206
+ constructor(properties?: Partial<{
207
+ x: number;
208
+ y: number;
209
+ width: number;
210
+ height: number;
211
+ }>);
212
+
213
+ static ["new"](x: number, y: number, width: number, height: number): Rectangle;
214
+
215
+ static new_empty(): Rectangle;
216
+
217
+ // Static methods
218
+ /**
219
+ * @param rect A rectangle
220
+ * @param rounding_strategy The rounding strategy
221
+ */
222
+ static from_graphene_rect(rect: Graphene.Rect, rounding_strategy: RoundingStrategy): Rectangle;
223
+
224
+ // Methods
225
+ /**
226
+ * @returns The area of the rectangle
227
+ */
228
+ area(): number;
229
+
230
+ /**
231
+ * @param x X coordinate of the point
232
+ * @param y Y coordinate of the point
233
+ * @returns Whether the rectangle contains the point
234
+ */
235
+ contains_point(x: number, y: number): boolean;
236
+
237
+ /**
238
+ * @param x X coordinate of the point
239
+ * @param y Y coordinate of the point
240
+ * @returns Whether the rectangle contains the point
241
+ */
242
+ contains_pointf(x: number, y: number): boolean;
243
+
244
+ /**
245
+ * @param inner_rect The inner rectangle
246
+ * @returns Whether the outer rectangle contains the inner one
247
+ */
248
+ contains_rect(inner_rect: Rectangle): boolean;
249
+
250
+ copy(): Rectangle;
251
+
252
+ /**
253
+ * @param inner_rect The inner rectangle
254
+ * @returns Whether the inner rectangle could fit inside the outer one
255
+ */
256
+ could_fit_rect(inner_rect: Rectangle): boolean;
257
+
258
+ /**
259
+ * @param src_rect
260
+ * @param dst_width
261
+ * @param dst_height
262
+ * @param dest
263
+ */
264
+ crop_and_scale(src_rect: Graphene.Rect, dst_width: number, dst_height: number, dest: Rectangle): void;
265
+
266
+ /**
267
+ * Compares the two rectangles
268
+ * @param src2 The second rectangle
269
+ * @returns Whether the two rectangles are equal
270
+ */
271
+ equal(src2: Rectangle): boolean;
272
+
273
+ free(): void;
274
+
275
+ /**
276
+ * Similar to {@link Rectangle.overlap} but ignores the vertical location.
277
+ * @param rect2 The second rectangle
278
+ * @returns Whether the two rectangles overlap horizontally
279
+ */
280
+ horiz_overlap(rect2: Rectangle): boolean;
281
+
282
+ /**
283
+ * Find the intersection between the two rectangles
284
+ * @param src2 another {@link Mtk.Rectangle}
285
+ * @returns TRUE is some intersection exists and is not degenerate, FALSE otherwise.
286
+ */
287
+ intersect(src2: Rectangle): [boolean, Rectangle];
288
+
289
+ /**
290
+ * @param other
291
+ */
292
+ is_adjacent_to(other: Rectangle): boolean;
293
+
294
+ is_empty(): boolean;
295
+
296
+ /**
297
+ * Similar to {@link Rectangle.intersect} but doesn't provide
298
+ * the location of the intersection.
299
+ * @param rect2 The second rectangle
300
+ * @returns Whether the two rectangles overlap
301
+ */
302
+ overlap(rect2: Rectangle): boolean;
303
+
304
+ /**
305
+ * @param scale
306
+ * @param rounding_strategy
307
+ * @param dest
308
+ */
309
+ scale_double(scale: number, rounding_strategy: RoundingStrategy, dest: Rectangle): void;
310
+
311
+ /**
312
+ * @returns Return a graphene_rect_t created from `rect`
313
+ */
314
+ to_graphene_rect(): Graphene.Rect;
315
+
316
+ /**
317
+ * This function transforms the values in `rect` in order to compensate for
318
+ * `transform` applied to a `MetaMonitor`, making them match the viewport. Note
319
+ * that compensating implies that for a clockwise rotation of the `MetaMonitor`
320
+ * an anti-clockwise rotation has to be applied to `rect`.
321
+ * @param transform the {@link Mtk.MonitorTransform}
322
+ * @param width the width of the target space
323
+ * @param height the height of the target space
324
+ * @param dest the transformed {@link Mtk.Rectangle}
325
+ */
326
+ transform(transform: MonitorTransform, width: number, height: number, dest: Rectangle): void;
327
+
328
+ /**
329
+ * Computes the union of the two rectangles
330
+ * @param rect2 another {@link Mtk.Rectangle}
331
+ */
332
+ union(rect2: Rectangle): Rectangle;
333
+
334
+ /**
335
+ * Similar to {@link Rectangle.overlap} but ignores the horizontal location.
336
+ * @param rect2 The second rectangle
337
+ * @returns Whether the two rectangles overlap vertically
338
+ */
339
+ vert_overlap(rect2: Rectangle): boolean;
340
+ }
341
+
342
+
343
+ /**
344
+ * @gir-type Struct
345
+ */
346
+ abstract class Region {
347
+ static $gtype: GObject.GType<Region>;
348
+
349
+ // Static methods
350
+ static create(): Region;
351
+
352
+ /**
353
+ * @param rect
354
+ */
355
+ static create_rectangle(rect: Rectangle): Region;
356
+
357
+ /**
358
+ * @param rects
359
+ * @param n_rects
360
+ */
361
+ static create_rectangles(rects: Rectangle, n_rects: number): Region;
362
+
363
+ // Methods
364
+ /**
365
+ * @param transform
366
+ */
367
+ apply_matrix_transform_expand(transform: Graphene.Matrix): Region;
368
+
369
+ /**
370
+ * @param x
371
+ * @param y
372
+ */
373
+ contains_point(x: number, y: number): boolean;
374
+
375
+ /**
376
+ * @param rect
377
+ */
378
+ contains_rectangle(rect: Rectangle): RegionOverlap;
379
+
380
+ /**
381
+ * @returns A copy of the passed region
382
+ */
383
+ copy(): Region;
384
+
385
+ /**
386
+ * @param src_rect
387
+ * @param dst_width
388
+ * @param dst_height
389
+ */
390
+ crop_and_scale(src_rect: Graphene.Rect, dst_width: number, dst_height: number): Region;
391
+
392
+ /**
393
+ * @param other
394
+ */
395
+ equal(other: Region): boolean;
396
+
397
+ /**
398
+ * @param nth
399
+ * @param x1
400
+ * @param y1
401
+ * @param x2
402
+ * @param y2
403
+ */
404
+ get_box(nth: number, x1: number, y1: number, x2: number, y2: number): void;
405
+
406
+ get_extents(): Rectangle;
407
+
408
+ /**
409
+ * @param nth
410
+ */
411
+ get_rectangle(nth: number): Rectangle;
412
+
413
+ /**
414
+ * @param other
415
+ */
416
+ intersect(other: Region): void;
417
+
418
+ /**
419
+ * @param rect
420
+ */
421
+ intersect_rectangle(rect: Rectangle): void;
422
+
423
+ is_empty(): boolean;
424
+
425
+ num_rectangles(): number;
426
+
427
+ /**
428
+ * Increases the reference count
429
+ * @returns The region
430
+ */
431
+ ref(): Region;
432
+
433
+ /**
434
+ * @param scale
435
+ */
436
+ scale(scale: number): Region;
437
+
438
+ /**
439
+ * @param other
440
+ */
441
+ subtract(other: Region): void;
442
+
443
+ /**
444
+ * @param rect
445
+ */
446
+ subtract_rectangle(rect: Rectangle): void;
447
+
448
+ /**
449
+ * @param dx
450
+ * @param dy
451
+ */
452
+ translate(dx: number, dy: number): void;
453
+
454
+ /**
455
+ * @param other
456
+ */
457
+ union(other: Region): void;
458
+
459
+ /**
460
+ * @param rect
461
+ */
462
+ union_rectangle(rect: Rectangle): void;
463
+
464
+ unref(): void;
465
+ }
466
+
467
+
468
+ /**
469
+ * @gir-type Struct
470
+ */
471
+ class RegionBuilder {
472
+ static $gtype: GObject.GType<RegionBuilder>;
473
+
474
+ // Fields
475
+ n_levels: number;
476
+
477
+ // Methods
478
+ /**
479
+ * @param x
480
+ * @param y
481
+ * @param width
482
+ * @param height
483
+ */
484
+ add_rectangle(x: number, y: number, width: number, height: number): void;
485
+
486
+ finish(): Region;
487
+
488
+ init(): void;
489
+ }
490
+
491
+
492
+ /**
493
+ * MtkRegion is a yx banded region; sometimes its useful to iterate through
494
+ * such a region treating the start and end of each horizontal band in a distinct
495
+ * fashion.
496
+ *
497
+ * Usage:
498
+ *
499
+ * ```c
500
+ * MtkRegionIterator iter;
501
+ * for (mtk_region_iterator_init (&iter, region);
502
+ * !mtk_region_iterator_at_end (&iter);
503
+ * mtk_region_iterator_next (&iter))
504
+ * {
505
+ * [ Use iter.rectangle, iter.line_start, iter.line_end ]
506
+ * }
507
+ * ```
508
+ * @gir-type Struct
509
+ */
510
+ class RegionIterator {
511
+ static $gtype: GObject.GType<RegionIterator>;
512
+
513
+ // Fields
514
+ rectangle: Rectangle;
515
+
516
+ line_start: boolean;
517
+
518
+ line_end: boolean;
519
+
520
+ i: number;
521
+
522
+ // Methods
523
+ at_end(): boolean;
524
+
525
+ /**
526
+ * @param region
527
+ */
528
+ init(region: Region): void;
529
+
530
+ next(): void;
531
+ }
532
+
533
+
534
+ /**
535
+ * Name of the imported GIR library
536
+ * `see` https://gitlab.gnome.org/GNOME/gjs/-/blob/master/gi/ns.cpp#L188
537
+ */
538
+ const __name__: string;
539
+
540
+ /**
541
+ * Version of the imported GIR library
542
+ * `see` https://gitlab.gnome.org/GNOME/gjs/-/blob/master/gi/ns.cpp#L189
543
+ */
544
+ const __version__: string;
545
+ }
546
+
547
+ export default Mtk;
548
+
549
+ // END
package/mtk-17.js ADDED
@@ -0,0 +1,5 @@
1
+
2
+ // @ts-expect-error
3
+ import Mtk from 'gi://Mtk?version=17';
4
+ export default Mtk;
5
+
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "@girs/mtk-17",
3
+ "version": "4.0.4",
4
+ "libraryVersion": "17.0.0",
5
+ "description": "GJS TypeScript type definitions for Mtk-17, generated from library version 17.0.0",
6
+ "type": "module",
7
+ "module": "mtk-17.js",
8
+ "main": "mtk-17.js",
9
+ "exports": {
10
+ "./ambient": {
11
+ "types": "./mtk-17-ambient.d.ts",
12
+ "import": "./mtk-17-ambient.js",
13
+ "default": "./mtk-17-ambient.js"
14
+ },
15
+ "./import": {
16
+ "types": "./mtk-17-import.d.ts",
17
+ "import": "./mtk-17-import.js",
18
+ "default": "./mtk-17-import.js"
19
+ },
20
+ "./mtk-17": {
21
+ "types": "./mtk-17.d.ts",
22
+ "import": "./mtk-17.js",
23
+ "default": "./mtk-17.js"
24
+ },
25
+ ".": {
26
+ "types": "./index.d.ts",
27
+ "import": "./index.js",
28
+ "default": "./index.js"
29
+ }
30
+ },
31
+ "scripts": {
32
+ "test": "tsc --project tsconfig.json"
33
+ },
34
+ "dependencies": {
35
+ "@girs/gjs": "^4.0.4",
36
+ "@girs/graphene-1.0": "^4.0.4",
37
+ "@girs/gobject-2.0": "^4.0.4",
38
+ "@girs/glib-2.0": "^4.0.4" },
39
+ "devDependencies": {
40
+ "typescript": "*"
41
+ },
42
+ "keywords": ["Gir", "TypeScript", "types", "GObject-Introspection", "GJS", "Mtk-17"],
43
+ "author": "ts-for-gir",
44
+ "license": "MIT",
45
+ "repository": {
46
+ "type": "git",
47
+ "url": "git+https://github.com/gjsify/types.git"
48
+ },
49
+ "bugs": {
50
+ "url": "https://github.com/gjsify/ts-for-gir/issues"
51
+ },
52
+ "homepage": "https://github.com/gjsify/types/tree/main/mtk-17#readme"
53
+ }
54
+
55
+
package/tsconfig.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "compilerOptions": {
3
+ // General settings for code interpretation
4
+ "target": "ESNext",
5
+ "module": "NodeNext",
6
+ "lib": ["ESNext"],
7
+ "types": [],
8
+ "experimentalDecorators": true,
9
+ "moduleResolution": "NodeNext",
10
+ "noEmit": true,
11
+ "noEmitOnError": false,
12
+ "rootDir": ".",
13
+ // General settings for code generation
14
+ "removeComments": false,
15
+ "inlineSourceMap": false,
16
+ "inlineSources": false,
17
+ "newLine": "LF",
18
+ // Show diagnostics
19
+ "diagnostics": true,
20
+ "paths": {
21
+ "@girs/graphene-1.0": [
22
+ "../graphene-1.0/index.d.ts"
23
+ ],
24
+ "@girs/gobject-2.0": [
25
+ "../gobject-2.0/index.d.ts"
26
+ ],
27
+ "@girs/glib-2.0": [
28
+ "../glib-2.0/index.d.ts"
29
+ ],
30
+ "@girs/gjs": [
31
+ "../gjs/index.d.ts"
32
+ ]
33
+ }
34
+ },
35
+ "include": ["./mtk-17.d.ts"]
36
+ }
37
+
38
+
package/typedoc.json ADDED
@@ -0,0 +1,9 @@
1
+ {
2
+ "entryPoints": ["./mtk-17.d.ts"],
3
+ "readme": "./README.md",
4
+ "name": "Mtk-17",
5
+ "tsconfig": "./tsconfig.json",
6
+ "skipErrorChecking": true,
7
+ "highlightLanguages": ["typescript", "javascript", "c", "cpp", "xml", "bash", "json", "css"]
8
+ }
9
+