Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/git issue 4049 process instance api enhancement #4222

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
769aac9
Update Execution.xml - GIT Issue : 4049 Process Instance API Enhancem…
Nandanrshenoy Mar 11, 2024
1ac6dd3
Update ExecutionEntity.java - GIT Issue : 4049 Process Instance API E…
Nandanrshenoy Mar 11, 2024
d0f979f
Update ProcessInstance.java - GIT Issue : 4049 Process Instance API E…
Nandanrshenoy Mar 11, 2024
5c48648
Update ProcessInstanceWithVariablesImpl.java - GIT Issue : 4049 Proce…
Nandanrshenoy Mar 11, 2024
a4505a0
Update ProcessInstanceDto.java - GIT Issue : 4049 Process Instance AP…
Nandanrshenoy Mar 11, 2024
c317a01
Update ProcessInstanceDto.ftl - GIT Issue : 4049 Process Instance API…
Nandanrshenoy Mar 11, 2024
c039fee
Update get.ftl - GIT Issue : 4049 Process Instance API Enhancement wi…
Nandanrshenoy Mar 11, 2024
071a48d
Update get.ftl - GIT Issue : 4049 Process Instance API Enhancement wi…
Nandanrshenoy Mar 11, 2024
1b9bb27
Update post.ftl - GIT Issue : 4049 Process Instance API Enhancement w…
Nandanrshenoy Mar 11, 2024
e5c9e92
Update ProcessInstanceRestServiceInteractionTest.java - GIT Issue : 4…
Nandanrshenoy Mar 11, 2024
be54f46
Update ProcessInstance.java - GIT issue: 4049 - Process Instance API …
Nandanrshenoy Jun 14, 2024
4cec498
Update ExecutionEntity.java GIT issue: 4049 - Process Instance API En…
Nandanrshenoy Jun 14, 2024
208daa0
Update ProcessInstanceDto.java GIT issue: 4049 - Process Instance API…
Nandanrshenoy Jun 14, 2024
6784307
Update ProcessInstanceWithVariablesImpl.java - GIT issue: 4049 - Proc…
Nandanrshenoy Jun 14, 2024
bd79931
Update Execution.xml GIT issue: 4049 - Process Instance API Enhanceme…
Nandanrshenoy Jun 14, 2024
c39f6f0
Update StartProcessInstanceCmd.java - GIT issue: 4049 - Process Insta…
Nandanrshenoy Jun 14, 2024
a426380
Update activiti.cockroachdb.create.engine.sql GIT issue: 4049 - Proc…
Nandanrshenoy Jun 14, 2024
8b1f562
Update activiti.db2.create.engine.sql GIT issue: 4049 - Process Insta…
Nandanrshenoy Jun 14, 2024
6d8470a
Update activiti.h2.create.engine.sql GIT issue: 4049 - Process Insta…
Nandanrshenoy Jun 14, 2024
d40c48e
Update activiti.mariadb.create.engine.sql GIT issue: 4049 - Process I…
Nandanrshenoy Jun 14, 2024
c0755c3
Update activiti.mssql.create.engine.sql - GIT issue: 4049 - Process I…
Nandanrshenoy Jun 14, 2024
2a2df19
Update activiti.mysql.create.engine.sql GIT issue: 4049 - Process In…
Nandanrshenoy Jun 14, 2024
222f43e
Update activiti.oracle.create.engine.sql GIT issue: 4049 - Process I…
Nandanrshenoy Jun 14, 2024
dd61f9b
Update activiti.postgres.create.engine.sql GIT issue: 4049 - Process…
Nandanrshenoy Jun 14, 2024
4376493
Update Execution.java - GIT issue: 4049 - Process Instance API Enhanc…
Nandanrshenoy Jun 17, 2024
9d05e4e
Update ExecutionTree.java GIT issue: 4049 - Process Instance API Enha…
Nandanrshenoy Jun 17, 2024
0d023dc
Update ExecutionTree.java GIT issue: 4049 - Process Instance API Enha…
Nandanrshenoy Jun 17, 2024
49322eb
Update MockProvider.java -GIT issue: 4049 - Process Instance API Enha…
Nandanrshenoy Jun 18, 2024
915dd3f
Update ExecutionQueryTest.java GIT issue: 4049 - Process Instance API…
Nandanrshenoy Jun 18, 2024
1630061
Update ExecutionEntityTest.java GIT issue: 4049 - Process Instance A…
Nandanrshenoy Jun 18, 2024
54d04bb
Update post.ftl GIT issue: 4049 - Process Instance API Enhancement wi…
Nandanrshenoy Jun 19, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,14 @@
type = "string"
desc = "The id of the process definition that this process instance belongs to." />

<#--
GIT Issue : https://github.com/camunda/camunda-bpm-platform/issues/4049
-->
<@lib.property
name = "definitionKey"
type = "string"
desc = "The key of the process definition that this process instance belongs to." />

<@lib.property
name = "businessKey"
type = "string"
Expand Down Expand Up @@ -40,4 +48,4 @@
desc = "The tenant id of the process instance." />

</@lib.dto>
</#macro>
</#macro>
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@
],
"id":"anId",
"definitionId":"aProcessDefinitionId",
"definitionKey":"aProcessDefinitionKey",
"businessKey":"myBusinessKey",
"caseInstanceId": null,
"tenantId":null,
Expand All @@ -133,6 +134,7 @@
],
"id": "aProcInstId",
"definitionId": "aProcessDefinitionId",
"definitionKey": "aProcessDefinitionKey",
"businessKey": "myBusinessKey",
"caseInstanceId": null,
"ended": false,
Expand Down Expand Up @@ -167,6 +169,7 @@
],
"id":"anId",
"definitionId":"aProcessDefinitionId",
"definitionKey":"aProcessDefinitionKey",
"businessKey":"myBusinessKey",
"caseInstanceId": null,
"tenantId":null,
Expand Down Expand Up @@ -195,4 +198,4 @@
}
}

</#macro>
</#macro>
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
"links": [],
"id": "anId",
"definitionId": "aProcDefId",
"definitionKey": "aProcDefKey",
"businessKey": "aKey",
"caseInstanceId": "aCaseInstanceId",
"ended": false,
Expand All @@ -53,4 +54,4 @@
}
}

</#macro>
</#macro>
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@
"links": [],
"id": "anId",
"definitionId": "aProcessDefinitionId",
"definitionKey": "aProcessDefinitionKey",
"businessKey": "aKey",
"caseInstanceId": "aCaseInstanceId",
"ended": false,
Expand All @@ -80,4 +81,4 @@
}
}

</#macro>
</#macro>
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
"value": {
"id":"aProcessInstanceId",
"definitionId":"aProcDefId",
"definitionKey":"aProcDefKey",
"businessKey":"aKey",
"caseInstanceId":"aCaseInstanceId",
"ended":false,
Expand All @@ -45,4 +46,4 @@

}
}
</#macro>
</#macro>
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,15 @@ public class ProcessInstanceDto extends LinkableDto {
private boolean ended;
private boolean suspended;
private String tenantId;
private String definitionKey;

public ProcessInstanceDto() {
}

public ProcessInstanceDto(ProcessInstance instance) {
this.id = instance.getId();
this.definitionId = instance.getProcessDefinitionId();
this.definitionKey = instance.getProcessDefinitionKey();
this.businessKey = instance.getBusinessKey();
this.caseInstanceId = instance.getCaseInstanceId();
this.ended = instance.isEnded();
Expand All @@ -49,6 +51,14 @@ public String getId() {
public String getDefinitionId() {
return definitionId;
}

/**
* @return the definitionKey
* GIT Issue : https://github.com/camunda/camunda-bpm-platform/issues/4049
*/
public String getDefinitionKey() {
return definitionKey;
}
yanavasileva marked this conversation as resolved.
Show resolved Hide resolved

public String getBusinessKey() {
return businessKey;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1083,6 +1083,7 @@ public void testGetSingleInstance() {
.body("id", Matchers.equalTo(MockProvider.EXAMPLE_PROCESS_INSTANCE_ID))
.body("ended", Matchers.equalTo(MockProvider.EXAMPLE_PROCESS_INSTANCE_IS_ENDED))
.body("definitionId", Matchers.equalTo(MockProvider.EXAMPLE_PROCESS_DEFINITION_ID))
.body("definitionKey", Matchers.equalTo(MockProvider.EXAMPLE_PROCESS_DEFINITION_KEY))
.body("businessKey", Matchers.equalTo(MockProvider.EXAMPLE_PROCESS_INSTANCE_BUSINESS_KEY))
.body("suspended", Matchers.equalTo(MockProvider.EXAMPLE_PROCESS_INSTANCE_IS_SUSPENDED))
.body("tenantId", Matchers.equalTo(MockProvider.EXAMPLE_TENANT_ID))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1302,6 +1302,7 @@ public static ProcessInstance createMockInstance(String tenantId) {
when(mock.getBusinessKey()).thenReturn(EXAMPLE_PROCESS_INSTANCE_BUSINESS_KEY);
when(mock.getCaseInstanceId()).thenReturn(EXAMPLE_CASE_INSTANCE_ID);
when(mock.getProcessDefinitionId()).thenReturn(EXAMPLE_PROCESS_DEFINITION_ID);
when(mock.getProcessDefinitionKey()).thenReturn(EXAMPLE_PROCESS_DEFINITION_KEY);
when(mock.getProcessInstanceId()).thenReturn(EXAMPLE_PROCESS_INSTANCE_ID);
when(mock.isSuspended()).thenReturn(EXAMPLE_PROCESS_INSTANCE_IS_SUSPENDED);
when(mock.isEnded()).thenReturn(EXAMPLE_PROCESS_INSTANCE_IS_ENDED);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,8 @@ public ProcessInstanceWithVariables execute(CommandContext commandContext) {
processInstance.setTenantId(instantiationBuilder.getTenantId());
}

processInstance.setProcessDefinitionKey(processDefinition.getKey());

yanavasileva marked this conversation as resolved.
Show resolved Hide resolved
final ExecutionVariableSnapshotObserver variablesListener = new ExecutionVariableSnapshotObserver(processInstance);

processInstance.start(instantiationBuilder.getVariables());
Expand Down
yanavasileva marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,11 @@ public class ExecutionEntity extends PvmExecutionImpl implements Execution, Proc
*/
protected String superCaseExecutionId;

/**
* The name of the process definition key
*/
protected String processDefinitionKey;

/**
* Contains observers which are observe the execution.
* @since 7.6
Expand Down Expand Up @@ -263,6 +268,7 @@ public ExecutionEntity createExecution() {

// initialize the new execution
createdExecution.setProcessDefinition(getProcessDefinition());
createdExecution.setProcessDefinitionKey(getProcessDefinitionKey());
yanavasileva marked this conversation as resolved.
Show resolved Hide resolved
createdExecution.setProcessInstance(getProcessInstance());
createdExecution.setActivity(getActivity());
createdExecution.setSuspensionState(getSuspensionState());
Expand Down Expand Up @@ -1935,4 +1941,13 @@ public ProcessEngine getProcessEngine() {
public String getProcessDefinitionTenantId() {
return getProcessDefinition().getTenantId();
}

public void setProcessDefinitionKey(String processDefinitionKey) {
this.processDefinitionKey = processDefinitionKey;
}

public String getProcessDefinitionKey() {
return processDefinitionKey;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -86,4 +86,9 @@ public String getProcessInstanceId() {
public String getTenantId() {
return executionEntity.getTenantId();
}

@Override
public String getProcessDefinitionKey() {
return executionEntity.getProcessDefinitionKey();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -52,4 +52,9 @@ public interface Execution {
*/
String getTenantId();

/**
* The Key of the process definition.
*/
String getProcessDefinitionKey();

}
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,11 @@ public interface ProcessInstance extends Execution {
*/
String getProcessDefinitionId();

/**
* The key of the process definition of the process instance.
*/
String getProcessDefinitionKey();

/**
* The business key of this process instance.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ create table ACT_RU_EXECUTION (
CACHED_ENT_STATE_ integer,
SEQUENCE_COUNTER_ bigint,
TENANT_ID_ varchar(64),
PROC_DEF_KEY_ varchar(255),
primary key (ID_)
);

Expand Down Expand Up @@ -593,4 +594,4 @@ create index ACT_IDX_PROCDEF_VER_TAG ON ACT_RE_PROCDEF(VERSION_TAG_);

-- indices for history cleanup: https://jira.camunda.com/browse/CAM-11616
create index ACT_IDX_AUTH_ROOT_PI on ACT_RU_AUTHORIZATION(ROOT_PROC_INST_ID_);
create index ACT_IDX_AUTH_RM_TIME on ACT_RU_AUTHORIZATION(REMOVAL_TIME_);
create index ACT_IDX_AUTH_RM_TIME on ACT_RU_AUTHORIZATION(REMOVAL_TIME_);
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ create table ACT_RU_EXECUTION (
CACHED_ENT_STATE_ integer,
SEQUENCE_COUNTER_ bigint,
TENANT_ID_ varchar(64),
PROC_DEF_KEY_ varchar(255),
yanavasileva marked this conversation as resolved.
Show resolved Hide resolved
primary key (ID_)
);

Expand Down Expand Up @@ -594,4 +595,4 @@ create index ACT_IDX_PROCDEF_VER_TAG ON ACT_RE_PROCDEF(VERSION_TAG_);

-- indices for history cleanup: https://jira.camunda.com/browse/CAM-11616
create index ACT_IDX_AUTH_ROOT_PI on ACT_RU_AUTHORIZATION(ROOT_PROC_INST_ID_);
create index ACT_IDX_AUTH_RM_TIME on ACT_RU_AUTHORIZATION(REMOVAL_TIME_);
create index ACT_IDX_AUTH_RM_TIME on ACT_RU_AUTHORIZATION(REMOVAL_TIME_);
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ create table ACT_RU_EXECUTION (
CACHED_ENT_STATE_ integer,
SEQUENCE_COUNTER_ integer,
TENANT_ID_ varchar(64),
PROC_DEF_KEY_ varchar(255),
primary key (ID_)
);

Expand Down Expand Up @@ -585,4 +586,4 @@ alter table ACT_RU_VARIABLE

-- indices for history cleanup: https://jira.camunda.com/browse/CAM-11616
create index ACT_IDX_AUTH_ROOT_PI on ACT_RU_AUTHORIZATION(ROOT_PROC_INST_ID_);
create index ACT_IDX_AUTH_RM_TIME on ACT_RU_AUTHORIZATION(REMOVAL_TIME_);
create index ACT_IDX_AUTH_RM_TIME on ACT_RU_AUTHORIZATION(REMOVAL_TIME_);
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ create table ACT_RU_EXECUTION (
CACHED_ENT_STATE_ integer,
SEQUENCE_COUNTER_ bigint,
TENANT_ID_ varchar(64),
PROC_DEF_KEY_ varchar(255),
primary key (ID_)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;

Expand Down Expand Up @@ -586,4 +587,4 @@ create index ACT_IDX_PROCDEF_VER_TAG ON ACT_RE_PROCDEF(VERSION_TAG_);

-- indices for history cleanup: https://jira.camunda.com/browse/CAM-11616
create index ACT_IDX_AUTH_ROOT_PI on ACT_RU_AUTHORIZATION(ROOT_PROC_INST_ID_);
create index ACT_IDX_AUTH_RM_TIME on ACT_RU_AUTHORIZATION(REMOVAL_TIME_);
create index ACT_IDX_AUTH_RM_TIME on ACT_RU_AUTHORIZATION(REMOVAL_TIME_);
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ create table ACT_RU_EXECUTION (
CACHED_ENT_STATE_ int,
SEQUENCE_COUNTER_ numeric(19,0),
TENANT_ID_ nvarchar(64),
PROC_DEF_KEY_ nvarchar(255),
primary key (ID_)
);

Expand Down Expand Up @@ -590,4 +591,4 @@ create index ACT_IDX_PROCDEF_VER_TAG ON ACT_RE_PROCDEF(VERSION_TAG_);

-- indices for history cleanup: https://jira.camunda.com/browse/CAM-11616
create index ACT_IDX_AUTH_ROOT_PI on ACT_RU_AUTHORIZATION(ROOT_PROC_INST_ID_);
create index ACT_IDX_AUTH_RM_TIME on ACT_RU_AUTHORIZATION(REMOVAL_TIME_);
create index ACT_IDX_AUTH_RM_TIME on ACT_RU_AUTHORIZATION(REMOVAL_TIME_);
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ create table ACT_RU_EXECUTION (
CACHED_ENT_STATE_ integer,
SEQUENCE_COUNTER_ bigint,
TENANT_ID_ varchar(64),
PROC_DEF_KEY_ varchar(255),
primary key (ID_)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;

Expand Down Expand Up @@ -586,4 +587,4 @@ create index ACT_IDX_PROCDEF_VER_TAG ON ACT_RE_PROCDEF(VERSION_TAG_);

-- indices for history cleanup: https://jira.camunda.com/browse/CAM-11616
create index ACT_IDX_AUTH_ROOT_PI on ACT_RU_AUTHORIZATION(ROOT_PROC_INST_ID_);
create index ACT_IDX_AUTH_RM_TIME on ACT_RU_AUTHORIZATION(REMOVAL_TIME_);
create index ACT_IDX_AUTH_RM_TIME on ACT_RU_AUTHORIZATION(REMOVAL_TIME_);
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ create table ACT_RU_EXECUTION (
CACHED_ENT_STATE_ INTEGER,
SEQUENCE_COUNTER_ NUMBER(19,0),
TENANT_ID_ NVARCHAR2(64),
PROC_DEF_KEY_ NVARCHAR2(255),
primary key (ID_)
);

Expand Down Expand Up @@ -605,4 +606,4 @@ create index ACT_IDX_PROCDEF_VER_TAG ON ACT_RE_PROCDEF(VERSION_TAG_);

-- indices for history cleanup: https://jira.camunda.com/browse/CAM-11616
create index ACT_IDX_AUTH_ROOT_PI on ACT_RU_AUTHORIZATION(ROOT_PROC_INST_ID_);
create index ACT_IDX_AUTH_RM_TIME on ACT_RU_AUTHORIZATION(REMOVAL_TIME_);
create index ACT_IDX_AUTH_RM_TIME on ACT_RU_AUTHORIZATION(REMOVAL_TIME_);
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ create table ACT_RU_EXECUTION (
CACHED_ENT_STATE_ integer,
SEQUENCE_COUNTER_ bigint,
TENANT_ID_ varchar(64),
PROC_DEF_KEY_ varchar(255),
primary key (ID_)
);

Expand Down Expand Up @@ -600,4 +601,4 @@ create index ACT_IDX_PROCDEF_VER_TAG ON ACT_RE_PROCDEF(VERSION_TAG_);

-- indices for history cleanup: https://jira.camunda.com/browse/CAM-11616
create index ACT_IDX_AUTH_ROOT_PI on ACT_RU_AUTHORIZATION(ROOT_PROC_INST_ID_);
create index ACT_IDX_AUTH_RM_TIME on ACT_RU_AUTHORIZATION(REMOVAL_TIME_);
create index ACT_IDX_AUTH_RM_TIME on ACT_RU_AUTHORIZATION(REMOVAL_TIME_);
yanavasileva marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,10 @@
CACHED_ENT_STATE_,
SEQUENCE_COUNTER_,
TENANT_ID_,
PROC_DEF_KEY_,
REV_
)
values
(
values (
yanavasileva marked this conversation as resolved.
Show resolved Hide resolved
#{id ,jdbcType=VARCHAR},
#{rootProcessInstanceIdRaw, jdbcType=VARCHAR},
#{processInstanceId, jdbcType=VARCHAR},
Expand All @@ -68,6 +68,7 @@
#{cachedEntityState, jdbcType=INTEGER},
#{sequenceCounter, jdbcType=BIGINT},
#{tenantId, jdbcType=VARCHAR},
#{processDefinitionKey, jdbcType=VARCHAR},
1
)
</insert>
Expand All @@ -90,7 +91,8 @@
SUSPENSION_STATE_ = #{suspensionState, jdbcType=INTEGER},
CACHED_ENT_STATE_ = #{cachedEntityState, jdbcType=INTEGER},
SEQUENCE_COUNTER_ = #{sequenceCounter, jdbcType=BIGINT},
TENANT_ID_ = #{tenantId, jdbcType=BIGINT}
TENANT_ID_ = #{tenantId, jdbcType=BIGINT},
PROC_DEF_KEY_ = #{processDefinitionKey, jdbcType=VARCHAR}
where ID_ = #{id, jdbcType=VARCHAR}
and REV_ = #{revision, jdbcType=INTEGER}
</update>
Expand Down Expand Up @@ -155,6 +157,7 @@
<result property="cachedEntityState" column="CACHED_ENT_STATE_" jdbcType="INTEGER"/>
<result property="sequenceCounter" column="SEQUENCE_COUNTER_" jdbcType="BIGINT"/>
<result property="tenantId" column="TENANT_ID_" jdbcType="VARCHAR"/>
<result property="processDefinitionKey" column="PROC_DEF_KEY_" jdbcType="VARCHAR"/>
</resultMap>

<resultMap type="org.camunda.bpm.engine.impl.util.ImmutablePair" id="deploymentIdMapping">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ public void testQueryByProcessDefinitionKey() {
// Concurrent process with 3 executions for each process instance
assertEquals(12, runtimeService.createExecutionQuery().processDefinitionKey(CONCURRENT_PROCESS_KEY).list().size());
assertEquals(1, runtimeService.createExecutionQuery().processDefinitionKey(SEQUENTIAL_PROCESS_KEY).list().size());
assertNotNull(runtimeService.createExecutionQuery().processDefinitionKey(SEQUENTIAL_PROCESS_KEY).singleResult().getProcessDefinitionKey());
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@ public void testRemoveExecutionSequence() {
// when
assertNotNull(execution);
assertEquals(pi.getId(), execution.getProcessInstanceId());
assertEquals(pi.getProcessDefinitionKey(), execution.getProcessDefinitionKey());
processEngineRule.getRuntimeService().signal(execution.getId());

// then (see #TestLocalVariableTaskListener::notify)
Expand Down
Loading