@rozenite/controls-plugin 1.5.1 → 1.7.0-rc.0
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/CHANGELOG.md +16 -0
- package/dist/{panel.html → devtools/panel.html} +2 -2
- package/dist/react-native/index.cjs +1 -0
- package/dist/react-native/index.d.ts +134 -0
- package/dist/{react-native.js → react-native/index.js} +1 -1
- package/dist/rozenite.json +1 -1
- package/package.json +27 -8
- package/dist/react-native.cjs +0 -1
- package/dist/react-native.d.ts +0 -2
- package/dist/rozenite.config.d.ts +0 -7
- package/dist/src/__tests__/serialization.test.d.ts +0 -1
- package/dist/src/react-native/useControlsAgentTools.d.ts +0 -2
- package/dist/src/react-native/useRozeniteControlsPlugin.d.ts +0 -3
- package/dist/src/shared/messaging.d.ts +0 -35
- package/dist/src/shared/serialization.d.ts +0 -22
- package/dist/src/shared/types.d.ts +0 -67
- package/dist/src/ui/panel.d.ts +0 -1
- /package/dist/{assets → devtools/assets}/panel-B5zz0XK3.css +0 -0
- /package/dist/{assets/panel-OL0XQF_c.js → devtools/assets/panel-Csphk_TK.js} +0 -0
- /package/dist/{useRozeniteControlsPlugin.cjs → react-native/chunks/useRozeniteControlsPlugin.require.cjs} +0 -0
- /package/dist/{useRozeniteControlsPlugin.js → react-native/chunks/useRozeniteControlsPlugin.require.js} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# @rozenite/controls-plugin
|
|
2
2
|
|
|
3
|
+
## 1.7.0-rc.0
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies []:
|
|
8
|
+
- @rozenite/agent-bridge@1.7.0-rc.0
|
|
9
|
+
- @rozenite/plugin-bridge@1.7.0-rc.0
|
|
10
|
+
|
|
11
|
+
## 1.6.0
|
|
12
|
+
|
|
13
|
+
### Patch Changes
|
|
14
|
+
|
|
15
|
+
- Updated dependencies []:
|
|
16
|
+
- @rozenite/agent-bridge@1.6.0
|
|
17
|
+
- @rozenite/plugin-bridge@1.6.0
|
|
18
|
+
|
|
3
19
|
## 1.5.1
|
|
4
20
|
|
|
5
21
|
### Patch Changes
|
|
@@ -22,8 +22,8 @@
|
|
|
22
22
|
<script>
|
|
23
23
|
var __ROZENITE_PANEL__ = true;
|
|
24
24
|
</script>
|
|
25
|
-
<script type="module" crossorigin src="
|
|
26
|
-
<link rel="stylesheet" crossorigin href="
|
|
25
|
+
<script type="module" crossorigin src="../devtools/assets/panel-Csphk_TK.js"></script>
|
|
26
|
+
<link rel="stylesheet" crossorigin href="../devtools/assets/panel-B5zz0XK3.css">
|
|
27
27
|
</head>
|
|
28
28
|
<body>
|
|
29
29
|
<div id="root"></div>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=e=>e;exports.useRozeniteControlsPlugin=void 0;const n=process.env.NODE_ENV!=="production",t=typeof window>"u";n&&!t?exports.useRozeniteControlsPlugin=require("./chunks/useRozeniteControlsPlugin.require.cjs").useRozeniteControlsPlugin:exports.useRozeniteControlsPlugin=()=>null;exports.createSection=o;
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { RozeniteDevToolsClient } from '../../../plugin-bridge/src/index.ts';
|
|
2
|
+
|
|
3
|
+
export declare type ControlsButtonItem = {
|
|
4
|
+
id: string;
|
|
5
|
+
type: 'button';
|
|
6
|
+
title: string;
|
|
7
|
+
actionLabel?: string;
|
|
8
|
+
description?: string;
|
|
9
|
+
disabled?: boolean;
|
|
10
|
+
onPress: () => void | Promise<void>;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
declare type ControlsButtonItemSnapshot = Omit<ControlsButtonItem, 'onPress'>;
|
|
14
|
+
|
|
15
|
+
declare type ControlsEvent = ControlsSnapshotEvent | ControlsGetSnapshotEvent | ControlsUpdateRequestEvent | ControlsUpdateResultEvent | ControlsInvokeActionEvent;
|
|
16
|
+
|
|
17
|
+
declare type ControlsEventMap = {
|
|
18
|
+
[K in ControlsEvent['type']]: Extract<ControlsEvent, {
|
|
19
|
+
type: K;
|
|
20
|
+
}>;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
declare type ControlsGetSnapshotEvent = {
|
|
24
|
+
type: 'get-snapshot';
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export declare type ControlsInputItem = ControlsMutableItemBase<string> & {
|
|
28
|
+
type: 'input';
|
|
29
|
+
placeholder?: string;
|
|
30
|
+
applyLabel?: string;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
declare type ControlsInputItemSnapshot = Omit<ControlsInputItem, 'validate' | 'onUpdate'>;
|
|
34
|
+
|
|
35
|
+
declare type ControlsInvokeActionEvent = {
|
|
36
|
+
type: 'invoke-action';
|
|
37
|
+
sectionId: string;
|
|
38
|
+
itemId: string;
|
|
39
|
+
action: 'press';
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export declare type ControlsItem = ControlsTextItem | ControlsToggleItem | ControlsButtonItem | ControlsSelectItem | ControlsInputItem;
|
|
43
|
+
|
|
44
|
+
declare type ControlsItemSnapshot = ControlsTextItemSnapshot | ControlsToggleItemSnapshot | ControlsButtonItemSnapshot | ControlsSelectItemSnapshot | ControlsInputItemSnapshot;
|
|
45
|
+
|
|
46
|
+
declare type ControlsMutableItemBase<TValue> = {
|
|
47
|
+
id: string;
|
|
48
|
+
title: string;
|
|
49
|
+
value: TValue;
|
|
50
|
+
description?: string;
|
|
51
|
+
disabled?: boolean;
|
|
52
|
+
validate?: (nextValue: TValue) => ControlsValidationResult;
|
|
53
|
+
onUpdate: (nextValue: TValue) => void | Promise<void>;
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
export declare type ControlsSection = {
|
|
57
|
+
id: string;
|
|
58
|
+
title: string;
|
|
59
|
+
description?: string;
|
|
60
|
+
items: ControlsItem[];
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
declare type ControlsSectionSnapshot = Omit<ControlsSection, 'items'> & {
|
|
64
|
+
items: ControlsItemSnapshot[];
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
export declare type ControlsSelectItem = ControlsMutableItemBase<string> & {
|
|
68
|
+
type: 'select';
|
|
69
|
+
options: ControlsSelectOption[];
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
declare type ControlsSelectItemSnapshot = Omit<ControlsSelectItem, 'validate' | 'onUpdate'>;
|
|
73
|
+
|
|
74
|
+
export declare type ControlsSelectOption = {
|
|
75
|
+
label: string;
|
|
76
|
+
value: string;
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
declare type ControlsSnapshotEvent = {
|
|
80
|
+
type: 'snapshot';
|
|
81
|
+
sections: ControlsSectionSnapshot[];
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
export declare type ControlsTextItem = {
|
|
85
|
+
id: string;
|
|
86
|
+
type: 'text';
|
|
87
|
+
title: string;
|
|
88
|
+
value: string;
|
|
89
|
+
description?: string;
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
declare type ControlsTextItemSnapshot = Omit<ControlsTextItem, never>;
|
|
93
|
+
|
|
94
|
+
export declare type ControlsToggleItem = ControlsMutableItemBase<boolean> & {
|
|
95
|
+
type: 'toggle';
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
declare type ControlsToggleItemSnapshot = Omit<ControlsToggleItem, 'validate' | 'onUpdate'>;
|
|
99
|
+
|
|
100
|
+
declare type ControlsUpdateRequestEvent = {
|
|
101
|
+
type: 'update-request';
|
|
102
|
+
requestId: string;
|
|
103
|
+
sectionId: string;
|
|
104
|
+
itemId: string;
|
|
105
|
+
value: boolean | string;
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
declare type ControlsUpdateResultEvent = {
|
|
109
|
+
type: 'update-result';
|
|
110
|
+
requestId: string;
|
|
111
|
+
sectionId: string;
|
|
112
|
+
itemId: string;
|
|
113
|
+
status: 'ok' | 'error';
|
|
114
|
+
message?: string;
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
export declare type ControlsValidationResult = {
|
|
118
|
+
valid: true;
|
|
119
|
+
} | {
|
|
120
|
+
valid: false;
|
|
121
|
+
message: string;
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
export declare const createSection: <TSection extends ControlsSection>(section: TSection) => TSection;
|
|
125
|
+
|
|
126
|
+
export declare type RozeniteControlsPluginOptions = {
|
|
127
|
+
sections: ControlsSection[];
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
export declare let useRozeniteControlsPlugin: useRozeniteControlsPlugin_2;
|
|
131
|
+
|
|
132
|
+
declare const useRozeniteControlsPlugin_2: ({ sections, }: RozeniteControlsPluginOptions) => RozeniteDevToolsClient<ControlsEventMap> | null;
|
|
133
|
+
|
|
134
|
+
export { }
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const i = (n) => n;
|
|
2
2
|
let e;
|
|
3
3
|
const o = process.env.NODE_ENV !== "production", t = typeof window > "u";
|
|
4
|
-
o && !t ? e = require("./useRozeniteControlsPlugin.js").useRozeniteControlsPlugin : e = () => null;
|
|
4
|
+
o && !t ? e = require("./chunks/useRozeniteControlsPlugin.require.js").useRozeniteControlsPlugin : e = () => null;
|
|
5
5
|
export {
|
|
6
6
|
i as createSection,
|
|
7
7
|
e as useRozeniteControlsPlugin
|
package/dist/rozenite.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@rozenite/controls-plugin","version":"1.
|
|
1
|
+
{"name":"@rozenite/controls-plugin","version":"1.7.0-rc.0","description":"A Rozenite plugin for exposing app-defined controls directly in React Native DevTools.","panels":[{"name":"Controls","source":"/devtools/panel.html"}]}
|
package/package.json
CHANGED
|
@@ -1,14 +1,22 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rozenite/controls-plugin",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.7.0-rc.0",
|
|
4
4
|
"description": "A Rozenite plugin for exposing app-defined controls directly in React Native DevTools.",
|
|
5
5
|
"type": "module",
|
|
6
|
-
"main": "./dist/react-native.cjs",
|
|
7
|
-
"module": "./dist/react-native.js",
|
|
8
|
-
"types": "./dist/react-native.d.ts",
|
|
6
|
+
"main": "./dist/react-native/index.cjs",
|
|
7
|
+
"module": "./dist/react-native/index.js",
|
|
8
|
+
"types": "./dist/react-native/index.d.ts",
|
|
9
|
+
"homepage": "https://github.com/callstackincubator/rozenite#readme",
|
|
10
|
+
"bugs": {
|
|
11
|
+
"url": "https://github.com/callstackincubator/rozenite/issues"
|
|
12
|
+
},
|
|
13
|
+
"repository": {
|
|
14
|
+
"type": "git",
|
|
15
|
+
"url": "https://github.com/callstackincubator/rozenite.git"
|
|
16
|
+
},
|
|
9
17
|
"dependencies": {
|
|
10
|
-
"@rozenite/agent-bridge": "1.
|
|
11
|
-
"@rozenite/plugin-bridge": "1.
|
|
18
|
+
"@rozenite/agent-bridge": "1.7.0-rc.0",
|
|
19
|
+
"@rozenite/plugin-bridge": "1.7.0-rc.0"
|
|
12
20
|
},
|
|
13
21
|
"devDependencies": {
|
|
14
22
|
"@types/react": "~19.2.2",
|
|
@@ -23,14 +31,25 @@
|
|
|
23
31
|
"tailwindcss-animate": "^1.0.7",
|
|
24
32
|
"typescript": "~5.9.3",
|
|
25
33
|
"vite": "^7.3.1",
|
|
26
|
-
"rozenite": "1.
|
|
27
|
-
"
|
|
34
|
+
"@rozenite/vite-plugin": "1.7.0-rc.0",
|
|
35
|
+
"rozenite": "1.7.0-rc.0"
|
|
28
36
|
},
|
|
29
37
|
"peerDependencies": {
|
|
30
38
|
"react": "*",
|
|
31
39
|
"react-native": "*"
|
|
32
40
|
},
|
|
33
41
|
"license": "MIT",
|
|
42
|
+
"exports": {
|
|
43
|
+
".": {
|
|
44
|
+
"types": "./dist/react-native/index.d.ts",
|
|
45
|
+
"import": "./dist/react-native/index.js",
|
|
46
|
+
"require": "./dist/react-native/index.cjs"
|
|
47
|
+
},
|
|
48
|
+
"./package.json": "./package.json"
|
|
49
|
+
},
|
|
50
|
+
"publishConfig": {
|
|
51
|
+
"access": "public"
|
|
52
|
+
},
|
|
34
53
|
"scripts": {
|
|
35
54
|
"build": "rozenite build",
|
|
36
55
|
"dev": "rozenite dev",
|
package/dist/react-native.cjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=e=>e;exports.useRozeniteControlsPlugin=void 0;const n=process.env.NODE_ENV!=="production",t=typeof window>"u";n&&!t?exports.useRozeniteControlsPlugin=require("./useRozeniteControlsPlugin.cjs").useRozeniteControlsPlugin:exports.useRozeniteControlsPlugin=()=>null;exports.createSection=o;
|
package/dist/react-native.d.ts
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export { createSection, type ControlsButtonItem, type ControlsInputItem, type ControlsItem, type ControlsSelectItem, type ControlsSelectOption, type ControlsSection, type ControlsTextItem, type ControlsToggleItem, type ControlsValidationResult, type RozeniteControlsPluginOptions, } from './src/shared/types';
|
|
2
|
-
export declare let useRozeniteControlsPlugin: typeof import('./src/react-native/useRozeniteControlsPlugin').useRozeniteControlsPlugin;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import { ControlsEventMap } from '../shared/messaging';
|
|
2
|
-
import { RozeniteControlsPluginOptions } from '../shared/types';
|
|
3
|
-
export declare const useRozeniteControlsPlugin: ({ sections, }: RozeniteControlsPluginOptions) => import('../../../plugin-bridge/src/index.ts').RozeniteDevToolsClient<ControlsEventMap> | null;
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { ControlsSectionSnapshot } from './types';
|
|
2
|
-
export type ControlsSnapshotEvent = {
|
|
3
|
-
type: 'snapshot';
|
|
4
|
-
sections: ControlsSectionSnapshot[];
|
|
5
|
-
};
|
|
6
|
-
export type ControlsGetSnapshotEvent = {
|
|
7
|
-
type: 'get-snapshot';
|
|
8
|
-
};
|
|
9
|
-
export type ControlsUpdateRequestEvent = {
|
|
10
|
-
type: 'update-request';
|
|
11
|
-
requestId: string;
|
|
12
|
-
sectionId: string;
|
|
13
|
-
itemId: string;
|
|
14
|
-
value: boolean | string;
|
|
15
|
-
};
|
|
16
|
-
export type ControlsUpdateResultEvent = {
|
|
17
|
-
type: 'update-result';
|
|
18
|
-
requestId: string;
|
|
19
|
-
sectionId: string;
|
|
20
|
-
itemId: string;
|
|
21
|
-
status: 'ok' | 'error';
|
|
22
|
-
message?: string;
|
|
23
|
-
};
|
|
24
|
-
export type ControlsInvokeActionEvent = {
|
|
25
|
-
type: 'invoke-action';
|
|
26
|
-
sectionId: string;
|
|
27
|
-
itemId: string;
|
|
28
|
-
action: 'press';
|
|
29
|
-
};
|
|
30
|
-
export type ControlsEvent = ControlsSnapshotEvent | ControlsGetSnapshotEvent | ControlsUpdateRequestEvent | ControlsUpdateResultEvent | ControlsInvokeActionEvent;
|
|
31
|
-
export type ControlsEventMap = {
|
|
32
|
-
[K in ControlsEvent['type']]: Extract<ControlsEvent, {
|
|
33
|
-
type: K;
|
|
34
|
-
}>;
|
|
35
|
-
};
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { ControlsButtonItem, ControlsInputItem, ControlsMutableItemBase, ControlsSelectItem, ControlsSection, ControlsSectionSnapshot, ControlsToggleItem, ControlsValidationResult } from './types';
|
|
2
|
-
export type ActionRegistryEntry = {
|
|
3
|
-
type: 'toggle';
|
|
4
|
-
validate?: ControlsToggleItem['validate'];
|
|
5
|
-
onUpdate: ControlsToggleItem['onUpdate'];
|
|
6
|
-
} | {
|
|
7
|
-
type: 'button';
|
|
8
|
-
onPress: ControlsButtonItem['onPress'];
|
|
9
|
-
} | {
|
|
10
|
-
type: 'select';
|
|
11
|
-
validate?: ControlsSelectItem['validate'];
|
|
12
|
-
onUpdate: ControlsSelectItem['onUpdate'];
|
|
13
|
-
} | {
|
|
14
|
-
type: 'input';
|
|
15
|
-
validate?: ControlsInputItem['validate'];
|
|
16
|
-
onUpdate: ControlsInputItem['onUpdate'];
|
|
17
|
-
};
|
|
18
|
-
declare const validateValue: <TValue>(validate: ControlsMutableItemBase<TValue>["validate"], value: TValue) => ControlsValidationResult;
|
|
19
|
-
export declare const serializeSections: (sections: ControlsSection[]) => ControlsSectionSnapshot[];
|
|
20
|
-
export declare const buildActionRegistry: (sections: ControlsSection[]) => Map<string, ActionRegistryEntry>;
|
|
21
|
-
export declare const getActionRegistryKey: (sectionId: string, itemId: string) => string;
|
|
22
|
-
export { validateValue };
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
export type ControlsTextItem = {
|
|
2
|
-
id: string;
|
|
3
|
-
type: 'text';
|
|
4
|
-
title: string;
|
|
5
|
-
value: string;
|
|
6
|
-
description?: string;
|
|
7
|
-
};
|
|
8
|
-
export type ControlsValidationResult = {
|
|
9
|
-
valid: true;
|
|
10
|
-
} | {
|
|
11
|
-
valid: false;
|
|
12
|
-
message: string;
|
|
13
|
-
};
|
|
14
|
-
export type ControlsMutableItemBase<TValue> = {
|
|
15
|
-
id: string;
|
|
16
|
-
title: string;
|
|
17
|
-
value: TValue;
|
|
18
|
-
description?: string;
|
|
19
|
-
disabled?: boolean;
|
|
20
|
-
validate?: (nextValue: TValue) => ControlsValidationResult;
|
|
21
|
-
onUpdate: (nextValue: TValue) => void | Promise<void>;
|
|
22
|
-
};
|
|
23
|
-
export type ControlsToggleItem = ControlsMutableItemBase<boolean> & {
|
|
24
|
-
type: 'toggle';
|
|
25
|
-
};
|
|
26
|
-
export type ControlsButtonItem = {
|
|
27
|
-
id: string;
|
|
28
|
-
type: 'button';
|
|
29
|
-
title: string;
|
|
30
|
-
actionLabel?: string;
|
|
31
|
-
description?: string;
|
|
32
|
-
disabled?: boolean;
|
|
33
|
-
onPress: () => void | Promise<void>;
|
|
34
|
-
};
|
|
35
|
-
export type ControlsSelectOption = {
|
|
36
|
-
label: string;
|
|
37
|
-
value: string;
|
|
38
|
-
};
|
|
39
|
-
export type ControlsSelectItem = ControlsMutableItemBase<string> & {
|
|
40
|
-
type: 'select';
|
|
41
|
-
options: ControlsSelectOption[];
|
|
42
|
-
};
|
|
43
|
-
export type ControlsInputItem = ControlsMutableItemBase<string> & {
|
|
44
|
-
type: 'input';
|
|
45
|
-
placeholder?: string;
|
|
46
|
-
applyLabel?: string;
|
|
47
|
-
};
|
|
48
|
-
export type ControlsItem = ControlsTextItem | ControlsToggleItem | ControlsButtonItem | ControlsSelectItem | ControlsInputItem;
|
|
49
|
-
export type ControlsSection = {
|
|
50
|
-
id: string;
|
|
51
|
-
title: string;
|
|
52
|
-
description?: string;
|
|
53
|
-
items: ControlsItem[];
|
|
54
|
-
};
|
|
55
|
-
export type ControlsTextItemSnapshot = Omit<ControlsTextItem, never>;
|
|
56
|
-
export type ControlsToggleItemSnapshot = Omit<ControlsToggleItem, 'validate' | 'onUpdate'>;
|
|
57
|
-
export type ControlsButtonItemSnapshot = Omit<ControlsButtonItem, 'onPress'>;
|
|
58
|
-
export type ControlsSelectItemSnapshot = Omit<ControlsSelectItem, 'validate' | 'onUpdate'>;
|
|
59
|
-
export type ControlsInputItemSnapshot = Omit<ControlsInputItem, 'validate' | 'onUpdate'>;
|
|
60
|
-
export type ControlsItemSnapshot = ControlsTextItemSnapshot | ControlsToggleItemSnapshot | ControlsButtonItemSnapshot | ControlsSelectItemSnapshot | ControlsInputItemSnapshot;
|
|
61
|
-
export type ControlsSectionSnapshot = Omit<ControlsSection, 'items'> & {
|
|
62
|
-
items: ControlsItemSnapshot[];
|
|
63
|
-
};
|
|
64
|
-
export type RozeniteControlsPluginOptions = {
|
|
65
|
-
sections: ControlsSection[];
|
|
66
|
-
};
|
|
67
|
-
export declare const createSection: <TSection extends ControlsSection>(section: TSection) => TSection;
|
package/dist/src/ui/panel.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export default function ControlsPanel(): import("react/jsx-runtime").JSX.Element;
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|