diff --git a/admin.php b/admin.php new file mode 100644 index 00000000..02915456 --- /dev/null +++ b/admin.php @@ -0,0 +1,298 @@ +prepare('INSERT INTO puzzles (name, original_image, pieces, is_public, created_at) VALUES (?, ?, ?, ?, NOW())'); + $stmt->execute([$puzzle_name, $safe_filename, $pieces, $is_public]); + $puzzle_id = $pdo->lastInsertId(); + + // Create puzzle pieces + create_puzzle_pieces($upload_path, $puzzle_id, $pieces); + + header("Location: admin.php?success=1"); + exit; + } + } + // Handle error case + header("Location: admin.php?error=1"); + exit; +} + + +// Handle puzzle deletion +if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['delete_puzzle'])) { + $puzzle_id_to_delete = $_POST['puzzle_id']; + + // First, get the original image filename to delete it + $stmt = $pdo->prepare('SELECT original_image FROM puzzles WHERE id = ?'); + $stmt->execute([$puzzle_id_to_delete]); + $puzzle = $stmt->fetch(PDO::FETCH_ASSOC); + + if ($puzzle) { + // Delete original image file + $original_image_path = __DIR__ . '/uploads/' . $puzzle['original_image']; + if (file_exists($original_image_path)) { + unlink($original_image_path); + } + } + + // Delete from DB + $stmt = $pdo->prepare('DELETE FROM puzzles WHERE id = ?'); + $stmt->execute([$puzzle_id_to_delete]); + + // Delete puzzle pieces directory + $puzzle_dir = __DIR__ . '/puzzles/' . $puzzle_id_to_delete; + if (is_dir($puzzle_dir)) { + // A simple recursive delete function + function delete_directory($dir) { + if (!is_dir($dir)) return; + $files = array_diff(scandir($dir), array('.','..')); + foreach ($files as $file) { + (is_dir("$dir/$file")) ? delete_directory("$dir/$file") : unlink("$dir/$file"); + } + rmdir($dir); + } + delete_directory($puzzle_dir); + } + + header("Location: admin.php?deleted=1"); // Redirect to avoid re-posting + exit; +} + + +$puzzles = $pdo->query('SELECT id, name, original_image, pieces, is_public, created_at FROM puzzles ORDER BY created_at DESC')->fetchAll(PDO::FETCH_ASSOC); + +?> + + + + + + Pannello di Amministrazione + + + + + + +
+ + +
Puzzle aggiunto con successo!
+ + +
Puzzle eliminato con successo.
+ + +
Errore durante l'upload. Controlla i dati e riprova.
+ + + +
+

Aggiungi Nuovo Puzzle

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+
+ + +

Gestione Puzzle

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDNomeImmaginePezziPubblicoCreato ilAzioni
Nessun puzzle trovato.
Puzzle +
+ + +
+
+
+
+ + + + \ No newline at end of file diff --git a/assets/css/custom.css b/assets/css/custom.css new file mode 100644 index 00000000..95e9a820 --- /dev/null +++ b/assets/css/custom.css @@ -0,0 +1,114 @@ +:root { + --bg-slate-900: #0F172A; + --bg-slate-800: #1E293B; + --text-cyan-400: #22D3EE; + --bg-cyan-500: #06B6D4; + --border-slate-700: #334155; + --text-slate-200: #E2E8F0; + --text-slate-400: #94A3B8; +} + +body { + background-color: var(--bg-slate-900); + color: var(--text-slate-200); + font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; +} + +.navbar { + background-color: rgba(30, 41, 59, 0.8); /* bg-slate-800 with opacity */ + backdrop-filter: blur(10px); + -webkit-backdrop-filter: blur(10px); + border-bottom: 1px solid var(--border-slate-700); +} + +.puzzle-board { + background-color: var(--bg-slate-900); + border: 2px dashed var(--border-slate-700); + aspect-ratio: 4 / 3; + transition: background-color 0.3s; +} + +.pieces-tray { + background-color: var(--bg-slate-800); + border-radius: 0.75rem; + max-height: 80vh; + overflow-y: auto; + border: 1px solid var(--border-slate-700); +} + +.btn-cyan { + background-color: var(--bg-cyan-500); + color: var(--bg-slate-900); + font-weight: bold; + border: none; + transition: background-color 0.2s; +} + +.btn-cyan:hover { + background-color: var(--text-cyan-400); + color: var(--bg-slate-900); +} + +.form-select { + background-color: var(--bg-slate-800); + color: var(--text-slate-200); + border-color: var(--border-slate-700); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%2394a3b8' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"); +} +.form-select:focus { + background-color: var(--bg-slate-800); + color: var(--text-slate-200); + border-color: var(--text-cyan-400); + box-shadow: 0 0 0 0.25rem rgba(34, 211, 238, 0.25); +} + +.text-cyan { + color: var(--text-cyan-400); +} + +.text-slate-400 { + color: var(--text-slate-400); +} + +.rounded-xl { + border-radius: 0.75rem; +} + +/* --- Gallery --- */ +.gallery-scroll-container { + overflow-x: auto; + scrollbar-width: thin; + scrollbar-color: var(--border-slate-700) var(--bg-slate-900); +} + +.gallery-scroll-container::-webkit-scrollbar { + height: 8px; +} + +.gallery-scroll-container::-webkit-scrollbar-track { + background: var(--bg-slate-900); +} + +.gallery-scroll-container::-webkit-scrollbar-thumb { + background-color: var(--border-slate-700); + border-radius: 10px; + border: 2px solid var(--bg-slate-900); +} + +.gallery-item { + display: block; + flex: 0 0 auto; /* Prevent shrinking */ + width: 150px; /* Fixed width for items */ + height: 112px; /* Fixed height for items (4:3 ratio) */ + transition: transform 0.2s ease-in-out; +} + +.gallery-item:hover { + transform: scale(1.05); +} + +.gallery-item img { + width: 100%; + height: 100%; + object-fit: cover; /* Ensure images fill the container */ +} \ No newline at end of file diff --git a/assets/js/main.js b/assets/js/main.js new file mode 100644 index 00000000..3fa9884b --- /dev/null +++ b/assets/js/main.js @@ -0,0 +1,3 @@ + +// Custom JavaScript will go here in future steps. +console.log("Photo Puzzle UI loaded."); diff --git a/assets/pasted-20250928-215554-37393ea0.png b/assets/pasted-20250928-215554-37393ea0.png new file mode 100644 index 00000000..73f536fa Binary files /dev/null and b/assets/pasted-20250928-215554-37393ea0.png differ diff --git a/assets/pasted-20250928-222004-41c6ce15.png b/assets/pasted-20250928-222004-41c6ce15.png new file mode 100644 index 00000000..2e06431a Binary files /dev/null and b/assets/pasted-20250928-222004-41c6ce15.png differ diff --git a/assets/pasted-20250928-222320-2fa0e2d6.png b/assets/pasted-20250928-222320-2fa0e2d6.png new file mode 100644 index 00000000..65be9aeb Binary files /dev/null and b/assets/pasted-20250928-222320-2fa0e2d6.png differ diff --git a/assets/pasted-20250928-223627-60eb19e3.png b/assets/pasted-20250928-223627-60eb19e3.png new file mode 100644 index 00000000..654739d5 Binary files /dev/null and b/assets/pasted-20250928-223627-60eb19e3.png differ diff --git a/db/config.php b/db/config.php index 62ed3b7b..b26381dd 100644 --- a/db/config.php +++ b/db/config.php @@ -5,6 +5,10 @@ define('DB_NAME', 'app_30903'); define('DB_USER', 'app_30903'); define('DB_PASS', '7d2d5a2d-6e5e-4580-a9b7-3f8e7288a494'); +// Admin credentials (for a real app, use hashed passwords) +define('ADMIN_USER', 'admin'); +define('ADMIN_PASS_HASH', '$2y$10$WnTccK10o9fJmz3xfs6gV.0GB2PH.Smtm4NOlqlnr7SmEgMcY8uC.'); // Hash for 'MaviGames' + function db() { static $pdo; if (!$pdo) { diff --git a/index.php b/index.php index 6f7ffab6..0bbd7ebf 100644 --- a/index.php +++ b/index.php @@ -1,131 +1,236 @@ exec("CREATE TABLE IF NOT EXISTS puzzles ( + id INT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(255) DEFAULT 'Senza Nome', + file_name VARCHAR(255) NOT NULL UNIQUE, + is_public BOOLEAN DEFAULT FALSE, + is_admin_upload BOOLEAN DEFAULT FALSE, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP + )"); + // Attempt to add 'name' column, ignore error if it already exists + try { + $pdo->exec("ALTER TABLE puzzles ADD COLUMN name VARCHAR(255) DEFAULT 'Senza Nome'"); + } catch (PDOException $e) { + // Ignore error, likely "Duplicate column name" + } + } catch (PDOException $e) { + // In a real app, log this error instead of displaying it + die("Errore di connessione al database: " . $e->getMessage()); + } +} +setup_database(); + +// --- GLOBAL VARIABLES --- +$uploaded_image = null; +$error_message = null; +$gallery_images = []; + +// --- DATA FETCHING --- +try { + $pdo = db(); + $stmt = $pdo->query("SELECT id, file_name, name FROM puzzles WHERE is_public = 1 OR is_admin_upload = 1 ORDER BY created_at DESC"); + $gallery_images = $stmt->fetchAll(PDO::FETCH_ASSOC); +} catch (PDOException $e) { + $error_message = "Impossibile caricare la galleria."; +} + + +// --- POST REQUEST: IMAGE UPLOAD --- +if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['puzzle_image'])) { + $target_dir = 'uploads/'; + $max_file_size = 5 * 1024 * 1024; // 5 MB + $allowed_types = ['image/jpeg', 'image/png', 'image/gif']; + $file = $_FILES['puzzle_image']; + + if ($file['error'] !== UPLOAD_ERR_OK) { + $error_message = 'Si è verificato un errore durante il caricamento.'; + } else { + $finfo = new finfo(FILEINFO_MIME_TYPE); + $mime_type = $finfo->file($file['tmp_name']); + + if ($file['size'] > $max_file_size) { + $error_message = 'Il file è troppo grande. La dimensione massima è 5MB.'; + } elseif (!in_array($mime_type, $allowed_types)) { + $error_message = 'Tipo di file non valido. Sono ammessi solo JPG, PNG, GIF.'; + } else { + $file_extension = pathinfo($file['name'], PATHINFO_EXTENSION); + $safe_filename = uniqid('puzzle_', true) . '.' . strtolower($file_extension); + $target_file = $target_dir . $safe_filename; + + if (move_uploaded_file($file['tmp_name'], $target_file)) { + // Save to database + try { + $is_public = isset($_POST['share_puzzle']) ? 1 : 0; // Ensure 1 or 0 + $puzzle_name = !empty($_POST['puzzle_name']) ? trim($_POST['puzzle_name']) : 'Senza Nome'; + $pdo = db(); + $stmt = $pdo->prepare("INSERT INTO puzzles (name, file_name, is_public, is_admin_upload) VALUES (?, ?, ?, ?)"); + $is_admin_upload = 0; // Always false for user uploads + $stmt->execute([$puzzle_name, $safe_filename, $is_public, $is_admin_upload]); + $new_puzzle_id = $pdo->lastInsertId(); + } catch (PDOException $e) { + // Error saving to DB, delete file + unlink($target_file); + // Log the detailed error for developers: error_log($e->getMessage()); + $error_message = "Si è verificato un errore nel salvataggio dei dati del puzzle: " . $e->getMessage(); + } + + if (!$error_message) { + // Redirect to the new puzzle page + header('Location: puzzle.php?id=' . $new_puzzle_id); + exit; + } + } else { + $error_message = 'Si è verificato un errore durante il salvataggio del file.'; + } + } + } +} + +// --- GET REQUESTS --- +// Handle New Game +if (isset($_GET['action']) && $_GET['action'] === 'new') { + unset($_SESSION['selected_puzzle']); + header('Location: ' . $_SERVER['PHP_SELF']); + exit; +} + + +// --- SET CURRENT IMAGE FOR DISPLAY --- +if (isset($_SESSION['selected_puzzle'])) { + $uploaded_image = $_SESSION['selected_puzzle']; +} -$phpVersion = PHP_VERSION; -$now = date('Y-m-d H:i:s'); ?> - - + + - - - New Style - - - - + + + Photo Puzzle + + + + + + + + + + + + + + - -
-
-

Analyzing your requirements and generating your website…

-
- Loading… -
-

AI is collecting your requirements and applying the first changes.

-

This page will update automatically as the plan is implemented.

-

Runtime: PHP — UTC

-
-
- + + + + + + +
+ + + +
+ + +
+ + +
+ +
+
+
+

Tavola del Puzzle

+ + +
+ + + + Immagine del puzzle caricata + +

Crea un nuovo Puzzle

+

Carica un'immagine per iniziare.

+ +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+
+ +
+
+
+ + + +
+
+ + + + + + + + diff --git a/login.php b/login.php new file mode 100644 index 00000000..1ab40d3f --- /dev/null +++ b/login.php @@ -0,0 +1,71 @@ + + + + + + + Admin Login + + + + +
+

Accesso Admin

+ +
+ +
+
+ + +
+
+ + +
+ +
+
+ + diff --git a/logout.php b/logout.php new file mode 100644 index 00000000..95db42cf --- /dev/null +++ b/logout.php @@ -0,0 +1,6 @@ + [4, 4], // 4x4 grid + 32 => [8, 4], // 8x4 grid + 64 => [8, 8] // 8x8 grid +]; +if (!isset($valid_difficulties[$difficulty])) { + $difficulty = 16; // Fallback to default if invalid +} +list($cols, $rows) = $valid_difficulties[$difficulty]; + +$puzzle = null; +$error_message = ''; +$pieces = []; +$source_width = 1; +$source_height = 1; + +// --- DATA FETCHING & PUZZLE CREATION --- +if ($puzzle_id > 0) { + try { + $pdo = db(); + $stmt = $pdo->prepare("SELECT * FROM puzzles WHERE id = ?"); + $stmt->execute([$puzzle_id]); + $puzzle = $stmt->fetch(PDO::FETCH_ASSOC); + + if (!$puzzle) { + $error_message = "Puzzle non trovato."; + } else { + $image_path = 'uploads/' . $puzzle['file_name']; + if (!file_exists($image_path)) { + $error_message = "File immagine del puzzle non trovato."; + } else { + $image_info = getimagesize($image_path); + $source_width = $image_info[0]; + $source_height = $image_info[1]; + + // Use a difficulty-specific directory + $pieces_dir = sprintf('puzzles/%d/%d', $puzzle['id'], $difficulty); + if (!is_dir($pieces_dir)) { + mkdir($pieces_dir, 0777, true); + } + + $piece_files = glob($pieces_dir . '/piece_*.jpg'); + + if (count($piece_files) !== ($cols * $rows)) { + foreach ($piece_files as $file) { unlink($file); } + + $mime_type = $image_info['mime']; + $source_image = null; + switch ($mime_type) { + case 'image/jpeg': $source_image = imagecreatefromjpeg($image_path); break; + case 'image/png': $source_image = imagecreatefrompng($image_path); break; + case 'image/gif': $source_image = imagecreatefromgif($image_path); break; + default: $error_message = "Formato immagine non supportato."; break; + } + + if ($source_image) { + $piece_width = floor($source_width / $cols); + $piece_height = floor($source_height / $rows); + + for ($y = 0; $y < $rows; $y++) { + for ($x = 0; $x < $cols; $x++) { + $piece = imagecreatetruecolor($piece_width, $piece_height); + imagecopy($piece, $source_image, 0, 0, $x * $piece_width, $y * $piece_height, $piece_width, $piece_height); + imagejpeg($piece, "{$pieces_dir}/piece_{$y}_{$x}.jpg", 95); + imagedestroy($piece); + } + } + imagedestroy($source_image); + } + } + + $pieces = glob($pieces_dir . '/piece_*.jpg'); + shuffle($pieces); + } + } + } catch (PDOException $e) { + $error_message = "Errore di sistema: " . $e->getMessage(); + } +} else { + $error_message = "ID del puzzle non valido."; +} +?> + + + + + + Risolvi: <?php echo $puzzle ? htmlspecialchars($puzzle['name']) : 'Puzzle'; ?> + + + + + +
+

Complimenti!

+

Hai risolto il puzzle!

+ Gioca Ancora +
+ +
+
+

+ Torna alla Galleria +
+ + +
+ +
+
+ + + +
+
+ +
+
+
+
+
+

I Tuoi Pezzi

+
+ + Pezzo del puzzle + +
+
+
+ +
+ + + + \ No newline at end of file diff --git a/puzzles/6/16/piece_0_0.jpg b/puzzles/6/16/piece_0_0.jpg new file mode 100644 index 00000000..984c89d0 Binary files /dev/null and b/puzzles/6/16/piece_0_0.jpg differ diff --git a/puzzles/6/16/piece_0_1.jpg b/puzzles/6/16/piece_0_1.jpg new file mode 100644 index 00000000..c388dd42 Binary files /dev/null and b/puzzles/6/16/piece_0_1.jpg differ diff --git a/puzzles/6/16/piece_0_2.jpg b/puzzles/6/16/piece_0_2.jpg new file mode 100644 index 00000000..3c5e31a8 Binary files /dev/null and b/puzzles/6/16/piece_0_2.jpg differ diff --git a/puzzles/6/16/piece_0_3.jpg b/puzzles/6/16/piece_0_3.jpg new file mode 100644 index 00000000..a09b924e Binary files /dev/null and b/puzzles/6/16/piece_0_3.jpg differ diff --git a/puzzles/6/16/piece_1_0.jpg b/puzzles/6/16/piece_1_0.jpg new file mode 100644 index 00000000..ccde8bdb Binary files /dev/null and b/puzzles/6/16/piece_1_0.jpg differ diff --git a/puzzles/6/16/piece_1_1.jpg b/puzzles/6/16/piece_1_1.jpg new file mode 100644 index 00000000..915c48e0 Binary files /dev/null and b/puzzles/6/16/piece_1_1.jpg differ diff --git a/puzzles/6/16/piece_1_2.jpg b/puzzles/6/16/piece_1_2.jpg new file mode 100644 index 00000000..e7806414 Binary files /dev/null and b/puzzles/6/16/piece_1_2.jpg differ diff --git a/puzzles/6/16/piece_1_3.jpg b/puzzles/6/16/piece_1_3.jpg new file mode 100644 index 00000000..a8c041e1 Binary files /dev/null and b/puzzles/6/16/piece_1_3.jpg differ diff --git a/puzzles/6/16/piece_2_0.jpg b/puzzles/6/16/piece_2_0.jpg new file mode 100644 index 00000000..a850db9f Binary files /dev/null and b/puzzles/6/16/piece_2_0.jpg differ diff --git a/puzzles/6/16/piece_2_1.jpg b/puzzles/6/16/piece_2_1.jpg new file mode 100644 index 00000000..fbc0d595 Binary files /dev/null and b/puzzles/6/16/piece_2_1.jpg differ diff --git a/puzzles/6/16/piece_2_2.jpg b/puzzles/6/16/piece_2_2.jpg new file mode 100644 index 00000000..9d9729a8 Binary files /dev/null and b/puzzles/6/16/piece_2_2.jpg differ diff --git a/puzzles/6/16/piece_2_3.jpg b/puzzles/6/16/piece_2_3.jpg new file mode 100644 index 00000000..aabb211d Binary files /dev/null and b/puzzles/6/16/piece_2_3.jpg differ diff --git a/puzzles/6/16/piece_3_0.jpg b/puzzles/6/16/piece_3_0.jpg new file mode 100644 index 00000000..4585c334 Binary files /dev/null and b/puzzles/6/16/piece_3_0.jpg differ diff --git a/puzzles/6/16/piece_3_1.jpg b/puzzles/6/16/piece_3_1.jpg new file mode 100644 index 00000000..83a617e9 Binary files /dev/null and b/puzzles/6/16/piece_3_1.jpg differ diff --git a/puzzles/6/16/piece_3_2.jpg b/puzzles/6/16/piece_3_2.jpg new file mode 100644 index 00000000..cb488214 Binary files /dev/null and b/puzzles/6/16/piece_3_2.jpg differ diff --git a/puzzles/6/16/piece_3_3.jpg b/puzzles/6/16/piece_3_3.jpg new file mode 100644 index 00000000..6aa86058 Binary files /dev/null and b/puzzles/6/16/piece_3_3.jpg differ diff --git a/puzzles/6/32/piece_0_0.jpg b/puzzles/6/32/piece_0_0.jpg new file mode 100644 index 00000000..858e866a Binary files /dev/null and b/puzzles/6/32/piece_0_0.jpg differ diff --git a/puzzles/6/32/piece_0_1.jpg b/puzzles/6/32/piece_0_1.jpg new file mode 100644 index 00000000..4ad813e3 Binary files /dev/null and b/puzzles/6/32/piece_0_1.jpg differ diff --git a/puzzles/6/32/piece_0_2.jpg b/puzzles/6/32/piece_0_2.jpg new file mode 100644 index 00000000..89cf300e Binary files /dev/null and b/puzzles/6/32/piece_0_2.jpg differ diff --git a/puzzles/6/32/piece_0_3.jpg b/puzzles/6/32/piece_0_3.jpg new file mode 100644 index 00000000..5b3e804a Binary files /dev/null and b/puzzles/6/32/piece_0_3.jpg differ diff --git a/puzzles/6/32/piece_0_4.jpg b/puzzles/6/32/piece_0_4.jpg new file mode 100644 index 00000000..714e2698 Binary files /dev/null and b/puzzles/6/32/piece_0_4.jpg differ diff --git a/puzzles/6/32/piece_0_5.jpg b/puzzles/6/32/piece_0_5.jpg new file mode 100644 index 00000000..b1ffa65f Binary files /dev/null and b/puzzles/6/32/piece_0_5.jpg differ diff --git a/puzzles/6/32/piece_0_6.jpg b/puzzles/6/32/piece_0_6.jpg new file mode 100644 index 00000000..eae7f5ac Binary files /dev/null and b/puzzles/6/32/piece_0_6.jpg differ diff --git a/puzzles/6/32/piece_0_7.jpg b/puzzles/6/32/piece_0_7.jpg new file mode 100644 index 00000000..152b4833 Binary files /dev/null and b/puzzles/6/32/piece_0_7.jpg differ diff --git a/puzzles/6/32/piece_1_0.jpg b/puzzles/6/32/piece_1_0.jpg new file mode 100644 index 00000000..4ae6af47 Binary files /dev/null and b/puzzles/6/32/piece_1_0.jpg differ diff --git a/puzzles/6/32/piece_1_1.jpg b/puzzles/6/32/piece_1_1.jpg new file mode 100644 index 00000000..cdb8784f Binary files /dev/null and b/puzzles/6/32/piece_1_1.jpg differ diff --git a/puzzles/6/32/piece_1_2.jpg b/puzzles/6/32/piece_1_2.jpg new file mode 100644 index 00000000..d3de9c4b Binary files /dev/null and b/puzzles/6/32/piece_1_2.jpg differ diff --git a/puzzles/6/32/piece_1_3.jpg b/puzzles/6/32/piece_1_3.jpg new file mode 100644 index 00000000..759b28e9 Binary files /dev/null and b/puzzles/6/32/piece_1_3.jpg differ diff --git a/puzzles/6/32/piece_1_4.jpg b/puzzles/6/32/piece_1_4.jpg new file mode 100644 index 00000000..57404422 Binary files /dev/null and b/puzzles/6/32/piece_1_4.jpg differ diff --git a/puzzles/6/32/piece_1_5.jpg b/puzzles/6/32/piece_1_5.jpg new file mode 100644 index 00000000..96332dda Binary files /dev/null and b/puzzles/6/32/piece_1_5.jpg differ diff --git a/puzzles/6/32/piece_1_6.jpg b/puzzles/6/32/piece_1_6.jpg new file mode 100644 index 00000000..07f2fc6b Binary files /dev/null and b/puzzles/6/32/piece_1_6.jpg differ diff --git a/puzzles/6/32/piece_1_7.jpg b/puzzles/6/32/piece_1_7.jpg new file mode 100644 index 00000000..23dd4cb8 Binary files /dev/null and b/puzzles/6/32/piece_1_7.jpg differ diff --git a/puzzles/6/32/piece_2_0.jpg b/puzzles/6/32/piece_2_0.jpg new file mode 100644 index 00000000..5ae5218f Binary files /dev/null and b/puzzles/6/32/piece_2_0.jpg differ diff --git a/puzzles/6/32/piece_2_1.jpg b/puzzles/6/32/piece_2_1.jpg new file mode 100644 index 00000000..098745ab Binary files /dev/null and b/puzzles/6/32/piece_2_1.jpg differ diff --git a/puzzles/6/32/piece_2_2.jpg b/puzzles/6/32/piece_2_2.jpg new file mode 100644 index 00000000..1e89c137 Binary files /dev/null and b/puzzles/6/32/piece_2_2.jpg differ diff --git a/puzzles/6/32/piece_2_3.jpg b/puzzles/6/32/piece_2_3.jpg new file mode 100644 index 00000000..993be12d Binary files /dev/null and b/puzzles/6/32/piece_2_3.jpg differ diff --git a/puzzles/6/32/piece_2_4.jpg b/puzzles/6/32/piece_2_4.jpg new file mode 100644 index 00000000..dbf2a740 Binary files /dev/null and b/puzzles/6/32/piece_2_4.jpg differ diff --git a/puzzles/6/32/piece_2_5.jpg b/puzzles/6/32/piece_2_5.jpg new file mode 100644 index 00000000..ed743139 Binary files /dev/null and b/puzzles/6/32/piece_2_5.jpg differ diff --git a/puzzles/6/32/piece_2_6.jpg b/puzzles/6/32/piece_2_6.jpg new file mode 100644 index 00000000..e690ca1b Binary files /dev/null and b/puzzles/6/32/piece_2_6.jpg differ diff --git a/puzzles/6/32/piece_2_7.jpg b/puzzles/6/32/piece_2_7.jpg new file mode 100644 index 00000000..a835b531 Binary files /dev/null and b/puzzles/6/32/piece_2_7.jpg differ diff --git a/puzzles/6/32/piece_3_0.jpg b/puzzles/6/32/piece_3_0.jpg new file mode 100644 index 00000000..65e3faf5 Binary files /dev/null and b/puzzles/6/32/piece_3_0.jpg differ diff --git a/puzzles/6/32/piece_3_1.jpg b/puzzles/6/32/piece_3_1.jpg new file mode 100644 index 00000000..bd23b43e Binary files /dev/null and b/puzzles/6/32/piece_3_1.jpg differ diff --git a/puzzles/6/32/piece_3_2.jpg b/puzzles/6/32/piece_3_2.jpg new file mode 100644 index 00000000..69375d4d Binary files /dev/null and b/puzzles/6/32/piece_3_2.jpg differ diff --git a/puzzles/6/32/piece_3_3.jpg b/puzzles/6/32/piece_3_3.jpg new file mode 100644 index 00000000..339235a3 Binary files /dev/null and b/puzzles/6/32/piece_3_3.jpg differ diff --git a/puzzles/6/32/piece_3_4.jpg b/puzzles/6/32/piece_3_4.jpg new file mode 100644 index 00000000..de4cc7b2 Binary files /dev/null and b/puzzles/6/32/piece_3_4.jpg differ diff --git a/puzzles/6/32/piece_3_5.jpg b/puzzles/6/32/piece_3_5.jpg new file mode 100644 index 00000000..a567d6c7 Binary files /dev/null and b/puzzles/6/32/piece_3_5.jpg differ diff --git a/puzzles/6/32/piece_3_6.jpg b/puzzles/6/32/piece_3_6.jpg new file mode 100644 index 00000000..06b7cd6a Binary files /dev/null and b/puzzles/6/32/piece_3_6.jpg differ diff --git a/puzzles/6/32/piece_3_7.jpg b/puzzles/6/32/piece_3_7.jpg new file mode 100644 index 00000000..bfc75f40 Binary files /dev/null and b/puzzles/6/32/piece_3_7.jpg differ diff --git a/puzzles/6/64/piece_0_0.jpg b/puzzles/6/64/piece_0_0.jpg new file mode 100644 index 00000000..8e64c57d Binary files /dev/null and b/puzzles/6/64/piece_0_0.jpg differ diff --git a/puzzles/6/64/piece_0_1.jpg b/puzzles/6/64/piece_0_1.jpg new file mode 100644 index 00000000..a31aa965 Binary files /dev/null and b/puzzles/6/64/piece_0_1.jpg differ diff --git a/puzzles/6/64/piece_0_2.jpg b/puzzles/6/64/piece_0_2.jpg new file mode 100644 index 00000000..ca5207af Binary files /dev/null and b/puzzles/6/64/piece_0_2.jpg differ diff --git a/puzzles/6/64/piece_0_3.jpg b/puzzles/6/64/piece_0_3.jpg new file mode 100644 index 00000000..fad3e912 Binary files /dev/null and b/puzzles/6/64/piece_0_3.jpg differ diff --git a/puzzles/6/64/piece_0_4.jpg b/puzzles/6/64/piece_0_4.jpg new file mode 100644 index 00000000..43aa50c3 Binary files /dev/null and b/puzzles/6/64/piece_0_4.jpg differ diff --git a/puzzles/6/64/piece_0_5.jpg b/puzzles/6/64/piece_0_5.jpg new file mode 100644 index 00000000..7b0f0a3f Binary files /dev/null and b/puzzles/6/64/piece_0_5.jpg differ diff --git a/puzzles/6/64/piece_0_6.jpg b/puzzles/6/64/piece_0_6.jpg new file mode 100644 index 00000000..c1245ff3 Binary files /dev/null and b/puzzles/6/64/piece_0_6.jpg differ diff --git a/puzzles/6/64/piece_0_7.jpg b/puzzles/6/64/piece_0_7.jpg new file mode 100644 index 00000000..abcd1c92 Binary files /dev/null and b/puzzles/6/64/piece_0_7.jpg differ diff --git a/puzzles/6/64/piece_1_0.jpg b/puzzles/6/64/piece_1_0.jpg new file mode 100644 index 00000000..a245568c Binary files /dev/null and b/puzzles/6/64/piece_1_0.jpg differ diff --git a/puzzles/6/64/piece_1_1.jpg b/puzzles/6/64/piece_1_1.jpg new file mode 100644 index 00000000..c01055d6 Binary files /dev/null and b/puzzles/6/64/piece_1_1.jpg differ diff --git a/puzzles/6/64/piece_1_2.jpg b/puzzles/6/64/piece_1_2.jpg new file mode 100644 index 00000000..c2661065 Binary files /dev/null and b/puzzles/6/64/piece_1_2.jpg differ diff --git a/puzzles/6/64/piece_1_3.jpg b/puzzles/6/64/piece_1_3.jpg new file mode 100644 index 00000000..34410c9a Binary files /dev/null and b/puzzles/6/64/piece_1_3.jpg differ diff --git a/puzzles/6/64/piece_1_4.jpg b/puzzles/6/64/piece_1_4.jpg new file mode 100644 index 00000000..7d82c4dd Binary files /dev/null and b/puzzles/6/64/piece_1_4.jpg differ diff --git a/puzzles/6/64/piece_1_5.jpg b/puzzles/6/64/piece_1_5.jpg new file mode 100644 index 00000000..1a8fd791 Binary files /dev/null and b/puzzles/6/64/piece_1_5.jpg differ diff --git a/puzzles/6/64/piece_1_6.jpg b/puzzles/6/64/piece_1_6.jpg new file mode 100644 index 00000000..8c5b203a Binary files /dev/null and b/puzzles/6/64/piece_1_6.jpg differ diff --git a/puzzles/6/64/piece_1_7.jpg b/puzzles/6/64/piece_1_7.jpg new file mode 100644 index 00000000..94b16d7b Binary files /dev/null and b/puzzles/6/64/piece_1_7.jpg differ diff --git a/puzzles/6/64/piece_2_0.jpg b/puzzles/6/64/piece_2_0.jpg new file mode 100644 index 00000000..629d7a0e Binary files /dev/null and b/puzzles/6/64/piece_2_0.jpg differ diff --git a/puzzles/6/64/piece_2_1.jpg b/puzzles/6/64/piece_2_1.jpg new file mode 100644 index 00000000..c755784f Binary files /dev/null and b/puzzles/6/64/piece_2_1.jpg differ diff --git a/puzzles/6/64/piece_2_2.jpg b/puzzles/6/64/piece_2_2.jpg new file mode 100644 index 00000000..d87cee6e Binary files /dev/null and b/puzzles/6/64/piece_2_2.jpg differ diff --git a/puzzles/6/64/piece_2_3.jpg b/puzzles/6/64/piece_2_3.jpg new file mode 100644 index 00000000..5e0956e1 Binary files /dev/null and b/puzzles/6/64/piece_2_3.jpg differ diff --git a/puzzles/6/64/piece_2_4.jpg b/puzzles/6/64/piece_2_4.jpg new file mode 100644 index 00000000..8d82a89a Binary files /dev/null and b/puzzles/6/64/piece_2_4.jpg differ diff --git a/puzzles/6/64/piece_2_5.jpg b/puzzles/6/64/piece_2_5.jpg new file mode 100644 index 00000000..affe9994 Binary files /dev/null and b/puzzles/6/64/piece_2_5.jpg differ diff --git a/puzzles/6/64/piece_2_6.jpg b/puzzles/6/64/piece_2_6.jpg new file mode 100644 index 00000000..ea25c280 Binary files /dev/null and b/puzzles/6/64/piece_2_6.jpg differ diff --git a/puzzles/6/64/piece_2_7.jpg b/puzzles/6/64/piece_2_7.jpg new file mode 100644 index 00000000..5bc633be Binary files /dev/null and b/puzzles/6/64/piece_2_7.jpg differ diff --git a/puzzles/6/64/piece_3_0.jpg b/puzzles/6/64/piece_3_0.jpg new file mode 100644 index 00000000..67ab4efe Binary files /dev/null and b/puzzles/6/64/piece_3_0.jpg differ diff --git a/puzzles/6/64/piece_3_1.jpg b/puzzles/6/64/piece_3_1.jpg new file mode 100644 index 00000000..fe0a29b4 Binary files /dev/null and b/puzzles/6/64/piece_3_1.jpg differ diff --git a/puzzles/6/64/piece_3_2.jpg b/puzzles/6/64/piece_3_2.jpg new file mode 100644 index 00000000..15bacaa6 Binary files /dev/null and b/puzzles/6/64/piece_3_2.jpg differ diff --git a/puzzles/6/64/piece_3_3.jpg b/puzzles/6/64/piece_3_3.jpg new file mode 100644 index 00000000..1d489207 Binary files /dev/null and b/puzzles/6/64/piece_3_3.jpg differ diff --git a/puzzles/6/64/piece_3_4.jpg b/puzzles/6/64/piece_3_4.jpg new file mode 100644 index 00000000..cc974ddb Binary files /dev/null and b/puzzles/6/64/piece_3_4.jpg differ diff --git a/puzzles/6/64/piece_3_5.jpg b/puzzles/6/64/piece_3_5.jpg new file mode 100644 index 00000000..1a25dabd Binary files /dev/null and b/puzzles/6/64/piece_3_5.jpg differ diff --git a/puzzles/6/64/piece_3_6.jpg b/puzzles/6/64/piece_3_6.jpg new file mode 100644 index 00000000..d577dd47 Binary files /dev/null and b/puzzles/6/64/piece_3_6.jpg differ diff --git a/puzzles/6/64/piece_3_7.jpg b/puzzles/6/64/piece_3_7.jpg new file mode 100644 index 00000000..7ae7edb0 Binary files /dev/null and b/puzzles/6/64/piece_3_7.jpg differ diff --git a/puzzles/6/64/piece_4_0.jpg b/puzzles/6/64/piece_4_0.jpg new file mode 100644 index 00000000..ec54ad31 Binary files /dev/null and b/puzzles/6/64/piece_4_0.jpg differ diff --git a/puzzles/6/64/piece_4_1.jpg b/puzzles/6/64/piece_4_1.jpg new file mode 100644 index 00000000..4fd818ea Binary files /dev/null and b/puzzles/6/64/piece_4_1.jpg differ diff --git a/puzzles/6/64/piece_4_2.jpg b/puzzles/6/64/piece_4_2.jpg new file mode 100644 index 00000000..bad3719c Binary files /dev/null and b/puzzles/6/64/piece_4_2.jpg differ diff --git a/puzzles/6/64/piece_4_3.jpg b/puzzles/6/64/piece_4_3.jpg new file mode 100644 index 00000000..9af124e2 Binary files /dev/null and b/puzzles/6/64/piece_4_3.jpg differ diff --git a/puzzles/6/64/piece_4_4.jpg b/puzzles/6/64/piece_4_4.jpg new file mode 100644 index 00000000..3851f7ca Binary files /dev/null and b/puzzles/6/64/piece_4_4.jpg differ diff --git a/puzzles/6/64/piece_4_5.jpg b/puzzles/6/64/piece_4_5.jpg new file mode 100644 index 00000000..df537de3 Binary files /dev/null and b/puzzles/6/64/piece_4_5.jpg differ diff --git a/puzzles/6/64/piece_4_6.jpg b/puzzles/6/64/piece_4_6.jpg new file mode 100644 index 00000000..cb26edc1 Binary files /dev/null and b/puzzles/6/64/piece_4_6.jpg differ diff --git a/puzzles/6/64/piece_4_7.jpg b/puzzles/6/64/piece_4_7.jpg new file mode 100644 index 00000000..96b8782d Binary files /dev/null and b/puzzles/6/64/piece_4_7.jpg differ diff --git a/puzzles/6/64/piece_5_0.jpg b/puzzles/6/64/piece_5_0.jpg new file mode 100644 index 00000000..606e805b Binary files /dev/null and b/puzzles/6/64/piece_5_0.jpg differ diff --git a/puzzles/6/64/piece_5_1.jpg b/puzzles/6/64/piece_5_1.jpg new file mode 100644 index 00000000..ec37879c Binary files /dev/null and b/puzzles/6/64/piece_5_1.jpg differ diff --git a/puzzles/6/64/piece_5_2.jpg b/puzzles/6/64/piece_5_2.jpg new file mode 100644 index 00000000..8b6e8908 Binary files /dev/null and b/puzzles/6/64/piece_5_2.jpg differ diff --git a/puzzles/6/64/piece_5_3.jpg b/puzzles/6/64/piece_5_3.jpg new file mode 100644 index 00000000..70377628 Binary files /dev/null and b/puzzles/6/64/piece_5_3.jpg differ diff --git a/puzzles/6/64/piece_5_4.jpg b/puzzles/6/64/piece_5_4.jpg new file mode 100644 index 00000000..fcea5e8b Binary files /dev/null and b/puzzles/6/64/piece_5_4.jpg differ diff --git a/puzzles/6/64/piece_5_5.jpg b/puzzles/6/64/piece_5_5.jpg new file mode 100644 index 00000000..b30aee37 Binary files /dev/null and b/puzzles/6/64/piece_5_5.jpg differ diff --git a/puzzles/6/64/piece_5_6.jpg b/puzzles/6/64/piece_5_6.jpg new file mode 100644 index 00000000..45288dd6 Binary files /dev/null and b/puzzles/6/64/piece_5_6.jpg differ diff --git a/puzzles/6/64/piece_5_7.jpg b/puzzles/6/64/piece_5_7.jpg new file mode 100644 index 00000000..c89da18d Binary files /dev/null and b/puzzles/6/64/piece_5_7.jpg differ diff --git a/puzzles/6/64/piece_6_0.jpg b/puzzles/6/64/piece_6_0.jpg new file mode 100644 index 00000000..a6694d8f Binary files /dev/null and b/puzzles/6/64/piece_6_0.jpg differ diff --git a/puzzles/6/64/piece_6_1.jpg b/puzzles/6/64/piece_6_1.jpg new file mode 100644 index 00000000..9b897091 Binary files /dev/null and b/puzzles/6/64/piece_6_1.jpg differ diff --git a/puzzles/6/64/piece_6_2.jpg b/puzzles/6/64/piece_6_2.jpg new file mode 100644 index 00000000..01a2e9e0 Binary files /dev/null and b/puzzles/6/64/piece_6_2.jpg differ diff --git a/puzzles/6/64/piece_6_3.jpg b/puzzles/6/64/piece_6_3.jpg new file mode 100644 index 00000000..385a2cc6 Binary files /dev/null and b/puzzles/6/64/piece_6_3.jpg differ diff --git a/puzzles/6/64/piece_6_4.jpg b/puzzles/6/64/piece_6_4.jpg new file mode 100644 index 00000000..1b14d91d Binary files /dev/null and b/puzzles/6/64/piece_6_4.jpg differ diff --git a/puzzles/6/64/piece_6_5.jpg b/puzzles/6/64/piece_6_5.jpg new file mode 100644 index 00000000..9ff1a2cc Binary files /dev/null and b/puzzles/6/64/piece_6_5.jpg differ diff --git a/puzzles/6/64/piece_6_6.jpg b/puzzles/6/64/piece_6_6.jpg new file mode 100644 index 00000000..c9765dcc Binary files /dev/null and b/puzzles/6/64/piece_6_6.jpg differ diff --git a/puzzles/6/64/piece_6_7.jpg b/puzzles/6/64/piece_6_7.jpg new file mode 100644 index 00000000..0d19d14e Binary files /dev/null and b/puzzles/6/64/piece_6_7.jpg differ diff --git a/puzzles/6/64/piece_7_0.jpg b/puzzles/6/64/piece_7_0.jpg new file mode 100644 index 00000000..e442d67a Binary files /dev/null and b/puzzles/6/64/piece_7_0.jpg differ diff --git a/puzzles/6/64/piece_7_1.jpg b/puzzles/6/64/piece_7_1.jpg new file mode 100644 index 00000000..c804c256 Binary files /dev/null and b/puzzles/6/64/piece_7_1.jpg differ diff --git a/puzzles/6/64/piece_7_2.jpg b/puzzles/6/64/piece_7_2.jpg new file mode 100644 index 00000000..f837311c Binary files /dev/null and b/puzzles/6/64/piece_7_2.jpg differ diff --git a/puzzles/6/64/piece_7_3.jpg b/puzzles/6/64/piece_7_3.jpg new file mode 100644 index 00000000..4f606c9f Binary files /dev/null and b/puzzles/6/64/piece_7_3.jpg differ diff --git a/puzzles/6/64/piece_7_4.jpg b/puzzles/6/64/piece_7_4.jpg new file mode 100644 index 00000000..1b3f3463 Binary files /dev/null and b/puzzles/6/64/piece_7_4.jpg differ diff --git a/puzzles/6/64/piece_7_5.jpg b/puzzles/6/64/piece_7_5.jpg new file mode 100644 index 00000000..f8d6b66a Binary files /dev/null and b/puzzles/6/64/piece_7_5.jpg differ diff --git a/puzzles/6/64/piece_7_6.jpg b/puzzles/6/64/piece_7_6.jpg new file mode 100644 index 00000000..99ab2c44 Binary files /dev/null and b/puzzles/6/64/piece_7_6.jpg differ diff --git a/puzzles/6/64/piece_7_7.jpg b/puzzles/6/64/piece_7_7.jpg new file mode 100644 index 00000000..3a56406e Binary files /dev/null and b/puzzles/6/64/piece_7_7.jpg differ diff --git a/uploads/puzzle_68d9b058cc5df2.07610559.jpg b/uploads/puzzle_68d9b058cc5df2.07610559.jpg new file mode 100644 index 00000000..a956dfbd Binary files /dev/null and b/uploads/puzzle_68d9b058cc5df2.07610559.jpg differ diff --git a/uploads/puzzle_68d9b07ebbab67.32755006.jpg b/uploads/puzzle_68d9b07ebbab67.32755006.jpg new file mode 100644 index 00000000..a8aca963 Binary files /dev/null and b/uploads/puzzle_68d9b07ebbab67.32755006.jpg differ diff --git a/uploads/puzzle_68d9b0835fe3c1.90272325.jpg b/uploads/puzzle_68d9b0835fe3c1.90272325.jpg new file mode 100644 index 00000000..e425fc2e Binary files /dev/null and b/uploads/puzzle_68d9b0835fe3c1.90272325.jpg differ diff --git a/uploads/puzzle_68d9b08dbafc66.03782442.jpg b/uploads/puzzle_68d9b08dbafc66.03782442.jpg new file mode 100644 index 00000000..a956dfbd Binary files /dev/null and b/uploads/puzzle_68d9b08dbafc66.03782442.jpg differ diff --git a/uploads/puzzle_68d9b17e11da81.29475683.jpg b/uploads/puzzle_68d9b17e11da81.29475683.jpg new file mode 100644 index 00000000..a956dfbd Binary files /dev/null and b/uploads/puzzle_68d9b17e11da81.29475683.jpg differ diff --git a/uploads/puzzle_68d9b301ebe351.45585775.jpg b/uploads/puzzle_68d9b301ebe351.45585775.jpg new file mode 100644 index 00000000..a956dfbd Binary files /dev/null and b/uploads/puzzle_68d9b301ebe351.45585775.jpg differ