Ejemplo n.º 1
0
        public async Task <bool> SendTask(TasksDto task)
        {
            var user     = UserService.Instance.GetLoggedUser();
            var taskRest = new TasksRest
            {
                Name  = task.Name,
                Type  = task.Typ,
                Email = user.Name,
                Token = user.ApiToken
            };
            var taskJson    = JsonConvert.SerializeObject(taskRest);
            var contentUser = new StringContent(taskJson, Encoding.UTF8, "application/json");
            var uri         = new Uri($"{Ip}/Task");

            try
            {
                var response = await _client.PutAsync(uri, contentUser);

                if (!response.IsSuccessStatusCode)
                {
                    return(false);
                }
                task.SyncStatus = SyncStatus.Uploaded;
                await UserService.Instance.SaveTask(task);

                return(true);
            }
            catch (Exception)
            {
                return(false);
            }
        }
Ejemplo n.º 2
0
        public async Task <int> InsertTask(TasksDto tasksDto)
        {
            var task = Mapper.Map <Tasks>(tasksDto);
            await _database.InsertAsync(task);

            return(task.TaskId);
        }
Ejemplo n.º 3
0
        public async Task <int> UpdateTask(TasksDto taskDto)
        {
            var task = Mapper.Map <Tasks>(taskDto);
            await _database.UpdateAsync(task);

            return(task.TaskId);
        }
Ejemplo n.º 4
0
        public async Task <TasksDto> GetTask(TasksDto taskDto)
        {
            var task   = Mapper.Map <Tasks>(taskDto);
            var result = await _database.Table <Tasks>().Where(t => t.Name == task.Name).FirstOrDefaultAsync();

            taskDto = Mapper.Map <TasksDto>(result);
            return(taskDto);
        }
Ejemplo n.º 5
0
        private async void PlanTaskStartButton_OnClicked(object sender, EventArgs e)
        {
            if (ActivityName != null)
            {
                var start = PlanTaskStartTime.Time + " " + PlanTaskStartDate.Date.ToString("dd/MM/yyyy");
                var time  = DateTime.ParseExact(start, "HH:mm:ss dd/MM/yyyy", null);
                if (time < DateTime.Now)
                {
                    await DisplayAlert("Error", "Wprowadzona data jest wcześniejsza niż obecna", "Ok");

                    return;
                }
                var newTask = new TasksDto
                {
                    Name = ActivityName.Text,
                    Typ  = _typSelected
                };
                if (await UserService.Instance.GetTask(newTask) == null)
                {
                    newTask.TaskId = await UserService.Instance.SaveTask(newTask);
                }
                else
                {
                    newTask = await UserService.Instance.GetTask(newTask);
                }
                var newActivity = new ActivitiesDto
                {
                    Guid    = Guid.NewGuid().ToString(),
                    UserId  = UserService.Instance.GetLoggedUser().UserId,
                    TaskId  = newTask.TaskId,
                    GroupId = 1,
                    Status  = StatusType.Planned,
                    Comment = ActivityDescription.Text,
                };
                newActivity.ActivityId = await UserService.Instance.SaveActivity(newActivity);

                var part = new PartsOfActivityDto
                {
                    ActivityId = newActivity.ActivityId,
                    Start      = start,
                    Stop       = "",
                    Duration   = "0"
                };
                part.PartId = await UserService.Instance.SavePartOfActivity(part);

                DependencyService.Get <INotificationService>().LoadNotifications(newTask.Name, "Naciśnij aby rozpocząć aktywność", part.ActivityId,
                                                                                 DateTime.ParseExact(part.Start, "HH:mm:ss dd/MM/yyyy", null));
                await SynchronizationService.Instance.SendPlanned(newActivity, newTask);

                await Navigation.PushModalAsync(new NavigationPage(new MainPage()));
            }
            else
            {
                await DisplayAlert("Error", "Nie podałeś nazwy aktywności", "Ok");
            }
        }
Ejemplo n.º 6
0
        private async void FavoritePicker_OnSelectedIndexChanged(object sender, EventArgs e)
        {
            var select  = FavoritePicker.Items[FavoritePicker.SelectedIndex];
            var taskDto = new TasksDto
            {
                Name = select
            };
            var task = await UserService.Instance.GetTask(taskDto);

            StartTaskName.Text = task.Name;
        }
Ejemplo n.º 7
0
        public async Task <int> SaveTask(TasksDto tasksDto)
        {
            if (tasksDto.TaskId != 0)
            {
                var update = await Database.UpdateTask(tasksDto);

                return(update);
            }
            var insert = await Database.InsertTask(tasksDto);

            return(insert);
        }
Ejemplo n.º 8
0
        private async void FavoritePicker_OnSelectedIndexChanged(object sender, EventArgs e)
        {
            var select  = FavoritePicker.Items[FavoritePicker.SelectedIndex];
            var taskDto = new TasksDto
            {
                Name = select
            };
            var task = await UserService.Instance.GetTask(taskDto);

            TaskName.Text          = task.Name;
            ActivityName.Text      = task.Name;
            TypePickerImage.Source = ImagesService.Instance.SelectImage(task.Typ);
        }
Ejemplo n.º 9
0
        public IHttpActionResult AddTasks([FromBody] TasksDto tasksDto)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest());
            }

            var tasks = Mapper.Map <TasksDto, Tasks>(tasksDto);

            _uow.TasksRepository.Add(tasks);
            _uow.Save();
            tasksDto.Id = tasks.Id;
            return(Created(new Uri(Request.RequestUri + "/" + tasksDto.Id), tasksDto));
        }
Ejemplo n.º 10
0
        private async void StartTaskButton_OnClicked(object sender, EventArgs e)
        {
            if (StartTaskName.Text != null)
            {
                var newTask = new TasksDto
                {
                    Name = StartTaskName.Text,
                    Typ  = _typSelected
                };
                var task = await UserService.Instance.GetTask(newTask);

                if (task == null)
                {
                    newTask.TaskId = await UserService.Instance.SaveTask(newTask);
                }
                else
                {
                    newTask = await UserService.Instance.GetTask(newTask);
                }
                var newActivity = new ActivitiesDto
                {
                    Guid    = Guid.NewGuid().ToString(),
                    TaskId  = newTask.TaskId,
                    UserId  = UserService.Instance.GetLoggedUser().UserId,
                    Status  = StatusType.Start,
                    Comment = StartTaskDescription.Text
                };
                newActivity.ActivityId = await UserService.Instance.SaveActivity(newActivity);

                var date = DateTime.Now.ToString("HH:mm:ss dd/MM/yyyy");
                var part = new PartsOfActivityDto
                {
                    ActivityId = newActivity.ActivityId,
                    Start      = date,
                    Stop       = "",
                    Duration   = "0"
                };
                part.PartId = await UserService.Instance.SavePartOfActivity(part);

                StopwatchesService.Instance.AddStopwatch(part.PartId);
                await Navigation.PushModalAsync(new NavigationPage(new MainPage()));
            }
            else
            {
                await DisplayAlert("Error", "Nie podałeś nazwy aktywności", "Ok");
            }
        }
Ejemplo n.º 11
0
        public async Task <bool> SendActivity(ActivitiesDto activity, TasksDto task)
        {
            var parts = await UserService.Instance.GetPartsOfActivityByActivityId(activity.ActivityId);

            var list = parts.Select(partsOfActivityDto => new PartsOfActivityRest
            {
                Start    = partsOfActivityDto.Start,
                Stop     = partsOfActivityDto.Stop,
                Duration = TimeSpan.FromMilliseconds(int.Parse(partsOfActivityDto.Duration)).ToString("G", CultureInfo.InvariantCulture)
            })
                       .ToList();
            var user         = UserService.Instance.GetLoggedUser();
            var activityRest = new ActivitiesRest
            {
                Guid          = activity.Guid,
                Comment       = activity.Comment,
                EditState     = EditState.EditedOnMobile,
                TaskName      = task.Name,
                UserEmail     = user.Name,
                Token         = user.ApiToken,
                State         = activity.Status,
                GroupName     = null,
                TaskPartsList = list
            };
            var activityJson    = JsonConvert.SerializeObject(activityRest);
            var contentActivity = new StringContent(activityJson, Encoding.UTF8, "application/json");
            var uri             = new Uri($"{Ip}/Activity");

            try
            {
                var response = await _client.PutAsync(uri, contentActivity);

                if (!response.IsSuccessStatusCode)
                {
                    return(false);
                }
                activity.SyncStatus = SyncStatus.Uploaded;
                await UserService.Instance.SaveActivity(activity);

                return(true);
            }
            catch (Exception)
            {
                return(false);
            }
        }
Ejemplo n.º 12
0
        public async Task <bool> SendPlanned(ActivitiesDto activity, TasksDto task)
        {
            var user     = UserService.Instance.GetLoggedUser();
            var lastPart = await UserService.Instance.GetLastActivityPart(activity.ActivityId);

            var lastPartRest = new PartsOfActivityRest
            {
                Start    = lastPart.Start,
                Stop     = lastPart.Stop,
                Duration = lastPart.Duration
            };
            var plannedRest = new PlannedRest
            {
                Comment   = activity.Comment,
                EditState = EditState.EditedOnMobile,
                GroupName = null,
                Guid      = activity.Guid,
                State     = activity.Status,
                TaskName  = task.Name,
                TaskPart  = lastPartRest,
                UserEmail = user.Name,
                Token     = user.ApiToken
            };
            var taskJson    = JsonConvert.SerializeObject(plannedRest);
            var contentTask = new StringContent(taskJson, Encoding.UTF8, "application/json");
            var uri         = new Uri($"{Ip}/Planned");

            try
            {
                var response = await _client.PutAsync(uri, contentTask);

                if (!response.IsSuccessStatusCode)
                {
                    return(false);
                }
                activity.SyncStatus = SyncStatus.Uploaded;
                await UserService.Instance.SaveActivity(activity);

                return(true);
            }
            catch (Exception)
            {
                return(false);
            }
        }
Ejemplo n.º 13
0
        public IHttpActionResult UpdateTasks([FromUri] int id, [FromBody] TasksDto tasksDto)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest());
            }

            var tasksInDb = _uow.TasksRepository.GetAll().SingleOrDefault(t => t.Id == id);

            if (tasksInDb == null)
            {
                return(NotFound());
            }

            Mapper.Map(tasksDto, tasksInDb);

            _uow.Save();
            return(Ok());
        }
Ejemplo n.º 14
0
        public async Task <IActionResult> GetUserTasks(string projectId, string listId)
        {
            var Users = await _context.Users.FromSql("SELECT * from AspNetUsers where AspNetUsers.Id in (select UserCards.UserId from UserCards where UserCards.TrelloCardId in (SELECT TrelloCards.Id from TrelloCards where TrelloCards.IdList = '" + listId + "'))and AspNetUsers.Id in (SELECT ProjectUsers.UserId from ProjectUsers where ProjectUsers.ProjectId = " + projectId + ")").ToListAsync();


            List <TasksDto> theList = new List <TasksDto>();

            foreach (var user in Users)
            {
                var taskList = await _context.TrelloCards.FromSql("select * from TrelloCards where TrelloCards.Id in (Select UserCards.TrelloCardId from UserCards where UserCards.UserId = " + user.Id + " )and TrelloCards.IdList in (Select TrelloLists.Id from TrelloLists where TrelloLists.Id = '" + listId + "' and TrelloLists.IdBoard in (select Projects.TrelloBoardId from Projects where Projects.Id = " + projectId + "))").Select(x => x.Name).ToListAsync();

                var usersTask = new TasksDto()
                {
                    CardNames = taskList, UserName = user.UserName
                };

                theList.Add(usersTask);
            }

            return(Ok(theList));
        }
        private async void AcceptButton_OnClicked(object sender, EventArgs e)
        {
            if (_task.Name != null)
            {
                if (await UserService.Instance.GetTask(_task) == null)
                {
                    _task.TaskId = await UserService.Instance.SaveTask(_task);

                    _activity.TaskId = _task.TaskId;
                    _activity.Status = StatusType.Stop;
                    await UserService.Instance.SaveActivity(_activity);

                    await SynchronizationService.Instance.SendTask(_task);

                    await SynchronizationService.Instance.SendActivity(_activity, _task);

                    await Navigation.PushModalAsync(new NavigationPage(new MainPage()));
                }
                else
                {
                    _task = await UserService.Instance.GetTask(_task);

                    _activity.TaskId = _task.TaskId;
                    _activity.Status = StatusType.Stop;
                    await UserService.Instance.SaveActivity(_activity);

                    if (_task.SyncStatus == SyncStatus.ToUpload)
                    {
                        await SynchronizationService.Instance.SendTask(_task);
                    }
                    await SynchronizationService.Instance.SendActivity(_activity, _task);

                    await Navigation.PushModalAsync(new NavigationPage(new MainPage()));
                }
            }
            else
            {
                await DisplayAlert("Error", "Nie wprowadziłeś danych", "Ok");
            }
        }
Ejemplo n.º 16
0
        private async void FavoritePicker_OnSelectedIndexChanged(object sender, EventArgs e)
        {
            var select  = FavoritePicker.Items[FavoritePicker.SelectedIndex];
            var taskDto = new TasksDto
            {
                Name = select
            };
            var task = await UserService.Instance.GetTask(taskDto);

            var fav = await UserService.Instance.GetFavoriteByTaskId(task.TaskId);

            if (fav != null)
            {
                AddFavorite.IsVisible = false;
            }
            TaskName.Text          = task.Name;
            _task.TaskId           = task.TaskId;
            _task.Name             = task.Name;
            _task.Typ              = task.Typ;
            ActivityName.Text      = task.Name;
            TypePickerImage.Source = ImagesService.Instance.SelectImage(task.Typ);
        }
Ejemplo n.º 17
0
        public async Task <bool> DeletePlanned(ActivitiesDto activity, TasksDto task)
        {
            var user = UserService.Instance.GetLoggedUser();
            var uri  = new Uri($"{Ip}/Planned/?guid={activity.Guid}&email={user.Name}&token={user.ApiToken}");

            try
            {
                var response = await _client.DeleteAsync(uri);

                if (!response.IsSuccessStatusCode)
                {
                    return(false);
                }
                activity.SyncStatus = SyncStatus.Uploaded;
                await UserService.Instance.SaveActivity(activity);

                return(true);
            }
            catch (Exception)
            {
                return(false);
            }
        }
Ejemplo n.º 18
0
        private async Task Initial()
        {
            _activity = await UserService.Instance.GetActivity(_initItem.ActivityId);

            _part = await UserService.Instance.GetLastActivityPart(_activity.ActivityId);

            if (_initItem.TaskId != 0)
            {
                _task = await UserService.Instance.GetTaskById(_activity.TaskId);

                var fav = await UserService.Instance.GetFavoriteByTaskId(_initItem.TaskId);

                if (fav != null)
                {
                    AddFavorite.IsVisible = false;
                }
            }
            else
            {
                _task = new TasksDto
                {
                    Name = _initItem.Name,
                    Typ  = "Inne"
                };
            }
            TypePickerImage.Source = ImagesService.Instance.SelectImage(_task.Typ);
            TaskDate.Text          = _part.Start;
            _startTime             = _initItem.Time;
            var t      = TimeSpan.FromMilliseconds(_startTime + StopwatchesService.Instance.GetStopwatchTime(_part.PartId));
            var answer = $"{t.Hours:D2}:{t.Minutes:D2}:{t.Seconds:D2}";

            TaskDuration.Text = answer;
            UpdateButtons();
            _timer.Elapsed += UpdateTime;
            _timer.Interval = 1000;
            _timer.Start();
        }
Ejemplo n.º 19
0
        public async Task <TasksDto> GetTask(TasksDto tasksDto)
        {
            var update = await Database.GetTask(tasksDto);

            return(update);
        }
Ejemplo n.º 20
0
        public async Task <bool> GetActivities()
        {
            var user = UserService.Instance.GetLoggedUser();
            var uri  = new Uri($"{Ip}/Activity/?email={user.Name}&token={user.ApiToken}");

            try
            {
                var response = await _client.GetAsync(uri);

                if (!response.IsSuccessStatusCode)
                {
                    return(false);
                }
                var content = await response.Content.ReadAsStringAsync();

                var activities = JsonConvert.DeserializeObject <List <ActivitiesRest> >(content);
                foreach (var activity in activities)
                {
                    var find  = false;
                    var guids = await UserService.Instance.GetActivitiesByStatus(StatusType.Stop);

                    foreach (var item in guids)
                    {
                        if (item.Guid != activity.Guid)
                        {
                            continue;
                        }
                        find = true;
                        if (activity.EditState == EditState.EditedOnWeb)
                        {
                            item.Comment    = activity.Comment;
                            item.GroupId    = int.Parse(activity.GroupName);
                            item.SyncStatus = SyncStatus.Received;
                            var taskDto = new TasksDto
                            {
                                Name = activity.TaskName
                            };
                            var task = await UserService.Instance.GetTask(taskDto);

                            if (task == null)
                            {
                                taskDto.TaskId = await UserService.Instance.SaveTask(taskDto);
                            }
                            else
                            {
                                taskDto.TaskId = task.TaskId;
                            }
                            item.TaskId     = taskDto.TaskId;
                            item.ActivityId = await UserService.Instance.SaveActivity(item);

                            var parts = await UserService.Instance.GetPartsOfActivityByActivityId(item.ActivityId);

                            if (activity.TaskPartsList.Count == parts.Count)
                            {
                                var i = 0;
                                foreach (var part in parts)
                                {
                                    part.Start = activity.TaskPartsList[i].Start;
                                    part.Stop  = activity.TaskPartsList[i].Stop;
                                    var t = TimeSpan.Parse(activity.TaskPartsList[i].Duration,
                                                           CultureInfo.InvariantCulture)
                                            .TotalMilliseconds;
                                    var time = (int)t;
                                    part.Duration = time.ToString();
                                    await UserService.Instance.SavePartOfActivity(part);

                                    i++;
                                }
                            }
                            else if (activity.TaskPartsList.Count < parts.Count)
                            {
                                var i = 0;
                                foreach (var part in parts)
                                {
                                    if (i >= activity.TaskPartsList.Count)
                                    {
                                        await UserService.Instance.DeletePartOfActivity(part);
                                    }
                                    else
                                    {
                                        part.Start = activity.TaskPartsList[i].Start;
                                        part.Stop  = activity.TaskPartsList[i].Stop;
                                        var t = TimeSpan
                                                .Parse(activity.TaskPartsList[i].Duration, CultureInfo.InvariantCulture)
                                                .TotalMilliseconds;
                                        var time = (int)t;
                                        part.Duration = time.ToString();
                                        await UserService.Instance.SavePartOfActivity(part);
                                    }
                                    i++;
                                }
                            }
                            else if (activity.TaskPartsList.Count > parts.Count)
                            {
                                var i = 0;
                                foreach (var part in parts)
                                {
                                    if (i >= parts.Count)
                                    {
                                        var t = TimeSpan
                                                .Parse(activity.TaskPartsList[i].Duration, CultureInfo.InvariantCulture)
                                                .TotalMilliseconds;
                                        var time    = (int)t;
                                        var newPart = new PartsOfActivityDto
                                        {
                                            ActivityId = item.ActivityId,
                                            Start      = activity.TaskPartsList[i].Start,
                                            Stop       = activity.TaskPartsList[i].Stop,
                                            Duration   = time.ToString()
                                        };
                                        await UserService.Instance.SavePartOfActivity(newPart);
                                    }
                                    else
                                    {
                                        part.Start = activity.TaskPartsList[i].Start;
                                        part.Stop  = activity.TaskPartsList[i].Stop;
                                        var t = TimeSpan
                                                .Parse(activity.TaskPartsList[i].Duration, CultureInfo.InvariantCulture)
                                                .TotalMilliseconds;
                                        var time = (int)t;
                                        part.Duration = time.ToString();
                                        await UserService.Instance.SavePartOfActivity(part);
                                    }
                                    i++;
                                }
                            }
                        }
                        break;
                    }
                    if (find)
                    {
                        continue;
                    }
                    var taskDto2 = new TasksDto
                    {
                        Name = activity.TaskName
                    };
                    var task2 = await UserService.Instance.GetTask(taskDto2);

                    if (task2 == null)
                    {
                        taskDto2.TaskId = await UserService.Instance.SaveTask(taskDto2);
                    }
                    else
                    {
                        taskDto2.TaskId = task2.TaskId;
                    }
                    var activityDto = new ActivitiesDto
                    {
                        Guid       = activity.Guid,
                        Comment    = activity.Comment,
                        Status     = activity.State,
                        GroupId    = 0,
                        SyncStatus = SyncStatus.Received,
                        UserId     = user.UserId,
                        TaskId     = taskDto2.TaskId
                    };
                    activityDto.ActivityId = await UserService.Instance.SaveActivity(activityDto);

                    foreach (var parts in activity.TaskPartsList)
                    {
                        var t = TimeSpan.Parse(parts.Duration, CultureInfo.InvariantCulture)
                                .TotalMilliseconds;
                        var time = (int)t;
                        var part = new PartsOfActivityDto
                        {
                            ActivityId = activityDto.ActivityId,
                            Start      = parts.Start,
                            Stop       = parts.Stop,
                            Duration   = time.ToString()
                        };
                        await UserService.Instance.SavePartOfActivity(part);
                    }
                }
                return(true);
            }
            catch (Exception)
            {
                return(false);
            }
        }
Ejemplo n.º 21
0
        public async Task <bool> GetFavorites()
        {
            var user = UserService.Instance.GetLoggedUser();
            var uri  = new Uri($"{Ip}/Favorites/?email={user.Name}&token={user.ApiToken}");

            try
            {
                var response = await _client.GetAsync(uri);

                if (!response.IsSuccessStatusCode)
                {
                    return(false);
                }
                var content = await response.Content.ReadAsStringAsync();

                var favorites = JsonConvert.DeserializeObject <List <FavoritesRest> >(content);
                foreach (var favorite in favorites)
                {
                    var taskDto = new TasksDto
                    {
                        Name = favorite.Task.Name,
                        Typ  = favorite.Task.Type
                    };
                    var task = await UserService.Instance.GetTask(taskDto);

                    if (favorite.EditState == EditState.Delete)
                    {
                        var fav = await UserService.Instance.GetFavoriteByTaskId(task.TaskId);

                        await UserService.Instance.DeleteFavorite(fav);

                        continue;
                    }
                    if (task == null)
                    {
                        taskDto.TaskId = await UserService.Instance.SaveTask(taskDto);
                    }
                    else
                    {
                        taskDto.TaskId = task.TaskId;
                        var checkFav = await UserService.Instance.GetFavoriteByTaskId(taskDto.TaskId);

                        if (checkFav != null)
                        {
                            continue;
                        }
                    }
                    var favoriteDto = new FavoritesDto
                    {
                        TaskId = taskDto.TaskId,
                        UserId = user.UserId
                    };
                    await UserService.Instance.SaveFavorite(favoriteDto);
                }
                return(true);
            }
            catch (Exception)
            {
                return(false);
            }
        }
Ejemplo n.º 22
0
        public async Task <bool> GetPlanned()
        {
            var user = UserService.Instance.GetLoggedUser();
            var uri  = new Uri($"{Ip}/Planned/?email={user.Name}&token={user.ApiToken}");

            try
            {
                var response = await _client.GetAsync(uri);

                if (!response.IsSuccessStatusCode)
                {
                    return(false);
                }
                var content = await response.Content.ReadAsStringAsync();

                var plannedList = JsonConvert.DeserializeObject <List <PlannedRest> >(content);
                foreach (var plan in plannedList)
                {
                    var guids = await UserService.Instance.GetActivitiesByStatus(StatusType.Planned);

                    if (guids.Any(item => item.Guid == plan.Guid))
                    {
                        continue;
                    }
                    var taskDto = new TasksDto
                    {
                        Name       = plan.TaskName,
                        SyncStatus = SyncStatus.Received
                    };
                    var task = await UserService.Instance.GetTask(taskDto);

                    if (task == null)
                    {
                        taskDto.TaskId = await UserService.Instance.SaveTask(taskDto);
                    }
                    else
                    {
                        taskDto = task;
                    }
                    var plannedDto = new ActivitiesDto
                    {
                        Comment    = plan.Comment,
                        Guid       = plan.Guid,
                        SyncStatus = SyncStatus.Received,
                        TaskId     = taskDto.TaskId,
                        UserId     = user.UserId,
                        Status     = StatusType.Planned
                    };
                    plannedDto.ActivityId = await UserService.Instance.SaveActivity(plannedDto);

                    var part = new PartsOfActivityDto
                    {
                        ActivityId = plannedDto.ActivityId,
                        Start      = plan.TaskPart.Start
                    };
                    await UserService.Instance.SavePartOfActivity(part);
                }
                return(true);
            }
            catch (Exception)
            {
                return(false);
            }
        }