This is an automated email from the ASF dual-hosted git repository.

pefernan pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-kie-kogito-apps.git


The following commit(s) were added to refs/heads/main by this push:
     new fd0e91dd7 [incubator-kie-issues#1637] Add SLA due date to 
UserTaskInstances (#2151)
fd0e91dd7 is described below

commit fd0e91dd72c269a1b10cf20afdb718aca22c3238
Author: Martin Weiler <[email protected]>
AuthorDate: Wed Dec 18 04:03:56 2024 -0700

    [incubator-kie-issues#1637] Add SLA due date to UserTaskInstances (#2151)
---
 .../src/main/resources/basic.schema.graphqls         |  3 ++-
 .../org/kie/kogito/index/model/UserTaskInstance.java | 12 ++++++++++++
 .../merger/UserTaskInstanceStateEventMerger.java     |  1 +
 .../protostream/UserTaskInstanceMarshaller.java      |  3 +++
 .../protostream/UserTaskInstanceMarshallerTest.java  |  5 +++++
 .../index/jpa/model/UserTaskInstanceEntity.java      | 11 ++++++++++-
 .../jpa/storage/UserTaskInstanceEntityStorage.java   |  1 +
 .../ansi/V1.45.0.7__add_sla_due_date_tasks.sql       | 20 ++++++++++++++++++++
 .../index/mongodb/model/UserTaskInstanceEntity.java  | 11 +++++++++++
 .../mongodb/model/UserTaskInstanceEntityMapper.java  |  2 ++
 .../model/UserTaskInstanceEntityMapperTest.java      |  2 ++
 .../postgresql/V1.45.0.7__add_sla_due_date_tasks.sql | 20 ++++++++++++++++++++
 .../src/main/resources/META-INF/kogito-index.proto   |  2 ++
 13 files changed, 91 insertions(+), 2 deletions(-)

diff --git 
a/data-index/data-index-graphql/src/main/resources/basic.schema.graphqls 
b/data-index/data-index-graphql/src/main/resources/basic.schema.graphqls
index f30e90c7e..0f9ca7628 100644
--- a/data-index/data-index-graphql/src/main/resources/basic.schema.graphqls
+++ b/data-index/data-index-graphql/src/main/resources/basic.schema.graphqls
@@ -371,6 +371,7 @@ type UserTaskInstance {
     comments: [Comment!]
     attachments: [Attachment!]
     externalReferenceId : String
+    slaDueDate: DateTime
 }
 
 input UserTaskInstanceArgument {
@@ -490,4 +491,4 @@ input JobOrderBy {
     retries: OrderBy
     lastUpdate: OrderBy
     executionCounter: OrderBy
-}
\ No newline at end of file
+}
diff --git 
a/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/UserTaskInstance.java
 
b/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/UserTaskInstance.java
index b87d73777..0aca4380a 100644
--- 
a/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/UserTaskInstance.java
+++ 
b/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/UserTaskInstance.java
@@ -18,6 +18,8 @@
  */
 package org.kie.kogito.index.model;
 
+import java.time.ZonedDateTime;
+
 import com.fasterxml.jackson.databind.node.ObjectNode;
 
 public class UserTaskInstance extends UserTaskInstanceMeta {
@@ -29,6 +31,7 @@ public class UserTaskInstance extends UserTaskInstanceMeta {
     private ObjectNode outputs;
     private String endpoint;
     private String externalReferenceId;
+    private ZonedDateTime slaDueDate;
 
     public String getProcessId() {
         return processId;
@@ -67,6 +70,7 @@ public class UserTaskInstance extends UserTaskInstanceMeta {
                 ", inputs=" + inputs +
                 ", outputs=" + outputs +
                 ", endpoint='" + endpoint + '\'' +
+                ", slaDueDate=" + slaDueDate +
                 "} " + super.toString();
     }
 
@@ -103,4 +107,12 @@ public class UserTaskInstance extends UserTaskInstanceMeta 
{
     public void setExternalReferenceId(String externalReferenceId) {
         this.externalReferenceId = externalReferenceId;
     }
+
+    public ZonedDateTime getSlaDueDate() {
+        return slaDueDate;
+    }
+
+    public void setSlaDueDate(ZonedDateTime slaDueDate) {
+        this.slaDueDate = slaDueDate;
+    }
 }
diff --git 
a/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/merger/UserTaskInstanceStateEventMerger.java
 
b/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/merger/UserTaskInstanceStateEventMerger.java
index 8e813f07e..a6d11e33f 100644
--- 
a/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/merger/UserTaskInstanceStateEventMerger.java
+++ 
b/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/merger/UserTaskInstanceStateEventMerger.java
@@ -62,6 +62,7 @@ public class UserTaskInstanceStateEventMerger implements 
UserTaskInstanceEventMe
         task.setLastUpdate(toZonedDateTime(event.getData().getEventDate()));
         task.setReferenceName(event.getData().getUserTaskReferenceName());
         task.setExternalReferenceId(event.getData().getExternalReferenceId());
+        task.setSlaDueDate(toZonedDateTime(event.getData().getSlaDueDate()));
         LOGGER.debug("value after merging: {}", task);
         return task;
     }
diff --git 
a/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/UserTaskInstanceMarshaller.java
 
b/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/UserTaskInstanceMarshaller.java
index ff852b572..bca1a0efa 100644
--- 
a/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/UserTaskInstanceMarshaller.java
+++ 
b/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/UserTaskInstanceMarshaller.java
@@ -58,6 +58,7 @@ public class UserTaskInstanceMarshaller extends 
AbstractMarshaller implements Me
     protected static final String COMMENTS = "comments";
     protected static final String ATTACHMENTS = "attachments";
     protected static final String EXTERNAL_REFERENCE_ID = 
"externalReferenceId";
+    protected static final String SLA_DUE_DATE = "slaDueDate";
 
     public UserTaskInstanceMarshaller(ObjectMapper mapper) {
         super(mapper);
@@ -91,6 +92,7 @@ public class UserTaskInstanceMarshaller extends 
AbstractMarshaller implements Me
         ut.setComments(reader.readCollection(COMMENTS, new ArrayList<>(), 
Comment.class));
         ut.setAttachments(reader.readCollection(ATTACHMENTS, new 
ArrayList<>(), Attachment.class));
         ut.setExternalReferenceId(reader.readString(EXTERNAL_REFERENCE_ID));
+        ut.setSlaDueDate(dateToZonedDateTime(reader.readDate(SLA_DUE_DATE)));
         return ut;
     }
 
@@ -121,6 +123,7 @@ public class UserTaskInstanceMarshaller extends 
AbstractMarshaller implements Me
         writer.writeCollection(COMMENTS, ut.getComments(), Comment.class);
         writer.writeCollection(ATTACHMENTS, ut.getAttachments(), 
Attachment.class);
         writer.writeString(EXTERNAL_REFERENCE_ID, ut.getExternalReferenceId());
+        writer.writeDate(SLA_DUE_DATE, 
zonedDateTimeToDate(ut.getSlaDueDate()));
     }
 
     @Override
diff --git 
a/data-index/data-index-storage/data-index-storage-infinispan/src/test/java/org/kie/kogito/index/infinispan/protostream/UserTaskInstanceMarshallerTest.java
 
b/data-index/data-index-storage/data-index-storage-infinispan/src/test/java/org/kie/kogito/index/infinispan/protostream/UserTaskInstanceMarshallerTest.java
index 07f98b1ac..687c2d0fe 100644
--- 
a/data-index/data-index-storage/data-index-storage-infinispan/src/test/java/org/kie/kogito/index/infinispan/protostream/UserTaskInstanceMarshallerTest.java
+++ 
b/data-index/data-index-storage/data-index-storage-infinispan/src/test/java/org/kie/kogito/index/infinispan/protostream/UserTaskInstanceMarshallerTest.java
@@ -61,6 +61,7 @@ import static 
org.kie.kogito.index.infinispan.protostream.UserTaskInstanceMarsha
 import static 
org.kie.kogito.index.infinispan.protostream.UserTaskInstanceMarshaller.REFERENCE_NAME;
 import static 
org.kie.kogito.index.infinispan.protostream.UserTaskInstanceMarshaller.ROOT_PROCESS_ID;
 import static 
org.kie.kogito.index.infinispan.protostream.UserTaskInstanceMarshaller.ROOT_PROCESS_INSTANCE_ID;
+import static 
org.kie.kogito.index.infinispan.protostream.UserTaskInstanceMarshaller.SLA_DUE_DATE;
 import static 
org.kie.kogito.index.infinispan.protostream.UserTaskInstanceMarshaller.STARTED;
 import static 
org.kie.kogito.index.infinispan.protostream.UserTaskInstanceMarshaller.STATE;
 import static org.mockito.ArgumentMatchers.any;
@@ -102,6 +103,7 @@ class UserTaskInstanceMarshallerTest {
         
TASK.setLastUpdate(ZonedDateTime.now(ZoneOffset.UTC).truncatedTo(ChronoUnit.MILLIS));
         TASK.setEndpoint("endpoint");
         TASK.setExternalReferenceId("externalReferenceId");
+        TASK.setSlaDueDate(time);
         TASK.setComments(List.of(Comment.builder()
                 .id("attId")
                 .content("Text comment")
@@ -147,6 +149,7 @@ class UserTaskInstanceMarshallerTest {
         when(reader.readCollection(eq(COMMENTS), any(), 
eq(Comment.class))).thenReturn(TASK.getComments());
         when(reader.readCollection(eq(ATTACHMENTS), any(), 
eq(Attachment.class))).thenReturn(TASK.getAttachments());
         
when(reader.readString(EXTERNAL_REFERENCE_ID)).thenReturn(TASK.getExternalReferenceId());
+        
when(reader.readDate(SLA_DUE_DATE)).thenReturn(marshaller.zonedDateTimeToDate(TASK.getSlaDueDate()));
 
         UserTaskInstance task = marshaller.readFrom(reader);
 
@@ -178,6 +181,7 @@ class UserTaskInstanceMarshallerTest {
         inOrder.verify(reader).readCollection(COMMENTS, new ArrayList<>(), 
Comment.class);
         inOrder.verify(reader).readCollection(ATTACHMENTS, new ArrayList<>(), 
Attachment.class);
         inOrder.verify(reader).readString(EXTERNAL_REFERENCE_ID);
+        inOrder.verify(reader).readDate(SLA_DUE_DATE);
         verifyNoMoreInteractions(reader);
     }
 
@@ -214,6 +218,7 @@ class UserTaskInstanceMarshallerTest {
         inOrder.verify(writer).writeCollection(COMMENTS, TASK.getComments(), 
Comment.class);
         inOrder.verify(writer).writeCollection(ATTACHMENTS, 
TASK.getAttachments(), Attachment.class);
         inOrder.verify(writer).writeString(EXTERNAL_REFERENCE_ID, 
TASK.getExternalReferenceId());
+        inOrder.verify(writer).writeDate(SLA_DUE_DATE, 
marshaller.zonedDateTimeToDate(TASK.getSlaDueDate()));
         verifyNoMoreInteractions(writer);
     }
 
diff --git 
a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/UserTaskInstanceEntity.java
 
b/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/UserTaskInstanceEntity.java
index 314174ed1..7b97570c7 100644
--- 
a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/UserTaskInstanceEntity.java
+++ 
b/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/UserTaskInstanceEntity.java
@@ -90,8 +90,8 @@ public class UserTaskInstanceEntity extends AbstractEntity {
     private List<CommentEntity> comments;
     @OneToMany(cascade = CascadeType.ALL, mappedBy = "userTask", orphanRemoval 
= true, fetch = FetchType.LAZY)
     private List<AttachmentEntity> attachments;
-
     private String externalReferenceId;
+    private ZonedDateTime slaDueDate;
 
     public String getExternalReferenceId() {
         return externalReferenceId;
@@ -294,6 +294,14 @@ public class UserTaskInstanceEntity extends AbstractEntity 
{
         this.attachments = attachments;
     }
 
+    public ZonedDateTime getSlaDueDate() {
+        return slaDueDate;
+    }
+
+    public void setSlaDueDate(ZonedDateTime slaDueDate) {
+        this.slaDueDate = slaDueDate;
+    }
+
     @Override
     public boolean equals(Object o) {
         if (this == o) {
@@ -338,6 +346,7 @@ public class UserTaskInstanceEntity extends AbstractEntity {
                 ", endpoint='" + endpoint + '\'' +
                 ", comments='" + comments + '\'' +
                 ", attachments='" + attachments + '\'' +
+                ", slaDueDate=" + slaDueDate +
                 '}';
     }
 }
diff --git 
a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/storage/UserTaskInstanceEntityStorage.java
 
b/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/storage/UserTaskInstanceEntityStorage.java
index 5204db657..66cb04d03 100644
--- 
a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/storage/UserTaskInstanceEntityStorage.java
+++ 
b/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/storage/UserTaskInstanceEntityStorage.java
@@ -201,6 +201,7 @@ public class UserTaskInstanceEntityStorage extends 
AbstractJPAStorageFetcher<Str
         task.setLastUpdate(toZonedDateTime(event.getData().getEventDate()));
         task.setReferenceName(event.getData().getUserTaskReferenceName());
         task.setExternalReferenceId(body.getExternalReferenceId());
+        task.setSlaDueDate(toZonedDateTime(body.getSlaDueDate()));
     }
 
     private String getEndpoint(URI source, String pId, String taskName, String 
taskId) {
diff --git 
a/data-index/data-index-storage/data-index-storage-jpa/src/main/resources/kie-flyway/db/data-index/ansi/V1.45.0.7__add_sla_due_date_tasks.sql
 
b/data-index/data-index-storage/data-index-storage-jpa/src/main/resources/kie-flyway/db/data-index/ansi/V1.45.0.7__add_sla_due_date_tasks.sql
new file mode 100644
index 000000000..2164293a9
--- /dev/null
+++ 
b/data-index/data-index-storage/data-index-storage-jpa/src/main/resources/kie-flyway/db/data-index/ansi/V1.45.0.7__add_sla_due_date_tasks.sql
@@ -0,0 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+ALTER TABLE tasks ADD sla_due_date timestamp;
diff --git 
a/data-index/data-index-storage/data-index-storage-mongodb/src/main/java/org/kie/kogito/index/mongodb/model/UserTaskInstanceEntity.java
 
b/data-index/data-index-storage/data-index-storage-mongodb/src/main/java/org/kie/kogito/index/mongodb/model/UserTaskInstanceEntity.java
index c97c753dc..ca21ba455 100644
--- 
a/data-index/data-index-storage/data-index-storage-mongodb/src/main/java/org/kie/kogito/index/mongodb/model/UserTaskInstanceEntity.java
+++ 
b/data-index/data-index-storage/data-index-storage-mongodb/src/main/java/org/kie/kogito/index/mongodb/model/UserTaskInstanceEntity.java
@@ -78,6 +78,8 @@ public class UserTaskInstanceEntity {
 
     private String externalReferenceId;
 
+    private Long slaDueDate;
+
     public String getId() {
         return id;
     }
@@ -278,6 +280,14 @@ public class UserTaskInstanceEntity {
         return externalReferenceId;
     }
 
+    public Long getSlaDueDate() {
+        return slaDueDate;
+    }
+
+    public void setSlaDueDate(Long slaDueDate) {
+        this.slaDueDate = slaDueDate;
+    }
+
     @Override
     public boolean equals(Object o) {
         if (this == o) {
@@ -322,6 +332,7 @@ public class UserTaskInstanceEntity {
                 ", endpoint='" + endpoint + '\'' +
                 ", comments='" + comments + '\'' +
                 ", attachments='" + attachments + '\'' +
+                ", slaDueDate=" + slaDueDate +
                 '}';
     }
 
diff --git 
a/data-index/data-index-storage/data-index-storage-mongodb/src/main/java/org/kie/kogito/index/mongodb/model/UserTaskInstanceEntityMapper.java
 
b/data-index/data-index-storage/data-index-storage-mongodb/src/main/java/org/kie/kogito/index/mongodb/model/UserTaskInstanceEntityMapper.java
index 1a8b9add5..707ea28d7 100644
--- 
a/data-index/data-index-storage/data-index-storage-mongodb/src/main/java/org/kie/kogito/index/mongodb/model/UserTaskInstanceEntityMapper.java
+++ 
b/data-index/data-index-storage/data-index-storage-mongodb/src/main/java/org/kie/kogito/index/mongodb/model/UserTaskInstanceEntityMapper.java
@@ -80,6 +80,7 @@ public class UserTaskInstanceEntityMapper implements 
MongoEntityMapper<UserTaskI
         
entity.setComments(Optional.ofNullable(instance.getComments()).map(comments -> 
comments.stream().map(this::fromComment).collect(toList())).orElse(null));
         
entity.setAttachments(Optional.ofNullable(instance.getAttachments()).map(attachments
 -> 
attachments.stream().map(this::fromAttachment).collect(toList())).orElse(null));
         entity.setExternalReferenceId(instance.getExternalReferenceId());
+        entity.setSlaDueDate(zonedDateTimeToInstant(instance.getSlaDueDate()));
         return entity;
     }
 
@@ -115,6 +116,7 @@ public class UserTaskInstanceEntityMapper implements 
MongoEntityMapper<UserTaskI
         
instance.setComments(Optional.ofNullable(entity.getComments()).map(comments -> 
comments.stream().map(this::toComment).collect(toList())).orElse(null));
         
instance.setAttachments(Optional.ofNullable(entity.getAttachments()).map(attachments
 -> 
attachments.stream().map(this::toAttachment).collect(toList())).orElse(null));
         instance.setExternalReferenceId(entity.getExternalReferenceId());
+        instance.setSlaDueDate(instantToZonedDateTime(entity.getSlaDueDate()));
         return instance;
     }
 
diff --git 
a/data-index/data-index-storage/data-index-storage-mongodb/src/test/java/org/kie/kogito/index/mongodb/model/UserTaskInstanceEntityMapperTest.java
 
b/data-index/data-index-storage/data-index-storage-mongodb/src/test/java/org/kie/kogito/index/mongodb/model/UserTaskInstanceEntityMapperTest.java
index 013ba7a04..6a0f6f9b3 100644
--- 
a/data-index/data-index-storage/data-index-storage-mongodb/src/test/java/org/kie/kogito/index/mongodb/model/UserTaskInstanceEntityMapperTest.java
+++ 
b/data-index/data-index-storage/data-index-storage-mongodb/src/test/java/org/kie/kogito/index/mongodb/model/UserTaskInstanceEntityMapperTest.java
@@ -116,6 +116,7 @@ class UserTaskInstanceEntityMapperTest {
         userTaskInstance.setComments(List.of(comment));
         userTaskInstance.setAttachments(List.of(attachment));
         userTaskInstance.setExternalReferenceId(externalReferenceId);
+        userTaskInstance.setSlaDueDate(time);
 
         userTaskInstanceEntity = new UserTaskInstanceEntity();
         userTaskInstanceEntity.setId(testId);
@@ -142,6 +143,7 @@ class UserTaskInstanceEntityMapperTest {
         userTaskInstanceEntity.setComments(List.of(commentEntity));
         userTaskInstanceEntity.setAttachments(List.of(attachmentEntity));
         userTaskInstanceEntity.setExternalReferenceId(externalReferenceId);
+        userTaskInstanceEntity.setSlaDueDate(zonedDateTimeToInstant(time));
     }
 
     @Test
diff --git 
a/data-index/data-index-storage/data-index-storage-postgresql/src/main/resources/kie-flyway/db/data-index/postgresql/V1.45.0.7__add_sla_due_date_tasks.sql
 
b/data-index/data-index-storage/data-index-storage-postgresql/src/main/resources/kie-flyway/db/data-index/postgresql/V1.45.0.7__add_sla_due_date_tasks.sql
new file mode 100644
index 000000000..84c67e7ee
--- /dev/null
+++ 
b/data-index/data-index-storage/data-index-storage-postgresql/src/main/resources/kie-flyway/db/data-index/postgresql/V1.45.0.7__add_sla_due_date_tasks.sql
@@ -0,0 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+ALTER TABLE IF exists tasks ADD COLUMN IF NOT EXISTS sla_due_date timestamp;
diff --git 
a/data-index/data-index-storage/data-index-storage-protobuf/src/main/resources/META-INF/kogito-index.proto
 
b/data-index/data-index-storage/data-index-storage-protobuf/src/main/resources/META-INF/kogito-index.proto
index ed6d7c09e..3460ff5a2 100644
--- 
a/data-index/data-index-storage/data-index-storage-protobuf/src/main/resources/META-INF/kogito-index.proto
+++ 
b/data-index/data-index-storage/data-index-storage-protobuf/src/main/resources/META-INF/kogito-index.proto
@@ -240,6 +240,7 @@ message UserTaskInstance {
     /* @Field(store = Store.YES) */
     repeated Attachment attachments = 24;
     optional string externalReferenceId = 25;
+    optional int64 slaDueDate = 26;
 }
 
 /* @Indexed */
@@ -279,6 +280,7 @@ message UserTaskInstanceMeta {
     /* @Field(store = Store.YES) */
     repeated Attachment attachments = 18;
     optional string externalReferenceId = 25;
+    optional int64 slaDueDate = 26;
 }
 
 /* @Indexed */


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to