Index: dea/.gitignore
===================================================================
--- .idea/.gitignore	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,5 +1,0 @@
-# Default ignored files
-/shelf/
-/workspace.xml
-# Editor-based HTTP Client requests
-/httpRequests/
Index: dea/Shifter.iml
===================================================================
--- .idea/Shifter.iml	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,12 +1,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="WEB_MODULE" version="4">
-  <component name="NewModuleRootManager">
-    <content url="file://$MODULE_DIR$">
-      <excludeFolder url="file://$MODULE_DIR$/.tmp" />
-      <excludeFolder url="file://$MODULE_DIR$/temp" />
-      <excludeFolder url="file://$MODULE_DIR$/tmp" />
-    </content>
-    <orderEntry type="inheritedJdk" />
-    <orderEntry type="sourceFolder" forTests="false" />
-  </component>
-</module>
Index: dea/inspectionProfiles/Project_Default.xml
===================================================================
--- .idea/inspectionProfiles/Project_Default.xml	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,6 +1,0 @@
-<component name="InspectionProjectProfileManager">
-  <profile version="1.0">
-    <option name="myName" value="Project Default" />
-    <inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
-  </profile>
-</component>
Index: dea/modules.xml
===================================================================
--- .idea/modules.xml	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,8 +1,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="ProjectModuleManager">
-    <modules>
-      <module fileurl="file://$PROJECT_DIR$/.idea/Shifter.iml" filepath="$PROJECT_DIR$/.idea/Shifter.iml" />
-    </modules>
-  </component>
-</project>
Index: dea/vcs.xml
===================================================================
--- .idea/vcs.xml	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,6 +1,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="VcsDirectoryMappings">
-    <mapping directory="" vcs="Git" />
-  </component>
-</project>
Index: backend/.gitignore
===================================================================
--- backend/.gitignore	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ backend/.gitignore	(revision 0672351328b09eb632b662e1c87b53be8e8e5b3f)
@@ -4,19 +4,4 @@
 !**/src/main/**/target/
 !**/src/test/**/target/
-
-/src/main/resources/application-dev.properties
-/src/main/resources/application-test.properties
-
-.env
-src/main/resources/service-account.json
-
-### IntelliJ IDEA ###
-.idea
-*.iws
-*.iml
-*.ipr
-
-
-### DO NOT NEET THESE BELOW ###
 
 ### STS ###
@@ -28,4 +13,10 @@
 .springBeans
 .sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
 
 ### NetBeans ###
Index: ckend/Dockerfile
===================================================================
--- backend/Dockerfile	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,4 +1,0 @@
-FROM maven:3.9-eclipse-temurin-21
-WORKDIR /app
-COPY . .
-CMD ["mvn", "spring-boot:run"]
Index: ckend/docker-compose.yml
===================================================================
--- backend/docker-compose.yml	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,17 +1,0 @@
-
-services:
-  db:
-    image: postgres:17
-    container_name: shifter-db
-    ports:
-      - "7781:5432"
-    environment:
-      POSTGRES_DB: ${POSTGRES_DB}
-      POSTGRES_USER: ${POSTGRES_USER}
-      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
-    volumes:
-      - shifter-db-data:/var/lib/postgresql/data
-    restart: always
-
-volumes:
-  shifter-db-data:
Index: backend/pom.xml
===================================================================
--- backend/pom.xml	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ backend/pom.xml	(revision 0672351328b09eb632b662e1c87b53be8e8e5b3f)
@@ -6,5 +6,5 @@
 		<groupId>org.springframework.boot</groupId>
 		<artifactId>spring-boot-starter-parent</artifactId>
-		<version>3.5.3</version> <!-- https://github.com/spring-projects/spring-boot/releases -->
+		<version>3.5.0</version>
 		<relativePath/> <!-- lookup parent from repository -->
 	</parent>
@@ -15,105 +15,30 @@
 	<description>Shifter</description>
 	<url/>
+	<licenses>
+		<license/>
+	</licenses>
 	<developers>
-		<developer>
-			<id>borjan</id>
-			<name>Borjan Gjorgjievski</name>
-		</developer>
+		<developer/>
 	</developers>
+	<scm>
+		<connection/>
+		<developerConnection/>
+		<tag/>
+		<url/>
+	</scm>
 	<properties>
 		<java.version>17</java.version>
 	</properties>
-
-	<!-- AWS SDK BOM to manage versions consistently -->
-	<dependencyManagement>
-		<dependencies>
-			<dependency>
-				<groupId>software.amazon.awssdk</groupId>
-				<artifactId>bom</artifactId>
-				<version>2.25.13</version>
-				<type>pom</type>
-				<scope>import</scope>
-			</dependency>
-		</dependencies>
-	</dependencyManagement>
-
 	<dependencies>
-		<!-- Spring Boot starters -->
 		<dependency>
 			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-starter-web</artifactId>
 		</dependency>
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-data-jpa</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-security</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-validation</artifactId>
-		</dependency>
 
-		<!-- PostgreSQL driver -->
-		<dependency>
-			<groupId>org.postgresql</groupId>
-			<artifactId>postgresql</artifactId>
-			<version>42.7.7</version>
-			<scope>runtime</scope>
-		</dependency>
-
-		<!-- MapStruct -->
-		<dependency>
-			<groupId>org.mapstruct</groupId>
-			<artifactId>mapstruct</artifactId>
-			<version>1.6.3</version>
-		</dependency>
-<!--		<dependency>-->
-<!--			<groupId>org.mapstruct</groupId>-->
-<!--			<artifactId>mapstruct-processor</artifactId>-->
-<!--			<version>1.5.5.Final</version>-->
-<!--			<scope>provided</scope>-->
-<!--		</dependency>-->
-
-		<!-- Lombok -->
 		<dependency>
 			<groupId>org.projectlombok</groupId>
 			<artifactId>lombok</artifactId>
-			<version>1.18.38</version>
-			<scope>provided</scope>
+			<optional>true</optional>
 		</dependency>
-
-		<!-- JWT -->
-		<dependency>
-			<groupId>io.jsonwebtoken</groupId>
-			<artifactId>jjwt-api</artifactId>
-			<version>0.11.5</version>
-		</dependency>
-		<dependency>
-			<groupId>io.jsonwebtoken</groupId>
-			<artifactId>jjwt-impl</artifactId>
-			<version>0.11.5</version>
-		</dependency>
-		<dependency>
-			<groupId>io.jsonwebtoken</groupId>
-			<artifactId>jjwt-jackson</artifactId>
-			<version>0.11.5</version>
-		</dependency>
-
-		<!-- Add these JAXB dependencies to fix the missing class -->
-		<dependency>
-			<groupId>jakarta.xml.bind</groupId>
-			<artifactId>jakarta.xml.bind-api</artifactId>
-			<version>4.0.0</version>
-		</dependency>
-		<dependency>
-			<groupId>org.glassfish.jaxb</groupId>
-			<artifactId>jaxb-runtime</artifactId>
-			<version>4.0.0</version>
-		</dependency>
-
-		<!-- Test dependencies -->
 		<dependency>
 			<groupId>org.springframework.boot</groupId>
@@ -121,80 +46,4 @@
 			<scope>test</scope>
 		</dependency>
-
-		<dependency>
-			<groupId>org.springframework.security</groupId>
-			<artifactId>spring-security-test</artifactId>
-			<scope>test</scope>
-		</dependency>
-
-		<!-- Amazon web services-->
-		<dependency>
-			<groupId>software.amazon.awssdk</groupId>
-			<artifactId>s3</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>software.amazon.awssdk</groupId>
-			<artifactId>auth</artifactId>
-		</dependency>
-
-		<!-- Dotenv Java-->
-		<dependency>
-			<groupId>io.github.cdimascio</groupId>
-			<artifactId>dotenv-java</artifactId>
-			<version>3.2.0</version>
-		</dependency>
-
-		<!-- Google Api -->
-		<dependency>
-			<groupId>com.google.guava</groupId>
-			<artifactId>guava</artifactId>
-			<version>32.1.2-jre</version>
-		</dependency>
-		<dependency>
-			<groupId>com.google.api-client</groupId>
-			<artifactId>google-api-client</artifactId>
-			<version>2.0.0</version>
-		</dependency>
-		<dependency>
-			<groupId>com.google.apis</groupId>
-			<artifactId>google-api-services-calendar</artifactId>
-			<version>v3-rev20250404-2.0.0</version>
-		</dependency>
-		<dependency>
-			<groupId>com.google.auth</groupId>
-			<artifactId>google-auth-library-credentials</artifactId>
-			<version>1.37.1</version>
-		</dependency>
-		<dependency>
-			<groupId>com.google.auth</groupId>
-			<artifactId>google-auth-library-oauth2-http</artifactId>
-			<version>1.37.1</version>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-oauth2-client</artifactId>
-		</dependency>
-
-
-		<dependency>
-			<groupId>com.google.http-client</groupId>
-			<artifactId>google-http-client-jackson2</artifactId>
-			<version>1.45.0</version>
-		</dependency>
-
-		<!-- Email -->
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-mail</artifactId>
-		</dependency>
-
-		<!-- PDF -->
-		<dependency>
-			<groupId>org.apache.pdfbox</groupId>
-			<artifactId>pdfbox</artifactId>
-			<version>2.0.30</version>
-		</dependency>
-
-
 	</dependencies>
 
@@ -204,23 +53,9 @@
 				<groupId>org.apache.maven.plugins</groupId>
 				<artifactId>maven-compiler-plugin</artifactId>
-				<version>3.11.0</version>
 				<configuration>
-					<source>17</source>
-					<target>17</target>
 					<annotationProcessorPaths>
-						<path>
-							<groupId>org.mapstruct</groupId>
-							<artifactId>mapstruct-processor</artifactId>
-							<version>1.6.3</version>
-						</path>
 						<path>
 							<groupId>org.projectlombok</groupId>
 							<artifactId>lombok</artifactId>
-							<version>1.18.38</version>
-						</path>
-						<path>
-							<groupId>org.projectlombok</groupId>
-							<artifactId>lombok-mapstruct-binding</artifactId>
-							<version>0.2.0</version>
 						</path>
 					</annotationProcessorPaths>
@@ -239,5 +74,4 @@
 				</configuration>
 			</plugin>
-
 		</plugins>
 	</build>
Index: ckend/requests.http
===================================================================
--- backend/requests.http	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,1 +1,0 @@
-GET localhost:8080/api/test/send-email
Index: backend/src/main/java/com/shifterwebapp/shifter/ShifterApplication.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/ShifterApplication.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ backend/src/main/java/com/shifterwebapp/shifter/ShifterApplication.java	(revision 0672351328b09eb632b662e1c87b53be8e8e5b3f)
@@ -1,47 +1,11 @@
 package com.shifterwebapp.shifter;
-import io.github.cdimascio.dotenv.Dotenv;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.scheduling.annotation.EnableScheduling;
 
-@EnableScheduling
 @SpringBootApplication
 public class ShifterApplication {
 
 	public static void main(String[] args) {
-		Dotenv dotenv = Dotenv.configure()
-				.ignoreIfMissing()
-				.load();
-
-		// Set env variables from .env file
-		System.setProperty("JWT_CONFIG_SECRET", dotenv.get("JWT_CONFIG_SECRET"));
-
-		System.setProperty("SPRING_DATASOURCE_URL", dotenv.get("SPRING_DATASOURCE_URL"));
-		System.setProperty("SPRING_DATASOURCE_USERNAME", dotenv.get("SPRING_DATASOURCE_USERNAME"));
-		System.setProperty("SPRING_DATASOURCE_PASSWORD", dotenv.get("SPRING_DATASOURCE_PASSWORD"));
-
-		System.setProperty("AWS_S3_REGION", dotenv.get("AWS_S3_REGION"));
-		System.setProperty("AWS_S3_BUCKET_NAME", dotenv.get("AWS_S3_BUCKET_NAME"));
-		System.setProperty("AWS_S3_ACCESS_KEY", dotenv.get("AWS_S3_ACCESS_KEY"));
-		System.setProperty("AWS_S3_SECRET_KEY", dotenv.get("AWS_S3_SECRET_KEY"));
-
-		System.setProperty("GOOGLE_CLIENT_ID", dotenv.get("GOOGLE_CLIENT_ID"));
-		System.setProperty("GOOGLE_CLIENT_SECRET", dotenv.get("GOOGLE_CLIENT_SECRET"));
-		System.setProperty("GOOGLE_REFRESH_TOKEN", dotenv.get("GOOGLE_REFRESH_TOKEN"));
-
-		System.setProperty("GOOGLE_EXPERT_CALENDAR_ID", dotenv.get("GOOGLE_EXPERT_CALENDAR_ID"));
-		System.setProperty("GOOGLE_SERVICE_ACCOUNT_EMAIL", dotenv.get("GOOGLE_SERVICE_ACCOUNT_EMAIL"));
-		System.setProperty("GOOGLE_CALENDAR_PRIVATE_KEY", dotenv.get("GOOGLE_CALENDAR_PRIVATE_KEY").replace("\\n", "\n"));
-
-		System.setProperty("EMAIL_HOST", dotenv.get("EMAIL_HOST"));
-		System.setProperty("EMAIL_PORT", dotenv.get("EMAIL_PORT"));
-		System.setProperty("EMAIL_USERNAME", dotenv.get("EMAIL_USERNAME"));
-		System.setProperty("EMAIL_PASSWORD", dotenv.get("EMAIL_PASSWORD"));
-
-		System.setProperty("ZOOM_ACCOUNT_ID", dotenv.get("ZOOM_ACCOUNT_ID"));
-		System.setProperty("ZOOM_CLIENT_ID", dotenv.get("ZOOM_CLIENT_ID"));
-		System.setProperty("ZOOM_CLIENT_SECRET", dotenv.get("ZOOM_CLIENT_SECRET"));
-
 		SpringApplication.run(ShifterApplication.class, args);
 	}
Index: ckend/src/main/java/com/shifterwebapp/shifter/TestController.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/TestController.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,38 +1,0 @@
-package com.shifterwebapp.shifter;
-
-import com.shifterwebapp.shifter.external.email.EmailService;
-import lombok.RequiredArgsConstructor;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.util.List;
-
-@RequiredArgsConstructor
-@RestController
-@RequestMapping("${api.base.path}/test")
-public class TestController {
-
-    private final EmailService emailService;
-
-    @GetMapping("/send-email")
-    public void sendTestEmail() {
-        emailService.sendCoursePurchaseConfirmation(
-                "borjangjorgjievski1@gmail.com",
-                "Sales Fundamentals",
-                "Test Test",
-                "www.google.com",
-                "Borjan"
-                );
-    }
-
-    @GetMapping("/send-verification-email")
-    public void sendVerificationEmail() {
-        emailService.sendVerificationToken(
-                "borjangjorgjievski1@gmail.com",
-                "https://localhost:5173"
-        );
-    }
-
-
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/Validate.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/Validate.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,91 +1,0 @@
-package com.shifterwebapp.shifter;
-
-import com.shifterwebapp.shifter.auth.CustomAuthDetails;
-import com.shifterwebapp.shifter.course.CourseRepository;
-import com.shifterwebapp.shifter.exception.BadRequestException;
-import com.shifterwebapp.shifter.exception.ResourceNotFoundException;
-import com.shifterwebapp.shifter.exception.UnauthorizedException;
-import com.shifterwebapp.shifter.payment.PaymentRepository;
-import com.shifterwebapp.shifter.user.UserRepository;
-import com.shifterwebapp.shifter.usercourseprogress.UserCourseProgressRepository;
-import lombok.RequiredArgsConstructor;
-import org.springframework.security.core.Authentication;
-import org.springframework.stereotype.Component;
-
-@Component
-@RequiredArgsConstructor
-public class Validate {
-
-    private final UserRepository userRepository;
-    private final CourseRepository courseRepository;
-    private final UserCourseProgressRepository userCourseProgressRepository;
-    private final PaymentRepository paymentRepository;
-
-    public void validateUserExists(Long userId) {
-        if (!userRepository.existsById(userId)) {
-            throw new ResourceNotFoundException("User with ID " + userId + " not found!");
-        }
-    }
-
-    public void validateUserExists(String email) {
-        if (!userRepository.existsUserByEmail(email)) {
-            throw new ResourceNotFoundException("User with email " + email + " not found!");
-        }
-    }
-
-    public void validateUserIsAuthenticated(Authentication authentication) {
-        if (authentication == null || !authentication.isAuthenticated() || authentication.getName() == null) {
-            throw new UnauthorizedException("User is not authenticated");
-        }
-    }
-
-    public Long extractUserId(Authentication authentication) {
-        validateUserIsAuthenticated(authentication);
-
-        Object detailsObj = authentication.getDetails();
-        if (!(detailsObj instanceof CustomAuthDetails details)) {
-            throw new BadRequestException("Invalid authentication details");
-        }
-        return details.getUserId();
-    }
-
-
-    public void validateUserIsAdmin(Authentication authentication) {
-        validateUserIsAuthenticated(authentication);
-        Object detailsObj = authentication.getDetails();
-        if (detailsObj instanceof CustomAuthDetails details) {
-            Long userId = details.getUserId();
-            boolean isAdmin = userRepository.isAdmin(userId);
-            if (!isAdmin) {
-                throw new UnauthorizedException("User is not an admin");
-            }
-        } else {
-            throw new UnauthorizedException("User is not an admin");
-        }
-    }
-
-
-    public void validateCourseExists(Long courseId) {
-        if (!courseRepository.existsById(courseId)) {
-            throw new ResourceNotFoundException("Course with ID " + courseId + " not found!");
-        }
-    }
-
-    public void validateUserCourseProgressExists(Long progressId) {
-        if (!userCourseProgressRepository.existsById(progressId)) {
-            throw new ResourceNotFoundException("UserCourseProgress with ID " + progressId + " not found!");
-        }
-    }
-
-    public void validatePaymentExists(Long paymentId) {
-        if (!paymentRepository.existsById(paymentId)) {
-            throw new ResourceNotFoundException("Payment with ID " + paymentId + " not found!");
-        }
-    }
-
-    public void validateEnrollmentExists(Long enrollmentId) {
-        if (!paymentRepository.existsById(enrollmentId)) {
-            throw new ResourceNotFoundException("Enrollment with ID " + enrollmentId + " not found!");
-        }
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/auth/AuthController.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/auth/AuthController.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,83 +1,0 @@
-package com.shifterwebapp.shifter.auth;
-
-import com.shifterwebapp.shifter.Validate;
-import com.shifterwebapp.shifter.user.UserDto;
-import com.shifterwebapp.shifter.user.service.UserService;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
-import lombok.RequiredArgsConstructor;
-import org.apache.coyote.Response;
-import org.springframework.http.ResponseEntity;
-import org.springframework.security.core.Authentication;
-import org.springframework.web.bind.annotation.*;
-
-import java.io.IOException;
-import java.util.Map;
-
-@RequiredArgsConstructor
-@RestController
-@RequestMapping("${api.base.path}/auth")
-public class AuthController {
-
-    private final AuthService authService;
-    private final Validate validate;
-    private final UserService userService;
-
-    @PostMapping("/register")
-    public void register(@RequestBody Map<String, String> body) {
-        String email = body.get("email");
-        String password = body.get("password");
-        authService.register(email, password);
-    }
-
-    @PostMapping("/verify")
-    public ResponseEntity<String> verify(@RequestBody Map<String, String> body) {
-        String token = body.get("token");
-        String userEmail = authService.verify(token);
-        return ResponseEntity.ok(userEmail);
-    }
-
-    @PostMapping("/personalize")
-    public void personalize(
-            @RequestBody UserPersonalizationDto userPersonalizationDto,
-            HttpServletResponse response
-    ) throws IOException {
-        authService.personalize(userPersonalizationDto, response);
-    }
-
-
-    @PostMapping("/authenticate")
-    public void authenticate(@RequestBody LoginDto request, HttpServletResponse response) throws IOException {
-        authService.authenticate(request, response);
-    }
-
-    @GetMapping("/oauth/finalize")
-    public void finalizeOAuthLogin(Authentication authentication, HttpServletResponse response) throws IOException {
-        Long userId = validate.extractUserId(authentication);
-
-        authService.finalizeOAuthLogin(userId, response);
-    }
-
-    @PostMapping("/refresh")
-    public ResponseEntity<AuthResponse> refreshToken(HttpServletRequest request) {
-        AuthResponse response = authService.refreshToken(request);
-        return ResponseEntity.ok(response);
-    }
-
-    @PostMapping("/logout")
-    public void logout(HttpServletResponse response) {
-        authService.logout(response);
-    }
-
-    @GetMapping("/check-email")
-    public ResponseEntity<Boolean> checkEmail(@RequestParam String email) {
-        boolean exists = authService.checkEmail(email);
-        return ResponseEntity.ok(exists);
-    }
-
-    @PostMapping("/delete")
-    public ResponseEntity<String> delete(@RequestParam Long accountId) {
-        userService.deleteUser(accountId);
-        return ResponseEntity.ok("User deleted successfully");
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/auth/AuthResponse.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/auth/AuthResponse.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,15 +1,0 @@
-package com.shifterwebapp.shifter.auth;
-
-import com.shifterwebapp.shifter.user.UserDto;
-import lombok.*;
-
-@NoArgsConstructor
-@AllArgsConstructor
-@Getter
-@Setter
-@Builder
-public class AuthResponse {
-    private String accessToken;
-    private UserDto user;
-
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/auth/AuthService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/auth/AuthService.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,187 +1,0 @@
-package com.shifterwebapp.shifter.auth;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.shifterwebapp.shifter.config.JwtService;
-import com.shifterwebapp.shifter.enums.LoginProvider;
-import com.shifterwebapp.shifter.exception.InvalidVerificationTokenException;
-import com.shifterwebapp.shifter.external.email.EmailService;
-import com.shifterwebapp.shifter.user.User;
-import com.shifterwebapp.shifter.user.UserDto;
-import com.shifterwebapp.shifter.user.UserMapper;
-import com.shifterwebapp.shifter.user.UserRepository;
-import com.shifterwebapp.shifter.user.service.UserService;
-import com.shifterwebapp.shifter.verificationtoken.VerificationToken;
-import com.shifterwebapp.shifter.verificationtoken.VerificationTokenRepository;
-import com.shifterwebapp.shifter.verificationtoken.service.VerificationTokenService;
-import jakarta.servlet.http.Cookie;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
-import lombok.RequiredArgsConstructor;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.ResponseCookie;
-import org.springframework.security.authentication.AuthenticationManager;
-import org.springframework.security.authentication.BadCredentialsException;
-import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-import org.springframework.security.core.AuthenticationException;
-import org.springframework.stereotype.Service;
-
-import java.util.Optional;
-import java.io.IOException;
-import java.time.Duration;
-import java.time.Instant;
-import java.util.UUID;
-
-@Service
-@RequiredArgsConstructor
-public class AuthService {
-
-    private final UserService userService;
-    private final JwtService jwtService;
-    private final UserMapper userMapper;
-    private final AuthenticationManager authenticationManager;
-    private final VerificationTokenService verificationTokenService;
-    private final EmailService emailService;
-    private final VerificationTokenRepository verificationTokenRepository;
-    private final UserRepository userRepository;
-
-    private void sendTokens(HttpServletResponse response, User user) throws IOException {
-        String accessToken = jwtService.generateToken(user);
-        String refreshToken = jwtService.generateRefreshToken(user);
-
-        // Create secure HTTP-only cookie for refresh token
-        ResponseCookie cookie = ResponseCookie.from("refreshToken", refreshToken)
-                .httpOnly(true)
-                .secure(true) // true if using HTTPS
-                .path("/")
-                .maxAge(Duration.ofDays(7))
-                .sameSite("Strict")
-                .build();
-        response.addHeader(HttpHeaders.SET_COOKIE, cookie.toString());
-
-        AuthResponse authResponse = AuthResponse.builder()
-                .accessToken(accessToken)
-                .user(userMapper.toDto(user))
-                .build();
-
-        ObjectMapper mapper = new ObjectMapper();
-        response.setContentType("application/json");
-        mapper.writeValue(response.getOutputStream(), authResponse);
-    }
-
-
-    public void register(String email, String password) {
-        User user = userService.createInitialUser(email, password, LoginProvider.LOCAL);
-
-        UUID token = verificationTokenService.generateNewToken(user);
-
-        // TODO: CHANGE THE URL TO BE SHIFT-ER.COM NOT LOCALHOST
-        String verificationUrl = "http://localhost:5173/welcome?token=" + token;
-        emailService.sendVerificationToken(user.getEmail(), verificationUrl);
-    }
-
-    public String verify(String token) {
-        UUID uuid = UUID.fromString(token);
-        VerificationToken verificationToken = verificationTokenRepository.findById(uuid)
-                .orElseThrow(() -> new InvalidVerificationTokenException("Invalid or expired token"));
-
-        if (verificationToken.getExpiresAt().isBefore(Instant.now()))
-            throw new InvalidVerificationTokenException("Expired token");
-
-        User user = verificationToken.getUser();
-        user.setIsEnabled(true);
-        userRepository.save(user);
-
-        verificationTokenRepository.delete(verificationToken);
-
-        return user.getEmail();
-    }
-
-    public void personalize(UserPersonalizationDto userPersonalizationDto, HttpServletResponse response) throws IOException {
-        User user = userService.createUser(userPersonalizationDto);
-        sendTokens(response, user);
-    }
-
-    public void authenticate(LoginDto request, HttpServletResponse response) throws IOException {
-        Optional<User> userOptional = userRepository.findByEmail(request.getEmail());
-
-        if (userOptional.isPresent()) {
-            User user = userOptional.get();
-
-            if (user.getLoginProvider() != LoginProvider.LOCAL) {
-                throw new BadCredentialsException(
-                        "This account was registered with " + user.getLoginProvider() +
-                                ". Please use the corresponding login method."
-                );
-            }
-        }
-
-        try {
-            authenticationManager.authenticate(
-                    new UsernamePasswordAuthenticationToken(
-                            request.getEmail(),
-                            request.getPassword()
-                    )
-            );
-        } catch (AuthenticationException ex) {
-            throw new BadCredentialsException("Invalid email or password.");
-        }
-
-        User user = userService.getUserEntityByEmail(request.getEmail());
-
-        if (user.getIsEnabled())
-            sendTokens(response, user);
-    }
-
-    public void finalizeOAuthLogin(Long userId, HttpServletResponse response) throws IOException {
-        User user = userService.getUserEntityById(userId);
-
-        if (user.getIsEnabled())
-            sendTokens(response, user);
-    }
-
-    public AuthResponse refreshToken(HttpServletRequest request) {
-        String refreshToken = null;
-        if (request.getCookies() != null) {
-            for (Cookie cookie : request.getCookies()) {
-                if ("refreshToken".equals(cookie.getName())) {
-                    refreshToken = cookie.getValue();
-                }
-            }
-        }
-
-        if (refreshToken == null) {
-            throw new RuntimeException("Refresh token missing");
-        }
-
-        String userEmail = jwtService.extractUsername(refreshToken);
-        User user = userService.getUserEntityByEmail(userEmail);
-
-        if (!jwtService.isTokenValid(refreshToken, user)) {
-            throw new RuntimeException("Invalid refresh token");
-        }
-
-        String newAccessToken = jwtService.generateToken(user);
-
-        return AuthResponse.builder()
-                .accessToken(newAccessToken)
-                .user(userMapper.toDto(user))
-                .build();
-    }
-
-    public void logout(HttpServletResponse response) {
-        ResponseCookie cookie = ResponseCookie.from("refreshToken", "")
-                .httpOnly(true)
-                .secure(true)
-                .path("/")
-                .maxAge(0)
-                .sameSite("Strict")
-                .build();
-
-        response.setHeader(HttpHeaders.SET_COOKIE, cookie.toString());
-    }
-
-    public boolean checkEmail(String email) {
-        return userService.existsUserByEmail(email);
-    }
-
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/auth/CustomAuthDetails.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/auth/CustomAuthDetails.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,17 +1,0 @@
-package com.shifterwebapp.shifter.auth;
-
-import lombok.Getter;
-import lombok.Setter;
-
-@Getter
-@Setter
-public class CustomAuthDetails {
-    private final Long userId;
-    private final Object webDetails;
-
-    public CustomAuthDetails(Long userId, Object webDetails) {
-        this.userId = userId;
-        this.webDetails = webDetails;
-    }
-
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/auth/HelloController.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/auth/HelloController.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,12 +1,0 @@
-package com.shifterwebapp.shifter.auth;
-
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-@RestController
-public class HelloController {
-    @GetMapping("/")
-    public String sayHello() {
-        return "Hello, World!";
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/auth/LoginDto.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/auth/LoginDto.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,15 +1,0 @@
-package com.shifterwebapp.shifter.auth;
-
-import jakarta.validation.constraints.Email;
-import jakarta.validation.constraints.NotBlank;
-import lombok.Data;
-
-@Data
-public class LoginDto {
-    @Email
-    @NotBlank
-    private String email;
-
-    @NotBlank
-    private String password;
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/auth/TokenRefreshDto.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/auth/TokenRefreshDto.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,9 +1,0 @@
-package com.shifterwebapp.shifter.auth;
-
-import lombok.Data;
-
-@Data
-public class TokenRefreshDto {
-
-    String refreshToken;
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/auth/UserPersonalizationDto.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/auth/UserPersonalizationDto.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,24 +1,0 @@
-package com.shifterwebapp.shifter.auth;
-
-import com.shifterwebapp.shifter.enums.CompanySize;
-import jakarta.validation.constraints.NotBlank;
-import lombok.Data;
-
-import java.util.List;
-
-@Data
-public class UserPersonalizationDto {
-
-    @NotBlank
-    private String name;
-
-    private String email;
-
-    private CompanySize companySize;
-
-    private String workPosition;
-
-    private List<String> interests;
-
-    private List<String> desiredSkills;
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/config/AppConfig.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/config/AppConfig.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,51 +1,0 @@
-package com.shifterwebapp.shifter.config;
-
-import com.shifterwebapp.shifter.user.UserRepository;
-import jakarta.servlet.http.HttpServletResponse;
-import lombok.RequiredArgsConstructor;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.security.authentication.AuthenticationManager;
-import org.springframework.security.authentication.AuthenticationProvider;
-import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
-import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
-import org.springframework.security.core.userdetails.UserDetailsService;
-import org.springframework.security.core.userdetails.UsernameNotFoundException;
-import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
-import org.springframework.security.crypto.password.PasswordEncoder;
-import org.springframework.security.web.AuthenticationEntryPoint;
-
-@Configuration
-@RequiredArgsConstructor
-public class AppConfig {
-
-    private final UserRepository userRepository;
-
-    @Bean
-    public UserDetailsService userDetailsService() {
-        return username -> userRepository.findByEmail(username)
-                .orElseThrow(() -> new UsernameNotFoundException("User not found with email: " + username + "!"));
-    }
-
-    @Bean
-    public AuthenticationManager authenticationManager(AuthenticationConfiguration config) throws Exception {
-        return config.getAuthenticationManager();
-    }
-
-    @Bean
-    public AuthenticationProvider authenticationProvider() {
-        DaoAuthenticationProvider provider = new DaoAuthenticationProvider(userDetailsService());
-        provider.setPasswordEncoder(passwordEncoder());
-        return provider;
-    }
-
-    @Bean
-    public PasswordEncoder passwordEncoder() {
-        return new BCryptPasswordEncoder(12);
-    }
-
-    @Bean
-    public AuthenticationEntryPoint authenticationEntryPoint() {
-        return (request, response, authException) -> response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized");
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/config/JwtAuthFilter.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/config/JwtAuthFilter.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,61 +1,0 @@
-package com.shifterwebapp.shifter.config;
-
-
-import com.shifterwebapp.shifter.auth.CustomAuthDetails;
-import jakarta.servlet.FilterChain;
-import jakarta.servlet.ServletException;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
-import jakarta.validation.constraints.NotNull;
-import lombok.RequiredArgsConstructor;
-import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.security.core.userdetails.UserDetailsService;
-import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
-import org.springframework.stereotype.Component;
-import org.springframework.web.filter.OncePerRequestFilter;
-
-import java.io.IOException;
-
-@Component
-@RequiredArgsConstructor
-public class JwtAuthFilter extends OncePerRequestFilter {
-
-    private final JwtService jwtService;
-    private final UserDetailsService userDetailsService;
-
-    @Override
-    protected void doFilterInternal(
-            @NotNull HttpServletRequest request,
-            @NotNull HttpServletResponse response,
-            @NotNull FilterChain filterChain) throws ServletException, IOException {
-        final String authHeader = request.getHeader("Authorization");
-        final String jwt;
-        final String userEmail;
-        if (authHeader == null || !authHeader.startsWith("Bearer ")) {
-            filterChain.doFilter(request, response);
-            return;
-        }
-
-        jwt = authHeader.substring(7);
-        userEmail = jwtService.extractUsername(jwt);
-        if (userEmail != null && SecurityContextHolder.getContext().getAuthentication() == null) {
-            UserDetails userDetails = userDetailsService.loadUserByUsername(userEmail);
-            if (jwtService.isTokenValid(jwt, userDetails)) {
-                Long userId = jwtService.extractUserId(jwt);
-
-                UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
-
-                Object webDetails = new WebAuthenticationDetailsSource().buildDetails(request);
-
-                CustomAuthDetails customDetails = new CustomAuthDetails(userId, webDetails);
-                authToken.setDetails(customDetails);
-
-                SecurityContextHolder.getContext().setAuthentication(authToken);
-            }
-        }
-
-        filterChain.doFilter(request, response);
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/config/JwtService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/config/JwtService.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,110 +1,0 @@
-package com.shifterwebapp.shifter.config;
-
-import com.shifterwebapp.shifter.user.User;
-import com.shifterwebapp.shifter.user.UserRepository;
-import io.jsonwebtoken.*;
-import io.jsonwebtoken.security.Keys;
-import io.jsonwebtoken.Claims;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.security.core.userdetails.UsernameNotFoundException;
-import org.springframework.stereotype.Service;
-
-import javax.crypto.SecretKey;
-import java.nio.charset.StandardCharsets;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.function.Function;
-
-
-@Service
-public class JwtService {
-
-    private final String SECRET_KEY;
-    private final UserRepository userRepository;
-
-    public JwtService(@Value("${jwt.secret}") String secretKey, UserRepository userRepository) {
-        this.SECRET_KEY = secretKey;
-        this.userRepository = userRepository;
-    }
-
-    // Helper to get SecretKey instance
-    private SecretKey getSignInKey() {
-        return Keys.hmacShaKeyFor(SECRET_KEY.getBytes(StandardCharsets.UTF_8));
-    }
-
-    // Generate Access Token
-    public String generateToken(UserDetails userDetails) {
-        User user = userRepository.findByEmail(userDetails.getUsername())
-                .orElseThrow(() -> new UsernameNotFoundException("User not found"));
-
-        Map<String, Object> claims = new HashMap<>();
-        claims.put("userId", user.getId());
-
-        return createToken(claims, userDetails.getUsername());
-    }
-
-    // Generate Refresh Token (30 days)
-    public String generateRefreshToken(UserDetails userDetails) {
-        return Jwts.builder()
-                .setSubject(userDetails.getUsername())
-                .setIssuedAt(new Date(System.currentTimeMillis()))
-                .setExpiration(new Date(System.currentTimeMillis() + 1000L * 60 * 60 * 24 * 30)) // 30 days
-                .signWith(getSignInKey(), SignatureAlgorithm.HS256)
-                .compact();
-    }
-
-    // Create Access Token with optional claims
-    private String createToken(Map<String, Object> claims, String subject) {
-        return Jwts.builder()
-                .setClaims(claims)
-                .setSubject(subject)
-                .setIssuedAt(new Date(System.currentTimeMillis()))
-                .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 24)) // 1 day
-                .signWith(getSignInKey(), SignatureAlgorithm.HS256)
-                .compact();
-    }
-
-    // Validate token
-    public boolean isTokenValid(String token, UserDetails userDetails) {
-        final String username = extractUsername(token);
-        return username.equals(userDetails.getUsername()) && !isTokenExpired(token);
-    }
-
-    // Check expiration
-    private boolean isTokenExpired(String token) {
-        return extractExpiration(token).before(new Date());
-    }
-
-    // Extract expiration date
-    public Date extractExpiration(String token) {
-        return extractClaim(token, Claims::getExpiration);
-    }
-
-    // Extract username from token
-    public String extractUsername(String token) {
-        return extractClaim(token, Claims::getSubject);
-    }
-
-    public Long extractUserId(String token) {
-        Claims claims = extractAllClaims(token);
-        return claims.get("userId", Long.class);
-    }
-
-    // Extract single claim
-    public <T> T extractClaim(String token, Function<Claims, T> claimsResolver) {
-        final Claims claims = extractAllClaims(token);
-        return claimsResolver.apply(claims);
-    }
-
-    // Extract all claims using correct parser
-    private Claims extractAllClaims(String token) {
-        return Jwts
-                .parserBuilder()
-                .setSigningKey(getSignInKey())
-                .build()
-                .parseClaimsJws(token)
-                .getBody();
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/config/SecurityConfig.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/config/SecurityConfig.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,75 +1,0 @@
-package com.shifterwebapp.shifter.config;
-
-import com.shifterwebapp.shifter.external.google.OAuth2SuccessHandler;
-import lombok.RequiredArgsConstructor;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.http.HttpHeaders;
-import org.springframework.security.authentication.AuthenticationProvider;
-import org.springframework.security.config.Customizer;
-import org.springframework.security.config.annotation.web.builders.HttpSecurity;
-import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
-import org.springframework.security.config.http.SessionCreationPolicy;
-import org.springframework.security.web.AuthenticationEntryPoint;
-import org.springframework.security.web.SecurityFilterChain;
-import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
-import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
-import org.springframework.web.cors.CorsConfiguration;
-import org.springframework.web.cors.CorsConfigurationSource;
-import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
-
-
-@Configuration
-@EnableWebSecurity
-@RequiredArgsConstructor
-public class SecurityConfig {
-
-    private final AuthenticationProvider authenticationProvider;
-    private final JwtAuthFilter jwtAuthFilter;
-    private final AuthenticationEntryPoint authenticationEntryPoint;
-    private final OAuth2SuccessHandler oauth2SuccessHandler;
-
-    @Bean
-    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
-        http
-                .csrf(AbstractHttpConfigurer::disable)
-                .cors(Customizer.withDefaults())
-                .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
-                .authorizeHttpRequests(request -> request
-                        .requestMatchers("/api/auth/**").permitAll()
-                        .requestMatchers("/api/courses/**").permitAll()
-                        .requestMatchers("/api/test/**").permitAll()
-                        .requestMatchers("/api/auth/oauth2/**").permitAll()
-                        .requestMatchers("/oauth2/**", "/login/oauth2/**").permitAll()
-                        .anyRequest().authenticated()
-                )
-                .exceptionHandling(exception -> exception
-                        .authenticationEntryPoint(authenticationEntryPoint)
-                )
-                .oauth2Login(oauth2 -> oauth2
-                        // Use the custom handler instead of defaultSuccessUrl()
-                        .successHandler(oauth2SuccessHandler)
-                        .failureUrl("http://localhost:5173/login?error")
-                )
-                .authenticationProvider(authenticationProvider)
-                .addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class);
-
-        return http.build();
-    }
-
-    @Bean
-    public CorsConfigurationSource corsConfigurationSource() {
-        CorsConfiguration config = new CorsConfiguration();
-        config.addAllowedOriginPattern("http://localhost:*");
-        config.addAllowedHeader("*");
-        config.addAllowedMethod("*");
-        config.setAllowCredentials(true);
-        config.addExposedHeader(HttpHeaders.CONTENT_DISPOSITION);
-
-        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
-        source.registerCorsConfiguration("/**", config);
-        return source;
-    }
-
-
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/course/AdminCourseController.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/AdminCourseController.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,63 +1,0 @@
-package com.shifterwebapp.shifter.course;
-
-import com.shifterwebapp.shifter.Validate;
-import com.shifterwebapp.shifter.course.service.CourseService;
-import com.shifterwebapp.shifter.external.upload.S3Service;
-import com.shifterwebapp.shifter.external.upload.S3UploadResponse;
-import lombok.RequiredArgsConstructor;
-import org.springframework.http.ResponseEntity;
-import org.springframework.security.core.Authentication;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.web.multipart.MultipartFile;
-
-import java.io.IOException;
-import java.util.List;
-
-@RestController
-@RequiredArgsConstructor
-@RequestMapping("${api.admin.path}/courses")
-@CrossOrigin
-public class AdminCourseController {
-
-    private final CourseService courseService;
-    private final Validate validate;
-    private final S3Service s3Service;
-
-    @PostMapping("/create")
-    public ResponseEntity<Long> createCourse(@RequestBody String courseJson, Authentication authentication) throws IOException {
-        validate.validateUserIsAdmin(authentication);
-
-        Course course = courseService.createCourse(courseJson);
-        Long courseId = course.getId();
-
-        return ResponseEntity.ok(courseId);
-    }
-
-    @PostMapping("/{id}/upload")
-    public ResponseEntity<?> uploadCourseFiles(
-            @PathVariable("id") Long courseId,
-            @RequestParam("courseImage") MultipartFile courseImage,
-            @RequestParam("files") List<MultipartFile> files,
-            @RequestParam("types") List<String> types,
-            @RequestParam("meta") List<String> meta,
-            Authentication authentication
-    ) throws IOException {
-        validate.validateUserIsAdmin(authentication);
-
-        try {
-            List<S3UploadResponse> s3UploadResponse =
-                    s3Service.uploadCourseImageAndFiles(courseId, courseImage, files, types, meta);
-
-            Course finalCourse = courseService.updateCourseWithImagesAndFiles(courseId, s3UploadResponse);
-            System.out.println("Final course: " + finalCourse);
-
-            return ResponseEntity.ok(null);
-        } catch (Exception e) {
-            // Cleanup — remove course from DB if file upload fails
-            courseService.deleteCourseById(courseId);
-            System.err.println("Error uploading files. Rolling back course. Reason: " + e.getMessage());
-
-            return ResponseEntity.status(500).body("Course creation failed due to file upload error. Rolled back.");
-        }
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/course/Course.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/Course.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,65 +1,0 @@
-package com.shifterwebapp.shifter.course;
-
-import com.shifterwebapp.shifter.enums.Difficulty;
-import com.shifterwebapp.shifter.coursecontent.CourseContent;
-import com.shifterwebapp.shifter.enrollment.Enrollment;
-import jakarta.persistence.*;
-import lombok.*;
-
-import java.util.List;
-
-@Getter
-@Setter
-@NoArgsConstructor
-@AllArgsConstructor
-@Builder
-@Entity
-public class Course {
-    @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
-    private Long id;
-
-    @Column(columnDefinition = "text")
-    private String imageUrl;
-
-    private String color;
-    
-    private String titleShort;
-
-    private String title;
-
-    @Enumerated(EnumType.STRING)
-    private Difficulty difficulty;
-
-    private Integer durationMinutes;
-    
-    private Double price;
-    
-    private String descriptionShort;
-
-    @Column(columnDefinition = "text")
-    private String description;
-
-    @Column(columnDefinition = "text")
-    private String descriptionLong;
-
-    @ElementCollection
-    @Column(columnDefinition = "text")
-    private List<String> whatWillBeLearned;
-
-    @ElementCollection
-    @Column(columnDefinition = "text")
-    private List<String> skillsGained;
-
-    @ElementCollection
-    @Column(columnDefinition = "text")
-    private List<String> topicsCovered;
-    
-    @OneToMany(mappedBy = "course", orphanRemoval = true)        // IS THIS GOOD BUSINESS LOGIC? SHOULD I HAVE CASCADES?
-    private List<Enrollment> enrollments;
-
-    @OneToMany(mappedBy = "course", cascade = CascadeType.ALL, orphanRemoval = true)
-    @OrderBy("position ASC")
-    private List<CourseContent> courseContents;
-}
-
Index: ckend/src/main/java/com/shifterwebapp/shifter/course/CourseController.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/CourseController.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,222 +1,0 @@
-package com.shifterwebapp.shifter.course;
-
-import com.shifterwebapp.shifter.Validate;
-import com.shifterwebapp.shifter.auth.CustomAuthDetails;
-import com.shifterwebapp.shifter.course.dto.CourseDtoDetail;
-import com.shifterwebapp.shifter.course.dto.CourseDtoFull;
-import com.shifterwebapp.shifter.course.dto.CourseDtoPreview;
-import com.shifterwebapp.shifter.course.dto.CourseDtoPreviewEnrolled;
-import com.shifterwebapp.shifter.course.service.CourseService;
-import com.shifterwebapp.shifter.enrollment.service.EnrollmentService;
-import com.shifterwebapp.shifter.exception.ErrorResponse;
-import com.shifterwebapp.shifter.external.upload.S3Service;
-import com.shifterwebapp.shifter.external.upload.S3UploadResponse;
-import lombok.RequiredArgsConstructor;
-import org.apache.pdfbox.pdmodel.PDDocument;
-import org.apache.pdfbox.pdmodel.PDPage;
-import org.apache.pdfbox.pdmodel.PDPageContentStream;
-import org.apache.pdfbox.pdmodel.font.PDType1Font;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.MediaType;
-import org.springframework.http.ResponseEntity;
-import org.springframework.security.core.Authentication;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.web.multipart.MultipartFile;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.List;
-
-@RestController
-@RequiredArgsConstructor
-@RequestMapping("${api.base.path}/courses")
-@CrossOrigin
-public class CourseController {
-
-    private final CourseService courseService;
-    private final EnrollmentService enrollmentService;
-    private final Validate validate;
-    private final S3Service s3Service;
-
-    @GetMapping
-    public ResponseEntity<?> getCourses(Authentication authentication) {
-        List<Long> enrolledCourseIds = new ArrayList<>();
-        if (authentication != null && authentication.isAuthenticated()) {
-            Object detailsObj = authentication.getDetails();
-            if (detailsObj instanceof CustomAuthDetails details) {
-                Long userId = details.getUserId();
-                enrolledCourseIds = enrollmentService.getCourseIdsByUserEnrollments(userId);
-            }
-        }
-
-        List<CourseDtoPreview> courseDtos = courseService.getAllCourses(enrolledCourseIds);
-
-        return ResponseEntity.ok(courseDtos);
-    }
-
-//    @GetMapping
-//    public ResponseEntity<?> getCourses(
-//            @RequestParam(required = false) String search,
-//            @RequestParam(required = false, name = "difficulty") List<Difficulty> difficulties,
-//            @RequestParam(required = false, name = "price") List<String> prices,
-//            @RequestParam(required = false, name = "duration") List<String> durations,
-//            @RequestParam(required = false, name = "skill") List<String> skills,
-//            @RequestParam(required = false, name = "topic") List<String> topics,
-//            Authentication authentication
-//            ) throws JsonProcessingException {
-//        Specification<Course> spec = null;
-//
-//        if (search != null && !search.isEmpty()) {
-//            spec = CourseSpecification.hasSearchLike(search);
-//        }
-//
-//        if (difficulties != null && !difficulties.isEmpty()) {
-//            spec = (spec == null) ? CourseSpecification.hasDifficulties(difficulties) : spec.and(CourseSpecification.hasDifficulties(difficulties));
-//        }
-//
-//        if (prices != null && !prices.isEmpty()) {
-//            spec = (spec == null) ? CourseSpecification.hasPricesBetween(prices) : spec.and(CourseSpecification.hasPricesBetween(prices));
-//        }
-//
-//        if (durations != null && !durations.isEmpty()) {
-//            spec = (spec == null) ? CourseSpecification.hasDurationBetween(durations) : spec.and(CourseSpecification.hasDurationBetween(durations));
-//        }
-//
-//        if (skills != null && !skills.isEmpty()) {
-//            spec = (spec == null) ? CourseSpecification.hasSkills(skills) : spec.and(CourseSpecification.hasSkills(skills));
-//        }
-//
-//        if (topics != null && !topics.isEmpty()) {
-//            spec = (spec == null) ? CourseSpecification.hasTopics(topics) : spec.and(CourseSpecification.hasTopics(topics));
-//        }
-//
-//        if (authentication != null && authentication.isAuthenticated()) {
-//            Object detailsObj = authentication.getDetails();
-//            if (detailsObj instanceof CustomAuthDetails details) {
-//                Long userId = details.getUserId();
-//                List<Long> enrolledCourseIds = enrollmentService.getCourseIdsByUserEnrollments(userId);
-//
-//                if (enrolledCourseIds != null && !enrolledCourseIds.isEmpty()) {
-//                    spec = (spec == null) ? CourseSpecification.idNotIn(enrolledCourseIds)
-//                            : spec.and(CourseSpecification.idNotIn(enrolledCourseIds));
-//                }
-//            }
-//        }
-//
-//        List<CourseDtoPreview> courseDtos = courseService.getAllCourses(spec);
-//        return ResponseEntity.ok(courseDtos);
-//    }
-
-    @GetMapping("/recommended")
-    public ResponseEntity<?> getRecommendedCourses(Authentication authentication) {
-        if (authentication == null || !authentication.isAuthenticated()) {
-            List<CourseDtoPreview> topRatedCourses = courseService.getTopRatedCourses();
-//            List<CourseDto> mostPopularCourses = courseService.getMostPopularCourses();
-            return ResponseEntity.ok(topRatedCourses);
-        }
-
-        Object detailsObj = authentication.getDetails();
-        if (!(detailsObj instanceof CustomAuthDetails details)) {
-            return ResponseEntity.badRequest().body(new ErrorResponse("Invalid authentication details"));
-        }
-        Long userId = details.getUserId();
-
-        List<CourseDtoPreview> recommendedCourses = courseService.getRecommendedCourses(userId);
-        return ResponseEntity.ok(recommendedCourses);
-    }
-
-    @GetMapping("/enrolled")
-    public ResponseEntity<?> getEnrolledCourses(Authentication authentication) {
-        validate.validateUserIsAuthenticated(authentication);
-
-        Object detailsObj = authentication.getDetails();
-        if (!(detailsObj instanceof CustomAuthDetails details)) {
-            return ResponseEntity.badRequest().body(new ErrorResponse("Invalid authentication details"));
-        }
-        Long userId = details.getUserId();
-
-        List<CourseDtoPreviewEnrolled> recommendedCourses = courseService.getEnrolledCourses(userId);
-        return ResponseEntity.ok(recommendedCourses);
-    }
-
-    @GetMapping("/{courseId}/enrolled")
-    public ResponseEntity<?> getEnrolledCourseById(
-            @PathVariable("courseId") Long courseId,
-            Authentication authentication
-    ) {
-        Long userId = validate.extractUserId(authentication);
-
-        CourseDtoFull courseDtoFull = courseService.getEnrolledCourseById(courseId, userId);
-        return ResponseEntity.ok(courseDtoFull);
-    }
-
-    @GetMapping("/{courseId}")
-    public ResponseEntity<?> getCourseById(@PathVariable("courseId") Long courseId) {
-        CourseDtoDetail courseDto = courseService.getCourseById(courseId);
-        return ResponseEntity.ok(courseDto);
-    }
-
-    @GetMapping("/{courseId}/certificate")
-    public ResponseEntity<byte[]> getCourseCertificate(@PathVariable("courseId") Long courseId, Authentication authentication) throws Exception {
-        Long userId = validate.extractUserId(authentication);
-
-        byte[] personalizedPdf = courseService.downloadCertificate(courseId, userId);
-
-        String fileName = courseService.getCourseById(courseId).getTitleShort().replaceAll("\\s+", "_") + "_Certificate.pdf";
-
-        return ResponseEntity.ok()
-                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + fileName + "\"")
-                .contentType(MediaType.APPLICATION_PDF)
-                .contentLength(personalizedPdf.length)
-                .body(personalizedPdf);
-    }
-
-    @GetMapping("/topics")
-    public ResponseEntity<List<String>> getAllTopics() {
-        return ResponseEntity.ok(courseService.getAllTopics());
-    }
-
-    @GetMapping("/skills")
-    public ResponseEntity<List<String>> getAllSkills() {
-        return ResponseEntity.ok(courseService.getAllSkills());
-    }
-
-    @PostMapping("/create")
-    public ResponseEntity<Long> createCourse(@RequestBody String courseJson, Authentication authentication) throws IOException {
-        validate.validateUserIsAdmin(authentication);
-
-        Course course = courseService.createCourse(courseJson);
-        Long courseId = course.getId();
-
-        return ResponseEntity.ok(courseId);
-    }
-
-    @PostMapping("/{id}/upload")
-    public ResponseEntity<?> uploadCourseFiles(
-            @PathVariable("id") Long courseId,
-            @RequestParam("courseImage") MultipartFile courseImage,
-            @RequestParam("files") List<MultipartFile> files,
-            @RequestParam("types") List<String> types,
-            @RequestParam("meta") List<String> meta,
-            Authentication authentication
-    ) throws IOException {
-        validate.validateUserIsAdmin(authentication);
-
-        try {
-            List<S3UploadResponse> s3UploadResponse =
-                    s3Service.uploadCourseImageAndFiles(courseId, courseImage, files, types, meta);
-
-            Course finalCourse = courseService.updateCourseWithImagesAndFiles(courseId, s3UploadResponse);
-
-            return ResponseEntity.ok(null);
-        } catch (Exception e) {
-            // Cleanup — remove course from DB if file upload fails
-            courseService.deleteCourseById(courseId);
-            System.err.println("Error uploading files. Rolling back course. Reason: " + e.getMessage());
-
-            return ResponseEntity.status(500).body("Course creation failed due to file upload error. Rolled back.");
-        }
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/course/CourseDtoBuilder.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/CourseDtoBuilder.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,149 +1,0 @@
-package com.shifterwebapp.shifter.course;
-
-import com.shifterwebapp.shifter.course.dto.CourseDtoDetail;
-import com.shifterwebapp.shifter.course.dto.CourseDtoFull;
-import com.shifterwebapp.shifter.course.dto.CourseDtoPreview;
-import com.shifterwebapp.shifter.course.dto.CourseDtoPreviewEnrolled;
-import com.shifterwebapp.shifter.course.mapper.CourseMapper;
-import com.shifterwebapp.shifter.coursecontent.CourseContentDtoFull;
-import com.shifterwebapp.shifter.courselecture.CourseLectureDtoFull;
-import com.shifterwebapp.shifter.enrollment.Enrollment;
-import com.shifterwebapp.shifter.enrollment.service.EnrollmentService;
-import com.shifterwebapp.shifter.enums.EnrollmentStatus;
-import com.shifterwebapp.shifter.review.Review;
-import com.shifterwebapp.shifter.review.ReviewDto;
-import com.shifterwebapp.shifter.review.service.ReviewService;
-import com.shifterwebapp.shifter.usercourseprogress.UserCourseProgress;
-import com.shifterwebapp.shifter.usercourseprogress.UserCourseProgressMapper;
-import com.shifterwebapp.shifter.usercourseprogress.service.UserCourseProgressService;
-import lombok.RequiredArgsConstructor;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-
-@Component
-@RequiredArgsConstructor
-public class CourseDtoBuilder {
-
-    private final ReviewService reviewService;
-    private final EnrollmentService enrollmentService;
-    private final UserCourseProgressService userCourseProgressService;
-    private final CourseMapper courseMapper;
-    private final UserCourseProgressMapper userCourseProgressMapper;
-
-    private <T extends CourseDtoPreview> T enrichCourseDto(Course course, T dto) {
-        Double rating = reviewService.getAverageRatingByCourse(course.getId());
-        int contentCount = course.getCourseContents() != null ? course.getCourseContents().size() : 0;
-        int lectureCount = course.getCourseContents() != null
-                ? course.getCourseContents().stream()
-                .mapToInt(content -> content.getCourseLectures() != null
-                        ? content.getCourseLectures().size() : 0)
-                .sum()
-                : 0;
-
-        dto.setAverageRating(rating != null ? rating : 0.0);
-        dto.setCourseContentCount(contentCount);
-        dto.setCourseLectureCount(lectureCount);
-
-        return dto;
-    }
-
-
-    public CourseDtoPreview getCourseDtoPreview(Course course) {
-        CourseDtoPreview courseDtoPreview = courseMapper.toDtoPreview(course);
-        return enrichCourseDto(course, courseDtoPreview);
-    }
-
-    public List<CourseDtoPreview> getCourseDtoPreview(List<Course> courses) {
-        List<CourseDtoPreview> courseDtoPreviewList = new ArrayList<>();
-        for (Course course : courses) {
-            CourseDtoPreview dto = getCourseDtoPreview(course);
-
-            courseDtoPreviewList.add(dto);
-        }
-
-        return courseDtoPreviewList;
-    }
-
-    public CourseDtoDetail getCourseDtoDetail(Course course) {
-        CourseDtoDetail courseDtoDetail = courseMapper.toDtoDetail(course);
-        return enrichCourseDto(course, courseDtoDetail);
-    }
-
-    public List<CourseDtoDetail> getCourseDtoDetail(List<Course> courses) {
-        List<CourseDtoDetail> courseDtoDetailList = new ArrayList<>();
-        for (Course course : courses) {
-            CourseDtoDetail dto = getCourseDtoDetail(course);
-
-            courseDtoDetailList.add(dto);
-        }
-
-        return courseDtoDetailList;
-    }
-
-    public CourseDtoPreviewEnrolled getCourseDtoPreviewEnrolled(Course course, Long userId) {
-        CourseDtoPreviewEnrolled courseDtoEnrolled = courseMapper.toDtoEnrolled(course);
-        Enrollment enrollment = enrollmentService.getEnrollmentByUserAndCourse(userId, courseDtoEnrolled.getId());
-        List<UserCourseProgress> userCourseProgress = userCourseProgressService.getUserCourseProgressByEnrollmentAndCompletedTrue(enrollment.getId());
-        Integer reviewRating = 0;
-        if (reviewService.hasBeenReviewedByUser(userId, course.getId()))
-            reviewRating = reviewService.getReviewByUserAndCourse(userId, course.getId()).getRating();
-
-        courseDtoEnrolled.setLecturesFinishedCount(userCourseProgress.size());
-        courseDtoEnrolled.setRating(reviewRating);
-        courseDtoEnrolled.setIsFinished(enrollment.getEnrollmentStatus() == EnrollmentStatus.COMPLETED);
-
-        return enrichCourseDto(course, courseDtoEnrolled);
-    }
-
-    public List<CourseDtoPreviewEnrolled> getCourseDtoPreviewEnrolled(List<Course> courses, Long userId) {
-        List<CourseDtoPreviewEnrolled> courseDtoPreviewEnrolledList = new ArrayList<>();
-        for (Course course : courses) {
-            CourseDtoPreviewEnrolled dto = getCourseDtoPreviewEnrolled(course, userId);
-
-            courseDtoPreviewEnrolledList.add(dto);
-        }
-
-        return courseDtoPreviewEnrolledList;
-    }
-
-    public CourseDtoFull getCourseDtoFull(Course course, Enrollment enrollment) {
-        List<UserCourseProgress> userCourseProgress = userCourseProgressService.getUserCourseProgressByEnrollment(enrollment.getId());
-
-        Integer reviewRating = reviewService.getReviewByEnrollment(enrollment.getId()).getRating();
-
-        Map<Long, UserCourseProgress> progressMap = userCourseProgress.stream()
-                .collect(Collectors.toMap(
-                        UserCourseProgress::getCourseLectureId,
-                        Function.identity()
-                ));
-
-        CourseDtoFull courseDto = courseMapper.toDtoFull(course);
-
-        courseDto.setRating(reviewRating != null ? reviewRating : 0);
-        courseDto.setIsFinished(enrollment.getEnrollmentStatus() == EnrollmentStatus.COMPLETED);
-        for (CourseContentDtoFull contentDto : courseDto.getCourseContents()) {
-            for (CourseLectureDtoFull lectureDto : contentDto.getCourseLectures()) {
-                UserCourseProgress progress = progressMap.get(lectureDto.getId());
-                lectureDto.setUserCourseProgress(userCourseProgressMapper.toDto(progress));
-            }
-        }
-
-        return courseDto;
-    }
-
-    public List<CourseDtoFull> getCourseDtoFull(List<Course> courses, Enrollment enrollment) {
-        List<CourseDtoFull> courseDtoFullList = new ArrayList<>();
-        for (Course course : courses) {
-            CourseDtoFull dto = getCourseDtoFull(course, enrollment);
-
-            courseDtoFullList.add(dto);
-        }
-
-        return courseDtoFullList;
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/course/CourseRepository.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/CourseRepository.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,55 +1,0 @@
-package com.shifterwebapp.shifter.course;
-
-import com.shifterwebapp.shifter.enums.Difficulty;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.data.repository.query.Param;
-
-import java.util.List;
-
-public interface CourseRepository extends JpaRepository<Course, Long>, JpaSpecificationExecutor<Course> {
-    List<Course> findCoursesByTitle(String searchTitle);
-
-    List<Course> findCoursesByIdNotIn(List<Long> courseIds);
-
-    @Query("""
-                SELECT c
-                FROM Course c
-                LEFT JOIN c.enrollments e
-                LEFT JOIN e.review r
-                GROUP BY c
-                ORDER BY COALESCE(AVG(r.rating * 1.0), 0) DESC
-            """)
-    List<Course> findCoursesOrderedByRating();
-
-    @Query("select c from Course c order by size(c.enrollments) desc")
-    List<Course> findCoursesOrderedByPopularity();
-
-    List<Course> findCoursesByDifficulty(Difficulty searchDifficulty);
-
-    @Query("select c from Course c where c.price >= :floorPrice and c.price <= :ceilPrice")
-    List<Course> findCoursesByPriceRange(@Param("floorPrice") Float floorPrice, @Param("ceilPrice") Float ceilPrice);
-
-    List<Course> findCoursesBySkillsGainedIn(List<String> searchSkills);
-
-    List<Course> findCoursesByDifficultyIn(List<Difficulty> searchDifficulties);
-
-    @Query("""
-                SELECT CASE WHEN COUNT(cl) > 0 THEN TRUE ELSE FALSE END
-                FROM Course c
-                JOIN c.courseContents cc
-                JOIN cc.courseLectures cl
-                WHERE c.id = :courseId
-                  AND cl.contentFileName = :fileName
-            """)
-    Boolean lectureFileExistsInCourse(@Param("courseId") Long courseId,
-                                      @Param("fileName") String fileName);
-
-
-    @Query("select distinct c.topicsCovered from Course c")
-    List<String> getCourseTopics();
-
-    @Query("select distinct c.skillsGained from Course c")
-    List<String> getCourseSkills();
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/course/CourseSpecification.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/CourseSpecification.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,107 +1,0 @@
-package com.shifterwebapp.shifter.course;
-
-import com.shifterwebapp.shifter.enums.Difficulty;
-import jakarta.persistence.criteria.Join;
-import jakarta.persistence.criteria.JoinType;
-import jakarta.persistence.criteria.Predicate;
-import org.springframework.data.jpa.domain.Specification;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-
-public class CourseSpecification {
-
-    public static Specification<Course> hasSearchLike(String search) {
-        return (root, query, cb) -> {
-            query.distinct(true);
-            Join<Course, String> skillsJoin = root.join("skillsGained", JoinType.LEFT);
-            Join<Course, String> topicsJoin = root.join("topicsCovered", JoinType.LEFT);
-
-            return cb.or(
-                    cb.like(cb.lower(root.get("title")), "%" + search.toLowerCase() + "%"),
-                    cb.like(cb.lower(root.get("descriptionShort")), "%" + search.toLowerCase() + "%"),
-                    cb.like(cb.lower(root.get("description")), "%" + search.toLowerCase() + "%"),
-                    cb.like(cb.lower(root.get("descriptionLong")), "%" + search.toLowerCase() + "%"),
-                    cb.like(cb.lower(skillsJoin.as(String.class)), "%" + search.toLowerCase().replaceAll("\\s", "_") + "%"),
-                    cb.like(cb.lower(topicsJoin.as(String.class)), "%" + search.toLowerCase().replaceAll("\\s", "_") + "%")
-            );
-        };
-    }
-
-    public static Specification<Course> hasDifficulties(List<Difficulty> difficulties) {
-        return (root, query, cb) -> root.get("difficulty").in(difficulties);
-    }
-
-    public static Specification<Course> hasSkills(List<String> skills) {
-        return (root, query, cb) -> root.join("skillsGained").in(skills);
-    }
-
-    public static Specification<Course> hasTopics(List<String> topics) {
-        return (root, query, cb) -> root.join("topicsCovered").in(topics);
-    }
-
-    public static Specification<Course> hasPricesBetween(List<String> prices) {
-        return (root, query, cb) -> {
-            List<Predicate> predicates = new ArrayList<>();
-
-
-            for (String price : prices) {
-                switch (price) {
-                    case "free":
-                        predicates.add(cb.lessThanOrEqualTo(root.get("price"), 0.0));
-                        break;
-                    case "low":
-                        predicates.add(cb.between(root.get("price"), 0.0, 20.0));
-                        break;
-                    case "medium":
-                        predicates.add(cb.between(root.get("price"), 20.0, 50.0));
-                        break;
-                    case "high":
-                        predicates.add(cb.greaterThanOrEqualTo(root.get("price"), 50.0));
-                        break;
-                }
-            }
-
-            if (predicates.isEmpty()) {
-                return null;
-            }
-
-            return cb.or(predicates.toArray(new Predicate[0]));
-        };
-    }
-
-    public static Specification<Course> hasDurationBetween(List<String> durations) {
-        return (root, query, cb) -> {
-            List<Predicate> predicates = new ArrayList<>();
-
-
-            for (String duration : durations) {
-                switch (duration) {
-                    case "extraShort":
-                        predicates.add(cb.lessThanOrEqualTo(root.get("durationMinutes"), 3.0 * 60.0));
-                        break;
-                    case "short":
-                        predicates.add(cb.between(root.get("durationMinutes"), 3.0 * 60.0, 6.0 * 60.0));
-                        break;
-                    case "medium":
-                        predicates.add(cb.between(root.get("durationMinutes"), 6.0 * 60.0, 10.0 * 60.0));
-                        break;
-                    case "long":
-                        predicates.add(cb.greaterThanOrEqualTo(root.get("durationMinutes"), 10.0 * 60.0));
-                        break;
-                }
-            }
-
-            if (predicates.isEmpty()) {
-                return null;
-            }
-
-            return cb.or(predicates.toArray(new Predicate[0]));
-        };
-    }
-
-    public static Specification<Course> idNotIn(List<Long> enrolledCourseIds) {
-        return (root, query, cb) -> root.get("id").in(enrolledCourseIds).not();
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/course/ScoredCourse.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/ScoredCourse.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,13 +1,0 @@
-package com.shifterwebapp.shifter.course;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class ScoredCourse {
-    private Course course;
-    private Integer score;
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/course/dto/CourseDtoDetail.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/dto/CourseDtoDetail.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,28 +1,0 @@
-package com.shifterwebapp.shifter.course.dto;
-
-import com.shifterwebapp.shifter.coursecontent.CourseContentDtoPreview;
-import com.shifterwebapp.shifter.enums.Difficulty;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.NoArgsConstructor;
-
-import java.util.List;
-
-@EqualsAndHashCode(callSuper = true)
-@Data
-@NoArgsConstructor
-@AllArgsConstructor
-public class CourseDtoDetail extends CourseDtoPreview  {
-
-    private String descriptionShort;
-
-    private String description;
-
-    private String descriptionLong;
-
-    private List<String> whatWillBeLearned;
-
-    private List<CourseContentDtoPreview> courseContents;
-}
-
Index: ckend/src/main/java/com/shifterwebapp/shifter/course/dto/CourseDtoFull.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/dto/CourseDtoFull.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,27 +1,0 @@
-package com.shifterwebapp.shifter.course.dto;
-
-import com.shifterwebapp.shifter.coursecontent.CourseContentDtoFull;
-import com.shifterwebapp.shifter.enums.Difficulty;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.util.List;
-
-@Data
-@NoArgsConstructor
-@AllArgsConstructor
-public class CourseDtoFull {
-
-    private Long id;
-
-    private String titleShort;
-
-    private String title;
-
-    private Integer rating;
-
-    private Boolean isFinished;
-
-    private List<CourseContentDtoFull> courseContents;
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/course/dto/CourseDtoPreview.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/dto/CourseDtoPreview.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,41 +1,0 @@
-package com.shifterwebapp.shifter.course.dto;
-
-import com.shifterwebapp.shifter.enums.Difficulty;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.util.List;
-
-@Data
-@NoArgsConstructor
-@AllArgsConstructor
-public class CourseDtoPreview {
-
-    private Long id;
-
-    private String imageUrl;
-
-    private String color;
-
-    private String titleShort;
-
-    private String title;
-
-    private Difficulty difficulty;
-
-    private Integer durationMinutes;
-
-    private Double price;
-
-    private List<String> skillsGained;
-
-    private List<String> topicsCovered;
-
-    private Integer courseContentCount;
-
-    private Integer courseLectureCount;
-
-    private Double averageRating;
-}
-
Index: ckend/src/main/java/com/shifterwebapp/shifter/course/dto/CourseDtoPreviewEnrolled.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/dto/CourseDtoPreviewEnrolled.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,23 +1,0 @@
-package com.shifterwebapp.shifter.course.dto;
-
-import com.shifterwebapp.shifter.enums.Difficulty;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.NoArgsConstructor;
-
-import java.util.List;
-
-@EqualsAndHashCode(callSuper = true)
-@Data
-@NoArgsConstructor
-@AllArgsConstructor
-public class CourseDtoPreviewEnrolled extends CourseDtoPreview {
-
-    private Integer lecturesFinishedCount;
-
-    private Integer rating;
-
-    private Boolean isFinished;
-}
-
Index: ckend/src/main/java/com/shifterwebapp/shifter/course/mapper/CourseMapper.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/mapper/CourseMapper.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,51 +1,0 @@
-package com.shifterwebapp.shifter.course.mapper;
-
-import com.shifterwebapp.shifter.course.Course;
-import com.shifterwebapp.shifter.course.dto.CourseDtoDetail;
-import com.shifterwebapp.shifter.course.dto.CourseDtoFull;
-import com.shifterwebapp.shifter.course.dto.CourseDtoPreview;
-import com.shifterwebapp.shifter.course.dto.CourseDtoPreviewEnrolled;
-import org.mapstruct.InheritInverseConfiguration;
-import org.mapstruct.Mapper;
-
-import java.util.List;
-
-@Mapper(componentModel = "spring")
-public interface CourseMapper {
-
-    // ---- Forward mappings ----
-    CourseDtoPreview toDtoPreview(Course course);
-    List<CourseDtoPreview> toDtoPreview(List<Course> courses);
-
-    CourseDtoDetail toDtoDetail(Course course);
-    List<CourseDtoDetail> toDtoDetail(List<Course> courses);
-
-    CourseDtoPreviewEnrolled toDtoEnrolled(Course course);
-    List<CourseDtoPreviewEnrolled> toDtoEnrolled(List<Course> courses);
-
-    CourseDtoFull toDtoFull(Course course);
-    List<CourseDtoFull> toDtoFull(List<Course> courses);
-
-    // ---- Inverse mappings (explicitly reference which to invert) ----
-    @InheritInverseConfiguration(name = "toDtoPreview")
-    Course toEntityPreview(CourseDtoPreview courseDto);
-    @InheritInverseConfiguration(name = "toDtoPreview")
-    List<Course> toEntityPreview(List<CourseDtoPreview> courseDtos);
-
-    @InheritInverseConfiguration(name = "toDtoDetail")
-    Course toEntityDetail(CourseDtoDetail courseDto);
-    @InheritInverseConfiguration(name = "toDtoDetail")
-    List<Course> toEntityDetail(List<CourseDtoDetail> courseDtos);
-
-    @InheritInverseConfiguration(name = "toDtoEnrolled")
-    Course toEntityEnrolled(CourseDtoPreviewEnrolled courseDto);
-    @InheritInverseConfiguration(name = "toDtoEnrolled")
-    List<Course> toEntityEnrolled(List<CourseDtoPreviewEnrolled> courseDtos);
-
-    @InheritInverseConfiguration(name = "toDtoFull")
-    Course toEntityFull(CourseDtoFull courseDto);
-    @InheritInverseConfiguration(name = "toDtoFull")
-    List<Course> toEntityFull(List<CourseDtoFull> courseDtos);
-}
-
-
Index: ckend/src/main/java/com/shifterwebapp/shifter/course/service/CourseService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/service/CourseService.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,285 +1,0 @@
-package com.shifterwebapp.shifter.course.service;
-
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.shifterwebapp.shifter.Validate;
-import com.shifterwebapp.shifter.course.*;
-import com.shifterwebapp.shifter.course.dto.CourseDtoDetail;
-import com.shifterwebapp.shifter.course.dto.CourseDtoFull;
-import com.shifterwebapp.shifter.course.dto.CourseDtoPreview;
-import com.shifterwebapp.shifter.course.dto.CourseDtoPreviewEnrolled;
-import com.shifterwebapp.shifter.course.mapper.CourseMapper;
-import com.shifterwebapp.shifter.coursecontent.CourseContent;
-import com.shifterwebapp.shifter.courselecture.CourseLecture;
-import com.shifterwebapp.shifter.enrollment.Enrollment;
-import com.shifterwebapp.shifter.enrollment.service.EnrollmentService;
-import com.shifterwebapp.shifter.exception.AccessDeniedException;
-import com.shifterwebapp.shifter.external.PdfManipulationService;
-import com.shifterwebapp.shifter.external.upload.MetaInfo;
-import com.shifterwebapp.shifter.external.upload.S3Service;
-import com.shifterwebapp.shifter.external.upload.S3UploadResponse;
-import com.shifterwebapp.shifter.user.UserDto;
-import com.shifterwebapp.shifter.user.service.UserService;
-import lombok.RequiredArgsConstructor;
-import org.apache.pdfbox.pdmodel.PDDocument;
-import org.apache.pdfbox.pdmodel.PDPage;
-import org.apache.pdfbox.pdmodel.PDPageContentStream;
-import org.apache.pdfbox.pdmodel.font.PDType1Font;
-import org.apache.pdfbox.text.PDFTextStripper;
-import org.springframework.stereotype.Service;
-
-import java.io.ByteArrayOutputStream;
-import java.io.InputStream;
-import java.net.URL;
-import java.time.LocalDate;
-import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-
-@Service
-@RequiredArgsConstructor
-public class CourseService implements ImplCourseService {
-
-    private final CourseRepository courseRepository;
-    private final S3Service s3Service;
-    private final PdfManipulationService pdfService;
-    private final CourseMapper courseMapper;
-    private final UserService userService;
-    private final Validate validate;
-    private final EnrollmentService enrollmentService;
-    private final CourseDtoBuilder courseDtoBuilder;
-
-
-    @Override
-    public Course createCourse(String courseJson) throws JsonProcessingException {
-        ObjectMapper objectMapper = new ObjectMapper();
-        Course course = objectMapper.readValue(courseJson, Course.class);
-
-        for (CourseContent content : course.getCourseContents()) {
-            content.setCourse(course);
-
-            for (CourseLecture lecture : content.getCourseLectures()) {
-                lecture.setCourseContent(content);
-            }
-        }
-
-        return courseRepository.save(course);
-    }
-
-    @Override
-    public void deleteCourseById(Long courseId) {
-        courseRepository.deleteById(courseId);
-    }
-
-    @Override
-    public Course updateCourseWithImagesAndFiles(Long courseId, List<S3UploadResponse> s3UploadResponses) {
-        validate.validateCourseExists(courseId);
-        Course course = courseRepository.findById(courseId).orElseThrow();
-
-        for (S3UploadResponse s3UploadResponse : s3UploadResponses) {
-            if ("COURSE_IMAGE".equals(s3UploadResponse.getType())) {
-                course.setImageUrl(s3UploadResponse.getFileName());
-                continue;
-            }
-
-            MetaInfo meta = s3UploadResponse.getMeta();
-            Integer contentPosition = meta.getContentPosition();
-            Integer lecturePosition = meta.getLecturePosition();
-
-            if (contentPosition != null && lecturePosition != null) {
-                int contentIndex = contentPosition - 1;
-                int lectureIndex = lecturePosition - 1;
-
-                if (contentIndex >= 0 && contentIndex < course.getCourseContents().size()) {
-                    var courseContent = course.getCourseContents().get(contentIndex);
-                    if (lectureIndex >= 0 && lectureIndex < courseContent.getCourseLectures().size()) {
-                        CourseLecture courseLecture = courseContent.getCourseLectures().get(lectureIndex);
-
-                        courseLecture.setContentFileName(s3UploadResponse.getFileName());
-                    } else {
-                        // handle invalid lecture index
-                        System.err.println("Invalid lecture index: " + lectureIndex);
-                    }
-                } else {
-                    // handle invalid content index
-                    System.err.println("Invalid content index: " + contentIndex);
-                }
-            }
-        }
-        return courseRepository.save(course);
-    }
-
-    @Override
-    public Boolean lectureFileExistsInCourse(Long courseId, String fileName) {
-        return courseRepository.lectureFileExistsInCourse(courseId, fileName);
-    }
-
-    @Override
-    public CourseDtoFull getEnrolledCourseById(Long courseId, Long userId) {
-        validate.validateCourseExists(courseId);
-
-        boolean isUserEnrolled = enrollmentService.isUserEnrolledInCourse(userId, courseId);
-        if (!isUserEnrolled) {
-            throw new AccessDeniedException("User with ID " + userId + " is not enrolled in course with ID " + courseId + " and is therefore not authorized to access the full course with its content!");
-        }
-
-        Enrollment enrollment = enrollmentService.getEnrollmentByUserAndCourse(userId, courseId);
-        if (enrollment == null) {
-            throw new AccessDeniedException("User with ID " + userId + " is not enrolled in course with ID " + courseId + " and is therefore not authorized to access the full course with its content!");
-        }
-        enrollmentService.updateEnrollmentStatusToActive(enrollment);
-        Course course = courseRepository.findById(courseId).orElseThrow();
-
-        return courseDtoBuilder.getCourseDtoFull(course, enrollment);
-    }
-
-    public byte[] downloadCertificate(Long courseId, Long userId) throws Exception {
-        validate.validateCourseExists(courseId);
-        if (!enrollmentService.isUserEnrolledInCourse(userId, courseId))
-            throw new AccessDeniedException("User with ID " + userId + " is not enrolled in course with ID " + courseId + " and is therefore not authorized to access the course certificate!");
-
-        String courseTitle = getCourseById(courseId).getTitleShort();
-        String userName = userService.getUserById(userId).getName();
-        LocalDate completedDate = enrollmentService.getEnrollmentByUserAndCourse(userId, courseId).getCompletedAt();
-
-        // TODO: uncomment this and check if logic for date is okay
-//        if (completedDate == null)
-//            throw new AccessDeniedException("User with ID " + userId + " has not yet completed course with ID " + courseId + " and is therefore not authorized to access the course certificate!");
-
-        String date = (completedDate != null ? completedDate : LocalDate.now()).format(DateTimeFormatter.ofPattern("MMMM d, yyyy", Locale.ENGLISH));
-
-        // 1. Define the S3 key for your template PDF
-        String s3Key = "private/Shifter_Certificate.pdf";
-
-        // 2. Fetch the template PDF from S3 as an InputStream
-        try (InputStream templateStream = s3Service.downloadFile(s3Key)) {
-
-            // 3. Modify the PDF with the dynamic data
-            byte[] personalizedPdf = pdfService.fillPdfForm(
-                    templateStream,
-                    userName,
-                    "This is to certify that",
-                    "has successfully completed the course " + courseTitle + " through Shifter, demonstrating commitment to continuous learning and professional growth.",
-                    date,
-                    courseTitle
-            );
-
-            return personalizedPdf;
-        }
-    }
-
-    @Override
-    public List<CourseDtoPreview> getAllCourses(List<Long> courseIds) {
-        List<Course> courses = courseIds != null && !courseIds.isEmpty() ?
-                courseRepository.findCoursesByIdNotIn(courseIds) :
-                courseRepository.findAll();
-        return courseDtoBuilder.getCourseDtoPreview(courses);
-    }
-
-//    @Override
-//    public List<CourseDtoPreview> getAllCourses(Specification<Course> specification) {
-//        List<Course> courses = specification == null ?
-//                courseRepository.findAll() :
-//                courseRepository.findAll(specification);
-//        return courseMapperPreview.toDto(courses);
-//    }
-
-    @Override
-    public List<CourseDtoPreview> getRecommendedCourses(Long userId) {
-        UserDto user = userService.getUserById(userId);
-        List<String> skills = user.getSkills();
-        List<String> interests = user.getInterests();
-
-        // get user enrollments
-        List<Long> enrolledCourseIds = enrollmentService.getCourseIdsByUserEnrollments(userId);
-
-        // filter out enrolled courses
-        List<Course> courses = courseRepository.findAll()
-                .stream()
-                .filter(course -> !enrolledCourseIds.contains(course.getId()))
-                .toList();
-
-        List<ScoredCourse> scoredCourses = new ArrayList<>();
-        for (Course course : courses) {
-            boolean matchesSkills = course.getSkillsGained().stream().anyMatch(skills::contains);
-            boolean matchesTopics = course.getTopicsCovered().stream().anyMatch(interests::contains);
-
-            int score = 0;
-            if (matchesSkills && matchesTopics) {
-                score += 2;
-            } else if (matchesSkills || matchesTopics) {
-                score += 1;
-            }
-
-            scoredCourses.add(new ScoredCourse(course, score));
-        }
-
-        scoredCourses.sort((a, b) -> Integer.compare(b.getScore(), a.getScore()));  // descending order
-
-        int limit = Math.min(5, scoredCourses.size());
-        return scoredCourses
-                .subList(0, limit)
-                .stream()
-                .map(ScoredCourse::getCourse)
-                .map(courseDtoBuilder::getCourseDtoPreview)
-                .toList();
-    }
-
-    @Override
-    public List<CourseDtoPreviewEnrolled> getEnrolledCourses(Long userId) {
-        List<Long> enrolledCourseIds = enrollmentService.getCourseIdsByUserEnrollments(userId);
-        List<Course> courses = courseRepository.findAllById(enrolledCourseIds);
-
-        if (courses.isEmpty()) {
-            return new ArrayList<>();
-        }
-        return courseDtoBuilder.getCourseDtoPreviewEnrolled(courses, userId);
-    }
-
-
-    @Override
-    public List<CourseDtoPreview> getTopRatedCourses() {
-        List<Course> courses = courseRepository.findCoursesOrderedByRating();
-        int limit = Math.min(5, courses.size());
-        return courseDtoBuilder.getCourseDtoPreview(
-                courses
-                        .subList(0, limit)
-        );
-    }
-
-    @Override
-    public List<CourseDtoPreview> getMostPopularCourses() {
-        List<Course> courses = courseRepository.findCoursesOrderedByPopularity();
-        int limit = Math.min(5, courses.size());
-        return courseDtoBuilder.getCourseDtoPreview(
-                courses
-                        .subList(0, limit)
-        );
-    }
-
-    @Override
-    public CourseDtoDetail getCourseById(Long courseId) {
-        validate.validateCourseExists(courseId);
-        Course course = courseRepository.findById(courseId).orElseThrow();
-        return courseDtoBuilder.getCourseDtoDetail(course);
-    }
-
-    @Override
-    public Course getCourseEntityById(Long courseId) {
-        validate.validateCourseExists(courseId);
-        return courseRepository.findById(courseId).orElseThrow();
-    }
-
-    @Override
-    public List<String> getAllTopics() {
-        return courseRepository.getCourseTopics();
-    }
-
-    @Override
-    public List<String> getAllSkills() {
-        return courseRepository.getCourseSkills();
-    }
-
-
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/course/service/ImplCourseService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/service/ImplCourseService.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,37 +1,0 @@
-package com.shifterwebapp.shifter.course.service;
-
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.shifterwebapp.shifter.course.Course;
-import com.shifterwebapp.shifter.course.dto.CourseDtoDetail;
-import com.shifterwebapp.shifter.course.dto.CourseDtoFull;
-import com.shifterwebapp.shifter.course.dto.CourseDtoPreview;
-import com.shifterwebapp.shifter.course.dto.CourseDtoPreviewEnrolled;
-import com.shifterwebapp.shifter.external.upload.S3UploadResponse;
-
-import java.io.ByteArrayOutputStream;
-import java.util.List;
-
-public interface ImplCourseService {
-    Course createCourse(String courseJson) throws JsonProcessingException;
-    void deleteCourseById(Long courseId);
-
-    Course updateCourseWithImagesAndFiles(Long courseId, List<S3UploadResponse> s3UploadResponses);
-
-    Boolean lectureFileExistsInCourse(Long courseId, String storagePath);
-
-    CourseDtoFull getEnrolledCourseById(Long courseId, Long userId);
-
-    byte[] downloadCertificate(Long courseId, Long userId) throws Exception;
-
-//    List<CourseDtoPreview> getAllCourses(Specification<Course> specification);
-    List<CourseDtoPreview> getAllCourses(List<Long> courseIds);
-    List<CourseDtoPreview> getRecommendedCourses(Long userId);
-    List<CourseDtoPreviewEnrolled> getEnrolledCourses(Long userId);
-    List<CourseDtoPreview> getTopRatedCourses();
-    List<CourseDtoPreview> getMostPopularCourses();
-    CourseDtoDetail getCourseById(Long id);
-    Course getCourseEntityById(Long courseId);
-
-    List<String> getAllTopics();
-    List<String> getAllSkills();
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContent.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContent.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,36 +1,0 @@
-package com.shifterwebapp.shifter.coursecontent;
-
-import com.shifterwebapp.shifter.course.Course;
-import com.shifterwebapp.shifter.courselecture.CourseLecture;
-import com.shifterwebapp.shifter.usercourseprogress.UserCourseProgress;
-import jakarta.persistence.*;
-import com.shifterwebapp.shifter.enums.ContentType;
-import lombok.*;
-
-import java.util.List;
-
-@Getter
-@Setter
-@NoArgsConstructor
-@AllArgsConstructor
-@Builder
-@Entity
-public class CourseContent {
-
-    @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
-    private Long id;
-
-    private String title;
-
-    private Integer position;
-
-    @OneToMany(mappedBy = "courseContent", cascade = CascadeType.ALL, orphanRemoval = true)
-    @OrderBy("position ASC")
-    private List<CourseLecture> courseLectures;
-
-    @ManyToOne
-    @JoinColumn(name = "course_id")
-    private Course course;
-}
-
Index: ckend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContentController.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContentController.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,23 +1,0 @@
-package com.shifterwebapp.shifter.coursecontent;
-
-import com.shifterwebapp.shifter.coursecontent.service.CourseContentService;
-import lombok.RequiredArgsConstructor;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-
-@RestController
-@RequiredArgsConstructor
-@RequestMapping("${api.base.path}/course-content")
-@CrossOrigin
-public class CourseContentController {
-
-    private final CourseContentService courseContentService;
-
-    @GetMapping("/{courseId}")
-    public ResponseEntity<?> getCourseContent(@PathVariable Long courseId) {
-        List<CourseContentDtoPreview> courseContents = courseContentService.getCourseContentByCourseId(courseId);
-        return ResponseEntity.ok(courseContents);
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContentDtoFull.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContentDtoFull.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,22 +1,0 @@
-package com.shifterwebapp.shifter.coursecontent;
-
-import com.shifterwebapp.shifter.courselecture.CourseLectureDtoFull;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.util.List;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class CourseContentDtoFull {
-
-    private Long id;
-
-    private String title;
-
-    private Integer position;
-
-    private List<CourseLectureDtoFull> courseLectures;
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContentDtoPreview.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContentDtoPreview.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,21 +1,0 @@
-package com.shifterwebapp.shifter.coursecontent;
-
-import com.shifterwebapp.shifter.courselecture.CourseLectureDtoPreview;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.util.List;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class CourseContentDtoPreview {
-
-    private String title;
-
-    private Integer position;
-
-    private List<CourseLectureDtoPreview> courseLectures;
-}
-
Index: ckend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContentMapperFull.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContentMapperFull.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,18 +1,0 @@
-package com.shifterwebapp.shifter.coursecontent;
-
-import org.mapstruct.InheritInverseConfiguration;
-import org.mapstruct.Mapper;
-
-import java.util.List;
-
-@Mapper(componentModel = "spring")
-public interface CourseContentMapperFull {
-
-    CourseContentDtoFull toDto(CourseContent courseContent);
-    List<CourseContentDtoFull> toDto(List<CourseContent> courseContents);
-
-    @InheritInverseConfiguration
-    CourseContent toEntity(CourseContentDtoFull courseContentDtoFull);
-    @InheritInverseConfiguration
-    List<CourseContent> toEntity(List<CourseContentDtoFull> courseContentDtoFulls);
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContentMapperPreview.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContentMapperPreview.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,18 +1,0 @@
-package com.shifterwebapp.shifter.coursecontent;
-
-import org.mapstruct.InheritInverseConfiguration;
-import org.mapstruct.Mapper;
-
-import java.util.List;
-
-@Mapper(componentModel = "spring")
-public interface CourseContentMapperPreview {
-
-    CourseContentDtoPreview toDto(CourseContent courseContent);
-    List<CourseContentDtoPreview> toDto(List<CourseContent> courseContents);
-
-    @InheritInverseConfiguration
-    CourseContent toEntity(CourseContentDtoPreview courseContentDtoPreview);
-    @InheritInverseConfiguration
-    List<CourseContent> toEntity(List<CourseContentDtoPreview> courseContentDtoPreviews);
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContentRepository.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContentRepository.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,14 +1,0 @@
-package com.shifterwebapp.shifter.coursecontent;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-
-import java.util.List;
-
-public interface CourseContentRepository extends JpaRepository<CourseContent, Long> {
-
-    List<CourseContent> getCourseContentByCourse_Id(Long courseId);
-
-    @Query("SELECT c.course.id, COUNT(c) FROM CourseContent c GROUP BY c.course.id")
-    List<Object[]> countCourseContentsPerCourse();
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/coursecontent/service/CourseContentService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/coursecontent/service/CourseContentService.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,24 +1,0 @@
-package com.shifterwebapp.shifter.coursecontent.service;
-
-import com.shifterwebapp.shifter.coursecontent.CourseContent;
-import com.shifterwebapp.shifter.coursecontent.CourseContentDtoPreview;
-import com.shifterwebapp.shifter.coursecontent.CourseContentMapperPreview;
-import com.shifterwebapp.shifter.coursecontent.CourseContentRepository;
-import lombok.RequiredArgsConstructor;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-
-@Service
-@RequiredArgsConstructor
-public class CourseContentService implements ImplCourseContentService {
-
-    private final CourseContentRepository courseContentRepository;
-    private final CourseContentMapperPreview courseContentMapperPreview;
-
-    @Override
-    public List<CourseContentDtoPreview> getCourseContentByCourseId(Long courseId) {
-        List<CourseContent> courseContents = courseContentRepository.getCourseContentByCourse_Id(courseId);
-        return courseContentMapperPreview.toDto(courseContents);
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/coursecontent/service/ImplCourseContentService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/coursecontent/service/ImplCourseContentService.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,10 +1,0 @@
-package com.shifterwebapp.shifter.coursecontent.service;
-
-import com.shifterwebapp.shifter.coursecontent.CourseContentDtoPreview;
-
-import java.util.List;
-
-public interface ImplCourseContentService {
-    List<CourseContentDtoPreview> getCourseContentByCourseId(Long courseId);
-
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/courselecture/CourseLecture.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/courselecture/CourseLecture.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,48 +1,0 @@
-package com.shifterwebapp.shifter.courselecture;
-
-import com.shifterwebapp.shifter.coursecontent.CourseContent;
-import com.shifterwebapp.shifter.usercourseprogress.UserCourseProgress;
-import jakarta.persistence.*;
-import com.shifterwebapp.shifter.enums.ContentType;
-import lombok.*;
-
-import java.util.List;
-
-@Getter
-@Setter
-@NoArgsConstructor
-@AllArgsConstructor
-@Builder
-@Entity
-public class CourseLecture {
-
-    @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
-    private Long id;
-
-    private String title;
-
-    @Column(columnDefinition = "text")
-    private String description;
-
-    private Integer durationMinutes;
-
-    private Integer position;
-
-    @Column(columnDefinition = "text")
-    private String contentText;
-
-    @Column(columnDefinition = "text")
-    private String contentFileName;
-
-    @Enumerated(EnumType.STRING)
-    private ContentType contentType;
-
-    @ManyToOne
-    @JoinColumn(name = "course_content_id")
-    private CourseContent courseContent;
-
-    @OneToMany(mappedBy = "courseLecture", cascade = CascadeType.ALL, orphanRemoval = true)
-    private List<UserCourseProgress> userCourseProgressList;
-}
-
Index: ckend/src/main/java/com/shifterwebapp/shifter/courselecture/CourseLectureDtoFull.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/courselecture/CourseLectureDtoFull.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,31 +1,0 @@
-package com.shifterwebapp.shifter.courselecture;
-
-import com.shifterwebapp.shifter.enums.ContentType;
-import com.shifterwebapp.shifter.usercourseprogress.UserCourseProgressDto;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class CourseLectureDtoFull {
-
-    private Long id;
-
-    private String title;
-
-    private String description;
-
-    private Integer durationMinutes;
-
-    private Integer position;
-
-    private String contentText;
-
-    private String contentFileName;
-
-    private ContentType contentType;
-
-    private UserCourseProgressDto userCourseProgress;
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/courselecture/CourseLectureDtoPreview.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/courselecture/CourseLectureDtoPreview.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,22 +1,0 @@
-package com.shifterwebapp.shifter.courselecture;
-
-import com.shifterwebapp.shifter.enums.ContentType;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class CourseLectureDtoPreview {
-
-    private String title;
-
-    private String description;
-
-    private Integer durationMinutes;
-
-    private Integer position;
-
-    private ContentType contentType;
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/courselecture/CourseLectureMapperFull.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/courselecture/CourseLectureMapperFull.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,18 +1,0 @@
-package com.shifterwebapp.shifter.courselecture;
-
-import org.mapstruct.InheritInverseConfiguration;
-import org.mapstruct.Mapper;
-
-import java.util.List;
-
-@Mapper(componentModel = "spring")
-public interface CourseLectureMapperFull {
-
-    CourseLectureDtoFull toDto(CourseLecture courseContent);
-    List<CourseLectureDtoFull> toDto(List<CourseLecture> courseContents);
-
-    @InheritInverseConfiguration
-    CourseLecture toEntity(CourseLectureDtoFull courseContentDto);
-    @InheritInverseConfiguration
-    List<CourseLecture> toEntity(List<CourseLectureDtoFull> courseContentDtos);
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/courselecture/CourseLectureMapperPreview.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/courselecture/CourseLectureMapperPreview.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,18 +1,0 @@
-package com.shifterwebapp.shifter.courselecture;
-
-import org.mapstruct.InheritInverseConfiguration;
-import org.mapstruct.Mapper;
-
-import java.util.List;
-
-@Mapper(componentModel = "spring")
-public interface CourseLectureMapperPreview {
-
-    CourseLectureDtoPreview toDto(CourseLecture courseContent);
-    List<CourseLectureDtoPreview> toDto(List<CourseLecture> courseContents);
-
-    @InheritInverseConfiguration
-    CourseLecture toEntity(CourseLectureDtoPreview courseContentDto);
-    @InheritInverseConfiguration
-    List<CourseLecture> toEntity(List<CourseLectureDtoPreview> courseContentDtos);
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/courselecture/CourseLectureRepository.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/courselecture/CourseLectureRepository.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,11 +1,0 @@
-package com.shifterwebapp.shifter.courselecture;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.data.repository.query.Param;
-
-public interface CourseLectureRepository extends JpaRepository<CourseLecture, Long> {
-
-    @Query("select cl.contentType from CourseLecture cl where cl.id = :lectureId and cl.contentFileName = :fileName and cl.courseContent.course.id = :courseId")
-    String getContentType(@Param("fileName") String fileName,@Param("courseId") Long courseId, @Param("lectureId") Long lectureId);
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/courselecture/service/CourseLectureService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/courselecture/service/CourseLectureService.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,20 +1,0 @@
-package com.shifterwebapp.shifter.courselecture.service;
-
-import com.shifterwebapp.shifter.Validate;
-import com.shifterwebapp.shifter.courselecture.CourseLectureRepository;
-import lombok.RequiredArgsConstructor;
-import org.springframework.stereotype.Service;
-
-@Service
-@RequiredArgsConstructor
-public class CourseLectureService implements ImplCourseLectureService{
-
-    private final Validate validate;
-    private final CourseLectureRepository courseLectureRepository;
-
-    @Override
-    public String getContentType(String fileName, Long courseId, Long lectureId) {
-        validate.validateCourseExists(courseId);
-        return courseLectureRepository.getContentType(fileName, courseId, lectureId);
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/courselecture/service/ImplCourseLectureService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/courselecture/service/ImplCourseLectureService.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,5 +1,0 @@
-package com.shifterwebapp.shifter.courselecture.service;
-
-public interface ImplCourseLectureService {
-    String getContentType(String fileName, Long courseId, Long lectureId);
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/enrollment/Enrollment.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enrollment/Enrollment.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,48 +1,0 @@
-package com.shifterwebapp.shifter.enrollment;
-
-import com.shifterwebapp.shifter.course.Course;
-import com.shifterwebapp.shifter.enums.EnrollmentStatus;
-import com.shifterwebapp.shifter.payment.Payment;
-import com.shifterwebapp.shifter.review.Review;
-import com.shifterwebapp.shifter.usercourseprogress.UserCourseProgress;
-import jakarta.persistence.*;
-import lombok.*;
-
-import java.time.LocalDate;
-import java.util.List;
-
-@Getter
-@Setter
-@NoArgsConstructor
-@AllArgsConstructor
-@Builder
-@Entity
-public class Enrollment {
-    @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
-    private Long id;
-
-    @Enumerated(EnumType.STRING)
-    private EnrollmentStatus enrollmentStatus;
-
-    private LocalDate date;
-
-    private LocalDate activatedAt;
-
-    private LocalDate completedAt;
-
-    @OneToOne(cascade = CascadeType.PERSIST, orphanRemoval = true)  // Persist ???? Orphan removal ????
-    @JoinColumn(name = "payment_id")
-    private Payment payment;
-
-    @OneToOne(mappedBy = "enrollment", cascade = CascadeType.ALL, orphanRemoval = true)
-    private Review review;
-
-    @ManyToOne
-    @JoinColumn(name = "course_id")
-    private Course course;
-
-    @OneToMany(mappedBy = "enrollment", cascade = CascadeType.ALL, orphanRemoval = true)
-    private List<UserCourseProgress> userCourseProgressList;
-}
-
Index: ckend/src/main/java/com/shifterwebapp/shifter/enrollment/EnrollmentController.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enrollment/EnrollmentController.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,46 +1,0 @@
-package com.shifterwebapp.shifter.enrollment;
-
-import com.shifterwebapp.shifter.Validate;
-import com.shifterwebapp.shifter.auth.CustomAuthDetails;
-import com.shifterwebapp.shifter.enrollment.service.EnrollmentService;
-import com.shifterwebapp.shifter.exception.ErrorResponse;
-import lombok.RequiredArgsConstructor;
-import org.springframework.http.ResponseEntity;
-import org.springframework.security.core.Authentication;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-
-@RequiredArgsConstructor
-@RestController
-@RequestMapping("${api.base.path}/enrollments")
-public class EnrollmentController {
-
-    private final EnrollmentService enrollmentService;
-    private final Validate validate;
-
-    @PostMapping("/create/{courseId}")
-    public ResponseEntity<?> enrollUserInCourse(@PathVariable Long courseId, Authentication authentication) {
-        Long userId = validate.extractUserId(authentication);
-
-        EnrollmentDto enrollmentDto = enrollmentService.enrollUser(courseId, userId);
-        if (enrollmentDto == null) {
-            return ResponseEntity.badRequest().body(new ErrorResponse("Enrollment failed"));
-        }
-        return ResponseEntity.ok(enrollmentDto);
-    }
-
-    @GetMapping("/user")
-    public ResponseEntity<?> getEnrollmentsByUser(Authentication authentication) {
-        Long userId = validate.extractUserId(authentication);
-
-        List<EnrollmentDto> enrollmentDtos = enrollmentService.getEnrollmentsByUser(userId);
-        return ResponseEntity.ok(enrollmentDtos);
-    }
-
-    @GetMapping("/{enrollmentId}")
-    public ResponseEntity<?> getEnrollmentById(@PathVariable Long enrollmentId) {
-        EnrollmentDto enrollmentDto = enrollmentService.getEnrollmentById(enrollmentId);
-        return ResponseEntity.ok(enrollmentDto);
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/enrollment/EnrollmentDto.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enrollment/EnrollmentDto.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,27 +1,0 @@
-package com.shifterwebapp.shifter.enrollment;
-
-import com.shifterwebapp.shifter.enums.EnrollmentStatus;
-import com.shifterwebapp.shifter.usercourseprogress.UserCourseProgress;
-import com.shifterwebapp.shifter.usercourseprogress.UserCourseProgressDto;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.time.LocalDate;
-import java.util.Date;
-import java.util.List;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class EnrollmentDto {
-
-    private EnrollmentStatus enrollmentStatus;
-
-    private LocalDate date;
-
-    private Long courseId;
-
-    private List<UserCourseProgressDto> userCourseProgressList;
-}
-
Index: ckend/src/main/java/com/shifterwebapp/shifter/enrollment/EnrollmentMapper.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enrollment/EnrollmentMapper.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,21 +1,0 @@
-package com.shifterwebapp.shifter.enrollment;
-
-import com.shifterwebapp.shifter.usercourseprogress.UserCourseProgressMapper;
-import org.mapstruct.InheritInverseConfiguration;
-import org.mapstruct.Mapper;
-import org.mapstruct.Mapping;
-
-import java.util.List;
-
-@Mapper(componentModel = "spring", uses = {UserCourseProgressMapper.class})
-public interface EnrollmentMapper {
-
-    @Mapping(source = "course.id", target = "courseId")
-    EnrollmentDto toDto(Enrollment enrollment);
-    List<EnrollmentDto> toDto(List<Enrollment> enrollment);
-
-    @InheritInverseConfiguration
-    Enrollment toEntity(EnrollmentDto enrollmentDto);
-    @InheritInverseConfiguration
-    List<Enrollment> toEntity(List<EnrollmentDto> enrollmentDtos);
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/enrollment/EnrollmentRepository.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enrollment/EnrollmentRepository.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,26 +1,0 @@
-package com.shifterwebapp.shifter.enrollment;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.data.repository.query.Param;
-
-import java.util.List;
-
-public interface EnrollmentRepository extends JpaRepository<Enrollment, Long> {
-
-    @Query("select e from Enrollment e where e.payment.user.id = :userId")
-    List<Enrollment> findEnrollmentsByUser(@Param("userId") Long userId);
-
-    @Query("select e.course.id from Enrollment e where e.payment.user.id = :userId")
-    List<Long> getCourseIdsByUserEnrollments(@Param("userId") Long userId);
-
-    @Query("select e from Enrollment e where e.course.id = :courseId")
-    List<Enrollment> findEnrollmentsByCourse(@Param("courseId") Long courseId);
-
-    @Query("select case when count(e) > 0 then true else false end" +
-            " from Enrollment e where e.payment.user.id = :userId and e.course.id = :courseId")
-    Boolean findIsUserEnrolledInCourse(@Param("userId") Long userId, @Param("courseId") Long courseId);
-
-    @Query("select e from Enrollment e where e.payment.user.id = :userId and e.course.id = :courseId")
-    Enrollment findEnrollmentByUserAndCourse(@Param("userId") Long userId, @Param("courseId") Long courseId);
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/enrollment/service/EnrollmentService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enrollment/service/EnrollmentService.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,188 +1,0 @@
-package com.shifterwebapp.shifter.enrollment.service;
-
-import com.shifterwebapp.shifter.Validate;
-import com.shifterwebapp.shifter.course.Course;
-import com.shifterwebapp.shifter.course.CourseRepository;
-import com.shifterwebapp.shifter.courselecture.CourseLecture;
-import com.shifterwebapp.shifter.enrollment.Enrollment;
-import com.shifterwebapp.shifter.enrollment.EnrollmentDto;
-import com.shifterwebapp.shifter.enrollment.EnrollmentMapper;
-import com.shifterwebapp.shifter.enrollment.EnrollmentRepository;
-import com.shifterwebapp.shifter.enums.*;
-import com.shifterwebapp.shifter.exception.AlreadyEnrolledException;
-import com.shifterwebapp.shifter.exception.PaymentNotCompleteException;
-import com.shifterwebapp.shifter.external.email.EmailService;
-import com.shifterwebapp.shifter.payment.Payment;
-import com.shifterwebapp.shifter.payment.service.PaymentService;
-import com.shifterwebapp.shifter.user.service.UserService;
-import com.shifterwebapp.shifter.usercourseprogress.UserCourseProgress;
-import com.shifterwebapp.shifter.usercourseprogress.UserCourseProgressRepository;
-import com.shifterwebapp.shifter.usercourseprogress.service.UserCourseProgressService;
-import lombok.RequiredArgsConstructor;
-import org.springframework.stereotype.Service;
-
-import java.time.LocalDate;
-import java.util.List;
-
-@Service
-@RequiredArgsConstructor
-public class EnrollmentService implements ImplEnrollmentService {
-
-    private final EnrollmentRepository enrollmentRepository;
-    private final CourseRepository courseRepository;
-    private final UserCourseProgressRepository userCourseProgressRepository;
-    private final UserService userService;
-    private final PaymentService paymentService;
-    private final EnrollmentMapper enrollmentMapper;
-    private final EmailService emailService;
-    private final Validate validate;
-
-    @Override
-    public EnrollmentDto getEnrollmentById(Long enrollmentId) {
-        validate.validateEnrollmentExists(enrollmentId);
-        Enrollment enrollment = enrollmentRepository.findById(enrollmentId).orElseThrow();
-        return enrollmentMapper.toDto(enrollment);
-    }
-
-    @Override
-    public List<EnrollmentDto> getEnrollmentsByUser(Long userId) {
-        validate.validateUserExists(userId);
-        List<Enrollment> enrollment = enrollmentRepository.findEnrollmentsByUser(userId);
-        return enrollmentMapper.toDto(enrollment);
-    }
-
-    @Override
-    public List<Long> getCourseIdsByUserEnrollments(Long userId) {
-        validate.validateUserExists(userId);
-        return enrollmentRepository.getCourseIdsByUserEnrollments(userId);
-    }
-
-    @Override
-    public List<EnrollmentDto> getEnrollmentsByCourse(Long courseId) {
-        validate.validateCourseExists(courseId);
-        List<Enrollment> enrollment = enrollmentRepository.findEnrollmentsByCourse(courseId);
-        return enrollmentMapper.toDto(enrollment);
-    }
-
-    @Override
-    public Enrollment getEnrollmentByUserAndCourse(Long userId, Long courseId) {
-        validate.validateUserExists(userId);
-        validate.validateCourseExists(courseId);
-
-        return enrollmentRepository.findEnrollmentByUserAndCourse(userId, courseId);
-    }
-
-
-    @Override
-    public EnrollmentDto enrollUser(Long courseId, Long userId) {
-        validate.validateCourseExists(courseId);
-        validate.validateUserExists(userId);
-
-        boolean isAlreadyEnrolled = enrollmentRepository.findIsUserEnrolledInCourse(userId, courseId);
-        if (isAlreadyEnrolled) {
-            throw new AlreadyEnrolledException("User with ID " + userId + " is already enrolled in course with ID " + courseId + "!");
-        }
-
-        Payment payment = paymentService.initiatePayment(userId, courseId, PaymentMethod.CASYS);
-
-        if (payment.getPaymentStatus() != PaymentStatus.COMPLETED) {
-            throw new PaymentNotCompleteException("Payment with ID " + payment.getId() + " is not completed successfully!");
-        }
-
-        Course course = courseRepository.findById(courseId).orElseThrow();
-
-        Enrollment enrollment = Enrollment.builder()
-                .enrollmentStatus(EnrollmentStatus.PENDING)
-                .date(LocalDate.now())
-                .payment(payment)
-                .review(null)
-                .course(course)
-                .build();
-
-        enrollmentRepository.save(enrollment);
-
-        List<CourseLecture> courseLectures = course.getCourseContents().stream()
-                .flatMap(content -> content.getCourseLectures().stream())
-                .toList();
-
-        List<UserCourseProgress> progressList = courseLectures.stream()
-                .map(lecture -> UserCourseProgress.builder()
-                        .courseLecture(lecture)
-                        .enrollment(enrollment)
-                        .completed(false)
-                        .completedAt(null)
-                        .build())
-                .toList();
-
-        userCourseProgressRepository.saveAll(progressList);
-
-        String courseTitleFormatted = course.getTitleShort()
-                .toLowerCase()
-                .trim()
-                .replaceAll("\\s+", "-")
-                .replaceAll("-+", "-");
-
-        emailService.sendCoursePurchaseConfirmation(
-                payment.getUser().getEmail(),
-                course.getTitle(),
-                course.getDescription(),
-                "http://localhost:5173/learn/" + course.getId() + "/" + courseTitleFormatted,
-                payment.getUser().getName()
-        );
-
-        return enrollmentMapper.toDto(enrollment);
-    }
-
-    @Override
-    public Boolean isUserEnrolledInCourse(Long userId, Long courseId) {
-        validate.validateUserExists(userId);
-        validate.validateCourseExists(courseId);
-
-        return enrollmentRepository.findIsUserEnrolledInCourse(userId, courseId);
-    }
-
-    @Override
-    public EnrollmentDto updateEnrollmentStatusToActive(Enrollment enrollment) {
-        validate.validateEnrollmentExists(enrollment.getId());
-
-        if (enrollment.getEnrollmentStatus() == EnrollmentStatus.PENDING) {
-            enrollment.setEnrollmentStatus(EnrollmentStatus.ACTIVE);
-            enrollment.setActivatedAt(LocalDate.now());
-            enrollmentRepository.save(enrollment);
-        }
-
-        return enrollmentMapper.toDto(enrollment);
-    }
-
-    @Override
-    public EnrollmentDto updateEnrollmentStatusToCompleted(Long enrollmentId) {
-        validate.validateEnrollmentExists(enrollmentId);
-
-        List<UserCourseProgress> userCourseProgresses = userCourseProgressRepository.findByEnrollmentId(enrollmentId);
-
-        boolean allCompleted = userCourseProgresses.stream().allMatch(UserCourseProgress::isCompleted);
-
-        Enrollment enrollment = enrollmentRepository.findById(enrollmentId).orElseThrow();
-
-        if (allCompleted) {
-            enrollment.setEnrollmentStatus(EnrollmentStatus.COMPLETED);
-            enrollment.setCompletedAt(LocalDate.now());
-            enrollmentRepository.save(enrollment);
-
-            Long userId = enrollment.getPayment().getUser().getId();
-            List<String> skillsGained = enrollment.getCourse().getSkillsGained();
-            userService.addPoints(userId, PointsConstants.BUY_COURSE);
-            userService.addSkills(userId, skillsGained);
-            userService.removeDesiredSkills(userId, skillsGained);
-        }
-
-        return enrollmentMapper.toDto(enrollment);
-    }
-
-    @Override
-    public Enrollment saveEnrollment(Enrollment enrollment) {
-        return enrollmentRepository.save(enrollment);
-    }
-
-
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/enrollment/service/ImplEnrollmentService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enrollment/service/ImplEnrollmentService.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,25 +1,0 @@
-package com.shifterwebapp.shifter.enrollment.service;
-
-import com.shifterwebapp.shifter.enrollment.Enrollment;
-import com.shifterwebapp.shifter.enrollment.EnrollmentDto;
-import com.shifterwebapp.shifter.enums.EnrollmentStatus;
-
-import java.time.LocalDate;
-import java.util.List;
-
-public interface ImplEnrollmentService {
-    EnrollmentDto getEnrollmentById(Long enrollmentId);
-    List<EnrollmentDto> getEnrollmentsByUser(Long userId);
-    List<Long> getCourseIdsByUserEnrollments(Long userId);
-    List<EnrollmentDto> getEnrollmentsByCourse(Long courseId);
-    Enrollment getEnrollmentByUserAndCourse(Long userId, Long courseId);
-
-    EnrollmentDto enrollUser(Long courseId, Long userId);
-
-    Boolean isUserEnrolledInCourse(Long userId, Long courseId);
-
-    EnrollmentDto updateEnrollmentStatusToActive(Enrollment enrollment);
-    EnrollmentDto updateEnrollmentStatusToCompleted(Long enrollmentId);
-
-    Enrollment saveEnrollment(Enrollment enrollment);
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/enums/CompanySize.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enums/CompanySize.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,11 +1,0 @@
-package com.shifterwebapp.shifter.enums;
-
-public enum CompanySize {
-    FREELANCE,
-    MICRO,
-    SMALL,
-    MEDIUM,
-    MID_MARKET,
-    ENTERPRISE,
-    OTHER
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/enums/ContentType.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enums/ContentType.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,9 +1,0 @@
-package com.shifterwebapp.shifter.enums;
-
-public enum ContentType {
-    VIDEO,
-    TEXT,
-    FILE,
-    QUIZ,
-    TOOL,
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/enums/Difficulty.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enums/Difficulty.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,8 +1,0 @@
-package com.shifterwebapp.shifter.enums;
-
-public enum Difficulty {
-    BEGINNER,
-    INTERMEDIATE,
-    ADVANCED,
-    EXPERT
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/enums/EnrollmentStatus.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enums/EnrollmentStatus.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package com.shifterwebapp.shifter.enums;
-
-public enum EnrollmentStatus {
-    PENDING,
-    ACTIVE,
-    COMPLETED
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/enums/Interests.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enums/Interests.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,38 +1,0 @@
-package com.shifterwebapp.shifter.enums;
-
-public enum Interests {
-    LEADERSHIP,
-    MANAGEMENT,
-    COMMUNICATION,
-    TEAM_DEVELOPMENT,
-    DECISION_MAKING,
-    BUSINESS_TRANSFORMATION,
-    DIGITAL_TRANSFORMATION,
-    CHANGE_MANAGEMENT,
-    STRATEGIC_PLANNING,
-    AGILITY,
-    ENTREPRENEURSHIP,
-    STARTUP_METHODS,
-    OPERATIONAL_EXCELLENCE,
-    SALES,
-    SALES_STRATEGIES,
-    NEGOTIATION,
-    CLIENT_RELATIONSHIPS,
-    PERSONAL_GROWTH,
-    TIME_MANAGEMENT,
-    GO_TO_MARKET_STRATEGY,
-    MARKETING,
-    CLIENT_TARGETING,
-    VALUE_CREATION,
-    BUSINESS_INNOVATION,
-    HR,
-    CULTURE_INTEGRATION,
-    SELF_AWARENESS,
-    PERFORMANCE_IMPROVEMENT,
-    CONTINUOUS_IMPROVEMENT,
-    TEAM_OPTIMIZATION,
-    SYSTEM_DESIGN,
-    PARADIGM_CONCEPTS,
-    PERCEPTION_AND_PERSPECTIVE,
-    BUSINESS_AND_CAREER_FOUNDATIONS
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/enums/LoginProvider.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enums/LoginProvider.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,6 +1,0 @@
-package com.shifterwebapp.shifter.enums;
-
-public enum LoginProvider {
-    LOCAL,
-    GOOGLE
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/enums/PaymentMethod.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enums/PaymentMethod.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package com.shifterwebapp.shifter.enums;
-
-public enum PaymentMethod {
-    CARD,
-    PAYPAL,
-    CASYS
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/enums/PaymentStatus.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enums/PaymentStatus.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package com.shifterwebapp.shifter.enums;
-
-public enum PaymentStatus {
-    PENDING,
-    COMPLETED,
-    FAILED
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/enums/PointsConstants.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enums/PointsConstants.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,6 +1,0 @@
-package com.shifterwebapp.shifter.enums;
-
-public class PointsConstants {
-    public static final int BUY_COURSE = 3;
-    public static final int REVIEW_COURSE = 1;
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/enums/Skills.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enums/Skills.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,63 +1,0 @@
-package com.shifterwebapp.shifter.enums;
-
-public enum Skills {
-
-    // CORE BUSINESS SKILLS
-    STRATEGIC_THINKING,
-    STRATEGIC_PLANNING,
-    BUSINESS_DEVELOPMENT,
-    PROJECT_MANAGEMENT,
-    OPERATION_MANAGEMENT,
-    LOGISTICS,
-    BUSINESS_MODEL_CREATION,
-    RISK_MANAGEMENT,
-    STARTUP_METHODOLOGIES,
-
-    // MARKETING & SALES
-    MARKETING,
-    DIGITAL_MARKETING,
-    TRADITIONAL_MARKETING,
-    BRANDING,
-    SALES,
-    SALES_TECHNIQUES,
-    B2B_TACTICS,
-    B2C_TACTICS,
-    SEO,
-    GOOGLE_ANALYTICS,
-    ECOMMERCE_PLATFORMS,
-
-    // LEADERSHIP & MANAGEMENT
-    LEADERSHIP,
-    PEOPLE_MANAGEMENT,
-    TEAM_BUILDING,
-    DELEGATION,
-    CONFLICT_RESOLUTION,
-    DECISION_MAKING,
-    PERFORMANCE_EVALUATION,
-    CHANGE_MANAGEMENT,  // Added missing
-
-    // SOFT SKILLS / PERSONAL EFFECTIVENESS
-    COMMUNICATION,
-    EMOTIONAL_INTELLIGENCE,
-    TIME_MANAGEMENT,
-    ADAPTABILITY,
-    CRITICAL_THINKING,
-    CREATIVITY,
-    PROBLEM_SOLVING,
-    NEGOTIATION,
-    PARADIGM_UNDERSTANDING,
-    PERCEPTION_MANAGEMENT,
-    PERSPECTIVE_SHIFTING,
-
-    // ENTREPRENEURSHIP
-    OPPORTUNITY_IDENTIFICATION,
-    FUNDRAISING_CAPITAL,
-    INNOVATION_MANAGEMENT,
-
-    // TECH & DIGITAL TOOLS
-    AI_TOOLS,
-
-    // LEGAL & ETHICS
-    BUSINESS_LAW,
-    BUSINESS_ETHICS
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/exception/AccessDeniedException.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/exception/AccessDeniedException.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package com.shifterwebapp.shifter.exception;
-
-public class AccessDeniedException extends RuntimeException {
-    public AccessDeniedException(String message) {
-        super(message);
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/exception/AlreadyEnrolledException.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/exception/AlreadyEnrolledException.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package com.shifterwebapp.shifter.exception;
-
-public class AlreadyEnrolledException extends RuntimeException {
-    public AlreadyEnrolledException(String message) {
-        super(message);
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/exception/BadRequestException.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/exception/BadRequestException.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package com.shifterwebapp.shifter.exception;
-
-public class BadRequestException extends RuntimeException {
-    public BadRequestException(String message) {
-        super(message);
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/exception/ErrorResponse.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/exception/ErrorResponse.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,10 +1,0 @@
-package com.shifterwebapp.shifter.exception;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-
-@Data
-@AllArgsConstructor
-public class ErrorResponse {
-    private String message;
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/exception/GlobalExceptionHandler.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/exception/GlobalExceptionHandler.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,84 +1,0 @@
-package com.shifterwebapp.shifter.exception;
-
-import org.springframework.http.HttpStatus;
-import org.springframework.http.ResponseEntity;
-import org.springframework.security.core.AuthenticationException;
-import org.springframework.web.bind.annotation.ControllerAdvice;
-import org.springframework.web.bind.annotation.ExceptionHandler;
-import org.springframework.web.multipart.MultipartException;
-
-@ControllerAdvice
-public class GlobalExceptionHandler {
-
-    @ExceptionHandler(BadRequestException.class)
-    public ResponseEntity<ErrorResponse> handleBadRequestException(BadRequestException ex) {
-        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ErrorResponse(ex.getMessage()));
-    }
-
-    @ExceptionHandler(UnauthorizedException.class)
-    public ResponseEntity<ErrorResponse> handleUnauthorizedException(UnauthorizedException ex) {
-        return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(new ErrorResponse(ex.getMessage()));
-    }
-
-    @ExceptionHandler(ResourceNotFoundException.class)
-    public ResponseEntity<ErrorResponse> handleNotFoundException(ResourceNotFoundException ex) {
-        return ResponseEntity.status(HttpStatus.NOT_FOUND).body(new ErrorResponse(ex.getMessage()));
-    }
-
-    @ExceptionHandler(ResourceAlreadyExistsException.class)
-    public ResponseEntity<ErrorResponse> handleAlreadyExistsException(ResourceAlreadyExistsException ex) {
-        return ResponseEntity.status(HttpStatus.CONFLICT).body(new ErrorResponse(ex.getMessage()));
-    }
-
-    @ExceptionHandler(AccessDeniedException.class)
-    public ResponseEntity<ErrorResponse> handleAccessDeniedException(AccessDeniedException ex) {
-        return ResponseEntity.status(HttpStatus.FORBIDDEN).body(new ErrorResponse(ex.getMessage()));
-    }
-
-    @ExceptionHandler(TimeSlotUnavailableException.class)
-    public ResponseEntity<ErrorResponse> handleTimeSlotUnavailableException(TimeSlotUnavailableException ex) {
-        return ResponseEntity.status(HttpStatus.CONFLICT).body(new ErrorResponse(ex.getMessage()));
-    }
-
-    @ExceptionHandler(GoogleCalendarException.class)
-    public ResponseEntity<String> handleGoogleCalendarException(GoogleCalendarException e) {
-        e.printStackTrace();
-        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Google Calendar error: " + e.getMessage() + ". Needs re-authentication: " + e.isNeedsReauth());
-    }
-
-    @ExceptionHandler(ZoomMeetingException.class)
-    public ResponseEntity<String> handleZoomMeetingException(ZoomMeetingException e) {
-        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Zoom API error: " + e.getMessage());
-    }
-
-
-    @ExceptionHandler(RuntimeException.class)
-    public ResponseEntity<ErrorResponse> handleRuntimeException(RuntimeException ex) {
-        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ErrorResponse(ex.getMessage()));
-    }
-
-    @ExceptionHandler(IllegalStateException.class)
-    public ResponseEntity<ErrorResponse> handleIllegalStateException(IllegalStateException ex) {
-        return ResponseEntity.status(HttpStatus.CONFLICT).body(new ErrorResponse(ex.getMessage()));
-    }
-
-    @ExceptionHandler(InvalidVerificationTokenException.class)
-    public ResponseEntity<ErrorResponse> handleInvalidVerificationTokenException(InvalidVerificationTokenException ex) {
-        return ResponseEntity.status(HttpStatus.NOT_FOUND).body(new ErrorResponse(ex.getMessage()));
-    }
-
-    @ExceptionHandler(AuthenticationException.class)
-    public ResponseEntity<ErrorResponse> handleAuthenticationException(AuthenticationException ex) {
-        return ResponseEntity.status(HttpStatus.UNAUTHORIZED)
-                .body(new ErrorResponse(ex.getMessage()));
-    }
-
-
-    @ExceptionHandler(MultipartException.class)
-    public ResponseEntity<?> handleMultipartException(MultipartException ex) {
-        ex.printStackTrace(); // ← log full stack trace
-        return ResponseEntity.status(HttpStatus.BAD_REQUEST)
-                .body("Failed to process multipart request: " + ex.getMessage());
-    }
-
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/exception/GoogleCalendarException.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/exception/GoogleCalendarException.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,14 +1,0 @@
-package com.shifterwebapp.shifter.exception;
-
-public class GoogleCalendarException extends RuntimeException {
-    private final boolean needsReauth;
-
-    public GoogleCalendarException(String message, Throwable cause, boolean needsReauth) {
-        super(message, cause);
-        this.needsReauth = needsReauth;
-    }
-
-    public boolean isNeedsReauth() {
-        return needsReauth;
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/exception/InvalidVerificationTokenException.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/exception/InvalidVerificationTokenException.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package com.shifterwebapp.shifter.exception;
-
-public class InvalidVerificationTokenException extends RuntimeException {
-    public InvalidVerificationTokenException(String message) {
-        super(message);
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/exception/PaymentNotCompleteException.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/exception/PaymentNotCompleteException.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package com.shifterwebapp.shifter.exception;
-
-public class PaymentNotCompleteException extends RuntimeException {
-    public PaymentNotCompleteException(String message) {
-        super(message);
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/exception/ResourceAlreadyExistsException.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/exception/ResourceAlreadyExistsException.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package com.shifterwebapp.shifter.exception;
-
-public class ResourceAlreadyExistsException extends RuntimeException {
-    public ResourceAlreadyExistsException(String message) {
-        super(message);
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/exception/ResourceNotFoundException.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/exception/ResourceNotFoundException.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package com.shifterwebapp.shifter.exception;
-
-public class ResourceNotFoundException extends RuntimeException {
-    public ResourceNotFoundException(String message) {
-        super(message);
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/exception/TimeSlotUnavailableException.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/exception/TimeSlotUnavailableException.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package com.shifterwebapp.shifter.exception;
-
-public class TimeSlotUnavailableException extends RuntimeException {
-    public TimeSlotUnavailableException(String message) {
-        super(message);
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/exception/UnauthorizedException.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/exception/UnauthorizedException.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package com.shifterwebapp.shifter.exception;
-
-public class UnauthorizedException extends RuntimeException {
-    public UnauthorizedException(String message) {
-        super(message);
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/exception/ZoomMeetingException.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/exception/ZoomMeetingException.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package com.shifterwebapp.shifter.exception;
-
-public class ZoomMeetingException extends RuntimeException {
-    public ZoomMeetingException(String message) {
-        super(message);
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/external/PdfManipulationService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/external/PdfManipulationService.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,202 +1,0 @@
-package com.shifterwebapp.shifter.external;
-
-import org.apache.pdfbox.pdmodel.PDDocument;
-import org.apache.pdfbox.pdmodel.PDDocumentInformation;
-import org.apache.pdfbox.pdmodel.PDPage;
-import org.apache.pdfbox.pdmodel.PDPageContentStream;
-import org.apache.pdfbox.pdmodel.font.PDType1Font;
-import org.springframework.stereotype.Service;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.List;
-
-@Service
-public class PdfManipulationService {
-
-    // --- Page Dimensions ---
-    private static final float CERTIFICATE_WIDTH = 842.4f;
-
-    // --- Common X Start Position (Left-Aligned) ---
-    private static final float COMMON_TEXT_START_X_POSITION = 300.0f;
-
-    // First Sentence (Montserrat size 15 Bold)
-    private static final float FIRST_SENTENCE_Y_POSITION = 340.0f;
-    private static final float SENTENCE_MAX_WIDTH = 500.0f;
-
-    // User Name (Lexend Deca size 42)
-    private static final float USER_NAME_Y_POSITION = 260.0f;
-    private static final float USER_NAME_MAX_WIDTH = 500.0f;
-
-    // Second Sentence (Montserrat size 14)
-    private static final float SECOND_SENTENCE_Y_POSITION = 220.0f;
-    private static final float LINE_SPACING_PT = 18.0f;
-    private static final int MAX_LINES_FOR_SECOND_SENTENCE = 4;
-
-    // Date (Montserrat size 13)
-    private static final float DATE_START_X_POSITION = 60.0f;
-    private static final float DATE_Y_POSITION = 45.5f;
-
-    public byte[] fillPdfForm(InputStream pdfTemplateStream,
-                              String name,
-                              String firstSentence,
-                              String secondSentence,
-                              String date,
-                              String courseTitle) throws IOException {
-
-        try (PDDocument pdfDocument = PDDocument.load(pdfTemplateStream);
-             ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
-
-            PDDocumentInformation info = pdfDocument.getDocumentInformation();
-
-            info.setTitle(courseTitle + " Certificate");
-            info.setAuthor("Shifter");
-
-            PDPage page = pdfDocument.getPage(0);
-
-            try (PDPageContentStream contentStream = new PDPageContentStream(
-                    pdfDocument, page, PDPageContentStream.AppendMode.APPEND, true, true)) {
-
-                // --- 1. Draw and Wrap the First Sentence (No explicit limit) ---
-                drawWrappedText(
-                        contentStream,
-                        firstSentence.toUpperCase(),
-                        COMMON_TEXT_START_X_POSITION,
-                        FIRST_SENTENCE_Y_POSITION,
-                        SENTENCE_MAX_WIDTH,
-                        PDType1Font.HELVETICA_BOLD,
-                        15,
-                        Integer.MAX_VALUE
-                );
-
-                // --- 2. Draw and Scale the User Name (Single Line, Scales Down) ---
-                drawLeftAlignedAndScaleText(
-                        contentStream,
-                        name,
-                        COMMON_TEXT_START_X_POSITION,
-                        USER_NAME_Y_POSITION,
-                        USER_NAME_MAX_WIDTH,
-                        PDType1Font.HELVETICA_BOLD,
-                        42
-                );
-
-                // --- 3. Draw and Wrap the Second Sentence (Max 4 Lines) ---
-                drawWrappedText(
-                        contentStream,
-                        secondSentence,
-                        COMMON_TEXT_START_X_POSITION,
-                        SECOND_SENTENCE_Y_POSITION,
-                        SENTENCE_MAX_WIDTH,
-                        PDType1Font.HELVETICA,
-                        14,
-                        MAX_LINES_FOR_SECOND_SENTENCE
-                );
-
-                // --- 4. Draw the Date (Left Aligned, Fixed Size) ---
-                drawLeftAlignedText(
-                        contentStream,
-                        date,
-                        DATE_START_X_POSITION,
-                        DATE_Y_POSITION,
-                        PDType1Font.HELVETICA,
-                        13
-                );
-
-            }
-
-            pdfDocument.save(outputStream);
-            return outputStream.toByteArray();
-        }
-    }
-
-    /**
-     * Splits and draws text, automatically wrapping to the next line when max width is exceeded,
-     * and enforcing a maximum line limit. **FIXED** to draw each line independently.
-     */
-    private void drawWrappedText(PDPageContentStream contentStream, String text, float xPosition, float yPosition, float maxWidth, PDType1Font font, float fontSize, int lineLimit) throws IOException {
-
-        List<String> lines = getWrappedLines(text, font, fontSize, maxWidth);
-        int linesToDraw = Math.min(lines.size(), lineLimit);
-
-        // Draw each line independently using its own beginText/endText block
-        for (int i = 0; i < linesToDraw; i++) {
-
-            float lineY = yPosition - (i * LINE_SPACING_PT);
-            String line = lines.get(i);
-
-            // If the line is the last one allowed and the text was truncated, add an ellipsis
-            if (i == linesToDraw - 1 && lines.size() > lineLimit) {
-                line = line.trim() + "...";
-            }
-
-            contentStream.beginText();
-            contentStream.setFont(font, fontSize);
-            // This sets the absolute position for the current line
-            contentStream.newLineAtOffset(xPosition, lineY);
-            contentStream.showText(line.trim());
-            contentStream.endText();
-        }
-    }
-
-    /**
-     * Finds the largest font size (up to maxFontSize) that fits the text within maxWidth,
-     * then draws it left-aligned at the specified xPosition. (Used for single-line text like the Name).
-     */
-    private void drawLeftAlignedAndScaleText(PDPageContentStream contentStream, String text, float xPosition, float yPosition, float maxWidth, PDType1Font font, float maxFontSize) throws IOException {
-
-        float fontSize = maxFontSize;
-        float textWidth = font.getStringWidth(text) / 1000 * fontSize;
-
-        while (textWidth > maxWidth && fontSize > 10) {
-            fontSize -= 0.5f;
-            textWidth = font.getStringWidth(text) / 1000 * fontSize;
-        }
-
-        contentStream.beginText();
-        contentStream.setFont(font, fontSize);
-        contentStream.newLineAtOffset(xPosition, yPosition);
-        contentStream.showText(text);
-        contentStream.endText();
-    }
-
-    /**
-     * Draws text left-aligned at a specific fixed position and size (no scaling, no wrapping).
-     */
-    private void drawLeftAlignedText(PDPageContentStream contentStream, String text, float xPosition, float yPosition, PDType1Font font, float fontSize) throws IOException {
-
-        contentStream.beginText();
-        contentStream.setFont(font, fontSize);
-        contentStream.newLineAtOffset(xPosition, yPosition);
-        contentStream.showText(text);
-        contentStream.endText();
-    }
-
-    /**
-     * Utility function to calculate how the text should be wrapped.
-     */
-    private List<String> getWrappedLines(String text, PDType1Font font, float fontSize, float maxWidth) throws IOException {
-        List<String> lines = new ArrayList<>();
-        String[] words = text.split(" ");
-        StringBuilder currentLine = new StringBuilder();
-
-        for (String word : words) {
-            String testLine = currentLine.length() == 0 ? word : currentLine.toString() + " " + word;
-            float testWidth = font.getStringWidth(testLine) / 1000 * fontSize;
-
-            if (testWidth > maxWidth && currentLine.length() > 0) {
-                lines.add(currentLine.toString().trim());
-                currentLine = new StringBuilder(word + " ");
-            } else {
-                currentLine.append(word).append(" ");
-            }
-        }
-
-        if (currentLine.length() > 0) {
-            lines.add(currentLine.toString().trim());
-        }
-
-        return lines;
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/external/ZoomService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/external/ZoomService.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,93 +1,0 @@
-package com.shifterwebapp.shifter.external;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.shifterwebapp.shifter.exception.ZoomMeetingException;
-import com.shifterwebapp.shifter.external.meeting.ZoomMeetingRequest;
-import org.springframework.stereotype.Service;
-import org.springframework.web.client.HttpClientErrorException;
-import org.springframework.web.client.RestTemplate;
-import org.springframework.http.*;
-
-import java.nio.charset.StandardCharsets;
-import java.util.Base64;
-
-@Service
-public class ZoomService {
-
-    public JsonNode createMeeting(ZoomMeetingRequest meetingRequest) {
-        String accessToken = getZoomAccessToken();
-
-        String url = "https://api.zoom.us/v2/users/me/meetings";
-
-        HttpHeaders headers = new HttpHeaders();
-        headers.setBearerAuth(accessToken);
-        headers.setContentType(MediaType.APPLICATION_JSON);
-
-        HttpEntity<ZoomMeetingRequest> entity = new HttpEntity<>(meetingRequest, headers);
-
-        ResponseEntity<String> response;
-        try {
-            RestTemplate restTemplate = new RestTemplate();
-            response = restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
-        } catch (HttpClientErrorException e) {
-            throw new ZoomMeetingException("Zoom API returned an error: " + e.getStatusCode() + " " + e.getResponseBodyAsString());
-        }
-
-        try {
-            ObjectMapper mapper = new ObjectMapper();
-            JsonNode jsonNode = mapper.readTree(response.getBody());
-            return jsonNode;
-        } catch (Exception e) {
-            throw new RuntimeException("Failed to parse Zoom meeting response", e);
-        }
-    }
-
-    public void deleteMeeting(String meetingId) {
-        String accessToken = getZoomAccessToken();
-
-        String url = "https://api.zoom.us/v2/meetings/" + meetingId;
-
-        HttpHeaders headers = new HttpHeaders();
-        headers.setBearerAuth(accessToken);
-
-        HttpEntity<Void> entity = new HttpEntity<>(headers);
-
-        try {
-            RestTemplate restTemplate = new RestTemplate();
-            restTemplate.exchange(url, HttpMethod.DELETE, entity, String.class);
-        } catch (HttpClientErrorException e) {
-            throw new ZoomMeetingException("Failed to delete Zoom meeting: " + e.getStatusCode() + " " + e.getResponseBodyAsString());
-        }
-    }
-
-
-    private String getZoomAccessToken() {
-        String accountId = System.getProperty("ZOOM_ACCOUNT_ID");
-        String clientId = System.getProperty("ZOOM_CLIENT_ID");
-        String clientSecret = System.getProperty("ZOOM_CLIENT_SECRET");
-
-        String auth = clientId + ":" + clientSecret;
-        String encodedAuth = Base64.getEncoder().encodeToString(auth.getBytes(StandardCharsets.UTF_8));
-
-        HttpHeaders headers = new HttpHeaders();
-        headers.set("Authorization", "Basic " + encodedAuth);
-        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
-
-        HttpEntity<String> entity = new HttpEntity<>(headers);
-
-        String url = "https://zoom.us/oauth/token?grant_type=account_credentials&account_id=" + accountId;
-
-        RestTemplate restTemplate = new RestTemplate();
-        ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
-
-        // Parse JSON to extract only access_token
-        ObjectMapper mapper = new ObjectMapper();
-        try {
-            JsonNode jsonNode = mapper.readTree(response.getBody());
-            return jsonNode.get("access_token").asText();
-        } catch (Exception e) {
-            throw new RuntimeException("Failed to parse Zoom access token", e);
-        }
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/external/email/ContactReq.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/external/email/ContactReq.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,13 +1,0 @@
-package com.shifterwebapp.shifter.external.email;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@NoArgsConstructor
-@AllArgsConstructor
-@Data
-public class ContactReq {
-    public String subject;
-    public String text;
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/external/email/EmailController.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/external/email/EmailController.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,30 +1,0 @@
-package com.shifterwebapp.shifter.external.email;
-
-import com.shifterwebapp.shifter.Validate;
-import com.shifterwebapp.shifter.user.service.UserService;
-import lombok.RequiredArgsConstructor;
-import org.springframework.http.ResponseEntity;
-import org.springframework.security.core.Authentication;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-@RequiredArgsConstructor
-@RestController
-@RequestMapping("${api.base.path}/emails")
-public class EmailController {
-
-    private final EmailService emailService;
-    private final UserService userService;
-    private final Validate validate;
-
-    @PostMapping("/contact-us")
-    public ResponseEntity<?> sendEmailToExpert(@RequestBody ContactReq contactReq, Authentication authentication) {
-        Long userId = validate.extractUserId(authentication);
-        String userEmail = userService.getUserEmailById(userId);
-
-        emailService.contactExpert(userEmail, contactReq);
-        return ResponseEntity.ok().build();
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/external/email/EmailScheduler.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/external/email/EmailScheduler.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,33 +1,0 @@
-package com.shifterwebapp.shifter.external.email;
-
-import com.shifterwebapp.shifter.scheduledemail.ScheduledEmail;
-import com.shifterwebapp.shifter.scheduledemail.ScheduledEmailService;
-import lombok.RequiredArgsConstructor;
-import org.springframework.scheduling.annotation.Scheduled;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-
-@Service
-@RequiredArgsConstructor
-public class EmailScheduler {
-
-    private final EmailService emailService;
-    private final ScheduledEmailService scheduledEmailService;
-
-    @Scheduled(timeUnit = TimeUnit.MINUTES, fixedRate = 1) // every minute
-    public void sendScheduledEmails() {
-        List<ScheduledEmail> pendingEmails = scheduledEmailService.getPendingEmails();
-        for (ScheduledEmail email : pendingEmails) {
-            emailService.sendFreeConsultationReminder(
-                    email.getRecipientEmail(),
-                    email.getMeetingDateTime().toLocalDate().toString(),
-                    email.getMeetingDateTime().toLocalTime().toString(),
-                    email.getZoomLink()
-            );
-            email.setSent(true);
-            scheduledEmailService.saveScheduledEmail(email);
-        }
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/external/email/EmailService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/external/email/EmailService.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,346 +1,0 @@
-package com.shifterwebapp.shifter.external.email;
-
-import com.shifterwebapp.shifter.external.meeting.UserMeetingInfoRequest;
-import jakarta.mail.MessagingException;
-import lombok.RequiredArgsConstructor;
-import org.springframework.core.io.ClassPathResource;
-import org.springframework.mail.SimpleMailMessage;
-import org.springframework.mail.javamail.JavaMailSender;
-import org.springframework.stereotype.Service;
-import org.springframework.beans.factory.annotation.Value;
-
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.UncheckedIOException;
-import java.nio.charset.StandardCharsets;
-import java.time.LocalDate;
-import java.time.Year;
-import java.time.format.DateTimeFormatter;
-import java.util.List;
-
-import org.springframework.mail.javamail.MimeMessageHelper;
-import jakarta.mail.internet.MimeMessage;
-import org.springframework.util.FileCopyUtils;
-
-@Service
-@RequiredArgsConstructor
-public class EmailService {
-
-    private final JavaMailSender mailSender;
-
-    @Value("${EMAIL_USERNAME}")
-    private String expertEmail;
-
-    public void contactExpert(String userEmail, ContactReq contactReq) {
-        SimpleMailMessage message = new SimpleMailMessage();
-
-        message.setFrom(expertEmail);
-        message.setTo(expertEmail);
-        message.setReplyTo(userEmail);
-        message.setSubject("New Contact Message: " + contactReq.getSubject());
-        String body = "From: " + userEmail + "\n\n" + contactReq.getText();
-        message.setText(body);
-        int maxRetries = 3;
-        int attempt = 0;
-        while (true) {
-            try {
-                mailSender.send(message);
-                return;
-            } catch (Exception e) {
-                attempt++;
-                if (attempt >= maxRetries) {
-                    System.out.println(e.getMessage());
-                    throw new RuntimeException("Failed to send email to expert after " + attempt + " attempts", e);
-                }
-            }
-        }
-    }
-
-    public void sendCoursePurchaseConfirmation(String to, String courseName, String courseDescription, String accessUrl, String userName) {
-
-        MimeMessage mimeMessage = mailSender.createMimeMessage();
-
-        try {
-            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
-
-            helper.setTo(to);
-            helper.setSubject("Welcome to " + courseName + "! Start Learning Now");
-            helper.setFrom(expertEmail);
-            helper.setReplyTo("support@shift-er.com");
-
-            int currentYear = Year.now().getValue();
-
-            String htmlTemplate;
-            try {
-                ClassPathResource resource = new ClassPathResource("email-templates/course_purchase_confirmation.html");
-                htmlTemplate = FileCopyUtils.copyToString(new InputStreamReader(resource.getInputStream(), StandardCharsets.UTF_8));
-            } catch (IOException e) {
-                // Throw a runtime exception if the template file can't be loaded
-                throw new UncheckedIOException("Failed to load email template: course_purchase_confirmation.html", e);
-            }
-
-            String htmlContent = htmlTemplate
-                    .replace("${courseName}", courseName)
-                    .replace("${courseDescription}", courseDescription)
-                    .replace("${accessUrl}", accessUrl)
-                    .replace("${currentYear}", String.valueOf(currentYear));
-
-            helper.setText(htmlContent, true);
-
-            int maxRetries = 3;
-            int attempt = 0;
-            while (true) {
-                try {
-                    mailSender.send(mimeMessage);
-                    return;
-                } catch (Exception e) {
-                    attempt++;
-                    if (attempt >= maxRetries) {
-                        throw new RuntimeException("Failed to send HTML email to " + to + " after " + attempt + " attempts", e);
-                    }
-                }
-            }
-
-        } catch (MessagingException e) {
-            throw new RuntimeException("Error preparing email message for " + to, e);
-        }
-    }
-
-    public void sendFreeConsultationConfirmation(String to, String date, String time, String zoomLink) {
-
-        MimeMessage mimeMessage = mailSender.createMimeMessage();
-
-        try {
-            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
-
-            String subject = "Your Free Consultation Session is Scheduled - " + date + " at " + time;
-
-            helper.setTo(to);
-            helper.setSubject(subject);
-            helper.setFrom(expertEmail);
-            helper.setReplyTo("support@shift-er.com");
-
-            String currentYear = String.valueOf(java.time.Year.now().getValue());
-
-            String htmlTemplate;
-            try {
-                ClassPathResource resource = new ClassPathResource("email-templates/free_consultation_confirmation.html");
-                htmlTemplate = FileCopyUtils.copyToString(new InputStreamReader(resource.getInputStream(), StandardCharsets.UTF_8));
-            } catch (IOException e) {
-                throw new UncheckedIOException("Failed to load email template: free_consultation_confirmation.html", e);
-            }
-
-            String htmlContent = htmlTemplate
-                    .replace("${date}", date)
-                    .replace("${time}", time)
-                    .replace("${zoomLink}", zoomLink)
-                    .replace("${currentYear}", currentYear);
-
-            helper.setText(htmlContent, true);
-
-            int maxRetries = 3;
-            int attempt = 0;
-            while (true) {
-                try {
-                    mailSender.send(mimeMessage);
-                    return;
-                } catch (Exception e) {
-                    attempt++;
-                    if (attempt >= maxRetries) {
-                        throw new RuntimeException("Failed to send HTML email to " + to + " after " + attempt + " attempts", e);
-                    }
-                }
-            }
-
-        } catch (MessagingException e) {
-            throw new RuntimeException("Error preparing email message for " + to, e);
-        }
-    }
-
-    public void sendFreeConsultationReminder(String to, String meetingDate, String meetingTime, String zoomLink) {
-
-        MimeMessage mimeMessage = mailSender.createMimeMessage();
-
-        DateTimeFormatter dateFormatter = DateTimeFormatter.ISO_LOCAL_DATE; // e.g., "2025-10-01"
-
-        LocalDate today = LocalDate.now();
-        LocalDate meetingLocalDate = LocalDate.parse(meetingDate, dateFormatter);
-
-        String subject;
-        String reminderHeading;
-        String reminderText;
-
-        if (meetingLocalDate.isEqual(today.plusDays(1))) {
-            subject = "Reminder: Tomorrow is your Free Consultation Session at " + meetingTime;
-            reminderHeading = "Your Session is Tomorrow!";
-            reminderText = "This is a friendly reminder that your free consultation session is scheduled for tomorrow. We look forward to meeting with you and helping you plan your next steps!";
-        }
-        else if (meetingLocalDate.isEqual(today)) {
-            subject = "Reminder: Free Consultation Session in 2 hours";
-            reminderHeading = "Your Session is in 2 Hours!";
-            reminderText = "This is a crucial final reminder. Your free consultation session is starting soon. Please use the link below to join promptly!";
-        }
-        else {
-            System.out.println("Scheduler error: Reminder function called outside of expected time window for meeting on: " + meetingDate);
-            return;
-        }
-
-        try {
-            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
-
-            helper.setTo(to);
-            helper.setSubject(subject);
-            helper.setFrom(expertEmail);
-            helper.setReplyTo("support@shift-er.com");
-
-            String currentYear = String.valueOf(Year.now().getValue());
-
-            String htmlTemplate;
-            try {
-                ClassPathResource resource = new ClassPathResource("email-templates/consultation_reminder.html");
-                htmlTemplate = FileCopyUtils.copyToString(new InputStreamReader(resource.getInputStream(), StandardCharsets.UTF_8));
-            } catch (IOException e) {
-                throw new UncheckedIOException("Failed to load email template: consultation_reminder.html", e);
-            }
-
-            String htmlContent = htmlTemplate
-                    .replace("${subject}", subject)
-                    .replace("${meetingDate}", meetingDate)
-                    .replace("${meetingTime}", meetingTime)
-                    .replace("${zoomLink}", zoomLink)
-                    .replace("${reminderHeading}", reminderHeading)
-                    .replace("${reminderText}", reminderText)
-                    .replace("${currentYear}", currentYear);
-
-            helper.setText(htmlContent, true);
-
-            int maxRetries = 3;
-            int attempt = 0;
-            while (true) {
-                try {
-                    mailSender.send(mimeMessage);
-                    return;
-                } catch (Exception e) {
-                    attempt++;
-                    if (attempt >= maxRetries) {
-                        throw new RuntimeException("Failed to send HTML reminder email to " + to + " after " + attempt + " attempts", e);
-                    }
-                }
-            }
-
-        } catch (MessagingException e) {
-            throw new RuntimeException("Error preparing email message for " + to, e);
-        }
-    }
-
-    public void sendExpertMeetingInformation(UserMeetingInfoRequest userMeetingInfoRequest, String time, String date, String userTimeZone, String zoomLink) {
-
-        MimeMessage mimeMessage = mailSender.createMimeMessage();
-
-        String expertEmail = System.getProperty("EMAIL_USERNAME");
-
-        String subject = "You Have an Upcoming Free Consultation Session - " + date + " at " + time;
-
-        try {
-            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
-
-            helper.setTo(expertEmail); // Send to the expert's email
-            helper.setSubject(subject);
-            helper.setFrom(expertEmail);
-            helper.setReplyTo("support@shift-er.com");
-
-            String currentYear = String.valueOf(Year.now().getValue());
-
-            String htmlTemplate;
-            try {
-                ClassPathResource resource = new ClassPathResource("email-templates/expert_meeting_info.html");
-                htmlTemplate = FileCopyUtils.copyToString(new InputStreamReader(resource.getInputStream(), StandardCharsets.UTF_8));
-            } catch (IOException e) {
-                throw new UncheckedIOException("Failed to load email template: expert_meeting_info.html", e);
-            }
-
-            String htmlContent = htmlTemplate
-                    .replace("${subject}", subject)
-                    .replace("${date}", date)
-                    .replace("${time}", time)
-                    .replace("${zoomLink}", zoomLink)
-                    .replace("${name}", userMeetingInfoRequest.getName())
-                    .replace("${email}", userMeetingInfoRequest.getEmail())
-                    .replace("${companyType}", userMeetingInfoRequest.getCompanySize() != null ? userMeetingInfoRequest.getCompanySize().toString() : "N/A")
-                    .replace("${workPosition}", userMeetingInfoRequest.getWorkPosition())
-                    .replace("${userTimeZone}", userTimeZone)
-                    // Using ternary operators directly for "N/A" fallback
-                    .replace("${aboutCompany}", userMeetingInfoRequest.getAboutCompany() != null ? userMeetingInfoRequest.getAboutCompany() : "N/A")
-                    .replace("${challenges}", userMeetingInfoRequest.getChallenges() != null ? userMeetingInfoRequest.getChallenges() : "N/A")
-                    .replace("${expectations}", userMeetingInfoRequest.getExpectations() != null ? userMeetingInfoRequest.getExpectations() : "N/A")
-                    .replace("${otherInfo}", userMeetingInfoRequest.getOtherInfo() != null ? userMeetingInfoRequest.getOtherInfo() : "N/A")
-                    .replace("${currentYear}", currentYear);
-
-
-            helper.setText(htmlContent, true);
-
-            int maxRetries = 3;
-            int attempt = 0;
-            while (true) {
-                try {
-                    mailSender.send(mimeMessage);
-                    return;
-                } catch (Exception e) {
-                    attempt++;
-                    if (attempt >= maxRetries) {
-                        throw new RuntimeException("Failed to send expert email with meeting info after " + attempt + " attempts", e);
-                    }
-                }
-            }
-
-        } catch (MessagingException e) {
-            throw new RuntimeException("Error preparing email message for expert", e);
-        }
-    }
-
-    public void sendVerificationToken(String to, String verificationUrl) {
-
-        MimeMessage mimeMessage = mailSender.createMimeMessage();
-
-        try {
-            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
-
-            helper.setTo(to);
-            helper.setSubject("Your Shifter Account");
-            helper.setFrom(expertEmail);
-            helper.setReplyTo("support@shift-er.com");
-
-            String htmlTemplate;
-            try {
-                ClassPathResource resource = new ClassPathResource("email-templates/verify_account.html");
-                htmlTemplate = FileCopyUtils.copyToString(new InputStreamReader(resource.getInputStream(), StandardCharsets.UTF_8));
-            } catch (IOException e) {
-                // Throw a runtime exception if the template file can't be loaded
-                throw new UncheckedIOException("Failed to load email template: verify_account.html", e);
-            }
-
-            String htmlContent = htmlTemplate
-                    .replace("${verificationUrl}", verificationUrl)
-                    .replace("${currentYear}", String.valueOf(Year.now().getValue()));
-
-            helper.setText(htmlContent, true);
-
-            int maxRetries = 3;
-            int attempt = 0;
-            while (true) {
-                try {
-                    mailSender.send(mimeMessage);
-                    return;
-                } catch (Exception e) {
-                    attempt++;
-                    if (attempt >= maxRetries) {
-                        throw new RuntimeException("Failed to send HTML email to " + to + " after " + attempt + " attempts", e);
-                    }
-                }
-            }
-
-        } catch (MessagingException e) {
-            throw new RuntimeException("Error preparing email message for " + to, e);
-        }
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/external/google/GoogleCalendarService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/external/google/GoogleCalendarService.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,170 +1,0 @@
-package com.shifterwebapp.shifter.external.google;
-
-import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
-import com.google.api.client.json.gson.GsonFactory;
-import com.google.api.client.util.DateTime;
-import com.google.api.services.calendar.Calendar;
-import com.google.api.services.calendar.model.*;
-import com.google.auth.http.HttpCredentialsAdapter;
-import com.google.auth.oauth2.GoogleCredentials;
-import com.shifterwebapp.shifter.exception.GoogleCalendarException;
-import lombok.Getter;
-import org.springframework.stereotype.Service;
-
-import java.io.InputStream;
-import java.time.*;
-import java.time.temporal.ChronoUnit;
-import java.util.*;
-
-@Service
-public class GoogleCalendarService {
-
-    private static final String APPLICATION_NAME = "Shifter App";
-    private static final GsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance();
-
-    @Getter
-    private final String expertCalendarId = System.getProperty("GOOGLE_EXPERT_CALENDAR_ID");
-
-    private final Calendar calendarService;
-
-    public GoogleCalendarService() {
-        this.calendarService = initService();
-    }
-
-    /**
-     * Initialize Google Calendar service using the service-account.json
-     */
-    private Calendar initService() {
-        try {
-            InputStream serviceAccountStream = getClass().getResourceAsStream("/service-account.json");
-            if (serviceAccountStream == null) {
-                throw new GoogleCalendarException("Service account JSON not found in classpath", null, false);
-            }
-
-            GoogleCredentials credentials = GoogleCredentials.fromStream(serviceAccountStream)
-                    .createScoped(Collections.singletonList("https://www.googleapis.com/auth/calendar"));
-
-            return new Calendar.Builder(
-                    GoogleNetHttpTransport.newTrustedTransport(),
-                    JSON_FACTORY,
-                    new HttpCredentialsAdapter(credentials)
-            ).setApplicationName(APPLICATION_NAME).build();
-
-        } catch (Exception e) {
-            throw new GoogleCalendarException("Failed to initialize Google Calendar service", e, false);
-        }
-    }
-
-    /* ==================== FREE/BUSY & SLOTS ==================== */
-
-    public Map<String, List<String>> computeFreeSlotsByDate(
-            List<TimeInterval> busySlots,
-            ZonedDateTime scheduleStart,
-            ZonedDateTime scheduleEnd,
-            int slotDurationMinutes,
-            ZoneId userZone) {
-
-        Map<String, List<String>> freeSlotsByDate = new LinkedHashMap<>();
-        ZonedDateTime cursorDay = scheduleStart.truncatedTo(ChronoUnit.DAYS);
-
-        while (cursorDay.isBefore(scheduleEnd)) {
-            DayOfWeek dayOfWeek = cursorDay.getDayOfWeek();
-
-            if (dayOfWeek != DayOfWeek.SATURDAY && dayOfWeek != DayOfWeek.SUNDAY) {
-                ZonedDateTime workdayStart = cursorDay.withHour(8).withMinute(0);
-                ZonedDateTime workdayEnd = cursorDay.withHour(16).withMinute(30);
-
-                ZonedDateTime cursorSlot = workdayStart;
-                while (cursorSlot.plusMinutes(slotDurationMinutes).compareTo(workdayEnd) <= 0) {
-                    ZonedDateTime slotEnd = cursorSlot.plusMinutes(slotDurationMinutes);
-                    Instant slotStartInstant = cursorSlot.toInstant();
-                    Instant slotEndInstant = slotEnd.toInstant();
-
-                    boolean overlaps = busySlots.stream()
-                            .anyMatch(busy -> busy.overlaps(slotStartInstant, slotEndInstant));
-
-                    if (!overlaps && cursorSlot.isAfter(scheduleStart)) {
-                        ZonedDateTime userTimeSlot = cursorSlot.withZoneSameInstant(userZone);
-                        String date = userTimeSlot.toLocalDate().toString();
-                        String time = userTimeSlot.toLocalTime().truncatedTo(ChronoUnit.MINUTES).toString();
-                        freeSlotsByDate.computeIfAbsent(date, k -> new ArrayList<>()).add(time);
-                    }
-
-                    cursorSlot = cursorSlot.plusMinutes(slotDurationMinutes);
-                }
-            }
-            cursorDay = cursorDay.plusDays(1);
-        }
-
-        return freeSlotsByDate;
-    }
-
-    public boolean isSlotFree(FreeBusyResponse freeBusy, ZonedDateTime start, ZonedDateTime end) {
-        if (start.getDayOfWeek() == DayOfWeek.SATURDAY || start.getDayOfWeek() == DayOfWeek.SUNDAY
-                || end.getDayOfWeek() == DayOfWeek.SATURDAY || end.getDayOfWeek() == DayOfWeek.SUNDAY) {
-            return false;
-        }
-
-        var busyList = freeBusy.getCalendars().get(expertCalendarId).getBusy();
-        for (var interval : busyList) {
-            Instant busyStart = Instant.ofEpochMilli(interval.getStart().getValue());
-            Instant busyEnd = Instant.ofEpochMilli(interval.getEnd().getValue());
-            if (!(busyEnd.isBefore(start.toInstant()) || busyStart.isAfter(end.toInstant()))) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    public FreeBusyResponse queryFreeBusy(Instant start, Instant end) {
-        try {
-            FreeBusyRequest fbRequest = new FreeBusyRequest()
-                    .setTimeMin(new DateTime(Date.from(start)))
-                    .setTimeMax(new DateTime(Date.from(end)))
-                    .setTimeZone("Europe/Skopje")
-                    .setItems(Collections.singletonList(new FreeBusyRequestItem().setId(expertCalendarId)));
-
-            return calendarService.freebusy().query(fbRequest).execute();
-        } catch (Exception e) {
-            throw new GoogleCalendarException("Failed to query free/busy times", e, false);
-        }
-    }
-
-    public String createEvent(String title, Instant start, Instant end) {
-        try {
-            Event event = new Event()
-                    .setSummary(title)
-                    .setStart(new EventDateTime().setDateTime(new DateTime(start.toEpochMilli())).setTimeZone("Europe/Skopje"))
-                    .setEnd(new EventDateTime().setDateTime(new DateTime(end.toEpochMilli())).setTimeZone("Europe/Skopje"));
-
-            Event createdEvent = calendarService.events().insert(expertCalendarId, event).execute();
-            return createdEvent.getId();
-        } catch (Exception e) {
-            throw new GoogleCalendarException("Failed to create event", e, false);
-        }
-    }
-
-    public void deleteEvent(String eventId) {
-        try {
-            calendarService.events().delete(expertCalendarId, eventId).execute();
-        } catch (Exception e) {
-            throw new GoogleCalendarException("Failed to delete event with ID: " + eventId, e, false);
-        }
-    }
-
-    /* ==================== TIME INTERVAL CLASS ==================== */
-
-    public static class TimeInterval {
-        private final Instant start;
-        private final Instant end;
-
-        public TimeInterval(Instant start, Instant end) {
-            this.start = start;
-            this.end = end;
-        }
-
-        public boolean overlaps(Instant otherStart, Instant otherEnd) {
-            return !start.isAfter(otherEnd) && !end.isBefore(otherStart);
-        }
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/external/google/OAuth2SuccessHandler.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/external/google/OAuth2SuccessHandler.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,83 +1,0 @@
-package com.shifterwebapp.shifter.external.google;
-
-import com.shifterwebapp.shifter.config.JwtService;
-import com.shifterwebapp.shifter.enums.LoginProvider;
-import com.shifterwebapp.shifter.user.User;
-import com.shifterwebapp.shifter.user.service.UserService;
-import com.shifterwebapp.shifter.verificationtoken.service.VerificationTokenService;
-import jakarta.servlet.ServletException;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
-import lombok.RequiredArgsConstructor;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken;
-import org.springframework.security.oauth2.core.user.OAuth2User;
-import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.net.URLEncoder;
-import java.nio.charset.StandardCharsets;
-import java.util.UUID;
-
-/**
- * Executes immediately after a successful OAuth2 handshake, allowing us to
- * access the authenticated OAuth2User before the SecurityContext is lost
- * due to a STATELESS session policy.
- */
-@Component
-@RequiredArgsConstructor
-public class OAuth2SuccessHandler implements AuthenticationSuccessHandler {
-
-    private final UserService userService;
-    private final VerificationTokenService verificationTokenService;
-    private final JwtService jwtService;
-
-    // Frontend base URL where the final redirect must go
-    private static final String FRONTEND_REDIRECT_BASE = "http://localhost:5173/oauth2/redirect";
-
-    @Override
-    public void onAuthenticationSuccess(
-            HttpServletRequest request,
-            HttpServletResponse response,
-            Authentication authentication
-    ) throws IOException, ServletException {
-
-        // 1. Safely cast and extract the OAuth2User Principal
-        if (!(authentication instanceof OAuth2AuthenticationToken)) {
-            response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Invalid authentication token type.");
-            return;
-        }
-
-        OAuth2User oauthUser = ((OAuth2AuthenticationToken) authentication).getPrincipal();
-
-        // At this point, oauthUser is guaranteed to be non-null if this handler is reached
-        String email = oauthUser.getAttribute("email");
-        String token;
-        boolean login;
-        User user;
-
-        boolean userExists = userService.existsUserByEmail(email);
-        if (userExists) {
-            // Existing user → generate and return JWT
-            user = userService.getUserEntityByEmail(email);
-            token = jwtService.generateToken(user);
-            login = true;
-        } else {
-            // New user → create minimal account and generate verification token
-            String randomPassword = UUID.randomUUID().toString() + UUID.randomUUID().toString();
-            user = userService.createInitialUser(email, randomPassword, LoginProvider.GOOGLE);
-            token = verificationTokenService.generateNewToken(user).toString();
-            login = false;
-        }
-
-        assert email != null;
-        String redirectUrl = String.format("%s?token=%s&login=%s&email=%s",
-                FRONTEND_REDIRECT_BASE,
-                URLEncoder.encode(token, StandardCharsets.UTF_8),
-                login,
-                URLEncoder.encode(email, StandardCharsets.UTF_8));
-
-        response.sendRedirect(redirectUrl);
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/external/meeting/MeetingController.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/external/meeting/MeetingController.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,55 +1,0 @@
-package com.shifterwebapp.shifter.external.meeting;
-
-import com.shifterwebapp.shifter.Validate;
-import com.shifterwebapp.shifter.external.meeting.service.MeetingService;
-import com.shifterwebapp.shifter.user.UserDto;
-import com.shifterwebapp.shifter.user.service.UserService;
-import lombok.RequiredArgsConstructor;
-import org.springframework.http.ResponseEntity;
-import org.springframework.security.core.Authentication;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-import java.util.Map;
-
-@RequiredArgsConstructor
-@RestController
-@RequestMapping("${api.base.path}/meetings")
-public class MeetingController {
-
-    private final UserService userService;
-    private final MeetingService meetingService;
-    private final Validate validate;
-
-    @GetMapping("/free-time-slots")
-    public ResponseEntity<?> getExpertFreeTimeSlots(
-            @RequestParam String userTimeZone,
-            Authentication authentication
-    ) {
-        validate.validateUserIsAuthenticated(authentication);
-
-        Map<String, List<String>> freeSlots = meetingService.getExpertFreeTimeSlots(userTimeZone);
-        return ResponseEntity.ok(freeSlots);
-    }
-
-    @PostMapping("/schedule-free-consultation")
-    public ResponseEntity<?> scheduleMeeting (
-            @RequestBody UserMeetingInfoRequest userMeetingInfoRequest,
-            @RequestParam String startTime,
-            @RequestParam String userTimeZone,
-            @RequestParam String date,
-            Authentication authentication
-    ) {
-        Long userId = validate.extractUserId(authentication);
-        UserDto user = userService.getUserById(userId);
-        userMeetingInfoRequest.setEmail(user.getEmail());
-        userMeetingInfoRequest.setName(user.getName());
-        userMeetingInfoRequest.setCompanySize(user.getCompanySize());
-        userMeetingInfoRequest.setWorkPosition(user.getWorkPosition());
-
-        meetingService.scheduleMeeting(date, startTime, userTimeZone, userMeetingInfoRequest);
-
-
-        return ResponseEntity.ok("Meeting successfully arranged!");
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/external/meeting/MeetingUtils.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/external/meeting/MeetingUtils.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,44 +1,0 @@
-package com.shifterwebapp.shifter.external.meeting;
-import org.springframework.stereotype.Component;
-import java.time.*;
-
-@Component
-public class MeetingUtils {
-
-    public static final ZoneId EXPERT_ZONE = ZoneId.of("Europe/Skopje");
-
-    public ZonedDateTime[] getExpertStartEnd(String date, String time, String userTimeZone, int durationMinutes) {
-        ZoneId userZone = ZoneId.of(userTimeZone);
-
-        LocalDate localDate = LocalDate.parse(date);
-        LocalTime localTime = LocalTime.parse(time);
-        ZonedDateTime startUser = ZonedDateTime.of(localDate, localTime, userZone);
-
-        ZonedDateTime startExpert = startUser.withZoneSameInstant(EXPERT_ZONE);
-        ZonedDateTime endExpert = startExpert.plusMinutes(durationMinutes);
-
-        return new ZonedDateTime[]{startExpert, endExpert};
-    }
-
-    public ZoneId parseZone(String zone) {
-        try {
-            return ZoneId.of(zone);
-        } catch (DateTimeException e) {
-            throw new IllegalArgumentException("Invalid time zone: " + zone, e);
-        }
-    }
-
-    public ZonedDateTime calculateScheduleStart(ZonedDateTime now) {
-        DayOfWeek dow = now.getDayOfWeek();
-        int daysToAdd = switch (dow) {
-            case THURSDAY, FRIDAY -> 4;
-            case SATURDAY -> 3;
-            default -> 2;
-        };
-        return now.withHour(8).withMinute(0).withSecond(0).withNano(0).plusDays(daysToAdd);
-    }
-
-    public ZonedDateTime calculateScheduleEnd(ZonedDateTime start) {
-        return start.withHour(16).withMinute(30).withSecond(0).withNano(0).plusDays(9);
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/external/meeting/UserMeetingInfoRequest.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/external/meeting/UserMeetingInfoRequest.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,28 +1,0 @@
-package com.shifterwebapp.shifter.external.meeting;
-
-import com.shifterwebapp.shifter.enums.CompanySize;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@AllArgsConstructor
-@NoArgsConstructor
-@Data
-public class UserMeetingInfoRequest {
-
-    private String name;
-
-    private String email;
-
-    private CompanySize companySize;
-
-    private String workPosition;
-
-    private String aboutCompany;
-
-    private String challenges;
-
-    private String expectations;
-
-    private String otherInfo;
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/external/meeting/ZoomMeetingRequest.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/external/meeting/ZoomMeetingRequest.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,33 +1,0 @@
-package com.shifterwebapp.shifter.external.meeting;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Builder;
-import lombok.Getter;
-import lombok.Setter;
-
-@Getter
-@Setter
-@Builder
-public class ZoomMeetingRequest {
-
-    @JsonProperty("topic")
-    private String topic;
-
-    @JsonProperty("start_time")
-    private String startTime; // ISO-8601 format: 2025-08-14T15:00:00Z
-
-    @JsonProperty("duration")
-    private int duration; // in minutes
-
-    @JsonProperty("type")
-    private int type; // 2 = scheduled meeting
-
-    @JsonProperty("timezone")
-    private String timezone;
-
-    // Optional
-    @JsonProperty("agenda")
-    private String agenda;
-
-}
-
Index: ckend/src/main/java/com/shifterwebapp/shifter/external/meeting/service/ImplMeetingService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/external/meeting/service/ImplMeetingService.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,14 +1,0 @@
-package com.shifterwebapp.shifter.external.meeting.service;
-
-import com.shifterwebapp.shifter.external.meeting.UserMeetingInfoRequest;
-
-import java.util.List;
-import java.util.Map;
-
-public interface ImplMeetingService {
-
-    Map<String, List<String>> getExpertFreeTimeSlots(String userTimeZone);
-
-    void scheduleMeeting(String userDate, String userTime, String userTimeZone, UserMeetingInfoRequest userMeetingInfoRequest);
-
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/external/meeting/service/MeetingService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/external/meeting/service/MeetingService.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,180 +1,0 @@
-package com.shifterwebapp.shifter.external.meeting.service;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.google.api.services.calendar.model.FreeBusyResponse;
-import com.shifterwebapp.shifter.exception.AccessDeniedException;
-import com.shifterwebapp.shifter.exception.TimeSlotUnavailableException;
-import com.shifterwebapp.shifter.external.email.EmailService;
-import com.shifterwebapp.shifter.external.ZoomService;
-import com.shifterwebapp.shifter.external.google.GoogleCalendarService;
-import com.shifterwebapp.shifter.external.meeting.MeetingUtils;
-import com.shifterwebapp.shifter.external.meeting.UserMeetingInfoRequest;
-import com.shifterwebapp.shifter.external.meeting.ZoomMeetingRequest;
-import com.shifterwebapp.shifter.scheduledemail.ScheduledEmail;
-import com.shifterwebapp.shifter.scheduledemail.ScheduledEmailService;
-import com.shifterwebapp.shifter.user.service.UserService;
-import lombok.RequiredArgsConstructor;
-import org.springframework.stereotype.Service;
-
-import java.time.*;
-import java.time.format.DateTimeFormatter;
-import java.util.List;
-import java.util.Map;
-
-@Service
-@RequiredArgsConstructor
-public class MeetingService implements ImplMeetingService {
-
-    private final GoogleCalendarService googleCalendarService;
-    private final ScheduledEmailService scheduledEmailService;
-    private final UserService userService;
-    private final ZoomService zoomService;
-    private final EmailService emailService;
-    private final MeetingUtils meetingUtils;
-
-
-    @Override
-    public Map<String, List<String>> getExpertFreeTimeSlots(String userTimeZone) {
-        ZoneId expertZone = ZoneId.of("Europe/Skopje");
-        ZoneId userZone = meetingUtils.parseZone(userTimeZone);
-
-        ZonedDateTime nowExpert = ZonedDateTime.now(expertZone);
-        ZonedDateTime scheduleStart = meetingUtils.calculateScheduleStart(nowExpert);
-        ZonedDateTime scheduleEnd = meetingUtils.calculateScheduleEnd(scheduleStart);
-
-        FreeBusyResponse freeBusyResponse = googleCalendarService
-                .queryFreeBusy(scheduleStart.toInstant(), scheduleEnd.toInstant());
-
-        String calendarId = googleCalendarService.getExpertCalendarId();
-        if (freeBusyResponse == null
-                || freeBusyResponse.getCalendars() == null
-                || freeBusyResponse.getCalendars().get(calendarId) == null
-                || freeBusyResponse.getCalendars().get(calendarId).getBusy() == null) {
-            throw new IllegalStateException("Invalid FreeBusyResponse from Google API");
-        }
-
-        List<GoogleCalendarService.TimeInterval> busyIntervals = freeBusyResponse
-                .getCalendars()
-                .get(calendarId)
-                .getBusy()
-                .stream()
-                .map(i -> new GoogleCalendarService.TimeInterval(
-                        Instant.ofEpochMilli(i.getStart().getValue()),
-                        Instant.ofEpochMilli(i.getEnd().getValue())))
-                .toList();
-
-        return googleCalendarService.computeFreeSlotsByDate(
-                busyIntervals, scheduleStart, scheduleEnd, 30, userZone
-        );
-    }
-
-    @Override
-    public void scheduleMeeting(String userDate, String userTime, String userTimeZone, UserMeetingInfoRequest userMeetingInfoRequest) {
-        String userEmail = userMeetingInfoRequest.getEmail();
-
-        if (userService.getUserHasUsedFreeConsultation(userEmail)) {
-            throw new AccessDeniedException("User has already used free consultation");
-        }
-
-        ZonedDateTime[] expertTimes = meetingUtils.getExpertStartEnd(userDate, userTime, userTimeZone, 30);
-        ZonedDateTime startExpert = expertTimes[0];
-        ZonedDateTime endExpert = expertTimes[1];
-
-        boolean calendarCreated = false;
-        String calendarEventId = null;
-        String meetingLink = null;
-        String meetingId = null;
-
-        try {
-            FreeBusyResponse freeBusy = googleCalendarService.queryFreeBusy(
-                    startExpert.toInstant(),
-                    endExpert.toInstant()
-            );
-            if (!googleCalendarService.isSlotFree(freeBusy, startExpert, endExpert)) {
-                throw new TimeSlotUnavailableException("Slot is no longer available");
-            }
-
-            calendarEventId = googleCalendarService.createEvent(
-                    "Free Consultation",
-                    startExpert.toInstant(),
-                    endExpert.toInstant()
-            );
-            calendarCreated = true;
-
-            String zoomStartTime = startExpert
-                    .withZoneSameInstant(ZoneId.of("UTC"))
-                    .format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
-            JsonNode jsonNode = zoomService.createMeeting(ZoomMeetingRequest.builder()
-                    .topic("Free Consultation Session")
-                    .startTime(zoomStartTime)
-                    .duration(30)
-                    .timezone(MeetingUtils.EXPERT_ZONE.toString())
-                    .agenda("""
-                        This session is designed to understand your current challenges, goals, and preferences.
-                        During this session, our expert will provide valuable insights based on your situation.
-                        After the session, you will receive a personalized program recommendation tailored to your needs.
-                        """)
-                            .type(2)    // Scheduled meeting
-                    .build());
-            meetingLink = jsonNode.get("join_url").asText();
-            meetingId = jsonNode.get("id").asText();
-
-            emailService.sendFreeConsultationConfirmation(userEmail, userDate, userTime, meetingLink);
-            emailService.sendExpertMeetingInformation(userMeetingInfoRequest, startExpert.toLocalTime().toString(), startExpert.toLocalDate().toString(), userTimeZone, meetingLink);
-
-            LocalDateTime scheduledDayBefore = startExpert
-                    .minusDays(1) // 1 day before
-                    .withHour(8)  // 8 AM
-                    .withMinute(0)
-                    .withSecond(0)
-                    .toLocalDateTime();
-            scheduledEmailService.saveScheduledEmail(
-                    ScheduledEmail.builder()
-                            .recipientEmail(userEmail)
-                            .meetingDateTime(LocalDateTime.parse(userDate + "T" + userTime))
-                            .scheduledDateTime(scheduledDayBefore)
-                            .zoomLink(meetingLink)
-                            .sent(false)
-                            .build()
-            );
-
-            LocalDateTime scheduledOnDay = startExpert.minusHours(2).toLocalDateTime(); // 2 hours before
-            scheduledEmailService.saveScheduledEmail(
-                    ScheduledEmail.builder()
-                            .recipientEmail(userEmail)
-                            .meetingDateTime(LocalDateTime.parse(userDate + "T" + userTime))
-                            .scheduledDateTime(scheduledOnDay)
-                            .zoomLink(meetingLink)
-                            .sent(false)
-                            .build()
-            );
-
-            userService.markUserAsUsedFreeConsultation(userEmail);
-
-        } catch (Exception e) {
-            // Rollback calendar if Zoom or email fails
-            if (calendarCreated && calendarEventId != null) {
-                try {
-                    googleCalendarService.deleteEvent(calendarEventId);
-                } catch (Exception ex) {
-                    // log failure to delete calendar event
-                    System.err.println("Failed to delete calendar event: " + ex.getMessage());
-                }
-            }
-
-            if (meetingId != null) {
-                try {
-                    zoomService.deleteMeeting(meetingId);
-                } catch (Exception ex) {
-                    // log failure to delete Zoom meeting
-                    System.err.println("Failed to delete Zoom meeting: " + ex.getMessage());
-                }
-            }
-
-            // Optionally log or rethrow the exception
-            throw new RuntimeException("Failed to schedule meeting: " + e.getMessage(), e);
-        }
-    }
-
-
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/external/upload/MetaInfo.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/external/upload/MetaInfo.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,14 +1,0 @@
-package com.shifterwebapp.shifter.external.upload;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@AllArgsConstructor
-@NoArgsConstructor
-@Data
-public class MetaInfo {
-    private Integer contentPosition;
-    private Integer lecturePosition;
-    private Long courseId;
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/external/upload/S3Controller.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/external/upload/S3Controller.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,58 +1,0 @@
-package com.shifterwebapp.shifter.external.upload;
-
-import com.shifterwebapp.shifter.Validate;
-import com.shifterwebapp.shifter.course.service.CourseService;
-import com.shifterwebapp.shifter.courselecture.service.CourseLectureService;
-import com.shifterwebapp.shifter.enrollment.service.EnrollmentService;
-import com.shifterwebapp.shifter.exception.AccessDeniedException;
-import com.shifterwebapp.shifter.exception.ResourceNotFoundException;
-import lombok.RequiredArgsConstructor;
-import org.springframework.security.core.Authentication;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.util.Map;
-
-@RestController
-@RequestMapping("${api.base.path}/s3")
-@RequiredArgsConstructor
-public class S3Controller {
-
-    private final S3Service s3Service;
-    private final EnrollmentService enrollmentService;
-    private final CourseService courseService;
-    private final CourseLectureService courseLectureService;
-    private final Validate validate;
-
-    @GetMapping("/presigned-url")
-    public Map<String, String> getPresignedUrl(
-            @RequestParam Long courseId,
-            @RequestParam Long lectureId,
-            @RequestParam String fileName,
-            @RequestParam int expirySeconds,
-            Authentication authentication
-    ) {
-        Long userId = validate.extractUserId(authentication);
-
-        if (!enrollmentService.isUserEnrolledInCourse(userId, courseId)) {
-            throw new AccessDeniedException("You do not have access to this course content.");
-        }
-
-        String contentType = courseLectureService.getContentType(fileName, courseId, lectureId);
-        if (contentType == null) {
-            throw new ResourceNotFoundException("Content type not found for the specified file.");
-        }
-
-        String key = "private/courseContent/" + contentType.toLowerCase() + "/course_" + courseId + "/" + fileName;
-        System.out.println(key);
-
-        if (!courseService.lectureFileExistsInCourse(courseId, fileName)) {
-            throw new ResourceNotFoundException("File does not exist in the course.");
-        }
-
-        String url = s3Service.generatePresignedGetUrl(key, expirySeconds).toString();
-        return Map.of("url", url);
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/external/upload/S3Service.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/external/upload/S3Service.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,142 +1,0 @@
-package com.shifterwebapp.shifter.external.upload;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import lombok.RequiredArgsConstructor;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Service;
-import org.springframework.web.multipart.MultipartFile;
-import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
-import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
-import software.amazon.awssdk.core.ResponseInputStream;
-import software.amazon.awssdk.core.sync.RequestBody;
-import software.amazon.awssdk.regions.Region;
-import software.amazon.awssdk.services.s3.S3Client;
-import software.amazon.awssdk.services.s3.model.GetObjectResponse;
-import software.amazon.awssdk.services.s3.model.PutObjectRequest;
-import software.amazon.awssdk.services.s3.presigner.S3Presigner;
-import software.amazon.awssdk.services.s3.model.GetObjectRequest;
-import software.amazon.awssdk.services.s3.presigner.model.GetObjectPresignRequest;
-import java.time.Duration;
-
-
-import java.io.IOException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.List;
-
-@Service
-@RequiredArgsConstructor
-public class S3Service {
-
-    @Value("${aws.access-key}")
-    private String accessKey;
-
-    @Value("${aws.secret-key}")
-    private String secretKey;
-
-    @Value("${aws.region}")
-    private String region;
-
-    @Value("${aws.s3.bucket-name}")
-    private String bucketName;
-
-    public URL generatePresignedGetUrl(String key, int expirySeconds) {
-        S3Presigner presigner = S3Presigner.builder()
-                .region(Region.of(region))
-                .credentialsProvider(StaticCredentialsProvider.create(
-                        AwsBasicCredentials.create(accessKey, secretKey)
-                ))
-                .build();
-
-        GetObjectRequest getObjectRequest = GetObjectRequest.builder()
-                .bucket(bucketName)
-                .key(key)
-                .build();
-
-        GetObjectPresignRequest presignRequest = GetObjectPresignRequest.builder()
-                .signatureDuration(Duration.ofSeconds(expirySeconds))
-                .getObjectRequest(getObjectRequest)
-                .build();
-
-        URL url = presigner.presignGetObject(presignRequest).url();
-        presigner.close();
-        return url;
-    }
-
-    public ResponseInputStream<GetObjectResponse> downloadFile(String key) {
-        S3Client s3Client = S3Client.builder()
-                .region(Region.of(region))
-                .credentialsProvider(
-                        StaticCredentialsProvider.create(
-                                AwsBasicCredentials.create(accessKey, secretKey)
-                        )
-                )
-                .build();
-
-        GetObjectRequest getObjectRequest = GetObjectRequest.builder()
-                .bucket(bucketName)
-                .key(key)
-                .build();
-
-        return s3Client.getObject(getObjectRequest);
-    }
-
-    public List<S3UploadResponse> uploadCourseImageAndFiles(
-            Long courseId,
-            MultipartFile courseImage,
-            List<MultipartFile> files,
-            List<String> types,
-            List<String> metaList
-    ) throws IOException {
-        S3Client s3Client = S3Client.builder()
-                .region(Region.of(region))
-                .credentialsProvider(
-                        StaticCredentialsProvider.create(
-                                AwsBasicCredentials.create(accessKey, secretKey)
-                        )
-                )
-                .build();
-
-        List<S3UploadResponse> responses = new ArrayList<>();
-
-        // Upload public course image
-        if (courseImage != null && !courseImage.isEmpty()) {
-            String imageKey = "public/courseImages/course" + courseId + "_" + courseImage.getOriginalFilename();
-
-            s3Client.putObject(
-                    PutObjectRequest.builder()
-                            .bucket(bucketName)
-                            .key(imageKey)
-                            .build(),
-                    RequestBody.fromBytes(courseImage.getBytes())
-            );
-
-            String imageUrl = "https://" + bucketName + ".s3." + region + ".amazonaws.com/" + imageKey;
-
-            responses.add(new S3UploadResponse("COURSE_IMAGE", imageUrl, new MetaInfo(null, null, courseId)));
-        }
-
-        // Upload private course content files
-        for (int i = 0; i < files.size(); i++) {
-            MultipartFile file = files.get(i);
-            String type = types.get(i);
-            String metaJson = metaList.get(i);
-
-            String key = "private/courseContent/" + type.toLowerCase() + "/course_" + courseId + "/" + file.getOriginalFilename();
-
-            s3Client.putObject(
-                    PutObjectRequest.builder()
-                            .bucket(bucketName)
-                            .key(key)
-                            .build(),
-                    RequestBody.fromBytes(file.getBytes())
-            );
-
-
-            MetaInfo meta = new ObjectMapper().readValue(metaJson, MetaInfo.class);
-            responses.add(new S3UploadResponse("COURSE_LECTURE", file.getOriginalFilename(), meta));
-        }
-
-        return responses;
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/external/upload/S3UploadResponse.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/external/upload/S3UploadResponse.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,12 +1,0 @@
-package com.shifterwebapp.shifter.external.upload;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-
-@AllArgsConstructor
-@Data
-public class S3UploadResponse {
-    public String type;
-    public String fileName;
-    public MetaInfo meta;
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/external/upload/UploadController.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/external/upload/UploadController.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,38 +1,0 @@
-package com.shifterwebapp.shifter.external.upload;
-
-import com.shifterwebapp.shifter.Validate;
-import lombok.RequiredArgsConstructor;
-import org.springframework.http.MediaType;
-import org.springframework.http.ResponseEntity;
-import org.springframework.security.core.Authentication;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.web.multipart.MultipartFile;
-
-import java.io.IOException;
-import java.util.List;
-
-@RestController
-@RequestMapping("/api/upload")
-@RequiredArgsConstructor
-public class UploadController {
-
-    private final S3Service s3Service;
-    private final Validate validate;
-
-    @PostMapping(
-            value = "/course-image-and-content",
-            consumes = MediaType.MULTIPART_FORM_DATA_VALUE
-    )
-    public ResponseEntity<Void> uploadFiles(
-            @RequestParam("files") List<MultipartFile> files,
-            @RequestParam("types") List<String> types,
-            @RequestParam("meta") List<String> meta,
-            Authentication authentication
-    ) throws IOException {
-        validate.validateUserIsAdmin(authentication);
-
-//        s3Service.uploadFilesWithMeta(files, types, meta);
-        return ResponseEntity.ok().build();
-    }
-
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/payment/Payment.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/payment/Payment.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,41 +1,0 @@
-package com.shifterwebapp.shifter.payment;
-
-import com.shifterwebapp.shifter.enrollment.Enrollment;
-import com.shifterwebapp.shifter.enums.PaymentMethod;
-import com.shifterwebapp.shifter.enums.PaymentStatus;
-import com.shifterwebapp.shifter.user.User;
-import jakarta.persistence.*;
-import lombok.*;
-
-import java.time.LocalDate;
-import java.util.Date;
-
-@Getter
-@Setter
-@NoArgsConstructor
-@AllArgsConstructor
-@Builder
-@Entity
-public class Payment {
-    @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
-    private Long id;
-
-    private Double amount;
-
-    private LocalDate date;
-
-    @Enumerated(EnumType.STRING)
-    private PaymentMethod paymentMethod;
-
-    @Enumerated(EnumType.STRING)
-    private PaymentStatus paymentStatus;
-
-    @ManyToOne
-    @JoinColumn(name = "user_id")
-    private User user;
-
-    @OneToOne(mappedBy = "payment", cascade = CascadeType.ALL, orphanRemoval = true)
-    private Enrollment enrollment;
-}
-
Index: ckend/src/main/java/com/shifterwebapp/shifter/payment/PaymentController.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/payment/PaymentController.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,22 +1,0 @@
-package com.shifterwebapp.shifter.payment;
-
-import com.shifterwebapp.shifter.payment.service.PaymentService;
-import lombok.RequiredArgsConstructor;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-
-@RestController
-@RequiredArgsConstructor
-@RequestMapping("${api.base.path}/payment")
-public class PaymentController {
-
-    private final PaymentService paymentService;
-
-    @GetMapping
-    public ResponseEntity<?> getPaymentsByUser(@RequestParam("userId") Long userId) {
-        List<PaymentDto> paymentDtos = paymentService.getPaymentsByUser(userId);
-        return ResponseEntity.ok(paymentDtos);
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/payment/PaymentDto.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/payment/PaymentDto.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,27 +1,0 @@
-package com.shifterwebapp.shifter.payment;
-
-import com.shifterwebapp.shifter.enums.PaymentMethod;
-import com.shifterwebapp.shifter.enums.PaymentStatus;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.time.LocalDate;
-import java.util.Date;
-
-@Data
-@NoArgsConstructor
-@AllArgsConstructor
-public class PaymentDto {
-
-    private Long id;
-
-    private Double amount;
-
-    private LocalDate date;
-
-    private PaymentMethod paymentMethod;
-
-    private PaymentStatus paymentStatus;
-}
-
Index: ckend/src/main/java/com/shifterwebapp/shifter/payment/PaymentMapper.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/payment/PaymentMapper.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,18 +1,0 @@
-package com.shifterwebapp.shifter.payment;
-
-import org.mapstruct.InheritInverseConfiguration;
-import org.mapstruct.Mapper;
-
-import java.util.List;
-
-@Mapper(componentModel = "spring")
-public interface PaymentMapper {
-
-    PaymentDto toDto(Payment payment);
-    List<PaymentDto> toDto(List<Payment> payments);
-
-    @InheritInverseConfiguration
-    Payment toEntity(PaymentDto paymentDto);
-    @InheritInverseConfiguration
-    List<Payment> toEntity(List<PaymentDto> paymentDtos);
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/payment/PaymentRepository.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/payment/PaymentRepository.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,27 +1,0 @@
-package com.shifterwebapp.shifter.payment;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.data.repository.query.Param;
-
-import java.util.List;
-
-public interface PaymentRepository extends JpaRepository<Payment, Long> {
-
-    List<Payment> findPaymentByUser_Id(Long userId);
-
-    @Query("select p from Payment p where p.enrollment.course.id = :courseId")
-    List<Payment> findPaymentByCourse(@Param("courseId") Long courseId);
-
-    @Query("select sum(p.amount) from Payment p where p.enrollment.course.id = :courseId")
-    Double findTotalRevenueByCourse(@Param("courseId") Long courseId);
-
-    @Query("select sum(p.amount) from Payment p where p.enrollment.course.id = :courseId and function('month', p.date) = :month and function('year', p.date) = :year")
-    Double findTotalMonthlyRevenueByCourse(@Param("courseId") Long courseId, @Param("month") Integer month, @Param("year") Integer year);
-
-    @Query("select sum(p.amount) from Payment p where p.enrollment.course.id = :courseId and function('year', p.date) = :year")
-    Double findTotalYearlyRevenueByCourse(@Param("courseId") Long courseId, @Param("year") Integer year);
-
-    @Query("select case when p.paymentStatus = 'COMPLETED' then true else false end from Payment p where p.user.id = :userId and p.enrollment.course.id = :courseId")
-    Boolean findHasUserPaidForCourse(@Param("userId") Long userId, @Param("courseId") Long courseId);
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/payment/service/ImplPaymentService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/payment/service/ImplPaymentService.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,22 +1,0 @@
-package com.shifterwebapp.shifter.payment.service;
-
-import com.shifterwebapp.shifter.payment.Payment;
-import com.shifterwebapp.shifter.payment.PaymentDto;
-import com.shifterwebapp.shifter.enums.PaymentMethod;
-
-import java.util.List;
-
-public interface ImplPaymentService {
-    List<PaymentDto> getPaymentsByUser(Long userId);
-    List<PaymentDto> getPaymentsByCourse(Long courseId);
-
-    Double getTotalRevenueByCourse(Long courseId);
-    Double getTotalMonthlyRevenueByCourse(Long courseId, Integer month, Integer year);
-    Double getTotalYearlyRevenueByCourse(Long courseId, Integer year);
-
-    Boolean hasUserPaidForCourse(Long userId, Long courseId);
-
-    Payment initiatePayment(Long userId, Long courseId, PaymentMethod paymentMethod);
-    PaymentDto completePayment(Long paymentId);
-    PaymentDto failPayment(Long paymentId);
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/payment/service/PaymentService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/payment/service/PaymentService.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,111 +1,0 @@
-package com.shifterwebapp.shifter.payment.service;
-
-import com.shifterwebapp.shifter.Validate;
-import com.shifterwebapp.shifter.course.Course;
-import com.shifterwebapp.shifter.course.CourseRepository;
-import com.shifterwebapp.shifter.enrollment.Enrollment;
-import com.shifterwebapp.shifter.enrollment.EnrollmentRepository;
-import com.shifterwebapp.shifter.payment.Payment;
-import com.shifterwebapp.shifter.payment.PaymentDto;
-import com.shifterwebapp.shifter.payment.PaymentMapper;
-import com.shifterwebapp.shifter.payment.PaymentRepository;
-import com.shifterwebapp.shifter.enums.PaymentMethod;
-import com.shifterwebapp.shifter.enums.PaymentStatus;
-import com.shifterwebapp.shifter.user.User;
-import com.shifterwebapp.shifter.user.UserRepository;
-import lombok.RequiredArgsConstructor;
-import org.springframework.stereotype.Service;
-
-import java.time.LocalDate;
-import java.util.Date;
-import java.util.List;
-import java.util.NoSuchElementException;
-
-@Service
-@RequiredArgsConstructor
-public class PaymentService implements ImplPaymentService {
-
-    private final PaymentRepository paymentRepository;
-    private final PaymentMapper paymentMapper;
-    private final UserRepository userRepository;
-    private final EnrollmentRepository enrollmentRepository;
-    private final CourseRepository courseRepository;
-    private final Validate validate;
-
-    @Override
-    public List<PaymentDto> getPaymentsByUser(Long userId) {
-        validate.validateUserExists(userId);
-        List<Payment> payments = paymentRepository.findPaymentByUser_Id(userId);
-        return paymentMapper.toDto(payments);
-    }
-
-    @Override
-    public List<PaymentDto> getPaymentsByCourse(Long courseId) {
-        validate.validateCourseExists(courseId);
-        List<Payment> payments = paymentRepository.findPaymentByCourse(courseId);
-        return paymentMapper.toDto(payments);
-    }
-
-    @Override
-    public Double getTotalRevenueByCourse(Long courseId) {
-        validate.validateCourseExists(courseId);
-        return paymentRepository.findTotalRevenueByCourse(courseId);
-    }
-
-    @Override
-    public Double getTotalMonthlyRevenueByCourse(Long courseId, Integer month, Integer year) {
-        validate.validateCourseExists(courseId);
-        return paymentRepository.findTotalMonthlyRevenueByCourse(courseId, month, year);
-    }
-
-    @Override
-    public Double getTotalYearlyRevenueByCourse(Long courseId, Integer year) {
-        validate.validateCourseExists(courseId);
-        return paymentRepository.findTotalYearlyRevenueByCourse(courseId, year);
-    }
-
-    @Override
-    public Boolean hasUserPaidForCourse(Long userId, Long courseId) {
-        validate.validateCourseExists(courseId);
-        validate.validateUserExists(userId);
-        return paymentRepository.findHasUserPaidForCourse(userId, courseId);
-    }
-
-    @Override
-    public Payment initiatePayment(Long userId, Long courseId, PaymentMethod paymentMethod) {
-        User user = userRepository.findById(userId).orElseThrow();
-        Course course = courseRepository.findById(courseId).orElseThrow();
-
-        // PAYMENT CODE (CASYS) HERE !!!!!!!!!
-
-        Payment payment = Payment.builder()
-                .amount(course.getPrice())
-                .date(LocalDate.now())
-                .paymentMethod(paymentMethod)
-                .paymentStatus(PaymentStatus.COMPLETED)
-                .user(user)
-                .build();
-
-        return paymentRepository.save(payment);
-    }
-
-    @Override
-    public PaymentDto completePayment(Long paymentId) {
-        validate.validatePaymentExists(paymentId);
-        Payment payment = paymentRepository.findById(paymentId).orElseThrow();
-        payment.setPaymentStatus(PaymentStatus.COMPLETED);
-        paymentRepository.save(payment);
-
-        return paymentMapper.toDto(payment);
-    }
-
-    @Override
-    public PaymentDto failPayment(Long paymentId) {
-        validate.validatePaymentExists(paymentId);
-        Payment payment = paymentRepository.findById(paymentId).orElseThrow();
-        payment.setPaymentStatus(PaymentStatus.FAILED);
-        paymentRepository.save(payment);
-
-        return paymentMapper.toDto(payment);
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/review/Review.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/review/Review.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,30 +1,0 @@
-package com.shifterwebapp.shifter.review;
-
-import com.shifterwebapp.shifter.enrollment.Enrollment;
-import jakarta.persistence.*;
-import lombok.*;
-
-import java.time.LocalDate;
-import java.util.Date;
-
-@Getter
-@Setter
-@NoArgsConstructor
-@AllArgsConstructor
-@Builder
-@Entity
-public class Review {
-    @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
-    private Long id;
-
-    private Integer rating;
-
-    private String comment;
-
-    private LocalDate review_date;
-
-    @OneToOne
-    @JoinColumn(name = "enrollment_id")
-    private Enrollment enrollment;
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/review/ReviewController.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/review/ReviewController.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,78 +1,0 @@
-package com.shifterwebapp.shifter.review;
-
-import com.shifterwebapp.shifter.Validate;
-import com.shifterwebapp.shifter.review.service.ReviewService;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import lombok.RequiredArgsConstructor;
-import org.springframework.http.ResponseEntity;
-import org.springframework.security.core.Authentication;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-
-@RequiredArgsConstructor
-@RestController
-@RequestMapping("${api.base.path}/review")
-public class ReviewController {
-
-    private final ReviewService reviewService;
-    private final Validate validate;
-
-    @GetMapping("/{reviewId}")
-    public ResponseEntity<ReviewDto> getReviewById(@PathVariable Long reviewId) {
-        ReviewDto reviewDto = reviewService.getReviewById(reviewId);
-        return ResponseEntity.ok(reviewDto);
-    }
-
-    @GetMapping("/course/{courseId}")
-    public ResponseEntity<ReviewDto> getReviewByCourse(
-            @PathVariable Long courseId,
-            Authentication authentication
-    ) {
-        Long userId = validate.extractUserId(authentication);
-        ReviewDto reviewDtos = reviewService.getReviewByUserAndCourse(userId, courseId);
-        return ResponseEntity.ok(reviewDtos);
-    }
-
-    @GetMapping("/user/{userId}")
-    public ResponseEntity<List<ReviewDto>> getReviewByUser(@PathVariable Long userId) {
-        List<ReviewDto> reviewDtos = reviewService.getReviewsByUser(userId);
-        return ResponseEntity.ok(reviewDtos);
-    }
-
-    @PostMapping("/{courseId}")
-    public ResponseEntity<?> writeReview(
-            @PathVariable Long courseId,
-            @RequestBody ReviewRequest reviewRequest,
-            Authentication authentication
-    ) {
-        Long userId = validate.extractUserId(authentication);
-
-        reviewService.writeReview(
-                userId,
-                courseId,
-                reviewRequest
-        );
-
-        return ResponseEntity.ok("Successfully created review");
-    }
-
-    @PutMapping("/{courseId}")
-    public ResponseEntity<?> updateReview(
-            @PathVariable Long courseId,
-            @RequestBody ReviewRequest reviewRequest,
-            Authentication authentication
-    ) {
-        Long userId = validate.extractUserId(authentication);
-
-        reviewService.updateReview(
-                userId,
-                courseId,
-                reviewRequest
-        );
-
-        return ResponseEntity.ok("Successfully created review");
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/review/ReviewDto.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/review/ReviewDto.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,24 +1,0 @@
-package com.shifterwebapp.shifter.review;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.time.LocalDate;
-import java.util.Date;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class ReviewDto {
-
-    private Long id;
-
-    private Integer rating;
-
-    private String comment;
-
-    private LocalDate date;
-
-    private Integer enrollmentId;
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/review/ReviewMapper.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/review/ReviewMapper.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,19 +1,0 @@
-package com.shifterwebapp.shifter.review;
-
-import org.mapstruct.InheritInverseConfiguration;
-import org.mapstruct.Mapper;
-
-import java.util.List;
-
-@Mapper(componentModel = "spring")
-public interface ReviewMapper {
-
-    ReviewDto toDto(Review review);
-    List<ReviewDto> toDto(List<Review> review);
-
-    @InheritInverseConfiguration
-    Review toEntity(ReviewDto reviewDto);
-    @InheritInverseConfiguration
-    List<Review> toEntity(List<ReviewDto> reviewDtos);
-}
-
Index: ckend/src/main/java/com/shifterwebapp/shifter/review/ReviewRepository.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/review/ReviewRepository.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,31 +1,0 @@
-package com.shifterwebapp.shifter.review;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.data.repository.query.Param;
-
-import java.util.List;
-import java.util.Optional;
-
-public interface ReviewRepository extends JpaRepository<Review, Long> {
-
-    @Query("select AVG(r.rating) from Review r where r.enrollment.course.id = :courseId")
-    Double findAverageRatingByCourse(@Param("courseId") Long courseId);
-
-    @Query("select r from Review r where r.enrollment.course.id = :courseId")
-    List<Review> findReviewsByCourse(@Param("courseId") Long courseId);
-
-    @Query("select r from Review r where r.enrollment.payment.user.id = :userId")
-    List<Review> findReviewsByUser(@Param("userId") Long userId);
-
-    @Query("select r from Review r where r.enrollment.payment.user.id = :userId and r.enrollment.course.id = :courseId")
-    Optional<Review> findReviewByUserAndCourse(@Param("userId") Long userId, @Param("courseId") Long courseId);
-
-
-    @Query("select r from Review r where r.enrollment.id = :enrollmentId")
-    Review findReviewByEnrollment(Long enrollmentId);
-
-    @Query("select case when count(r) > 0 then true else false end" +
-            " from Review r where r.enrollment.payment.user.id = :userId and r.enrollment.course.id = :userId")
-    Boolean findHasBeenReviewedByUser(@Param("userId") Long userId, @Param("courseId") Long courseId);
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/review/ReviewRequest.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/review/ReviewRequest.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,13 +1,0 @@
-package com.shifterwebapp.shifter.review;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class ReviewRequest {
-    private Integer rating;
-    private String comment;
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/review/service/ImplReviewService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/review/service/ImplReviewService.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,21 +1,0 @@
-package com.shifterwebapp.shifter.review.service;
-
-import com.shifterwebapp.shifter.review.ReviewDto;
-import com.shifterwebapp.shifter.review.ReviewRequest;
-
-import java.util.List;
-
-public interface ImplReviewService {
-    ReviewDto getReviewById(Long id);
-    List<ReviewDto> getReviewsByCourse(Long courseId);
-    List<ReviewDto> getReviewsByUser(Long userId);
-    ReviewDto getReviewByUserAndCourse(Long userId, Long courseId);
-    ReviewDto getReviewByEnrollment(Long enrollmentId);
-    Double getAverageRatingByCourse(Long courseId);
-
-    ReviewDto writeReview(Long userId, Long courseId, ReviewRequest reviewRequest);
-
-    ReviewDto updateReview(Long userId, Long courseId, ReviewRequest reviewRequest);
-
-    Boolean hasBeenReviewedByUser(Long userId, Long courseId);
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/review/service/ReviewService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/review/service/ReviewService.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,124 +1,0 @@
-package com.shifterwebapp.shifter.review.service;
-
-import com.shifterwebapp.shifter.enrollment.Enrollment;
-import com.shifterwebapp.shifter.enrollment.EnrollmentRepository;
-import com.shifterwebapp.shifter.enums.EnrollmentStatus;
-import com.shifterwebapp.shifter.exception.AccessDeniedException;
-import com.shifterwebapp.shifter.exception.ResourceNotFoundException;
-import com.shifterwebapp.shifter.review.*;
-import com.shifterwebapp.shifter.Validate;
-import lombok.RequiredArgsConstructor;
-import org.springframework.stereotype.Service;
-
-import java.time.LocalDate;
-import java.util.List;
-import java.util.Optional;
-
-@Service
-@RequiredArgsConstructor
-public class ReviewService implements ImplReviewService {
-
-    private final ReviewRepository reviewRepository;
-    private final ReviewMapper reviewMapper;
-    private final Validate validate;
-    private final EnrollmentRepository enrollmentRepository;
-
-    @Override
-    public ReviewDto getReviewById(Long id) {
-        Review review = reviewRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException("Review with id " + id + " not found"));
-        return reviewMapper.toDto(review);
-    }
-
-    @Override
-    public List<ReviewDto> getReviewsByCourse(Long courseId) {
-        validate.validateCourseExists(courseId);
-        List<Review> reviews = reviewRepository.findReviewsByCourse(courseId);
-        return reviewMapper.toDto(reviews);
-    }
-
-    @Override
-    public List<ReviewDto> getReviewsByUser(Long userId) {
-        validate.validateUserExists(userId);
-        List<Review> reviews = reviewRepository.findReviewsByUser(userId);
-        return reviewMapper.toDto(reviews);
-    }
-
-    @Override
-    public ReviewDto getReviewByUserAndCourse(Long userId, Long courseId) {
-        validate.validateCourseExists(courseId);
-        validate.validateUserExists(userId);
-        Optional<Review> reviewOpt = reviewRepository.findReviewByUserAndCourse(userId, courseId);
-        if (reviewOpt.isEmpty()) {
-            throw new ResourceNotFoundException("Review not found for user with ID " + userId + " and course with ID " + courseId);
-        }
-        Review review = reviewOpt.get();
-        return reviewMapper.toDto(review);
-    }
-
-    @Override
-    public ReviewDto getReviewByEnrollment(Long enrollmentId) {
-        validate.validateEnrollmentExists(enrollmentId);
-        Review review = reviewRepository.findReviewByEnrollment(enrollmentId);
-        return reviewMapper.toDto(review);
-    }
-
-    @Override
-    public Double getAverageRatingByCourse(Long courseId) {
-        validate.validateCourseExists(courseId);
-        Double avgRating = reviewRepository.findAverageRatingByCourse(courseId);
-        return avgRating != null ? avgRating : 0f;
-    }
-
-    @Override
-    public ReviewDto writeReview(Long userId, Long courseId, ReviewRequest reviewRequest) {
-        validate.validateCourseExists(courseId);
-
-        Enrollment enrollment = enrollmentRepository.findEnrollmentByUserAndCourse(userId, courseId);
-        if (enrollment.getReview() != null) {
-            throw new IllegalStateException("Review already submitted for course with ID " + courseId + "!");
-        }
-        if (enrollment.getEnrollmentStatus() != EnrollmentStatus.COMPLETED) {
-            throw new AccessDeniedException("Cannot review a course that has not been completed by user!");
-        }
-
-        Review review = Review.builder()
-                .rating(reviewRequest.getRating())
-                .comment(reviewRequest.getComment())
-                .enrollment(enrollment)
-                .review_date(LocalDate.now())
-                .build();
-
-        reviewRepository.save(review);
-
-        return reviewMapper.toDto(review);
-    }
-
-    @Override
-    public ReviewDto updateReview(Long userId, Long courseId, ReviewRequest reviewRequest) {
-        validate.validateCourseExists(courseId);
-
-        Enrollment enrollment = enrollmentRepository.findEnrollmentByUserAndCourse(userId, courseId);
-        if (enrollment.getReview() == null) {
-            throw new IllegalStateException("Review hasn't been submitted for course with ID " + courseId + " so that it can be updated!");
-        }
-        if (enrollment.getEnrollmentStatus() != EnrollmentStatus.COMPLETED) {
-            throw new AccessDeniedException("Cannot review a course that has not been completed by user!");
-        }
-
-        Review review = reviewRepository.findReviewByEnrollment(enrollment.getId());
-        review.setRating(reviewRequest.getRating());
-        review.setComment(reviewRequest.getComment());
-        review.setReview_date(LocalDate.now());
-
-        reviewRepository.save(review);
-
-        return reviewMapper.toDto(review);
-    }
-
-    @Override
-    public Boolean hasBeenReviewedByUser(Long userId, Long courseId) {
-        validate.validateUserExists(userId);
-        validate.validateCourseExists(courseId);
-        return reviewRepository.findHasBeenReviewedByUser(userId, courseId);
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/scheduledemail/ScheduledEmail.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/scheduledemail/ScheduledEmail.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,34 +1,0 @@
-package com.shifterwebapp.shifter.scheduledemail;
-
-import jakarta.persistence.Entity;
-import jakarta.persistence.GeneratedValue;
-import jakarta.persistence.GenerationType;
-import jakarta.persistence.Id;
-import lombok.*;
-
-import java.time.LocalDateTime;
-
-@Getter
-@Setter
-@NoArgsConstructor
-@AllArgsConstructor
-@Builder
-@Entity
-@ToString
-public class ScheduledEmail {
-
-    @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
-    private Long id;
-
-    private String recipientEmail;
-
-    private LocalDateTime meetingDateTime;
-
-    private LocalDateTime scheduledDateTime;
-
-    private Boolean sent;
-
-    private String zoomLink;
-
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/scheduledemail/ScheduledEmailRepository.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/scheduledemail/ScheduledEmailRepository.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,12 +1,0 @@
-package com.shifterwebapp.shifter.scheduledemail;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-
-import java.util.List;
-
-public interface ScheduledEmailRepository extends JpaRepository<ScheduledEmail, Long> {
-
-    @Query("select se from ScheduledEmail se where se.sent = false and se.scheduledDateTime <= CURRENT_TIMESTAMP")
-    List<ScheduledEmail> findPendingEmails();
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/scheduledemail/ScheduledEmailService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/scheduledemail/ScheduledEmailService.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,22 +1,0 @@
-package com.shifterwebapp.shifter.scheduledemail;
-
-import lombok.RequiredArgsConstructor;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-
-@Service
-@RequiredArgsConstructor
-public class ScheduledEmailService {
-
-    private final ScheduledEmailRepository scheduledEmailRepository;
-
-    public List<ScheduledEmail> getPendingEmails() {
-        return scheduledEmailRepository.findPendingEmails();
-    }
-
-    public void saveScheduledEmail(ScheduledEmail email) {
-        scheduledEmailRepository.save(email);
-    }
-
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/sql/initializeCourse.sql
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/sql/initializeCourse.sql	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,418 +1,0 @@
-INSERT INTO course (title_short,
-                    title,
-                    description_short,
-                    description,
-                    description_long,
-                    difficulty,
-                    duration_minutes,
-                    price,
-                    image_url,
-                    color)
-VALUES ('Foundations for a Successful Business & Career',
-        'Building New Paradigm / Perception & Perspective as Foundations for a Successful Business and Professional Career',
-        'Understand how paradigms, perception, and perspective shape your business and career success.',
-        'Explore how paradigms shape your thinking, and how perception and perspective impact your professional and personal growth. In this course, you’ll uncover why shifting these mental models is crucial for unlocking new opportunities and overcoming hidden barriers. You’ll also learn how to use these concepts to build a resilient foundation that supports confident decision-making and continuous improvement in business and career contexts.',
-        'This comprehensive course deeply explores the powerful concepts of paradigms, perception, and perspective as they relate to business and professional growth. You''ll gain a thorough understanding of what paradigms are — deeply ingrained mental frameworks that shape how you interpret and interact with the world around you. You''ll learn how perception (your interpretation of external events) and perspective (your angle or approach) are interconnected and influence every decision and action you take. We examine common pitfalls that professionals encounter when they hold rigid paradigms or outdated perspectives, preventing them from adapting to change and seizing opportunities. Through practical exercises, real-life case studies, and reflective assessments, you''ll learn how to identify and reframe limiting paradigms to adopt a growth-oriented mindset that supports continuous improvement. You''ll explore advanced strategies to strengthen self-awareness and emotional intelligence, crucial skills for leadership and personal development. Additionally, we delve into subtle but critical differences between perception and perspective and how misalignment can undermine even the most skilled professionals. By the end of this course, you''ll have a robust framework for self-assessment and practical tools to shift your mental models, enhance decision-making, and achieve sustainable success in your business and career.',
-        'BEGINNER', 221, 0,
-        'https://res.cloudinary.com/dwlevfwtt/image/upload/v1751286550/Foundations_for_a_Successful_Business_Career_k8vcuu.jpg',
-        '#02C2FF'),
-
-       ('From Manager to Leader',
-        'From Manager to Leader: Empowering People, Managing Processes',
-        'Transform your managerial skills into effective leadership.',
-        'Learn how to shift from simply managing tasks to truly leading with purpose and clarity. In this course, you will explore leadership mindsets, communication strategies, and practical tools to empower your team, foster accountability, and create a motivating environment. You will also understand how to balance responsibility and delegation while cultivating a strong culture of trust and performance within your organization.',
-        'This course is designed for managers who aspire to become impactful leaders capable of driving both people and processes to success. You''ll learn about generative leadership and the 3xH''s model (Head, Heart, and Hands), which helps leaders balance logic, emotion, and action. Discover the fundamental differences between responsibility and guilt, and how to build a strong foundation for team accountability. The course covers vital communication strategies, effective feedback methods, and advanced delegation skills, ensuring that you empower rather than micromanage your team. You''ll explore leadership models like AB, Min/Max, and SMART objectives to clarify goals and expectations. Practical scenarios and real-world case studies will help you understand common challenges faced by managers as they step into leadership roles, including breaking organizational silos and fostering cross-functional collaboration. Additionally, you will learn how to mentor and develop future leaders, cultivate a culture of trust and innovation, and handle difficult conversations with grace. By the end, you''ll possess a complete toolkit to inspire, guide, and lead with confidence and authenticity, making you a true catalyst for organizational success.',
-        'INTERMEDIATE', 242, 29,
-        'https://res.cloudinary.com/dwlevfwtt/image/upload/v1751028999/From_Manager_to_Leader_-_Empowering_People_Managing_Processes_vgoyoh.webp',
-        '#19C6D6'),
-
-       ('Business Transformation Blueprint',
-        'Business Transformation Blueprint: Crafting the Path to Success',
-        'Design and implement successful business transformations.',
-        'Master a detailed, step-by-step framework designed to guide your business through structured, sustainable transformation. In this course, you will learn how to align teams around a clear purpose, engage middle management, establish effective KPIs, and implement change initiatives that ensure long-term resilience and growth. Discover how to create agile structures and overcome resistance to change with confidence.',
-        'This course serves as a complete roadmap for leaders and strategists who want to guide their organizations through impactful, sustainable transformation. You will learn how to recognize when transformation is necessary, understand its drivers, and define a clear purpose and direction. The program unpacks the six essential stages of transformation: from establishing a powerful purpose to developing robust KPIs that measure progress and success. You''ll explore the pivotal role middle management plays as both champions and gatekeepers of change, and how to effectively engage them in the process. Through detailed exploration of each transformation stage, you will understand the importance of sequential execution to avoid chaos and resistance. The course also emphasizes building agile and resilient organizational structures that can adapt to market changes while maintaining long-term stability and sustainability. Real-world examples and case studies provide insights into overcoming common pitfalls, such as stakeholder misalignment and cultural resistance. By integrating new paradigms and perspectives, you''ll empower your business to achieve unmatched levels of stability, agility, resilience, and sustainability. By the end, you''ll have the strategic and operational tools to design and execute transformative initiatives that create enduring business success.',
-        'ADVANCED', 239, 54,
-        'https://res.cloudinary.com/dwlevfwtt/image/upload/v1751028999/Business_Transformation_Blueprint_-_Crafting_the_Path_to_Success_aimssk.jpg',
-        '#1FB0C3'),
-
-       ('SME Business Roadmap',
-        'Business Roadmap for SME’s: A Step-by-Step Guide for Establishing Core Business Foundations for Sustainable Growth',
-        'Step-by-step guidance for SMEs to build solid business foundations.',
-        'Gain a practical, step-by-step approach to building strong business foundations for your SME. This course helps you navigate information overload, focus on what truly matters, and set up systems that promote stability, agility, and sustainable growth. You will also learn how to align your team around a shared vision and build long-term strategies that empower you to grow confidently and strategically.',
-        'In today''s information-saturated world, small and medium-sized enterprises often face an overwhelming number of business growth strategies, marketing advice, and conflicting success frameworks. This course is designed to eliminate that confusion and provide a structured, practical approach to building a solid business foundation. You''ll learn how to clearly define your purpose, align your team, and develop a strategic plan that ensures long-term success. The course introduces a new paradigm and expanded perspective to help you focus on what truly matters for sustainable growth. You''ll explore how to achieve stability, agility, resilience, and sustainability by applying tried-and-tested models and frameworks tailored for SMEs. Detailed modules will guide you through core business functions including operations, sales, marketing, finance, and HR, ensuring every area supports your overall strategic vision. You will also learn how to evaluate and improve organizational efficiency, establish clear KPIs, and build a culture of continuous improvement. Real-world case studies and hands-on exercises will help solidify these concepts, empowering you to navigate uncertainty with clarity and confidence. By the end, you''ll have a complete step-by-step guide to transform your SME into a thriving, future-proof business.',
-        'INTERMEDIATE', 165, 50,
-        'https://res.cloudinary.com/dwlevfwtt/image/upload/v1751028999/Business_Roadmap_for_SME_s_-_A_Step-by-Step_Guide_for_Establishing_Core_Business_Foundations_for_Sustainable_Growth_qeejox.jpg',
-        '#002E5D'),
-
-       ('Sales Masterclass',
-        'Sales Masterclass: Leadership, Communication, and Modern Sales Process',
-        'Master modern sales strategies, leadership, and communication.',
-        'Unlock a comprehensive roadmap to mastering modern sales processes, leadership, and communication. You will learn advanced techniques to build high-performance sales teams, foster synergy, improve negotiation outcomes, and cultivate a growth-focused mindset. This course empowers you to close deals confidently, inspire your team, and consistently exceed sales targets in a rapidly changing market.',
-        'This comprehensive sales masterclass is designed for professionals who want to stand out and excel in today''s dynamic and client-centric market. You''ll gain in-depth insights into the roles of frontline salespeople and sales leaders, understanding how to create synergy and high-performance teams. Learn the critical difference between being responsible and feeling guilty and how this affects your sales mindset and resilience. Explore how organizational silos negatively impact sales efficiency and how to overcome them to foster seamless collaboration. You''ll study advanced time management techniques tailored for sales environments, and understand what truly defines high-performance behaviors and results. The course covers essential negotiation strategies, modern communication techniques, and practical leadership tools like the AB model, helping you build stronger client relationships and close deals with greater success. Through practical examples, exercises, and case studies, you''ll develop a powerful mix of technical skills and soft skills necessary for outstanding sales performance. By the end of the course, you will have the confidence, strategic understanding, and practical tools to lead in sales, exceed targets consistently, and build a long-lasting, client-centered career.',
-        'ADVANCED', 240, 29,
-        'https://res.cloudinary.com/dwlevfwtt/image/upload/v1751028999/Sales_Masterclass_-_Leadership_Communication_and_Modern_Sales_Process_v74qdh.webp',
-        '#034D4C'),
-
-       ('Mastering Success Skills',
-        'From Good to Extraordinary: Mastering Skills for Success',
-        'Unlock your full potential with practical skills for extraordinary success.',
-        'Develop essential skills to move from being good to truly extraordinary in your personal and professional life. In this course, you’ll explore powerful frameworks for time management, decision-making, and expectation management, as well as cognitive and behavioral tools that enhance overall effectiveness. Learn how to create impactful habits, improve communication, and unlock new levels of personal growth and achievement.',
-        'This holistic course is designed for individuals and professionals who want to elevate their effectiveness, mindset, and results. You''ll explore essential topics such as perception, time management, managing expectations, and setting smart priorities. Through practical frameworks like the AB model, Min/Max analysis, SMART objectives, and the method of deduction, you''ll learn to improve decision-making, enhance efficiency, and boost overall performance. The course also emphasizes cognitive skills development, communication maturity, and how to handle high-pressure situations with confidence. You''ll master meeting productivity, strategic thinking, and personal effectiveness in real-world scenarios. By engaging in reflective exercises and practical activities, you''ll uncover hidden habits that limit your potential and replace them with proactive, empowering behaviors. Real-world case studies and success stories illustrate how these skills can transform your professional journey from merely good to truly extraordinary. By the end of this course, you will possess a robust toolkit for achieving outstanding results, strengthening relationships, and continuously advancing both personally and professionally.',
-        'INTERMEDIATE', 197, 35,
-        'https://res.cloudinary.com/dwlevfwtt/image/upload/v1751032528/From_Good_to_Extraordinary_-_Mastering_Skills_for_Success_fm0io9.webp',
-        '#D0B8A3'),
-
-       ('Winning Markets in 3 Steps',
-        'Winning Markets in 3 Steps: Building a Clear Go-to-Market Strategy',
-        'Build a clear, effective go-to-market strategy in just 3 steps.',
-        'Learn to build a clear and highly effective go-to-market strategy in three actionable steps. You will discover how to identify and understand your ideal client profile, define precise messaging, and choose the best channels to reach them. By applying practical tools and real-world examples, you’ll gain the confidence and clarity needed to succeed in even the most competitive markets.',
-        'Without a clear marketing strategy, businesses often drift without focus and waste resources. This course introduces a straightforward, three-step approach to creating a highly effective go-to-market strategy. You will learn how to define your ideal target client using eight key characteristics: needs, wants, expectations, challenges, fears, intentions, prejudices, and opportunities. Next, you will master how to determine the right timing, channels, and messaging to reach and engage your audience most effectively. The course includes strategic tools like the AB model and a quantitative negotiation method, enabling you to make data-driven and confident decisions. You will also explore how to build strong value propositions and design a compelling customer journey that increases conversion and loyalty. Real-world case studies and practical exercises will help you directly apply these concepts to your business. By the end of this course, you will have a clear, actionable, and winning strategy that strengthens market positioning, drives revenue, and supports long-term growth.',
-        'INTERMEDIATE', 206, 29,
-        'https://res.cloudinary.com/dwlevfwtt/image/upload/v1751028999/Winning_Markets_in_3_Steps_-_Building_a_Clear_Go-to-Market_Strategy_vayg15.png',
-        '#FF6F61'),
-
-       ('How to Create Added Value',
-        'Creating Added Value: How to Offer Solutions/Concepts, Instead of Services',
-        'Shift from selling services to offering impactful solutions and concepts.',
-        'Learn how to move beyond selling services and start offering impactful solutions and strategic concepts that create true value for your clients. This course helps you understand your clients'' real needs, develop offers that solve deeper problems, and position yourself as a trusted strategic partner. Gain the skills to design solutions that resonate and drive long-term business relationships.',
-        'In this course, you will learn how to move beyond selling services to providing impactful solutions and long-term concepts that generate true value. You will understand the critical differences between selling a service, providing a solution, and developing a concept — and why moving to solutions and concepts unlocks higher client loyalty and market differentiation. You will learn to deeply analyze your target audience, identify real problems they face, and design solutions that directly address those needs. The course covers techniques for developing strong value propositions, strategic storytelling, and crafting offers that resonate with clients on both functional and emotional levels. Using practical examples, including the iconic Nescafe Frape concept, you will see how theory transforms into actionable business models. You will also explore frameworks to ensure your solutions are scalable and sustainable, and how to create offers that position you as a strategic partner rather than just a service provider. By the end of this course, you will have a clear roadmap to build offers that inspire, engage, and create lasting value for your clients and your business.',
-        'INTERMEDIATE', 203, 29,
-        'https://res.cloudinary.com/dwlevfwtt/image/upload/v1751028999/Creating_Added_Value_-_How_to_Offer_SolutionsConcepts_Instead_of_Services_z9fs3c.png',
-        '#F5AD01'),
-
-       ('Seamless Onboarding Strategy',
-        'Onboarding Fundamentals: How to Successfully Incorporate New Employees',
-        'Master the essentials of onboarding to boost retention and employee satisfaction.',
-        'Discover how to design an onboarding experience that helps new employees integrate quickly and successfully into your organization. You’ll learn to create a structured onboarding plan that enhances engagement, clarifies expectations, and improves long-term retention. This course provides practical strategies and tools to ensure new hires feel confident, motivated, and fully prepared to contribute from day one.',
-        'Effective onboarding is essential for ensuring new employees feel confident, welcomed, and prepared to succeed. This course covers how to build a structured onboarding journey that integrates new hires smoothly into your company culture and operational workflow. You will learn to design clear role expectations, create pre-boarding materials, and organize first-week activities that build strong initial connections. The course also provides strategies for extending onboarding beyond the first weeks to reinforce learning, encourage engagement, and foster long-term retention. You will explore templates and feedback loops that help continuously improve the onboarding process. By using real-world examples and practical exercises, you will be able to avoid common pitfalls that lead to disengagement and turnover. By the end, you will have the skills and resources to design a seamless onboarding experience that strengthens employee satisfaction, boosts retention, and supports overall organizational success.',
-        'BEGINNER', 141, 25,
-        'https://res.cloudinary.com/dwlevfwtt/image/upload/v1751028999/Onboarding_Fundamentals_-_How_to_Successfully_Incorporate_New_Employees_bksbad.png',
-        '#008CC2'),
-
-       ('Growth Through Self-Assessment',
-        'Professional Self-Assessment: Identify Barriers Holding You Back & Areas for Improvement',
-        'Use self-assessment tools to unlock growth and overcome personal barriers.',
-        'Unlock your growth potential by learning to evaluate your strengths and weaknesses using proven self-assessment methods. This course guides you through frameworks for understanding what holds you back, helps you set actionable improvement goals, and empowers you to create a roadmap for professional and personal development. Gain clarity and build the confidence needed to achieve sustained growth.',
-        'This course provides a step-by-step approach to understanding and improving your professional effectiveness. You will explore self-assessment techniques such as performance evaluations, needs analysis, and the method of deduction to uncover hidden patterns in your behavior and mindset. The course emphasizes practical applications that help you turn self-reflection into actionable growth strategies. You will learn how to identify barriers holding you back, develop clear action plans to overcome them, and set measurable goals for continuous improvement. Additionally, you will explore the importance of seeking feedback from peers and mentors to enhance self-awareness and accountability. Through exercises, case studies, and personal reflection, you will gain the tools to improve decision-making, boost confidence, and advance your career more strategically. By the end of the course, you will have a comprehensive self-development roadmap, empowering you to achieve personal and professional breakthroughs and realize your full potential.',
-        'BEGINNER', 154, 25,
-        'https://res.cloudinary.com/dwlevfwtt/image/upload/v1751028999/Professional_Self-Assessment_-_Identify_Barriers_Holding_You_Back_Areas_for_Improvement_tiyydc.jpg',
-        '#CC6232'),
-
-       ('Business Excellence Blueprint',
-        'Establishing Continuous Business Excellence in Your Company',
-        'Create a high-performance culture through proven excellence frameworks.',
-        'Discover how to embed operational excellence and continuous improvement deeply into your organization. Learn to align teams, set impactful goals, streamline communication, and create systems that support high performance and growth. This course equips you with practical models and real-world strategies to build a culture of excellence that drives long-term competitive advantage.',
-        'This course is designed to help leaders and professionals embed a culture of excellence and continuous improvement across their organizations. You will explore powerful models including the Effective Meetings Model, AB model, DF model, and pre/post evaluation frameworks to improve alignment and accountability. The course guides you through mapping organizational disproportions, streamlining communication, and fostering cross-functional collaboration. You will learn to set clear goals, establish robust KPIs, and create feedback loops that reinforce progress and drive sustained success. Real-world examples and case studies show how to navigate resistance to change and build momentum for new initiatives. You will also develop strategies for ensuring long-term adoption of excellence practices and integrating them into the daily rhythm of the organization. By the end of the course, you will possess the mindset, frameworks, and tools needed to transform your organization into a resilient, agile, and continuously improving enterprise, capable of maintaining a competitive edge in any market.',
-        'ADVANCED', 161, 39,
-        'https://res.cloudinary.com/dwlevfwtt/image/upload/v1751028998/Establishing_Continuous_Business_Excellence_in_Your_Company_g3yvao.png',
-        '#18898D'),
-
-       ('Organizational Success Through Structure',
-        'High-Performing Teams and Systems: Organizational Success Through Structure',
-        'Build efficient, structured teams and systems that drive sustainable organizational success.',
-        'Learn to build strong, structured teams and efficient systems that drive organizational success and growth. This course teaches you how to break down silos, improve collaboration, clarify team roles, and establish accountability structures. Gain the skills to design organizational systems that promote agility, optimize performance, and create a foundation for long-term sustainability and resilience.',
-        'This course provides a comprehensive guide to creating high-performing teams and building structured systems that drive organizational success. You will learn how to develop systematic approaches to team design, clarify roles and responsibilities, and eliminate inefficiencies caused by miscommunication and silos. The course covers essential practices for aligning teams with organizational goals, improving collaboration, and establishing strong accountability mechanisms. You will also explore frameworks for effective meetings, conflict resolution, and strategic decision-making that help maintain cohesion and high performance. Using practical exercises and case studies, you will learn to diagnose structural bottlenecks and design solutions that enable scalability and agility. By the end, you will have the knowledge and skills to build robust organizational structures that support continuous improvement, empower teams to excel, and sustain competitive advantage in a dynamic business environment.',
-        'INTERMEDIATE', 165, 32,
-        'https://res.cloudinary.com/dwlevfwtt/image/upload/v1751028999/High-Performing_Teams_and_Systems_-_Organizational_Success_Through_Structure_b6jvm5.jpg',
-        '#FF9503');
-
-
-INSERT INTO course_skills_gained (course_id, skills_gained)
-VALUES
--- 1. Building New Paradigm / Perception & Perspective
-(1, 'PARADIGM_UNDERSTANDING'),
-(1, 'PERCEPTION_MANAGEMENT'),
-(1, 'PERSPECTIVE_SHIFTING'),
-
--- 2. From Manager to Leader
-(2, 'LEADERSHIP'),
-(2, 'DELEGATION'),
-(2, 'DECISION_MAKING'),
-(2, 'PEOPLE_MANAGEMENT'),
-
--- 3. Business Transformation Blueprint
-(3, 'STRATEGIC_PLANNING'),
-(3, 'CHANGE_MANAGEMENT'),
-(3, 'PROJECT_MANAGEMENT'),
-(3, 'RISK_MANAGEMENT'),
-
--- 4. Business Roadmap for SME’s
-(4, 'BUSINESS_MODEL_CREATION'),
-(4, 'STRATEGIC_THINKING'),
-(4, 'OPERATION_MANAGEMENT'),
-
--- 5. Sales Masterclass
-(5, 'SALES'),
-(5, 'COMMUNICATION'),
-(5, 'NEGOTIATION'),
-(5, 'LEADERSHIP'),
-
--- 6. From Good to Extraordinary
-(6, 'COMMUNICATION'),
-(6, 'DECISION_MAKING'),
-(6, 'CRITICAL_THINKING'),
-(6, 'EMOTIONAL_INTELLIGENCE'),
-
--- 7. Winning Markets in 3 Steps
-(7, 'MARKETING'),
-(7, 'SALES'),
-(7, 'STRATEGIC_THINKING'),
-
--- 8. Creating Added Value
-(8, 'OPPORTUNITY_IDENTIFICATION'),
-(8, 'INNOVATION_MANAGEMENT'),
-(8, 'MARKETING'),
-
--- 9. Onboarding Fundamentals
-(9, 'PEOPLE_MANAGEMENT'),
-(9, 'TEAM_BUILDING'),
-(9, 'COMMUNICATION'),
-
--- 10. Professional Self-Assessment
-(10, 'EMOTIONAL_INTELLIGENCE'),
-(10, 'CRITICAL_THINKING'),
-(10, 'COMMUNICATION'),
-
--- 11. Establishing Continuous Business Excellence
-(11, 'PROJECT_MANAGEMENT'),
-(11, 'PERFORMANCE_EVALUATION'),
-(11, 'CHANGE_MANAGEMENT'),
-(11, 'STRATEGIC_PLANNING'),
-
--- 12. High-Performing Teams and Systems
-(12, 'TEAM_BUILDING'),
-(12, 'OPERATION_MANAGEMENT'),
-(12, 'PEOPLE_MANAGEMENT'),
-(12, 'PERFORMANCE_EVALUATION');
-
-
-INSERT INTO course_topics_covered (course_id, topics_covered)
-VALUES
--- 1. Building New Paradigm / Perception & Perspective
-(1, 'PARADIGM_CONCEPTS'),
-(1, 'PERCEPTION_AND_PERSPECTIVE'),
-(1, 'BUSINESS_AND_CAREER_FOUNDATIONS'),
-
--- 2. From Manager to Leader
-(2, 'LEADERSHIP'),
-(2, 'MANAGEMENT'),
-(2, 'COMMUNICATION'),
-(2, 'TEAM_DEVELOPMENT'),
-(2, 'DECISION_MAKING'),
-
--- 3. Business Transformation Blueprint
-(3, 'BUSINESS_TRANSFORMATION'),
-(3, 'DIGITAL_TRANSFORMATION'),
-(3, 'CHANGE_MANAGEMENT'),
-(3, 'STRATEGIC_PLANNING'),
-(3, 'AGILITY'),
-
--- 4. Business Roadmap for SME’s
-(4, 'ENTREPRENEURSHIP'),
-(4, 'STARTUP_METHODS'),
-(4, 'BUSINESS_TRANSFORMATION'),
-(4, 'STRATEGIC_PLANNING'),
-(4, 'OPERATIONAL_EXCELLENCE'),
-
--- 5. Sales Masterclass
-(5, 'SALES_STRATEGIES'),
-(5, 'NEGOTIATION'),
-(5, 'LEADERSHIP'),
-(5, 'COMMUNICATION'),
-(5, 'CLIENT_RELATIONSHIPS'),
-
--- 6. From Good to Extraordinary
-(6, 'PERSONAL_GROWTH'),
-(6, 'LEADERSHIP'),
-(6, 'COMMUNICATION'),
-(6, 'TIME_MANAGEMENT'),
-(6, 'DECISION_MAKING'),
-
--- 7. Winning Markets in 3 Steps
-(7, 'SALES_STRATEGIES'),
-(7, 'VALUE_CREATION'),
-(7, 'MARKETING'),
-(7, 'GO_TO_MARKET_STRATEGY'),
-(7, 'CLIENT_TARGETING'),
-
--- 8. Creating Added Value
-(8, 'MARKETING'),
-(8, 'SALES'),
-(8, 'VALUE_CREATION'),
-(8, 'BUSINESS_INNOVATION'),
-(8, 'CLIENT_TARGETING'),
-
--- 9. Onboarding Fundamentals
-(9, 'HR'),
-(9, 'MANAGEMENT'),
-(9, 'LEADERSHIP'),
-(9, 'CULTURE_INTEGRATION'),
-(9, 'TEAM_OPTIMIZATION'),
-
--- 10. Professional Self-Assessment
-(10, 'PERSONAL_GROWTH'),
-(10, 'LEADERSHIP'),
-(10, 'SELF_AWARENESS'),
-(10, 'PERFORMANCE_IMPROVEMENT'),
-(10, 'TIME_MANAGEMENT'),
-
--- 11. Establishing Continuous Business Excellence
-(11, 'MANAGEMENT'),
-(11, 'TIME_MANAGEMENT'),
-(11, 'BUSINESS_TRANSFORMATION'),
-(11, 'CONTINUOUS_IMPROVEMENT'),
-(11, 'STRATEGIC_PLANNING'),
-(11, 'AGILITY'),
-
--- 12. High-Performing Teams and Systems
-(12, 'MANAGEMENT'),
-(12, 'LEADERSHIP'),
-(12, 'BUSINESS_TRANSFORMATION'),
-(12, 'TEAM_OPTIMIZATION'),
-(12, 'SYSTEM_DESIGN');
-
-INSERT INTO course_what_will_be_learned (course_id, what_will_be_learned)
-VALUES
--- 1. Building New Paradigm / Perception & Perspective
-(1, 'Understand how paradigms shape your business and personal decisions.'),
-(1, 'Learn to identify limiting beliefs and reframe them for growth.'),
-(1, 'Explore the differences between perception and perspective and their impact.'),
-(1, 'Develop skills to challenge and shift outdated mental models.'),
-(1, 'Enhance emotional intelligence and self-awareness for leadership success.'),
-(1, 'Adopt a growth-oriented mindset to unlock new opportunities.'),
-(1, 'Build resilience through deeper self-understanding and perspective shifts.'),
-(1, 'Apply practical tools to improve decision-making and personal growth.'),
-(1, 'Strengthen your ability to adapt and thrive in changing environments.'),
-(1, 'Create a personal framework for continuous improvement and success.'),
-
--- 2. From Manager to Leader
-(2, 'Transition from task-focused management to inspiring leadership.'),
-(2, 'Learn how to empower and motivate diverse teams.'),
-(2, 'Master effective delegation to build trust and accountability.'),
-(2, 'Strengthen communication and feedback skills for team alignment.'),
-(2, 'Understand the balance between responsibility and guilt in leadership.'),
-(2, 'Develop coaching and mentoring skills for future leaders.'),
-(2, 'Create a culture of trust, innovation, and high performance.'),
-(2, 'Handle difficult conversations with confidence and empathy.'),
-(2, 'Break organizational silos to foster collaboration.'),
-(2, 'Use strategic models to set clear objectives and drive results.'),
-
--- 3. Business Transformation Blueprint
-(3, 'Identify when and why business transformation is necessary.'),
-(3, 'Establish a clear purpose and strategic direction for change.'),
-(3, 'Develop and implement effective KPIs to measure progress.'),
-(3, 'Engage middle management as champions of transformation.'),
-(3, 'Overcome resistance and ensure stakeholder alignment.'),
-(3, 'Design agile organizational structures for long-term success.'),
-(3, 'Sequence transformation stages to avoid chaos and confusion.'),
-(3, 'Build resilience and adaptability within the organization.'),
-(3, 'Learn from real-world case studies and practical frameworks.'),
-(3, 'Create a sustainable roadmap for continuous improvement and growth.'),
-
--- 4. Business Roadmap for SME’s
-(4, 'Define a clear and compelling business purpose for your SME.'),
-(4, 'Align your team around shared goals and a unified vision.'),
-(4, 'Develop strategic plans focused on sustainable growth.'),
-(4, 'Set up practical systems to support stability and agility.'),
-(4, 'Integrate core functions like marketing, sales, and finance effectively.'),
-(4, 'Establish clear KPIs and performance measurement tools.'),
-(4, 'Foster a culture of continuous improvement and adaptability.'),
-(4, 'Simplify decision-making in an information-overloaded environment.'),
-(4, 'Learn to navigate uncertainty with confidence and clarity.'),
-(4, 'Build a long-term strategy for a future-proof business foundation.'),
-
--- 5. Sales Masterclass
-(5, 'Master modern sales processes and high-impact selling techniques.'),
-(5, 'Understand the dynamics between salespeople and sales leaders.'),
-(5, 'Foster synergy and high performance within sales teams.'),
-(5, 'Improve negotiation outcomes through strategic communication.'),
-(5, 'Overcome silos to create seamless customer experiences.'),
-(5, 'Build a resilient and growth-focused sales mindset.'),
-(5, 'Strengthen time management specifically for sales contexts.'),
-(5, 'Develop stronger client relationships for long-term success.'),
-(5, 'Leverage advanced leadership models to inspire sales teams.'),
-(5, 'Consistently exceed sales targets in dynamic market environments.'),
-
--- 6. From Good to Extraordinary
-(6, 'Develop a growth mindset to elevate personal and professional success.'),
-(6, 'Master time management and priority-setting for higher productivity.'),
-(6, 'Enhance decision-making skills through practical frameworks.'),
-(6, 'Cultivate impactful habits that drive extraordinary results.'),
-(6, 'Strengthen communication and interpersonal effectiveness.'),
-(6, 'Navigate high-pressure situations with confidence and control.'),
-(6, 'Identify and transform limiting behaviors and mindsets.'),
-(6, 'Apply cognitive and behavioral tools for continuous improvement.'),
-(6, 'Learn to run effective meetings and manage expectations.'),
-(6, 'Build a strategic approach to achieve outstanding long-term outcomes.'),
-
--- 7. Winning Markets in 3 Steps
-(7, 'Define and analyze your ideal target client profile precisely.'),
-(7, 'Craft clear and compelling messaging tailored to your audience.'),
-(7, 'Select the most effective channels to reach your clients.'),
-(7, 'Build a strong value proposition that resonates and converts.'),
-(7, 'Design a compelling customer journey for improved engagement.'),
-(7, 'Apply strategic tools to support data-driven marketing decisions.'),
-(7, 'Develop a clear and actionable go-to-market roadmap.'),
-(7, 'Strengthen market positioning for competitive advantage.'),
-(7, 'Increase conversion rates and build client loyalty effectively.'),
-(7, 'Gain the confidence to launch and scale successful market strategies.'),
-
--- 8. Creating Added Value
-(8, 'Understand the differences between services, solutions, and concepts.'),
-(8, 'Analyze client needs to design impactful solutions.'),
-(8, 'Develop offers that create long-term client loyalty.'),
-(8, 'Craft strong value propositions and strategic storytelling.'),
-(8, 'Position yourself as a trusted strategic partner, not just a service provider.'),
-(8, 'Ensure your offers are scalable and sustainable over time.'),
-(8, 'Learn frameworks to transition from services to solutions.'),
-(8, 'Master concept-based selling to stand out in the market.'),
-(8, 'Incorporate practical examples like the Nescafe Frape concept.'),
-(8, 'Build offers that resonate emotionally and functionally with clients.'),
-
--- 9. Onboarding Fundamentals
-(9, 'Design effective onboarding experiences tailored to each role.'),
-(9, 'Create pre-boarding materials to prepare new hires early.'),
-(9, 'Organize first-week activities that build strong connections.'),
-(9, 'Clarify expectations and reduce early-stage confusion.'),
-(9, 'Foster engagement and motivation from day one.'),
-(9, 'Extend onboarding to reinforce learning and integration.'),
-(9, 'Implement feedback loops to improve onboarding processes.'),
-(9, 'Avoid common pitfalls that cause disengagement and turnover.'),
-(9, 'Strengthen employee satisfaction and long-term retention.'),
-(9, 'Build a foundation for confident, productive new team members.'),
-
--- 10. Professional Self-Assessment
-(10, 'Use self-assessment techniques to identify personal barriers.'),
-(10, 'Transform self-reflection into actionable improvement plans.'),
-(10, 'Develop clear and measurable growth objectives.'),
-(10, 'Improve decision-making through deeper self-awareness.'),
-(10, 'Seek constructive feedback to enhance accountability.'),
-(10, 'Build confidence and advance your career strategically.'),
-(10, 'Turn hidden patterns into opportunities for growth.'),
-(10, 'Design a personalized self-development roadmap.'),
-(10, 'Strengthen both professional and personal resilience.'),
-(10, 'Achieve breakthroughs by aligning mindset and action.'),
-
--- 11. Establishing Continuous Business Excellence
-(11, 'Embed a culture of excellence across your organization.'),
-(11, 'Align teams using clear goals and accountability models.'),
-(11, 'Streamline communication to improve collaboration and results.'),
-(11, 'Apply powerful frameworks to drive continuous improvement.'),
-(11, 'Establish robust KPIs and feedback loops for growth.'),
-(11, 'Overcome resistance to change and build momentum.'),
-(11, 'Navigate structural challenges to maintain agility.'),
-(11, 'Integrate excellence practices into daily business rhythm.'),
-(11, 'Create systems that support sustainable high performance.'),
-(11, 'Transform your organization into a competitive, resilient enterprise.'),
-
--- 12. High-Performing Teams and Systems
-(12, 'Design structured, high-performing teams that drive success.'),
-(12, 'Clarify team roles and eliminate organizational silos.'),
-(12, 'Improve cross-functional collaboration for better outcomes.'),
-(12, 'Establish strong accountability systems and performance metrics.'),
-(12, 'Develop effective conflict resolution and meeting frameworks.'),
-(12, 'Optimize systems for scalability and organizational agility.'),
-(12, 'Diagnose and solve structural bottlenecks.'),
-(12, 'Align team structures with strategic organizational goals.'),
-(12, 'Create sustainable systems to support long-term growth.'),
-(12, 'Empower teams to continuously improve and excel.');
Index: ckend/src/main/java/com/shifterwebapp/shifter/sql/initializeCourseContent.sql
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/sql/initializeCourseContent.sql	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,585 +1,0 @@
-
--- Foundations for a Successful Business & Career
-INSERT INTO course_content (title, position, course_id)
-VALUES
-    ('Understanding Paradigms & Mental Frameworks', 1, 1),
-    ('Exploring Perception and Perspective', 2, 1),
-    ('Transforming Mindsets for Growth', 3, 1);
-
-INSERT INTO course_lecture (content_text, content_type, content_file_name, description, duration_minutes, position, title, course_content_id)
-VALUES
-    -- Understanding Paradigms & Mental Frameworks (course_content_id: 1)
-    (NULL, 'VIDEO', 'https://www.youtube.com/watch?v=aeBaSrJmTMk&list=RDaeBaSrJmTMk&start_radio=1&ab_channel=AVAIONVEVO',
-     'Users will gain a deep understanding of paradigms and their role in shaping mental frameworks that drive daily decision-making. This video covers how paradigms form, their impact on success, and strategies to identify limiting beliefs. You will learn to recognize your own paradigms and leverage them for professional growth. Action: Watch the video and list three paradigms influencing your decisions.',
-     20, 1, 'Introduction to Paradigms and Mental Frameworks for Success', 1),
-    ('Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industrys standard dummy text ever since the 1500s.',
-     'TEXT', NULL,
-     'Users will discover how paradigms shape decision-making in business and personal contexts. This article covers common paradigm types, their effects on behavior, and methods to reframe limiting paradigms. You will gain insights into adapting mental models for better outcomes. Action: Reflect on your mental models and write a summary of one paradigm you wish to change.',
-     15, 2, 'Understanding How Paradigms Influence Decision-Making', 1),
-    (NULL, 'FILE', 'https://drive.google.com/file/d/14LBFO5sNWu7P3L8Co-MeGUxMbg7fhC76/view?usp=drive_link',
-     'Users will acquire tools to identify and assess their current paradigms through this worksheet. It provides exercises to pinpoint paradigms that help or hinder progress and offers strategies to reframe them. You will learn to create actionable plans for paradigm shifts. Action: Complete the worksheet and discuss findings with a peer before the next session.',
-     18, 3, 'Worksheet for Identifying and Reframing Paradigms', 1),
-    (NULL, 'QUIZ', 'https://www.britannica.com/games/sudoku',
-     'Users will test their understanding of paradigms and mental frameworks through this interactive quiz. It covers key concepts like paradigm formation and reframing techniques, helping you assess your grasp of these ideas. You will gain clarity on areas for improvement. Action: Complete the quiz and review incorrect answers to enhance your knowledge.',
-     15, 4, 'Interactive Quiz on Paradigms and Mental Frameworks', 1),
-
-    -- Exploring Perception and Perspective (course_content_id: 2)
-    (NULL, 'VIDEO', 'https://www.youtube.com/watch?v=aeBaSrJmTMk&list=RDaeBaSrJmTMk&start_radio=1&ab_channel=AVAIONVEVO',
-     'Users will learn the critical differences between perception and perspective in leadership and business settings. This video covers their influence on decision-making, team dynamics, and strategic planning, with real-world examples. You will gain skills to apply these concepts effectively. Action: Watch the video and note two examples of how perception or perspective shapes your decisions.',
-     22, 1, 'Exploring Perception and Perspective in Leadership and Business', 2),
-    ('Lorem Ipsum is simply dummy text of the printing and typesetting industry.',
-     'TEXT', NULL,
-     'Users will understand how perception and perspective shape professional interactions and outcomes. This article covers their psychological and practical aspects, conflict resolution techniques, and perspective-shifting strategies. You will gain tools to improve collaboration and results. Action: Reflect on a recent interaction and identify how your perspective influenced the outcome.',
-     14, 2, 'Deep Dive into Perception and Perspective in Professional Interactions', 2),
-    (NULL, 'FILE', 'https://drive.google.com/file/d/14LBFO5sNWu7P3L8Co-MeGUxMbg7fhC76/view?usp=drive_link',
-     'Users will identify gaps in their perception and perspective using this worksheet. It provides exercises to realign perspectives with professional goals and foster collaboration. You will learn to create actionable realignment strategies. Action: Complete the worksheet and discuss findings in a group setting.',
-     16, 3, 'Worksheet for Realigning Perspectives with Professional Goals', 2),
-    (NULL, 'QUIZ', 'https://www.britannica.com/games/sudoku',
-     'Users will assess their knowledge of perception and perspective concepts through this quiz. It covers distinctions, applications, and common pitfalls, providing feedback on your understanding. You will gain insights into areas for improvement. Action: Complete the quiz and review results to refine your approach.',
-     18, 4, 'Interactive Quiz on Perception and Perspective Concepts', 2),
-
-    -- Transforming Mindsets for Growth (course_content_id: 3)
-    (NULL, 'VIDEO', 'https://www.youtube.com/watch?v=aeBaSrJmTMk&list=RDaeBaSrJmTMk&start_radio=1&ab_channel=AVAIONVEVO',
-     'Users will acquire practical steps to transform their mindset for growth and adaptability in professional settings. This video covers reframing challenges, embracing feedback, and cultivating resilience, with case studies. You will gain actionable strategies for a growth mindset. Action: Watch the video and practice one mindset transformation technique this week.',
-     25, 1, 'Practical Steps for Transforming Mindsets to Achieve Growth', 3),
-    ('Lorem Ipsum is simply dummy text of the printing and typesetting industry.',
-     'TEXT', NULL,
-     'Users will learn how to shift mental models for success in business and career through this guide. It covers adopting a growth mindset, overcoming fixed mindset barriers, and integrating new habits. You will gain insights into sustainable mindset changes. Action: Implement one practice and track its impact for one week.',
-     16, 2, 'Comprehensive Guide to Shifting Mental Models for Success', 3),
-    (NULL, 'FILE', 'https://drive.google.com/file/d/14LBFO5sNWu7P3L8Co-MeGUxMbg7fhC76/view?usp=drive_link',
-     'Users will track mindset changes and progress toward a growth-oriented approach using this workbook. It provides templates for goal-setting, reflecting on challenges, and evaluating outcomes. You will learn to maintain consistent progress. Action: Update the workbook regularly and review progress monthly.',
-     20, 3, 'Workbook for Tracking Mindset Changes and Progress', 3),
-    (NULL, 'QUIZ', 'https://www.britannica.com/games/sudoku',
-     'Users will test their understanding of mindset transformation techniques through this quiz. It covers practical implementation and key concepts, helping you identify growth areas. You will gain feedback to solidify your learning. Action: Complete the quiz and review answers to enhance your knowledge.',
-     22, 4, 'Final Quiz on Mindset Transformation Techniques', 3);
-
--- From Manager to Leader
-INSERT INTO course_content (title, position, course_id)
-VALUES
-    ('Leadership Mindsets & Models', 1, 2),
-    ('Communication & Delegation Mastery', 2, 2),
-    ('Building Accountability & Trust', 3, 2),
-    ('Navigating Organizational Change', 4, 2);
-
-INSERT INTO course_lecture (content_text, content_type, content_file_name, description, duration_minutes, position, title, course_content_id)
-VALUES
-    -- Leadership Mindsets & Models (course_content_id: 4)
-    (NULL, 'VIDEO', 'https://www.youtube.com/watch?v=aeBaSrJmTMk&list=RDaeBaSrJmTMk&start_radio=1&ab_channel=AVAIONVEVO',
-     'Users will gain insights into leadership mindsets, including the 3xH’s framework (Head, Heart, Hands), and their role in effective leadership. This video covers how these mindsets differentiate managers from leaders, with real-world examples. You will learn to cultivate impactful leadership traits. Action: Watch the video and identify one 3xH trait to focus on this week.',
-     23, 1, 'Introduction to Leadership Mindsets and the 3xH Framework', 4),
-    ('Lorem Ipsum is simply dummy text of the printing and typesetting industry.',
-     'TEXT', NULL,
-     'Users will understand generative leadership and models like AB and SMART objectives through this article. It covers their applications in strategic decision-making and team success. You will gain tools to apply leadership frameworks effectively. Action: Study the article and apply one model to a current project.',
-     18, 2, 'Exploring Generative Leadership and Key Models for Success', 4),
-    (NULL, 'FILE', 'https://drive.google.com/file/d/14LBFO5sNWu7P3L8Co-MeGUxMbg7fhC76/view?usp=drive_link',
-     'Users will assess their leadership strengths and development areas using this worksheet. It provides exercises to evaluate alignment with leadership models and identify growth opportunities. You will learn to create targeted development plans. Action: Complete the worksheet and reflect on your results.',
-     15, 3, 'Self-Assessment Worksheet for Leadership Strengths', 4),
-
-    -- Communication & Delegation Mastery (course_content_id: 5)
-    (NULL, 'VIDEO', 'https://www.youtube.com/watch?v=aeBaSrJmTMk&list=RDaeBaSrJmTMk&start_radio=1&ab_channel=AVAIONVEVO',
-     'Users will master communication strategies and delegation techniques for leadership through this video. It covers assigning tasks clearly, motivating teams, and avoiding delegation pitfalls, with examples. You will gain skills to enhance leadership through communication. Action: Watch the video and practice one delegation scenario with your team.',
-     24, 1, 'Mastering Communication and Delegation Techniques for Leaders', 5),
-    ('Lorem Ipsum is simply dummy text of the printing and typesetting industry.',
-     'TEXT', NULL,
-     'Users will learn to balance responsibility and guilt in leadership communication through this article. It covers active listening, feedback delivery, and empathetic interaction strategies. You will gain tools to refine your communication style. Action: Reflect on your communication style and practice one technique this week.',
-     14, 2, 'Balancing Responsibility in Leadership Communication', 5),
-    (NULL, 'FILE', 'https://drive.google.com/file/d/14LBFO5sNWu7P3L8Co-MeGUxMbg7fhC76/view?usp=drive_link',
-     'Users will streamline task assignment with this delegation checklist and templates. It provides tools to enhance team efficiency and accountability through structured processes. You will learn to implement effective delegation strategies. Action: Use the templates to delegate a task and review the outcome.',
-     12, 3, 'Delegation Checklists and Templates for Effective Task Management', 5),
-    (NULL, 'QUIZ', 'https://www.britannica.com/games/sudoku',
-     'Users will test their knowledge of leadership communication and delegation principles through this quiz. It covers strategies, challenges, and best practices, providing feedback on your skills. You will gain insights into areas for improvement. Action: Complete the quiz and review results to enhance your approach.',
-     18, 4, 'Interactive Quiz on Leadership Communication and Delegation', 5),
-
-    -- Building Accountability & Trust (course_content_id: 6)
-    (NULL, 'VIDEO', 'https://www.youtube.com/watch?v=aeBaSrJmTMk&list=RDaeBaSrJmTMk&start_radio=1&ab_channel=AVAIONVEVO',
-     'Users will learn to build accountability and trust within teams through this video. It covers transparent communication, consistent follow-through, and real-world examples of trust-building strategies. You will gain actionable steps to foster a reliable team culture. Action: Watch the video and implement one trust-building strategy with your team.',
-     22, 1, 'Strategies for Building Accountability and Trust in Teams', 6),
-    ('Lorem Ipsum is simply dummy text of the printing and typesetting industry.',
-     'TEXT', NULL,
-     'Users will understand the difference between responsibility and guilt in fostering accountability through this article. It provides frameworks for setting expectations and maintaining trust. You will gain tools to create a supportive team environment. Action: Read the article and discuss one framework with your team.',
-     16, 2, 'Fostering Accountability and Trust in Team Dynamics', 6),
-    (NULL, 'FILE', 'https://drive.google.com/file/d/14LBFO5sNWu7P3L8Co-MeGUxMbg7fhC76/view?usp=drive_link',
-     'Users will build accountability within teams using this worksheet. It provides templates for setting expectations and tracking progress, helping you strengthen team trust. You will learn to implement accountability systems. Action: Fill out the worksheet with your team and review progress.',
-     15, 3, 'Worksheet for Building Accountability Frameworks in Teams', 6),
-
-    -- Navigating Organizational Change (course_content_id: 7)
-    (NULL, 'VIDEO', 'https://www.youtube.com/watch?v=aeBaSrJmTMk&list=RDaeBaSrJmTMk&start_radio=1&ab_channel=AVAIONVEVO',
-     'Users will learn strategies for navigating organizational change and breaking silos through this video. It covers aligning teams, managing resistance, and fostering collaboration, with case studies. You will gain skills to lead change initiatives successfully. Action: Watch the video and prepare one change management strategy for your organization.',
-     28, 1, 'Navigating Organizational Change and Breaking Silos', 7),
-    ('Lorem Ipsum is simply dummy text of the printing and typesetting industry.',
-     'TEXT', NULL,
-     'Users will discover steps to engage middle management and foster collaboration during organizational change. This article covers frameworks for managing transitions and aligning teams with new goals. You will gain tools to implement effective change strategies. Action: Apply one step to a current change initiative.',
-     20, 2, 'Engaging Teams for Effective Organizational Change Management', 7),
-    (NULL, 'QUIZ', 'https://www.britannica.com/games/sudoku',
-     'Users will assess their knowledge of change management and organizational dynamics through this quiz. It covers collaboration strategies and resistance management, providing feedback on your understanding. You will gain insights into areas for improvement. Action: Complete the quiz and review results to refine your approach.',
-     17, 3, 'Interactive Quiz on Change Management and Organizational Dynamics', 7);
-
--- Business Transformation Blueprint
-INSERT INTO course_content (title, position, course_id)
-VALUES
-    ('Foundations of Business Transformation', 1, 3),
-    ('Engaging Stakeholders & Middle Management', 2, 3),
-    ('Implementing Change & Measuring Success', 3, 3),
-    ('Building Agile & Resilient Organizations', 4, 3);
-
-INSERT INTO course_lecture (content_text, content_type, content_file_name, description, duration_minutes, position, title, course_content_id)
-VALUES
-    -- Foundations of Business Transformation (course_content_id: 8)
-    (NULL, 'VIDEO', 'https://www.youtube.com/watch?v=aeBaSrJmTMk&list=RDaeBaSrJmTMk&start_radio=1&ab_channel=AVAIONVEVO',
-     'Users will gain a comprehensive understanding of business transformation principles and stages through this video. It covers transformation triggers like market shifts and internal inefficiencies, with a roadmap for success. You will learn to identify transformation opportunities in your business. Action: Watch the video and note three relevant transformation triggers.',
-     26, 1, 'Introduction to Principles and Stages of Business Transformation', 8),
-    ('Lorem Ipsum is simply dummy text of the printing and typesetting industry.',
-     'TEXT', NULL,
-     'Users will learn about transformation drivers and setting a clear purpose for change initiatives. This article covers strategic planning, stakeholder alignment, and pitfalls to avoid. You will gain insights into launching effective transformation projects. Action: Reflect on your organization’s transformation readiness.',
-     18, 2, 'Understanding Drivers and Purpose in Business Transformation', 8),
-    (NULL, 'FILE', 'https://drive.google.com/file/d/14LBFO5sNWu7P3L8Co-MeGUxMbg7fhC76/view?usp=drive_link',
-     'Users will assess their business’s readiness for transformation using this template. It provides exercises to evaluate strengths, weaknesses, and external factors. You will learn to create a transformation readiness plan. Action: Complete the template with your team and discuss results.',
-     15, 3, 'Template for Assessing Business Transformation Readiness', 8),
-
-    -- Engaging Stakeholders & Middle Management (course_content_id: 9)
-    (NULL, 'VIDEO', 'https://www.youtube.com/watch?v=aeBaSrJmTMk&list=RDaeBaSrJmTMk&start_radio=1&ab_channel=AVAIONVEVO',
-     'Users will learn strategies to engage middle management as change agents in transformation initiatives. This video covers communication techniques, stakeholder mapping, and gaining buy-in, with examples. You will gain skills to align stakeholders effectively. Action: Plan a stakeholder communication strategy for your organization.',
-     23, 1, 'Engaging Middle Management as Change Agents in Transformation', 9),
-    ('Lorem Ipsum is simply dummy text of the printing and typesetting industry.',
-     'TEXT', NULL,
-     'Users will discover best practices for stakeholder alignment and communication during transformation. This article covers identifying stakeholders, addressing concerns, and fostering collaboration. You will gain tools to build strong stakeholder relationships. Action: Analyze your stakeholder map and identify one improvement area.',
-     17, 2, 'Best Practices for Stakeholder Alignment and Communication', 9),
-    (NULL, 'FILE', 'https://drive.google.com/file/d/14LBFO5sNWu7P3L8Co-MeGUxMbg7fhC76/view?usp=drive_link',
-     'Users will structure stakeholder engagement with this communication plan template. It provides tools to outline messaging, timelines, and feedback mechanisms. You will learn to create effective communication strategies. Action: Customize the template for your change initiative.',
-     13, 3, 'Communication Plan Template for Change Initiatives', 9),
-
-    -- Implementing Change & Measuring Success (course_content_id: 10)
-    (NULL, 'VIDEO', 'https://www.youtube.com/watch?v=aeBaSrJmTMk&list=RDaeBaSrJmTMk&start_radio=1&ab_channel=AVAIONVEVO',
-     'Users will learn to implement KPIs and monitor transformation progress through this video. It covers selecting relevant KPIs, tracking tools, and interpreting data. You will gain skills to measure transformation effectively. Action: Apply one KPI measurement tool to your initiative.',
-     27, 1, 'Implementing KPIs and Monitoring Transformation Progress', 10),
-    ('Lorem Ipsum is simply dummy text of the printing and typesetting industry.',
-     'TEXT', NULL,
-     'Users will understand how to define and use KPIs effectively to track transformation. This article covers selecting measurable metrics, aligning with goals, and avoiding pitfalls. You will gain a robust KPI framework. Action: Set three KPIs for your transformation project and outline their tracking process.',
-     19, 2, 'Guide to Defining and Using KPIs in Business Transformation', 10),
-    (NULL, 'FILE', 'https://drive.google.com/file/d/14LBFO5sNWu7P3L8Co-MeGUxMbg7fhC76/view?usp=drive_link',
-     'Users will monitor transformation progress with this KPI tracking dashboard template. It provides tools to visualize data and evaluate outcomes. You will learn to implement and maintain KPI tracking systems. Action: Implement the dashboard and monitor KPIs weekly.',
-     14, 3, 'KPI Tracking Dashboard Template for Transformation Monitoring', 10),
-
-    -- Building Agile & Resilient Organizations (course_content_id: 11)
-    (NULL, 'VIDEO', 'https://www.youtube.com/watch?v=aeBaSrJmTMk&list=RDaeBaSrJmTMk&start_radio=1&ab_channel=AVAIONVEVO',
-     'Users will learn to build agility and resilience into organizational structures through this video. It covers flexible frameworks, adaptive strategies, and examples of resilient organizations. You will gain skills to design agile systems. Action: Assess your organization’s structure for agility.',
-     29, 1, 'Building Agility and Resilience in Organizational Structures', 11),
-    ('Lorem Ipsum is simply dummy text of the printing and typesetting industry.',
-     'TEXT', NULL,
-     'Users will understand concepts and frameworks for creating agile organizations. This article covers organizational design, cross-functional collaboration, and resilience strategies. You will gain tools to improve your structure. Action: Evaluate your organizational design and identify one agility improvement.',
-     20, 2, 'Frameworks for Creating Agile and Resilient Organizations', 11),
-    (NULL, 'QUIZ', 'https://www.britannica.com/games/sudoku',
-     'Users will assess their understanding of agile and resilient structures through this quiz. It covers flexibility and adaptability strategies, providing feedback on your knowledge. You will gain insights into areas for improvement. Action: Complete the quiz and review results to enhance your understanding.',
-     18, 3, 'Interactive Quiz on Agile and Resilient Organizational Structures', 11);
-
--- SME Business Roadmap
-INSERT INTO course_content (title, position, course_id)
-VALUES
-    ('Core Foundations for SME Success', 1, 4),
-    ('Aligning Teams & Vision', 2, 4),
-    ('Building Sustainable Growth Systems', 3, 4);
-
-INSERT INTO course_lecture (content_text, content_type, content_file_name, description, duration_minutes, position, title, course_content_id)
-VALUES
-    -- Core Foundations for SME Success (course_content_id: 12)
-    (NULL, 'VIDEO', 'https://www.youtube.com/watch?v=aeBaSrJmTMk&list=RDaeBaSrJmTMk&start_radio=1&ab_channel=AVAIONVEVO',
-     'Users will discover core foundations for SME growth and stability through this video. It covers strategic planning, resource management, and examples of successful SMEs. You will gain skills to build a strong business base. Action: Note three key foundations for your SME.',
-     24, 1, 'Core Foundations for Driving SME Growth and Stability', 12),
-    ('Lorem Ipsum is simply dummy text of the printing and typesetting industry.',
-     'TEXT', NULL,
-     'Users will learn to overcome common SME challenges like financial management and market positioning. This article covers practical strategies to strengthen your business foundation. You will gain insights into addressing SME-specific obstacles. Action: Write a plan to address one business challenge.',
-     15, 2, 'Overcoming Challenges for SME Success and Growth', 12),
-    (NULL, 'FILE', 'https://drive.google.com/file/d/14LBFO5sNWu7P3L8Co-MeGUxMbg7fhC76/view?usp=drive_link',
-     'Users will assess their SME’s foundational strengths and weaknesses with this worksheet. It provides exercises to evaluate financial, operational, and strategic readiness. You will learn to create a robust foundation plan. Action: Complete the worksheet and discuss with your team.',
-     17, 3, 'Assessment Worksheet for SME Foundational Strengths', 12),
-
-    -- Aligning Teams & Vision (course_content_id: 13)
-    (NULL, 'VIDEO', 'https://www.youtube.com/watch?v=aeBaSrJmTMk&list=RDaeBaSrJmTMk&start_radio=1&ab_channel=AVAIONVEVO',
-     'Users will learn to align their SME team around a shared vision and mission through this video. It covers fostering team buy-in, creating a cohesive culture, and real-world examples. You will gain skills to unify your team. Action: Implement one alignment activity with your team.',
-     22, 1, 'Aligning SME Teams Around a Shared Vision and Mission', 13),
-    ('Lorem Ipsum is simply dummy text of the printing and typesetting industry.',
-     'TEXT', NULL,
-     'Users will discover steps to build a motivating shared vision for their SME team. This article covers vision-setting workshops, communication strategies, and alignment techniques. You will gain tools to create a cohesive team vision. Action: Lead a vision-building session with your team.',
-     14, 2, 'Steps to Build a Motivating Vision for SME Teams', 13),
-    (NULL, 'FILE', 'https://drive.google.com/file/d/14LBFO5sNWu7P3L8Co-MeGUxMbg7fhC76/view?usp=drive_link',
-     'Users will craft a clear and inspiring vision for their SME using this template. It provides tools to articulate values and goals that resonate with your team. You will learn to formalize your vision. Action: Customize the template for your SME’s vision and mission.',
-     13, 3, 'Vision and Mission Template for SME Alignment', 13),
-
-    -- Building Sustainable Growth Systems (course_content_id: 14)
-    (NULL, 'VIDEO', 'https://www.youtube.com/watch?v=aeBaSrJmTMk&list=RDaeBaSrJmTMk&start_radio=1&ab_channel=AVAIONVEVO',
-     'Users will learn to build scalable systems for sustainable SME growth through this video. It covers process optimization, automation, and scalability strategies, with examples. You will gain skills to design growth-oriented systems. Action: Plan one system implementation for your SME.',
-     26, 1, 'Building Scalable Systems for Sustainable SME Growth', 14),
-    ('Lorem Ipsum is simply dummy text of the printing and typesetting industry.',
-     'TEXT', NULL,
-     'Users will understand operational efficiency and process design for SMEs through this article. It covers frameworks for streamlining workflows and ensuring scalability. You will gain tools to optimize business processes. Action: Map one SME process and identify an efficiency improvement.',
-     18, 2, 'Operational Efficiency and Process Design for SMEs', 14),
-    (NULL, 'FILE', 'https://drive.google.com/file/d/14LBFO5sNWu7P3L8Co-MeGUxMbg7fhC76/view?usp=drive_link',
-     'Users will design growth-oriented processes for their SME with this systems planning worksheet. It provides templates for mapping workflows and identifying scalability factors. You will learn to create sustainable systems. Action: Use the worksheet to design one growth-oriented system.',
-     16, 3, 'Systems Planning Worksheet for SME Growth', 14);
-
--- Sales Masterclass
-INSERT INTO course_content (title, position, course_id)
-VALUES
-    ('Sales Leadership Fundamentals', 1, 5),
-    ('Advanced Sales Techniques', 2, 5),
-    ('Building High-Performance Sales Teams', 3, 5),
-    ('Negotiation & Client Relationships', 4, 5);
-
-INSERT INTO course_lecture (content_text, content_type, content_file_name, description, duration_minutes, position, title, course_content_id)
-VALUES
-    -- Sales Leadership Fundamentals (course_content_id: 15)
-    (NULL, 'VIDEO', 'https://www.youtube.com/watch?v=aeBaSrJmTMk&list=RDaeBaSrJmTMk&start_radio=1&ab_channel=AVAIONVEVO',
-     'Users will gain insights into sales leadership principles and mindset through this video. It covers building team synergy, vision-setting, and motivation, with real-world examples. You will learn to lead sales teams effectively. Action: Reflect on your current sales leadership approach.',
-     23, 1, 'Introduction to Sales Leadership Principles and Mindset', 15),
-    ('Lorem Ipsum is simply dummy text of the printing and typesetting industry.',
-     'TEXT', NULL,
-     'Users will understand the role of leadership in sales through this article. It covers building synergy and aligning teams with business goals, with strategies for motivation. You will gain tools to enhance your leadership impact. Action: Apply one strategy to improve your team’s influence.',
-     17, 2, 'Building Synergy and Influence in Sales Leadership', 15),
-    (NULL, 'FILE', 'https://drive.google.com/file/d/14LBFO5sNWu7P3L8Co-MeGUxMbg7fhC76/view?usp=drive_link',
-     'Users will assess their leadership strengths and growth areas with this worksheet. It provides exercises to evaluate skills and set development goals for sales managers. You will learn to create a personal growth plan. Action: Complete the worksheet and set one leadership goal.',
-     15, 3, 'Self-Assessment Worksheet for Sales Leadership Growth', 15),
-
-    -- Advanced Sales Techniques (course_content_id: 16)
-    (NULL, 'VIDEO', 'https://www.youtube.com/watch?v=aeBaSrJmTMk&list=RDaeBaSrJmTMk&start_radio=1&ab_channel=AVAIONVEVO',
-     'Users will master advanced sales techniques to increase close rates through this video. It covers consultative selling, objection handling, and practical demonstrations. You will gain skills to refine your sales approach. Action: Practice one technique in your next sales interaction.',
-     27, 1, 'Advanced Sales Techniques for Increasing Close Rates', 16),
-    ('Lorem Ipsum is simply dummy text of the printing and typesetting industry.',
-     'TEXT', NULL,
-     'Users will learn to overcome sales silos and improve collaboration through this article. It covers pipeline management, customer engagement, and advanced sales strategies. You will gain tools to optimize your sales process. Action: Analyze your sales process and identify one improvement area.',
-     16, 2, 'Overcoming Silos and Optimizing Sales Collaboration', 16),
-    (NULL, 'QUIZ', 'https://www.britannica.com/games/sudoku',
-     'Users will test their knowledge of advanced sales strategies through this quiz. It covers objection handling, pipeline management, and other key concepts, providing feedback on your skills. You will gain insights into areas for improvement. Action: Complete the quiz and review results to refine your approach.',
-     20, 3, 'Interactive Quiz on Advanced Sales Strategies', 16),
-
-    -- Building High-Performance Sales Teams (course_content_id: 17)
-    (NULL, 'VIDEO', 'https://www.youtube.com/watch?v=aeBaSrJmTMk&list=RDaeBaSrJmTMk&start_radio=1&ab_channel=AVAIONVEVO',
-     'Users will learn to build and manage high-performance sales teams through this video. It covers recruitment, training, and motivation strategies, with examples of successful teams. You will gain skills to design a team improvement plan. Action: Draft a plan to enhance your sales team’s performance.',
-     28, 1, 'Building and Managing High-Performance Sales Teams', 17),
-    ('Lorem Ipsum is simply dummy text of the printing and typesetting industry.',
-     'TEXT', NULL,
-     'Users will discover steps to foster accountability and growth in sales teams. This article covers setting expectations, tracking performance, and building team cohesion. You will gain tools to create a high-performance culture. Action: Implement one accountability strategy with your sales team.',
-     18, 2, 'Fostering Accountability and Growth in Sales Teams', 17),
-    (NULL, 'FILE', 'https://drive.google.com/file/d/14LBFO5sNWu7P3L8Co-MeGUxMbg7fhC76/view?usp=drive_link',
-     'Users will track sales team KPIs and goals with this template. It provides tools to set measurable targets and monitor progress, helping you maintain team accountability. You will learn to sustain team performance. Action: Fill out the template and track your team’s performance regularly.',
-     15, 3, 'KPI Tracking Template for Sales Team Performance', 17),
-
-    -- Negotiation & Client Relationships (course_content_id: 18)
-    (NULL, 'VIDEO', 'https://www.youtube.com/watch?v=aeBaSrJmTMk&list=RDaeBaSrJmTMk&start_radio=1&ab_channel=AVAIONVEVO',
-     'Users will learn strategies for effective negotiation and building strong client relationships through this video. It covers handling objections, building trust, and closing deals, with real-world scenarios. You will gain skills to strengthen client partnerships. Action: Prepare one negotiation scenario for practice.',
-     25, 1, 'Strategies for Effective Negotiation and Client Relationships', 18),
-    ('Lorem Ipsum is simply dummy text of the printing and typesetting industry.',
-     'TEXT', NULL,
-     'Users will discover how to turn client objections into opportunities for stronger relationships. This article covers negotiation frameworks, active listening, and trust-building techniques. You will gain tools to enhance client interactions. Action: Apply one technique in your next client meeting.',
-     19, 2, 'Turning Client Objections into Relationship Opportunities', 18),
-    (NULL, 'QUIZ', 'https://www.britannica.com/games/sudoku',
-     'Users will evaluate their negotiation and client management skills through this quiz. It covers objection handling and relationship-building strategies, providing feedback on your skills. You will gain insights into areas for improvement. Action: Complete the quiz and review results for enhancement.',
-     17, 3, 'Interactive Quiz on Negotiation and Client Management Skills', 18);
-
--- Mastering Success Skills
-INSERT INTO course_content (title, position, course_id)
-VALUES
-    ('Foundations of Effective Skill-Building', 1, 6),
-    ('Time Management & Prioritization Strategies', 2, 6),
-    ('Communication & Cognitive Tools for Success', 3, 6),
-    ('Transforming Good Habits into Extraordinary Results', 4, 6);
-
-INSERT INTO course_lecture (content_text, content_type, content_file_name, description, duration_minutes, position, title, course_content_id)
-VALUES
-    -- Foundations of Effective Skill-Building (course_content_id: 19)
-    ('Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industrys standard dummy text...',
-     'TEXT', NULL,
-     'Users will learn the core principles behind building essential skills for personal and professional growth. This article covers the psychology of skill acquisition, learning frameworks, and practical applications. You will gain a structured skill-building plan. Action: Reflect on your current skills and outline one skill to develop.',
-     15, 1, 'Core Principles of Effective Skill-Building for Success', 19),
-    (NULL, 'VIDEO', 'https://www.youtube.com/watch?v=aeBaSrJmTMk&list=RDaeBaSrJmTMk&start_radio=1&ab_channel=AVAIONVEVO',
-     'Users will explore practical frameworks for mastering new skills through this video. It covers goal-setting, feedback loops, and examples of successful skill-building strategies. You will gain a solid foundation for skill development. Action: List three key takeaways for your skill-building plan.',
-     20, 2, 'Practical Frameworks for Mastering New Skills', 19),
-    (NULL, 'QUIZ', 'https://www.britannica.com/games/sudoku',
-     'Users will test their understanding of skill-building principles through this quiz. It covers learning frameworks and practical applications, helping you identify areas for improvement. You will gain feedback on your knowledge. Action: Complete the quiz and review results to refine your approach.',
-     10, 3, 'Interactive Quiz on Skill-Building Principles', 19),
-
-    -- Time Management & Prioritization Strategies (course_content_id: 20)
-    ('Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industrys standard dummy text...',
-     'TEXT', NULL,
-     'Users will discover proven methods to prioritize tasks and manage time effectively. This article covers techniques like the Eisenhower Matrix and time-blocking, with practical tips. You will gain tools to boost productivity without burnout. Action: Implement the weekly planner for one week.',
-     18, 1, 'Proven Methods for Effective Time Management and Prioritization', 20),
-    (NULL, 'VIDEO', 'https://www.youtube.com/watch?v=aeBaSrJmTMk&list=RDaeBaSrJmTMk&start_radio=1&ab_channel=AVAIONVEVO',
-     'Users will learn advanced time management techniques to enhance productivity and balance. This video covers prioritization frameworks and workload management tools. You will gain skills to optimize your schedule. Action: Apply one time management technique today.',
-     25, 2, 'Advanced Techniques for Time Management and Productivity', 20),
-
-    -- Communication & Cognitive Tools for Success (course_content_id: 21)
-    ('Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industrys standard dummy text...',
-     'TEXT', NULL,
-     'Users will learn how powerful communication and cognitive strategies drive success. This article covers active listening, emotional intelligence, and problem-solving tools. You will gain skills to enhance effectiveness in dynamic environments. Action: Practice active listening in your next team meeting.',
-     20, 1, 'Powerful Communication and Cognitive Strategies for Success', 21),
-    (NULL, 'VIDEO', 'https://www.youtube.com/watch?v=aeBaSrJmTMk&list=RDaeBaSrJmTMk&start_radio=1&ab_channel=AVAIONVEVO',
-     'Users will explore cognitive tools to adapt, grow, and thrive in dynamic settings. This video covers decision-making frameworks, communication techniques, and real-world applications. You will gain skills to apply cognitive strategies effectively. Action: Identify one insight to implement in your work.',
-     28, 2, 'Cognitive Tools and Communication Techniques for Growth', 21),
-    (NULL, 'QUIZ', 'https://www.britannica.com/games/sudoku',
-     'Users will assess their communication maturity and readiness for high-stakes situations. This quiz covers active listening and cognitive strategies, providing feedback on your skills. You will gain insights into areas for improvement. Action: Complete the quiz and reflect on results to improve.',
-     12, 3, 'Interactive Quiz on Communication and Cognitive Skills', 21),
-
-    -- Transforming Good Habits into Extraordinary Results (course_content_id: 22)
-    ('Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industrys standard dummy text...',
-     'TEXT', NULL,
-     'Users will learn to transform everyday habits into extraordinary results. This article covers habit formation, consistency frameworks, and sustained improvement strategies. You will gain tools to build high-impact habits. Action: Write a new habit plan based on the article.',
-     22, 1, 'Transforming Everyday Habits into High-Impact Results', 22),
-    (NULL, 'VIDEO', 'https://www.youtube.com/watch?v=aeBaSrJmTMk&list=RDaeBaSrJmTMk&start_radio=1&ab_channel=AVAIONVEVO',
-     'Users will explore how successful individuals design habits for continuous improvement. This video covers case studies and practical habit-building strategies. You will gain skills to create sustainable habits. Action: Implement one habit-building strategy today.',
-     27, 2, 'Case Studies on Designing Habits for Continuous Improvement', 22);
-
--- Winning Markets in 3 Steps
-INSERT INTO course_content (title, position, course_id)
-VALUES
-    ('Defining Your Ideal Client Profile', 1, 7),
-    ('Crafting Precise Messaging and Value Propositions', 2, 7),
-    ('Choosing Effective Marketing Channels', 3, 7),
-    ('Integrating Strategy into Execution', 4, 7);
-
-INSERT INTO course_lecture (content_text, content_type, content_file_name, description, duration_minutes, position, title, course_content_id)
-VALUES
-    -- Defining Your Ideal Client Profile (course_content_id: 23)
-    ('Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industrys standard dummy text...',
-     'TEXT', NULL,
-     'Users will learn to define an ideal client profile to focus marketing efforts. This article covers analyzing customer needs, behaviors, and demographics for targeted strategies. You will gain skills to create a precise client profile. Action: Write your ideal client profile.',
-     18, 1, 'Defining the Eight Characteristics of an Ideal Client Profile', 23),
-    (NULL, 'VIDEO', 'https://www.youtube.com/watch?v=aeBaSrJmTMk&list=RDaeBaSrJmTMk&start_radio=1&ab_channel=AVAIONVEVO',
-     'Users will explore real-world examples of businesses defining ideal client profiles. This video covers strategies for identifying high-value clients and tailoring offerings. You will gain skills to refine client targeting. Action: Note one applicable insight for your business.',
-     24, 2, 'Real-World Examples of Defining Ideal Client Profiles', 23),
-
-    -- Crafting Precise Messaging and Value Propositions (course_content_id: 24)
-    ('Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industrys standard dummy text...',
-     'TEXT', NULL,
-     'Users will learn to create messaging that resonates with their audience. This article covers frameworks for crafting compelling value propositions and aligning with client needs. You will gain skills to develop impactful messaging. Action: Draft your core message.',
-     20, 1, 'Crafting Resonant Messaging and Value Propositions', 24),
-    (NULL, 'VIDEO', 'https://www.youtube.com/watch?v=aeBaSrJmTMk&list=RDaeBaSrJmTMk&start_radio=1&ab_channel=AVAIONVEVO',
-     'Users will discover techniques for building powerful value propositions that stand out. This video covers successful messaging strategies and their impact, with examples. You will gain skills to create compelling value propositions. Action: Identify your main value points.',
-     26, 2, 'Techniques for Building Powerful Value Propositions', 24),
-    (NULL, 'QUIZ', 'https://www.britannica.com/games/sudoku',
-     'Users will test their understanding of messaging and value propositions through this quiz. It covers messaging frameworks and key concepts, providing feedback on your skills. You will gain insights into areas for improvement. Action: Complete the quiz and adjust your messaging.',
-     12, 3, 'Interactive Quiz on Messaging and Value Propositions', 24),
-
-    -- Choosing Effective Marketing Channels (course_content_id: 25)
-    ('Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industrys standard dummy text...',
-     'TEXT', NULL,
-     'Users will learn to identify where their audience is most active through this article. It covers analyzing digital, traditional, and hybrid marketing channels, with selection strategies. You will gain skills to choose effective channels. Action: Choose your top three marketing channels.',
-     17, 1, 'Analyzing and Selecting Effective Marketing Channels', 25),
-    (NULL, 'VIDEO', 'https://www.youtube.com/watch?v=aeBaSrJmTMk&list=RDaeBaSrJmTMk&start_radio=1&ab_channel=AVAIONVEVO',
-     'Users will explore how to balance multiple marketing channels with consistent messaging. This video covers channel integration, audience targeting, and performance tracking. You will gain skills to create a cohesive channel strategy. Action: Create your channel strategy.',
-     25, 2, 'Balancing Multiple Channels for Consistent Marketing', 25),
-
-    -- Integrating Strategy into Execution (course_content_id: 26)
-    ('Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industrys standard dummy text...',
-     'TEXT', NULL,
-     'Users will learn to combine client profiles, messaging, and channels into a go-to-market strategy. This article covers strategic planning, execution steps, and alignment techniques. You will gain skills to build an effective roadmap. Action: Build your go-to-market roadmap.',
-     22, 1, 'Integrating Client Profiles and Messaging into a Go-to-Market Strategy', 26),
-    (NULL, 'VIDEO', 'https://www.youtube.com/watch?v=aeBaSrJmTMk&list=RDaeBaSrJmTMk&start_radio=1&ab_channel=AVAIONVEVO',
-     'Users will discover how top companies align go-to-market plans for maximum impact. This video covers case studies and practical execution steps. You will gain skills to implement cohesive strategies. Action: List three strategic takeaways for your business.',
-     28, 2, 'Case Studies on Aligning Go-to-Market Strategies for Impact', 26),
-    (NULL, 'QUIZ', 'https://www.britannica.com/games/sudoku',
-     'Users will check their readiness to launch an integrated go-to-market strategy through this quiz. It covers strategy alignment and execution, providing feedback on your plans. You will gain insights into gaps to address. Action: Complete the quiz and revise your strategy.',
-     14, 3, 'Interactive Quiz on Integrated Go-to-Market Strategies', 26);
-
--- How to Create Added Value
-INSERT INTO course_content (title, position, course_id)
-VALUES
-    ('Understanding Client Problems Deeply', 1, 8),
-    ('Designing Impactful Solutions', 2, 8),
-    ('Developing Scalable Concepts', 3, 8),
-    ('Positioning Yourself as a Strategic Partner', 4, 8);
-
-INSERT INTO course_lecture (content_text, content_type, content_file_name, description, duration_minutes, position, title, course_content_id)
-VALUES
-    -- Understanding Client Problems Deeply (course_content_id: 27)
-    ('Lorem Ipsum is simply dummy text...',
-     'TEXT', NULL,
-     'Users will learn to uncover hidden client problems and analyze root causes. This article covers needs analysis, stakeholder interviews, and practical applications. You will gain skills to identify high-impact client pain points. Action: List your top three client pain points.',
-     20, 1, 'Uncovering and Analyzing Hidden Client Problems', 27),
-    (NULL, 'VIDEO', 'https://www.youtube.com/watch?v=aeBaSrJmTMk&list=RDaeBaSrJmTMk&start_radio=1&ab_channel=AVAIONVEVO',
-     'Users will explore case studies where deep problem analysis led to breakthrough solutions. This video covers methodologies for identifying client needs and prioritizing solutions. You will gain skills to conduct effective problem discovery. Action: Note one methodology to apply to your clients.',
-     25, 2, 'Case Studies on Effective Client Problem Discovery', 27),
-
-    -- Designing Impactful Solutions (course_content_id: 28)
-    ('Lorem Ipsum is simply dummy text...',
-     'TEXT', NULL,
-     'Users will learn to design solutions addressing core client problems. This article covers design thinking, iterative development, and solution validation techniques. You will gain skills to create impactful solutions. Action: Sketch a solution concept for one client problem.',
-     22, 1, 'Designing Solutions for Core Client Problems', 28),
-    (NULL, 'VIDEO', 'https://www.youtube.com/watch?v=aeBaSrJmTMk&list=RDaeBaSrJmTMk&start_radio=1&ab_channel=AVAIONVEVO',
-     'Users will discover iterative design approaches for refining solutions. This video covers successful solution development and testing processes, with examples. You will gain skills to iterate effectively. Action: Identify one area to test in your solution design.',
-     28, 2, 'Iterative Approaches to Solution Design and Refinement', 28),
-
-    -- Developing Scalable Concepts (course_content_id: 29)
-    ('Lorem Ipsum is simply dummy text...',
-     'TEXT', NULL,
-     'Users will learn to build concepts that scale across client needs. This article covers scalability factors, modular design, and cross-industry applications. You will gain skills to create versatile solutions. Action: Define scalability factors for one concept.',
-     19, 1, 'Building Scalable Concepts for Diverse Client Needs', 29),
-    (NULL, 'VIDEO', 'https://www.youtube.com/watch?v=aeBaSrJmTMk&list=RDaeBaSrJmTMk&start_radio=1&ab_channel=AVAIONVEVO',
-     'Users will explore how top brands create scalable solutions and concepts. This video covers case studies and strategies for scalability and adaptability. You will gain skills to design scalable concepts. Action: Draft a scalability plan for one concept.',
-     26, 2, 'Case Studies on Creating Scalable Solutions and Concepts', 29),
-
-    -- Positioning Yourself as a Strategic Partner (course_content_id: 30)
-    ('Lorem Ipsum is simply dummy text...',
-     'TEXT', NULL,
-     'Users will learn to position themselves as strategic partners, not just vendors. This article covers relationship-building, value alignment, and trust strategies. You will gain skills to foster long-term client loyalty. Action: Write your value positioning statement.',
-     21, 1, 'Positioning as a Strategic Partner for Client Loyalty', 30),
-    (NULL, 'VIDEO', 'https://www.youtube.com/watch?v=aeBaSrJmTMk&list=RDaeBaSrJmTMk&start_radio=1&ab_channel=AVAIONVEVO',
-     'Users will discover relationship-based strategies for long-term client loyalty. This video covers examples of strategic partnerships and practical steps. You will gain skills to build strong client relationships. Action: Map your partner strategy.',
-     27, 2, 'Relationship-Based Strategies for Long-Term Client Loyalty', 30),
-    (NULL, 'QUIZ', 'https://www.britannica.com/games/sudoku',
-     'Users will test their knowledge of moving from services to strategic partnerships. This quiz covers relationship-building techniques and key concepts, providing feedback on your understanding. You will gain insights into areas for improvement. Action: Complete the quiz and review results to refine your approach.',
-     15, 3, 'Interactive Quiz on Strategic Partnership and Value Creation', 30);
-
--- Seamless Onboarding Strategy
-INSERT INTO course_content (title, position, course_id)
-VALUES
-    ('Pre-Onboarding Preparation', 1, 9),
-    ('First Week Essentials', 2, 9),
-    ('Long-Term Integration and Development', 3, 9);
-
-INSERT INTO course_lecture (content_text, content_type, content_file_name, description, duration_minutes, position, title, course_content_id)
-VALUES
-    -- Pre-Onboarding Preparation (course_content_id: 31)
-    ('Lorem Ipsum is simply dummy text...',
-     'TEXT', NULL,
-     'Users will learn to prepare for a new hire’s arrival to ensure smooth onboarding. This article covers creating pre-onboarding checklists, setting expectations, and aligning resources. You will gain skills to set new hires up for success. Action: Create a pre-onboarding checklist.',
-     18, 1, 'Preparing for a Smooth New Hire Onboarding Process', 31),
-    (NULL, 'VIDEO', 'https://www.youtube.com/watch?v=aeBaSrJmTMk&list=RDaeBaSrJmTMk&start_radio=1&ab_channel=AVAIONVEVO',
-     'Users will explore how pre-onboarding impacts early employee engagement. This video covers case studies of effective pre-onboarding strategies and their outcomes. You will gain skills to enhance onboarding readiness. Action: Identify one improvement for your pre-onboarding process.',
-     22, 2, 'Case Studies on Effective Pre-Onboarding Strategies', 31),
-
-    -- First Week Essentials (course_content_id: 32)
-    ('Lorem Ipsum is simply dummy text...',
-     'TEXT', NULL,
-     'Users will learn to plan structured activities for a new hire’s first week to build connection. This article covers team introductions, role clarity, and initial goal-setting. You will gain skills to design an effective first week. Action: Outline your first-week onboarding agenda.',
-     19, 1, 'Designing a Connected First Week for New Hires', 32),
-    (NULL, 'VIDEO', 'https://www.youtube.com/watch?v=aeBaSrJmTMk&list=RDaeBaSrJmTMk&start_radio=1&ab_channel=AVAIONVEVO',
-     'Users will explore successful approaches to immersive onboarding weeks. This video covers schedules, team-building activities, and orientation strategies. You will gain skills to create impactful first weeks. Action: Draft your week 1 onboarding schedule.',
-     25, 2, 'Creating an Immersive First Week for New Hires', 32),
-
-    -- Long-Term Integration and Development (course_content_id: 33)
-    ('Lorem Ipsum is simply dummy text...',
-     'TEXT', NULL,
-     'Users will learn to extend onboarding for continuous growth and integration. This article covers 90-day plans, mentorship programs, and feedback loops. You will gain skills to sustain onboarding success. Action: Design a 90-day integration plan.',
-     20, 1, 'Extending Onboarding for Continuous Employee Development', 33),
-    (NULL, 'VIDEO', 'https://www.youtube.com/watch?v=aeBaSrJmTMk&list=RDaeBaSrJmTMk&start_radio=1&ab_channel=AVAIONVEVO',
-     'Users will learn to reinforce learning and build long-term retention strategies during onboarding. This video covers follow-up processes and development frameworks, with examples. You will gain skills to sustain employee engagement. Action: Create a follow-up process.',
-     24, 2, 'Sustaining Long-Term Engagement in Onboarding', 33),
-    (NULL, 'QUIZ', 'https://www.britannica.com/games/sudoku',
-     'Users will test their understanding of seamless onboarding journeys through this quiz. It covers pre-onboarding and long-term strategies, providing feedback on your knowledge. You will gain insights into areas for improvement. Action: Complete the quiz and review results to improve.',
-     13, 3, 'Interactive Quiz on Seamless Onboarding Strategies', 33);
-
--- Growth Through Self-Assessment
-INSERT INTO course_content (title, position, course_id)
-VALUES
-    ('Identifying Personal Barriers', 1, 10),
-    ('Developing Actionable Improvement Plans', 2, 10),
-    ('Implementing Continuous Self-Improvement', 3, 10);
-
-INSERT INTO course_lecture (content_text, content_type, content_file_name, description, duration_minutes, position, title, course_content_id)
-VALUES
-    -- Identifying Personal Barriers (course_content_id: 34)
-    ('Lorem Ipsum is simply dummy text...',
-     'TEXT', NULL,
-     'Users will learn to identify hidden barriers hindering professional growth. This article covers common blockers like self-doubt and procrastination, with self-assessment strategies. You will gain skills to pinpoint growth obstacles. Action: List your top three personal blockers.',
-     20, 1, 'Identifying Hidden Barriers to Professional Growth', 34),
-    (NULL, 'VIDEO', 'https://www.youtube.com/watch?v=aeBaSrJmTMk&list=RDaeBaSrJmTMk&start_radio=1&ab_channel=AVAIONVEVO',
-     'Users will explore examples of professionals overcoming personal barriers. This video covers self-reflection and barrier identification techniques, with practical applications. You will gain skills to address your blockers. Action: Reflect on one barrier and plan to address it.',
-     26, 2, 'Real-World Examples of Overcoming Personal Barriers', 34),
-
-    -- Developing Actionable Improvement Plans (course_content_id: 35)
-    ('Lorem Ipsum is simply dummy text...',
-     'TEXT', NULL,
-     'Users will learn to translate self-reflection into actionable improvement plans. This article covers goal-setting frameworks, prioritization techniques, and progress tracking. You will gain skills to create effective growth plans. Action: Draft your improvement roadmap.',
-     22, 1, 'Creating Actionable Plans for Professional Improvement', 35),
-    (NULL, 'VIDEO', 'https://www.youtube.com/watch?v=aeBaSrJmTMk&list=RDaeBaSrJmTMk&start_radio=1&ab_channel=AVAIONVEVO',
-     'Users will explore frameworks for goal setting and progress tracking in self-improvement. This video covers successful action plans and their outcomes, with examples. You will gain skills to design actionable plans. Action: Outline your first improvement goals.',
-     24, 2, 'Frameworks for Effective Goal Setting and Progress Tracking', 35),
-
-    -- Implementing Continuous Self-Improvement (course_content_id: 36)
-    ('Lorem Ipsum is simply dummy text...',
-     'TEXT', NULL,
-     'Users will learn to sustain improvement momentum through continuous self-assessment. This article covers accountability systems, habit-building, and long-term tracking. You will gain skills to maintain growth momentum. Action: Create a personal accountability plan.',
-     21, 1, 'Sustaining Continuous Self-Improvement Through Accountability', 36),
-    (NULL, 'VIDEO', 'https://www.youtube.com/watch?v=aeBaSrJmTMk&list=RDaeBaSrJmTMk&start_radio=1&ab_channel=AVAIONVEVO',
-     'Users will explore long-term success stories from continuous self-improvement. This video covers strategies for maintaining progress and measuring success. You will gain skills to sustain your growth efforts. Action: Identify one long-term metric to track your progress.',
-     27, 2, 'Case Studies on Sustained Self-Improvement Success', 36),
-    (NULL, 'QUIZ', 'https://www.britannica.com/games/sudoku',
-     'Users will check their readiness for continuous self-improvement through this quiz. It covers accountability and tracking strategies, providing feedback on your knowledge. You will gain insights into areas for growth. Action: Complete the quiz and define your next steps.',
-     14, 3, 'Interactive Quiz on Continuous Self-Improvement Strategies', 36);
-
--- Business Excellence Blueprint
-INSERT INTO course_content (title, position, course_id)
-VALUES
-    ('Laying the Foundations of Excellence', 1, 11),
-    ('Establishing Continuous Improvement Systems', 2, 11),
-    ('Embedding a High-Performance Culture', 3, 11);
-
-INSERT INTO course_lecture (content_text, content_type, content_file_name, description, duration_minutes, position, title, course_content_id)
-VALUES
-    -- Laying the Foundations of Excellence (course_content_id: 37)
-    ('Lorem Ipsum is simply dummy text...',
-     'TEXT', NULL,
-     'Users will learn the core principles of organizational excellence, including strategic alignment and operational efficiency. This article covers frameworks for building a strong foundation and avoiding pitfalls. You will gain skills to assess your organization’s readiness. Action: Assess your current organizational foundation.',
-     21, 1, 'Core Principles for Building Organizational Excellence', 37),
-    (NULL, 'VIDEO', 'https://www.youtube.com/watch?v=aeBaSrJmTMk&list=RDaeBaSrJmTMk&start_radio=1&ab_channel=AVAIONVEVO',
-     'Users will explore how top companies build foundations for organizational excellence. This video covers case studies, strategic planning, and alignment strategies. You will gain skills to adopt best practices for excellence. Action: Identify one best practice to implement.',
-     26, 2, 'Case Studies on Building Foundations for Excellence', 37),
-
-    -- Establishing Continuous Improvement Systems (course_content_id: 38)
-    ('Lorem Ipsum is simply dummy text...',
-     'TEXT', NULL,
-     'Users will learn to create systems driving continuous improvement across their organization. This article covers improvement frameworks, feedback loops, and performance tracking. You will gain skills to design effective systems. Action: Design an improvement loop for your organization.',
-     23, 1, 'Creating Systems for Continuous Organizational Improvement', 38),
-    (NULL, 'VIDEO', 'https://www.youtube.com/watch?v=aeBaSrJmTMk&list=RDaeBaSrJmTMk&start_radio=1&ab_channel=AVAIONVEVO',
-     'Users will explore examples of continuous improvement initiatives in action. This video covers practical implementation steps and case studies. You will gain skills to launch improvement initiatives. Action: Define your first improvement initiative.',
-     27, 2, 'Practical Examples of Continuous Improvement Initiatives', 38),
-
-    -- Embedding a High-Performance Culture (course_content_id: 39)
-    ('Lorem Ipsum is simply dummy text...',
-     'TEXT', NULL,
-     'Users will learn to embed a culture valuing high performance. This article covers cultural values, leadership roles, and employee engagement strategies. You will gain skills to create a high-performance culture. Action: Outline your organization’s cultural values.',
-     22, 1, 'Building a High-Performance Organizational Culture', 39),
-    (NULL, 'VIDEO', 'https://www.youtube.com/watch?v=aeBaSrJmTMk&list=RDaeBaSrJmTMk&start_radio=1&ab_channel=AVAIONVEVO',
-     'Users will explore how to maintain momentum in a high-performance culture. This video covers case studies and strategies for cultural alignment. You will gain skills to sustain performance excellence. Action: Draft your culture plan.',
-     28, 2, 'Sustaining Momentum in a High-Performance Culture', 39),
-    (NULL, 'QUIZ', 'https://www.britannica.com/games/sudoku',
-     'Users will assess their readiness to establish a culture of excellence through this quiz. It covers cultural alignment and engagement strategies, providing feedback on your knowledge. You will gain insights into areas for improvement. Action: Complete the quiz and review results.',
-     14, 3, 'Interactive Quiz on Establishing a Culture of Excellence', 39);
-
--- Organizational Success Through Structure
-INSERT INTO course_content (title, position, course_id)
-VALUES
-    ('Building Effective Team Structures', 1, 12),
-    ('Optimizing Systems for Agility', 2, 12),
-    ('Maintaining Long-Term Performance', 3, 12);
-
-INSERT INTO course_lecture (content_text, content_type, content_file_name, description, duration_minutes, position, title, course_content_id)
-VALUES
-    -- Building Effective Team Structures (course_content_id: 40)
-    ('Lorem Ipsum is simply dummy text...',
-     'TEXT', NULL,
-     'Users will learn to design efficient team structures for clarity and accountability. This article covers organizational design principles, role definitions, and collaboration frameworks. You will gain skills to create effective team structures. Action: Map your current team structure.',
-     21, 1, 'Designing Efficient Team Structures for Accountability', 40),
-    (NULL, 'VIDEO', 'https://www.youtube.com/watch?v=aeBaSrJmTMk&list=RDaeBaSrJmTMk&start_radio=1&ab_channel=AVAIONVEVO',
-     'Users will explore case studies of successful team structures and collaboration. This video covers aligning teams for efficiency and accountability, with examples. You will gain skills to optimize team design. Action: Note one structural improvement for your team.',
-     27, 2, 'Case Studies on High-Performing Team Structures', 40),
-
-    -- Optimizing Systems for Agility (course_content_id: 41)
-    ('Lorem Ipsum is simply dummy text...',
-     'TEXT', NULL,
-     'Users will learn to design systems that adapt quickly to change. This article covers agility frameworks, process optimization, and adaptive strategies. You will gain skills to create agile systems. Action: Identify one agility enabler for your organization.',
-     23, 1, 'Designing Agile Systems for Rapid Adaptation', 41),
-    (NULL, 'VIDEO', 'https://www.youtube.com/watch?v=aeBaSrJmTMk&list=RDaeBaSrJmTMk&start_radio=1&ab_channel=AVAIONVEVO',
-     'Users will explore strategies for integrating agility into daily processes. This video covers case studies of agile organizations and implementation steps. You will gain skills to design agile systems. Action: Design an agility roadmap for your organization.',
-     28, 2, 'Practical Strategies for Integrating Organizational Agility', 41),
-
-    -- Maintaining Long-Term Performance (course_content_id: 42)
-    ('Lorem Ipsum is simply dummy text...',
-     'TEXT', NULL,
-     'Users will learn to create processes supporting sustained organizational performance. This article covers performance monitoring, feedback loops, and continuous improvement strategies. You will gain skills to maintain long-term success. Action: Plan your continuous monitoring process.',
-     22, 1, 'Creating Processes for Sustained Organizational Performance', 42),
-    (NULL, 'VIDEO', 'https://www.youtube.com/watch?v=aeBaSrJmTMk&list=RDaeBaSrJmTMk&start_radio=1&ab_channel=AVAIONVEVO',
-     'Users will learn to track, evaluate, and adjust systems for sustained success. This video covers performance metrics, case studies, and adaptation strategies. You will gain skills to sustain performance. Action: Define one key performance metric to track.',
-     29, 2, 'Tracking and Adapting Systems for Long-Term Success', 42),
-    (NULL, 'QUIZ', 'https://www.britannica.com/games/sudoku',
-     'Users will check their readiness to sustain structural success through this quiz. It covers performance monitoring and adaptation strategies, providing feedback on your knowledge. You will gain insights into areas for improvement. Action: Complete the quiz and review results.',
-     15, 3, 'Interactive Quiz on Sustaining Structural Success', 42);
Index: ckend/src/main/java/com/shifterwebapp/shifter/sql/initializeUser.sql
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/sql/initializeUser.sql	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,20 +1,0 @@
-INSERT INTO _user (email,
-                   password_hash,
-                   name,
-                   is_admin,
-                   points,
-                   work_position,
-                   company_size,
-                   is_enabled,
-                   login_provider)
-VALUES (
-        'admin@gmail.com',
-        '$2a$12$QREFNsS4GKa9soUNUa4rMe1yZtj1wE7Bye8etobRyBWZDiq6Vfnwy',
-        'Admin',
-        true,
-        1000,
-        'Administrator',
-        'ENTERPRISE',
-        true,
-        'LOCAL'
-    )
Index: ckend/src/main/java/com/shifterwebapp/shifter/user/User.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/user/User.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,108 +1,0 @@
-package com.shifterwebapp.shifter.user;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.shifterwebapp.shifter.enums.CompanySize;
-import com.shifterwebapp.shifter.enums.LoginProvider;
-import com.shifterwebapp.shifter.payment.Payment;
-import jakarta.persistence.*;
-import lombok.*;
-import org.springframework.security.core.GrantedAuthority;
-import org.springframework.security.core.authority.SimpleGrantedAuthority;
-import org.springframework.security.core.userdetails.UserDetails;
-
-import java.util.Collection;
-import java.util.List;
-
-@Getter
-@Setter
-@NoArgsConstructor
-@AllArgsConstructor
-@Builder
-@Entity
-@ToString
-@Table(name = "_user") // Using _user to avoid conflict with reserved keyword in SQL
-public class User implements UserDetails {
-    @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
-    private Long id;
-
-    private String name;
-
-    @Column(unique = true, nullable = false)
-    private String email;
-
-    @Enumerated(EnumType.STRING)
-    private LoginProvider loginProvider;
-
-    @JsonIgnore
-    private String passwordHash;    // SHOULD I USE JSON IGNORE HERE? OR IS IT ENOUGH TO NOT EXPOSE IT IN DTO?
-
-    private Boolean isAdmin;
-
-    private Boolean isEnabled;
-
-    private Boolean hasUsedFreeConsultation;
-
-    @Enumerated(EnumType.STRING)
-    private CompanySize companySize;
-    
-    private String workPosition;
-    
-    @ElementCollection
-    @Column(columnDefinition = "text")
-    private List<String> interests;
-
-    @ElementCollection
-    @Column(columnDefinition = "text")
-    private List<String> skills;
-
-    @ElementCollection
-    @Column(columnDefinition = "text")
-    private List<String> desiredSkills;
-    
-    private Integer points;
-
-    @ElementCollection
-    private List<Integer> favoriteCourses;
-
-    @OneToMany(mappedBy = "user")
-    private List<Payment> payments;             // WHEN DELETING USER SET PAYMENTS TO NULL, BECAUSE PAYMENTS DONT GET DELETED
-
-
-
-    // USER DETAILS METHODS
-    @Override
-    public Collection<? extends GrantedAuthority> getAuthorities() {
-        // Example: give ROLE_ADMIN if user.isAdmin() else ROLE_USER
-        return isAdmin
-                ? List.of(new SimpleGrantedAuthority("ROLE_ADMIN"))
-                : List.of(new SimpleGrantedAuthority("ROLE_USER"));
-    }
-
-    @Override
-    public String getPassword() {
-        return passwordHash;
-    }
-    @Override
-    public String getUsername() {
-        return email;
-    }
-
-    @Override
-    public boolean isAccountNonExpired() {
-        return true;
-    }
-    @Override
-    public boolean isAccountNonLocked() {
-        return true;
-    }
-    @Override
-    public boolean isCredentialsNonExpired() {
-        return true;
-    }
-    @Override
-    public boolean isEnabled() {
-        return true;
-    }
-}
-
Index: ckend/src/main/java/com/shifterwebapp/shifter/user/UserController.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/user/UserController.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,80 +1,0 @@
-package com.shifterwebapp.shifter.user;
-
-import com.shifterwebapp.shifter.Validate;
-import com.shifterwebapp.shifter.auth.CustomAuthDetails;
-import com.shifterwebapp.shifter.exception.ErrorResponse;
-import com.shifterwebapp.shifter.user.service.UserService;
-import lombok.RequiredArgsConstructor;
-import org.springframework.http.ResponseEntity;
-import org.springframework.security.core.Authentication;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-
-@RequiredArgsConstructor
-@RestController
-@RequestMapping("${api.base.path}/users")
-public class UserController {
-
-    private final UserService userService;
-    private final Validate validate;
-
-    @GetMapping("/me")
-    public ResponseEntity<?> getUser(Authentication authentication) {
-        Long userId = validate.extractUserId(authentication);
-
-        return ResponseEntity.ok(userService.getUserById(userId));
-    }
-
-    @PutMapping("/favorite-course/{courseId}")
-    public ResponseEntity<?> toggleFavoriteCourse(@PathVariable Integer courseId, Authentication authentication) {
-        validate.validateUserIsAuthenticated(authentication);
-        Object detailsObj = authentication.getDetails();
-        if (!(detailsObj instanceof CustomAuthDetails details)) {
-            return ResponseEntity.badRequest().body(new ErrorResponse("Invalid authentication details"));
-        }
-        Long userId = details.getUserId();
-
-        UserDto userDto = userService.toggleFavoriteCourse(userId, courseId);
-        return ResponseEntity.ok(userDto);
-    }
-
-    @PutMapping("/update/info")
-    public ResponseEntity<?> updateUser(Authentication authentication, @RequestBody UserInfoDto userInfoDto) {
-        validate.validateUserIsAuthenticated(authentication);
-        Object detailsObj = authentication.getDetails();
-        if (!(detailsObj instanceof CustomAuthDetails details)) {
-            return ResponseEntity.badRequest().body(new ErrorResponse("Invalid authentication details"));
-        }
-        Long userId = details.getUserId();
-
-        UserDto userDto = userService.updateUser(userId, userInfoDto);
-        return ResponseEntity.ok(userDto);
-    }
-
-    @PutMapping("/update/interests")
-    public ResponseEntity<?> updateInterests(Authentication authentication, @RequestBody List<String> interests) {
-        validate.validateUserIsAuthenticated(authentication);
-        Object detailsObj = authentication.getDetails();
-        if (!(detailsObj instanceof CustomAuthDetails details)) {
-            return ResponseEntity.badRequest().body(new ErrorResponse("Invalid authentication details"));
-        }
-        Long userId = details.getUserId();
-
-        UserDto userDto = userService.updateInterests(userId, interests);
-        return ResponseEntity.ok(userDto);
-    }
-
-    @PutMapping("/update/desired-skills")
-    public ResponseEntity<?> updateDesiredSkills(Authentication authentication, @RequestBody List<String> desiredSkills) {
-        validate.validateUserIsAuthenticated(authentication);
-        Object detailsObj = authentication.getDetails();
-        if (!(detailsObj instanceof CustomAuthDetails details)) {
-            return ResponseEntity.badRequest().body(new ErrorResponse("Invalid authentication details"));
-        }
-        Long userId = details.getUserId();
-
-        UserDto userDto = userService.updateDesiredSkills(userId, desiredSkills);
-        return ResponseEntity.ok(userDto);
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/user/UserDto.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/user/UserDto.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,41 +1,0 @@
-package com.shifterwebapp.shifter.user;
-
-import com.shifterwebapp.shifter.enums.CompanySize;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.util.List;
-
-@Data
-@NoArgsConstructor
-@AllArgsConstructor
-public class UserDto {
-
-    private Long id;
-
-    private String email;
-
-    private String name;
-
-    private Boolean hasUsedFreeConsultation;
-
-    private CompanySize companySize;
-
-    private String workPosition;
-
-    private List<String> interests;
-
-    private List<String> skills;
-
-    private List<String> desiredSkills;
-
-    private Integer points;
-
-    private List<Integer> favoriteCourses;
-
-    private Boolean isAdmin;
-}
-
-
-
Index: ckend/src/main/java/com/shifterwebapp/shifter/user/UserInfoDto.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/user/UserInfoDto.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,13 +1,0 @@
-package com.shifterwebapp.shifter.user;
-
-import com.shifterwebapp.shifter.enums.CompanySize;
-import lombok.Data;
-
-@Data
-public class UserInfoDto {
-
-    public String name;
-    public String workPosition;
-    private CompanySize companySize;
-
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/user/UserMapper.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/user/UserMapper.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,20 +1,0 @@
-package com.shifterwebapp.shifter.user;
-
-import com.shifterwebapp.shifter.payment.PaymentDto;
-import com.shifterwebapp.shifter.payment.PaymentMapper;
-import org.mapstruct.InheritInverseConfiguration;
-import org.mapstruct.Mapper;
-
-import java.util.List;
-
-@Mapper(componentModel = "spring")
-public interface UserMapper {
-
-    UserDto toDto(User user);
-    List<UserDto> toDto(List<User> users);
-
-    @InheritInverseConfiguration
-    User toEntity(UserDto userDto);
-    @InheritInverseConfiguration
-    List<User> toEntity(List<UserDto> userDtos);
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/user/UserRepository.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/user/UserRepository.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,24 +1,0 @@
-package com.shifterwebapp.shifter.user;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.data.repository.query.Param;
-import org.springframework.security.core.parameters.P;
-
-import java.util.Optional;
-
-public interface UserRepository extends JpaRepository<User, Long> {
-
-    boolean existsUserByEmail(String email);
-
-    @Query("select u.email from User u where u.id = :userId")
-    String getUserEmailById(@Param("userId") Long userId);
-
-    Optional<User> findByEmail(String email);
-
-    @Query("select case when count(u) > 0 then true else false end from User u where u.id = :userId and u.isAdmin = true")
-    boolean isAdmin(@Param("userId") Long userId);
-
-    @Query("select u.id from User u where u.email = :email")
-    Optional<Long> findUserIdByEmail(@Param("email") String email);
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/user/service/ImplUserService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/user/service/ImplUserService.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,44 +1,0 @@
-package com.shifterwebapp.shifter.user.service;
-
-import com.shifterwebapp.shifter.auth.UserPersonalizationDto;
-import com.shifterwebapp.shifter.enums.LoginProvider;
-import com.shifterwebapp.shifter.user.UserInfoDto;
-import com.shifterwebapp.shifter.payment.Payment;
-import com.shifterwebapp.shifter.user.User;
-import com.shifterwebapp.shifter.user.UserDto;
-
-import java.util.List;
-
-public interface ImplUserService {
-    List<UserDto> getAllUsers();
-    UserDto getUserById(Long id);
-    User getUserEntityById(Long userId);
-    User getUserEntityByEmail(String email);
-    String getUserEmailById(Long userId);
-    Boolean getUserHasUsedFreeConsultation(String userEmail);
-
-    Boolean existsUserByEmail(String email);
-
-    User createInitialUser(String email, String password, LoginProvider loginProvider);
-    User createUser(UserPersonalizationDto userPersonalizationDto);
-    void deleteUser(Long id);
-
-    UserDto updateUser(Long id, UserInfoDto userInfoDto);
-    UserDto updateInterests(Long id, List<String> interests);
-    UserDto updateDesiredSkills(Long id, List<String> desiredSkills);
-    UserDto updateMail(Long id, String newMail);
-    UserDto updatePassword(Long id, String newPassHash);
-
-    UserDto addSkill(Long id, String newSkill);
-    UserDto addSkills(Long id, List<String> newSkills);
-    UserDto toggleFavoriteCourse(Long userId, Integer newFavoriteCourseId);
-    UserDto addPoints(Long id, Integer newPointsAchieved);
-    UserDto addPayment(Long id, Payment newPayment);
-
-    UserDto removeDesiredSkill(Long id, String removeDesiredSkill);
-    UserDto removeDesiredSkills(Long id, List<String> removeDesiredSkills);
-    UserDto removePoints(Long id, Integer removePointsAchieved);
-    UserDto removePayment(Long id, Payment removePayment);
-
-    void markUserAsUsedFreeConsultation(String userEmail);
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/user/service/UserService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/user/service/UserService.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,277 +1,0 @@
-package com.shifterwebapp.shifter.user.service;
-
-import com.shifterwebapp.shifter.Validate;
-import com.shifterwebapp.shifter.auth.UserPersonalizationDto;
-import com.shifterwebapp.shifter.enums.LoginProvider;
-import com.shifterwebapp.shifter.user.UserInfoDto;
-import com.shifterwebapp.shifter.payment.Payment;
-import com.shifterwebapp.shifter.user.*;
-import lombok.RequiredArgsConstructor;
-import org.springframework.security.crypto.password.PasswordEncoder;
-import org.springframework.stereotype.Service;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@Service
-@RequiredArgsConstructor
-public class UserService implements ImplUserService {
-
-    private final UserRepository userRepository;
-    private final UserMapper userMapper;
-    private final Validate validate;
-    private final PasswordEncoder passwordEncoder;
-
-    @Override
-    public List<UserDto> getAllUsers() {
-        List<User> users = userRepository.findAll();
-        return userMapper.toDto(users);
-    }
-
-    @Override
-    public UserDto getUserById(Long userId) {
-        validate.validateUserExists(userId);
-        User user = userRepository.findById(userId).orElseThrow();
-        return userMapper.toDto(user);
-    }
-
-    @Override
-    public User getUserEntityById(Long userId) {
-        validate.validateUserExists(userId);
-        return userRepository.findById(userId).orElseThrow();
-    }
-
-    @Override
-    public User getUserEntityByEmail(String email) {
-        validate.validateUserExists(email);
-        return userRepository.findByEmail(email).orElseThrow();
-    }
-
-    @Override
-    public String getUserEmailById(Long userId) {
-        validate.validateUserExists(userId);
-        return userRepository.getUserEmailById(userId);
-    }
-
-    @Override
-    public Boolean getUserHasUsedFreeConsultation(String userEmail) {
-        validate.validateUserExists(userEmail);
-        User user = userRepository.findByEmail(userEmail).orElseThrow();
-        return user.getHasUsedFreeConsultation();
-    }
-
-    @Override
-    public Boolean existsUserByEmail(String email) {
-        return userRepository.existsUserByEmail(email);
-    }
-
-    @Override
-    public User createInitialUser(String email, String password, LoginProvider loginProvider) {
-        if (userRepository.existsUserByEmail(email)) {
-            throw new RuntimeException("Email already in use");
-        }
-
-        User user = User.builder()
-                .email(email)
-                .passwordHash(passwordEncoder.encode(password))
-                .isAdmin(false)
-                .hasUsedFreeConsultation(false)
-                .points(0)
-                .loginProvider(loginProvider)
-                .build();
-
-        return userRepository.save(user);
-    }
-
-    @Override
-    public User createUser(UserPersonalizationDto userPersonalizationDto) {
-        User user = userRepository.findByEmail(userPersonalizationDto.getEmail()).orElseThrow();
-
-        user.setName(userPersonalizationDto.getName());
-        user.setCompanySize(userPersonalizationDto.getCompanySize());
-        user.setWorkPosition(userPersonalizationDto.getWorkPosition());
-        user.setInterests(new ArrayList<>(userPersonalizationDto.getInterests()));
-        user.setDesiredSkills(new ArrayList<>(userPersonalizationDto.getDesiredSkills()));
-        user.setSkills(new ArrayList<>());
-        user.setFavoriteCourses(new ArrayList<>());
-
-        return userRepository.save(user);
-    }
-
-    @Override
-    public void deleteUser(Long userId) {
-        validate.validateUserExists(userId);
-        userRepository.deleteById(userId);
-    }
-
-    @Override
-    public UserDto updateUser(Long id, UserInfoDto userInfoDto) {
-        validate.validateUserExists(id);
-        User user = userRepository.findById(id).orElseThrow();
-
-        if (userInfoDto.getName() != null) {
-            user.setName(userInfoDto.getName());
-        }
-        if (userInfoDto.getCompanySize() != null) {
-            user.setCompanySize(userInfoDto.getCompanySize());
-        }
-        if (userInfoDto.getWorkPosition() != null) {
-            user.setWorkPosition(userInfoDto.getWorkPosition());
-        }
-
-        userRepository.save(user);
-        return userMapper.toDto(user);
-    }
-
-    @Override
-    public UserDto updateInterests(Long id, List<String> interests) {
-        validate.validateUserExists(id);
-        User user = userRepository.findById(id).orElseThrow();
-
-        user.setInterests(interests);
-
-        userRepository.save(user);
-        return userMapper.toDto(user);
-    }
-
-    @Override
-    public UserDto updateDesiredSkills(Long id, List<String> desiredSkills) {
-        validate.validateUserExists(id);
-        User user = userRepository.findById(id).orElseThrow();
-
-        user.setDesiredSkills(desiredSkills);
-
-        userRepository.save(user);
-        return userMapper.toDto(user);
-    }
-
-
-    @Override
-    public UserDto updateMail(Long userId, String newMail) {
-        validate.validateUserExists(userId);
-        User user = userRepository.findById(userId).orElseThrow();
-        user.setEmail(newMail);
-        userRepository.save(user);
-        return userMapper.toDto(user);
-    }
-
-    @Override
-    public UserDto updatePassword(Long userId, String newPass) {
-        validate.validateUserExists(userId);
-        User user = userRepository.findById(userId).orElseThrow();
-        user.setPasswordHash(passwordEncoder.encode(newPass));
-        userRepository.save(user);
-        return userMapper.toDto(user);
-    }
-
-    @Override
-    public UserDto addSkill(Long userId, String newSkill) {
-        validate.validateUserExists(userId);
-        User user = userRepository.findById(userId).orElseThrow();
-        if (!user.getSkills().contains(newSkill)) {
-            user.getSkills().add(newSkill);
-        }
-        userRepository.save(user);
-        return userMapper.toDto(user);
-    }
-
-    @Override
-    public UserDto addSkills(Long userId, List<String> newSkills) {
-        validate.validateUserExists(userId);
-        User user = userRepository.findById(userId).orElseThrow();
-        for (String skill : newSkills) {
-            if (!user.getSkills().contains(skill)) {
-                user.getSkills().add(skill);
-            }
-        }
-        userRepository.save(user);
-        return userMapper.toDto(user);
-    }
-
-    @Override
-    public UserDto toggleFavoriteCourse(Long userId, Integer newFavoriteCourseId) {
-        User user = getUserEntityById(userId);
-
-        if (user.getFavoriteCourses().contains(newFavoriteCourseId)) {
-            user.getFavoriteCourses().remove(newFavoriteCourseId);
-        } else {
-            user.getFavoriteCourses().add(newFavoriteCourseId);
-        }
-        userRepository.save(user);
-        return userMapper.toDto(user);
-    }
-
-    @Override
-    public UserDto addPoints(Long userId, Integer newPointsAchieved) {
-        validate.validateUserExists(userId);
-        User user = userRepository.findById(userId).orElseThrow();
-        Integer newPoints = user.getPoints() + newPointsAchieved;
-        user.setPoints(newPoints);
-        userRepository.save(user);
-        return userMapper.toDto(user);
-    }
-
-    @Override
-    public UserDto addPayment(Long userId, Payment newPayment) {
-        validate.validateUserExists(userId);
-        User user = userRepository.findById(userId).orElseThrow();
-        if (!user.getPayments().contains(newPayment)) {
-            user.getPayments().add(newPayment);
-        }
-        userRepository.save(user);
-        return userMapper.toDto(user);
-    }
-
-    @Override
-    public UserDto removeDesiredSkill(Long userId, String removeDesiredSkill) {
-        validate.validateUserExists(userId);
-        User user = userRepository.findById(userId).orElseThrow();
-        if (!user.getDesiredSkills().contains(removeDesiredSkill)) {
-            user.getDesiredSkills().remove(removeDesiredSkill);
-        }
-        userRepository.save(user);
-        return userMapper.toDto(user);
-    }
-
-    @Override
-    public UserDto removeDesiredSkills(Long userId, List<String> removeDesiredSkills) {
-        validate.validateUserExists(userId);
-        User user = userRepository.findById(userId).orElseThrow();
-        for (String skill : removeDesiredSkills) {
-            if (!user.getDesiredSkills().contains(skill)) {
-                user.getDesiredSkills().remove(skill);
-            }
-        }
-        userRepository.save(user);
-        return userMapper.toDto(user);
-    }
-
-    @Override
-    public UserDto removePoints(Long userId, Integer removePointsAchieved) {
-        validate.validateUserExists(userId);
-        User user = userRepository.findById(userId).orElseThrow();
-        Integer newPoints = user.getPoints() - removePointsAchieved;
-        user.setPoints(newPoints);
-        userRepository.save(user);
-        return userMapper.toDto(user);
-    }
-
-    @Override
-    public UserDto removePayment(Long userId, Payment removePayment) {
-        validate.validateUserExists(userId);
-        User user = userRepository.findById(userId).orElseThrow();
-        if (!user.getPayments().contains(removePayment)) {
-            user.getPayments().remove(removePayment);
-        }
-        userRepository.save(user);
-        return userMapper.toDto(user);
-    }
-
-    @Override
-    public void markUserAsUsedFreeConsultation(String email) {
-        validate.validateUserExists(email);
-        User user = userRepository.findByEmail(email).orElseThrow();
-        user.setHasUsedFreeConsultation(true);
-        userRepository.save(user);
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/usercourseprogress/UserCourseProgress.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/usercourseprogress/UserCourseProgress.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,39 +1,0 @@
-package com.shifterwebapp.shifter.usercourseprogress;
-
-import com.shifterwebapp.shifter.coursecontent.CourseContent;
-import com.shifterwebapp.shifter.courselecture.CourseLecture;
-import com.shifterwebapp.shifter.enrollment.Enrollment;
-import jakarta.persistence.*;
-import lombok.*;
-
-import java.time.LocalDateTime;
-
-@Getter
-@Setter
-@NoArgsConstructor
-@AllArgsConstructor
-@Builder
-@Entity
-@ToString
-public class UserCourseProgress {
-
-    @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
-    private Long id;
-
-    private boolean completed;
-
-    private LocalDateTime completedAt;
-
-    @ManyToOne
-    @JoinColumn(name = "enrollment_id")
-    private Enrollment enrollment;
-
-    @ManyToOne
-    @JoinColumn(name = "course_lecture_id")
-    private CourseLecture courseLecture;
-
-    public Long getCourseLectureId() {
-        return courseLecture != null ? courseLecture.getId() : null;
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/usercourseprogress/UserCourseProgressController.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/usercourseprogress/UserCourseProgressController.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,42 +1,0 @@
-package com.shifterwebapp.shifter.usercourseprogress;
-
-import com.shifterwebapp.shifter.Validate;
-import com.shifterwebapp.shifter.enrollment.service.EnrollmentService;
-import com.shifterwebapp.shifter.usercourseprogress.service.UserCourseProgressService;
-import lombok.RequiredArgsConstructor;
-import org.springframework.http.ResponseEntity;
-import org.springframework.security.core.Authentication;
-import org.springframework.web.bind.annotation.*;
-
-@RestController
-@RequiredArgsConstructor
-@RequestMapping("${api.base.path}/progress")
-public class UserCourseProgressController {
-
-    private final UserCourseProgressService userCourseProgressService;
-    private final Validate validate;
-
-    @PutMapping("{progressId}/complete")
-    public ResponseEntity<?> completeUserCourseProgress(
-            @PathVariable Long progressId,
-            Authentication authentication
-    ) {
-        Long userId = validate.extractUserId(authentication);
-
-        userCourseProgressService.completeUserCourseProgress(progressId, userId);
-
-        return ResponseEntity.ok("Successfully completed progress with ID: " + progressId + " for user with ID: " + userId);
-    }
-
-    @PutMapping("{progressId}/uncomplete")
-    public ResponseEntity<?> uncompleteUserCourseProgress(
-            @PathVariable Long progressId,
-            Authentication authentication
-    ) {
-        Long userId = validate.extractUserId(authentication);
-
-        userCourseProgressService.uncompleteUserCourseProgress(progressId, userId);
-
-        return ResponseEntity.ok("Successfully uncompleted progress with ID: " + progressId + " for user with ID: " + userId);
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/usercourseprogress/UserCourseProgressDto.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/usercourseprogress/UserCourseProgressDto.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,18 +1,0 @@
-package com.shifterwebapp.shifter.usercourseprogress;
-
-import com.shifterwebapp.shifter.coursecontent.CourseContentDtoPreview;
-import lombok.*;
-
-import java.time.LocalDateTime;
-
-@Data
-@NoArgsConstructor
-@AllArgsConstructor
-public class UserCourseProgressDto {
-
-    private Long id;
-
-    private boolean completed;
-
-    private LocalDateTime completedAt;
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/usercourseprogress/UserCourseProgressMapper.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/usercourseprogress/UserCourseProgressMapper.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,18 +1,0 @@
-package com.shifterwebapp.shifter.usercourseprogress;
-
-import org.mapstruct.InheritInverseConfiguration;
-import org.mapstruct.Mapper;
-
-import java.util.List;
-
-@Mapper(componentModel = "spring")
-public interface UserCourseProgressMapper {
-
-    UserCourseProgressDto toDto(UserCourseProgress userCourseProgress);
-    List<UserCourseProgressDto> toDto(List<UserCourseProgress> userCourseProgress);
-
-    @InheritInverseConfiguration
-    UserCourseProgress toEntity(UserCourseProgressDto userCourseProgressDto);
-    @InheritInverseConfiguration
-    List<UserCourseProgress> toEntity(List<UserCourseProgressDto> userCourseProgressDtos);
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/usercourseprogress/UserCourseProgressRepository.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/usercourseprogress/UserCourseProgressRepository.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,21 +1,0 @@
-package com.shifterwebapp.shifter.usercourseprogress;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.data.repository.query.Param;
-
-import java.util.List;
-
-public interface UserCourseProgressRepository extends JpaRepository<UserCourseProgress, Long> {
-
-    @Query("select ucp.enrollment.course.id from UserCourseProgress ucp where ucp.id = :progressId")
-    Long getCourseId(@Param("progressId") Long progressId);
-
-    @Query("select ucp.enrollment.id from UserCourseProgress ucp where ucp.id = :progressId")
-    Long getEnrollmentId(@Param("progressId") Long progressId);
-
-    @Query("select ucp from UserCourseProgress ucp where ucp.enrollment.id = :enrollmentId")
-    List<UserCourseProgress> findByEnrollmentId(@Param("enrollmentId") Long enrollmentId);
-
-    @Query("select ucp from UserCourseProgress ucp where ucp.enrollment.id = :enrollmentId and ucp.completed = true")
-    List<UserCourseProgress> findByEnrollmentIdAAndCompletedTrue(@Param("enrollmentId") Long enrollmentId);
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/usercourseprogress/service/ImplUserCourseProgressService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/usercourseprogress/service/ImplUserCourseProgressService.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,18 +1,0 @@
-package com.shifterwebapp.shifter.usercourseprogress.service;
-
-import com.shifterwebapp.shifter.usercourseprogress.UserCourseProgress;
-import com.shifterwebapp.shifter.usercourseprogress.UserCourseProgressDto;
-
-import java.util.List;
-
-public interface ImplUserCourseProgressService {
-
-    List<UserCourseProgress> saveAllUserCourseProgress(List<UserCourseProgress> userCourseProgresses);
-
-    UserCourseProgress completeUserCourseProgress(Long progressId, Long userId);
-
-    UserCourseProgress uncompleteUserCourseProgress(Long progressId, Long userId);
-
-    List<UserCourseProgress> getUserCourseProgressByEnrollment(Long enrollmentId);
-    List<UserCourseProgress> getUserCourseProgressByEnrollmentAndCompletedTrue(Long enrollmentId);
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/usercourseprogress/service/UserCourseProgressService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/usercourseprogress/service/UserCourseProgressService.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,79 +1,0 @@
-package com.shifterwebapp.shifter.usercourseprogress.service;
-
-import com.shifterwebapp.shifter.Validate;
-import com.shifterwebapp.shifter.enrollment.service.EnrollmentService;
-import com.shifterwebapp.shifter.exception.AccessDeniedException;
-import com.shifterwebapp.shifter.usercourseprogress.UserCourseProgress;
-import com.shifterwebapp.shifter.usercourseprogress.UserCourseProgressRepository;
-import lombok.RequiredArgsConstructor;
-import org.springframework.stereotype.Service;
-
-import java.time.LocalDateTime;
-import java.util.List;
-
-@Service
-@RequiredArgsConstructor
-public class UserCourseProgressService implements ImplUserCourseProgressService {
-
-    private final UserCourseProgressRepository userCourseProgressRepository;
-    private final EnrollmentService enrollmentService;
-    private final Validate validate;
-
-    @Override
-    public List<UserCourseProgress> getUserCourseProgressByEnrollment(Long enrollmentId) {
-        return userCourseProgressRepository.findByEnrollmentId(enrollmentId);
-    }
-
-    @Override
-    public List<UserCourseProgress> getUserCourseProgressByEnrollmentAndCompletedTrue(Long enrollmentId) {
-        return userCourseProgressRepository.findByEnrollmentIdAAndCompletedTrue(enrollmentId);
-    }
-
-    @Override
-    public List<UserCourseProgress> saveAllUserCourseProgress(List<UserCourseProgress> userCourseProgresses) {
-        return userCourseProgressRepository.saveAll(userCourseProgresses);
-    }
-
-    @Override
-    public UserCourseProgress completeUserCourseProgress(Long progressId, Long userId) {
-        validate.validateUserCourseProgressExists(progressId);
-
-        Long courseId = userCourseProgressRepository.getCourseId(progressId);
-        Long enrollmentId = userCourseProgressRepository.getEnrollmentId(progressId);
-
-        boolean isUserEnrolledInCourse = enrollmentService.isUserEnrolledInCourse(userId, courseId);
-        if (!isUserEnrolledInCourse) {
-            throw new AccessDeniedException("User is not enrolled in the course with ID: " + courseId + " to update progress with ID: " + progressId);
-        }
-
-        enrollmentService.updateEnrollmentStatusToCompleted(enrollmentId);
-
-        UserCourseProgress userCourseProgress = userCourseProgressRepository.findById(progressId).orElseThrow();
-        userCourseProgress.setCompleted(true);
-        userCourseProgress.setCompletedAt(LocalDateTime.now());
-        userCourseProgressRepository.save(userCourseProgress);
-
-        return userCourseProgress;
-    }
-
-    @Override
-    public UserCourseProgress uncompleteUserCourseProgress(Long progressId, Long userId) {
-        validate.validateUserCourseProgressExists(progressId);
-
-        Long courseId = userCourseProgressRepository.getCourseId(progressId);
-
-        boolean isUserEnrolledInCourse = enrollmentService.isUserEnrolledInCourse(userId, courseId);
-        if (!isUserEnrolledInCourse) {
-            throw new AccessDeniedException("User is not enrolled in the course with ID: " + courseId + " to update progress with ID: " + progressId);
-        }
-
-        UserCourseProgress userCourseProgress = userCourseProgressRepository.findById(progressId).orElseThrow();
-        userCourseProgress.setCompleted(false);
-        userCourseProgress.setCompletedAt(LocalDateTime.now());
-        userCourseProgressRepository.save(userCourseProgress);
-
-        return userCourseProgress;
-    }
-
-
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/verificationtoken/VerificationToken.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/verificationtoken/VerificationToken.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,30 +1,0 @@
-package com.shifterwebapp.shifter.verificationtoken;
-
-import com.shifterwebapp.shifter.user.User;
-import jakarta.persistence.*;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.time.Instant;
-import java.util.UUID;
-
-@AllArgsConstructor
-@NoArgsConstructor
-@Data
-@Entity
-@Builder
-public class VerificationToken {
-
-    @Id
-    private UUID token;
-
-    @OneToOne(fetch = FetchType.LAZY)
-    @JoinColumn(name = "user_id")
-    private User user;
-
-    private Instant createdAt = Instant.now();
-
-    private Instant expiresAt;
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/verificationtoken/VerificationTokenRepository.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/verificationtoken/VerificationTokenRepository.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,9 +1,0 @@
-package com.shifterwebapp.shifter.verificationtoken;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-
-import java.util.UUID;
-
-public interface VerificationTokenRepository extends JpaRepository<VerificationToken, UUID> {
-
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/verificationtoken/service/ImplVerificationTokenService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/verificationtoken/service/ImplVerificationTokenService.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,9 +1,0 @@
-package com.shifterwebapp.shifter.verificationtoken.service;
-
-import com.shifterwebapp.shifter.user.User;
-
-import java.util.UUID;
-
-public interface ImplVerificationTokenService {
-    public UUID generateNewToken(User user);
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/verificationtoken/service/VerificationTokenService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/verificationtoken/service/VerificationTokenService.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,34 +1,0 @@
-package com.shifterwebapp.shifter.verificationtoken.service;
-
-import com.shifterwebapp.shifter.Validate;
-import com.shifterwebapp.shifter.user.User;
-import com.shifterwebapp.shifter.verificationtoken.VerificationToken;
-import com.shifterwebapp.shifter.verificationtoken.VerificationTokenRepository;
-import lombok.RequiredArgsConstructor;
-import org.springframework.stereotype.Service;
-
-import java.time.Duration;
-import java.time.Instant;
-import java.util.UUID;
-
-@Service
-@RequiredArgsConstructor
-public class VerificationTokenService implements ImplVerificationTokenService {
-
-    private final VerificationTokenRepository verificationTokenRepository;
-    private final Validate validate;
-
-    private final long tokenExpiryMinutes = 60;
-
-    @Override
-    public UUID generateNewToken(User user) {
-        UUID token = UUID.randomUUID();
-        VerificationToken newVerificationToken = VerificationToken.builder()
-                .user(user)
-                .token(token)
-                .expiresAt(Instant.now().plus(Duration.ofMinutes(tokenExpiryMinutes)))
-                .build();
-        verificationTokenRepository.save(newVerificationToken);
-        return token;
-    }
-}
Index: backend/src/main/resources/application.properties
===================================================================
--- backend/src/main/resources/application.properties	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ backend/src/main/resources/application.properties	(revision 0672351328b09eb632b662e1c87b53be8e8e5b3f)
@@ -1,73 +1,1 @@
-# application.properties
-
-# General app config
 spring.application.name=Shifter
-
-#spring.datasource.hikari.data-source-properties.useServerPrepStmts=false
-#spring.datasource.hikari.data-source-properties.prepareThreshold=0
-
-logging.level.org.springframework.security=DEBUG
-spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
-
-# JPA & Hibernate
-spring.jpa.hibernate.ddl-auto=update
-spring.jpa.show-sql=false
-#spring.jpa.properties.hibernate.format_sql=true
-#logging.level.org.hibernate.SQL=DEBUG
-#logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
-
-
-# Optional HikariCP settings
-spring.datasource.hikari.maximum-pool-size=10
-
-# Base API path
-api.base.path=/api
-api.admin.path=/api/admin
-
-#spring.profiles.active=dev
-
-# Max file size
-spring.servlet.multipart.max-file-size=500MB
-spring.servlet.multipart.max-request-size=550MB
-
-logging.level.org.springframework.web=DEBUG
-logging.level.org.apache.coyote.http11=DEBUG
-
-
-# PostgreSQL connection
-spring.datasource.driver-class-name=org.postgresql.Driver
-spring.datasource.url=${SPRING_DATASOURCE_URL}
-spring.datasource.username=${SPRING_DATASOURCE_USERNAME}
-spring.datasource.password=${SPRING_DATASOURCE_PASSWORD}
-
-# Amazon S3 configuration
-aws.region=${AWS_S3_REGION}
-aws.s3.bucket-name=${AWS_S3_BUCKET_NAME}
-aws.access-key=${AWS_S3_ACCESS_KEY}
-aws.secret-key=${AWS_S3_SECRET_KEY}
-
-# JWT Configuration Key
-jwt.secret=${JWT_CONFIG_SECRET}
-
-# Email configuration
-spring.mail.host=${EMAIL_HOST}
-spring.mail.port=${EMAIL_PORT}
-spring.mail.username=${EMAIL_USERNAME}
-spring.mail.password=${EMAIL_PASSWORD}
-spring.mail.protocol=smtp
-spring.mail.properties.mail.smtp.auth=true
-spring.mail.properties.mail.smtp.starttls.enable=true
-spring.mail.properties.mail.smtp.starttls.required=true
-
-# Google
-spring.security.oauth2.client.registration.google.client-id=${GOOGLE_CLIENT_ID}
-spring.security.oauth2.client.registration.google.client-secret=${GOOGLE_CLIENT_SECRET}
-spring.security.oauth2.client.registration.google.scope=email,profile
-spring.security.oauth2.client.registration.google.redirect-uri=http://localhost:8080/login/oauth2/code/google
-
-spring.security.oauth2.client.provider.google.authorization-uri=https://accounts.google.com/o/oauth2/v2/auth
-spring.security.oauth2.client.provider.google.token-uri=https://oauth2.googleapis.com/token
-spring.security.oauth2.client.provider.google.user-info-uri=https://www.googleapis.com/oauth2/v3/userinfo
-spring.security.oauth2.client.provider.google.user-name-attribute=sub
-
-
Index: ckend/src/main/resources/email-templates/consultation_reminder.html
===================================================================
--- backend/src/main/resources/email-templates/consultation_reminder.html	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,175 +1,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <title>${subject}</title>
-    <style>
-        /* Universal inline styles for email client compatibility */
-        body, p, h1, h2, h3, h4, h5, h6 {
-            margin: 0;
-            padding: 0;
-        }
-
-        body {
-            font-family: Arial, Helvetica, sans-serif;
-            font-size: 16px;
-            line-height: 1.6;
-            color: #333333;
-            background-color: #F8F6F5; /* mainBgColor */
-        }
-
-        table {
-            border-collapse: collapse;
-        }
-
-        a {
-            text-decoration: none;
-        }
-
-        .button {
-            display: inline-block;
-            padding: 12px 24px;
-            border-radius: 4px;
-            background-color: #008CC2; /* primaryColor/buttonBgColor */
-            color: #ffffff !important;
-            font-weight: bold;
-            text-decoration: none;
-            font-size: 16px;
-            text-align: center; /* Ensures text is centered */
-            width: auto; /* Ensure button width adapts */
-        }
-    </style>
-</head>
-<body>
-<table width="100%%" bgcolor="#F8F6F5" border="0" cellpadding="0" cellspacing="0" role="presentation">
-    <tr>
-        <td align="center">
-            <table width="600" style="max-width: 600px;" border="0" cellpadding="0" cellspacing="0" role="presentation">
-                <tr>
-                    <td height="30">&nbsp;</td>
-                </tr>
-
-                <tr>
-                    <td align="left" style="padding: 0 20px;">
-                        <table width="100%%" border="0" cellpadding="0" cellspacing="0" role="presentation">
-                            <tr>
-                                <td align="left" style="padding-bottom: 10px;">
-                                    <a href="https://www.shift-er.com" target="_blank">
-                                        <img src="https://shift-er.s3.eu-north-1.amazonaws.com/public/Shifter-Logo-Black.png" alt="Shifter Logo" width="120"
-                                             style="display: block; border: 0;">
-                                    </a>
-                                </td>
-                                <td align="right" style="font-size: 14px; color: #666666;">
-                                    <a href="https://www.shift-er.com/learn" target="_blank"
-                                       style="color: #666666; text-decoration: none;">My Courses</a>
-                                    |
-                                    <a href="https://www.shift-er.com/courses" target="_blank"
-                                       style="color: #666666; text-decoration: none;">Course Catalog</a>
-                                </td>
-                            </tr>
-                        </table>
-                    </td>
-                </tr>
-
-                <tr>
-                    <td height="20">&nbsp;</td>
-                </tr>
-
-                <tr>
-                    <td align="center" bgcolor="#FFFFFF"
-                        style="border-radius: 8px; padding: 40px 40px 30px 40px; box-shadow: 0 4px 8px rgba(0,0,0,0.05);">
-                        <table width="100%%" border="0" cellpadding="0" cellspacing="0" role="presentation">
-                            <tr>
-                                <td align="left">
-                                    <h1 style="font-size: 30px; line-height: 1.2; margin-bottom: 20px;">
-                                        ${reminderHeading}</h1>
-                                </td>
-                            </tr>
-                            <tr>
-                                <td align="left">
-                                    <p style="font-size: 16px; line-height: 1.6; color: #555555; margin-bottom: 20px;">
-                                        ${reminderText}
-                                    </p>
-                                </td>
-                            </tr>
-
-                            <tr>
-                                <td align="left" style="padding: 10px 0 25px 0;">
-                                    <table width="100%" border="0" cellpadding="0" cellspacing="0" style="font-size: 16px;">
-                                        <tr>
-                                            <td width="30%" style="font-weight: bold; padding-bottom: 8px; color: #222222;">Date:</td>
-                                            <td width="70%" style="padding-bottom: 8px; color: #333333;">${meetingDate}</td>
-                                        </tr>
-                                        <tr>
-                                            <td style="font-weight: bold; padding-bottom: 8px; color: #222222;">Time:</td>
-                                            <td style="padding-bottom: 8px; color: #333333;">${meetingTime}</td>
-                                        </tr>
-                                        <tr>
-                                            <td style="font-weight: bold; padding-bottom: 8px; color: #222222;">Location:</td>
-                                            <td style="padding-bottom: 8px; color: #333333;">Online - Zoom</td>
-                                        </tr>
-                                    </table>
-                                </td>
-                            </tr>
-
-                            <tr>
-                                <td align="center" style="padding: 10px 0 30px 0;">
-                                    <table border="0" cellpadding="0" cellspacing="0" role="presentation">
-                                        <tr>
-                                            <td align="center">
-                                                <a href="${zoomLink}" target="_blank" class="button">
-                                                    CLICK HERE TO JOIN
-                                                </a>
-                                            </td>
-                                        </tr>
-                                    </table>
-
-                                    <p style="font-size: 14px; line-height: 1.5; color: #555555; margin-top: 15px;">
-                                        If the button doesn't work, join here:
-                                        <br>
-                                        <a href="${zoomLink}" target="_blank" style="color: #008CC2; word-break: break-all; text-decoration: underline;">
-                                            ${zoomLink}
-                                        </a>
-                                    </p>
-                                </td>
-                            </tr>
-
-                            <tr>
-                                <td align="left">
-                                    <p style="font-size: 16px; line-height: 1.6; color: #555555; margin-bottom: 15px;">
-                                        This session is designed to understand your challenges, goals, and preferences. Our expert will provide valuable insights and a personalized program recommendation.
-                                    </p>
-                                    <p style="font-size: 16px; line-height: 1.6; color: #555555; margin-bottom: 0;">
-                                        <strong>We look forward to helping you take the next step!</strong>
-                                    </p>
-
-                                    <p style="font-size: 16px; line-height: 1.6; color: #555555; margin-top: 15px;">
-                                        If you need to <strong>reschedule or cancel</strong>, please send an email to our dedicated support team here:
-                                        <a href="mailto:support@shift-er.com" style="color: #008CC2; text-decoration: underline;">support@shift-er.com</a>
-                                    </p>
-                                </td>
-                            </tr>
-                        </table>
-                    </td>
-                </tr>
-
-                <tr>
-                    <td height="30">&nbsp;</td>
-                </tr>
-                <tr>
-                    <td align="center" style="font-size: 12px; color: #666666; padding: 0 20px;">
-                        <p>&copy; ${currentYear} Shifter. All rights reserved.</p>
-                        <p style="margin-top: 10px;">Need Help? Contact our support at <a
-                                href="mailto:support@shift-er.com" style="color: #666666;">support@shift-er.com</a></p>
-                    </td>
-                </tr>
-                <tr>
-                    <td height="30">&nbsp;</td>
-                </tr>
-            </table>
-        </td>
-    </tr>
-</table>
-</body>
-</html>
Index: ckend/src/main/resources/email-templates/course_purchase_confirmation.html
===================================================================
--- backend/src/main/resources/email-templates/course_purchase_confirmation.html	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,182 +1,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <title>Welcome to ${courseName}!</title>
-    <style>
-        /* Universal inline styles for email client compatibility */
-        body, p, h1, h2, h3, h4, h5, h6 {
-            margin: 0;
-            padding: 0;
-        }
-
-        body {
-            font-family: Arial, Helvetica, sans-serif;
-            font-size: 16px;
-            line-height: 1.6;
-            color: #333333;
-            background-color: #F8F6F5;
-        }
-
-        table {
-            border-collapse: collapse;
-        }
-
-        a {
-            text-decoration: none;
-        }
-
-        .button {
-            display: inline-block;
-            padding: 12px 24px;
-            border-radius: 4px;
-            background-color: #008CC2;
-            color: #ffffff !important;
-            font-weight: bold;
-            text-decoration: none;
-            font-size: 16px;
-        }
-    </style>
-</head>
-<body>
-<table width="100%%" bgcolor="#F8F6F5" border="0" cellpadding="0" cellspacing="0" role="presentation">
-    <tr>
-        <td align="center">
-            <table width="600" style="max-width: 600px;" border="0" cellpadding="0" cellspacing="0" role="presentation">
-                <tr>
-                    <td height="30">&nbsp;</td>
-                </tr>
-
-                <!--TOP LINKS-->
-                <tr>
-                    <td align="left" style="padding: 0 20px;">
-                        <table width="100%%" border="0" cellpadding="0" cellspacing="0" role="presentation">
-                            <tr>
-                                <td align="left" style="padding-bottom: 10px;">
-                                    <a href="https://www.shift-er.com" target="_blank">
-                                        <img src="https://shift-er.s3.eu-north-1.amazonaws.com/public/Shifter-Logo-Black.png" alt="Shifter Logo" width="120"
-                                             style="display: block; border: 0;">
-                                    </a>
-                                </td>
-                                <td align="right" style="font-size: 14px; color: #666666;">
-                                    <a href="https://www.shift-er.com/learn" target="_blank"
-                                       style="color: #666666; text-decoration: none;">My Courses</a>
-                                    |
-                                    <a href="https://www.shift-er.com/courses" target="_blank"
-                                       style="color: #666666; text-decoration: none;">Course Catalog</a>
-                                </td>
-                            </tr>
-                        </table>
-                    </td>
-                </tr>
-
-                <tr>
-                    <td height="20">&nbsp;</td>
-                </tr>
-
-                <!--SECTION-->
-                <tr>
-                    <td align="center" bgcolor="#FFFFFF"
-                        style="border-radius: 8px; padding: 40px 40px 30px 40px; box-shadow: 0 4px 8px rgba(0,0,0,0.05);">
-                        <table width="100%%" border="0" cellpadding="0" cellspacing="0" role="presentation">
-                            <tr>
-                                <td align="left">
-                                    <h1 style="font-size: 32px; line-height: 1.2; color: #222222; margin-bottom: 20px;">
-                                        Start learning today!</h1>
-                                </td>
-                            </tr>
-                            <tr>
-                                <td align="left">
-                                    <table width="100%%" border="0" cellpadding="0" cellspacing="0" role="presentation">
-                                        <tr>
-                                            <td width="100%%" valign="top">
-                                                <h2 style="font-size: 24px; font-weight: bold; margin-bottom: 15px;">
-                                                    Welcome to <span style="color: #008CC2;">${courseName}!</span></h2>
-                                                <p style="font-size: 16px; line-height: 1.6; color: #555555; margin-bottom: 20px;">
-                                                    ${courseDescription}
-                                                </p>
-                                                <a href="${accessUrl}" target="_blank" class="button">
-                                                    Start Learning
-                                                </a>
-                                            </td>
-                                        </tr>
-                                    </table>
-                                </td>
-                            </tr>
-
-                            <tr>
-                                <td height="20px" ></td>
-                            </tr>
-                            <tr>
-                                <td height="1" style="font-size: 1px; line-height: 1px; background-color: #DDDDDD;">
-                                    &nbsp;
-                                </td>
-                            </tr>
-                            <tr>
-                                <td height="20px" ></td>
-                            </tr>
-
-                            <tr>
-                                <td align="center" bgcolor="#FFFFFF">
-                                    <table width="100%%" border="0" cellpadding="0" cellspacing="0" role="presentation">
-                                        <tr>
-                                            <td align="left">
-                                                <h3 style="font-size: 20px; font-weight: bold; color: #222222; margin-bottom: 15px;">
-                                                    Tips to Maximize Your Learning Journey
-                                                </h3>
-                                                <ol style="padding-left: 20px; margin-top: 10px; font-size: 14px; line-height: 1.5; color: #555555;">
-                                                    <li style="margin-bottom: 10px;">
-                                                        <strong>Explain what you learned to someone else</strong>
-                                                        The best way to check your understanding is to teach the concept.
-                                                        If you can explain it simply, you know it well.
-                                                    </li>
-                                                    <li style="margin-bottom: 10px;">
-                                                        <strong>Eliminate distractions during study blocks.</strong>
-                                                        When you sit down to learn, silence your phone and close unnecessary tabs.
-                                                        Focused, shorter sessions are more effective than distracted, long ones.
-                                                    </li>
-                                                    <li style="margin-bottom: 10px;">
-                                                        <strong>Take frequent, short breaks</strong>
-                                                        Stepping away from your screen every 45-60 minutes keeps your mind fresh and prevents burnout.
-                                                        Grab water or stretch!
-                                                    </li>
-                                                    <li style="margin-bottom: 10px;">
-                                                        <strong>Take notes in your own words.</strong>
-                                                        Writing down key concepts helps your brain process and retain information much better than simply reading or listening.
-                                                    </li>
-                                                </ol>
-                                            </td>
-                                        </tr>
-                                    </table>
-                                </td>
-                            </tr>
-                        </table>
-                    </td>
-                </tr>
-
-                <tr>
-                    <td height="30">&nbsp;</td>
-                </tr>
-                <tr>
-                    <td align="center" style="font-size: 12px; color: #666666; padding: 0 20px;">
-                        <p>&copy; ${currentYear} Shifter. All rights reserved.</p>
-<!--                        <p style="margin-top: 5px;">-->
-<!--                            <a href="https://your-domain.com/privacy" target="_blank" style="color: #666666;">Privacy-->
-<!--                                Policy</a> |-->
-<!--                            <a href="https://your-domain.com/terms" target="_blank" style="color: #666666;">Terms of-->
-<!--                                Service</a>-->
-<!--                        </p>-->
-                        <p style="margin-top: 10px;">Need Help? Contact our support at <a
-                                href="mailto:support@shift-er.com" style="color: #666666;">support@shift-er.com</a></p>
-                    </td>
-                </tr>
-                <tr>
-                    <td height="30">&nbsp;</td>
-                </tr>
-            </table>
-        </td>
-    </tr>
-</table>
-</body>
-</html>
Index: ckend/src/main/resources/email-templates/expert_meeting_info.html
===================================================================
--- backend/src/main/resources/email-templates/expert_meeting_info.html	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,203 +1,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <title>${subject}</title>
-    <style>
-        /* Universal inline styles for email client compatibility */
-        body, p, h1, h2, h3, h4, h5, h6 {
-            margin: 0;
-            padding: 0;
-        }
-
-        body {
-            font-family: Arial, Helvetica, sans-serif;
-            font-size: 16px;
-            line-height: 1.6;
-            color: #333333;
-            background-color: #F8F6F5; /* mainBgColor */
-        }
-
-        table {
-            border-collapse: collapse;
-        }
-
-        a {
-            text-decoration: none;
-        }
-    </style>
-</head>
-<body>
-<table width="100%%" bgcolor="#F8F6F5" border="0" cellpadding="0" cellspacing="0" role="presentation">
-    <tr>
-        <td align="center">
-            <table width="600" style="max-width: 600px;" border="0" cellpadding="0" cellspacing="0" role="presentation">
-                <tr>
-                    <td height="30">&nbsp;</td>
-                </tr>
-
-                <tr>
-                    <td align="left" style="padding: 0 20px;">
-                        <table width="100%%" border="0" cellpadding="0" cellspacing="0" role="presentation">
-                            <tr>
-                                <td align="left" style="padding-bottom: 10px;">
-                                    <a href="https://www.shift-er.com" target="_blank">
-                                        <img src="https://shift-er.s3.eu-north-1.amazonaws.com/public/Shifter-Logo-Black.png" alt="Shifter Logo" width="120"
-                                             style="display: block; border: 0;">
-                                    </a>
-                                </td>
-                                <td align="right" style="font-size: 14px; color: #666666;">
-                                    Internal Notification
-                                </td>
-                            </tr>
-                        </table>
-                    </td>
-                </tr>
-
-                <tr>
-                    <td height="20">&nbsp;</td>
-                </tr>
-
-                <tr>
-                    <td align="center" bgcolor="#FFFFFF"
-                        style="border-radius: 8px; padding: 30px 40px; box-shadow: 0 4px 8px rgba(0,0,0,0.05);">
-                        <table width="100%%" border="0" cellpadding="0" cellspacing="0" role="presentation">
-
-                            <tr>
-                                <td align="left" style="padding-bottom: 20px;">
-                                    <h1 style="font-size: 26px; line-height: 1.2; color: #222222; margin-bottom: 10px;">
-                                        New Consultation Booked!
-                                    </h1>
-                                    <p style="font-size: 16px; line-height: 1.6; color: #555555;">
-                                        A new user has booked a free consultation session. Please review the details below.
-                                    </p>
-                                </td>
-                            </tr>
-
-                            <tr>
-                                <td align="left">
-                                    <h2 style="font-size: 20px; font-weight: bold; margin-top: 15px; margin-bottom: 15px;">
-                                        Session Details
-                                    </h2>
-                                    <table width="100%" border="0" cellpadding="0" cellspacing="0" style="font-size: 16px; margin-bottom: 20px;">
-                                        <tr>
-                                            <td width="30%" style="font-weight: bold; padding-bottom: 8px; color: #222222;">Date:</td>
-                                            <td width="70%" style="padding-bottom: 8px; color: #333333;">${date}</td>
-                                        </tr>
-                                        <tr>
-                                            <td style="font-weight: bold; padding-bottom: 8px; color: #222222;">Time:</td>
-                                            <td style="padding-bottom: 8px; color: #333333;">${time}</td>
-                                        </tr>
-                                        <tr>
-                                            <td style="font-weight: bold; padding-bottom: 8px; color: #222222;">Zoom Link:</td>
-                                            <td style="padding-bottom: 8px;">
-                                                <a href="${zoomLink}" style="color: #008CC2; text-decoration: underline;" target="_blank">Join Meeting</a>
-                                            </td>
-                                        </tr>
-                                    </table>
-                                </td>
-                            </tr>
-
-                            <tr>
-                                <td height="1" style="font-size: 1px; line-height: 1px; background-color: #DDDDDD;">
-                                    &nbsp;
-                                </td>
-                            </tr>
-
-                            <tr>
-                                <td align="left">
-                                    <h2 style="font-size: 20px; font-weight: bold; color: #222222; margin-top: 15px; margin-bottom: 15px;">
-                                        User Information
-                                    </h2>
-                                    <table width="100%" border="0" cellpadding="0" cellspacing="0" style="font-size: 16px; margin-bottom: 20px;">
-                                        <tr>
-                                            <td width="30%" style="font-weight: bold; padding-bottom: 8px; color: #222222;">Name:</td>
-                                            <td width="70%" style="padding-bottom: 8px; color: #333333;">${name}</td>
-                                        </tr>
-                                        <tr>
-                                            <td style="font-weight: bold; padding-bottom: 8px; color: #222222;"> Email:</td>
-                                            <td style="padding-bottom: 8px;"><a href="mailto:${email}" style="color: #008CC2; text-decoration: underline;">${email}</a></td>
-                                        </tr>
-                                        <tr>
-                                            <td style="font-weight: bold; padding-bottom: 8px; color: #222222;">Company Type:</td>
-                                            <td style="padding-bottom: 8px; color: #333333;">${companyType}</td>
-                                        </tr>
-                                        <tr>
-                                            <td style="font-weight: bold; padding-bottom: 8px; color: #222222;">Position:</td>
-                                            <td style="padding-bottom: 8px; color: #333333;">${workPosition}</td>
-                                        </tr>
-                                        <tr>
-                                            <td style="font-weight: bold; padding-bottom: 8px; color: #222222;">Time Zone:</td>
-                                            <td style="padding-bottom: 8px; color: #333333;">${userTimeZone}</td>
-                                        </tr>
-                                    </table>
-                                </td>
-                            </tr>
-
-                            <tr>
-                                <td align="left">
-                                    <h3 style="font-size: 18px; font-weight: bold; color: #222222; margin-top: 10px; margin-bottom: 10px;">
-                                        About the Company:
-                                    </h3>
-                                    <p style="font-size: 16px; line-height: 1.6; color: #555555; margin-bottom: 20px; padding: 10px; background-color: #F8F8F8; border-left: 3px solid #008CC2;">
-                                        ${aboutCompany}
-                                    </p>
-
-                                    <h3 style="font-size: 18px; font-weight: bold; color: #222222; margin-top: 10px; margin-bottom: 10px;">
-                                        Current Challenges:
-                                    </h3>
-                                    <p style="font-size: 16px; line-height: 1.6; color: #555555; margin-bottom: 20px; padding: 10px; background-color: #F8F8F8; border-left: 3px solid #008CC2;">
-                                        ${challenges}
-                                    </p>
-
-                                    <h3 style="font-size: 18px; font-weight: bold; color: #222222; margin-top: 10px; margin-bottom: 10px;">
-                                        Expectations from the Session:
-                                    </h3>
-                                    <p style="font-size: 16px; line-height: 1.6; color: #555555; margin-bottom: 20px; padding: 10px; background-color: #F8F8F8; border-left: 3px solid #008CC2;">
-                                        ${expectations}
-                                    </p>
-
-                                    <h3 style="font-size: 18px; font-weight: bold; color: #222222; margin-top: 10px; margin-bottom: 10px;">
-                                        Additional Information:
-                                    </h3>
-                                    <p style="font-size: 16px; line-height: 1.6; color: #555555; margin-bottom: 20px; padding: 10px; background-color: #F8F8F8; border-left: 3px solid #008CC2;">
-                                        ${otherInfo}
-                                    </p>
-                                </td>
-                            </tr>
-
-                            <tr>
-                                <td align="left" style="padding-top: 20px;">
-                                    <p style="font-size: 16px; line-height: 1.6; color: #333333; font-weight: bold;">
-                                        Please review this information before the session to provide the best personalized guidance.
-                                    </p>
-                                    <p style="font-size: 16px; line-height: 1.6; color: #555555; margin-top: 10px;">
-                                        Best regards,
-                                        <br>
-                                        The Shifter Team
-                                    </p>
-                                </td>
-                            </tr>
-                        </table>
-                    </td>
-                </tr>
-
-                <tr>
-                    <td height="30">&nbsp;</td>
-                </tr>
-
-                <tr>
-                    <td align="center" style="font-size: 12px; color: #666666; padding: 0 20px;">
-                        <p>&copy; ${currentYear} Shifter. All rights reserved.</p>
-                    </td>
-                </tr>
-                <tr>
-                    <td height="30">&nbsp;</td>
-                </tr>
-            </table>
-        </td>
-    </tr>
-</table>
-</body>
-</html>
Index: ckend/src/main/resources/email-templates/free_consultation_confirmation.html
===================================================================
--- backend/src/main/resources/email-templates/free_consultation_confirmation.html	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,159 +1,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <title>Your Free Consultation is Scheduled!</title>
-    <style>
-        /* Universal inline styles for email client compatibility */
-        body, p, h1, h2, h3, h4, h5, h6 {
-            margin: 0;
-            padding: 0;
-        }
-
-        body {
-            font-family: Arial, Helvetica, sans-serif;
-            font-size: 16px;
-            line-height: 1.6;
-            color: #333333;
-            background-color: #F8F6F5; /* mainBgColor */
-        }
-
-        table {
-            border-collapse: collapse;
-        }
-
-        a {
-            text-decoration: none;
-        }
-
-        /* The .button class is still defined but not used here */
-        .button {
-            display: inline-block;
-            padding: 12px 24px;
-            border-radius: 4px;
-            background-color: #008CC2; /* primaryColor/buttonBgColor */
-            color: #ffffff !important;
-            font-weight: bold;
-            text-decoration: none;
-            font-size: 16px;
-        }
-    </style>
-</head>
-<body>
-<table width="100%%" bgcolor="#F8F6F5" border="0" cellpadding="0" cellspacing="0" role="presentation">
-    <tr>
-        <td align="center">
-            <table width="600" style="max-width: 600px;" border="0" cellpadding="0" cellspacing="0" role="presentation">
-                <tr>
-                    <td height="30">&nbsp;</td>
-                </tr>
-
-                <tr>
-                    <td align="left" style="padding: 0 20px;">
-                        <table width="100%%" border="0" cellpadding="0" cellspacing="0" role="presentation">
-                            <tr>
-                                <td align="left" style="padding-bottom: 10px;">
-                                    <a href="https://www.shift-er.com" target="_blank">
-                                        <img src="https://shift-er.s3.eu-north-1.amazonaws.com/public/Shifter-Logo-Black.png" alt="Shifter Logo" width="120"
-                                             style="display: block; border: 0;">
-                                    </a>
-                                </td>
-                                <td align="right" style="font-size: 14px; color: #666666;">
-                                    <a href="https://www.shift-er.com/learn" target="_blank"
-                                       style="color: #666666; text-decoration: none;">My Courses</a>
-                                    |
-                                    <a href="https://www.shift-er.com/courses" target="_blank"
-                                       style="color: #666666; text-decoration: none;">Course Catalog</a>
-                                </td>
-                            </tr>
-                        </table>
-                    </td>
-                </tr>
-
-                <tr>
-                    <td height="20">&nbsp;</td>
-                </tr>
-
-                <tr>
-                    <td align="center" bgcolor="#FFFFFF"
-                        style="border-radius: 8px; padding: 40px 40px 30px 40px; box-shadow: 0 4px 8px rgba(0,0,0,0.05);">
-                        <table width="100%%" border="0" cellpadding="0" cellspacing="0" role="presentation">
-                            <tr>
-                                <td align="left">
-                                    <h1 style="font-size: 30px; line-height: 1.2; margin-bottom: 20px;">
-                                        Consultation Scheduled!</h1>
-                                </td>
-                            </tr>
-                            <tr>
-                                <td align="left">
-                                    <p style="font-size: 16px; line-height: 1.6; color: #555555; margin-bottom: 20px;">
-                                        Thank you for booking a session with us. Your free consultation is successfully confirmed. Here are the details:
-                                    </p>
-                                </td>
-                            </tr>
-
-                            <tr>
-                                <td align="left" style="padding: 10px 0 25px 0;">
-                                    <table width="100%" border="0" cellpadding="0" cellspacing="0" style="font-size: 16px;">
-                                        <tr>
-                                            <td width="30%" style="font-weight: bold; padding-bottom: 8px; color: #222222;">Date:</td>
-                                            <td width="70%" style="padding-bottom: 8px; color: #333333;">${date}</td>
-                                        </tr>
-                                        <tr>
-                                            <td style="font-weight: bold; padding-bottom: 8px; color: #222222;">Time:</td>
-                                            <td style="padding-bottom: 8px; color: #333333;">${time}</td>
-                                        </tr>
-                                        <tr>
-                                            <td style="font-weight: bold; padding-bottom: 8px; color: #222222;">Location:</td>
-                                            <td style="padding-bottom: 8px; color: #333333;">Online - Zoom</td>
-                                        </tr>
-                                        <tr>
-                                            <td style="font-weight: bold; padding-bottom: 8px; color: #222222;">Link:</td>
-                                            <td style="padding-bottom: 8px;">
-                                                <a href="${zoomLink}" style="color: #008CC2; text-decoration: underline;" target="_blank">Join Meeting Here</a>
-                                            </td>
-                                        </tr>
-                                    </table>
-                                </td>
-                            </tr>
-
-                            <tr>
-                                <td align="left">
-                                    <p style="font-size: 16px; line-height: 1.6; color: #555555; margin-bottom: 15px;">
-                                        This session is designed to understand your challenges, goals, and preferences. Our expert will provide valuable insights and a personalized program recommendation.
-                                    </p>
-                                    <p style="font-size: 16px; line-height: 1.6; color: #555555; margin-bottom: 0;">
-                                        <strong>We look forward to helping you take the next step!</strong>
-                                    </p>
-
-                                    <p style="font-size: 16px; line-height: 1.6; color: #555555; margin-top: 15px;">
-                                        If you need to <strong>reschedule or cancel</strong>, please send an email to our dedicated support team here:
-                                        <a href="mailto:support@shift-er.com" style="color: #008CC2; text-decoration: underline;">support@shift-er.com</a>
-                                    </p>
-                                </td>
-                            </tr>
-
-                        </table>
-                    </td>
-                </tr>
-
-                <tr>
-                    <td height="30">&nbsp;</td>
-                </tr>
-                <tr>
-                    <td align="center" style="font-size: 12px; color: #666666; padding: 0 20px;">
-                        <p>&copy; ${currentYear} Shifter. All rights reserved.</p>
-                        <p style="margin-top: 10px;">Need Help? Contact our support at <a
-                                href="mailto:support@shift-er.com" style="color: #666666;">support@shift-er.com</a></p>
-                    </td>
-                </tr>
-                <tr>
-                    <td height="30">&nbsp;</td>
-                </tr>
-            </table>
-        </td>
-    </tr>
-</table>
-</body>
-</html>
Index: ckend/src/main/resources/email-templates/verify_account.html
===================================================================
--- backend/src/main/resources/email-templates/verify_account.html	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,137 +1,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-  <meta charset="UTF-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-  <title>Verify Your Shifter Account</title>
-  <style>
-    body, p, h1, h2, h3, h4, h5, h6 {
-      margin: 0;
-      padding: 0;
-    }
-
-    body {
-      font-family: Arial, Helvetica, sans-serif;
-      font-size: 16px;
-      line-height: 1.6;
-      color: #333333;
-      background-color: #F8F6F5;
-    }
-
-    table {
-      border-collapse: collapse;
-    }
-
-    a {
-      text-decoration: none;
-    }
-
-    .button {
-      display: inline-block;
-      padding: 12px 28px;
-      border-radius: 4px;
-      background-color: #008CC2;
-      color: #ffffff !important;
-      font-weight: bold;
-      text-decoration: none;
-      font-size: 16px;
-    }
-  </style>
-</head>
-<body>
-<table width="100%" bgcolor="#F8F6F5" border="0" cellpadding="0" cellspacing="0" role="presentation">
-  <tr>
-    <td align="center">
-      <table width="600" style="max-width: 600px;" border="0" cellpadding="0" cellspacing="0" role="presentation">
-        <tr>
-          <td height="30">&nbsp;</td>
-        </tr>
-
-        <!--TOP LINKS-->
-        <tr>
-          <td align="left" style="padding: 0 20px;">
-            <table width="100%" border="0" cellpadding="0" cellspacing="0" role="presentation">
-              <tr>
-                <td align="left" style="padding-bottom: 10px;">
-                  <a href="https://www.shift-er.com" target="_blank">
-                    <img src="https://shift-er.s3.eu-north-1.amazonaws.com/public/Shifter-Logo-Black.png"
-                         alt="Shifter Logo" width="120"
-                         style="display: block; border: 0;">
-                  </a>
-                </td>
-                <td align="right" style="font-size: 14px; color: #666666;">
-                  <a href="https://www.shift-er.com/courses" target="_blank"
-                     style="color: #666666; text-decoration: none;">Browse Courses</a>
-                </td>
-              </tr>
-            </table>
-          </td>
-        </tr>
-
-        <tr>
-          <td height="20">&nbsp;</td>
-        </tr>
-
-        <!--MAIN CONTENT-->
-        <tr>
-          <td align="center" bgcolor="#FFFFFF"
-              style="border-radius: 8px; padding: 40px 40px 30px 40px; box-shadow: 0 4px 8px rgba(0,0,0,0.05);">
-            <table width="100%" border="0" cellpadding="0" cellspacing="0" role="presentation">
-              <tr>
-                <td align="left">
-                  <h1 style="font-size: 28px; line-height: 1.3; color: #222222; margin-bottom: 15px;">
-                    Verify Your Email Address
-                  </h1>
-                  <p style="font-size: 16px; color: #555555; margin-bottom: 20px;">
-                    Hi,
-                  </p>
-                  <p style="font-size: 16px; color: #555555; margin-bottom: 20px;">
-                    Thank you for signing up with <strong>Shifter</strong> — your digital hub for
-                    business growth and professional development.
-                    To complete your registration, please verify your email address by clicking the button below.
-                  </p>
-
-                  <p style="text-align: center; margin: 30px 0;">
-                    <a href="${verificationUrl}" target="_blank" class="button">
-                      Verify My Email
-                    </a>
-                  </p>
-
-                  <p style="font-size: 14px; color: #777777; margin-bottom: 25px;">
-                    This link will expire in 60 minutes. If the button above doesn't work, copy and paste the link below into your browser:
-                  </p>
-
-                  <p style="word-break: break-all; font-size: 14px; color: #008CC2;">
-                    <a href="${verificationUrl}" target="_blank" style="color: #008CC2;">${verificationUrl}</a>
-                  </p>
-
-                  <p style="font-size: 14px; color: #777777; margin-top: 25px;">
-                    If you didn’t create an account, please ignore this email.
-                  </p>
-                </td>
-              </tr>
-            </table>
-          </td>
-        </tr>
-
-        <tr>
-          <td height="30">&nbsp;</td>
-        </tr>
-
-        <!--FOOTER-->
-        <tr>
-          <td align="center" style="font-size: 12px; color: #666666; padding: 0 20px;">
-            <p>&copy; ${currentYear} Shifter. All rights reserved.</p>
-            <p style="margin-top: 10px;">Need Help? Contact our support at
-              <a href="mailto:support@shift-er.com" style="color: #666666;">support@shift-er.com</a></p>
-          </td>
-        </tr>
-        <tr>
-          <td height="30">&nbsp;</td>
-        </tr>
-      </table>
-    </td>
-  </tr>
-</table>
-</body>
-</html>
Index: backend/src/test/java/com/shifterwebapp/shifter/ShifterApplicationTests.java
===================================================================
--- backend/src/test/java/com/shifterwebapp/shifter/ShifterApplicationTests.java	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ backend/src/test/java/com/shifterwebapp/shifter/ShifterApplicationTests.java	(revision 0672351328b09eb632b662e1c87b53be8e8e5b3f)
@@ -1,46 +1,9 @@
 package com.shifterwebapp.shifter;
 
-import io.github.cdimascio.dotenv.Dotenv;
-import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.ActiveProfiles;
 
-@ActiveProfiles("test")
 @SpringBootTest
 class ShifterApplicationTests {
-
-	@BeforeAll
-	static void setupEnv() {
-		Dotenv dotenv = Dotenv.configure()
-				.ignoreIfMissing()
-				.load();
-
-		// Set env variables from .env file
-		System.setProperty("JWT_CONFIG_SECRET", dotenv.get("JWT_CONFIG_SECRET"));
-
-		System.setProperty("SPRING_DATASOURCE_URL", dotenv.get("SPRING_DATASOURCE_URL"));
-		System.setProperty("SPRING_DATASOURCE_USERNAME", dotenv.get("SPRING_DATASOURCE_USERNAME"));
-		System.setProperty("SPRING_DATASOURCE_PASSWORD", dotenv.get("SPRING_DATASOURCE_PASSWORD"));
-
-		System.setProperty("AWS_S3_REGION", dotenv.get("AWS_S3_REGION"));
-		System.setProperty("AWS_S3_BUCKET_NAME", dotenv.get("AWS_S3_BUCKET_NAME"));
-		System.setProperty("AWS_S3_ACCESS_KEY", dotenv.get("AWS_S3_ACCESS_KEY"));
-		System.setProperty("AWS_S3_SECRET_KEY", dotenv.get("AWS_S3_SECRET_KEY"));
-
-		System.setProperty("GOOGLE_CLIENT_ID", dotenv.get("GOOGLE_CLIENT_ID"));
-		System.setProperty("GOOGLE_CLIENT_SECRET", dotenv.get("GOOGLE_CLIENT_SECRET"));
-		System.setProperty("GOOGLE_EXPERT_CALENDAR_ID", dotenv.get("GOOGLE_EXPERT_CALENDAR_ID"));
-		System.setProperty("GOOGLE_REFRESH_TOKEN", dotenv.get("GOOGLE_REFRESH_TOKEN"));
-
-		System.setProperty("EMAIL_HOST", dotenv.get("EMAIL_HOST"));
-		System.setProperty("EMAIL_PORT", dotenv.get("EMAIL_PORT"));
-		System.setProperty("EMAIL_USERNAME", dotenv.get("EMAIL_USERNAME"));
-		System.setProperty("EMAIL_PASSWORD", dotenv.get("EMAIL_PASSWORD"));
-
-		System.setProperty("ZOOM_ACCOUNT_ID", dotenv.get("ZOOM_ACCOUNT_ID"));
-		System.setProperty("ZOOM_CLIENT_ID", dotenv.get("ZOOM_CLIENT_ID"));
-		System.setProperty("ZOOM_CLIENT_SECRET", dotenv.get("ZOOM_CLIENT_SECRET"));
-	}
 
 	@Test
Index: cker-compose.yml
===================================================================
--- docker-compose.yml	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,23 +1,0 @@
-version: '3.8'
-
-services:
-  frontend:
-    build:
-      context: ./frontend
-      dockerfile: Dockerfile
-    ports:
-      - "5173:80"
-    depends_on:
-      - backend
-
-  backend:
-    build:
-      context: ./backend
-      dockerfile: Dockerfile
-    ports:
-      - "8080:8080"
-    volumes:
-      - ./backend:/app
-      - ~/.m2:/root/.m2
-    env_file:
-      - backend/.env
Index: ontend/.gitignore
===================================================================
--- frontend/.gitignore	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,26 +1,0 @@
-# Logs
-logs
-*.log
-npm-debug.log*
-yarn-debug.log*
-yarn-error.log*
-pnpm-debug.log*
-lerna-debug.log*
-
-.env
-
-node_modules
-dist
-dist-ssr
-*.local
-
-# Editor directories and files
-.vscode/*
-!.vscode/extensions.json
-.idea
-.DS_Store
-*.suo
-*.ntvs*
-*.njsproj
-*.sln
-*.sw?
Index: ontend/Dockerfile
===================================================================
--- frontend/Dockerfile	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,11 +1,0 @@
-# Build stage
-FROM node:20-alpine as build
-WORKDIR /app/frontend
-COPY package*.json ./
-RUN npm install
-COPY . .
-RUN npm run build
-
-# Serve stage
-FROM nginx:alpine
-COPY --from=build /app/frontend/dist /usr/share/nginx/html
Index: ontend/README.md
===================================================================
--- frontend/README.md	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,54 +1,0 @@
-# React + TypeScript + Vite
-
-This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
-
-Currently, two official plugins are available:
-
-- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) for Fast Refresh
-- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
-
-## Expanding the ESLint configuration
-
-If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:
-
-```js
-export default tseslint.config({
-  extends: [
-    // Remove ...tseslint.configs.recommended and replace with this
-    ...tseslint.configs.recommendedTypeChecked,
-    // Alternatively, use this for stricter rules
-    ...tseslint.configs.strictTypeChecked,
-    // Optionally, add this for stylistic rules
-    ...tseslint.configs.stylisticTypeChecked,
-  ],
-  languageOptions: {
-    // other options...
-    parserOptions: {
-      project: ['./tsconfig.node.json', './tsconfig.app.json'],
-      tsconfigRootDir: import.meta.dirname,
-    },
-  },
-})
-```
-
-You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules:
-
-```js
-// eslint.config.js
-import reactX from 'eslint-plugin-react-x'
-import reactDom from 'eslint-plugin-react-dom'
-
-export default tseslint.config({
-  plugins: {
-    // Add the react-x and react-dom plugins
-    'react-x': reactX,
-    'react-dom': reactDom,
-  },
-  rules: {
-    // other rules...
-    // Enable its recommended typescript rules
-    ...reactX.configs['recommended-typescript'].rules,
-    ...reactDom.configs.recommended.rules,
-  },
-})
-```
Index: ontend/eslint.config.js
===================================================================
--- frontend/eslint.config.js	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,28 +1,0 @@
-import js from '@eslint/js'
-import globals from 'globals'
-import reactHooks from 'eslint-plugin-react-hooks'
-import reactRefresh from 'eslint-plugin-react-refresh'
-import tseslint from 'typescript-eslint'
-
-export default tseslint.config(
-  { ignores: ['dist'] },
-  {
-    extends: [js.configs.recommended, ...tseslint.configs.recommended],
-    files: ['**/*.{ts,tsx}'],
-    languageOptions: {
-      ecmaVersion: 2020,
-      globals: globals.browser,
-    },
-    plugins: {
-      'react-hooks': reactHooks,
-      'react-refresh': reactRefresh,
-    },
-    rules: {
-      ...reactHooks.configs.recommended.rules,
-      'react-refresh/only-export-components': [
-        'warn',
-        { allowConstantExport: true },
-      ],
-    },
-  },
-)
Index: ontend/index.html
===================================================================
--- frontend/index.html	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,18 +1,0 @@
-<!doctype html>
-<html lang="en">
-  <head>
-    <meta charset="UTF-8" />
-    <link rel="icon" type="image/svg+xml" href="/Two-Arrows-Rotate.png" />
-    <link href="https://fonts.googleapis.com/css2?family=Source+Sans+3:wght@300;400;600;700&display=swap" rel="stylesheet">
-
-    <link href="https://fonts.googleapis.com/css2?family=Nunito:wght@300;400;500;600;700&display=swap" rel="stylesheet">
-
-    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <title>Shifter</title>
-  </head>
-  <body>
-    <div id="root"></div>
-    <div id="portal"></div>
-    <script type="module" src="/src/main.tsx"></script>
-  </body>
-</html>
Index: ontend/package-lock.json
===================================================================
--- frontend/package-lock.json	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,6167 +1,0 @@
-{
-  "name": "shifter",
-  "version": "0.0.0",
-  "lockfileVersion": 3,
-  "requires": true,
-  "packages": {
-    "": {
-      "name": "shifter",
-      "version": "0.0.0",
-      "dependencies": {
-        "@emotion/react": "^11.14.0",
-        "@emotion/styled": "^11.14.0",
-        "@headlessui/react": "^2.2.4",
-        "@heroicons/react": "^2.2.0",
-        "@lottiefiles/dotlottie-react": "^0.14.2",
-        "@mui/icons-material": "^7.1.2",
-        "@mui/material": "^7.1.2",
-        "@react-oauth/google": "^0.12.2",
-        "@react-three/fiber": "^9.3.0",
-        "@splinetool/react-spline": "^4.0.0",
-        "@tabler/icons-react": "^3.35.0",
-        "@tailwindcss/vite": "^4.1.10",
-        "axios": "^1.10.0",
-        "framer-motion": "^12.19.1",
-        "gsap": "^3.13.0",
-        "i18next": "^25.6.0",
-        "lottie-react": "^2.4.1",
-        "lucide-react": "^0.515.0",
-        "ogl": "^1.0.11",
-        "qs": "^6.14.0",
-        "react": "^19.1.0",
-        "react-bits": "^1.0.5",
-        "react-country-flag": "^3.1.0",
-        "react-countup": "^6.5.3",
-        "react-dom": "^19.1.0",
-        "react-i18next": "^16.0.0",
-        "react-router-dom": "^7.6.2",
-        "react-slick": "^0.30.3",
-        "react-toastify": "^11.0.5",
-        "slick-carousel": "^1.8.1",
-        "tailwindcss": "^4.1.10",
-        "three": "^0.179.1",
-        "zustand": "^5.0.6"
-      },
-      "devDependencies": {
-        "@eslint/js": "^9.25.0",
-        "@types/qs": "^6.14.0",
-        "@types/react": "^19.1.2",
-        "@types/react-dom": "^19.1.2",
-        "@types/react-slick": "^0.23.13",
-        "@vitejs/plugin-react": "^4.4.1",
-        "autoprefixer": "^10.4.21",
-        "eslint": "^9.25.0",
-        "eslint-plugin-react-hooks": "^5.2.0",
-        "eslint-plugin-react-refresh": "^0.4.19",
-        "globals": "^16.0.0",
-        "postcss": "^8.5.5",
-        "typescript": "~5.8.3",
-        "typescript-eslint": "^8.30.1",
-        "vite": "^6.3.5"
-      }
-    },
-    "node_modules/@ampproject/remapping": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
-      "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@jridgewell/gen-mapping": "^0.3.5",
-        "@jridgewell/trace-mapping": "^0.3.24"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/@babel/code-frame": {
-      "version": "7.27.1",
-      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
-      "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-validator-identifier": "^7.27.1",
-        "js-tokens": "^4.0.0",
-        "picocolors": "^1.1.1"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/compat-data": {
-      "version": "7.27.5",
-      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.5.tgz",
-      "integrity": "sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/core": {
-      "version": "7.27.4",
-      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.4.tgz",
-      "integrity": "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@ampproject/remapping": "^2.2.0",
-        "@babel/code-frame": "^7.27.1",
-        "@babel/generator": "^7.27.3",
-        "@babel/helper-compilation-targets": "^7.27.2",
-        "@babel/helper-module-transforms": "^7.27.3",
-        "@babel/helpers": "^7.27.4",
-        "@babel/parser": "^7.27.4",
-        "@babel/template": "^7.27.2",
-        "@babel/traverse": "^7.27.4",
-        "@babel/types": "^7.27.3",
-        "convert-source-map": "^2.0.0",
-        "debug": "^4.1.0",
-        "gensync": "^1.0.0-beta.2",
-        "json5": "^2.2.3",
-        "semver": "^6.3.1"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/babel"
-      }
-    },
-    "node_modules/@babel/generator": {
-      "version": "7.27.5",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz",
-      "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/parser": "^7.27.5",
-        "@babel/types": "^7.27.3",
-        "@jridgewell/gen-mapping": "^0.3.5",
-        "@jridgewell/trace-mapping": "^0.3.25",
-        "jsesc": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-compilation-targets": {
-      "version": "7.27.2",
-      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz",
-      "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/compat-data": "^7.27.2",
-        "@babel/helper-validator-option": "^7.27.1",
-        "browserslist": "^4.24.0",
-        "lru-cache": "^5.1.1",
-        "semver": "^6.3.1"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-module-imports": {
-      "version": "7.27.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz",
-      "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/traverse": "^7.27.1",
-        "@babel/types": "^7.27.1"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-module-transforms": {
-      "version": "7.27.3",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz",
-      "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-module-imports": "^7.27.1",
-        "@babel/helper-validator-identifier": "^7.27.1",
-        "@babel/traverse": "^7.27.3"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0"
-      }
-    },
-    "node_modules/@babel/helper-plugin-utils": {
-      "version": "7.27.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz",
-      "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-string-parser": {
-      "version": "7.27.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
-      "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-validator-identifier": {
-      "version": "7.27.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
-      "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-validator-option": {
-      "version": "7.27.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
-      "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helpers": {
-      "version": "7.27.6",
-      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz",
-      "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/template": "^7.27.2",
-        "@babel/types": "^7.27.6"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/parser": {
-      "version": "7.27.5",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz",
-      "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/types": "^7.27.3"
-      },
-      "bin": {
-        "parser": "bin/babel-parser.js"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-react-jsx-self": {
-      "version": "7.27.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz",
-      "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.27.1"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-react-jsx-source": {
-      "version": "7.27.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz",
-      "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.27.1"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/runtime": {
-      "version": "7.27.6",
-      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz",
-      "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/template": {
-      "version": "7.27.2",
-      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz",
-      "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/code-frame": "^7.27.1",
-        "@babel/parser": "^7.27.2",
-        "@babel/types": "^7.27.1"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/traverse": {
-      "version": "7.27.4",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz",
-      "integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/code-frame": "^7.27.1",
-        "@babel/generator": "^7.27.3",
-        "@babel/parser": "^7.27.4",
-        "@babel/template": "^7.27.2",
-        "@babel/types": "^7.27.3",
-        "debug": "^4.3.1",
-        "globals": "^11.1.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/traverse/node_modules/globals": {
-      "version": "11.12.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
-      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/@babel/types": {
-      "version": "7.27.6",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz",
-      "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-string-parser": "^7.27.1",
-        "@babel/helper-validator-identifier": "^7.27.1"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@emotion/babel-plugin": {
-      "version": "11.13.5",
-      "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz",
-      "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-module-imports": "^7.16.7",
-        "@babel/runtime": "^7.18.3",
-        "@emotion/hash": "^0.9.2",
-        "@emotion/memoize": "^0.9.0",
-        "@emotion/serialize": "^1.3.3",
-        "babel-plugin-macros": "^3.1.0",
-        "convert-source-map": "^1.5.0",
-        "escape-string-regexp": "^4.0.0",
-        "find-root": "^1.1.0",
-        "source-map": "^0.5.7",
-        "stylis": "4.2.0"
-      }
-    },
-    "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
-      "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
-      "license": "MIT"
-    },
-    "node_modules/@emotion/cache": {
-      "version": "11.14.0",
-      "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz",
-      "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==",
-      "license": "MIT",
-      "dependencies": {
-        "@emotion/memoize": "^0.9.0",
-        "@emotion/sheet": "^1.4.0",
-        "@emotion/utils": "^1.4.2",
-        "@emotion/weak-memoize": "^0.4.0",
-        "stylis": "4.2.0"
-      }
-    },
-    "node_modules/@emotion/hash": {
-      "version": "0.9.2",
-      "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz",
-      "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==",
-      "license": "MIT"
-    },
-    "node_modules/@emotion/is-prop-valid": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz",
-      "integrity": "sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==",
-      "license": "MIT",
-      "dependencies": {
-        "@emotion/memoize": "^0.9.0"
-      }
-    },
-    "node_modules/@emotion/memoize": {
-      "version": "0.9.0",
-      "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz",
-      "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==",
-      "license": "MIT"
-    },
-    "node_modules/@emotion/react": {
-      "version": "11.14.0",
-      "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz",
-      "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/runtime": "^7.18.3",
-        "@emotion/babel-plugin": "^11.13.5",
-        "@emotion/cache": "^11.14.0",
-        "@emotion/serialize": "^1.3.3",
-        "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0",
-        "@emotion/utils": "^1.4.2",
-        "@emotion/weak-memoize": "^0.4.0",
-        "hoist-non-react-statics": "^3.3.1"
-      },
-      "peerDependencies": {
-        "react": ">=16.8.0"
-      },
-      "peerDependenciesMeta": {
-        "@types/react": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@emotion/serialize": {
-      "version": "1.3.3",
-      "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz",
-      "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==",
-      "license": "MIT",
-      "dependencies": {
-        "@emotion/hash": "^0.9.2",
-        "@emotion/memoize": "^0.9.0",
-        "@emotion/unitless": "^0.10.0",
-        "@emotion/utils": "^1.4.2",
-        "csstype": "^3.0.2"
-      }
-    },
-    "node_modules/@emotion/sheet": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz",
-      "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==",
-      "license": "MIT"
-    },
-    "node_modules/@emotion/styled": {
-      "version": "11.14.0",
-      "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.0.tgz",
-      "integrity": "sha512-XxfOnXFffatap2IyCeJyNov3kiDQWoR08gPUQxvbL7fxKryGBKUZUkG6Hz48DZwVrJSVh9sJboyV1Ds4OW6SgA==",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/runtime": "^7.18.3",
-        "@emotion/babel-plugin": "^11.13.5",
-        "@emotion/is-prop-valid": "^1.3.0",
-        "@emotion/serialize": "^1.3.3",
-        "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0",
-        "@emotion/utils": "^1.4.2"
-      },
-      "peerDependencies": {
-        "@emotion/react": "^11.0.0-rc.0",
-        "react": ">=16.8.0"
-      },
-      "peerDependenciesMeta": {
-        "@types/react": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@emotion/unitless": {
-      "version": "0.10.0",
-      "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz",
-      "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==",
-      "license": "MIT"
-    },
-    "node_modules/@emotion/use-insertion-effect-with-fallbacks": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz",
-      "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==",
-      "license": "MIT",
-      "peerDependencies": {
-        "react": ">=16.8.0"
-      }
-    },
-    "node_modules/@emotion/utils": {
-      "version": "1.4.2",
-      "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz",
-      "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==",
-      "license": "MIT"
-    },
-    "node_modules/@emotion/weak-memoize": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz",
-      "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==",
-      "license": "MIT"
-    },
-    "node_modules/@esbuild/aix-ppc64": {
-      "version": "0.25.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz",
-      "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==",
-      "cpu": [
-        "ppc64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "aix"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/android-arm": {
-      "version": "0.25.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz",
-      "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==",
-      "cpu": [
-        "arm"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/android-arm64": {
-      "version": "0.25.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz",
-      "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/android-x64": {
-      "version": "0.25.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz",
-      "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/darwin-arm64": {
-      "version": "0.25.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz",
-      "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/darwin-x64": {
-      "version": "0.25.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz",
-      "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/freebsd-arm64": {
-      "version": "0.25.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz",
-      "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "freebsd"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/freebsd-x64": {
-      "version": "0.25.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz",
-      "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "freebsd"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/linux-arm": {
-      "version": "0.25.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz",
-      "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==",
-      "cpu": [
-        "arm"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/linux-arm64": {
-      "version": "0.25.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz",
-      "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/linux-ia32": {
-      "version": "0.25.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz",
-      "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==",
-      "cpu": [
-        "ia32"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/linux-loong64": {
-      "version": "0.25.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz",
-      "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==",
-      "cpu": [
-        "loong64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/linux-mips64el": {
-      "version": "0.25.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz",
-      "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==",
-      "cpu": [
-        "mips64el"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/linux-ppc64": {
-      "version": "0.25.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz",
-      "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==",
-      "cpu": [
-        "ppc64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/linux-riscv64": {
-      "version": "0.25.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz",
-      "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==",
-      "cpu": [
-        "riscv64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/linux-s390x": {
-      "version": "0.25.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz",
-      "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==",
-      "cpu": [
-        "s390x"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/linux-x64": {
-      "version": "0.25.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz",
-      "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/netbsd-arm64": {
-      "version": "0.25.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz",
-      "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "netbsd"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/netbsd-x64": {
-      "version": "0.25.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz",
-      "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "netbsd"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/openbsd-arm64": {
-      "version": "0.25.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz",
-      "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "openbsd"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/openbsd-x64": {
-      "version": "0.25.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz",
-      "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "openbsd"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/sunos-x64": {
-      "version": "0.25.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz",
-      "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "sunos"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/win32-arm64": {
-      "version": "0.25.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz",
-      "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/win32-ia32": {
-      "version": "0.25.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz",
-      "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==",
-      "cpu": [
-        "ia32"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@eslint-community/eslint-utils": {
-      "version": "4.7.0",
-      "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz",
-      "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "eslint-visitor-keys": "^3.4.3"
-      },
-      "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://opencollective.com/eslint"
-      },
-      "peerDependencies": {
-        "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
-      }
-    },
-    "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
-      "version": "3.4.3",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
-      "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://opencollective.com/eslint"
-      }
-    },
-    "node_modules/@eslint-community/regexpp": {
-      "version": "4.12.1",
-      "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
-      "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
-      }
-    },
-    "node_modules/@eslint/config-array": {
-      "version": "0.20.1",
-      "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.1.tgz",
-      "integrity": "sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@eslint/object-schema": "^2.1.6",
-        "debug": "^4.3.1",
-        "minimatch": "^3.1.2"
-      },
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      }
-    },
-    "node_modules/@eslint/config-helpers": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.3.tgz",
-      "integrity": "sha512-u180qk2Um1le4yf0ruXH3PYFeEZeYC3p/4wCTKrr2U1CmGdzGi3KtY0nuPDH48UJxlKCC5RDzbcbh4X0XlqgHg==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      }
-    },
-    "node_modules/@eslint/core": {
-      "version": "0.14.0",
-      "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz",
-      "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@types/json-schema": "^7.0.15"
-      },
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      }
-    },
-    "node_modules/@eslint/eslintrc": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz",
-      "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ajv": "^6.12.4",
-        "debug": "^4.3.2",
-        "espree": "^10.0.1",
-        "globals": "^14.0.0",
-        "ignore": "^5.2.0",
-        "import-fresh": "^3.2.1",
-        "js-yaml": "^4.1.0",
-        "minimatch": "^3.1.2",
-        "strip-json-comments": "^3.1.1"
-      },
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      },
-      "funding": {
-        "url": "https://opencollective.com/eslint"
-      }
-    },
-    "node_modules/@eslint/eslintrc/node_modules/globals": {
-      "version": "14.0.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
-      "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/@eslint/js": {
-      "version": "9.29.0",
-      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.29.0.tgz",
-      "integrity": "sha512-3PIF4cBw/y+1u2EazflInpV+lYsSG0aByVIQzAgb1m1MhHFSbqTyNqtBKHgWf/9Ykud+DhILS9EGkmekVhbKoQ==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      },
-      "funding": {
-        "url": "https://eslint.org/donate"
-      }
-    },
-    "node_modules/@eslint/object-schema": {
-      "version": "2.1.6",
-      "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz",
-      "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      }
-    },
-    "node_modules/@eslint/plugin-kit": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.2.tgz",
-      "integrity": "sha512-4SaFZCNfJqvk/kenHpI8xvN42DMaoycy4PzKc5otHxRswww1kAt82OlBuwRVLofCACCTZEcla2Ydxv8scMXaTg==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@eslint/core": "^0.15.0",
-        "levn": "^0.4.1"
-      },
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      }
-    },
-    "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": {
-      "version": "0.15.0",
-      "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.0.tgz",
-      "integrity": "sha512-b7ePw78tEWWkpgZCDYkbqDOP8dmM6qe+AOC6iuJqlq1R/0ahMAeH3qynpnqKFGkMltrp44ohV4ubGyvLX28tzw==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@types/json-schema": "^7.0.15"
-      },
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      }
-    },
-    "node_modules/@floating-ui/core": {
-      "version": "1.7.1",
-      "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.1.tgz",
-      "integrity": "sha512-azI0DrjMMfIug/ExbBaeDVJXcY0a7EPvPjb2xAJPa4HeimBX+Z18HK8QQR3jb6356SnDDdxx+hinMLcJEDdOjw==",
-      "license": "MIT",
-      "dependencies": {
-        "@floating-ui/utils": "^0.2.9"
-      }
-    },
-    "node_modules/@floating-ui/dom": {
-      "version": "1.7.1",
-      "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.1.tgz",
-      "integrity": "sha512-cwsmW/zyw5ltYTUeeYJ60CnQuPqmGwuGVhG9w0PRaRKkAyi38BT5CKrpIbb+jtahSwUl04cWzSx9ZOIxeS6RsQ==",
-      "license": "MIT",
-      "dependencies": {
-        "@floating-ui/core": "^1.7.1",
-        "@floating-ui/utils": "^0.2.9"
-      }
-    },
-    "node_modules/@floating-ui/react": {
-      "version": "0.26.28",
-      "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.28.tgz",
-      "integrity": "sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==",
-      "license": "MIT",
-      "dependencies": {
-        "@floating-ui/react-dom": "^2.1.2",
-        "@floating-ui/utils": "^0.2.8",
-        "tabbable": "^6.0.0"
-      },
-      "peerDependencies": {
-        "react": ">=16.8.0",
-        "react-dom": ">=16.8.0"
-      }
-    },
-    "node_modules/@floating-ui/react-dom": {
-      "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.3.tgz",
-      "integrity": "sha512-huMBfiU9UnQ2oBwIhgzyIiSpVgvlDstU8CX0AF+wS+KzmYMs0J2a3GwuFHV1Lz+jlrQGeC1fF+Nv0QoumyV0bA==",
-      "license": "MIT",
-      "dependencies": {
-        "@floating-ui/dom": "^1.0.0"
-      },
-      "peerDependencies": {
-        "react": ">=16.8.0",
-        "react-dom": ">=16.8.0"
-      }
-    },
-    "node_modules/@floating-ui/utils": {
-      "version": "0.2.9",
-      "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz",
-      "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==",
-      "license": "MIT"
-    },
-    "node_modules/@headlessui/react": {
-      "version": "2.2.4",
-      "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-2.2.4.tgz",
-      "integrity": "sha512-lz+OGcAH1dK93rgSMzXmm1qKOJkBUqZf1L4M8TWLNplftQD3IkoEDdUFNfAn4ylsN6WOTVtWaLmvmaHOUk1dTA==",
-      "license": "MIT",
-      "dependencies": {
-        "@floating-ui/react": "^0.26.16",
-        "@react-aria/focus": "^3.20.2",
-        "@react-aria/interactions": "^3.25.0",
-        "@tanstack/react-virtual": "^3.13.9",
-        "use-sync-external-store": "^1.5.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "peerDependencies": {
-        "react": "^18 || ^19 || ^19.0.0-rc",
-        "react-dom": "^18 || ^19 || ^19.0.0-rc"
-      }
-    },
-    "node_modules/@heroicons/react": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.2.0.tgz",
-      "integrity": "sha512-LMcepvRaS9LYHJGsF0zzmgKCUim/X3N/DQKc4jepAXJ7l8QxJ1PmxJzqplF2Z3FE4PqBAIGyJAQ/w4B5dsqbtQ==",
-      "license": "MIT",
-      "peerDependencies": {
-        "react": ">= 16 || ^19.0.0-rc"
-      }
-    },
-    "node_modules/@humanfs/core": {
-      "version": "0.19.1",
-      "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
-      "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "engines": {
-        "node": ">=18.18.0"
-      }
-    },
-    "node_modules/@humanfs/node": {
-      "version": "0.16.6",
-      "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz",
-      "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@humanfs/core": "^0.19.1",
-        "@humanwhocodes/retry": "^0.3.0"
-      },
-      "engines": {
-        "node": ">=18.18.0"
-      }
-    },
-    "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": {
-      "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz",
-      "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "engines": {
-        "node": ">=18.18"
-      },
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/nzakas"
-      }
-    },
-    "node_modules/@humanwhocodes/module-importer": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
-      "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "engines": {
-        "node": ">=12.22"
-      },
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/nzakas"
-      }
-    },
-    "node_modules/@humanwhocodes/retry": {
-      "version": "0.4.3",
-      "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
-      "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "engines": {
-        "node": ">=18.18"
-      },
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/nzakas"
-      }
-    },
-    "node_modules/@isaacs/fs-minipass": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz",
-      "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==",
-      "license": "ISC",
-      "dependencies": {
-        "minipass": "^7.0.4"
-      },
-      "engines": {
-        "node": ">=18.0.0"
-      }
-    },
-    "node_modules/@jridgewell/gen-mapping": {
-      "version": "0.3.8",
-      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
-      "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
-      "license": "MIT",
-      "dependencies": {
-        "@jridgewell/set-array": "^1.2.1",
-        "@jridgewell/sourcemap-codec": "^1.4.10",
-        "@jridgewell/trace-mapping": "^0.3.24"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/@jridgewell/resolve-uri": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
-      "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/@jridgewell/set-array": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
-      "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/@jridgewell/sourcemap-codec": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
-      "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
-      "license": "MIT"
-    },
-    "node_modules/@jridgewell/trace-mapping": {
-      "version": "0.3.25",
-      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
-      "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
-      "license": "MIT",
-      "dependencies": {
-        "@jridgewell/resolve-uri": "^3.1.0",
-        "@jridgewell/sourcemap-codec": "^1.4.14"
-      }
-    },
-    "node_modules/@lottiefiles/dotlottie-react": {
-      "version": "0.14.2",
-      "resolved": "https://registry.npmjs.org/@lottiefiles/dotlottie-react/-/dotlottie-react-0.14.2.tgz",
-      "integrity": "sha512-RR4r0HrKQbOAw6iS6C3mRARS2iu+yI+G1vICoUsRMHzlUUk1/26l3WyAjhcG+KoaGoKmORx8FgHjTNr4Sr/2Ug==",
-      "license": "MIT",
-      "dependencies": {
-        "@lottiefiles/dotlottie-web": "0.47.0"
-      },
-      "peerDependencies": {
-        "react": "^17 || ^18 || ^19"
-      }
-    },
-    "node_modules/@lottiefiles/dotlottie-web": {
-      "version": "0.47.0",
-      "resolved": "https://registry.npmjs.org/@lottiefiles/dotlottie-web/-/dotlottie-web-0.47.0.tgz",
-      "integrity": "sha512-YN6wSB4iYZBYEAFKEs/taufrPH3rfNlUA632Ib61WoR58TALAJ1ZX8yDIGUBT28byMJhZR4+xdpRX4v7X8OeBQ==",
-      "license": "MIT"
-    },
-    "node_modules/@mui/core-downloads-tracker": {
-      "version": "7.1.2",
-      "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-7.1.2.tgz",
-      "integrity": "sha512-0gLO1PvbJwSYe5ji021tGj6HFqrtEPMGKK4L1zWwRbhzrWWUumUJvMvJUsIgWQIYQsgOnhq9k2Fc1BxLGHDsAg==",
-      "license": "MIT",
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/mui-org"
-      }
-    },
-    "node_modules/@mui/icons-material": {
-      "version": "7.1.2",
-      "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-7.1.2.tgz",
-      "integrity": "sha512-slqJByDub7Y1UcokrM17BoMBMvn8n7daXFXVoTv0MEH5k3sHjmsH8ql/Mt3s9vQ20cORDr83UZ448TEGcbrXtw==",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/runtime": "^7.27.1"
-      },
-      "engines": {
-        "node": ">=14.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/mui-org"
-      },
-      "peerDependencies": {
-        "@mui/material": "^7.1.2",
-        "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
-        "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
-      },
-      "peerDependenciesMeta": {
-        "@types/react": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@mui/material": {
-      "version": "7.1.2",
-      "resolved": "https://registry.npmjs.org/@mui/material/-/material-7.1.2.tgz",
-      "integrity": "sha512-Z5PYKkA6Kd8vS04zKxJNpwuvt6IoMwqpbidV7RCrRQQKwczIwcNcS8L6GnN4pzFYfEs+N9v6co27DmG07rcnoA==",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/runtime": "^7.27.1",
-        "@mui/core-downloads-tracker": "^7.1.2",
-        "@mui/system": "^7.1.1",
-        "@mui/types": "^7.4.3",
-        "@mui/utils": "^7.1.1",
-        "@popperjs/core": "^2.11.8",
-        "@types/react-transition-group": "^4.4.12",
-        "clsx": "^2.1.1",
-        "csstype": "^3.1.3",
-        "prop-types": "^15.8.1",
-        "react-is": "^19.1.0",
-        "react-transition-group": "^4.4.5"
-      },
-      "engines": {
-        "node": ">=14.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/mui-org"
-      },
-      "peerDependencies": {
-        "@emotion/react": "^11.5.0",
-        "@emotion/styled": "^11.3.0",
-        "@mui/material-pigment-css": "^7.1.1",
-        "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
-        "react": "^17.0.0 || ^18.0.0 || ^19.0.0",
-        "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0"
-      },
-      "peerDependenciesMeta": {
-        "@emotion/react": {
-          "optional": true
-        },
-        "@emotion/styled": {
-          "optional": true
-        },
-        "@mui/material-pigment-css": {
-          "optional": true
-        },
-        "@types/react": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@mui/private-theming": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-7.1.1.tgz",
-      "integrity": "sha512-M8NbLUx+armk2ZuaxBkkMk11ultnWmrPlN0Xe3jUEaBChg/mcxa5HWIWS1EE4DF36WRACaAHVAvyekWlDQf0PQ==",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/runtime": "^7.27.1",
-        "@mui/utils": "^7.1.1",
-        "prop-types": "^15.8.1"
-      },
-      "engines": {
-        "node": ">=14.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/mui-org"
-      },
-      "peerDependencies": {
-        "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
-        "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
-      },
-      "peerDependenciesMeta": {
-        "@types/react": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@mui/styled-engine": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-7.1.1.tgz",
-      "integrity": "sha512-R2wpzmSN127j26HrCPYVQ53vvMcT5DaKLoWkrfwUYq3cYytL6TQrCH8JBH3z79B6g4nMZZVoaXrxO757AlShaw==",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/runtime": "^7.27.1",
-        "@emotion/cache": "^11.13.5",
-        "@emotion/serialize": "^1.3.3",
-        "@emotion/sheet": "^1.4.0",
-        "csstype": "^3.1.3",
-        "prop-types": "^15.8.1"
-      },
-      "engines": {
-        "node": ">=14.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/mui-org"
-      },
-      "peerDependencies": {
-        "@emotion/react": "^11.4.1",
-        "@emotion/styled": "^11.3.0",
-        "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
-      },
-      "peerDependenciesMeta": {
-        "@emotion/react": {
-          "optional": true
-        },
-        "@emotion/styled": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@mui/system": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/@mui/system/-/system-7.1.1.tgz",
-      "integrity": "sha512-Kj1uhiqnj4Zo7PDjAOghtXJtNABunWvhcRU0O7RQJ7WOxeynoH6wXPcilphV8QTFtkKaip8EiNJRiCD+B3eROA==",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/runtime": "^7.27.1",
-        "@mui/private-theming": "^7.1.1",
-        "@mui/styled-engine": "^7.1.1",
-        "@mui/types": "^7.4.3",
-        "@mui/utils": "^7.1.1",
-        "clsx": "^2.1.1",
-        "csstype": "^3.1.3",
-        "prop-types": "^15.8.1"
-      },
-      "engines": {
-        "node": ">=14.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/mui-org"
-      },
-      "peerDependencies": {
-        "@emotion/react": "^11.5.0",
-        "@emotion/styled": "^11.3.0",
-        "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
-        "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
-      },
-      "peerDependenciesMeta": {
-        "@emotion/react": {
-          "optional": true
-        },
-        "@emotion/styled": {
-          "optional": true
-        },
-        "@types/react": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@mui/types": {
-      "version": "7.4.3",
-      "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.4.3.tgz",
-      "integrity": "sha512-2UCEiK29vtiZTeLdS2d4GndBKacVyxGvReznGXGr+CzW/YhjIX+OHUdCIczZjzcRAgKBGmE9zCIgoV9FleuyRQ==",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/runtime": "^7.27.1"
-      },
-      "peerDependencies": {
-        "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0"
-      },
-      "peerDependenciesMeta": {
-        "@types/react": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@mui/utils": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-7.1.1.tgz",
-      "integrity": "sha512-BkOt2q7MBYl7pweY2JWwfrlahhp+uGLR8S+EhiyRaofeRYUWL2YKbSGQvN4hgSN1i8poN0PaUiii1kEMrchvzg==",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/runtime": "^7.27.1",
-        "@mui/types": "^7.4.3",
-        "@types/prop-types": "^15.7.14",
-        "clsx": "^2.1.1",
-        "prop-types": "^15.8.1",
-        "react-is": "^19.1.0"
-      },
-      "engines": {
-        "node": ">=14.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/mui-org"
-      },
-      "peerDependencies": {
-        "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
-        "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
-      },
-      "peerDependenciesMeta": {
-        "@types/react": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@nodelib/fs.scandir": {
-      "version": "2.1.5",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
-      "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@nodelib/fs.stat": "2.0.5",
-        "run-parallel": "^1.1.9"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/@nodelib/fs.stat": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
-      "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/@nodelib/fs.walk": {
-      "version": "1.2.8",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
-      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@nodelib/fs.scandir": "2.1.5",
-        "fastq": "^1.6.0"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/@popperjs/core": {
-      "version": "2.11.8",
-      "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
-      "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
-      "license": "MIT",
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/popperjs"
-      }
-    },
-    "node_modules/@react-aria/focus": {
-      "version": "3.20.5",
-      "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.20.5.tgz",
-      "integrity": "sha512-JpFtXmWQ0Oca7FcvkqgjSyo6xEP7v3oQOLUId6o0xTvm4AD5W0mU2r3lYrbhsJ+XxdUUX4AVR5473sZZ85kU4A==",
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@react-aria/interactions": "^3.25.3",
-        "@react-aria/utils": "^3.29.1",
-        "@react-types/shared": "^3.30.0",
-        "@swc/helpers": "^0.5.0",
-        "clsx": "^2.0.0"
-      },
-      "peerDependencies": {
-        "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
-        "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
-      }
-    },
-    "node_modules/@react-aria/interactions": {
-      "version": "3.25.3",
-      "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.25.3.tgz",
-      "integrity": "sha512-J1bhlrNtjPS/fe5uJQ+0c7/jiXniwa4RQlP+Emjfc/iuqpW2RhbF9ou5vROcLzWIyaW8tVMZ468J68rAs/aZ5A==",
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@react-aria/ssr": "^3.9.9",
-        "@react-aria/utils": "^3.29.1",
-        "@react-stately/flags": "^3.1.2",
-        "@react-types/shared": "^3.30.0",
-        "@swc/helpers": "^0.5.0"
-      },
-      "peerDependencies": {
-        "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
-        "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
-      }
-    },
-    "node_modules/@react-aria/ssr": {
-      "version": "3.9.9",
-      "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.9.tgz",
-      "integrity": "sha512-2P5thfjfPy/np18e5wD4WPt8ydNXhij1jwA8oehxZTFqlgVMGXzcWKxTb4RtJrLFsqPO7RUQTiY8QJk0M4Vy2g==",
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@swc/helpers": "^0.5.0"
-      },
-      "engines": {
-        "node": ">= 12"
-      },
-      "peerDependencies": {
-        "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
-      }
-    },
-    "node_modules/@react-aria/utils": {
-      "version": "3.29.1",
-      "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.29.1.tgz",
-      "integrity": "sha512-yXMFVJ73rbQ/yYE/49n5Uidjw7kh192WNN9PNQGV0Xoc7EJUlSOxqhnpHmYTyO0EotJ8fdM1fMH8durHjUSI8g==",
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@react-aria/ssr": "^3.9.9",
-        "@react-stately/flags": "^3.1.2",
-        "@react-stately/utils": "^3.10.7",
-        "@react-types/shared": "^3.30.0",
-        "@swc/helpers": "^0.5.0",
-        "clsx": "^2.0.0"
-      },
-      "peerDependencies": {
-        "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
-        "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
-      }
-    },
-    "node_modules/@react-oauth/google": {
-      "version": "0.12.2",
-      "resolved": "https://registry.npmjs.org/@react-oauth/google/-/google-0.12.2.tgz",
-      "integrity": "sha512-d1GVm2uD4E44EJft2RbKtp8Z1fp/gK8Lb6KHgs3pHlM0PxCXGLaq8LLYQYENnN4xPWO1gkL4apBtlPKzpLvZwg==",
-      "license": "MIT",
-      "peerDependencies": {
-        "react": ">=16.8.0",
-        "react-dom": ">=16.8.0"
-      }
-    },
-    "node_modules/@react-stately/flags": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/@react-stately/flags/-/flags-3.1.2.tgz",
-      "integrity": "sha512-2HjFcZx1MyQXoPqcBGALwWWmgFVUk2TuKVIQxCbRq7fPyWXIl6VHcakCLurdtYC2Iks7zizvz0Idv48MQ38DWg==",
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@swc/helpers": "^0.5.0"
-      }
-    },
-    "node_modules/@react-stately/utils": {
-      "version": "3.10.7",
-      "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.10.7.tgz",
-      "integrity": "sha512-cWvjGAocvy4abO9zbr6PW6taHgF24Mwy/LbQ4TC4Aq3tKdKDntxyD+sh7AkSRfJRT2ccMVaHVv2+FfHThd3PKQ==",
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@swc/helpers": "^0.5.0"
-      },
-      "peerDependencies": {
-        "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
-      }
-    },
-    "node_modules/@react-three/fiber": {
-      "version": "9.3.0",
-      "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-9.3.0.tgz",
-      "integrity": "sha512-myPe3YL/C8+Eq939/4qIVEPBW/uxV0iiUbmjfwrs9sGKYDG8ib8Dz3Okq7BQt8P+0k4igedONbjXMQy84aDFmQ==",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/runtime": "^7.17.8",
-        "@types/react-reconciler": "^0.32.0",
-        "@types/webxr": "*",
-        "base64-js": "^1.5.1",
-        "buffer": "^6.0.3",
-        "its-fine": "^2.0.0",
-        "react-reconciler": "^0.31.0",
-        "react-use-measure": "^2.1.7",
-        "scheduler": "^0.25.0",
-        "suspend-react": "^0.1.3",
-        "use-sync-external-store": "^1.4.0",
-        "zustand": "^5.0.3"
-      },
-      "peerDependencies": {
-        "expo": ">=43.0",
-        "expo-asset": ">=8.4",
-        "expo-file-system": ">=11.0",
-        "expo-gl": ">=11.0",
-        "react": "^19.0.0",
-        "react-dom": "^19.0.0",
-        "react-native": ">=0.78",
-        "three": ">=0.156"
-      },
-      "peerDependenciesMeta": {
-        "expo": {
-          "optional": true
-        },
-        "expo-asset": {
-          "optional": true
-        },
-        "expo-file-system": {
-          "optional": true
-        },
-        "expo-gl": {
-          "optional": true
-        },
-        "react-dom": {
-          "optional": true
-        },
-        "react-native": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@react-three/fiber/node_modules/scheduler": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz",
-      "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==",
-      "license": "MIT"
-    },
-    "node_modules/@react-types/shared": {
-      "version": "3.30.0",
-      "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.30.0.tgz",
-      "integrity": "sha512-COIazDAx1ncDg046cTJ8SFYsX8aS3lB/08LDnbkH/SkdYrFPWDlXMrO/sUam8j1WWM+PJ+4d1mj7tODIKNiFog==",
-      "license": "Apache-2.0",
-      "peerDependencies": {
-        "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
-      }
-    },
-    "node_modules/@rolldown/pluginutils": {
-      "version": "1.0.0-beta.11",
-      "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.11.tgz",
-      "integrity": "sha512-L/gAA/hyCSuzTF1ftlzUSI/IKr2POHsv1Dd78GfqkR83KMNuswWD61JxGV2L7nRwBBBSDr6R1gCkdTmoN7W4ag==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/@rollup/rollup-android-arm-eabi": {
-      "version": "4.43.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.43.0.tgz",
-      "integrity": "sha512-Krjy9awJl6rKbruhQDgivNbD1WuLb8xAclM4IR4cN5pHGAs2oIMMQJEiC3IC/9TZJ+QZkmZhlMO/6MBGxPidpw==",
-      "cpu": [
-        "arm"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "android"
-      ]
-    },
-    "node_modules/@rollup/rollup-android-arm64": {
-      "version": "4.43.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.43.0.tgz",
-      "integrity": "sha512-ss4YJwRt5I63454Rpj+mXCXicakdFmKnUNxr1dLK+5rv5FJgAxnN7s31a5VchRYxCFWdmnDWKd0wbAdTr0J5EA==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "android"
-      ]
-    },
-    "node_modules/@rollup/rollup-darwin-arm64": {
-      "version": "4.43.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.43.0.tgz",
-      "integrity": "sha512-eKoL8ykZ7zz8MjgBenEF2OoTNFAPFz1/lyJ5UmmFSz5jW+7XbH1+MAgCVHy72aG59rbuQLcJeiMrP8qP5d/N0A==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ]
-    },
-    "node_modules/@rollup/rollup-darwin-x64": {
-      "version": "4.43.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.43.0.tgz",
-      "integrity": "sha512-SYwXJgaBYW33Wi/q4ubN+ldWC4DzQY62S4Ll2dgfr/dbPoF50dlQwEaEHSKrQdSjC6oIe1WgzosoaNoHCdNuMg==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ]
-    },
-    "node_modules/@rollup/rollup-freebsd-arm64": {
-      "version": "4.43.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.43.0.tgz",
-      "integrity": "sha512-SV+U5sSo0yujrjzBF7/YidieK2iF6E7MdF6EbYxNz94lA+R0wKl3SiixGyG/9Klab6uNBIqsN7j4Y/Fya7wAjQ==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "freebsd"
-      ]
-    },
-    "node_modules/@rollup/rollup-freebsd-x64": {
-      "version": "4.43.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.43.0.tgz",
-      "integrity": "sha512-J7uCsiV13L/VOeHJBo5SjasKiGxJ0g+nQTrBkAsmQBIdil3KhPnSE9GnRon4ejX1XDdsmK/l30IYLiAaQEO0Cg==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "freebsd"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
-      "version": "4.43.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.43.0.tgz",
-      "integrity": "sha512-gTJ/JnnjCMc15uwB10TTATBEhK9meBIY+gXP4s0sHD1zHOaIh4Dmy1X9wup18IiY9tTNk5gJc4yx9ctj/fjrIw==",
-      "cpu": [
-        "arm"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-arm-musleabihf": {
-      "version": "4.43.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.43.0.tgz",
-      "integrity": "sha512-ZJ3gZynL1LDSIvRfz0qXtTNs56n5DI2Mq+WACWZ7yGHFUEirHBRt7fyIk0NsCKhmRhn7WAcjgSkSVVxKlPNFFw==",
-      "cpu": [
-        "arm"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-arm64-gnu": {
-      "version": "4.43.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.43.0.tgz",
-      "integrity": "sha512-8FnkipasmOOSSlfucGYEu58U8cxEdhziKjPD2FIa0ONVMxvl/hmONtX/7y4vGjdUhjcTHlKlDhw3H9t98fPvyA==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-arm64-musl": {
-      "version": "4.43.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.43.0.tgz",
-      "integrity": "sha512-KPPyAdlcIZ6S9C3S2cndXDkV0Bb1OSMsX0Eelr2Bay4EsF9yi9u9uzc9RniK3mcUGCLhWY9oLr6er80P5DE6XA==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
-      "version": "4.43.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.43.0.tgz",
-      "integrity": "sha512-HPGDIH0/ZzAZjvtlXj6g+KDQ9ZMHfSP553za7o2Odegb/BEfwJcR0Sw0RLNpQ9nC6Gy8s+3mSS9xjZ0n3rhcYg==",
-      "cpu": [
-        "loong64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
-      "version": "4.43.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.43.0.tgz",
-      "integrity": "sha512-gEmwbOws4U4GLAJDhhtSPWPXUzDfMRedT3hFMyRAvM9Mrnj+dJIFIeL7otsv2WF3D7GrV0GIewW0y28dOYWkmw==",
-      "cpu": [
-        "ppc64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-riscv64-gnu": {
-      "version": "4.43.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.43.0.tgz",
-      "integrity": "sha512-XXKvo2e+wFtXZF/9xoWohHg+MuRnvO29TI5Hqe9xwN5uN8NKUYy7tXUG3EZAlfchufNCTHNGjEx7uN78KsBo0g==",
-      "cpu": [
-        "riscv64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-riscv64-musl": {
-      "version": "4.43.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.43.0.tgz",
-      "integrity": "sha512-ruf3hPWhjw6uDFsOAzmbNIvlXFXlBQ4nk57Sec8E8rUxs/AI4HD6xmiiasOOx/3QxS2f5eQMKTAwk7KHwpzr/Q==",
-      "cpu": [
-        "riscv64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-s390x-gnu": {
-      "version": "4.43.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.43.0.tgz",
-      "integrity": "sha512-QmNIAqDiEMEvFV15rsSnjoSmO0+eJLoKRD9EAa9rrYNwO/XRCtOGM3A5A0X+wmG+XRrw9Fxdsw+LnyYiZWWcVw==",
-      "cpu": [
-        "s390x"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-x64-gnu": {
-      "version": "4.43.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.43.0.tgz",
-      "integrity": "sha512-jAHr/S0iiBtFyzjhOkAics/2SrXE092qyqEg96e90L3t9Op8OTzS6+IX0Fy5wCt2+KqeHAkti+eitV0wvblEoQ==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-x64-musl": {
-      "version": "4.43.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.43.0.tgz",
-      "integrity": "sha512-3yATWgdeXyuHtBhrLt98w+5fKurdqvs8B53LaoKD7P7H7FKOONLsBVMNl9ghPQZQuYcceV5CDyPfyfGpMWD9mQ==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-win32-arm64-msvc": {
-      "version": "4.43.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.43.0.tgz",
-      "integrity": "sha512-wVzXp2qDSCOpcBCT5WRWLmpJRIzv23valvcTwMHEobkjippNf+C3ys/+wf07poPkeNix0paTNemB2XrHr2TnGw==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ]
-    },
-    "node_modules/@rollup/rollup-win32-ia32-msvc": {
-      "version": "4.43.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.43.0.tgz",
-      "integrity": "sha512-fYCTEyzf8d+7diCw8b+asvWDCLMjsCEA8alvtAutqJOJp/wL5hs1rWSqJ1vkjgW0L2NB4bsYJrpKkiIPRR9dvw==",
-      "cpu": [
-        "ia32"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ]
-    },
-    "node_modules/@splinetool/react-spline": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/@splinetool/react-spline/-/react-spline-4.0.0.tgz",
-      "integrity": "sha512-FqrV7/K2q998Y0t83QUauQxsifKWAg9CFZoSb64qRuH7IfHkDs5/OgU1ACkg0aTgsEPtFlH+kATQ+8X6MrizHQ==",
-      "dependencies": {
-        "blurhash": "2.0.5",
-        "lodash.debounce": "4.0.8",
-        "react-merge-refs": "2.1.1",
-        "thumbhash": "0.1.1"
-      },
-      "peerDependencies": {
-        "@splinetool/runtime": "*",
-        "next": ">=14.2.0",
-        "react": "*",
-        "react-dom": "*"
-      },
-      "peerDependenciesMeta": {
-        "next": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@splinetool/runtime": {
-      "version": "1.10.9",
-      "resolved": "https://registry.npmjs.org/@splinetool/runtime/-/runtime-1.10.9.tgz",
-      "integrity": "sha512-E1Vifegy2r1lQU0E+ofbL2N6uGmL40es0VF5GX7gu7xCvQJTfD3jzpVI7DO/ChlVcaL5eHmPmWd1+P2DXUbraA==",
-      "peer": true,
-      "dependencies": {
-        "on-change": "^4.0.0",
-        "semver-compare": "^1.0.0"
-      }
-    },
-    "node_modules/@swc/helpers": {
-      "version": "0.5.17",
-      "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz",
-      "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==",
-      "license": "Apache-2.0",
-      "dependencies": {
-        "tslib": "^2.8.0"
-      }
-    },
-    "node_modules/@tabler/icons": {
-      "version": "3.35.0",
-      "resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-3.35.0.tgz",
-      "integrity": "sha512-yYXe+gJ56xlZFiXwV9zVoe3FWCGuZ/D7/G4ZIlDtGxSx5CGQK110wrnT29gUj52kEZoxqF7oURTk97GQxELOFQ==",
-      "license": "MIT",
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/codecalm"
-      }
-    },
-    "node_modules/@tabler/icons-react": {
-      "version": "3.35.0",
-      "resolved": "https://registry.npmjs.org/@tabler/icons-react/-/icons-react-3.35.0.tgz",
-      "integrity": "sha512-XG7t2DYf3DyHT5jxFNp5xyLVbL4hMJYJhiSdHADzAjLRYfL7AnjlRfiHDHeXxkb2N103rEIvTsBRazxXtAUz2g==",
-      "license": "MIT",
-      "dependencies": {
-        "@tabler/icons": "3.35.0"
-      },
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/codecalm"
-      },
-      "peerDependencies": {
-        "react": ">= 16"
-      }
-    },
-    "node_modules/@tailwindcss/node": {
-      "version": "4.1.10",
-      "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.10.tgz",
-      "integrity": "sha512-2ACf1znY5fpRBwRhMgj9ZXvb2XZW8qs+oTfotJ2C5xR0/WNL7UHZ7zXl6s+rUqedL1mNi+0O+WQr5awGowS3PQ==",
-      "license": "MIT",
-      "dependencies": {
-        "@ampproject/remapping": "^2.3.0",
-        "enhanced-resolve": "^5.18.1",
-        "jiti": "^2.4.2",
-        "lightningcss": "1.30.1",
-        "magic-string": "^0.30.17",
-        "source-map-js": "^1.2.1",
-        "tailwindcss": "4.1.10"
-      }
-    },
-    "node_modules/@tailwindcss/oxide": {
-      "version": "4.1.10",
-      "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.10.tgz",
-      "integrity": "sha512-v0C43s7Pjw+B9w21htrQwuFObSkio2aV/qPx/mhrRldbqxbWJK6KizM+q7BF1/1CmuLqZqX3CeYF7s7P9fbA8Q==",
-      "hasInstallScript": true,
-      "license": "MIT",
-      "dependencies": {
-        "detect-libc": "^2.0.4",
-        "tar": "^7.4.3"
-      },
-      "engines": {
-        "node": ">= 10"
-      },
-      "optionalDependencies": {
-        "@tailwindcss/oxide-android-arm64": "4.1.10",
-        "@tailwindcss/oxide-darwin-arm64": "4.1.10",
-        "@tailwindcss/oxide-darwin-x64": "4.1.10",
-        "@tailwindcss/oxide-freebsd-x64": "4.1.10",
-        "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.10",
-        "@tailwindcss/oxide-linux-arm64-gnu": "4.1.10",
-        "@tailwindcss/oxide-linux-arm64-musl": "4.1.10",
-        "@tailwindcss/oxide-linux-x64-gnu": "4.1.10",
-        "@tailwindcss/oxide-linux-x64-musl": "4.1.10",
-        "@tailwindcss/oxide-wasm32-wasi": "4.1.10",
-        "@tailwindcss/oxide-win32-arm64-msvc": "4.1.10",
-        "@tailwindcss/oxide-win32-x64-msvc": "4.1.10"
-      }
-    },
-    "node_modules/@tailwindcss/oxide-android-arm64": {
-      "version": "4.1.10",
-      "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.10.tgz",
-      "integrity": "sha512-VGLazCoRQ7rtsCzThaI1UyDu/XRYVyH4/EWiaSX6tFglE+xZB5cvtC5Omt0OQ+FfiIVP98su16jDVHDEIuH4iQ==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/@tailwindcss/oxide-darwin-arm64": {
-      "version": "4.1.10",
-      "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.10.tgz",
-      "integrity": "sha512-ZIFqvR1irX2yNjWJzKCqTCcHZbgkSkSkZKbRM3BPzhDL/18idA8uWCoopYA2CSDdSGFlDAxYdU2yBHwAwx8euQ==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/@tailwindcss/oxide-darwin-x64": {
-      "version": "4.1.10",
-      "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.10.tgz",
-      "integrity": "sha512-eCA4zbIhWUFDXoamNztmS0MjXHSEJYlvATzWnRiTqJkcUteSjO94PoRHJy1Xbwp9bptjeIxxBHh+zBWFhttbrQ==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/@tailwindcss/oxide-freebsd-x64": {
-      "version": "4.1.10",
-      "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.10.tgz",
-      "integrity": "sha512-8/392Xu12R0cc93DpiJvNpJ4wYVSiciUlkiOHOSOQNH3adq9Gi/dtySK7dVQjXIOzlpSHjeCL89RUUI8/GTI6g==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "freebsd"
-      ],
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
-      "version": "4.1.10",
-      "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.10.tgz",
-      "integrity": "sha512-t9rhmLT6EqeuPT+MXhWhlRYIMSfh5LZ6kBrC4FS6/+M1yXwfCtp24UumgCWOAJVyjQwG+lYva6wWZxrfvB+NhQ==",
-      "cpu": [
-        "arm"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
-      "version": "4.1.10",
-      "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.10.tgz",
-      "integrity": "sha512-3oWrlNlxLRxXejQ8zImzrVLuZ/9Z2SeKoLhtCu0hpo38hTO2iL86eFOu4sVR8cZc6n3z7eRXXqtHJECa6mFOvA==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/@tailwindcss/oxide-linux-arm64-musl": {
-      "version": "4.1.10",
-      "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.10.tgz",
-      "integrity": "sha512-saScU0cmWvg/Ez4gUmQWr9pvY9Kssxt+Xenfx1LG7LmqjcrvBnw4r9VjkFcqmbBb7GCBwYNcZi9X3/oMda9sqQ==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/@tailwindcss/oxide-linux-x64-gnu": {
-      "version": "4.1.10",
-      "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.10.tgz",
-      "integrity": "sha512-/G3ao/ybV9YEEgAXeEg28dyH6gs1QG8tvdN9c2MNZdUXYBaIY/Gx0N6RlJzfLy/7Nkdok4kaxKPHKJUlAaoTdA==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/@tailwindcss/oxide-linux-x64-musl": {
-      "version": "4.1.10",
-      "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.10.tgz",
-      "integrity": "sha512-LNr7X8fTiKGRtQGOerSayc2pWJp/9ptRYAa4G+U+cjw9kJZvkopav1AQc5HHD+U364f71tZv6XamaHKgrIoVzA==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/@tailwindcss/oxide-wasm32-wasi": {
-      "version": "4.1.10",
-      "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.10.tgz",
-      "integrity": "sha512-d6ekQpopFQJAcIK2i7ZzWOYGZ+A6NzzvQ3ozBvWFdeyqfOZdYHU66g5yr+/HC4ipP1ZgWsqa80+ISNILk+ae/Q==",
-      "bundleDependencies": [
-        "@napi-rs/wasm-runtime",
-        "@emnapi/core",
-        "@emnapi/runtime",
-        "@tybys/wasm-util",
-        "@emnapi/wasi-threads",
-        "tslib"
-      ],
-      "cpu": [
-        "wasm32"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "dependencies": {
-        "@emnapi/core": "^1.4.3",
-        "@emnapi/runtime": "^1.4.3",
-        "@emnapi/wasi-threads": "^1.0.2",
-        "@napi-rs/wasm-runtime": "^0.2.10",
-        "@tybys/wasm-util": "^0.9.0",
-        "tslib": "^2.8.0"
-      },
-      "engines": {
-        "node": ">=14.0.0"
-      }
-    },
-    "node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
-      "version": "4.1.10",
-      "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.10.tgz",
-      "integrity": "sha512-i1Iwg9gRbwNVOCYmnigWCCgow8nDWSFmeTUU5nbNx3rqbe4p0kRbEqLwLJbYZKmSSp23g4N6rCDmm7OuPBXhDA==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/@tailwindcss/oxide-win32-x64-msvc": {
-      "version": "4.1.10",
-      "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.10.tgz",
-      "integrity": "sha512-sGiJTjcBSfGq2DVRtaSljq5ZgZS2SDHSIfhOylkBvHVjwOsodBhnb3HdmiKkVuUGKD0I7G63abMOVaskj1KpOA==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/@tailwindcss/vite": {
-      "version": "4.1.10",
-      "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.10.tgz",
-      "integrity": "sha512-QWnD5HDY2IADv+vYR82lOhqOlS1jSCUUAmfem52cXAhRTKxpDh3ARX8TTXJTCCO7Rv7cD2Nlekabv02bwP3a2A==",
-      "license": "MIT",
-      "dependencies": {
-        "@tailwindcss/node": "4.1.10",
-        "@tailwindcss/oxide": "4.1.10",
-        "tailwindcss": "4.1.10"
-      },
-      "peerDependencies": {
-        "vite": "^5.2.0 || ^6"
-      }
-    },
-    "node_modules/@tanstack/react-virtual": {
-      "version": "3.13.11",
-      "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.11.tgz",
-      "integrity": "sha512-u5EaOSJOq08T9NXFuDopMdxZBNDFuEMohIFFU45fBYDXXh9SjYdbpNq1OLFSOpQnDRPjqgmY96ipZTkzom9t9Q==",
-      "license": "MIT",
-      "dependencies": {
-        "@tanstack/virtual-core": "3.13.11"
-      },
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/tannerlinsley"
-      },
-      "peerDependencies": {
-        "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
-        "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
-      }
-    },
-    "node_modules/@tanstack/virtual-core": {
-      "version": "3.13.11",
-      "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.11.tgz",
-      "integrity": "sha512-ORL6UyuZJ0D9X33LDR4TcgcM+K2YiS2j4xbvH1vnhhObwR1Z4dKwPTL/c0kj2Yeb4Yp2lBv1wpyVaqlohk8zpg==",
-      "license": "MIT",
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/tannerlinsley"
-      }
-    },
-    "node_modules/@types/babel__core": {
-      "version": "7.20.5",
-      "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
-      "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/parser": "^7.20.7",
-        "@babel/types": "^7.20.7",
-        "@types/babel__generator": "*",
-        "@types/babel__template": "*",
-        "@types/babel__traverse": "*"
-      }
-    },
-    "node_modules/@types/babel__generator": {
-      "version": "7.27.0",
-      "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
-      "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/types": "^7.0.0"
-      }
-    },
-    "node_modules/@types/babel__template": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
-      "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/parser": "^7.1.0",
-        "@babel/types": "^7.0.0"
-      }
-    },
-    "node_modules/@types/babel__traverse": {
-      "version": "7.20.7",
-      "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz",
-      "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/types": "^7.20.7"
-      }
-    },
-    "node_modules/@types/estree": {
-      "version": "1.0.8",
-      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
-      "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/@types/json-schema": {
-      "version": "7.0.15",
-      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
-      "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/@types/parse-json": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz",
-      "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==",
-      "license": "MIT"
-    },
-    "node_modules/@types/prop-types": {
-      "version": "15.7.15",
-      "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz",
-      "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==",
-      "license": "MIT"
-    },
-    "node_modules/@types/qs": {
-      "version": "6.14.0",
-      "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz",
-      "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/@types/react": {
-      "version": "19.1.8",
-      "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.8.tgz",
-      "integrity": "sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==",
-      "license": "MIT",
-      "dependencies": {
-        "csstype": "^3.0.2"
-      }
-    },
-    "node_modules/@types/react-dom": {
-      "version": "19.1.6",
-      "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.6.tgz",
-      "integrity": "sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw==",
-      "dev": true,
-      "license": "MIT",
-      "peerDependencies": {
-        "@types/react": "^19.0.0"
-      }
-    },
-    "node_modules/@types/react-native": {
-      "version": "0.49.5",
-      "resolved": "https://registry.npmjs.org/@types/react-native/-/react-native-0.49.5.tgz",
-      "integrity": "sha512-8HN496FiPhmykCqmJ433c2mZgww0kZrtCmKCNhdajdQuPujOF+lcw5kxBVV5OaXJ9oIsbnNCvmmzSDPFPEZPCQ==",
-      "license": "MIT",
-      "dependencies": {
-        "@types/react": "*"
-      }
-    },
-    "node_modules/@types/react-reconciler": {
-      "version": "0.32.0",
-      "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.32.0.tgz",
-      "integrity": "sha512-+WHarFkJevhH1s655qeeSEf/yxFST0dVRsmSqUgxG8mMOKqycgYBv2wVpyubBY7MX8KiX5FQ03rNIwrxfm7Bmw==",
-      "license": "MIT",
-      "peerDependencies": {
-        "@types/react": "*"
-      }
-    },
-    "node_modules/@types/react-slick": {
-      "version": "0.23.13",
-      "resolved": "https://registry.npmjs.org/@types/react-slick/-/react-slick-0.23.13.tgz",
-      "integrity": "sha512-bNZfDhe/L8t5OQzIyhrRhBr/61pfBcWaYJoq6UDqFtv5LMwfg4NsVDD2J8N01JqdAdxLjOt66OZEp6PX+dGs/A==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/react": "*"
-      }
-    },
-    "node_modules/@types/react-transition-group": {
-      "version": "4.4.12",
-      "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz",
-      "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==",
-      "license": "MIT",
-      "peerDependencies": {
-        "@types/react": "*"
-      }
-    },
-    "node_modules/@types/scheduler": {
-      "version": "0.16.8",
-      "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz",
-      "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==",
-      "license": "MIT"
-    },
-    "node_modules/@types/webxr": {
-      "version": "0.5.22",
-      "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.22.tgz",
-      "integrity": "sha512-Vr6Stjv5jPRqH690f5I5GLjVk8GSsoQSYJ2FVd/3jJF7KaqfwPi3ehfBS96mlQ2kPCwZaX6U0rG2+NGHBKkA/A==",
-      "license": "MIT"
-    },
-    "node_modules/@typescript-eslint/eslint-plugin": {
-      "version": "8.34.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.34.0.tgz",
-      "integrity": "sha512-QXwAlHlbcAwNlEEMKQS2RCgJsgXrTJdjXT08xEgbPFa2yYQgVjBymxP5DrfrE7X7iodSzd9qBUHUycdyVJTW1w==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@eslint-community/regexpp": "^4.10.0",
-        "@typescript-eslint/scope-manager": "8.34.0",
-        "@typescript-eslint/type-utils": "8.34.0",
-        "@typescript-eslint/utils": "8.34.0",
-        "@typescript-eslint/visitor-keys": "8.34.0",
-        "graphemer": "^1.4.0",
-        "ignore": "^7.0.0",
-        "natural-compare": "^1.4.0",
-        "ts-api-utils": "^2.1.0"
-      },
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      },
-      "peerDependencies": {
-        "@typescript-eslint/parser": "^8.34.0",
-        "eslint": "^8.57.0 || ^9.0.0",
-        "typescript": ">=4.8.4 <5.9.0"
-      }
-    },
-    "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
-      "version": "7.0.5",
-      "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
-      "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 4"
-      }
-    },
-    "node_modules/@typescript-eslint/parser": {
-      "version": "8.34.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.34.0.tgz",
-      "integrity": "sha512-vxXJV1hVFx3IXz/oy2sICsJukaBrtDEQSBiV48/YIV5KWjX1dO+bcIr/kCPrW6weKXvsaGKFNlwH0v2eYdRRbA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@typescript-eslint/scope-manager": "8.34.0",
-        "@typescript-eslint/types": "8.34.0",
-        "@typescript-eslint/typescript-estree": "8.34.0",
-        "@typescript-eslint/visitor-keys": "8.34.0",
-        "debug": "^4.3.4"
-      },
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      },
-      "peerDependencies": {
-        "eslint": "^8.57.0 || ^9.0.0",
-        "typescript": ">=4.8.4 <5.9.0"
-      }
-    },
-    "node_modules/@typescript-eslint/project-service": {
-      "version": "8.34.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.34.0.tgz",
-      "integrity": "sha512-iEgDALRf970/B2YExmtPMPF54NenZUf4xpL3wsCRx/lgjz6ul/l13R81ozP/ZNuXfnLCS+oPmG7JIxfdNYKELw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@typescript-eslint/tsconfig-utils": "^8.34.0",
-        "@typescript-eslint/types": "^8.34.0",
-        "debug": "^4.3.4"
-      },
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      },
-      "peerDependencies": {
-        "typescript": ">=4.8.4 <5.9.0"
-      }
-    },
-    "node_modules/@typescript-eslint/scope-manager": {
-      "version": "8.34.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.34.0.tgz",
-      "integrity": "sha512-9Ac0X8WiLykl0aj1oYQNcLZjHgBojT6cW68yAgZ19letYu+Hxd0rE0veI1XznSSst1X5lwnxhPbVdwjDRIomRw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@typescript-eslint/types": "8.34.0",
-        "@typescript-eslint/visitor-keys": "8.34.0"
-      },
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      }
-    },
-    "node_modules/@typescript-eslint/tsconfig-utils": {
-      "version": "8.34.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.34.0.tgz",
-      "integrity": "sha512-+W9VYHKFIzA5cBeooqQxqNriAP0QeQ7xTiDuIOr71hzgffm3EL2hxwWBIIj4GuofIbKxGNarpKqIq6Q6YrShOA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      },
-      "peerDependencies": {
-        "typescript": ">=4.8.4 <5.9.0"
-      }
-    },
-    "node_modules/@typescript-eslint/type-utils": {
-      "version": "8.34.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.34.0.tgz",
-      "integrity": "sha512-n7zSmOcUVhcRYC75W2pnPpbO1iwhJY3NLoHEtbJwJSNlVAZuwqu05zY3f3s2SDWWDSo9FdN5szqc73DCtDObAg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@typescript-eslint/typescript-estree": "8.34.0",
-        "@typescript-eslint/utils": "8.34.0",
-        "debug": "^4.3.4",
-        "ts-api-utils": "^2.1.0"
-      },
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      },
-      "peerDependencies": {
-        "eslint": "^8.57.0 || ^9.0.0",
-        "typescript": ">=4.8.4 <5.9.0"
-      }
-    },
-    "node_modules/@typescript-eslint/types": {
-      "version": "8.34.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.34.0.tgz",
-      "integrity": "sha512-9V24k/paICYPniajHfJ4cuAWETnt7Ssy+R0Rbcqo5sSFr3QEZ/8TSoUi9XeXVBGXCaLtwTOKSLGcInCAvyZeMA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      }
-    },
-    "node_modules/@typescript-eslint/typescript-estree": {
-      "version": "8.34.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.34.0.tgz",
-      "integrity": "sha512-rOi4KZxI7E0+BMqG7emPSK1bB4RICCpF7QD3KCLXn9ZvWoESsOMlHyZPAHyG04ujVplPaHbmEvs34m+wjgtVtg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@typescript-eslint/project-service": "8.34.0",
-        "@typescript-eslint/tsconfig-utils": "8.34.0",
-        "@typescript-eslint/types": "8.34.0",
-        "@typescript-eslint/visitor-keys": "8.34.0",
-        "debug": "^4.3.4",
-        "fast-glob": "^3.3.2",
-        "is-glob": "^4.0.3",
-        "minimatch": "^9.0.4",
-        "semver": "^7.6.0",
-        "ts-api-utils": "^2.1.0"
-      },
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      },
-      "peerDependencies": {
-        "typescript": ">=4.8.4 <5.9.0"
-      }
-    },
-    "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
-      "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "balanced-match": "^1.0.0"
-      }
-    },
-    "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
-      "version": "9.0.5",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
-      "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "brace-expansion": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=16 || 14 >=14.17"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
-      "version": "7.7.2",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
-      "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
-      "dev": true,
-      "license": "ISC",
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@typescript-eslint/utils": {
-      "version": "8.34.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.34.0.tgz",
-      "integrity": "sha512-8L4tWatGchV9A1cKbjaavS6mwYwp39jql8xUmIIKJdm+qiaeHy5KMKlBrf30akXAWBzn2SqKsNOtSENWUwg7XQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@eslint-community/eslint-utils": "^4.7.0",
-        "@typescript-eslint/scope-manager": "8.34.0",
-        "@typescript-eslint/types": "8.34.0",
-        "@typescript-eslint/typescript-estree": "8.34.0"
-      },
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      },
-      "peerDependencies": {
-        "eslint": "^8.57.0 || ^9.0.0",
-        "typescript": ">=4.8.4 <5.9.0"
-      }
-    },
-    "node_modules/@typescript-eslint/visitor-keys": {
-      "version": "8.34.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.34.0.tgz",
-      "integrity": "sha512-qHV7pW7E85A0x6qyrFn+O+q1k1p3tQCsqIZ1KZ5ESLXY57aTvUd3/a4rdPTeXisvhXn2VQG0VSKUqs8KHF2zcA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@typescript-eslint/types": "8.34.0",
-        "eslint-visitor-keys": "^4.2.0"
-      },
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      }
-    },
-    "node_modules/@vitejs/plugin-react": {
-      "version": "4.5.2",
-      "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.5.2.tgz",
-      "integrity": "sha512-QNVT3/Lxx99nMQWJWF7K4N6apUEuT0KlZA3mx/mVaoGj3smm/8rc8ezz15J1pcbcjDK0V15rpHetVfya08r76Q==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/core": "^7.27.4",
-        "@babel/plugin-transform-react-jsx-self": "^7.27.1",
-        "@babel/plugin-transform-react-jsx-source": "^7.27.1",
-        "@rolldown/pluginutils": "1.0.0-beta.11",
-        "@types/babel__core": "^7.20.5",
-        "react-refresh": "^0.17.0"
-      },
-      "engines": {
-        "node": "^14.18.0 || >=16.0.0"
-      },
-      "peerDependencies": {
-        "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0"
-      }
-    },
-    "node_modules/acorn": {
-      "version": "8.15.0",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
-      "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
-      "dev": true,
-      "license": "MIT",
-      "bin": {
-        "acorn": "bin/acorn"
-      },
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/acorn-jsx": {
-      "version": "5.3.2",
-      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
-      "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
-      "dev": true,
-      "license": "MIT",
-      "peerDependencies": {
-        "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
-      }
-    },
-    "node_modules/ajv": {
-      "version": "6.12.6",
-      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
-      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "fast-deep-equal": "^3.1.1",
-        "fast-json-stable-stringify": "^2.0.0",
-        "json-schema-traverse": "^0.4.1",
-        "uri-js": "^4.2.2"
-      },
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/epoberezkin"
-      }
-    },
-    "node_modules/animated": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/animated/-/animated-0.2.2.tgz",
-      "integrity": "sha512-7pMzS0Sk2lA6/JT6he+apuy3GnDWUWVCurHMrpsbT9ugeLe80kpDQWjZQvkFiU9o7LsPGydPnoZpJsmt1HPPMA==",
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "invariant": "^2.2.0",
-        "normalize-css-color": "^1.0.1"
-      },
-      "peerDependencies": {
-        "react": "*",
-        "react-dom": "*"
-      }
-    },
-    "node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/argparse": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
-      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
-      "dev": true,
-      "license": "Python-2.0"
-    },
-    "node_modules/asynckit": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
-      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
-      "license": "MIT"
-    },
-    "node_modules/autoprefixer": {
-      "version": "10.4.21",
-      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz",
-      "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "opencollective",
-          "url": "https://opencollective.com/postcss/"
-        },
-        {
-          "type": "tidelift",
-          "url": "https://tidelift.com/funding/github/npm/autoprefixer"
-        },
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/ai"
-        }
-      ],
-      "license": "MIT",
-      "dependencies": {
-        "browserslist": "^4.24.4",
-        "caniuse-lite": "^1.0.30001702",
-        "fraction.js": "^4.3.7",
-        "normalize-range": "^0.1.2",
-        "picocolors": "^1.1.1",
-        "postcss-value-parser": "^4.2.0"
-      },
-      "bin": {
-        "autoprefixer": "bin/autoprefixer"
-      },
-      "engines": {
-        "node": "^10 || ^12 || >=14"
-      },
-      "peerDependencies": {
-        "postcss": "^8.1.0"
-      }
-    },
-    "node_modules/axios": {
-      "version": "1.10.0",
-      "resolved": "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz",
-      "integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==",
-      "license": "MIT",
-      "dependencies": {
-        "follow-redirects": "^1.15.6",
-        "form-data": "^4.0.0",
-        "proxy-from-env": "^1.1.0"
-      }
-    },
-    "node_modules/babel-plugin-macros": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
-      "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/runtime": "^7.12.5",
-        "cosmiconfig": "^7.0.0",
-        "resolve": "^1.19.0"
-      },
-      "engines": {
-        "node": ">=10",
-        "npm": ">=6"
-      }
-    },
-    "node_modules/balanced-match": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
-      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/base64-js": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
-      "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ],
-      "license": "MIT"
-    },
-    "node_modules/blurhash": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.5.tgz",
-      "integrity": "sha512-cRygWd7kGBQO3VEhPiTgq4Wc43ctsM+o46urrmPOiuAe+07fzlSB9OJVdpgDL0jPqXUVQ9ht7aq7kxOeJHRK+w==",
-      "license": "MIT"
-    },
-    "node_modules/brace-expansion": {
-      "version": "1.1.12",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
-      "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
-      }
-    },
-    "node_modules/braces": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
-      "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "fill-range": "^7.1.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/browserslist": {
-      "version": "4.25.0",
-      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.0.tgz",
-      "integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "opencollective",
-          "url": "https://opencollective.com/browserslist"
-        },
-        {
-          "type": "tidelift",
-          "url": "https://tidelift.com/funding/github/npm/browserslist"
-        },
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/ai"
-        }
-      ],
-      "license": "MIT",
-      "dependencies": {
-        "caniuse-lite": "^1.0.30001718",
-        "electron-to-chromium": "^1.5.160",
-        "node-releases": "^2.0.19",
-        "update-browserslist-db": "^1.1.3"
-      },
-      "bin": {
-        "browserslist": "cli.js"
-      },
-      "engines": {
-        "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
-      }
-    },
-    "node_modules/buffer": {
-      "version": "6.0.3",
-      "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
-      "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ],
-      "license": "MIT",
-      "dependencies": {
-        "base64-js": "^1.3.1",
-        "ieee754": "^1.2.1"
-      }
-    },
-    "node_modules/call-bind-apply-helpers": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
-      "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
-      "license": "MIT",
-      "dependencies": {
-        "es-errors": "^1.3.0",
-        "function-bind": "^1.1.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/call-bound": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
-      "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
-      "license": "MIT",
-      "dependencies": {
-        "call-bind-apply-helpers": "^1.0.2",
-        "get-intrinsic": "^1.3.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/callsites": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
-      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/caniuse-lite": {
-      "version": "1.0.30001723",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001723.tgz",
-      "integrity": "sha512-1R/elMjtehrFejxwmexeXAtae5UO9iSyFn6G/I806CYC/BLyyBk1EPhrKBkWhy6wM6Xnm47dSJQec+tLJ39WHw==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "opencollective",
-          "url": "https://opencollective.com/browserslist"
-        },
-        {
-          "type": "tidelift",
-          "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
-        },
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/ai"
-        }
-      ],
-      "license": "CC-BY-4.0"
-    },
-    "node_modules/chalk": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
-      }
-    },
-    "node_modules/chownr": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz",
-      "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==",
-      "license": "BlueOak-1.0.0",
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/classnames": {
-      "version": "2.5.1",
-      "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz",
-      "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==",
-      "license": "MIT"
-    },
-    "node_modules/clsx": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
-      "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/combined-stream": {
-      "version": "1.0.8",
-      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
-      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
-      "license": "MIT",
-      "dependencies": {
-        "delayed-stream": "~1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/concat-map": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/convert-source-map": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
-      "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/cookie": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz",
-      "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/cosmiconfig": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
-      "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
-      "license": "MIT",
-      "dependencies": {
-        "@types/parse-json": "^4.0.0",
-        "import-fresh": "^3.2.1",
-        "parse-json": "^5.0.0",
-        "path-type": "^4.0.0",
-        "yaml": "^1.10.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/cosmiconfig/node_modules/yaml": {
-      "version": "1.10.2",
-      "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
-      "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
-      "license": "ISC",
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/countup.js": {
-      "version": "2.9.0",
-      "resolved": "https://registry.npmjs.org/countup.js/-/countup.js-2.9.0.tgz",
-      "integrity": "sha512-llqrvyXztRFPp6+i8jx25phHWcVWhrHO4Nlt0uAOSKHB8778zzQswa4MU3qKBvkXfJKftRYFJuVHez67lyKdHg==",
-      "license": "MIT"
-    },
-    "node_modules/create-react-class": {
-      "version": "15.7.0",
-      "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.7.0.tgz",
-      "integrity": "sha512-QZv4sFWG9S5RUvkTYWbflxeZX+JG7Cz0Tn33rQBJ+WFQTqTfUTjMjiv9tnfXazjsO5r0KhPs+AqCjyrQX6h2ng==",
-      "license": "MIT",
-      "dependencies": {
-        "loose-envify": "^1.3.1",
-        "object-assign": "^4.1.1"
-      }
-    },
-    "node_modules/cross-spawn": {
-      "version": "7.0.6",
-      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
-      "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "path-key": "^3.1.0",
-        "shebang-command": "^2.0.0",
-        "which": "^2.0.1"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/csstype": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
-      "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
-      "license": "MIT"
-    },
-    "node_modules/debug": {
-      "version": "4.4.1",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
-      "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
-      "license": "MIT",
-      "dependencies": {
-        "ms": "^2.1.3"
-      },
-      "engines": {
-        "node": ">=6.0"
-      },
-      "peerDependenciesMeta": {
-        "supports-color": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/deep-is": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
-      "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/delayed-stream": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
-      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/detect-libc": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz",
-      "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==",
-      "license": "Apache-2.0",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/dom-helpers": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
-      "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/runtime": "^7.8.7",
-        "csstype": "^3.0.2"
-      }
-    },
-    "node_modules/dunder-proto": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
-      "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
-      "license": "MIT",
-      "dependencies": {
-        "call-bind-apply-helpers": "^1.0.1",
-        "es-errors": "^1.3.0",
-        "gopd": "^1.2.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/electron-to-chromium": {
-      "version": "1.5.167",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.167.tgz",
-      "integrity": "sha512-LxcRvnYO5ez2bMOFpbuuVuAI5QNeY1ncVytE/KXaL6ZNfzX1yPlAO0nSOyIHx2fVAuUprMqPs/TdVhUFZy7SIQ==",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/enhanced-resolve": {
-      "version": "5.18.1",
-      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz",
-      "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==",
-      "license": "MIT",
-      "dependencies": {
-        "graceful-fs": "^4.2.4",
-        "tapable": "^2.2.0"
-      },
-      "engines": {
-        "node": ">=10.13.0"
-      }
-    },
-    "node_modules/enquire.js": {
-      "version": "2.1.6",
-      "resolved": "https://registry.npmjs.org/enquire.js/-/enquire.js-2.1.6.tgz",
-      "integrity": "sha512-/KujNpO+PT63F7Hlpu4h3pE3TokKRHN26JYmQpPyjkRD/N57R7bPDNojMXdi7uveAKjYB7yQnartCxZnFWr0Xw==",
-      "license": "MIT"
-    },
-    "node_modules/error-ex": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
-      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
-      "license": "MIT",
-      "dependencies": {
-        "is-arrayish": "^0.2.1"
-      }
-    },
-    "node_modules/es-define-property": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
-      "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/es-errors": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
-      "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/es-object-atoms": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
-      "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
-      "license": "MIT",
-      "dependencies": {
-        "es-errors": "^1.3.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/es-set-tostringtag": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
-      "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
-      "license": "MIT",
-      "dependencies": {
-        "es-errors": "^1.3.0",
-        "get-intrinsic": "^1.2.6",
-        "has-tostringtag": "^1.0.2",
-        "hasown": "^2.0.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/esbuild": {
-      "version": "0.25.5",
-      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz",
-      "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==",
-      "hasInstallScript": true,
-      "license": "MIT",
-      "bin": {
-        "esbuild": "bin/esbuild"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "optionalDependencies": {
-        "@esbuild/aix-ppc64": "0.25.5",
-        "@esbuild/android-arm": "0.25.5",
-        "@esbuild/android-arm64": "0.25.5",
-        "@esbuild/android-x64": "0.25.5",
-        "@esbuild/darwin-arm64": "0.25.5",
-        "@esbuild/darwin-x64": "0.25.5",
-        "@esbuild/freebsd-arm64": "0.25.5",
-        "@esbuild/freebsd-x64": "0.25.5",
-        "@esbuild/linux-arm": "0.25.5",
-        "@esbuild/linux-arm64": "0.25.5",
-        "@esbuild/linux-ia32": "0.25.5",
-        "@esbuild/linux-loong64": "0.25.5",
-        "@esbuild/linux-mips64el": "0.25.5",
-        "@esbuild/linux-ppc64": "0.25.5",
-        "@esbuild/linux-riscv64": "0.25.5",
-        "@esbuild/linux-s390x": "0.25.5",
-        "@esbuild/linux-x64": "0.25.5",
-        "@esbuild/netbsd-arm64": "0.25.5",
-        "@esbuild/netbsd-x64": "0.25.5",
-        "@esbuild/openbsd-arm64": "0.25.5",
-        "@esbuild/openbsd-x64": "0.25.5",
-        "@esbuild/sunos-x64": "0.25.5",
-        "@esbuild/win32-arm64": "0.25.5",
-        "@esbuild/win32-ia32": "0.25.5",
-        "@esbuild/win32-x64": "0.25.5"
-      }
-    },
-    "node_modules/esbuild/node_modules/@esbuild/win32-x64": {
-      "version": "0.25.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz",
-      "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/escalade": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
-      "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/escape-string-regexp": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
-      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/eslint": {
-      "version": "9.29.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.29.0.tgz",
-      "integrity": "sha512-GsGizj2Y1rCWDu6XoEekL3RLilp0voSePurjZIkxL3wlm5o5EC9VpgaP7lrCvjnkuLvzFBQWB3vWB3K5KQTveQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@eslint-community/eslint-utils": "^4.2.0",
-        "@eslint-community/regexpp": "^4.12.1",
-        "@eslint/config-array": "^0.20.1",
-        "@eslint/config-helpers": "^0.2.1",
-        "@eslint/core": "^0.14.0",
-        "@eslint/eslintrc": "^3.3.1",
-        "@eslint/js": "9.29.0",
-        "@eslint/plugin-kit": "^0.3.1",
-        "@humanfs/node": "^0.16.6",
-        "@humanwhocodes/module-importer": "^1.0.1",
-        "@humanwhocodes/retry": "^0.4.2",
-        "@types/estree": "^1.0.6",
-        "@types/json-schema": "^7.0.15",
-        "ajv": "^6.12.4",
-        "chalk": "^4.0.0",
-        "cross-spawn": "^7.0.6",
-        "debug": "^4.3.2",
-        "escape-string-regexp": "^4.0.0",
-        "eslint-scope": "^8.4.0",
-        "eslint-visitor-keys": "^4.2.1",
-        "espree": "^10.4.0",
-        "esquery": "^1.5.0",
-        "esutils": "^2.0.2",
-        "fast-deep-equal": "^3.1.3",
-        "file-entry-cache": "^8.0.0",
-        "find-up": "^5.0.0",
-        "glob-parent": "^6.0.2",
-        "ignore": "^5.2.0",
-        "imurmurhash": "^0.1.4",
-        "is-glob": "^4.0.0",
-        "json-stable-stringify-without-jsonify": "^1.0.1",
-        "lodash.merge": "^4.6.2",
-        "minimatch": "^3.1.2",
-        "natural-compare": "^1.4.0",
-        "optionator": "^0.9.3"
-      },
-      "bin": {
-        "eslint": "bin/eslint.js"
-      },
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      },
-      "funding": {
-        "url": "https://eslint.org/donate"
-      },
-      "peerDependencies": {
-        "jiti": "*"
-      },
-      "peerDependenciesMeta": {
-        "jiti": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/eslint-plugin-react-hooks": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz",
-      "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=10"
-      },
-      "peerDependencies": {
-        "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0"
-      }
-    },
-    "node_modules/eslint-plugin-react-refresh": {
-      "version": "0.4.20",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.20.tgz",
-      "integrity": "sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==",
-      "dev": true,
-      "license": "MIT",
-      "peerDependencies": {
-        "eslint": ">=8.40"
-      }
-    },
-    "node_modules/eslint-scope": {
-      "version": "8.4.0",
-      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
-      "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "dependencies": {
-        "esrecurse": "^4.3.0",
-        "estraverse": "^5.2.0"
-      },
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      },
-      "funding": {
-        "url": "https://opencollective.com/eslint"
-      }
-    },
-    "node_modules/eslint-visitor-keys": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
-      "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      },
-      "funding": {
-        "url": "https://opencollective.com/eslint"
-      }
-    },
-    "node_modules/espree": {
-      "version": "10.4.0",
-      "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
-      "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "dependencies": {
-        "acorn": "^8.15.0",
-        "acorn-jsx": "^5.3.2",
-        "eslint-visitor-keys": "^4.2.1"
-      },
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      },
-      "funding": {
-        "url": "https://opencollective.com/eslint"
-      }
-    },
-    "node_modules/esquery": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
-      "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
-      "dev": true,
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "estraverse": "^5.1.0"
-      },
-      "engines": {
-        "node": ">=0.10"
-      }
-    },
-    "node_modules/esrecurse": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
-      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "dependencies": {
-        "estraverse": "^5.2.0"
-      },
-      "engines": {
-        "node": ">=4.0"
-      }
-    },
-    "node_modules/estraverse": {
-      "version": "5.3.0",
-      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
-      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "engines": {
-        "node": ">=4.0"
-      }
-    },
-    "node_modules/esutils": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
-      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/fast-deep-equal": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
-      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/fast-glob": {
-      "version": "3.3.3",
-      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
-      "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@nodelib/fs.stat": "^2.0.2",
-        "@nodelib/fs.walk": "^1.2.3",
-        "glob-parent": "^5.1.2",
-        "merge2": "^1.3.0",
-        "micromatch": "^4.0.8"
-      },
-      "engines": {
-        "node": ">=8.6.0"
-      }
-    },
-    "node_modules/fast-glob/node_modules/glob-parent": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
-      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "is-glob": "^4.0.1"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/fast-json-stable-stringify": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
-      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/fast-levenshtein": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
-      "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/fastq": {
-      "version": "1.19.1",
-      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
-      "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "reusify": "^1.0.4"
-      }
-    },
-    "node_modules/file-entry-cache": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
-      "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "flat-cache": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=16.0.0"
-      }
-    },
-    "node_modules/fill-range": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
-      "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "to-regex-range": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/find-root": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz",
-      "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==",
-      "license": "MIT"
-    },
-    "node_modules/find-up": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
-      "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "locate-path": "^6.0.0",
-        "path-exists": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/flat-cache": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
-      "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "flatted": "^3.2.9",
-        "keyv": "^4.5.4"
-      },
-      "engines": {
-        "node": ">=16"
-      }
-    },
-    "node_modules/flatted": {
-      "version": "3.3.3",
-      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
-      "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/follow-redirects": {
-      "version": "1.15.9",
-      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
-      "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
-      "funding": [
-        {
-          "type": "individual",
-          "url": "https://github.com/sponsors/RubenVerborgh"
-        }
-      ],
-      "license": "MIT",
-      "engines": {
-        "node": ">=4.0"
-      },
-      "peerDependenciesMeta": {
-        "debug": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/form-data": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.3.tgz",
-      "integrity": "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==",
-      "license": "MIT",
-      "dependencies": {
-        "asynckit": "^0.4.0",
-        "combined-stream": "^1.0.8",
-        "es-set-tostringtag": "^2.1.0",
-        "hasown": "^2.0.2",
-        "mime-types": "^2.1.12"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/fraction.js": {
-      "version": "4.3.7",
-      "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
-      "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": "*"
-      },
-      "funding": {
-        "type": "patreon",
-        "url": "https://github.com/sponsors/rawify"
-      }
-    },
-    "node_modules/framer-motion": {
-      "version": "12.19.1",
-      "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.19.1.tgz",
-      "integrity": "sha512-nq9hwWAEKf4gzprbOZzKugLV5OVKF7zrNDY6UOVu+4D3ZgIkg8L9Jy6AMrpBM06fhbKJ6LEG6UY5+t7Eq6wNlg==",
-      "license": "MIT",
-      "dependencies": {
-        "motion-dom": "^12.19.0",
-        "motion-utils": "^12.19.0",
-        "tslib": "^2.4.0"
-      },
-      "peerDependencies": {
-        "@emotion/is-prop-valid": "*",
-        "react": "^18.0.0 || ^19.0.0",
-        "react-dom": "^18.0.0 || ^19.0.0"
-      },
-      "peerDependenciesMeta": {
-        "@emotion/is-prop-valid": {
-          "optional": true
-        },
-        "react": {
-          "optional": true
-        },
-        "react-dom": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/fsevents": {
-      "version": "2.3.3",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
-      "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
-      "hasInstallScript": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
-      }
-    },
-    "node_modules/function-bind": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
-      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
-      "license": "MIT",
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/gensync": {
-      "version": "1.0.0-beta.2",
-      "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
-      "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/get-intrinsic": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
-      "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
-      "license": "MIT",
-      "dependencies": {
-        "call-bind-apply-helpers": "^1.0.2",
-        "es-define-property": "^1.0.1",
-        "es-errors": "^1.3.0",
-        "es-object-atoms": "^1.1.1",
-        "function-bind": "^1.1.2",
-        "get-proto": "^1.0.1",
-        "gopd": "^1.2.0",
-        "has-symbols": "^1.1.0",
-        "hasown": "^2.0.2",
-        "math-intrinsics": "^1.1.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/get-proto": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
-      "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
-      "license": "MIT",
-      "dependencies": {
-        "dunder-proto": "^1.0.1",
-        "es-object-atoms": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/glob-parent": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
-      "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "is-glob": "^4.0.3"
-      },
-      "engines": {
-        "node": ">=10.13.0"
-      }
-    },
-    "node_modules/globals": {
-      "version": "16.2.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-16.2.0.tgz",
-      "integrity": "sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/gopd": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
-      "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/graceful-fs": {
-      "version": "4.2.11",
-      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
-      "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
-      "license": "ISC"
-    },
-    "node_modules/graphemer": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
-      "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/gsap": {
-      "version": "3.13.0",
-      "resolved": "https://registry.npmjs.org/gsap/-/gsap-3.13.0.tgz",
-      "integrity": "sha512-QL7MJ2WMjm1PHWsoFrAQH/J8wUeqZvMtHO58qdekHpCfhvhSL4gSiz6vJf5EeMP0LOn3ZCprL2ki/gjED8ghVw==",
-      "license": "Standard 'no charge' license: https://gsap.com/standard-license."
-    },
-    "node_modules/has-flag": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/has-symbols": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
-      "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/has-tostringtag": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
-      "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
-      "license": "MIT",
-      "dependencies": {
-        "has-symbols": "^1.0.3"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/hasown": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
-      "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
-      "license": "MIT",
-      "dependencies": {
-        "function-bind": "^1.1.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/hoist-non-react-statics": {
-      "version": "3.3.2",
-      "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
-      "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "react-is": "^16.7.0"
-      }
-    },
-    "node_modules/hoist-non-react-statics/node_modules/react-is": {
-      "version": "16.13.1",
-      "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
-      "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
-      "license": "MIT"
-    },
-    "node_modules/html-parse-stringify": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz",
-      "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==",
-      "license": "MIT",
-      "dependencies": {
-        "void-elements": "3.1.0"
-      }
-    },
-    "node_modules/i18next": {
-      "version": "25.6.0",
-      "resolved": "https://registry.npmjs.org/i18next/-/i18next-25.6.0.tgz",
-      "integrity": "sha512-tTn8fLrwBYtnclpL5aPXK/tAYBLWVvoHM1zdfXoRNLcI+RvtMsoZRV98ePlaW3khHYKuNh/Q65W/+NVFUeIwVw==",
-      "funding": [
-        {
-          "type": "individual",
-          "url": "https://locize.com"
-        },
-        {
-          "type": "individual",
-          "url": "https://locize.com/i18next.html"
-        },
-        {
-          "type": "individual",
-          "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project"
-        }
-      ],
-      "license": "MIT",
-      "dependencies": {
-        "@babel/runtime": "^7.27.6"
-      },
-      "peerDependencies": {
-        "typescript": "^5"
-      },
-      "peerDependenciesMeta": {
-        "typescript": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/ieee754": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
-      "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ],
-      "license": "BSD-3-Clause"
-    },
-    "node_modules/ignore": {
-      "version": "5.3.2",
-      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
-      "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 4"
-      }
-    },
-    "node_modules/import-fresh": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
-      "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
-      "license": "MIT",
-      "dependencies": {
-        "parent-module": "^1.0.0",
-        "resolve-from": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/imurmurhash": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
-      "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.8.19"
-      }
-    },
-    "node_modules/invariant": {
-      "version": "2.2.4",
-      "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
-      "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
-      "license": "MIT",
-      "dependencies": {
-        "loose-envify": "^1.0.0"
-      }
-    },
-    "node_modules/is-arrayish": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
-      "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
-      "license": "MIT"
-    },
-    "node_modules/is-core-module": {
-      "version": "2.16.1",
-      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
-      "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
-      "license": "MIT",
-      "dependencies": {
-        "hasown": "^2.0.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-extglob": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
-      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-glob": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
-      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-extglob": "^2.1.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-number": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
-      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.12.0"
-      }
-    },
-    "node_modules/isexe": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
-      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/its-fine": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-2.0.0.tgz",
-      "integrity": "sha512-KLViCmWx94zOvpLwSlsx6yOCeMhZYaxrJV87Po5k/FoZzcPSahvK5qJ7fYhS61sZi5ikmh2S3Hz55A2l3U69ng==",
-      "license": "MIT",
-      "dependencies": {
-        "@types/react-reconciler": "^0.28.9"
-      },
-      "peerDependencies": {
-        "react": "^19.0.0"
-      }
-    },
-    "node_modules/its-fine/node_modules/@types/react-reconciler": {
-      "version": "0.28.9",
-      "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.9.tgz",
-      "integrity": "sha512-HHM3nxyUZ3zAylX8ZEyrDNd2XZOnQ0D5XfunJF5FLQnZbHHYq4UWvW1QfelQNXv1ICNkwYhfxjwfnqivYB6bFg==",
-      "license": "MIT",
-      "peerDependencies": {
-        "@types/react": "*"
-      }
-    },
-    "node_modules/jiti": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz",
-      "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==",
-      "license": "MIT",
-      "bin": {
-        "jiti": "lib/jiti-cli.mjs"
-      }
-    },
-    "node_modules/jquery": {
-      "version": "3.7.1",
-      "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz",
-      "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==",
-      "license": "MIT",
-      "peer": true
-    },
-    "node_modules/js-tokens": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
-      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
-      "license": "MIT"
-    },
-    "node_modules/js-yaml": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
-      "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "argparse": "^2.0.1"
-      },
-      "bin": {
-        "js-yaml": "bin/js-yaml.js"
-      }
-    },
-    "node_modules/jsesc": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
-      "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
-      "license": "MIT",
-      "bin": {
-        "jsesc": "bin/jsesc"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/json-buffer": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
-      "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/json-parse-even-better-errors": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
-      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
-      "license": "MIT"
-    },
-    "node_modules/json-schema-traverse": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/json-stable-stringify-without-jsonify": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
-      "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/json2mq": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz",
-      "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==",
-      "license": "MIT",
-      "dependencies": {
-        "string-convert": "^0.2.0"
-      }
-    },
-    "node_modules/json5": {
-      "version": "2.2.3",
-      "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
-      "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
-      "dev": true,
-      "license": "MIT",
-      "bin": {
-        "json5": "lib/cli.js"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/keyv": {
-      "version": "4.5.4",
-      "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
-      "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "json-buffer": "3.0.1"
-      }
-    },
-    "node_modules/levn": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
-      "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "prelude-ls": "^1.2.1",
-        "type-check": "~0.4.0"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/lightningcss": {
-      "version": "1.30.1",
-      "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz",
-      "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==",
-      "license": "MPL-2.0",
-      "dependencies": {
-        "detect-libc": "^2.0.3"
-      },
-      "engines": {
-        "node": ">= 12.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/parcel"
-      },
-      "optionalDependencies": {
-        "lightningcss-darwin-arm64": "1.30.1",
-        "lightningcss-darwin-x64": "1.30.1",
-        "lightningcss-freebsd-x64": "1.30.1",
-        "lightningcss-linux-arm-gnueabihf": "1.30.1",
-        "lightningcss-linux-arm64-gnu": "1.30.1",
-        "lightningcss-linux-arm64-musl": "1.30.1",
-        "lightningcss-linux-x64-gnu": "1.30.1",
-        "lightningcss-linux-x64-musl": "1.30.1",
-        "lightningcss-win32-arm64-msvc": "1.30.1",
-        "lightningcss-win32-x64-msvc": "1.30.1"
-      }
-    },
-    "node_modules/lightningcss-darwin-arm64": {
-      "version": "1.30.1",
-      "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz",
-      "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MPL-2.0",
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">= 12.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/parcel"
-      }
-    },
-    "node_modules/lightningcss-darwin-x64": {
-      "version": "1.30.1",
-      "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz",
-      "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MPL-2.0",
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">= 12.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/parcel"
-      }
-    },
-    "node_modules/lightningcss-freebsd-x64": {
-      "version": "1.30.1",
-      "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz",
-      "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MPL-2.0",
-      "optional": true,
-      "os": [
-        "freebsd"
-      ],
-      "engines": {
-        "node": ">= 12.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/parcel"
-      }
-    },
-    "node_modules/lightningcss-linux-arm-gnueabihf": {
-      "version": "1.30.1",
-      "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz",
-      "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==",
-      "cpu": [
-        "arm"
-      ],
-      "license": "MPL-2.0",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">= 12.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/parcel"
-      }
-    },
-    "node_modules/lightningcss-linux-arm64-gnu": {
-      "version": "1.30.1",
-      "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz",
-      "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MPL-2.0",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">= 12.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/parcel"
-      }
-    },
-    "node_modules/lightningcss-linux-arm64-musl": {
-      "version": "1.30.1",
-      "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz",
-      "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MPL-2.0",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">= 12.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/parcel"
-      }
-    },
-    "node_modules/lightningcss-linux-x64-gnu": {
-      "version": "1.30.1",
-      "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz",
-      "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MPL-2.0",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">= 12.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/parcel"
-      }
-    },
-    "node_modules/lightningcss-linux-x64-musl": {
-      "version": "1.30.1",
-      "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz",
-      "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MPL-2.0",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">= 12.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/parcel"
-      }
-    },
-    "node_modules/lightningcss-win32-arm64-msvc": {
-      "version": "1.30.1",
-      "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz",
-      "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MPL-2.0",
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">= 12.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/parcel"
-      }
-    },
-    "node_modules/lightningcss-win32-x64-msvc": {
-      "version": "1.30.1",
-      "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz",
-      "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MPL-2.0",
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">= 12.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/parcel"
-      }
-    },
-    "node_modules/lines-and-columns": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
-      "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
-      "license": "MIT"
-    },
-    "node_modules/locate-path": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
-      "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "p-locate": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/lodash.debounce": {
-      "version": "4.0.8",
-      "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
-      "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
-      "license": "MIT"
-    },
-    "node_modules/lodash.merge": {
-      "version": "4.6.2",
-      "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
-      "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/loose-envify": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
-      "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
-      "license": "MIT",
-      "dependencies": {
-        "js-tokens": "^3.0.0 || ^4.0.0"
-      },
-      "bin": {
-        "loose-envify": "cli.js"
-      }
-    },
-    "node_modules/lottie-react": {
-      "version": "2.4.1",
-      "resolved": "https://registry.npmjs.org/lottie-react/-/lottie-react-2.4.1.tgz",
-      "integrity": "sha512-LQrH7jlkigIIv++wIyrOYFLHSKQpEY4zehPicL9bQsrt1rnoKRYCYgpCUe5maqylNtacy58/sQDZTkwMcTRxZw==",
-      "license": "MIT",
-      "dependencies": {
-        "lottie-web": "^5.10.2"
-      },
-      "peerDependencies": {
-        "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
-        "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
-      }
-    },
-    "node_modules/lottie-web": {
-      "version": "5.13.0",
-      "resolved": "https://registry.npmjs.org/lottie-web/-/lottie-web-5.13.0.tgz",
-      "integrity": "sha512-+gfBXl6sxXMPe8tKQm7qzLnUy5DUPJPKIyRHwtpCpyUEYjHYRJC/5gjUvdkuO2c3JllrPtHXH5UJJK8LRYl5yQ==",
-      "license": "MIT"
-    },
-    "node_modules/lru-cache": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
-      "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "yallist": "^3.0.2"
-      }
-    },
-    "node_modules/lucide-react": {
-      "version": "0.515.0",
-      "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.515.0.tgz",
-      "integrity": "sha512-Sy7bY0MeicRm2pzrnoHm2h6C1iVoeHyBU2fjdQDsXGP51fhkhau1/ZV/dzrcxEmAKsxYb6bGaIsMnGHuQ5s0dw==",
-      "license": "ISC",
-      "peerDependencies": {
-        "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
-      }
-    },
-    "node_modules/magic-string": {
-      "version": "0.30.17",
-      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz",
-      "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==",
-      "license": "MIT",
-      "dependencies": {
-        "@jridgewell/sourcemap-codec": "^1.5.0"
-      }
-    },
-    "node_modules/math-intrinsics": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
-      "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/merge2": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
-      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/micromatch": {
-      "version": "4.0.8",
-      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
-      "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "braces": "^3.0.3",
-        "picomatch": "^2.3.1"
-      },
-      "engines": {
-        "node": ">=8.6"
-      }
-    },
-    "node_modules/mime-db": {
-      "version": "1.52.0",
-      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
-      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/mime-types": {
-      "version": "2.1.35",
-      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
-      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
-      "license": "MIT",
-      "dependencies": {
-        "mime-db": "1.52.0"
-      },
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/minimatch": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
-      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "brace-expansion": "^1.1.7"
-      },
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/minipass": {
-      "version": "7.1.2",
-      "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
-      "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
-      "license": "ISC",
-      "engines": {
-        "node": ">=16 || 14 >=14.17"
-      }
-    },
-    "node_modules/minizlib": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz",
-      "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==",
-      "license": "MIT",
-      "dependencies": {
-        "minipass": "^7.1.2"
-      },
-      "engines": {
-        "node": ">= 18"
-      }
-    },
-    "node_modules/mkdirp": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz",
-      "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==",
-      "license": "MIT",
-      "bin": {
-        "mkdirp": "dist/cjs/src/bin.js"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/motion-dom": {
-      "version": "12.19.0",
-      "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.19.0.tgz",
-      "integrity": "sha512-m96uqq8VbwxFLU0mtmlsIVe8NGGSdpBvBSHbnnOJQxniPaabvVdGgxSamhuDwBsRhwX7xPxdICgVJlOpzn/5bw==",
-      "license": "MIT",
-      "dependencies": {
-        "motion-utils": "^12.19.0"
-      }
-    },
-    "node_modules/motion-utils": {
-      "version": "12.19.0",
-      "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.19.0.tgz",
-      "integrity": "sha512-BuFTHINYmV07pdWs6lj6aI63vr2N4dg0vR+td0rtrdpWOhBzIkEklZyLcvKBoEtwSqx8Jg06vUB5RS0xDiUybw==",
-      "license": "MIT"
-    },
-    "node_modules/ms": {
-      "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
-      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
-      "license": "MIT"
-    },
-    "node_modules/nanoid": {
-      "version": "3.3.11",
-      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
-      "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/ai"
-        }
-      ],
-      "license": "MIT",
-      "bin": {
-        "nanoid": "bin/nanoid.cjs"
-      },
-      "engines": {
-        "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
-      }
-    },
-    "node_modules/natural-compare": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
-      "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/node-releases": {
-      "version": "2.0.19",
-      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
-      "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/normalize-css-color": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/normalize-css-color/-/normalize-css-color-1.0.2.tgz",
-      "integrity": "sha512-jPJ/V7Cp1UytdidsPqviKEElFQJs22hUUgK5BOPHTwOonNCk7/2qOxhhqzEajmFrWJowADFfOFh1V+aWkRfy+w==",
-      "license": "BSD-3-Clause"
-    },
-    "node_modules/normalize-range": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
-      "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/object-assign": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-      "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/object-inspect": {
-      "version": "1.13.4",
-      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
-      "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/ogl": {
-      "version": "1.0.11",
-      "resolved": "https://registry.npmjs.org/ogl/-/ogl-1.0.11.tgz",
-      "integrity": "sha512-kUpC154AFfxi16pmZUK4jk3J+8zxwTWGPo03EoYA8QPbzikHoaC82n6pNTbd+oEaJonaE8aPWBlX7ad9zrqLsA==",
-      "license": "Unlicense"
-    },
-    "node_modules/on-change": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/on-change/-/on-change-4.0.2.tgz",
-      "integrity": "sha512-cMtCyuJmTx/bg2HCpHo3ZLeF7FZnBOapLqZHr2AlLeJ5Ul0Zu2mUJJz051Fdwu/Et2YW04ZD+TtU+gVy0ACNCA==",
-      "license": "MIT",
-      "peer": true,
-      "engines": {
-        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sindresorhus/on-change?sponsor=1"
-      }
-    },
-    "node_modules/optionator": {
-      "version": "0.9.4",
-      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
-      "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "deep-is": "^0.1.3",
-        "fast-levenshtein": "^2.0.6",
-        "levn": "^0.4.1",
-        "prelude-ls": "^1.2.1",
-        "type-check": "^0.4.0",
-        "word-wrap": "^1.2.5"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/p-limit": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
-      "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "yocto-queue": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/p-locate": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
-      "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "p-limit": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/parent-module": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
-      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
-      "license": "MIT",
-      "dependencies": {
-        "callsites": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/parse-json": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
-      "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/code-frame": "^7.0.0",
-        "error-ex": "^1.3.1",
-        "json-parse-even-better-errors": "^2.3.0",
-        "lines-and-columns": "^1.1.6"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/path-exists": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
-      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/path-key": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
-      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/path-parse": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
-      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
-      "license": "MIT"
-    },
-    "node_modules/path-type": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
-      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/picocolors": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
-      "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
-      "license": "ISC"
-    },
-    "node_modules/picomatch": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
-      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8.6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/jonschlinkert"
-      }
-    },
-    "node_modules/postcss": {
-      "version": "8.5.5",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.5.tgz",
-      "integrity": "sha512-d/jtm+rdNT8tpXuHY5MMtcbJFBkhXE6593XVR9UoGCH8jSFGci7jGvMGH5RYd5PBJW+00NZQt6gf7CbagJCrhg==",
-      "funding": [
-        {
-          "type": "opencollective",
-          "url": "https://opencollective.com/postcss/"
-        },
-        {
-          "type": "tidelift",
-          "url": "https://tidelift.com/funding/github/npm/postcss"
-        },
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/ai"
-        }
-      ],
-      "license": "MIT",
-      "dependencies": {
-        "nanoid": "^3.3.11",
-        "picocolors": "^1.1.1",
-        "source-map-js": "^1.2.1"
-      },
-      "engines": {
-        "node": "^10 || ^12 || >=14"
-      }
-    },
-    "node_modules/postcss-value-parser": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
-      "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/prelude-ls": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
-      "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/prop-types": {
-      "version": "15.8.1",
-      "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
-      "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
-      "license": "MIT",
-      "dependencies": {
-        "loose-envify": "^1.4.0",
-        "object-assign": "^4.1.1",
-        "react-is": "^16.13.1"
-      }
-    },
-    "node_modules/prop-types/node_modules/react-is": {
-      "version": "16.13.1",
-      "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
-      "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
-      "license": "MIT"
-    },
-    "node_modules/proxy-from-env": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
-      "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
-      "license": "MIT"
-    },
-    "node_modules/punycode": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
-      "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/qs": {
-      "version": "6.14.0",
-      "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
-      "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "side-channel": "^1.1.0"
-      },
-      "engines": {
-        "node": ">=0.6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/queue-microtask": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
-      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ],
-      "license": "MIT"
-    },
-    "node_modules/react": {
-      "version": "19.1.0",
-      "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz",
-      "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/react-bits": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/react-bits/-/react-bits-1.0.5.tgz",
-      "integrity": "sha512-WX4Y3tqmkCrGhLJXdogqYYpBCYtY02cjIj2TBA62vL/mWOEW33UYOZAwDKxPCY9J/K+8ghkXhtvJW1h4lq/HCg==",
-      "license": "MIT",
-      "dependencies": {
-        "@types/prop-types": "^15.5.2",
-        "@types/react": "^16.0.10",
-        "@types/react-native": "^0.49.2",
-        "animated": "^0.2.0",
-        "create-react-class": "^15.6.2",
-        "prop-types": "^15.6.0",
-        "react-timer-mixin": "^0.13.3"
-      },
-      "peerDependencies": {
-        "react": ">=16.0.0"
-      }
-    },
-    "node_modules/react-bits/node_modules/@types/react": {
-      "version": "16.14.65",
-      "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.65.tgz",
-      "integrity": "sha512-Guc3kE+W8LrQB9I3bF3blvNH15dXFIVIHIJTqrF8cp5XI/3IJcHGo4C3sJNPb8Zx49aofXKnAGIKyonE4f7XWg==",
-      "license": "MIT",
-      "dependencies": {
-        "@types/prop-types": "*",
-        "@types/scheduler": "^0.16",
-        "csstype": "^3.0.2"
-      }
-    },
-    "node_modules/react-country-flag": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/react-country-flag/-/react-country-flag-3.1.0.tgz",
-      "integrity": "sha512-JWQFw1efdv9sTC+TGQvTKXQg1NKbDU2mBiAiRWcKM9F1sK+/zjhP2yGmm8YDddWyZdXVkR8Md47rPMJmo4YO5g==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=12"
-      },
-      "peerDependencies": {
-        "react": ">=16"
-      }
-    },
-    "node_modules/react-countup": {
-      "version": "6.5.3",
-      "resolved": "https://registry.npmjs.org/react-countup/-/react-countup-6.5.3.tgz",
-      "integrity": "sha512-udnqVQitxC7QWADSPDOxVWULkLvKUWrDapn5i53HE4DPRVgs+Y5rr4bo25qEl8jSh+0l2cToJgGMx+clxPM3+w==",
-      "license": "MIT",
-      "dependencies": {
-        "countup.js": "^2.8.0"
-      },
-      "peerDependencies": {
-        "react": ">= 16.3.0"
-      }
-    },
-    "node_modules/react-dom": {
-      "version": "19.1.0",
-      "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz",
-      "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==",
-      "license": "MIT",
-      "dependencies": {
-        "scheduler": "^0.26.0"
-      },
-      "peerDependencies": {
-        "react": "^19.1.0"
-      }
-    },
-    "node_modules/react-i18next": {
-      "version": "16.0.0",
-      "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-16.0.0.tgz",
-      "integrity": "sha512-JQ+dFfLnFSKJQt7W01lJHWRC0SX7eDPobI+MSTJ3/gP39xH2g33AuTE7iddAfXYHamJdAeMGM0VFboPaD3G68Q==",
-      "license": "MIT",
-      "dependencies": {
-        "@babel/runtime": "^7.27.6",
-        "html-parse-stringify": "^3.0.1"
-      },
-      "peerDependencies": {
-        "i18next": ">= 25.5.2",
-        "react": ">= 16.8.0",
-        "typescript": "^5"
-      },
-      "peerDependenciesMeta": {
-        "react-dom": {
-          "optional": true
-        },
-        "react-native": {
-          "optional": true
-        },
-        "typescript": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/react-is": {
-      "version": "19.1.0",
-      "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.1.0.tgz",
-      "integrity": "sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg==",
-      "license": "MIT"
-    },
-    "node_modules/react-merge-refs": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/react-merge-refs/-/react-merge-refs-2.1.1.tgz",
-      "integrity": "sha512-jLQXJ/URln51zskhgppGJ2ub7b2WFKGq3cl3NYKtlHoTG+dN2q7EzWrn3hN3EgPsTMvpR9tpq5ijdp7YwFZkag==",
-      "license": "MIT",
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/gregberge"
-      }
-    },
-    "node_modules/react-reconciler": {
-      "version": "0.31.0",
-      "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.31.0.tgz",
-      "integrity": "sha512-7Ob7Z+URmesIsIVRjnLoDGwBEG/tVitidU0nMsqX/eeJaLY89RISO/10ERe0MqmzuKUUB1rmY+h1itMbUHg9BQ==",
-      "license": "MIT",
-      "dependencies": {
-        "scheduler": "^0.25.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      },
-      "peerDependencies": {
-        "react": "^19.0.0"
-      }
-    },
-    "node_modules/react-reconciler/node_modules/scheduler": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz",
-      "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==",
-      "license": "MIT"
-    },
-    "node_modules/react-refresh": {
-      "version": "0.17.0",
-      "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz",
-      "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/react-router": {
-      "version": "7.6.2",
-      "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.6.2.tgz",
-      "integrity": "sha512-U7Nv3y+bMimgWjhlT5CRdzHPu2/KVmqPwKUCChW8en5P3znxUqwlYFlbmyj8Rgp1SF6zs5X4+77kBVknkg6a0w==",
-      "license": "MIT",
-      "dependencies": {
-        "cookie": "^1.0.1",
-        "set-cookie-parser": "^2.6.0"
-      },
-      "engines": {
-        "node": ">=20.0.0"
-      },
-      "peerDependencies": {
-        "react": ">=18",
-        "react-dom": ">=18"
-      },
-      "peerDependenciesMeta": {
-        "react-dom": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/react-router-dom": {
-      "version": "7.6.2",
-      "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.6.2.tgz",
-      "integrity": "sha512-Q8zb6VlTbdYKK5JJBLQEN06oTUa/RAbG/oQS1auK1I0TbJOXktqm+QENEVJU6QvWynlXPRBXI3fiOQcSEA78rA==",
-      "license": "MIT",
-      "dependencies": {
-        "react-router": "7.6.2"
-      },
-      "engines": {
-        "node": ">=20.0.0"
-      },
-      "peerDependencies": {
-        "react": ">=18",
-        "react-dom": ">=18"
-      }
-    },
-    "node_modules/react-slick": {
-      "version": "0.30.3",
-      "resolved": "https://registry.npmjs.org/react-slick/-/react-slick-0.30.3.tgz",
-      "integrity": "sha512-B4x0L9GhkEWUMApeHxr/Ezp2NncpGc+5174R02j+zFiWuYboaq98vmxwlpafZfMjZic1bjdIqqmwLDcQY0QaFA==",
-      "license": "MIT",
-      "dependencies": {
-        "classnames": "^2.2.5",
-        "enquire.js": "^2.1.6",
-        "json2mq": "^0.2.0",
-        "lodash.debounce": "^4.0.8",
-        "resize-observer-polyfill": "^1.5.0"
-      },
-      "peerDependencies": {
-        "react": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
-        "react-dom": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
-      }
-    },
-    "node_modules/react-timer-mixin": {
-      "version": "0.13.4",
-      "resolved": "https://registry.npmjs.org/react-timer-mixin/-/react-timer-mixin-0.13.4.tgz",
-      "integrity": "sha512-4+ow23tp/Tv7hBM5Az5/Be/eKKF7DIvJ09voz5LyHGQaqqz9WV8YMs31eFvcYQs7d451LSg7kDJV70XYN/Ug/Q==",
-      "license": "MIT"
-    },
-    "node_modules/react-toastify": {
-      "version": "11.0.5",
-      "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-11.0.5.tgz",
-      "integrity": "sha512-EpqHBGvnSTtHYhCPLxML05NLY2ZX0JURbAdNYa6BUkk+amz4wbKBQvoKQAB0ardvSarUBuY4Q4s1sluAzZwkmA==",
-      "license": "MIT",
-      "dependencies": {
-        "clsx": "^2.1.1"
-      },
-      "peerDependencies": {
-        "react": "^18 || ^19",
-        "react-dom": "^18 || ^19"
-      }
-    },
-    "node_modules/react-transition-group": {
-      "version": "4.4.5",
-      "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
-      "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==",
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "@babel/runtime": "^7.5.5",
-        "dom-helpers": "^5.0.1",
-        "loose-envify": "^1.4.0",
-        "prop-types": "^15.6.2"
-      },
-      "peerDependencies": {
-        "react": ">=16.6.0",
-        "react-dom": ">=16.6.0"
-      }
-    },
-    "node_modules/react-use-measure": {
-      "version": "2.1.7",
-      "resolved": "https://registry.npmjs.org/react-use-measure/-/react-use-measure-2.1.7.tgz",
-      "integrity": "sha512-KrvcAo13I/60HpwGO5jpW7E9DfusKyLPLvuHlUyP5zqnmAPhNc6qTRjUQrdTADl0lpPpDVU2/Gg51UlOGHXbdg==",
-      "license": "MIT",
-      "peerDependencies": {
-        "react": ">=16.13",
-        "react-dom": ">=16.13"
-      },
-      "peerDependenciesMeta": {
-        "react-dom": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/resize-observer-polyfill": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
-      "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==",
-      "license": "MIT"
-    },
-    "node_modules/resolve": {
-      "version": "1.22.10",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
-      "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
-      "license": "MIT",
-      "dependencies": {
-        "is-core-module": "^2.16.0",
-        "path-parse": "^1.0.7",
-        "supports-preserve-symlinks-flag": "^1.0.0"
-      },
-      "bin": {
-        "resolve": "bin/resolve"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/resolve-from": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
-      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/reusify": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
-      "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "iojs": ">=1.0.0",
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/rollup": {
-      "version": "4.43.0",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.43.0.tgz",
-      "integrity": "sha512-wdN2Kd3Twh8MAEOEJZsuxuLKCsBEo4PVNLK6tQWAn10VhsVewQLzcucMgLolRlhFybGxfclbPeEYBaP6RvUFGg==",
-      "license": "MIT",
-      "dependencies": {
-        "@types/estree": "1.0.7"
-      },
-      "bin": {
-        "rollup": "dist/bin/rollup"
-      },
-      "engines": {
-        "node": ">=18.0.0",
-        "npm": ">=8.0.0"
-      },
-      "optionalDependencies": {
-        "@rollup/rollup-android-arm-eabi": "4.43.0",
-        "@rollup/rollup-android-arm64": "4.43.0",
-        "@rollup/rollup-darwin-arm64": "4.43.0",
-        "@rollup/rollup-darwin-x64": "4.43.0",
-        "@rollup/rollup-freebsd-arm64": "4.43.0",
-        "@rollup/rollup-freebsd-x64": "4.43.0",
-        "@rollup/rollup-linux-arm-gnueabihf": "4.43.0",
-        "@rollup/rollup-linux-arm-musleabihf": "4.43.0",
-        "@rollup/rollup-linux-arm64-gnu": "4.43.0",
-        "@rollup/rollup-linux-arm64-musl": "4.43.0",
-        "@rollup/rollup-linux-loongarch64-gnu": "4.43.0",
-        "@rollup/rollup-linux-powerpc64le-gnu": "4.43.0",
-        "@rollup/rollup-linux-riscv64-gnu": "4.43.0",
-        "@rollup/rollup-linux-riscv64-musl": "4.43.0",
-        "@rollup/rollup-linux-s390x-gnu": "4.43.0",
-        "@rollup/rollup-linux-x64-gnu": "4.43.0",
-        "@rollup/rollup-linux-x64-musl": "4.43.0",
-        "@rollup/rollup-win32-arm64-msvc": "4.43.0",
-        "@rollup/rollup-win32-ia32-msvc": "4.43.0",
-        "@rollup/rollup-win32-x64-msvc": "4.43.0",
-        "fsevents": "~2.3.2"
-      }
-    },
-    "node_modules/rollup/node_modules/@rollup/rollup-win32-x64-msvc": {
-      "version": "4.43.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.43.0.tgz",
-      "integrity": "sha512-SnGhLiE5rlK0ofq8kzuDkM0g7FN1s5VYY+YSMTibP7CqShxCQvqtNxTARS4xX4PFJfHjG0ZQYX9iGzI3FQh5Aw==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ]
-    },
-    "node_modules/rollup/node_modules/@types/estree": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz",
-      "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==",
-      "license": "MIT"
-    },
-    "node_modules/run-parallel": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
-      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ],
-      "license": "MIT",
-      "dependencies": {
-        "queue-microtask": "^1.2.2"
-      }
-    },
-    "node_modules/scheduler": {
-      "version": "0.26.0",
-      "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz",
-      "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==",
-      "license": "MIT"
-    },
-    "node_modules/semver": {
-      "version": "6.3.1",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
-      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
-      "dev": true,
-      "license": "ISC",
-      "bin": {
-        "semver": "bin/semver.js"
-      }
-    },
-    "node_modules/semver-compare": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
-      "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==",
-      "license": "MIT",
-      "peer": true
-    },
-    "node_modules/set-cookie-parser": {
-      "version": "2.7.1",
-      "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz",
-      "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==",
-      "license": "MIT"
-    },
-    "node_modules/shebang-command": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
-      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "shebang-regex": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/shebang-regex": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
-      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/side-channel": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
-      "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
-      "license": "MIT",
-      "dependencies": {
-        "es-errors": "^1.3.0",
-        "object-inspect": "^1.13.3",
-        "side-channel-list": "^1.0.0",
-        "side-channel-map": "^1.0.1",
-        "side-channel-weakmap": "^1.0.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/side-channel-list": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
-      "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
-      "license": "MIT",
-      "dependencies": {
-        "es-errors": "^1.3.0",
-        "object-inspect": "^1.13.3"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/side-channel-map": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
-      "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
-      "license": "MIT",
-      "dependencies": {
-        "call-bound": "^1.0.2",
-        "es-errors": "^1.3.0",
-        "get-intrinsic": "^1.2.5",
-        "object-inspect": "^1.13.3"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/side-channel-weakmap": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
-      "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
-      "license": "MIT",
-      "dependencies": {
-        "call-bound": "^1.0.2",
-        "es-errors": "^1.3.0",
-        "get-intrinsic": "^1.2.5",
-        "object-inspect": "^1.13.3",
-        "side-channel-map": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/slick-carousel": {
-      "version": "1.8.1",
-      "resolved": "https://registry.npmjs.org/slick-carousel/-/slick-carousel-1.8.1.tgz",
-      "integrity": "sha512-XB9Ftrf2EEKfzoQXt3Nitrt/IPbT+f1fgqBdoxO3W/+JYvtEOW6EgxnWfr9GH6nmULv7Y2tPmEX3koxThVmebA==",
-      "license": "MIT",
-      "peerDependencies": {
-        "jquery": ">=1.8.0"
-      }
-    },
-    "node_modules/source-map": {
-      "version": "0.5.7",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-      "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
-      "license": "BSD-3-Clause",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/source-map-js": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
-      "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
-      "license": "BSD-3-Clause",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/string-convert": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz",
-      "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==",
-      "license": "MIT"
-    },
-    "node_modules/strip-json-comments": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
-      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/stylis": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz",
-      "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==",
-      "license": "MIT"
-    },
-    "node_modules/supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/supports-preserve-symlinks-flag": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
-      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/suspend-react": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/suspend-react/-/suspend-react-0.1.3.tgz",
-      "integrity": "sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==",
-      "license": "MIT",
-      "peerDependencies": {
-        "react": ">=17.0"
-      }
-    },
-    "node_modules/tabbable": {
-      "version": "6.2.0",
-      "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz",
-      "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==",
-      "license": "MIT"
-    },
-    "node_modules/tailwindcss": {
-      "version": "4.1.10",
-      "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.10.tgz",
-      "integrity": "sha512-P3nr6WkvKV/ONsTzj6Gb57sWPMX29EPNPopo7+FcpkQaNsrNpZ1pv8QmrYI2RqEKD7mlGqLnGovlcYnBK0IqUA==",
-      "license": "MIT"
-    },
-    "node_modules/tapable": {
-      "version": "2.2.2",
-      "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz",
-      "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/tar": {
-      "version": "7.4.3",
-      "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz",
-      "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==",
-      "license": "ISC",
-      "dependencies": {
-        "@isaacs/fs-minipass": "^4.0.0",
-        "chownr": "^3.0.0",
-        "minipass": "^7.1.2",
-        "minizlib": "^3.0.1",
-        "mkdirp": "^3.0.1",
-        "yallist": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tar/node_modules/yallist": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz",
-      "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==",
-      "license": "BlueOak-1.0.0",
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/three": {
-      "version": "0.179.1",
-      "resolved": "https://registry.npmjs.org/three/-/three-0.179.1.tgz",
-      "integrity": "sha512-5y/elSIQbrvKOISxpwXCR4sQqHtGiOI+MKLc3SsBdDXA2hz3Mdp3X59aUp8DyybMa34aeBwbFTpdoLJaUDEWSw==",
-      "license": "MIT"
-    },
-    "node_modules/thumbhash": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/thumbhash/-/thumbhash-0.1.1.tgz",
-      "integrity": "sha512-kH5pKeIIBPQXAOni2AiY/Cu/NKdkFREdpH+TLdM0g6WA7RriCv0kPLgP731ady67MhTAqrVG/4mnEeibVuCJcg==",
-      "license": "MIT"
-    },
-    "node_modules/tinyglobby": {
-      "version": "0.2.14",
-      "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz",
-      "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==",
-      "license": "MIT",
-      "dependencies": {
-        "fdir": "^6.4.4",
-        "picomatch": "^4.0.2"
-      },
-      "engines": {
-        "node": ">=12.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/SuperchupuDev"
-      }
-    },
-    "node_modules/tinyglobby/node_modules/fdir": {
-      "version": "6.4.6",
-      "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz",
-      "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==",
-      "license": "MIT",
-      "peerDependencies": {
-        "picomatch": "^3 || ^4"
-      },
-      "peerDependenciesMeta": {
-        "picomatch": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/tinyglobby/node_modules/picomatch": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
-      "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/jonschlinkert"
-      }
-    },
-    "node_modules/to-regex-range": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
-      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-number": "^7.0.0"
-      },
-      "engines": {
-        "node": ">=8.0"
-      }
-    },
-    "node_modules/ts-api-utils": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
-      "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=18.12"
-      },
-      "peerDependencies": {
-        "typescript": ">=4.8.4"
-      }
-    },
-    "node_modules/tslib": {
-      "version": "2.8.1",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
-      "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
-      "license": "0BSD"
-    },
-    "node_modules/type-check": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
-      "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "prelude-ls": "^1.2.1"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/typescript": {
-      "version": "5.8.3",
-      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
-      "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
-      "devOptional": true,
-      "license": "Apache-2.0",
-      "bin": {
-        "tsc": "bin/tsc",
-        "tsserver": "bin/tsserver"
-      },
-      "engines": {
-        "node": ">=14.17"
-      }
-    },
-    "node_modules/typescript-eslint": {
-      "version": "8.34.0",
-      "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.34.0.tgz",
-      "integrity": "sha512-MRpfN7uYjTrTGigFCt8sRyNqJFhjN0WwZecldaqhWm+wy0gaRt8Edb/3cuUy0zdq2opJWT6iXINKAtewnDOltQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@typescript-eslint/eslint-plugin": "8.34.0",
-        "@typescript-eslint/parser": "8.34.0",
-        "@typescript-eslint/utils": "8.34.0"
-      },
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      },
-      "peerDependencies": {
-        "eslint": "^8.57.0 || ^9.0.0",
-        "typescript": ">=4.8.4 <5.9.0"
-      }
-    },
-    "node_modules/update-browserslist-db": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
-      "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "opencollective",
-          "url": "https://opencollective.com/browserslist"
-        },
-        {
-          "type": "tidelift",
-          "url": "https://tidelift.com/funding/github/npm/browserslist"
-        },
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/ai"
-        }
-      ],
-      "license": "MIT",
-      "dependencies": {
-        "escalade": "^3.2.0",
-        "picocolors": "^1.1.1"
-      },
-      "bin": {
-        "update-browserslist-db": "cli.js"
-      },
-      "peerDependencies": {
-        "browserslist": ">= 4.21.0"
-      }
-    },
-    "node_modules/uri-js": {
-      "version": "4.4.1",
-      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
-      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "dependencies": {
-        "punycode": "^2.1.0"
-      }
-    },
-    "node_modules/use-sync-external-store": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz",
-      "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==",
-      "license": "MIT",
-      "peerDependencies": {
-        "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
-      }
-    },
-    "node_modules/vite": {
-      "version": "6.3.5",
-      "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz",
-      "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==",
-      "license": "MIT",
-      "dependencies": {
-        "esbuild": "^0.25.0",
-        "fdir": "^6.4.4",
-        "picomatch": "^4.0.2",
-        "postcss": "^8.5.3",
-        "rollup": "^4.34.9",
-        "tinyglobby": "^0.2.13"
-      },
-      "bin": {
-        "vite": "bin/vite.js"
-      },
-      "engines": {
-        "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/vitejs/vite?sponsor=1"
-      },
-      "optionalDependencies": {
-        "fsevents": "~2.3.3"
-      },
-      "peerDependencies": {
-        "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
-        "jiti": ">=1.21.0",
-        "less": "*",
-        "lightningcss": "^1.21.0",
-        "sass": "*",
-        "sass-embedded": "*",
-        "stylus": "*",
-        "sugarss": "*",
-        "terser": "^5.16.0",
-        "tsx": "^4.8.1",
-        "yaml": "^2.4.2"
-      },
-      "peerDependenciesMeta": {
-        "@types/node": {
-          "optional": true
-        },
-        "jiti": {
-          "optional": true
-        },
-        "less": {
-          "optional": true
-        },
-        "lightningcss": {
-          "optional": true
-        },
-        "sass": {
-          "optional": true
-        },
-        "sass-embedded": {
-          "optional": true
-        },
-        "stylus": {
-          "optional": true
-        },
-        "sugarss": {
-          "optional": true
-        },
-        "terser": {
-          "optional": true
-        },
-        "tsx": {
-          "optional": true
-        },
-        "yaml": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/vite/node_modules/fdir": {
-      "version": "6.4.6",
-      "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz",
-      "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==",
-      "license": "MIT",
-      "peerDependencies": {
-        "picomatch": "^3 || ^4"
-      },
-      "peerDependenciesMeta": {
-        "picomatch": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/vite/node_modules/picomatch": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
-      "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/jonschlinkert"
-      }
-    },
-    "node_modules/void-elements": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz",
-      "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/which": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
-      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "isexe": "^2.0.0"
-      },
-      "bin": {
-        "node-which": "bin/node-which"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/word-wrap": {
-      "version": "1.2.5",
-      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
-      "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/yallist": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
-      "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/yaml": {
-      "version": "2.8.0",
-      "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz",
-      "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==",
-      "license": "ISC",
-      "optional": true,
-      "peer": true,
-      "bin": {
-        "yaml": "bin.mjs"
-      },
-      "engines": {
-        "node": ">= 14.6"
-      }
-    },
-    "node_modules/yocto-queue": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
-      "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/zustand": {
-      "version": "5.0.6",
-      "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.6.tgz",
-      "integrity": "sha512-ihAqNeUVhe0MAD+X8M5UzqyZ9k3FFZLBTtqo6JLPwV53cbRB/mJwBI0PxcIgqhBBHlEs8G45OTDTMq3gNcLq3A==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=12.20.0"
-      },
-      "peerDependencies": {
-        "@types/react": ">=18.0.0",
-        "immer": ">=9.0.6",
-        "react": ">=18.0.0",
-        "use-sync-external-store": ">=1.2.0"
-      },
-      "peerDependenciesMeta": {
-        "@types/react": {
-          "optional": true
-        },
-        "immer": {
-          "optional": true
-        },
-        "react": {
-          "optional": true
-        },
-        "use-sync-external-store": {
-          "optional": true
-        }
-      }
-    }
-  }
-}
Index: ontend/package.json
===================================================================
--- frontend/package.json	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,64 +1,0 @@
-{
-  "name": "shifter",
-  "private": true,
-  "version": "0.0.0",
-  "type": "module",
-  "scripts": {
-    "dev": "vite",
-    "build": "tsc -b && vite build",
-    "lint": "eslint .",
-    "preview": "vite preview"
-  },
-  "dependencies": {
-    "@emotion/react": "^11.14.0",
-    "@emotion/styled": "^11.14.0",
-    "@headlessui/react": "^2.2.4",
-    "@heroicons/react": "^2.2.0",
-    "@lottiefiles/dotlottie-react": "^0.14.2",
-    "@mui/icons-material": "^7.1.2",
-    "@mui/material": "^7.1.2",
-    "@react-oauth/google": "^0.12.2",
-    "@react-three/fiber": "^9.3.0",
-    "@splinetool/react-spline": "^4.0.0",
-    "@tabler/icons-react": "^3.35.0",
-    "@tailwindcss/vite": "^4.1.10",
-    "axios": "^1.10.0",
-    "framer-motion": "^12.19.1",
-    "gsap": "^3.13.0",
-    "i18next": "^25.6.0",
-    "lottie-react": "^2.4.1",
-    "lucide-react": "^0.515.0",
-    "ogl": "^1.0.11",
-    "qs": "^6.14.0",
-    "react": "^19.1.0",
-    "react-bits": "^1.0.5",
-    "react-country-flag": "^3.1.0",
-    "react-countup": "^6.5.3",
-    "react-dom": "^19.1.0",
-    "react-i18next": "^16.0.0",
-    "react-router-dom": "^7.6.2",
-    "react-slick": "^0.30.3",
-    "react-toastify": "^11.0.5",
-    "slick-carousel": "^1.8.1",
-    "tailwindcss": "^4.1.10",
-    "three": "^0.179.1",
-    "zustand": "^5.0.6"
-  },
-  "devDependencies": {
-    "@eslint/js": "^9.25.0",
-    "@types/qs": "^6.14.0",
-    "@types/react": "^19.1.2",
-    "@types/react-dom": "^19.1.2",
-    "@types/react-slick": "^0.23.13",
-    "@vitejs/plugin-react": "^4.4.1",
-    "autoprefixer": "^10.4.21",
-    "eslint": "^9.25.0",
-    "eslint-plugin-react-hooks": "^5.2.0",
-    "eslint-plugin-react-refresh": "^0.4.19",
-    "globals": "^16.0.0",
-    "postcss": "^8.5.5",
-    "typescript": "~5.8.3",
-    "typescript-eslint": "^8.30.1",
-    "vite": "^6.3.5"
-  }
-}
Index: ontend/src/App.tsx
===================================================================
--- frontend/src/App.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,179 +1,0 @@
-import {Route, Routes, useLocation} from "react-router-dom";
-import Home from "./pages/Home.tsx";
-import Navbar from "./layout/Navbar.tsx";
-import Login from "./pages/Login.tsx";
-import Register from "./pages/Register.tsx";
-import Courses from "./pages/Courses.tsx";
-import {useEffect} from "react";
-import CourseDetails from "./pages/CourseDetails.tsx";
-import {ToastContainer} from 'react-toastify';
-import AppLoader from "./AppLoader.tsx";
-import Profile from "./pages/Profile.tsx";
-import Learn from "./pages/Learn.tsx";
-import PublicOnlyRoute from "./components/routeProtectors/PublicOnlyRoute.tsx";
-import UserOnlyRoute from "./components/routeProtectors/UserOnlyRoute.tsx";
-import {useAuthContext} from "./context/AuthContext.tsx";
-import AdminNavbar from "./admin/utils/AdminNavbar.tsx";
-import Admin from "./admin/Admin.tsx";
-import AdminAddCourse from "./admin/pages/AdminAddCourse.tsx";
-import CourseLearn from "./pages/CourseLearn.tsx";
-import About from "./pages/About.tsx";
-import Contact from "./pages/Contact.tsx";
-import Mentoring from "./pages/Mentoring.tsx";
-import Consulting from "./pages/Consulting.tsx";
-import Academies from "./pages/Academies.tsx";
-import Personalize from "./pages/Personalize.tsx";
-import OAuth2RedirectHandler from "./api/OAuth2RedirectHandler.tsx";
-import FooterNew from "./layout/FooterNew.tsx";
-import FooterSmall from "./layout/FooterSmall.tsx";
-import FreeConsultation from "./pages/FreeConsultation.tsx";
-import LanguageToggle from "./layout/LanguageToggle.tsx";
-
-function LayoutWrapper() {
-    const location = useLocation();
-    const hideLayout =
-        location.pathname === "/login" ||
-        location.pathname === "/register" ||
-        location.pathname === "/welcome" ||
-        location.pathname.startsWith("/learn/");
-    const showSmallFooter =
-        location.pathname === "/profile" ||
-        location.pathname === "/courses" ||
-        location.pathname === "/learn" ||
-        location.pathname === "/mentoring" ||
-        location.pathname === "/consulting" ||
-        location.pathname === "/academies" ||
-        location.pathname === "/contact" ||
-        location.pathname === "/free-consultation";
-    const {user, authChecked} = useAuthContext();
-
-    if (!authChecked)
-        return null;
-
-    if (user?.isAdmin) {
-        return (
-            <>
-                <AdminNavbar/>
-                <Routes>
-                    <Route path="/" element={<Admin/>}/>
-                    <Route path="/add-course" element={<AdminAddCourse/>}/>
-                    <Route path="/analytics" element={<p>Analytics</p>}/>
-                </Routes>
-            </>
-        )
-    }
-
-
-    return (
-        <>
-            {!hideLayout && <Navbar/>}
-            <Routes>
-                <Route path="/login" element={
-                    <PublicOnlyRoute>
-                        <Login/>
-                    </PublicOnlyRoute>
-                }/>
-                <Route path="/register" element={
-                    <PublicOnlyRoute>
-                        <Register/>
-                    </PublicOnlyRoute>
-                }/>
-                <Route path="/welcome" element={
-                    <PublicOnlyRoute>
-                        <Personalize/>
-                    </PublicOnlyRoute>
-                }/>
-
-                <Route path="/oauth2/redirect" element={<OAuth2RedirectHandler/>}/>
-
-                <Route path="/" element={<Home/>}/>
-
-                <Route path="/about" element={<About/>}/>
-
-                <Route path="/mentoring" element={
-                    <UserOnlyRoute>
-                        <Mentoring/>
-                    </UserOnlyRoute>
-                }/>
-
-                <Route path="/consulting" element={
-                    <UserOnlyRoute>
-                        <Consulting/>
-                    </UserOnlyRoute>
-                }/>
-
-                <Route path="/academies" element={
-                    <UserOnlyRoute>
-                        <Academies/>
-                    </UserOnlyRoute>
-                }/>
-
-                <Route path="/courses" element={<Courses/>}/>
-                <Route path="/courses/:courseId/:courseTitle" element={<CourseDetails/>}/>
-
-                <Route path="/contact" element={
-                    <UserOnlyRoute>
-                        <Contact/>
-                    </UserOnlyRoute>
-                }/>
-
-                <Route path="/free-consultation" element={
-                    <UserOnlyRoute>
-                        <FreeConsultation/>
-                    </UserOnlyRoute>
-                }/>
-
-                <Route path="/profile" element={
-                    <UserOnlyRoute>
-                        <Profile/>
-                    </UserOnlyRoute>
-                }/>
-
-                <Route path="/learn" element={
-                    <UserOnlyRoute>
-                        <Learn/>
-                    </UserOnlyRoute>
-                }/>
-                <Route path="/learn/:courseId/:courseTitle" element={
-                    <UserOnlyRoute>
-                        <CourseLearn/>
-                    </UserOnlyRoute>
-                }/>
-
-            </Routes>
-            {(!hideLayout) && showSmallFooter ? <FooterSmall/> : <FooterNew/>}
-        </>
-    );
-}
-
-function ScrollToTop() {
-    const {pathname} = useLocation();
-
-    useEffect(() => {
-        window.scrollTo(0, 0);
-    }, [pathname]);
-
-    return null;
-}
-
-function App() {
-
-    return (
-        <>
-            <AppLoader/>
-            <ScrollToTop/>
-            <ToastContainer
-                position="top-right"
-                autoClose={3000}
-                hideProgressBar={false}
-                newestOnTop
-                closeOnClick
-                pauseOnHover
-            />
-            <LayoutWrapper/>
-            <LanguageToggle/>
-        </>
-    );
-}
-
-export default App;
Index: ontend/src/AppLoader.tsx
===================================================================
--- frontend/src/AppLoader.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,66 +1,0 @@
-import {useAuthContext} from "./context/AuthContext.tsx";
-import {useCourseStorage} from "./context/CourseStorage.ts";
-import {
-    fetchRecommendedCoursesApi
-} from "./api/courseApi.ts";
-import {useEffect} from "react";
-import {fetchUserEnrollmentsApi} from "./api/enrollmentApi.ts";
-import {getFromSessionStorage, saveToSessionStorage} from "./utils/useSessionStorage.ts";
-
-function AppLoader() {
-    const {accessToken, authChecked} = useAuthContext();
-    const {
-        recommendedCourses,
-        setRecommendedCourses,
-        enrollments,
-        setEnrollments
-    } = useCourseStorage();
-
-    useEffect(() => {
-        if (!authChecked) return;
-
-        const load = async () => {
-            // Recommended Courses
-            try {
-                const recommendedStored = getFromSessionStorage<typeof recommendedCourses>("recommendedCourses");
-                if (recommendedStored) {
-                    setRecommendedCourses(recommendedStored);
-                } else {
-                    const recommended = await fetchRecommendedCoursesApi(accessToken || "");
-                    setRecommendedCourses(recommended);
-                }
-            } catch (err) {
-                console.error("Failed to fetch recommended courses:", err);
-            }
-
-            // Enrollments
-            try {
-                const userEnrollmentsStored = getFromSessionStorage<typeof enrollments>("enrollments");
-                if (userEnrollmentsStored) {
-                    setEnrollments(userEnrollmentsStored);
-                } else {
-                    const userEnrollments = await fetchUserEnrollmentsApi(accessToken || "");
-                    setEnrollments(userEnrollments);
-                }
-            } catch (err) {
-                console.error("Failed to fetch recommended courses:", err);
-            }
-        };
-
-
-        load();
-    }, [authChecked, accessToken]);
-
-    useEffect(() => {
-        saveToSessionStorage("recommendedCourses", recommendedCourses);
-    }, [recommendedCourses]);
-
-    useEffect(() => {
-        saveToSessionStorage("enrollments", enrollments);
-    }, [enrollments]);
-
-
-    return null
-}
-
-export default AppLoader;
Index: ontend/src/admin/Admin.tsx
===================================================================
--- frontend/src/admin/Admin.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,11 +1,0 @@
-
-function Admin() {
-
-    return (
-        <main>
-
-        </main>
-    )
-}
-
-export default Admin;
Index: ontend/src/admin/api/addCourse.ts
===================================================================
--- frontend/src/admin/api/addCourse.ts	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,32 +1,0 @@
-import axios from "axios";
-
-const backendUrl = import.meta.env.VITE_BACKEND_URL;
-
-export const createCourseApi = async (courseJsonStr: string, accessToken?: string): Promise<number> => {
-    const courseIdResponse = await axios.post(
-        `${backendUrl}/api/admin/courses/create`,
-        courseJsonStr,
-        {
-            headers: {
-                Authorization: `Bearer ${accessToken}`,
-                "Content-Type": "application/json",
-            }
-        }
-    );
-
-    return courseIdResponse.data;
-};
-
-export const uploadCourseFilesApi = async (courseId: number, formData: FormData, accessToken?: string): Promise<number> => {
-    const response = await axios.post(
-        `${backendUrl}/api/admin/courses/${courseId}/upload`,
-        formData,
-        {
-            headers: {
-                Authorization: `Bearer ${accessToken}`
-            }
-        }
-    );
-
-    return response.data;
-};
Index: ontend/src/admin/components/AdminAddCourseContent.tsx
===================================================================
--- frontend/src/admin/components/AdminAddCourseContent.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,409 +1,0 @@
-import type {Dispatch, SetStateAction} from "react";
-import AdminAddCourseInput from "./AdminAddCourseInput.tsx";
-import type {ContentType} from "../../models/types/ContentType.tsx";
-import AdminAddCourseInputSelect from "./AdminAddCourseInputSelect.tsx";
-import AdminAddCourseInputTextArea from "./AdminAddCourseInputTextArea.tsx";
-import {X, MoveUp, MoveDown, ChevronUp, ChevronDown} from "lucide-react";
-import type {CourseEntity} from "../types/CourseEntity.tsx";
-
-function AdminAddCourseContents({
-                                          course,
-                                          setCourse,
-                                          courseLectureFiles,
-                                          setCourseLectureFiles
-                                      }: {
-    course: CourseEntity;
-    setCourse: Dispatch<SetStateAction<CourseEntity>>;
-    courseLectureFiles: { file: File, type: ContentType, contentPosition: number, lecturePosition: number }[];
-    setCourseLectureFiles: Dispatch<SetStateAction<{
-        file: File,
-        type: ContentType,
-        contentPosition: number,
-        lecturePosition: number
-    }[]>>;
-}) {
-    return (
-        <div className="flex flex-col gap-4">
-            {/*COURSE CONTENT*/}
-            {
-                course.courseContents.length > 0 && course.courseContents.map((content, index) => {
-                    return (
-                        <div key={`content-${index}`}
-                             className="w-full flex flex-col gap-4"
-                        >
-                            {/*CONTENT HEADER*/}
-                            <div className="flex justify-between items-center">
-                                <h3 className="font-semibold text-black/80 text-2xl text-left">Module {index + 1}</h3>
-
-                                {/*Header Buttons*/}
-                                <div className="flex gap-2">
-                                    {index > 0 && (
-                                        <button
-                                            onClick={() => {
-                                                const updated = [...course.courseContents];
-                                                [updated[index - 1], updated[index]] = [updated[index], updated[index - 1]];
-                                                updated[index - 1] = {...updated[index - 1], position: index};
-                                                updated[index] = {...updated[index], position: index + 1};
-                                                setCourse({
-                                                    ...course,
-                                                    courseContents: updated
-                                                });
-                                            }}
-                                            className="hover:bg-gray/60 transition-all duration-300 ease-out cursor-pointer
-                                            rounded-sm"
-                                        >
-                                            <MoveUp size={28} opacity={0.6}/>
-                                        </button>
-                                    )}
-                                    {index < course.courseContents.length - 1 && (
-                                        <button
-                                            onClick={() => {
-                                                const updated = [...course.courseContents];
-                                                [updated[index], updated[index + 1]] = [updated[index + 1], updated[index]];
-                                                updated[index] = {...updated[index], position: index + 1};
-                                                updated[index + 1] = {...updated[index + 1], position: index + 2};
-                                                setCourse({
-                                                    ...course,
-                                                    courseContents: updated
-                                                });
-                                            }}
-                                            className="hover:bg-gray/60 transition-all duration-300 ease-out cursor-pointer
-                                            rounded-sm"
-                                        >
-                                            <MoveDown size={28} opacity={0.6}/>
-                                        </button>
-                                    )}
-                                    <button
-                                        className="hover:bg-gray/60 hover:text-black rounded-sm px-4 py-2 cursor-pointer text-black/80"
-                                        onClick={() => setCourse({
-                                            ...course,
-                                            courseContents: course.courseContents
-                                                .filter((_, i) => i !== index)
-                                                .map((item, i) => ({...item, position: i + 1}))
-                                        })}
-                                    >
-                                        Delete Module
-                                    </button>
-                                </div>
-                            </div>
-
-                            <AdminAddCourseInput
-                                label={"Title"}
-                                value={content.title}
-                                onChange={e => setCourse({
-                                    ...course,
-                                    courseContents: course.courseContents.map((item, i) => i === index ? {
-                                        ...item,
-                                        title: e.target.value
-                                    } : item)
-                                })}
-                                type={"text"}
-                                width={"full"}
-                            />
-
-                            {/*LECTURES*/}
-                            <div
-                                className={`relative grid grid-cols-6 grid-rows-[${content.courseLectures.length}] gap-y-12`}>
-                                <div
-                                    className="col-span-1 flex flex-col gap-12 overflow-clip"
-                                    style={{
-                                        gridRow: `span ${content.courseLectures.length} / span ${content.courseLectures.length}`
-                                    }}
-                                >
-                                    {
-                                        content.courseLectures.length > 0 && content.courseLectures.map((_, lectureIndex) => (
-                                            <div key={`content-${index}-lectureDot-${lectureIndex}`}
-                                                 className="relative h-full flex justify-center items-start"
-                                            >
-                                                <div
-                                                    className="w-8 aspect-square bg-gray rounded-full z-10"/>
-                                                {
-                                                    lectureIndex === content.courseLectures.length - 1 ? (
-                                                        <div
-                                                            className="absolute w-1 h-50/10 bg-white z-1 rounded-full"/>
-                                                    ) : (
-                                                        <div
-                                                            className="absolute w-1 h-50/10 bg-gray rounded-full"/>
-                                                    )
-                                                }
-                                            </div>
-                                        ))
-                                    }
-                                </div>
-                                {
-                                    content.courseLectures.length > 0 && content.courseLectures.map((lecture, lectureIndex) => {
-                                        return (
-                                            <div key={`content-${index}-lecture-${lectureIndex}`}
-                                                 className="col-span-5 col-start-2 row-span-1 flex flex-col gap-4">
-                                                {/*LECTURE HEADER*/}
-                                                <div className="flex justify-between items-center">
-                                                    <h3 className="font-semibold text-black/80 text-2xl text-left">Lecture {lectureIndex + 1}</h3>
-
-                                                    {/*Header Buttons*/}
-                                                    <div className="flex gap-2">
-                                                        {lectureIndex > 0 && (
-                                                            <button
-                                                                onClick={() => {
-                                                                    const updatedContent = [...course.courseContents];
-                                                                    const lectures = [...updatedContent[index].courseLectures];
-                                                                    [lectures[lectureIndex - 1], lectures[lectureIndex]] = [lectures[lectureIndex], lectures[lectureIndex - 1]];
-                                                                    lectures[lectureIndex - 1] = {
-                                                                        ...lectures[lectureIndex - 1],
-                                                                        position: lectureIndex
-                                                                    };
-                                                                    lectures[lectureIndex] = {
-                                                                        ...lectures[lectureIndex],
-                                                                        position: lectureIndex + 1
-                                                                    };
-                                                                    updatedContent[index].courseLectures = lectures;
-                                                                    setCourse({
-                                                                        ...course,
-                                                                        courseContents: updatedContent
-                                                                    });
-                                                                }}
-                                                                className="hover:bg-gray/60 transition-all duration-300 ease-out cursor-pointer
-                                                                rounded-sm px-1"
-                                                            >
-                                                                <ChevronUp size={28} opacity={0.6}/>
-                                                            </button>
-                                                        )}
-                                                        {lectureIndex < content.courseLectures.length - 1 && (
-                                                            <button
-                                                                onClick={() => {
-                                                                    const updatedContent = [...course.courseContents];
-                                                                    const lectures = [...updatedContent[index].courseLectures];
-                                                                    [lectures[lectureIndex], lectures[lectureIndex + 1]] = [lectures[lectureIndex + 1], lectures[lectureIndex]];
-                                                                    lectures[lectureIndex] = {
-                                                                        ...lectures[lectureIndex],
-                                                                        position: lectureIndex + 1
-                                                                    };
-                                                                    lectures[lectureIndex + 1] = {
-                                                                        ...lectures[lectureIndex + 1],
-                                                                        position: lectureIndex + 2
-                                                                    };
-                                                                    updatedContent[index].courseLectures = lectures;
-                                                                    setCourse({
-                                                                        ...course,
-                                                                        courseContents: updatedContent
-                                                                    });
-                                                                }}
-                                                                className="hover:bg-gray/60 transition-all duration-300 ease-out cursor-pointer
-                                                                rounded-sm px-1"
-                                                            >
-                                                                <ChevronDown size={28} opacity={0.6}/>
-                                                            </button>
-                                                        )}
-                                                        <button
-                                                            className="hover:bg-gray/60 rounded-sm px-2 py-1 cursor-pointer"
-                                                            onClick={() => setCourse({
-                                                                ...course,
-                                                                courseContents: course.courseContents.map((item, i) => {
-                                                                    if (i === index) {
-                                                                        const updatedLectures = item.courseLectures
-                                                                            .filter((_, li) => li !== lectureIndex)
-                                                                            .map((lecture, li) => ({
-                                                                                ...lecture,
-                                                                                position: li + 1
-                                                                            }));
-                                                                        return {
-                                                                            ...item,
-                                                                            courseLectures: updatedLectures
-                                                                        };
-                                                                    }
-                                                                    return item;
-                                                                })
-                                                            })}
-                                                        ><X size={28} opacity={0.6}/></button>
-                                                    </div>
-                                                </div>
-
-                                                <div className="flex gap-20 justify-between w-full">
-                                                    <AdminAddCourseInput
-                                                        label={`Title`}
-                                                        value={lecture.title}
-                                                        onChange={e => setCourse({
-                                                            ...course,
-                                                            courseContents: course.courseContents.map((item, i) => {
-                                                                if (i === index) {
-                                                                    const updatedLectures = item.courseLectures.map((l, li) => li === lectureIndex ? {
-                                                                        ...l,
-                                                                        title: e.target.value
-                                                                    } : l);
-                                                                    return {...item, courseLectures: updatedLectures};
-                                                                }
-                                                                return item;
-                                                            })
-                                                        })}
-                                                        type={"text"}
-                                                        width={"full"}
-                                                    />
-                                                    <AdminAddCourseInput
-                                                        label={`Duration (in minutes)`}
-                                                        value={lecture.durationMinutes}
-                                                        onChange={e => setCourse({
-                                                            ...course,
-                                                            courseContents: course.courseContents.map((item, i) => {
-                                                                if (i === index) {
-                                                                    const updatedLectures = item.courseLectures.map((l, li) => li === lectureIndex ? {
-                                                                        ...l,
-                                                                        durationMinutes: Number(e.target.value)
-                                                                    } : l);
-                                                                    return {...item, courseLectures: updatedLectures};
-                                                                }
-                                                                return item;
-                                                            })
-                                                        })}
-                                                        type={"number"}
-                                                        width={"fit"}
-                                                    />
-                                                    <AdminAddCourseInputSelect
-                                                        label={"Content Type"}
-                                                        onChange={e => setCourse({
-                                                            ...course,
-                                                            courseContents: course.courseContents.map((item, i) => {
-                                                                if (i === index) {
-                                                                    const updatedLectures = item.courseLectures.map((l, li) => li === lectureIndex ? {
-                                                                        ...l,
-                                                                        contentType: e.target.value as ContentType
-                                                                    } : l);
-                                                                    return {...item, courseLectures: updatedLectures};
-                                                                }
-                                                                return item;
-                                                            })
-                                                        })}
-                                                        options={[
-                                                            {value: "TEXT", name: "Text"},
-                                                            {value: "FILE", name: "File"},
-                                                            {value: "VIDEO", name: "Video"},
-                                                            {value: "QUIZ", name: "Quiz"},
-                                                            {value: "TOOL", name: "Tool"}
-                                                        ]}
-                                                    />
-                                                </div>
-                                                <AdminAddCourseInputTextArea
-                                                    label={`Description (2-3 sentences)`}
-                                                    rows={3}
-                                                    value={lecture.description}
-                                                    name={`description-${index}-${lectureIndex}`}
-                                                    placeholder={"Enter the description for the lecture here..."}
-                                                    onChange={e => setCourse({
-                                                        ...course,
-                                                        courseContents: course.courseContents.map((item, i) => {
-                                                            if (i === index) {
-                                                                const updatedLectures = item.courseLectures.map((l, li) => li === lectureIndex ? {
-                                                                    ...l,
-                                                                    description: e.target.value
-                                                                } : l);
-                                                                return {...item, courseLectures: updatedLectures};
-                                                            }
-                                                            return item;
-                                                        })
-                                                    })}/>
-                                                <AdminAddCourseInputTextArea
-                                                    label={`Content Text`}
-                                                    rows={6}
-                                                    value={lecture.contentText}
-                                                    name={`contentText-${index}-${lectureIndex}`}
-                                                    placeholder={"Enter the content text here..."}
-                                                    onChange={e => setCourse({
-                                                        ...course,
-                                                        courseContents: course.courseContents.map((item, i) => {
-                                                            if (i === index) {
-                                                                const updatedLectures = item.courseLectures.map((l, li) => li === lectureIndex ? {
-                                                                    ...l,
-                                                                    contentText: e.target.value
-                                                                } : l);
-                                                                return {...item, courseLectures: updatedLectures};
-                                                            }
-                                                            return item;
-                                                        })
-                                                    })}/>
-                                                {
-                                                    lecture.contentType !== "TEXT" && (
-                                                        <AdminAddCourseInput
-                                                            label={`Content ${lecture.contentType.charAt(0) + lecture.contentType.slice(1).toLowerCase()}`}
-                                                            onChange={e => {
-                                                                const file = e.target.files && e.target.files[0];
-                                                                if (!file) return;
-
-                                                                setCourseLectureFiles([
-                                                                    ...courseLectureFiles.filter(item => item.lecturePosition !== lecture.position || item.contentPosition !== content.position),
-                                                                    {
-                                                                        file,
-                                                                        type: lecture.contentType,
-                                                                        contentPosition: content.position,
-                                                                        lecturePosition: lecture.position
-                                                                    }
-                                                                ]);
-                                                            }}
-                                                            type={"file"}
-                                                            width={"full"}
-                                                        />
-                                                    )
-                                                }
-                                            </div>
-                                        )
-                                    })
-                                }
-                            </div>
-
-                            <button
-                                onClick={() =>
-                                    setCourse({
-                                        ...course,
-                                        courseContents: course.courseContents.map((item, i) => i === index ? {
-                                            ...item,
-                                            courseLectures: [
-                                                ...item.courseLectures,
-                                                {
-                                                    title: "",
-                                                    position: item.courseLectures.length + 1,
-                                                    contentText: "",
-                                                    contentFileName: "",
-                                                    contentType: "TEXT",
-                                                    description: "",
-                                                    durationMinutes: 0
-                                                }
-                                            ]
-                                        } : item)
-                                    })}
-                                className="hover:bg-shifter/20 transition-all ease-out duration-300
-                                px-12 py-2 rounded-sm text-shifter text-xl font-bold underline w-full cursor-pointer"
-                            >
-                                Add New Course Lecture
-                            </button>
-
-                            {
-                                index !== course.courseContents.length - 1 && (
-                                    <hr className="border-t-4 w-full border-black/20 rounded-full my-4"/>
-                                )
-                            }
-                        </div>
-                    )
-                })
-            }
-
-            <button
-                onClick={() =>
-                    setCourse({
-                        ...course,
-                        courseContents: [
-                            ...course.courseContents,
-                            {
-                                title: "",
-                                position: course.courseContents.length + 1,
-                                courseLectures: []
-                            }
-                        ]
-                    })
-                }
-                className="hover:bg-shifter/20 transition-all ease-out duration-300
-                px-12 py-2 rounded-sm text-shifter text-xl font-bold underline w-full cursor-pointer "
-            >
-                Add New Course Content
-            </button>
-        </div>
-    );
-}
-
-export default AdminAddCourseContents;
Index: ontend/src/admin/components/AdminAddCourseInfo.tsx
===================================================================
--- frontend/src/admin/components/AdminAddCourseInfo.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,199 +1,0 @@
-import AdminAddCourseInput from "./AdminAddCourseInput.tsx";
-import type {Difficulty} from "../../models/types/Difficulty.tsx";
-import AdminAddCourseInputWithPills from "./AdminAddCourseInputWithPills.tsx";
-import AdminAddCourseInputTextArea from "./AdminAddCourseInputTextArea.tsx";
-import type {CourseEntity} from "../types/CourseEntity.tsx";
-import AdminAddCourseInputSelect from "./AdminAddCourseInputSelect.tsx";
-import type {JSX} from "react";
-
-function AdminAddCourseInfo({course, setCourse, courseCard, setCourseImage}: {
-    course: CourseEntity;
-    setCourse: (course: CourseEntity) => void;
-    courseCard: JSX.Element;
-    setCourseImage: (image: File | null) => void;
-}) {
-
-    return (
-        <section className="flex flex-col gap-2">
-            <div className="grid grid-cols-3 gap-x-12">
-                {/*Course Card*/}
-                <div className="col-span-1 h-full flex items-center justify-center">
-                    {courseCard}
-                </div>
-
-                {/*Course Info*/}
-                <div className="flex flex-col gap-4 justify-center col-span-2 w-full">
-
-                    <AdminAddCourseInput
-                        label={"Course Image"}
-                        onChange={e => {
-                            // const file = e.target.files?.[0];
-                            // if (!file) return;
-                            const file = e.target.files ? e.target.files[0] : null;
-                            setCourseImage(file);
-                        }}
-                        type={"file"}
-                        width={"full"}
-                    />
-
-                    <AdminAddCourseInput
-                        label={"Short Title"}
-                        value={course.titleShort}
-                        onChange={e => setCourse({
-                            ...course,
-                            titleShort: e.target.value
-                        })}
-                        type={"text"}
-                        width={"full"}
-                    />
-
-                    <AdminAddCourseInput
-                        label={"Long Title"}
-                        value={course.title}
-                        onChange={e => setCourse({
-                            ...course,
-                            title: e.target.value
-                        })}
-                        type={"text"}
-                        width={"full"}
-                    />
-
-                    <AdminAddCourseInputWithPills
-                        label="Topics Covered"
-                        name="topicsCovered"
-                        options={course.topicsCovered}
-                        addPill={option => setCourse({
-                            ...course,
-                            topicsCovered: course.topicsCovered.includes(option) ? course.topicsCovered : [...course.topicsCovered, option]
-                        })}
-                        removePill={index => setCourse({
-                            ...course,
-                            topicsCovered: course.topicsCovered.filter((_, i) => i !== index)
-                        })}
-                        width={"full"}
-                    />
-
-                    <div className="flex justify-between w-full">
-                        <AdminAddCourseInput
-                            label={"Duration (in minutes)"}
-                            value={course.durationMinutes}
-                            onChange={e => setCourse({
-                                ...course,
-                                durationMinutes: Number(e.target.value)
-                            })}
-                            type={"number"}
-                            width={"fit"}
-                        />
-                        <AdminAddCourseInput
-                            label={"Price (in euros)"}
-                            value={course.price}
-                            onChange={e => setCourse({
-                                ...course,
-                                price: Number(e.target.value)
-                            })}
-                            type={"number"}
-                            width={"fit"}
-                        />
-                        <AdminAddCourseInputSelect
-                            label={"Difficulty"}
-                            onChange={e => setCourse({
-                                ...course,
-                                difficulty: e.target.value as Difficulty
-                            })}
-                            options={[
-                                {value: "BEGINNER", name: "Beginner"},
-                                {value: "INTERMEDIATE", name: "Intermediate"},
-                                {value: "ADVANCED", name: "Advanced"},
-                                {value: "EXPERT", name: "Expert"}
-                            ]}
-                        />
-                    </div>
-
-                    <div className="flex gap-4 w-fit items-end">
-                        <AdminAddCourseInput
-                            label={"Color (in hex)"}
-                            value={course.color}
-                            onChange={e => setCourse({
-                                ...course,
-                                color: e.target.value
-                            })}
-                            type={"text"}
-                            width={"fit"}
-                        />
-                        <div
-                            style={{backgroundColor: course.color}}
-                            className="ml-auto h-2/3 aspect-square rounded-sm"
-                        />
-                    </div>
-
-                    <AdminAddCourseInputWithPills
-                        label="Skills Gained"
-                        name="skillsGained"
-                        options={course.skillsGained}
-                        addPill={option => setCourse({
-                            ...course,
-                            skillsGained: course.skillsGained.includes(option) ? course.skillsGained : [...course.skillsGained, option]
-                        })}
-                        removePill={index => setCourse({
-                            ...course,
-                            skillsGained: course.skillsGained.filter((_, i) => i !== index)
-                        })}
-                        width={"full"}
-                    />
-                </div>
-            </div>
-
-            <div className="flex flex-col gap-6">
-                <AdminAddCourseInputWithPills
-                    label="What will be learned (1-2 sentences)"
-                    name="whatWillBeLearned"
-                    options={course.whatWillBeLearned}
-                    addPill={option => setCourse({
-                        ...course,
-                        whatWillBeLearned: course.whatWillBeLearned.includes(option) ? course.whatWillBeLearned : [...course.whatWillBeLearned, option]
-                    })}
-                    removePill={index => setCourse({
-                        ...course,
-                        whatWillBeLearned: course.whatWillBeLearned.filter((_, i) => i !== index)
-                    })}
-                    width={"full"}
-                />
-                <AdminAddCourseInputTextArea
-                    label={"Description Short (1-2 sentences)"}
-                    name={"descriptionShort"}
-                    value={course.descriptionShort}
-                    placeholder={"Enter a short description of the course"}
-                    rows={1}
-                    onChange={e => setCourse({
-                        ...course,
-                        descriptionShort: e.target.value
-                    })}
-                />
-                <AdminAddCourseInputTextArea
-                    label={"Description Medium (2-3 sentences)"}
-                    name={"description"}
-                    value={course.description}
-                    placeholder={"Enter a description of the course"}
-                    rows={3}
-                    onChange={e => setCourse({
-                        ...course,
-                        description: e.target.value
-                    })}
-                />
-                <AdminAddCourseInputTextArea
-                    label={"Description Long"}
-                    name={"descriptionLong"}
-                    value={course.descriptionLong}
-                    placeholder={"Enter a detailed description of the course"}
-                    rows={6}
-                    onChange={e => setCourse({
-                        ...course,
-                        descriptionLong: e.target.value
-                    })}
-                />
-            </div>
-        </section>
-    )
-}
-
-export default AdminAddCourseInfo;
Index: ontend/src/admin/components/AdminAddCourseInput.tsx
===================================================================
--- frontend/src/admin/components/AdminAddCourseInput.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,32 +1,0 @@
-import React from "react";
-
-function Input({label, name, value, type, onChange, width}: {
-    label: string;
-    name?: string;
-    value?: string | number;
-    type: "text" | "number" | "file";
-    onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;
-    width: "fit" | "full"
-}) {
-    return (
-        <div className={`flex flex-col gap-1 items-start ${width === "full" ? "w-full" : "w-fit"}`}>
-            <label className="text-md font-medium text-black/60 whitespace-nowrap">{label}</label>
-            <input
-                type={type}
-                value={type !== "file" ? value : undefined}
-                name={name}
-                onChange={onChange}
-                className={`border-2 border-transparent focus:outline-none focus:border-black/40
-                text-lg px-2 py-2 bg-[#FFF] w-full rounded-sm shadow-sm shadow-black/10
-                file:mr-4 file:py-2 file:px-4
-                file:rounded-sm file:border-0
-                file:text-sm file:font-semibold
-                file:bg-black/10 file:text-black/70
-                hover:file:bg-black/20
-                ${type === "file" ? "cursor-pointer" : ""}`}
-            />
-        </div>
-    )
-}
-
-export default Input;
Index: ontend/src/admin/components/AdminAddCourseInputSelect.tsx
===================================================================
--- frontend/src/admin/components/AdminAddCourseInputSelect.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,29 +1,0 @@
-import React from "react";
-
-function AdminAddCourseInputSelect({label, value, options, onChange}: {
-    label: string;
-    value?: string | number;
-    options: {value: string, name: string}[];
-    onChange?: (e: React.ChangeEvent<HTMLSelectElement>) => void;
-}) {
-    return (
-        <div className="flex flex-col gap-1 items-start">
-            <label
-                className="text-md font-medium text-black/60 whitespace-nowrap">{label}</label>
-            <select
-                value={value}
-                onChange={onChange}
-                className="border-2 border-transparent focus:outline-none focus:border-black/40
-                                                    text-lg px-2 py-2 bg-[#FFF] rounded-sm shadow-sm shadow-black/10"
-            >
-                {
-                    options.map((o, index) => (
-                        <option value={o.value} key={index}>{o.name}</option>
-                    ))
-                }
-            </select>
-        </div>
-    )
-}
-
-export default AdminAddCourseInputSelect;
Index: ontend/src/admin/components/AdminAddCourseInputTextArea.tsx
===================================================================
--- frontend/src/admin/components/AdminAddCourseInputTextArea.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,28 +1,0 @@
-import React from "react";
-
-function InputTextArea({label, name, value, placeholder, rows, onChange}: {
-    label: string;
-    name: string;
-    value: string;
-    placeholder: string;
-    rows: number;
-    onChange: (e: React.ChangeEvent<HTMLTextAreaElement>) => void;
-}) {
-    return (
-        <div className="flex flex-col gap-1 items-start">
-            <label className="text-md font-medium text-black/60">{label}</label>
-            <textarea
-                name={name}
-                value={value}
-                rows={rows}
-                placeholder={placeholder}
-                onChange={onChange}
-                className="resize-none overflow-hidden min-h-fit
-                border-2 border-transparent focus:outline-none focus:border-black/40
-                text-lg px-2 py-2 bg-[#FFF] w-full rounded-sm shadow-sm shadow-black/10 overflow-y-auto scrollable-show"
-            />
-        </div>
-    )
-}
-
-export default InputTextArea;
Index: ontend/src/admin/components/AdminAddCourseInputWithPills.tsx
===================================================================
--- frontend/src/admin/components/AdminAddCourseInputWithPills.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,58 +1,0 @@
-import {X} from "lucide-react";
-import AdminAddCourseInput from "./AdminAddCourseInput.tsx";
-
-function InputWithPills({label, name, options, addPill, removePill, width}: {
-    name: string;
-    label: string;
-    options: string[];
-    addPill: (option: string) => void;
-    removePill: (index: number) => void;
-    width: "full" | "fit";
-}) {
-    return (
-        <div className="flex flex-col gap-4 ">
-            <form
-                onSubmit={e => {
-                    e.preventDefault()
-                    const form = e.target as HTMLFormElement;
-                    const input = form.elements.namedItem(name) as HTMLInputElement;
-                    const option = input.value.trim();
-                    addPill(option)
-                    form.reset()
-                }}
-                className="flex gap-8 items-end w-full">
-                <AdminAddCourseInput
-                    type={"text"}
-                    label={label}
-                    name={name}
-                    width={width}
-                />
-                <button
-                    type="submit"
-                    className="hover:shadow-lg shadow-md shadow-shifter/40 transition-all ease-out duration-300
-                                border-2 border-white/40 px-12 py-2 bg-shifter rounded-sm text-white text-lg w-fit cursor-pointer "
-                >
-                    Add
-                </button>
-            </form>
-
-            <div className="flex flex-wrap gap-2 items-center justify-start">
-                {
-                    options.length > 0 && options.map((option, index) => (
-                        <button
-                            onClick={() => removePill(index)}
-                            className="hover:opacity-60 transition-all ease-out duration-300 cursor-pointer
-                                        flex items-center gap-2 px-4 py-2 rounded-md bg-black/40 text-white shadow-sm"
-                            key={index}
-                        >
-                            <span>{option}</span>
-                            <X size={20}/>
-                        </button>
-                    ))
-                }
-            </div>
-        </div>
-    )
-}
-
-export default InputWithPills;
Index: ontend/src/admin/pages/AdminAddCourse.tsx
===================================================================
--- frontend/src/admin/pages/AdminAddCourse.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,146 +1,0 @@
-import {useState} from "react";
-import type {CourseEntity} from "../types/CourseEntity.tsx";
-import CourseCard from "../../components/CourseCard.tsx";
-import {createCourseApi, uploadCourseFilesApi} from "../api/addCourse.ts";
-import {useAuthContext} from "../../context/AuthContext.tsx";
-import type {ContentType} from "../../models/types/ContentType.tsx";
-import AdminAddCourseInfo from "../components/AdminAddCourseInfo.tsx";
-import AdminAddCourseContent from "../components/AdminAddCourseContent.tsx";
-import {useNavigate} from "react-router-dom";
-
-function AdminAddCourse() {
-    const [course, setCourse] = useState<CourseEntity>({
-        imageUrl: "",
-        color: "#000000",
-        titleShort: "",
-        title: "",
-        difficulty: "BEGINNER",
-        durationMinutes: 0,
-        price: 0,
-        descriptionShort: "",
-        description: "",
-        descriptionLong: "",
-        whatWillBeLearned: [],
-        skillsGained: [],
-        topicsCovered: [],
-        courseContents: []
-    })
-    const [courseImage, setCourseImage] = useState<File | null>(null);
-    const [courseLectureFiles, setCourseLectureFiles] = useState<{file: File, type: ContentType, contentPosition: number, lecturePosition: number}[]>([]);
-    const [error, setError] = useState<string | null>(null);
-    const [loading, setLoading] = useState<boolean>(false);
-    const {accessToken} = useAuthContext();
-    const navigate = useNavigate();
-
-    const courseCard = (
-        <CourseCard card={{
-            id: 0, // temporary since new javaObjects has no ID yet
-            imageUrl: courseImage ? URL.createObjectURL(courseImage) : "",
-            color: course.color,
-            titleShort: course.titleShort,
-            title: course.title,
-            difficulty: course.difficulty,
-            durationMinutes: course.durationMinutes,
-            price: course.price,
-            rating: 0,
-            ratingCount: 0,
-            skillsGained: course.skillsGained,
-            topicsCovered: course.topicsCovered,
-            courseContentCount: course.courseContents.length
-        }}/>
-    )
-
-    const handleAddCourse = async () => {
-        const countFileOrVideoLectures = course.courseContents
-            .flatMap(content => content.courseLectures)
-            .filter(lecture => lecture.contentType === "FILE" || lecture.contentType === "VIDEO" || lecture.contentType === "QUIZ" || lecture.contentType === "TOOL")
-            .length;
-
-        if (!courseImage) {
-            setError("Please upload a course image");
-            return;
-        }
-        if (!course.titleShort || !course.title || !course.difficulty ||
-            !course.descriptionShort || !course.description || !course.descriptionLong ||
-            course.whatWillBeLearned.length === 0 || course.skillsGained.length === 0 || course.topicsCovered.length === 0) {
-            setError("Please fill in all course details");
-            return;
-        }
-        if (
-            course.courseContents.length === 0 || course.courseContents.some(content => content.title.length === 0) ||
-            course.courseContents.some(content => content.courseLectures.length === 0) || courseLectureFiles.length < countFileOrVideoLectures
-        ) {
-            setError("Please add at least one content with lectures and upload files for all file/video/quiz/tool lectures");
-            return;
-        }
-
-        const formData = new FormData();
-        formData.append("courseImage", courseImage);
-        courseLectureFiles.forEach(courseLectureFile => {
-            formData.append("files", courseLectureFile.file);
-            formData.append("types", courseLectureFile.type);
-            formData.append("meta", JSON.stringify({
-                contentPosition: courseLectureFile.contentPosition,
-                lecturePosition: courseLectureFile.lecturePosition
-            }));
-        });
-
-        console.log(JSON.stringify(course).length);
-        setLoading(true);
-        setError(null);
-
-        try {
-            const courseId = await createCourseApi(JSON.stringify(course), accessToken || "");
-            if (!courseId) {
-                throw new Error("Failed to create javaObjects.");
-            }
-
-            try {
-                await uploadCourseFilesApi(courseId, formData, accessToken || "");
-                navigate('/')
-            } catch (err) {
-                console.error("Error uploading javaObjects image and lecture files:", err);
-                setError("An error occurred while uploading javaObjects image and lecture files. Please try again or contact support.");
-            }
-        } catch (err) {
-            console.error("Error creating javaObjects:", err);
-            setError("An error occurred while creating the javaObjects. Please try again or contact support.");
-        } finally {
-            setLoading(false);
-        }
-    };
-
-    return (
-        <main className="flex flex-col gap-12 px-horizontal-md py-vertical-md">
-            <AdminAddCourseInfo
-                course={course}
-                setCourse={setCourse}
-                courseCard={courseCard}
-                setCourseImage={setCourseImage}
-            />
-            <AdminAddCourseContent
-                course={course}
-                setCourse={setCourse}
-                courseLectureFiles={courseLectureFiles}
-                setCourseLectureFiles={setCourseLectureFiles}
-            />
-            {
-                error &&
-                <p className="text-lg text-red-500 text-center">
-                    {error}
-                </p>
-            }
-            <button
-                onClick={handleAddCourse}
-                disabled={loading}
-                className={`hover:shadow-lg transition-all duration-400 ease-in-out
-                w-full py-2 border-2 border-white/40 bg-shifter rounded-sm text-white font-medium text-2xl shadow-md shadow-shifter/40 
-                disabled:opacity-60 disabled:cursor-not-allowed cursor-pointer`}
-            >
-                {loading ? "Creating..." : "Create Course"}
-            </button>
-        </main>
-    )
-}
-
-export default AdminAddCourse;
Index: ontend/src/admin/types/CourseContentEntity.tsx
===================================================================
--- frontend/src/admin/types/CourseContentEntity.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,7 +1,0 @@
-import type {CourseLectureEntity} from "./CourseLectureEntity.tsx";
-
-export interface CourseContentEntity {
-    title: string;
-    position: number;
-    courseLectures: CourseLectureEntity[];
-}
Index: ontend/src/admin/types/CourseEntity.tsx
===================================================================
--- frontend/src/admin/types/CourseEntity.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,19 +1,0 @@
-import type {Difficulty} from "../../models/types/Difficulty.tsx";
-import type {CourseContentEntity} from "./CourseContentEntity.tsx";
-
-export interface CourseEntity {
-    imageUrl: string;
-    color: string;
-    titleShort: string;
-    title: string;
-    difficulty: Difficulty;
-    durationMinutes: number;
-    price: number;
-    descriptionShort: string;
-    description: string;
-    descriptionLong: string;
-    whatWillBeLearned: string[];
-    skillsGained: string[];
-    topicsCovered: string[];
-    courseContents: CourseContentEntity[];
-}
Index: ontend/src/admin/types/CourseLectureEntity.tsx
===================================================================
--- frontend/src/admin/types/CourseLectureEntity.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,11 +1,0 @@
-import type {ContentType} from "../../models/types/ContentType.tsx";
-
-export interface CourseLectureEntity {
-    title: string;
-    description: string;
-    durationMinutes: number;
-    position: number;
-    contentText: string;
-    contentFileName: string;
-    contentType: ContentType;
-}
Index: ontend/src/admin/types/UploadedFileResponse.ts
===================================================================
--- frontend/src/admin/types/UploadedFileResponse.ts	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,5 +1,0 @@
-export interface UploadedFileResponse {
-    type: string;
-    url: string;
-    meta: Record<string, never>;
-}
Index: ontend/src/admin/utils/AdminNavbar.tsx
===================================================================
--- frontend/src/admin/utils/AdminNavbar.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,42 +1,0 @@
-import {Link} from "react-router-dom";
-import logo from "../../../public/Shifter-S2W-Transparent.png"
-import NavbarLink from "../../components/NavbarLink.tsx";
-import {useAuthContext} from "../../context/AuthContext.tsx";
-
-function AdminNavbar() {
-    const {logout} = useAuthContext();
-
-    return (
-        <nav className="flex items-center justify-between px-horizontal-sm py-2 z-10 shadow-md shadow-black/10">
-            <Link to="/">
-                <img
-                    src={logo} alt="Shifter Logo"
-                    className="h-16 w-auto"
-                />
-            </Link>
-
-            <div className="flex items-center gap-20">
-                <ul className="flex gap-8 items-center text-lg font-medium">
-                    <li><NavbarLink
-                        to="/add-course"
-                        label="Add Course"
-                    /></li>
-                    <li><NavbarLink
-                        to="/analytics"
-                        label="Analytics"
-                    /></li>
-                </ul>
-
-                <button
-                    onClick={logout}
-                    className="hover:bg-[#F00]/60 px-8 py-2 rounded-sm hover:text-white transition-all duration-300 ease-in-out
-                    text-[#F00] text-lg font-medium cursor-pointer"
-                >
-                    Log Out
-                </button>
-            </div>
-        </nav>
-    )
-}
-
-export default AdminNavbar;
Index: ontend/src/api/OAuth2RedirectHandler.tsx
===================================================================
--- frontend/src/api/OAuth2RedirectHandler.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,36 +1,0 @@
-import { useEffect } from "react";
-import { useNavigate, useLocation } from "react-router-dom";
-import { useAuthContext } from "../context/AuthContext.tsx";
-import {oAuthLoginApi} from "./authApi.ts";
-
-export default function OAuth2RedirectHandler() {
-    const navigate = useNavigate();
-    const { setAccessToken, setUser, setAuthChecked } = useAuthContext();
-    const location = useLocation();
-
-    useEffect(() => {
-        const params = new URLSearchParams(location.search);
-        const token = params.get("token");
-        const login = params.get("login") === "true";
-
-        if (token) {
-            if (login) {
-                oAuthLoginApi(token)
-                    .then(data => {
-                        setAuthChecked(true);
-                        setUser(data.user);
-                        setAccessToken(data.accessToken);
-                        navigate("/", { replace: true }); // Using replace to avoid adding to history
-                    })
-                    .catch(err => console.log("Cannot fetch user: ", err));
-            } else {
-                navigate(`/welcome?token=${token}`, { replace: true });
-            }
-        } else {
-            console.error("OAuth2 login failed: No token received.");
-            navigate("/login?error", { replace: true });
-        }
-    }, [navigate, setAccessToken]);
-
-    return <div className="h-screen"></div>;
-}
Index: ontend/src/api/authApi.ts
===================================================================
--- frontend/src/api/authApi.ts	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,79 +1,0 @@
-import axios from "axios";
-import type {UserPersonalization} from "../models/javaObjects/UserPersonalization.tsx";
-import type {User} from "../models/javaObjects/User.tsx";
-
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-expect-error
-const backendUrl = import.meta.env.VITE_BACKEND_URL;
-
-export const refreshAccessTokenApi = async (): Promise<{ user: User, accessToken: string }> => {
-    const res = await axios.post(`${backendUrl}/api/auth/refresh`,
-        {},
-        {withCredentials: true}
-    );
-
-    return res.data;
-}
-
-export const registerApi = async (email: string, password: string): Promise<void> => {
-    await axios.post(`${backendUrl}/api/auth/register`,
-        {email, password},
-        {withCredentials: true}
-    );
-}
-
-export const verifyApi = async (token: string): Promise<string> => {
-    const res = await axios.post(`${backendUrl}/api/auth/verify`,
-        {token},
-        {withCredentials: true}
-    );
-
-    return res.data;
-}
-
-export const personalizeApi = async (user: UserPersonalization): Promise<{ user: User, accessToken: string }> => {
-    const res = await axios.post(`${backendUrl}/api/auth/personalize`,
-        user,
-        {withCredentials: true}
-    );
-
-    return res.data;
-}
-
-export const oAuthLoginApi = async (accessToken: string): Promise<{ user: User, accessToken: string }> => {
-    const res = await axios.get(`${backendUrl}/api/auth/oauth/finalize`, {
-            withCredentials: true,
-            headers: {
-                Authorization: `Bearer ${accessToken}`
-            },
-        }
-    );
-
-    return res.data;
-}
-
-export const loginApi = async (email: string, password: string): Promise<{ user: User, accessToken: string }> => {
-    const res = await axios.post(`${backendUrl}/api/auth/authenticate`,
-        {email, password},
-        {withCredentials: true}
-    );
-
-    return res.data;
-}
-
-export const logoutApi = async (): Promise<void> => {
-    await axios.post(`${backendUrl}/api/auth/logout`,
-        {},
-        {withCredentials: true}
-    );
-}
-
-export const checkEmailExistsApi = async (email: string): Promise<boolean> => {
-    const res = await axios.get(`${backendUrl}/api/auth/check-email`, {
-        params: {
-            email: email,
-        },
-    });
-
-    return res.data;
-}
Index: ontend/src/api/axiosInstance.tsx
===================================================================
--- frontend/src/api/axiosInstance.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,67 +1,0 @@
-import axios, { AxiosError, type InternalAxiosRequestConfig } from "axios";
-
-const backendUrl = import.meta.env.VITE_BACKEND_URL;
-
-const createAxiosInstance = (getAccessToken: () => string | null) => {
-    const axiosInstance = axios.create({
-        baseURL: backendUrl,
-        withCredentials: true,
-    });
-
-    // Attach access token dynamically before each request
-    axiosInstance.interceptors.request.use(
-        (config: InternalAxiosRequestConfig) => {
-            const token = getAccessToken();
-            if (token) {
-                config.headers = config.headers || {};
-                config.headers.Authorization = `Bearer ${token}`;
-            }
-            return config;
-        },
-        (error: AxiosError) => {
-            return Promise.reject(error);
-        }
-    );
-
-    // Response interceptor: handle 401 by refreshing token
-    axiosInstance.interceptors.response.use(
-        (response) => response,
-        async (error: AxiosError) => {
-            const originalRequest = error.config as InternalAxiosRequestConfig & { _retry?: boolean };
-
-            if (
-                error.response?.status === 401 &&
-                !originalRequest._retry
-            ) {
-                originalRequest._retry = true;
-
-                try {
-                    // Call refresh endpoint; no token needed in body, cookie sent automatically
-                    const res = await axiosInstance.post("/api/auth/refresh");
-
-                    // The new access token is in res.data.accessToken
-                    const newAccessToken = res.data.accessToken;
-
-                    // Optionally you can call a function here to update your React global state
-                    // But since this is outside React, you may want to pass an "onTokenRefresh" callback
-                    // For example: onTokenRefresh(newAccessToken);
-
-                    // Update header and retry original request
-                    originalRequest.headers = originalRequest.headers || {};
-                    originalRequest.headers.Authorization = `Bearer ${newAccessToken}`;
-
-                    return axiosInstance(originalRequest);
-                } catch (refreshError) {
-                    console.error("Token refresh failed:", refreshError);
-                    // Optional: trigger logout or token cleanup via a callback
-                }
-            }
-
-            return Promise.reject(error);
-        }
-    );
-
-    return axiosInstance;
-};
-
-export default createAxiosInstance;
Index: ontend/src/api/contactApi.ts
===================================================================
--- frontend/src/api/contactApi.ts	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,17 +1,0 @@
-import axios from "axios";
-
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-expect-error
-const backendUrl = import.meta.env.VITE_BACKEND_URL;
-
-export const sendEmailApi = async (accessToken: string, subject: string, text: string) => {
-    await axios.post(
-        `${backendUrl}/api/emails/contact-us`,
-        {subject, text},
-        {
-            headers: {
-                Authorization: `Bearer ${accessToken}`
-            }
-        }
-    );
-}
Index: ontend/src/api/courseApi.ts
===================================================================
--- frontend/src/api/courseApi.ts	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,102 +1,0 @@
-import axios, {type AxiosResponse} from "axios";
-import type {CoursePreview} from "../models/javaObjects/CoursePreview.tsx";
-import type {CourseDetail} from "../models/javaObjects/CourseDetail.tsx";
-import type {CourseFull} from "../models/javaObjects/CourseFull.tsx";
-import type {CoursePreviewEnrolled} from "../models/javaObjects/CoursePreviewEnrolled.tsx";
-
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-expect-error
-const backendUrl = import.meta.env.VITE_BACKEND_URL;
-
-// export const fetchCoursesApi = async (accessToken?: string, params?: FilterParams, signal?: AbortSignal): Promise<CoursePreview[]> => {
-//     const res = await axios.get(
-//         `${backendUrl}/api/courses`,
-//         {
-//             params,
-//             paramsSerializer: params => qs.stringify(params, {arrayFormat: 'repeat'}),
-//             signal,
-//             headers: accessToken ? { Authorization: `Bearer ${accessToken}` } : undefined
-//
-//         }
-//     )
-//
-//     return res.data;
-// }
-export const fetchCoursesApi = async (accessToken?: string, signal?: AbortSignal): Promise<CoursePreview[]> => {
-    const res = await axios.get(
-        `${backendUrl}/api/courses`,
-        {
-            signal,
-            headers: accessToken ? {Authorization: `Bearer ${accessToken}`} : undefined
-
-        }
-    )
-
-    return res.data;
-}
-
-export const fetchRecommendedCoursesApi = async (accessToken: string): Promise<CoursePreview[]> => {
-    const res = await axios.get(`${backendUrl}/api/courses/recommended`, {
-        headers: {
-            Authorization: `Bearer ${accessToken}`
-        }
-    });
-
-    return res.data;
-}
-
-export const fetchEnrolledCoursesApi = async (accessToken: string): Promise<CoursePreviewEnrolled[]> => {
-    const res = await axios.get(`${backendUrl}/api/courses/enrolled`, {
-        headers: {
-            Authorization: `Bearer ${accessToken}`
-        }
-    });
-
-    return res.data;
-}
-
-export const fetchCourseDetailsApi = async (courseId: number, signal?: AbortSignal): Promise<CourseDetail> => {
-    const res = await axios.get(
-        `${backendUrl}/api/courses/${courseId}`,
-        {signal}
-    );
-
-    return res.data;
-}
-
-export const fetchCourseFullApi = async (courseId: number, accessToken: string): Promise<CourseFull> => {
-    const res = await axios.get(
-        `${backendUrl}/api/courses/${courseId}/enrolled`, {
-            headers: {
-                Authorization: `Bearer ${accessToken}`
-            }
-        });
-
-    return res.data;
-}
-
-export const fetchCoursesTopicsApi = async (): Promise<string[]> => {
-    const res = await axios.get(`${backendUrl}/api/courses/topics`);
-    return res.data;
-}
-
-export const fetchCoursesSkillsApi = async (): Promise<string[]> => {
-    const res = await axios.get(`${backendUrl}/api/courses/skills`);
-    return res.data;
-}
-
-type CertificateResponse = AxiosResponse<Blob>
-
-export const fetchCourseCertificateApi = async (courseId: number, accessToken: string): Promise<CertificateResponse> => {
-    const res = await axios.get(
-        `${backendUrl}/api/courses/${courseId}/certificate`, {
-            headers: {
-                Authorization: `Bearer ${accessToken}`
-            },
-            responseType: 'blob'
-        }
-    );
-    return res;
-}
-
-
Index: ontend/src/api/enrollmentApi.ts
===================================================================
--- frontend/src/api/enrollmentApi.ts	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,33 +1,0 @@
-import axios from "axios";
-import type {Enrollment} from "../models/javaObjects/Enrollment.tsx";
-
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-expect-error
-const backendUrl = import.meta.env.VITE_BACKEND_URL;
-
-export const enrollUserApi = async (courseId: number, accessToken: string): Promise<Enrollment> => {
-    const res = await axios.post(
-        `${backendUrl}/api/enrollments/create/${courseId}`,
-        {},
-        {
-            headers: {
-                Authorization: `Bearer ${accessToken}`,
-            }
-        }
-    )
-
-    return res.data;
-}
-
-export const fetchUserEnrollmentsApi = async (accessToken: string): Promise<Enrollment[]> => {
-    const res = await axios.get(
-        `${backendUrl}/api/enrollments/user`,
-        {
-            headers: {
-                Authorization: `Bearer ${accessToken}`,
-            }
-        }
-    )
-
-    return res.data;
-}
Index: ontend/src/api/meetingApi.ts
===================================================================
--- frontend/src/api/meetingApi.ts	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,33 +1,0 @@
-import axios from "axios";
-import type {UserMeetingInfoRequest} from "../models/UserMeetingInfoRequest.tsx";
-
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-expect-error
-const backendUrl = import.meta.env.VITE_BACKEND_URL;
-
-export const fetchExpertFreeTimeSlotsApi = async (accessToken: string): Promise<Record<string, string[]>> => {
-    const userTimeZone = encodeURIComponent(Intl.DateTimeFormat().resolvedOptions().timeZone);
-    const res = await axios.get(
-        `${backendUrl}/api/meetings/free-time-slots?userTimeZone=${userTimeZone}`,
-        {
-            headers: {
-                Authorization: `Bearer ${accessToken}`
-            }
-        }
-    );
-
-    return res.data;
-}
-
-export const scheduleMeetingApi = async (accessToken: string, startTime: string, date: string, userMeetingInfoRequest: UserMeetingInfoRequest): Promise<void> => {
-    const userTimeZone = encodeURIComponent(Intl.DateTimeFormat().resolvedOptions().timeZone);
-    await axios.post(
-        `${backendUrl}/api/meetings/schedule-free-consultation?startTime=${startTime}&date=${date}&userTimeZone=${userTimeZone}`,
-        userMeetingInfoRequest,
-        {
-            headers: {
-                Authorization: `Bearer ${accessToken}`
-            }
-        }
-    );
-}
Index: ontend/src/api/reviewApi.ts
===================================================================
--- frontend/src/api/reviewApi.ts	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,65 +1,0 @@
-import axios from "axios";
-import type {Review} from "../models/Review.tsx";
-
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-expect-error
-const backendUrl = import.meta.env.VITE_BACKEND_URL;
-
-export const writeReviewApi = async (
-    accessToken: string,
-    courseId: number,
-    rating: number,
-    comment: string,
-): Promise<void> => {
-
-    await axios.post(
-        `${backendUrl}/api/review/${courseId}`,
-        {
-            rating,
-            comment
-        },
-        {
-            headers: {
-                Authorization: `Bearer ${accessToken}`
-            }
-        }
-    );
-}
-
-export const updateReviewApi = async (
-    accessToken: string,
-    courseId: number,
-    rating: number,
-    comment: string,
-): Promise<void> => {
-
-    await axios.put(
-        `${backendUrl}/api/review/${courseId}`,
-        {
-            rating,
-            comment
-        },
-        {
-            headers: {
-                Authorization: `Bearer ${accessToken}`
-            }
-        }
-    );
-}
-
-export const getReviewApi = async (
-    accessToken: string,
-    courseId: number,
-): Promise<Review> => {
-
-    const  res = await axios.get(
-        `${backendUrl}/api/review/course/${courseId}`,
-        {
-            headers: {
-                Authorization: `Bearer ${accessToken}`
-            }
-        }
-    );
-
-    return res.data;
-}
Index: ontend/src/api/s3Api.ts
===================================================================
--- frontend/src/api/s3Api.ts	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,17 +1,0 @@
-import axios from "axios";
-
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-expect-error
-const backendUrl = import.meta.env.VITE_BACKEND_URL;
-
-export const fetchPresignedUrlApi = async (accessToken: string, courseId: number, lectureId: number, fileName: string, expirySeconds: number): Promise<string> => {
-    const res = await axios.get(
-        `${backendUrl}/api/s3/presigned-url?courseId=${courseId}&lectureId=${lectureId}&fileName=${fileName}&expirySeconds=${expirySeconds}`,
-        {
-            headers: accessToken ? {Authorization: `Bearer ${accessToken}`} : undefined
-
-        }
-    )
-
-    return res.data.url;
-}
Index: ontend/src/api/userApi.ts
===================================================================
--- frontend/src/api/userApi.ts	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,67 +1,0 @@
-import axios from "axios";
-import type {User} from "../models/javaObjects/User.tsx";
-
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-expect-error
-const backendUrl = import.meta.env.VITE_BACKEND_URL;
-
-export const toggleFavoriteCourseApi = async (courseId: number, accessToken: string): Promise<void> => {
-    await axios.put(
-        `${backendUrl}/api/users/favorite-course/${courseId}`,
-        {},
-        {
-            headers: {
-                Authorization: `Bearer ${accessToken}`,
-            }
-        }
-    )
-}
-
-export const updateUserApi = async (userInfo: {name: string, workPosition: string, companyType: string}, accessToken: string): Promise<void> => {
-    await axios.put(
-        `${backendUrl}/api/users/update/info`,
-        userInfo,
-        {
-            headers: {
-                Authorization: `Bearer ${accessToken}`,
-            }
-        }
-    )
-}
-
-export const updateUserInterestsApi = async (interests: string[], accessToken: string): Promise<void> => {
-    await axios.put(
-        `${backendUrl}/api/users/update/interests`,
-        interests,
-        {
-            headers: {
-                Authorization: `Bearer ${accessToken}`,
-            }
-        }
-    )
-}
-
-export const updateUserDesiredSkillsApi = async (desiredSkills: string[], accessToken: string): Promise<void> => {
-    await axios.put(
-        `${backendUrl}/api/users/update/desired-skills`,
-        desiredSkills,
-        {
-            headers: {
-                Authorization: `Bearer ${accessToken}`,
-            }
-        }
-    )
-}
-
-export const getUserApi = async (accessToken: string): Promise<User> => {
-    const res = await axios.get(
-        `${backendUrl}/api/users/me`,
-        {
-            headers: {
-                Authorization: `Bearer ${accessToken}`,
-            }
-        }
-    )
-
-    return res.data;
-}
Index: ontend/src/api/userCourseProgressApi.ts
===================================================================
--- frontend/src/api/userCourseProgressApi.ts	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,34 +1,0 @@
-import axios from "axios";
-import type {UserCourseProgress} from "../models/javaObjects/UserCourseProgress.tsx";
-
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-expect-error
-const backendUrl = import.meta.env.VITE_BACKEND_URL;
-
-export const completeLectureApi = async (progressId: number, accessToken: string): Promise<UserCourseProgress> => {
-    const res = await axios.put(
-        `${backendUrl}/api/progress/${progressId}/complete`,
-        null,
-        {
-            headers: {
-                Authorization: `Bearer ${accessToken}`,
-            }
-        }
-    )
-
-    return res.data;
-}
-
-export const uncompleteLectureApi = async (progressId: number, accessToken: string): Promise<UserCourseProgress> => {
-    const res = await axios.put(
-        `${backendUrl}/api/progress/${progressId}/uncomplete`,
-        null,
-        {
-            headers: {
-                Authorization: `Bearer ${accessToken}`,
-            }
-        }
-    )
-
-    return res.data;
-}
Index: ontend/src/assets/CircularProgress.tsx
===================================================================
--- frontend/src/assets/CircularProgress.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,50 +1,0 @@
-import React from "react";
-
-interface CircularProgressProps {
-    percentage: number; // 0 - 100
-    size?: number;
-    strokeWidth?: number;
-}
-
-const CircularProgress: React.FC<CircularProgressProps> = ({
-                                                               percentage,
-                                                               size = 20,
-                                                               strokeWidth = 2,
-                                                           }) => {
-    const radius = (size - strokeWidth) / 2;
-    const circumference = 2 * Math.PI * radius;
-    const offset = circumference - (percentage / 100) * circumference;
-
-    return (
-        <svg
-            width={size}
-            height={size}
-            className="transform -rotate-90"
-        >
-            {/* Background circle */}
-            <circle
-                cx={size / 2}
-                cy={size / 2}
-                r={radius}
-                stroke="var(--color-gray)" // Tailwind's gray-200
-                strokeWidth={strokeWidth}
-                fill="none"
-            />
-            {/* Progress circle */}
-            <circle
-                cx={size / 2}
-                cy={size / 2}
-                r={radius}
-                stroke="var(--color-shifter)" // Tailwind's blue-500
-                strokeWidth={strokeWidth}
-                fill="none"
-                strokeDasharray={circumference}
-                strokeDashoffset={offset}
-                strokeLinecap="round"
-                style={{ transition: "stroke-dashoffset 0.35s ease" }}
-            />
-        </svg>
-    );
-};
-
-export default CircularProgress;
Index: ontend/src/assets/animations/Loading.json
===================================================================
--- frontend/src/assets/animations/Loading.json	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,3 +1,0 @@
-{"v":"5.6.10","fr":30,"ip":30,"op":210,"w":800,"h":600,"nm":"Ã¥ÂÂÃ¦ÂÂ 1","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Ã¥Â½Â¢Ã§ÂÂ¶Ã¥ÂÂ¾Ã¥Â±Â 18","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":340,"ix":10},"p":{"a":0,"k":[400,300,0],"ix":2},"a":{"a":0,"k":[1.258,2.078,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[200,200],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ã¦Â¤Â­Ã¥ÂÂÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":5,"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"t":30,"s":[120]}],"ix":3},"m":1,"ix":2,"nm":"Ã¤Â¿Â®Ã¥ÂÂªÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.549,0.7608,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":40,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Ã¦ÂÂÃ¨Â¾Â¹ 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[1.258,2.078],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Ã¥ÂÂÃ¦ÂÂ¢"}],"nm":"Ã¦Â¤Â­Ã¥ÂÂ 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":121,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Ã¥Â½Â¢Ã§ÂÂ¶Ã¥ÂÂ¾Ã¥Â±Â 17","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":320,"ix":10},"p":{"a":0,"k":[400,300,0],"ix":2},"a":{"a":0,"k":[1.258,2.078,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[200,200],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ã¦Â¤Â­Ã¥ÂÂÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":5,"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[0]},{"t":40,"s":[120]}],"ix":3},"m":1,"ix":2,"nm":"Ã¤Â¿Â®Ã¥ÂÂªÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.549,0.7608,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":40,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Ã¦ÂÂÃ¨Â¾Â¹ 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[1.258,2.078],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Ã¥ÂÂÃ¦ÂÂ¢"}],"nm":"Ã¦Â¤Â­Ã¥ÂÂ 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":121,"st":10,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Ã¥Â½Â¢Ã§ÂÂ¶Ã¥ÂÂ¾Ã¥Â±Â 16","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":300,"ix":10},"p":{"a":0,"k":[400,300,0],"ix":2},"a":{"a":0,"k":[1.258,2.078,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[200,200],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ã¦Â¤Â­Ã¥ÂÂÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":5,"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":20,"s":[0]},{"t":50,"s":[120]}],"ix":3},"m":1,"ix":2,"nm":"Ã¤Â¿Â®Ã¥ÂÂªÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.549,0.7608,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":40,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Ã¦ÂÂÃ¨Â¾Â¹ 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[1.258,2.078],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Ã¥ÂÂÃ¦ÂÂ¢"}],"nm":"Ã¦Â¤Â­Ã¥ÂÂ 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":121,"st":20,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Ã¥Â½Â¢Ã§ÂÂ¶Ã¥ÂÂ¾Ã¥Â±Â 15","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":280,"ix":10},"p":{"a":0,"k":[400,300,0],"ix":2},"a":{"a":0,"k":[1.258,2.078,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[200,200],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ã¦Â¤Â­Ã¥ÂÂÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":5,"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":30,"s":[0]},{"t":60,"s":[120]}],"ix":3},"m":1,"ix":2,"nm":"Ã¤Â¿Â®Ã¥ÂÂªÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.549,0.7608,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":40,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Ã¦ÂÂÃ¨Â¾Â¹ 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[1.258,2.078],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Ã¥ÂÂÃ¦ÂÂ¢"}],"nm":"Ã¦Â¤Â­Ã¥ÂÂ 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":121,"st":30,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Ã¥Â½Â¢Ã§ÂÂ¶Ã¥ÂÂ¾Ã¥Â±Â 14","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":260,"ix":10},"p":{"a":0,"k":[400,300,0],"ix":2},"a":{"a":0,"k":[1.258,2.078,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[200,200],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ã¦Â¤Â­Ã¥ÂÂÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":5,"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":40,"s":[0]},{"t":70,"s":[120]}],"ix":3},"m":1,"ix":2,"nm":"Ã¤Â¿Â®Ã¥ÂÂªÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.549,0.7608,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":40,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Ã¦ÂÂÃ¨Â¾Â¹ 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[1.258,2.078],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Ã¥ÂÂÃ¦ÂÂ¢"}],"nm":"Ã¦Â¤Â­Ã¥ÂÂ 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":121,"st":40,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Ã¥Â½Â¢Ã§ÂÂ¶Ã¥ÂÂ¾Ã¥Â±Â 13","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":240,"ix":10},"p":{"a":0,"k":[400,300,0],"ix":2},"a":{"a":0,"k":[1.258,2.078,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[200,200],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ã¦Â¤Â­Ã¥ÂÂÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":5,"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":50,"s":[0]},{"t":80,"s":[120]}],"ix":3},"m":1,"ix":2,"nm":"Ã¤Â¿Â®Ã¥ÂÂªÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.549,0.7608,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":40,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Ã¦ÂÂÃ¨Â¾Â¹ 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[1.258,2.078],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Ã¥ÂÂÃ¦ÂÂ¢"}],"nm":"Ã¦Â¤Â­Ã¥ÂÂ 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":121,"st":50,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Ã¥Â½Â¢Ã§ÂÂ¶Ã¥ÂÂ¾Ã¥Â±Â 12","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":220,"ix":10},"p":{"a":0,"k":[400,300,0],"ix":2},"a":{"a":0,"k":[1.258,2.078,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[200,200],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ã¦Â¤Â­Ã¥ÂÂÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":5,"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[0]},{"t":90,"s":[120]}],"ix":3},"m":1,"ix":2,"nm":"Ã¤Â¿Â®Ã¥ÂÂªÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.549,0.7608,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":40,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Ã¦ÂÂÃ¨Â¾Â¹ 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[1.258,2.078],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Ã¥ÂÂÃ¦ÂÂ¢"}],"nm":"Ã¦Â¤Â­Ã¥ÂÂ 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":181,"st":60,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Ã¥Â½Â¢Ã§ÂÂ¶Ã¥ÂÂ¾Ã¥Â±Â 11","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":200,"ix":10},"p":{"a":0,"k":[400,300,0],"ix":2},"a":{"a":0,"k":[1.258,2.078,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[200,200],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ã¦Â¤Â­Ã¥ÂÂÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":5,"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":70,"s":[0]},{"t":100,"s":[120]}],"ix":3},"m":1,"ix":2,"nm":"Ã¤Â¿Â®Ã¥ÂÂªÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.549,0.7608,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":40,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Ã¦ÂÂÃ¨Â¾Â¹ 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[1.258,2.078],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Ã¥ÂÂÃ¦ÂÂ¢"}],"nm":"Ã¦Â¤Â­Ã¥ÂÂ 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":181,"st":70,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Ã¥Â½Â¢Ã§ÂÂ¶Ã¥ÂÂ¾Ã¥Â±Â 10","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":180,"ix":10},"p":{"a":0,"k":[400,300,0],"ix":2},"a":{"a":0,"k":[1.258,2.078,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[200,200],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ã¦Â¤Â­Ã¥ÂÂÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":5,"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":80,"s":[0]},{"t":110,"s":[120]}],"ix":3},"m":1,"ix":2,"nm":"Ã¤Â¿Â®Ã¥ÂÂªÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.549,0.7608,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":40,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Ã¦ÂÂÃ¨Â¾Â¹ 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[1.258,2.078],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Ã¥ÂÂÃ¦ÂÂ¢"}],"nm":"Ã¦Â¤Â­Ã¥ÂÂ 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":181,"st":80,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Ã¥Â½Â¢Ã§ÂÂ¶Ã¥ÂÂ¾Ã¥Â±Â 9","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":160,"ix":10},"p":{"a":0,"k":[400,300,0],"ix":2},"a":{"a":0,"k":[1.258,2.078,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[200,200],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ã¦Â¤Â­Ã¥ÂÂÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":5,"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":90,"s":[0]},{"t":120,"s":[120]}],"ix":3},"m":1,"ix":2,"nm":"Ã¤Â¿Â®Ã¥ÂÂªÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.549,0.7608,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":40,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Ã¦ÂÂÃ¨Â¾Â¹ 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[1.258,2.078],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Ã¥ÂÂÃ¦ÂÂ¢"}],"nm":"Ã¦Â¤Â­Ã¥ÂÂ 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":181,"st":90,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Ã¥Â½Â¢Ã§ÂÂ¶Ã¥ÂÂ¾Ã¥Â±Â 8","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":140,"ix":10},"p":{"a":0,"k":[400,300,0],"ix":2},"a":{"a":0,"k":[1.258,2.078,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[200,200],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ã¦Â¤Â­Ã¥ÂÂÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":5,"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":100,"s":[0]},{"t":130,"s":[120]}],"ix":3},"m":1,"ix":2,"nm":"Ã¤Â¿Â®Ã¥ÂÂªÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.549,0.7608,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":40,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Ã¦ÂÂÃ¨Â¾Â¹ 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[1.258,2.078],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Ã¥ÂÂÃ¦ÂÂ¢"}],"nm":"Ã¦Â¤Â­Ã¥ÂÂ 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":181,"st":100,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Ã¥Â½Â¢Ã§ÂÂ¶Ã¥ÂÂ¾Ã¥Â±Â 7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":120,"ix":10},"p":{"a":0,"k":[400,300,0],"ix":2},"a":{"a":0,"k":[1.258,2.078,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[200,200],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ã¦Â¤Â­Ã¥ÂÂÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":5,"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":110,"s":[0]},{"t":140,"s":[120]}],"ix":3},"m":1,"ix":2,"nm":"Ã¤Â¿Â®Ã¥ÂÂªÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.549,0.7608,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":40,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Ã¦ÂÂÃ¨Â¾Â¹ 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[1.258,2.078],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Ã¥ÂÂÃ¦ÂÂ¢"}],"nm":"Ã¦Â¤Â­Ã¥ÂÂ 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":181,"st":110,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Ã¥Â½Â¢Ã§ÂÂ¶Ã¥ÂÂ¾Ã¥Â±Â 6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":100,"ix":10},"p":{"a":0,"k":[400,300,0],"ix":2},"a":{"a":0,"k":[1.258,2.078,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[200,200],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ã¦Â¤Â­Ã¥ÂÂÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":5,"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[0]},{"t":150,"s":[120]}],"ix":3},"m":1,"ix":2,"nm":"Ã¤Â¿Â®Ã¥ÂÂªÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.549,0.7608,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":40,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Ã¦ÂÂÃ¨Â¾Â¹ 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[1.258,2.078],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Ã¥ÂÂÃ¦ÂÂ¢"}],"nm":"Ã¦Â¤Â­Ã¥ÂÂ 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":78,"op":420,"st":120,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Ã¥Â½Â¢Ã§ÂÂ¶Ã¥ÂÂ¾Ã¥Â±Â 5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":80,"ix":10},"p":{"a":0,"k":[400,300,0],"ix":2},"a":{"a":0,"k":[1.258,2.078,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[200,200],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ã¦Â¤Â­Ã¥ÂÂÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":5,"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":130,"s":[0]},{"t":160,"s":[120]}],"ix":3},"m":1,"ix":2,"nm":"Ã¤Â¿Â®Ã¥ÂÂªÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.549,0.7608,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":40,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Ã¦ÂÂÃ¨Â¾Â¹ 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[1.258,2.078],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Ã¥ÂÂÃ¦ÂÂ¢"}],"nm":"Ã¦Â¤Â­Ã¥ÂÂ 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":78,"op":430,"st":130,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Ã¥Â½Â¢Ã§ÂÂ¶Ã¥ÂÂ¾Ã¥Â±Â 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":60,"ix":10},"p":{"a":0,"k":[400,300,0],"ix":2},"a":{"a":0,"k":[1.258,2.078,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[200,200],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ã¦Â¤Â­Ã¥ÂÂÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":5,"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":140,"s":[0]},{"t":170,"s":[120]}],"ix":3},"m":1,"ix":2,"nm":"Ã¤Â¿Â®Ã¥ÂÂªÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.549,0.7608,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":40,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Ã¦ÂÂÃ¨Â¾Â¹ 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[1.258,2.078],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Ã¥ÂÂÃ¦ÂÂ¢"}],"nm":"Ã¦Â¤Â­Ã¥ÂÂ 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":78,"op":440,"st":140,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"Ã¥Â½Â¢Ã§ÂÂ¶Ã¥ÂÂ¾Ã¥Â±Â 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":40,"ix":10},"p":{"a":0,"k":[400,300,0],"ix":2},"a":{"a":0,"k":[1.258,2.078,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[200,200],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ã¦Â¤Â­Ã¥ÂÂÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":5,"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":150,"s":[0]},{"t":180,"s":[120]}],"ix":3},"m":1,"ix":2,"nm":"Ã¤Â¿Â®Ã¥ÂÂªÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.549,0.7608,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":40,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Ã¦ÂÂÃ¨Â¾Â¹ 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[1.258,2.078],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Ã¥ÂÂÃ¦ÂÂ¢"}],"nm":"Ã¦Â¤Â­Ã¥ÂÂ 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":78,"op":450,"st":150,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"Ã¥Â½Â¢Ã§ÂÂ¶Ã¥ÂÂ¾Ã¥Â±Â 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":20,"ix":10},"p":{"a":0,"k":[400,300,0],"ix":2},"a":{"a":0,"k":[1.258,2.078,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[200,200],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ã¦Â¤Â­Ã¥ÂÂÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":5,"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":160,"s":[0]},{"t":190,"s":[120]}],"ix":3},"m":1,"ix":2,"nm":"Ã¤Â¿Â®Ã¥ÂÂªÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.549,0.7608,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":40,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Ã¦ÂÂÃ¨Â¾Â¹ 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[1.258,2.078],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Ã¥ÂÂÃ¦ÂÂ¢"}],"nm":"Ã¦Â¤Â­Ã¥ÂÂ 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":78,"op":460,"st":160,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"Ã¥Â½Â¢Ã§ÂÂ¶Ã¥ÂÂ¾Ã¥Â±Â 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,300,0],"ix":2},"a":{"a":0,"k":[1.258,2.078,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[200,200],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ã¦Â¤Â­Ã¥ÂÂÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":5,"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":170,"s":[0]},{"t":200,"s":[120]}],"ix":3},"m":1,"ix":2,"nm":"Ã¤Â¿Â®Ã¥ÂÂªÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.549,0.7608,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":40,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Ã¦ÂÂÃ¨Â¾Â¹ 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[1.258,2.078],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Ã¥ÂÂÃ¦ÂÂ¢"}],"nm":"Ã¦Â¤Â­Ã¥ÂÂ 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":78,"op":470,"st":170,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"Ã¥Â½Â¢Ã§ÂÂ¶Ã¥ÂÂ¾Ã¥Â±Â 24","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":340,"ix":10},"p":{"a":0,"k":[400,300,0],"ix":2},"a":{"a":0,"k":[1.258,2.078,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[200,200],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ã¦Â¤Â­Ã¥ÂÂÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":5,"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":180,"s":[0]},{"t":210,"s":[120]}],"ix":3},"m":1,"ix":2,"nm":"Ã¤Â¿Â®Ã¥ÂÂªÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.549,0.7608,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":40,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Ã¦ÂÂÃ¨Â¾Â¹ 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[1.258,2.078],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Ã¥ÂÂÃ¦ÂÂ¢"}],"nm":"Ã¦Â¤Â­Ã¥ÂÂ 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":180,"op":301,"st":180,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"Ã¥Â½Â¢Ã§ÂÂ¶Ã¥ÂÂ¾Ã¥Â±Â 23","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":320,"ix":10},"p":{"a":0,"k":[400,300,0],"ix":2},"a":{"a":0,"k":[1.258,2.078,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[200,200],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ã¦Â¤Â­Ã¥ÂÂÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":5,"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":190,"s":[0]},{"t":220,"s":[120]}],"ix":3},"m":1,"ix":2,"nm":"Ã¤Â¿Â®Ã¥ÂÂªÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.549,0.7608,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":40,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Ã¦ÂÂÃ¨Â¾Â¹ 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[1.258,2.078],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Ã¥ÂÂÃ¦ÂÂ¢"}],"nm":"Ã¦Â¤Â­Ã¥ÂÂ 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":180,"op":301,"st":190,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"Ã¥Â½Â¢Ã§ÂÂ¶Ã¥ÂÂ¾Ã¥Â±Â 22","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":300,"ix":10},"p":{"a":0,"k":[400,300,0],"ix":2},"a":{"a":0,"k":[1.258,2.078,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[200,200],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ã¦Â¤Â­Ã¥ÂÂÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":5,"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":200,"s":[0]},{"t":230,"s":[120]}],"ix":3},"m":1,"ix":2,"nm":"Ã¤Â¿Â®Ã¥ÂÂªÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.549,0.7608,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":40,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Ã¦ÂÂÃ¨Â¾Â¹ 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[1.258,2.078],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Ã¥ÂÂÃ¦ÂÂ¢"}],"nm":"Ã¦Â¤Â­Ã¥ÂÂ 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":180,"op":301,"st":200,"bm":0},{"ddd":0,"ind":22,"ty":4,"nm":"Ã¥Â½Â¢Ã§ÂÂ¶Ã¥ÂÂ¾Ã¥Â±Â 21","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":280,"ix":10},"p":{"a":0,"k":[400,300,0],"ix":2},"a":{"a":0,"k":[1.258,2.078,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[200,200],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ã¦Â¤Â­Ã¥ÂÂÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":5,"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":210,"s":[0]},{"t":240,"s":[120]}],"ix":3},"m":1,"ix":2,"nm":"Ã¤Â¿Â®Ã¥ÂÂªÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.549,0.7608,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":40,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Ã¦ÂÂÃ¨Â¾Â¹ 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[1.258,2.078],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Ã¥ÂÂÃ¦ÂÂ¢"}],"nm":"Ã¦Â¤Â­Ã¥ÂÂ 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":180,"op":301,"st":210,"bm":0},{"ddd":0,"ind":23,"ty":4,"nm":"Ã¥Â½Â¢Ã§ÂÂ¶Ã¥ÂÂ¾Ã¥Â±Â 20","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":260,"ix":10},"p":{"a":0,"k":[400,300,0],"ix":2},"a":{"a":0,"k":[1.258,2.078,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[200,200],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ã¦Â¤Â­Ã¥ÂÂÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":5,"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":220,"s":[0]},{"t":250,"s":[120]}],"ix":3},"m":1,"ix":2,"nm":"Ã¤Â¿Â®Ã¥ÂÂªÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.549,0.7608,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":40,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Ã¦ÂÂÃ¨Â¾Â¹ 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[1.258,2.078],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Ã¥ÂÂÃ¦ÂÂ¢"}],"nm":"Ã¦Â¤Â­Ã¥ÂÂ 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":180,"op":301,"st":220,"bm":0},{"ddd":0,"ind":24,"ty":4,"nm":"Ã¥Â½Â¢Ã§ÂÂ¶Ã¥ÂÂ¾Ã¥Â±Â 19","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":240,"ix":10},"p":{"a":0,"k":[400,300,0],"ix":2},"a":{"a":0,"k":[1.258,2.078,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[200,200],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ã¦Â¤Â­Ã¥ÂÂÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":5,"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":230,"s":[0]},{"t":260,"s":[120]}],"ix":3},"m":1,"ix":2,"nm":"Ã¤Â¿Â®Ã¥ÂÂªÃ¨Â·Â¯Ã¥Â¾Â 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.549,0.7608,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":40,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Ã¦ÂÂÃ¨Â¾Â¹ 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[1.258,2.078],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Ã¥ÂÂÃ¦ÂÂ¢"}],"nm":"Ã¦Â¤Â­Ã¥ÂÂ 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":180,"op":301,"st":230,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Ã©Â¢ÂÃ¥ÂÂÃ¦ÂÂ 1","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,300,0],"ix":2},"a":{"a":0,"k":[400,300,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Ã§Â®ÂÃ¥ÂÂÃ©ÂÂ»Ã¥Â¡ÂÃ¥Â·Â¥Ã¥Â
-Â·","np":4,"mn":"ADBE Simple Choker","ix":1,"en":1,"ef":[{"ty":7,"nm":"Ã¨Â§ÂÃ¥ÂÂ¾","mn":"ADBE Simple Choker-0001","ix":1,"v":{"a":0,"k":1,"ix":1}},{"ty":0,"nm":"Ã©ÂÂ»Ã¥Â¡ÂÃ©ÂÂ®Ã§Â½Â©","mn":"ADBE Simple Choker-0002","ix":2,"v":{"a":0,"k":14,"ix":2}}]},{"ty":5,"nm":"Ã¦Â¢Â¯Ã¥ÂºÂ¦Ã¦Â¸ÂÃ¥ÂÂ","np":10,"mn":"ADBE Ramp","ix":2,"en":1,"ef":[{"ty":3,"nm":"Ã¦Â¸ÂÃ¥ÂÂÃ¨ÂµÂ·Ã§ÂÂ¹","mn":"ADBE Ramp-0001","ix":1,"v":{"a":0,"k":[400,0],"ix":1}},{"ty":2,"nm":"Ã¨ÂµÂ·Ã¥Â§ÂÃ©Â¢ÂÃ¨ÂÂ²","mn":"ADBE Ramp-0002","ix":2,"v":{"a":0,"k":[0.26,0.7903,1,1],"ix":2}},{"ty":3,"nm":"Ã¦Â¸ÂÃ¥ÂÂÃ§Â»ÂÃ§ÂÂ¹","mn":"ADBE Ramp-0003","ix":3,"v":{"a":0,"k":[400,600],"ix":3}},{"ty":2,"nm":"Ã§Â»ÂÃ¦ÂÂÃ©Â¢ÂÃ¨ÂÂ²","mn":"ADBE Ramp-0004","ix":4,"v":{"a":0,"k":[0.36,0.8187,1,1],"ix":4}},{"ty":7,"nm":"Ã¦Â¸ÂÃ¥ÂÂÃ¥Â½Â¢Ã§ÂÂ¶","mn":"ADBE Ramp-0005","ix":5,"v":{"a":0,"k":1,"ix":5}},{"ty":0,"nm":"Ã¦Â¸ÂÃ¥ÂÂÃ¦ÂÂ£Ã¥Â°Â","mn":"ADBE Ramp-0006","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Ã¤Â¸ÂÃ¥ÂÂÃ¥Â§ÂÃ¥ÂÂ¾Ã¥ÂÂÃ¦Â·Â·Ã¥ÂÂ","mn":"ADBE Ramp-0007","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":6,"nm":"","mn":"ADBE Ramp-0008","ix":8,"v":0}]}],"w":800,"h":600,"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"Ã©Â¢ÂÃ¥ÂÂÃ¦ÂÂ 1","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":56,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,320,0],"ix":2},"a":{"a":0,"k":[400,300,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Ã§Â®ÂÃ¥ÂÂÃ©ÂÂ»Ã¥Â¡ÂÃ¥Â·Â¥Ã¥Â
-Â·","np":4,"mn":"ADBE Simple Choker","ix":1,"en":1,"ef":[{"ty":7,"nm":"Ã¨Â§ÂÃ¥ÂÂ¾","mn":"ADBE Simple Choker-0001","ix":1,"v":{"a":0,"k":1,"ix":1}},{"ty":0,"nm":"Ã©ÂÂ»Ã¥Â¡ÂÃ©ÂÂ®Ã§Â½Â©","mn":"ADBE Simple Choker-0002","ix":2,"v":{"a":0,"k":14,"ix":2}}]},{"ty":5,"nm":"Ã¦Â¢Â¯Ã¥ÂºÂ¦Ã¦Â¸ÂÃ¥ÂÂ","np":10,"mn":"ADBE Ramp","ix":2,"en":1,"ef":[{"ty":3,"nm":"Ã¦Â¸ÂÃ¥ÂÂÃ¨ÂµÂ·Ã§ÂÂ¹","mn":"ADBE Ramp-0001","ix":1,"v":{"a":0,"k":[400,0],"ix":1}},{"ty":2,"nm":"Ã¨ÂµÂ·Ã¥Â§ÂÃ©Â¢ÂÃ¨ÂÂ²","mn":"ADBE Ramp-0002","ix":2,"v":{"a":0,"k":[0.26,0.7903,1,1],"ix":2}},{"ty":3,"nm":"Ã¦Â¸ÂÃ¥ÂÂÃ§Â»ÂÃ§ÂÂ¹","mn":"ADBE Ramp-0003","ix":3,"v":{"a":0,"k":[400,600],"ix":3}},{"ty":2,"nm":"Ã§Â»ÂÃ¦ÂÂÃ©Â¢ÂÃ¨ÂÂ²","mn":"ADBE Ramp-0004","ix":4,"v":{"a":0,"k":[0.36,0.8187,1,1],"ix":4}},{"ty":7,"nm":"Ã¦Â¸ÂÃ¥ÂÂÃ¥Â½Â¢Ã§ÂÂ¶","mn":"ADBE Ramp-0005","ix":5,"v":{"a":0,"k":1,"ix":5}},{"ty":0,"nm":"Ã¦Â¸ÂÃ¥ÂÂÃ¦ÂÂ£Ã¥Â°Â","mn":"ADBE Ramp-0006","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Ã¤Â¸ÂÃ¥ÂÂÃ¥Â§ÂÃ¥ÂÂ¾Ã¥ÂÂÃ¦Â·Â·Ã¥ÂÂ","mn":"ADBE Ramp-0007","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":6,"nm":"","mn":"ADBE Ramp-0008","ix":8,"v":0}]},{"ty":29,"nm":"Ã©Â«ÂÃ¦ÂÂ¯Ã¦Â¨Â¡Ã§Â³Â","np":5,"mn":"ADBE Gaussian Blur 2","ix":3,"en":1,"ef":[{"ty":0,"nm":"Ã¦Â¨Â¡Ã§Â³ÂÃ¥ÂºÂ¦","mn":"ADBE Gaussian Blur 2-0001","ix":1,"v":{"a":0,"k":41.3,"ix":1}},{"ty":7,"nm":"Ã¦Â¨Â¡Ã§Â³ÂÃ¦ÂÂ¹Ã¥ÂÂ","mn":"ADBE Gaussian Blur 2-0002","ix":2,"v":{"a":0,"k":1,"ix":2}},{"ty":7,"nm":"Ã©ÂÂÃ¥Â¤ÂÃ¨Â¾Â¹Ã§Â¼ÂÃ¥ÂÂÃ§Â´Â ","mn":"ADBE Gaussian Blur 2-0003","ix":3,"v":{"a":0,"k":0,"ix":3}}]}],"w":800,"h":600,"ip":0,"op":300,"st":0,"bm":0}],"markers":[]}
Index: ontend/src/assets/animations/MagicBento.tsx
===================================================================
--- frontend/src/assets/animations/MagicBento.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,810 +1,0 @@
-import React, { useRef, useEffect, useState, useCallback } from 'react';
-import { gsap } from 'gsap';
-import { IconRocket, IconTarget, IconTelescope } from "@tabler/icons-react";
-
-export interface BentoCardProps {
-    icon: React.ReactNode;
-    title: string;
-    description: string;
-    textAutoHide?: boolean;
-    disableAnimations?: boolean;
-}
-
-export interface BentoProps {
-    textAutoHide?: boolean;
-    enableStars?: boolean;
-    enableSpotlight?: boolean;
-    enableBorderGlow?: boolean;
-    disableAnimations?: boolean;
-    spotlightRadius?: number;
-    particleCount?: number;
-    enableTilt?: boolean;
-    glowColor?: string;
-    clickEffect?: boolean;
-    enableMagnetism?: boolean;
-}
-
-const DEFAULT_PARTICLE_COUNT = 12;
-const DEFAULT_SPOTLIGHT_RADIUS = 300;
-const DEFAULT_GLOW_COLOR = '0, 140, 194'; // RGB for "shifter" color
-const MOBILE_BREAKPOINT = 768;
-
-const cardData: BentoCardProps[] = [
-    {
-        icon: <IconTarget size={40} color="var(--color-white)" />,
-        title: "Purpose",
-        description: "To create positive change in the world of family entrepreneurship by empowering leaders to drive growth, inspire teams, strengthen culture, and achieve sustainable success."
-    },
-    {
-        icon: <IconRocket size={40} color="var(--color-white)" />,
-        title: "Mission",
-        description: "To empower family businesses to unlock their full potential and drive sustainable growth through mentorship, consulting, and digital learning programs, including online courses and academies."
-    },
-    {
-        icon: <IconTelescope size={40} color="var(--color-white)" />,
-        title: "Vision",
-        description: "To become the leading center for business development, transformation, and continuous learning for family businesses in Europe."
-    }
-];
-
-const createParticleElement = (x: number, y: number, color: string = DEFAULT_GLOW_COLOR): HTMLDivElement => {
-    const el = document.createElement('div');
-    el.className = 'particle';
-    el.style.cssText = `
-    position: absolute;
-    width: 4px;
-    height: 4px;
-    border-radius: 50%;
-    background: rgba(${color}, 1);
-    box-shadow: 0 0 6px rgba(${color}, 0.6);
-    pointer-events: none;
-    z-index: 100;
-    left: ${x}px;
-    top: ${y}px;
-  `;
-    return el;
-};
-
-const calculateSpotlightValues = (radius: number) => ({
-    proximity: radius * 0.5,
-    fadeDistance: radius * 0.75
-});
-
-const updateCardGlowProperties = (card: HTMLElement, mouseX: number, mouseY: number, glow: number, radius: number) => {
-    const rect = card.getBoundingClientRect();
-    const relativeX = ((mouseX - rect.left) / rect.width) * 100;
-    const relativeY = ((mouseY - rect.top) / rect.height) * 100;
-
-    card.style.setProperty('--glow-x', `${relativeX}%`);
-    card.style.setProperty('--glow-y', `${relativeY}%`);
-    card.style.setProperty('--glow-intensity', glow.toString());
-    card.style.setProperty('--glow-radius', `${radius}px`);
-};
-
-const ParticleCard: React.FC<{
-    children: React.ReactNode;
-    className?: string;
-    disableAnimations?: boolean;
-    style?: React.CSSProperties;
-    particleCount?: number;
-    glowColor?: string;
-    enableTilt?: boolean;
-    clickEffect?: boolean;
-    enableMagnetism?: boolean;
-}> = ({
-          children,
-          className = '',
-          disableAnimations = false,
-          style,
-          particleCount = DEFAULT_PARTICLE_COUNT,
-          glowColor = DEFAULT_GLOW_COLOR,
-          enableTilt = true,
-          clickEffect = false,
-          enableMagnetism = false
-      }) => {
-    const cardRef = useRef<HTMLDivElement>(null);
-    const particlesRef = useRef<HTMLDivElement[]>([]);
-    const timeoutsRef = useRef<NodeJS.Timeout[]>([]);
-    const isHoveredRef = useRef(false);
-    const memoizedParticles = useRef<HTMLDivElement[]>([]);
-    const particlesInitialized = useRef(false);
-    const magnetismAnimationRef = useRef<gsap.core.Tween | null>(null);
-
-    const initializeParticles = useCallback(() => {
-        if (particlesInitialized.current || !cardRef.current) return;
-
-        const { width, height } = cardRef.current.getBoundingClientRect();
-        memoizedParticles.current = Array.from({ length: particleCount }, () =>
-            createParticleElement(Math.random() * width, Math.random() * height, glowColor)
-        );
-        particlesInitialized.current = true;
-    }, [particleCount, glowColor]);
-
-    const clearAllParticles = useCallback(() => {
-        timeoutsRef.current.forEach(clearTimeout);
-        timeoutsRef.current = [];
-        magnetismAnimationRef.current?.kill();
-
-        particlesRef.current.forEach(particle => {
-            gsap.to(particle, {
-                scale: 0,
-                opacity: 0,
-                duration: 0.3,
-                ease: 'back.in(1.7)',
-                onComplete: () => {
-                    particle.parentNode?.removeChild(particle);
-                }
-            });
-        });
-        particlesRef.current = [];
-    }, []);
-
-    const animateParticles = useCallback(() => {
-        if (!cardRef.current || !isHoveredRef.current) return;
-
-        if (!particlesInitialized.current) {
-            initializeParticles();
-        }
-
-        memoizedParticles.current.forEach((particle, index) => {
-            const timeoutId = setTimeout(() => {
-                if (!isHoveredRef.current || !cardRef.current) return;
-
-                const clone = particle.cloneNode(true) as HTMLDivElement;
-                cardRef.current.appendChild(clone);
-                particlesRef.current.push(clone);
-
-                gsap.fromTo(clone, { scale: 0, opacity: 0 }, { scale: 1, opacity: 1, duration: 0.3, ease: 'back.out(1.7)' });
-
-                gsap.to(clone, {
-                    x: (Math.random() - 0.5) * 100,
-                    y: (Math.random() - 0.5) * 100,
-                    rotation: Math.random() * 360,
-                    duration: 2 + Math.random() * 2,
-                    ease: 'none',
-                    repeat: -1,
-                    yoyo: true
-                });
-
-                gsap.to(clone, {
-                    opacity: 0.3,
-                    duration: 1.5,
-                    ease: 'power2.inOut',
-                    repeat: -1,
-                    yoyo: true
-                });
-            }, index * 100);
-
-            timeoutsRef.current.push(timeoutId);
-        });
-    }, [initializeParticles]);
-
-    useEffect(() => {
-        if (disableAnimations || !cardRef.current) return;
-
-        const element = cardRef.current;
-
-        const handleMouseEnter = () => {
-            isHoveredRef.current = true;
-            animateParticles();
-
-            if (enableTilt) {
-                gsap.to(element, {
-                    rotateX: 5,
-                    rotateY: 5,
-                    duration: 0.3,
-                    ease: 'power2.out',
-                    transformPerspective: 1000
-                });
-            }
-        };
-
-        const handleMouseLeave = () => {
-            isHoveredRef.current = false;
-            clearAllParticles();
-
-            if (enableTilt) {
-                gsap.to(element, {
-                    rotateX: 0,
-                    rotateY: 0,
-                    duration: 0.3,
-                    ease: 'power2.out'
-                });
-            }
-
-            if (enableMagnetism) {
-                gsap.to(element, {
-                    x: 0,
-                    y: 0,
-                    duration: 0.3,
-                    ease: 'power2.out'
-                });
-            }
-        };
-
-        const handleMouseMove = (e: MouseEvent) => {
-            if (!enableTilt && !enableMagnetism) return;
-
-            const rect = element.getBoundingClientRect();
-            const x = e.clientX - rect.left;
-            const y = e.clientY - rect.top;
-            const centerX = rect.width / 2;
-            const centerY = rect.height / 2;
-
-            if (enableTilt) {
-                const rotateX = ((y - centerY) / centerY) * -3;
-                const rotateY = ((x - centerX) / centerX) * 3;
-
-                gsap.to(element, {
-                    rotateX,
-                    rotateY,
-                    duration: 0.1,
-                    ease: 'power2.out',
-                    transformPerspective: 1000
-                });
-            }
-
-            if (enableMagnetism) {
-                const magnetX = (x - centerX) * 0.05;
-                const magnetY = (y - centerY) * 0.05;
-
-                magnetismAnimationRef.current = gsap.to(element, {
-                    x: magnetX,
-                    y: magnetY,
-                    duration: 0.3,
-                    ease: 'power2.out'
-                });
-            }
-        };
-
-        const handleClick = (e: MouseEvent) => {
-            if (!clickEffect) return;
-
-            const rect = element.getBoundingClientRect();
-            const x = e.clientX - rect.left;
-            const y = e.clientY - rect.top;
-
-            const maxDistance = Math.max(
-                Math.hypot(x, y),
-                Math.hypot(x - rect.width, y),
-                Math.hypot(x, y - rect.height),
-                Math.hypot(x - rect.width, y - rect.height)
-            );
-
-            const ripple = document.createElement('div');
-            ripple.style.cssText = `
-        position: absolute;
-        width: ${maxDistance * 2}px;
-        height: ${maxDistance * 2}px;
-        border-radius: 50%;
-        background: radial-gradient(circle, rgba(${glowColor}, 0.4) 0%, rgba(${glowColor}, 0.2) 30%, transparent 70%);
-        left: ${x - maxDistance}px;
-        top: ${y - maxDistance}px;
-        pointer-events: none;
-        z-index: 1000;
-      `;
-
-            element.appendChild(ripple);
-
-            gsap.fromTo(
-                ripple,
-                {
-                    scale: 0,
-                    opacity: 1
-                },
-                {
-                    scale: 1,
-                    opacity: 0,
-                    duration: 0.8,
-                    ease: 'power2.out',
-                    onComplete: () => ripple.remove()
-                }
-            );
-        };
-
-        element.addEventListener('mouseenter', handleMouseEnter);
-        element.addEventListener('mouseleave', handleMouseLeave);
-        element.addEventListener('mousemove', handleMouseMove);
-        element.addEventListener('click', handleClick);
-
-        return () => {
-            isHoveredRef.current = false;
-            element.removeEventListener('mouseenter', handleMouseEnter);
-            element.removeEventListener('mouseleave', handleMouseLeave);
-            element.removeEventListener('mousemove', handleMouseMove);
-            element.removeEventListener('click', handleClick);
-            clearAllParticles();
-        };
-    }, [animateParticles, clearAllParticles, disableAnimations, enableTilt, enableMagnetism, clickEffect, glowColor]);
-
-    return (
-        <div
-            ref={cardRef}
-            className={`${className} relative overflow-hidden`}
-            style={{ ...style, position: 'relative', overflow: 'hidden' }}
-        >
-            {children}
-        </div>
-    );
-};
-
-const GlobalSpotlight: React.FC<{
-    gridRef: React.RefObject<HTMLDivElement | null>;
-    disableAnimations?: boolean;
-    enabled?: boolean;
-    spotlightRadius?: number;
-    glowColor?: string;
-}> = ({
-          gridRef,
-          disableAnimations = false,
-          enabled = true,
-          spotlightRadius = DEFAULT_SPOTLIGHT_RADIUS,
-          glowColor = DEFAULT_GLOW_COLOR
-      }) => {
-    const spotlightRef = useRef<HTMLDivElement | null>(null);
-    const isInsideSection = useRef(false);
-
-    useEffect(() => {
-        if (disableAnimations || !gridRef?.current || !enabled) return;
-
-        const spotlight = document.createElement('div');
-        spotlight.className = 'global-spotlight';
-        spotlight.style.cssText = `
-      position: fixed;
-      width: 800px;
-      height: 800px;
-      border-radius: 50%;
-      pointer-events: none;
-      background: radial-gradient(circle,
-        rgba(${glowColor}, 0.15) 0%,
-        rgba(${glowColor}, 0.08) 15%,
-        rgba(${glowColor}, 0.04) 25%,
-        rgba(${glowColor}, 0.02) 40%,
-        rgba(${glowColor}, 0.01) 65%,
-        transparent 70%
-      );
-      z-index: 200;
-      opacity: 0;
-      transform: translate(-50%, -50%);
-      mix-blend-mode: screen;
-    `;
-        document.body.appendChild(spotlight);
-        spotlightRef.current = spotlight;
-
-        const handleMouseMove = (e: MouseEvent) => {
-            if (!spotlightRef.current || !gridRef.current) return;
-
-            const section = gridRef.current.closest('.bento-section');
-            const rect = section?.getBoundingClientRect();
-            const mouseInside =
-                rect && e.clientX >= rect.left && e.clientX <= rect.right && e.clientY >= rect.top && e.clientY <= rect.bottom;
-
-            isInsideSection.current = mouseInside || false;
-            const cards = gridRef.current.querySelectorAll('.card');
-
-            if (!mouseInside) {
-                gsap.to(spotlightRef.current, {
-                    opacity: 0,
-                    duration: 0.3,
-                    ease: 'power2.out'
-                });
-                cards.forEach(card => {
-                    (card as HTMLElement).style.setProperty('--glow-intensity', '0');
-                });
-                return;
-            }
-
-            const { proximity, fadeDistance } = calculateSpotlightValues(spotlightRadius);
-            let minDistance = Infinity;
-
-            cards.forEach(card => {
-                const cardElement = card as HTMLElement;
-                const cardRect = cardElement.getBoundingClientRect();
-                const centerX = cardRect.left + cardRect.width / 2;
-                const centerY = cardRect.top + cardRect.height / 2;
-                const distance =
-                    Math.hypot(e.clientX - centerX, e.clientY - centerY) - Math.max(cardRect.width, cardRect.height) / 2;
-                const effectiveDistance = Math.max(0, distance);
-
-                minDistance = Math.min(minDistance, effectiveDistance);
-
-                let glowIntensity = 0;
-                if (effectiveDistance <= proximity) {
-                    glowIntensity = 1;
-                } else if (effectiveDistance <= fadeDistance) {
-                    glowIntensity = (fadeDistance - effectiveDistance) / (fadeDistance - proximity);
-                }
-
-                updateCardGlowProperties(cardElement, e.clientX, e.clientY, glowIntensity, spotlightRadius);
-            });
-
-            gsap.to(spotlightRef.current, {
-                left: e.clientX,
-                top: e.clientY,
-                duration: 0.1,
-                ease: 'power2.out'
-            });
-
-            const targetOpacity =
-                minDistance <= proximity
-                    ? 0.8
-                    : minDistance <= fadeDistance
-                        ? ((fadeDistance - minDistance) / (fadeDistance - proximity)) * 0.8
-                        : 0;
-
-            gsap.to(spotlightRef.current, {
-                opacity: targetOpacity,
-                duration: targetOpacity > 0 ? 0.2 : 0.5,
-                ease: 'power2.out'
-            });
-        };
-
-        const handleMouseLeave = () => {
-            isInsideSection.current = false;
-            gridRef.current?.querySelectorAll('.card').forEach(card => {
-                (card as HTMLElement).style.setProperty('--glow-intensity', '0');
-            });
-            if (spotlightRef.current) {
-                gsap.to(spotlightRef.current, {
-                    opacity: 0,
-                    duration: 0.3,
-                    ease: 'power2.out'
-                });
-            }
-        };
-
-        document.addEventListener('mousemove', handleMouseMove);
-        document.addEventListener('mouseleave', handleMouseLeave);
-
-        return () => {
-            document.removeEventListener('mousemove', handleMouseMove);
-            document.removeEventListener('mouseleave', handleMouseLeave);
-            spotlightRef.current?.parentNode?.removeChild(spotlightRef.current);
-        };
-    }, [gridRef, disableAnimations, enabled, spotlightRadius, glowColor]);
-
-    return null;
-};
-
-const BentoCardGrid: React.FC<{
-    children: React.ReactNode;
-    gridRef?: React.RefObject<HTMLDivElement | null>;
-}> = ({ children, gridRef }) => (
-    <div
-        className="bento-section gap-10 select-none relative"
-        style={{ fontSize: 'clamp(1rem, 0.9rem + 0.5vw, 1.5rem)' }}
-        ref={gridRef}
-    >
-        {children}
-    </div>
-);
-
-const useMobileDetection = () => {
-    const [isMobile, setIsMobile] = useState(false);
-
-    useEffect(() => {
-        const checkMobile = () => setIsMobile(window.innerWidth <= MOBILE_BREAKPOINT);
-
-        checkMobile();
-        window.addEventListener('resize', checkMobile);
-
-        return () => window.removeEventListener('resize', checkMobile);
-    }, []);
-
-    return isMobile;
-};
-
-const MagicBento: React.FC<BentoProps> = ({
-                                              textAutoHide = true,
-                                              enableStars = true,
-                                              enableSpotlight = true,
-                                              enableBorderGlow = true,
-                                              disableAnimations = false,
-                                              spotlightRadius = DEFAULT_SPOTLIGHT_RADIUS,
-                                              particleCount = DEFAULT_PARTICLE_COUNT,
-                                              enableTilt = false,
-                                              glowColor = DEFAULT_GLOW_COLOR,
-                                              clickEffect = true,
-                                              enableMagnetism = true
-                                          }) => {
-    const gridRef = useRef<HTMLDivElement>(null);
-    const isMobile = useMobileDetection();
-    const shouldDisableAnimations = disableAnimations || isMobile;
-
-    const baseBackgroundColor = "var(--color-beige)"; // White color for the cards
-    const textColor = "#060010"; // Dark color for the text
-
-    return (
-        <>
-            <style>
-                {`
-          .bento-section {
-            --glow-x: 50%;
-            --glow-y: 50%;
-            --glow-intensity: 0;
-            --glow-radius: 200px;
-            --glow-color: var(--color-shifter);
-            --border-color: rgba(0, 0, 0, 0.1);
-            --white: #f8f8f8;
-            --shifter: var(--color-shifter);
-          }
-          
-          .card-responsive {
-            grid-template-columns: 1fr;
-            padding: 0.5rem;
-          }
-          
-          @media (min-width: 600px) {
-            .card-responsive {
-              grid-template-columns: repeat(2, 1fr);
-            }
-          }
-          
-          @media (min-width: 1024px) {
-            .card-responsive {
-              grid-template-columns: repeat(3, 1fr);
-            }
-          }
-          
-          .card--border-glow::after {
-            content: '';
-            position: absolute;
-            inset: 0;
-            padding: 6px;
-            background: radial-gradient(var(--glow-radius) circle at var(--glow-x) var(--glow-y),
-                rgba(${DEFAULT_GLOW_COLOR}, calc(var(--glow-intensity) * 0.8)) 0%,
-                rgba(${DEFAULT_GLOW_COLOR}, calc(var(--glow-intensity) * 0.4)) 30%,
-                transparent 60%);
-            border-radius: inherit;
-            mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
-            mask-composite: subtract;
-            -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
-            -webkit-mask-composite: xor;
-            pointer-events: none;
-            transition: opacity 0.3s ease;
-            z-index: 1;
-          }
-          
-          .card--border-glow:hover::after {
-            opacity: 1;
-          }
-          
-          .card--border-glow:hover {
-            box-shadow: 0 4px 20px rgba(0, 140, 194, 0.4), 0 0 30px rgba(${DEFAULT_GLOW_COLOR}, 0.2);
-          }
-          
-          .particle::before {
-            content: '';
-            position: absolute;
-            top: -2px;
-            left: -2px;
-            right: -2px;
-            bottom: -2px;
-            background: rgba(${DEFAULT_GLOW_COLOR}, 0.2);
-            border-radius: 50%;
-            z-index: -1;
-          }
-          
-          .particle-container:hover {
-            box-shadow: 0 4px 20px rgba(46, 24, 78, 0.2), 0 0 30px rgba(${DEFAULT_GLOW_COLOR}, 0.2);
-          }
-          
-          .text-clamp-1 {
-            display: -webkit-box;
-            -webkit-box-orient: vertical;
-            -webkit-line-clamp: 1;
-            line-clamp: 1;
-            overflow: hidden;
-            text-overflow: ellipsis;
-          }
-          
-          .text-clamp-2 {
-            display: -webkit-box;
-            -webkit-box-orient: vertical;
-            -webkit-line-clamp: 2;
-            line-clamp: 2;
-            overflow: hidden;
-            text-overflow: ellipsis;
-          }
-          
-          @media (max-width: 599px) {
-            .card-responsive {
-              grid-template-columns: 1fr;
-              width: 90%;
-              margin: 0 auto;
-              padding: 0.5rem;
-            }
-            
-            .card-responsive .card {
-              // width: 100%;
-              // min-height: 180px;
-            }
-          }
-        `}
-            </style>
-
-            {enableSpotlight && (
-                <GlobalSpotlight
-                    gridRef={gridRef}
-                    disableAnimations={shouldDisableAnimations}
-                    enabled={enableSpotlight}
-                    spotlightRadius={spotlightRadius}
-                    glowColor={glowColor}
-                />
-            )}
-
-            <BentoCardGrid gridRef={gridRef}>
-                <div className="card-responsive grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-10">
-                    {cardData.map((card, index) => {
-                        const baseClassName = `card flex flex-col items-start text-left gap-4 p-6 rounded-lg border border-solid font-light transition-all duration-100 ease-in-out hover:-translate-y-0.5 hover:shadow-[0_8px_25px_rgba(0,0,0,0.15)] ${
-                            enableBorderGlow ? 'card--border-glow' : ''
-                        }`;
-
-                        const cardStyle = {
-                            backgroundColor: baseBackgroundColor,
-                            borderColor: 'var(--border-color)',
-                            color: textColor,
-                            '--glow-x': '50%',
-                            '--glow-y': '50%',
-                            '--glow-intensity': '0',
-                            '--glow-radius': '200px'
-                        } as React.CSSProperties;
-
-                        const content = (
-                            <>
-                                <div className="p-4 bg-shifter rounded-md">{card.icon}</div>
-                                <h3 className={`font-normal text-3xl m-0 ${textAutoHide ? 'text-clamp-1' : ''}`}>
-                                    {card.title}
-                                </h3>
-                                <p
-                                    className={`text-base leading-5 opacity-90 `}
-                                >
-                                    {card.description}
-                                </p>
-                            </>
-                        );
-
-                        if (enableStars) {
-                            return (
-                                <ParticleCard
-                                    key={index}
-                                    className={baseClassName}
-                                    style={cardStyle}
-                                    disableAnimations={shouldDisableAnimations}
-                                    particleCount={particleCount}
-                                    glowColor={glowColor}
-                                    enableTilt={enableTilt}
-                                    clickEffect={clickEffect}
-                                    enableMagnetism={enableMagnetism}
-                                >
-                                    {content}
-                                </ParticleCard>
-                            );
-                        }
-
-                        return (
-                            <div
-                                key={index}
-                                className={baseClassName}
-                                style={cardStyle}
-                                ref={el => {
-                                    if (!el) return;
-
-                                    const handleMouseMove = (e: MouseEvent) => {
-                                        if (shouldDisableAnimations) return;
-
-                                        const rect = el.getBoundingClientRect();
-                                        const x = e.clientX - rect.left;
-                                        const y = e.clientY - rect.top;
-                                        const centerX = rect.width / 2;
-                                        const centerY = rect.height / 2;
-
-                                        if (enableTilt) {
-                                            const rotateX = ((y - centerY) / centerY) * -3;
-                                            const rotateY = ((x - centerX) / centerX) * 3;
-
-                                            gsap.to(el, {
-                                                rotateX,
-                                                rotateY,
-                                                duration: 0.1,
-                                                ease: 'power2.out',
-                                                transformPerspective: 1000
-                                            });
-                                        }
-
-                                        if (enableMagnetism) {
-                                            const magnetX = (x - centerX) * 0.05;
-                                            const magnetY = (y - centerY) * 0.05;
-
-                                            gsap.to(el, {
-                                                x: magnetX,
-                                                y: magnetY,
-                                                duration: 0.3,
-                                                ease: 'power2.out'
-                                            });
-                                        }
-                                    };
-
-                                    const handleMouseLeave = () => {
-                                        if (shouldDisableAnimations) return;
-
-                                        if (enableTilt) {
-                                            gsap.to(el, {
-                                                rotateX: 0,
-                                                rotateY: 0,
-                                                duration: 0.3,
-                                                ease: 'power2.out'
-                                            });
-                                        }
-
-                                        if (enableMagnetism) {
-                                            gsap.to(el, {
-                                                x: 0,
-                                                y: 0,
-                                                duration: 0.3,
-                                                ease: 'power2.out'
-                                            });
-                                        }
-                                    };
-
-                                    const handleClick = (e: MouseEvent) => {
-                                        if (!clickEffect || shouldDisableAnimations) return;
-
-                                        const rect = el.getBoundingClientRect();
-                                        const x = e.clientX - rect.left;
-                                        const y = e.clientY - rect.top;
-
-                                        const maxDistance = Math.max(
-                                            Math.hypot(x, y),
-                                            Math.hypot(x - rect.width, y),
-                                            Math.hypot(x, y - rect.height),
-                                            Math.hypot(x - rect.width, y - rect.height)
-                                        );
-
-                                        const ripple = document.createElement('div');
-                                        ripple.style.cssText = `
-                      position: absolute;
-                      width: ${maxDistance * 2}px;
-                      height: ${maxDistance * 2}px;
-                      border-radius: 50%;
-                      background: radial-gradient(circle, rgba(${glowColor}, 0.4) 0%, rgba(${glowColor}, 0.2) 30%, transparent 70%);
-                      left: ${x - maxDistance}px;
-                      top: ${y - maxDistance}px;
-                      pointer-events: none;
-                      z-index: 1000;
-                    `;
-
-                                        el.appendChild(ripple);
-
-                                        gsap.fromTo(
-                                            ripple,
-                                            {
-                                                scale: 0,
-                                                opacity: 1
-                                            },
-                                            {
-                                                scale: 1,
-                                                opacity: 0,
-                                                duration: 0.8,
-                                                ease: 'power2.out',
-                                                onComplete: () => ripple.remove()
-                                            }
-                                        );
-                                    };
-
-                                    el.addEventListener('mousemove', handleMouseMove);
-                                    el.addEventListener('mouseleave', handleMouseLeave);
-                                    el.addEventListener('click', handleClick);
-                                }}
-                            >
-                                {content}
-                            </div>
-                        );
-                    })}
-                </div>
-            </BentoCardGrid>
-        </>
-    );
-};
-
-export default MagicBento;
Index: ontend/src/assets/animations/Silk.tsx
===================================================================
--- frontend/src/assets/animations/Silk.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,171 +1,0 @@
-/* eslint-disable react/no-unknown-property */
-import React, {forwardRef, useMemo, useRef, useLayoutEffect} from "react";
-import {Canvas, useFrame, useThree} from "@react-three/fiber";
-import {Color, Mesh, ShaderMaterial} from "three";
-
-type NormalizedRGB = [number, number, number];
-
-const hexToNormalizedRGB = (hex: string): NormalizedRGB => {
-    const clean = hex.replace("#", "");
-    const r = parseInt(clean.slice(0, 2), 16) / 255;
-    const g = parseInt(clean.slice(2, 4), 16) / 255;
-    const b = parseInt(clean.slice(4, 6), 16) / 255;
-    return [r, g, b];
-};
-
-interface UniformValue<T = number | Color> {
-    value: T;
-}
-
-interface SilkUniforms {
-    uSpeed: UniformValue<number>;
-    uScale: UniformValue<number>;
-    uNoiseIntensity: UniformValue<number>;
-    uColor: UniformValue<Color>;
-    uRotation: UniformValue<number>;
-    uTime: UniformValue<number>;
-
-    [uniform: string]: { value: any };
-}
-
-const vertexShader = `
-varying vec2 vUv;
-varying vec3 vPosition;
-
-void main() {
-  vPosition = position;
-  vUv = uv;
-  gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
-}
-`;
-
-const fragmentShader = `
-varying vec2 vUv;
-varying vec3 vPosition;
-
-uniform float uTime;
-uniform vec3  uColor;
-uniform float uSpeed;
-uniform float uScale;
-uniform float uRotation;
-uniform float uNoiseIntensity;
-
-const float e = 2.71828182845904523536;
-
-float noise(vec2 texCoord) {
-  float G = e;
-  vec2  r = (G * sin(G * texCoord));
-  return fract(r.x * r.y * (1.0 + texCoord.x));
-}
-
-vec2 rotateUvs(vec2 uv, float angle) {
-  float c = cos(angle);
-  float s = sin(angle);
-  mat2  rot = mat2(c, -s, s, c);
-  return rot * uv;
-}
-
-void main() {
-  float rnd        = noise(gl_FragCoord.xy);
-  vec2  uv         = rotateUvs(vUv * uScale, uRotation);
-  vec2  tex        = uv * uScale;
-  float tOffset    = uSpeed * uTime;
-
-  tex.y += 0.03 * sin(8.0 * tex.x - tOffset);
-
-  float pattern = 0.6 +
-                  0.4 * sin(5.0 * (tex.x + tex.y +
-                                   cos(3.0 * tex.x + 5.0 * tex.y) +
-                                   0.02 * tOffset) +
-                           sin(20.0 * (tex.x + tex.y - 0.1 * tOffset)));
-
-  vec3 base = vec3(0.8); // white
-  vec3 color = mix(base, uColor, pattern); // pattern=0 -> white, pattern=1 -> uColor
-  vec4 col = vec4(color, 1.0) - rnd / 50.0 * uNoiseIntensity;
-  col.a = 1.0;
-  gl_FragColor = col;
-}
-`;
-
-interface SilkPlaneProps {
-    uniforms: SilkUniforms;
-}
-
-const SilkPlane = forwardRef<Mesh, SilkPlaneProps>(function SilkPlane(
-    {uniforms},
-    ref
-) {
-    const {viewport} = useThree();
-
-    useLayoutEffect(() => {
-        const mesh = ref as React.MutableRefObject<Mesh | null>;
-        if (mesh.current) {
-            mesh.current.scale.set(viewport.width, viewport.height, 1);
-        }
-    }, [ref, viewport]);
-
-    useFrame((_state, delta) => {
-        const mesh = ref as React.MutableRefObject<Mesh | null>;
-        if (mesh.current) {
-            const material = mesh.current.material as ShaderMaterial & {
-                uniforms: SilkUniforms;
-            };
-            material.uniforms.uTime.value += 0.1 * delta;
-        }
-    });
-
-    return (
-        <mesh ref={ref}>
-            <planeGeometry args={[1, 1, 1, 1]}/>
-            <shaderMaterial
-                uniforms={uniforms}
-                vertexShader={vertexShader}
-                fragmentShader={fragmentShader}
-            />
-        </mesh>
-    );
-});
-SilkPlane.displayName = "SilkPlane";
-
-export interface SilkProps {
-    speed?: number;
-    scale?: number;
-    color?: string;
-    noiseIntensity?: number;
-    rotation?: number;
-    className?: string;
-}
-
-const Silk: React.FC<SilkProps> = ({
-                                       speed = 5,
-                                       scale = 1,
-                                       color = "#7B7481",
-                                       noiseIntensity = 1.5,
-                                       rotation = 0,
-                                       className = "",
-                                   }) => {
-    const meshRef = useRef<Mesh>(null);
-
-    const uniforms = useMemo<SilkUniforms>(
-        () => ({
-            uSpeed: {value: speed},
-            uScale: {value: scale},
-            uNoiseIntensity: {value: noiseIntensity},
-            uColor: {value: new Color(...hexToNormalizedRGB(color))},
-            uRotation: {value: rotation},
-            uTime: {value: 0},
-        }),
-        [speed, scale, noiseIntensity, color, rotation]
-    );
-
-    return (
-        <div className={className}>
-            <Canvas dpr={[1, 2]} frameloop="always"
-            >
-                <SilkPlane ref={meshRef} uniforms={uniforms}/>
-            </Canvas>
-        </div>
-    );
-};
-
-export default Silk;
Index: ontend/src/assets/animations/SpikeAnimation.tsx
===================================================================
--- frontend/src/assets/animations/SpikeAnimation.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,58 +1,0 @@
-import React from "react";
-
-export function LightBeams({tilt, beamCount, initialHeight, spikeMoveDown}: {
-    tilt: number,
-    beamCount: number,
-    initialHeight: number,
-    spikeMoveDown: number
-}): React.ReactElement {
-    const beams = Array.from({ length: beamCount }, (_, i) => {
-        const spacing = (window.innerWidth + 320) / beamCount; // tighter spacing
-        const x = i * spacing;
-        const width = 10 + Math.random() * 4; // thin but varied
-
-        return (
-            <rect
-                key={i}
-                x={x}
-                y={320 - initialHeight}
-                width={width}
-                height={initialHeight}
-                fill="url(#grad)"
-                transform={`skewX(${tilt})`}
-            >
-                {/*<animate*/}
-                {/*    attributeName="height"*/}
-                {/*    values={`${initialHeight}; ${initialHeight + 60}; ${initialHeight}`}*/}
-                {/*    dur={`${2 + Math.random() * 2}s`}*/}
-                {/*    repeatCount="indefinite"*/}
-                {/*/>*/}
-                <animate
-                    attributeName="y"
-                    values={`${320 - initialHeight}; ${320 - (initialHeight - spikeMoveDown)}; ${320 - initialHeight}`}
-                    dur={`${1 + Math.random() * 2}s`}
-                    repeatCount="indefinite"
-                />
-
-            </rect>
-        );
-    });
-
-    return (
-        <div className="absolute bottom-0 left-0 w-full h-[80vh] overflow-hidden">
-            <svg viewBox="0 0 1440 320" preserveAspectRatio="none" className="w-full h-full">
-                <defs>
-                    <linearGradient id="grad" x1="0%" y1="0%" x2="0%" y2="100%">
-                        <stop offset="0%" stopColor="var(--color-beige)" />
-                        <stop offset="100%" stopColor="var(--color-shifter)" stopOpacity="0.8" />
-                    </linearGradient>
-                    <filter id="blur" x="-20%" y="-20%" width="140%" height="140%">
-                        <feGaussianBlur stdDeviation="10" />
-                    </filter>
-                </defs>
-
-                <g filter="url(#blur)">{beams}</g>
-            </svg>
-        </div>
-    );
-}
Index: ontend/src/assets/icons/Certificate.tsx
===================================================================
--- frontend/src/assets/icons/Certificate.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,23 +1,0 @@
-
-export default function Certificate({className = "w-6 h-6 text-black", strokeWidth = 2}) {
-    return (
-        <svg xmlns="http://www.w3.org/2000/svg"
-             width="24"
-             height="24"
-             viewBox="0 0 24 24"
-             fill="none"
-             stroke="currentColor"
-             stroke-width={strokeWidth}
-             stroke-linecap="round"
-             stroke-linejoin="round"
-             className={`icon icon-tabler icons-tabler-outline icon-tabler-certificate ${className}`}>
-            <path stroke="none" d="M0 0h24v24H0z" fill="none"/>
-            <path d="M15 15m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0"/>
-            <path d="M13 17.5v4.5l2 -1.5l2 1.5v-4.5"/>
-            <path d="M10 19h-5a2 2 0 0 1 -2 -2v-10c0 -1.1 .9 -2 2 -2h14a2 2 0 0 1 2 2v10a2 2 0 0 1 -1 1.73"/>
-            <path d="M6 9l12 0"/>
-            <path d="M6 12l3 0"/>
-            <path d="M6 15l2 0"/>
-        </svg>
-    )
-}
Index: ontend/src/assets/icons/HeartFill.tsx
===================================================================
--- frontend/src/assets/icons/HeartFill.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,13 +1,0 @@
-export default function HeartFill({className = "w-6 h-6 text-black"}) {
-    return (
-        <svg xmlns="http://www.w3.org/2000/svg"
-             viewBox="0 0 24 24"
-             fill="currentColor"
-             className={className}
-        >
-            <path stroke="none" d="M0 0h24v24H0z" fill="none"/>
-            <path
-                d="M6.979 3.074a6 6 0 0 1 4.988 1.425l.037 .033l.034 -.03a6 6 0 0 1 4.733 -1.44l.246 .036a6 6 0 0 1 3.364 10.008l-.18 .185l-.048 .041l-7.45 7.379a1 1 0 0 1 -1.313 .082l-.094 -.082l-7.493 -7.422a6 6 0 0 1 3.176 -10.215z"/>
-        </svg>
-    )
-}
Index: ontend/src/assets/icons/HeartOutline.tsx
===================================================================
--- frontend/src/assets/icons/HeartOutline.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,15 +1,0 @@
-export default function HeartOutline({className = "w-6 h-6 text-black", strokeWidth = 2}) {
-    return (
-        <svg xmlns="http://www.w3.org/2000/svg"
-             viewBox="0 0 24 24"
-             fill="none"
-             className={className}
-             stroke="currentColor"
-             strokeWidth={strokeWidth}
-             strokeLinecap="round" strokeLinejoin="round"
-        >
-            <path stroke="none" d="M0 0h24v24H0z" fill="none"/>
-            <path d="M19.5 12.572l-7.5 7.428l-7.5 -7.428a5 5 0 1 1 7.5 -6.566a5 5 0 1 1 7.5 6.572"/>
-        </svg>
-)
-}
Index: ontend/src/assets/icons/Instagram.tsx
===================================================================
--- frontend/src/assets/icons/Instagram.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,12 +1,0 @@
-export default function Instagram({ className = "w-6 h-6 text-black" }) {
-    return (
-        <svg
-            xmlns="http://www.w3.org/2000/svg"
-            viewBox="0 0 24 24"     // Reset full view
-            fill="currentColor"
-            className={className}
-        >
-            <path d="M7 2h10a5 5 0 0 1 5 5v10a5 5 0 0 1-5 5H7a5 5 0 0 1-5-5V7a5 5 0 0 1 5-5zm5 7a4 4 0 1 0 4 4 4 4 0 0 0-4-4zm4.5-3.5a1.25 1.25 0 1 0 1.25 1.25A1.25 1.25 0 0 0 16.5 5.5z" />
-        </svg>
-    );
-}
Index: ontend/src/assets/icons/LinkedIn.tsx
===================================================================
--- frontend/src/assets/icons/LinkedIn.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,12 +1,0 @@
-export default function LinkedIn({className = "w-6 h-6 text-black"}) {
-    return (
-        <svg xmlns="http://www.w3.org/2000/svg"
-             viewBox="0 0 24 24"
-             fill="currentColor"
-             className={className}>
-            <path stroke="none" d="M0 0h24v24H0z" fill="none"/>
-            <path
-                d="M17 2a5 5 0 0 1 5 5v10a5 5 0 0 1 -5 5h-10a5 5 0 0 1 -5 -5v-10a5 5 0 0 1 5 -5zm-9 8a1 1 0 0 0 -1 1v5a1 1 0 0 0 2 0v-5a1 1 0 0 0 -1 -1m6 0a3 3 0 0 0 -1.168 .236l-.125 .057a1 1 0 0 0 -1.707 .707v5a1 1 0 0 0 2 0v-3a1 1 0 0 1 2 0v3a1 1 0 0 0 2 0v-3a3 3 0 0 0 -3 -3m-6 -3a1 1 0 0 0 -.993 .883l-.007 .127a1 1 0 0 0 1.993 .117l.007 -.127a1 1 0 0 0 -1 -1"/>
-        </svg>
-    )
-}
Index: ontend/src/assets/icons/StarFilled.tsx
===================================================================
--- frontend/src/assets/icons/StarFilled.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,18 +1,0 @@
-export default function StarFilled({className = "w-6 h-6 text-black", strokeWidth = 2}) {
-    return (
-        <svg
-            xmlns="http://www.w3.org/2000/svg"
-            viewBox="0 0 24 24"
-            className={className}
-            fill="currentColor"
-            stroke="currentColor"
-            strokeWidth={strokeWidth}
-            strokeLinecap="round"
-            strokeLinejoin="round"
-        >
-            <path fillRule="evenodd"
-                  d="M10.788 3.21c.448-1.077 1.976-1.077 2.424 0l2.082 5.006 5.404.434c1.164.093 1.636 1.545.749 2.305l-4.117 3.527 1.257 5.273c.271 1.136-.964 2.033-1.96 1.425L12 18.354 7.373 21.18c-.996.608-2.231-.29-1.96-1.425l1.257-5.273-4.117-3.527c-.887-.76-.415-2.212.749-2.305l5.404-.434 2.082-5.005Z"
-                  clipRule="evenodd"/>
-        </svg>
-    )
-}
Index: ontend/src/assets/icons/StarOutline.tsx
===================================================================
--- frontend/src/assets/icons/StarOutline.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,17 +1,0 @@
-export default function StarFilled({className = "w-6 h-6 text-black", strokeWidth = 2}) {
-    return (
-        <svg
-            xmlns="http://www.w3.org/2000/svg"
-            viewBox="0 0 24 24"
-            fill="none"
-            className={className}
-            stroke="currentColor"
-            strokeWidth={strokeWidth}
-            strokeLinecap="round" strokeLinejoin="round"
-        >
-            <path fillRule="evenodd"
-                  d="M10.788 3.21c.448-1.077 1.976-1.077 2.424 0l2.082 5.006 5.404.434c1.164.093 1.636 1.545.749 2.305l-4.117 3.527 1.257 5.273c.271 1.136-.964 2.033-1.96 1.425L12 18.354 7.373 21.18c-.996.608-2.231-.29-1.96-1.425l1.257-5.273-4.117-3.527c-.887-.76-.415-2.212.749-2.305l5.404-.434 2.082-5.005Z"
-                  clipRule="evenodd"/>
-        </svg>
-    )
-}
Index: ontend/src/assets/icons/UserCircle.tsx
===================================================================
--- frontend/src/assets/icons/UserCircle.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,11 +1,0 @@
-export default function UserCircle({className = "s", strokeWidth = 1.5}) {
-    return (
-        <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" strokeWidth={strokeWidth}
-             stroke="currentColor"
-             className={className}>
-            <path strokeLinecap="round" strokeLinejoin="round"
-                  d="M17.982 18.725A7.488 7.488 0 0 0 12 15.75a7.488 7.488 0 0 0-5.982 2.975m11.963 0a9 9 0 1 0-11.963 0m11.963 0A8.966 8.966 0 0 1 12 21a8.966 8.966 0 0 1-5.982-2.275M15 9.75a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z"/>
-        </svg>
-
-    );
-}
Index: ontend/src/components/CollaborationSteps.tsx
===================================================================
--- frontend/src/components/CollaborationSteps.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,89 +1,0 @@
-import { useAuthContext } from "../context/AuthContext.tsx";
-import { Link } from "react-router-dom";
-import { useTranslation } from "react-i18next";
-
-export default function CollaborationSteps() {
-    const { user } = useAuthContext();
-    const { t } = useTranslation("home");
-
-    const steps = [
-        {
-            number: '01',
-            title: user?.hasUsedFreeConsultation
-                ? t("collaborationSteps.step1.afterConsultation.title")
-                : t("collaborationSteps.step1.beforeConsultation.title"),
-            description: user?.hasUsedFreeConsultation
-                ? t("collaborationSteps.step1.afterConsultation.description")
-                : t("collaborationSteps.step1.beforeConsultation.description"),
-        },
-        {
-            number: '02',
-            title: t("collaborationSteps.step2.title"),
-            description: t("collaborationSteps.step2.description"),
-        },
-        {
-            number: '03',
-            title: t("collaborationSteps.step3.title"),
-            description: t("collaborationSteps.step3.description"),
-        },
-        {
-            number: '04',
-            title: t("collaborationSteps.step4.title"),
-            description: t("collaborationSteps.step4.description"),
-        },
-    ];
-
-    return (
-        <section className="relative bg-shifter text-white py-vertical-xl px-horizontal-md flex flex-col gap-between-md items-center">
-            {/* Gradients */}
-            <div className="absolute bottom-0 w-full h-[32%]" style={{
-                background: "linear-gradient(to bottom, rgba(248,246,245,0) 0%, rgba(248,246,245,0.1) 20%, rgba(248,246,245,0.9) 80%, rgba(248,246,245,1) 100%)",
-                pointerEvents: "none",
-            }} />
-            <div className="absolute top-0 w-full h-[32%]" style={{
-                background: "linear-gradient(to top, rgba(248,246,245,0) 0%, rgba(248,246,245,0.1) 20%, rgba(248,246,245,0.9) 80%, rgba(248,246,245,1) 100%)",
-                pointerEvents: "none",
-            }} />
-
-            <h2 className="text-5xl font-light z-1" dangerouslySetInnerHTML={{ __html: t("collaborationSteps.heading") }} />
-
-            <div className="relative flex w-full mt-4">
-                {/* LINE AND DOTS */}
-                <div className="absolute w-[104%] top-1/2 -translate-y-1/2 left-1/2 -translate-x-1/2 -rotate-16">
-                    <hr className="border-t-4 border-white rounded-full w-full absolute top-2" />
-                    {[-0.2, 25, 50, 75, 99.8].map((percent, idx) => (
-                        <div
-                            key={idx}
-                            className="absolute w-5 h-5 bg-white rounded-full z-20 border-2 border-black/20 top-0"
-                            style={{ left: `${percent}%`, transform: 'translateX(-50%)' }}
-                        />
-                    ))}
-                </div>
-
-                {steps.map((step, i) => (
-                    <section
-                        key={i}
-                        className={`flex flex-col items-center gap-2 justify-between w-1/4 px-4 
-                                border-l-2 ${i === 3 ? 'border-r-2' : ''} ${i < 2 ? 'pb-60' : 'pt-60'} border-white/60`}
-                    >
-                        <strong className="text-4xl font-bold text-white/60">{step.number}</strong>
-                        <div className="flex flex-col justify-start h-full gap-2">
-                            <div className="flex justify-center items-center min-h-[3.5rem]">
-                                <h3 className="text-2xl font-semibold text-center line-clamp-2">{step.title}</h3>
-                            </div>
-                            <p className="font-light text-white/70">{step.description}</p>
-                        </div>
-                    </section>
-                ))}
-            </div>
-
-            <Link
-                to={user?.hasUsedFreeConsultation ? "/contact" : "/free-consultation"}
-                className="z-1 hover:shadow-white/60 transition-all duration-200 ease-in-out cursor-pointer
-                w-3/10 whitespace-nowrap py-2 bg-white text-xl text-black-text rounded-md font-semibold
-                shadow-md shadow-white/40 border-2 border-shifter/20">
-                {t("collaborationSteps.button")}
-            </Link>
-        </section>
-    );
-}
Index: ontend/src/components/CourseCard.tsx
===================================================================
--- frontend/src/components/CourseCard.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,163 +1,0 @@
-import React from "react";
-import StarFilled from "../assets/icons/StarFilled.tsx";
-import {hexToRgb} from "../utils/hexToRGB.ts";
-import {slugify} from "../utils/slug.ts";
-import {Link, useNavigate} from "react-router-dom";
-import type {CoursePreview} from "../models/javaObjects/CoursePreview.tsx";
-import HeartOutline from "../assets/icons/HeartOutline.tsx";
-import HeartFill from "../assets/icons/HeartFill.tsx";
-import {useAuthContext} from "../context/AuthContext.tsx";
-import {toggleFavoriteCourseApi} from "../api/userApi.ts";
-import {Sparkle} from "lucide-react";
-
-
-
-function CourseCard({ card }: {card: CoursePreview}) {
-    const { accessToken, user, setUser } = useAuthContext()
-    const [isHoveredButton, setisHoveredButton] = React.useState<boolean>(false);
-    const [isHoveredHeart, setIsHoveredHeart] = React.useState<boolean>(false);
-    const bgColor = "bg-[var(--card-color)]";
-    const shadowColor = `rgba(${hexToRgb(card.color)}, 0.6)`;
-    const navigate = useNavigate();
-
-    const handleToggleFavoriteCourse = () => {
-        setUser(prevUser => {
-            if (!prevUser) {
-                navigate("/login");
-                // showInfoToast("Please log in to save favorite courses.");
-                return prevUser; // Exit early
-            }
-
-            return {
-                ...prevUser,
-                favoriteCourses: prevUser.favoriteCourses.includes(card.id)
-                    ? prevUser.favoriteCourses.filter((courseId) => courseId !== card.id)
-                    : [...prevUser.favoriteCourses, card.id]
-            };
-        });
-
-        // Only call API if user is logged in
-        if (user) {
-            toggleFavoriteCourseApi(card.id, accessToken || "")
-                .then(() => {
-                    console.log("Course favorite status toggled successfully");
-                })
-                .catch((error) => {
-                    // If the user is not logged in, revert the favorite status change
-                    setUser(prevUser => {
-                        if (!prevUser) return prevUser
-
-                        return {
-                            ...prevUser,
-                            favoriteCourses: prevUser.favoriteCourses.includes(card.id)
-                                ? prevUser.favoriteCourses.filter((courseId) => courseId !== card.id)
-                                : [...prevUser.favoriteCourses, card.id]
-                        };
-                    });
-
-                    console.error("Error toggling javaObjects favorite status:", error);
-                });
-        }
-    };
-
-    return (
-        <article
-            style={{"--card-color": card.color} as React.CSSProperties}
-            className="relative border-1 border-black/10 shadow-md shadow-black/10
-                flex flex-col w-full rounded-xl gap-4 py-4 px-4 bg-[#FFFFFF]">
-
-            {/*IMAGE*/}
-            <div className="overflow-clip rounded-md rounded-br-4xl rounded-tl-4xl">
-                <img src={card.imageUrl} alt={card.title}
-                     className="w-full h-[180px] object-cover"/>
-            </div>
-
-
-            {/*TITLE AND TOPICS LEARNED*/}
-            <div className="flex flex-col gap-2 items-start text-left justify-between h-full">
-                {/*Title*/}
-                <h3 className="font-semibold text-xl">{card.titleShort}</h3>
-
-                {/*Topics covered*/}
-                <p className="text-black/60">{
-                    card.topicsCovered.map(item =>
-                        item
-                            .toLowerCase()
-                            .replace(/_/g, " ")
-                            .replace(/\b\w/g, c => c.toUpperCase())
-                    )
-                        .join(" • ")
-                }</p>
-            </div>
-
-            {/*INFO*/}
-            <div className="flex flex-wrap gap-2 whitespace-nowrap">
-                {
-                    card.rating > 0 ? (
-                        <div className="flex items-center gap-1 px-2 border-1 border-black/20 rounded-sm text-black/60">
-                            <StarFilled className="w-4 h-4 text-gold"/> card.rating
-                        </div>
-                    ) : (
-                        <div className="flex items-center gap-1 px-2 border-1 border-black/20 rounded-sm text-black/60">
-                            <Sparkle className="w-4 h-4 text-gold"/> New
-                        </div>
-                    )
-                }
-                <div className="flex items-center gap-1 px-2 border-1 border-black/20 rounded-sm text-black/60">
-                    {(card.durationMinutes / 60).toFixed(1)} hours
-                </div>
-                <div className="flex items-center gap-1 px-2 border-1 border-black/20 rounded-sm text-black/60">
-                    {card.courseContentCount} modules
-                </div>
-                <div className="flex items-center gap-1 px-2 border-1 border-black/20 rounded-sm text-black/60">
-                    {card.difficulty.charAt(0) + card.difficulty.slice(1).toLowerCase()}
-                </div>
-            </div>
-
-            {/*BUTTON AND PRICE*/}
-            <div className="flex justify-between items-center mt-0">
-                <p className={`font-bold text-black/80 text-lg ${card.price == 0 && "font-normal"}`}>{card.price > 0 ? "$"+card.price : "Free"}</p>
-
-                <div className="flex items-center gap-2">
-                    <button
-                        className="cursor-pointer"
-                        onClick={handleToggleFavoriteCourse}
-                        onMouseEnter={() => setIsHoveredHeart(true)}
-                        onMouseLeave={() => setIsHoveredHeart(false)}
-                    >
-                        {
-                            user?.favoriteCourses.includes(card.id) ?
-                                <HeartFill
-                                    className="w-6 h-auto text-red"
-                                />
-                                :
-                                !isHoveredHeart ?
-                                    <HeartOutline
-                                        strokeWidth={2}
-                                        className="w-6 h-auto text-black/60"/> :
-                                    <HeartFill
-                                        className="w-6 h-auto text-red"
-                                    />
-                        }
-                    </button>
-                    <Link
-                        to={"/courses/" + `${card.id}/` + slugify(card.titleShort)}
-                        style={isHoveredButton ?
-                            {boxShadow: `0 4px 6px -1px ${shadowColor},  0 2px 4px -2px ${shadowColor}`} :
-                            {}
-                        }
-                        className={`transition-all duration-200 ease-in-out cursor-pointer
-                    px-8 py-1 ${bgColor} text-white rounded-md border-3 border-white/40 }`}
-                        onMouseEnter={() => setisHoveredButton(true)}
-                        onMouseLeave={() => setisHoveredButton(false)}
-                    >
-                        Explore
-                    </Link>
-                </div>
-            </div>
-
-        </article>
-    );
-}
-
-export default CourseCard;
Index: ontend/src/components/CourseCardLearnDashboard.tsx
===================================================================
--- frontend/src/components/CourseCardLearnDashboard.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,105 +1,0 @@
-import type {CoursePreviewEnrolled} from "../models/javaObjects/CoursePreviewEnrolled.tsx";
-import {Link} from "react-router-dom";
-import React from "react";
-import {toUrlFormat} from "../utils/toUrlFormat.ts";
-import StarFilled from "../assets/icons/StarFilled.tsx";
-import StarOutline from "../assets/icons/StarOutline.tsx";
-import ModalReviewCourse from "./ModalReviewCourse.tsx";
-import type {CoursePreview} from "../models/javaObjects/CoursePreview.tsx";
-
-function CourseCardLearnDashboard({course, markCourseAsRated}: {
-    course: CoursePreviewEnrolled | CoursePreview;
-    markCourseAsRated: (rating: number) => void;
-}) {
-    const [showReviewModal, setShowReviewModal] = React.useState<boolean>(false);
-
-    return (
-        <aside className="h-full">
-            <Link
-                style={{"--card-color": course.color} as React.CSSProperties}
-                className="hover:shadow-md transition-all duration-300 ease-in-out
-                flex flex-col gap-2 items-center col-span-1 p-2 rounded-md h-full"
-                to={
-                    "rating" in course ?
-                        `/learn/${course.id}/${toUrlFormat(course.titleShort)}` :
-                        `/courses/${course.id}//${toUrlFormat(course.titleShort)}`
-                }>
-
-                {/*IMAGE*/}
-                <div className="overflow-clip rounded-sm">
-                    <img src={course.imageUrl} alt={course.title}
-                         className="aspect-video object-cover"/>
-                </div>
-
-                {/*INFO*/}
-                <div className="flex flex-col gap-2 justify-between flex-1 text-left">
-                    <h3 className="text-md font-bold">{course.titleShort}</h3>
-
-                    <p className="text-black/60 text-sm">{
-                        course.topicsCovered.map(item =>
-                            item
-                                .toLowerCase()
-                                .replace(/_/g, " ")
-                                .replace(/\b\w/g, c => c.toUpperCase())
-                        )
-                            .join(" • ")
-                    }</p>
-                </div>
-
-                {/*PROGRESS BAR*/}
-                {
-                    "lecturesFinishedCount" in course && (
-                        <div className="flex flex-col gap-1 items-start w-full">
-                            <div className="w-full bg-gray-200 rounded-full h-0.5">
-                                <div
-                                    className="h-full rounded-full"
-                                    style={{
-                                        width: `${(course.lecturesFinishedCount / course.courseLectureCount) * 100}%`,
-                                        backgroundColor: course.color,
-                                    }}
-                                />
-                            </div>
-                            <div className="flex justify-between w-full">
-                                <p className="text-xs text-black/60">
-                                    {course.lecturesFinishedCount / course.courseLectureCount * 100}% completed
-                                </p>
-                                {
-                                    course.isFinished && (
-                                        <button
-                                            onClick={(e) => {
-                                                e.preventDefault();
-                                                e.stopPropagation();
-                                                setShowReviewModal(true)
-                                            }}
-                                            className="hover:bg-black/5 px-2 rounded-xs
-                                    flex gap-1 cursor-pointer"
-                                        >
-                                            {[1, 2, 3, 4, 5].map((star) => {
-                                                const courseRating = course.rating;
-                                                const StarIcon = courseRating > 0 && star <= courseRating ? StarFilled : StarOutline;
-                                                return <StarIcon key={star} className="w-2 text-yellow-400"/>;
-                                            })}
-                                        </button>
-                                    )
-                                }
-                            </div>
-                        </div>
-                    )
-                }
-            </Link>
-
-            {
-                "lecturesFinishedCount" in course && showReviewModal && (
-                    <ModalReviewCourse
-                        courseId={course.id}
-                        closeModal={() => setShowReviewModal(false)}
-                        markCourseAsRated={markCourseAsRated}
-                        isUpdate={true}
-                    />
-                )
-            }
-        </aside>
-    )
-}
-
-export default CourseCardLearnDashboard;
Index: ontend/src/components/CourseDetailsInfo.tsx
===================================================================
--- frontend/src/components/CourseDetailsInfo.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,162 +1,0 @@
-import {
-    Check,
-    ChevronDown,
-    ChevronUp,
-    ClipboardList,
-    File,
-    ListChecks,
-    Text,
-    TvMinimalPlay
-} from "lucide-react"
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-expect-error
-import ShifterArrow from "../../public/Shifter-Arrow.png";
-import {useState} from "react";
-import type {CourseDetail} from "../models/javaObjects/CourseDetail.tsx";
-
-function CourseDetailsInfo({ course }: { course: CourseDetail | null}) {
-    const [showMore, setShowMore] = useState(false);
-    const [openIndices, setOpenIndices] = useState<number[]>([]);
-
-    const snippetLength = 800;
-    const description = course?.descriptionLong || "";
-    const shortDescription = description.length > snippetLength
-        ? description.slice(0, snippetLength) + "..."
-        : description;
-
-    const toggleAccordion = (index: number) => {
-        if (openIndices.includes(index)) {
-            setOpenIndices(openIndices.filter(i => i !== index));
-        } else {
-            setOpenIndices([...openIndices, index]);
-        }
-    }
-
-    return (
-        <>
-            {/*WHAT WILL BE LEARNED*/}
-            <section className="relative flex flex-col gap-12 text-left px-horizontal-lg py-vertical-md overflow-clip ">
-                <h2 className="text-5xl font-semibold">What you'll learn</h2>
-                <div className="grid grid-cols-2 gap-y-4 gap-x-20">
-                    {
-                        course?.whatWillBeLearned.map((learning, index) => (
-                            <div className="flex items-center gap-2" key={index}>
-                                <Check size={40} strokeWidth={1} color={"var(--color-shifter)"}/>
-                                <p className="text-xl font-normal">{learning}</p>
-                            </div>
-                        ))
-                    }
-                </div>
-            </section>
-
-            {/*COURSE CONTENT*/}
-            <section
-                className="relative flex flex-col gap-12 text-left px-horizontal-lg py-vertical-md overflow-clip ">
-                <h2 className="text-5xl font-semibold">Course content</h2>
-                <div>
-                    {
-                        course?.courseContents.map((content, index) => {
-                            const isOpen = openIndices.includes(index);
-
-                            return (
-                                <div className={`border-1 border-black/20 ${index !== course?.courseContents.length - 1 ? "border-b-0" : ""}`}>
-                                    <div
-                                        key={index}
-                                        className="overflow-clip flex justify-between items-center px-4 py-4 bg-black/5 cursor-pointer"
-                                        onClick={() => toggleAccordion(index)}
-                                    >
-                                        <div className="flex gap-4 items-center">
-                                            <ChevronDown size={32} strokeWidth={1}
-                                                         className={`text-black ${isOpen ? "rotate-180" : "rotate-0"} transition-all duration-500 ease-in-out `}
-                                            />
-                                            <h3 className="text-2xl font-medium">{content.title}</h3>
-                                        </div>
-
-                                        <div className="flex gap-2 items-center text-black/80">
-                                            <span>{content.courseLectures.length} lectures</span>
-                                            <span>•</span>
-                                            <span>{Math.round(content.courseLectures.reduce((sum, lecture) => sum + lecture.durationMinutes, 0))}min</span>
-                                        </div>
-                                    </div>
-
-                                    { isOpen &&
-                                        (
-                                            <div className="border-t-1 border-black/20 py-4 text-black">
-                                                {content.courseLectures.map((lecture, lectureIndex) => {
-                                                    return (
-                                                        <div
-                                                            key={lectureIndex}
-                                                            className="flex justify-between px-6 py-2">
-                                                            <div className="flex items-start gap-2">
-                                                                {lecture.contentType === "VIDEO" && <TvMinimalPlay size={20} strokeWidth={1.5} className="shrink-0"/>}
-                                                                {lecture.contentType === "TEXT" && <Text size={20} strokeWidth={1.5} className="shrink-0"/>}
-                                                                {lecture.contentType === "FILE" && <File size={20} strokeWidth={1.5} className="shrink-0" />}
-                                                                {lecture.contentType === "QUIZ" && <ListChecks size={20} strokeWidth={1.5} className="shrink-0"/>}
-                                                                {lecture.contentType === "TOOL" && <ClipboardList size={20} strokeWidth={1.5} className="shrink-0"/>}
-
-                                                                <div className="flex flex-col gap-2">
-                                                                    <h4 className="font-medium">{lecture.title}</h4>
-                                                                    <p className="font-light opacity-80">{lecture.description}</p>
-                                                                </div>
-                                                            </div>
-                                                            <span>{lecture.durationMinutes}min</span>
-                                                        </div>
-                                                    )
-                                                })}
-                                            </div>
-                                        )
-                                    }
-                                </div>
-                            )
-                        })
-                    }
-                </div>
-            </section>
-
-            {/*DESCRIPTION*/}
-            <section className="flex flex-col gap-12 text-left px-horizontal-lg py-vertical-md">
-                <h2 className="text-5xl font-semibold">Course description</h2>
-
-                <div>
-                    <div className="relative overflow-hidden">
-                        <p className="text-lg leading-loose whitespace-pre-line">
-                            {showMore ? description : shortDescription}
-                        </p>
-
-                        {/* Show the fade overlay only when text is truncated */}
-                        {!showMore && (
-                            <div
-                                className="pointer-events-none absolute bottom-0 left-0 w-full h-24
-                   bg-gradient-to-t from-white to-transparent"
-                            />
-                        )}
-                    </div>
-                    {description.length > snippetLength && (
-                        <button
-                            onClick={() => setShowMore(!showMore)}
-                            className="mt-4 underline decoration-current cursor-pointer font-bold text-shifter flex items-center
-                 gap-2 px-4 py-2 rounded-sm hover:bg-shifter/20 self-start"
-                            aria-label={showMore ? "Show less description" : "Show more description"}
-                        >
-                            {showMore ? (
-                                <>
-                                    Show less
-                                    <ChevronDown/>
-                                </>
-                            ) : (
-                                <>
-                                    Show more
-                                    <ChevronUp/>
-                                </>
-                            )}
-                        </button>
-                    )}
-                </div>
-
-            </section>
-
-        </>
-    )
-}
-
-export default CourseDetailsInfo;
Index: ontend/src/components/CoursesCarouselCourseDetails.tsx
===================================================================
--- frontend/src/components/CoursesCarouselCourseDetails.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,111 +1,0 @@
-import {useCourseStorage} from "../context/CourseStorage.ts";
-import Slider from "react-slick";
-import CourseCard from "./CourseCard.tsx";
-import {useAuthContext} from "../context/AuthContext.tsx";
-import {useEffect} from "react";
-import {fetchRecommendedCoursesApi} from "../api/courseApi.ts";
-import CourseCardSkeleton from "./skeletons/CourseCardSkeleton.tsx";
-
-function CoursesCarouselCourseDetails({courseId}: {
-    courseId: number;
-}) {
-    const {recommendedCourses, setRecommendedCourses} = useCourseStorage();
-    const {accessToken} = useAuthContext();
-
-    useEffect(() => {
-        const fetchRecommendedCourses = async () => {
-            const stored = sessionStorage.getItem("recommendedCourses");
-            if (stored) {
-                setRecommendedCourses(JSON.parse(stored));
-                return;
-            }
-
-            fetchRecommendedCoursesApi(accessToken || "")
-                .then(data => {
-                    setRecommendedCourses(data);
-                    sessionStorage.setItem("recommendedCourses", JSON.stringify(data));
-                })
-                .catch(err => {
-                    console.error("Error fetching recommended courses:", err);
-                });
-        }
-
-        if (!recommendedCourses) {
-            fetchRecommendedCourses();
-        }
-    }, []);
-
-    return (
-        <section className="flex flex-col gap-12 text-left px-horizontal-lg py-vertical-md">
-            <h2 className="text-5xl font-semibold">People also bought</h2>
-
-            <div className="relative mx-0 my-auto w-full p-0">
-                {
-                    recommendedCourses && recommendedCourses.filter(course => course.id !== courseId).length > 0 ? (
-                        recommendedCourses.filter(course => course.id !== courseId).length <= 3 ? (
-                            <div className="flex gap-4 justify-center items-center">
-                                {recommendedCourses
-                                    .filter(course => course.id !== courseId)
-                                    .map((course, index) => (
-                                    <div key={index} className="max-w-1/3">
-                                        <CourseCard card={course} key={index}/>
-                                    </div>
-                                ))}
-                            </div>
-                        ) : (
-                            <Slider {...settings}>
-                                {recommendedCourses
-                                    .filter(course => course.id !== courseId)
-                                    .map((course, index) => (
-                                    <div key={index}>
-                                        <CourseCard card={course}/>
-                                    </div>
-                                ))}
-                            </Slider>
-                        )
-                    ) : (
-                        <Slider {...settings}>
-                            {[...Array(4)].map((_, index) => (
-                                <div key={index}>
-                                    <CourseCardSkeleton/>
-                                </div>
-                            ))}
-                        </Slider>
-                    )}
-            </div>
-        </section>
-    )
-}
-
-
-const settings = {
-    dots: false,
-    infinite: true,
-    speed: 500,
-    slidesToShow: 3,
-    slidesToScroll: 1,
-    centerMode: true,
-    centerPadding: '0',
-    cssEase: 'cubic-bezier(0.4, 0, 0.2, 1)',
-    responsive: [
-        {
-            breakpoint: 1024,
-            settings: {
-                slidesToShow: 1,
-                slidesToScroll: 1,
-                infinite: true,
-                dots: false
-            }
-        },
-        {
-            breakpoint: 600,
-            settings: {
-                slidesToShow: 1,
-                slidesToScroll: 1,
-                initialSlide: 1
-            }
-        }
-    ]
-};
-
-export default CoursesCarouselCourseDetails;
Index: ontend/src/components/CoursesCarouselHome.tsx
===================================================================
--- frontend/src/components/CoursesCarouselHome.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,96 +1,0 @@
-import Slider from 'react-slick';
-import CourseCard from "./CourseCard.tsx";
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-expect-error
-import 'slick-carousel/slick/slick.css';
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-expect-error
-import 'slick-carousel/slick/slick-theme.css';
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-expect-error
-import "../slick-custom.css";
-
-import { useCourseStorage } from "../context/CourseStorage.ts";
-import CourseCardSkeleton from "./skeletons/CourseCardSkeleton.tsx";
-import { useTranslation } from "react-i18next";
-
-function CoursesCarouselHome() {
-    const { recommendedCourses } = useCourseStorage();
-    const { t } = useTranslation("home");
-
-    return (
-        <section
-            className="relative flex flex-col items-center gap-between-md py-vertical-lg px-horizontal-lg overflow-clip">
-
-            {/* TEXT */}
-            <div className="text-center flex flex-col gap-4 text-black-text">
-                <h2 className="text-5xl font-semibold whitespace-nowrap" dangerouslySetInnerHTML={{ __html: t("coursesCarousel.heading") }} />
-                <p className="text-xl font-light opacity-80">{t("coursesCarousel.description")}</p>
-            </div>
-
-            {/* SLIDER / CARDS */}
-            <div className="relative mx-0 my-auto w-full p-0">
-                {recommendedCourses && recommendedCourses.length > 0 ? (
-                    recommendedCourses.length <= 3 ? (
-                        <div className="flex gap-12 justify-evenly items-center">
-                            {recommendedCourses.map((course, index) => (
-                                <div key={index} className="max-w-1/3">
-                                    <CourseCard card={course} />
-                                </div>
-                            ))}
-                        </div>
-                    ) : (
-                        <Slider {...settings}>
-                            {recommendedCourses.map((course, index) => (
-                                <div key={index}>
-                                    <CourseCard card={course} />
-                                </div>
-                            ))}
-                        </Slider>
-                    )
-                ) : (
-                    <Slider {...settings}>
-                        {[...Array(4)].map((_, index) => (
-                            <div key={index}>
-                                <CourseCardSkeleton />
-                            </div>
-                        ))}
-                    </Slider>
-                )}
-            </div>
-
-        </section>
-    );
-}
-
-const settings = {
-    dots: false,
-    infinite: true,
-    speed: 500,
-    slidesToShow: 3,
-    slidesToScroll: 1,
-    centerMode: true,
-    centerPadding: '0',
-    cssEase: 'cubic-bezier(0.4, 0, 0.2, 1)',
-    responsive: [
-        {
-            breakpoint: 1024,
-            settings: {
-                slidesToShow: 1,
-                slidesToScroll: 1,
-                infinite: true,
-                dots: false
-            }
-        },
-        {
-            breakpoint: 600,
-            settings: {
-                slidesToShow: 1,
-                slidesToScroll: 1,
-                initialSlide: 1
-            }
-        }
-    ]
-};
-
-export default CoursesCarouselHome;
Index: ontend/src/components/CoursesFilters.tsx
===================================================================
--- frontend/src/components/CoursesFilters.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,216 +1,0 @@
-import React from "react";
-import Checkbox from "@mui/material/Checkbox";
-import {durationToQueryMapper, priceToQueryMapper} from "../utils/mapper.ts";
-import type {FilterParams} from "../models/FilterParams.tsx";
-import {useAuthContext} from "../context/AuthContext.tsx";
-
-function CoursesFilters({filters, setFilters, topics, skills}: {
-    filters: FilterParams,
-    setFilters: React.Dispatch<React.SetStateAction<FilterParams>>,
-    topics: string[] | null,
-    skills: string[] | null,
-}) {
-    const {user} = useAuthContext();
-    const duration = [
-        "< 3h",
-        "3h - 6h",
-        "6h - 10h",
-        "10h + "
-    ]
-    const difficulty = [
-        "BEGINNER",
-        "INTERMEDIATE",
-        "ADVANCED",
-        "EXPERT"
-    ]
-    const price = [
-        "Free",
-        "< $20",
-        "$20 - $50",
-        "$50+",
-    ]
-
-    const handleDifficultyChange = (filter: string) => {
-        setFilters(prevFilters => ({
-            ...prevFilters,
-            difficulty: prevFilters.difficulty?.includes(filter) ?
-                prevFilters.difficulty.filter((v: string) => v !== filter) :
-                [...(prevFilters.difficulty || []), filter]
-        }))
-    }
-
-    const handleTopicChange = (filter: string) => {
-        setFilters(prevFilters => ({
-            ...prevFilters,
-            topic: prevFilters.topic?.includes(filter) ?
-                prevFilters.topic.filter((v: string) => v !== filter) :
-                [...(prevFilters.topic || []), filter]
-        }))
-    }
-
-    const handleSkillChange = (filter: string) => {
-        setFilters(prevFilters => ({
-            ...prevFilters,
-            skill: prevFilters.skill?.includes(filter) ?
-                prevFilters.skill.filter((v: string) => v !== filter) :
-                [...(prevFilters.skill || []), filter]
-        }))
-    }
-
-    const handlePriceChange = (filter: string) => {
-        setFilters(prevFilters => ({
-            ...prevFilters,
-            price: prevFilters.price?.includes(filter) ?
-                prevFilters.price.filter((v: string) => v !== filter) :
-                [...(prevFilters.price || []), filter]
-        }))
-    }
-
-    const handleDurationChange = (filter: string) => {
-        setFilters(prevFilters => ({
-            ...prevFilters,
-            duration: prevFilters.duration?.includes(filter) ?
-                prevFilters.duration.filter((v: string) => v !== filter) :
-                [...(prevFilters.duration || []), filter]
-        }))
-    }
-
-    const handleShowOnlyFavoritesChange = () => {
-        setFilters(prevFilters => ({
-            ...prevFilters,
-            showOnlyFavoriteCourses: !prevFilters.showOnlyFavoriteCourses
-        }));
-    }
-
-    return (
-        <aside
-            className="flex flex-col gap-8 pl-8 pt-12 text-left sticky top-0 h-screen border-r-2 border-black/10">
-            <h2 className="text-2xl font-medium">Filter by</h2>
-            <div className="relative flex flex-col gap-12 pl-4 pr-2 pb-20 overflow-y-scroll scrollable">
-                {
-                    user && (
-                        <FilterSelect
-                            header={"Favorite Courses"}
-                            options={["My favorites"]}
-                            handleFilter={() => {handleShowOnlyFavoritesChange()}}
-                            selectedOptions={filters.showOnlyFavoriteCourses ? ["My favorites"] : []}
-                        />
-                    )
-                }
-                <FilterSelect
-                    header={"Price"}
-                    options={price}
-                    handleFilter={handlePriceChange}
-                    selectedOptions={filters.price || []}
-                    mapper={priceToQueryMapper}
-                />
-                <FilterSelect
-                    header={"Topics"}
-                    options={topics}
-                    handleFilter={handleTopicChange}
-                    selectedOptions={filters.topic || []}
-                />
-                <FilterSelect
-                    header={"Skills"}
-                    options={skills}
-                    handleFilter={handleSkillChange}
-                    selectedOptions={filters.skill || []}
-                />
-                <FilterSelect
-                    header={"Level"}
-                    options={difficulty}
-                    handleFilter={handleDifficultyChange}
-                    selectedOptions={filters.difficulty || []}
-                />
-                <FilterSelect
-                    header={"Duration"}
-                    options={duration}
-                    handleFilter={handleDurationChange}
-                    selectedOptions={filters.duration || []}
-                    mapper={durationToQueryMapper}
-                />
-
-            </div>
-            <div
-                className="pointer-events-none absolute bottom-0 left-0 w-full h-24 bg-gradient-to-t from-white to-transparent"/>
-        </aside>
-    )
-}
-
-function FilterSelect({
-                          header,
-                          options,
-                          handleFilter,
-                          selectedOptions,
-                          mapper,
-                      }: {
-    header: string;
-    options: string[] | null;
-    handleFilter: (value: string) => void;
-    selectedOptions: string[];
-    mapper?: (option: string) => string;
-}) {
-    const [showAll, setShowAll] = React.useState(false);
-    const [searchTerm, setSearchTerm] = React.useState("");
-
-
-    // Filter options based on search term
-    const filteredOptions = options?.filter((option) =>
-        option.toLowerCase().includes(searchTerm.toLowerCase())
-    );
-
-    // Show only first 4 unless showAll is true
-    const visibleOptions = showAll ? filteredOptions : filteredOptions?.slice(0, 4);
-
-    return (
-        <section className="flex flex-col gap-2 text-md">
-            <h3 className="font-medium">{header}</h3>
-            <form className="flex flex-col gap-0">
-                {options && options.length > 4 && (
-                    <input
-                        type="search"
-                        value={searchTerm}
-                        onChange={(e) => setSearchTerm(e.target.value)}
-                        placeholder={`Search ${header
-                            .toLowerCase()
-                            .replace(/_/g, " ")
-                            .replace(/\b\w/g, (c) => c.toUpperCase())}`}
-                        className="hover:bg-shifter/5 hover:border-shifter hover:placeholder-black
-                        px-4 py-2 border-1 border-black/20 rounded-sm focus:outline-none focus:border-shifter mb-2
-                        "/>
-                )}
-                {visibleOptions?.map((option, index) => (
-                    <label key={index} className="flex items-center text-black whitespace-nowrap cursor-pointer w-fit">
-                        <Checkbox
-                            checked={selectedOptions.includes(mapper ? mapper(option) : option)}
-                            onChange={() => handleFilter(mapper ? mapper(option) : option)}
-                            sx={{
-                                color: "var(--color-black)",
-                                padding: 0,
-                                opacity: 0.6,
-                                marginRight: 1,
-                                "& .MuiSvgIcon-root": {fontSize: 28},
-                                "&.Mui-checked": {color: "var(--color-shifter)", opacity: 1},
-                            }}
-                        />
-                        {option
-                            .toLowerCase()
-                            .replace(/_/g, " ")
-                            .replace(/\b\w/g, (c) => c.toUpperCase())}
-                    </label>
-                ))}
-            </form>
-            {filteredOptions && filteredOptions.length > 4 && (
-                <button
-                    type="button"
-                    onClick={() => setShowAll(!showAll)}
-                    className="p-2 rounded-sm w-fit underline cursor-pointer hover:bg-shifter/10 hover:text-shifter"
-                >
-                    {showAll ? "Show less" : `Show ${filteredOptions.length - 4} more`}
-                </button>
-            )}
-        </section>
-    );
-}
-
-export default CoursesFilters;
Index: ontend/src/components/CoursesGrid.tsx
===================================================================
--- frontend/src/components/CoursesGrid.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,162 +1,0 @@
-import type {CoursePreview} from "../models/javaObjects/CoursePreview.tsx";
-import CourseCard from "./CourseCard.tsx";
-import {InputAdornment, TextField} from '@mui/material';
-import {Search} from 'lucide-react';
-import type {FilterParams} from "../models/FilterParams.tsx";
-import React from "react";
-import {X} from 'lucide-react';
-import {queryToDurationMapper, queryToPriceMapper} from "../utils/mapper.ts";
-
-function CoursesGrid({courses, setFilters, filters}: {
-    courses: CoursePreview[] | null,
-    setFilters: React.Dispatch<React.SetStateAction<FilterParams>>,
-    filters: FilterParams,
-}) {
-    const [searchText, setSearchText] = React.useState<string>("");
-    const filterPillClassName = "group hover:border-shifter hover:bg-shifter/10 hover:text-shifter " +
-        "flex items-center gap-1 border-1 border-black/40 rounded-full px-4 py-1 text-black/80 font-medium cursor-pointer"
-    const filterXClassName = "group-hover:text-shifter text-black/60"
-
-    const handleSearchFilter = (e: React.FormEvent<HTMLFormElement>) => {
-        e.preventDefault()
-
-        setFilters(prevFilters => ({
-            ...prevFilters,
-            search: prevFilters.search?.includes(searchText) ?
-                prevFilters.search.filter((v: string) => v !== searchText) :
-                [...(prevFilters.search || []), searchText]
-        }));
-
-        setSearchText("");
-    }
-
-
-    return (
-        <section className="flex flex-col gap-8 py-6 pb-12 w-full">
-
-            {/*SEARCH AND SORT BY*/}
-            <div className="flex justify-between items-center w-full px-12">
-                {/*Filters*/}
-                <div className="flex gap-2 flex-wrap items-center justify-start">
-                    {
-                        Object.entries(filters).map(([key, values]) => {
-                            // Favorite courses filter
-                            if (key === "showOnlyFavoriteCourses") {
-                                const boolValue = values as boolean;
-                                if (!boolValue) return null;
-                                return (
-                                    <button
-                                        onClick={() => setFilters(prev => ({
-                                            ...prev,
-                                            showOnlyFavoriteCourses: false
-                                        }))}
-                                        className={filterPillClassName}
-                                    >
-                                        My Favorites
-                                        <X size={20} className={filterXClassName}/>
-                                    </button>
-                                )
-                            }
-
-                            // Array-type filters (topics, skills, difficulties, etc.)
-                            return values.map((element: string, idx: number) => (
-                                <button
-                                    key={`${key}-${idx}`}
-                                    onClick={() => {
-                                        const updatedArray = values.filter((_: string, i: number) => i !== idx);
-                                        const typedKey = key as Exclude<keyof FilterParams, "search">;
-
-                                        setFilters(prev => {
-                                            const newParams = {...prev};
-                                            if (updatedArray.length === 0) {
-                                                delete newParams[typedKey]; // remove key if empty array
-                                            } else {
-                                                newParams[typedKey] = updatedArray; // otherwise set updated array
-                                            }
-                                            return newParams;
-                                        });
-                                    }}
-                                    className={filterPillClassName}
-                                >
-                                    {
-                                        key === "price" ?
-                                            queryToPriceMapper(element)
-                                                .replace(/_/g, " ")
-                                                .toLowerCase()
-                                                .replace(/\b\w/g, c => c.toUpperCase()) :
-                                            key === "duration" ?
-                                                queryToDurationMapper(element)
-                                                    .replace(/_/g, " ")
-                                                    .toLowerCase()
-                                                    .replace(/\b\w/g, c => c.toUpperCase()) :
-                                                element
-                                                    .replace(/_/g, " ")
-                                                    .toLowerCase()
-                                                    .replace(/\b\w/g, c => c.toUpperCase())
-                                    }
-                                    <X size={20} className={filterXClassName}/>
-                                </button>
-                            ));
-                        })
-                    }
-                </div>
-
-                {/*Search*/}
-                <form
-                    onSubmit={handleSearchFilter}
-                    className="flex justify-between w-fit">
-                    <TextField
-                        size="small"
-                        type="search"
-                        placeholder="Search..."
-                        variant="outlined"
-                        value={searchText}
-                        onChange={e => setSearchText(e.target.value)}
-                        fullWidth
-                        InputProps={{
-                            startAdornment: (
-                                <InputAdornment position="start">
-                                    <Search size={20}/>
-                                </InputAdornment>
-                            )
-                        }}
-                        sx={{
-                            "& .MuiOutlinedInput-root": {
-                                "& fieldset": {
-                                    borderColor: "gray",
-                                },
-                                "&:hover fieldset": {
-                                    borderColor: "black",
-                                },
-                                "&.Mui-focused fieldset": {
-                                    borderColor: "var(--color-shifter)",
-                                },
-                            },
-                        }}
-                    />
-                    <button
-                        type={"submit"}
-                        className="hover:shadow-sm hover:shadow-shifter transition-all duration-200 ease-in-out
-                        ml-4 px-8 bg-shifter text-white rounded-sm border-2 border-white/40 cursor-pointer
-                    ">Discover
-                    </button>
-                </form>
-            </div>
-
-            {/*COURSES GRID*/}
-            <div className="relative grid grid-cols-3 gap-x-4 gap-y-4 w-full h-fit px-12">
-                {
-                    courses && courses?.length > 0 ?
-                        courses.map((course, index) => {
-                            return (
-                                <CourseCard card={course} key={index}/>
-                            )
-                        }) :
-                        <span className="text-3xl font-normal text-black/60 pl-20 py-8 text-left col-span-full">No results found</span>
-                }
-            </div>
-        </section>
-    )
-}
-
-export default CoursesGrid;
Index: ontend/src/components/GoogleLoginButton.tsx
===================================================================
--- frontend/src/components/GoogleLoginButton.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,22 +1,0 @@
-
-export default function GoogleLoginButton({text = "Sign in with Google"}) {
-    const handleLogin = () => {
-        // Redirect to backend OAuth2 login
-        window.location.href = "http://localhost:8080/oauth2/authorization/google";
-    };
-
-    return (
-        <button
-            onClick={handleLogin}
-            className="cursor-pointer flex items-center justify-center w-full max-w-sm px-4 py-2 border
-            border-gray-300 rounded shadow-sm bg-white hover:bg-gray-100 transition duration-200"
-        >
-            <img
-                src="https://upload.wikimedia.org/wikipedia/commons/c/c1/Google_%22G%22_logo.svg"
-                alt="Google logo"
-                className="w-6 h-6 mr-3"
-            />
-            <span className="text-gray-700 font-medium">{text}</span>
-        </button>
-    );
-}
Index: ontend/src/components/HeroAbout.tsx
===================================================================
--- frontend/src/components/HeroAbout.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,52 +1,0 @@
-import { ArrowRight } from "lucide-react";
-import { Link } from "react-router-dom";
-import CountUp from "react-countup";
-
-function HeroAbout() {
-    return (
-        <section className="grid grid-cols-2 gap-x-20 px-horizontal-md py-vertical-lg pt-top-nav-md rounded-3xl bg-dark-blue/5
-                shadow-md shadow-black/20">
-
-            <div className="col-start-1 col-span-1 flex flex-col text-left gap-12
-                text-black-text">
-                <div className="flex flex-col gap-4 w-full">
-                    <h1 className=" text-5xl font-medium">About <span className="text-shifter font-black">Shifter</span></h1>
-                    <p>
-                        Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the
-                        industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type
-                        and scrambled it to make a type specimen book. It has survived not only five centuries, but also the
-                        leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s
-                        with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop
-                        publishing software like Aldus PageMaker including versions of Lorem Ipsum.
-                    </p>
-                    <Link to={"/free-consultation"}
-                        className="flex gap-4 items-center text-white bg-shifter px-8 py-2 w-fit rounded-sm">
-                        Schedule a Free Consultation
-                        <ArrowRight size={20} strokeWidth={1.5} />
-                    </Link>
-                </div>
-
-                <hr className="border-t-2 border-black/20 w-full" />
-
-                <div className="flex justify-between w-full">
-                    <div>
-                        <h2 className="text-4xl font-bold"><CountUp start={0} end={250} duration={4} separator={"."}  />+</h2>
-                        <p className="font-light whitespace-nowrap">Clients Empowered</p>
-                    </div>
-                    <div>
-                        <h2 className="text-4xl font-bold"><CountUp start={0} end={2000} duration={4} separator={"."}  />+</h2>
-                        <p className="font-light whitespace-nowrap">Mentoring Hours</p>
-                    </div>
-                    <div>
-                        <h2 className="text-4xl font-bold"><CountUp start={0} end={4} duration={4} separator={"."}  />+</h2>
-                        <p className="font-light whitespace-nowrap">Years of Shifter</p>
-                    </div>
-                </div>
-            </div>
-
-            <div className="col-start-2 col-span-1 h-full bg-black/20 rounded-2xl"/>
-        </section>
-    )
-}
-
-export default HeroAbout;
Index: ontend/src/components/HeroCourseDetails.tsx
===================================================================
--- frontend/src/components/HeroCourseDetails.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,111 +1,0 @@
-import type {CourseDetail} from "../models/javaObjects/CourseDetail.tsx";
-import React from "react";
-import {useCourseStorage} from "../context/CourseStorage.ts";
-import { Link } from "react-router-dom";
-import {toUrlFormat} from "../utils/toUrlFormat.ts";
-
-function HeroCourseDetails({course, enrollUser}: { course: CourseDetail | null, enrollUser: () => Promise<void> }) {
-    const [isLoading, setIsLoading] = React.useState<boolean>(false);
-    const {enrollments} = useCourseStorage();
-    const tripleInfo = [
-        {
-            header: `${course?.courseContents && course.courseContents.length} Modules Total`,
-            description: course?.descriptionShort
-        },
-        {
-            header: `${course?.durationMinutes && (course.durationMinutes / 60).toFixed(1)} Hours Duration`,
-            description: 'Learn at your own pace with flexible timing, plus optional exercises and helpful templates.'
-        },
-        {
-            header: course?.ratingCount && course.ratingCount > 10
-                ? `${(course.rating || 0) / course.ratingCount} Rating`
-                : `New & Trending`,
-            description: course?.ratingCount && course.ratingCount > 10
-                ? 'Rated highly by learners for its practical insights and actionable strategies.'
-                : 'New to the platform, this javaObjects is growing quickly. Be among the first learners to benefit from its insights.'
-        }
-        ,
-    ]
-
-    const bgColor = "bg-[var(--card-color)]";
-
-    return (
-        <div
-            style={{"--card-color": course?.color} as React.CSSProperties}
-            className={`py-4 bg-shifter`}>
-            {/*HEADER AND DESCRIPTION*/}
-            <section
-                className="flex flex-col items-center gap-8 bg-white mx-6 px-horizontal-lg pb-12 pt-40 rounded-xl shadow-lg shadow-black/20 text-black-text">
-                <h1 className="text-5xl font-semibold">{course?.title}</h1>
-                <p>{course?.description}</p>
-                {
-                    enrollments && enrollments.some(enrollment => enrollment.courseId === course?.id) ?
-                        <div
-                            className="flex mt-12 gap-4 items-center bg-gray/60 backdrop-blur-lg border-3 border-black/5 px-2 py-1 w-fit rounded-full">
-
-                            {
-                                isLoading ? (
-                                    <div className="w-8 loader"></div>
-                                ) : (
-                                    <Link
-                                        to={`/learn/${course?.id}/${toUrlFormat(course?.titleShort || "")}`}
-                                        className={`
-                                            bg-shifter
-                                            hover:shadow-lg hover:shadow-deep-green/50 transition-all duration-300 ease-in-out cursor-pointer
-                                            shadow-md shadow-deep-green/30 text-white font-medium text-xl border-3 border-white/50 rounded-full px-14 py-2
-                                        `}
-                                    >Go To Course</Link>
-                                )
-                            }
-                        </div>
-                        :
-                        <div
-                            className="flex mt-12 gap-4 items-center bg-gray/60 backdrop-blur-lg border-3 border-black/5 px-2 py-1 w-fit rounded-full">
-                            <span className="font-semibold text-xl px-8">
-                                {course?.price && course.price > 0 ? `$${course?.price}` : 'Free'}
-                            </span>
-                            {
-                                isLoading ? (
-                                    <div className="w-8 loader"></div>
-                                ) : (
-                                    <button className={`
-                                                bg-shifter
-                                                hover:shadow-lg hover:shadow-deep-green/50 transition-all duration-300 ease-in-out cursor-pointer
-                                                shadow-md shadow-deep-green/30 text-white font-medium text-xl border-3 border-white/50 rounded-full px-14 py-2
-                                            `}
-                                            onClick={() => {
-                                                setIsLoading(true)
-                                                enrollUser()
-                                                    .catch((error) => {
-                                                        console.error("Error enrolling user in javaObjects:", error);
-                                                    })
-                                                    .finally(() => {
-                                                        setIsLoading(false)
-                                                    })
-                                            }}
-                                    >Enroll Now</button>
-                                )
-                            }
-                        </div>
-                }
-            </section>
-
-            {/*TRIPLE INFO*/}
-            <section className="flex text-white px-12 py-4">
-                {
-                    tripleInfo.map((info, index) => (
-                        <div
-                            key={index}
-                            className="w-1/3 flex flex-col gap-4 text-left px-20 py-8 border-r-2 border-white/40 last:border-r-0"
-                        >
-                            <h2 className="text-3xl font-bold">{info.header}</h2>
-                            <p className="text-md font-light opacity-90">{info.description}</p>
-                        </div>
-                    ))
-                }
-            </section>
-        </div>
-    )
-}
-
-export default HeroCourseDetails;
Index: ontend/src/components/HeroHome.tsx
===================================================================
--- frontend/src/components/HeroHome.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,76 +1,0 @@
-
-import {Link} from 'react-router-dom';
-import Silk from "../assets/animations/Silk.tsx";
-import CountUp from "react-countup";
-import {useAuthContext} from "../context/AuthContext.tsx";
-import {useTranslation} from "react-i18next";
-
-function HeroHome() {
-    const {user} = useAuthContext()
-    const { t } = useTranslation("home");
-
-    return (
-        <section className="relative ">
-
-            <div className="relative flex flex-col items-center gap-0 rounded-4xl shadow-lg shadow-black/20
-             overflow-clip py-top-nav-lg">
-                <Silk
-                    className="absolute inset-0 opacity-90"
-                    speed={8}
-                    scale={1}
-                    color="#008CC2"
-                    noiseIntensity={1}
-                    rotation={0}
-                />
-
-                <div className="flex flex-col gap-12 justify-center items-center z-1">
-                    <div className="flex flex-col gap-6 items-center justify-center">
-                        <div className="border-1 border-white/40
-                        bg-black/10 rounded-full py-1 px-8 font-medium text-sm text-white shadow-sm">
-                            {t("hero.label")}
-                        </div>
-                        <h1 className="text-7xl font-semibold text-white max-w-3/4">
-                            {t("hero.title")}
-                        </h1>
-                        <p className="text-xl font-light text-white max-w-3/4">
-                            {t("hero.description")}
-                        </p>
-                    </div>
-                    <Link
-                        to={user?.hasUsedFreeConsultation ? "/contact" : "/free-consultation"}
-                        className="hover:shadow-white/60 transition-all duration-200 ease-in-out cursor-pointer
-                        rounded-full text-black/90 px-12 py-3 bg-white font-bold border-2 border-black/20
-                        w-fit shadow-md shadow-white/40">
-                        {user?.hasUsedFreeConsultation ?
-                            t("hero.cta.contact") :
-                            t("hero.cta.freeConsultation")
-                        }
-                    </Link>
-                </div>
-            </div>
-
-            <div className="absolute bottom-0 translate-y-1/2 left-1/2 translate-x-[-50%] border-2 border-black/10
-                 flex justify-between bg-black/40 backdrop-blur-md w-9/10 py-6 px-24 rounded-lg">
-                <div className="text-white">
-                    <h3 className="text-4xl font-bold"><CountUp start={0} end={Number(t("hero.stats.businessesEmpowered.value"))} duration={4} separator={"."}  />+</h3>
-                    <p className="font-light whitespace-nowrap">{t("hero.stats.businessesEmpowered.label")}</p>
-                </div>
-                <div className="text-white">
-                    <h3 className="text-4xl font-bold"><CountUp start={0} end={Number(t("hero.stats.mentoringHours.value"))} duration={4} separator={"."}  />+</h3>
-                    <p className="font-light whitespace-nowrap">{t("hero.stats.mentoringHours.label")}</p>
-                </div>
-                <div className="text-white">
-                    <h3 className="text-4xl font-bold"><CountUp start={0} end={Number(t("hero.stats.yearsOfShifter.value"))} duration={4} separator={"."}  />+</h3>
-                    <p className="font-light whitespace-nowrap">{t("hero.stats.yearsOfShifter.label")}</p>
-                </div>
-                {/*<div className="text-white">*/}
-                {/*    <h3 className="text-4xl font-bold"><CountUp start={0} end={10} duration={4} separator={"."}  />+</h3>*/}
-                {/*    /!*<p className="font-light whitespace-nowrap">Courses & Academies Available</p>*!/*/}
-                {/*    <p className="font-light whitespace-nowrap">Growth Programs Delivered</p>*/}
-                {/*</div>*/}
-            </div>
-        </section>
-    )
-}
-
-export default HeroHome
Index: ontend/src/components/ModalReviewCourse.tsx
===================================================================
--- frontend/src/components/ModalReviewCourse.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,175 +1,0 @@
-import ReactDOM from "react-dom";
-import {X} from "lucide-react";
-import {useEffect, useState} from "react";
-import StarFilled from "../assets/icons/StarFilled";
-import StarOutline from "../assets/icons/StarOutline";
-import {getReviewApi, updateReviewApi, writeReviewApi} from "../api/reviewApi.ts";
-import {useAuthContext} from "../context/AuthContext.tsx";
-import ModalReviewCourseSkeleton from "./skeletons/ModalReviewCourseSkeleton.tsx";
-
-function ModalReviewCourse({
-                               courseId,
-                               closeModal,
-                               markCourseAsRated,
-                               isUpdate
-                           }: {
-    courseId: number;
-    closeModal: () => void;
-    markCourseAsRated: (rating: number) => void;
-    isUpdate: boolean;
-}) {
-    const {accessToken} = useAuthContext();
-    const [review, setReview] = useState({
-        rating: 0,
-        comment: "",
-    });
-    const [hovered, setHovered] = useState<number>(0);
-    const [loading, setLoading] = useState<boolean>(false);
-    const [fetchingReview, setFetchingReview] = useState<boolean>(false);
-    const [error, setError] = useState<string>("");
-
-    useEffect(() => {
-        if (!isUpdate)
-            return;
-
-        setFetchingReview(true);
-        getReviewApi(accessToken || "", courseId)
-            .then(review => {
-                setReview({rating: review.rating, comment: review.comment});
-            })
-            .catch((error) => {
-                console.error("Error fetching review:", error);
-                setError("Failed to load your review. Please try again later.");
-            })
-            .finally(() => {
-                setFetchingReview(false);
-            });
-    }, []);
-
-    const starTexts = [
-        "Select Rating",                    // default placeholder
-        "Poor – did not meet expectations", // 1 star
-        "Fair – could be better",           // 2 stars
-        "Average – okay, but room to improve", // 3 stars
-        "Good – I learned valuable things",    // 4 stars
-        "Excellent – exceeded expectations!"   // 5 stars
-    ];
-
-    const writeReview = () => {
-        if (review.rating === 0) {
-            setError("Please select a rating before submitting.");
-            return;
-        }
-
-        setLoading(true);
-        const apiCall = isUpdate ? updateReviewApi : writeReviewApi;
-        apiCall(
-            accessToken || "",
-            courseId,
-            review.rating,
-            review.comment
-        )
-            .then(() => {
-                markCourseAsRated(review.rating);
-                closeModal();
-            })
-            .catch((error) => {
-                console.error("Error writing review:", error);
-            })
-            .finally(() => {
-                setLoading(false);
-            });
-    }
-
-    if (fetchingReview)
-        return <ModalReviewCourseSkeleton closeModal={closeModal} />
-
-    return ReactDOM.createPortal(
-        <>
-            {/* Overlay */}
-            <div className="fixed inset-0 bg-gray/60 backdrop-blur-sm z-[1000]"/>
-
-            {/* Modal */}
-            <section
-                className="fixed top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2
-                   bg-white shadow-lg py-4 px-6 z-[1000] max-w-1/2 min-w-1/3
-                   max-h-5/6 rounded-lg flex flex-col items-center gap-6
-                   text-black-text"
-            >
-                {/* Close button */}
-                <button
-                    onClick={closeModal}
-                    className="ml-auto flex justify-end cursor-pointer p-2 hover:bg-shifter/20 rounded-sm"
-                >
-                    <X size={24} strokeWidth={1.5}/>
-                </button>
-
-                <h2 className="text-2xl font-bold ">
-                    How Was Your Learning Experience?
-                </h2>
-
-                {/* STARS */}
-                <div className="flex flex-col gap-2 items-center">
-                    <div className="flex gap-4"
-                         onMouseLeave={() => setHovered(0)}
-                    >
-                        {[1, 2, 3, 4, 5].map((star) => {
-                            const filled = hovered ? star <= hovered : star <= review.rating;
-                            const StarIcon = filled ? StarFilled : StarOutline;
-
-                            return (
-                                <div
-                                    key={star}
-                                    onMouseEnter={() => setHovered(star)}
-                                    onClick={() =>
-                                        setReview({...review, rating: star})
-                                    }
-                                    className={`cursor-pointer transition-colors duration-150`}
-                                >
-                                    <StarIcon className="w-8 text-gold"/>
-                                </div>
-                            );
-                        })}
-                    </div>
-
-                    <span className="text-md">
-                        {hovered ? starTexts[hovered] : starTexts[review.rating]}
-                    </span>
-                </div>
-
-                <div className="w-full flex flex-col gap-1">
-                    <textarea
-                        className="focus:outline-none focus:border-shifter resize-none
-                        w-full border border-black/40 rounded-sm px-4 py-2"
-                        onChange={(e) =>
-                            setReview({...review, comment: e.target.value})
-                        }
-                        value={review.comment}
-                        placeholder="Share your thoughts about this course..."
-                        rows={4}
-                    />
-                    <span className="font-normal text-black/60 text-xs"><sup>*</sup>optional</span>
-                </div>
-
-                <div className="flex gap-6 mr-auto">
-                    <button
-                        onClick={writeReview}
-                        type="button"
-                        className="hover:shadow-md hover:shadow-shifter/40 shadow-sm shadow-shifter/20 transition-all duration-300 ease-in-out
-                    border-2 border-white/40 px-12 py-2 bg-shifter text-white cursor-pointer rounded-sm w-fit"
-                    >
-                        {loading ? "Submitting..." : "Submit Review"}
-                    </button>
-                    {loading && <div className="loader h-full"/>}
-                </div>
-
-                {error && (
-                    <p className="text-md text-red">{error}</p>
-                )}
-            </section>
-        </>,
-        document.getElementById("portal")!
-    );
-}
-
-export default ModalReviewCourse;
Index: ontend/src/components/NavbarLink.tsx
===================================================================
--- frontend/src/components/NavbarLink.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,12 +1,0 @@
-import {Link} from "react-router-dom";
-
-const NavbarLink = ({to, label, className, classNameLine}: { to: string; label: string, className?: string; classNameLine?: string; }) => (
-    <div className={`flex flex-col gap-0 overflow-clip group w-fit ${className}`}>
-        <Link to={to} className="transition-all duration-300 ease-in-out z-10">
-            {label}
-        </Link>
-        <hr className={`relative -translate-x-60 group-hover:-translate-x-1/4 border-t-2 rounded-full transition-all duration-300 ease-in-out ${classNameLine}`}/>
-    </div>
-);
-
-export default NavbarLink;
Index: ontend/src/components/OurServices.tsx
===================================================================
--- frontend/src/components/OurServices.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,68 +1,0 @@
-import { ArrowBigUpDash, BookOpen, GraduationCap, Handshake } from "lucide-react";
-import { Link } from "react-router-dom";
-import { useTranslation } from "react-i18next";
-
-function OurServices() {
-    const { t } = useTranslation("home"); // assuming this JSON is in home.json
-
-    const cardContent = [
-        {
-            icon: Handshake,
-            path: "ourServices.cards.0"
-        },
-        {
-            icon: BookOpen,
-            path: "ourServices.cards.1"
-        },
-        {
-            icon: ArrowBigUpDash,
-            path: "ourServices.cards.2"
-        },
-        {
-            icon: GraduationCap,
-            path: "ourServices.cards.3"
-        }
-    ];
-
-    return (
-        <section className="grid grid-cols-3 gap-20 justify-between py-vertical-sm pt-top-nav-lg px-horizontal-md">
-
-            {/* TEXT */}
-            <div className="col-span-1 col-start-1 flex flex-col gap-6 text-black-text text-left w-full">
-                <h2 className="text-5xl font-bold">{t("ourServices.heading")}</h2>
-                <p className="text-xl font-light opacity-80">{t("ourServices.description")}</p>
-            </div>
-
-            {/* CARDS */}
-            <div className="col-span-2 col-start-2 grid grid-cols-2 grid-rows-2 gap-8">
-                {cardContent.map((card, index) => {
-                    const CardIcon = card.icon;
-                    return (
-                        <div
-                            key={index}
-                            className={`shadow-md shadow-black/20
-                            ${index === 0 ? "bg-shifter/100 -rotate-3" : "bg-black/10"}
-                            ${index === 0 ? "text-white" : "text-black-text"}
-                            flex flex-col gap-8 items-start text-left border-2 border-white/40 rounded-2xl p-8`}
-                        >
-                            <CardIcon
-                                size={40}
-                                strokeWidth={1.5}
-                                color={index === 0 ? "var(--color-white)" : "var(--color-black-text)"}
-                            />
-                            <div className="flex flex-col gap-2 justify-between">
-                                <h2 className="text-2xl font-bold">{t(`${card.path}.title`)}</h2>
-                                <p className="text-lg font-light">{t(`${card.path}.description`)}</p>
-                                <Link to={t(`${card.path}.link`)} className="underline mt-4">
-                                    {t("ourServices.discoverMore")}
-                                </Link>
-                            </div>
-                        </div>
-                    );
-                })}
-            </div>
-        </section>
-    );
-}
-
-export default OurServices;
Index: ontend/src/components/ProfileInfo.tsx
===================================================================
--- frontend/src/components/ProfileInfo.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,30 +1,0 @@
-import {useAuthContext} from "../context/AuthContext.tsx";
-
-function ProfileInfo() {
-    const {user} = useAuthContext();
-
-    return (
-        <section className="shadow-md border-1 border-dark-blue/10 flex flex-col gap-6 items-center justify-center bg-white w-full rounded-xl p-8 ">
-
-            <div
-                className="border-3 border-white/40
-                rounded-full bg-black/60 w-1/2 aspect-square flex items-center justify-center text-white text-4xl font-bold"
-            >
-                {user?.name
-                    ?.split(/[\s_]+/)
-                    .map(word => word[0]?.toUpperCase())
-                    .join('')
-                }
-            </div>
-
-            <div className="flex flex-col gap-2">
-                <p className="text-3xl font-semibold">{user?.name}</p>
-                <p className="text-xl font-light">{user?.email}</p>
-            </div>
-
-
-        </section>
-    )
-}
-
-export default ProfileInfo;
Index: ontend/src/components/ProfileModalAddSkills&Interests.tsx
===================================================================
--- frontend/src/components/ProfileModalAddSkills&Interests.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,188 +1,0 @@
-import ReactDom from "react-dom";
-import {toEnumFormat} from "../utils/toEnumFormat.ts";
-import React, {useEffect} from "react";
-import {fetchCoursesSkillsApi, fetchCoursesTopicsApi, fetchRecommendedCoursesApi} from "../api/courseApi.ts";
-import {useAuthContext} from "../context/AuthContext.tsx";
-import {X} from "lucide-react";
-import ProfileModalAddSkillsInterestsSkeleton from "./skeletons/ProfileModalAddSkills&InterestsSkeleton.tsx";
-import {updateUserDesiredSkillsApi, updateUserInterestsApi} from "../api/userApi.ts";
-import {useCourseStorage} from "../context/CourseStorage.ts";
-
-function ProfileModalAddSkillsInterests({type, label, closeModal}: {
-    type: "desiredSkills" | "interests";
-    label: string;
-    closeModal: () => void;
-}) {
-    const {user, setUser, accessToken} = useAuthContext();
-    const {setRecommendedCourses} = useCourseStorage();
-    const [allOptions, setAllOptions] = React.useState<string[]>([]);
-    const [options, setOptions] = React.useState<string[]>([]);
-    const [selected, setSelected] = React.useState<string[]>(user![type] || []);
-    const [filterText, setFilterText] = React.useState("");
-    const [loading, setLoading] = React.useState(false);
-    const [componentRenderLoading, setComponentRenderLoading] = React.useState(true);
-    const [error, setError] = React.useState<string | null>(null);
-
-    useEffect(() => {
-        if (type === "desiredSkills") {
-            fetchCoursesSkillsApi()
-                .then(skills => {
-                    setAllOptions(skills);
-                    setOptions(skills);
-                })
-                .catch(err => {
-                    console.error("Failed to fetch javaObjects skills", err);
-                })
-                .finally(() => setComponentRenderLoading(false));
-        } else if (type === "interests") {
-            fetchCoursesTopicsApi()
-                .then(topics => {
-                    setAllOptions(topics);
-                    setOptions(topics);
-                })
-                .catch(err => {
-                    console.error("Failed to fetch javaObjects topics", err);
-                })
-                .finally(() => setComponentRenderLoading(false));
-        }
-    }, []);
-
-    useEffect(() => {
-        // Disable scroll
-        document.body.classList.add("overflow-hidden");
-
-        // Cleanup: re-enable scroll when modal unmounts
-        return () => {
-            document.body.classList.remove("overflow-hidden");
-        };
-    }, []);
-
-
-    const handleFilterChange = (e: React.ChangeEvent<HTMLInputElement>) => {
-        const value = e.target.value;
-        setFilterText(value);
-        setOptions(allOptions.filter(option =>
-            option.toLowerCase().includes(value.toLowerCase())
-        ));
-    };
-
-    const handleOptionClick = (option: string) => {
-        setSelected((prev: string[]) => (
-            prev.includes(option)
-                ? prev.filter(item => item !== option)
-                : [...prev, option]
-        ));
-    };
-
-    const handleSubmit = () => {
-        if (selected.length === 0) {
-            setError("Help us tailor your experience — please select at least one option");
-            return;
-        }
-
-        setLoading(true)
-        const updateFn = type === "interests" ? updateUserInterestsApi : updateUserDesiredSkillsApi;
-        updateFn(selected, accessToken!)
-            .then(() => {
-                setUser(prev => ({
-                    ...prev!,
-                    [type]: selected
-                }))
-
-                fetchRecommendedCoursesApi(accessToken!)
-                    .then(courses => {
-                        setRecommendedCourses(courses);
-                    })
-                    .catch(err => {
-                        console.error("Failed to fetch recommended courses after update", err);
-                    })
-
-                closeModal();
-            })
-            .catch(err => {
-                console.error("Failed to update user interests", err);
-            })
-            .finally(() => setLoading(false));
-    }
-
-
-    if (componentRenderLoading)
-        return <ProfileModalAddSkillsInterestsSkeleton closeModal={closeModal} />;
-
-    return ReactDom.createPortal(
-        <>
-            {/*OVERFLOW*/}
-            <div className="fixed top-0 bottom-0 left-0 right-0 bg-black/70 z-1000"/>
-
-            <section className="fixed top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 bg-white shadow-lg py-4 px-6 z-1000
-                     max-w-2/3 min-w-1/2 max-h-5/6 rounded-lg flex flex-col gap-8">
-                <div className="flex flex-col gap-2">
-                    <button
-                        onClick={closeModal}
-                        className="hover:bg-black/10 transition-all duration-300 ease-out ml-auto px-2 w-fit rounded-sm cursor-pointer">
-                        <X size={32} />
-                    </button>
-
-                    <div className="flex justify-between w-full flex-wrap ">
-                        <label className="text-shifter font-medium text-2xl">
-                            {label}
-                        </label>
-                        <input
-                            type={"search"}
-                            className="px-3 py-1 rounded-md border border-black/10 text-black text-md focus:outline-none focus:ring-2 focus:ring-shifter/60 transition-all"
-                            placeholder={`Search ${type === "interests" ? "interests" : "skills"}...`}
-                            value={filterText}
-                            onChange={handleFilterChange}
-                        />
-                    </div>
-                </div>
-
-                <div
-                    className="relative custom-scrollbar flex gap-2 flex-wrap w-full  items-center overflow-y-auto">
-                    {options.map((option, index) => (
-                        <button
-                            key={index}
-                            name={option}
-                            className={`${selected.includes(toEnumFormat(option)) ? "bg-shifter text-white shadow-black/20" : "bg-black/10 text-black shadow-shifter/20"} 
-                            px-4 py-1 rounded-md transition-all duration-200 ease-in-out hover:shadow-md
-                            focus:outline-none cursor-pointer whitespace-nowrap`}
-                            onClick={() => handleOptionClick(option)}
-                        >
-                            {
-                                option
-                                    .toLowerCase()
-                                    .replace(/_/g, " ")
-                                    .replace(/\b\w/g, (c) => c.toUpperCase())
-                            }
-                        </button>
-                    ))}
-                </div>
-
-                <div className="flex flex-col gap-2 items-center">
-                    {
-                        error && error.length > 0 && (
-                            <p className="text-red-500 text-center">
-                                {error}
-                            </p>
-                        )
-                    }
-                    <div className="flex items-center gap-2">
-                        <button
-                            onClick={handleSubmit}
-                            className="shadow-md shadow-shifter/30 hover:shadow-lg hover:shadow-shifter/50 transition-all duration-200 ease-in-out cursor-pointer
-                    bg-shifter px-20 py-2 w-fit text-white rounded-sm font-semibold border-2 border-white/40"
-                        >
-                            {
-                                loading ? "Submitting..." : "Submit Changes"
-                            }
-                        </button>
-                        {loading && <div className="h-full loader"></div>}
-                    </div>
-                </div>
-            </section>
-        </>,
-        document.getElementById("portal")!
-    )
-}
-
-export default ProfileModalAddSkillsInterests;
Index: ontend/src/components/ProfileMyProfile.tsx
===================================================================
--- frontend/src/components/ProfileMyProfile.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,97 +1,0 @@
-import {useAuthContext} from "../context/AuthContext.tsx";
-import React, {useState} from "react";
-import {updateUserApi} from "../api/userApi.ts";
-
-function ProfileMyProfile() {
-    const [loading, setLoading] = useState(false);
-    const {user, setUser, accessToken} = useAuthContext();
-
-    const [formData, setFormData] = useState({
-        name: user?.name || "",
-        workPosition: user?.workPosition || "",
-        companyType: user?.companyType || ""
-    });
-
-    const handleSubmit = (e: React.FormEvent) => {
-        e.preventDefault();
-
-        setLoading(true);
-        updateUserApi(formData, accessToken || "")
-            .then(() => {
-                console.log("User updated successfully:");
-                setUser(prev => {
-                    if (!prev) return prev;
-                    return {
-                        ...prev,
-                        name: formData.name,
-                        workPosition: formData.workPosition,
-                        companyType: formData.companyType
-                    };
-                });
-
-            })
-            .catch(error => {
-                console.error("Error updating user:", error);
-            })
-            .finally(() => {
-                setLoading(false);
-            })
-    };
-
-    return (
-        <section className="flex flex-col gap-4 items-start">
-            <h2 className="text-3xl font-semibold">My Profile</h2>
-            <form
-                onSubmit={handleSubmit}
-                className="shadow-md flex flex-col gap-6 px-24 py-6 border-1 border-dark-blue/10 bg-white rounded-lg w-full ">
-                <Input name={"name"} value={formData.name} func={setFormData} />
-                <Input name={"workPosition"} value={formData.workPosition} func={setFormData} />
-                <select
-                    className="hover:border-1 hover:border-shifter focus:outline-none focus:border-2 focus:border-shifter
-                border-1 border-black/40 rounded-sm py-2 px-4 text-lg text-black w-full cursor-pointer"
-                    name={"companyType"} value={formData.companyType}
-                    onChange={e => setFormData(prev => ({...prev, companyType: e.target.value}))}
-                >
-                    <option value="FREELANCE">Freelance</option>
-                    <option value="STARTUP">Start Up</option>
-                    <option value="SME">SME</option>
-                    <option value="MID_MARKET">Mid Market</option>
-                    <option value="ENTERPRISE">Enterprise</option>
-                    <option value="OTHER">Other</option>
-                </select>
-                <div className="flex gap-4 items-center">
-                    <button
-                        className="shadow-md shadow-shifter/30 hover:shadow-lg hover:shadow-shifter/50 transition-all duration-200 ease-in-out cursor-pointer
-                        bg-shifter px-12 py-2 w-fit text-white rounded-sm font-semibold border-2 border-white/40"
-                        type="submit">
-                        {loading ? "Saving..." : "Save Changes"}
-                    </button>
-                    {
-                        loading && (
-                            <div className="h-full loader"></div>
-                        )
-                    }
-                </div>
-            </form>
-        </section>
-    )
-}
-
-function Input({name, value, func}: {
-    name: string;
-    value: string;
-    func: React.Dispatch<React.SetStateAction<{ name: string; workPosition: string; companyType: string; }>>;
-}) {
-
-    return (
-        <input
-            className="hover:border-1 hover:border-shifter focus:outline-none focus:border-2 focus:border-shifter
-                border-1 border-black/40 rounded-sm py-2 px-4 text-lg text-black w-full"
-            value={value}
-            onChange={e => func(prev => ({...prev, [name]: e.target.value}))}
-            name={name}
-        />
-    )
-}
-
-export default ProfileMyProfile;
Index: ontend/src/components/ProfileSkills&Interests.tsx
===================================================================
--- frontend/src/components/ProfileSkills&Interests.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,58 +1,0 @@
-import React from "react";
-import {Plus} from "lucide-react";
-
-function ProfileSkillsInterests({ title, pills, openModal }: {
-    title: string;
-    pills: string[];
-    openModal?: () => void;
-}) {
-    const [showAll, setShowAll] = React.useState(false);
-
-    const visiblePills = showAll ? pills : pills.slice(0, 4); // Show 6 by default
-
-    return (
-        <section className="flex flex-col gap-2 items-start w-full rounded-xl">
-            <div className="flex justify-between items-center w-full">
-                <h2 className="text-2xl font-semibold">{title}</h2>
-                {
-                    openModal && (
-                        <button
-                            onClick={openModal}
-                            className="hover:bg-shifter/20 px-2 rounded-sm transition-all duration-300 ease-out
-                            cursor-pointer text-shifter"
-                        >
-                            <Plus size={24} />
-                        </button>
-                    )
-                }
-            </div>
-            <div className="shadow-md flex gap-2 w-full flex-wrap border-1 border-dark-blue/10 bg-white rounded-lg p-4">
-                {
-                    visiblePills.map((pill, index) => (
-                        <span
-                            key={index}
-                            className="font-medium text-white px-4 py-1 bg-shifter/60 border-2 border-white/40 rounded-md"
-                        >
-                            {pill
-                                .toLowerCase()
-                                .replace(/_/g, " ")
-                                .replace(/\b\w/g, char => char.toUpperCase())
-                            }
-                        </span>
-                    ))
-                }
-
-                {pills.length > 4 && (
-                    <button
-                        onClick={() => setShowAll(prev => !prev)}
-                        className="p-2 rounded-sm underline hover:bg-shifter/10 hover:text-shifter cursor-pointer"
-                    >
-                        {showAll ? "Show less" : `Show ${pills.length - 4} more`}
-                    </button>
-                )}
-            </div>
-        </section>
-    );
-}
-
-export default ProfileSkillsInterests;
Index: ontend/src/components/RoadmapAI.tsx
===================================================================
--- frontend/src/components/RoadmapAI.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,89 +1,0 @@
-import RoadmapInput from "./RoadmapInput.tsx";
-import ShifterArrow from "../../public/Shifter-Arrow.png";
-
-function RoadmapAI() {
-    const roadmapData = [
-        {
-            title: "Define The Challenge",
-            description: "What is your biggest business challenge? (e.g., marketing, scaling, sales, operations, leadership, etc.)",
-            textColor: "text-deep-green",
-            bgColor: "bg-deep-green/80",
-            bgColorPale: "bg-deep-green/40",
-        },
-        {
-            title: "Set Clear Goals",
-            description: "What do you want to achieve? (e.g., increase revenue, build a team, launch a product, improve strategy, etc.)",
-            textColor: "text-shifter",
-            bgColor: "bg-shifter/80",
-            bgColorPale: "bg-shifter/40",
-        },
-        {
-            title: "Assess Experience",
-            description: "Where are you in your journey? (e.g., startup, growing business, established business, corporate level, etc.)",
-            textColor: "text-teal",
-            bgColor: "bg-teal/80",
-            bgColorPale: "bg-teal/40",
-        },
-        {
-            title: "Pick a Learning Style",
-            description: "How do you prefer to learn? (e.g., one-on-one mentoring, group coaching, self-paced courses, workshops, etc.)",
-            textColor: "text-dark-blue",
-            bgColor: "bg-dark-blue/80",
-            bgColorPale: "bg-dark-blue/40",
-        },
-    ]
-
-
-    return (
-        <section className="relative overflow-clip px-horizontal-md py-vertical-md flex flex-col items-center text-black gap-12">
-            <img src={ShifterArrow} alt="Shifter Arrow"
-                 className="absolute opacity-10 h-180 w-130 rotate-45 -top-20 right-30"/>
-            <img src={ShifterArrow} alt="Shifter Arrow"
-                 className="absolute opacity-10 h-180 w-130 -rotate-135 -bottom-20 left-30"/>
-
-            {/*HEADER*/}
-            <div className="flex flex-col gap-2">
-                <h2 className="text-5xl">AI-Powered Roadmap</h2>
-                <p className="font-light text-xl">Answer 4 questions, and let AI guide you with a personalized plan to
-                    achieve your goals</p>
-            </div>
-
-            {/*INPUTS*/}
-            <div className="grid grid-cols-[1fr_60px_1fr] w-full">
-                <div
-                    className="col-start-2 col-span-1 row-start-1 row-span-4 bg-black/10 rounded-full justify-self-center w-1"
-                />
-
-                {
-                    roadmapData.map((data, idx) => {
-                        return (
-                            <>
-                                <div
-                                    className={`col-start-2 row-start-${idx + 1} w-8 aspect-square place-self-center rounded-full overflow-clip bg-white `}>
-                                    <div className={`w-full h-full ${data.bgColorPale}`}/>
-                                </div>
-
-                                <RoadmapInput
-                                    key={idx}
-                                    title={data.title}
-                                    description={data.description}
-                                    textColor={data.textColor}
-                                    bgColor={data.bgColor}
-                                    index={idx}
-                                    isLeft={idx % 2 === 0}
-                                />
-                            </>
-                        )
-                    })
-                }
-            </div>
-
-            <button className="hover:shadow-shifter/40 hover:shadow-lg transition-all duration-300 ease-in-out cursor-pointer
-                px-40 py-2 bg-shifter border-3 border-white/40 rounded-md w-fit text-white text-xl font-semibold shadow-lg shadow-shifter/20
-                ">Generate roadmap
-            </button>
-        </section>
-    );
-}
-
-export default RoadmapAI
Index: ontend/src/components/RoadmapInput.tsx
===================================================================
--- frontend/src/components/RoadmapInput.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,77 +1,0 @@
-import {useRef} from "react";
-
-interface RoadmapInputProps {
-    title: string;
-    description: string;
-    textColor: string;
-    bgColor: string;
-    isLeft: boolean;
-    index: number;
-}
-
-
-function RoadmapInput({ title, description, textColor, bgColor, isLeft, index }: RoadmapInputProps) {
-    const textareaRef = useRef<HTMLTextAreaElement | null>(null);
-
-    const handleInput = () => {
-        const el = textareaRef.current;
-        if (el) {
-            el.style.height = 'auto';
-            el.style.height = `${el.scrollHeight}px`;
-        }
-    };
-
-    return (
-        <div
-            className={`${
-                index % 2 === 0 ? 'col-start-1 col-span-1' : 'col-start-3 col-span-1'
-            }
-            ${
-                index === 0 ? 'row-start-1' : 
-                    index === 1 ? 'row-start-2' :
-                    index === 2 ? 'row-start-3' :
-                    index === 3 ? 'row-start-4' : ''
-            }
-            ${isLeft ? 'pl-4' : 'pr-4'}
-            overflow-clip flex gap-16 bg-[#FFF] border-3 border-black/20 rounded-xl h-fit z-10`}>
-            {/*LEFT CIRCLE*/}
-            {
-                !isLeft && <Circle bgColor={bgColor} isLeft={isLeft}/>
-            }
-
-            {/*TEXT AND INPUT*/}
-            <div className="flex flex-col gap-10 py-4 max-w-xl h-fit">
-                <div className="flex flex-col gap-4 text-start">
-                    <h3 className={`${textColor} text-3xl font-semibold`}>{title}</h3>
-                    <hr className="border-t-2 border-black border-gray"/>
-                    <p>{description}</p>
-                </div>
-                <textarea
-                    ref={textareaRef}
-                    rows={1}
-                    placeholder="Type your answer here..."
-                    onInput={handleInput}
-                    className="bg-gray border-2 py-1 px-2 border-black/10 rounded-sm
-                    font-medium resize-none overflow-hidden min-h-fit max-h-[5rem]"
-                />
-            </div>
-
-            {/*RIGHT CIRCLE*/}
-            {
-                isLeft && <Circle bgColor={bgColor} isLeft={isLeft}/>
-            }
-        </div>
-    )
-
-}
-
-function Circle({bgColor, isLeft}: { bgColor: string, isLeft: boolean }) {
-
-    return (
-        <div className={`flex items-stretch w-2/6 ${isLeft ? 'justify-start' : 'justify-end'}`}>
-            <div className={`${bgColor} h-full aspect-square rounded-full `}></div>
-        </div>
-    )
-}
-
-export default RoadmapInput;
Index: ontend/src/components/ShifterValues.tsx
===================================================================
--- frontend/src/components/ShifterValues.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,51 +1,0 @@
-import { useTranslation } from "react-i18next";
-
-function ShifterValues() {
-    const { t } = useTranslation("home");
-
-    const values = t("shifterValues.valuesList", { returnObjects: true }) as string[];
-
-    return (
-        <section className="flex px-horizontal-md py-vertical-lg gap-20">
-            <div className="flex flex-col gap-12 w-1/2">
-                <div className="flex flex-col gap-8 text-left">
-                    <h2 className="text-5xl" dangerouslySetInnerHTML={{ __html: t("shifterValues.heading") }} />
-                    <p className="text-xl">{t("shifterValues.description")}</p>
-                </div>
-
-                <div className="flex gap-2">
-                    <div className="flex flex-col text-center gap-2 text-shifter text-5xl">
-                        {values.map((v, i) => (
-                            <strong key={i}>{v[0]}</strong>
-                        ))}
-                    </div>
-                    <div className="flex flex-col text-2xl items-start font-light">
-                        {values.map((v, i) => (
-                            <span key={i} className="h-1/5 flex items-end pb-1">{v.slice(1)}</span>
-                        ))}
-                    </div>
-                </div>
-
-                <button className="hover:shadow-shifter/40 hover:shadow-lg transition-all duration-300 ease-in-out cursor-pointer
-                    bg-shifter rounded-md border-3 border-white/40 py-2
-                    text-white text-xl shadow-md shadow-shifter/20 font-medium w-7/10"
-                >
-                    {t("shifterValues.button")}
-                </button>
-            </div>
-
-            <div className="relative w-1/2 flex items-center justify-start">
-                <div className="rounded-full bg-dark-gray/30 w-70 h-70"></div>
-                <div className="absolute left-70 top-1/5 rounded-full bg-dark-gray/30 w-35 h-35"></div>
-                <div className="absolute left-70 bottom-1/5 rounded-full bg-dark-gray/30 w-35 h-35"></div>
-                <div className="absolute right-20 top-1/2 transform -translate-x-1/2 -translate-y-1/2 rounded-full bg-dark-gray/30 w-20 h-20"></div>
-                <div className="absolute left-1/2 top-1/10 transform -translate-x-1/2 -translate-y-1/2 rounded-full bg-dark-gray/30 w-20 h-20"></div>
-                <div className="absolute left-2/5 -bottom-1/10 transform -translate-x-1/2 -translate-y-1/2 rounded-full bg-dark-gray/30 w-30 h-30"></div>
-                <div className="absolute left-1/5 bottom-4 transform -translate-x-1/2 rounded-full bg-dark-gray/30 w-20 h-20"></div>
-                <div className="absolute left-2/7 -top-2 transform -translate-x-1/2 rounded-full bg-dark-gray/30 w-30 h-30"></div>
-            </div>
-        </section>
-    );
-}
-
-export default ShifterValues;
Index: ontend/src/components/TextWithUnderline.tsx
===================================================================
--- frontend/src/components/TextWithUnderline.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,9 +1,0 @@
-
-const TextWithUnderline = ({label, className, fromRightToLeft}: { label: string, className?: string; fromRightToLeft?: boolean }) => (
-    <div className={`flex flex-col gap-0 overflow-clip p-1 group ${className}`}>
-        {label}
-        <hr className={`relative ${fromRightToLeft ? "-right-50 group-hover:-right-6" : "-left-50 group-hover:-left-6"} border-t-2 rounded-full transition-all duration-300 ease-in-out`}/>
-    </div>
-);
-
-export default TextWithUnderline;
Index: ontend/src/components/inputs/PersonalizationInput.tsx
===================================================================
--- frontend/src/components/inputs/PersonalizationInput.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,66 +1,0 @@
-import {Eye, EyeOff} from "lucide-react";
-import React from "react";
-import type { UserPersonalization } from "../../models/javaObjects/UserPersonalization.tsx";
-
-type UserStrFields = 'name' | 'workPosition' | 'companySize';
-interface InputProps {
-    placeholder: string;
-    label: string;
-    name: UserStrFields;
-    type: string;
-    id: string;
-    showPassword?: boolean;
-    setShowPassword?: React.Dispatch<React.SetStateAction<boolean>>;
-    setUser: React.Dispatch<React.SetStateAction<UserPersonalization>>;
-    user: UserPersonalization;
-}
-
-function PersonalizationInput(inputProps: InputProps) {
-
-    return (
-        <div
-            className="w-full relative flex flex-col items- gap-1 px-6 py-1 border-2 border-shifter group focus-within:border-l-20 transition-all ease-in-out duration-300 items-start rounded-sm">
-            <label
-                htmlFor={inputProps.id}
-                className="text-shifter font-medium"
-            >
-                {inputProps.label}
-            </label>
-            <div className="flex gap-2 w-full">
-                <div className="w-full">
-                    <input
-                        id={inputProps.id}
-                        type={!inputProps.name.includes("password") ? "text" : inputProps.showPassword ? "text" : "password"}
-                        name={inputProps.name}
-                        placeholder={inputProps.placeholder}
-                        className="w-full focus:outline-none text-lg"
-                        value={inputProps.user[inputProps.name] || ""}
-                        onChange={e =>
-                            inputProps.setUser((prev: UserPersonalization) => ({
-                                ...prev,
-                                [inputProps.name]: e.target.value
-                            }))
-                        }
-                    />
-                    <hr className="border-t-2 border-black/5 rounded-full w-full"/>
-                </div>
-                {inputProps.name.includes("password") && (
-                    <button
-                        type="button"
-                        onClick={() => inputProps.setShowPassword?.((prev: boolean) => !prev)}
-                        className="text-black cursor-pointer hover:bg-black/5 rounded-full p-1"
-                        aria-label={inputProps.showPassword ? "Hide password" : "Show password"}
-                    >
-                        {!inputProps.showPassword ? (
-                            <EyeOff size={20} opacity={0.6}/>
-                        ) : (
-                            <Eye size={20} opacity={0.6}/>
-                        )}
-                    </button>
-                )}
-            </div>
-        </div>
-    );
-}
-
-export default PersonalizationInput;
Index: ontend/src/components/inputs/PersonalizationSelect.tsx
===================================================================
--- frontend/src/components/inputs/PersonalizationSelect.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,46 +1,0 @@
-import type {UserPersonalization} from "../../models/javaObjects/UserPersonalization.tsx";
-import type {SelectProps} from "../../models/SelectProps.tsx";
-import {toEnumFormat} from "../../utils/toEnumFormat.ts";
-
-function PersonalizationSelect(selectProps: SelectProps) {
-
-    return (
-        <div
-            className="w-full relative flex flex-col gap-1 px-6 py-1 border-2 border-shifter group focus-within:border-l-20 transition-all ease-in-out duration-300 items-start rounded-sm">
-            <label
-                htmlFor={selectProps.id}
-                className="text-shifter font-medium"
-            >
-                {selectProps.label}
-            </label>
-            <div className="w-full">
-                <select
-                    id={selectProps.id}
-                    name={selectProps.name}
-                    className="w-full focus:outline-none text-lg cursor-pointer"
-                    value={selectProps.user[selectProps.name] || ""}
-                    onChange={e =>
-                        selectProps.setUser((prev: UserPersonalization) => ({
-                            ...prev,
-                            [selectProps.name]: e.target.value
-                        }))
-                    }
-                >
-                    <option value="" className="text-black/10">
-                        Select an option
-                    </option>
-                    {
-                        selectProps.options?.map((option, index) => (
-                            <option key={index} value={toEnumFormat(option)}>
-                                {option}
-                            </option>
-                        ))
-                    }
-                </select>
-                <hr className="border-t-2 border-black/5 rounded-full w-full"/>
-            </div>
-        </div>
-    );
-}
-
-export default PersonalizationSelect;
Index: ontend/src/components/inputs/PersonalizationSlider.tsx
===================================================================
--- frontend/src/components/inputs/PersonalizationSlider.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,78 +1,0 @@
-import React from "react";
-import type {UserPersonalization} from "../../models/javaObjects/UserPersonalization.tsx";
-import type {SliderProps} from "../../models/SliderProps.tsx";
-
-function PersonalizationSlider(sliderProps: SliderProps) {
-    const [allOptions] = React.useState<string[]>(sliderProps.options || []);
-    const [options, setOptions] = React.useState<string[]>(allOptions);
-    const [filterText, setFilterText] = React.useState("");
-
-    const handleFilterChange = (e: React.ChangeEvent<HTMLInputElement>) => {
-        const value = e.target.value;
-        setFilterText(value);
-        setOptions(allOptions.filter(option =>
-            option.toLowerCase().includes(value.toLowerCase())
-        ));
-    };
-
-    const handleOptionClick = (option: string) => {
-        sliderProps.setUser((prev: UserPersonalization) => {
-            const arr = prev[sliderProps.name] as string[] || [];
-            const newArr = arr.includes(option)
-                ? arr.filter(item => item !== option)
-                : [...arr, option];
-
-            return {
-                ...prev,
-                [sliderProps.name]: newArr,
-            };
-        });
-    };
-
-    return (
-        <div className="w-full flex flex-col justify-center gap-4 px-6 py-1 items-start w-full">
-            <div className="flex justify-between w-full flex-wrap gap-2">
-                <label htmlFor={sliderProps.id} className="text-shifter font-medium text-xl">
-                    {sliderProps.label}
-                </label>
-                <input
-                    type={"search"}
-                    className="px-3 py-1 rounded-md border border-black/10 text-black text-sm focus:outline-none focus:ring-2 focus:ring-shifter/60 transition-all"
-                    placeholder="Search options..."
-                    value={filterText}
-                    onChange={handleFilterChange}
-                />
-            </div>
-
-            <div className="relative custom-scrollbar flex gap-2 flex-wrap w-full max-h-[30vh] items-center overflow-y-auto">
-                {options.map((option, index) => {
-                    const isSelected = sliderProps.user[sliderProps.name]?.includes(option) || false;
-
-                    return (
-                        <button
-                            key={index}
-                            name={sliderProps.name}
-                            id={`${sliderProps.id}-${index}`}
-                            className={`${isSelected ? "bg-shifter text-white shadow-black/20" : "bg-black/10 text-black shadow-shifter/20"} 
-                            px-4 py-1 rounded-md transition-all duration-200 ease-in-out hover:shadow-md
-                            focus:outline-none cursor-pointer whitespace-nowrap`}
-                            onClick={() => handleOptionClick(option)}
-                        >
-                            {
-                                option
-                                    .toLowerCase()
-                                    .replace(/_/g, " ")
-                                    .replace(/\b\w/g, (c) => c.toUpperCase())
-                            }
-                        </button>
-                    );
-                })}
-
-                <div
-                    className="pointer-events-none sticky bottom-0 left-0 w-full h-4 bg-gradient-to-t from-white to-transparent"></div>
-            </div>
-        </div>
-    );
-}
-
-export default PersonalizationSlider;
Index: ontend/src/components/learn/CourseContentSideNav.tsx
===================================================================
--- frontend/src/components/learn/CourseContentSideNav.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,118 +1,0 @@
-import type {CourseContentFull} from "../../models/javaObjects/CourseContentFull.tsx";
-import {useEffect, useState} from "react";
-import {ChevronDown, ClipboardList, File, ListChecks, Text, TvMinimalPlay} from "lucide-react";
-import type {CourseLectureFull} from "../../models/javaObjects/CourseLectureFull.tsx";
-import {X} from "lucide-react";
-import CircularProgress from "../../assets/CircularProgress.tsx";
-
-function CourseContentSideNav({ activeLecture, setActiveLecture, courseContents, updateLecture, closeModal, progressPercentage }: {
-    activeLecture: CourseLectureFull,
-    setActiveLecture: (lecture: CourseLectureFull) => void,
-    courseContents: CourseContentFull[] | undefined,
-    updateLecture: (progressId: number, isComplete: boolean) => void,
-    closeModal: () => void,
-    progressPercentage: number
-}) {
-    const [openContentIds, setOpenContentIds] = useState<number[]>([]);
-
-
-    const toggleAccordion = (contentId: number) => {
-        if (openContentIds.includes(contentId)) {
-            setOpenContentIds(openContentIds.filter(i => i !== contentId));
-        } else {
-            setOpenContentIds([...openContentIds, contentId]);
-        }
-    }
-
-    useEffect(() => {
-        if (!courseContents || !activeLecture) return;
-
-        const contentWithActiveLecture = courseContents.find(content =>
-            content.courseLectures.some(lec => lec.id === activeLecture.id)
-        );
-
-        if (contentWithActiveLecture) {
-            setOpenContentIds([...openContentIds, contentWithActiveLecture.id]);
-        }
-    }, [activeLecture, courseContents]);
-
-    return (
-        <aside className="sticky top-0 right-0 min-w-28/100 h-screen overflow-y-auto border-l-1 border-black/20">
-            <div className="py-4 px-4 flex items-center justify-between">
-                <div className="flex items-center gap-4">
-                    <CircularProgress
-                        percentage={progressPercentage}
-                        size={28}
-                        strokeWidth={2}
-                    />
-                    <h2 className="text-left font-bold">Course content</h2>
-                </div>
-                <button
-                    onClick={closeModal}
-                    className="hover:bg-black/10 rounded-sm cursor-pointer p-1.5">
-                    <X size={20} strokeWidth={1.5}/>
-                </button>
-            </div>
-            {
-                courseContents && courseContents.map((content, index) => {
-                    const isOpen = openContentIds.includes(content.id);
-
-                    {/*CONTENT*/}
-                    return (
-                    <div
-                        key={index}
-                        className="flex flex-col border-t-2 border-black/20">
-                        <button
-                            onClick={() => toggleAccordion(content.id)}
-                            className="py-4 px-4 bg-black/5 flex flex-col items-start gap-2 cursor-pointer">
-                            <div className="flex items-start gap-2 justify-between w-full">
-                                <h3 className="text-left font-bold">Module {index+1}: {content.title}</h3>
-                                <ChevronDown height={20}
-                                className={`${isOpen && "-rotate-180"} transition-all duration-500 ease-out`}/>
-                            </div>
-
-                            <span className="text-xs text-black text-light">
-                                {content.courseLectures.filter(lecture => lecture.userCourseProgress.completed).length} / {content.courseLectures.length} | {content.courseLectures.reduce((acc, lecture) => acc + lecture.durationMinutes, 0)}min
-                            </span>
-                        </button>
-
-                        {/*LECTURES*/}
-                        {isOpen && content.courseLectures.map((lecture, lectureIndex) => {
-                            const isActive = activeLecture.id === lecture.id;
-                            return (
-                                <button
-                                    key={lectureIndex}
-                                    onClick={() => setActiveLecture(lecture)}
-                                    className={`${isActive && "bg-dark-blue/20"}
-                                    ${!isActive && "hover:bg-dark-blue/10"} cursor-pointer
-                                    py-4 px-4 flex gap-2 items-start`}>
-                                    <input
-                                        onClick={e => e.stopPropagation()}
-                                        onChange={() => updateLecture(lecture.userCourseProgress.id, !lecture.userCourseProgress.completed)}
-                                        checked={lecture.userCourseProgress.completed}
-                                        type={"checkbox"}
-                                        className="w-4 aspect-square"
-                                    />
-
-                                    <div className="flex flex-col gap-2 text-left">
-                                        <h4 className="leading-tight text-sm">{lecture.title}</h4>
-                                        <span className={`flex items-center gap-2 text-xs ${isActive ? "opacity-100" : "opacity-60"}`}>
-                                            {lecture.contentType === "VIDEO" && <TvMinimalPlay  size={16} strokeWidth={1.5} />}
-                                            {lecture.contentType === "TEXT" && <Text size={16} strokeWidth={1.5} />}
-                                            {lecture.contentType === "FILE" && <File size={16} strokeWidth={1.5} />}
-                                            {lecture.contentType === "QUIZ" && <ListChecks size={16} strokeWidth={1.5} />}
-                                            {lecture.contentType === "TOOL" && <ClipboardList size={16} strokeWidth={1.5} />}
-                                            {lecture.durationMinutes}min
-                                        </span>
-                                    </div>
-                                </button>
-                            )
-                        })}
-                    </div>
-                )})
-            }
-        </aside>
-    )
-}
-
-export default CourseContentSideNav;
Index: ontend/src/components/registerSteps/CustomStepper.tsx
===================================================================
--- frontend/src/components/registerSteps/CustomStepper.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,81 +1,0 @@
-import {StepConnector, stepConnectorClasses, type StepIconProps, styled} from "@mui/material";
-import Check from "@mui/icons-material/Check";
-
-const CustomStepperConnector = styled(StepConnector)(() => ({
-    [`&.${stepConnectorClasses.alternativeLabel}`]: {
-        top: 10,
-        left: 'calc(-50% + 16px)',
-        right: 'calc(50% + 16px)',
-    },
-    [`&.${stepConnectorClasses.completed}`]: {
-        [`& .${stepConnectorClasses.line}`]: {
-            borderColor: 'var(--color-shifter)',
-            opacity: 0.2
-        },
-    },
-    [`&.${stepConnectorClasses.active}`]: {
-        [`& .${stepConnectorClasses.line}`]: {
-            borderColor: 'var(--color-shifter)',
-            opacity: 0.2
-        },
-    },
-    [`& .${stepConnectorClasses.line}`]: {
-        borderColor: '#BBB',
-        borderWidth: 2,
-        borderRadius: 2,
-        transition: 'border-color 0.4s ease-in-out, opacity 0.4s ease-in-out',
-    },
-}));
-const CustomStepperStepIconRoot = styled('div')<{ ownerState: { active?: boolean; completed?: boolean } }>(
-    ({ ownerState }) => ({
-        color: '#eaeaf0',
-        display: 'flex',
-        position: 'relative',       // <-- needed for absolute positioning inside
-        height: 22,
-        alignItems: 'center',
-        transition: 'color 0.3s ease-in-out',
-
-        // CHECKMARK
-        '& .CustomStepperStepIcon-completedIcon': {
-            color: 'var(--color-shifter)',
-            zIndex: 2,                // on top
-            fontSize: 30,
-            position: 'absolute',     // overlay on circle
-            opacity: ownerState.completed ? 1 : 0,
-            pointerEvents: ownerState.completed ? 'auto' : 'none',  // ignore clicks when hidden
-            transition: 'opacity 0.5s ease-in-out',
-            left: '50%',
-            top: '50%',
-            transform: ownerState.completed
-                ? 'translate(-50%, -50%) scale(1)'
-                : 'translate(-50%, -50%) scale(0.8)',
-            transitionProperty: 'opacity, transform',
-        },
-
-        // CIRCLE
-        '& .CustomStepperStepIcon-circle': {
-            width: 16,
-            height: 16,
-            borderRadius: '50%',
-            backgroundColor: ownerState.active ? 'var(--color-shifter)' : '#BBB',
-            transition: 'background-color 0.4s ease-in-out, transform 0.4s ease-in-out, opacity 0.5s ease-in-out',
-            transform: ownerState.active ? 'scale(1.2)' : 'scale(1)',
-            opacity: ownerState.completed ? 0 : 1,
-            pointerEvents: ownerState.completed ? 'none' : 'auto',  // ignore clicks when hidden
-        },
-    }),
-);
-
-function CustomStepperStepIcon(props: StepIconProps) {
-    const { active, completed, className } = props;
-
-    return (
-        <CustomStepperStepIconRoot ownerState={{ active, completed }} className={className}>
-            <Check className="CustomStepperStepIcon-completedIcon" />
-            <div className="CustomStepperStepIcon-circle" />
-        </CustomStepperStepIconRoot>
-    );
-}
-
-
-export { CustomStepperConnector, CustomStepperStepIcon };
Index: ontend/src/components/registerSteps/PersonalizationStepThree.tsx
===================================================================
--- frontend/src/components/registerSteps/PersonalizationStepThree.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,54 +1,0 @@
-import React, {useEffect} from "react";
-import type {UserPersonalization} from "../../models/javaObjects/UserPersonalization.tsx";
-import PersonalizationSlider from "../inputs/PersonalizationSlider.tsx";
-import {fetchCoursesSkillsApi} from "../../api/courseApi.ts";
-import {useTranslation} from "react-i18next";
-
-function PersonalizationStepThree({setUser, user, setError}: {
-    setUser: React.Dispatch<React.SetStateAction<UserPersonalization>>,
-    user: UserPersonalization,
-    setError: React.Dispatch<React.SetStateAction<string>>,
-}){
-    const [skills, setSkills] = React.useState<string[]>([]);
-    const { t } = useTranslation("personalize");
-
-    useEffect(() => {
-        const fetchSkills = async () => {
-            try {
-                const skillsData = await fetchCoursesSkillsApi();
-                setSkills(skillsData);
-            } catch (err) {
-                console.error("Failed to fetch skills", err);
-            }
-        };
-
-        fetchSkills();
-    }, []);
-
-    useEffect(() => {
-        if (user.desiredSkills.length === 0) {
-            setError(t("stepThree.errorNoSkill"));
-        } else {
-            setError("");
-        }
-    }, [user.desiredSkills]);
-
-    return (
-        <section
-            className="flex flex-col gap-4 w-full">
-            {
-                skills.length > 0 &&
-                <PersonalizationSlider
-                    label={t("stepThree.desiredSkills")}
-                    name={"desiredSkills"}
-                    id={"desired-skills"}
-                    options={skills}
-                    setUser={setUser}
-                    user={user}
-                />
-            }
-        </section>
-    )
-}
-
-export default PersonalizationStepThree;
Index: ontend/src/components/registerSteps/PersonalizationStepTwo.tsx
===================================================================
--- frontend/src/components/registerSteps/PersonalizationStepTwo.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,55 +1,0 @@
-import React, {useEffect} from "react";
-import type {UserPersonalization} from "../../models/javaObjects/UserPersonalization.tsx";
-import PersonalizationSlider from "../inputs/PersonalizationSlider.tsx";
-import {fetchCoursesTopicsApi} from "../../api/courseApi.ts";
-import {useTranslation} from "react-i18next";
-
-function PersonalizationStepTwo({setUser, user, setError}: {
-    setUser: React.Dispatch<React.SetStateAction<UserPersonalization>>,
-    user: UserPersonalization,
-    setError: React.Dispatch<React.SetStateAction<string>>,
-}) {
-    const [interests, setInterests] = React.useState<string[]>([]);
-    const { t } = useTranslation("personalize");
-
-    useEffect(() => {
-        const fetchCourseTopics = async () => {
-            try {
-                const topicsData = await fetchCoursesTopicsApi();
-                setInterests(topicsData);
-            } catch (err) {
-                console.error("Failed to fetch javaObjects topics (user interests)", err);
-            }
-        };
-
-        fetchCourseTopics();
-    }, []);
-
-    useEffect(() => {
-        if (user.interests.length === 0) {
-            setError(t("stepTwo.errorNoInterest"));
-        } else {
-            setError("");
-        }
-    }, [user.interests]);
-
-
-    return (
-        <section
-            className="flex flex-col gap-4 w-full items-center">
-            {
-                interests.length > 0 &&
-                <PersonalizationSlider
-                    label={t("stepTwo.interests")}
-                    name={"interests"}
-                    id={"interests"}
-                    options={interests}
-                    setUser={setUser}
-                    user={user}
-                />
-            }
-        </section>
-    )
-}
-
-export default PersonalizationStepTwo;
Index: ontend/src/components/registerSteps/PersonalizeStepOne.tsx
===================================================================
--- frontend/src/components/registerSteps/PersonalizeStepOne.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,55 +1,0 @@
-import React, {useEffect} from "react";
-import type {UserPersonalization} from "../../models/javaObjects/UserPersonalization.tsx";
-import PersonalizationInput from "../inputs/PersonalizationInput.tsx";
-import PersonalizationSelect from "../inputs/PersonalizationSelect.tsx";
-import {useTranslation} from "react-i18next";
-
-function PersonalizeStepOne({setUser, user, setError}: {
-    setUser: React.Dispatch<React.SetStateAction<UserPersonalization>>,
-    user: UserPersonalization,
-    setError: React.Dispatch<React.SetStateAction<string>>,
-}) {
-    const { t } = useTranslation("personalize");
-
-    useEffect(() => {
-        if (!user.name || !user.workPosition || !user.companySize) {
-            setError("Please ensure all inputs are completed.");
-        } else {
-            setError("");
-        }
-    }, [user.name, user.workPosition, user.companySize]);
-
-    return (
-        <section
-            className="flex flex-col gap-4 w-full items-center">
-            <PersonalizationInput
-                placeholder={t("stepOne.fullNamePlaceholder")}
-                label={t("stepOne.fullName")}
-                name={"name"}
-                type={"text"}
-                id={"full-name"}
-                setUser={setUser}
-                user={user}
-            />
-            <PersonalizationInput
-                placeholder={t("stepOne.workPositionPlaceholder")}
-                label={t("stepOne.workPosition")}
-                name={"workPosition"}
-                type={"text"}
-                id={"work-position"}
-                setUser={setUser}
-                user={user}
-            />
-            <PersonalizationSelect
-                label={t("stepOne.companySize")}
-                name={"companySize"}
-                id={"company-size"}
-                options={t("stepOne.companySizeOptions") as unknown as string[]}
-                setUser={setUser}
-                user={user}
-            />
-        </section>
-    );
-}
-
-export default PersonalizeStepOne;
Index: ontend/src/components/routeProtectors/AdminOnlyRoute.tsx
===================================================================
--- frontend/src/components/routeProtectors/AdminOnlyRoute.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,19 +1,0 @@
-import type {JSX} from "react";
-import {useAuthContext} from "../../context/AuthContext.tsx";
-import {Navigate} from "react-router-dom";
-
-const AdminOnlyRoute = ({children}: { children: JSX.Element }) => {
-    const {user, authChecked} = useAuthContext();
-
-    if (!authChecked) {
-        return null;
-    }
-
-    if (user?.isAdmin)
-        return children;
-
-
-    return <Navigate to="/" replace/>;
-};
-
-export default AdminOnlyRoute;
Index: ontend/src/components/routeProtectors/PublicOnlyRoute.tsx
===================================================================
--- frontend/src/components/routeProtectors/PublicOnlyRoute.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,17 +1,0 @@
-import type {JSX} from "react";
-import { useAuthContext } from "../../context/AuthContext.tsx";
-import { Navigate } from "react-router-dom";
-
-const PublicOnlyRoute = ({ children }: { children: JSX.Element }) => {
-    const { user, authChecked } = useAuthContext();
-
-    if (!authChecked) {
-        return null;
-    }
-
-    if (user) return <Navigate to="/" replace />;
-
-    return children;
-};
-
-export default PublicOnlyRoute;
Index: ontend/src/components/routeProtectors/UserOnlyRoute.tsx
===================================================================
--- frontend/src/components/routeProtectors/UserOnlyRoute.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,16 +1,0 @@
-import {Navigate} from "react-router-dom";
-import type {JSX} from "react";
-import {useAuthContext} from "../../context/AuthContext.tsx";
-
-const UserOnlyRoute = ({ children }: {
-    children: JSX.Element;
-}) => {
-    const { user } = useAuthContext();
-
-    if (!user)
-        return <Navigate to="/login" replace />;
-
-    return children;
-};
-
-export default UserOnlyRoute;
Index: ontend/src/components/skeletons/CourseCardEnrolledSkeleton.tsx
===================================================================
--- frontend/src/components/skeletons/CourseCardEnrolledSkeleton.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,29 +1,0 @@
-function CourseCardEnrolledSkeleton() {
-    return (
-        <aside className="flex flex-col gap-2 items-center col-span-1 p-2 rounded-md">
-            {/* IMAGE skeleton */}
-            <div className="overflow-clip rounded-sm w-full">
-                <div className="aspect-video bg-gray-300 animate-pulse"></div>
-            </div>
-
-            {/* INFO skeleton */}
-            <div className="flex flex-col gap-2 text-left w-full">
-                {/* Title skeleton */}
-                <div className="h-5 bg-gray-300 rounded w-3/4 animate-pulse"></div>
-
-                {/* Topics skeleton */}
-                <div className="h-4 bg-gray-300 rounded w-full animate-pulse"></div>
-            </div>
-
-            {/* PROGRESS BAR skeleton */}
-            <div className="flex flex-col gap-1 items-start w-full">
-                <div className="w-full bg-gray-200 rounded-full h-0.5">
-                    <div className="h-full bg-gray-300 rounded-full w-1/3 animate-pulse"></div>
-                </div>
-                <div className="h-3 bg-gray-300 rounded w-20 animate-pulse"></div>
-            </div>
-        </aside>
-    );
-}
-
-export default CourseCardEnrolledSkeleton;
Index: ontend/src/components/skeletons/CourseCardSkeleton.tsx
===================================================================
--- frontend/src/components/skeletons/CourseCardSkeleton.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,43 +1,0 @@
-
-function CourseCardSkeleton() {
-    return (
-        <article className="relative border-1 border-black/10 shadow-md shadow-black/10
-            flex flex-col w-full rounded-xl gap-4 py-4 px-4 bg-[#FFFFFF] animate-pulse">
-
-            {/*IMAGE SKELETON*/}
-            <div className="overflow-clip rounded-md rounded-br-4xl rounded-tl-4xl">
-                <div className="w-full h-[180px] bg-gray-300 rounded-md"></div>
-            </div>
-
-            {/*TITLE AND TOPICS SKELETON*/}
-            <div className="flex flex-col gap-2 items-start text-left h-full">
-                {/*Title skeleton*/}
-                <div className="h-6 bg-gray-300 rounded w-3/4"></div>
-
-                {/*Topics skeleton*/}
-                <div className="h-16 bg-gray-200 rounded w-full"></div>
-            </div>
-
-            {/*INFO SKELETON*/}
-            <div className="flex flex-wrap gap-2 whitespace-nowrap">
-                <div className="h-6 bg-gray-200 rounded w-12"></div>
-                <div className="h-6 bg-gray-200 rounded w-20"></div>
-                <div className="h-6 bg-gray-200 rounded w-20"></div>
-                <div className="h-6 bg-gray-200 rounded w-24"></div>
-                <div className="h-6 bg-gray-200 rounded w-16"></div>
-            </div>
-
-            {/*BUTTON AND PRICE SKELETON*/}
-            <div className="flex justify-between items-center mt-0">
-                <div className="h-6 bg-gray-300 rounded w-12"></div>
-
-                <div className="flex items-center gap-2">
-                    <div className="w-6 h-6 bg-gray-200 rounded"></div>
-                    <div className="h-8 bg-gray-300 rounded w-20"></div>
-                </div>
-            </div>
-        </article>
-    );
-}
-
-export default CourseCardSkeleton;
Index: ontend/src/components/skeletons/CourseDetailsInfoSkeleton.tsx
===================================================================
--- frontend/src/components/skeletons/CourseDetailsInfoSkeleton.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,67 +1,0 @@
-import ShifterArrow from "../../../public/Shifter-Arrow.png";
-
-function CourseDetailsInfoSkeleton() {
-    return (
-        <>
-            {/*WHAT WILL BE LEARNED*/}
-            <section className="relative flex flex-col gap-12 text-left px-horizontal-lg py-vertical-md overflow-clip">
-                <img src={ShifterArrow} alt="Shifter Arrow"
-                     className="absolute opacity-10 h-150 w-120 -rotate-130 -top-40 right-0"/>
-                <img src={ShifterArrow} alt="Shifter Arrow"
-                     className="absolute opacity-10 h-150 w-120 rotate-50 -bottom-40 left-0"/>
-
-                <h2 className="text-5xl">What you'll learn</h2>
-                <div className="grid grid-cols-2 gap-y-8 gap-x-20">
-                    {[...Array(10)].map((_, index) => (
-                        <div className="flex items-center gap-4" key={index}>
-                            <div className="h-10 w-10 bg-gray-300 rounded animate-pulse"></div>
-                            <div className="h-6 bg-gray-300 rounded flex-1 animate-pulse"></div>
-                        </div>
-                    ))}
-                </div>
-            </section>
-
-            {/*COURSE CONTENT*/}
-            <section className="relative flex flex-col gap-12 text-left px-horizontal-lg py-vertical-md overflow-clip">
-                <h2 className="text-5xl">Course content</h2>
-                <div>
-                    {[...Array(5)].map((_, index) => (
-                        <div key={index} className={`border-1 border-black/20 ${index !== 4 ? "border-b-0" : ""}`}>
-                            <div className="overflow-clip flex justify-between items-center px-4 py-4 bg-black/5">
-                                <div className="flex gap-4 items-center">
-                                    <div className="h-8 w-8 bg-gray-300 rounded animate-pulse"></div>
-                                    <div className="h-6 bg-gray-300 rounded w-48 animate-pulse"></div>
-                                </div>
-                                <div className="flex gap-2 items-center text-black/40">
-                                    <div className="h-4 bg-gray-300 rounded w-16 animate-pulse"></div>
-                                    <span >•</span>
-                                    <div className="h-4 bg-gray-300 rounded w-12 animate-pulse"></div>
-                                </div>
-                            </div>
-                        </div>
-                    ))}
-                </div>
-            </section>
-
-            {/*DESCRIPTION*/}
-            <section className="flex flex-col gap-12 text-left px-horizontal-lg py-vertical-md">
-                <h2 className="text-5xl">Course description</h2>
-                <div>
-                    <div className="relative overflow-hidden">
-                        <div className="space-y-4">
-                            {[...Array(7)].map((_, index) => (
-                                <div key={index} className="h-4 bg-gray-300 rounded w-full animate-pulse"></div>
-                            ))}
-                            <div className="h-4 bg-gray-300 rounded w-2/3 animate-pulse"></div>
-                        </div>
-                        <div
-                            className="pointer-events-none absolute bottom-0 left-0 w-full h-24 bg-gradient-to-t from-white to-transparent"/>
-                    </div>
-                    <div className="mt-4 h-10 bg-gray-300 rounded w-24 animate-pulse"></div>
-                </div>
-            </section>
-        </>
-    );
-}
-
-export default CourseDetailsInfoSkeleton;
Index: ontend/src/components/skeletons/CourseLearnSkeleton.tsx
===================================================================
--- frontend/src/components/skeletons/CourseLearnSkeleton.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,55 +1,0 @@
-
-function CourseLearnSkeleton() {
-    return (
-        <main className="flex ">
-            <div className="flex flex-col w-full">
-                {/* Video player skeleton */}
-                <div className="w-full h-96 bg-gray-300 animate-pulse"></div>
-
-                <div className="flex flex-col gap-4 flex-grow py-vertical-md px-horizontal-sm text-left text-black-text">
-                    {/* Title skeleton */}
-                    <div className="h-10 bg-gray-300 rounded w-3/4 animate-pulse"></div>
-
-                    {/* Content text skeleton */}
-                    <div className="flex flex-col gap-3">
-                        <div className="h-6 bg-gray-300 rounded w-full animate-pulse"></div>
-                        <div className="h-6 bg-gray-300 rounded w-98/100 animate-pulse"></div>
-                        <div className="h-6 bg-gray-300 rounded w-full animate-pulse"></div>
-                        <div className="h-6 bg-gray-300 rounded w-95/100 animate-pulse"></div>
-                        <div className="h-6 bg-gray-300 rounded w-4/5 animate-pulse"></div>
-                    </div>
-
-                    {/* File download section skeleton */}
-                    <div className="flex justify-between w-full gap-20 items-center py-12">
-                        <div className="h-6 bg-gray-300 rounded w-120 animate-pulse"></div>
-                        <div className="h-12 bg-gray-300 rounded-md w-36 animate-pulse"></div>
-                    </div>
-                </div>
-            </div>
-
-            {/* CourseContentSideNav skeleton */}
-            <div className="w-28/100 flex flex-col gap-4 p-6 bg-gray-50">
-                {/* Side nav header skeleton */}
-                <div className="h-8 bg-gray-300 rounded w-3/4 animate-pulse"></div>
-
-                {/* Course content sections skeleton */}
-                {[...Array(4)].map((_, sectionIndex) => (
-                    <div key={sectionIndex} className="flex flex-col gap-2">
-                        {/* Section title skeleton */}
-                        <div className="h-6 bg-gray-300 rounded w-2/3 animate-pulse"></div>
-
-                        {/* Lectures skeleton */}
-                        {[...Array(4)].map((_, lectureIndex) => (
-                            <div key={lectureIndex} className="flex items-center gap-3 p-2">
-                                <div className="w-4 h-4 bg-gray-300 rounded-full animate-pulse"></div>
-                                <div className="h-5 bg-gray-300 rounded w-full animate-pulse"></div>
-                            </div>
-                        ))}
-                    </div>
-                ))}
-            </div>
-        </main>
-    );
-}
-
-export default CourseLearnSkeleton;
Index: ontend/src/components/skeletons/CoursesFiltersSkeleton.tsx
===================================================================
--- frontend/src/components/skeletons/CoursesFiltersSkeleton.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,53 +1,0 @@
-
-function CoursesFiltersSkeleton() {
-    return (
-        <aside className="flex flex-col gap-8 pl-8 pt-12 text-left sticky top-0 h-screen border-r-2 border-black/10">
-            {/* Header */}
-            <div className="h-8 bg-gray-300 rounded w-32 animate-pulse shrink-0 "></div>
-
-            <div className="relative flex flex-col gap-12 pl-4 pr-2 pb-20 overflow-y-scroll scrollable">
-                {/* Filter Sections - matching the 6 sections in CoursesFilters */}
-                <FilterSelectSkeleton hasSearch={false} /> {/* Favorite Courses */}
-                <FilterSelectSkeleton hasSearch={false} /> {/* Level */}
-                <FilterSelectSkeleton hasSearch={true} />  {/* Topics */}
-                <FilterSelectSkeleton hasSearch={true} />  {/* Skills */}
-                <FilterSelectSkeleton hasSearch={false} /> {/* Duration */}
-                <FilterSelectSkeleton hasSearch={false} /> {/* Price */}
-            </div>
-
-            {/* Gradient overlay */}
-            <div className="pointer-events-none absolute bottom-0 left-0 w-full h-24 bg-gradient-to-t from-white to-transparent"/>
-        </aside>
-    );
-}
-
-function FilterSelectSkeleton({hasSearch}: {hasSearch: boolean}) {
-    return (
-        <section className="flex flex-col gap-1 text-md">
-            {/* Header */}
-            <div className="h-6 bg-gray-300 rounded w-24 mb-4 animate-pulse"></div>
-
-            <form className="flex flex-col gap-2">
-                {/* Search input skeleton (only for Topics and Skills) */}
-                {hasSearch && (
-                    <div className="h-10 bg-gray-300 rounded-sm mb-2 animate-pulse"></div>
-                )}
-
-                {/* Filter options - 4 items */}
-                {[...Array(4)].map((_, index) => (
-                    <label key={index} className="flex items-center text-black whitespace-nowrap cursor-pointer w-fit">
-                        <div className="h-7 w-7 bg-gray-300 rounded mr-2 animate-pulse"></div>
-                        <div className="h-4 bg-gray-300 rounded w-40 animate-pulse"></div>
-                    </label>
-                ))}
-            </form>
-
-            {/* Show more button skeleton (only for sections with search) */}
-            {hasSearch && (
-                <div className="h-4 bg-gray-300 rounded w-16 animate-pulse"></div>
-            )}
-        </section>
-    );
-}
-
-export default CoursesFiltersSkeleton;
Index: ontend/src/components/skeletons/CoursesGridSkeleton.tsx
===================================================================
--- frontend/src/components/skeletons/CoursesGridSkeleton.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,27 +1,0 @@
-import CourseCardSkeleton from "./CourseCardSkeleton.tsx";
-
-function CoursesGridSkeleton() {
-    return (
-        <main className="flex-1 p-6">
-            {/* Active Filters Pills Skeleton */}
-            <div className="flex justify-between mb-6">
-                <div className="flex flex-wrap gap-2">
-                    {[...Array(4)].map((_, index) => (
-                        <div key={index} className="h-8 bg-gray-300 rounded-full w-24 animate-pulse"></div>
-                    ))}
-                </div>
-                <div className="h-8 bg-gray-300 rounded w-60 animate-pulse"></div>
-            </div>
-
-
-            {/* Course Grid Skeleton */}
-            <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
-                {[...Array(9)].map((_, index) => (
-                    <CourseCardSkeleton key={index} />
-                ))}
-            </div>
-        </main>
-    );
-}
-
-export default CoursesGridSkeleton;
Index: ontend/src/components/skeletons/HeroCourseDetailsSkeleton.tsx
===================================================================
--- frontend/src/components/skeletons/HeroCourseDetailsSkeleton.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,41 +1,0 @@
-
-function HeroCourseDetailsSkeleton() {
-    return (
-        <div className="bg-shifter py-4">
-            {/*HEADER AND DESCRIPTION*/}
-            <section className="flex flex-col items-center gap-8 bg-white mx-6 px-horizontal-lg pb-12 pt-40 rounded-xl shadow-lg shadow-black/20">
-                {/* Title */}
-                <div className="h-12 bg-gray-300 rounded w-120 animate-pulse"></div>
-
-                {/* Description */}
-                <div className="space-y-2 w-full max-w-5xl">
-                    <div className="h-4 bg-gray-300 rounded w-full animate-pulse"></div>
-                    <div className="h-4 bg-gray-300 rounded w-full animate-pulse"></div>
-                    <div className="h-4 bg-gray-300 rounded w-4/5 animate-pulse"></div>
-                </div>
-
-                {/* Button section */}
-                <div className="flex mt-12 gap-12 items-center bg-gray/60 backdrop-blur-lg border-3 border-black/5 px-2 py-1 w-fit rounded-full">
-                    <div className="h-6 bg-gray-300 rounded w-8 animate-pulse"></div>
-                    <div className="h-12 bg-gray-300 rounded-full w-60 animate-pulse"></div>
-                </div>
-            </section>
-
-            {/*TRIPLE INFO*/}
-            <section className="flex justify-center text-white px-12 py-4 ">
-                {[...Array(3)].map((_, index) => (
-                    <div key={index} className="flex flex-col gap-4 text-left px-20 py-8 border-r-2 border-white/40 last:border-r-0">
-                        <div className="h-8 bg-white/30 rounded w-80 animate-pulse"></div>
-                        <div className="space-y-2">
-                            <div className="h-4 bg-white/20 rounded w-full animate-pulse"></div>
-                            <div className="h-4 bg-white/20 rounded w-full animate-pulse"></div>
-                            <div className="h-4 bg-white/20 rounded w-2/3 animate-pulse"></div>
-                        </div>
-                    </div>
-                ))}
-            </section>
-        </div>
-    );
-}
-
-export default HeroCourseDetailsSkeleton;
Index: ontend/src/components/skeletons/ModalReviewCourseSkeleton.tsx
===================================================================
--- frontend/src/components/skeletons/ModalReviewCourseSkeleton.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,61 +1,0 @@
-import ReactDOM from "react-dom";
-import {X} from "lucide-react";
-import StarOutline from "../../assets/icons/StarOutline";
-
-function ModalReviewCourseSkeleton({closeModal}: {
-    closeModal: () => void;
-}) {
-    return ReactDOM.createPortal(
-        <>
-            {/* Overlay */}
-            <div className="fixed inset-0 bg-gray/60 backdrop-blur-sm z-[1000]"/>
-
-            {/* Modal */}
-            <section
-                className="fixed top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2
-                   bg-white shadow-lg py-4 px-6 z-[1000] max-w-1/2 min-w-1/3
-                   max-h-5/6 rounded-lg flex flex-col items-center gap-6
-                   text-black-text"
-            >
-                {/* Close button */}
-                <button
-                    onClick={closeModal}
-                    className="ml-auto flex justify-end cursor-pointer p-2 hover:bg-shifter/20 rounded-sm"
-                >
-                    <X size={24} strokeWidth={1.5}/>
-                </button>
-
-                {/* Title skeleton */}
-                <div className="h-8 bg-gray-300 rounded w-80 animate-pulse"></div>
-
-                {/* Stars skeleton */}
-                <div className="flex flex-col gap-2 items-center">
-                    <div className="flex gap-4">
-                        {[1, 2, 3, 4, 5].map((star) => (
-                            <StarOutline
-                                key={star}
-                                className="w-8 h-8 text-gray-300 rounded animate-pulse"
-                            />
-                        ))}
-                    </div>
-                    {/* Star text skeleton */}
-                    <div className="h-6 bg-gray-300 rounded w-48 animate-pulse"></div>
-                </div>
-
-                {/* Textarea skeleton */}
-                <div className="w-full flex flex-col gap-1">
-                    <div className="w-full h-24 bg-gray-300 rounded-sm animate-pulse"></div>
-                    <div className="h-3 bg-gray-300 rounded w-16 animate-pulse"></div>
-                </div>
-
-                {/* Submit button skeleton */}
-                <div className="flex gap-6 mr-auto">
-                    <div className="h-10 bg-gray-300 rounded-sm w-32 animate-pulse"></div>
-                </div>
-            </section>
-        </>,
-        document.getElementById("portal")!
-    );
-}
-
-export default ModalReviewCourseSkeleton;
Index: ontend/src/components/skeletons/ProfileModalAddSkills&InterestsSkeleton.tsx
===================================================================
--- frontend/src/components/skeletons/ProfileModalAddSkills&InterestsSkeleton.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,58 +1,0 @@
-import ReactDom from "react-dom";
-import {X} from "lucide-react";
-import {useEffect} from "react";
-
-function ProfileModalAddSkillsInterestsSkeleton({closeModal}: {
-    closeModal: () => void;
-}) {
-    useEffect(() => {
-        // Disable scroll
-        document.body.classList.add("overflow-hidden");
-
-        // Cleanup: re-enable scroll when modal unmounts
-        return () => {
-            document.body.classList.remove("overflow-hidden");
-        };
-    }, []);
-
-    return ReactDom.createPortal(
-        <>
-            {/*OVERFLOW*/}
-            <div className="fixed top-0 bottom-0 left-0 right-0 bg-black/70 z-1000"/>
-
-            <section className="fixed top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 bg-white shadow-lg py-4 px-6 z-1000
-                     max-w-2/3 max-h-5/6 rounded-lg flex flex-col gap-4">
-                <button
-                    onClick={closeModal}
-                    className="hover:bg-black/10 transition-all duration-300 ease-out ml-auto px-2 w-fit rounded-sm cursor-pointer">
-                    <X size={32} />
-                </button>
-
-                <div className="flex justify-between w-full flex-wrap gap-2">
-                    {/* Label skeleton */}
-                    <div className="h-7 bg-gray-300 rounded w-32 animate-pulse"></div>
-
-                    {/* Search input skeleton */}
-                    <div className="h-8 bg-gray-300 rounded-md w-48 animate-pulse"></div>
-                </div>
-
-                <div className="relative custom-scrollbar flex gap-2 flex-wrap w-full items-center overflow-y-auto">
-                    {/* Option buttons skeleton */}
-                    {[...Array(28)].map((_, index) => (
-                        <div
-                            key={index}
-                            className="h-8 bg-gray-300 rounded-md animate-pulse"
-                            style={{
-                                width: `${Math.floor(Math.random() * 60) + 80}px`
-                            }}
-                        >
-                        </div>
-                    ))}
-                </div>
-            </section>
-        </>,
-        document.getElementById("portal")!
-    )
-}
-
-export default ProfileModalAddSkillsInterestsSkeleton;
Index: ontend/src/components/skeletons/ProfileSkeleton.tsx
===================================================================
--- frontend/src/components/skeletons/ProfileSkeleton.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,52 +1,0 @@
-
-function ProfileSkeleton() {
-    return (
-        <main className="grid grid-cols-4 gap-x-12 py-vertical-lg pt-30 px-horizontal-md bg-dark-blue/5">
-            <div className="col-span-1 flex flex-col gap-6">
-                {/* ProfileInfo Skeleton */}
-                <section className="border-1 border-dark-blue/10 flex flex-col gap-6 items-center justify-center bg-white w-full rounded-xl p-8">
-                    {/* Avatar skeleton */}
-                    <div className="border-3 border-white/40 rounded-full bg-gray-300 w-1/2 aspect-square flex items-center justify-center animate-pulse"></div>
-
-                    {/* Name and email skeleton */}
-                    <div className="flex flex-col gap-2 w-full items-center">
-                        <div className="h-8 bg-gray-300 rounded w-4/5 animate-pulse"></div>
-                        <div className="h-6 bg-gray-300 rounded w-full animate-pulse"></div>
-                    </div>
-                </section>
-
-                {/* ProfileSkillsInterests Skeletons - 3 sections */}
-                {["Learned Skills", "Desired Skills", "Interests"].map((_, index) => (
-                    <section key={index} className="flex flex-col gap-2 items-start w-full rounded-xl">
-                        <div className="h-8 bg-gray-300 rounded w-32 animate-pulse"></div>
-                        <div className="flex gap-2 w-full flex-wrap border-1 border-dark-blue/10 bg-white rounded-lg p-4">
-                            {/* Skills pills skeleton */}
-                            {[...Array(4)].map((_, pillIndex) => (
-                                <div key={pillIndex} className="h-8 bg-gray-300 rounded-md w-20 animate-pulse"></div>
-                            ))}
-                            {/* Show more button skeleton */}
-                            <div className="h-8 bg-gray-300 rounded w-16 animate-pulse"></div>
-                        </div>
-                    </section>
-                ))}
-            </div>
-
-            <div className="col-span-3">
-                {/* ProfileMyProfile Skeleton */}
-                <section className="flex flex-col gap-4 items-start">
-                    <div className="h-10 bg-gray-300 rounded w-32 animate-pulse"></div>
-                    <div className="flex flex-col gap-6 px-24 py-6 border-1 border-dark-blue/10 bg-white rounded-lg w-full">
-                        {/* Form inputs skeleton */}
-                        {[...Array(3)].map((_, index) => (
-                            <div key={index} className="h-12 bg-gray-300 rounded-sm w-full animate-pulse"></div>
-                        ))}
-                        {/* Submit button skeleton */}
-                        <div className="h-10 bg-gray-300 rounded-sm w-32 animate-pulse"></div>
-                    </div>
-                </section>
-            </div>
-        </main>
-    );
-}
-
-export default ProfileSkeleton;
Index: ontend/src/context/AuthContext.tsx
===================================================================
--- frontend/src/context/AuthContext.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,170 +1,0 @@
-import React, {
-    createContext,
-    useState,
-    useEffect,
-    type ReactNode,
-    type Dispatch,
-    type SetStateAction,
-} from "react";
-import type {User} from "../models/javaObjects/User.tsx";
-import {loginApi, logoutApi, personalizeApi, refreshAccessTokenApi, registerApi, verifyApi} from "../api/authApi.ts";
-import {useNavigate} from "react-router-dom";
-import type {UserPersonalization} from "../models/javaObjects/UserPersonalization.tsx";
-
-interface AuthContextType {
-    user: User | null;
-    setUser: Dispatch<SetStateAction<User | null>>;
-    accessToken: string | null;
-    setAccessToken: Dispatch<SetStateAction<string | null>>;
-    authChecked: boolean;
-    setAuthChecked: Dispatch<SetStateAction<boolean>>;
-    register: (email: string, password: string) => Promise<void>;
-    verify: (verificationToken: string) => Promise<string>;
-    personalize: (user: UserPersonalization) => Promise<void>;
-    login: (email: string, password: string) => Promise<void>;
-    logout: () => void;
-    refreshAccessToken: () => Promise<void>;
-    loading: boolean;
-    useFreeConsultation: () => void;
-}
-
-export const AuthContext = createContext<AuthContextType | undefined>(
-    undefined
-);
-
-export const AuthProvider = ({children}: { children: ReactNode }) => {
-    const [user, setUser] = useState<User | null>(null);
-    const [accessToken, setAccessToken] = useState<string | null>(null);
-    const [authChecked, setAuthChecked] = useState<boolean>(false);
-    const [loading, setLoading] = useState(true);
-    const navigate = useNavigate();
-
-    const useFreeConsultation = () => {
-        if (user) {
-            setUser({...user, hasUsedFreeConsultation: true});
-        }
-    }
-
-    const register = async (email: string, password: string) => {
-        return registerApi(email, password)
-            .then(() => {
-                console.log("Successfully registered and sent email to user");
-            })
-            .catch(error => {
-                console.log("Registration failed:", error);
-                throw error;
-            });
-    }
-
-    const verify = async (verificationToken: string) => {
-        return verifyApi(verificationToken)
-            .then(userEmail => {
-                console.log("Successfully verified user email");
-                return userEmail;
-            })
-            .catch(error => {
-                console.log("Verification failed:", error);
-                throw error;
-            });
-    }
-
-    const personalize = async (user: UserPersonalization) => {
-        return personalizeApi(user)
-            .then(data => {
-                setAccessToken(data.accessToken);
-                setUser(data.user);
-            })
-            .catch(error => {
-                setAccessToken(null);
-                setUser(null);
-                console.log("Personalization failed:", error);
-                throw error;
-            });
-    }
-
-    const login = async (email: string, password: string) => {
-        return loginApi(email, password)
-            .then(data => {
-                setAccessToken(data.accessToken);
-                setUser(data.user);
-            })
-            .catch(error => {
-                    setAccessToken(null);
-                    setUser(null);
-                    console.log("Login failed:", error);
-                    throw error;
-            });
-    };
-
-    const logout = async () => {
-        return logoutApi()
-            .then(() => {
-                setAccessToken(null);
-                setUser(null);
-                navigate("/");
-            })
-            .catch(err => {
-                console.warn("Logout failed:", err);
-                throw err;
-            });
-    };
-
-
-    const refreshAccessToken = async () => {
-        setLoading(true);
-
-        return refreshAccessTokenApi()
-            .then(data => {
-                // console.log(data.accessToken)
-                // console.log(encodeURIComponent(Intl.DateTimeFormat().resolvedOptions().timeZone))
-                setAccessToken(data.accessToken);
-                setUser(data.user);
-            })
-            .catch(error => {
-                setAccessToken(null);
-                setUser(null);
-                console.log("Refresh token failed: ", error);
-                throw error;
-            })
-            .finally(() => {
-                setLoading(false);
-                setAuthChecked(true);
-            })
-    };
-
-    useEffect(() => {
-        refreshAccessToken();
-    }, []);
-
-    return (
-        <AuthContext.Provider
-            value={{
-                user,
-                setUser,
-                accessToken,
-                setAccessToken,
-                authChecked,
-                setAuthChecked,
-                useFreeConsultation,
-                register,
-                verify,
-                personalize,
-                login,
-                logout,
-                refreshAccessToken,
-                loading,
-            }}
-        >
-            {children}
-        </AuthContext.Provider>
-    );
-};
-
-// Custom hook for ease of use
-export const useAuthContext = () => {
-    const context = React.useContext(AuthContext);
-    if (!context) {
-        throw new Error("useGlobalContext must be used within a GlobalProvider");
-    }
-    return context;
-};
Index: ontend/src/context/CourseStorage.ts
===================================================================
--- frontend/src/context/CourseStorage.ts	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,32 +1,0 @@
-import { create } from "zustand";
-import type {CoursePreview} from "../models/javaObjects/CoursePreview.tsx";
-import type {Enrollment} from "../models/javaObjects/Enrollment.tsx";
-
-
-interface CourseStorage {
-    enrollments: Enrollment[] | null;
-    recommendedCourses: CoursePreview[] | null;
-    allCourses: CoursePreview[] | null;
-    // topics: string[] | null;
-    // skills: string[] | null;
-
-    setEnrollments: (enrollments: Enrollment[] | null) => void;
-    setRecommendedCourses: (courses: CoursePreview[]) => void;
-    setAllCourses: (courses: CoursePreview[]) => void;
-    // setTopics: (topics: string[]) => void;
-    // setSkills: (skills: string[]) => void;
-}
-
-export const useCourseStorage = create<CourseStorage>((set) => ({
-    enrollments: null,
-    recommendedCourses: null,
-    allCourses: null,
-    // topics: null,
-    // skills: null,
-
-    setEnrollments: (enrollments) => set({ enrollments: enrollments }),
-    setRecommendedCourses: (courses) => set({ recommendedCourses: courses }),
-    setAllCourses: (courses) => set({ allCourses: courses }),
-    // setTopics: (topics) => set({ topics }),
-    // setSkills: (skills) => set({ skills })
-}));
Index: ontend/src/global.css
===================================================================
--- frontend/src/global.css	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,232 +1,0 @@
-@import "tailwindcss";
-
-@theme {
-    --spacing-horizontal-xl: 12rem;
-    --spacing-horizontal-lg: 10rem;
-    --spacing-horizontal-md: 7rem;
-    --spacing-horizontal-sm: 4rem;
-
-    --spacing-vertical-xl: 5rem;
-    --spacing-vertical-lg: 3rem;
-    --spacing-vertical-md: 2rem;
-    --spacing-vertical-sm: 1rem;
-
-    --spacing-top-nav-xl: 9rem;
-    --spacing-top-nav-lg: 8rem;
-    --spacing-top-nav-md: 7rem;
-    --spacing-top-nav-sm: 6rem;
-
-    --spacing-between-lg: 6rem;
-    --spacing-between-md: 4rem;
-    --spacing-between-sm: 2rem;
-
-
-    --color-beige: #F8F6F5;
-    --color-shifter: #008CC2;
-    --color-red: #E63946;
-    --color-dark-blue: #002E5D;
-    --color-deep-green: #2C6B3D;
-    --color-gold: #FFB300;
-    --color-teal: #009688;
-    --color-dark-gray: #666;
-    --color-bright-gray: #DDDDDD;
-    --color-gray: #E5E7EBFF;
-    --color-black-text: #333333;
-    --color-white-text: #F8F8F8;
-
-
-    --shadow-up-sm: 0 -1px 2px 0 rgba(0, 0, 0, 0.05);
-    --shadow-up: 0 -1px 3px 0 rgba(0, 0, 0, 0.1), 0 -1px 2px 0 rgba(0, 0, 0, 0.06);
-    --shadow-up-md: 0 -4px 6px -1px rgba(0, 0, 0, 0.1), 0 -2px 4px -2px rgba(0, 0, 0, 0.06);
-    --shadow-up-lg: 0 -10px 15px -3px rgba(0, 0, 0, 0.1), 0 -4px 6px -4px rgba(0, 0, 0, 0.05);
-    --shadow-up-xl: 0 -20px 25px -5px rgba(0, 0, 0, 0.1), 0 -10px 10px -5px rgba(0, 0, 0, 0.04);
-    --shadow-up-2xl: 0 -25px 50px -12px rgba(0, 0, 0, 0.25);
-
-
-    --font-montserrat-regular: 'Montserrat', sans-serif;
-    --font-montserrat-medium: 'Montserrat', sans-serif;
-    --font-montserrat-semibold: 'Montserrat', sans-serif;
-    --font-montserrat-bold: 'Montserrat', sans-serif;
-}
-
-@font-face {
-    font-family: 'Montserrat';
-    font-style: normal;
-    font-weight: 300;
-    src: url("assets/fonts/Montserrat-Light.ttf") format('woff2');
-}
-
-@font-face {
-    font-family: 'Montserrat';
-    font-style: normal;
-    font-weight: 400;
-    src: url("assets/fonts/Montserrat-Regular.ttf") format('woff2');
-}
-
-@font-face {
-    font-family: 'Montserrat';
-    font-style: normal;
-    font-weight: 500;
-    src: url("assets/fonts/Montserrat-Medium.ttf") format('woff2');
-}
-
-@font-face {
-    font-family: 'Montserrat';
-    font-style: normal;
-    font-weight: 600;
-    src: url("assets/fonts/Montserrat-SemiBold.ttf") format('woff2');
-}
-
-@font-face {
-    font-family: 'Montserrat';
-    font-style: normal;
-    font-weight: 700;
-    src: url("assets/fonts/Montserrat-Bold.ttf") format('woff2');
-}
-
-:root {
-    --color-white: #F8F8F8;
-    --color-black: #202024;
-
-    font-family: system-ui, Avenir, Helvetica, Arial, sans-serif;
-    line-height: 1.5;
-    font-weight: 400;
-
-    font-synthesis: none;
-    text-rendering: optimizeLegibility;
-    -webkit-font-smoothing: antialiased;
-    -moz-osx-font-smoothing: grayscale;
-}
-
-#root {
-    min-height: 100vh;
-    display: flex;
-    flex-direction: column;
-    background: var(--color-white);
-    width: 100%;
-    margin: 0 0;
-    padding: 0;
-    text-align: center;
-    font-family: 'Nunito', sans-serif;
-    /*@apply font-sans;*/
-}
-
-body {
-    background: #EEE;
-    margin: 0;
-    display: flex;
-    flex-direction: column;
-    /*width: 100vw;*/
-    place-items: center;
-    /*min-width: 320px;*/
-    min-height: 100vh;
-}
-
-/* Customize scrollbar for Webkit browsers (Chrome, Safari, Edge) */
-.custom-scrollbar::-webkit-scrollbar {
-    width: .6rem;
-    height: .6rem;
-}
-
-.custom-scrollbar::-webkit-scrollbar-track {
-    background: #f0f0f0;
-    border-radius: 40px;
-}
-
-.custom-scrollbar::-webkit-scrollbar-thumb {
-    background-color: rgba(100, 100, 100, 0.5);
-    border-radius: 4px;
-    border: 2px solid transparent;
-    background-clip: content-box;
-}
-
-/* Firefox scrollbar */
-.custom-scrollbar {
-    scrollbar-width: thin;
-    scrollbar-color: rgba(100, 100, 100, 0.5) #f0f0f0;
-}
-
-
-
-.scrollable-show {
-    scrollbar-width: thin;
-    scrollbar-color: rgba(100, 100, 100, 0.5) transparent;
-    -ms-overflow-style: auto;
-}
-.scrollable-show::-webkit-scrollbar {
-    display: block;
-    width: 6px;
-}
-.scrollable-show::-webkit-scrollbar-thumb {
-    background-color: rgba(0,0,0,0.4);
-    border-radius: 4px;
-}
-.scrollable-show::-webkit-scrollbar-track {
-    background: transparent;
-}
-
-.scrollable {
-    scrollbar-width: thin;
-    scrollbar-color: transparent transparent;
-}
-.scrollable::-webkit-scrollbar {
-    background: transparent;
-}
-.scrollable::-webkit-scrollbar-thumb {
-    background-color: transparent;
-}
-.scrollable:hover {
-    scrollbar-color: rgba(0, 0, 0, 0.4) transparent;
-}
-.scrollable:hover::-webkit-scrollbar-thumb {
-    background-color: rgba(0,0,0,0.4);
-    border-radius: 4px;
-}
-
-
-input:-webkit-autofill,
-input:-webkit-autofill:hover,
-input:-webkit-autofill:focus,
-textarea:-webkit-autofill,
-textarea:-webkit-autofill:hover,
-textarea:-webkit-autofill:focus,
-select:-webkit-autofill {
-    transition: background-color 9999s ease-in-out 0s;
-    -webkit-text-fill-color: #000 !important;
-}
-
-
-/* HTML: <div class="loader"></div> */
-.loader, .loader-white {
-    /*margin-left: 20px;*/
-    /*width: 40px;*/
-    aspect-ratio: 1;
-    display: grid;
-    border: 4px solid #0000;
-    border-radius: 50%;
-    animation: l15 1s infinite linear;
-}
-.loader-white {
-    border-right-color: var(--color-white);
-}
-.loader {
-    border-right-color: var(--color-shifter);
-}
-.loader::before,
-.loader::after,
-.loader-white::before,
-.loader-white::after {
-    content: "";
-    grid-area: 1/1;
-    margin: 2px;
-    border: inherit;
-    border-radius: 50%;
-    animation: l15 2s infinite;
-}
-.loader::after, .loader-white::after {
-    margin: 8px;
-    animation-duration: 3s;
-}
-@keyframes l15{
-    100%{transform: rotate(1turn)}
-}
Index: ontend/src/hooks/useCourseLearn.tsx
===================================================================
--- frontend/src/hooks/useCourseLearn.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,215 +1,0 @@
-import {useEffect, useState} from "react";
-import type {CourseFull} from "../models/javaObjects/CourseFull.tsx";
-import type {CourseLectureFull} from "../models/javaObjects/CourseLectureFull.tsx";
-import {fetchCourseCertificateApi, fetchCourseFullApi} from "../api/courseApi.ts";
-import {fetchPresignedUrlApi} from "../api/s3Api.ts";
-import {completeLectureApi, uncompleteLectureApi} from "../api/userCourseProgressApi.ts";
-
-export function useCourseLearn(courseId: number, accessToken: string) {
-    const [course, setCourse] = useState<CourseFull | null>(null);
-    const [activeLecture, setActiveLecture] = useState<CourseLectureFull | null>(null);
-    const [loading, setLoading] = useState(true);
-    const [videoUrl, setVideoUrl] = useState<string>("");
-    const [isDownloading, setIsDownloading] = useState(false);
-    const [isLastLectureFinished, setIsLastLectureFinished] = useState(false);
-    const [progressPercentage, setProgressPercentage] = useState(0);
-
-    const courseFinishedPunchlines = [
-        "🎓 Course Completed - The Future is Yours to Shape!",
-        "🔥 Course Completed - Your Hard Work is Paying Off!",
-        "🌟 Course Completed - You’re Unlocking Your True Potential!",
-        "🚀 Course Completed - Your Journey to Success Continues!",
-        "🏆 Course Completed - You’re One Step Closer to Your Dreams!",
-        "💪 Course Completed - You’ve Proven Your Dedication!",
-        "✨ Course Completed - Your Growth is Inspiring!",
-        "🎉 Course Completed - You’re Ready for New Challenges!",
-        "💡 Course Completed - Your Knowledge is Expanding!",
-        "🎯 Course Completed - You’re Hitting Your Targets!",
-        "🌍 Course Completed - You’re Making an Impact!",
-        "💥 Course Completed - You’re Breaking Barriers!",
-        "🚀 Course Completed - Your Journey is Just Beginning!",
-        "💫 Course Completed - You’re Reaching New Heights!",
-        "🌟 Course Completed - You’re a Star in the Making!",
-        "🎓 Course Completed - Your Knowledge is Your Superpower!",
-        "🎉 Course Completed - You’re a Force to be Reckoned With!",
-        "💪 Course Completed - Your Strength is Unmatched!",
-        "💡 Course Completed - Keep Growing, Keep Shining!",
-        "🚀 Course Completed - The Sky is Not the Limit, It’s Just the Beginning!",
-        "🌟 Course Completed - Your Potential is Limitless!",
-        "🎉 Course Completed - Celebrate Your Success and Keep Moving Forward!",
-        "🏆 Course Completed - You’ve Earned Your Place Among the Best!",
-        "💪 Course Completed - Your Determination is Unstoppable!",
-    ]
-
-    useEffect(() => {
-        if (!course?.courseContents) return;
-        const completedLectures = course.courseContents.flatMap(content =>
-            content.courseLectures.filter(lecture => lecture.userCourseProgress.completed)
-        ) || [];
-
-        const totalLectures = course.courseContents.flatMap(content => content.courseLectures) || [];
-
-        setProgressPercentage(
-            Math.round((completedLectures.length / (totalLectures.length || 1)) * 100)
-        );
-    }, [course?.courseContents]);
-
-    useEffect(() => {
-        setLoading(true);
-        fetchCourseFullApi(courseId, accessToken)
-            .then(resCourse => {
-                setCourse(resCourse);
-                const firstUncompletedLecture = resCourse?.courseContents
-                    ?.flatMap(content => content.courseLectures)
-                    ?.find(lecture => !lecture.userCourseProgress.completed);
-                setActiveLecture(firstUncompletedLecture || resCourse?.courseContents[0]?.courseLectures[0] || null);
-            })
-            .catch(err => console.error("Error fetching full course api: ", err))
-            .finally(() => setLoading(false));
-    }, [courseId, accessToken]);
-
-
-    useEffect(() => {
-        if (activeLecture?.contentType === "VIDEO") {
-            getPresignedUrl(60 * 60) // 1 hour
-                .then(url => setVideoUrl(url || ""))
-                .catch(err => console.error("Error fetching video URL: ", err));
-        } else {
-            setVideoUrl("");
-        }
-    }, [activeLecture, accessToken, courseId]);
-
-    const getPresignedUrl = async (expirySeconds: number): Promise<string | undefined> => {
-        if (!activeLecture) return undefined;
-        const encodedFileName = encodeURIComponent(activeLecture.contentFileName);
-        try {
-            const url = await fetchPresignedUrlApi(accessToken, courseId, activeLecture.id, encodedFileName, expirySeconds);
-            return url;
-        } catch (err) {
-            console.error("Error fetching presigned URL: ", err);
-            return undefined;
-        }
-    };
-
-    const triggerDownload = async () => {
-        if (!activeLecture) return;
-
-        setIsDownloading(true);
-        try {
-            const url = await getPresignedUrl(60 * 5); // 5 minutes expiry
-            if (!url) {
-                console.error("No presigned URL available");
-                setIsDownloading(false);
-                return;
-            }
-
-            // Create temporary link element to download the file
-            const a = document.createElement("a");
-            a.href = url;
-            document.body.appendChild(a);
-            a.click();
-            document.body.removeChild(a);
-
-            updateLecture(activeLecture.userCourseProgress.id, true);
-        } catch (error) {
-            console.error("Download failed:", error);
-        } finally {
-            setIsDownloading(false);
-        }
-    };
-
-    const downloadCertificate = async () => {
-        try {
-            const response = await fetchCourseCertificateApi(Number(courseId || -1), accessToken || "");
-
-            const pdfBlob = response.data;
-
-            const disposition = response.headers['content-disposition'] || response.headers['Content-Disposition'];
-            let filename = `Shifter_Certificate_${courseId}.pdf`; // Fallback filename
-
-            if (disposition) {
-                const filenameMatch = disposition.match(/filename="(.+?)"|filename\*=UTF-8''(.+)/i);
-                if (filenameMatch) {
-                    // Prioritize the filename from the second capture group (UTF-8 encoding)
-                    // otherwise use the first group.
-                    filename = filenameMatch[2] || filenameMatch[1];
-
-                    // Clean up the filename if it was URL-encoded (common for UTF-8)
-                    if (filename.includes('%')) {
-                        filename = decodeURIComponent(filename);
-                    }
-                }
-            }
-
-            const url = window.URL.createObjectURL(pdfBlob);
-
-            const a = document.createElement('a');
-            a.href = url;
-            a.download = filename;
-            document.body.appendChild(a);
-            a.click();
-
-            window.URL.revokeObjectURL(url);
-            a.remove();
-
-        } catch (error) {
-            console.error("Error during certificate download:", error);
-            alert('Failed to download certificate. Check authentication or permissions.');
-        }
-    }
-
-    const updateLecture = (progressId: number, isComplete: boolean) => {
-        if (!course) return;
-
-        const oldCourse = structuredClone(course);
-        const updatedCourse = {
-            ...course,
-            courseContents: course.courseContents.map(content => ({
-                ...content,
-                courseLectures: content.courseLectures.map(lecture =>
-                    lecture.userCourseProgress.id === progressId
-                        ? {
-                            ...lecture,
-                            userCourseProgress: {
-                                ...lecture.userCourseProgress,
-                                completed: isComplete,
-                                completedAt: isComplete ? new Date() : null,
-                            },
-                        }
-                        : lecture
-                ),
-            })),
-        };
-
-        setCourse(updatedCourse);
-
-        const apiCall = isComplete
-            ? completeLectureApi(progressId, accessToken)
-            : uncompleteLectureApi(progressId, accessToken);
-
-        apiCall
-            .catch(err => {
-                console.error("Error updating lecture: ", err);
-                setCourse(oldCourse);
-            });
-    };
-
-    return {
-        course,
-        setCourse,
-        activeLecture,
-        setActiveLecture,
-        loading,
-        videoUrl,
-        isDownloading,
-        setIsDownloading,
-        updateLecture,
-        triggerDownload,
-        downloadCertificate,
-        getPresignedUrl,
-        isLastLectureFinished,
-        setIsLastLectureFinished,
-        courseFinishedPunchlines,
-        progressPercentage
-    };
-}
Index: ontend/src/hooks/useEnrollUserInCourse.tsx
===================================================================
--- frontend/src/hooks/useEnrollUserInCourse.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,38 +1,0 @@
-import { useNavigate } from "react-router-dom";
-import { enrollUserApi } from "../api/enrollmentApi.ts";
-import { useAuthContext } from "../context/AuthContext.tsx";
-import { useCourseStorage } from "../context/CourseStorage.ts";
-import { showInfoToast } from "../utils/showInfoToast.ts";
-import { slugify } from "../utils/slug.ts";
-import type { Enrollment } from "../models/javaObjects/Enrollment.tsx";
-import {fetchRecommendedCoursesApi} from "../api/courseApi.ts";
-
-export function useEnrollUserInCourse(courseId: number, courseTitleShort: string | undefined) {
-    const { user, accessToken } = useAuthContext();
-    const navigate = useNavigate();
-    const { enrollments, setEnrollments, allCourses, setAllCourses, setRecommendedCourses } = useCourseStorage();
-
-    async function enroll() {
-        if (!user) {
-            showInfoToast("Please log in to enroll in the javaObjects.");
-        }
-
-        try {
-            const enrollment: Enrollment = await enrollUserApi(courseId, accessToken || "");
-
-            setAllCourses(allCourses?.filter(course => course.id !== courseId) || [])
-            setEnrollments([...(enrollments ?? []), enrollment]);
-
-            const recommendedCourses = await fetchRecommendedCoursesApi(accessToken || "");
-            setRecommendedCourses(recommendedCourses);
-
-            navigate(`/learn/${courseId}/${slugify(courseTitleShort || "")}`);
-            console.log("User enrolled in javaObjects successfully");
-        } catch (error) {
-            console.error("Error enrolling user in javaObjects:", error);
-            throw error;
-        }
-    }
-
-    return { enroll };
-}
Index: ontend/src/hooks/useEnrolledCourses.tsx
===================================================================
--- frontend/src/hooks/useEnrolledCourses.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,56 +1,0 @@
-import {useEffect, useState} from "react";
-import type {CoursePreview} from "../models/javaObjects/CoursePreview.tsx";
-import {fetchCoursesApi, fetchEnrolledCoursesApi} from "../api/courseApi.ts";
-import {useAuthContext} from "../context/AuthContext.tsx";
-import {useCourseStorage} from "../context/CourseStorage.ts";
-import type {CoursePreviewEnrolled} from "../models/javaObjects/CoursePreviewEnrolled.tsx";
-
-export function useEnrolledCourses() {
-    const {allCourses: allCoursesStorage, setAllCourses: setAllCoursesStorage} = useCourseStorage();
-    const {accessToken} = useAuthContext();
-    const [enrolledCourses, setEnrolledCourses] = useState<CoursePreviewEnrolled[]>([]);
-    const [allCourses, setAllCourses] = useState<CoursePreview[]>(allCoursesStorage || []);
-    const [loading, setLoading] = useState<boolean>(true);
-
-    useEffect(() => {
-        setLoading(true);
-        // Enrolled courses
-        fetchEnrolledCoursesApi(accessToken || "")
-            .then(data => {
-                setEnrolledCourses(data);
-            })
-            .catch(error => {
-                console.error("Failed to fetch enrolled courses:", error);
-            })
-            .finally(() => setLoading(false));
-
-        // All courses to get the users favorite courses
-        if (allCoursesStorage && allCoursesStorage.length > 0) {
-            return;
-        }
-        const storedCourses = sessionStorage.getItem("allCourses");
-        const parsedCourses = storedCourses ? JSON.parse(storedCourses) : null;
-        if (parsedCourses) {
-            setAllCoursesStorage(parsedCourses);
-            setAllCourses(parsedCourses);
-            return;
-        }
-
-        fetchCoursesApi(accessToken || "")
-            .then(courses => {
-                setAllCoursesStorage(courses);
-                setAllCourses(courses);
-                sessionStorage.setItem("allCourses", JSON.stringify(courses));
-            })
-            .catch(err => {
-                console.error("Failed to fetch courses:", err);
-            })
-    }, [accessToken]);
-
-    return {
-        enrolledCourses,
-        setEnrolledCourses,
-        allCourses,
-        loading
-    }
-}
Index: ontend/src/hooks/usePersonalizeHook.tsx
===================================================================
--- frontend/src/hooks/usePersonalizeHook.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,126 +1,0 @@
-import {useEffect, useState} from "react";
-import {useAuthContext} from "../context/AuthContext.tsx";
-import type {UserPersonalization} from "../models/javaObjects/UserPersonalization.tsx";
-import {useNavigate} from "react-router-dom";
-import PersonalizeStepOne from "../components/registerSteps/PersonalizeStepOne.tsx";
-import PersonalizationStepTwo from "../components/registerSteps/PersonalizationStepTwo.tsx";
-import PersonalizationStepThree from "../components/registerSteps/PersonalizationStepThree.tsx";
-
-export function usePersonalizeHook() {
-    const {verify, personalize} = useAuthContext();
-    const [verificationChecked, setVerificationChecked] = useState<boolean>(false);
-    const [isVerified, setIsVerified] = useState(false);
-    const [isLoading, setIsLoading] = useState<boolean>(false);
-    const [activeStep, setActiveStep] = useState(0);
-    const [showError, setShowError] = useState(false);
-    const [error, setError] = useState("");
-    const [direction, setDirection] = useState(0); // 1 for next, -1 for back
-    const [user, setUser] = useState<UserPersonalization>({
-        name: "",
-        email: "",
-        workPosition: "",
-        companySize: "",
-        interests: [],
-        desiredSkills: [],
-    });
-    const navigate = useNavigate();
-
-    const handleNext = async () => {
-        if (error.length > 0) {
-            setShowError(true);
-            return;
-        }
-
-        setError("");
-        setShowError(false);
-        setDirection(1);
-        setActiveStep((prev) => prev + 1);
-    };
-
-    const handleBack = () => {
-        setDirection(-1);
-        setActiveStep((prev) => prev - 1);
-    };
-
-    const variants = {
-        enter: (dir: number) => ({
-            x: dir > 0 ? 100 : -100,
-            opacity: 0,
-        }),
-        center: {
-            x: 0,
-            opacity: 1,
-        },
-        exit: (dir: number) => ({
-            x: dir > 0 ? -100 : 100,
-            opacity: 0,
-        }),
-    };
-
-    const stepsContent = [
-        <PersonalizeStepOne setUser={setUser} user={user} setError={setError}/>,
-        <PersonalizationStepTwo setUser={setUser} user={user} setError={setError}/>,
-        <PersonalizationStepThree setUser={setUser} user={user} setError={setError}/>
-    ];
-
-
-    const handleVerify = async () => {
-        const params = new URLSearchParams(window.location.search);
-        const verificationToken = params.get("token");
-
-        verify(verificationToken || "")
-            .then((userEmail) => {
-                setUser({
-                    ...user,
-                    email: userEmail,
-                })
-                setIsVerified(true);
-            })
-            .catch(err => {
-                setIsVerified(false);
-                setError("Verification failed. Please try again.");
-                setShowError(true);
-                console.error("Error verifying user " + err);
-            })
-            .finally(() => setVerificationChecked(true))
-    }
-
-    const handlePersonalize = async () => {
-        if (!isVerified) {
-            setError("Verification failed. Please try again.");
-            setShowError(true);
-            return;
-        }
-        setIsLoading(true);
-        personalize(user)
-            .then(() => {
-                navigate("/");
-            })
-            .catch(err => {
-                setError("Personalization failed. Please try again.");
-                setShowError(true);
-                console.error("Error personalizing account for user: ", err);
-            })
-            .finally(() => setIsLoading(false));
-    }
-
-
-    useEffect(() => {
-        handleVerify()
-    }, [])
-
-    return {
-        verificationChecked,
-        isVerified,
-        isLoading,
-        activeStep,
-        showError,
-        error,
-        direction,
-        variants,
-        stepsContent,
-        handleNext,
-        handleBack,
-        handlePersonalize
-    }
-}
Index: ontend/src/hooks/useRegisterHook.tsx
===================================================================
--- frontend/src/hooks/useRegisterHook.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,81 +1,0 @@
-import React, {useEffect, useState} from "react";
-import {useAuthContext} from "../context/AuthContext.tsx";
-import {hasDigit, hasSpecialChar, hasUppercase, isValidEmail} from "../utils/validation.ts";
-import {checkEmailExistsApi} from "../api/authApi.ts";
-
-export function useRegisterHook() {
-    const {register} = useAuthContext();
-    const [email, setEmail] = React.useState("");
-    const [password, setPassword] = React.useState("");
-    const [passwordConfirmation, setPasswordConfirmation] = React.useState("");
-    const [showError, setShowError] = useState(false);
-    const [error, setError] = React.useState("");
-    const [isSuccess, setIsSuccess] = React.useState(false);
-    const [isLoading, setIsLoading] = React.useState<boolean>(false);
-    const [showPassword, setShowPassword] = React.useState(false);
-
-    useEffect(() => {
-        if (!email && !password && !passwordConfirmation)
-            return
-
-        if (!email || !password || !passwordConfirmation) {
-            setError("Please ensure all inputs are completed.");
-        } else if (email && !isValidEmail(email)) {
-            setError("Email must be valid");
-        } else if (password && passwordConfirmation && password !== passwordConfirmation) {
-            setError("Passwords do not match");
-        } else if (!hasUppercase(password)) {
-            setError("Password must contain at least one uppercase letter");
-        } else if (!hasDigit(password)) {
-            setError("Password must contain at least one digit");
-        } else if (!hasSpecialChar(password)) {
-            setError("Password must contain at least one special character");
-        } else {
-            setError("");
-        }
-
-    }, [email, password, passwordConfirmation])
-
-    const handleRegister = async (e: React.FormEvent<HTMLFormElement>) => {
-        e.preventDefault();
-
-        if (error.length > 0) {
-            setShowError(true);
-            return;
-        }
-
-        setIsLoading(true);
-        try {
-            const exists = await checkEmailExistsApi(email);
-
-            if (exists) {
-                setError("This email is already registered. Please sign in or use a different email.");
-                return;
-            }
-
-            await register(email, password);
-            setIsSuccess(true);
-        } catch (err) {
-            console.error("Error checking email:", err);
-            setError("An unexpected error occurred. Please try again later or contact us contact us directly at support@shift-er.com");
-        } finally {
-            setIsLoading(false);
-        }
-    }
-
-    return {
-        email,
-        setEmail,
-        password,
-        setPassword,
-        passwordConfirmation,
-        setPasswordConfirmation,
-        showPassword,
-        setShowPassword,
-        showError,
-        error,
-        isSuccess,
-        isLoading,
-        handleRegister
-    }
-}
Index: ontend/src/i18n.ts
===================================================================
--- frontend/src/i18n.ts	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,77 +1,0 @@
-import i18n from "i18next";
-import { initReactI18next } from "react-i18next";
-
-// Import all namespaces
-import homeEN from "./locales/en/home.json";
-import navbarEN from "./locales/en/navbar.json";
-import footerEN from "./locales/en/footer.json";
-import contactEN from "./locales/en/contact.json";
-import freeConsultationEN from "./locales/en/freeConsultation.json";
-import mentoringEN from "./locales/en/mentoring.json";
-import consultingEN from "./locales/en/consulting.json";
-import academiesEN from "./locales/en/academies.json";
-import aboutEN from "./locales/en/about.json";
-import loginEN from "./locales/en/login.json";
-import registerEN from "./locales/en/register.json";
-import personalizeEN from "./locales/en/personalize.json";
-import coursesEN from "./locales/en/courses.json";
-
-import homeMK from "./locales/mk/home.json";
-import navbarMK from "./locales/mk/navbar.json";
-import footerMK from "./locales/mk/footer.json";
-import contactMK from "./locales/mk/contact.json";
-import freeConsultationMK from "./locales/mk/freeConsultation.json";
-import mentoringMK from "./locales/mk/mentoring.json";
-import consultingMK from "./locales/mk/consulting.json";
-import academiesMK from "./locales/mk/academies.json";
-import aboutMK from "./locales/mk/about.json";
-import loginMK from "./locales/mk/login.json";
-import registerMK from "./locales/mk/register.json";
-import personalizeMK from './locales/mk/personalize.json';
-import coursesMK from "./locales/mk/courses.json";
-
-
-i18n
-    .use(initReactI18next)
-    .init({
-        lng: "en",
-        fallbackLng: "en",
-        ns: ["home", "navbar", "footer", "contact", "freeConsultation", "mentoring", "consulting", "academies", "about",
-        "login", "register", "personalize", "courses"],
-        defaultNS: "home",
-        resources: {
-            en: {
-                home: homeEN,
-                navbar: navbarEN,
-                footer: footerEN,
-                contact: contactEN,
-                freeConsultation: freeConsultationEN,
-                mentoring: mentoringEN,
-                consulting: consultingEN,
-                academies: academiesEN,
-                about: aboutEN,
-                login: loginEN,
-                register: registerEN,
-                personalize: personalizeEN,
-                courses: coursesEN,
-            },
-            mk: {
-                home: homeMK,
-                navbar: navbarMK,
-                footer: footerMK,
-                contact: contactMK,
-                freeConsultation: freeConsultationMK,
-                mentoring: mentoringMK,
-                consulting: consultingMK,
-                academies: academiesMK,
-                about: aboutMK,
-                login: loginMK,
-                register: registerMK,
-                personalize: personalizeMK,
-                courses: coursesMK,
-            }
-        },
-        interpolation: { escapeValue: false },
-    });
-
-export default i18n;
Index: ontend/src/layout/Footer.tsx
===================================================================
--- frontend/src/layout/Footer.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,115 +1,0 @@
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-expect-error
-import ShifterLogo from "../../public/Shifter-S2W-White-Transparent.png";
-import {useAuthContext} from "../context/AuthContext.tsx";
-import LinkedIn from "../assets/icons/LinkedIn.tsx";
-import Instagram from "../assets/icons/Instagram.tsx";
-import NavbarLink from "../components/NavbarLink.tsx";
-
-function Footer() {
-    const {user, logout} = useAuthContext();
-
-    return (
-        <footer className="bg-dark-blue border-t-4 border-white/20">
-            <div className="flex justify-between px-20 py-20">
-                <section className="flex flex-col gap-4 max-w-90">
-                    <img src={ShifterLogo} alt="Shifter - Business Consulting, Mentoring & Online Courses Logo"
-                         className="w-60 "
-                    />
-                    <p className="text-white font-light text-left">
-                        Practical strategies and hands-on guidance to help you overcome obstacles, unlock new
-                        opportunities, and build a thriving business.
-                    </p>
-                </section>
-
-                <div>
-                    <div className="flex gap-20 text-lg text-white">
-
-                        {/*SERVICES*/}
-                        <section className="flex flex-col gap-2 text-left font-light text-lg">
-                            <h3 className="text-white font-bold text-2xl mb-4">Services</h3>
-
-                            <NavbarLink to={"/mentoring"} label={"Mentoring"}/>
-                            <NavbarLink to={"/consulting"} label={"Consulting"}/>
-                            <NavbarLink to={"/courses"} label={"Courses"}/>
-                            <NavbarLink to={"/academies"} label={"Academies"}/>
-                        </section>
-
-                        {/*ABOUT SHIFTER*/}
-                        <section className="flex flex-col gap-2 text-left font-light text-lg">
-                            <h3 className="text-white font-bold text-2xl mb-4">About Us</h3>
-
-                            <NavbarLink to={"/about"} label={"About Shifter"}/>
-                        </section>
-
-                        {/*PROFILE*/}
-                        <section className="flex flex-col gap-2 text-left font-light text-lg">
-                            <h3 className="text-white font-bold text-2xl mb-4">Profile</h3>
-
-                            {user ?
-                                <>
-                                    <NavbarLink to={"/profile"} label={"Profile"}/>
-                                    <div className="flex flex-col gap-0 overflow-clip group w-fit">
-                                        <button
-                                            onClick={logout}
-                                            className="transition-all duration-300 ease-in-out z-10 cursor-pointer"
-                                        >
-                                            Log Out
-                                        </button>
-                                        <hr className="relative -left-30 group-hover:-left-4 border-t-2
-                                            rounded-full transition-all duration-300 ease-in-out"/>
-                                    </div>
-                                </> :
-                                <NavbarLink to={"/login"} label={"Log In / Sign Up"}/>
-                            }
-                        </section>
-
-                        {/*DASHBOARD*/}
-                        {
-                            user &&
-                            <section className="flex flex-col gap-2 text-left font-light text-lg">
-                                <h3 className="text-white font-bold text-2xl mb-4">Dashboard</h3>
-
-                                <NavbarLink to={"/profile"} label={"Profile"}/>
-                                <NavbarLink to={"/learn"} label={"My Learning"}/>
-                            </section>
-                        }
-
-                        {/*CONTACT*/}
-                        <section className="flex flex-col gap-2 text-left font-light text-lg">
-                            <h3 className="text-white font-bold text-2xl mb-4">Contact</h3>
-
-                            <NavbarLink to={"/contact"} label={"Contact Us"}/>
-                            <hr className="border-t-1 border-white/40 rounded-full" />
-                            <p>contact@shifter.com</p>
-                            <div className="flex gap-2 items-center">
-                                Visit us at:
-                                <a
-                                    href="http://www.google.com"
-                                    target="_blank"
-                                    rel="noopener noreferrer"
-                                    className=""
-                                >
-                                    <LinkedIn className="w-6 h-6 text-white"/>
-                                </a>
-                                <a
-                                    href="http://www.google.com"
-                                    target="_blank"
-                                    rel="noopener noreferrer"
-                                    className=""
-                                >
-                                    <Instagram className="w-7 h-7 text-white"/>
-                                </a>
-                            </div>
-                        </section>
-                    </div>
-                </div>
-            </div>
-            <div className="text-sm py-2 font-light text-white/80 border-t-2 border-white/20 w-9/10 mx-auto">
-                &copy; {new Date().getFullYear()} Shifter. All rights reserved.
-            </div>
-        </footer>
-    )
-}
-
-export default Footer;
Index: ontend/src/layout/FooterNew.tsx
===================================================================
--- frontend/src/layout/FooterNew.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,149 +1,0 @@
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-expect-error
-import ShifterLogo from "../../public/Shifter-S2W-Transparent.png";
-import { useAuthContext } from "../context/AuthContext.tsx";
-import LinkedIn from "../assets/icons/LinkedIn.tsx";
-import Instagram from "../assets/icons/Instagram.tsx";
-import NavbarLink from "../components/NavbarLink.tsx";
-import { Link } from "react-router-dom";
-import { useTranslation } from "react-i18next";
-
-function FooterNew() {
-    const { user, logout } = useAuthContext();
-    const { t } = useTranslation("footer");
-
-    return (
-        <section className="relative flex flex-col gap-24 pt-top-nav-md overflow-clip bg-beige">
-
-            {/* background circles */}
-            <div className="absolute -bottom-150 -left-80 w-320 aspect-square bg-[radial-gradient(circle_at_center,rgba(0,140,194,0.4),transparent_70%)]"></div>
-            <div className="absolute -bottom-150 -right-80 w-320 aspect-square bg-[radial-gradient(circle_at_center,rgba(0,140,194,0.4),transparent_70%)]"></div>
-
-            {/* CTA */}
-            <section className="flex flex-col gap-4 z-1 text-black-text">
-                <h2 className="text-6xl font-semibold">
-                    {t("cta.title.part1")} <br /> {t("cta.title.part2")}
-                </h2>
-                <p className="font-light">
-                    {t("cta.subtitle.line1")} <br />
-                    {t("cta.subtitle.line2")}
-                </p>
-                <div className="mt-12">
-                    <Link
-                        to={user?.hasUsedFreeConsultation ? "/contact" : "/free-consultation"}
-                        className="hover:shadow-shifter/60 transition-all duration-200 ease-in-out cursor-pointer
-                        shadow-md shadow-shifter/40 font-bold border-2 border-white/20
-                        bg-shifter py-3 px-12 rounded-full text-white "
-                    >
-                        {user?.hasUsedFreeConsultation
-                            ? t("cta.button.contact")
-                            : t("cta.button.consultation")}
-                    </Link>
-                </div>
-            </section>
-
-            {/* FOOTER */}
-            <div className="p-4">
-                <footer className="flex flex-col gap-4 rounded-xl shadow-md
-                bg-beige/80 backdrop-blur-md text-black-text pt-12 pb-4 px-horizontal-sm">
-
-                    <div className="flex justify-between">
-                        <section className="flex flex-col justify-center gap-12 max-w-1/4">
-                            <img
-                                src={ShifterLogo}
-                                alt="Shifter - Business Consulting, Mentoring & Online Courses Logo"
-                                className="w-40"
-                            />
-
-                            <div className="flex flex-col items-start text-xs">
-                                <p>contact@shift-er.com</p>
-                                <div className="flex gap-2 items-center">
-                                    {t("social.visit")}:
-                                    <a
-                                        href="http://www.google.com"
-                                        target="_blank"
-                                        rel="noopener noreferrer"
-                                        className="w-6 h-6 flex items-center justify-center"
-                                    >
-                                        <LinkedIn className="w-full h-full" />
-                                    </a>
-                                    <a
-                                        href="http://www.google.com"
-                                        target="_blank"
-                                        rel="noopener noreferrer"
-                                        className="w-6 h-6 flex items-center justify-center"
-                                    >
-                                        <Instagram className="w-full h-full" />
-                                    </a>
-                                </div>
-                            </div>
-                        </section>
-
-                        <div>
-                            <div className="flex gap-20 text-sm">
-                                {/* SERVICES */}
-                                <section className="flex flex-col gap-1 text-left font-light">
-                                    <h3 className="font-bold text-lg mb-4">{t("sections.services.title")}</h3>
-                                    <NavbarLink to="/mentoring" label={t("sections.services.items.mentoring")} classNameLine="border-black-text" />
-                                    <NavbarLink to="/consulting" label={t("sections.services.items.consulting")} classNameLine="border-black-text" />
-                                    <NavbarLink to="/courses" label={t("sections.services.items.courses")} classNameLine="border-black-text" />
-                                    <NavbarLink to="/academies" label={t("sections.services.items.academies")} classNameLine="border-black-text" />
-                                </section>
-
-                                {/* ABOUT */}
-                                <section className="flex flex-col gap-1 text-left font-light">
-                                    <h3 className="font-bold text-lg mb-4">{t("sections.about.title")}</h3>
-                                    <NavbarLink to="/about" label={t("sections.about.items.about")} classNameLine="border-black-text" />
-                                </section>
-
-                                {/* PROFILE */}
-                                <section className="flex flex-col gap-1 text-left font-light">
-                                    <h3 className="font-bold text-lg mb-4">{t("sections.profile.title")}</h3>
-                                    {user ? (
-                                        <>
-                                            <NavbarLink to="/profile" label={t("sections.profile.items.profile")} classNameLine="border-black-text" />
-                                            <div className="flex flex-col gap-0 overflow-clip group w-fit">
-                                                <button
-                                                    onClick={logout}
-                                                    className="transition-all duration-300 ease-in-out z-10 cursor-pointer"
-                                                >
-                                                    {t("sections.profile.items.logout")}
-                                                </button>
-                                                <hr className="relative -left-30 group-hover:-left-4 border-t-2
-                                                rounded-full transition-all duration-300 ease-in-out"/>
-                                            </div>
-                                        </>
-                                    ) : (
-                                        <NavbarLink to="/login" label={t("sections.profile.items.login")} classNameLine="border-black-text" />
-                                    )}
-                                </section>
-
-                                {/* DASHBOARD */}
-                                {user && (
-                                    <section className="flex flex-col gap-1 text-left font-light">
-                                        <h3 className="font-bold text-lg mb-4">{t("sections.dashboard.title")}</h3>
-                                        <NavbarLink to="/profile" label={t("sections.dashboard.items.profile")} classNameLine="border-black-text" />
-                                        <NavbarLink to="/learn" label={t("sections.dashboard.items.learning")} classNameLine="border-black-text" />
-                                    </section>
-                                )}
-
-                                {/* CONTACT */}
-                                <section className="flex flex-col gap-2 text-left font-light">
-                                    <h3 className="font-bold text-lg mb-4">{t("sections.contact.title")}</h3>
-                                    <NavbarLink to="/contact" label={t("sections.contact.items.contact")} classNameLine="border-black-text" />
-                                </section>
-                            </div>
-                        </div>
-                    </div>
-
-                    <hr className="mt-12 border-t-1 border-black/10 w-full" />
-                    <div className="text-xs font-light text-black/60">
-                        &copy; {new Date().getFullYear()} Shifter. {t("rights")}
-                    </div>
-                </footer>
-            </div>
-        </section>
-    );
-}
-
-export default FooterNew;
Index: ontend/src/layout/FooterSmall.tsx
===================================================================
--- frontend/src/layout/FooterSmall.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,45 +1,0 @@
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-expect-error
-import ShifterLogo from "../../public/Shifter-S2W-Transparent.png";
-import NavbarLink from "../components/NavbarLink.tsx";
-import {Instagram, Linkedin} from "lucide-react";
-import {useTranslation} from "react-i18next";
-
-export default function FooterSmall () {
-    const { t } = useTranslation("footer");
-    
-    return (
-        <footer className="flex justify-between px-horizontal-lg py-vertical-sm bg-beige">
-            <img src={ShifterLogo} alt="Shifter - Business Consulting, Mentoring & Online Courses Logo"
-                 className="h-12"
-            />
-
-            <div className="flex gap-4 items-center">
-                <NavbarLink to={"/mentoring"} label={t("sections.services.items.mentoring")} className="text-sm"/>
-                <NavbarLink to={"/consulting"} label={t("sections.services.items.consulting")} className="text-sm"/>
-                <NavbarLink to={"/courses"} label={t("sections.services.items.courses")} className="text-sm"/>
-                <NavbarLink to={"/academies"} label={t("sections.services.items.academies")} className="text-sm"/>
-            </div>
-
-            <div className="flex gap-4 ">
-                <a
-                    href="http://www.google.com"
-                    target="_blank"
-                    rel="noopener noreferrer"
-                    className="bg-shifter/10 rounded-full flex items-center justify-center aspect-square scale-80"
-                >
-                    <Linkedin size={20} color="var(--color-shifter)"/>
-                </a>
-
-                <a
-                    href="http://www.google.com"
-                    target="_blank"
-                    rel="noopener noreferrer"
-                    className="bg-shifter/10 rounded-full flex items-center justify-center aspect-square scale-80"
-                >
-                    <Instagram size={20} color="var(--color-shifter)"/>
-                </a>
-            </div>
-        </footer>
-    )
-}
Index: ontend/src/layout/LanguageToggle.tsx
===================================================================
--- frontend/src/layout/LanguageToggle.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,55 +1,0 @@
-import ReactCountryFlag from "react-country-flag";
-import { useState } from "react";
-import i18n from "../i18n.ts";
-
-export default function LanguageToggle() {
-    const [open, setOpen] = useState(false);
-    const [lang, setLang] = useState("en");
-
-    const handleLangChange = (lang: string) => {
-        setLang(lang);
-        i18n.changeLanguage(lang);
-        setOpen(false);
-    }
-
-    return (
-        <div className="fixed bottom-4 left-4 z-50">
-            {/* Toggle Button */}
-            <button
-                onClick={() => setOpen(!open)}
-                className="flex items-center justify-center gap-2 p-3 py-2 rounded-md
-                   bg-black/40 backdrop-blur-md border border-white/20 text-white
-                   hover:bg-black/60 transition-all duration-200 ease-in-out cursor-pointer"
-            >
-                {lang === "en" ? "EN" : "MK"}
-            </button>
-
-            {/* Language List (UPWARD) */}
-            {open && (
-                <div
-                    className="
-                        absolute bottom-full mb-1 left-0
-                        flex flex-col  w-40
-                        bg-black/80 text-white-text
-                        shadow-lg rounded-md
-                    "
-                >
-                    <div
-                        onClick={() => { handleLangChange("mk") }}
-                        className="flex items-center gap-3 px-4 py-2 hover:bg-white/10 cursor-pointer"
-                    >
-                        <ReactCountryFlag countryCode="MK" svg style={{ width: "20px", height: "20px" }} />
-                        <span>Македонски</span>
-                    </div>
-                    <div
-                        onClick={() => { handleLangChange("en") }}
-                        className="flex items-center gap-3 px-4 py-2 hover:bg-white/10 cursor-pointer"
-                    >
-                        <ReactCountryFlag countryCode="GB" svg style={{ width: "20px", height: "20px" }} />
-                        <span>English</span>
-                    </div>
-                </div>
-            )}
-        </div>
-    );
-}
Index: ontend/src/layout/Navbar.tsx
===================================================================
--- frontend/src/layout/Navbar.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,70 +1,0 @@
-import {Link} from "react-router-dom";
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-expect-error
-import logo from "../../public/Shifter-S2W-White-Transparent.png"
-import {useAuthContext} from "../context/AuthContext.tsx";
-import NavbarLink from "../components/NavbarLink.tsx";
-import {useTranslation} from "react-i18next";
-
-function Navbar() {
-    const {user} = useAuthContext();
-    const { t } = useTranslation("navbar");
-
-    return (
-        <nav
-            className="fixed top-2 z-50 w-11/12 left-1/2 -translate-x-1/2 flex items-center justify-between py-2 rounded-full
-            border-3 border-white/30 bg-black/50 backdrop-blur-md text-white font-light overflow-clip gap-20"
-        >
-            {/* Left nav links */}
-            <div className={`flex w-40/100 justify-between text-md items-center
-                                pl-10 ${user?.hasUsedFreeConsultation && "pl-12"}`}>
-                {/* Link group */}
-                <NavbarLink to="/courses" label={t("courses")}/>
-                <NavbarLink to="/mentoring" label={t("mentoring")}/>
-                <NavbarLink to="/consulting" label={t("consulting")}/>
-                <NavbarLink to="/academies" label={t("academies")}/>
-            </div>
-
-            {/* Centered Logo (NO ABSOLUTE!) */}
-            <div className="flex justify-center items-center w-fit">
-                <Link to="/">
-                    <img src={logo} alt="Shifter Logo" className="h-12"/>
-                </Link>
-            </div>
-
-            {/* Right nav links + profile */}
-            <div className="flex w-40/100 justify-between text-md items-center gap-6">
-                <NavbarLink to="/about" label={t("about")}/>
-                {
-                    user ?
-                        <NavbarLink to="/learn" label={t("learn")}/> :
-                        <NavbarLink to="/login" label={t("login")}/>
-                }
-                <div className="flex gap-4 items-center">
-                    {
-                        user &&
-                        <Link
-                            to="/profile"
-                            className="hover:bg-shifter transition-all duration-200 ease-in-out cursor-pointer
-                                h-full aspect-square rounded-full border-2 border-white/20 p-3 bg-shifter/40 text-white font-bold flex items-center justify-center"
-                        >
-                            {user.name.split(" ")[0].charAt(0).toUpperCase()}
-                        </Link>
-                    }
-                    <Link
-                        to={`${user?.hasUsedFreeConsultation ? "/contact" : "/free-consultation"}`}
-                        className={`hover:-translate-x-2 transition-all duration-200 ease-in-out cursor-pointer
-                                relative -mr-4 py-2 bg-shifter rounded-l-lg font-medium
-                                shadow-md shadow-shifter/30 px-8 pr-10 ${user?.hasUsedFreeConsultation && "px-10 pr-12"}`}
-                    >
-                        {user?.hasUsedFreeConsultation ? t("contact") : t("freeConsultation")}
-                    </Link>
-                </div>
-            </div>
-        </nav>
-
-    )
-}
-
-
-export default Navbar
Index: ontend/src/layout/NavbarLearn.tsx
===================================================================
--- frontend/src/layout/NavbarLearn.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,69 +1,0 @@
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-expect-error
-import logo from "../../public/Shifter-S2W-White-Transparent.png";
-import {Link, useLocation} from "react-router-dom";
-import {fromUrlFormat} from "../utils/toUrlFormat.ts";
-import NavbarLink from "../components/NavbarLink.tsx";
-import StarFilled from "../assets/icons/StarFilled.tsx";
-import StarOutline from "../assets/icons/StarOutline.tsx";
-import {useState} from "react";
-import ModalReviewCourse from "../components/ModalReviewCourse.tsx";
-
-function NavbarLearn({courseRating, markCourseAsRated}: {
-    courseRating?: number;
-    markCourseAsRated: (rating: number) => void;
-}) {
-    const [showReviewModal, setShowReviewModal] = useState<boolean>(false);
-    const location = useLocation();
-    const courseId = location.pathname.split("/")[2] || "";
-    const courseTitleEncoded = location.pathname.split("/")[3] || "";
-    const courseTitle = fromUrlFormat(courseTitleEncoded)
-
-    return (
-        <nav className="flex justify-between items-center bg-black w-full py-2 px-8 border-b-2 border-white/60">
-            <div className="flex gap-4 items-center text-xl text-white ">
-                <Link to="/">
-                    <img src={logo} alt="Shifter Logo" className="h-12"/>
-                </Link>
-                <div className="w-[1px] bg-white/40 self-stretch my-2"/>
-                {
-                    courseTitle && <Link to={`/courses/${courseId}/${courseTitleEncoded}`}
-                                         className="hover:brightness-80">{courseTitle}</Link>
-                }
-                {
-                    courseRating !== null && courseRating !== undefined  && (
-                        <button
-                            onClick={() => setShowReviewModal(true)}
-                            className="flex gap-1 cursor-pointer hover:brightness-80"
-                        >
-                            {[1, 2, 3, 4, 5].map((star) => {
-                                const StarIcon = courseRating > 0 && star <= courseRating ? StarFilled : StarOutline;
-                                return <StarIcon key={star} className="w-4 text-yellow-400" />;
-                            })}
-                        </button>
-                    )
-                }
-            </div>
-
-            <div className="flex gap-4">
-                <NavbarLink className="w-fit text-white"
-                            to={"/learn"} label={"Learn"}/>
-                <NavbarLink className="w-fit text-white"
-                            to={"/"} label={"Return Home"}/>
-            </div>
-
-            {
-                showReviewModal && (
-                    <ModalReviewCourse
-                        courseId={+courseId}
-                        closeModal={() => setShowReviewModal(false)}
-                        markCourseAsRated={markCourseAsRated}
-                        isUpdate={true}
-                    />
-                )
-            }
-        </nav>
-    )
-}
-
-export default NavbarLearn;
Index: ontend/src/locales/en/about.json
===================================================================
--- frontend/src/locales/en/about.json	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,44 +1,0 @@
-{
-  "hero": {
-    "title": "Business Development & Transformation Center",
-    "description": "<span class='font-semibold'>Shifter</span> is a center for business development and transformation, offering mentorship, consulting, academies, and e-learning for family businesses."
-  },
-  "stats": {
-    "clients": "Clients Empowered",
-    "hours": "Mentoring Hours",
-    "years": "Years of Shifter"
-  },
-  "whyChoose": {
-    "title": "Why choose <span class='font-bold text-shifter'>Shifter?</span>"
-  },
-  "reasons": [
-    {
-      "title": "Tailored Strategies",
-      "description": "Strategies and programs designed specifically for your business goals and challenges."
-    },
-    {
-      "title": "Empowering Clients",
-      "description": "Teaching clients how to solve challenges independently, not just provide ready-made solutions."
-    },
-    {
-      "title": "Holistic Approach",
-      "description": "A comprehensive method that addresses root causes across your business, not just the symptoms."
-    },
-    {
-      "title": "Sustainable Growth",
-      "description": "Strategic solutions that strengthen processes, teams, and systems for long-term success."
-    },
-    {
-      "title": "Expert Guidance",
-      "description": "Solutions from professionals who make business challenges manageable."
-    }
-  ],
-  "about": {
-    "title": "About <span class='text-shifter font-black'>Shifter</span>",
-    "description": "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.",
-    "cta": "Book a Free Consultation"
-  },
-  "foundations": {
-    "title": "Our Foundations"
-  }
-}
Index: ontend/src/locales/en/academies.json
===================================================================
--- frontend/src/locales/en/academies.json	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,20 +1,0 @@
-{
-  "heroTitle": "Transform Your Team's Expertise with Corporate Group Academies & Training",
-  "heroDescription": "Transform your team into a synchronized unit of high-performers. Our Group Academies deliver <strong class='font-bold'>standardized, expert-led training</strong> to rapidly upskill entire departments, close knowledge gaps, and drive consistent execution across your organization. Inquire now to secure a personalized curriculum review for your business.",
-  "contactInfoTitle": "Contact Information",
-  "contactInfoDescription": "Complete the form and our team will respond shortly to help you take the next step.",
-  "contactEmail": "contact@shift-er.com",
-  "contactLocation": "Skopje, N. Macedonia",
-  "autoFilledNote": "These values are automatically populated from your profile. If any of them are incorrect, please update them in the Profile page.",
-  "name": "Name",
-  "email": "Email",
-  "subjectLabel": "Your Subject",
-  "subjectPlaceholder": "Enter the subject of your message",
-  "messageLabel": "Message",
-  "messagePlaceholder": "Write your message here...",
-  "emailError": "We’re experiencing a temporary issue with our mail service. Please try again shortly or contact us directly at contact@shift-er.com",
-  "messageSentTitle": "Your message has been sent successfully!",
-  "messageSentDescription": "Thank you for reaching out to us. Our team will review your message and get back to you as soon as possible. Keep an eye on your <span class='font-semibold text-shifter'>inbox for our reply</span>.",
-  "sending": "Sending...",
-  "sendMessage": "Send Message"
-}
Index: ontend/src/locales/en/consulting.json
===================================================================
--- frontend/src/locales/en/consulting.json	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,20 +1,0 @@
-{
-  "heroTitle": "Personalized Strategic Consulting",
-  "heroDescription": "Our consulting engagement ensures maximum client results by operating with <strong class='font-bold'>limited openings</strong>. This guarantees that every client receives the <strong class='font-bold'>undivided attention</strong> and continuous strategic execution necessary to deliver <strong class='font-bold'>measurable outcomes</strong>. Submit your inquiry to begin the qualification process for exclusive strategic support.",
-  "contactInfoTitle": "Contact Information",
-  "contactInfoDescription": "Complete the form and our team will respond shortly to help you take the next step.",
-  "contactEmail": "contact@shift-er.com",
-  "contactLocation": "Skopje, N. Macedonia",
-  "autoFilledNote": "These values are automatically populated from your profile. If any of them are incorrect, please update them in the Profile page.",
-  "name": "Name",
-  "email": "Email",
-  "subjectLabel": "Your Subject",
-  "subjectPlaceholder": "Enter the subject of your message",
-  "messageLabel": "Message",
-  "messagePlaceholder": "Write your message here...",
-  "emailError": "We’re experiencing a temporary issue with our mail service. Please try again shortly or contact us directly at contact@shift-er.com",
-  "messageSentTitle": "Your message has been sent successfully!",
-  "messageSentDescription": "Thank you for reaching out to us. Our team will review your message and get back to you as soon as possible. Keep an eye on your <span class='font-semibold text-shifter'>inbox for our reply</span>.",
-  "sending": "Sending...",
-  "sendMessage": "Send Message"
-}
Index: ontend/src/locales/en/contact.json
===================================================================
--- frontend/src/locales/en/contact.json	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,24 +1,0 @@
-{
-  "hero": {
-    "title": "Transform Your Vision into Results",
-    "description": "Complete the form and our team will respond shortly to help you take the next step."
-  },
-  "info": {
-    "title": "Contact Information",
-    "description": "Complete the form and our team will respond shortly to help you take the next step.",
-    "email": "contact@shift-er.com",
-    "location": "Skopje, N. Macedonia"
-  },
-  "form": {
-    "subject": "Your Subject",
-    "subjectPlaceholder": "Enter the subject of your message",
-    "message": "Message",
-    "messagePlaceholder": "Write your message here...",
-    "sendingError": "We’re experiencing a temporary issue with our mail service. Please try again shortly or contact us directly at contact@shift-er.com",
-    "successTitle": "Your message has been sent successfully!",
-    "successDescription": "Thank you for reaching out to us. Our team will review your message and get back to you as soon as possible. Keep an eye on your inbox for our reply.",
-    "sendButton": "Send Message",
-    "sending": "Sending..."
-  },
-  "profileNotice": "These values are automatically populated from your profile. If any of them are incorrect, please update them in the Profile page."
-}
Index: ontend/src/locales/en/courses.json
===================================================================
--- frontend/src/locales/en/courses.json	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,7 +1,0 @@
-{
-  "title": "Ready to Take the",
-  "highlight": "Next Step?",
-  "description": "Explore courses designed not just to teach — but to shift your mindset, sharpen your skills, and accelerate your journey toward real impact. Whether you're scaling a business, leading a team, or growing as a professional, this is where transformation begins.",
-  "rocketAlt": "Shifter Rocket",
-  "difficultyOptions": ["Beginner", "Intermediate", "Advanced"]
-}
Index: ontend/src/locales/en/footer.json
===================================================================
--- frontend/src/locales/en/footer.json	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,49 +1,0 @@
-{
-  "cta": {
-    "title": { "part1": "Simplify Your Growth", "part2": "Journey" },
-    "subtitle": {
-      "line1": "Take the first step toward smarter business solutions.",
-      "line2": "Let us guide you every step of the way."
-    },
-    "button": {
-      "consultation": "Schedule a Free Consultation",
-      "contact": "Contact Us"
-    }
-  },
-  "social": { "visit": "Visit us at" },
-  "sections": {
-    "services": {
-      "title": "Services",
-      "items": {
-        "mentoring": "Mentoring",
-        "consulting": "Consulting",
-        "courses": "Courses",
-        "academies": "Academies"
-      }
-    },
-    "about": {
-      "title": "About Us",
-      "items": { "about": "About Shifter" }
-    },
-    "profile": {
-      "title": "Profile",
-      "items": {
-        "profile": "Profile",
-        "logout": "Log Out",
-        "login": "Log In / Sign Up"
-      }
-    },
-    "dashboard": {
-      "title": "Dashboard",
-      "items": {
-        "profile": "Profile",
-        "learning": "My Learning"
-      }
-    },
-    "contact": {
-      "title": "Contact",
-      "items": { "contact": "Contact Us" }
-    }
-  },
-  "rights": "All rights reserved."
-}
Index: ontend/src/locales/en/freeConsultation.json
===================================================================
--- frontend/src/locales/en/freeConsultation.json	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,39 +1,0 @@
-{
-  "hero": {
-    "title": "Book Your Free Expert Session",
-    "description": "Talk to an expert about your business goals and challenges. Get a personalized program recommendation tailored to your needs."
-  },
-  "nextSteps": {
-    "title": "Next Steps After Submission?",
-    "steps": [
-      {"title": "Your Expert is Assigned","description":"We schedule an expert for your session and send you a confirmation email with all the meeting details."},
-      {"title": "Expert Prepares for Your Session","description":"Your expert reviews the information you provided to create valuable insights and a strategy tailored to your situation."},
-      {"title": "Attend Your Personalized Session","description":"Join the session and receive actionable guidance along with a program or mentorship recommendation designed specifically for your goals."}
-    ]
-  },
-  "form": {
-    "profileHint": "These values are automatically populated from your profile. If any of them are incorrect, please update them in the Profile page.",
-    "name": "Name",
-    "email": "Email",
-    "fields": {
-      "aboutCompany": {"label":"About your business","placeholder":"What you do, industry, customers"},
-      "challenges": {"label":"Your current challenges","placeholder":"E.g. sales, growth, team issues"},
-      "expectations": {"label":"What you want from the session","placeholder":"Advice, strategy, solutions"},
-      "otherInfo": {"label":"Anything else","placeholder":"Extra context or details"}
-    },
-    "selectDate": "Select a date",
-    "selectTime": "Select a time",
-    "book": "Book Session",
-    "booking": "Booking..."
-  },
-  "confirmation": {
-    "title": "Your free consultation is scheduled! 🎉",
-    "description": "Completing the form was the <span class='font-semibold text-shifter'>first step toward progress and growth</span>. Check your <span class='font-semibold text-shifter'>email for the Zoom link.</span>"
-  },
-  "optionalHint": "<sup>*</sup> These fields are optional. Filling them out helps us better understand your challenges and objectives, so we can prepare a more personalized session.",
-  "errors": {
-    "selectDateTime": "Please select both date and time.",
-    "alreadyUsed": "We couldn’t schedule your meeting. It appears you’ve already used your free consultation. Feel free to get in touch with us through our Contact page for more options.",
-    "failedSchedule": "Failed to schedule the meeting. Please try again later or contact support."
-  }
-}
Index: ontend/src/locales/en/home.json
===================================================================
--- frontend/src/locales/en/home.json	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,95 +1,0 @@
-{
-  "hero": {
-    "label": "Shift 2 Win",
-    "title": "Simplify Your Growth Journey",
-    "description": "Expert guidance, practical courses, and group academies designed to help family-owned businesses thrive.",
-    "cta": {
-      "freeConsultation": "Book a Free Consultation",
-      "contact": "Get In Touch"
-    },
-    "stats": {
-      "businessesEmpowered": {
-        "value": 250,
-        "label": "Businesses Empowered"
-      },
-      "mentoringHours": {
-        "value": 2000,
-        "label": "Mentoring Hours"
-      },
-      "yearsOfShifter": {
-        "value": 4,
-        "label": "Years of Shifter"
-      }
-    }
-  },
-  "ourServices": {
-    "heading": "Solutions That Deliver Real Results",
-    "description": "Shifter focuses on clear, practical steps that drive measurable growth.",
-    "discoverMore": "Discover more",
-    "cards": [
-      {
-        "title": "Mentoring",
-        "description": "Personalized mentorship to help you overcome challenges and achieve your goals.",
-        "link": "/mentoring"
-      },
-      {
-        "title": "Courses",
-        "description": "On-demand courses to guide your journey at every stage.",
-        "link": "/courses"
-      },
-      {
-        "title": "Consulting",
-        "description": "Targeted consulting to solve specific challenges and deliver immediate results.",
-        "link": "/consulting"
-      },
-      {
-        "title": "Academies",
-        "description": "Structured group learning designed to help you grow and succeed together.",
-        "link": "/academies"
-      }
-    ]
-  },
-  "collaborationSteps": {
-    "heading": "How to Start Your Journey to <strong>Success</strong>",
-    "button": "Get Started",
-    "step1": {
-      "beforeConsultation": {
-        "title": "Schedule a Free Consultation",
-        "description": "Schedule a no-obligation consultation to discuss your challenges, goals, and expectations."
-      },
-      "afterConsultation": {
-        "title": "Request Continued Support",
-        "description": "Reach out to continue your journey with tailored guidance for your next business goals."
-      }
-    },
-    "step2": {
-      "title": "Share Your Needs & Goals",
-      "description": "Provide clear insights about your business struggles and aspirations to shape the right strategy."
-    },
-    "step3": {
-      "title": "Review Your Personalized Plan",
-      "description": "Receive a tailored roadmap with clear, actionable steps to help you achieve business success."
-    },
-    "step4": {
-      "title": "Start Implementing & Collaborating",
-      "description": "Apply expert guidance and proven strategies with continuous support throughout the process."
-    }
-  },
-  "coursesCarousel": {
-    "heading": "Unlock Your Growth With <strong class='text-shifter'>E-Learning</strong>",
-    "description": "Access expert-led courses designed to help you master business, strategy, and success - anytime, anywhere."
-  },
-  "shifterValues": {
-    "heading": "Our Core <strong class='text-shifter'>Values</strong>",
-    "description": "Our SHIFT Values define our approach to mentoring and consulting. We focus on Sustainable Results, a Holistic Approach, In-depth Analysis, Fact-based Solutions, and Tailor-made Services—ensuring impactful and lasting success.",
-    "valuesList": [
-      "Sustainable Results",
-      "Holistic Approach",
-      "In-depth Analysis",
-      "Fact Based Solutions",
-      "Tailor Made Services"
-    ],
-    "button": "Read More"
-  }
-
-}
Index: ontend/src/locales/en/login.json
===================================================================
--- frontend/src/locales/en/login.json	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,18 +1,0 @@
-{
-  "welcomeBack": "Welcome Back!",
-  "subtitle": "Let's unlock your next breakthrough in business!",
-  "backToMain": "Back to Main Page",
-  "emailLabel": "Email address",
-  "emailPlaceholder": "name@email.com",
-  "passwordLabel": "Password",
-  "passwordPlaceholder": "********",
-  "logIn": "Log In",
-  "register": "Register",
-  "loggingIn": "Logging in...",
-  "or": "or",
-  "googleLogin": "Log in with Google",
-  "errors": {
-    "fillAllFields": "Please fill in all fields.",
-    "somethingWentWrong": "Something went wrong. Please try again."
-  }
-}
Index: ontend/src/locales/en/mentoring.json
===================================================================
--- frontend/src/locales/en/mentoring.json	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,20 +1,0 @@
-{
-  "heroTitle": "Dedicated 1:1 Mentorship",
-  "heroDescription": "Our program ensures maximum client success by operating with <strong class='font-bold'>limited openings</strong>. This guarantees that every partner receives the <strong class='font-bold'>undivided attention</strong> and continuous strategic input necessary to <strong class='font-bold'>achieve their objectives</strong>. Submit your inquiry to begin the assessment for one of our dedicated slots.",
-  "contactInfoTitle": "Contact Information",
-  "contactInfoDescription": "Complete the form and our team will respond shortly to help you take the next step.",
-  "contactEmail": "contact@shift-er.com",
-  "contactLocation": "Skopje, N. Macedonia",
-  "autoFilledNote": "These values are automatically populated from your profile. If any of them are incorrect, please update them in the Profile page.",
-  "name": "Name",
-  "email": "Email",
-  "subjectLabel": "Your Subject",
-  "subjectPlaceholder": "Enter the subject of your message",
-  "messageLabel": "Message",
-  "messagePlaceholder": "Write your message here...",
-  "emailError": "We’re experiencing a temporary issue with our mail service. Please try again shortly or contact us directly at contact@shift-er.com",
-  "messageSentTitle": "Your message has been sent successfully!",
-  "messageSentDescription": "Thank you for reaching out to us. Our team will review your message and get back to you as soon as possible. Keep an eye on your <span class='font-semibold text-shifter'>inbox for our reply</span>.",
-  "sending": "Sending...",
-  "sendMessage": "Send Message"
-}
Index: ontend/src/locales/en/navbar.json
===================================================================
--- frontend/src/locales/en/navbar.json	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,11 +1,0 @@
-{
-  "courses": "Courses",
-  "mentoring": "Mentoring",
-  "consulting": "Consulting",
-  "academies": "Academies",
-  "about": "About",
-  "login": "Login / Register",
-  "learn": "My Learning",
-  "freeConsultation": "Free Consultation",
-  "contact": "Contact Us"
-}
Index: ontend/src/locales/en/personalize.json
===================================================================
--- frontend/src/locales/en/personalize.json	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,32 +1,0 @@
-{
-  "title": "Shift into Success",
-  "subtitle": "Start your journey toward smarter, scalable business growth.",
-  "backToMain": "Back to Main Page",
-  "verificationFailedTitle": "Verification Failed",
-  "verificationFailedMessage1": "We couldn’t verify your email address. The verification link may be invalid or expired.",
-  "verificationFailedMessage2": "Please try registering again or request a new verification link.",
-  "back": "Back",
-  "next": "Next",
-  "settingUp": "Setting up...",
-  "startUsing": "Start Using Shifter",
-
-  "stepOne": {
-    "fullName": "Full Name",
-    "fullNamePlaceholder": "John Doe",
-    "workPosition": "Work Position",
-    "workPositionPlaceholder": "Your Position",
-    "companySize": "Company Size",
-    "companySizeOptions": ["Freelance", "Micro", "Small", "Medium", "Mid Market", "Enterprise", "Other"],
-    "errorIncomplete": "Please ensure all inputs are completed."
-  },
-
-  "stepTwo": {
-    "interests": "Select Topics You Like",
-    "errorNoInterest": "Help us understand you better — select at least one topic you like"
-  },
-
-  "stepThree": {
-    "desiredSkills": "Outline Your Learning Goals",
-    "errorNoSkill": "We’d love to support your growth — select at least one skill you'd like to improve"
-  }
-}
Index: ontend/src/locales/en/register.json
===================================================================
--- frontend/src/locales/en/register.json	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,19 +1,0 @@
-{
-  "title": "Shift into Success",
-  "subtitle": "Start your journey toward smarter, scalable business growth.",
-  "backToMain": "Back to Main Page",
-  "emailLabel": "Email address",
-  "emailPlaceholder": "name@email.com",
-  "passwordLabel": "Password",
-  "passwordPlaceholder": "********",
-  "passwordConfirmationLabel": "Confirm password",
-  "passwordConfirmationPlaceholder": "********",
-  "createAccount": "Create Account",
-  "creatingAccount": "Creating account...",
-  "logIn": "Log In",
-  "or": "or",
-  "googleLogin": "Sign in with Google",
-  "verifyEmail": "Verify your email to continue",
-  "verificationSent1": "A verification link has been sent to",
-  "verificationSent2": "Please check your inbox and click the link to activate your account."
-}
Index: ontend/src/locales/mk/about.json
===================================================================
--- frontend/src/locales/mk/about.json	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,44 +1,0 @@
-{
-  "hero": {
-    "title": "Центар за Развој и Трансформација на Бизнисот",
-    "description": "<span class='font-semibold'>Shifter</span> е центар за развој и трансформација на бизнисот, нудејќи менторство, консултации, академии и е-учење за семејни бизниси."
-  },
-  "stats": {
-    "clients": "Овластени клиенти",
-    "hours": "Менторски часови",
-    "years": "Години Shifter"
-  },
-  "whyChoose": {
-    "title": "Зошто да го изберете <span class='font-bold text-shifter'>Shifter?</span>"
-  },
-  "reasons": [
-    {
-      "title": "Прилагодени стратегии",
-      "description": "Стратегии и програми дизајнирани специфично за целите и предизвиците на вашиот бизнис."
-    },
-    {
-      "title": "Овластување на клиенти",
-      "description": "Учиме клиенти како да решаваат предизвици самостојно, а не само да обезбедиме готови решенија."
-    },
-    {
-      "title": "Холистички пристап",
-      "description": "Севкупен метод кој се занимава со коренските причини во вашиот бизнис, а не само со симптомите."
-    },
-    {
-      "title": "Одржлив раст",
-      "description": "Стратегиски решенија кои ја зајакнуваат работата, тимовите и системите за долгорочен успех."
-    },
-    {
-      "title": "Експертска насока",
-      "description": "Решенија од професионалци кои ги прават бизнис предизвиците управливи."
-    }
-  ],
-  "about": {
-    "title": "За <span class='text-shifter font-black'>Shifter</span>",
-    "description": "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.",
-    "cta": "Закажете бесплатна консултација"
-  },
-  "foundations": {
-    "title": "Нашите основи"
-  }
-}
Index: ontend/src/locales/mk/academies.json
===================================================================
--- frontend/src/locales/mk/academies.json	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,20 +1,0 @@
-{
-  "heroTitle": "Трансформирајте ја експертизата на вашиот тим со Корпоративни Групни Академии и Обуки",
-  "heroDescription": "Трансформирајте го вашиот тим во синхронизирана единица на високо-ефикасни професионалци. Нашите Групни Академии обезбедуваат <strong class='font-bold'>стандардизирани, водени од експерти обуки</strong> за брзо надградување на цели оддели, затворање на јазовите во знаењето и обезбедување конзистентно извршување низ вашата организација. Прашајте сега за персонализирана ревизија на наставната програма за вашиот бизнис.",
-  "contactInfoTitle": "Контакт информации",
-  "contactInfoDescription": "Пополнете го формуларот и нашиот тим ќе одговори наскоро за да ви помогне да направите следен чекор.",
-  "contactEmail": "contact@shift-er.com",
-  "contactLocation": "Скопје, С. Македонија",
-  "autoFilledNote": "Овие вредности се автоматски пополнети од вашиот профил. Ако некоја од нив е неточна, ве молиме ажурирајте ја на страницата Профил.",
-  "name": "Име",
-  "email": "Е-пошта",
-  "subjectLabel": "Ваш предмет",
-  "subjectPlaceholder": "Внесете ја темата на вашето прашање",
-  "messageLabel": "Порака",
-  "messagePlaceholder": "Напишете ја вашата порака овде...",
-  "emailError": "Имаме привремени проблеми со нашиот сервис за е-пошта. Ве молиме обидете се повторно или контактирајте директно на contact@shift-er.com",
-  "messageSentTitle": "Вашата порака е успешно испратена!",
-  "messageSentDescription": "Ви благодариме што не контактиравте. Нашиот тим ќе ја прегледа вашата порака и ќе ве контактира што е можно поскоро. Следете ја вашата <span class='font-semibold text-shifter'>е-пошта за нашиот одговор</span>.",
-  "sending": "Се испраќа...",
-  "sendMessage": "Испрати порака"
-}
Index: ontend/src/locales/mk/consulting.json
===================================================================
--- frontend/src/locales/mk/consulting.json	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,20 +1,0 @@
-{
-  "heroTitle": "Персонализирано Стратешко Консултирање",
-  "heroDescription": "Нашиот консултантски ангажман обезбедува максимални резултати за клиентите со работа со <strong class='font-bold'>ограничен број места</strong>. Ова гарантира дека секој клиент добива <strong class='font-bold'>неподеленo внимание</strong> и континуирано стратешко извршување потребно за да обезбеди <strong class='font-bold'>мерливи резултати</strong>. Испратете ја вашата прашање за да започне процесот на квалификација за ексклузивна стратешка поддршка.",
-  "contactInfoTitle": "Контакт информации",
-  "contactInfoDescription": "Пополнете го формуларот и нашиот тим ќе одговори наскоро за да ви помогне да направите следен чекор.",
-  "contactEmail": "contact@shift-er.com",
-  "contactLocation": "Скопје, С. Македонија",
-  "autoFilledNote": "Овие вредности се автоматски пополнети од вашиот профил. Ако некоја од нив е неточна, ве молиме ажурирајте ја на страницата Профил.",
-  "name": "Име",
-  "email": "Е-пошта",
-  "subjectLabel": "Ваш предмет",
-  "subjectPlaceholder": "Внесете ја темата на вашето прашање",
-  "messageLabel": "Порака",
-  "messagePlaceholder": "Напишете ја вашата порака овде...",
-  "emailError": "Имаме привремени проблеми со нашиот сервис за е-пошта. Ве молиме обидете се повторно или контактирајте директно на contact@shift-er.com",
-  "messageSentTitle": "Вашата порака е успешно испратена!",
-  "messageSentDescription": "Ви благодариме што не контактиравте. Нашиот тим ќе ја прегледа вашата порака и ќе ве контактира што е можно поскоро. Следете ја вашата <span class='font-semibold text-shifter'>е-пошта за нашиот одговор</span>.",
-  "sending": "Се испраќа...",
-  "sendMessage": "Испрати порака"
-}
Index: ontend/src/locales/mk/contact.json
===================================================================
--- frontend/src/locales/mk/contact.json	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,24 +1,0 @@
-{
-  "hero": {
-    "title": "Претворете ја вашата визија во резултати",
-    "description": "Пополнете го формуларот и нашиот тим ќе ве контактира наскоро за да ви помогне да го направите следниот чекор."
-  },
-  "info": {
-    "title": "Контакт информации",
-    "description": "Пополнете го формуларот и нашиот тим ќе ве контактира наскоро за да ви помогне да го направите следниот чекор.",
-    "email": "contact@shift-er.com",
-    "location": "Скопје, РС Македонија"
-  },
-  "form": {
-    "subject": "Ваш предмет",
-    "subjectPlaceholder": "Внесете го предметот на вашата порака",
-    "message": "Порака",
-    "messagePlaceholder": "Напишете ја вашата порака овде...",
-    "sendingError": "Има привремени проблеми со нашата пошта. Ве молиме обидете се повторно или контактирајте не директно на contact@shift-er.com",
-    "successTitle": "Вашата порака е успешно испратена!",
-    "successDescription": "Ви благодариме што не контактиравте. Нашиот тим ќе ја прегледа вашата порака и ќе ве контактира што е можно поскоро. Проверете ја вашата пошта за одговор.",
-    "sendButton": "Испрати порака",
-    "sending": "Се испраќа..."
-  },
-  "profileNotice": "Овие вредности се автоматски пополнети од вашиот профил. Ако некои се неточни, ве молиме ажурирајте ги во Профил страницата."
-}
Index: ontend/src/locales/mk/courses.json
===================================================================
--- frontend/src/locales/mk/courses.json	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,7 +1,0 @@
-{
-  "title": "Подготвени за следниот",
-  "highlight": "чекор?",
-  "description": "Истражете курсеви дизајнирани не само за учење, туку и за трансформација на вашето размислување, усовршување на вештините и забрзување на патот кон реален успех. Без разлика дали ја развивате компанијата, водите тим или се развивате како професионалец, тука започнува трансформацијата.",
-  "rocketAlt": "Shifter ракета",
-  "difficultyOptions": ["Почетник", "Среден", "Напреден"]
-}
Index: ontend/src/locales/mk/footer.json
===================================================================
--- frontend/src/locales/mk/footer.json	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,49 +1,0 @@
-{
-  "cta": {
-    "title": { "part1": "Поедностави го твојот пат кон", "part2": "успехот" },
-    "subtitle": {
-      "line1": "Направи го првиот чекор кон поумни бизнис решенија.",
-      "line2": "Ние ќе те водиме во секој чекор."
-    },
-    "button": {
-      "consultation": "Закажи бесплатна консултација",
-      "contact": "Контактирај не"
-    }
-  },
-  "social": { "visit": "Посети не на" },
-  "sections": {
-    "services": {
-      "title": "Услуги",
-      "items": {
-        "mentoring": "Менторство",
-        "consulting": "Консалтинг",
-        "courses": "Курсеви",
-        "academies": "Академии"
-      }
-    },
-    "about": {
-      "title": "За нас",
-      "items": { "about": "За Shifter" }
-    },
-    "profile": {
-      "title": "Профил",
-      "items": {
-        "profile": "Профил",
-        "logout": "Одјави се",
-        "login": "Најави се / Регистрирај се"
-      }
-    },
-    "dashboard": {
-      "title": "Табла",
-      "items": {
-        "profile": "Профил",
-        "learning": "Моето учење"
-      }
-    },
-    "contact": {
-      "title": "Контакт",
-      "items": { "contact": "Контактирај не" }
-    }
-  },
-  "rights": "Сите права се задржани."
-}
Index: ontend/src/locales/mk/freeConsultation.json
===================================================================
--- frontend/src/locales/mk/freeConsultation.json	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,39 +1,0 @@
-{
-  "hero": {
-    "title": "Закажете бесплатна експертска сесија",
-    "description": "Разговарајте со експерт за вашите бизнис цели и предизвици. Добијте персонализирана препорака за програм, прилагодена на вашите потреби."
-  },
-  "nextSteps": {
-    "title": "Следни чекори по пополнување на формуларот?",
-    "steps": [
-      {"title": "Вашиот експерт е доделен","description":"Ние го доделуваме експертот за вашата сесија и ви испраќаме е-пошта со сите детали за средбата."},
-      {"title": "Експертот се подготвува за вашата сесија","description":"Вашиот експерт ги прегледува информациите што ги обезбедивте за да создаде вредни увиди и стратегија прилагодена на вашата ситуација."},
-      {"title": "Присуствувајте на вашата персонализирана сесија","description":"Приклучете се на сесијата и добијте практични насоки заедно со препорака за програм или менторство дизајнирана специјално за вашите цели."}
-    ]
-  },
-  "form": {
-    "profileHint": "Овие вредности се автоматски пополнети од вашиот профил. Доколку некоја од нив е неточна, ажурирајте ја на страницата Профил.",
-    "name": "Име",
-    "email": "Е-пошта",
-    "fields": {
-      "aboutCompany": {"label":"За вашиот бизнис","placeholder":"Што правите, индустрија, клиенти"},
-      "challenges": {"label":"Вашите тековни предизвици","placeholder":"На пример, продажба, раст, тимски проблеми"},
-      "expectations": {"label":"Што сакате од сесијата","placeholder":"Совет, стратегија, решенија"},
-      "otherInfo": {"label":"Сè друго","placeholder":"Дополнителен контекст или детали"}
-    },
-    "selectDate": "Изберете датум",
-    "selectTime": "Изберете време",
-    "book": "Закажи сесија",
-    "booking": "Закажување..."
-  },
-  "confirmation": {
-    "title": "Вашата бесплатна консултација е закажана! 🎉",
-    "description": "Пополнувањето на формуларот беше <span class='font-semibold text-shifter'>првиот чекор кон напредок и раст</span>. Проверете ја вашата <span class='font-semibold text-shifter'>е-пошта за Zoom линк.</span>"
-  },
-  "optionalHint": "<sup>*</sup> Овие полиња се опционални. Пополнувањето им помага на нашите експерти подобро да ги разберат вашите предизвици и цели, за да подготват персонализирана сесија.",
-  "errors": {
-    "selectDateTime": "Ве молиме изберете и датум и време.",
-    "alreadyUsed": "Не можеме да ја закажеме вашата сесија. Се чини дека веќе ја искористивте бесплатната консултација. Контактирајте нè преку страницата Контакт за повеќе опции.",
-    "failedSchedule": "Не успеавме да ја закажеме сесијата. Обидете се повторно подоцна или контактирајте ја поддршката."
-  }
-}
Index: ontend/src/locales/mk/home.json
===================================================================
--- frontend/src/locales/mk/home.json	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,95 +1,0 @@
-{
-  "hero": {
-    "label": "Shift 2 Win",
-    "title": "Едноставно растете и напредувајте",
-    "description": "Експертско водство, практични курсеви и групни академии дизајнирани да им помогнат на семејните бизниси да напредуваат.",
-    "cta": {
-      "freeConsultation": "Закажи бесплатна консултација",
-      "contact": "Контактирајте не"
-    },
-    "stats": {
-      "businessesEmpowered": {
-        "value": 250,
-        "label": "Поддржани Бизниси"
-      },
-      "mentoringHours": {
-        "value": 2000,
-        "label": "Часови Менторство"
-      },
-      "yearsOfShifter": {
-        "value": 4,
-        "label": "Години Историја"
-      }
-    }
-  },
-  "ourServices": {
-    "heading": "Решенија кои даваат вистински резултати",
-    "description": "Shifter се фокусира на јасни и практични чекори кои носат мерлив раст.",
-    "discoverMore": "Дознај повеќе",
-    "cards": [
-      {
-        "title": "Менторство",
-        "description": "Персонализирано менторство за да ги надминете предизвиците и да ги постигнете вашите цели.",
-        "link": "/mentoring"
-      },
-      {
-        "title": "Курсеви",
-        "description": "Курсеви на барање кои ве водат во секоја фаза од вашиот пат.",
-        "link": "/courses"
-      },
-      {
-        "title": "Консултации",
-        "description": "Целни консултации за решавање на специфични предизвици и обезбедување моментални резултати.",
-        "link": "/consulting"
-      },
-      {
-        "title": "Академии",
-        "description": "Структурирано групно учење за да се развивате и успевате заедно.",
-        "link": "/academies"
-      }
-    ]
-  },
-  "collaborationSteps": {
-    "heading": "Како да го започнете вашиот пат кон <strong>успех</strong>",
-    "button": "Започнете",
-    "step1": {
-      "beforeConsultation": {
-        "title": "Закажете бесплатна консултација",
-        "description": "Закажете консултација без обврски за да ги разгледате вашите предизвици, цели и очекувања."
-      },
-      "afterConsultation": {
-        "title": "Побарајте продолжена поддршка",
-        "description": "Контактирајте за да продолжите со вашиот пат со прилагодено водство за следните бизнис цели."
-      }
-    },
-    "step2": {
-      "title": "Споделете ги вашите потреби и цели",
-      "description": "Обезбедете јасни информации за предизвиците и амбициите на вашиот бизнис за да се создаде вистинската стратегија."
-    },
-    "step3": {
-      "title": "Прегледајте го вашиот персонализиран план",
-      "description": "Примете прилагодена патека со јасни, применливи чекори за да го постигнете бизнис успехот."
-    },
-    "step4": {
-      "title": "Започнете со имплементација и соработка",
-      "description": "Применете стручни совети и проверени стратегии со континуирана поддршка во текот на процесот."
-    }
-  },
-  "coursesCarousel": {
-    "heading": "Отклучете го вашиот раст со <strong class='text-shifter'>Е-учење</strong>",
-    "description": "Пристапете до курсеви водени од експерти кои ќе ви помогнат да го совладате бизнисот, стратегијата и успехот - секогаш и секаде."
-  },
-  "shifterValues": {
-    "heading": "Нашите Основни <strong class='text-shifter'>Вредности</strong>",
-    "description": "Нашите SHIFT вредности го дефинираат нашиот пристап кон менторство и консултации. Се фокусираме на Одржливи Резултати, Холистички Пристап, Длабинска Анализа, Решенија Базирани на Факти и Прилагодени Услуги – обезбедувајќи влијателен и траен успех.",
-    "valuesList": [
-      "Одржливи Резултати",
-      "Холистички Пристап",
-      "Длабинска Анализа",
-      "Решенија Базирани на Факти",
-      "Прилагодени Услуги"
-    ],
-    "button": "Прочитај Повеќе"
-  }
-
-}
Index: ontend/src/locales/mk/login.json
===================================================================
--- frontend/src/locales/mk/login.json	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,18 +1,0 @@
-{
-  "welcomeBack": "Добредојдовте повторно!",
-  "subtitle": "Да ја отклучиме вашата следна деловна пресвртница!",
-  "backToMain": "Назад кон главната страница",
-  "emailLabel": "Емаил адреса",
-  "emailPlaceholder": "ime@domen.com",
-  "passwordLabel": "Лозинка",
-  "passwordPlaceholder": "********",
-  "logIn": "Најави се",
-  "register": "Регистрирај се",
-  "loggingIn": "Се најавуваме...",
-  "or": "или",
-  "googleLogin": "Најави се со Google",
-  "errors": {
-    "fillAllFields": "Ве молиме пополнете ги сите полиња.",
-    "somethingWentWrong": "Нешто тргна наопаку. Обидете се повторно."
-  }
-}
Index: ontend/src/locales/mk/mentoring.json
===================================================================
--- frontend/src/locales/mk/mentoring.json	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,20 +1,0 @@
-{
-  "heroTitle": "Посветено 1:1 Менторство",
-  "heroDescription": "Нашата програма обезбедува максимален успех на клиентите со работа со <strong class='font-bold'>ограничен број места</strong>. Ова гарантира дека секој партнер добива <strong class='font-bold'>неподеленo внимание</strong> и континуиран стратешки влез потребен за <strong class='font-bold'>да ги оствари своите цели</strong>. Испратете ја вашата прашање за да започне проценката за едно од нашите посветени места.",
-  "contactInfoTitle": "Контакт информации",
-  "contactInfoDescription": "Пополнете го формуларот и нашиот тим ќе одговори наскоро за да ви помогне да направите следен чекор.",
-  "contactEmail": "contact@shift-er.com",
-  "contactLocation": "Скопје, С. Македонија",
-  "autoFilledNote": "Овие вредности се автоматски пополнети од вашиот профил. Ако некоја од нив е неточна, ве молиме ажурирајте ја на страницата Профил.",
-  "name": "Име",
-  "email": "Е-пошта",
-  "subjectLabel": "Ваш предмет",
-  "subjectPlaceholder": "Внесете ја темата на вашето прашање",
-  "messageLabel": "Порака",
-  "messagePlaceholder": "Напишете ја вашата порака овде...",
-  "emailError": "Имаме привремени проблеми со нашиот сервис за е-пошта. Ве молиме обидете се повторно или контактирајте директно на contact@shift-er.com",
-  "messageSentTitle": "Вашата порака е успешно испратена!",
-  "messageSentDescription": "Ви благодариме што не контактиравте. Нашиот тим ќе ја прегледа вашата порака и ќе ве контактира што е можно поскоро. Проверете ја вашата <span class='font-semibold text-shifter'>влезна пошта за одговор</span>.",
-  "sending": "Се испраќа...",
-  "sendMessage": "Испрати порака"
-}
Index: ontend/src/locales/mk/navbar.json
===================================================================
--- frontend/src/locales/mk/navbar.json	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,11 +1,0 @@
-{
-  "courses": "Курсеви",
-  "mentoring": "Менторство",
-  "consulting": "Консалтинг",
-  "academies": "Академии",
-  "about": "За Нас",
-  "login": "Најави се / Регистрирај се",
-  "learn": "Мое Учење",
-  "freeConsultation": "Бесплатна Сесија",
-  "contact": "Контакт"
-}
Index: ontend/src/locales/mk/personalize.json
===================================================================
--- frontend/src/locales/mk/personalize.json	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,32 +1,0 @@
-{
-  "title": "Прескокни кон успех",
-  "subtitle": "Започнете го вашето патување кон паметен и скалабилен бизнис раст.",
-  "backToMain": "Назад кон главната страница",
-  "verificationFailedTitle": "Верификацијата не успеа",
-  "verificationFailedMessage1": "Не можевме да ја верифицираме вашата емаил адреса. Линкот за верификација може да е невалиден или истечен.",
-  "verificationFailedMessage2": "Ве молиме обидете се повторно со регистрацијата или побарајте нов линк за верификација.",
-  "back": "Назад",
-  "next": "Следно",
-  "settingUp": "Се подесува...",
-  "startUsing": "Започни да користиш Shifter",
-
-  "stepOne": {
-    "fullName": "Целосно име",
-    "fullNamePlaceholder": "Јован Јованов",
-    "workPosition": "Работно место",
-    "workPositionPlaceholder": "Вашата позиција",
-    "companySize": "Големина на компанијата",
-    "companySizeOptions": ["Фриленсер", "Микро", "Мала", "Средна", "Среден пазар", "Голема компанија", "Друго"],
-    "errorIncomplete": "Ве молиме пополнете ги сите полиња."
-  },
-
-  "stepTwo": {
-    "interests": "Изберете теми кои ви се допаѓаат",
-    "errorNoInterest": "Помогнете ни да ве разбереме подобро — изберете барем една тема која ви се допаѓа"
-  },
-
-  "stepThree": {
-    "desiredSkills": "Опишете ги вашите цели за учење",
-    "errorNoSkill": "Би сакале да го поддржиме вашиот раст — изберете барем една вештина која сакате да ја усовршите"
-  }
-}
Index: ontend/src/locales/mk/register.json
===================================================================
--- frontend/src/locales/mk/register.json	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,19 +1,0 @@
-{
-  "title": "Прескокни кон успех",
-  "subtitle": "Започнете го вашето патување кон паметен и скалабилен бизнис раст.",
-  "backToMain": "Назад кон главната страница",
-  "emailLabel": "Емаил адреса",
-  "emailPlaceholder": "ime@domen.com",
-  "passwordLabel": "Лозинка",
-  "passwordPlaceholder": "********",
-  "passwordConfirmationLabel": "Потврдете ја лозинката",
-  "passwordConfirmationPlaceholder": "********",
-  "createAccount": "Креирај сметка",
-  "creatingAccount": "Се креира сметка...",
-  "logIn": "Најави се",
-  "or": "или",
-  "googleLogin": "Најави се со Google",
-  "verifyEmail": "Верифицирајте ја вашата емаил адреса за продолжување",
-  "verificationSent1": "Линк за верификација е испратен на",
-  "verificationSent2": "Ве молиме проверете ја вашата е-пошта и кликнете на линкот за да ја активирате вашата сметка."
-}
Index: ontend/src/main.tsx
===================================================================
--- frontend/src/main.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,19 +1,0 @@
-import { StrictMode } from 'react'
-import { createRoot } from 'react-dom/client'
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-expect-error
-import './global.css';
-import App from './App.tsx'
-import {AuthProvider} from "./context/AuthContext.tsx";
-import {BrowserRouter} from "react-router-dom";
-import "./i18n.ts";
-
-createRoot(document.getElementById('root')!).render(
-  <StrictMode>
-      <BrowserRouter>
-          <AuthProvider>
-              <App />
-          </AuthProvider>
-      </BrowserRouter>
-  </StrictMode>,
-)
Index: ontend/src/models/FilterParams.tsx
===================================================================
--- frontend/src/models/FilterParams.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,10 +1,0 @@
-
-export interface FilterParams {
-    showOnlyFavoriteCourses?: boolean;
-    search?: string[];
-    difficulty?: string[];
-    price?: string[];
-    duration?: string[];
-    skill?: string[];
-    topic?: string[];
-}
Index: ontend/src/models/FilterRange.tsx
===================================================================
--- frontend/src/models/FilterRange.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,4 +1,0 @@
-export interface FilterRange {
-    floor: number;
-    ceil: number;
-}
Index: ontend/src/models/Review.tsx
===================================================================
--- frontend/src/models/Review.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,7 +1,0 @@
-export interface Review {
-    id: number;
-    rating: number;
-    comment: string;
-    date: Date;
-    enrollmentId: number;
-}
Index: ontend/src/models/SelectProps.tsx
===================================================================
--- frontend/src/models/SelectProps.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,11 +1,0 @@
-import React from "react";
-import type {UserPersonalization} from "./javaObjects/UserPersonalization.tsx";
-
-export interface SelectProps {
-    label: string;
-    name: keyof UserPersonalization;
-    id: string;
-    options?: string[];
-    setUser: React.Dispatch<React.SetStateAction<UserPersonalization>>;
-    user: UserPersonalization;
-}
Index: ontend/src/models/SliderProps.tsx
===================================================================
--- frontend/src/models/SliderProps.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,12 +1,0 @@
-import React from "react";
-import type {UserPersonalization} from "./javaObjects/UserPersonalization.tsx";
-
-type UserArrayFields = 'interests' | 'desiredSkills';
-export interface SliderProps {
-    label: string;
-    name: UserArrayFields;
-    id: string;
-    options?: string[];
-    setUser: React.Dispatch<React.SetStateAction<UserPersonalization>>;
-    user: UserPersonalization;
-}
Index: ontend/src/models/UserMeetingInfoRequest.tsx
===================================================================
--- frontend/src/models/UserMeetingInfoRequest.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,6 +1,0 @@
-export interface UserMeetingInfoRequest {
-    aboutCompany: string;
-    challenges: string;
-    expectations: string;
-    otherInfo: string;
-}
Index: ontend/src/models/javaObjects/CourseContentFull.tsx
===================================================================
--- frontend/src/models/javaObjects/CourseContentFull.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,8 +1,0 @@
-import type {CourseLectureFull} from "./CourseLectureFull.tsx";
-
-export interface CourseContentFull {
-    id: number;
-    title: string;
-    position: number;
-    courseLectures: CourseLectureFull[];
-}
Index: ontend/src/models/javaObjects/CourseContentPreview.tsx
===================================================================
--- frontend/src/models/javaObjects/CourseContentPreview.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,7 +1,0 @@
-import type {CourseLecturePreview} from "./CourseLecturePreview.tsx";
-
-export interface CourseContentPreview {
-    title: string;
-    position: number;
-    courseLectures: CourseLecturePreview[];
-}
Index: ontend/src/models/javaObjects/CourseDetail.tsx
===================================================================
--- frontend/src/models/javaObjects/CourseDetail.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,10 +1,0 @@
-import type {CoursePreview} from "./CoursePreview.tsx";
-import type {CourseContentPreview} from "./CourseContentPreview.tsx";
-
-export interface CourseDetail extends CoursePreview {
-    descriptionShort: string;
-    description: string;
-    descriptionLong: string;
-    whatWillBeLearned: string[];
-    courseContents: CourseContentPreview[];
-}
Index: ontend/src/models/javaObjects/CourseFull.tsx
===================================================================
--- frontend/src/models/javaObjects/CourseFull.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,10 +1,0 @@
-import type {CourseContentFull} from "./CourseContentFull.tsx";
-
-export interface CourseFull {
-    id: number,
-    titleShort: string;
-    title: string;
-    rating: number;
-    isFinished: boolean;
-    courseContents: CourseContentFull[];
-}
Index: ontend/src/models/javaObjects/CourseLectureFull.tsx
===================================================================
--- frontend/src/models/javaObjects/CourseLectureFull.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,14 +1,0 @@
-import type {ContentType} from "../types/ContentType.tsx";
-import type {UserCourseProgress} from "./UserCourseProgress.tsx";
-
-export interface CourseLectureFull {
-    id: number;
-    title: string;
-    description: string;
-    durationMinutes: number;
-    position: number;
-    contentText: string;
-    contentFileName: string;
-    contentType: ContentType;
-    userCourseProgress: UserCourseProgress;
-}
Index: ontend/src/models/javaObjects/CourseLecturePreview.tsx
===================================================================
--- frontend/src/models/javaObjects/CourseLecturePreview.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,9 +1,0 @@
-import type {ContentType} from "../types/ContentType.tsx";
-
-export interface CourseLecturePreview {
-    title: string;
-    description: string;
-    durationMinutes: number;
-    position: number;
-    contentType: ContentType;
-}
Index: ontend/src/models/javaObjects/CoursePreview.tsx
===================================================================
--- frontend/src/models/javaObjects/CoursePreview.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,18 +1,0 @@
-import type {Difficulty} from "../types/Difficulty.tsx";
-
-export interface CoursePreview {
-    id: number,
-    imageUrl: string;
-    color: string;
-    titleShort: string;
-    title: string;
-    difficulty: Difficulty;
-    durationMinutes: number;
-    price: number;
-    skillsGained: string[];
-    topicsCovered: string[];
-    courseContentCount: number;
-    courseLectureCount: number;
-    averageRating: number;
-}
-
Index: ontend/src/models/javaObjects/CoursePreviewEnrolled.tsx
===================================================================
--- frontend/src/models/javaObjects/CoursePreviewEnrolled.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,8 +1,0 @@
-import type {CoursePreview} from "./CoursePreview.tsx";
-
-export interface CoursePreviewEnrolled extends CoursePreview {
-    lecturesFinishedCount: number;
-    rating: number;
-    isFinished: boolean;
-}
-
Index: ontend/src/models/javaObjects/Enrollment.tsx
===================================================================
--- frontend/src/models/javaObjects/Enrollment.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,7 +1,0 @@
-
-export interface Enrollment {
-    enrollmentStatus: "PENDING" | "ACTIVE" | "COMPLETED";
-    percentCompleted: number;
-    date: Date;
-    courseId: number;
-}
Index: ontend/src/models/javaObjects/User.tsx
===================================================================
--- frontend/src/models/javaObjects/User.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,14 +1,0 @@
-export interface User {
-    id: number,
-    email: string;
-    name: string;
-    hasUsedFreeConsultation: boolean;
-    companySize: string;
-    workPosition: string;
-    interests: string[];
-    skills: string[];
-    desiredSkills: string[];
-    points: number;
-    favoriteCourses: number[];
-    isAdmin: boolean;
-}
Index: ontend/src/models/javaObjects/UserCourseProgress.tsx
===================================================================
--- frontend/src/models/javaObjects/UserCourseProgress.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,6 +1,0 @@
-
-export interface UserCourseProgress {
-    id: number;
-    completedAt: Date | null;
-    completed: boolean;
-}
Index: ontend/src/models/javaObjects/UserPersonalization.tsx
===================================================================
--- frontend/src/models/javaObjects/UserPersonalization.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,8 +1,0 @@
-export interface UserPersonalization {
-    name: string;
-    email: string;
-    companySize: string;
-    workPosition: string;
-    interests: string[];
-    desiredSkills: string[];
-}
Index: ontend/src/models/types/ContentType.tsx
===================================================================
--- frontend/src/models/types/ContentType.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,1 +1,0 @@
-export type ContentType = "VIDEO" | "TEXT" | "FILE" | "QUIZ" | "TOOL";
Index: ontend/src/models/types/Difficulty.tsx
===================================================================
--- frontend/src/models/types/Difficulty.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,1 +1,0 @@
-export type Difficulty = "BEGINNER" | "INTERMEDIATE" | "ADVANCED" | "EXPERT";
Index: ontend/src/pages/About.tsx
===================================================================
--- frontend/src/pages/About.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,140 +1,0 @@
-import {
-    IconTrendingUp,
-    IconRotate360,
-    IconRoute, IconChessKnight, IconArrowBigUp
-} from '@tabler/icons-react';
-import {LightBeams} from "../assets/animations/SpikeAnimation.tsx"
-import CountUp from "react-countup";
-import {Link} from "react-router-dom";
-import {ArrowRight} from "lucide-react";
-import MagicBento from "../assets/animations/MagicBento.tsx";
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-expect-error
-import ShifterArrow from "../../public/Shifter-Arrow-White.png"
-import { useTranslation } from "react-i18next";
-
-const About = () => {
-    const { t } = useTranslation("about");
-
-    const reasons = [
-        {
-            icon: <IconChessKnight size={72} color="var(--color-shifter)" aria-hidden={true} focusable={false}/>,
-            title: t("reasons.0.title"),
-            description: t("reasons.0.description"),
-        },
-        {
-            icon: <IconArrowBigUp size={72} color="var(--color-shifter)" aria-hidden={true} focusable={false}/>,
-            title: t("reasons.1.title"),
-            description: t("reasons.1.description"),
-        },
-        {
-            icon: <IconRotate360 size={72} color="var(--color-shifter)" aria-hidden={true} focusable={false}/>,
-            title: t("reasons.2.title"),
-            description: t("reasons.2.description"),
-        },
-        {
-            icon: <IconTrendingUp size={72} color="var(--color-shifter)" aria-hidden={true} focusable={false}/>,
-            title: t("reasons.3.title"),
-            description: t("reasons.3.description"),
-        },
-        {
-            icon: <IconRoute size={72} color="var(--color-shifter)" aria-hidden={true} focusable={false}/>,
-            title: t("reasons.4.title"),
-            description: t("reasons.4.description"),
-        }
-    ];
-
-    return (
-        <main className="relative bg-beige text-black-text">
-            {/*Hero Section*/}
-            <section className="relative py-vertical-lg pt-top-nav-lg px-horizontal-md flex flex-col items-center justify-center">
-                <LightBeams tilt={-50} beamCount={120} initialHeight={120 + Math.random() * 80} spikeMoveDown={40} />
-
-                <div className="flex flex-col items-center gap-20 z-1">
-                    <div className="flex flex-col  gap-4 max-w-3/4">
-                        <h1 className="text-7xl font-semibold" dangerouslySetInnerHTML={{__html: t("hero.title")}}/>
-                        <p className="text-xl font-light" dangerouslySetInnerHTML={{__html: t("hero.description")}}/>
-                    </div>
-
-                    <div className="flex justify-evenly items-stretch w-full">
-                        <div>
-                            <h2 className="text-3xl font-bold"><CountUp start={0} end={250} duration={4} separator={"."}/>+</h2>
-                            <p className="font-light whitespace-nowrap">{t("stats.clients")}</p>
-                        </div>
-
-                        <div className="w-px bg-beige/80"/>
-
-                        <div>
-                            <h2 className="text-3xl font-bold"><CountUp start={0} end={2000} duration={4} separator={"."}/>+</h2>
-                            <p className="font-light whitespace-nowrap">{t("stats.hours")}</p>
-                        </div>
-
-                        <div className="w-px bg-beige/80"/>
-
-                        <div>
-                            <h2 className="text-3xl font-bold"><CountUp start={0} end={4} duration={4} separator={"."}/>+</h2>
-                            <p className="font-light whitespace-nowrap">{t("stats.years")}</p>
-                        </div>
-                    </div>
-                </div>
-
-                <div
-                    className="absolute bottom-0 w-full h-3/10"
-                    style={{ background: "linear-gradient(to bottom, rgba(248,248,248,0) 0%, rgba(248,248,248,1) 100%)", pointerEvents: "none" }}
-                />
-            </section>
-
-            {/*Why Choose Us*/}
-            <section className="grid grid-cols-3 grid-rows-2 px-horizontal-md py-vertical-lg gap-20">
-                <div className="col-span-1 flex flex-col">
-                    <h2 className="text-5xl font-medium text-left " dangerouslySetInnerHTML={{__html: t("whyChoose.title")}}/>
-                </div>
-
-                {reasons.map((reason, index) => (
-                    <article key={index} className="col-span-1 flex flex-col gap-6 items-center">
-                        {reason.icon}
-                        <div className="flex flex-col gap-2 items-center">
-                            <h3 className="text-3xl font-bold">{reason.title}</h3>
-                            <p className="text-black-text/60">{reason.description}</p>
-                        </div>
-                    </article>
-                ))}
-            </section>
-
-            {/*About Section*/}
-            <section className="grid grid-cols-2 gap-x-40 px-horizontal-md py-vertical-lg bg-dark-blue/5">
-                <div className="col-start-1 col-span-1 flex flex-col text-left gap-12">
-                    <div className="flex flex-col gap-20">
-                        <div className="flex flex-col gap-4">
-                            <h2 className="text-5xl font-medium" dangerouslySetInnerHTML={{__html: t("about.title")}}/>
-                            <p dangerouslySetInnerHTML={{__html: t("about.description")}}/>
-                        </div>
-
-                        <Link to={"/free-consultation"} className="hover:shadow-shifter/60 shadow-shifter/40 transition-all duration-250 ease-in-out shadow-md border-2 border-white/40 flex gap-4 items-center text-white bg-shifter px-8 py-2 w-fit rounded-md group font-medium">
-                            {t("about.cta")} <ArrowRight size={20} strokeWidth={1.5} className="group-hover:translate-x-1 transition-all duration-250 ease-in-out"/>
-                        </Link>
-                    </div>
-                </div>
-
-                <div className="col-start-2 col-span-1 h-full bg-black/20 rounded-2xl"/>
-            </section>
-
-            {/*Mission, Vision & Purpose*/}
-            <section className="flex flex-col gap-12 px-horizontal-md py-vertical-lg ">
-                <h2 className="text-5xl font-medium">{t("foundations.title")}</h2>
-                <MagicBento
-                    textAutoHide={true}
-                    enableStars={false}
-                    enableSpotlight={true}
-                    enableBorderGlow={true}
-                    enableTilt={true}
-                    enableMagnetism={true}
-                    clickEffect={false}
-                    spotlightRadius={300}
-                />
-            </section>
-        </main>
-    );
-}
-
-export default About;
Index: ontend/src/pages/Academies.tsx
===================================================================
--- frontend/src/pages/Academies.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,165 +1,0 @@
-import {Mail, MapPin} from "lucide-react"
-import React from "react";
-import {useAuthContext} from "../context/AuthContext.tsx";
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-expect-error
-import Arrow from "../../public/Shifter-Arrow-White.png"
-import {sendEmailApi} from "../api/contactApi.ts";
-import { useTranslation } from "react-i18next";
-
-function Academies() {
-    const {t} = useTranslation("academies");
-    const {user, accessToken} = useAuthContext();
-    const [subject, setSubject] = React.useState("");
-    const [message, setMessage] = React.useState("");
-    const [loading, setLoading] = React.useState(false);
-    const [error, setError] = React.useState("");
-    const [isMessageSent, setIsMessageSent] = React.useState(false);
-
-    const handleSubmit = (e: React.FormEvent) => {
-        e.preventDefault();
-
-        setLoading(true);
-        sendEmailApi(accessToken || "", "Academies Inquiry - " + subject, message)
-            .then(() => {
-                setIsMessageSent(true);
-                setError("")
-            })
-            .catch((err) => {
-                setError(t("emailError"));
-                console.error("Error sending email for academies inquiry:", err);
-            })
-            .finally(() => setLoading(false));
-    }
-
-    return (
-        <main className="bg-gradient-to-b from-shifter via-shifter/20 via-40% to-beige">
-            {/*Hero*/}
-            <section className="flex flex-col items-center gap-4 w-full pb-60 pt-top-nav-lg px-horizontal-lg
-                text-white-text">
-                <h1 className="text-5xl font-bold" dangerouslySetInnerHTML={{__html: t("heroTitle")}}/>
-                <p className="text-xl font-light" dangerouslySetInnerHTML={{__html: t("heroDescription")}}/>
-            </section>
-
-            {/*Contact Form*/}
-            <section className=" flex items-center justify-center w-full px-horizontal-lg">
-                <div className="relative -top-40 grid grid-cols-3 gap-x-20 rounded-lg bg-white p-4
-                    shadow-md shadow-black/10">
-
-                    {/*Contact Info*/}
-                    <div className="border-1 border-white/40
-                    relative overflow-clip col-span-1 flex flex-col gap-8 py-8 px-8 rounded-lg bg-shifter text-white">
-                        <div className="flex flex-col gap-2 items-start text-left">
-                            <h2 className="text-2xl font-semibold whitespace-nowrap">{t("contactInfoTitle")}</h2>
-                            <p className="text-white/80 font-light text-sm">{t("contactInfoDescription")}</p>
-                        </div>
-                        <div className="flex gap-4 items-center">
-                            <Mail size={24} color="var(--color-white)"/>
-                            {t("contactEmail")}
-                        </div>
-                        <div className="flex gap-4 items-center">
-                            <MapPin size={24} color="var(--color-white)"/>
-                            {t("contactLocation")}
-                        </div>
-
-                        <div className="absolute -bottom-26 right-12 flex flex-col opacity-40 rotate-40">
-                            <img src={Arrow} className="w-28 h-auto" alt="Shifter Arrow"/>
-                            <img src={Arrow} className="w-28 h-auto rotate-180" alt="Shifter Arrow"/>
-                        </div>
-                    </div>
-
-                    {/*Form*/}
-                    <div className="flex flex-col gap-4 col-span-2">
-                        <div className="grid grid-cols-2 gap-4 items-center">
-                            <p className="text-black/40 text-xs col-span-2">{t("autoFilledNote")}</p>
-                            <p className="font-light text-black-text/60 text-md whitespace-nowrap ">
-                                {t("name")}: <span className="text-black-text font-normal">{user?.name}</span>
-                            </p>
-                            <p className="font-light text-black-text/60 text-md whitespace-nowrap ">
-                                {t("email")}: <span className="text-black-text font-normal">{user?.email}</span>
-                            </p>
-                        </div>
-
-                        <hr className="border-t-1 border-black/20 rounded-full"/>
-
-                        <form
-                            onSubmit={handleSubmit}
-                            className="flex flex-col gap-4 items-start">
-                            <div className="flex flex-col gap-4 items-center w-full">
-                                <TextInput
-                                    label={t("subjectLabel")}
-                                    name="subject"
-                                    placeholder={t("subjectPlaceholder")}
-                                    rows={1}
-                                    onChange={(e) => setSubject(e.target.value)}
-                                />
-                                <TextInput
-                                    label={t("messageLabel")}
-                                    name="message"
-                                    placeholder={t("messagePlaceholder")}
-                                    rows={8}
-                                    onChange={(e) => setMessage(e.target.value)}
-                                />
-                                {
-                                    error && (
-                                        <p className="text-red-500 text-md font-medium text-center">
-                                            {error}
-                                        </p>
-                                    )
-                                }
-                            </div>
-                            {
-                                isMessageSent ? (
-                                    <div className="text-center w-full">
-                                        <h2 className="text-xl font-bold text-shifter mb-2">{t("messageSentTitle")}</h2>
-                                        <p className="text-md font-medium text-black/80 max-w-xl mx-auto" dangerouslySetInnerHTML={{__html: t("messageSentDescription")}}/>
-                                    </div>
-                                ) : (
-                                    <div className="flex items-center gap-6">
-                                        <button
-                                            className="hover:shadow-shifter/60 transition-all duration-200 ease-in-out
-                                    disabled:cursor-not-allowed disabled:opacity-60
-                                    shadow-md shadow-shifter/40 bg-shifter text-white py-2 px-6 rounded-md cursor-pointer"
-                                            disabled={loading}
-                                            type="submit">
-                                            {loading ? t("sending") : t("sendMessage")}
-                                        </button>
-                                        {
-                                            loading && <div className="loader"/>
-                                        }
-                                    </div>
-                                )}
-                        </form>
-                    </div>
-                </div>
-            </section>
-        </main>
-    )
-}
-
-
-function TextInput({label, name, placeholder, rows, onChange}: {
-    label: string;
-    name: string;
-    placeholder: string;
-    rows: number;
-    onChange: (e: React.ChangeEvent<HTMLTextAreaElement>) => void;
-}) {
-    return (
-        <label className="w-full flex flex-col items-start gap-2">
-            <span className="text-black/40 font-semibold text-md peer-focused:text-shifter">{label}</span>
-            <textarea
-                required
-                onChange={onChange}
-                rows={rows}
-                name={name}
-                className="peer w-full bg-dark-blue/5 border-1 border-black/10 py-1 px-2 rounded-sm
-                resize-none min-h-fit custom-scrollbar
-                focus:outline-none focus:border-shifter/40 focus:border-2"
-                placeholder={placeholder}
-            />
-        </label>
-    )
-}
-
-export default Academies;
Index: ontend/src/pages/Consulting.tsx
===================================================================
--- frontend/src/pages/Consulting.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,147 +1,0 @@
-import { Mail, MapPin } from "lucide-react";
-import { useState } from "react";
-import { useAuthContext } from "../context/AuthContext.tsx";
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-expect-error
-import Arrow from "../../public/Shifter-Arrow-White.png";
-import { sendEmailApi } from "../api/contactApi.ts";
-import { useTranslation } from "react-i18next";
-
-function Consulting() {
-    const { t } = useTranslation("consulting");
-    const { user, accessToken } = useAuthContext();
-    const [subject, setSubject] = useState("");
-    const [message, setMessage] = useState("");
-    const [loading, setLoading] = useState(false);
-    const [error, setError] = useState("");
-    const [isMessageSent, setIsMessageSent] = useState(false);
-
-    const handleSubmit = (e: React.FormEvent) => {
-        e.preventDefault();
-
-        setLoading(true);
-        sendEmailApi(accessToken || "", "Consulting Inquiry - " + subject, message)
-            .then(() => {
-                setIsMessageSent(true);
-                setError("");
-            })
-            .catch((err) => {
-                setError(t("emailError"));
-                console.error("Error sending email for consulting inquiry:", err);
-            })
-            .finally(() => setLoading(false));
-    }
-
-    return (
-        <main className="bg-gradient-to-b from-shifter via-shifter/20 via-40% to-beige">
-            {/*Hero*/}
-            <section className="flex flex-col items-center gap-4 w-full pb-60 pt-top-nav-lg px-horizontal-lg text-white-text">
-                <h1 className="text-5xl font-bold">{t("heroTitle")}</h1>
-                <p className="text-xl font-light" dangerouslySetInnerHTML={{ __html: t("heroDescription") }} />
-            </section>
-
-            {/*Contact Form*/}
-            <section className="flex items-center justify-center w-full px-horizontal-lg">
-                <div className="relative -top-40 grid grid-cols-3 gap-x-20 rounded-lg bg-white p-4 shadow-md shadow-black/10">
-                    {/*Contact Info*/}
-                    <div className="border-1 border-white/40 relative overflow-clip col-span-1 flex flex-col gap-8 py-8 px-8 rounded-lg bg-shifter text-white">
-                        <div className="flex flex-col gap-2 items-start text-left">
-                            <h2 className="text-2xl font-semibold whitespace-nowrap">{t("contactInfoTitle")}</h2>
-                            <p className="text-white/80 font-light text-sm">{t("contactInfoDescription")}</p>
-                        </div>
-                        <div className="flex gap-4 items-center">
-                            <Mail size={24} color="var(--color-white)" />
-                            {t("contactEmail")}
-                        </div>
-                        <div className="flex gap-4 items-center">
-                            <MapPin size={24} color="var(--color-white)" />
-                            {t("contactLocation")}
-                        </div>
-
-                        <div className="absolute -bottom-26 right-12 flex flex-col opacity-40 rotate-40">
-                            <img src={Arrow} className="w-28 h-auto" alt="Shifter Arrow" />
-                            <img src={Arrow} className="w-28 h-auto rotate-180" alt="Shifter Arrow" />
-                        </div>
-                    </div>
-
-                    {/*Form*/}
-                    <div className="flex flex-col gap-4 col-span-2">
-                        <div className="grid grid-cols-2 gap-4 items-center">
-                            <p className="text-black/40 text-xs col-span-2">{t("autoFilledNote")}</p>
-                            <p className="font-light text-black-text/60 text-md whitespace-nowrap">
-                                {t("name")}: <span className="text-black-text font-normal">{user?.name}</span>
-                            </p>
-                            <p className="font-light text-black-text/60 text-md whitespace-nowrap">
-                                {t("email")}: <span className="text-black-text font-normal">{user?.email}</span>
-                            </p>
-                        </div>
-
-                        <hr className="border-t-1 border-black/20 rounded-full" />
-
-                        <form onSubmit={handleSubmit} className="flex flex-col gap-4 items-start">
-                            <div className="flex flex-col gap-4 items-center w-full">
-                                <TextInput
-                                    label={t("subjectLabel")}
-                                    name="subject"
-                                    placeholder={t("subjectPlaceholder")}
-                                    rows={1}
-                                    onChange={(e) => setSubject(e.target.value)}
-                                />
-                                <TextInput
-                                    label={t("messageLabel")}
-                                    name="message"
-                                    placeholder={t("messagePlaceholder")}
-                                    rows={8}
-                                    onChange={(e) => setMessage(e.target.value)}
-                                />
-                                {error && <p className="text-red-500 text-md font-medium text-center">{error}</p>}
-                            </div>
-
-                            {isMessageSent ? (
-                                <div className="text-center w-full">
-                                    <h2 className="text-xl font-bold text-shifter mb-2">{t("messageSentTitle")}</h2>
-                                    <p className="text-md font-medium text-black/80 max-w-xl mx-auto" dangerouslySetInnerHTML={{ __html: t("messageSentDescription") }} />
-                                </div>
-                            ) : (
-                                <div className="flex items-center gap-6">
-                                    <button
-                                        className="hover:shadow-shifter/60 transition-all duration-200 ease-in-out disabled:cursor-not-allowed disabled:opacity-60 shadow-md shadow-shifter/40 bg-shifter text-white py-2 px-6 rounded-md cursor-pointer"
-                                        disabled={loading}
-                                        type="submit"
-                                    >
-                                        {loading ? t("sending") : t("sendMessage")}
-                                    </button>
-                                    {loading && <div className="loader" />}
-                                </div>
-                            )}
-                        </form>
-                    </div>
-                </div>
-            </section>
-        </main>
-    );
-}
-
-function TextInput({ label, name, placeholder, rows, onChange }: {
-    label: string;
-    name: string;
-    placeholder: string;
-    rows: number;
-    onChange: (e: React.ChangeEvent<HTMLTextAreaElement>) => void;
-}) {
-    return (
-        <label className="w-full flex flex-col items-start gap-2">
-            <span className="text-black/40 font-semibold text-md peer-focused:text-shifter">{label}</span>
-            <textarea
-                required
-                onChange={onChange}
-                rows={rows}
-                name={name}
-                className="peer w-full bg-dark-blue/5 border-1 border-black/10 py-1 px-2 rounded-sm resize-none min-h-fit custom-scrollbar focus:outline-none focus:border-shifter/40 focus:border-2"
-                placeholder={placeholder}
-            />
-        </label>
-    );
-}
-
-export default Consulting;
Index: ontend/src/pages/Contact.tsx
===================================================================
--- frontend/src/pages/Contact.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,142 +1,0 @@
-import { Mail, MapPin } from "lucide-react";
-import React from "react";
-import { useTranslation } from "react-i18next";
-import { useAuthContext } from "../context/AuthContext.tsx";
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-expect-error
-import Arrow from "../../public/Shifter-Arrow-White.png";
-import { sendEmailApi } from "../api/contactApi.ts";
-
-function Contact() {
-    const { t } = useTranslation("contact");
-    const { user, accessToken } = useAuthContext();
-    const [subject, setSubject] = React.useState("");
-    const [message, setMessage] = React.useState("");
-    const [loading, setLoading] = React.useState(false);
-    const [error, setError] = React.useState("");
-    const [isMessageSent, setIsMessageSent] = React.useState(false);
-
-    const handleSubmit = (e: React.FormEvent) => {
-        e.preventDefault();
-
-        setLoading(true);
-        sendEmailApi(accessToken || "", subject, message)
-            .then(() => {
-                setIsMessageSent(true);
-                setError("");
-            })
-            .catch((err) => {
-                setError(t("form.sendingError"));
-                console.error("Error sending email for contact form:", err);
-            })
-            .finally(() => setLoading(false));
-    };
-
-    return (
-        <main className="bg-gradient-to-b from-shifter via-shifter/20 via-40% to-beige">
-            {/* Hero */}
-            <section className="flex flex-col items-center gap-4 w-full pb-60 pt-top-nav-lg px-horizontal-lg text-white-text">
-                <h1 className="text-5xl font-bold">{t("hero.title")}</h1>
-                <p className="text-xl font-light">{t("hero.description")}</p>
-            </section>
-
-            {/* Contact Form */}
-            <section className="flex items-center justify-center w-full px-horizontal-lg">
-                <div className="relative -top-40 grid grid-cols-3 gap-x-20 rounded-lg bg-white p-4 shadow-md shadow-black/10">
-                    {/* Contact Info */}
-                    <div className="border-1 border-white/40 relative overflow-clip col-span-1 flex flex-col gap-8 py-8 px-8 rounded-lg bg-shifter text-white">
-                        <div className="flex flex-col gap-2 items-start text-left">
-                            <h2 className="text-2xl font-semibold whitespace-nowrap">{t("info.title")}</h2>
-                            <p className="text-white/80 font-light text-sm">{t("info.description")}</p>
-                        </div>
-                        <div className="flex gap-4 items-center">
-                            <Mail size={24} color="var(--color-white)" />
-                            {t("info.email")}
-                        </div>
-                        <div className="flex gap-4 items-center">
-                            <MapPin size={24} color="var(--color-white)" />
-                            {t("info.location")}
-                        </div>
-                        <div className="absolute -bottom-26 right-12 flex flex-col opacity-40 rotate-40">
-                            <img src={Arrow} className="w-28 h-auto" alt="Shifter Arrow" />
-                            <img src={Arrow} className="w-28 h-auto rotate-180" alt="Shifter Arrow" />
-                        </div>
-                    </div>
-
-                    {/* Form */}
-                    <div className="flex flex-col gap-4 col-span-2">
-                        <div className="grid grid-cols-2 gap-4 items-center">
-                            <p className="text-black/40 text-xs col-span-2">{t("profileNotice")}</p>
-                            <p className="font-light text-black-text/60 text-md whitespace-nowrap">
-                                Name: <span className="text-black-text font-normal">{user?.name}</span>
-                            </p>
-                            <p className="font-light text-black-text/60 text-md whitespace-nowrap">
-                                Email: <span className="text-black-text font-normal">{user?.email}</span>
-                            </p>
-                        </div>
-
-                        <hr className="border-t-1 border-black/20 rounded-full" />
-
-                        <form onSubmit={handleSubmit} className="flex flex-col gap-12 items-start">
-                            <div className="flex flex-col gap-4 items-center w-full">
-                                <TextInput
-                                    label={t("form.subject")}
-                                    name="subject"
-                                    placeholder={t("form.subjectPlaceholder")}
-                                    rows={1}
-                                    onChange={(e) => setSubject(e.target.value)}
-                                />
-                                <TextInput
-                                    label={t("form.message")}
-                                    name="message"
-                                    placeholder={t("form.messagePlaceholder")}
-                                    rows={8}
-                                    onChange={(e) => setMessage(e.target.value)}
-                                />
-                                {error && <p className="text-red-500 text-md font-medium text-center">{error}</p>}
-                            </div>
-
-                            {isMessageSent ? (
-                                <div className="text-center w-full">
-                                    <h2 className="text-xl font-bold text-shifter mb-2">{t("form.successTitle")}</h2>
-                                    <p className="text-md font-medium text-black/80 max-w-xl mx-auto">
-                                        {t("form.successDescription")}
-                                    </p>
-                                </div>
-                            ) : (
-                                <div className="flex items-center gap-6">
-                                    <button
-                                        className="hover:shadow-shifter/60 transition-all duration-200 ease-in-out disabled:cursor-not-allowed disabled:opacity-60 shadow-md shadow-shifter/40 bg-shifter text-white py-2 px-6 rounded-md cursor-pointer"
-                                        disabled={loading}
-                                        type="submit"
-                                    >
-                                        {loading ? t("form.sending") : t("form.sendButton")}
-                                    </button>
-                                    {loading && <div className="loader" />}
-                                </div>
-                            )}
-                        </form>
-                    </div>
-                </div>
-            </section>
-        </main>
-    );
-}
-
-function TextInput({ label, name, placeholder, rows, onChange }: { label: string; name: string; placeholder: string; rows: number; onChange: (e: React.ChangeEvent<HTMLTextAreaElement>) => void }) {
-    return (
-        <label className="w-full flex flex-col items-start gap-2">
-            <span className="text-black/40 font-semibold text-md peer-focused:text-shifter">{label}</span>
-            <textarea
-                required
-                onChange={onChange}
-                rows={rows}
-                name={name}
-                className="peer w-full bg-dark-blue/5 border-1 border-black/10 py-1 px-2 rounded-sm resize-none min-h-fit custom-scrollbar focus:outline-none focus:border-shifter/40 focus:border-2"
-                placeholder={placeholder}
-            />
-        </label>
-    );
-}
-
-export default Contact;
Index: ontend/src/pages/CourseDetails.tsx
===================================================================
--- frontend/src/pages/CourseDetails.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,75 +1,0 @@
-import {useParams} from "react-router-dom";
-import { fetchCourseDetailsApi } from "../api/courseApi.ts";
-import {useEffect, useState} from "react";
-import HeroCourseDetails from "../components/HeroCourseDetails.tsx";
-import CourseDetailsInfo from "../components/CourseDetailsInfo.tsx";
-import CoursesCarouselCourseDetails from "../components/CoursesCarouselCourseDetails.tsx";
-import type {CourseDetail} from "../models/javaObjects/CourseDetail.tsx";
-import {useAuthContext} from "../context/AuthContext.tsx";
-import HeroCourseDetailsSkeleton from "../components/skeletons/HeroCourseDetailsSkeleton.tsx";
-import CourseDetailsInfoSkeleton from "../components/skeletons/CourseDetailsInfoSkeleton.tsx";
-import {useEnrollUserInCourse} from "../hooks/useEnrollUserInCourse.tsx";
-
-function CourseDetails() {
-    const { loading: authLoading } = useAuthContext();
-    const [loading, setLoading] = useState<boolean>(true);
-    const { courseId } = useParams<{ courseId: string; courseTitle: string }>();
-    const [course, setCourse] = useState<CourseDetail>({
-        color: "",
-        courseContentCount: 0,
-        courseContents: [],
-        description: "",
-        descriptionLong: "",
-        descriptionShort: "",
-        difficulty: "BEGINNER",
-        durationMinutes: 0,
-        id: 0,
-        imageUrl: "",
-        price: 0,
-        rating: 0,
-        ratingCount: 0,
-        skillsGained: [],
-        title: "",
-        titleShort: "",
-        topicsCovered: [],
-        whatWillBeLearned: []
-    });
-
-    const { enroll } = useEnrollUserInCourse(Number(courseId), course?.titleShort);
-
-    useEffect(() => {
-        setLoading(true);
-
-        fetchCourseDetailsApi(Number(courseId))
-            .then(data => {
-                setCourse(data);
-            })
-            .catch(err => {
-                console.error("Error fetching javaObjects details: ", err);
-            })
-            .finally(() => {
-                setLoading(false);
-            })
-
-    }, [courseId])
-
-    return (
-        <main className="bg-beige text-black-text">
-            {
-                (authLoading || loading) ?
-                    <>
-                        <HeroCourseDetailsSkeleton />
-                        <CourseDetailsInfoSkeleton />
-                        <CoursesCarouselCourseDetails />
-                    </> :
-                    <>
-                        <HeroCourseDetails course={course} enrollUser={enroll}/>
-                        <CourseDetailsInfo course={course}/>
-                        <CoursesCarouselCourseDetails courseId={course.id}/>
-                    </>
-            }
-        </main>
-    )
-}
-
-export default CourseDetails;
Index: ontend/src/pages/CourseLearn.tsx
===================================================================
--- frontend/src/pages/CourseLearn.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,316 +1,0 @@
-import {Link, useParams} from "react-router-dom";
-import {useAuthContext} from "../context/AuthContext.tsx";
-import CourseContentSideNav from "../components/learn/CourseContentSideNav.tsx";
-import CourseLearnSkeleton from "../components/skeletons/CourseLearnSkeleton.tsx";
-import {ArrowLeft, MoveLeft, MoveRight, CheckCheck} from "lucide-react";
-import TextWithUnderline from "../components/TextWithUnderline.tsx";
-import {useCourseLearn} from "../hooks/useCourseLearn.tsx";
-import {type JSX, useEffect, useRef, useState} from "react";
-import StarFilled from "../assets/icons/StarFilled.tsx";
-import NavbarLearn from "../layout/NavbarLearn.tsx";
-import ModalReviewCourse from "../components/ModalReviewCourse.tsx";
-import Certificate from "../assets/icons/Certificate.tsx";
-
-function CourseLearn() {
-    const {courseId} = useParams<{ courseId: string }>();
-    const {accessToken} = useAuthContext();
-    const [showSideNav, setShowSideNav] = useState(true);
-    const [showReviewModal, setShowReviewModal] = useState(false);
-    const {
-        activeLecture,
-        setActiveLecture,
-        course,
-        setCourse,
-        loading,
-        videoUrl,
-        isDownloading,
-        updateLecture,
-        triggerDownload,
-        downloadCertificate,
-        isLastLectureFinished,
-        setIsLastLectureFinished,
-        courseFinishedPunchlines,
-        progressPercentage
-    } = useCourseLearn(Number(courseId), accessToken || "");
-    const spanRef = useRef<HTMLSpanElement>(null);
-    const [spanWidth, setSpanWidth] = useState(0);
-    const [isBtnHovered, setIsBtnHovered] = useState(false);
-
-    const firstLectureId = course?.courseContents[0].courseLectures[0].id;
-    const allLectures = course?.courseContents.flatMap(content => content.courseLectures);
-    const lastLectureId = allLectures ? allLectures[allLectures.length - 1].id : undefined;
-
-
-    useEffect(() => {
-        if (spanRef.current) {
-            setSpanWidth(spanRef.current.offsetWidth);
-        }
-    }, [showSideNav]);
-
-    useEffect(() => {
-        window.scrollTo({
-            top: 0,
-            behavior: "smooth",
-        });
-    }, [activeLecture]);
-
-    const markCourseAsRated = (newRating: number) => {
-        if (!course) return;
-        setCourse({...course, rating: newRating})
-    }
-
-    if (loading) {
-        return (
-            <>
-                <NavbarLearn courseRating={0} markCourseAsRated={markCourseAsRated}/>
-                <CourseLearnSkeleton/>
-            </>
-        );
-    }
-
-    return (
-        <>
-            <NavbarLearn courseRating={course?.rating} markCourseAsRated={markCourseAsRated}/>
-            <main className="flex overflow-x-clip">
-                {
-                    isLastLectureFinished ? (
-                        <div className="flex flex-col gap-12 w-full justify-center items-center h-screen ">
-                            {
-                                progressPercentage !== 100 ? (
-                                    <LastLectureFinished
-                                        title={"🎉 You've finished the last lesson in this course!"}
-                                        onClick={() => {
-                                            const firstUncompletedLecture = course?.courseContents
-                                                ?.flatMap(content => content.courseLectures)
-                                                ?.find(lecture => !lecture.userCourseProgress.completed);
-                                            setActiveLecture(firstUncompletedLecture || course?.courseContents[0]?.courseLectures[0] || null);
-                                            setIsLastLectureFinished(false);
-                                        }}
-                                        btnText={"Finish Other Lectures"}
-                                        btnShow={true}
-                                    />
-                                ) : (
-                                    <LastLectureFinished
-                                        title={courseFinishedPunchlines[Math.floor(Math.random() * courseFinishedPunchlines.length)]}
-                                        onClick={() => {
-                                            setShowReviewModal(true);
-                                        }}
-                                        btnText={
-                                            <div className="flex items-center gap-2">
-                                                <StarFilled className="text-gold h-6 "/>
-                                                Leave a Review
-                                            </div>
-                                        }
-                                        btnShow={(course?.rating ?? 0) === 0}
-                                        downloadCertificate={downloadCertificate}
-                                    />
-                                )
-                            }
-                        </div>
-                    ) : (
-                        <div className="flex flex-col">
-                            {
-                                activeLecture?.contentType === "VIDEO" && (
-                                    <video
-                                        src={videoUrl}
-                                        controls
-                                        controlsList="nodownload"
-                                        preload="metadata"
-                                    />
-                                )
-                            }
-                            <div
-                                className="flex flex-col gap-4 flex-grow py-vertical-md px-horizontal-sm text-left text-black-text">
-                                <h1 className="text-4xl font-semibold">{activeLecture?.title}</h1>
-                                <p className="text-lg leading-loose">{activeLecture?.contentText}</p>
-                                {
-                                    (activeLecture?.contentType === "FILE" || activeLecture?.contentType === "TOOL" || activeLecture?.contentType === "QUIZ") && (
-                                        <div className="flex justify-between w-full gap-20 items-center py-12">
-                                            <p className="text-lg font-medium">
-                                                {activeLecture.contentFileName}
-                                            </p>
-                                            <button
-                                                disabled={isDownloading}
-                                                onClick={() => triggerDownload()}
-                                                className={`disabled:cursor-not-allowed disabled:opacity-40 hover:shadow-lg transition-all duration-300 ease-in-out cursor-pointer
-                                                bg-shifter text-white text-lg px-8 py-2 rounded-md shadow-md border-2 border-white/40 shadow-shifter/40`}
-                                            >
-                                                {
-                                                    isDownloading ? "Downloading..." : "Download File"
-                                                }
-                                            </button>
-                                        </div>
-                                    )
-                                }
-                            </div>
-
-                            <div className="px-horizontal-sm py-vertical-md w-full flex justify-between items-center">
-                                {
-                                    firstLectureId !== activeLecture?.id && (
-                                        <button
-                                            onClick={() => {
-                                                if (!course || !activeLecture) return;
-                                                const allLectures = course.courseContents.flatMap(content => content.courseLectures);
-                                                const currentIndex = allLectures.findIndex(lec => lec.id === activeLecture.id);
-                                                if (currentIndex > 0) {
-                                                    setActiveLecture(allLectures[currentIndex - 1]);
-                                                }
-                                            }}
-                                            className="mr-auto flex items-center gap-2 text-lg cursor-pointer py-2">
-                                            <MoveLeft size={20} strokeWidth={2}/>
-                                            <TextWithUnderline label={"Previous Lecture"} fromRightToLeft={true}/>
-                                        </button>
-                                    )
-                                }
-                                {
-                                    lastLectureId === activeLecture?.id ? (
-                                        <button
-                                            onClick={() => {
-                                                updateLecture(activeLecture?.userCourseProgress.id || -1, true);
-                                                setIsLastLectureFinished(true);
-                                            }}
-                                            className="ml-auto flex items-center gap-2 text-lg cursor-pointer py-2">
-                                            <TextWithUnderline label={"Finish Course"}/>
-                                            <CheckCheck size={20} strokeWidth={2}/>
-                                        </button>
-                                    ) : (
-                                        <button
-                                            onClick={() => {
-                                                updateLecture(activeLecture?.userCourseProgress.id || -1, true)
-                                                if (!course || !activeLecture) return;
-                                                const allLectures = course.courseContents.flatMap(content => content.courseLectures);
-                                                const currentIndex = allLectures.findIndex(lec => lec.id === activeLecture.id);
-                                                if (currentIndex < allLectures.length - 1) {
-                                                    setActiveLecture(allLectures[currentIndex + 1]);
-                                                }
-                                            }}
-                                            className="ml-auto flex items-center gap-2 text-lg cursor-pointer py-2">
-                                            <TextWithUnderline label={"Next Lecture"}/>
-                                            <MoveRight size={20} strokeWidth={2}/>
-                                        </button>
-                                    )
-                                }
-                            </div>
-                        </div>
-                    )
-                }
-                {
-                    activeLecture && course && showSideNav ? (
-                        <CourseContentSideNav
-                            activeLecture={activeLecture}
-                            setActiveLecture={setActiveLecture}
-                            courseContents={course.courseContents}
-                            updateLecture={updateLecture}
-                            closeModal={() => setShowSideNav(false)}
-                            progressPercentage={progressPercentage}
-                        />
-                    ) : (
-                        <button
-                            onMouseEnter={() => setIsBtnHovered(true)}
-                            onMouseLeave={() => setIsBtnHovered(false)}
-                            onClick={() => {
-                                setShowSideNav(true)
-                                setIsBtnHovered(false)
-                            }}
-                            className="fixed top-24 right-0 flex items-center gap-2
-                        h-fit bg-shifter px-4 py-2 border border-white/40 rounded-sm cursor-pointer group overflow-hidden hover:translate-x-0"
-                            style={{
-                                transform: !isBtnHovered ? `translateX(${spanWidth + 16}px)` : "translateX(0)",
-                                transition: "transform 0.5s ease",
-                            }}
-                        >
-                            <ArrowLeft
-                                size={22}
-                                strokeWidth={1.5}
-                                color={"var(--color-white)"}
-                            />
-                            <span
-                                ref={spanRef}
-                                className="text-white whitespace-nowrap opacity-0 group-hover:opacity-100 transition-opacity duration-700 ease-in-out"
-                            >
-                            Course Content
-                        </span>
-                        </button>
-
-                    )
-                }
-                {
-                    showReviewModal && course && (
-                        <ModalReviewCourse
-                            courseId={course.id}
-                            closeModal={() => setShowReviewModal(false)}
-                            markCourseAsRated={markCourseAsRated}
-                            isUpdate={false}
-                        />
-                    )
-                }
-            </main>
-        </>
-    )
-}
-
-function LastLectureFinished({title, onClick, btnText, btnShow, downloadCertificate}: {
-    title: string,
-    onClick: () => void,
-    btnText: string | JSX.Element,
-    btnShow: boolean
-    downloadCertificate?: () => void
-}) {
-    const [loading, setLoading] = useState<boolean>(false);
-
-    return (
-        <>
-            <h1 className="text-3xl font-semibold">{title}</h1>
-            <div className="flex flex-col gap-4">
-                {
-                    btnShow && (
-                        <button
-                            onClick={onClick}
-                            className="hover:bg-shifter/10
-                            flex gap-2 items-center justify-center text-lg   font-bold px-8 py-2 rounded-md border-1 border-shifter cursor-pointer">
-                            {btnText}
-                        </button>
-                    )
-                }
-                {
-                    downloadCertificate && (
-                        <button
-                            disabled={loading}
-                            onClick={async () => {
-                                setLoading(true);
-                                try {
-                                    await downloadCertificate()
-                                } catch (error) {
-                                    console.error("Certificate download failed:", error);
-                                } finally {
-                                    setLoading(false);
-                                }
-                            }}
-                            className="disabled:cursor-not-allowed disabled:opacity-60 hover:bg-shifter/10
-                            flex gap-2 items-center justify-center text-lg   font-bold px-8 py-2 rounded-md border-1 border-shifter cursor-pointer">
-                            {
-                                loading ? (
-                                    <>
-                                        Downloading...
-                                        <div className="loader"/>
-                                    </>
-                                ) : (
-                                    <div className="flex items-center gap-2">
-                                        <Certificate className="text-black h-6 "/>
-                                        Download Certificate
-                                    </div>
-                                )
-                            }
-                        </button>
-                    )
-                }
-                <Link to="/learn"
-                      className="text-lg font-bold text-shifter underline hover:text-shifter/60">
-                    Exit from Course
-                </Link>
-            </div>
-        </>
-    )
-}
-
-export default CourseLearn;
Index: ontend/src/pages/Courses.tsx
===================================================================
--- frontend/src/pages/Courses.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,212 +1,0 @@
-import {useEffect, useMemo, useState} from "react";
-import { useTranslation } from "react-i18next";
-import CoursesFilters from "../components/CoursesFilters.tsx";
-import CoursesGrid from "../components/CoursesGrid.tsx";
-import type {FilterParams} from "../models/FilterParams.tsx";
-import {fetchCoursesApi} from "../api/courseApi.ts";
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-expect-error
-import ShifterRocket from "../../public/Rocket-Blue-Fire.png";
-import {useCourseStorage} from "../context/CourseStorage.ts";
-import type {CoursePreview} from "../models/javaObjects/CoursePreview.tsx";
-import {useAuthContext} from "../context/AuthContext.tsx";
-import {useLocation, useNavigate} from "react-router-dom";
-import CoursesFiltersSkeleton from "../components/skeletons/CoursesFiltersSkeleton.tsx";
-import CoursesGridSkeleton from "../components/skeletons/CoursesGridSkeleton.tsx";
-import {getFromSessionStorage, saveToSessionStorage} from "../utils/useSessionStorage.ts";
-
-function getInitialFiltersFromSearch(locationSearch: string): FilterParams {
-    const searchParams = new URLSearchParams(locationSearch);
-    const initialParams: FilterParams = {};
-
-    const search = searchParams.getAll("search");
-    if (search.length > 0) initialParams.search = search;
-
-    const skill = searchParams.getAll("skill");
-    if (skill.length > 0) initialParams.skill = skill;
-
-    const topic = searchParams.getAll("topic");
-    if (topic.length > 0) initialParams.topic = topic;
-
-    const difficulty = searchParams.getAll("difficulty");
-    if (difficulty.length > 0) initialParams.difficulty = difficulty;
-
-    const price = searchParams.getAll("price");
-    if (price.length > 0) initialParams.price = price;
-
-    const duration = searchParams.getAll("duration");
-    if (duration.length > 0) initialParams.duration = duration;
-
-    return initialParams;
-}
-
-function Courses() {
-    const { t } = useTranslation("courses");
-    const navigate = useNavigate();
-    const location = useLocation();
-    const {accessToken, user, loading: authLoading} = useAuthContext();
-    const {allCourses, setAllCourses} = useCourseStorage();
-
-    const [courses, setCourses] = useState<CoursePreview[] | null>(null);
-    const [loading, setLoading] = useState<boolean>(false);
-    const [filters, setFilters] = useState<FilterParams>(getInitialFiltersFromSearch(location.search));
-
-    const topics = useMemo(() =>
-            allCourses?.map(course => course.topicsCovered).flat() || [],
-        [allCourses]
-    );
-    const skills = useMemo(() =>
-            allCourses?.map(course => course.skillsGained).flat() || [],
-        [allCourses]
-    );
-
-    useEffect(() => {
-        const storedCourses = getFromSessionStorage<typeof allCourses>("allCourses");
-        if (storedCourses) {
-            setAllCourses(storedCourses);
-            return;
-        }
-
-        setLoading(true);
-        fetchCoursesApi(accessToken || "")
-            .then(resCourses => setAllCourses(resCourses))
-            .catch(err => console.error("Failed to fetch courses:", err))
-            .finally(() => setLoading(false));
-    }, [authLoading]);
-
-    useEffect(() => {
-        saveToSessionStorage("allCourses", allCourses);
-    }, [allCourses]);
-
-    useEffect(() => {
-        if (!allCourses) return;
-
-        let filteredCourses = [...allCourses];
-
-        if (filters.search) {
-            filteredCourses = filteredCourses.filter(course =>
-                filters.search!.some(search =>
-                    course.difficulty.toLowerCase().includes(search.toLowerCase()) ||
-                    course.title.toLowerCase().includes(search.toLowerCase()) ||
-                    course.topicsCovered.some(topic => topic.toLowerCase().includes(search.toLowerCase())) ||
-                    course.skillsGained.some(skill => skill.toLowerCase().includes(search.toLowerCase()))
-                )
-            );
-        }
-
-        if (filters.skill?.length) {
-            filteredCourses = filteredCourses.filter(course =>
-                filters.skill!.some(skill => course.skillsGained.includes(skill))
-            );
-        }
-
-        if (filters.topic?.length) {
-            filteredCourses = filteredCourses.filter(course =>
-                filters.topic!.some(topic => course.topicsCovered.includes(topic))
-            );
-        }
-
-        if (filters.difficulty?.length) {
-            filteredCourses = filteredCourses.filter(course =>
-                filters.difficulty!.includes(course.difficulty)
-            );
-        }
-
-        if (filters.price?.length) {
-            filteredCourses = filteredCourses.filter(course =>
-                filters.price!.some(priceRange => {
-                    const price = course.price;
-                    switch (priceRange) {
-                        case "free": return price === 0;
-                        case "low": return price > 0 && price < 20;
-                        case "medium": return price >= 20 && price <= 50;
-                        case "high": return price > 50;
-                        default: return false;
-                    }
-                })
-            );
-        }
-
-        if (filters.duration?.length) {
-            filteredCourses = filteredCourses.filter(course =>
-                filters.duration!.some(durationRange => {
-                    const minutes = course.durationMinutes;
-                    switch (durationRange) {
-                        case "extraShort": return minutes < 60 * 3;
-                        case "short": return minutes >= 60 * 3 && minutes < 60 * 6;
-                        case "medium": return minutes >= 60 * 6 && minutes < 60 * 10;
-                        case "long": return minutes >= 60 * 10;
-                        default: return false;
-                    }
-                })
-            );
-        }
-
-        if (filters.showOnlyFavoriteCourses) {
-            filteredCourses = filteredCourses.filter(course =>
-                user?.favoriteCourses.includes(course.id)
-            );
-        }
-
-        setCourses(filteredCourses);
-    }, [allCourses, filters, user?.favoriteCourses]);
-
-    useEffect(() => {
-        const noFiltersApplied = Object.keys(filters).length === 0;
-        if (noFiltersApplied) {
-            navigate({pathname: location.pathname, search: ""}, {replace: true});
-            return;
-        }
-
-        const paramsToUrl = new URLSearchParams();
-        Object.entries(filters).forEach(([key, value]) => {
-            if (Array.isArray(value)) {
-                value.forEach(v => paramsToUrl.append(key, v));
-            } else if (value) {
-                paramsToUrl.set(key, value.toString());
-            }
-        });
-        navigate({pathname: location.pathname, search: paramsToUrl.toString()}, {replace: true});
-    }, [filters]);
-
-    return (
-        <main className="font-montserrat bg-white">
-            <section className="relative flex flex-col items-center justify-center py-vertical-lg pt-top-nav-md gap-4 px-horizontal-lg shadow-sm">
-                <img
-                    src={ShifterRocket}
-                    alt={t("rocketAlt")}
-                    className="absolute top-top-nav-sm left-20 rotate-45 w-16 h-auto"
-                />
-                <h1 className="text-6xl">
-                    {t("title")}
-                    <br/>
-                    <strong className="text-shifter">{t("highlight")}</strong>
-                </h1>
-                <p>{t("description")}</p>
-            </section>
-
-            {(authLoading || loading) ? (
-                <section className="flex gap-0 w-full">
-                    <CoursesFiltersSkeleton />
-                    <CoursesGridSkeleton />
-                </section>
-            ) : (
-                <section className="flex gap-0 w-full">
-                    <CoursesFilters
-                        filters={filters}
-                        setFilters={setFilters}
-                        topics={topics}
-                        skills={skills}
-                    />
-                    <CoursesGrid
-                        setFilters={setFilters}
-                        filters={filters}
-                        courses={courses}
-                    />
-                </section>
-            )}
-        </main>
-    );
-}
-
-export default Courses;
Index: ontend/src/pages/FreeConsultation.tsx
===================================================================
--- frontend/src/pages/FreeConsultation.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,199 +1,0 @@
-import {useAuthContext} from "../context/AuthContext.tsx";
-import React, {useEffect, useState} from "react";
-import {fetchExpertFreeTimeSlotsApi, scheduleMeetingApi} from "../api/meetingApi.ts";
-import type {UserMeetingInfoRequest} from "../models/UserMeetingInfoRequest.tsx";
-import { useTranslation } from "react-i18next";
-
-function FreeConsultation() {
-    const { t } = useTranslation("freeConsultation");
-    const {user, setUser, accessToken, authChecked} = useAuthContext();
-    const [loadingDateTime, setLoadingDateTime] = useState(true);
-    const [loadingSubmitForm, setLoadingSubmitForm] = useState(false);
-    const [error, setError] = useState<string>("");
-    const [selectedDate, setSelectedDate] = useState<string>("");
-    const [selectedTime, setSelectedTime] = useState<string>("");
-    const [freeSlots, setFreeSlots] = useState<Record<string, string[]>>({"": [""]});
-    const [userMeetingInfo, setUserMeetingInfo] = useState<UserMeetingInfoRequest>({
-        aboutCompany: "",
-        challenges: "",
-        expectations: "",
-        otherInfo: ""
-    });
-    const [meetingScheduled, setMeetingScheduled] = useState<boolean>(false);
-
-    const handleScheduleMeeting = (e: React.FormEvent<HTMLFormElement>) => {
-        e.preventDefault();
-        if (!selectedDate || !selectedTime) {
-            setError(t("errors.selectDateTime"));
-            return;
-        }
-
-        setLoadingSubmitForm(true);
-        scheduleMeetingApi(accessToken || "", selectedTime, selectedDate, userMeetingInfo)
-            .then(() => {
-                setMeetingScheduled(true);
-                setError("");
-
-                if (user)
-                    setUser({...user, hasUsedFreeConsultation: true})
-            })
-            .catch(error => {
-                console.error("Error scheduling meeting:", error);
-                if (error.response?.data?.message === "User has already used free consultation")
-                    setError(t("errors.alreadyUsed"));
-                else
-                    setError(t("errors.failedSchedule"));
-            })
-            .finally(() => setLoadingSubmitForm(false));
-    }
-
-    useEffect(() => {
-        if (!authChecked || !accessToken) return;
-
-        setLoadingDateTime(true);
-        fetchExpertFreeTimeSlotsApi(accessToken)
-            .then(data => setFreeSlots(data))
-            .catch(error => console.error("Error fetching time slots:", error))
-            .finally(() => setLoadingDateTime(false));
-    }, [authChecked, accessToken]);
-
-    // Assert type for TypeScript
-    const steps = t("nextSteps.steps", { returnObjects: true }) as { title: string; description: string }[];
-
-    return (
-        <main className="bg-gradient-to-b from-shifter via-shifter/20 via-40% to-beige">
-            {/*Hero*/}
-            <section className="flex flex-col items-center gap-4 w-full pb-60 pt-top-nav-lg px-horizontal-lg text-white-text">
-                <h1 className="text-5xl font-bold">{t("hero.title")}</h1>
-                <p className="text-xl font-light">{t("hero.description")}</p>
-            </section>
-
-            {/*Contact Form*/}
-            <section className="flex items-center justify-center w-full px-horizontal-lg">
-                <div className="relative -top-40 grid grid-cols-3 gap-x-20 rounded-lg bg-white p-4 shadow-md shadow-black/10">
-
-                    {/*Contact Info*/}
-                    {/*Contact Info*/}
-                    <div className="border-1 border-white/40 relative overflow-clip col-span-1 flex flex-col gap-8 py-8 px-8 rounded-lg bg-shifter text-white">
-                        <h2 className="text-left text-2xl font-semibold">{t("nextSteps.title")}</h2>
-                        <ol className="flex flex-col">
-                            {steps.map((step, idx) => (
-                                <Step
-                                    key={idx}
-                                    title={step.title}
-                                    description={step.description}
-                                    isLast={idx === steps.length - 1}
-                                />
-                            ))}
-                        </ol>
-                    </div>
-
-
-                    {/*Form*/}
-                    <div className="flex flex-col gap-4 col-span-2">
-                        <div className="grid grid-cols-2 gap-4 items-center">
-                            <p className="text-black/40 text-xs col-span-2">{t("form.profileHint")}</p>
-                            <p className="font-light text-black-text/60 text-md whitespace-nowrap">{t("form.name")}: <span className="text-black-text font-normal">{user?.name}</span></p>
-                            <p className="font-light text-black-text/60 text-md whitespace-nowrap">{t("form.email")}: <span className="text-black-text font-normal">{user?.email}</span></p>
-                        </div>
-
-                        <hr className="border-t-1 border-black/20 rounded-full"/>
-
-                        <form onSubmit={handleScheduleMeeting} className="flex flex-col gap-12 items-start">
-                            <div className="flex flex-col gap-4 items-center w-full">
-                                {["aboutCompany","challenges","expectations","otherInfo"].map(field => (
-                                    <TextInput
-                                        key={field}
-                                        label={t(`form.fields.${field}.label`)}
-                                        name={field}
-                                        placeholder={t(`form.fields.${field}.placeholder`)}
-                                        onChange={(e) => setUserMeetingInfo({...userMeetingInfo, [field]: e.target.value})}
-                                    />
-                                ))}
-
-                                <hr className="border-t-1 border-black/20 rounded-full w-full"/>
-                                <div className="flex justify-between items-center w-full">
-                                    {loadingDateTime ? (
-                                        <>
-                                            <div className="bg-gray-300 animate-pulse py-2 px-8 rounded-sm h-10 w-50"></div>
-                                            <div className="bg-gray-300 animate-pulse py-2 px-8 rounded-sm h-10 w-50"></div>
-                                        </>
-                                    ) : (
-                                        <>
-                                            <SelectInput
-                                                value={selectedDate}
-                                                onChange={(e) => setSelectedDate(e.target.value)}
-                                                firstOption={t("form.selectDate")}
-                                                options={Object.keys(freeSlots)}
-                                            />
-                                            <SelectInput
-                                                value={selectedTime}
-                                                onChange={(e) => setSelectedTime(e.target.value)}
-                                                firstOption={t("form.selectTime")}
-                                                options={freeSlots[selectedDate]}
-                                                isDisabled={selectedDate.length === 0}
-                                            />
-                                        </>
-                                    )}
-                                </div>
-
-                                {error && <p className="text-red-500 text-md font-medium text-center">{error}</p>}
-                            </div>
-
-                            {meetingScheduled ? (
-                                <div className="text-center w-full">
-                                    <h2 className="text-xl font-bold text-shifter mb-2">{t("confirmation.title")}</h2>
-                                    <p className="text-md font-medium text-black/80 max-w-xl mx-auto" dangerouslySetInnerHTML={{__html: t("confirmation.description")}}/>
-                                </div>
-                            ) : (
-                                <div className="flex items-center gap-6">
-                                    <button
-                                        className="hover:shadow-shifter/40 transition-all duration-200 ease-in-out disabled:cursor-not-allowed disabled:opacity-60 shadow-md shadow-shifter/20 bg-shifter text-white py-2 px-6 rounded-md cursor-pointer"
-                                        disabled={loadingSubmitForm}
-                                        type="submit"
-                                    >
-                                        {loadingSubmitForm ? t("form.booking") : t("form.book")}
-                                    </button>
-                                    {loadingSubmitForm && <div className="loader"/>}
-                                </div>
-                            )}
-                        </form>
-                        <p className="text-xs text-black/40">{t("form.optionalHint")}</p>
-                    </div>
-                </div>
-            </section>
-        </main>
-    )
-}
-
-function TextInput({label, name, placeholder, onChange}: {label:string,name:string,placeholder:string,onChange:(e:React.ChangeEvent<HTMLTextAreaElement>)=>void}) {
-    return (
-        <label className="w-full flex flex-col items-start gap-2 text-black-text">
-            <span className="text-black/40 font-semibold text-md peer-focused:text-shifter"><sup>*</sup> {label}</span>
-            <textarea rows={2} name={name} onChange={onChange} placeholder={placeholder} className="peer w-full bg-dark-blue/5 border-1 border-black/10 py-1 px-2 rounded-sm resize-none min-h-fit custom-scrollbar focus:outline-none focus:border-shifter/40 focus:border-2"/>
-        </label>
-    )
-}
-
-function SelectInput({value, onChange, firstOption, options, isDisabled}: {value:string,onChange:(e:React.ChangeEvent<HTMLSelectElement>)=>void,firstOption:string,options:string[],isDisabled?:boolean}) {
-    return (
-        <select required className={`disabled:opacity-20 disabled:cursor-not-allowed bg-dark-blue/5 border-1 border-black/10 py-1 px-4 rounded-sm ${value ? "text-black-text" : "text-black/40"} resize-none overflow-hidden min-h-fit cursor-pointer`} disabled={isDisabled} value={value} onChange={onChange}>
-            <option value="" className="text-black/40">{firstOption}</option>
-            {options?.map(option => <option key={option} value={option} className="text-black-text">{option}</option>)}
-        </select>
-    )
-}
-
-function Step({title, description, isLast}: {title:string,description:string,isLast?:boolean}) {
-    return (
-        <li className={`${isLast ? 'border-transparent' : ''} relative pl-6 border-l-4 border-white/10`}>
-            <div style={{transform: 'translateX(calc(-0.5rem - 2px))'}} className="absolute left-0 top-0 h-[1rem] aspect-square bg-white rounded-full"/>
-            <div className="pb-8 text-left">
-                <h3 className="text-md font-semibold text-white">{title}</h3>
-                <p className="text-sm text-white/60 font-light">{description}</p>
-            </div>
-        </li>
-    )
-}
-
-export default FreeConsultation;
Index: ontend/src/pages/Home.tsx
===================================================================
--- frontend/src/pages/Home.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,22 +1,0 @@
-import HeroHome from "../components/HeroHome.tsx";
-import CollaborationSteps from "../components/CollaborationSteps.tsx";
-import ShifterValues from "../components/ShifterValues.tsx";
-import CoursesCarouselHome from "../components/CoursesCarouselHome.tsx";
-import OurServices from "../components/OurServices.tsx";
-
-function Home() {
-
-    return (
-        <main className="bg-beige">
-            <div className="px-4 py-vertical-sm">
-                <HeroHome/>
-            </div>
-            <OurServices />
-            <CollaborationSteps/>
-            <CoursesCarouselHome/>
-            <ShifterValues/>
-        </main>
-    )
-}
-
-export default Home
Index: ontend/src/pages/Learn.tsx
===================================================================
--- frontend/src/pages/Learn.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,170 +1,0 @@
-import {useEnrolledCourses} from "../hooks/useEnrolledCourses.tsx";
-import {useState} from "react";
-import {useAuthContext} from "../context/AuthContext.tsx";
-import CourseCardLearnDashboard from "../components/CourseCardLearnDashboard.tsx";
-import CourseCardEnrolledSkeleton from "../components/skeletons/CourseCardEnrolledSkeleton.tsx";
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-expect-error
-import ShifterArrow from "../../public/Shifter-Arrow-White.png";
-
-function Learn() {
-    const [selectedTab, setSelectedTab] = useState("all");
-    const {user} = useAuthContext();
-    const {
-        allCourses,
-        enrolledCourses,
-        setEnrolledCourses,
-        loading
-    } = useEnrolledCourses();
-
-    function renderContent() {
-        const noCoursesMessage = {
-            all: "You haven't enrolled in any courses yet!",
-            active: "No active courses — time to start learning!",
-            completed: "Nothing completed yet — keep going!",
-            favorites: "You have no favorites — find courses you love!"
-        };
-
-        switch (selectedTab) {
-            case "all":
-                return (
-                    <>
-                        {
-                            enrolledCourses.length > 0 ?
-                                enrolledCourses.map((course, index) => (
-                                    <CourseCardLearnDashboard
-                                        course={course}
-                                        key={index}
-                                        markCourseAsRated={(rating) => setEnrolledCourses([
-                                            ...enrolledCourses.filter(c => c.id !== course.id),
-                                            {...course, rating: rating}
-                                        ])}
-                                    />
-                                )) : (
-                                    <h2 className="text-2xl font-semibold text-black/60 text-left whitespace-nowrap">{noCoursesMessage.all}</h2>
-                                )
-                        }
-                    </>
-                );
-            case "active":
-                return (
-                    <>
-                        {
-                            enrolledCourses.length > 0 ?
-                                enrolledCourses.map((course, index) => {
-                                    if (course.isFinished) return null;
-                                    return (
-                                        <CourseCardLearnDashboard
-                                            course={course}
-                                            key={index}
-                                            markCourseAsRated={(rating) => setEnrolledCourses([
-                                                ...enrolledCourses.filter(c => c.id !== course.id),
-                                                {...course, rating: rating}
-                                            ])}
-                                        />
-                                    )
-                                }) : (
-                                    <h2 className="text-2xl font-semibold text-black/60 text-left whitespace-nowrap">{noCoursesMessage.active}</h2>
-                                )
-                        }
-                    </>
-                );
-            case "completed":
-                return (
-                    <>
-                        {
-                            enrolledCourses.filter(course => course.isFinished).length > 0 ?
-                                enrolledCourses.filter(course => course.isFinished).map((course, index) => (
-                                        <CourseCardLearnDashboard
-                                            course={course}
-                                            key={index}
-                                            markCourseAsRated={(rating) => setEnrolledCourses([
-                                                ...enrolledCourses.filter(c => c.id !== course.id),
-                                                {...course, rating: rating}
-                                            ])}
-                                        />
-                                    )
-                                ) : (
-                                    <h2 className="text-2xl font-semibold text-black/60 text-left whitespace-nowrap">{noCoursesMessage.completed}</h2>
-                                )
-                        }
-                    </>
-                );
-            case "favorites":
-                return (
-                    <>
-                        {
-                            allCourses.filter(course => user?.favoriteCourses.includes(course.id)).length > 0 ?
-                                allCourses?.filter(course => user?.favoriteCourses.includes(course.id)).map((course, index) => (
-                                    <CourseCardLearnDashboard course={course} key={index}
-                                                              markCourseAsRated={(rating) => {
-                                                                  console.log(rating)
-                                                              }}/>
-                                )) : (
-                                    <h2 className="text-2xl font-semibold text-black/60 text-left whitespace-nowrap">{noCoursesMessage.favorites}</h2>
-                                )
-                        }
-                    </>
-                );
-        }
-    }
-
-
-    return (
-        <main className="flex flex-col flex-1 gap-0 ">
-            <div className="bg-black">
-                <section className="relative border-b-2 border-white/40 overflow-clip
-            bg-shifter/90 shadow-md text-white px-horizontal-md w-full flex flex-col gap-between-sm text-left pt-top-nav-lg">
-
-                    <img
-                        src={ShifterArrow}
-                        alt="Shifter Arrow"
-                        className="absolute right-0 -bottom-24 rotate-45 opacity-20
-                    pointer-events-none w-60 h-auto"
-                    />
-
-                    <h1 className="text-4xl font-semibold">My Learning</h1>
-                    <ul>
-                        <ListTab name={"All"} isSelected={selectedTab === "all"}
-                                 setSelectedTab={() => setSelectedTab("all")}/>
-                        <ListTab name={"Active"} isSelected={selectedTab === "active"}
-                                 setSelectedTab={() => setSelectedTab("active")}/>
-                        <ListTab name={"Completed"} isSelected={selectedTab === "completed"}
-                                 setSelectedTab={() => setSelectedTab("completed")}/>
-                        <ListTab name={"Favorites"} isSelected={selectedTab === "favorites"}
-                                 setSelectedTab={() => setSelectedTab("favorites")}/>
-                    </ul>
-                </section>
-            </div>
-            <div className="flex-1 bg-beige">
-                <section className="grid grid-cols-4 gap-x-4 gap-y-8 px-horizontal-md py-vertical-md items-stretch ">
-                    {
-                        loading ?
-                            new Array(8).fill(0).map((_, index) => (
-                                <CourseCardEnrolledSkeleton key={index}/>
-                            )) : renderContent()
-                    }
-                </section>
-            </div>
-        </main>
-    )
-}
-
-function ListTab({name, isSelected, setSelectedTab}: {
-    name: string;
-    isSelected: boolean;
-    setSelectedTab: () => void;
-}) {
-    return (
-        <li className="inline-block text-lg font-medium ">
-            <button
-                className={`hover:text-white px-4 py-2 cursor-pointer ${isSelected ? "border-b-2 border-white" : "text-white/40"}`}
-                onClick={setSelectedTab}
-            >
-                {name}
-            </button>
-        </li>
-    )
-}
-
-export default Learn;
Index: ontend/src/pages/Login.tsx
===================================================================
--- frontend/src/pages/Login.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,173 +1,0 @@
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-expect-error
-import ShifterArrow from "../../public/Shifter-Arrow-White.png";
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-expect-error
-import ShifterLogo from "../../public/Shifter-S2W-Transparent.png";
-import React from "react";
-import { Eye, EyeOff } from "lucide-react";
-import { Link, useNavigate } from "react-router-dom";
-import { useAuthContext } from "../context/AuthContext.tsx";
-import GoogleLoginButton from "../components/GoogleLoginButton.tsx";
-import { useTranslation } from "react-i18next";
-
-interface InputProps {
-    placeholder: string;
-    label: string;
-    name: string;
-    type: string;
-    id: string;
-    value: string;
-    onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;
-}
-
-function Login() {
-    const { t } = useTranslation("login");
-    const { login } = useAuthContext();
-    const [email, setEmail] = React.useState<string>("");
-    const [password, setPassword] = React.useState<string>("");
-    const [error, setError] = React.useState<string>("");
-    const [isLoading, setIsLoading] = React.useState<boolean>(false);
-    const navigate = useNavigate();
-
-    const handleLogin = async (e: React.FormEvent) => {
-        e.preventDefault();
-
-        if (!email || !password) {
-            setError(t("errors.fillAllFields"));
-            return;
-        }
-
-        setIsLoading(true);
-        setError("");
-
-        login(email, password)
-            .then(() => {
-                navigate("/");
-            })
-            .catch((err) => {
-                if (err.response?.status === 401) {
-                    setError(err.response.data.message);
-                } else {
-                    setError(t("errors.somethingWentWrong"));
-                }
-            })
-            .finally(() => {
-                setIsLoading(false);
-            });
-    };
-
-    return (
-        <main className="flex font-montserrat h-screen bg-beige">
-            {/* LEFT HEADER AND BACKGROUND */}
-            <section className="relative bg-black w-[55%] overflow-hidden">
-                <div className="absolute w-full h-full bg-shifter/80 z-0 text-white px-20 flex flex-col gap-4 justify-center text-start">
-                    <img src={ShifterArrow} alt="Shifter Arrow" className="absolute -top-20 right-20 -rotate-130 w-auto h-100 opacity-70 z-2" />
-                    <img src={ShifterArrow} alt="Shifter Arrow" className="absolute -bottom-20 left-20 rotate-50 w-auto h-100 opacity-70 z-2" />
-
-                    <h1 className="text-7xl font-semibold z-2">{t("welcomeBack")}</h1>
-                    <p className="text-2xl font-light z-2">{t("subtitle")}</p>
-                </div>
-            </section>
-
-            {/* RIGHT FORM CONTAINER */}
-            <section className="relative flex flex-col justify-center items-center flex-1 px-horizontal-md">
-                <div className="absolute top-0 px-4 py-4 flex w-full justify-between items-center">
-                    <Link to={"/"}>
-                        <img src={ShifterLogo} alt="Shifter Logo" className="w-40 h-auto object-contain" />
-                    </Link>
-                    <Link to={"/"} className="hover:bg-shifter/20 hover:text-shifter underline decoration-current font-semibold text-black/80 rounded-sm px-4 py-2">
-                        {t("backToMain")}
-                    </Link>
-                </div>
-
-                <form onSubmit={handleLogin} className="flex flex-col justify-center items-center gap-4 w-full">
-                    <Input
-                        placeholder={t("emailPlaceholder")}
-                        label={t("emailLabel")}
-                        name="email"
-                        type="email"
-                        id="login-email"
-                        value={email}
-                        onChange={(e) => setEmail(e.target.value)}
-                    />
-                    <Input
-                        placeholder={t("passwordPlaceholder")}
-                        label={t("passwordLabel")}
-                        name="password"
-                        type="password"
-                        id="login-password"
-                        value={password}
-                        onChange={(e) => setPassword(e.target.value)}
-                    />
-
-                    {error && <p className="text-red-500 text-sm">{error}</p>}
-
-                    <div className="flex gap-2 justify-center text-md w-full text-lg mt-4">
-                        <button
-                            type="submit"
-                            disabled={isLoading}
-                            className={`hover:shadow-md hover:shadow-shifter/60 transition-all duration-200 ease-in-out cursor-pointer rounded-md border-3 border-white/50 text-white w-1/3 py-1 bg-shifter font-medium whitespace-nowrap ${isLoading ? "opacity-50 cursor-not-allowed" : ""}`}
-                        >
-                            {isLoading ? t("loggingIn") : t("logIn")}
-                        </button>
-                        <Link
-                            to="/register"
-                            className="hover:shadow-md hover:shadow-shifter/20 transition-all duration-200 ease-in-out cursor-pointer rounded-md text-shifter/80 w-1/3 py-1 bg-white border-3 border-shifter/20 font-medium whitespace-nowrap opacity-80"
-                        >
-                            {t("register")}
-                        </Link>
-
-                        {isLoading && <div className="h-full loader"></div>}
-                    </div>
-                </form>
-
-                <div className="my-4 flex items-center gap-2 w-[90%] text-black opacity-20">
-                    <hr className="border-t-2 border-black w-full" />
-                    <p>{t("or")}</p>
-                    <hr className="border-t-2 border-black w-full" />
-                </div>
-
-                <GoogleLoginButton text={t("googleLogin")} />
-            </section>
-        </main>
-    );
-}
-
-function Input(inputProps: InputProps) {
-    const [showPassword, setShowPassword] = React.useState(false);
-
-    return (
-        <div className="relative flex flex-col gap-1 px-6 py-1.5 border-2 border-shifter group focus-within:border-l-20 transition-all ease-in-out duration-300 items-start rounded-sm w-full">
-            <label htmlFor={inputProps.id} className="text-shifter text-light">
-                {inputProps.label}
-            </label>
-            <div className="flex gap-2 w-full">
-                <div className="w-full">
-                    <input
-                        id={inputProps.id}
-                        type={inputProps.type === "password" && !showPassword ? "password" : "text"}
-                        name={inputProps.name}
-                        placeholder={inputProps.placeholder}
-                        className="w-full focus:outline-none text-lg"
-                        value={inputProps.value}
-                        onChange={inputProps.onChange}
-                    />
-                    <hr className="border-t-2 border-black/5 rounded-full w-full" />
-                </div>
-                {inputProps.type === "password" && (
-                    <button
-                        type="button"
-                        onClick={() => setShowPassword((prev) => !prev)}
-                        className="text-black cursor-pointer hover:bg-black/5 rounded-full p-1"
-                        aria-label={showPassword ? "Hide password" : "Show password"}
-                    >
-                        {!showPassword ? <EyeOff size={20} opacity={0.6} /> : <Eye size={20} opacity={0.6} />}
-                    </button>
-                )}
-            </div>
-        </div>
-    );
-}
-
-export default Login;
Index: ontend/src/pages/Mentoring.tsx
===================================================================
--- frontend/src/pages/Mentoring.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,147 +1,0 @@
-import { Mail, MapPin } from "lucide-react";
-import React from "react";
-import { useAuthContext } from "../context/AuthContext.tsx";
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-expect-error
-import Arrow from "../../public/Shifter-Arrow-White.png";
-import { sendEmailApi } from "../api/contactApi.ts";
-import { useTranslation } from "react-i18next";
-
-function Mentoring() {
-    const { t } = useTranslation("mentoring");
-    const { user, accessToken } = useAuthContext();
-    const [subject, setSubject] = React.useState("");
-    const [message, setMessage] = React.useState("");
-    const [loading, setLoading] = React.useState(false);
-    const [error, setError] = React.useState("");
-    const [isMessageSent, setIsMessageSent] = React.useState(false);
-
-    const handleSubmit = (e: React.FormEvent) => {
-        e.preventDefault();
-
-        setLoading(true);
-        sendEmailApi(accessToken || "", "Mentoring Inquiry - " + subject, message)
-            .then(() => {
-                setIsMessageSent(true);
-                setError("");
-            })
-            .catch((err) => {
-                setError(t("emailError"));
-                console.error("Error sending email for mentoring inquiry:", err);
-            })
-            .finally(() => setLoading(false));
-    }
-
-    return (
-        <main className="bg-gradient-to-b from-shifter via-shifter/20 via-40% to-beige">
-            {/*Hero*/}
-            <section className="flex flex-col items-center gap-4 w-full pb-60 pt-top-nav-lg px-horizontal-lg text-white-text">
-                <h1 className="text-5xl font-bold">{t("heroTitle")}</h1>
-                <p className="text-xl font-light" dangerouslySetInnerHTML={{ __html: t("heroDescription") }} />
-            </section>
-
-            {/*Contact Form*/}
-            <section className="flex items-center justify-center w-full px-horizontal-lg">
-                <div className="relative -top-40 grid grid-cols-3 gap-x-20 rounded-lg bg-white p-4 shadow-md shadow-black/10">
-                    {/*Contact Info*/}
-                    <div className="border-1 border-white/40 relative overflow-clip col-span-1 flex flex-col gap-8 py-8 px-8 rounded-lg bg-shifter text-white">
-                        <div className="flex flex-col gap-2 items-start text-left">
-                            <h2 className="text-2xl font-semibold whitespace-nowrap">{t("contactInfoTitle")}</h2>
-                            <p className="text-white/80 font-light text-sm">{t("contactInfoDescription")}</p>
-                        </div>
-                        <div className="flex gap-4 items-center">
-                            <Mail size={24} color="var(--color-white)" />
-                            {t("contactEmail")}
-                        </div>
-                        <div className="flex gap-4 items-center">
-                            <MapPin size={24} color="var(--color-white)" />
-                            {t("contactLocation")}
-                        </div>
-
-                        <div className="absolute -bottom-26 right-12 flex flex-col opacity-40 rotate-40">
-                            <img src={Arrow} className="w-28 h-auto" alt="Shifter Arrow" />
-                            <img src={Arrow} className="w-28 h-auto rotate-180" alt="Shifter Arrow" />
-                        </div>
-                    </div>
-
-                    {/*Form*/}
-                    <div className="flex flex-col gap-4 col-span-2">
-                        <div className="grid grid-cols-2 gap-4 items-center">
-                            <p className="text-black/40 text-xs col-span-2">{t("autoFilledNote")}</p>
-                            <p className="font-light text-black-text/60 text-md whitespace-nowrap">
-                                {t("name")}: <span className="text-black-text font-normal">{user?.name}</span>
-                            </p>
-                            <p className="font-light text-black-text/60 text-md whitespace-nowrap">
-                                {t("email")}: <span className="text-black-text font-normal">{user?.email}</span>
-                            </p>
-                        </div>
-
-                        <hr className="border-t-1 border-black/20 rounded-full" />
-
-                        <form onSubmit={handleSubmit} className="flex flex-col gap-4 items-start">
-                            <div className="flex flex-col gap-4 items-center w-full">
-                                <TextInput
-                                    label={t("subjectLabel")}
-                                    name="subject"
-                                    placeholder={t("subjectPlaceholder")}
-                                    rows={1}
-                                    onChange={(e) => setSubject(e.target.value)}
-                                />
-                                <TextInput
-                                    label={t("messageLabel")}
-                                    name="message"
-                                    placeholder={t("messagePlaceholder")}
-                                    rows={8}
-                                    onChange={(e) => setMessage(e.target.value)}
-                                />
-                                {error && <p className="text-red-500 text-md font-medium text-center">{error}</p>}
-                            </div>
-
-                            {isMessageSent ? (
-                                <div className="text-center w-full">
-                                    <h2 className="text-xl font-bold text-shifter mb-2">{t("messageSentTitle")}</h2>
-                                    <p className="text-md font-medium text-black/80 max-w-xl mx-auto" dangerouslySetInnerHTML={{ __html: t("messageSentDescription") }} />
-                                </div>
-                            ) : (
-                                <div className="flex items-center gap-6">
-                                    <button
-                                        className="hover:shadow-shifter/60 transition-all duration-200 ease-in-out disabled:cursor-not-allowed disabled:opacity-60 shadow-md shadow-shifter/40 bg-shifter text-white py-2 px-6 rounded-md cursor-pointer"
-                                        disabled={loading}
-                                        type="submit"
-                                    >
-                                        {loading ? t("sending") : t("sendMessage")}
-                                    </button>
-                                    {loading && <div className="loader" />}
-                                </div>
-                            )}
-                        </form>
-                    </div>
-                </div>
-            </section>
-        </main>
-    );
-}
-
-function TextInput({ label, name, placeholder, rows, onChange }: {
-    label: string;
-    name: string;
-    placeholder: string;
-    rows: number;
-    onChange: (e: React.ChangeEvent<HTMLTextAreaElement>) => void;
-}) {
-    return (
-        <label className="w-full flex flex-col items-start gap-2">
-            <span className="text-black/40 font-semibold text-md peer-focused:text-shifter">{label}</span>
-            <textarea
-                required
-                onChange={onChange}
-                rows={rows}
-                name={name}
-                className="peer w-full bg-dark-blue/5 border-1 border-black/10 py-1 px-2 rounded-sm resize-none min-h-fit custom-scrollbar focus:outline-none focus:border-shifter/40 focus:border-2"
-                placeholder={placeholder}
-            />
-        </label>
-    );
-}
-
-export default Mentoring;
Index: ontend/src/pages/Personalize.tsx
===================================================================
--- frontend/src/pages/Personalize.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,137 +1,0 @@
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-expect-error
-import ShifterArrow from "../../public/Shifter-Arrow-White.png";
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-expect-error
-import ShifterLogo from "../../public/Shifter-S2W-Transparent.png";
-import {Link, useNavigate} from "react-router-dom";
-import { usePersonalizeHook } from "../hooks/usePersonalizeHook.tsx";
-import { Box, Step, StepLabel, Stepper } from "@mui/material";
-import { CustomStepperConnector, CustomStepperStepIcon } from "../components/registerSteps/CustomStepper.tsx";
-import { AnimatePresence, motion } from "framer-motion";
-import { useTranslation } from "react-i18next";
-
-function Personalize() {
-    const { t } = useTranslation("personalize");
-    const {
-        verificationChecked,
-        isVerified,
-        isLoading,
-        activeStep,
-        showError,
-        error,
-        direction,
-        variants,
-        stepsContent,
-        handleNext,
-        handleBack,
-        handlePersonalize
-    } = usePersonalizeHook();
-    const navigate = useNavigate();
-
-    if (!verificationChecked || !isVerified) {
-        navigate("/")
-        return undefined;
-    }
-
-    return (
-        <main className="flex font-montserrat h-screen bg-beige">
-
-            {/* LEFT HEADER AND BACKGROUND */}
-            <section className="relative bg-black w-[55%] overflow-hidden">
-                <div className="absolute w-full h-full bg-shifter/80 z-0 text-white px-16 flex flex-col gap-4 justify-center text-start">
-                    <img src={ShifterArrow} alt="Shifter Arrow" className="absolute -top-20 right-20 -rotate-130 w-auto h-100 opacity-70 z-2"/>
-                    <img src={ShifterArrow} alt="Shifter Arrow" className="absolute -bottom-20 left-20 rotate-50 w-auto h-100 opacity-70 z-2"/>
-                    <h1 className="text-7xl font-semibold z-2 whitespace-nowrap">{t("title")}</h1>
-                    <p className="text-2xl font-light z-2">{t("subtitle")}</p>
-                </div>
-            </section>
-
-            {/* RIGHT FORM CONTAINER */}
-            <section className="relative flex flex-col justify-center items-center flex-1 px-horizontal-md gap-6">
-                <div className="absolute top-0 px-4 py-4 flex w-full justify-between items-center">
-                    <Link to={"/"} >
-                        <img src={ShifterLogo} alt="Shifter Logo" className="w-40 h-auto object-contain"/>
-                    </Link>
-                    <Link to={"/"} className="hover:bg-shifter/20 hover:text-shifter underline decoration-current font-semibold text-black/80 rounded-sm px-4 py-2">
-                        {t("backToMain")}
-                    </Link>
-                </div>
-
-                {isVerified ? (
-                    <div className="flex flex-col items-center justify-center">
-                        <div className="flex flex-col gap-4 bg-white rounded-2xl shadow-lg p-8 w-fit text-center">
-                            <h2 className="text-2xl font-bold text-red">{t("verificationFailedTitle")}</h2>
-                            <p className="font-medium text-black-text/80 max-w-xl mx-auto">
-                                {t("verificationFailedMessage1")}
-                                <br/>
-                                {t("verificationFailedMessage2")}
-                            </p>
-                        </div>
-                    </div>
-                ) : (
-                    <Box className="w-full flex flex-col">
-                        <Stepper activeStep={activeStep} alternativeLabel connector={<CustomStepperConnector/>}>
-                            {stepsContent.map((_, index) => (
-                                <Step key={index}>
-                                    <StepLabel StepIconComponent={CustomStepperStepIcon} className="text-shifter font-semibold"/>
-                                </Step>
-                            ))}
-                        </Stepper>
-
-                        <Box className="flex flex-col overflow-hidden gap-2">
-                            <AnimatePresence mode="wait" initial={false} custom={direction}>
-                                <motion.div
-                                    key={activeStep}
-                                    custom={direction}
-                                    variants={variants}
-                                    initial="enter"
-                                    animate="center"
-                                    exit="exit"
-                                    transition={{ x: { type: "spring", stiffness: 500, damping: 40 }, opacity: { duration: 0.2 } }}
-                                    className="h-80 flex flex-col justify-center"
-                                >
-                                    {stepsContent[activeStep]}
-                                </motion.div>
-                            </AnimatePresence>
-
-                            {showError && <p className="text-red-500 text-sm">{error}</p>}
-
-                            <Box className="flex flex-col justify-center items-center gap-2">
-                                <div className="flex justify-center gap-4 w-full">
-                                    <button
-                                        disabled={activeStep === 0}
-                                        onClick={handleBack}
-                                        className="disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:shadow-none hover:shadow-sm hover:shadow-black/20 transition-all duration-200 ease-in-out border-3 border-white/50 w-1/3 py-1 bg-black/10 text-black/60 cursor-pointer rounded-sm"
-                                    >
-                                        {t("back")}
-                                    </button>
-
-                                    {activeStep === stepsContent.length - 1 ? (
-                                        <button
-                                            onClick={handlePersonalize}
-                                            className={`hover:shadow-md hover:shadow-shifter/60 transition-all duration-200 ease-in-out px-8 border-3 border-white/50 bg-shifter text-white cursor-pointer rounded-md ${isLoading ? "opacity-50 cursor-not-allowed" : ""}`}
-                                        >
-                                            {isLoading ? t("settingUp") : t("startUsing")}
-                                        </button>
-                                    ) : (
-                                        <button
-                                            onClick={handleNext}
-                                            className="disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:shadow-none hover:shadow-md hover:shadow-shifter/60 transition-all duration-200 ease-in-out w-1/3 border-3 border-white/50 bg-shifter text-white cursor-pointer rounded-md"
-                                        >
-                                            {t("next")}
-                                        </button>
-                                    )}
-
-                                    {isLoading && <div className="h-full loader"></div>}
-                                </div>
-                            </Box>
-                        </Box>
-                    </Box>
-                )}
-            </section>
-        </main>
-    );
-}
-
-export default Personalize;
Index: ontend/src/pages/Profile.tsx
===================================================================
--- frontend/src/pages/Profile.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,61 +1,0 @@
-import ProfileInfo from "../components/ProfileInfo.tsx";
-import ProfileSkillsInterests from "../components/ProfileSkills&Interests.tsx";
-import {useAuthContext} from "../context/AuthContext.tsx";
-import ProfileMyProfile from "../components/ProfileMyProfile.tsx";
-import ProfileSkeleton from "../components/skeletons/ProfileSkeleton.tsx";
-import React from "react";
-import ProfileModalAddSkillsInterests from "../components/ProfileModalAddSkills&Interests.tsx";
-
-function Profile() {
-    const {user, loading, logout} = useAuthContext();
-    const [showModalDesiredSkills, setShowModalDesiredSkills] = React.useState(false);
-    const [showModalInterests, setShowModalInterests] = React.useState(false);
-
-    if (loading) {
-        return <ProfileSkeleton/>;
-    }
-
-    return (
-        <main className="grid grid-cols-4 gap-x-12 py-vertical-lg pt-top-nav-lg px-horizontal-md  bg-beige">
-            <div className="col-span-1 flex flex-col gap-6">
-                <ProfileInfo/>
-                {user?.skills && user.skills.length > 0 && (
-                    <ProfileSkillsInterests title="Learned Skills" pills={user?.skills || []} />)}
-                <ProfileSkillsInterests title="Desired Skills" pills={user?.desiredSkills || []} openModal={() => setShowModalDesiredSkills(true)}/>
-                <ProfileSkillsInterests title="Interests" pills={user?.interests || []} openModal={() => setShowModalInterests(true)}/>
-                <button
-                    onClick={logout}
-                    className="hover:border-white/40 hover:bg-red hover:text-white hover:shadow-lg hover:shadow-red/50 transition-all duration-200 ease-in-out cursor-pointer
-                    py-2 rounded-sm border-2 border-red/40 text-red/80 font-semibold"
-                >
-                    Log Out
-                </button>
-            </div>
-
-            <div className="col-span-3">
-                <ProfileMyProfile/>
-            </div>
-
-            {
-                showModalDesiredSkills && (
-                    <ProfileModalAddSkillsInterests
-                        type={"desiredSkills"}
-                        label={"Identify Skills You’d Like to Improve"}
-                        closeModal={() => setShowModalDesiredSkills(false)}
-                    />
-                )
-            }
-            {
-                showModalInterests && (
-                    <ProfileModalAddSkillsInterests
-                        type={"interests"}
-                        label={"Choose Topics You’re Interested In"}
-                        closeModal={() => setShowModalInterests(false)}
-                    />
-                )
-            }
-        </main>
-    )
-}
-
-export default Profile;
Index: ontend/src/pages/Register.tsx
===================================================================
--- frontend/src/pages/Register.tsx	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,179 +1,0 @@
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-expect-error
-import ShifterArrow from "../../public/Shifter-Arrow-White.png";
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-expect-error
-import ShifterLogo from "../../public/Shifter-S2W-Transparent.png";
-import { Link } from "react-router-dom";
-import React from "react";
-import { Eye, EyeOff } from "lucide-react";
-import { useRegisterHook } from "../hooks/useRegisterHook.tsx";
-import GoogleLoginButton from "../components/GoogleLoginButton.tsx";
-import { useTranslation } from "react-i18next";
-
-function Register() {
-    const { t } = useTranslation("register");
-    const {
-        email,
-        setEmail,
-        password,
-        setPassword,
-        passwordConfirmation,
-        setPasswordConfirmation,
-        showPassword,
-        setShowPassword,
-        showError,
-        error,
-        isSuccess,
-        isLoading,
-        handleRegister
-    } = useRegisterHook();
-
-    return (
-        <main className="flex font-montserrat h-screen bg-beige">
-            {/* LEFT HEADER AND BACKGROUND */}
-            <section className="relative bg-black w-[55%] overflow-hidden">
-                <div className="absolute w-full h-full bg-shifter/80 z-0 text-white px-16 flex flex-col gap-4 justify-center text-start">
-                    <img src={ShifterArrow} alt="Shifter Arrow" className="absolute -top-20 right-20 -rotate-130 w-auto h-100 opacity-70 z-2"/>
-                    <img src={ShifterArrow} alt="Shifter Arrow" className="absolute -bottom-20 left-20 rotate-50 w-auto h-100 opacity-70 z-2"/>
-                    <h1 className="text-7xl font-semibold z-2 whitespace-nowrap">{t("title")}</h1>
-                    <p className="text-2xl font-light z-2">{t("subtitle")}</p>
-                </div>
-            </section>
-
-            {/* RIGHT FORM CONTAINER */}
-            <section className="relative flex flex-col justify-center items-center flex-1 px-horizontal-md">
-                <div className="absolute top-0 px-4 py-4 flex w-full justify-between items-center">
-                    <Link to={"/"} >
-                        <img src={ShifterLogo} alt="Shifter Logo" className="w-40 h-auto object-contain"/>
-                    </Link>
-                    <Link to={"/"} className="hover:bg-shifter/20 hover:text-shifter underline decoration-current font-semibold text-black/80 rounded-sm px-4 py-2">
-                        {t("backToMain")}
-                    </Link>
-                </div>
-
-                {isSuccess ? (
-                    <div className="flex flex-col items-center justify-center">
-                        <div className="flex flex-col gap-4 bg-white rounded-2xl shadow-lg p-8 w-fit text-center">
-                            <h2 className="text-2xl font-bold text-shifter">{t("verifyEmail")}</h2>
-                            <p className="font-medium text-black-text/80 max-w-xl mx-auto">
-                                {t("verificationSent1")} <span className='font-semibold text-shifter'>{email}</span> {t("verificationSent2")}
-                            </p>
-                        </div>
-                    </div>
-                ) : (
-                    <>
-                        <form onSubmit={handleRegister} className="flex flex-col gap-4 w-full items-center">
-                            <Input
-                                placeholder={t("emailPlaceholder")}
-                                label={t("emailLabel")}
-                                name="email"
-                                type="email"
-                                id="email"
-                                value={email}
-                                onChange={e => setEmail(e.target.value)}
-                                showPassword={showPassword}
-                                setShowPassword={setShowPassword}
-                            />
-                            <Input
-                                placeholder={t("passwordPlaceholder")}
-                                label={t("passwordLabel")}
-                                name="password"
-                                type="password"
-                                id="password"
-                                value={password}
-                                onChange={e => setPassword(e.target.value)}
-                                showPassword={showPassword}
-                                setShowPassword={setShowPassword}
-                            />
-                            <Input
-                                placeholder={t("passwordConfirmationPlaceholder")}
-                                label={t("passwordConfirmationLabel")}
-                                name="passwordConfirmation"
-                                type="password"
-                                id="password-confirmation"
-                                value={passwordConfirmation}
-                                onChange={e => setPasswordConfirmation(e.target.value)}
-                                showPassword={showPassword}
-                                setShowPassword={setShowPassword}
-                            />
-
-                            {showError && <p className="text-red-500 text-sm">{error}</p>}
-
-                            <div className="flex gap-2 justify-center text-md w-full text-lg mt-4">
-                                <button
-                                    type="submit"
-                                    disabled={isLoading}
-                                    className={`hover:shadow-md hover:shadow-shifter/60 transition-all duration-200 ease-in-out cursor-pointer rounded-md border-3 border-white/50 text-white px-8 py-1 bg-shifter font-medium whitespace-nowrap ${isLoading ? "opacity-50 cursor-not-allowed" : ""}`}
-                                >
-                                    {isLoading ? t("creatingAccount") : t("createAccount")}
-                                </button>
-                                <Link
-                                    to="/login"
-                                    className="hover:shadow-md hover:shadow-shifter/20 transition-all duration-200 ease-in-out cursor-pointer rounded-md text-shifter/80 w-1/3 py-1 bg-white border-3 border-shifter/20 font-medium whitespace-nowrap opacity-80"
-                                >
-                                    {t("logIn")}
-                                </Link>
-                                {isLoading && <div className="h-full loader"></div>}
-                            </div>
-                        </form>
-
-                        <div className="my-4 flex items-center gap-2 w-9/10 text-black opacity-20">
-                            <hr className="border-t-2 border-black w-full"/>
-                            <p>{t("or")}</p>
-                            <hr className="border-t-2 border-black w-full"/>
-                        </div>
-
-                        <GoogleLoginButton text={t("googleLogin")} />
-                    </>
-                )}
-            </section>
-        </main>
-    )
-}
-
-interface InputProps {
-    placeholder: string;
-    label: string;
-    name: string;
-    type: string;
-    id: string;
-    value: string;
-    onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;
-    showPassword: boolean;
-    setShowPassword: React.Dispatch<React.SetStateAction<boolean>>;
-}
-
-function Input(inputProps: InputProps) {
-    return (
-        <div className="relative flex flex-col gap-1 px-6 py-1.5 border-2 border-shifter group focus-within:border-l-20 transition-all ease-in-out duration-300 items-start rounded-sm w-full">
-            <label htmlFor={inputProps.id} className="text-shifter text-light">{inputProps.label}</label>
-            <div className="flex gap-2 w-full">
-                <div className="w-full">
-                    <input
-                        id={inputProps.id}
-                        type={inputProps.showPassword ? "text" : inputProps.type}
-                        name={inputProps.name}
-                        placeholder={inputProps.placeholder}
-                        className="w-full focus:outline-none text-lg"
-                        value={inputProps.value}
-                        onChange={inputProps.onChange}
-                    />
-                    <hr className="border-t-2 border-black/5 rounded-full w-full" />
-                </div>
-                {inputProps.type === "password" && (
-                    <button
-                        type="button"
-                        onClick={() => inputProps.setShowPassword(prev => !prev)}
-                        className="text-black cursor-pointer hover:bg-black/5 rounded-full p-1"
-                        aria-label={inputProps.showPassword ? "Hide password" : "Show password"}
-                    >
-                        {!inputProps.showPassword ? <EyeOff size={20} opacity={0.6} /> : <Eye size={20} opacity={0.6} />}
-                    </button>
-                )}
-            </div>
-        </div>
-    );
-}
-
-export default Register;
Index: ontend/src/slick-custom.css
===================================================================
--- frontend/src/slick-custom.css	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,85 +1,0 @@
-.slick-track {
-    display: flex;
-    align-items: stretch;
-}
-
-.slick-slide {
-    padding: 0 3rem;
-    opacity: 0.6;
-    transform: scale(0.8);
-    transition: all 0.4s ease-in-out;
-
-    > div {
-        display: flex;
-        flex-direction: column;
-        justify-content: stretch;
-        height: 100%;
-        overflow: hidden;
-    }
-
-    button {
-        cursor: initial;
-    }
-
-    button:hover {
-        box-shadow: none !important;
-    }
-}
-
-
-.slick-center {
-    height: auto;
-    display: flex;
-    align-items: stretch;
-    opacity: 1;
-    transform: scale(1);
-    transition: all 0.4s ease-in-out;
-
-    > div {
-        display: flex;
-        flex-direction: column;
-        justify-content: center;
-        height: 100%;
-        border-radius: 12px;
-        overflow: hidden;
-    }
-}
-
-.slick-list {
-    margin: 0 -3rem;
-}
-
-.slick-prev, .slick-next {
-    width: 8rem;
-    height: 2rem;
-    z-index: 1;
-    &:before {
-        content: '';
-        width: 2rem;
-        height: 2rem;
-        border: solid var(--color-shifter);
-        opacity: 0.6;
-        border-width: 0 4px 4px 0;
-        border-radius: 4px;
-        display: inline-block;
-        position: absolute;
-        top: 50%;
-        left: 50%;
-    }
-}
-
-.slick-prev {
-    left: calc(33.33% - 90px);
-
-    &:before {
-        transform: translate(-25%, -50%) rotate(135deg);
-    }
-}
-
-.slick-next {
-    right: calc(33.33% - 90px);
-
-    &:before {
-        transform: translate(-75%, -50%) rotate(-45deg);
-    }
-}
Index: ontend/src/utils/hexToRGB.ts
===================================================================
--- frontend/src/utils/hexToRGB.ts	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,11 +1,0 @@
-export function hexToRgb(hex: string) {
-    // Remove hash if present
-    hex = hex.replace(/^#/, "");
-    // Parse r,g,b
-    const bigint = parseInt(hex, 16);
-    const r = (bigint >> 16) & 255;
-    const g = (bigint >> 8) & 255;
-    const b = bigint & 255;
-    return `${r}, ${g}, ${b}`;
-}
-
Index: ontend/src/utils/mapper.ts
===================================================================
--- frontend/src/utils/mapper.ts	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,60 +1,0 @@
-
-export function priceToQueryMapper(option: string): string {
-    switch (option) {
-        case "Free":
-            return "free";
-        case "< $20":
-            return "low";
-        case "$20 - $50":
-            return "medium";
-        case "$50+":
-            return "high";
-        default:
-            return "";
-    }
-}
-
-export function queryToPriceMapper(option: string): string {
-    switch (option) {
-        case "free":
-            return "Free";
-        case "low":
-            return "< $20";
-        case "medium":
-            return "$20 - $50";
-        case "high":
-            return "$50+";
-        default:
-            return "";
-    }
-}
-
-export function durationToQueryMapper(option: string): string {
-    switch (option) {
-        case "< 3 hours":
-            return "extraShort";
-        case "3-6 hours":
-            return "short";
-        case "6-10 hours":
-            return "medium";
-        case "10+ hours":
-            return "long";
-        default:
-            return "";
-    }
-}
-
-export function queryToDurationMapper(option: string): string {
-    switch (option) {
-        case "extraShort":
-            return "< 3 hours";
-        case "short":
-            return "3-6 hours";
-        case "medium":
-            return "6-10 hours";
-        case "long":
-            return "10+ hours";
-        default:
-            return "";
-    }
-}
Index: ontend/src/utils/showInfoToast.ts
===================================================================
--- frontend/src/utils/showInfoToast.ts	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,14 +1,0 @@
-import { toast } from "react-toastify";
-
-export const showInfoToast = (message: string) => {
-    toast.info(message, {
-        position: "top-right",
-        autoClose: 3000,
-        hideProgressBar: false,
-        closeOnClick: true,
-        pauseOnHover: true,
-        draggable: true,
-        progress: undefined,
-        theme: "light",
-    });
-};
Index: ontend/src/utils/slug.ts
===================================================================
--- frontend/src/utils/slug.ts	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,15 +1,0 @@
-
-export function slugify(text: string): string {
-    return text
-        .toLowerCase()
-        .replace(/ /g, '-')
-        .replace("&", "and")
-        .replace(/[^\w-]+/g, "") // Remove non-word characters (not including hyphens)
-}
-
-export function unslugify(text: string): string {
-    return text
-        .replace(/-/g, ' ')
-        .replace("and", "&")
-        .trim();
-}
Index: ontend/src/utils/toEnumFormat.ts
===================================================================
--- frontend/src/utils/toEnumFormat.ts	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,3 +1,0 @@
-export function toEnumFormat(str: string): string {
-    return str.trim().replace(/\s+/g, '_').toUpperCase();
-}
Index: ontend/src/utils/toUrlFormat.ts
===================================================================
--- frontend/src/utils/toUrlFormat.ts	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,14 +1,0 @@
-export function toUrlFormat(title: string): string {
-    return title
-        .toLowerCase()
-        .trim() // Trim leading and trailing spaces
-        .replace(/\s+/g, "-") // Replace spaces with hyphens
-        .replace(/-+/g, "-"); // Replace multiple hyphens with a single hyphen
-}
-
-export function fromUrlFormat(url: string): string {
-    return url
-        .toLowerCase()
-        .replace(/-/g, " ") // Replace hyphens with spaces
-        .replace(/\b\w/g, c => c.toUpperCase()); // Capitalize the first letter of each word
-}
Index: ontend/src/utils/useSessionStorage.ts
===================================================================
--- frontend/src/utils/useSessionStorage.ts	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,21 +1,0 @@
-export function getFromSessionStorage<T>(key: string): T | null {
-    try {
-        const item = sessionStorage.getItem(key);
-        if (!item) return null;
-
-        return JSON.parse(item) as T;
-    } catch (error) {
-        console.error(`Failed to load or parse sessionStorage key "${key}":`, error);
-        sessionStorage.removeItem(key); // Remove corrupted data
-        return null;
-    }
-}
-
-export function saveToSessionStorage<T>(key: string, value: T): void {
-    try {
-        sessionStorage.setItem(key, JSON.stringify(value));
-    } catch (error) {
-        console.error(`Failed to save "${key}" to sessionStorage:`, error);
-    }
-}
-
Index: ontend/src/utils/validation.ts
===================================================================
--- frontend/src/utils/validation.ts	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,15 +1,0 @@
-export function hasDigit(str: string) {
-    return /\d/.test(str);
-}
-
-export function hasUppercase(str: string) {
-    return /[A-Z]/.test(str);
-}
-
-export function hasSpecialChar(str: string) {
-    return /[!@#$%^&*(),.?":{}|<>]/.test(str);
-}
-
-export function isValidEmail(email: string) {
-    return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
-}
Index: ontend/src/vite-env.d.ts
===================================================================
--- frontend/src/vite-env.d.ts	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,1 +1,0 @@
-/// <reference models="vite/client" />
Index: ontend/tailwind.config.js
===================================================================
--- frontend/tailwind.config.js	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,59 +1,0 @@
-/** @type {import('tailwindcss').Config} */
-export default {
-    content: [
-        "./index.html",
-        "./src/**/*.{js,ts,jsx,tsx}",
-    ],
-    theme: {
-        extend: {
-            spacing: {
-                // Map your spacing variables as custom spacing tokens
-                'horizontal-xl': '12rem',
-                'horizontal-lg': '10rem',
-                'horizontal-md': '7rem',
-                'horizontal-sm': '4rem',
-
-                'vertical-xl': '5rem',
-                'vertical-lg': '3rem',
-                'vertical-md': '2rem',
-                'vertical-sm': '1rem',
-
-                'top-nav-xl': '9rem',
-                'top-nav-lg': '8rem',
-                'top-nav-md': '7rem',
-                'top-nav-sm': '6rem',
-
-                'between-lg': '3rem',
-                'between-md': '2rem',
-                'between-sm': '1rem',
-            },
-            colors: {
-                beige: '#F0CFB5',
-                shifter: '#008CC2',
-                red: '#FF6F61',
-                'dark-blue': '#002E5D',
-                'deep-green': '#2C6B3D',
-                gold: '#FFB300',
-                teal: '#009688',
-                'dark-gray': '#666666',
-                'bright-gray': '#DDDDDD',
-                gray: '#E5E7EB',
-                'black-text': '#333333',
-                'white-text': '#EEEEEE',
-            },
-            boxShadow: {
-                'up-sm': '0 -1px 2px 0 rgba(0, 0, 0, 0.05)',
-                up: '0 -1px 3px 0 rgba(0, 0, 0, 0.1), 0 -1px 2px 0 rgba(0, 0, 0, 0.06)',
-                'up-md': '0 -4px 6px -1px rgba(0, 0, 0, 0.1), 0 -2px 4px -2px rgba(0, 0, 0, 0.06)',
-                'up-lg': '0 -10px 15px -3px rgba(0, 0, 0, 0.1), 0 -4px 6px -4px rgba(0, 0, 0, 0.05)',
-                'up-xl': '0 -20px 25px -5px rgba(0, 0, 0, 0.1), 0 -10px 10px -5px rgba(0, 0, 0, 0.04)',
-                'up-2xl': '0 -25px 50px -12px rgba(0, 0, 0, 0.25)',
-            },
-            fontFamily: {
-                sans: ['"Source Sans 3"', 'sans-serif'],
-                montserrat: ['Montserrat', 'sans-serif'],
-            },
-        },
-    },
-    plugins: [],
-}
Index: ontend/tsconfig.app.json
===================================================================
--- frontend/tsconfig.app.json	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,28 +1,0 @@
-{
-  "compilerOptions": {
-    "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
-    "target": "ES2020",
-    "useDefineForClassFields": true,
-    "lib": ["ES2020", "DOM", "DOM.Iterable"],
-    "module": "ESNext",
-    "skipLibCheck": true,
-
-    /* Bundler mode */
-    "moduleResolution": "bundler",
-    "allowImportingTsExtensions": true,
-    "verbatimModuleSyntax": true,
-    "moduleDetection": "force",
-    "noEmit": true,
-    "jsx": "react-jsx",
-
-    /* Linting */
-    "strict": true,
-    "noUnusedLocals": true,
-    "noUnusedParameters": true,
-    "erasableSyntaxOnly": true,
-    "noFallthroughCasesInSwitch": true,
-    "noUncheckedSideEffectImports": true,
-    "allowSyntheticDefaultImports": true
-  },
-  "include": ["src"]
-}
Index: ontend/tsconfig.json
===================================================================
--- frontend/tsconfig.json	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,7 +1,0 @@
-{
-  "files": [],
-  "references": [
-    { "path": "./tsconfig.app.json" },
-    { "path": "./tsconfig.node.json" }
-  ]
-}
Index: ontend/tsconfig.node.json
===================================================================
--- frontend/tsconfig.node.json	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,25 +1,0 @@
-{
-  "compilerOptions": {
-    "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
-    "target": "ES2022",
-    "lib": ["ES2023"],
-    "module": "ESNext",
-    "skipLibCheck": true,
-
-    /* Bundler mode */
-    "moduleResolution": "bundler",
-    "allowImportingTsExtensions": true,
-    "verbatimModuleSyntax": true,
-    "moduleDetection": "force",
-    "noEmit": true,
-
-    /* Linting */
-    "strict": true,
-    "noUnusedLocals": true,
-    "noUnusedParameters": true,
-    "erasableSyntaxOnly": true,
-    "noFallthroughCasesInSwitch": true,
-    "noUncheckedSideEffectImports": true
-  },
-  "include": ["vite.config.ts"]
-}
Index: ontend/vite.config.ts
===================================================================
--- frontend/vite.config.ts	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,12 +1,0 @@
-import { defineConfig } from 'vite'
-import react from '@vitejs/plugin-react'
-import tailwindcss from '@tailwindcss/vite'
-
-
-// https://vite.dev/config/
-export default defineConfig({
-  plugins: [
-      react(),
-      tailwindcss(),
-  ],
-})
Index: ckage-lock.json
===================================================================
--- package-lock.json	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,6 +1,0 @@
-{
-  "name": "Shifter",
-  "lockfileVersion": 3,
-  "requires": true,
-  "packages": {}
-}
Index: 
===================================================================
--- q	(revision 171bfdbb54bf6f8fcb8525406335d07912601114)
+++ 	(revision )
@@ -1,65 +1,0 @@
-[33mcommit 3487c01a2bdc2a11349375008d19da3c5b0c6d78[m[33m ([m[1;36mHEAD[m[33m -> [m[1;32mmain[m[33m)[m
-Author: Borjan Gjorgjievski <borjangjorgjievski1@gmail.com>
-Date:   Wed Jun 25 14:29:56 2025 +0200
-
-    Added authentication. Changed the User class to Account.
-
-[33mcommit e13f128f19b817d19e3e9ba68a26b94d45cef00b[m[33m ([m[1;31morigin/main[m[33m, [m[1;31morigin/HEAD[m[33m)[m
-Author: Borjan Gjorgjievski <borjangjorgjievski1@gmail.com>
-Date:   Tue Jun 24 11:08:50 2025 +0200
-
-    Added Log In and Register Pages
-
-[33mcommit d797dce91fdb18630fa8863ded6bfcbea51b4789[m
-Author: Borjan Gjorgjievski <borjangjorgjievski1@gmail.com>
-Date:   Wed Jun 18 23:50:47 2025 +0200
-
-    Added almost the whole home page. Still room for design changes.
-
-[33mcommit da69b4329aeeddc8aa8dd26f1b3a7e202c8de03a[m
-Author: Borjan Gjorgjievski <borjangjorgjievski1@gmail.com>
-Date:   Mon Jun 16 22:36:41 2025 +0200
-
-    Initialized frontend. Added Navbar, Hero section, CollaborationSteps section.
-
-[33mcommit 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9[m
-Author: Borjan Gjorgjievski <borjangjorgjievski1@gmail.com>
-Date:   Sun Jun 15 16:41:40 2025 +0200
-
-    Added some controllers. They are not finished. I have to setup admin controller, but will do that later in the project.
-
-[33mcommit d061aac450daa79ad7e43ae505b0db48a22e27a4[m
-Author: Borjan Gjorgjievski <borjangjorgjievski1@gmail.com>
-Date:   Tue Jun 10 18:01:37 2025 +0200
-
-    Added implementations for services. Connected to supabase cloud database
-
-[33mcommit 28a0f1e699697bfdd6b980fc72fa073669c3527e[m
-Author: Borjan Gjorgjievski <borjangjorgjievski1@gmail.com>
-Date:   Mon Jun 9 22:00:40 2025 +0200
-
-    Added dto's. Also changed the @Data annotation in entities into @Getter and @Setter because i dont need equals and hash code and because it is safer
-
-[33mcommit 70aa2480f28f83be028c176c25c56fe52bd7c80f[m
-Author: Borjan Gjorgjievski <borjangjorgjievski1@gmail.com>
-Date:   Mon Jun 9 12:12:14 2025 +0200
-
-    Configured model relations
-
-[33mcommit c0d09fa9265acc8e8d81a1199d31c5fe49f38c61[m
-Author: Borjan Gjorgjievski <borjangjorgjievski1@gmail.com>
-Date:   Sun Jun 8 20:19:13 2025 +0200
-
-    Added models and base project structure
-
-[33mcommit 9fa7fd9bdab23eda90c9a0b70c1aea46eaf8f05d[m
-Author: Borjan Gjorgjievski <borjangjorgjievski1@gmail.com>
-Date:   Sun Jun 8 19:34:09 2025 +0200
-
-    added frontend directory
-
-[33mcommit 0672351328b09eb632b662e1c87b53be8e8e5b3f[m
-Author: Borjan Gjorgjievski <borjangjorgjievski1@gmail.com>
-Date:   Sun Jun 8 19:26:48 2025 +0200
-
-    Initial commit
