diff --git a/build.gradle b/build.gradle
index 0bdcc02bb2a5367c58f9bb20ef3f61c21057242b..f6fab35009a6f72fd446eedd67ad1cd73686f040 100644
--- a/build.gradle
+++ b/build.gradle
@@ -2,6 +2,7 @@ plugins {
 	id 'java'
 	id 'org.springframework.boot' version '3.1.5'
 	id 'io.spring.dependency-management' version '1.1.3'
+	id "com.github.node-gradle.node" version "7.0.1"
 }
 
 group = 'Team.5'
@@ -34,6 +35,8 @@ dependencies {
 	annotationProcessor 'org.projectlombok:lombok'
 	testImplementation 'org.springframework.boot:spring-boot-starter-test'
 	implementation 'org.springframework.boot:spring-boot-starter-validation'
+	// https://mvnrepository.com/artifact/org.webjars/openlayers
+	implementation group: 'org.webjars', name: 'openlayers', version: '5.2.0'
 }
 
 tasks.named('bootBuildImage') {
@@ -43,3 +46,7 @@ tasks.named('bootBuildImage') {
 tasks.named('test') {
 	useJUnitPlatform()
 }
+
+task myScript(type: NodeTask) {
+	script = file('src/main/resources/static/scripts/mapAPI.js')
+}
diff --git a/src/main/java/Team5.Smarttowns/Data/Towns.db b/src/main/java/Team5.Smarttowns/Data/Towns.db
deleted file mode 100644
index 2532550d9acf4d8abc21a6e6ed89629908b72a3e..0000000000000000000000000000000000000000
Binary files a/src/main/java/Team5.Smarttowns/Data/Towns.db and /dev/null differ
diff --git a/src/main/java/Team5/SmartTowns/Data/locationRepository.java b/src/main/java/Team5/SmartTowns/Data/locationRepository.java
deleted file mode 100644
index 822a18cb860654694734c7f591cbb5b216eb8a39..0000000000000000000000000000000000000000
--- a/src/main/java/Team5/SmartTowns/Data/locationRepository.java
+++ /dev/null
@@ -1,12 +0,0 @@
-//Holds locations data repository (landmarks)
-package Team5.SmartTowns.Data;
-
-import java.util.List;
-
-
-public interface locationRepository {
-    List<Location> getAllLocation();
-    void addLocation(Location loc);
-
-
-}
diff --git a/src/main/java/Team5/SmartTowns/Data/locationRepositoryJDBC.java b/src/main/java/Team5/SmartTowns/Data/locationRepositoryJDBC.java
deleted file mode 100644
index a5e79d4442d540f5dba67ee7f2b6217984044ebb..0000000000000000000000000000000000000000
--- a/src/main/java/Team5/SmartTowns/Data/locationRepositoryJDBC.java
+++ /dev/null
@@ -1,42 +0,0 @@
-//Implements the locations repository using JDBC
-package Team5.SmartTowns.Data;
-
-import org.springframework.jdbc.core.JdbcTemplate;
-import org.springframework.jdbc.core.RowMapper;
-import org.springframework.stereotype.Repository;
-
-import java.util.List;
-
-@Repository
-public class locationRepositoryJDBC implements locationRepository {
-    private JdbcTemplate jdbc;
-    private RowMapper<Location> locationMapper;
-
-    public locationRepositoryJDBC(JdbcTemplate aJdbc) {
-        this.jdbc = aJdbc;
-        setlocationMapper();
-    }
-    private void setlocationMapper(){
-        locationMapper = (rs, i) -> new Location(
-
-                rs.getString("locationName"),
-                rs.getString("locationEmail"),
-                rs.getString("locationDescription"),
-                rs.getString("locationPlace"),
-                rs.getInt("locationTrailID")
-        );
-    }
-    public List<Location> getAllLocation(){
-        String sql= "SELECT * FROM locations";
-        return jdbc.query(sql, locationMapper);
-    }
-
-    @Override // intended implementation at current: user data from templates/Landmarks/LandmarkFormTh.html is added to the Location table
-    public void addLocation(Location loc) {
-        String sql = "insert into locations( locationName , locationEmail,locationDescription,locationPlace, locationTrailID) values (?,?,?,?,?)";
-
-        jdbc.update(sql,loc.getLocationName(),loc.getLocationEmail(),loc.getLocationDescription(),loc.getLocationPlace(),loc.getLocationTrailID());
-    }
-
-
-}
diff --git a/src/main/java/Team5/SmartTowns/Data/trailsRepository.java b/src/main/java/Team5/SmartTowns/Data/trailsRepository.java
deleted file mode 100644
index 52d8dc39b9bda0a7390f06afca8769a5fd0607a9..0000000000000000000000000000000000000000
--- a/src/main/java/Team5/SmartTowns/Data/trailsRepository.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//Holds trails data repository
-package Team5.SmartTowns.Data;
-
-import java.util.List;
-
-public interface trailsRepository {
-    List<trail> getAllTrails();
-}
diff --git a/src/main/java/Team5/SmartTowns/Towns/TownStorage.java b/src/main/java/Team5/SmartTowns/Towns/TownStorage.java
deleted file mode 100644
index d2d99ea992086630324fa131ad5bb410acd3c425..0000000000000000000000000000000000000000
--- a/src/main/java/Team5/SmartTowns/Towns/TownStorage.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package Team5.SmartTowns.Towns;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class TownStorage {
-    private List<Towns> townList;
-    private static TownStorage singleton;
-
-    TownStorage() {
-        townList = new ArrayList<>();
-        townList.addAll(
-          List.of(
-                  new Towns("Caerphilly",01,3,70,"/images/CaerphillyCastle.jpg"),
-                  new Towns("Risca",02,2,34,"/images/RiscaBanner.jpg"),
-                  new Towns("Penarth",03,5,0,"/images/PenarthBanner.jpg"),
-                  new Towns("Penarth",03,5,50,"/images/PenarthBanner.jpg"),
-                  new Towns("Caerphilly",01,3,70,"/images/CaerphillyCastle.jpg"),
-                  new Towns("Risca",02,2,90,"/images/RiscaBanner.jpg"),
-                  new Towns("Penarth",03,5,100,"/images/PenarthBanner.jpg")
-
-
-
-          )
-
-        );
-
-    }
-    public static TownStorage getInstance() {
-        if (singleton == null) {
-            singleton = new TownStorage();
-
-        }
-        return singleton;
-    }
-
-    public List<Towns> getTownList() {
-        return townList;
-    }
-
-
-
-
-}
diff --git a/src/main/java/Team5/SmartTowns/Data/DatabaseController.java b/src/main/java/Team5/SmartTowns/data/DatabaseController.java
similarity index 53%
rename from src/main/java/Team5/SmartTowns/Data/DatabaseController.java
rename to src/main/java/Team5/SmartTowns/data/DatabaseController.java
index 0d38e955dd0a2e38e9585e5560d1cd4b6df83033..5b5d5ac4fa54cf3f0801b4fad4d8e1b9304cc9f1 100644
--- a/src/main/java/Team5/SmartTowns/Data/DatabaseController.java
+++ b/src/main/java/Team5/SmartTowns/data/DatabaseController.java
@@ -1,27 +1,27 @@
-package Team5.SmartTowns.Data;
+package Team5.SmartTowns.data;
 
-import Team5.SmartTowns.users.User;
-import Team5.SmartTowns.users.UserRepository;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.servlet.ModelAndView;
 
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
 import java.util.*;
+
 @Controller
 public class DatabaseController {
 
-
     @Autowired
-    private locationRepository locationRepository;
+    private LocationRepository locationRepository;
     @Autowired
-    private trailsRepository trailsRepository;
-
+    private TrailsRepository trailsRepository;
 
     @GetMapping("/trailList")
     public ModelAndView trailList() {
         ModelAndView mav1 = new ModelAndView("towns/trailsData");
-        List<trail> trail = trailsRepository.getAllTrails();
+        List<Trail> trail = trailsRepository.getAllTrails();
         mav1.addObject("trails", trail);
         return mav1;
     }
@@ -32,4 +32,17 @@ public class DatabaseController {
         mav2.addObject("location", Locations);
         return mav2;
     }
+
+//
+//    public List<Location> approvedLocations(){
+//        List<Location> locations = locationRepository.getAllLocation();
+//        List<Location> locationApprovalList;
+////		for (int i=0;i<locations.size();i++){
+////			location
+//        for (Location loc :locations){
+//            if (loc.isLocationApproved()) {
+//                locationApprovalList.add(loc);
+//            }
+//        } return locationApprovalList;
+//    }
 }
diff --git a/src/main/java/Team5/SmartTowns/Data/Location.java b/src/main/java/Team5/SmartTowns/data/Location.java
similarity index 83%
rename from src/main/java/Team5/SmartTowns/Data/Location.java
rename to src/main/java/Team5/SmartTowns/data/Location.java
index 01ba2932c6b7d0a6201aa8128161bf7ad8b27526..d833db114ef53492fb99ab9f12b863bcd78177a5 100644
--- a/src/main/java/Team5/SmartTowns/Data/Location.java
+++ b/src/main/java/Team5/SmartTowns/data/Location.java
@@ -1,5 +1,5 @@
 //Holds variable data for the locations table (landmarks)
-package Team5.SmartTowns.Data;
+package Team5.SmartTowns.data;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
@@ -13,6 +13,12 @@ public class Location {
     private String locationPlace;
     private int locationTrailID;
 
+    private boolean locationApproved;
+
+    public Location() {
+
+    }
+
     @Override
     public String toString() {
         return "Location{" +
@@ -21,6 +27,7 @@ public class Location {
                  locationDescription + '\'' +
                  locationPlace + '\'' +
                  locationTrailID +
+                locationApproved+
                 '}';
     }
 
@@ -44,5 +51,7 @@ public class Location {
         return locationTrailID;
     }
 
-
+    public boolean isLocationApproved() {
+        return locationApproved;
+    }
 }
diff --git a/src/main/java/Team5/SmartTowns/data/LocationRepository.java b/src/main/java/Team5/SmartTowns/data/LocationRepository.java
new file mode 100644
index 0000000000000000000000000000000000000000..1d896aab751dd096ad717fefaa384df7e1ea4fed
--- /dev/null
+++ b/src/main/java/Team5/SmartTowns/data/LocationRepository.java
@@ -0,0 +1,22 @@
+//Holds locations data repository (landmarks)
+package Team5.SmartTowns.data;
+
+import java.util.List;
+
+
+public interface LocationRepository {
+    List<Location> getAllLocation();
+    void addLocation(Location loc);
+
+
+    List<Location> getApprovedLocations();
+
+//    List<Location> getApprovedLocations2(List<Location> list);
+
+    List<Location> getUnapprovedLocations();
+
+
+//     List<Location> approvedLocations();
+
+
+}
diff --git a/src/main/java/Team5/SmartTowns/data/LocationRepositoryJDBC.java b/src/main/java/Team5/SmartTowns/data/LocationRepositoryJDBC.java
new file mode 100644
index 0000000000000000000000000000000000000000..77efb4d5a772a1f22efe94c6e20eb46586ce111b
--- /dev/null
+++ b/src/main/java/Team5/SmartTowns/data/LocationRepositoryJDBC.java
@@ -0,0 +1,104 @@
+//Implements the locations repository using JDBC
+package Team5.SmartTowns.data;
+
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.RowMapper;
+import org.springframework.stereotype.Repository;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Repository
+public class LocationRepositoryJDBC implements LocationRepository {
+   private JdbcTemplate jdbc;
+    private RowMapper<Location> locationMapper;
+
+    public LocationRepositoryJDBC(JdbcTemplate aJdbc) {
+        this.jdbc = aJdbc;
+        setlocationMapper();
+    }
+
+//    public LocationRepositoryJDBC() {
+//        JdbcTemplate ajdbc = new JdbcTemplate();
+//        this.jdbc =ajdbc;
+//        setlocationMapper();
+//
+//    }
+
+
+    private void setlocationMapper(){
+        locationMapper = (rs, i) -> new Location(
+
+                rs.getString("locationName"),
+                rs.getString("locationEmail"),
+                rs.getString("locationDescription"),
+                rs.getString("locationPlace"),
+                rs.getInt("locationTrailID"),
+                rs.getBoolean("locationApproved")
+        );
+    }
+    public List<Location> getAllLocation(){
+        String sql= "SELECT * FROM locations";
+        return jdbc.query(sql, locationMapper);
+    }
+//    public LocationRepositoryJDBC() {
+//        JdbcTemplate ajdbc = new JdbcTemplate();
+//        this.jdbc =ajdbc;
+//        setlocationMapper();
+//
+//    }
+//    public LocationRepositoryJDBC(JdbcTemplate jdbc, RowMapper<Location> locationMapper) {
+//        this.jdbc = jdbc;
+//        this.locationMapper = locationMapper;
+//    }
+
+    @Override // intended implementation at current: user data from templates/Landmarks/LandmarkFormTh.html is added to the Location table
+    public void addLocation(Location loc) {
+        String sql = "insert into locations( locationName , locationEmail,locationDescription,locationPlace, locationTrailID, locationApproved) values (?,?,?,?,?,?)";
+
+        jdbc.update(sql,loc.getLocationName(),loc.getLocationEmail(),loc.getLocationDescription(),loc.getLocationPlace(),loc.getLocationTrailID());
+    }
+
+    @Override
+    public List<Location> getApprovedLocations(){
+        JdbcTemplate jdbc = new JdbcTemplate();
+        List<Location> locations = new LocationRepositoryJDBC(jdbc).getAllLocation();
+        List<Location> locationApprovalList= new ArrayList<Location>();
+        for (Location loc :locations){
+            if (loc.isLocationApproved()) {
+                locationApprovalList.add(loc);
+            }
+        } return locationApprovalList;
+ }
+//
+//    @Override
+//    public List<Location> getApprovedLocations2(List<Location> list){
+//
+//        List<Location> locationApprovalList= new ArrayList<Location>();
+//        for (Location loc :list){
+//            if (loc.isLocationApproved()) {
+//                locationApprovalList.add(loc);
+//            }
+//        } return locationApprovalList;
+//    }
+//
+
+
+    @Override
+    public List<Location> getUnapprovedLocations(){
+        List<Location> locations = getAllLocation();
+        List<Location> locationUnapprovedList= new ArrayList<Location>();
+        for (Location loc :locations){
+            if (!loc.isLocationApproved()) {
+                locationUnapprovedList.add(loc);
+            }
+        } return locationUnapprovedList;
+    }
+
+
+//    public JdbcTemplate getJdbc() {
+//        return jdbc;
+//    }
+
+
+}
diff --git a/src/main/java/Team5/SmartTowns/data/Main.java b/src/main/java/Team5/SmartTowns/data/Main.java
new file mode 100644
index 0000000000000000000000000000000000000000..8f2a890b66299d6c3662b6bd7e68c6d897792847
--- /dev/null
+++ b/src/main/java/Team5/SmartTowns/data/Main.java
@@ -0,0 +1,16 @@
+//package Team5.SmartTowns.Data;
+//
+//import org.springframework.beans.factory.annotation.Autowired;
+//
+//import java.util.List;
+//
+//public class Main {
+//    @Autowired
+//    private locationRepository locationRepository;
+//    List<Location> approvedNumber= locationRepository.approvedLocations();
+//    public static void main(String[] args) {
+//        for (Location loc: approvedNumber){}
+//
+//
+//    }
+//}
diff --git a/src/main/java/Team5/SmartTowns/data/MockUser.java b/src/main/java/Team5/SmartTowns/data/MockUser.java
new file mode 100644
index 0000000000000000000000000000000000000000..344dbbd77e6aeba32c362c4955c87464125ab0e4
--- /dev/null
+++ b/src/main/java/Team5/SmartTowns/data/MockUser.java
@@ -0,0 +1,16 @@
+package Team5.SmartTowns.data;
+
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.RowMapper;
+
+import java.util.List;
+
+public class MockUser {
+
+    private JdbcTemplate jdbc;
+    private RowMapper<Trail> trailMapper;
+    public List<Trail> getAllTrails(){
+        String sql= "SELECT * FROM trails";
+        return jdbc.query(sql, trailMapper);
+    }
+}
diff --git a/src/main/java/Team5/SmartTowns/data/QRCodes.java b/src/main/java/Team5/SmartTowns/data/QRCodes.java
new file mode 100644
index 0000000000000000000000000000000000000000..28ebf97c96d884a6629208ce8ce58505334b63b6
--- /dev/null
+++ b/src/main/java/Team5/SmartTowns/data/QRCodes.java
@@ -0,0 +1,4 @@
+package Team5.SmartTowns.data;
+
+public class QRCodes {
+}
diff --git a/src/main/java/Team5/SmartTowns/Data/trail.java b/src/main/java/Team5/SmartTowns/data/Trail.java
similarity index 69%
rename from src/main/java/Team5/SmartTowns/Data/trail.java
rename to src/main/java/Team5/SmartTowns/data/Trail.java
index 86e78b96712ecf7a5756edbf20a4bae35839ca70..61ab540fce97c94b709c888e3c261db35c318849 100644
--- a/src/main/java/Team5/SmartTowns/Data/trail.java
+++ b/src/main/java/Team5/SmartTowns/data/Trail.java
@@ -1,12 +1,13 @@
 //Holds variable data for the trails table
-package Team5.SmartTowns.Data;
+package Team5.SmartTowns.data;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
 
 @Data
 @AllArgsConstructor
-public class trail {
+public class Trail {
     private int trailsId;
     private String name;
+    private Boolean tru;
 }
diff --git a/src/main/java/Team5/SmartTowns/data/TrailsRepository.java b/src/main/java/Team5/SmartTowns/data/TrailsRepository.java
new file mode 100644
index 0000000000000000000000000000000000000000..d25e6fd62efdfdb4d743c829eeab5ddfeb5119d0
--- /dev/null
+++ b/src/main/java/Team5/SmartTowns/data/TrailsRepository.java
@@ -0,0 +1,8 @@
+//Holds trails data repository
+package Team5.SmartTowns.data;
+
+import java.util.List;
+
+public interface TrailsRepository {
+    List<Trail> getAllTrails();
+}
diff --git a/src/main/java/Team5/SmartTowns/Data/trailsRepositoryJDBC.java b/src/main/java/Team5/SmartTowns/data/TrailsRepositoryJDBC.java
similarity index 59%
rename from src/main/java/Team5/SmartTowns/Data/trailsRepositoryJDBC.java
rename to src/main/java/Team5/SmartTowns/data/TrailsRepositoryJDBC.java
index 58aa84a95b00b8f8b5d7f97d240e04f405d2ac3b..0bb20867153d77c2fd47f3e031bf63c7c1fdac7e 100644
--- a/src/main/java/Team5/SmartTowns/Data/trailsRepositoryJDBC.java
+++ b/src/main/java/Team5/SmartTowns/data/TrailsRepositoryJDBC.java
@@ -1,5 +1,5 @@
 //Implements the trails repository using JDBC
-package Team5.SmartTowns.Data;
+package Team5.SmartTowns.data;
 
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.core.RowMapper;
@@ -8,20 +8,21 @@ import org.springframework.stereotype.Repository;
 import java.util.List;
 
 @Repository
-public class trailsRepositoryJDBC implements trailsRepository{
+public class TrailsRepositoryJDBC implements TrailsRepository {
     private JdbcTemplate jdbc;
-    private RowMapper<trail> trailMapper;
-        public trailsRepositoryJDBC(JdbcTemplate aJdbc){
+    private RowMapper<Trail> trailMapper;
+        public TrailsRepositoryJDBC(JdbcTemplate aJdbc){
         this.jdbc = aJdbc;
         settrailsMapper();
     }
     private void settrailsMapper(){
-        trailMapper = (rs, i) -> new trail(
+        trailMapper = (rs, i) -> new Trail(
                 rs.getInt("trailID"),
-                rs.getString("name")
+                rs.getString("name"),
+                rs.getBoolean("tru")
         );
     }
-    public List<trail> getAllTrails(){
+    public List<Trail> getAllTrails(){
         String sql= "SELECT * FROM trails";
         return jdbc.query(sql, trailMapper);
     }
diff --git a/src/main/java/Team5/SmartTowns/Landmarks/Landmarks.java b/src/main/java/Team5/SmartTowns/landmarks/Landmarks.java
similarity index 89%
rename from src/main/java/Team5/SmartTowns/Landmarks/Landmarks.java
rename to src/main/java/Team5/SmartTowns/landmarks/Landmarks.java
index f9ceacf15728a5f7cdf9b36c2577dbb1aa0c7624..6974c1e997c5b2dd6d7396f44ea0cbe4565331c7 100644
--- a/src/main/java/Team5/SmartTowns/Landmarks/Landmarks.java
+++ b/src/main/java/Team5/SmartTowns/landmarks/Landmarks.java
@@ -1,8 +1,6 @@
-package Team5.SmartTowns.Landmarks;
+package Team5.SmartTowns.landmarks;
 
-import Team5.SmartTowns.trails.Trail;
 import jakarta.validation.constraints.Email;
-import jakarta.validation.constraints.Min;
 import jakarta.validation.constraints.NotEmpty;
 import lombok.AllArgsConstructor;
 import lombok.Data;
@@ -18,7 +16,7 @@ public class Landmarks {
     // Initialized object to getID from trail.
 
     //Predefined Landmark for Dragons Tale.
-    private static List<Landmarks> landmarksDragonstrail = List.of(
+    public static List<Landmarks> landmarksDragonstrail = List.of(
             new Landmarks( 1, "A scent of...Dragon", "The Dragon has been spotted near by, find the QR code to continue" , "Start your discovery, at the sweet shop."),
             new Landmarks( 2, "They've been found!", "Don't let them escape, find the next QR code to continue!", "Location test")
     );
@@ -43,6 +41,4 @@ public class Landmarks {
         this.landmarkName = landmarkName;
         this.landmarkDescription = landmarkDescription;
         this.landmarkLocation = landmarkLocation;    }
-
-
 }
diff --git a/src/main/java/Team5/SmartTowns/Landmarks/LandmarksController.java b/src/main/java/Team5/SmartTowns/landmarks/LandmarksController.java
similarity index 87%
rename from src/main/java/Team5/SmartTowns/Landmarks/LandmarksController.java
rename to src/main/java/Team5/SmartTowns/landmarks/LandmarksController.java
index a94feef88935a8d3ca71f6326bdb8f44cda6dd0e..d5d326cdb733339ff3c3ab298090776af9036fc3 100644
--- a/src/main/java/Team5/SmartTowns/Landmarks/LandmarksController.java
+++ b/src/main/java/Team5/SmartTowns/landmarks/LandmarksController.java
@@ -1,7 +1,7 @@
-package Team5.SmartTowns.Landmarks;
+package Team5.SmartTowns.landmarks;
 
-import Team5.SmartTowns.Data.Location;
-import Team5.SmartTowns.Data.locationRepository;
+import Team5.SmartTowns.data.Location;
+import Team5.SmartTowns.data.LocationRepository;
 import jakarta.validation.Valid;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
@@ -26,7 +26,7 @@ public class LandmarksController {
     }
 
     @Autowired
-    private locationRepository locationRepository;
+    private LocationRepository locationRepository;
     @PostMapping("/landmarkSub")
     public ModelAndView landmarkSent(@Valid @ModelAttribute("landmarkData") Landmarks landmarks, BindingResult bindingResult, Model model ) {
 
@@ -37,7 +37,7 @@ public class LandmarksController {
 
         } else{
             // converts valid response using Location constructor into a submittable format to the sql table
-            Location loc= new Location(landmarks.getLandmarkName(), landmarks.getLandmarkEmail(), landmarks.getLandmarkDescription(), landmarks.getLandmarkLocation(), landmarks.getTrailID());
+            Location loc= new Location(landmarks.getLandmarkName(), landmarks.getLandmarkEmail(), landmarks.getLandmarkDescription(), landmarks.getLandmarkLocation(), landmarks.getTrailID(), false);
             System.out.println(loc);
             locationRepository.addLocation(loc); // adds valid landmark to locations table
             ModelAndView modelAndView = new ModelAndView("redirect:/home");
diff --git a/src/main/java/Team5/SmartTowns/placeswithcoordinates/LocationsCoordinates.java b/src/main/java/Team5/SmartTowns/placeswithcoordinates/LocationsCoordinates.java
new file mode 100644
index 0000000000000000000000000000000000000000..349adc85e3752bd0f523750e2b5bc8dff25f6e76
--- /dev/null
+++ b/src/main/java/Team5/SmartTowns/placeswithcoordinates/LocationsCoordinates.java
@@ -0,0 +1,111 @@
+package Team5.SmartTowns.placeswithcoordinates;
+
+
+
+import Team5.SmartTowns.data.Location;
+import Team5.SmartTowns.data.LocationRepositoryJDBC;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.jdbc.core.JdbcTemplate;
+
+import java.text.DecimalFormat;
+import java.util.List;
+
+//@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class LocationsCoordinates {
+    /// separate class to location to cover all locations within trails that have been approved and have long/lat coords attached for mapping.
+    private int locationID;
+    private Double locationCoordsLat;
+    private Double locationCoordsLong;
+    private JdbcTemplate jdbc;
+
+//    public List<Location> getFullApprovedLocations(JdbcTemplate aJdbc){
+//        JdbcTemplate jdbcSuper= new LocationRepositoryJDBC().getJdbc();
+//        return new LocationRepositoryJDBC(jdbcSuper).getApprovedLocations();
+//    }
+
+
+    public int getLocationID() {
+        return locationID;
+    }
+
+    public Double getLocationCoordsLong() {
+        return locationCoordsLong;
+    }
+
+    public Double getLocationCoordsLat() {
+        return locationCoordsLat;
+    }
+
+    public void setLocationCoordsLong(Double locationCoordsLong) {
+        this.locationCoordsLong = locationCoordsLong;
+    }
+
+    public void setLocationCoordsLat(Double locationCoordsLat) {
+        this.locationCoordsLat = locationCoordsLat;
+    }
+
+//    public LocationsCoordinates(JdbcTemplate aJdbc, int locationID, Double locationCoordsLat, Double locationCoordsLong) {
+//        super(aJdbc);
+//        this.locationID = locationID;
+//        this.locationCoordsLong = locationCoordsLong;
+//        this.locationCoordsLat = locationCoordsLat;
+//    }
+
+//    public LocationsCoordinates(int locationID, Double locationCoordsLat, Double locationCoordsLong,JdbcTemplate jdbc) {
+//        super(jdbc);
+//        this.locationID = locationID;
+//        this.locationCoordsLong = locationCoordsLong;
+//        this.locationCoordsLat = locationCoordsLat;
+//    }
+
+
+//    public LocationsCoordinates(JdbcTemplate aJdbc, int locationID, Double locationCoordsLat, Double locationCoordsLong, JdbcTemplate jdbc) {
+//        super(aJdbc);
+//        this.locationID = locationID;
+//        this.locationCoordsLat = locationCoordsLat;
+//        this.locationCoordsLong = locationCoordsLong;
+//        this.jdbc = jdbc;
+//    }
+
+    public LocationsCoordinates(int locationID, Double locationCoordsLat, Double locationCoordsLong) {
+        this.locationID = locationID;
+        this.locationCoordsLat = locationCoordsLat;
+        this.locationCoordsLong = locationCoordsLong;
+    }
+
+//    public LocationsCoordinates(JdbcTemplate aJdbc) {
+//        super(aJdbc);
+//    }
+
+    public List<Location> getFullListLocations(JdbcTemplate aJdbc){
+//        LocationsCoordinates jdbcSuper= new LocationsCoordinates(aJdbc);
+        return new LocationRepositoryJDBC(aJdbc).getAllLocation();
+    }
+
+
+
+//    public List<Location> getFullApprovedLocations(JdbcTemplate aJdbc){
+//        JdbcTemplate jdbcSuper= new LocationRepositoryJDBC().getJdbc();
+//        return new LocationRepositoryJDBC(jdbcSuper).getApprovedLocations();
+//    }
+
+    public List<Location> getFullUnapprovedLocations(JdbcTemplate aJdbc){
+//        LocationsCoordinates jdbcSuper= new LocationsCoordinates(aJdbc);
+        return new LocationRepositoryJDBC(aJdbc).getUnapprovedLocations();
+    }
+
+
+
+
+ /// Need a constructor to create a lcoations list, approved lcoatiosn lsit, unapproved lcoations list.
+
+
+
+
+
+
+}
diff --git a/src/main/java/Team5/SmartTowns/placeswithcoordinates/PlacesController.java b/src/main/java/Team5/SmartTowns/placeswithcoordinates/PlacesController.java
new file mode 100644
index 0000000000000000000000000000000000000000..8d142f83569aa8816ea8d9d1b32c6b795ab96c00
--- /dev/null
+++ b/src/main/java/Team5/SmartTowns/placeswithcoordinates/PlacesController.java
@@ -0,0 +1,77 @@
+package Team5.SmartTowns.placeswithcoordinates;
+
+import Team5.SmartTowns.data.Location;
+import Team5.SmartTowns.data.LocationRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.servlet.ModelAndView;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Controller
+public class PlacesController {
+
+    @Autowired
+    private PlacesCoordinatesRepository placeRepo;
+    @Autowired
+    private LocationRepository locationRepo;
+
+
+
+
+    @GetMapping("/checkpoints")
+    public ModelAndView getLocationPages(){
+        ModelAndView modelAndView = new ModelAndView("landmarks/locationPage.html");
+        List<Location> locations =  locationRepo.getAllLocation();
+//        List<Location> approvedLocations =  locationRepo.getApprovedLocations2(locations);
+        List<LocationsCoordinates> locCoords = placeRepo.getAllLocationCoords();
+        List<Integer> locationIDIndex = new ArrayList<Integer>();
+        List<Location> locationCoordsWorkaround = new ArrayList<Location>();
+        for (LocationsCoordinates coord: locCoords){
+            locationIDIndex.add(coord.getLocationID()-1);
+            locationCoordsWorkaround.add(locations.get(coord.getLocationID()-1));
+        }
+        modelAndView.addObject("location", locationCoordsWorkaround);
+        modelAndView.addObject("locationCoords", locCoords);
+        return  modelAndView;
+    }
+
+    @RequestMapping(value="/location", method= RequestMethod.POST)
+    public String sendHtmlFragment(Model map) {
+        map.addAttribute("foo", "bar");
+        return "checkpoint/checkpoint";
+    }
+
+        @GetMapping("/checkpoints/{location}")
+    public ModelAndView getResultBySearchKey(@PathVariable String location) {
+            List<Location> locations =  locationRepo.getAllLocation();
+            List<LocationsCoordinates> locCoords = placeRepo.getAllLocationCoords();
+
+            List<Integer> locationIDIndex = new ArrayList<Integer>();
+            List<Location> locationCoordsWorkaround = new ArrayList<Location>();
+            int locationID = 999;
+            int workAroundID=0;// otherwise cases errors e.g. null used. 999 unlikely to be used so safe until then
+            for (int i=0;i<locCoords.size();i++){ /// for loop iterating over coordinates table need to match coordinate index with lcoation index manually
+                locationIDIndex.add(locCoords.get(i).getLocationID()-1); // gets location ID and therefore location list index number
+                locationCoordsWorkaround.add(locations.get(locCoords.get(i).getLocationID()-1));
+                if ( (locations.get(locCoords.get(i).getLocationID() - 1).getLocationName().replace(' ', '-').trim().equals(location)) ){
+                    locationID= i;
+                    break;
+                } workAroundID++;
+            }System.out.println(locationCoordsWorkaround);
+            System.out.println("ag"+locationID);
+        ModelAndView modelAndView= new ModelAndView("fragments/locationPageFrags :: locationSection");
+            System.out.println("ag"+locationID);
+        modelAndView.addObject("locCoord", locCoords.get(locationID));
+            System.out.println("sd"+workAroundID);
+        modelAndView.addObject("location", locationCoordsWorkaround.get(locationID));
+        return modelAndView;
+    }
+
+}
diff --git a/src/main/java/Team5/SmartTowns/placeswithcoordinates/PlacesCoordinatesRepository.java b/src/main/java/Team5/SmartTowns/placeswithcoordinates/PlacesCoordinatesRepository.java
new file mode 100644
index 0000000000000000000000000000000000000000..a5e03d93ab75a20f3c380ca5c1b3d11c6f0b5807
--- /dev/null
+++ b/src/main/java/Team5/SmartTowns/placeswithcoordinates/PlacesCoordinatesRepository.java
@@ -0,0 +1,21 @@
+package Team5.SmartTowns.placeswithcoordinates;
+
+import Team5.SmartTowns.data.Location;
+import org.springframework.jdbc.core.JdbcTemplate;
+
+import java.util.List;
+
+public interface PlacesCoordinatesRepository {
+
+    List<LocationsCoordinates> getAllLocationCoords();
+    void addLocationCoord(LocationsCoordinates locCoord);
+
+    List<TownWithTrails> getAllTownCoords();
+    void addTownWithCoords(TownWithTrails town);
+
+    List<Location> getFullApprovedLocations(JdbcTemplate aJdbc);
+
+
+
+
+}
diff --git a/src/main/java/Team5/SmartTowns/placeswithcoordinates/PlacesCoordinatesRepositoryJDBC.java b/src/main/java/Team5/SmartTowns/placeswithcoordinates/PlacesCoordinatesRepositoryJDBC.java
new file mode 100644
index 0000000000000000000000000000000000000000..dfca28ecd791d6ec0dc2a3040bc62274c07ff8c3
--- /dev/null
+++ b/src/main/java/Team5/SmartTowns/placeswithcoordinates/PlacesCoordinatesRepositoryJDBC.java
@@ -0,0 +1,545 @@
+package Team5.SmartTowns.placeswithcoordinates;
+
+import Team5.SmartTowns.data.Location;
+import Team5.SmartTowns.data.LocationRepositoryJDBC;
+import org.springframework.boot.autoconfigure.integration.IntegrationProperties;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.RowMapper;
+import org.springframework.stereotype.Repository;
+
+
+import java.util.List;
+import java.util.Objects;
+
+@Repository
+public class PlacesCoordinatesRepositoryJDBC implements PlacesCoordinatesRepository {
+
+
+    private JdbcTemplate jdbc;
+    private RowMapper<LocationsCoordinates> locationCoordMapper;
+    private RowMapper<TownWithTrails> townCoordMapper;
+    public PlacesCoordinatesRepositoryJDBC(JdbcTemplate aJdbc) {
+        this.jdbc = aJdbc;
+        setLocationCoordsMapper();
+        setTownCoordsMapper();
+    }
+    private void setLocationCoordsMapper(){
+        locationCoordMapper = (rs, i) -> new LocationsCoordinates(
+
+                rs.getInt("locationID"),
+                rs.getDouble("locationCoordsLat"),
+                rs.getDouble("locationCoordsLong")
+
+        );
+    }
+    private void setTownCoordsMapper(){
+        townCoordMapper = (rs, i) -> new TownWithTrails(
+
+                rs.getString("townName"),
+                rs.getString("townCentreCoordsLat"),
+                rs.getString("townCentreCoordsLong"),
+                rs.getString("townUppermostCoordsLat"),
+                rs.getString("townLowermostCoordsLat"),
+                rs.getString("townLeftmostCoordsLong"),
+                rs.getString("townRightmostCoordsLong")
+
+
+        );
+    }
+
+
+
+    public List<LocationsCoordinates> getAllLocationCoords(){
+        String sql= "SELECT * FROM locationCoordinates";
+        return jdbc.query(sql, locationCoordMapper);
+    }
+    public List<TownWithTrails> getAllTownCoords(){
+        String sql= "SELECT * FROM townswithtrails";
+        return jdbc.query(sql, townCoordMapper);
+    }
+
+    @Override
+    public void addLocationCoord(LocationsCoordinates locCoords) {
+        String sql = "insert into locationCoordinates(locationID, locationCoordsLat,locationCoordsLong) values (?,?,?)";
+
+        jdbc.update(sql,locCoords.getLocationID(), locCoords.getLocationCoordsLong(),locCoords.getLocationCoordsLat());
+
+    }
+    @Override
+    public void addTownWithCoords(TownWithTrails town) {
+        String sql = "insert into townswithtrails(townName,townCentreCoordsLat,townCentreCoordsLong,townUppermostCoordsLat,townLowermostCoordsLat,townLeftmostCoordsLong,townRightmostCoordsLong) values (?,?,?,?,?,?,?)";
+
+        jdbc.update(sql,town.getTownName(),town.getTownCentreCoordsLong(),town.getTownCentreCoordsLong(),town.getTownUppermostCoordsLat(),town.getTownLowermostCoordsLat(),town.getTownLeftmostCoordsLong(),town.getTownRightmostCoordsLong());
+
+    }
+
+
+    public List<Location> getFullApprovedLocations(JdbcTemplate aJdbc) {
+//        LocationsCoordinates jdbcSuper= new LocationsCoordinates(aJdbc);
+        return new LocationRepositoryJDBC(aJdbc).getApprovedLocations();
+    }
+
+//    @Override //TODO CHECK
+//    public List<Location> getFullApprovedLocations(JdbcTemplate aJdbc) {
+//        return null;
+//    }
+
+
+    public boolean checkInputtedCoordsMatchTown(String inpLatCoords, String inpLongCoords, String townName){
+     PlacesCoordinatesRepositoryJDBC jbdcsecond = new PlacesCoordinatesRepositoryJDBC(jdbc);
+     List<TownWithTrails> allTowns = jbdcsecond.getAllTownCoords();
+     for (TownWithTrails town : allTowns){
+         if (Objects.equals(townName, town.getTownName())){
+             // check lon within boundaries
+             // convert values to doubles
+             double inpLat=Double.parseDouble(inpLatCoords);
+             double inpLong=Double.parseDouble(inpLongCoords);
+             double townBoundaryLatUppermost=Double.parseDouble(town.getTownUppermostCoordsLat());
+             double townBoundaryLatLowermost=Double.parseDouble(town.getTownLowermostCoordsLat());
+
+             double townBoundaryLongLeftmost=Double.parseDouble(town.getTownLeftmostCoordsLong());
+             double townBoundaryLongRightmost=Double.parseDouble(town.getTownRightmostCoordsLong());
+             // check coords within respective town boundary (boundary decided by rough google maps red-line)
+             if ( (inpLat<=townBoundaryLatUppermost)&& (inpLat>=townBoundaryLatLowermost) && (inpLat<=townBoundaryLongLeftmost) &&  (inpLat<=townBoundaryLongRightmost)){
+                 // location within boundary
+                 return true;
+             } else{
+                 System.out.println("Location outside town boundary. "); //todo scanner bad idea, add admin override?
+                 return false;
+             }
+
+
+
+         }
+     }
+    return true;}
+    int getLocationTableIDValue(List<Location> locations, String locationName){
+        int index;
+        for(int i=0;i<locations.size();i++){
+            if (Objects.equals(locations.get(i).getLocationName(), locationName)){
+                index = i;
+                return index;
+
+            }
+        } return index= Integer.parseInt(null);
+
+    }
+
+
+
+    // Method used to approve and add locations with associated coordinates. List<Location> unapprovedLocations
+//    public void approveLocationAndAddCoords(String locationsName, Double latCoords, Double longCoords,JdbcTemplate jdbc) {
+//        // need list too
+//
+//        LocationsCoordinates jdbcTemp= new LocationsCoordinates(jdbc);
+//        List<Location> unapprovedLocations = jdbcTemp.getFullUnapprovedLocations(jdbc);
+//        List<Location> allLocations = jdbcTemp.getFullListLocations(jdbc);
+//
+//        PlacesCoordinatesRepositoryJDBC jbdcsecond = new PlacesCoordinatesRepositoryJDBC(jdbc);
+//        List<TownWithTrails> allTowns = jbdcsecond.getAllTownCoords();
+//        int unapporvedLocationsListIndex=99;  // initialize variable to allow after if statement to run todo fix this
+//        for (int i=0; i<unapprovedLocations.size();i++){ // check if location exists
+//            if (Objects.equals(unapprovedLocations.get(i).getLocationName(), locationsName)){
+//                unapporvedLocationsListIndex =i;
+//                break;
+//
+//            } else if(!Objects.equals(unapprovedLocations.get(i).getLocationPlace(), locationsName)){
+//                System.out.println("Error, location is not valid, please check your spelling or locations table.");
+//
+//                return;
+//            }
+//            String toBeApprovedLocationTown=unapprovedLocations.get(unapporvedLocationsListIndex).getLocationPlace();
+//            int tableLocationIDOfInputtedLocation= getLocationTableIDValue(allLocations, locationsName);
+//            LocationsCoordinates unapprovedLocation= new LocationsCoordinates(tableLocationIDOfInputtedLocation,latCoords, longCoords);
+//            boolean locationWithinTownBoundaries= checkInputtedCoordsMatchTown(Double.toString(latCoords) ,Double.toString(longCoords), toBeApprovedLocationTown);
+//            if (locationWithinTownBoundaries){
+//                addLocationCoord(unapprovedLocation);
+//                return;
+//
+//
+//            } else {
+//                return;}
+//
+////            for (TownWithTrails town : allTowns){
+////                if (Objects.equals(toBeApprovedLocationTown, town.getTownName())){
+//
+//
+//                }
+//
+//            }
+
+
+
+
+           // check if location within respective town boundaries
+        }
+
+
+
+
+
+
+        /// if location id == unapproved location id,-> make sure coords within boundaries, -> approve and append lcoations table and add to coords table.
+
+//        List<String> unapprovedLocationTowns = new ArrayList<String>();
+//        for (int i=1;unapprovedLocations.size()>i;i++ ){
+//            if (Objects.equals(unapprovedLocations.get(i).getLocationPlace(), town)){
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+//        }
+//
+////
+//        // unapproved list
+//        // if matches name, approve
+//        // add long/lat coords
+//        //use to update table
+//    }
+//}
diff --git a/src/main/java/Team5/SmartTowns/placeswithcoordinates/TownWithTrails.java b/src/main/java/Team5/SmartTowns/placeswithcoordinates/TownWithTrails.java
new file mode 100644
index 0000000000000000000000000000000000000000..b1049ffb389b893401af7e199fc771478f4317d2
--- /dev/null
+++ b/src/main/java/Team5/SmartTowns/placeswithcoordinates/TownWithTrails.java
@@ -0,0 +1,51 @@
+package Team5.SmartTowns.placeswithcoordinates;
+
+public class TownWithTrails {
+
+    private String townName;
+    private String townCentreCoordsLat;
+    private String townCentreCoordsLong;
+    private String townUppermostCoordsLat;
+    private String townLowermostCoordsLat;
+    private String townLeftmostCoordsLong;
+    private String townRightmostCoordsLong;
+
+    public String getTownName() {
+        return townName;
+    }
+
+    public String getTownCentreCoordsLat() {
+        return townCentreCoordsLat;
+    }
+
+    public String getTownCentreCoordsLong() {
+        return townCentreCoordsLong;
+    }
+
+    public String getTownUppermostCoordsLat() {
+        return townUppermostCoordsLat;
+    }
+
+    public String getTownLowermostCoordsLat() {
+        return townLowermostCoordsLat;
+    }
+
+    public String getTownLeftmostCoordsLong() {
+        return townLeftmostCoordsLong;
+    }
+
+    public String getTownRightmostCoordsLong() {
+        return townRightmostCoordsLong;
+    }
+
+
+    public TownWithTrails(String townName, String townCentreCoordsLat, String townCentreCoordsLong, String townUppermostCoordsLat, String townLowermostCoordsLat, String townLeftmostCoordsLong, String townRightmostCoordsLong) {
+        this.townName = townName;
+        this.townCentreCoordsLat = townCentreCoordsLat;
+        this.townCentreCoordsLong = townCentreCoordsLong;
+        this.townUppermostCoordsLat = townUppermostCoordsLat;
+        this.townLowermostCoordsLat = townLowermostCoordsLat;
+        this.townLeftmostCoordsLong = townLeftmostCoordsLong;
+        this.townRightmostCoordsLong = townRightmostCoordsLong;
+    }
+}
diff --git a/src/main/java/Team5/SmartTowns/rewards/Badge.java b/src/main/java/Team5/SmartTowns/rewards/Badge.java
index 25c231e14e3f0afdd4ecfc2d6e9f352925224097..976238804f5686bfd77e2bd028f7cc79ecf18698 100644
--- a/src/main/java/Team5/SmartTowns/rewards/Badge.java
+++ b/src/main/java/Team5/SmartTowns/rewards/Badge.java
@@ -1,51 +1,26 @@
 /*AUTHOR: Gabriel Copat*/
 package Team5.SmartTowns.rewards;
 
-import lombok.Data;
+import lombok.Getter;
 
-import java.io.File;
-import java.util.Objects;
 
-@Data
-public class Badge {
+@Getter
+public class Badge extends Reward {
     /* Badges can be earned by completing certain goals.
      * They are displayed in the user profile page
      *
      * For example, one might earn a badge after visiting 20 locations */
+    static final String DEFAULT_IMAGE = "0.png";
 
-    int id;
-    String name;
-    String description;
-    String imgPath;
     int difficulty; //1-5
 
     public Badge(int id, String name, String description, int difficulty) {
-        this.id = id;
-        this.name = name;
-        this.description = description;
+        super(id, name, description);
         this.difficulty = difficulty;
-        imgPath = findImagePath();
-    }
-
-    private String findImagePath(){
-        /* Finds the image in the Path folder, if image is not found assigns default image */
-        String imgPath = "images/rewards/badges/" + id + ".jpg";
-        String notFoundPath = "/images/rewards/badges/0.png";
-
-        File imgFile = new File("src/main/resources/static/" + imgPath);
-        return imgFile.exists() ? imgPath : notFoundPath;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-        Badge badge = (Badge) o;
-        return id == badge.id && Objects.equals(name, badge.name);
     }
 
     @Override
-    public int hashCode() {
-        return Objects.hash(id, name);
+    public String getImgFolder() {
+        return "badges";
     }
 }
diff --git a/src/main/java/Team5/SmartTowns/rewards/BadgesRepository.java b/src/main/java/Team5/SmartTowns/rewards/BadgesRepository.java
deleted file mode 100644
index 56b1019cbe016a7c687b5ac83973679e8f498eef..0000000000000000000000000000000000000000
--- a/src/main/java/Team5/SmartTowns/rewards/BadgesRepository.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//Holds locations data repository
-package Team5.SmartTowns.rewards;
-
-import java.util.List;
-
-public interface BadgesRepository {
-    List<Badge> getAllBadges();
-}
-
diff --git a/src/main/java/Team5/SmartTowns/rewards/BadgesRepositoryJDBC.java b/src/main/java/Team5/SmartTowns/rewards/BadgesRepositoryJDBC.java
deleted file mode 100644
index 7c22061e894a633bf9c047f69f575daf9366b493..0000000000000000000000000000000000000000
--- a/src/main/java/Team5/SmartTowns/rewards/BadgesRepositoryJDBC.java
+++ /dev/null
@@ -1,33 +0,0 @@
-//Implements the locations repository using JDBC
-package Team5.SmartTowns.rewards;
-
-import org.springframework.jdbc.core.JdbcTemplate;
-import org.springframework.jdbc.core.RowMapper;
-import org.springframework.stereotype.Repository;
-
-import java.util.List;
-
-@Repository
-public class BadgesRepositoryJDBC implements BadgesRepository {
-    private JdbcTemplate jdbc;
-    private RowMapper<Badge> badgeMapper;
-
-    public BadgesRepositoryJDBC(JdbcTemplate aJdbc) {
-        this.jdbc = aJdbc;
-        setBadgeMapper();
-    }
-    private void setBadgeMapper(){
-        badgeMapper = (rs, i) -> new Badge(
-                rs.getInt("badgeID"),
-                rs.getString("name"),
-                rs.getString("description"),
-                rs.getInt("difficulty")
-        );
-    }
-
-    @Override
-    public List<Badge> getAllBadges(){
-        String sql= "SELECT * FROM badges";
-        return jdbc.query(sql, badgeMapper);
-    }
-}
diff --git a/src/main/java/Team5/SmartTowns/rewards/Pack.java b/src/main/java/Team5/SmartTowns/rewards/Pack.java
new file mode 100644
index 0000000000000000000000000000000000000000..ef7fe7409f6e4fdfee3494a0dc932981df2c6907
--- /dev/null
+++ b/src/main/java/Team5/SmartTowns/rewards/Pack.java
@@ -0,0 +1,28 @@
+package Team5.SmartTowns.rewards;
+
+import lombok.Getter;
+
+import java.util.List;
+
+@Getter
+public class Pack extends Reward{
+
+    int progression; //0-100%;
+
+    public Pack(int id, String name, String description) {
+        super(id, name, description);
+        displayImg = super.findImagePath();
+    }
+
+    public void setProgression(List<Sticker> packStickers, List<Sticker> userStickers){
+        /* Takes in a list with all stickers in the pack and a list with all userStickers from the pack
+        *  These lists are taken from database in the Controllers via SQL query*/
+        int totalAmount = packStickers.size();
+        int hasAmount = userStickers.size();
+        progression = (int) ((totalAmount/hasAmount) * 100);
+    }
+    @Override
+    public String getImgFolder() {
+        return "packs";
+    }
+}
diff --git a/src/main/java/Team5/SmartTowns/rewards/Reward.java b/src/main/java/Team5/SmartTowns/rewards/Reward.java
new file mode 100644
index 0000000000000000000000000000000000000000..0a2d9145817a6e6935e5cc7dca283c47c491ee53
--- /dev/null
+++ b/src/main/java/Team5/SmartTowns/rewards/Reward.java
@@ -0,0 +1,37 @@
+package Team5.SmartTowns.rewards;
+
+import lombok.Getter;
+
+import java.io.File;
+
+@Getter
+public abstract class Reward {
+    /* Abstract class for all rewards */
+
+    int id;
+    String displayImg; //Path to the image file
+    String name;
+    String description;
+
+    public Reward(int id, String name, String description) {
+        //Default constructor
+        this.id = id;
+        this.name = name;
+        this.description = description;
+    }
+
+    public abstract String getImgFolder();
+    /*Returns folder in which images are located*/
+
+    public String getDefaultImg(){
+        /*Returns the name of the default image to be used in case no image is found*/
+        return "0.png";
+    }
+    public String findImagePath(){
+        /* Finds the image in the Path folder, if image is not found assigns default image */
+        String imgPath = "images/rewards/" + getImgFolder() + "/" + id + ".png";
+        String notFoundPath = "images/rewards/" + getImgFolder() + "/" + getDefaultImg();
+        File imgFile = new File("src/main/resources/static/" + imgPath);
+        return imgFile.exists() ? imgPath : notFoundPath;
+    }
+}
diff --git a/src/main/java/Team5/SmartTowns/rewards/RewardsController.java b/src/main/java/Team5/SmartTowns/rewards/RewardsController.java
deleted file mode 100644
index af9d33cba34dd12ac6aa5ca1e54320b8124af9d4..0000000000000000000000000000000000000000
--- a/src/main/java/Team5/SmartTowns/rewards/RewardsController.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package Team5.SmartTowns.rewards;
-
-import org.springframework.stereotype.Controller;
-
-@Controller
-public class RewardsController {
-}
diff --git a/src/main/java/Team5/SmartTowns/rewards/RewardsRepository.java b/src/main/java/Team5/SmartTowns/rewards/RewardsRepository.java
new file mode 100644
index 0000000000000000000000000000000000000000..51bde7f297613873b38b0eec939f58d9c1dc1acd
--- /dev/null
+++ b/src/main/java/Team5/SmartTowns/rewards/RewardsRepository.java
@@ -0,0 +1,18 @@
+//Holds locations data repository
+package Team5.SmartTowns.rewards;
+
+import java.util.List;
+
+public interface RewardsRepository {
+    List<Sticker> getAllStickers();
+
+    List<Sticker> getAllStickersFromPack(int packID);
+
+    List<Sticker> getAllStickersFromUser(int userID);
+
+    List<Pack> getAllPacks();
+
+    Pack findPackByID(int id);
+
+}
+
diff --git a/src/main/java/Team5/SmartTowns/rewards/RewardsRepositoryJDBC.java b/src/main/java/Team5/SmartTowns/rewards/RewardsRepositoryJDBC.java
new file mode 100644
index 0000000000000000000000000000000000000000..65eaa9843ec3af33e994ea34ed8d219ce712ffaf
--- /dev/null
+++ b/src/main/java/Team5/SmartTowns/rewards/RewardsRepositoryJDBC.java
@@ -0,0 +1,73 @@
+//Implements the locations repository using JDBC
+package Team5.SmartTowns.rewards;
+
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.RowMapper;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public class RewardsRepositoryJDBC implements RewardsRepository {
+    private final JdbcTemplate jdbc;
+    private RowMapper<Badge> badgeMapper;
+    private RowMapper<Sticker> stickerMapper;
+    private RowMapper<Pack> packMapper;
+
+    public RewardsRepositoryJDBC(JdbcTemplate aJdbc) {
+        this.jdbc = aJdbc;
+        setStickerMapper();
+        setPackMapper();
+    }
+
+    private void setStickerMapper(){
+        stickerMapper = (rs, i) -> new Sticker(
+                rs.getInt("packID"),
+                rs.getInt("stickerID"),
+                rs.getString("name"),
+                rs.getString("description"),
+                rs.getInt("rarity")
+        );
+    }
+    private void setPackMapper(){
+        packMapper = (rs, i) -> new Pack(
+                rs.getInt("id"),
+                rs.getString("name"),
+                rs.getString("description")
+        );
+    }
+
+    @Override
+    public List<Sticker> getAllStickers(){
+        String sql= "SELECT * FROM stickers";
+        return jdbc.query(sql, stickerMapper);
+    }
+
+    @Override
+    public List<Pack> getAllPacks() {
+        String sql= "SELECT * FROM packs";
+        return jdbc.query(sql, packMapper);
+    }
+
+    @Override
+    public List<Sticker> getAllStickersFromPack(int packID){
+        String sql= "SELECT * FROM stickers WHERE packID="+packID;
+        return jdbc.query(sql, stickerMapper);
+    }
+
+    @Override
+    public List<Sticker> getAllStickersFromUser(int userID) {
+        /* FINDS ALL STICKERS UNLOCKED BY THE GIVEN USER */
+        String sql= "SELECT * FROM stickers LEFT JOIN stickerprogress " +
+                "ON (stickers.id, stickers.packID) = (stickerprogress.stickerID, stickerprogress.packID) " +
+                "WHERE stickerprogress.userID="+userID;
+        return jdbc.query(sql, stickerMapper);
+    }
+
+    @Override
+    public Pack findPackByID(int id){
+        String sql= "SELECT * FROM packs WHERE id="+id;
+        List<Pack> result = jdbc.query(sql, packMapper);
+        return result.isEmpty() ? null : result.get(0);
+    }
+}
diff --git a/src/main/java/Team5/SmartTowns/rewards/Sticker.java b/src/main/java/Team5/SmartTowns/rewards/Sticker.java
index 4fa498c61e7d5748e7d6dcfc26c7c6442dfd8cc4..7e5315c651bea73aa31572856710b21bbc25457b 100644
--- a/src/main/java/Team5/SmartTowns/rewards/Sticker.java
+++ b/src/main/java/Team5/SmartTowns/rewards/Sticker.java
@@ -1,37 +1,29 @@
 /*AUTHOR: Gabriel Copat*/
 package Team5.SmartTowns.rewards;
 
-import lombok.Data;
+import lombok.Getter;
 
-import java.io.File;
-import java.util.Objects;
 
-@Data
-public class Sticker {
-    /* Stickers are trade-able rewards, they vary in rarity and are earned at random */
+@Getter
+public class Sticker extends Reward{
+    /* Stickers are randomly earned rewards from a specific pack */
+
+    final int rarity; //1-5
+    final int packID;
 
-    int id;
-    String name;
-    String description;
-    String imgPath;
-    int rarity; //1-5
     boolean hasSticker;
 
-    public Sticker(int id, String name, String description, int rarity) {
-        this.id = id;
-        this.name = name;
-        this.description = description;
+
+    public Sticker(int packID, int id, String name, String description, int rarity) {
+        super(id, name, description);
         this.rarity = rarity;
-        imgPath = findImagePath();
+        this.packID = packID;
+        displayImg = super.findImagePath();
     }
 
-    private String findImagePath(){
-        /* Finds the image in the Path folder, if image is not found assigns default image */
-        String imgPath = "images/rewards/stickers/" + id + ".jpg";
-        String notFoundPath = "images/rewards/stickers/0.png";
-
-        File imgFile = new File("src/main/resources/static/" + imgPath);
-        return imgFile.exists() ? imgPath : notFoundPath;
+    @Override
+    public String getImgFolder() {
+        return "stickers/" + getPackID();
     }
 
     public boolean hasSticker(){
@@ -41,21 +33,7 @@ public class Sticker {
         this.hasSticker = hasSticker;
     }
     public String getVisibility(){
-        return hasSticker? "" : "grayedOut";
-    }
-
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-        Sticker sticker = (Sticker) o;
-        return id == sticker.id && Objects.equals(name, sticker.name);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(id, name);
+        return hasSticker ? "gotSticker" : "grayedSticker";
     }
 }
 
diff --git a/src/main/java/Team5/SmartTowns/rewards/StickersRepository.java b/src/main/java/Team5/SmartTowns/rewards/StickersRepository.java
deleted file mode 100644
index 869c2d07353a7aa090fb7fee79b2d44feacd9b12..0000000000000000000000000000000000000000
--- a/src/main/java/Team5/SmartTowns/rewards/StickersRepository.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//Holds locations data repository
-package Team5.SmartTowns.rewards;
-
-import java.util.List;
-
-public interface StickersRepository {
-    List<Sticker> getAllStickers();
-}
-
diff --git a/src/main/java/Team5/SmartTowns/rewards/StickersRepositoryJDBC.java b/src/main/java/Team5/SmartTowns/rewards/StickersRepositoryJDBC.java
deleted file mode 100644
index 64df71bc3da3eff327377798185111aee3be7867..0000000000000000000000000000000000000000
--- a/src/main/java/Team5/SmartTowns/rewards/StickersRepositoryJDBC.java
+++ /dev/null
@@ -1,33 +0,0 @@
-//Implements the locations repository using JDBC
-package Team5.SmartTowns.rewards;
-
-import org.springframework.jdbc.core.JdbcTemplate;
-import org.springframework.jdbc.core.RowMapper;
-import org.springframework.stereotype.Repository;
-
-import java.util.List;
-
-@Repository
-public class StickersRepositoryJDBC implements StickersRepository {
-    private JdbcTemplate jdbc;
-    private RowMapper<Sticker> stickerMapper;
-
-    public StickersRepositoryJDBC(JdbcTemplate aJdbc) {
-        this.jdbc = aJdbc;
-        setStickerMapper();
-    }
-    private void setStickerMapper(){
-        stickerMapper = (rs, i) -> new Sticker(
-                rs.getInt("stickerID"),
-                rs.getString("name"),
-                rs.getString("description"),
-                rs.getInt("rarity")
-        );
-    }
-
-    @Override
-    public List<Sticker> getAllStickers(){
-        String sql= "SELECT * FROM stickers";
-        return jdbc.query(sql, stickerMapper);
-    }
-}
diff --git a/src/main/java/Team5/SmartTowns/Towns/TownController.java b/src/main/java/Team5/SmartTowns/towns/TownController.java
similarity index 94%
rename from src/main/java/Team5/SmartTowns/Towns/TownController.java
rename to src/main/java/Team5/SmartTowns/towns/TownController.java
index aa15a341da7fe2ef346f5278ae1a55faaa3136fc..9063712be2de660379c504bb064254367dcaa3d8 100644
--- a/src/main/java/Team5/SmartTowns/Towns/TownController.java
+++ b/src/main/java/Team5/SmartTowns/towns/TownController.java
@@ -1,4 +1,4 @@
-package Team5.SmartTowns.Towns;
+package Team5.SmartTowns.towns;
 
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
diff --git a/src/main/java/Team5/SmartTowns/towns/TownStorage.java b/src/main/java/Team5/SmartTowns/towns/TownStorage.java
new file mode 100644
index 0000000000000000000000000000000000000000..988a20223b33d27fbccab94007a1efb6e3088bbb
--- /dev/null
+++ b/src/main/java/Team5/SmartTowns/towns/TownStorage.java
@@ -0,0 +1,44 @@
+package Team5.SmartTowns.towns;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class TownStorage {
+    private List<Towns> townList;
+    private static TownStorage singleton;
+
+    TownStorage() {
+        townList = new ArrayList<>();
+        townList.addAll(
+          List.of(
+                  new Towns("Caerphilly",01,3,70,"/images/banners/CaerphillyCastle.jpg"),
+                  new Towns("Risca",02,2,34,"/images/banners/RiscaBanner.jpg"),
+                  new Towns("Penarth",03,5,0,"/images/banners/PenarthBanner.jpg"),
+                  new Towns("Penarth",03,5,50,"/images/banners/PenarthBanner.jpg"),
+                  new Towns("Caerphilly",01,3,70,"/images/banners/CaerphillyCastle.jpg"),
+                  new Towns("Risca",02,2,90,"/images/banners/RiscaBanner.jpg"),
+                  new Towns("Penarth",03,5,100,"/images/banners/PenarthBanner.jpg")
+
+
+
+          )
+
+        );
+
+    }
+    public static TownStorage getInstance() {
+        if (singleton == null) {
+            singleton = new TownStorage();
+
+        }
+        return singleton;
+    }
+
+    public List<Towns> getTownList() {
+        return townList;
+    }
+
+
+
+
+}
diff --git a/src/main/java/Team5/SmartTowns/Towns/Towns.java b/src/main/java/Team5/SmartTowns/towns/Towns.java
similarity index 97%
rename from src/main/java/Team5/SmartTowns/Towns/Towns.java
rename to src/main/java/Team5/SmartTowns/towns/Towns.java
index a1b103f7abf6aa4379d877c645185f2c522a25ba..ebe6fd4797c205ace803727026e64837a2af93e6 100644
--- a/src/main/java/Team5/SmartTowns/Towns/Towns.java
+++ b/src/main/java/Team5/SmartTowns/towns/Towns.java
@@ -1,4 +1,4 @@
-package Team5.SmartTowns.Towns;
+package Team5.SmartTowns.towns;
 
 import lombok.Data;
 
diff --git a/src/main/java/Team5/SmartTowns/trails/TrailsController.java b/src/main/java/Team5/SmartTowns/trails/TrailsController.java
index c91c7abb4f64270f948d4313070adf47b08c07c8..c6472019b4e17f3ff6aa4c60188ad524bfc10010 100644
--- a/src/main/java/Team5/SmartTowns/trails/TrailsController.java
+++ b/src/main/java/Team5/SmartTowns/trails/TrailsController.java
@@ -1,19 +1,19 @@
 package Team5.SmartTowns.trails;
 
 
-import Team5.SmartTowns.Landmarks.Landmarks;
+import Team5.SmartTowns.landmarks.Landmarks;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.*;
 import org.springframework.web.servlet.ModelAndView;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 
-import static Team5.SmartTowns.Landmarks.Landmarks.getLandmarksDragonstrail;
+import static Team5.SmartTowns.landmarks.Landmarks.landmarksDragonstrail;
+
+//import static Team5.SmartTowns.Landmarks.Landmarks.landmarksDragonstrail;
 
 @Controller
 public class TrailsController {
@@ -40,21 +40,22 @@ public class TrailsController {
 
     @GetMapping("/dragonstale")
     public ModelAndView getDragonsTale(){
-        List<Landmarks> landmarksList = getLandmarksDragonstrail();
-        Landmarks landmarks = new Landmarks();
-        int listSize = landmarksList.size();
+        List<Landmarks> landmarksList = landmarksDragonstrail;
         ModelAndView modelAndView = new ModelAndView("towns/trails/dragonstale/index");
         modelAndView.addObject("landmarksList", landmarksList);
-        modelAndView.addObject("getListSize", listSize);
         return modelAndView;
     }
 
-//    @GetMapping("/dragonstale/{landmarks}")
-//    public ModelAndView getDragonstaleLandmarks(){
-//        ModelAndView modelAndView = new ModelAndView();
-//        modelAndView.addObject()
-//    }
 
+    //
+//    @GetMapping("dragonstale/{qrCode}/{id}")
+//    public String qrCodeCheck(@PathVariable Optional<String> qrCode, @PathVariable Optional<Integer> id){
+//        if (qrCode.isPresent()){
+//
+//            //Check if ID is present, if do this, if not dfo that.
+//
+//        }
+//    }
 
 }
 
diff --git a/src/main/java/Team5/SmartTowns/users/User.java b/src/main/java/Team5/SmartTowns/users/User.java
index 84887664fbee090abb68281f28b5f2b0832af9ae..4ef65c3b288f9433e37d60e8e984b869f3a8d53e 100644
--- a/src/main/java/Team5/SmartTowns/users/User.java
+++ b/src/main/java/Team5/SmartTowns/users/User.java
@@ -5,20 +5,20 @@ import Team5.SmartTowns.rewards.Sticker;
 import lombok.Data;
 
 import java.io.File;
+import java.sql.Connection;
+import java.sql.DriverManager;
 import java.util.HashMap;
 import java.util.Map;
 
 @Data
 public class User {
-
     int id;
     String email; //Validation would be done by email, since they will have that
     String name;
     String imgPath;
     int dragonProgress;
-
-    Map<Badge, Integer> badgeProgress = new HashMap<>(); // Demonstrates the progress towards a specific badge (0-100)
     Map<Sticker, Boolean> hasStickers = new HashMap<>(); // True if User has sticker (key)
+    Map<Integer, Boolean> dragonstaleLandmarkIDs = new HashMap<>(); // Storing the IDs of the landmarks associated with Dragonstale, as well as if the user has visited it before (boolean)
 
     public User(int id, String email, String name, int dragonProgress) {
         this.id = id;
@@ -27,7 +27,12 @@ public class User {
         this.dragonProgress = dragonProgress;
         imgPath = findImagePath();
     }
-
+    public User(int id, String email, String name) {
+        this.id = id;
+        this.email = email;
+        this.name = name;
+        imgPath = findImagePath();
+    }
 
     private String findImagePath(){
         /* Finds the image in the Path folder, if image is not found assigns default image */
diff --git a/src/main/java/Team5/SmartTowns/users/UserController.java b/src/main/java/Team5/SmartTowns/users/UserController.java
index d635c8a401d85ef6d930142882d69b5528f38fd7..989d13b7161f783dc75bdcb9dbf379808b1584e4 100644
--- a/src/main/java/Team5/SmartTowns/users/UserController.java
+++ b/src/main/java/Team5/SmartTowns/users/UserController.java
@@ -1,10 +1,9 @@
 package Team5.SmartTowns.users;
 
 
-import Team5.SmartTowns.rewards.Badge;
-import Team5.SmartTowns.rewards.BadgesRepository;
+import Team5.SmartTowns.rewards.Pack;
+import Team5.SmartTowns.rewards.RewardsRepository;
 import Team5.SmartTowns.rewards.Sticker;
-import Team5.SmartTowns.rewards.StickersRepository;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -12,7 +11,6 @@ import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.servlet.ModelAndView;
 
 import java.util.List;
-import java.util.Map;
 
 @Controller
 public class UserController {
@@ -20,13 +18,11 @@ public class UserController {
     @Autowired
     private UserRepository userRepository;
     @Autowired
-    private BadgesRepository badgesRepository;
-    @Autowired
-    private StickersRepository stickersRepository;
+    private RewardsRepository rewardsRepository;
 
     @GetMapping("/login")
     public ModelAndView getLoginPage() {
-        ModelAndView mav = new ModelAndView("rewards/login");
+        ModelAndView mav = new ModelAndView("users/login");
 //        List<User> users = userRepository.getAllUsers();
 //        mav.addObject("users", users);
         return mav;
@@ -42,21 +38,52 @@ public class UserController {
 
     @GetMapping("/user/{id}")
     public ModelAndView getUserPage(@PathVariable int id) {
-        ModelAndView mav = new ModelAndView("rewards/userProfile");
-        List<Badge> badges = badgesRepository.getAllBadges(); /*DEPRECATED FOR THE MOMENT*/
-        mav.addObject("badges", badges);
-        List<Sticker> allStickers = stickersRepository.getAllStickers();
-        List<User> users = userRepository.getAllUsers();
-        Map<Long, Boolean> userStickers = userRepository.getStickers(id);
+        ModelAndView mav = new ModelAndView("users/userProfile");
+        List<Pack> allPacks = rewardsRepository.getAllPacks();
+        mav.addObject("user", userRepository.getUserById(id));
+        mav.addObject("packs", allPacks);
 
-        for (Long stickerID : userStickers.keySet()) { //Finds and updates visibility of stickers based on what the user has
-            allStickers.stream()
-                    .filter(sticker -> sticker.getId()==stickerID)
-                    .findFirst().ifPresent(sticker -> sticker.setVisibility(userStickers.get(stickerID)));
-        }
+        mav.addAllObjects(getPackInfo(id, 1).getModelMap());
 
-        mav.addObject("user", userRepository.getUser(id));
-        mav.addObject("stickers", allStickers);
         return mav;
     }
+
+    @GetMapping("/packInfo/{userID}/{packID}")
+    public ModelAndView getPackInfo(@PathVariable int userID, @PathVariable int packID) {
+        /* Displays on page the stickers present in the pack and colour the ones the
+        *  user has acquired */
+
+        ModelAndView mav = new ModelAndView("users/userFrags :: stickersBox");
+        List<Sticker> allStickers = rewardsRepository.getAllStickersFromPack(packID);
+        List<Long> userStickers = userRepository.getUserStickersFromPack(userID, packID);
+
+
+
+        mav.addObject("stickers", setStickerVisibility(allStickers, userStickers));
+        mav.addObject("progress", getPackProgress(allStickers));
+        mav.addObject("selectedPack", rewardsRepository.findPackByID(packID));
+        return mav;
+    }
+
+    public int getPackProgress(List<Sticker> userStickers){
+        /* Returns the % of completion of given userStickers */
+        double progress = 0;
+        if (!userStickers.isEmpty()) {
+            progress = userStickers.stream().filter(Sticker::hasSticker).count();
+            progress = progress / userStickers.size();
+            progress = Math.round(progress * 100);
+        }
+        return (int) progress;
+    }
+
+    public List<Sticker> setStickerVisibility(List<Sticker> displayedStickers, List<Long> userStickers){
+        /* Makes displayedStickers which are present in userStickers visible */
+        for (Long stickerID : userStickers) {
+            displayedStickers.stream()
+                    .filter(sticker -> sticker.getId()==stickerID) //Tries to find matching id from the two lists
+                    .findFirst().ifPresent(sticker -> sticker.setVisibility(true));
+        }
+        return displayedStickers;
+    }
+
 }
diff --git a/src/main/java/Team5/SmartTowns/users/UserRepository.java b/src/main/java/Team5/SmartTowns/users/UserRepository.java
index 9f4e828f17c231179df1a9fcd6a87cc5c8cf75b6..f0f01269786128dd9afaa8d3becd5b3ada4944fa 100644
--- a/src/main/java/Team5/SmartTowns/users/UserRepository.java
+++ b/src/main/java/Team5/SmartTowns/users/UserRepository.java
@@ -2,11 +2,10 @@
 package Team5.SmartTowns.users;
 
 import java.util.List;
-import java.util.Map;
 
 public interface UserRepository {
     List<User> getAllUsers();
-//    Map<Long, Integer> getBadgeProgress(int id);
-    Map<Long, Boolean> getStickers(int id);
-    User getUser(int id);
+    List<Long> getUserStickersFromPack(int userID, int packID);
+    User getUserById(int userID);
+    boolean unlockSticker(int userID, int packID, int stickerID);
 }
diff --git a/src/main/java/Team5/SmartTowns/users/UserRepositoryJDBC.java b/src/main/java/Team5/SmartTowns/users/UserRepositoryJDBC.java
index 9b24461d06d300172d904272edf0cc20c51b99f0..8b46fc3a568455e91c180b66fc91b65f20d20c81 100644
--- a/src/main/java/Team5/SmartTowns/users/UserRepositoryJDBC.java
+++ b/src/main/java/Team5/SmartTowns/users/UserRepositoryJDBC.java
@@ -5,14 +5,11 @@ import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.core.RowMapper;
 import org.springframework.stereotype.Repository;
 
-import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 
 @Repository
 public class UserRepositoryJDBC implements UserRepository{
-
     private JdbcTemplate jdbc;
     private RowMapper<User> userMapper;
 
@@ -21,13 +18,11 @@ public class UserRepositoryJDBC implements UserRepository{
         setUserMapper();
     }
 
-
     private void setUserMapper(){
         userMapper = (rs, i) -> new User(
-                rs.getInt("userID"),
+                rs.getInt("id"),
                 rs.getString("email"),
-                rs.getString("name"),
-                rs.getInt("dragonProgress")
+                rs.getString("name")
         );
     }
 
@@ -37,33 +32,25 @@ public class UserRepositoryJDBC implements UserRepository{
         return jdbc.query(sql, userMapper);
     }
 
+
     @Override
-    public User getUser(int id){
-        String sql= "SELECT * FROM users WHERE userID="+id;
+    public User getUserById(int userID){
+        String sql= "SELECT * FROM users WHERE id="+userID;
         List<User> result = jdbc.query(sql, userMapper);
-        return result.get(0);
+        return result.isEmpty() ? null : result.get(0);
     }
 
     @Override
-    public Map<Long, Boolean> getStickers(int id){
-        String sql = "SELECT stickerID, hasSticker FROM stickerprogress WHERE userID=" + id;
-        List<Map<String, Object>> query = jdbc.queryForList(sql);
-        Map<Long, Boolean> progress = new HashMap<>();
-        for (Map<String, Object> result : query) {
-            progress.put((Long)result.get("stickerID"), (boolean)result.get("hasSticker"));
-        }
-        return progress;
+    public List<Long> getUserStickersFromPack(int userID, int packID) {
+        String sql = "SELECT stickerID FROM stickerprogress WHERE (userID, packID)= (" + userID + "," + packID + ")";
+        return jdbc.queryForList(sql, Long.class);
     }
 
-
-//    @Override
-//    public Map<Long, Integer> getBadgeProgress(int id){
-//        String sql = "SELECT badgeID, progress FROM badgeprogress WHERE userID=" + id;
-//        List<Map<String, Object>> query = jdbc.queryForList(sql);
-//        Map<Long, Integer> progress = new HashMap<>();
-//        for (Map<String, Object> result : query) {
-//            progress.put((Long)result.get("badgeID"), (int)result.get("progress"));
-//        }
-//        return progress;
-//    }
+    @Override
+    public boolean unlockSticker(int userID, int packID, int stickerID){
+        String sql = "INSERT INTO stickerprogress (userID, packID, stickerID) VALUES (" +
+                userID + ", " + packID + "," + stickerID + ")";
+        jdbc.update(sql);
+        return true;
+    }
 }
diff --git a/src/main/java/Team5/SmartTowns/Webpages/WebpageController.java b/src/main/java/Team5/SmartTowns/webpages/WebpageController.java
similarity index 81%
rename from src/main/java/Team5/SmartTowns/Webpages/WebpageController.java
rename to src/main/java/Team5/SmartTowns/webpages/WebpageController.java
index 37a30366e5335d1870c202d1a49b4a5d2bca474d..dcc9a14af56d65780dafcb02e92a90e3fce483a2 100644
--- a/src/main/java/Team5/SmartTowns/Webpages/WebpageController.java
+++ b/src/main/java/Team5/SmartTowns/webpages/WebpageController.java
@@ -1,4 +1,4 @@
-package Team5.SmartTowns.Webpages;
+package Team5.SmartTowns.webpages;
 
 
 import org.springframework.ui.Model;
@@ -27,6 +27,13 @@ public class WebpageController {
         return modelAndView;
     }
 
+
+    @GetMapping("/maps")
+    public ModelAndView getMapTestAPI(){
+        ModelAndView modelAndView = new ModelAndView("Towns/mapsTest/index");
+        return modelAndView;
+    }
+
 //    @GetMapping("/home")
 //    public ModelAndView getHome(){
 //        ModelAndView modelAndView = new ModelAndView("Towns/home/homePage");
@@ -34,12 +41,10 @@ public class WebpageController {
 //    }
 
 
-    @RequestMapping(value="/test_ajax_frag", method=RequestMethod.POST)
-    public String sendHtmlFragment(Model map) {
-        //map.addAttribute("foo", "bar");
-        return "fragments/temp_frags.html :: trailInfo2";
+
     }
 
 
 
-}
+
+
diff --git a/src/main/node_modules/.package-lock.json b/src/main/node_modules/.package-lock.json
new file mode 100644
index 0000000000000000000000000000000000000000..c771511d25e96ca1a3c94f9d7d788bf956e3f0e2
--- /dev/null
+++ b/src/main/node_modules/.package-lock.json
@@ -0,0 +1,13 @@
+{
+  "name": "main",
+  "version": "1.0.0",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "node_modules/html5-qrcode": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmjs.org/html5-qrcode/-/html5-qrcode-2.3.8.tgz",
+      "integrity": "sha512-jsr4vafJhwoLVEDW3n1KvPnCCXWaQfRng0/EEYk1vNcQGcG/htAdhJX0be8YyqMoSz7+hZvOZSTAepsabiuhiQ=="
+    }
+  }
+}
diff --git a/src/main/node_modules/html5-qrcode/LICENSE b/src/main/node_modules/html5-qrcode/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/README.md b/src/main/node_modules/html5-qrcode/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/camera/core-impl.d.ts b/src/main/node_modules/html5-qrcode/camera/core-impl.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/camera/core.d.ts b/src/main/node_modules/html5-qrcode/camera/core.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/camera/factories.d.ts b/src/main/node_modules/html5-qrcode/camera/factories.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/camera/permissions.d.ts b/src/main/node_modules/html5-qrcode/camera/permissions.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/camera/retriever.d.ts b/src/main/node_modules/html5-qrcode/camera/retriever.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/camera/core-impl.d.ts b/src/main/node_modules/html5-qrcode/cjs/camera/core-impl.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/camera/core-impl.js b/src/main/node_modules/html5-qrcode/cjs/camera/core-impl.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/camera/core-impl.js.map b/src/main/node_modules/html5-qrcode/cjs/camera/core-impl.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/camera/core.d.ts b/src/main/node_modules/html5-qrcode/cjs/camera/core.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/camera/core.js b/src/main/node_modules/html5-qrcode/cjs/camera/core.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/camera/core.js.map b/src/main/node_modules/html5-qrcode/cjs/camera/core.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/camera/factories.d.ts b/src/main/node_modules/html5-qrcode/cjs/camera/factories.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/camera/factories.js b/src/main/node_modules/html5-qrcode/cjs/camera/factories.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/camera/factories.js.map b/src/main/node_modules/html5-qrcode/cjs/camera/factories.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/camera/permissions.d.ts b/src/main/node_modules/html5-qrcode/cjs/camera/permissions.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/camera/permissions.js b/src/main/node_modules/html5-qrcode/cjs/camera/permissions.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/camera/permissions.js.map b/src/main/node_modules/html5-qrcode/cjs/camera/permissions.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/camera/retriever.d.ts b/src/main/node_modules/html5-qrcode/cjs/camera/retriever.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/camera/retriever.js b/src/main/node_modules/html5-qrcode/cjs/camera/retriever.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/camera/retriever.js.map b/src/main/node_modules/html5-qrcode/cjs/camera/retriever.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/code-decoder.d.ts b/src/main/node_modules/html5-qrcode/cjs/code-decoder.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/code-decoder.js b/src/main/node_modules/html5-qrcode/cjs/code-decoder.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/code-decoder.js.map b/src/main/node_modules/html5-qrcode/cjs/code-decoder.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/core.d.ts b/src/main/node_modules/html5-qrcode/cjs/core.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/core.js b/src/main/node_modules/html5-qrcode/cjs/core.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/core.js.map b/src/main/node_modules/html5-qrcode/cjs/core.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/experimental-features.d.ts b/src/main/node_modules/html5-qrcode/cjs/experimental-features.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/experimental-features.js b/src/main/node_modules/html5-qrcode/cjs/experimental-features.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/experimental-features.js.map b/src/main/node_modules/html5-qrcode/cjs/experimental-features.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/html5-qrcode-scanner.d.ts b/src/main/node_modules/html5-qrcode/cjs/html5-qrcode-scanner.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/html5-qrcode-scanner.js b/src/main/node_modules/html5-qrcode/cjs/html5-qrcode-scanner.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/html5-qrcode-scanner.js.map b/src/main/node_modules/html5-qrcode/cjs/html5-qrcode-scanner.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/html5-qrcode.d.ts b/src/main/node_modules/html5-qrcode/cjs/html5-qrcode.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/html5-qrcode.js b/src/main/node_modules/html5-qrcode/cjs/html5-qrcode.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/html5-qrcode.js.map b/src/main/node_modules/html5-qrcode/cjs/html5-qrcode.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/image-assets.d.ts b/src/main/node_modules/html5-qrcode/cjs/image-assets.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/image-assets.js b/src/main/node_modules/html5-qrcode/cjs/image-assets.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/image-assets.js.map b/src/main/node_modules/html5-qrcode/cjs/image-assets.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/index.d.ts b/src/main/node_modules/html5-qrcode/cjs/index.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/index.js b/src/main/node_modules/html5-qrcode/cjs/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/index.js.map b/src/main/node_modules/html5-qrcode/cjs/index.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/native-bar-code-detector.d.ts b/src/main/node_modules/html5-qrcode/cjs/native-bar-code-detector.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/native-bar-code-detector.js b/src/main/node_modules/html5-qrcode/cjs/native-bar-code-detector.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/native-bar-code-detector.js.map b/src/main/node_modules/html5-qrcode/cjs/native-bar-code-detector.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/state-manager.d.ts b/src/main/node_modules/html5-qrcode/cjs/state-manager.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/state-manager.js b/src/main/node_modules/html5-qrcode/cjs/state-manager.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/state-manager.js.map b/src/main/node_modules/html5-qrcode/cjs/state-manager.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/storage.d.ts b/src/main/node_modules/html5-qrcode/cjs/storage.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/storage.js b/src/main/node_modules/html5-qrcode/cjs/storage.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/storage.js.map b/src/main/node_modules/html5-qrcode/cjs/storage.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/strings.d.ts b/src/main/node_modules/html5-qrcode/cjs/strings.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/strings.js b/src/main/node_modules/html5-qrcode/cjs/strings.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/strings.js.map b/src/main/node_modules/html5-qrcode/cjs/strings.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/ui.d.ts b/src/main/node_modules/html5-qrcode/cjs/ui.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/ui.js b/src/main/node_modules/html5-qrcode/cjs/ui.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/ui.js.map b/src/main/node_modules/html5-qrcode/cjs/ui.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/ui/scanner/base.d.ts b/src/main/node_modules/html5-qrcode/cjs/ui/scanner/base.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/ui/scanner/base.js b/src/main/node_modules/html5-qrcode/cjs/ui/scanner/base.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/ui/scanner/base.js.map b/src/main/node_modules/html5-qrcode/cjs/ui/scanner/base.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/ui/scanner/camera-selection-ui.d.ts b/src/main/node_modules/html5-qrcode/cjs/ui/scanner/camera-selection-ui.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/ui/scanner/camera-selection-ui.js b/src/main/node_modules/html5-qrcode/cjs/ui/scanner/camera-selection-ui.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/ui/scanner/camera-selection-ui.js.map b/src/main/node_modules/html5-qrcode/cjs/ui/scanner/camera-selection-ui.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/ui/scanner/camera-zoom-ui.d.ts b/src/main/node_modules/html5-qrcode/cjs/ui/scanner/camera-zoom-ui.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/ui/scanner/camera-zoom-ui.js b/src/main/node_modules/html5-qrcode/cjs/ui/scanner/camera-zoom-ui.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/ui/scanner/camera-zoom-ui.js.map b/src/main/node_modules/html5-qrcode/cjs/ui/scanner/camera-zoom-ui.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/ui/scanner/file-selection-ui.d.ts b/src/main/node_modules/html5-qrcode/cjs/ui/scanner/file-selection-ui.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/ui/scanner/file-selection-ui.js b/src/main/node_modules/html5-qrcode/cjs/ui/scanner/file-selection-ui.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/ui/scanner/file-selection-ui.js.map b/src/main/node_modules/html5-qrcode/cjs/ui/scanner/file-selection-ui.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/ui/scanner/scan-type-selector.d.ts b/src/main/node_modules/html5-qrcode/cjs/ui/scanner/scan-type-selector.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/ui/scanner/scan-type-selector.js b/src/main/node_modules/html5-qrcode/cjs/ui/scanner/scan-type-selector.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/ui/scanner/scan-type-selector.js.map b/src/main/node_modules/html5-qrcode/cjs/ui/scanner/scan-type-selector.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/ui/scanner/torch-button.d.ts b/src/main/node_modules/html5-qrcode/cjs/ui/scanner/torch-button.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/ui/scanner/torch-button.js b/src/main/node_modules/html5-qrcode/cjs/ui/scanner/torch-button.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/ui/scanner/torch-button.js.map b/src/main/node_modules/html5-qrcode/cjs/ui/scanner/torch-button.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/utils.d.ts b/src/main/node_modules/html5-qrcode/cjs/utils.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/utils.js b/src/main/node_modules/html5-qrcode/cjs/utils.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/utils.js.map b/src/main/node_modules/html5-qrcode/cjs/utils.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/zxing-html5-qrcode-decoder.d.ts b/src/main/node_modules/html5-qrcode/cjs/zxing-html5-qrcode-decoder.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/zxing-html5-qrcode-decoder.js b/src/main/node_modules/html5-qrcode/cjs/zxing-html5-qrcode-decoder.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/cjs/zxing-html5-qrcode-decoder.js.map b/src/main/node_modules/html5-qrcode/cjs/zxing-html5-qrcode-decoder.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/code-decoder.d.ts b/src/main/node_modules/html5-qrcode/code-decoder.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/core.d.ts b/src/main/node_modules/html5-qrcode/core.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/camera/core-impl.d.ts b/src/main/node_modules/html5-qrcode/es2015/camera/core-impl.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/camera/core-impl.js b/src/main/node_modules/html5-qrcode/es2015/camera/core-impl.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/camera/core-impl.js.map b/src/main/node_modules/html5-qrcode/es2015/camera/core-impl.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/camera/core.d.ts b/src/main/node_modules/html5-qrcode/es2015/camera/core.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/camera/core.js b/src/main/node_modules/html5-qrcode/es2015/camera/core.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/camera/core.js.map b/src/main/node_modules/html5-qrcode/es2015/camera/core.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/camera/factories.d.ts b/src/main/node_modules/html5-qrcode/es2015/camera/factories.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/camera/factories.js b/src/main/node_modules/html5-qrcode/es2015/camera/factories.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/camera/factories.js.map b/src/main/node_modules/html5-qrcode/es2015/camera/factories.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/camera/permissions.d.ts b/src/main/node_modules/html5-qrcode/es2015/camera/permissions.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/camera/permissions.js b/src/main/node_modules/html5-qrcode/es2015/camera/permissions.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/camera/permissions.js.map b/src/main/node_modules/html5-qrcode/es2015/camera/permissions.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/camera/retriever.d.ts b/src/main/node_modules/html5-qrcode/es2015/camera/retriever.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/camera/retriever.js b/src/main/node_modules/html5-qrcode/es2015/camera/retriever.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/camera/retriever.js.map b/src/main/node_modules/html5-qrcode/es2015/camera/retriever.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/code-decoder.d.ts b/src/main/node_modules/html5-qrcode/es2015/code-decoder.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/code-decoder.js b/src/main/node_modules/html5-qrcode/es2015/code-decoder.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/code-decoder.js.map b/src/main/node_modules/html5-qrcode/es2015/code-decoder.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/core.d.ts b/src/main/node_modules/html5-qrcode/es2015/core.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/core.js b/src/main/node_modules/html5-qrcode/es2015/core.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/core.js.map b/src/main/node_modules/html5-qrcode/es2015/core.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/experimental-features.d.ts b/src/main/node_modules/html5-qrcode/es2015/experimental-features.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/experimental-features.js b/src/main/node_modules/html5-qrcode/es2015/experimental-features.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/experimental-features.js.map b/src/main/node_modules/html5-qrcode/es2015/experimental-features.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/html5-qrcode-scanner.d.ts b/src/main/node_modules/html5-qrcode/es2015/html5-qrcode-scanner.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/html5-qrcode-scanner.js b/src/main/node_modules/html5-qrcode/es2015/html5-qrcode-scanner.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/html5-qrcode-scanner.js.map b/src/main/node_modules/html5-qrcode/es2015/html5-qrcode-scanner.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/html5-qrcode.d.ts b/src/main/node_modules/html5-qrcode/es2015/html5-qrcode.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/html5-qrcode.js b/src/main/node_modules/html5-qrcode/es2015/html5-qrcode.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/html5-qrcode.js.map b/src/main/node_modules/html5-qrcode/es2015/html5-qrcode.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/image-assets.d.ts b/src/main/node_modules/html5-qrcode/es2015/image-assets.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/image-assets.js b/src/main/node_modules/html5-qrcode/es2015/image-assets.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/image-assets.js.map b/src/main/node_modules/html5-qrcode/es2015/image-assets.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/index.d.ts b/src/main/node_modules/html5-qrcode/es2015/index.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/index.js b/src/main/node_modules/html5-qrcode/es2015/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/index.js.map b/src/main/node_modules/html5-qrcode/es2015/index.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/native-bar-code-detector.d.ts b/src/main/node_modules/html5-qrcode/es2015/native-bar-code-detector.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/native-bar-code-detector.js b/src/main/node_modules/html5-qrcode/es2015/native-bar-code-detector.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/native-bar-code-detector.js.map b/src/main/node_modules/html5-qrcode/es2015/native-bar-code-detector.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/state-manager.d.ts b/src/main/node_modules/html5-qrcode/es2015/state-manager.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/state-manager.js b/src/main/node_modules/html5-qrcode/es2015/state-manager.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/state-manager.js.map b/src/main/node_modules/html5-qrcode/es2015/state-manager.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/storage.d.ts b/src/main/node_modules/html5-qrcode/es2015/storage.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/storage.js b/src/main/node_modules/html5-qrcode/es2015/storage.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/storage.js.map b/src/main/node_modules/html5-qrcode/es2015/storage.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/strings.d.ts b/src/main/node_modules/html5-qrcode/es2015/strings.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/strings.js b/src/main/node_modules/html5-qrcode/es2015/strings.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/strings.js.map b/src/main/node_modules/html5-qrcode/es2015/strings.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/ui.d.ts b/src/main/node_modules/html5-qrcode/es2015/ui.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/ui.js b/src/main/node_modules/html5-qrcode/es2015/ui.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/ui.js.map b/src/main/node_modules/html5-qrcode/es2015/ui.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/ui/scanner/base.d.ts b/src/main/node_modules/html5-qrcode/es2015/ui/scanner/base.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/ui/scanner/base.js b/src/main/node_modules/html5-qrcode/es2015/ui/scanner/base.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/ui/scanner/base.js.map b/src/main/node_modules/html5-qrcode/es2015/ui/scanner/base.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/ui/scanner/camera-selection-ui.d.ts b/src/main/node_modules/html5-qrcode/es2015/ui/scanner/camera-selection-ui.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/ui/scanner/camera-selection-ui.js b/src/main/node_modules/html5-qrcode/es2015/ui/scanner/camera-selection-ui.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/ui/scanner/camera-selection-ui.js.map b/src/main/node_modules/html5-qrcode/es2015/ui/scanner/camera-selection-ui.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/ui/scanner/camera-zoom-ui.d.ts b/src/main/node_modules/html5-qrcode/es2015/ui/scanner/camera-zoom-ui.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/ui/scanner/camera-zoom-ui.js b/src/main/node_modules/html5-qrcode/es2015/ui/scanner/camera-zoom-ui.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/ui/scanner/camera-zoom-ui.js.map b/src/main/node_modules/html5-qrcode/es2015/ui/scanner/camera-zoom-ui.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/ui/scanner/file-selection-ui.d.ts b/src/main/node_modules/html5-qrcode/es2015/ui/scanner/file-selection-ui.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/ui/scanner/file-selection-ui.js b/src/main/node_modules/html5-qrcode/es2015/ui/scanner/file-selection-ui.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/ui/scanner/file-selection-ui.js.map b/src/main/node_modules/html5-qrcode/es2015/ui/scanner/file-selection-ui.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/ui/scanner/scan-type-selector.d.ts b/src/main/node_modules/html5-qrcode/es2015/ui/scanner/scan-type-selector.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/ui/scanner/scan-type-selector.js b/src/main/node_modules/html5-qrcode/es2015/ui/scanner/scan-type-selector.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/ui/scanner/scan-type-selector.js.map b/src/main/node_modules/html5-qrcode/es2015/ui/scanner/scan-type-selector.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/ui/scanner/torch-button.d.ts b/src/main/node_modules/html5-qrcode/es2015/ui/scanner/torch-button.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/ui/scanner/torch-button.js b/src/main/node_modules/html5-qrcode/es2015/ui/scanner/torch-button.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/ui/scanner/torch-button.js.map b/src/main/node_modules/html5-qrcode/es2015/ui/scanner/torch-button.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/utils.d.ts b/src/main/node_modules/html5-qrcode/es2015/utils.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/utils.js b/src/main/node_modules/html5-qrcode/es2015/utils.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/utils.js.map b/src/main/node_modules/html5-qrcode/es2015/utils.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/zxing-html5-qrcode-decoder.d.ts b/src/main/node_modules/html5-qrcode/es2015/zxing-html5-qrcode-decoder.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/zxing-html5-qrcode-decoder.js b/src/main/node_modules/html5-qrcode/es2015/zxing-html5-qrcode-decoder.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/es2015/zxing-html5-qrcode-decoder.js.map b/src/main/node_modules/html5-qrcode/es2015/zxing-html5-qrcode-decoder.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/camera/core-impl.d.ts b/src/main/node_modules/html5-qrcode/esm/camera/core-impl.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/camera/core-impl.js b/src/main/node_modules/html5-qrcode/esm/camera/core-impl.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/camera/core-impl.js.map b/src/main/node_modules/html5-qrcode/esm/camera/core-impl.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/camera/core.d.ts b/src/main/node_modules/html5-qrcode/esm/camera/core.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/camera/core.js b/src/main/node_modules/html5-qrcode/esm/camera/core.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/camera/core.js.map b/src/main/node_modules/html5-qrcode/esm/camera/core.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/camera/factories.d.ts b/src/main/node_modules/html5-qrcode/esm/camera/factories.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/camera/factories.js b/src/main/node_modules/html5-qrcode/esm/camera/factories.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/camera/factories.js.map b/src/main/node_modules/html5-qrcode/esm/camera/factories.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/camera/permissions.d.ts b/src/main/node_modules/html5-qrcode/esm/camera/permissions.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/camera/permissions.js b/src/main/node_modules/html5-qrcode/esm/camera/permissions.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/camera/permissions.js.map b/src/main/node_modules/html5-qrcode/esm/camera/permissions.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/camera/retriever.d.ts b/src/main/node_modules/html5-qrcode/esm/camera/retriever.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/camera/retriever.js b/src/main/node_modules/html5-qrcode/esm/camera/retriever.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/camera/retriever.js.map b/src/main/node_modules/html5-qrcode/esm/camera/retriever.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/code-decoder.d.ts b/src/main/node_modules/html5-qrcode/esm/code-decoder.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/code-decoder.js b/src/main/node_modules/html5-qrcode/esm/code-decoder.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/code-decoder.js.map b/src/main/node_modules/html5-qrcode/esm/code-decoder.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/core.d.ts b/src/main/node_modules/html5-qrcode/esm/core.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/core.js b/src/main/node_modules/html5-qrcode/esm/core.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/core.js.map b/src/main/node_modules/html5-qrcode/esm/core.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/experimental-features.d.ts b/src/main/node_modules/html5-qrcode/esm/experimental-features.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/experimental-features.js b/src/main/node_modules/html5-qrcode/esm/experimental-features.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/experimental-features.js.map b/src/main/node_modules/html5-qrcode/esm/experimental-features.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/html5-qrcode-scanner.d.ts b/src/main/node_modules/html5-qrcode/esm/html5-qrcode-scanner.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/html5-qrcode-scanner.js b/src/main/node_modules/html5-qrcode/esm/html5-qrcode-scanner.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/html5-qrcode-scanner.js.map b/src/main/node_modules/html5-qrcode/esm/html5-qrcode-scanner.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/html5-qrcode.d.ts b/src/main/node_modules/html5-qrcode/esm/html5-qrcode.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/html5-qrcode.js b/src/main/node_modules/html5-qrcode/esm/html5-qrcode.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/html5-qrcode.js.map b/src/main/node_modules/html5-qrcode/esm/html5-qrcode.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/image-assets.d.ts b/src/main/node_modules/html5-qrcode/esm/image-assets.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/image-assets.js b/src/main/node_modules/html5-qrcode/esm/image-assets.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/image-assets.js.map b/src/main/node_modules/html5-qrcode/esm/image-assets.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/index.d.ts b/src/main/node_modules/html5-qrcode/esm/index.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/index.js b/src/main/node_modules/html5-qrcode/esm/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/index.js.map b/src/main/node_modules/html5-qrcode/esm/index.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/native-bar-code-detector.d.ts b/src/main/node_modules/html5-qrcode/esm/native-bar-code-detector.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/native-bar-code-detector.js b/src/main/node_modules/html5-qrcode/esm/native-bar-code-detector.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/native-bar-code-detector.js.map b/src/main/node_modules/html5-qrcode/esm/native-bar-code-detector.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/state-manager.d.ts b/src/main/node_modules/html5-qrcode/esm/state-manager.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/state-manager.js b/src/main/node_modules/html5-qrcode/esm/state-manager.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/state-manager.js.map b/src/main/node_modules/html5-qrcode/esm/state-manager.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/storage.d.ts b/src/main/node_modules/html5-qrcode/esm/storage.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/storage.js b/src/main/node_modules/html5-qrcode/esm/storage.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/storage.js.map b/src/main/node_modules/html5-qrcode/esm/storage.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/strings.d.ts b/src/main/node_modules/html5-qrcode/esm/strings.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/strings.js b/src/main/node_modules/html5-qrcode/esm/strings.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/strings.js.map b/src/main/node_modules/html5-qrcode/esm/strings.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/ui.d.ts b/src/main/node_modules/html5-qrcode/esm/ui.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/ui.js b/src/main/node_modules/html5-qrcode/esm/ui.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/ui.js.map b/src/main/node_modules/html5-qrcode/esm/ui.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/ui/scanner/base.d.ts b/src/main/node_modules/html5-qrcode/esm/ui/scanner/base.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/ui/scanner/base.js b/src/main/node_modules/html5-qrcode/esm/ui/scanner/base.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/ui/scanner/base.js.map b/src/main/node_modules/html5-qrcode/esm/ui/scanner/base.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/ui/scanner/camera-selection-ui.d.ts b/src/main/node_modules/html5-qrcode/esm/ui/scanner/camera-selection-ui.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/ui/scanner/camera-selection-ui.js b/src/main/node_modules/html5-qrcode/esm/ui/scanner/camera-selection-ui.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/ui/scanner/camera-selection-ui.js.map b/src/main/node_modules/html5-qrcode/esm/ui/scanner/camera-selection-ui.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/ui/scanner/camera-zoom-ui.d.ts b/src/main/node_modules/html5-qrcode/esm/ui/scanner/camera-zoom-ui.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/ui/scanner/camera-zoom-ui.js b/src/main/node_modules/html5-qrcode/esm/ui/scanner/camera-zoom-ui.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/ui/scanner/camera-zoom-ui.js.map b/src/main/node_modules/html5-qrcode/esm/ui/scanner/camera-zoom-ui.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/ui/scanner/file-selection-ui.d.ts b/src/main/node_modules/html5-qrcode/esm/ui/scanner/file-selection-ui.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/ui/scanner/file-selection-ui.js b/src/main/node_modules/html5-qrcode/esm/ui/scanner/file-selection-ui.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/ui/scanner/file-selection-ui.js.map b/src/main/node_modules/html5-qrcode/esm/ui/scanner/file-selection-ui.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/ui/scanner/scan-type-selector.d.ts b/src/main/node_modules/html5-qrcode/esm/ui/scanner/scan-type-selector.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/ui/scanner/scan-type-selector.js b/src/main/node_modules/html5-qrcode/esm/ui/scanner/scan-type-selector.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/ui/scanner/scan-type-selector.js.map b/src/main/node_modules/html5-qrcode/esm/ui/scanner/scan-type-selector.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/ui/scanner/torch-button.d.ts b/src/main/node_modules/html5-qrcode/esm/ui/scanner/torch-button.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/ui/scanner/torch-button.js b/src/main/node_modules/html5-qrcode/esm/ui/scanner/torch-button.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/ui/scanner/torch-button.js.map b/src/main/node_modules/html5-qrcode/esm/ui/scanner/torch-button.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/utils.d.ts b/src/main/node_modules/html5-qrcode/esm/utils.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/utils.js b/src/main/node_modules/html5-qrcode/esm/utils.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/utils.js.map b/src/main/node_modules/html5-qrcode/esm/utils.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/zxing-html5-qrcode-decoder.d.ts b/src/main/node_modules/html5-qrcode/esm/zxing-html5-qrcode-decoder.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/zxing-html5-qrcode-decoder.js b/src/main/node_modules/html5-qrcode/esm/zxing-html5-qrcode-decoder.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/esm/zxing-html5-qrcode-decoder.js.map b/src/main/node_modules/html5-qrcode/esm/zxing-html5-qrcode-decoder.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/experimental-features.d.ts b/src/main/node_modules/html5-qrcode/experimental-features.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/html5-qrcode-scanner.d.ts b/src/main/node_modules/html5-qrcode/html5-qrcode-scanner.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/html5-qrcode.d.ts b/src/main/node_modules/html5-qrcode/html5-qrcode.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/html5-qrcode.min.js b/src/main/node_modules/html5-qrcode/html5-qrcode.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/image-assets.d.ts b/src/main/node_modules/html5-qrcode/image-assets.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/index.d.ts b/src/main/node_modules/html5-qrcode/index.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/native-bar-code-detector.d.ts b/src/main/node_modules/html5-qrcode/native-bar-code-detector.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/package.json b/src/main/node_modules/html5-qrcode/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..bc7616ad5306f6afcea5b530326b51d8d2cc44c7
--- /dev/null
+++ b/src/main/node_modules/html5-qrcode/package.json
@@ -0,0 +1,93 @@
+{
+  "name": "html5-qrcode",
+  "version": "2.3.8",
+  "description": "A cross platform HTML5 QR Code & bar code scanner",
+  "main": "./cjs/index.js",
+  "module": "./esm/index.js",
+  "typings": "./esm/index.d.ts",
+  "esnext": "./es2015/index.js",
+  "unpkg": "./html5-qrcode.min.js",
+  "scripts": {
+    "build-windows": "npm run build:es2015 && npm run build:esm && npm run build:esnext && npm run build:cjs && npm run build:umd_windows && npm run build:typing && npm run build:copy_windows",
+    "test": "npm run-script test:build && npm run-script test:run",
+    "test_windows": "npm run-script test:build && npm run-script test:run_windows",
+    "test:build": "tsc --build tsconfig.test.json",
+    "test:run_windows": ".\\scripts\\test-run.bat",
+    "test:run": "./scripts/test-run.sh",
+    "lint-md": "remark .",
+    "clean": "rm -Rf ./lib/* ./build/* ./meta/bundlesize/* ./meta/coverage/* ./.rpt2_cache  ./dist/* ./src/*.d.ts",
+    "prebuild": "npm run clean",
+    "postbuild": "cp -R ./third_party ./dist/third_party",
+    "build": "npm run build:es2015 && npm run build:esm && npm run build:esnext && npm run build:cjs && npm run build:umd && npm run build:typing && npm run build:copy",
+    "build:es2015": "tsc --build tsconfig.lib-es2015.json",
+    "build:esm": "tsc --build tsconfig.lib-esm.json",
+    "build:esnext": "tsc --build tsconfig.lib-esm.json",
+    "build:cjs": "tsc --build tsconfig.lib-cjs.json",
+    "build:typing": "tsc --emitDeclarationOnly --outDir ./dist",
+    "build:umd": "./scripts/build-webpack.sh",
+    "build:umd_windows": ".\\scripts\\build-webpack.bat",
+    "build:copy": "cp README.md dist && cp package.json dist && cp LICENSE dist && cp -R src dist/src",
+    "build:copy_windows": "copy README.md dist && copy package.json dist && copy LICENSE dist",
+    "internal_release": "npm run build && cp dist/html5-qrcode.min.js minified/html5-qrcode.min.js",
+    "release": "npm run build && cp dist/html5-qrcode.min.js minified/html5-qrcode.min.js && cd dist && npm publish",
+    "release_windows": "npm run build && cp dist\\html5-qrcode.min.js minified\\html5-qrcode.min.js && cd dist && npm publish",
+    "doc_gen": "npx typedoc --excludePrivate src/index.ts"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/mebjas/html5-qrcode.git"
+  },
+  "keywords": [
+    "html5",
+    "qrcode",
+    "html",
+    "camera",
+    "scanner",
+    "barcode",
+    "barcode 1d",
+    "barcode 2d"
+  ],
+  "author": "minhazav@gmail.com",
+  "license": "Apache-2.0",
+  "bugs": {
+    "url": "https://github.com/mebjas/html5-qrcode/issues"
+  },
+  "homepage": "https://github.com/mebjas/html5-qrcode#readme",
+  "devDependencies": {
+    "@babel/cli": "^7.10.5",
+    "@babel/core": "^7.11.4",
+    "@babel/plugin-proposal-class-properties": "^7.10.4",
+    "@babel/preset-env": "^7.11.0",
+    "@types/chai": "^4.3.0",
+    "@types/mocha": "^9.0.0",
+    "babel-minify": "^0.5.1",
+    "chai": "^4.3.4",
+    "docusaurus-plugin-typedoc": "^0.18.0",
+    "expose-loader": "^2.0.0",
+    "jsdom": "20.0.2",
+    "jsdom-global": "3.0.2",
+    "mocha": "^9.1.3",
+    "mocha-lcov-reporter": "^1.3.0",
+    "promise-polyfill": "^8.1.3",
+    "remark-cli": "^9.0.0",
+    "remark-preset-lint-recommended": "^5.0.0",
+    "rewire": "^5.0.0",
+    "ts-loader": "^9.1.2",
+    "ts-node": "^10.4.0",
+    "tsconfig-paths": "^3.12.0",
+    "typedoc": "^0.23.28",
+    "typedoc-plugin-markdown": "^3.14.0",
+    "typescript": "^4.3.2",
+    "typings": "^2.1.1",
+    "webpack": "^5.37.0",
+    "webpack-cli": "^4.7.0"
+  },
+  "remarkConfig": {
+    "plugins": [
+      "remark-preset-lint-recommended"
+    ]
+  },
+  "publishConfig": {
+    "access": "public"
+  }
+}
diff --git a/src/main/node_modules/html5-qrcode/src/camera/core-impl.d.ts b/src/main/node_modules/html5-qrcode/src/camera/core-impl.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/camera/core-impl.ts b/src/main/node_modules/html5-qrcode/src/camera/core-impl.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/camera/core.d.ts b/src/main/node_modules/html5-qrcode/src/camera/core.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/camera/core.ts b/src/main/node_modules/html5-qrcode/src/camera/core.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/camera/factories.d.ts b/src/main/node_modules/html5-qrcode/src/camera/factories.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/camera/factories.ts b/src/main/node_modules/html5-qrcode/src/camera/factories.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/camera/permissions.d.ts b/src/main/node_modules/html5-qrcode/src/camera/permissions.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/camera/permissions.ts b/src/main/node_modules/html5-qrcode/src/camera/permissions.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/camera/retriever.d.ts b/src/main/node_modules/html5-qrcode/src/camera/retriever.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/camera/retriever.ts b/src/main/node_modules/html5-qrcode/src/camera/retriever.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/code-decoder.d.ts b/src/main/node_modules/html5-qrcode/src/code-decoder.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/code-decoder.ts b/src/main/node_modules/html5-qrcode/src/code-decoder.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/core.d.ts b/src/main/node_modules/html5-qrcode/src/core.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/core.ts b/src/main/node_modules/html5-qrcode/src/core.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/experimental-features.d.ts b/src/main/node_modules/html5-qrcode/src/experimental-features.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/experimental-features.ts b/src/main/node_modules/html5-qrcode/src/experimental-features.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/html5-qrcode-scanner.d.ts b/src/main/node_modules/html5-qrcode/src/html5-qrcode-scanner.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/html5-qrcode-scanner.ts b/src/main/node_modules/html5-qrcode/src/html5-qrcode-scanner.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/html5-qrcode.d.ts b/src/main/node_modules/html5-qrcode/src/html5-qrcode.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/html5-qrcode.ts b/src/main/node_modules/html5-qrcode/src/html5-qrcode.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/image-assets.d.ts b/src/main/node_modules/html5-qrcode/src/image-assets.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/image-assets.ts b/src/main/node_modules/html5-qrcode/src/image-assets.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/index.d.ts b/src/main/node_modules/html5-qrcode/src/index.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/index.ts b/src/main/node_modules/html5-qrcode/src/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/native-bar-code-detector.d.ts b/src/main/node_modules/html5-qrcode/src/native-bar-code-detector.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/native-bar-code-detector.ts b/src/main/node_modules/html5-qrcode/src/native-bar-code-detector.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/state-manager.d.ts b/src/main/node_modules/html5-qrcode/src/state-manager.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/state-manager.ts b/src/main/node_modules/html5-qrcode/src/state-manager.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/storage.d.ts b/src/main/node_modules/html5-qrcode/src/storage.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/storage.ts b/src/main/node_modules/html5-qrcode/src/storage.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/strings.d.ts b/src/main/node_modules/html5-qrcode/src/strings.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/strings.ts b/src/main/node_modules/html5-qrcode/src/strings.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/ui.d.ts b/src/main/node_modules/html5-qrcode/src/ui.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/ui.ts b/src/main/node_modules/html5-qrcode/src/ui.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/ui/scanner/base.d.ts b/src/main/node_modules/html5-qrcode/src/ui/scanner/base.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/ui/scanner/base.ts b/src/main/node_modules/html5-qrcode/src/ui/scanner/base.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/ui/scanner/camera-selection-ui.d.ts b/src/main/node_modules/html5-qrcode/src/ui/scanner/camera-selection-ui.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/ui/scanner/camera-selection-ui.ts b/src/main/node_modules/html5-qrcode/src/ui/scanner/camera-selection-ui.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/ui/scanner/camera-zoom-ui.d.ts b/src/main/node_modules/html5-qrcode/src/ui/scanner/camera-zoom-ui.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/ui/scanner/camera-zoom-ui.ts b/src/main/node_modules/html5-qrcode/src/ui/scanner/camera-zoom-ui.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/ui/scanner/file-selection-ui.d.ts b/src/main/node_modules/html5-qrcode/src/ui/scanner/file-selection-ui.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/ui/scanner/file-selection-ui.ts b/src/main/node_modules/html5-qrcode/src/ui/scanner/file-selection-ui.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/ui/scanner/scan-type-selector.d.ts b/src/main/node_modules/html5-qrcode/src/ui/scanner/scan-type-selector.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/ui/scanner/scan-type-selector.ts b/src/main/node_modules/html5-qrcode/src/ui/scanner/scan-type-selector.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/ui/scanner/torch-button.d.ts b/src/main/node_modules/html5-qrcode/src/ui/scanner/torch-button.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/ui/scanner/torch-button.ts b/src/main/node_modules/html5-qrcode/src/ui/scanner/torch-button.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/utils.d.ts b/src/main/node_modules/html5-qrcode/src/utils.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/utils.ts b/src/main/node_modules/html5-qrcode/src/utils.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/zxing-html5-qrcode-decoder.d.ts b/src/main/node_modules/html5-qrcode/src/zxing-html5-qrcode-decoder.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/src/zxing-html5-qrcode-decoder.ts b/src/main/node_modules/html5-qrcode/src/zxing-html5-qrcode-decoder.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/state-manager.d.ts b/src/main/node_modules/html5-qrcode/state-manager.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/storage.d.ts b/src/main/node_modules/html5-qrcode/storage.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/strings.d.ts b/src/main/node_modules/html5-qrcode/strings.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/third_party/zxing-js.umd.d.ts b/src/main/node_modules/html5-qrcode/third_party/zxing-js.umd.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/third_party/zxing-js.umd.js b/src/main/node_modules/html5-qrcode/third_party/zxing-js.umd.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/ui.d.ts b/src/main/node_modules/html5-qrcode/ui.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/ui/scanner/base.d.ts b/src/main/node_modules/html5-qrcode/ui/scanner/base.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/ui/scanner/camera-selection-ui.d.ts b/src/main/node_modules/html5-qrcode/ui/scanner/camera-selection-ui.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/ui/scanner/camera-zoom-ui.d.ts b/src/main/node_modules/html5-qrcode/ui/scanner/camera-zoom-ui.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/ui/scanner/file-selection-ui.d.ts b/src/main/node_modules/html5-qrcode/ui/scanner/file-selection-ui.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/ui/scanner/scan-type-selector.d.ts b/src/main/node_modules/html5-qrcode/ui/scanner/scan-type-selector.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/ui/scanner/torch-button.d.ts b/src/main/node_modules/html5-qrcode/ui/scanner/torch-button.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/utils.d.ts b/src/main/node_modules/html5-qrcode/utils.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/node_modules/html5-qrcode/zxing-html5-qrcode-decoder.d.ts b/src/main/node_modules/html5-qrcode/zxing-html5-qrcode-decoder.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/package-lock.json b/src/main/package-lock.json
new file mode 100644
index 0000000000000000000000000000000000000000..f87cd0fa617c70015c9a214b517c1c4ccb8d53ce
--- /dev/null
+++ b/src/main/package-lock.json
@@ -0,0 +1,20 @@
+{
+  "name": "main",
+  "version": "1.0.0",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "": {
+      "name": "main",
+      "version": "1.0.0",
+      "dependencies": {
+        "html5-qrcode": "^2.3.8"
+      }
+    },
+    "node_modules/html5-qrcode": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmjs.org/html5-qrcode/-/html5-qrcode-2.3.8.tgz",
+      "integrity": "sha512-jsr4vafJhwoLVEDW3n1KvPnCCXWaQfRng0/EEYk1vNcQGcG/htAdhJX0be8YyqMoSz7+hZvOZSTAepsabiuhiQ=="
+    }
+  }
+}
diff --git a/src/main/package.json b/src/main/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..b58ec6ea1338ef9ef2376b74567a94cef9c2efd5
--- /dev/null
+++ b/src/main/package.json
@@ -0,0 +1,7 @@
+{
+  "name": "main",
+  "version": "1.0.0",
+  "dependencies": {
+    "html5-qrcode": "^2.3.8"
+  }
+}
diff --git a/src/main/resources/QRCodeScanner.html b/src/main/resources/QRCodeScanner.html
deleted file mode 100644
index 11da0658b1421e28159c97fc5abae82030ff3630..0000000000000000000000000000000000000000
--- a/src/main/resources/QRCodeScanner.html
+++ /dev/null
@@ -1,10 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <title>QR Camera</title>
-</head>
-<body>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql
deleted file mode 100644
index c45362632bfcfdadfe87561301854754a4d491a0..0000000000000000000000000000000000000000
--- a/src/main/resources/data.sql
+++ /dev/null
@@ -1,62 +0,0 @@
-delete from users;
-insert into users (email, name, dragonProgress) value ('hannah@gmail.com', 'Hannah', '90');
-insert into users (userID, email, name, dragonProgress) value ('2', 'nigel@gmail.com', 'Nigel', '40');
-
-delete from trails;
-insert into trails ( Name) value ( 'Caerphilly Coffee Trail');
-insert into trails ( Name) value ( 'Penarth Dragon Trail');
-
-delete from locations;
-insert into locations ( locationName , locationEmail,locationDescription,locationPlace, locationTrailID) value ( 'St Cenydd','','Location description here','Caerphilly',0101);
-insert into locations ( locationName , locationEmail,locationDescription,locationPlace, locationTrailID) value ( 'The Castle','','Location description here','Caerphilly',0101);
-insert into locations ( locationName , locationEmail,locationDescription,locationPlace, locationTrailID) value ( 'Medieval Trades','','Location description here','Caerphilly',0101);
-insert into locations ( locationName , locationEmail,locationDescription,locationPlace, locationTrailID) value ( 'The Queen''s War','','Location description here','Caerphilly',0101);
-insert into locations ( locationName , locationEmail,locationDescription,locationPlace, locationTrailID) value ( 'The Green Lady','','Location description here','Caerphilly',0101);
-insert into locations ( locationName , locationEmail,locationDescription,locationPlace, locationTrailID) value ( 'Armoury','','Location description here','Caerphilly',0101);
-insert into locations ( locationName , locationEmail,locationDescription,locationPlace, locationTrailID) value ( 'Architecture','','Location description here','Caerphilly',0101);
-insert into locations ( locationName , locationEmail,locationDescription,locationPlace, locationTrailID) value ( '21st Century Landmark','','Location description here','Caerphilly',0101);
-
-insert into locations ( locationName , locationEmail,locationDescription,locationPlace, locationTrailID) value ( 'JD Wetherspoons-Malcolm Uphill','','Location description here','Caerphilly',0102);
-insert into locations ( locationName , locationEmail,locationDescription,locationPlace, locationTrailID) value ( 'Caerphilly Cwtch','','Location description here','Caerphilly',0102);
-insert into locations ( locationName , locationEmail,locationDescription,locationPlace, locationTrailID) value ( 'Caerphilly Conservative Club','','Location description here','Caerphilly',0102);
-insert into locations ( locationName , locationEmail,locationDescription,locationPlace, locationTrailID) value ( 'The King''s Arms','','Location description here','Caerphilly',0102);
-
-insert into locations ( locationName , locationEmail,locationDescription,locationPlace, locationTrailID) value ( 'Caerphilly Bus Station','','Location description here','Caerphilly',0103);
-insert into locations ( locationName , locationEmail,locationDescription,locationPlace, locationTrailID) value ( 'The Medieval Courthouse','','Location description here','Caerphilly',0103);
-insert into locations ( locationName , locationEmail,locationDescription,locationPlace, locationTrailID) value ('Caerphilly Castle','','Location description here','Caerphilly',0103);
-insert into locations ( locationName , locationEmail,locationDescription,locationPlace, locationTrailID) value ( 'Ty Vaughan House','','Location description here','Caerphilly',0103);
-
-insert into locations ( locationName , locationEmail,locationDescription,locationPlace, locationTrailID) value ( 'Risca Colliery','','Location description here','Risca',0201);
-insert into locations ( locationName , locationEmail,locationDescription,locationPlace, locationTrailID) value ( 'Black Vein Colliery Disaster','','Location description here','Risca',0201);
-
-
-insert into locations (locationID, locationName , locationEmail,locationDescription,locationPlace, locationTrailID) value (19, 'The Esplanade','','Location description here','Penarth',0301);
-insert into locations (locationID, locationName , locationEmail,locationDescription,locationPlace, locationTrailID) value (20, 'The Old Swimming Baths','','Location description here','Penarth',0301);
-delete from badges;
-insert into badges (name, description, difficulty) value ('TownConnoisseur', 'You know the town very well!', '2');
-insert into badges (name, description, difficulty) value ('TownRegular', 'You visited the town 3 days in a row!', '1');
-insert into badges (name, description, difficulty) value ('TownMaster', 'You visited the town 7 days in a row!', '1');
-insert into badges (name, description, difficulty) value ('TownRegular', 'You visited the town 3 days in a row!', '1');
-insert into badges (name, description, difficulty) value ('TownRegular', 'You visited the town 3 days in a row!', '1');
-
-delete from stickers;
-insert into stickers (name, description, rarity) value ('TownConnoisseur', 'You know the town very well!', '2');
-insert into stickers (name, description, rarity) value ('TownRegular', 'You visited the town 3 days in a row!', '1');
-insert into stickers (name, description, rarity) value ('TownMaster', 'You visited the town 7 days in a row!', '1');
-insert into stickers (name, description, rarity) value ('TownRegular', 'You visited the town 3 days in a row!', '1');
-insert into stickers (name, description, rarity) value ('TownRegular', 'You visited the town 3 days in a row!', '1');
-
-delete from badgeprogress;
-insert into badgeprogress (userID, badgeID, progress) value ('1', '1', '40');
-insert into badgeprogress (userID, badgeID, progress) value ('1', '2', '70');
-insert into badgeprogress (userID, badgeID, progress) value ('2', '2', '70');
-
-delete from stickerprogress;
-insert into stickerprogress (userID, stickerID, hasSticker) value ('1', '1', true);
-insert into stickerprogress (userID, stickerID, hasSticker) value ('1', '3', true);
-insert into stickerprogress (userID, stickerID, hasSticker) value ('2', '2', true);
-
-delete from businesses;
-insert into businesses ( businessName, address1, address2, city, county, postcode, website) value ( 'Caerphilly Castle', 'Castle Street', '', 'Caerphilly', '', 'CF83 1JD', 'https://cadw.gov.wales/visit/places-to-visit/caerphilly-castle');
-insert into businesses ( businessName, address1, address2, city, county, postcode, website) value ( 'Risca Colliers Institute', 'Grove Road', '', 'Risca', '', 'NP11 6GN', 'https://www.nmrs.org.uk/mines-map/coal-mining-in-the-british-isles/swales/abercarn/risca-colliery/');
-insert into businesses ( businessName, address1, address2, city, county, postcode, website) value ( 'Penarth Esplanade', '7 Pier Buildings','', 'Penarth Pier', '', 'CF64 3AU', 'https://www.facebook.com/DecksPenarth/');
\ No newline at end of file
diff --git a/src/main/resources/index.html b/src/main/resources/index.html
deleted file mode 100644
index 489349d1b63d75904028b48ddd4eb36d29f63650..0000000000000000000000000000000000000000
--- a/src/main/resources/index.html
+++ /dev/null
@@ -1,11 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <title>Home Page</title>
-</head>
-<body>
-<h1>Welcome to the home page</h1>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql
deleted file mode 100644
index f6042727963561bae023651a299c79bb74c5fe62..0000000000000000000000000000000000000000
--- a/src/main/resources/schema.sql
+++ /dev/null
@@ -1,73 +0,0 @@
-drop table if exists trails;
-create table if not exists trails
-(
-    trailID bigint auto_increment primary key,
-    name varchar(128)
-)   engine=InnoDB;
-
-drop table if exists locations;
-
-create table if not exists locations
-(
-    locationID bigint auto_increment primary key,
-    locationName varchar(128),
-    locationEmail varchar(128),
-    locationDescription longtext,
-    locationPlace varchar(255),
-    locationTrailID varchar(128)
-)   engine=InnoDB;
-
-drop table if exists users;
-create table if not exists users
-(
-    userID bigint auto_increment primary key,
-    email varchar(128),
-    name varchar(128),
-    dragonProgress int
-) engine=InnoDB;
-
-drop table if exists badges;
-create table if not exists badges
-(
-    badgeID bigint auto_increment primary key,
-    name varchar(128),
-    description varchar(128),
-    difficulty bigint
-) engine=InnoDB;
-
-drop table if exists stickers;
-create table if not exists stickers
-(
-    stickerID bigint auto_increment primary key,
-    name varchar(128),
-    description varchar(128),
-    rarity bigint
-) engine=InnoDB;
-
-drop table if exists badgeProgress;
-create table if not exists badgeProgress
-(
-    userID bigint,
-    badgeID bigint,
-    progress int /*0-100*/
-) engine=InnoDB;
-
-create table if not exists stickerProgress
-(
-    userID bigint,
-    stickerID bigint,
-    hasSticker boolean /*Has sticker or not*/
-) engine=InnoDB;
-
-drop table if exists businesses;
-create table if not exists businesses
-(
-    businessID bigint auto_increment primary key,
-    businessName varchar(250),
-    address1 varchar(250),
-    address2 varchar(250),
-    city varchar(100),
-    county varchar(75),
-    postcode varchar(15),
-    website varchar(250)
-) engine=InnoDB;
diff --git a/src/main/resources/static/css/locationPageFragsStyle.css b/src/main/resources/static/css/locationPageFragsStyle.css
new file mode 100644
index 0000000000000000000000000000000000000000..53cf211001f02daf8ff1874a25d6546015115b37
--- /dev/null
+++ b/src/main/resources/static/css/locationPageFragsStyle.css
@@ -0,0 +1,31 @@
+.locationFragment{
+    background-color: rgb(206, 153, 253);
+    color: black;
+    border-color: white;
+    align-content: center;
+    text-align: center;
+    border-radius: 25px;
+    max-width: 800px;
+    margin: 0 auto;
+
+}
+.locationPageFrag{
+    background:  rgb(41, 41, 41);
+    color: wheat;
+}
+
+iframe{
+    margin-top: 20px;
+    margin-bottom: 60px;
+    border: white 2px solid;
+}
+H1{
+    padding-top: 5px;
+    padding-bottom:3px ;
+    margin-bottom: 0;
+}
+#townHeader{
+    margin: 0;
+    padding: 0;
+
+}
\ No newline at end of file
diff --git a/src/main/resources/static/css/qrstyle.css b/src/main/resources/static/css/qrstyle.css
new file mode 100644
index 0000000000000000000000000000000000000000..b0c851a93e488b09a7ebb4c36b09579ac7dedf88
--- /dev/null
+++ b/src/main/resources/static/css/qrstyle.css
@@ -0,0 +1,65 @@
+/*style sheet for QR code - R Nute*/
+/*Modified from (https://www.geeksforgeeks.org/create-a-qr-code-scanner-or-reader-in-html-css-javascript/)*/
+
+body {
+    display: flex;
+    justify-content: center;
+    margin: 0;
+    padding: 0;
+    height: 100vh;
+    box-sizing: border-box;
+    text-align: center;
+    background: rgb(84 33 128 / 66%);
+}
+.container {
+    width: 100%;
+    max-width: 500px;
+    margin: 5px;
+}
+.container h1 {
+    color: rgb(84 33 128);
+}
+.section {
+    background-color: rgb(84 33 128);
+    padding: 50px 30px;
+    border: 2px solid #b2b2b2;
+    border-radius: 0.5em;
+    box-shadow: 0 20px 25px rgba(0, 0, 0, 30);
+}
+#qr-code-reader {
+    padding: 20px !important;
+    border: 2px solid #b2b2b2 !important;
+    border-radius: 10px;
+}
+#qr-code-reader img[alt="Information icon"] {
+    display: none;
+}
+#qr-code-reader img[alt="QR Code Scan"] {
+    width: 100px !important;
+    height: 100px !important;
+}
+button {
+    padding: 15px 25px;
+    border: 2px solid #b2b2b2;
+    outline: none;
+    border-radius: 0.5em;
+    color: grey;
+    font-size: 25px;
+    cursor: default;
+    margin-top: 20px;
+    margin-bottom: 15px;
+    background-color: rgb(84 33 128);
+    transition: 0.5s background-color;
+}
+button:hover {
+    background-color: rgb(84 33 128);
+}
+#html-qrcode-scan-type-change {
+    text-decoration: none !important;
+    color: #1d9bf0;
+}
+stickers {
+    width: 100% !important;
+    border: 2px solid #b2b2b2 !important;
+    border-radius: 0.5em;
+}
diff --git a/src/main/resources/static/css/styling.css b/src/main/resources/static/css/styling.css
new file mode 100644
index 0000000000000000000000000000000000000000..01d36eeb7098b8a007c84c09d60d3a5b4f5d965d
--- /dev/null
+++ b/src/main/resources/static/css/styling.css
@@ -0,0 +1,2 @@
+/*@import "../../templates/towns/mapsTest/node_modules/ol/ol.css";*/
+@import "../nodeMods/node_modules/ol/ol.css";
diff --git a/src/main/resources/static/css/userProfile.css b/src/main/resources/static/css/userProfile.css
index 8ceb77b4e82d8c44f9aefdcf9c1f54493771e668..878ab054fc53828cb76726775109ca7d3f4bcc80 100644
--- a/src/main/resources/static/css/userProfile.css
+++ b/src/main/resources/static/css/userProfile.css
@@ -37,13 +37,21 @@
         & p { line-height: 1.1; color: white;}
     }
 }
-
+html{
+    height: 100%;
+    @media only screen and (min-device-width: 1500px) {
+        height: auto;
+    }
+}
 body {
     background: linear-gradient(135deg, #f7e8fd, #9914d1);
-    height: 100svh;
+    height: 100%;
     display: flex;
     flex-direction: column;
     justify-content: space-evenly;
+    @media only screen and (min-device-width: 1500px) {
+        height: auto;
+    }
 }
 main {
     background: linear-gradient(to bottom, #1e1e1e 10%, darkgoldenrod 50%, #1e1e1e 90%);
@@ -55,8 +63,16 @@ main {
     margin-top: 6em;
     padding-inline: 1vw;
     box-shadow: rgba(0, 0, 0, 0.7) 0 0.5svh max(1vw, 1em);
-
-
+    transition: all linear 2s;
+    overflow-y: scroll;
+    height: 90%;
+    @media only screen and (min-device-width: 1500px) {
+        padding-inline: 20%;
+        overflow: visible;
+    }
+}
+.rewards {
+    position: relative;
 }
 .userInfo {
     display: flex;
@@ -81,15 +97,16 @@ main {
         box-shadow: rgba(0, 0, 0, 0.7) 0 0.5svh 1vw -1vw;
     }
 }
-#badgesBar::-webkit-scrollbar {
+#packsBar::-webkit-scrollbar {
     display: none;
     -ms-scrollbar-darkshadow-color: transparent;
 }
-#badgesBar {
+#packsBar {
+    position: static;
     display: grid;
     grid-template-areas:
         "header"
-        "badges";
+        "packs";
     overflow-x: scroll;
     overflow-y: hidden;
     color: white;
@@ -110,31 +127,54 @@ main {
         height: 1.2em;
 
     }
-    & #allBadgesContainer {
+    & #allPacksContainer {
         margin-top: 3svh;
-        grid-area: badges;
-        height: 10svh;
-        align-content: center;
+        grid-area: packs;
+        height: 12svh;
+        width: 100%;
         display: flex;
+        justify-content: space-between;
         @media only screen and (min-device-width: 501px) {
             height: 20vw;
             margin-top: 6vw;
         }
     }
-    & .badgeImg {
+    & .packContainer{
+        position: relative;
+        height: 12svh;
+        width: 20vw;
+        display: flex;
+        flex-direction: column;
+        text-align: center;
+        justify-content: center;
+        overflow: visible;
+    }
+
+    & .packImg {
+        position: relative;
         margin-inline: 3vw;
         height: 8svh;
+        /*width: 25%;*/
         z-index: 50;
         @media only screen and (min-device-width: 501px) {
             height: 15vw;
         }
         transition: 0.3s ease-out 100ms;
     }
-    & .badgeImg:hover {
+    & .packImg:hover {
         /*box-shadow: 0 0 20px 10px #bbbb00;*/
         transform: scale(1.5,1.5);
 
     }
+    & .packName {
+        height: 4svh;
+        display: flex;
+        justify-content: center;
+        font-size: 2em;
+        overflow: hidden;
+        align-items: flex-end;
+
+    }
 }
 
 #stickersBox {
@@ -145,6 +185,7 @@ main {
     /* border-bottom-right-radius: 2vw; */
     /*background: linear-gradient(to bottom, darkgoldenrod, transparent 90%);*/
     margin-top: -1%;
+    height: 500px;
     & h2 {
         font-size: 4em;
         text-align: center;
@@ -360,4 +401,8 @@ header .footerButton:hover {
     font-size: 0.6em;
     opacity: 0;
     transition: 0.5s ease-in-out 1ms;
+}
+
+.rewards {
+    transition: 1s ease-in-out 1ms;
 }
\ No newline at end of file
diff --git a/src/main/resources/static/css/userProfile2.css b/src/main/resources/static/css/userProfile2.css
new file mode 100644
index 0000000000000000000000000000000000000000..0728cbc6e973473051420fd817d243d5d484c489
--- /dev/null
+++ b/src/main/resources/static/css/userProfile2.css
@@ -0,0 +1,309 @@
+/* AUTHOR: Gabriel Copat*/
+@import url('https://fonts.googleapis.com/css2?family=MedievalSharp&display=swap');
+@import url('https://fonts.googleapis.com/css2?family=MedievalSharp&display=swap');
+
+* {
+    margin: 0;
+    padding: 0;
+    box-sizing: border-box;
+
+    /*COLOUR PALETTE*/
+    @media (prefers-color-scheme: dark) {
+        --primary-darker: hsl(272, 100%, 10%);
+        --primary-dark: hsl(271, 100%, 20%);
+        --primary-colour: hsl(271, 100%, 30%);
+        --primary-light: hsl(271, 100%, 40%);
+        --primary-lighter: hsl(271, 100%, 50%);
+
+        --secondary-colour: hsl(12, 81%, 46%);
+        --accent-colour: hsl(12, 82%, 32%);
+        --accent-border: hsl(12, 81%, 25%);
+
+        --accent-shadow: rgba(0, 0, 0, 0.7) 0 0.5em 1em -0.5em;
+
+        color: white;
+
+    }
+    @media (prefers-color-scheme: light) {
+        --primary-darker: hsl(272, 100%, 10%);
+        --primary-dark: hsl(271, 100%, 20%);
+        --primary-colour: hsl(271, 100%, 30%);
+        --primary-light: hsl(271, 100%, 40%);
+        --primary-lighter: hsl(271, 100%, 50%);
+
+        --secondary-colour: hsl(12, 81%, 46%);
+        --accent-colour: hsl(12, 82%, 32%);
+        --accent-border: hsl(12, 81%, 25%);
+
+        --accent-shadow: rgba(0, 0, 0, 0.7) 0 0.5em 1em -0.5em;
+
+        color: white;
+
+
+    }
+}
+
+
+
+/* DEFAULT CSS MADE FOR SCREEN SIZES WIDTHS
+    BETWEEN 320px and 640px:*/
+
+body {
+    background: linear-gradient(to bottom right,
+    var(--primary-darker),
+    var(--primary-dark),
+    var(--primary-darker));
+
+    display: flex;
+    flex-direction: column;
+    justify-content: center;
+    align-content: center;
+
+    position: fixed;
+    width: 100vw;
+    height: 100svh;
+}
+
+.grayedSticker {
+    filter: grayscale(1);
+}
+.gotSticker {
+    filter: drop-shadow(0 0 10px yellow);
+}
+
+
+html {
+    position: fixed;
+    width: 100vw;
+    height: 100svh;
+}
+main {
+    width: 90%;
+    height: 95%;
+    background: linear-gradient(to bottom left, #1f1f1f, #1e1e1e, #1f1f1f);
+    overflow-x: hidden;
+    overflow-y: scroll;
+    margin-inline: auto;
+
+    display: flex;
+    flex-direction: column;
+    align-content: flex-start;
+    align-items: center;
+    border-radius: 5vw;
+}
+.userContainer {
+    width: 90%;
+    padding-block: 2em;
+    margin-block: 1em;
+    border-radius: 5vw;
+    display: flex;
+    flex-direction: row-reverse;
+    /*align-items: center;*/
+    justify-content: space-evenly;
+
+    row-gap: 1svh;
+
+    & h1 {
+        font-size: 5em;
+        text-align: center;
+        text-shadow: black 0 0.2em 0.5em;
+        letter-spacing: 0.1em;
+        width: 40vw;
+        max-height: 40vw;
+        /*border-bottom: black solid 3px;*/
+        padding-inline: 5%;
+        padding-block: 2%;
+        border-radius: 35%;
+        /*box-shadow: var(--accent-shadow);*/
+        /*background: var(--accent-border);*/
+        align-self: center;
+        text-wrap: normal;
+    }
+    & #userPicture {
+        border-radius: 100%;
+        box-shadow: var(--accent-shadow);
+        overflow: hidden;
+    }
+
+}
+
+
+.rewards {
+    position: relative;
+    display: flex;
+    flex-direction: column;
+    overflow: visible;
+    width: 100%;
+}
+#packsBar {
+    position: relative;
+    display: flex;
+    flex-direction: column;
+    justify-content: space-evenly;
+    text-align: center;
+    width: 100%;
+    & h2 {
+        font-size: 4em;
+        letter-spacing: 0.1em;
+        border-bottom: 10px solid darkred;
+        margin-inline: 5%;
+    }
+
+}
+#allPacksContainer {
+    padding-top: 3em;
+    display: flex;
+    overflow-x: scroll;
+    padding-inline: 20%;
+    justify-content: space-between;
+    border-bottom: 10px solid rgba(139, 0, 0, 0.5);
+    margin-bottom: 2em;
+    & .packName {
+        font-size: 2em;
+        height: 2.4em;
+        overflow: hidden;
+        padding-bottom: 1em;
+        display: flex;
+        justify-content: center;
+        align-content: flex-start;
+
+    }
+    & .packImg {
+        transition: 0.5s ease-in-out 1ms;
+        border-radius: 20%;
+    }
+}
+.packImg:hover {
+    transform: scale(1.5, 1.5)
+}
+.progressionContainer {
+    display: flex;
+    flex-direction: column;
+    height: 18svh;
+    & h1 {
+        font-size: 4em;
+        width: 100%;
+        font-family: 'MedievalSharp', cursive;
+        text-align: center;
+        overflow-x: scroll;
+        overflow-y: hidden;
+    }
+    & .progImgContainer {
+        position: relative;
+        margin-inline: auto;
+        & .progImg {
+            height: 14svh;
+            /*width: 16svh;*/
+            border-radius: 20%;
+        }
+        & .progImgFill {
+            position: absolute;
+            overflow: hidden;
+            width: 50%;
+        }
+        & .progImgOutline {
+            opacity: 0.1;
+            filter: grayscale(1);
+        }
+        & .progText {
+            font-family: Consolas, serif;
+            opacity: 0.5;
+            -webkit-text-stroke: 1px black;
+            position: absolute;
+            text-align: center;
+            width: 16svh;
+            left:50%;
+            transform: translate(-50%, 150%);
+            font-size: 3em;
+        }
+
+    }
+
+}
+
+#stickersBox {
+    width: 100%;
+}
+.stickersContainer {
+    display: flex;
+    flex-wrap: wrap;
+    justify-content: center;
+    margin-top: 2em;
+    row-gap: 2em;
+    height: 100%;
+
+}
+.stickerImg {
+    height: 17em;
+    margin: 1.5em;
+}
+/*}*/
+
+@media only screen
+and (min-device-width: 320px)
+and (max-device-width: 640px) {
+    #userPicture {
+        width: 30vw;
+        height: 30vw;
+        border: solid #989898 0.8em;
+    }
+    .packImg {
+        height: 10svh;
+        width: 15em;
+        padding-inline: 1em;
+        margin-inline: 1em;
+    }
+    #allPacksContainer::-webkit-scrollbar {
+        display: none;
+        -ms-scrollbar-darkshadow-color: transparent;
+    }
+}
+
+@media only screen
+and (min-device-width: 1000px) {
+    #userPicture {
+        width: 200px;
+        height: 200px;
+        border: solid #989898 10px;
+    }
+    #allPacksContainer {
+        padding:0;
+        margin-block: 50px;
+        width: 100%;
+        height: 100%;
+        overflow: visible;
+        border: 5px solid rgba(139, 0, 0, 0.5);
+        justify-content: space-evenly;
+    }
+    .packImg {
+        height: 100px;
+        width: 125px;
+        padding-inline: 1em;
+        margin-inline: 3em;
+    }
+    .packImg:hover{
+        transform: scale(2,2);
+    }
+    .packImg:hover ~ .packName{
+        visibility: visible;
+        opacity: 1;
+    }
+    & .packName {
+        position: absolute;
+        visibility: hidden;
+        text-align: center;
+        left: 50%;
+        transform: translate(-50%);
+        opacity: 0;
+        transition: opacity 1s;
+    }
+    #packsBar {
+        /*height: 250px;*/
+        & h2 {
+            display: none;
+        }
+    }
+    .progressionContainer {
+        height: 20svh;
+    }
+}
\ No newline at end of file
diff --git a/src/main/resources/static/images/LinkedIn.jpg b/src/main/resources/static/images/LinkedIn.jpg
deleted file mode 100644
index 6bf094d20c89883756ec5a105ec2cea1f9eeaf76..0000000000000000000000000000000000000000
Binary files a/src/main/resources/static/images/LinkedIn.jpg and /dev/null differ
diff --git a/src/main/resources/static/images/QRAllTrails.png b/src/main/resources/static/images/QRAllTrails.png
new file mode 100644
index 0000000000000000000000000000000000000000..ed1d4465b3c286eba618b9a459b5a35295bacc8d
Binary files /dev/null and b/src/main/resources/static/images/QRAllTrails.png differ
diff --git a/src/main/resources/static/images/QR_code_for_mobile_English_Wikipedia.svg.png b/src/main/resources/static/images/QR_code_for_mobile_English_Wikipedia.svg.png
new file mode 100644
index 0000000000000000000000000000000000000000..a66fb3c2a1596251164075828413368656bfb0c9
Binary files /dev/null and b/src/main/resources/static/images/QR_code_for_mobile_English_Wikipedia.svg.png differ
diff --git "a/src/main/resources/static/images/Twitter-Log\320\276.png" "b/src/main/resources/static/images/Twitter-Log\320\276.png"
deleted file mode 100644
index c475939bfacb4be3559aab3d58a9a5eadf036afb..0000000000000000000000000000000000000000
Binary files "a/src/main/resources/static/images/Twitter-Log\320\276.png" and /dev/null differ
diff --git a/src/main/resources/static/images/badges.png b/src/main/resources/static/images/badges.png
deleted file mode 100644
index 57e379c719f5fe28ba827d7007be9637cfd9ff73..0000000000000000000000000000000000000000
Binary files a/src/main/resources/static/images/badges.png and /dev/null differ
diff --git a/src/main/resources/static/images/CaerphillyCastle.jpg b/src/main/resources/static/images/banners/CaerphillyCastle.jpg
similarity index 100%
rename from src/main/resources/static/images/CaerphillyCastle.jpg
rename to src/main/resources/static/images/banners/CaerphillyCastle.jpg
diff --git a/src/main/resources/static/images/PenarthBanner.jpg b/src/main/resources/static/images/banners/PenarthBanner.jpg
similarity index 100%
rename from src/main/resources/static/images/PenarthBanner.jpg
rename to src/main/resources/static/images/banners/PenarthBanner.jpg
diff --git a/src/main/resources/static/images/RiscaBanner.jpg b/src/main/resources/static/images/banners/RiscaBanner.jpg
similarity index 100%
rename from src/main/resources/static/images/RiscaBanner.jpg
rename to src/main/resources/static/images/banners/RiscaBanner.jpg
diff --git a/src/main/resources/static/images/Facebook.png b/src/main/resources/static/images/icons/Facebook.png
similarity index 100%
rename from src/main/resources/static/images/Facebook.png
rename to src/main/resources/static/images/icons/Facebook.png
diff --git a/src/main/resources/static/images/Instagram.jpg b/src/main/resources/static/images/icons/Instagram.jpg
similarity index 100%
rename from src/main/resources/static/images/Instagram.jpg
rename to src/main/resources/static/images/icons/Instagram.jpg
diff --git a/src/main/resources/static/images/Linkedin.png b/src/main/resources/static/images/icons/Linkedin.png
similarity index 100%
rename from src/main/resources/static/images/Linkedin.png
rename to src/main/resources/static/images/icons/Linkedin.png
diff --git a/src/main/resources/static/images/Twitter.jpg b/src/main/resources/static/images/icons/Twitter.jpg
similarity index 100%
rename from src/main/resources/static/images/Twitter.jpg
rename to src/main/resources/static/images/icons/Twitter.jpg
diff --git a/src/main/resources/static/images/VZTA.png b/src/main/resources/static/images/icons/VZTA.png
similarity index 100%
rename from src/main/resources/static/images/VZTA.png
rename to src/main/resources/static/images/icons/VZTA.png
diff --git a/src/main/resources/static/images/rewards/packs/0.png b/src/main/resources/static/images/rewards/packs/0.png
new file mode 100644
index 0000000000000000000000000000000000000000..af986ffdeaf3478c06e47ca8f8231b62ee54e862
Binary files /dev/null and b/src/main/resources/static/images/rewards/packs/0.png differ
diff --git a/src/main/resources/static/images/rewards/packs/1.png b/src/main/resources/static/images/rewards/packs/1.png
new file mode 100644
index 0000000000000000000000000000000000000000..af986ffdeaf3478c06e47ca8f8231b62ee54e862
Binary files /dev/null and b/src/main/resources/static/images/rewards/packs/1.png differ
diff --git a/src/main/resources/static/images/rewards/packs/2.png b/src/main/resources/static/images/rewards/packs/2.png
new file mode 100644
index 0000000000000000000000000000000000000000..49e1ffc1ddad8ce3d6806f388f4dd70cd59c233e
Binary files /dev/null and b/src/main/resources/static/images/rewards/packs/2.png differ
diff --git a/src/main/resources/static/images/rewards/dragonFilled.png b/src/main/resources/static/images/rewards/packs/3.png
similarity index 100%
rename from src/main/resources/static/images/rewards/dragonFilled.png
rename to src/main/resources/static/images/rewards/packs/3.png
diff --git a/src/main/resources/static/images/rewards/stickers/1/1.png b/src/main/resources/static/images/rewards/stickers/1/1.png
new file mode 100644
index 0000000000000000000000000000000000000000..82eda396931e573eb4885e99348a6da6af12dd3d
Binary files /dev/null and b/src/main/resources/static/images/rewards/stickers/1/1.png differ
diff --git a/src/main/resources/static/images/rewards/stickers/1/2.png b/src/main/resources/static/images/rewards/stickers/1/2.png
new file mode 100644
index 0000000000000000000000000000000000000000..c3a83c4dc354c66e76318159bf406a82720c1a83
Binary files /dev/null and b/src/main/resources/static/images/rewards/stickers/1/2.png differ
diff --git a/src/main/resources/static/images/rewards/stickers/1/3.png b/src/main/resources/static/images/rewards/stickers/1/3.png
new file mode 100644
index 0000000000000000000000000000000000000000..197da770196d927d3321f17c6fa2b05846a3e589
Binary files /dev/null and b/src/main/resources/static/images/rewards/stickers/1/3.png differ
diff --git a/src/main/resources/static/images/rewards/stickers/1/4.png b/src/main/resources/static/images/rewards/stickers/1/4.png
new file mode 100644
index 0000000000000000000000000000000000000000..824de21bcd8a979419585b88f68b892337905285
Binary files /dev/null and b/src/main/resources/static/images/rewards/stickers/1/4.png differ
diff --git a/src/main/resources/static/images/rewards/stickers/1/5.png b/src/main/resources/static/images/rewards/stickers/1/5.png
new file mode 100644
index 0000000000000000000000000000000000000000..ea442315db144974ad10319936a3f66976b7fc7f
Binary files /dev/null and b/src/main/resources/static/images/rewards/stickers/1/5.png differ
diff --git a/src/main/resources/static/images/rewards/stickers/2/1.png b/src/main/resources/static/images/rewards/stickers/2/1.png
new file mode 100644
index 0000000000000000000000000000000000000000..9db9fe209598c122fac00f272b9a0dac20925b06
Binary files /dev/null and b/src/main/resources/static/images/rewards/stickers/2/1.png differ
diff --git a/src/main/resources/static/images/rewards/stickers/2/2.png b/src/main/resources/static/images/rewards/stickers/2/2.png
new file mode 100644
index 0000000000000000000000000000000000000000..8235ea3febeeeae29076d810dc0a989df02c7b3a
Binary files /dev/null and b/src/main/resources/static/images/rewards/stickers/2/2.png differ
diff --git a/src/main/resources/static/images/rewards/stickers/2/3.png b/src/main/resources/static/images/rewards/stickers/2/3.png
new file mode 100644
index 0000000000000000000000000000000000000000..81f9ca020c4596076834fdbebb6ca2d51a3b5a35
Binary files /dev/null and b/src/main/resources/static/images/rewards/stickers/2/3.png differ
diff --git a/src/main/resources/static/images/rewards/stickers/2/4.png b/src/main/resources/static/images/rewards/stickers/2/4.png
new file mode 100644
index 0000000000000000000000000000000000000000..43a57a6f9d580bd669eb7bc88b1cd56fb43b5c3c
Binary files /dev/null and b/src/main/resources/static/images/rewards/stickers/2/4.png differ
diff --git a/src/main/resources/static/images/rewards/stickers/2/5.png b/src/main/resources/static/images/rewards/stickers/2/5.png
new file mode 100644
index 0000000000000000000000000000000000000000..8926f0b96019ca755895a071a34e7368533ff23d
Binary files /dev/null and b/src/main/resources/static/images/rewards/stickers/2/5.png differ
diff --git a/src/main/resources/static/images/rewards/stickers/3/1.png b/src/main/resources/static/images/rewards/stickers/3/1.png
new file mode 100644
index 0000000000000000000000000000000000000000..d759091a2ffb55680062749f999a238a6ae9c26e
Binary files /dev/null and b/src/main/resources/static/images/rewards/stickers/3/1.png differ
diff --git a/src/main/resources/static/images/rewards/stickers/3/2.png b/src/main/resources/static/images/rewards/stickers/3/2.png
new file mode 100644
index 0000000000000000000000000000000000000000..9d03b83e1e071ab15c4f9fed3a6cb6df597ffb1a
Binary files /dev/null and b/src/main/resources/static/images/rewards/stickers/3/2.png differ
diff --git a/src/main/resources/static/images/rewards/stickers/3/3.png b/src/main/resources/static/images/rewards/stickers/3/3.png
new file mode 100644
index 0000000000000000000000000000000000000000..db70b88cd891c33fcbb3ef5c2b3bcfc8ba6cefb9
Binary files /dev/null and b/src/main/resources/static/images/rewards/stickers/3/3.png differ
diff --git a/src/main/resources/static/images/stats.png b/src/main/resources/static/images/stats.png
deleted file mode 100644
index 39904f1cfc911df01306fb85ab78b015e7d0386c..0000000000000000000000000000000000000000
Binary files a/src/main/resources/static/images/stats.png and /dev/null differ
diff --git a/src/main/resources/static/images/trails.jpg b/src/main/resources/static/images/trails.jpg
deleted file mode 100644
index 20481a4f8a914ae8b272f490e2006dd0afaa5a2b..0000000000000000000000000000000000000000
Binary files a/src/main/resources/static/images/trails.jpg and /dev/null differ
diff --git a/src/main/resources/static/maptestnext.html b/src/main/resources/static/maptestnext.html
new file mode 100644
index 0000000000000000000000000000000000000000..36a66b6e27fdb03115ba51d913407f357698ecea
--- /dev/null
+++ b/src/main/resources/static/maptestnext.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>Quick Start</title>
+    <link rel="stylesheet" href="./mapteststyle.css" type="text/css">
+</head>
+<body>
+<div id="map"></div>
+<script type="module" src="./maptestscript.js"></script>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/main/resources/static/maptestscript.js b/src/main/resources/static/maptestscript.js
new file mode 100644
index 0000000000000000000000000000000000000000..bce3be7a0396ed75d5bf94cb523bae0ca21e7b32
--- /dev/null
+++ b/src/main/resources/static/maptestscript.js
@@ -0,0 +1,18 @@
+
+import Map from '../nodeMods/node_modules/ol/Map.js';
+import OSM from './node_modules/ol/source/OSM.js';
+import TileLayer from './node_modules/ol/layer/Tile.js';
+import View from './node_modules/ol/View.js';
+
+const map = new Map({
+    target: 'map',
+    layers: [
+        new TileLayer({
+            source: new OSM(),
+        }),
+    ],
+    view: new View({
+        center: [0, 0],
+        zoom: 2,
+    }),
+});
\ No newline at end of file
diff --git a/src/main/resources/static/mapteststyle.css b/src/main/resources/static/mapteststyle.css
new file mode 100644
index 0000000000000000000000000000000000000000..a92fb54cf0d6b83efb6540db8e2e45994abd88d4
--- /dev/null
+++ b/src/main/resources/static/mapteststyle.css
@@ -0,0 +1,14 @@
+@import "./node_modules/ol/ol.css";
+
+html,
+body {
+    margin: 0;
+    height: 100%;
+}
+
+#map {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    width: 100%;
+}
\ No newline at end of file
diff --git a/src/main/resources/static/nodeMods/package-lock.json b/src/main/resources/static/nodeMods/package-lock.json
new file mode 100644
index 0000000000000000000000000000000000000000..7780830d1f71e5cd6f2f03f69b670b5fd5ce3b43
--- /dev/null
+++ b/src/main/resources/static/nodeMods/package-lock.json
@@ -0,0 +1,1213 @@
+{
+  "name": "box-selection",
+  "lockfileVersion": 2,
+  "requires": true,
+  "packages": {
+    "": {
+      "name": "box-selection",
+      "dependencies": {
+        "ol": "8.2.0"
+      },
+      "devDependencies": {
+        "vite": "^3.2.3"
+      }
+    },
+    "node_modules/@esbuild/android-arm": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz",
+      "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-loong64": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz",
+      "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==",
+      "cpu": [
+        "loong64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@petamoriken/float16": {
+      "version": "3.8.4",
+      "resolved": "https://registry.npmjs.org/@petamoriken/float16/-/float16-3.8.4.tgz",
+      "integrity": "sha512-kB+NJ5Br56ZhElKsf0pM7/PQfrDdDVMRz8f0JM6eVOGE+L89z9hwcst9QvWBBnazzuqGTGtPsJNZoQ1JdNiGSQ=="
+    },
+    "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=="
+    },
+    "node_modules/color-parse": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-2.0.0.tgz",
+      "integrity": "sha512-g2Z+QnWsdHLppAbrpcFWo629kLOnOPtpxYV69GCqm92gqSgyXbzlfyN3MXs0412fPBkFmiuS+rXposgBgBa6Kg==",
+      "dependencies": {
+        "color-name": "^1.0.0"
+      }
+    },
+    "node_modules/color-rgba": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/color-rgba/-/color-rgba-3.0.0.tgz",
+      "integrity": "sha512-PPwZYkEY3M2THEHHV6Y95sGUie77S7X8v+h1r6LSAPF3/LL2xJ8duUXSrkic31Nzc4odPwHgUbiX/XuTYzQHQg==",
+      "dependencies": {
+        "color-parse": "^2.0.0",
+        "color-space": "^2.0.0"
+      }
+    },
+    "node_modules/color-space": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/color-space/-/color-space-2.0.1.tgz",
+      "integrity": "sha512-nKqUYlo0vZATVOFHY810BSYjmCARrG7e5R3UE3CQlyjJTvv5kSSmPG1kzm/oDyyqjehM+lW1RnEt9It9GNa5JA=="
+    },
+    "node_modules/earcut": {
+      "version": "2.2.4",
+      "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz",
+      "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ=="
+    },
+    "node_modules/esbuild": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz",
+      "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==",
+      "dev": true,
+      "hasInstallScript": true,
+      "bin": {
+        "esbuild": "bin/esbuild"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "optionalDependencies": {
+        "@esbuild/android-arm": "0.15.18",
+        "@esbuild/linux-loong64": "0.15.18",
+        "esbuild-android-64": "0.15.18",
+        "esbuild-android-arm64": "0.15.18",
+        "esbuild-darwin-64": "0.15.18",
+        "esbuild-darwin-arm64": "0.15.18",
+        "esbuild-freebsd-64": "0.15.18",
+        "esbuild-freebsd-arm64": "0.15.18",
+        "esbuild-linux-32": "0.15.18",
+        "esbuild-linux-64": "0.15.18",
+        "esbuild-linux-arm": "0.15.18",
+        "esbuild-linux-arm64": "0.15.18",
+        "esbuild-linux-mips64le": "0.15.18",
+        "esbuild-linux-ppc64le": "0.15.18",
+        "esbuild-linux-riscv64": "0.15.18",
+        "esbuild-linux-s390x": "0.15.18",
+        "esbuild-netbsd-64": "0.15.18",
+        "esbuild-openbsd-64": "0.15.18",
+        "esbuild-sunos-64": "0.15.18",
+        "esbuild-windows-32": "0.15.18",
+        "esbuild-windows-64": "0.15.18",
+        "esbuild-windows-arm64": "0.15.18"
+      }
+    },
+    "node_modules/esbuild-android-64": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz",
+      "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/esbuild-android-arm64": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz",
+      "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/esbuild-darwin-64": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz",
+      "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/esbuild-darwin-arm64": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz",
+      "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/esbuild-freebsd-64": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz",
+      "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/esbuild-freebsd-arm64": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz",
+      "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/esbuild-linux-32": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz",
+      "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/esbuild-linux-64": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz",
+      "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/esbuild-linux-arm": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz",
+      "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/esbuild-linux-arm64": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz",
+      "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/esbuild-linux-mips64le": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz",
+      "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==",
+      "cpu": [
+        "mips64el"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/esbuild-linux-ppc64le": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz",
+      "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/esbuild-linux-riscv64": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz",
+      "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/esbuild-linux-s390x": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz",
+      "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==",
+      "cpu": [
+        "s390x"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/esbuild-netbsd-64": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz",
+      "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "netbsd"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/esbuild-openbsd-64": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz",
+      "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "openbsd"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/esbuild-sunos-64": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz",
+      "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "sunos"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/esbuild-windows-32": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz",
+      "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/esbuild-windows-64": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz",
+      "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/esbuild-windows-arm64": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz",
+      "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/fsevents": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+      "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+      "dev": true,
+      "hasInstallScript": true,
+      "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==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/geotiff": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/geotiff/-/geotiff-2.1.0.tgz",
+      "integrity": "sha512-B/iFJuFfRpmPHXf8aIRPRgUWwfaNb6dlsynkM8SWeHAPu7CpyvfqEa43KlBt7xxq5OTVysQacFHxhCn3SZhRKQ==",
+      "dependencies": {
+        "@petamoriken/float16": "^3.4.7",
+        "lerc": "^3.0.0",
+        "pako": "^2.0.4",
+        "parse-headers": "^2.0.2",
+        "quick-lru": "^6.1.1",
+        "web-worker": "^1.2.0",
+        "xml-utils": "^1.0.2",
+        "zstddec": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=10.19"
+      }
+    },
+    "node_modules/hasown": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
+      "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
+      "dev": true,
+      "dependencies": {
+        "function-bind": "^1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "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"
+        }
+      ]
+    },
+    "node_modules/is-core-module": {
+      "version": "2.13.1",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
+      "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
+      "dev": true,
+      "dependencies": {
+        "hasown": "^2.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/lerc": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/lerc/-/lerc-3.0.0.tgz",
+      "integrity": "sha512-Rm4J/WaHhRa93nCN2mwWDZFoRVF18G1f47C+kvQWyHGEZxFpTUi73p7lMVSAndyxGt6lJ2/CFbOcf9ra5p8aww=="
+    },
+    "node_modules/nanoid": {
+      "version": "3.3.7",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
+      "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "bin": {
+        "nanoid": "bin/nanoid.cjs"
+      },
+      "engines": {
+        "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+      }
+    },
+    "node_modules/ol": {
+      "version": "8.2.0",
+      "resolved": "https://registry.npmjs.org/ol/-/ol-8.2.0.tgz",
+      "integrity": "sha512-/m1ddd7Jsp4Kbg+l7+ozR5aKHAZNQOBAoNZ5pM9Jvh4Etkf0WGkXr9qXd7PnhmwiC1Hnc2Toz9XjCzBBvexfXw==",
+      "dependencies": {
+        "color-rgba": "^3.0.0",
+        "color-space": "^2.0.1",
+        "earcut": "^2.2.3",
+        "geotiff": "^2.0.7",
+        "pbf": "3.2.1",
+        "rbush": "^3.0.1"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/openlayers"
+      }
+    },
+    "node_modules/pako": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz",
+      "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug=="
+    },
+    "node_modules/parse-headers": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz",
+      "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA=="
+    },
+    "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==",
+      "dev": true
+    },
+    "node_modules/pbf": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.2.1.tgz",
+      "integrity": "sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==",
+      "dependencies": {
+        "ieee754": "^1.1.12",
+        "resolve-protobuf-schema": "^2.1.0"
+      },
+      "bin": {
+        "pbf": "bin/pbf"
+      }
+    },
+    "node_modules/picocolors": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+      "dev": true
+    },
+    "node_modules/postcss": {
+      "version": "8.4.32",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz",
+      "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==",
+      "dev": true,
+      "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"
+        }
+      ],
+      "dependencies": {
+        "nanoid": "^3.3.7",
+        "picocolors": "^1.0.0",
+        "source-map-js": "^1.0.2"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >=14"
+      }
+    },
+    "node_modules/protocol-buffers-schema": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz",
+      "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw=="
+    },
+    "node_modules/quick-lru": {
+      "version": "6.1.2",
+      "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-6.1.2.tgz",
+      "integrity": "sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ==",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/quickselect": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz",
+      "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw=="
+    },
+    "node_modules/rbush": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/rbush/-/rbush-3.0.1.tgz",
+      "integrity": "sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==",
+      "dependencies": {
+        "quickselect": "^2.0.0"
+      }
+    },
+    "node_modules/resolve": {
+      "version": "1.22.8",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
+      "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+      "dev": true,
+      "dependencies": {
+        "is-core-module": "^2.13.0",
+        "path-parse": "^1.0.7",
+        "supports-preserve-symlinks-flag": "^1.0.0"
+      },
+      "bin": {
+        "resolve": "bin/resolve"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/resolve-protobuf-schema": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz",
+      "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==",
+      "dependencies": {
+        "protocol-buffers-schema": "^3.3.1"
+      }
+    },
+    "node_modules/rollup": {
+      "version": "2.79.1",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz",
+      "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==",
+      "dev": true,
+      "bin": {
+        "rollup": "dist/bin/rollup"
+      },
+      "engines": {
+        "node": ">=10.0.0"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.2"
+      }
+    },
+    "node_modules/source-map-js": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+      "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "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==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/vite": {
+      "version": "3.2.7",
+      "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.7.tgz",
+      "integrity": "sha512-29pdXjk49xAP0QBr0xXqu2s5jiQIXNvE/xwd0vUizYT2Hzqe4BksNNoWllFVXJf4eLZ+UlVQmXfB4lWrc+t18g==",
+      "dev": true,
+      "dependencies": {
+        "esbuild": "^0.15.9",
+        "postcss": "^8.4.18",
+        "resolve": "^1.22.1",
+        "rollup": "^2.79.1"
+      },
+      "bin": {
+        "vite": "bin/vite.js"
+      },
+      "engines": {
+        "node": "^14.18.0 || >=16.0.0"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.2"
+      },
+      "peerDependencies": {
+        "@types/node": ">= 14",
+        "less": "*",
+        "sass": "*",
+        "stylus": "*",
+        "sugarss": "*",
+        "terser": "^5.4.0"
+      },
+      "peerDependenciesMeta": {
+        "@types/node": {
+          "optional": true
+        },
+        "less": {
+          "optional": true
+        },
+        "sass": {
+          "optional": true
+        },
+        "stylus": {
+          "optional": true
+        },
+        "sugarss": {
+          "optional": true
+        },
+        "terser": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/web-worker": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz",
+      "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA=="
+    },
+    "node_modules/xml-utils": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/xml-utils/-/xml-utils-1.7.0.tgz",
+      "integrity": "sha512-bWB489+RQQclC7A9OW8e5BzbT8Tu//jtAOvkYwewFr+Q9T9KDGvfzC1lp0pYPEQPEoPQLDkmxkepSC/2gIAZGw=="
+    },
+    "node_modules/zstddec": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/zstddec/-/zstddec-0.1.0.tgz",
+      "integrity": "sha512-w2NTI8+3l3eeltKAdK8QpiLo/flRAr2p8AGeakfMZOXBxOg9HIu4LVDxBi81sYgVhFhdJjv1OrB5ssI8uFPoLg=="
+    }
+  },
+  "dependencies": {
+    "@esbuild/android-arm": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz",
+      "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-loong64": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz",
+      "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==",
+      "dev": true,
+      "optional": true
+    },
+    "@petamoriken/float16": {
+      "version": "3.8.4",
+      "resolved": "https://registry.npmjs.org/@petamoriken/float16/-/float16-3.8.4.tgz",
+      "integrity": "sha512-kB+NJ5Br56ZhElKsf0pM7/PQfrDdDVMRz8f0JM6eVOGE+L89z9hwcst9QvWBBnazzuqGTGtPsJNZoQ1JdNiGSQ=="
+    },
+    "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=="
+    },
+    "color-parse": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-2.0.0.tgz",
+      "integrity": "sha512-g2Z+QnWsdHLppAbrpcFWo629kLOnOPtpxYV69GCqm92gqSgyXbzlfyN3MXs0412fPBkFmiuS+rXposgBgBa6Kg==",
+      "requires": {
+        "color-name": "^1.0.0"
+      }
+    },
+    "color-rgba": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/color-rgba/-/color-rgba-3.0.0.tgz",
+      "integrity": "sha512-PPwZYkEY3M2THEHHV6Y95sGUie77S7X8v+h1r6LSAPF3/LL2xJ8duUXSrkic31Nzc4odPwHgUbiX/XuTYzQHQg==",
+      "requires": {
+        "color-parse": "^2.0.0",
+        "color-space": "^2.0.0"
+      }
+    },
+    "color-space": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/color-space/-/color-space-2.0.1.tgz",
+      "integrity": "sha512-nKqUYlo0vZATVOFHY810BSYjmCARrG7e5R3UE3CQlyjJTvv5kSSmPG1kzm/oDyyqjehM+lW1RnEt9It9GNa5JA=="
+    },
+    "earcut": {
+      "version": "2.2.4",
+      "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz",
+      "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ=="
+    },
+    "esbuild": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz",
+      "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==",
+      "dev": true,
+      "requires": {
+        "@esbuild/android-arm": "0.15.18",
+        "@esbuild/linux-loong64": "0.15.18",
+        "esbuild-android-64": "0.15.18",
+        "esbuild-android-arm64": "0.15.18",
+        "esbuild-darwin-64": "0.15.18",
+        "esbuild-darwin-arm64": "0.15.18",
+        "esbuild-freebsd-64": "0.15.18",
+        "esbuild-freebsd-arm64": "0.15.18",
+        "esbuild-linux-32": "0.15.18",
+        "esbuild-linux-64": "0.15.18",
+        "esbuild-linux-arm": "0.15.18",
+        "esbuild-linux-arm64": "0.15.18",
+        "esbuild-linux-mips64le": "0.15.18",
+        "esbuild-linux-ppc64le": "0.15.18",
+        "esbuild-linux-riscv64": "0.15.18",
+        "esbuild-linux-s390x": "0.15.18",
+        "esbuild-netbsd-64": "0.15.18",
+        "esbuild-openbsd-64": "0.15.18",
+        "esbuild-sunos-64": "0.15.18",
+        "esbuild-windows-32": "0.15.18",
+        "esbuild-windows-64": "0.15.18",
+        "esbuild-windows-arm64": "0.15.18"
+      }
+    },
+    "esbuild-android-64": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz",
+      "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==",
+      "dev": true,
+      "optional": true
+    },
+    "esbuild-android-arm64": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz",
+      "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==",
+      "dev": true,
+      "optional": true
+    },
+    "esbuild-darwin-64": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz",
+      "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==",
+      "dev": true,
+      "optional": true
+    },
+    "esbuild-darwin-arm64": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz",
+      "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==",
+      "dev": true,
+      "optional": true
+    },
+    "esbuild-freebsd-64": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz",
+      "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==",
+      "dev": true,
+      "optional": true
+    },
+    "esbuild-freebsd-arm64": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz",
+      "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==",
+      "dev": true,
+      "optional": true
+    },
+    "esbuild-linux-32": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz",
+      "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==",
+      "dev": true,
+      "optional": true
+    },
+    "esbuild-linux-64": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz",
+      "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==",
+      "dev": true,
+      "optional": true
+    },
+    "esbuild-linux-arm": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz",
+      "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==",
+      "dev": true,
+      "optional": true
+    },
+    "esbuild-linux-arm64": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz",
+      "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==",
+      "dev": true,
+      "optional": true
+    },
+    "esbuild-linux-mips64le": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz",
+      "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==",
+      "dev": true,
+      "optional": true
+    },
+    "esbuild-linux-ppc64le": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz",
+      "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==",
+      "dev": true,
+      "optional": true
+    },
+    "esbuild-linux-riscv64": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz",
+      "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==",
+      "dev": true,
+      "optional": true
+    },
+    "esbuild-linux-s390x": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz",
+      "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==",
+      "dev": true,
+      "optional": true
+    },
+    "esbuild-netbsd-64": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz",
+      "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==",
+      "dev": true,
+      "optional": true
+    },
+    "esbuild-openbsd-64": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz",
+      "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==",
+      "dev": true,
+      "optional": true
+    },
+    "esbuild-sunos-64": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz",
+      "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==",
+      "dev": true,
+      "optional": true
+    },
+    "esbuild-windows-32": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz",
+      "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==",
+      "dev": true,
+      "optional": true
+    },
+    "esbuild-windows-64": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz",
+      "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==",
+      "dev": true,
+      "optional": true
+    },
+    "esbuild-windows-arm64": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz",
+      "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==",
+      "dev": true,
+      "optional": true
+    },
+    "fsevents": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+      "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+      "dev": true,
+      "optional": true
+    },
+    "function-bind": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+      "dev": true
+    },
+    "geotiff": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/geotiff/-/geotiff-2.1.0.tgz",
+      "integrity": "sha512-B/iFJuFfRpmPHXf8aIRPRgUWwfaNb6dlsynkM8SWeHAPu7CpyvfqEa43KlBt7xxq5OTVysQacFHxhCn3SZhRKQ==",
+      "requires": {
+        "@petamoriken/float16": "^3.4.7",
+        "lerc": "^3.0.0",
+        "pako": "^2.0.4",
+        "parse-headers": "^2.0.2",
+        "quick-lru": "^6.1.1",
+        "web-worker": "^1.2.0",
+        "xml-utils": "^1.0.2",
+        "zstddec": "^0.1.0"
+      }
+    },
+    "hasown": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
+      "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
+      "dev": true,
+      "requires": {
+        "function-bind": "^1.1.2"
+      }
+    },
+    "ieee754": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+      "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
+    },
+    "is-core-module": {
+      "version": "2.13.1",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
+      "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
+      "dev": true,
+      "requires": {
+        "hasown": "^2.0.0"
+      }
+    },
+    "lerc": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/lerc/-/lerc-3.0.0.tgz",
+      "integrity": "sha512-Rm4J/WaHhRa93nCN2mwWDZFoRVF18G1f47C+kvQWyHGEZxFpTUi73p7lMVSAndyxGt6lJ2/CFbOcf9ra5p8aww=="
+    },
+    "nanoid": {
+      "version": "3.3.7",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
+      "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+      "dev": true
+    },
+    "ol": {
+      "version": "8.2.0",
+      "resolved": "https://registry.npmjs.org/ol/-/ol-8.2.0.tgz",
+      "integrity": "sha512-/m1ddd7Jsp4Kbg+l7+ozR5aKHAZNQOBAoNZ5pM9Jvh4Etkf0WGkXr9qXd7PnhmwiC1Hnc2Toz9XjCzBBvexfXw==",
+      "requires": {
+        "color-rgba": "^3.0.0",
+        "color-space": "^2.0.1",
+        "earcut": "^2.2.3",
+        "geotiff": "^2.0.7",
+        "pbf": "3.2.1",
+        "rbush": "^3.0.1"
+      }
+    },
+    "pako": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz",
+      "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug=="
+    },
+    "parse-headers": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz",
+      "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA=="
+    },
+    "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==",
+      "dev": true
+    },
+    "pbf": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.2.1.tgz",
+      "integrity": "sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==",
+      "requires": {
+        "ieee754": "^1.1.12",
+        "resolve-protobuf-schema": "^2.1.0"
+      }
+    },
+    "picocolors": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+      "dev": true
+    },
+    "postcss": {
+      "version": "8.4.32",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz",
+      "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==",
+      "dev": true,
+      "requires": {
+        "nanoid": "^3.3.7",
+        "picocolors": "^1.0.0",
+        "source-map-js": "^1.0.2"
+      }
+    },
+    "protocol-buffers-schema": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz",
+      "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw=="
+    },
+    "quick-lru": {
+      "version": "6.1.2",
+      "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-6.1.2.tgz",
+      "integrity": "sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ=="
+    },
+    "quickselect": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz",
+      "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw=="
+    },
+    "rbush": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/rbush/-/rbush-3.0.1.tgz",
+      "integrity": "sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==",
+      "requires": {
+        "quickselect": "^2.0.0"
+      }
+    },
+    "resolve": {
+      "version": "1.22.8",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
+      "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+      "dev": true,
+      "requires": {
+        "is-core-module": "^2.13.0",
+        "path-parse": "^1.0.7",
+        "supports-preserve-symlinks-flag": "^1.0.0"
+      }
+    },
+    "resolve-protobuf-schema": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz",
+      "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==",
+      "requires": {
+        "protocol-buffers-schema": "^3.3.1"
+      }
+    },
+    "rollup": {
+      "version": "2.79.1",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz",
+      "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==",
+      "dev": true,
+      "requires": {
+        "fsevents": "~2.3.2"
+      }
+    },
+    "source-map-js": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+      "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+      "dev": true
+    },
+    "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==",
+      "dev": true
+    },
+    "vite": {
+      "version": "3.2.7",
+      "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.7.tgz",
+      "integrity": "sha512-29pdXjk49xAP0QBr0xXqu2s5jiQIXNvE/xwd0vUizYT2Hzqe4BksNNoWllFVXJf4eLZ+UlVQmXfB4lWrc+t18g==",
+      "dev": true,
+      "requires": {
+        "esbuild": "^0.15.9",
+        "fsevents": "~2.3.2",
+        "postcss": "^8.4.18",
+        "resolve": "^1.22.1",
+        "rollup": "^2.79.1"
+      }
+    },
+    "web-worker": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz",
+      "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA=="
+    },
+    "xml-utils": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/xml-utils/-/xml-utils-1.7.0.tgz",
+      "integrity": "sha512-bWB489+RQQclC7A9OW8e5BzbT8Tu//jtAOvkYwewFr+Q9T9KDGvfzC1lp0pYPEQPEoPQLDkmxkepSC/2gIAZGw=="
+    },
+    "zstddec": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/zstddec/-/zstddec-0.1.0.tgz",
+      "integrity": "sha512-w2NTI8+3l3eeltKAdK8QpiLo/flRAr2p8AGeakfMZOXBxOg9HIu4LVDxBi81sYgVhFhdJjv1OrB5ssI8uFPoLg=="
+    }
+  }
+}
diff --git a/src/main/resources/static/nodeMods/package.json b/src/main/resources/static/nodeMods/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..78be07f225c43e51803bab02b08008eac5d5aa40
--- /dev/null
+++ b/src/main/resources/static/nodeMods/package.json
@@ -0,0 +1,13 @@
+{
+  "name": "box-selection",
+  "dependencies": {
+    "ol": "8.2.0"
+  },
+  "devDependencies": {
+    "vite": "^3.2.3"
+  },
+  "scripts": {
+    "start": "vite",
+    "build": "vite build"
+  }
+}
\ No newline at end of file
diff --git a/src/main/resources/static/qr-scanner.html b/src/main/resources/static/qr-scanner.html
new file mode 100644
index 0000000000000000000000000000000000000000..2e93c18b5decfdb0f2b2f3e390e87dd9a8600661
--- /dev/null
+++ b/src/main/resources/static/qr-scanner.html
@@ -0,0 +1,29 @@
+<!--setup html page for QR codes - R Nute-->
+<!--Modified from (https://www.geeksforgeeks.org/create-a-qr-code-scanner-or-reader-in-html-css-javascript/)-->
+
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewpoint" content="width-device-width, initial-scale=1.0">
+    <link rel="stylesheet" href="css/templatingstyle.css">
+    <link rel="stylesheet" href="css/qrstyle.css">
+    <script src="https://unpkg.com/html5-qrcode"></script>
+    <script type="module" src="scripts/qr-script.js"></script>
+    <title>QR Code</title>
+</head>
+
+<body>
+    <header th:insert="towns/Templating.html :: header"></header>
+
+    <div class="container">
+        <h1>Scan location QR code</h1>
+        <div class="section">
+            <div id="qr-code-reader">
+            </div>
+        </div>
+    </div>
+
+    <div th:insert="towns/Templating.html :: footer"></div>
+</body>
+</html>
diff --git a/src/main/resources/static/scripts/login.js b/src/main/resources/static/scripts/login.js
index 929b8b61e7a6f0f71a97937b2bdf2fcd83a5ce4f..38ef327134aa8ae03ddc44ddf796b2df139fc3bb 100644
--- a/src/main/resources/static/scripts/login.js
+++ b/src/main/resources/static/scripts/login.js
@@ -46,4 +46,6 @@ function validateForm(){
         return false;
     }
     //TODO SERVER SIDE VALIDATION AND CHECK AGAINST USERS DB TABLE
-}
\ No newline at end of file
+}
+
+
diff --git a/src/main/resources/static/scripts/mapAPI.js b/src/main/resources/static/scripts/mapAPI.js
new file mode 100644
index 0000000000000000000000000000000000000000..6af8c3b085396384779093efaca5f777112a7537
--- /dev/null
+++ b/src/main/resources/static/scripts/mapAPI.js
@@ -0,0 +1,153 @@
+import GeoJSON from '/nodeMods/node_modules/ol/format/GeoJSON.js';
+import Map from '/nodeMods/node_modules/ol/Map.js';
+import VectorLayer from '/nodeMods/node_modules/ol/source/Vector.js'
+import VectorSource from '/nodeMods/node_modules/ol/source/Vector.js';
+import View from '/nodeMods/node_modules/ol/View.js';
+import {DragBox, Select} from '/nodeMods/node_modules/ol/interaction.js';
+import {Fill, Stroke, Style} from '/nodeMods/node_modules/ol/style.js';
+import {getWidth} from '/nodeMods/node_modules/ol/extent.js';
+import {platformModifierKeyOnly} from '/nodeMods/node_modules/ol/events/condition.js';
+// //Invesitgate created directories mnode module mapstest and extent.js
+// import GeoJSON from '/node_modules/ol/format/GeoJSON.js';
+// import Map from '/ol/Map.js';
+// import VectorLayer from '/ol/layer/Vector.js';
+// import VectorSource from '/ol/source/Vector.js';
+// import View from '/ol/View.js';
+// import {DragBox, Select} from '/ol/interaction.js';
+// import {Fill, Stroke, Style} from '/ol/style.js';
+// import {getWidth} from '/ol/extent.js';
+// import {platformModifierKeyOnly} from '/ol/events/condition.js';
+
+
+const vectorSource = new VectorSource({
+    url: 'https://openlayers.org/data/vector/ecoregions.json',
+    format: new GeoJSON(),
+});
+
+const style = new Style({
+    fill: new Fill({
+        color: '#eeeeee',
+    }),
+});
+
+const map = new Map({
+    layers: [
+        new VectorLayer({
+            source: vectorSource,
+            background: '#1a2b39',
+            style: function (feature) {
+                const color = feature.get('COLOR_BIO') || '#eeeeee';
+                style.getFill().setColor(color);
+                return style;
+            },
+        }),
+    ],
+    target: 'map',
+    view: new View({
+        center: [0, 0],
+        zoom: 2,
+        constrainRotation: 16,
+    }),
+});
+
+const selectedStyle = new Style({
+    fill: new Fill({
+        color: 'rgba(255, 255, 255, 0.6)',
+    }),
+    stroke: new Stroke({
+        color: 'rgba(255, 255, 255, 0.7)',
+        width: 2,
+    }),
+});
+
+// a normal select interaction to handle click
+const select = new Select({
+    style: function (feature) {
+        const color = feature.get('COLOR_BIO') || '#eeeeee';
+        selectedStyle.getFill().setColor(color);
+        return selectedStyle;
+    },
+});
+map.addInteraction(select);
+
+const selectedFeatures = select.getFeatures();
+
+// a DragBox interaction used to select features by drawing boxes
+const dragBox = new DragBox({
+    condition: platformModifierKeyOnly,
+});
+
+map.addInteraction(dragBox);
+
+dragBox.on('boxend', function () {
+    const boxExtent = dragBox.getGeometry().getExtent();
+
+    // if the extent crosses the antimeridian process each world separately
+    const worldExtent = map.getView().getProjection().getExtent();
+    const worldWidth = getWidth(worldExtent);
+    const startWorld = Math.floor((boxExtent[0] - worldExtent[0]) / worldWidth);
+    const endWorld = Math.floor((boxExtent[2] - worldExtent[0]) / worldWidth);
+
+    for (let world = startWorld; world <= endWorld; ++world) {
+        const left = Math.max(boxExtent[0] - world * worldWidth, worldExtent[0]);
+        const right = Math.min(boxExtent[2] - world * worldWidth, worldExtent[2]);
+        const extent = [left, boxExtent[1], right, boxExtent[3]];
+
+        const boxFeatures = vectorSource
+            .getFeaturesInExtent(extent)
+            .filter(
+                (feature) =>
+                    !selectedFeatures.getArray().includes(feature) &&
+                    feature.getGeometry().intersectsExtent(extent)
+            );
+
+        // features that intersect the box geometry are added to the
+        // collection of selected features
+
+        // if the view is not obliquely rotated the box geometry and
+        // its extent are equalivalent so intersecting features can
+        // be added directly to the collection
+        const rotation = map.getView().getRotation();
+        const oblique = rotation % (Math.PI / 2) !== 0;
+
+        // when the view is obliquely rotated the box extent will
+        // exceed its geometry so both the box and the candidate
+        // feature geometries are rotated around a common anchor
+        // to confirm that, with the box geometry aligned with its
+        // extent, the geometries intersect
+        if (oblique) {
+            const anchor = [0, 0];
+            const geometry = dragBox.getGeometry().clone();
+            geometry.translate(-world * worldWidth, 0);
+            geometry.rotate(-rotation, anchor);
+            const extent = geometry.getExtent();
+            boxFeatures.forEach(function (feature) {
+                const geometry = feature.getGeometry().clone();
+                geometry.rotate(-rotation, anchor);
+                if (geometry.intersectsExtent(extent)) {
+                    selectedFeatures.push(feature);
+                }
+            });
+        } else {
+            selectedFeatures.extend(boxFeatures);
+        }
+    }
+});
+
+// clear selection when drawing a new box and when clicking on the map
+dragBox.on('boxstart', function () {
+    selectedFeatures.clear();
+});
+
+const infoBox = document.getElementById('info');
+
+selectedFeatures.on(['add', 'remove'], function () {
+    const names = selectedFeatures.getArray().map((feature) => {
+        return feature.get('ECO_NAME');
+    });
+    if (names.length > 0) {
+        infoBox.innerHTML = names.join(', ');
+    } else {
+        infoBox.innerHTML = 'None';
+    }
+});
\ No newline at end of file
diff --git a/src/main/resources/static/scripts/qr-script.js b/src/main/resources/static/scripts/qr-script.js
new file mode 100644
index 0000000000000000000000000000000000000000..ff2bbf82d70a4bbf152239e568ccc7052b4c8438
--- /dev/null
+++ b/src/main/resources/static/scripts/qr-script.js
@@ -0,0 +1,28 @@
+//qr-script file - R Nute
+//Modified from (https://www.geeksforgeeks.org/create-a-qr-code-scanner-or-reader-in-html-css-javascript/)
+function domReady(fn){
+    if (
+        document.readyState === "complete" ||
+        document.readyState === "interactive"
+    ){
+        setTimeout(fn, 1000);
+    } else {
+        document.addEventListener("DOMContentLoaded", fn);
+    }
+}
+domReady(function (message){
+    //if QR code found
+    function onScanSuccess(decodeText, decodeResult){
+        alert("You have collected: " + decodeText, decodeResult);
+        // Open the result, what methods are available through the HTML5 Qr scanner node package?
+        window.open(decodeText);
+        // Record the result, see above.
+        // Get user and tie to user account, intergrate with database, retrieving and storing under user info.
+    }
+    let htmlscanner = new Html5QrcodeScanner(
+    "qr-code-reader",
+    { fps: 20, qrbos: 250}
+    );
+    htmlscanner.render(onScanSuccess);
+});
+
diff --git a/src/main/resources/static/scripts/userPage.js b/src/main/resources/static/scripts/userPage.js
new file mode 100644
index 0000000000000000000000000000000000000000..2c1d5069ad652b854abf6b8cb460d7ebf89d696f
--- /dev/null
+++ b/src/main/resources/static/scripts/userPage.js
@@ -0,0 +1,11 @@
+function updatePack(userid, packid) {
+    /* Updates the trail being shown on screen to the one requested by ID */
+    $.get("/packInfo/" + userid + "/" + packid).done(function (fragment) {
+        let packRewardsWrapper = $("#packRewardsWrapper");
+
+        packRewardsWrapper.fadeTo("slow", 0, function () {
+            packRewardsWrapper.html(fragment)
+            packRewardsWrapper.fadeTo("slow", 1);
+        })
+    });
+}
\ No newline at end of file
diff --git a/src/main/resources/static/test.html b/src/main/resources/static/test.html
deleted file mode 100644
index 98a5d8ce3c443e9b3c9e183848b038b11f2df7de..0000000000000000000000000000000000000000
--- a/src/main/resources/static/test.html
+++ /dev/null
@@ -1,11 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <title>asdasd</title>
-</head>
-<body>
-sadasdasdasd
-
-</body>
-</html>
\ No newline at end of file
diff --git a/src/main/resources/static/users.html b/src/main/resources/static/users.html
deleted file mode 100644
index 566549bdf8fae810809c1a81066000687cb338f6..0000000000000000000000000000000000000000
--- a/src/main/resources/static/users.html
+++ /dev/null
@@ -1,10 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <title>Title</title>
-</head>
-<body>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/src/main/resources/templates/allTrails/allTrails.html b/src/main/resources/templates/allTrails/allTrails.html
index 746762b68f64b62190bf71e102edf0ff309772d9..d29d1ad91cf459383b4681678742ed0a2cacbcd6 100644
--- a/src/main/resources/templates/allTrails/allTrails.html
+++ b/src/main/resources/templates/allTrails/allTrails.html
@@ -10,7 +10,7 @@
 </head>
 <body>
 
-<header th:replace="~{/towns/Templating.html :: header}"></header>
+<header th:replace="~{/fragments/Templating.html :: header}"></header>
 
 <main>
     <section id="allTrailsBar" class="centerFlex">
@@ -31,7 +31,7 @@
     </section>
 
 </main>
-<footer th:insert="~{/towns/Templating.html :: footer}"></footer>
+<footer th:insert="~{/fragments/Templating.html :: footer}"></footer>
 
 
 <script type="text/javascript" th:src="@{scripts/allTrails.js}"></script>
diff --git a/src/main/resources/templates/towns/Templating.html b/src/main/resources/templates/fragments/Templating.html
similarity index 74%
rename from src/main/resources/templates/towns/Templating.html
rename to src/main/resources/templates/fragments/Templating.html
index 6489d68abb0d02413a90cf0a77e4dbb498dfaed5..55dba5e66042ad586fca111f9432a4c90f50742b 100644
--- a/src/main/resources/templates/towns/Templating.html
+++ b/src/main/resources/templates/fragments/Templating.html
@@ -2,7 +2,7 @@
 <link rel="stylesheet" href="../../static/css/templatingstyle.css">
 <header class="headerBar" th:fragment="header">
     <div class="Logo">
-        <img src="/images/VZTA.png" height="97" width="400" alt="VZTA Logo"/>
+        <img src="/images/icons/VZTA.png" height="97" width="400" alt="VZTA Logo"/>
     </div>
     <nav class="navBar">
         <ul>
@@ -41,10 +41,10 @@
         <div class="centerFooter">
                         <span class="footerText">
                             <h3>Follow Us</h3>
-                            <a href="https://www.facebook.com/VZTAsmarttowns/" class="icon"><img src="/images/Facebook.png" height="25" width="25" alt="Facebook Logo" class="icon"/></a>
-                            <a href="https://www.twitter.com/VZTAsmarttowns/" class="icon"><img src="/images/Twitter.jpg" height="25" width="25" alt="X (formally Twitter) Logo" class="icon"/></a>
-                            <a href="https://www.instagram.com/vztasmarttowns/" class="icon"><img src="/images/Instagram.jpg" height="25" width="25" alt="Instagram Logo" class="icon"/></a>
-                            <a href="https://www.linkin.com/company/vztasmarttowns/" class="icon"><img src="/images/Linkedin.png" height="25" width="25" alt="Linkedin Logo" class="icon"/></a><br>
+                            <a href="https://www.facebook.com/VZTAsmarttowns/" class="icon"><img src="/images/icons/Facebook.png" height="25" width="25" alt="Facebook Logo" class="icon"/></a>
+                            <a href="https://www.twitter.com/VZTAsmarttowns/" class="icon"><img src="/images/icons/Twitter.jpg" height="25" width="25" alt="X (formally Twitter) Logo" class="icon"/></a>
+                            <a href="https://www.instagram.com/vztasmarttowns/" class="icon"><img src="/images/icons/Instagram.jpg" height="25" width="25" alt="Instagram Logo" class="icon"/></a>
+                            <a href="https://www.linkin.com/company/vztasmarttowns/" class="icon"><img src="/images/icons/Linkedin.png" height="25" width="25" alt="Linkedin Logo" class="icon"/></a><br>
                         </span>
         </div>
         <div class="copyright" style="text-align: left">
diff --git a/src/main/resources/templates/fragments/locationPageFrags.html b/src/main/resources/templates/fragments/locationPageFrags.html
new file mode 100644
index 0000000000000000000000000000000000000000..9cb90e48b97924a4bc53092a7aa86593d20bbf8a
--- /dev/null
+++ b/src/main/resources/templates/fragments/locationPageFrags.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<html lang="en" th:fragment="locationSection" class="locationPageFrag">
+<!-- todo check if this is ok here-->
+<head>
+    <meta charset="UTF-8">
+    <title th:text="${location.getLocationName()}"></title>
+
+    <link rel="stylesheet" th:href="@{/css/templatingstyle.css}">
+    <link rel="stylesheet" th:href="@{/css/locationPageFragsStyle.css}">
+</head>
+<body >
+<header th:insert="~{/fragments/Templating.html::header}"></header>
+    <main>
+
+        <hr style="height:40px; visibility:hidden;" />
+        <article class="locationFragment">
+
+            <H1 th:text="${location.getLocationName()}" > </H1>
+            <H4 th:text="${location.getLocationPlace()}" id="townHeader"> </H4>
+            <p th:text="${location.getLocationDescription()}"></p>
+
+
+            <iframe
+                    width="600"
+                    height="400"
+                    frameborder="0"
+                    scrolling="yes"
+                    marginheight="0"
+                    marginwidth="0"
+                    th:src="'https://maps.google.com/maps?q='+ ${locCoord.getLocationCoordsLat()} +','+ ${locCoord.getLocationCoordsLong()} +'&hl=en&z=20&amp;output=embed'">
+            </iframe>
+
+        </article>
+        <hr style="height:40px; visibility:hidden;" />
+    </main>
+
+<footer th:insert="~{/fragments/Templating.html::footer}"></footer>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/main/resources/templates/fragments/temp_frags.html b/src/main/resources/templates/fragments/temp_frags.html
deleted file mode 100644
index 03efad3ee73e973e0faf7401b7d3b0de2e1578e4..0000000000000000000000000000000000000000
--- a/src/main/resources/templates/fragments/temp_frags.html
+++ /dev/null
@@ -1,23 +0,0 @@
-<header th:fragment="header" class="headerBlock">
-    <h1 class="headerTitle">SMART-TOWNS</h1>
-    <div class="headerBanner">
-        <img src="images/trails.jpg" alt="Trails" class="bannerBack">
-<!--        <div class="bannerText">-->
-            <h1 class="bigTitle">Smart Town Trails</h1>
-            <h2 class="smallTitle">Information about trails for your town</h2>
-<!--        </div>-->
-    </div>
-</header>
-<footer th:fragment="footer">
-    <ul class="footerBar">
-        <li class="footerButton">Home</li>
-        <li class="footerButton">About</li>
-        <li class="footerButton">Map</li>
-        <li class="footerButton">Facilities</li>
-        <li class="footerButton">Search</li>
-    </ul>
-</footer>
-
-<article class="trailInfo" th:fragment="trailInfo2">
-    <h1 class="titleH1" th:text="${trail.name}">Trail Info</h1>
-</article>
\ No newline at end of file
diff --git a/src/main/resources/templates/home.html b/src/main/resources/templates/home.html
deleted file mode 100644
index 47b1dc1353c7c96bcb3409f54558ff18c4da6cf4..0000000000000000000000000000000000000000
--- a/src/main/resources/templates/home.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<!DOCTYPE html>
-<html>
-
-<head>
-    <title>Website Web</title>
-    <link rel="stylesheet" th:href="@{css/style.css}">
-    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
-</head>
-
-<body>
-    <header th:replace="fragments/temp_frags.html :: header"></header>
-    <main>
-        <div class="trailList">
-            <ul class="ulHeader">
-                <li onclick="selectTrail('trail1', this)" class="liHeader" id="trail1" >Trail 1</li>
-                <li onclick="selectTrail('trail2', this)" class="liHeader selected" id="trail2" >Trail 2</li>
-                <li onclick="selectTrail('trail3', this)" class="liHeader" id="trail3" >Trail 3</li>
-                <li onclick="updateOutput()" class="liHeader" id="trail4" >Trail 4</li>
-            </ul>
-        </div>
-
-      <section class="mainBlock">
-        <article class="trailStats">
-            <h1 class="titleH1">Trail Stats</h1>
-            <img src="../static/images/stats.png" alt="Stats" class="stats">
-            <div class="textStats">
-                <p><b>Explored:</b> 60%</p>
-                <p><b>Landmarks Visited:</b> 3/5</p>
-                <p><b>Shops Visited:</b> 6/10</p>
-            </div>
-        </article>
-        <article id="trailInfoBox" class="trailInfo"></article>
-        <article class="badgesBlock">
-            <h1 class="titleH1">Badges</h1>
-            <div class="badgesList">
-                <img src="../static/images/badges.png" alt="Badge" class="badgeImg">
-                <img src="../static/images/badges.png" alt="Badge" class="badgeImg">
-                <img src="../static/images/badges.png" alt="Badge" class="badgeImg">
-                <img src="../static/images/badges.png" alt="Badge" class="badgeImg">
-                <img src="../static/images/badges.png" alt="Badge" class="badgeImg">
-            </div>
-            
-          </article>  
-      </section>
-    </main>
-
-    <footer th:replace="fragments/temp_frags.html :: footer"></footer>
-    <script src="https://code.jquery.com/jquery-1.9.1.js"></script>
-    <script type="text/javascript" th:src="@{scripts/gabScripts.js}"></script>
-</body>
-</html>
\ No newline at end of file
diff --git a/src/main/resources/templates/Landmarks/LandmarkFormTh.html b/src/main/resources/templates/landmarks/LandmarkFormTh.html
similarity index 94%
rename from src/main/resources/templates/Landmarks/LandmarkFormTh.html
rename to src/main/resources/templates/landmarks/LandmarkFormTh.html
index b77bb90ece04cc582bc5fa5ea369bd8ba45e864b..0f7879d8277ad1012ffefaae75fc49d70b6932ca 100644
--- a/src/main/resources/templates/Landmarks/LandmarkFormTh.html
+++ b/src/main/resources/templates/landmarks/LandmarkFormTh.html
@@ -10,7 +10,7 @@
 
 </head>
 <body>
-<header th:insert="~{/towns/Templating.html :: header}"></header>
+<header th:insert="~{/fragments/Templating.html :: header}"></header>
 <hr style="height:20px; visibility:hidden;" />
 <H2 id="landmarkFormTitle"> Interested in joining our trails? Sign up Here! </H2>
 <main>
@@ -60,6 +60,6 @@
 </main>
 
 
-<footer th:insert="~{/towns/Templating.html :: footer}"></footer>
+<footer th:insert="~{/fragments/Templating.html :: footer}"></footer>
 </body>
 </html>
\ No newline at end of file
diff --git a/src/main/resources/templates/landmarks/locationPage.html b/src/main/resources/templates/landmarks/locationPage.html
new file mode 100644
index 0000000000000000000000000000000000000000..7cf62c6f4cb81dd98416bf95f89c973b7714c40f
--- /dev/null
+++ b/src/main/resources/templates/landmarks/locationPage.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Checkpoint</title>
+<!--    todo make this a list per trail or per town that when clicked brings to unique location page-->
+    <link rel="stylesheet" th:href="@{/css/templatingstyle.css}">
+</head>
+<body>
+
+<main>
+    <header th:insert="~{/fragments/Templating.html::header}"></header>
+    <div th:each="coord, indexValue:${locationCoords}">
+        <p th:text="*{coord.getLocationID()}"></p>
+<!--        <p th:text="${locations[indexValue.index]}"></p>-->
+        <H1 th:text="${location[indexValue.index].getLocationName()}"> </H1>
+        <H4 th:text="${location[indexValue.index].getLocationPlace()}"> </H4>
+        <p th:text="${location[indexValue.index].getLocationDescription()}"></p>
+
+
+        <iframe
+                width="600"
+                height="400"
+                frameborder="0"
+                scrolling="yes"
+                marginheight="0"
+                marginwidth="0"
+                th:src="'https://maps.google.com/maps?q='+ ${coord.getLocationCoordsLat()} +','+ ${coord.getLocationCoordsLong()} +'&hl=en&z=20&amp;output=embed'">
+        </iframe>
+        <br />
+<!--        <small>-->
+<!--&lt;!&ndash;            <a&ndash;&gt; //https://maps.google.com/maps?q=51.57623,-3.21910&hl=es&z=14&amp;output=embed">-->
+<!--                    th:href="https://maps.google.com/maps?q='+{coord.getLocationCoordsLat()}+','+*{coord.getLocationCoordsLong()}+'&hl=es;z=14&amp;output=embed"-->
+<!--                    style="color:#0000FF;text-align:left"-->
+<!--                    target="_blank"-->
+<!--            >-->
+<!--                See map bigger-->
+<!--            </a>-->
+<!--        </small>-->
+
+    </div>
+
+
+</main>
+<footer th:insert="~{/fragments/Templating.html::footer}"></footer>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/main/resources/templates/rewards/userProfile.html b/src/main/resources/templates/rewards/userProfile.html
deleted file mode 100644
index a193bf7614603637614dd0cfdc0974fdd8c44767..0000000000000000000000000000000000000000
--- a/src/main/resources/templates/rewards/userProfile.html
+++ /dev/null
@@ -1,73 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <title th:text="'VZLA Profile Page of ' + ${user.getName()}"></title>
-    <link rel="stylesheet" th:href="@{/css/userProfile.css}">
-<!--    <link rel="stylesheet" th:href="@{/css/templatingstyle.css}">-->
-</head>
-<body>
-
-<header>
-    <ul class="footerBar">
-        <li class="footerButton"><b>Home</b></li>
-        <li class="footerButton"><b>About</b></li>
-        <li class="footerButton"><b>Map</b></li>
-        <li class="footerButton"><b>Facilities</b></li>
-        <li class="footerButton"><b>Log In</b></li>
-    </ul>
-</header>
-
-<main>
-    <!--PICTURE - DATA - BADGES -->
-    <div class="userInfo">
-        <img th:src="@{${user.getImgPath()}}"
-             th:alt="${user.getName()}"
-             id="userPicture"
-        >
-        <h1 th:text="${user.getName()}"></h1>
-        <!--TODO add some progression info here?-->
-    </div>
-    <section class="rewards"> <!--Reward lists, badges on top, stickers (larger) on the bottom-->
-        <article id="badgesBar">
-            <h2>Your Badges: </h2> <!--Shows first earned badges, followed by greyed out badges-->
-            <div id="allBadgesContainer"  class="centerFlex">
-                <img class="badgeImg"  th:each="badge : ${badges}" th:src="@{'..' + ${badge.getImgPath()}}"
-                     th:id="'img' + ${badge.getId()}" th:alt="${badge.getName()}" >
-            </div>
-        </article>
-        <article class="dragonProgression">
-            <h1>The Dragon's Tale</h1>
-            <div class="dragonContainer">
-                <div class="dragonFill" th:style="'width:'+ ${user.getDragonProgress()} + '%;'">
-                    <img th:src="@{/images/rewards/dragonFilled.png}"
-                         alt="Filled Dragon" id="FilledDragon" class="dragonImg">
-                </div>
-                <div class="dragonOut">
-                    <img th:src="@{/images/rewards/dragonOutline.png}"
-                         alt="Outline Dragon" id="OutlineDragon" class="dragonImg">
-                </div>
-            </div>
-            <h2 th:text="${user.getDragonProgress()} + '%'"></h2>
-        </article>
-        <article id="stickersBox"> <!--Need a controller to show earned stickers -->
-            <h2> STICKERS! </h2>
-            <div class="stickersContainer">
-                <img th:class="'stickerImg ' + ${sticker.getVisibility()}"  th:each="sticker : ${stickers}" th:src="@{'../' + ${sticker.getImgPath()}}"
-                     th:id="'img' + ${sticker.getId()}" th:alt="${sticker.getName()}" >
-            </div>
-        </article>
-    </section>
-
-
-</main>
-
-<footer>
-
-</footer>
-
-
-<script>
-</script>
-</body>
-</html>
\ No newline at end of file
diff --git a/src/main/resources/templates/towns/caerphilly.html b/src/main/resources/templates/towns/caerphilly.html
index 912da813737475d83dfc3af4c0ff4010189ec7f5..11d4aabb9ef479d9e67bc5c19419ec0f9c47d3eb 100644
--- a/src/main/resources/templates/towns/caerphilly.html
+++ b/src/main/resources/templates/towns/caerphilly.html
@@ -171,7 +171,7 @@
     <link rel="stylesheet" th:href="@{/css/templatingstyle.css}">
 </head>
 <body>
-<header th:insert="~{/towns/Templating.html::header}"></header>
+<header th:insert="~{/fragments/Templating.html::header}"></header>
 <main>
     <div class="container">
         <h1 class="townName"> Welcome to the town of Caerphilly.</h1>
@@ -215,7 +215,7 @@
 
     </div>
 </main>
-<footer th:insert="~{/towns/Templating.html::footer}"></footer>
+<footer th:insert="~{/fragments/Templating.html::footer}"></footer>
 </body>
 
 </html>
\ No newline at end of file
diff --git a/src/main/resources/templates/towns/home/homePage.html b/src/main/resources/templates/towns/home/homePage.html
index 2cdc1e854fba95f89dd2da702bbeb6d5011ed5d8..ec489ae7d334997390462ef1ffbe0d3ceaf5c828 100644
--- a/src/main/resources/templates/towns/home/homePage.html
+++ b/src/main/resources/templates/towns/home/homePage.html
@@ -8,7 +8,7 @@
 </head>
 <body>
 
-<header th:insert="~{/towns/Templating.html::header}"></header>
+<header th:insert="~{/fragments/Templating.html::header}"></header>
 <main>
   <div class="gridContainer1">
       <H1 id="homeTitle"> VZTA Smart Towns - Trails</H1>
@@ -56,7 +56,7 @@ rough % outline;
   </div>
 
 </main>
-<footer th:insert="~{/towns/Templating.html::footer}"></footer>
+<footer th:insert="~{/fragments/Templating.html::footer}"></footer>
 
 </body>
 </html>
diff --git a/src/main/resources/templates/towns/home/homePageOld.html b/src/main/resources/templates/towns/home/homePageOld.html
index bf35e662607a4b2a101aeef83f3a05a65fd50ad2..ce51066c3313d03de40e19be1b1bf951bcc9b6b7 100644
--- a/src/main/resources/templates/towns/home/homePageOld.html
+++ b/src/main/resources/templates/towns/home/homePageOld.html
@@ -9,7 +9,7 @@
 </head>
 <body>
 
-<header th:insert="~{/towns/Templating.html::header}"></header>
+<header th:insert="~{/fragments/Templating.html::header}"></header>
 <main>
 <div class="gridContainer1">
     <H1 id="homeTitle"> VZTA Smart Towns - Trails</H1>
@@ -60,7 +60,7 @@
 
 
 </main>
-<footer th:insert="~{/towns/Templating.html::footer}"></footer>
+<footer th:insert="~{/fragments/Templating.html::footer}"></footer>
 
 </body>
 </html>
diff --git a/src/main/resources/templates/towns/mapsTest/index.html b/src/main/resources/templates/towns/mapsTest/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..564d189b468ef43294c8b5a16f0865b41efd30b4
--- /dev/null
+++ b/src/main/resources/templates/towns/mapsTest/index.html
@@ -0,0 +1,64 @@
+<!--<!DOCTYPE html>-->
+<!--<html lang="en">-->
+<!--<head>-->
+<!--    <meta charset="UTF-8">-->
+<!--    <title>MAPTEST</title>-->
+<!--    <link rel="stylesheet" th:href="@{/css/templatingstyle.css}">-->
+<!--    <link rel="stylesheet" th:href="@{/css/styling.css}">-->
+<!--    <script type="module" src="/scripts/mapAPI.js"></script>-->
+<!--&lt;!&ndash;    href="node_modules/ol/ol.css">&ndash;&gt;-->
+
+<!--    <style>-->
+
+<!--        #map{-->
+<!--            position: absolute;-->
+<!--            top: 0;-->
+<!--            bottom: 0;-->
+<!--            width: 100%;-->
+<!--        }-->
+
+<!--    </style>-->
+<!--</head>-->
+<!--<body>-->
+<!--<header th:insert="~{/towns/Templating.html::header}"></header>-->
+<!--<main>-->
+
+
+<!--    <H1> Map API Test Here</H1>-->
+
+<!--&lt;!&ndash;    <div class="map2">&ndash;&gt;-->
+<!--&lt;!&ndash;&lt;!&ndash;        test data from hackathon&ndash;&gt;&ndash;&gt;-->
+<!--&lt;!&ndash;        <p> Google maps embedding;</p>&ndash;&gt;-->
+<!--&lt;!&ndash;        <iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d9933.490822613407!2d-3.1845439261935375!3d51.506377949006364!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x486e1c8d0919099f%3A0x60bea7f0ae155f28!2sRoath%20Park!5e0!3m2!1sen!2suk!4v1698921027199!5m2!1sen!2suk" width="600" height="450" style="border:0;" allowfullscreen="" loading="lazy" referrerpolicy="no-referrer-when-downgrade"></iframe>&ndash;&gt;-->
+<!--&lt;!&ndash;    </div>&ndash;&gt;-->
+
+<!--    <div id="map" ></div>-->
+<!--    <div>Selected regions: <span id="info">None</span></div>-->
+
+
+
+
+<!--</main>-->
+<!--<footer th:insert="~{/towns/Templating.html::footer}"></footer>-->
+<!--</body>-->
+<!--</html>-->
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Box Selection</title>
+    <link rel="stylesheet" href="/nodeMods/node_modules/ol/ol.css">
+    <style>
+        .map {
+            width: 100%;
+            height: 400px;
+        }
+    </style>
+</head>
+<body>
+<div id="map" class="map"></div>
+<div>Selected regions: <span id="info">None</span></div>
+
+<script type="module" src="/scripts/mapAPI.js"></script>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/main/resources/templates/towns/templates.server/Templating.html b/src/main/resources/templates/towns/templates.server/Templating.html
deleted file mode 100644
index 14343a76ea3cc2974dbdd50cc7bd3ade124adc17..0000000000000000000000000000000000000000
--- a/src/main/resources/templates/towns/templates.server/Templating.html
+++ /dev/null
@@ -1,149 +0,0 @@
-<header class="headerBar th:fragment="header">
-
-            <div class="Logo">
-                <img th:src="@{images/VZTA.png}" alt="VZTA Logo">
-            </div>
-            <nav class="navBar">
-                <ul>
-                    <li>Home</li>
-                    <li>FAQs</li>
-                    <li>Contact us</li>
-                </ul>
-                <label class="work">Who  we Work with:</label>
-                    <select>
-                        <ul>
-                            <option value="localauthorities">Local Authorities</option>
-                            <option value="towns">Towns</option>
-                            <option value="businesses">Businesses</option>
-                            <option value="consumers">Consumers</option>
-                        </ul>
-                    </select>
-            </nav>
-        </header>
-
-        <div class="footerBar" th:fragment="footer">
-            <div class="containerFooter">
-                <div class="leftFooter">
-                    <h3>VZTA</h3>
-                    Near Me Now LTD
-                    <br>Britania House
-                    <br>Caerphilly Business Park
-                    <br>Caerphilly
-                    <br>CF83 3GG
-                </div>
-                <div class="rightFooter">
-                    <h3>Connect with us</h3>
-                    <p>Be the first to know about updates by joining out Community page</p>
-                    (C) VZTA 2022<br>
-                    Policy Terms and Conditions
-                </div>
-                    <div class="centerFooter">
-                        <span class="footerText">
-                            <h3>Follow Us</h3>
-                            <a th:href=="https://www.facebook.com/VZTAsmarttowns/" class="icon"></a><img th:src="@{images/Facebook.png}" alt="Facebook Logo" class="picture">
-                            <a th:href=="https://www.twitter.com/VZTAsmarttowns/" class="icon"></a><img th:src="@{images/Twitter-Logo.png}" alt="X (formally Twitter) Logo" class="picture">
-                            <a th:href=="https://www.instagram.com/vztasmarttowns/" class="icon"></a><img th:src="@{images/Instagram.jpg}" alt="Instagram Logo" class="picture">
-                            <a th:href=="https://'www.linkin.com/company/vztasmarttowns/" class="icon"></a><img th:src="@{images/LinkedIn.jpg}" alt="Linkedin Logo" class="picture"> <br>
-                        </span>
-                        </div>
-                            <div class="copyright" style="text-align: left">
-
-                            </div>
-                    </div>
-            </div>
-</div>
-<style>
-    /* Header */
-    .headerBar {
-        border-bottom: 2px rgb(230, 230, 230) solid;
-        margin-bottom: 20px;
-        display: flex;
-        background: blueviolet;
-    }
-    /* Navbar Links */
-    .navBar {
-        margin-top: 50px;
-        margin-left: auto;
-        margin-right:20px;
-        text-align: right;
-    }
-    .work{
-        color: rgb(255, 255, 255);
-    }
-    .navBar ul {
-        list-style: none;
-        display: flex;
-        margin-left: 100px;
-    }
-    .navBar a {
-        border-left: 2px rgb(185, 185, 185) solid;
-        padding: 10px 40px;
-        text-decoration: none;
-        color:rgb(87, 86, 86);
-        white-space: nowrap;
-        overflow: hidden;
-        float: right;
-    }
-    .navBar a:hover {
-        background-color: rgb(209, 209, 209);
-    }
-    .navBar li{
-        margin-left: 10px;
-        margin-right: 10px;
-        color: rgb(255, 255, 255);
-    }
-    .navListLast {
-        border-right: 2px rgb(185, 185, 185) solid;
-        margin-right:40px;
-    }
-
-    /* Navbar Logo */
-    .Logo {
-        margin-left:10px;
-        padding: 20px;
-        width: fit-content;
-    }
-    .Logo img {
-        width: 120px;
-        margin-left:15px;
-    }
-
-    /* Footer */
-    footer {
-        margin-top:20px;
-        display: flex;
-        justify-content: center;
-    }
-    .footerBar{
-        border-top: 2px rgb(230, 230, 230) solid;
-        text-align: left;
-        display: flex;
-        background: blueviolet;
-        color: rgb(255, 255, 255);
-        padding-left: 30px;
-    }
-    .footerBar ul {
-        list-style: none;
-        display: flex;
-    }
-    .copyright{
-        text-align: left;
-        display: flex;
-    }
-    .containerFooter{
-        display: flex;
-        flex-direction: row;
-    }
-    .leftFooter{
-        flex:1;
-        color: rgb(255, 255,255);
-    }
-    .centerFooter{
-        flex: 1;
-        color: rgb(255, 255,255);
-    }
-    .rightFooter{
-        flex:1;
-        color: rgb(255, 255, 255);
-    }
-</style>
\ No newline at end of file
diff --git a/src/main/resources/templates/towns/trails/dragonstale/index.html b/src/main/resources/templates/towns/trails/dragonstale/index.html
index 80aa32934673ddca22af19a7f7772a378ce9c774..7cf5948e993116ac247cf9c8aaac3d1ece2e8762 100644
--- a/src/main/resources/templates/towns/trails/dragonstale/index.html
+++ b/src/main/resources/templates/towns/trails/dragonstale/index.html
@@ -8,7 +8,7 @@
     <script src="./node_modules/html5-qrcode/html5-qrcode.min.js"></script>
 </head>
     <body>
-        <header th:insert="towns/Templating.html :: header"></header>
+        <header th:insert="fragments/Templating.html :: header"></header>
 
         <!-- As this predefined trail will be accessible from multiple different towns, this thymeleaf element will display the town the user is currently trying to access and display it accordingly.   <span th:text="${townName}">  -->
         <div class="centre">
@@ -49,7 +49,7 @@
             <button type="button" id="begin">Click here!</button>
         </div>
 
-        <div th:insert="towns/Templating.html :: footer"></div>
+        <div th:insert="fragments/Templating.html :: footer"></div>
 
         <script>
 
diff --git a/src/main/resources/templates/rewards/login.html b/src/main/resources/templates/users/login.html
similarity index 100%
rename from src/main/resources/templates/rewards/login.html
rename to src/main/resources/templates/users/login.html
diff --git a/src/main/resources/templates/users/userFrags.html b/src/main/resources/templates/users/userFrags.html
new file mode 100644
index 0000000000000000000000000000000000000000..5b5e8201f805bdcbed9234da8c39d6a4b79e94f7
--- /dev/null
+++ b/src/main/resources/templates/users/userFrags.html
@@ -0,0 +1,28 @@
+<!-- @thymesVar id="sticker" type="Team5.SmartTowns.rewards.Sticker" -->
+<!-- @thymesVar id="user" type="Team5.SmartTowns.users.User" -->
+<!-- @thymesVar id="selectedPack" type="Team5.SmartTowns.rewards.Pack" -->
+<div th:fragment="stickersBox" id="packRewardsWrapper">
+  <article class="progressionContainer">
+    <h1 th:text="${selectedPack.getName()}"></h1>
+    <div class="progImgContainer">
+      <div class="progImgFill" th:style="'width:'+ ${progress} + '%;'">
+        <img th:src="@{'../' + ${selectedPack.getDisplayImg()}}"
+             alt="Filled Dragon" id="FilledDragon" class="progImg">
+      </div>
+      <div class="progText">
+        <p th:text="${progress} + '%'"></p>
+      </div>
+      <div class="progImgOutline">
+        <img th:src="@{'../' + ${selectedPack.getDisplayImg()}}"
+             alt="Outline Dragon" id="OutlineDragon" class="progImg">
+      </div>
+    </div>
+  </article>
+
+  <article id="stickersBox">
+    <div class="stickersContainer">
+      <img th:class="'stickerImg ' + ${sticker.getVisibility()}"  th:each="sticker : ${stickers}" th:src="@{'../' + ${sticker.getDisplayImg()}}"
+           th:id="'img' + ${sticker.getId()}" th:alt="${sticker.getName()}" >
+    </div>
+  </article>
+</div>
\ No newline at end of file
diff --git a/src/main/resources/templates/users/userProfile.html b/src/main/resources/templates/users/userProfile.html
new file mode 100644
index 0000000000000000000000000000000000000000..3e865175760bc4b0aa11c9b54aade5d312ac55b5
--- /dev/null
+++ b/src/main/resources/templates/users/userProfile.html
@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title th:text="'VZLA Profile Page of ' + ${user.getName()}"></title>
+    <link rel="stylesheet" th:href="@{/css/userProfile2.css}">
+    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
+<!--    <link rel="stylesheet" th:href="@{/css/templatingstyle.css}">-->
+</head>
+<body>
+
+<!--<header>-->
+<!--    <ul class="footerBar">-->
+<!--        <li class="footerButton"><b>Home</b></li>-->
+<!--        <li class="footerButton"><b>About</b></li>-->
+<!--        <li class="footerButton"><b>Map</b></li>-->
+<!--        <li class="footerButton"><b>Facilities</b></li>-->
+<!--        <li class="footerButton"><b>Log In</b></li>-->
+<!--    </ul>-->
+<!--</header>-->
+
+<main>
+    <!--PICTURE - DATA - BADGES -->
+    <div class="userContainer">
+        <h1 th:text="${user.getName()}"></h1>
+        <img th:src="@{${user.getImgPath()}}"
+             th:alt="${user.getName()}"
+             id="userPicture"
+        >
+
+        <!--TODO add some progression info here?-->
+    </div>
+    <section class="rewards"> <!--Reward lists, badges on top, stickers (larger) on the bottom-->
+        <article id="packsBar">
+            <h2>Packs</h2>
+             <!--Shows first earned badges, followed by greyed out badges-->
+            <div id="allPacksContainer"  class="centerFlex">
+                <div th:each="pack : ${packs}"  class="packContainer">
+                    <img class="packImg"   th:src="@{'../' + ${pack.getDisplayImg()}}"
+                         th:id="'packImg' + ${pack.getId()}" th:alt="${pack.getName()}"
+                         th:onclick="'updatePack(' + ${user.getId()} +',' + ${pack.getId()} +');'">
+                    <h4 class="packName" th:text="${pack.getName()}"></h4>
+                </div>
+            </div>
+        </article>
+        <article th:replace="~{users/userFrags.html::stickersBox}" id="stickersBox"></article>
+    </section>
+
+
+</main>
+
+<footer>
+
+</footer>
+<script type="text/javascript" th:src="@{../scripts/userPage.js}"></script>
+
+<script>
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/test/java/Team5/SmartTowns/SmartTownsApplicationTests.java b/src/test/java/Team5/SmartTowns/SmartTownsApplicationTests.java
index d9c15a4bf0557ca94619ec9f61d0d83d2180c7c3..320fa59b1281d8b7a194e69d497022bff55d5571 100644
--- a/src/test/java/Team5/SmartTowns/SmartTownsApplicationTests.java
+++ b/src/test/java/Team5/SmartTowns/SmartTownsApplicationTests.java
@@ -1,7 +1,24 @@
 package Team5.SmartTowns;
 
+import Team5.SmartTowns.data.DatabaseController;
+import Team5.SmartTowns.data.Location;
+import Team5.SmartTowns.data.LocationRepository;
+import Team5.SmartTowns.data.LocationRepositoryJDBC;
+import Team5.SmartTowns.landmarks.Landmarks;
+import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.jdbc.core.JdbcTemplate;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.lang.annotation.Inherited;
+import java.util.List;
+
+
+
 
 @SpringBootTest
 class SmartTownsApplicationTests {
@@ -10,4 +27,41 @@ class SmartTownsApplicationTests {
 	void contextLoads() {
 	}
 
-}
+
+
+
+
+//	private static Location location;
+//	private static locationRepositoryJDBC locationRepo;
+//	private static JdbcTemplate jdbc;
+//	@BeforeAll
+//	public static void before() {
+//		location = new Location();
+//		locationRepo = new locationRepositoryJDBC(jdbc);}
+//	@BeforeAll
+//	public static void before2() {
+//		locationRepo = new locationRepositoryJDBC(jdbc); }
+//	@Autowired
+//	private locationRepository locationRepository;
+
+//	@Test
+//	public void whenAddingLocationsNonApprovedLocationsDontShowInTrails(){
+//		/// Discover number of approved/unapproved locations before adding tests
+//		List<Location> approvedNumber = locationRepo.approvedLocations();
+//	}
+////		Location loc1= new Location("TestFail", "Test@PleaseFail.test", "Fail Description here",
+////				"Caerphilly", 103, false);
+////		Location loc2= new Location("TestFail", "Test@PleaseFail2.test", "Fail Description here",
+////				"Caerphilly", 103, false);
+////		Location loc3= new Location("TestPass", "Test@PleasePass.test", "Pass Description here",
+////				"Caerphilly", 103, true);
+////		locationRepository.addLocation(loc1);
+////		locationRepository.addLocation(loc2);
+////		locationRepository.addLocation(loc3);
+////		List<Location> ApprovedNumberAfter=locationRepository.approvedLocations();
+////
+////		assertEquals(1,( ApprovedNumber.size()-ApprovedNumberAfter.size()));
+//		}
+	}
+
+// create test where getFullListLocations and getFullApproved/Unapporved lcopations from lcoationcooirds matches locationJDBC