VanKee commited on
Commit
6f6e572
·
1 Parent(s): f8c0055
This view is limited to 50 files because it contains too many changes.   See raw diff
.gitignore ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.so
6
+ .Python
7
+ build/
8
+ develop-eggs/
9
+ dist/
10
+ downloads/
11
+ eggs/
12
+ .eggs/
13
+ lib64/
14
+ parts/
15
+ sdist/
16
+ var/
17
+ wheels/
18
+ pip-wheel-metadata/
19
+ share/python-wheels/
20
+ *.egg-info/
21
+ .installed.cfg
22
+ *.egg
23
+ MANIFEST
24
+
25
+ # Virtual environments
26
+ venv/
27
+ env/
28
+ ENV/
29
+ .venv
30
+
31
+ # IDEs
32
+ .vscode/
33
+ .idea/
34
+ *.swp
35
+ *.swo
36
+ *~
37
+ .DS_Store
38
+
39
+ # Testing
40
+ .pytest_cache/
41
+ .coverage
42
+ htmlcov/
43
+ *.cover
44
+ .hypothesis/
45
+
46
+ # Jupyter
47
+ .ipynb_checkpoints
48
+
49
+ # Environment variables
50
+ .env
51
+ .env.local
52
+
53
+ # macOS
54
+ .DS_Store
55
+ .AppleDouble
56
+ .LSOverride
57
+ Thumbs.db
58
+
59
+ # Temporary files
60
+ *.tmp
61
+ *.log
62
+ *.bak
README.md CHANGED
@@ -11,3 +11,5 @@ short_description: CS5330-HW2
11
  ---
12
 
13
  Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
11
  ---
12
 
13
  Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
14
+
15
+ CS5330 - HW2
app.py ADDED
@@ -0,0 +1,254 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ AI vs Real Face Detection Game - Simplified Version
3
+
4
+ Interactive Gradio web application that allows users to test their ability to distinguish
5
+ between AI-generated faces and real human faces through a game-based approach.
6
+ """
7
+
8
+ import os
9
+ import sys
10
+ import logging
11
+ import argparse
12
+ import gradio as gr
13
+
14
+ # Add src directory to Python path
15
+ sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'src'))
16
+
17
+ from src.image_manager import ImagePool
18
+ from src.model_inference import FaceDetectorModel
19
+ from src.game_logic import GameState
20
+ from src.utils import calculate_bg_color
21
+
22
+ # Configure logging
23
+ logging.basicConfig(
24
+ level=logging.INFO,
25
+ format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
26
+ )
27
+ logger = logging.getLogger(__name__)
28
+
29
+
30
+ def initialize_app():
31
+ """Initialize application, load model and image pool"""
32
+ logger.info("Starting application initialization...")
33
+
34
+ try:
35
+ # Load image pool
36
+ logger.info("Loading image pool...")
37
+ image_pool = ImagePool(ai_dir="image/ai", real_dir="image/real")
38
+ logger.info(f"Image pool loaded successfully: {image_pool.total_ai} AI images, {image_pool.total_real} real images")
39
+
40
+ # Load AI model
41
+ logger.info("Loading AI detection model...")
42
+ model = FaceDetectorModel(model_path="model/best_mobilenet_finetuned.keras")
43
+ logger.info("Model loaded successfully")
44
+
45
+ # Warmup model
46
+ logger.info("Warming up model...")
47
+ model.warmup()
48
+
49
+ # Create game state
50
+ game_state = GameState()
51
+ game_state.images = image_pool.create_game_set()
52
+ game_state.next_round()
53
+
54
+ logger.info("Application initialization complete!")
55
+ return image_pool, model, game_state
56
+
57
+ except Exception as e:
58
+ error_msg = f"Application initialization failed: {e}"
59
+ logger.error(error_msg)
60
+ raise RuntimeError(error_msg)
61
+
62
+
63
+ def format_score(player_score, ai_score, current_round, total_rounds):
64
+ """Format score display"""
65
+ return f"""### Score
66
+
67
+ **You**: {player_score}
68
+
69
+ **AI**: {ai_score} \n
70
+
71
+ **Progress**: {current_round}/{total_rounds}
72
+ """
73
+
74
+
75
+ def create_app():
76
+ """Create Gradio application"""
77
+ image_pool, model, game_state = initialize_app()
78
+
79
+ with gr.Blocks(title="AI vs Real Face Detection Game") as app:
80
+ gr.Markdown("# AI vs Real Face Detection Game")
81
+ gr.Markdown("Test your ability to distinguish AI-generated faces from real human faces!")
82
+
83
+ state = gr.State(game_state)
84
+
85
+ with gr.Tabs():
86
+ # ==================== Game Mode ====================
87
+ with gr.Tab("Game Mode"):
88
+ with gr.Row():
89
+ with gr.Column(scale=1):
90
+ score_display = gr.Markdown(
91
+ value=format_score(0, 0, 1, 20)
92
+ )
93
+ ai_button = gr.Button("AI Generated", variant="primary", size="lg")
94
+ human_button = gr.Button("Real Human", variant="secondary", size="lg")
95
+ next_button = gr.Button("Next", size="lg")
96
+ reset_button = gr.Button("Reset Game", size="sm")
97
+ feedback_display = gr.Markdown(value="Guess if this is AI-generated or a real human?")
98
+
99
+ with gr.Column(scale=3):
100
+ image_display = gr.Image(
101
+ label="Face Image",
102
+ value=game_state.current_image_path
103
+ )
104
+
105
+ # ==================== Detector Mode ====================
106
+ with gr.Tab("Detector Mode"):
107
+ with gr.Row():
108
+ with gr.Column(scale=1):
109
+ detector_result_display = gr.Markdown(value="Click button to view random image")
110
+ detector_next_button = gr.Button("Next Random Image", variant="primary", size="lg")
111
+ detector_confidence_display = gr.Markdown(value="")
112
+
113
+ with gr.Column(scale=3):
114
+ detector_image_display = gr.Image(label="Face Image")
115
+
116
+ # ==================== Game Mode Event Handlers ====================
117
+ def on_guess_ai(state_value):
118
+ ai_prediction, ai_confidence = model.predict(state_value.current_image_path)
119
+ state_value.record_guess("AI", ai_prediction, ai_confidence)
120
+
121
+ feedback = state_value.last_result
122
+ if state_value.game_over:
123
+ feedback = state_value.get_final_result()
124
+
125
+ return [
126
+ format_score(state_value.player_score, state_value.ai_score,
127
+ state_value.current_round, state_value.total_rounds),
128
+ feedback,
129
+ gr.update(interactive=False),
130
+ gr.update(interactive=False),
131
+ gr.update(visible=not state_value.game_over),
132
+ state_value
133
+ ]
134
+
135
+ def on_guess_human(state_value):
136
+ ai_prediction, ai_confidence = model.predict(state_value.current_image_path)
137
+ state_value.record_guess("Human", ai_prediction, ai_confidence)
138
+
139
+ feedback = state_value.last_result
140
+ if state_value.game_over:
141
+ feedback = state_value.get_final_result()
142
+
143
+ return [
144
+ format_score(state_value.player_score, state_value.ai_score,
145
+ state_value.current_round, state_value.total_rounds),
146
+ feedback,
147
+ gr.update(interactive=False),
148
+ gr.update(interactive=False),
149
+ gr.update(visible=not state_value.game_over),
150
+ state_value
151
+ ]
152
+
153
+ def on_next_picture(state_value):
154
+ state_value.next_round()
155
+ return [
156
+ state_value.current_image_path,
157
+ "",
158
+ gr.update(interactive=True),
159
+ gr.update(interactive=True),
160
+ gr.update(visible=False),
161
+ format_score(state_value.player_score, state_value.ai_score,
162
+ state_value.current_round, state_value.total_rounds),
163
+ state_value
164
+ ]
165
+
166
+ def on_reset_game(state_value):
167
+ state_value.reset()
168
+ state_value.images = image_pool.create_game_set()
169
+ state_value.current_round = 0
170
+ state_value.next_round()
171
+
172
+ return [
173
+ state_value.current_image_path,
174
+ format_score(0, 0, 1, 20),
175
+ "New game started! Guess if this is AI-generated or a real human?",
176
+ gr.update(interactive=True),
177
+ gr.update(interactive=True),
178
+ gr.update(visible=False),
179
+ state_value
180
+ ]
181
+
182
+ # ==================== Detector Mode Event Handlers ====================
183
+ def on_detector_next():
184
+ import random
185
+ label = random.choice(["AI", "Human"])
186
+ image_path = image_pool.get_random_image(label)
187
+ prediction, confidence = model.predict(image_path)
188
+
189
+ result_text = f"### AI Prediction: {prediction}\n\n**True Label**: {label}\n\n"
190
+ if prediction == label:
191
+ result_text += "✓ Correct prediction!"
192
+ else:
193
+ result_text += "✗ Incorrect prediction"
194
+
195
+ confidence_text = f"**Confidence**: {confidence * 100:.1f}%"
196
+ return [image_path, result_text, confidence_text]
197
+
198
+ # Bind events
199
+ ai_button.click(
200
+ fn=on_guess_ai,
201
+ inputs=[state],
202
+ outputs=[score_display, feedback_display, ai_button, human_button, next_button, state]
203
+ )
204
+
205
+ human_button.click(
206
+ fn=on_guess_human,
207
+ inputs=[state],
208
+ outputs=[score_display, feedback_display, ai_button, human_button, next_button, state]
209
+ )
210
+
211
+ next_button.click(
212
+ fn=on_next_picture,
213
+ inputs=[state],
214
+ outputs=[image_display, feedback_display, ai_button, human_button, next_button, score_display, state]
215
+ )
216
+
217
+ reset_button.click(
218
+ fn=on_reset_game,
219
+ inputs=[state],
220
+ outputs=[image_display, score_display, feedback_display, ai_button, human_button, next_button, state]
221
+ )
222
+
223
+ detector_next_button.click(
224
+ fn=on_detector_next,
225
+ inputs=[],
226
+ outputs=[detector_image_display, detector_result_display, detector_confidence_display]
227
+ )
228
+
229
+ return app
230
+
231
+
232
+ def main():
233
+ """Main entry function"""
234
+ parser = argparse.ArgumentParser(description="AI vs Real Face Detection Game")
235
+ parser.add_argument("--port", type=int, default=7860, help="Server port")
236
+ parser.add_argument("--share", action="store_true", help="Create public URL")
237
+ parser.add_argument("--debug", action="store_true", help="Debug mode")
238
+ args = parser.parse_args()
239
+
240
+ if args.debug:
241
+ logging.getLogger().setLevel(logging.DEBUG)
242
+
243
+ try:
244
+ app = create_app()
245
+ logger.info(f"Launching application on port: {args.port}")
246
+ app.launch(server_port=args.port, share=args.share)
247
+
248
+ except Exception as e:
249
+ logger.error(f"Application launch failed: {e}")
250
+ sys.exit(1)
251
+
252
+
253
+ if __name__ == "__main__":
254
+ main()
image/ai/02NUKFGPSJ.jpg ADDED

Git LFS Details

  • SHA256: 193430273cb41d3481738866d2ab9cd35a539f645d6f171cc6f6e23ce176bc95
  • Pointer size: 130 Bytes
  • Size of remote file: 24 kB
image/ai/02P1HEQ0GB.jpg ADDED

Git LFS Details

  • SHA256: 403405c221a621f0117a8fae0cb711398066cdc3c2dc0a3d11e246b282028cec
  • Pointer size: 130 Bytes
  • Size of remote file: 25.4 kB
image/ai/1MIMRRF3CO.jpg ADDED

Git LFS Details

  • SHA256: f61e481688cd9d0c4246a5b5d683057e69c015fb0ff04d461737be03c5bb2d2f
  • Pointer size: 130 Bytes
  • Size of remote file: 37.8 kB
image/ai/1MWTPCAK7Q.jpg ADDED

Git LFS Details

  • SHA256: 73ed953bb2fa28f35e23bd55478e65c35fabb7c9073779d33981e0cd8fc3e0cf
  • Pointer size: 130 Bytes
  • Size of remote file: 27.9 kB
image/ai/1MYXTVAWPU.jpg ADDED

Git LFS Details

  • SHA256: 9211a5c7eb57c878a756861137e1e60bbbb39f13aa3fe79f9c4513483c815cde
  • Pointer size: 130 Bytes
  • Size of remote file: 25.7 kB
image/ai/1N1FFJ4FJ1.jpg ADDED

Git LFS Details

  • SHA256: 39c684c91f3ab298cfce3544da5687166b532bc11b8b2fa3a643538fb9b92155
  • Pointer size: 130 Bytes
  • Size of remote file: 29.2 kB
image/ai/1N5TR23IM3.jpg ADDED

Git LFS Details

  • SHA256: 44b6e7d4d019a9276dd38da0d47becabe9506351ad7b8a30c23b91101c550506
  • Pointer size: 130 Bytes
  • Size of remote file: 29.6 kB
image/ai/1N6FPR71IQ.jpg ADDED

Git LFS Details

  • SHA256: d64b4bc4db808852dccbd6ca635073be9903bb8a8aca6e449eff1b3ad9be509a
  • Pointer size: 130 Bytes
  • Size of remote file: 26.8 kB
image/ai/1ND7STPL3M.jpg ADDED

Git LFS Details

  • SHA256: 5673c239c6b850760dacad45692bee6cb11666e985db4419722823eb2e94b5ab
  • Pointer size: 130 Bytes
  • Size of remote file: 26.3 kB
image/ai/1NT8IVFQRB.jpg ADDED

Git LFS Details

  • SHA256: e315355b5fd29ebb8c99ba89914b8cd940062eadc9fd8a247198cfe111bbe708
  • Pointer size: 130 Bytes
  • Size of remote file: 30.2 kB
image/ai/1O6JOES3U6.jpg ADDED

Git LFS Details

  • SHA256: 26e8af8c99c6b8baf0c7c0307ceccc0727caa4c27e2f1c9bf95446fcf6ecae14
  • Pointer size: 130 Bytes
  • Size of remote file: 27.7 kB
image/ai/1O72W61W0Z.jpg ADDED

Git LFS Details

  • SHA256: 80e604a2894f6fab97ecf38ec575f53bcd0b614ccf53c42b7895fc26ec69dbb5
  • Pointer size: 130 Bytes
  • Size of remote file: 25 kB
image/ai/1O86M5F8UD.jpg ADDED

Git LFS Details

  • SHA256: 6882fca8e3be156a037f393708e6dacf46eedf18fd6f8f50c6eecce36d44dc13
  • Pointer size: 130 Bytes
  • Size of remote file: 24.8 kB
image/ai/1O8Q6BTZ3P.jpg ADDED

Git LFS Details

  • SHA256: 97ac02c39dd04da635d9ec0f9302601c223d17da24a5b726592d112abd8b5b10
  • Pointer size: 130 Bytes
  • Size of remote file: 30.1 kB
image/ai/1Z4U4SR77B.jpg ADDED

Git LFS Details

  • SHA256: f424b64914d4566fad5946e2d57c5cd86d58565560037d416a31d1926908feab
  • Pointer size: 130 Bytes
  • Size of remote file: 36.9 kB
image/ai/1Z5LIOL6NW.jpg ADDED

Git LFS Details

  • SHA256: 0827561c63bcc1c2d9bcfe4eb83e288d6ed90ae5fba2f1a4e8ae653c53322775
  • Pointer size: 130 Bytes
  • Size of remote file: 21.6 kB
image/ai/1ZCFU5LAI7.jpg ADDED

Git LFS Details

  • SHA256: 986c295a2a38c791b6fc376d0b3d6633beeb1f0c0f03d5d1b4ac641ded2c2ee8
  • Pointer size: 130 Bytes
  • Size of remote file: 26.7 kB
image/ai/1ZI26B04I8.jpg ADDED

Git LFS Details

  • SHA256: ea9a6376c56beb01f9e4b3cee8c3783dea4fce4dc8d19f7884a609fa913233eb
  • Pointer size: 130 Bytes
  • Size of remote file: 29.3 kB
image/ai/1ZKL3DGDR0.jpg ADDED

Git LFS Details

  • SHA256: 4349fd97b8bf3cab7e65cea83dedae6fa5854ce0ab95d12e9bdfe7bd0b560a0b
  • Pointer size: 130 Bytes
  • Size of remote file: 25.1 kB
image/ai/2A0WWXHXPV.jpg ADDED

Git LFS Details

  • SHA256: af4c50c2df324a6aeddc6dc72ac2707108957c75fa68ca7713948995ba000143
  • Pointer size: 130 Bytes
  • Size of remote file: 28.3 kB
image/ai/2A2I5HCWUI.jpg ADDED

Git LFS Details

  • SHA256: 96e2a520e878b937ebcae757a5162dd7fbbe07b2010dbc7fc2e2ae5302010316
  • Pointer size: 130 Bytes
  • Size of remote file: 28.5 kB
image/ai/2A4K9OBKGC.jpg ADDED

Git LFS Details

  • SHA256: 993dabb4f71dc222db7352b94c97d3071dd703965d82f38e077c1135b156aa3b
  • Pointer size: 130 Bytes
  • Size of remote file: 26.7 kB
image/ai/2AAY2RARQD.jpg ADDED

Git LFS Details

  • SHA256: 99c5bd8bc0ce31cc2726f844ef3a4c85bc10b7bda24b90e59973591c14249ea4
  • Pointer size: 130 Bytes
  • Size of remote file: 27 kB
image/ai/2AC3IVPE0A.jpg ADDED

Git LFS Details

  • SHA256: 13808c7bce81a2ab6d32b1c289d4a5224a44b9bbd4315af59e82d1c37ae856aa
  • Pointer size: 130 Bytes
  • Size of remote file: 30.7 kB
image/ai/2AEFOQHCP7.jpg ADDED

Git LFS Details

  • SHA256: 7cbddd1493caec6714698361944d22344c3dc7bcfd85c0dbb24f2ee9cbc9441e
  • Pointer size: 130 Bytes
  • Size of remote file: 27.8 kB
image/ai/2AFWRTIQIY.jpg ADDED

Git LFS Details

  • SHA256: f850dcf92b76ccb7b2846b0f8e9e54eba608ac4575fdc6d3446a81b63d7d65c3
  • Pointer size: 130 Bytes
  • Size of remote file: 29.5 kB
image/ai/2AL8LB9CCK.jpg ADDED

Git LFS Details

  • SHA256: 74564b0dfea85e2a3114a1a66a579924adf6c3b95f244d3156b3f6b248ec0d24
  • Pointer size: 130 Bytes
  • Size of remote file: 26.9 kB
image/ai/2AMK9WRIST.jpg ADDED

Git LFS Details

  • SHA256: 1c44ce21593e81422d506cda802ac8ac9dd718ece4c6c8a7dad0e546a87a06d5
  • Pointer size: 130 Bytes
  • Size of remote file: 28.8 kB
image/ai/2APREEDYW9.jpg ADDED

Git LFS Details

  • SHA256: b853d7c1fde35df79a80fcecd42b0f3ba8bb6831ecbefc6c8d0042f552e55e93
  • Pointer size: 130 Bytes
  • Size of remote file: 30.4 kB
image/ai/2AXROH5BP4.jpg ADDED

Git LFS Details

  • SHA256: 9b0a57224c0a2752b7e159ac68e88ac48e6f3335811563a75d716cfdf432d949
  • Pointer size: 130 Bytes
  • Size of remote file: 33.5 kB
image/ai/2FT7TX98VQ.jpg ADDED

Git LFS Details

  • SHA256: 751c18ae29ea6a8b96248d86b6443c8a090ce1fbc6d95346f5030ce9b6a66bd7
  • Pointer size: 130 Bytes
  • Size of remote file: 29.1 kB
image/ai/2FWKEAH8XZ.jpg ADDED

Git LFS Details

  • SHA256: 10748dc7f8ba72399b565defa18052f7a4c5dcc3e70332923bd5f9c0701072f3
  • Pointer size: 130 Bytes
  • Size of remote file: 27.7 kB
image/ai/2G713D7952.jpg ADDED

Git LFS Details

  • SHA256: 54b72808ae9ea0d3e5179d8c2aaad7b336db4750232ddd1cabb6794fb7862759
  • Pointer size: 130 Bytes
  • Size of remote file: 29.7 kB
image/ai/2G7FB4AS5Z.jpg ADDED

Git LFS Details

  • SHA256: ce9f3f71964e7fd9a42d919ccdae5b4bf3619035e9154a650f64321217287542
  • Pointer size: 130 Bytes
  • Size of remote file: 24.6 kB
image/ai/2GAL1RG8TJ.jpg ADDED

Git LFS Details

  • SHA256: 93cc45e1851b5bda26390d60345c1a63446f07c68ccdc0deae26af3226e97bc3
  • Pointer size: 130 Bytes
  • Size of remote file: 31.6 kB
image/ai/2GDJNF8DJC.jpg ADDED

Git LFS Details

  • SHA256: 1c03fd8407229f62f7f18bfa8c977a22a171daa5061118e29e28afad7544b8ee
  • Pointer size: 130 Bytes
  • Size of remote file: 34.7 kB
image/ai/2GE4M15TNS.jpg ADDED

Git LFS Details

  • SHA256: 2ee02687f3a69ed72bddcaf190d005fd428bde740d25b86e258e2c92c0257ff7
  • Pointer size: 130 Bytes
  • Size of remote file: 34 kB
image/ai/2GGBI2RBQC.jpg ADDED

Git LFS Details

  • SHA256: eb644412cc7e23deb4a548112c620489a0c5a8b6929ea561f419d98a418114b7
  • Pointer size: 130 Bytes
  • Size of remote file: 28.2 kB
image/ai/2GLSYGM376.jpg ADDED

Git LFS Details

  • SHA256: b59deae0d08219c79829f51440337b103d694081046fa8d8982caa1ecbe7c939
  • Pointer size: 130 Bytes
  • Size of remote file: 27.8 kB
image/ai/2GRFCWT6QV.jpg ADDED

Git LFS Details

  • SHA256: 1412f787fb2ff4faf96da9007d86ff654f9af7d22ab9ba564623cac7bf1eb850
  • Pointer size: 130 Bytes
  • Size of remote file: 27 kB
image/ai/2GUJ0LFBE0.jpg ADDED

Git LFS Details

  • SHA256: ebe2ee7c5aaa519ab63bc5a4c4d5104ab5faea16c049255aafd7bf4f5624d614
  • Pointer size: 130 Bytes
  • Size of remote file: 25.2 kB
image/ai/2GUVDA2GJK.jpg ADDED

Git LFS Details

  • SHA256: 07529c15849d02234dadd5c032b6485211288675abbac0107c05353b197c5260
  • Pointer size: 130 Bytes
  • Size of remote file: 29.5 kB
image/ai/2H3NUVCRM7.jpg ADDED

Git LFS Details

  • SHA256: 7684003ecacf1f99bdd31714e42eeb58a7f65b40f11e5281166f371dc2b8b6ee
  • Pointer size: 130 Bytes
  • Size of remote file: 31.2 kB
image/ai/2H4SWFRWVS.jpg ADDED

Git LFS Details

  • SHA256: 86178c472b30ffa5fca29007a338396bb86226257f583c33e1f0c8ceadabdb6b
  • Pointer size: 130 Bytes
  • Size of remote file: 29.3 kB
image/ai/2HG8862RSL.jpg ADDED

Git LFS Details

  • SHA256: a6222abfa5bf9bc4f2516e2def32dc0946052101cb5bf07a666163af346a9c11
  • Pointer size: 130 Bytes
  • Size of remote file: 24.5 kB
image/ai/2NI33ECS0A.jpg ADDED

Git LFS Details

  • SHA256: 942fd4dea2f9702c2cfef2db8d54048b4c03c3c1b749ef3a5d867b92c3767b21
  • Pointer size: 130 Bytes
  • Size of remote file: 25.2 kB
image/ai/2NOYOD9PAS.jpg ADDED

Git LFS Details

  • SHA256: 544b8e74e22dd6dd53ee44427e655aa84c9c70997377a80501969bfdee824c72
  • Pointer size: 130 Bytes
  • Size of remote file: 27.5 kB