@technotoil/image-video-editor 0.1.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.
Files changed (99) hide show
  1. package/ImageVideoEditor.podspec +21 -0
  2. package/README.md +136 -0
  3. package/android/build.gradle +76 -0
  4. package/android/gradle.properties +5 -0
  5. package/android/src/main/AndroidManifest.xml +13 -0
  6. package/android/src/main/java/com/technotoil/image_videoeditor/FrameGrabberModule.kt +67 -0
  7. package/android/src/main/java/com/technotoil/image_videoeditor/MediaEditorModule.kt +548 -0
  8. package/android/src/main/java/com/technotoil/image_videoeditor/MediaFileUtils.kt +29 -0
  9. package/android/src/main/java/com/technotoil/image_videoeditor/MediaLibraryModule.kt +305 -0
  10. package/android/src/main/java/com/technotoil/image_videoeditor/MediaPackage.kt +26 -0
  11. package/android/src/main/java/com/technotoil/image_videoeditor/MediaPickerModule.kt +111 -0
  12. package/android/src/main/java/com/technotoil/image_videoeditor/MediaPlayerModule.kt +34 -0
  13. package/android/src/main/java/com/technotoil/image_videoeditor/RNCameraViewManager.kt +761 -0
  14. package/android/src/main/java/com/technotoil/image_videoeditor/RNVideoPreviewManager.kt +317 -0
  15. package/ios/PrivacyInfo.xcprivacy +38 -0
  16. package/ios/RNCameraViewManager.m +420 -0
  17. package/ios/RNFrameGrabber.m +61 -0
  18. package/ios/RNMediaEditor.m +905 -0
  19. package/ios/RNMediaLibrary.m +389 -0
  20. package/ios/RNMediaPicker.m +144 -0
  21. package/ios/RNMediaPlayer.m +73 -0
  22. package/ios/RNVideoPreviewManager.m +263 -0
  23. package/ios/frames/film_vintage.png +0 -0
  24. package/ios/frames/floral_gold.png +0 -0
  25. package/ios/frames/minimal_double.png +0 -0
  26. package/ios/frames/polaroid_white.png +0 -0
  27. package/ios/frames/watercolor_floral.png +0 -0
  28. package/lib/module/assets/frames/film_vintage.png +0 -0
  29. package/lib/module/assets/frames/floral_gold.png +0 -0
  30. package/lib/module/assets/frames/minimal_double.png +0 -0
  31. package/lib/module/assets/frames/polaroid_white.png +0 -0
  32. package/lib/module/assets/frames/watercolor_floral.png +0 -0
  33. package/lib/module/components/VideoEditor.js +156 -0
  34. package/lib/module/components/VideoEditor.js.map +1 -0
  35. package/lib/module/index.js +4 -0
  36. package/lib/module/index.js.map +1 -0
  37. package/lib/module/native/CameraView.js +104 -0
  38. package/lib/module/native/CameraView.js.map +1 -0
  39. package/lib/module/native/FrameGrabber.js +13 -0
  40. package/lib/module/native/FrameGrabber.js.map +1 -0
  41. package/lib/module/native/MediaEditor.js +19 -0
  42. package/lib/module/native/MediaEditor.js.map +1 -0
  43. package/lib/module/native/MediaLibrary.js +37 -0
  44. package/lib/module/native/MediaLibrary.js.map +1 -0
  45. package/lib/module/native/MediaPicker.js +13 -0
  46. package/lib/module/native/MediaPicker.js.map +1 -0
  47. package/lib/module/native/MediaPlayer.js +13 -0
  48. package/lib/module/native/MediaPlayer.js.map +1 -0
  49. package/lib/module/native/VideoPreview.js +12 -0
  50. package/lib/module/native/VideoPreview.js.map +1 -0
  51. package/lib/module/package.json +1 -0
  52. package/lib/module/screens/CropScreen.js +1211 -0
  53. package/lib/module/screens/CropScreen.js.map +1 -0
  54. package/lib/module/screens/EditorScreen.js +5752 -0
  55. package/lib/module/screens/EditorScreen.js.map +1 -0
  56. package/lib/module/screens/ExportScreen.js +289 -0
  57. package/lib/module/screens/ExportScreen.js.map +1 -0
  58. package/lib/module/screens/GalleryScreen.js +505 -0
  59. package/lib/module/screens/GalleryScreen.js.map +1 -0
  60. package/lib/module/screens/PickScreen.js +1195 -0
  61. package/lib/module/screens/PickScreen.js.map +1 -0
  62. package/lib/module/types.js +2 -0
  63. package/lib/module/types.js.map +1 -0
  64. package/lib/typescript/src/components/VideoEditor.d.ts +13 -0
  65. package/lib/typescript/src/index.d.ts +2 -0
  66. package/lib/typescript/src/native/CameraView.d.ts +23 -0
  67. package/lib/typescript/src/native/FrameGrabber.d.ts +2 -0
  68. package/lib/typescript/src/native/MediaEditor.d.ts +3 -0
  69. package/lib/typescript/src/native/MediaLibrary.d.ts +16 -0
  70. package/lib/typescript/src/native/MediaPicker.d.ts +2 -0
  71. package/lib/typescript/src/native/MediaPlayer.d.ts +1 -0
  72. package/lib/typescript/src/native/VideoPreview.d.ts +19 -0
  73. package/lib/typescript/src/screens/CropScreen.d.ts +9 -0
  74. package/lib/typescript/src/screens/EditorScreen.d.ts +10 -0
  75. package/lib/typescript/src/screens/ExportScreen.d.ts +9 -0
  76. package/lib/typescript/src/screens/GalleryScreen.d.ts +8 -0
  77. package/lib/typescript/src/screens/PickScreen.d.ts +13 -0
  78. package/lib/typescript/src/types.d.ts +58 -0
  79. package/package.json +101 -0
  80. package/src/assets/frames/film_vintage.png +0 -0
  81. package/src/assets/frames/floral_gold.png +0 -0
  82. package/src/assets/frames/minimal_double.png +0 -0
  83. package/src/assets/frames/polaroid_white.png +0 -0
  84. package/src/assets/frames/watercolor_floral.png +0 -0
  85. package/src/components/VideoEditor.tsx +182 -0
  86. package/src/index.tsx +2 -0
  87. package/src/native/CameraView.tsx +95 -0
  88. package/src/native/FrameGrabber.ts +21 -0
  89. package/src/native/MediaEditor.ts +33 -0
  90. package/src/native/MediaLibrary.ts +69 -0
  91. package/src/native/MediaPicker.ts +17 -0
  92. package/src/native/MediaPlayer.ts +16 -0
  93. package/src/native/VideoPreview.tsx +20 -0
  94. package/src/screens/CropScreen.tsx +968 -0
  95. package/src/screens/EditorScreen.tsx +4517 -0
  96. package/src/screens/ExportScreen.tsx +282 -0
  97. package/src/screens/GalleryScreen.tsx +412 -0
  98. package/src/screens/PickScreen.tsx +1094 -0
  99. package/src/types.ts +58 -0
@@ -0,0 +1,263 @@
1
+ #import <React/RCTViewManager.h>
2
+ #import <React/RCTConvert.h>
3
+ #import <React/RCTEventEmitter.h>
4
+ #import <AVFoundation/AVFoundation.h>
5
+
6
+ @interface RNVideoPreviewView : UIView
7
+
8
+ @property(nonatomic, strong) AVPlayer *player;
9
+ @property(nonatomic, strong) AVPlayerLayer *playerLayer;
10
+ @property(nonatomic, strong) id timeObserver;
11
+ @property(nonatomic, copy) NSString *uri;
12
+ @property(nonatomic, assign) BOOL paused;
13
+ @property(nonatomic, assign) BOOL muted;
14
+ @property(nonatomic, copy) NSString *resizeMode;
15
+ @property(nonatomic, assign) int trimStartMs;
16
+ @property(nonatomic, assign) int trimEndMs;
17
+ @property(nonatomic, assign) int seekToMs;
18
+ @property(nonatomic, copy) RCTBubblingEventBlock onChange;
19
+
20
+ // internal flag: player item is ready
21
+ @property(nonatomic, assign) BOOL isPlayerReady;
22
+
23
+ @end
24
+
25
+ @implementation RNVideoPreviewView
26
+
27
+ - (instancetype)initWithFrame:(CGRect)frame {
28
+ if (self = [super initWithFrame:frame]) {
29
+ _trimStartMs = 0;
30
+ _trimEndMs = 0;
31
+ _seekToMs = -1;
32
+ _isPlayerReady = NO;
33
+
34
+ self.player = [[AVPlayer alloc] init];
35
+ self.player.actionAtItemEnd = AVPlayerActionAtItemEndNone;
36
+ self.playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player];
37
+ self.playerLayer.videoGravity = AVLayerVideoGravityResizeAspect;
38
+ [self.layer addSublayer:self.playerLayer];
39
+
40
+ // Loop + trim boundary observer
41
+ [[NSNotificationCenter defaultCenter] addObserver:self
42
+ selector:@selector(playerItemDidEnd:)
43
+ name:AVPlayerItemDidPlayToEndTimeNotification
44
+ object:nil];
45
+ }
46
+ return self;
47
+ }
48
+
49
+ - (void)dealloc {
50
+ [[NSNotificationCenter defaultCenter] removeObserver:self];
51
+ [self removePeriodicObserver];
52
+ if (self.player.currentItem) {
53
+ [self.player.currentItem removeObserver:self forKeyPath:@"status"];
54
+ }
55
+ }
56
+
57
+ - (void)layoutSubviews {
58
+ [super layoutSubviews];
59
+ self.playerLayer.frame = self.bounds;
60
+ }
61
+
62
+ // ─── URI ─────────────────────────────────────────────────────────────────────
63
+
64
+ - (void)setUri:(NSString *)uri {
65
+ NSLog(@"[RNVideoPreview] setUri called with: %@", uri);
66
+ if ([_uri isEqualToString:uri]) return;
67
+ _uri = [uri copy];
68
+ if (!_uri || _uri.length == 0) {
69
+ NSLog(@"[RNVideoPreview] Uri is empty or nil, resetting player");
70
+ if (self.player.currentItem) {
71
+ [self.player.currentItem removeObserver:self forKeyPath:@"status"];
72
+ }
73
+ [self.player replaceCurrentItemWithPlayerItem:nil];
74
+ return;
75
+ }
76
+
77
+ // Remove old KVO
78
+ if (self.player.currentItem) {
79
+ [self.player.currentItem removeObserver:self forKeyPath:@"status"];
80
+ }
81
+ [self removePeriodicObserver];
82
+ _isPlayerReady = NO;
83
+
84
+ NSURL *url = [RCTConvert NSURL:_uri];
85
+ if (!url) {
86
+ NSLog(@"[RNVideoPreview] Failed to convert uri to NSURL: %@", _uri);
87
+ return;
88
+ }
89
+ NSLog(@"[RNVideoPreview] Resolved NSURL: %@, scheme: %@", url, url.scheme);
90
+
91
+ AVPlayerItem *item = [AVPlayerItem playerItemWithURL:url];
92
+ [item addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];
93
+ [self.player replaceCurrentItemWithPlayerItem:item];
94
+ self.player.muted = self.muted;
95
+ }
96
+
97
+ // ─── KVO: player item status ──────────────────────────────────────────────────
98
+
99
+ - (void)observeValueForKeyPath:(NSString *)keyPath
100
+ ofObject:(id)object
101
+ change:(NSDictionary *)change
102
+ context:(void *)context {
103
+ if ([keyPath isEqualToString:@"status"]) {
104
+ AVPlayerItem *item = (AVPlayerItem *)object;
105
+ if (item.status == AVPlayerItemStatusReadyToPlay) {
106
+ _isPlayerReady = YES;
107
+ NSLog(@"[RNVideoPreview] Player ready, paused=%d trimStart=%d", self.paused, self.trimStartMs);
108
+
109
+ // Seek to trim start first, then play if not paused
110
+ if (self.trimStartMs > 0) {
111
+ CMTime seekTime = CMTimeMakeWithSeconds(self.trimStartMs / 1000.0, NSEC_PER_SEC);
112
+ [self.player seekToTime:seekTime toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero completionHandler:^(BOOL finished) {
113
+ if (!self.paused) {
114
+ [self.player play];
115
+ }
116
+ }];
117
+ } else {
118
+ if (!self.paused) {
119
+ [self.player play];
120
+ }
121
+ }
122
+
123
+ [self startPeriodicObserver];
124
+ } else if (item.status == AVPlayerItemStatusFailed) {
125
+ NSLog(@"[RNVideoPreview] Player item failed: %@. Error description: %@, code: %ld, domain: %@",
126
+ item.error, item.error.localizedDescription, (long)item.error.code, item.error.domain);
127
+ }
128
+ }
129
+ }
130
+
131
+ // ─── PERIODIC PROGRESS OBSERVER ──────────────────────────────────────────────
132
+
133
+ - (void)startPeriodicObserver {
134
+ [self removePeriodicObserver];
135
+ __weak typeof(self) weakSelf = self;
136
+ CMTime interval = CMTimeMakeWithSeconds(0.1, NSEC_PER_SEC);
137
+ self.timeObserver = [self.player addPeriodicTimeObserverForInterval:interval
138
+ queue:dispatch_get_main_queue()
139
+ usingBlock:^(CMTime time) {
140
+ __strong typeof(weakSelf) strongSelf = weakSelf;
141
+ if (!strongSelf) return;
142
+
143
+ double currentSec = CMTimeGetSeconds(time);
144
+ int currentMs = (int)(currentSec * 1000.0);
145
+
146
+ // Trim boundary enforcement
147
+ if (strongSelf.trimEndMs > 0 && currentMs >= strongSelf.trimEndMs) {
148
+ CMTime trimStart = CMTimeMakeWithSeconds(strongSelf.trimStartMs / 1000.0, NSEC_PER_SEC);
149
+ [strongSelf.player seekToTime:trimStart toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero completionHandler:^(BOOL finished) {
150
+ if (!strongSelf.paused) {
151
+ [strongSelf.player play];
152
+ }
153
+ }];
154
+ return;
155
+ }
156
+
157
+ // Emit onChange
158
+ if (strongSelf.onChange) {
159
+ strongSelf.onChange(@{ @"currentTimeMs": @(currentMs) });
160
+ }
161
+ }];
162
+ }
163
+
164
+ - (void)removePeriodicObserver {
165
+ if (self.timeObserver) {
166
+ [self.player removeTimeObserver:self.timeObserver];
167
+ self.timeObserver = nil;
168
+ }
169
+ }
170
+
171
+ // ─── LOOP ─────────────────────────────────────────────────────────────────────
172
+
173
+ - (void)playerItemDidEnd:(NSNotification *)note {
174
+ if (note.object == self.player.currentItem) {
175
+ CMTime seekTime = CMTimeMakeWithSeconds(self.trimStartMs / 1000.0, NSEC_PER_SEC);
176
+ [self.player seekToTime:seekTime toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero completionHandler:^(BOOL finished) {
177
+ if (!self.paused) {
178
+ [self.player play];
179
+ }
180
+ }];
181
+ }
182
+ }
183
+
184
+ // ─── PROPS ────────────────────────────────────────────────────────────────────
185
+
186
+ - (void)setPaused:(BOOL)paused {
187
+ _paused = paused;
188
+ NSLog(@"[RNVideoPreview] setPaused=%d isReady=%d", paused, _isPlayerReady);
189
+ if (paused) {
190
+ [self.player pause];
191
+ } else {
192
+ if (_isPlayerReady) {
193
+ [self.player play];
194
+ }
195
+ // If not ready yet, onPrepared (KVO) will auto-play when ready
196
+ }
197
+ }
198
+
199
+ - (void)setMuted:(BOOL)muted {
200
+ _muted = muted;
201
+ self.player.muted = muted;
202
+ }
203
+
204
+ - (void)setResizeMode:(NSString *)resizeMode {
205
+ _resizeMode = [resizeMode copy];
206
+ if ([_resizeMode isEqualToString:@"contain"]) {
207
+ self.playerLayer.videoGravity = AVLayerVideoGravityResizeAspect;
208
+ } else if ([_resizeMode isEqualToString:@"stretch"]) {
209
+ self.playerLayer.videoGravity = AVLayerVideoGravityResize;
210
+ } else {
211
+ self.playerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
212
+ }
213
+ }
214
+
215
+ - (void)setTrimStartMs:(int)trimStartMs {
216
+ _trimStartMs = trimStartMs;
217
+ // If current position is before trim start, seek forward
218
+ if (_isPlayerReady) {
219
+ double current = CMTimeGetSeconds(self.player.currentTime) * 1000.0;
220
+ if (current < trimStartMs) {
221
+ CMTime t = CMTimeMakeWithSeconds(trimStartMs / 1000.0, NSEC_PER_SEC);
222
+ [self.player seekToTime:t toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];
223
+ }
224
+ }
225
+ }
226
+
227
+ - (void)setTrimEndMs:(int)trimEndMs {
228
+ _trimEndMs = trimEndMs;
229
+ }
230
+
231
+ - (void)setSeekToMs:(int)seekToMs {
232
+ _seekToMs = seekToMs;
233
+ if (seekToMs >= 0 && _isPlayerReady) {
234
+ CMTime t = CMTimeMakeWithSeconds(seekToMs / 1000.0, NSEC_PER_SEC);
235
+ [self.player seekToTime:t toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];
236
+ }
237
+ }
238
+
239
+ @end
240
+
241
+ // ─── MANAGER ──────────────────────────────────────────────────────────────────
242
+
243
+ @interface RNVideoPreviewManager : RCTViewManager
244
+ @end
245
+
246
+ @implementation RNVideoPreviewManager
247
+
248
+ RCT_EXPORT_MODULE(RNVideoPreview)
249
+
250
+ - (UIView *)view {
251
+ return [[RNVideoPreviewView alloc] initWithFrame:CGRectZero];
252
+ }
253
+
254
+ RCT_EXPORT_VIEW_PROPERTY(uri, NSString)
255
+ RCT_EXPORT_VIEW_PROPERTY(paused, BOOL)
256
+ RCT_EXPORT_VIEW_PROPERTY(muted, BOOL)
257
+ RCT_EXPORT_VIEW_PROPERTY(resizeMode, NSString)
258
+ RCT_EXPORT_VIEW_PROPERTY(trimStartMs, int)
259
+ RCT_EXPORT_VIEW_PROPERTY(trimEndMs, int)
260
+ RCT_EXPORT_VIEW_PROPERTY(seekToMs, int)
261
+ RCT_EXPORT_VIEW_PROPERTY(onChange, RCTBubblingEventBlock)
262
+
263
+ @end
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,156 @@
1
+ "use strict";
2
+
3
+ import React, { useState } from 'react';
4
+ import { StatusBar, useColorScheme } from 'react-native';
5
+ import { SafeAreaProvider, SafeAreaView } from 'react-native-safe-area-context';
6
+ import { PickScreen } from "../screens/PickScreen.js";
7
+ import { CropScreen } from "../screens/CropScreen.js";
8
+ import { EditorScreen } from "../screens/EditorScreen.js";
9
+ import { ExportScreen } from "../screens/ExportScreen.js";
10
+ import { exportAsset } from "../native/MediaLibrary.js";
11
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
12
+ export default function VideoEditor({
13
+ onClose,
14
+ onFinishExport,
15
+ headerTitle,
16
+ customCancelIcon,
17
+ onCancelPress,
18
+ cameraModes,
19
+ defaultCameraMode,
20
+ musicList
21
+ }) {
22
+ const isDarkMode = useColorScheme() === 'dark';
23
+ const [screen, setScreen] = useState('pick');
24
+ const [items, setItems] = useState([]);
25
+ const [current, setCurrent] = useState(null);
26
+ const [editedMedia, setEditedMedia] = useState({});
27
+ const [originals, setOriginals] = useState({});
28
+ const [selectedCameraMode, setSelectedCameraMode] = useState(defaultCameraMode || 'STORY');
29
+ const ensureExported = async (item, ignoreEdits = false) => {
30
+ if (!ignoreEdits && editedMedia[item.id]) {
31
+ return editedMedia[item.id];
32
+ }
33
+ if (!item.uri.startsWith('ph://') && !item.uri.startsWith('content://')) {
34
+ return item;
35
+ }
36
+ try {
37
+ const fileUri = await exportAsset(item.id);
38
+ return {
39
+ ...item,
40
+ uri: fileUri
41
+ };
42
+ } catch (err) {
43
+ console.error('ASSET EXPORT FROM LIBRARY FAILED:', err?.message ?? err);
44
+ return item;
45
+ }
46
+ };
47
+ return /*#__PURE__*/_jsx(SafeAreaProvider, {
48
+ children: /*#__PURE__*/_jsxs(SafeAreaView, {
49
+ style: {
50
+ flex: 1,
51
+ backgroundColor: '#0b0f1a'
52
+ },
53
+ edges: ['top', 'bottom', 'left', 'right'],
54
+ children: [/*#__PURE__*/_jsx(StatusBar, {
55
+ barStyle: "light-content",
56
+ backgroundColor: "transparent",
57
+ translucent: true
58
+ }), screen === 'pick' && /*#__PURE__*/_jsx(PickScreen, {
59
+ items: items,
60
+ headerTitle: headerTitle,
61
+ customCancelIcon: customCancelIcon,
62
+ onCancelPress: onCancelPress || onClose,
63
+ cameraModes: cameraModes,
64
+ defaultCameraMode: defaultCameraMode,
65
+ onCameraModeChange: mode => {
66
+ setSelectedCameraMode(mode);
67
+ },
68
+ onPicked: picked => {
69
+ // Save originals for "Fresh Start" editing
70
+ const newOriginals = {
71
+ ...originals
72
+ };
73
+ picked.forEach(p => {
74
+ if (!newOriginals[p.id]) newOriginals[p.id] = p;
75
+ });
76
+ setOriginals(newOriginals);
77
+ setItems(picked);
78
+ },
79
+ onNext: async picked => {
80
+ if (!picked || picked.length === 0) {
81
+ return;
82
+ }
83
+ const resolvedItems = await Promise.all(picked.map(item => ensureExported(item, false)));
84
+ setItems(resolvedItems);
85
+ setCurrent(resolvedItems[0]);
86
+ setScreen('editor');
87
+ }
88
+ }), screen === 'editor' && current && /*#__PURE__*/_jsx(EditorScreen, {
89
+ items: items,
90
+ initialIndex: Math.max(0, items.findIndex(it => it.id === current.id)),
91
+ onBack: () => {
92
+ setEditedMedia({});
93
+ const restoredItems = items.map(item => originals[item.id] || item);
94
+ setItems(restoredItems);
95
+ if (onClose) {
96
+ onClose();
97
+ } else {
98
+ setScreen('pick');
99
+ }
100
+ },
101
+ onSaved: updatedItems => {
102
+ const newEditedMedia = {
103
+ ...editedMedia
104
+ };
105
+ const paths = [];
106
+ updatedItems.forEach(item => {
107
+ newEditedMedia[item.id] = item;
108
+ paths.push(item.uri);
109
+ });
110
+ setEditedMedia(newEditedMedia);
111
+ setItems(updatedItems);
112
+ if (onFinishExport) {
113
+ onFinishExport(newEditedMedia, paths, updatedItems, selectedCameraMode);
114
+ }
115
+
116
+ // Do not show the export screen, reset to pick screen
117
+ setScreen('pick');
118
+ },
119
+ onOpenCrop: item => {
120
+ setCurrent(item);
121
+ setScreen('crop');
122
+ },
123
+ musicList: musicList
124
+ }), screen === 'crop' && current && /*#__PURE__*/_jsx(CropScreen, {
125
+ item: current,
126
+ onBack: () => setScreen('editor'),
127
+ onSave: (uri, thumbnailUri, durationMs) => {
128
+ const updated = {
129
+ ...current,
130
+ uri,
131
+ thumbnailUri: thumbnailUri ?? current.thumbnailUri,
132
+ durationMs: durationMs ?? current.durationMs
133
+ };
134
+ setEditedMedia(prev => ({
135
+ ...prev,
136
+ [current.id]: updated
137
+ }));
138
+ setItems(prev => prev.map(it => it.id === current.id ? updated : it));
139
+ setCurrent(updated);
140
+ setScreen('editor');
141
+ }
142
+ }), screen === 'export' && /*#__PURE__*/_jsx(ExportScreen, {
143
+ editedMedia: editedMedia,
144
+ onHome: () => {
145
+ setEditedMedia({});
146
+ setScreen('pick');
147
+ },
148
+ onReEdit: item => {
149
+ setCurrent(item);
150
+ setScreen('editor');
151
+ }
152
+ })]
153
+ })
154
+ });
155
+ }
156
+ //# sourceMappingURL=VideoEditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","useState","StatusBar","useColorScheme","SafeAreaProvider","SafeAreaView","PickScreen","CropScreen","EditorScreen","ExportScreen","exportAsset","jsx","_jsx","jsxs","_jsxs","VideoEditor","onClose","onFinishExport","headerTitle","customCancelIcon","onCancelPress","cameraModes","defaultCameraMode","musicList","isDarkMode","screen","setScreen","items","setItems","current","setCurrent","editedMedia","setEditedMedia","originals","setOriginals","selectedCameraMode","setSelectedCameraMode","ensureExported","item","ignoreEdits","id","uri","startsWith","fileUri","err","console","error","message","children","style","flex","backgroundColor","edges","barStyle","translucent","onCameraModeChange","mode","onPicked","picked","newOriginals","forEach","p","onNext","length","resolvedItems","Promise","all","map","initialIndex","Math","max","findIndex","it","onBack","restoredItems","onSaved","updatedItems","newEditedMedia","paths","push","onOpenCrop","onSave","thumbnailUri","durationMs","updated","prev","onHome","onReEdit"],"sourceRoot":"../../../src","sources":["components/VideoEditor.tsx"],"mappings":";;AAAA,OAAOA,KAAK,IAAIC,QAAQ,QAAQ,OAAO;AACvC,SAAgBC,SAAS,EAAEC,cAAc,QAAQ,cAAc;AAC/D,SAASC,gBAAgB,EAAEC,YAAY,QAAQ,gCAAgC;AAC/E,SAASC,UAAU,QAAQ,0BAAuB;AAClD,SAASC,UAAU,QAAQ,0BAAuB;AAClD,SAASC,YAAY,QAAQ,4BAAyB;AACtD,SAASC,YAAY,QAAQ,4BAAyB;AACtD,SAASC,WAAW,QAAQ,2BAAwB;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAmBrD,eAAe,SAASC,WAAWA,CAAC;EAClCC,OAAO;EACPC,cAAc;EACdC,WAAW;EACXC,gBAAgB;EAChBC,aAAa;EACbC,WAAW;EACXC,iBAAiB;EACjBC;AACgB,CAAC,EAAE;EACnB,MAAMC,UAAU,GAAGrB,cAAc,CAAC,CAAC,KAAK,MAAM;EAC9C,MAAM,CAACsB,MAAM,EAAEC,SAAS,CAAC,GAAGzB,QAAQ,CAAwC,MAAM,CAAC;EACnF,MAAM,CAAC0B,KAAK,EAAEC,QAAQ,CAAC,GAAG3B,QAAQ,CAAc,EAAE,CAAC;EACnD,MAAM,CAAC4B,OAAO,EAAEC,UAAU,CAAC,GAAG7B,QAAQ,CAAmB,IAAI,CAAC;EAC9D,MAAM,CAAC8B,WAAW,EAAEC,cAAc,CAAC,GAAG/B,QAAQ,CAA4B,CAAC,CAAC,CAAC;EAC7E,MAAM,CAACgC,SAAS,EAAEC,YAAY,CAAC,GAAGjC,QAAQ,CAA4B,CAAC,CAAC,CAAC;EACzE,MAAM,CAACkC,kBAAkB,EAAEC,qBAAqB,CAAC,GAAGnC,QAAQ,CAASqB,iBAAiB,IAAI,OAAO,CAAC;EAElG,MAAMe,cAAc,GAAG,MAAAA,CAAOC,IAAe,EAAEC,WAAW,GAAG,KAAK,KAAyB;IACzF,IAAI,CAACA,WAAW,IAAIR,WAAW,CAACO,IAAI,CAACE,EAAE,CAAC,EAAE;MACxC,OAAOT,WAAW,CAACO,IAAI,CAACE,EAAE,CAAC;IAC7B;IACA,IAAI,CAACF,IAAI,CAACG,GAAG,CAACC,UAAU,CAAC,OAAO,CAAC,IAAI,CAACJ,IAAI,CAACG,GAAG,CAACC,UAAU,CAAC,YAAY,CAAC,EAAE;MACvE,OAAOJ,IAAI;IACb;IACA,IAAI;MACF,MAAMK,OAAO,GAAG,MAAMjC,WAAW,CAAC4B,IAAI,CAACE,EAAE,CAAC;MAC1C,OAAO;QAAE,GAAGF,IAAI;QAAEG,GAAG,EAAEE;MAAQ,CAAC;IAClC,CAAC,CAAC,OAAOC,GAAQ,EAAE;MACjBC,OAAO,CAACC,KAAK,CAAC,mCAAmC,EAAEF,GAAG,EAAEG,OAAO,IAAIH,GAAG,CAAC;MACvE,OAAON,IAAI;IACb;EACF,CAAC;EAED,oBACE1B,IAAA,CAACR,gBAAgB;IAAA4C,QAAA,eACflC,KAAA,CAACT,YAAY;MAAC4C,KAAK,EAAE;QAAEC,IAAI,EAAE,CAAC;QAAEC,eAAe,EAAE;MAAU,CAAE;MAACC,KAAK,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAE;MAAAJ,QAAA,gBACtGpC,IAAA,CAACV,SAAS;QACRmD,QAAQ,EAAC,eAAe;QACxBF,eAAe,EAAC,aAAa;QAC7BG,WAAW,EAAE;MAAK,CACnB,CAAC,EACD7B,MAAM,KAAK,MAAM,iBAChBb,IAAA,CAACN,UAAU;QACTqB,KAAK,EAAEA,KAAM;QACbT,WAAW,EAAEA,WAAY;QACzBC,gBAAgB,EAAEA,gBAAiB;QACnCC,aAAa,EAAEA,aAAa,IAAIJ,OAAQ;QACxCK,WAAW,EAAEA,WAAY;QACzBC,iBAAiB,EAAEA,iBAAkB;QACrCiC,kBAAkB,EAAGC,IAAI,IAAK;UAC5BpB,qBAAqB,CAACoB,IAAI,CAAC;QAC7B,CAAE;QACFC,QAAQ,EAAGC,MAAmB,IAAK;UACjC;UACA,MAAMC,YAAY,GAAG;YAAE,GAAG1B;UAAU,CAAC;UACrCyB,MAAM,CAACE,OAAO,CAACC,CAAC,IAAI;YAClB,IAAI,CAACF,YAAY,CAACE,CAAC,CAACrB,EAAE,CAAC,EAAEmB,YAAY,CAACE,CAAC,CAACrB,EAAE,CAAC,GAAGqB,CAAC;UACjD,CAAC,CAAC;UACF3B,YAAY,CAACyB,YAAY,CAAC;UAE1B/B,QAAQ,CAAC8B,MAAM,CAAC;QAClB,CAAE;QACFI,MAAM,EAAE,MAAOJ,MAAM,IAAK;UACxB,IAAI,CAACA,MAAM,IAAIA,MAAM,CAACK,MAAM,KAAK,CAAC,EAAE;YAClC;UACF;UACA,MAAMC,aAAa,GAAG,MAAMC,OAAO,CAACC,GAAG,CACrCR,MAAM,CAACS,GAAG,CAAC7B,IAAI,IAAID,cAAc,CAACC,IAAI,EAAE,KAAK,CAAC,CAChD,CAAC;UACDV,QAAQ,CAACoC,aAAa,CAAC;UACvBlC,UAAU,CAACkC,aAAa,CAAC,CAAC,CAAC,CAAC;UAC5BtC,SAAS,CAAC,QAAQ,CAAC;QACrB;MAAE,CACH,CACF,EACAD,MAAM,KAAK,QAAQ,IAAII,OAAO,iBAC5BjB,IAAA,CAACJ,YAAY;QACZmB,KAAK,EAAEA,KAAM;QACbyC,YAAY,EAAEC,IAAI,CAACC,GAAG,CAAC,CAAC,EAAE3C,KAAK,CAAC4C,SAAS,CAACC,EAAE,IAAIA,EAAE,CAAChC,EAAE,KAAKX,OAAO,CAACW,EAAE,CAAC,CAAE;QACvEiC,MAAM,EAAEA,CAAA,KAAM;UACZzC,cAAc,CAAC,CAAC,CAAC,CAAC;UAClB,MAAM0C,aAAa,GAAG/C,KAAK,CAACwC,GAAG,CAAC7B,IAAI,IAAIL,SAAS,CAACK,IAAI,CAACE,EAAE,CAAC,IAAIF,IAAI,CAAC;UACnEV,QAAQ,CAAC8C,aAAa,CAAC;UACvB,IAAI1D,OAAO,EAAE;YACXA,OAAO,CAAC,CAAC;UACX,CAAC,MAAM;YACLU,SAAS,CAAC,MAAM,CAAC;UACnB;QACF,CAAE;QACFiD,OAAO,EAAGC,YAAY,IAAK;UACzB,MAAMC,cAAc,GAAG;YAAE,GAAG9C;UAAY,CAAC;UACzC,MAAM+C,KAAe,GAAG,EAAE;UAE1BF,YAAY,CAAChB,OAAO,CAACtB,IAAI,IAAI;YAC3BuC,cAAc,CAACvC,IAAI,CAACE,EAAE,CAAC,GAAGF,IAAI;YAC9BwC,KAAK,CAACC,IAAI,CAACzC,IAAI,CAACG,GAAG,CAAC;UACtB,CAAC,CAAC;UAEFT,cAAc,CAAC6C,cAAc,CAAC;UAC9BjD,QAAQ,CAACgD,YAAY,CAAC;UAEtB,IAAI3D,cAAc,EAAE;YAClBA,cAAc,CAAC4D,cAAc,EAAEC,KAAK,EAAEF,YAAY,EAAEzC,kBAAkB,CAAC;UACzE;;UAEA;UACAT,SAAS,CAAC,MAAM,CAAC;QACnB,CAAE;QACFsD,UAAU,EAAG1C,IAAI,IAAK;UACpBR,UAAU,CAACQ,IAAI,CAAC;UAChBZ,SAAS,CAAC,MAAM,CAAC;QACnB,CAAE;QACFH,SAAS,EAAEA;MAAU,CACrB,CACH,EACAE,MAAM,KAAK,MAAM,IAAII,OAAO,iBAC3BjB,IAAA,CAACL,UAAU;QACT+B,IAAI,EAAET,OAAQ;QACd4C,MAAM,EAAEA,CAAA,KAAM/C,SAAS,CAAC,QAAQ,CAAE;QAClCuD,MAAM,EAAEA,CAACxC,GAAG,EAAEyC,YAAY,EAAEC,UAAU,KAAK;UACzC,MAAMC,OAAO,GAAG;YACd,GAAGvD,OAAO;YACVY,GAAG;YACHyC,YAAY,EAAEA,YAAY,IAAIrD,OAAO,CAACqD,YAAY;YAClDC,UAAU,EAAEA,UAAU,IAAItD,OAAO,CAACsD;UACpC,CAAC;UAEDnD,cAAc,CAAEqD,IAA+B,KAAM;YAAE,GAAGA,IAAI;YAAE,CAACxD,OAAO,CAACW,EAAE,GAAG4C;UAAQ,CAAC,CAAC,CAAC;UAEzFxD,QAAQ,CAAEyD,IAAiB,IACzBA,IAAI,CAAClB,GAAG,CAAEK,EAAE,IAAKA,EAAE,CAAChC,EAAE,KAAKX,OAAO,CAACW,EAAE,GAAG4C,OAAO,GAAGZ,EAAE,CACtD,CAAC;UAED1C,UAAU,CAACsD,OAAO,CAAC;UACnB1D,SAAS,CAAC,QAAQ,CAAC;QACrB;MAAE,CACH,CACF,EACAD,MAAM,KAAK,QAAQ,iBAClBb,IAAA,CAACH,YAAY;QACXsB,WAAW,EAAEA,WAAY;QACzBuD,MAAM,EAAEA,CAAA,KAAM;UACZtD,cAAc,CAAC,CAAC,CAAC,CAAC;UAClBN,SAAS,CAAC,MAAM,CAAC;QACnB,CAAE;QACF6D,QAAQ,EAAGjD,IAAI,IAAK;UAChBR,UAAU,CAACQ,IAAI,CAAC;UAChBZ,SAAS,CAAC,QAAQ,CAAC;QACvB;MAAE,CACH,CACF;IAAA,CACW;EAAC,CACC,CAAC;AAEvB","ignoreList":[]}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+
3
+ export { default as VideoEditor } from "./components/VideoEditor.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["default","VideoEditor"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,SAASA,OAAO,IAAIC,WAAW,QAAQ,6BAA0B","ignoreList":[]}
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+
3
+ import React, { forwardRef, useImperativeHandle, useRef, useState } from 'react';
4
+ import { requireNativeComponent } from 'react-native';
5
+ import { jsx as _jsx } from "react/jsx-runtime";
6
+ const NativeCameraView = requireNativeComponent('RNCameraView');
7
+ export const CameraView = /*#__PURE__*/forwardRef(({
8
+ facing,
9
+ flashMode = 'off',
10
+ style
11
+ }, ref) => {
12
+ const [photoTrigger, setPhotoTrigger] = useState('');
13
+ const [recordTrigger, setRecordTrigger] = useState('idle');
14
+ const photoPromiseRef = useRef(null);
15
+ const recordStartPromiseRef = useRef(null);
16
+ const recordStopPromiseRef = useRef(null);
17
+ useImperativeHandle(ref, () => ({
18
+ capturePhoto: () => {
19
+ return new Promise((resolve, reject) => {
20
+ photoPromiseRef.current = {
21
+ resolve,
22
+ reject
23
+ };
24
+ setPhotoTrigger(Date.now().toString());
25
+ });
26
+ },
27
+ startRecording: () => {
28
+ return new Promise((resolve, reject) => {
29
+ recordStartPromiseRef.current = {
30
+ resolve,
31
+ reject
32
+ };
33
+ setRecordTrigger('start');
34
+ });
35
+ },
36
+ stopRecording: () => {
37
+ return new Promise((resolve, reject) => {
38
+ recordStopPromiseRef.current = {
39
+ resolve,
40
+ reject
41
+ };
42
+ setRecordTrigger('stop');
43
+ });
44
+ }
45
+ }));
46
+ return /*#__PURE__*/_jsx(NativeCameraView, {
47
+ facing: facing,
48
+ flashMode: flashMode,
49
+ style: style,
50
+ photoTrigger: photoTrigger,
51
+ recordTrigger: recordTrigger,
52
+ onPhotoCaptured: e => {
53
+ const {
54
+ uri,
55
+ width,
56
+ height,
57
+ error
58
+ } = e.nativeEvent;
59
+ if (error) {
60
+ photoPromiseRef.current?.reject(new Error(error));
61
+ } else {
62
+ photoPromiseRef.current?.resolve({
63
+ uri,
64
+ width,
65
+ height
66
+ });
67
+ }
68
+ photoPromiseRef.current = null;
69
+ },
70
+ onRecordStarted: e => {
71
+ const {
72
+ error
73
+ } = e.nativeEvent;
74
+ if (error) {
75
+ recordStartPromiseRef.current?.reject(new Error(error));
76
+ } else {
77
+ recordStartPromiseRef.current?.resolve();
78
+ }
79
+ recordStartPromiseRef.current = null;
80
+ },
81
+ onRecordStopped: e => {
82
+ const {
83
+ uri,
84
+ durationMs,
85
+ width,
86
+ height,
87
+ error
88
+ } = e.nativeEvent;
89
+ if (error) {
90
+ recordStopPromiseRef.current?.reject(new Error(error));
91
+ } else {
92
+ recordStopPromiseRef.current?.resolve({
93
+ uri,
94
+ durationMs,
95
+ width,
96
+ height
97
+ });
98
+ }
99
+ recordStopPromiseRef.current = null;
100
+ setRecordTrigger('idle');
101
+ }
102
+ });
103
+ });
104
+ //# sourceMappingURL=CameraView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","forwardRef","useImperativeHandle","useRef","useState","requireNativeComponent","jsx","_jsx","NativeCameraView","CameraView","facing","flashMode","style","ref","photoTrigger","setPhotoTrigger","recordTrigger","setRecordTrigger","photoPromiseRef","recordStartPromiseRef","recordStopPromiseRef","capturePhoto","Promise","resolve","reject","current","Date","now","toString","startRecording","stopRecording","onPhotoCaptured","e","uri","width","height","error","nativeEvent","Error","onRecordStarted","onRecordStopped","durationMs"],"sourceRoot":"../../../src","sources":["native/CameraView.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+
3
+ import { NativeModules, Platform } from 'react-native';
4
+ const {
5
+ RNFrameGrabber
6
+ } = NativeModules;
7
+ export async function captureFrame(uri, options) {
8
+ if (!RNFrameGrabber?.captureFrame) {
9
+ throw new Error(`RNFrameGrabber.captureFrame is not available on ${Platform.OS}. Make sure the native module is linked.`);
10
+ }
11
+ return RNFrameGrabber.captureFrame(uri, options);
12
+ }
13
+ //# sourceMappingURL=FrameGrabber.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["NativeModules","Platform","RNFrameGrabber","captureFrame","uri","options","Error","OS"],"sourceRoot":"../../../src","sources":["native/FrameGrabber.ts"],"mappings":";;AAAA,SAASA,aAAa,EAAEC,QAAQ,QAAQ,cAAc;AAGtD,MAAM;EAAEC;AAAe,CAAC,GAAGF,aAI1B;AAED,OAAO,eAAeG,YAAYA,CAChCC,GAAW,EACXC,OAA4B,EACX;EACjB,IAAI,CAACH,cAAc,EAAEC,YAAY,EAAE;IACjC,MAAM,IAAIG,KAAK,CACb,mDAAmDL,QAAQ,CAACM,EAAE,0CAChE,CAAC;EACH;EACA,OAAOL,cAAc,CAACC,YAAY,CAACC,GAAG,EAAEC,OAAO,CAAC;AAClD","ignoreList":[]}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+
3
+ import { NativeModules, Platform } from 'react-native';
4
+ const {
5
+ RNMediaEditor
6
+ } = NativeModules;
7
+ export async function editImage(uri, options) {
8
+ if (!RNMediaEditor?.editImage) {
9
+ throw new Error(`RNMediaEditor.editImage is not available on ${Platform.OS}. Make sure the native module is linked.`);
10
+ }
11
+ return RNMediaEditor.editImage(uri, options);
12
+ }
13
+ export async function trimVideo(uri, options) {
14
+ if (!RNMediaEditor?.trimVideo) {
15
+ throw new Error(`RNMediaEditor.trimVideo is not available on ${Platform.OS}. Make sure the native module is linked.`);
16
+ }
17
+ return RNMediaEditor.trimVideo(uri, options);
18
+ }
19
+ //# sourceMappingURL=MediaEditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["NativeModules","Platform","RNMediaEditor","editImage","uri","options","Error","OS","trimVideo"],"sourceRoot":"../../../src","sources":["native/MediaEditor.ts"],"mappings":";;AAAA,SAASA,aAAa,EAAEC,QAAQ,QAAQ,cAAc;AAGtD,MAAM;EAAEC;AAAc,CAAC,GAAGF,aAKzB;AAED,OAAO,eAAeG,SAASA,CAC7BC,GAAW,EACXC,OAAyB,EACR;EACjB,IAAI,CAACH,aAAa,EAAEC,SAAS,EAAE;IAC7B,MAAM,IAAIG,KAAK,CACb,+CAA+CL,QAAQ,CAACM,EAAE,0CAC5D,CAAC;EACH;EACA,OAAOL,aAAa,CAACC,SAAS,CAACC,GAAG,EAAEC,OAAO,CAAC;AAC9C;AAEA,OAAO,eAAeG,SAASA,CAC7BJ,GAAW,EACXC,OAAyB,EACR;EACjB,IAAI,CAACH,aAAa,EAAEM,SAAS,EAAE;IAC7B,MAAM,IAAIF,KAAK,CACb,+CAA+CL,QAAQ,CAACM,EAAE,0CAC5D,CAAC;EACH;EACA,OAAOL,aAAa,CAACM,SAAS,CAACJ,GAAG,EAAEC,OAAO,CAAC;AAC9C","ignoreList":[]}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+
3
+ import { NativeModules, Platform } from 'react-native';
4
+ const {
5
+ RNMediaLibrary
6
+ } = NativeModules;
7
+ export async function requestMediaAccess() {
8
+ if (!RNMediaLibrary?.requestAccess) {
9
+ throw new Error(`RNMediaLibrary is not available on ${Platform.OS}. Make sure the native module is linked.`);
10
+ }
11
+ return RNMediaLibrary.requestAccess();
12
+ }
13
+ export async function listAlbums() {
14
+ if (!RNMediaLibrary?.listAlbums) {
15
+ throw new Error(`RNMediaLibrary.listAlbums is not available on ${Platform.OS}. Make sure the native module is linked.`);
16
+ }
17
+ return RNMediaLibrary.listAlbums();
18
+ }
19
+ export async function listMedia(query) {
20
+ if (!RNMediaLibrary?.listMedia) {
21
+ throw new Error(`RNMediaLibrary.listMedia is not available on ${Platform.OS}. Make sure the native module is linked.`);
22
+ }
23
+ return RNMediaLibrary.listMedia(query);
24
+ }
25
+ export async function exportAsset(localId) {
26
+ if (!RNMediaLibrary?.exportAsset) {
27
+ throw new Error(`RNMediaLibrary.exportAsset is not available on ${Platform.OS}. Make sure the native module is linked.`);
28
+ }
29
+ return RNMediaLibrary.exportAsset(localId);
30
+ }
31
+ export async function saveToGallery(uri, type) {
32
+ if (!RNMediaLibrary?.saveToGallery) {
33
+ throw new Error(`RNMediaLibrary.saveToGallery is not available on ${Platform.OS}. Make sure the native module is linked.`);
34
+ }
35
+ return RNMediaLibrary.saveToGallery(uri, type);
36
+ }
37
+ //# sourceMappingURL=MediaLibrary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["NativeModules","Platform","RNMediaLibrary","requestMediaAccess","requestAccess","Error","OS","listAlbums","listMedia","query","exportAsset","localId","saveToGallery","uri","type"],"sourceRoot":"../../../src","sources":["native/MediaLibrary.ts"],"mappings":";;AAAA,SAASA,aAAa,EAAEC,QAAQ,QAAQ,cAAc;AAetD,MAAM;EAAEC;AAAe,CAAC,GAAGF,aAQ1B;AAED,OAAO,eAAeG,kBAAkBA,CAAA,EAAqB;EAC3D,IAAI,CAACD,cAAc,EAAEE,aAAa,EAAE;IAClC,MAAM,IAAIC,KAAK,CACb,sCAAsCJ,QAAQ,CAACK,EAAE,0CACnD,CAAC;EACH;EACA,OAAOJ,cAAc,CAACE,aAAa,CAAC,CAAC;AACvC;AAEA,OAAO,eAAeG,UAAUA,CAAA,EAAqB;EACnD,IAAI,CAACL,cAAc,EAAEK,UAAU,EAAE;IAC/B,MAAM,IAAIF,KAAK,CACb,iDAAiDJ,QAAQ,CAACK,EAAE,0CAC9D,CAAC;EACH;EACA,OAAOJ,cAAc,CAACK,UAAU,CAAC,CAAC;AACpC;AAEA,OAAO,eAAeC,SAASA,CAACC,KAAiB,EAAwB;EACvE,IAAI,CAACP,cAAc,EAAEM,SAAS,EAAE;IAC9B,MAAM,IAAIH,KAAK,CACb,gDAAgDJ,QAAQ,CAACK,EAAE,0CAC7D,CAAC;EACH;EACA,OAAOJ,cAAc,CAACM,SAAS,CAACC,KAAK,CAAC;AACxC;AAEA,OAAO,eAAeC,WAAWA,CAACC,OAAe,EAAmB;EAClE,IAAI,CAACT,cAAc,EAAEQ,WAAW,EAAE;IAChC,MAAM,IAAIL,KAAK,CACb,kDAAkDJ,QAAQ,CAACK,EAAE,0CAC/D,CAAC;EACH;EACA,OAAOJ,cAAc,CAACQ,WAAW,CAACC,OAAO,CAAC;AAC5C;AAEA,OAAO,eAAeC,aAAaA,CAACC,GAAW,EAAEC,IAAY,EAAoB;EAC/E,IAAI,CAACZ,cAAc,EAAEU,aAAa,EAAE;IAClC,MAAM,IAAIP,KAAK,CACb,oDAAoDJ,QAAQ,CAACK,EAAE,0CACjE,CAAC;EACH;EACA,OAAOJ,cAAc,CAACU,aAAa,CAACC,GAAG,EAAEC,IAAI,CAAC;AAChD","ignoreList":[]}