Skip to content

Commit

Permalink
创建统一接口实体类
Browse files Browse the repository at this point in the history
  • Loading branch information
czha666 committed Sep 4, 2024
1 parent 452a754 commit b9cb202
Show file tree
Hide file tree
Showing 24 changed files with 1,069 additions and 18 deletions.
3 changes: 3 additions & 0 deletions settings.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -68,4 +68,7 @@ project(":wedpr-components-initializer").projectDir=file("wedpr-components/initi
include "wedpr-adm"
project(":wedpr-adm").projectDir=file("wedpr-adm")

include "wedpr-components-privacy-exchanges"
project(":wedpr-components-privacy-exchanges").projectDir=file("wedpr-components/privacy-exchanges")


2 changes: 1 addition & 1 deletion wedpr-adm/conf/config.toml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ useSMCrypto = "false" # RPC SM crypto type
[network]
messageTimeout = "10000"
defaultGroup="group0" # Console default group to connect
peers=["127.0.0.1:20200", "127.0.0.1:20201"] # The peer list to connect
peers=["139.159.202.235:20200", "139.159.202.235:20201"] # The peer list to connect

[account]
keyStoreDir = "account" # The directory to load/store the account file, default is "account"
Expand Down
34 changes: 18 additions & 16 deletions wedpr-adm/conf/wedpr.properties
Original file line number Diff line number Diff line change
Expand Up @@ -9,38 +9,40 @@ wedpr.uuid.generator.worker.id=10
# TODO: add this option
# use dpm or not
wedpr.enable.dpm = false

wedpr.crypto.symmetric.key=12345678
wedpr.crypto.symmetric.iv=123456
### the mybatis related configuration
#wedpr.mybatis.config.path=mybatis-config.xml
# TODO: instead use CMDB value
wedpr.mybatis.url=jdbc:mysql://127.0.0.1/wedpr3?characterEncoding=UTF-8&allowMultiQueries=true
wedpr.mybatis.url=jdbc:mysql://192.168.2.20:3306/wedpr3?characterEncoding=UTF-8&allowMultiQueries=true
#wedpr.mybatis.username=[*user_ppcs_modeladm]
#wedpr.mybatis.password=[*pass_ppcs_modeladm]
wedpr.mybatis.username=
wedpr.mybatis.password=
wedpr.mybatis.username=root
wedpr.mybatis.password=dinglian@123

wedpr.mybatis.driverClassName=com.mysql.cj.jdbc.Driver

wedpr.mybatis.mapperLocations=classpath*:mapper/*Mapper.xml
# Note: the basePackage can't set to com.webank.wedpr simply for the mybatis will scan the Service
wedpr.mybatis.BasePackage=com.webank.wedpr.components.meta.resource.follower.dao,com.webank.wedpr.components.meta.sys.config.dao,com.webank.wedpr.components.project.dao,com.webank.wedpr.components.meta.setting.template.dao,com.webank.wedpr.components.sync.dao,com.webank.wedpr.components.authorization.dao,com.webank.wedpr.components.dataset.mapper,com.webank.wedpr.components.user.mapper,com.webank.wedpr.components.meta.agency.dao
# wedpr.mybatis.typeAliasesPackage=
wedpr.mybatis.BasePackage=com.webank.wedpr.components.meta.resource.follower.dao,com.webank.wedpr.components.meta.sys.config.dao,com.webank.wedpr.components.project.dao,com.webank.wedpr.components.meta.setting.template.dao,com.webank.wedpr.components.sync.dao,com.webank.wedpr.components.authorization.dao,com.webank.wedpr.components.dataset.mapper,com.webank.wedpr.components.user.mapper,com.webank.wedpr.components.meta.agency.dao,com.webank.wedpr.components.api.credential.dao,com.webank.wedpr.components.integration.jupyter.dao


### the blockchain configuration
wedpr.chain.group_id=group0
wedpr.chain.config_path=config.toml

### the election related configuration
wedpr.leader.election.keep.alive.seconds=30
wedpr.leader.election.expire.seconds=60
wedpr.leader.election.keep.alive.seconds=10
wedpr.leader.election.expire.seconds=15

### the sync module related configuration
wedpr.agency=WeBank
wedpr.agency=SGD

wedpr.sync.recorder.factory.contract_address=0x4721d1a77e0e76851d460073e64ea06d9c104194
wedpr.sync.sequencer.contract_address=0x6849f21d1e455e9f0712b1e99fa4fcd23758e8f1

wedpr.sync.recorder.contract_version=1
wedpr.sync.queue_limit=100000
wedpr.sync.worker_idle_ms=10
wedpr.sync.worker_idle_ms=1000

wedpr.thread.max.blocking.queue.size=1000

Expand All @@ -50,23 +52,23 @@ wedpr.scheduler.query.job.status.interval.ms=30000
wedpr.scheduler.interval.ms=30000

# the executor related config
wedpr.executor.job.cache.dir=./.cache/jobs
wedpr.executor.psi.tmp.file.name=psi_prepare.csv
#wedpr.executor.job.cache.dir=./.jobs/cache
#wedpr.executor.psi.tmp.file.name=.psi.tmp
wedpr.executor.psi.prepare.file.name=psi_prepare.csv
wedpr.executor.ml.url=
wedpr.executor.ml.url=127.0.0.1:44471
wedpr.executor.ml.connect.request.timeout.ms=10000
wedpr.executor.ml.connect.timeout.ms=5000
wedpr.executor.ml.request.timeout.ms=60000
wedpr.executor.ml.max.total.connection=5


wedpr.executor.psi.url=
wedpr.executor.psi.url=127.0.0.1:12200
wedpr.executor.psi.connect.request.timeout.ms=10000
wedpr.executor.psi.connect.timeout.ms=5000
wedpr.executor.psi.request.timeout.ms=60000
wedpr.executor.psi.max.total.connection=5

wedpr.executor.psi.token=
wedpr.executor.psi.token=ppcs_psi_apikey



Expand Down
19 changes: 19 additions & 0 deletions wedpr-components/blockchain/src/main/resources/conf/ca.crt
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
-----BEGIN CERTIFICATE-----
MIIDITCCAgkCFCOfjmHXWUMHMnfxY9r00nBFkbLlMA0GCSqGSIb3DQEBCwUAMEwx
HDAaBgNVBAMME0ZJU0NPLUJDT1MtMmViNTFmYWUxHDAaBgNVBAoME0ZJU0NPLUJD
T1MtMmViNTFmYWUxDjAMBgNVBAsMBWNoYWluMCAXDTI0MDcxNTE1MDI0OVoYDzIx
MjQwNjIxMTUwMjQ5WjBMMRwwGgYDVQQDDBNGSVNDTy1CQ09TLTJlYjUxZmFlMRww
GgYDVQQKDBNGSVNDTy1CQ09TLTJlYjUxZmFlMQ4wDAYDVQQLDAVjaGFpbjCCASIw
DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKAJWhwjeYiMCUfikNk2VMXt3ujE
+DDzKuF9iaa/8FJS0g3xhgNX/7FmbahSZORkOTngKMdY/Lt7+dmnI95niXl4Z57m
YdWJIE4e+1ojmzaLDjsSuWqI4nl8SF2ECqM+8t79JNhTg5OT1SpUHKGStkTEqil/
gP46Q7SXMlAy+9kueKCvjtukKqRNX8ckDfQqqbX8xcv+SF9sMZUnoeF3oQw8DQwx
mrjMCOJtKvMnDdrnlXq526gms1X1UCqiEEczZ6dKvxWa4j5cQ5FRB72N4fxu14oM
dBthaO3gUO7dQEXIEnIa1Gq+b8SVPciE3Ze0/uoOktMjlSHMR4u48LMTNbECAwEA
ATANBgkqhkiG9w0BAQsFAAOCAQEAWqZsE5dzVObDK+tKX3ehcu4JsTZJLWuv2zO6
VOERYgCJEoAjLpXlDlygvzBiM75BVersZ1dZzyXTk0UziG3fJD4pYrWJCO3EZGrE
zQ5ARPtIkSDsjF7dIriMbBJv1VoD3hcRHi0LgsInPArmAfIPQgwVeW/aFunu8aMj
BCdpxdMKMLCJLMaSAc9F1ZASw/48CROB7XFnxDlkC/dzWi3RTK1FYyyfCKey+NCQ
QOxx5ZyH6BroFNHFU31TDL90VR7e+Jgz/R8VFDpcp11rbm02QyeIZwyBZuOVXtkh
EmOq/mqaDalaliyUdiPYk1zhOJobp3VDiVyT7TT0fZvJs/1tRQ==
-----END CERTIFICATE-----
20 changes: 20 additions & 0 deletions wedpr-components/blockchain/src/main/resources/conf/sdk.crt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
-----BEGIN CERTIFICATE-----
MIIDLTCCAhWgAwIBAgIUWiDtDUDbj77dZY7gUuM5Q9geTJswDQYJKoZIhvcNAQEL
BQAwTDEcMBoGA1UEAwwTRklTQ08tQkNPUy0yZWI1MWZhZTEcMBoGA1UECgwTRklT
Q08tQkNPUy0yZWI1MWZhZTEOMAwGA1UECwwFY2hhaW4wIBcNMjQwNzE1MTUwMjQ5
WhgPMjEyNDA2MjExNTAyNDlaMEQxHDAaBgNVBAMME0ZJU0NPLUJDT1MtMmViNTFm
YWUxEzARBgNVBAoMCmZpc2NvLWJjb3MxDzANBgNVBAsMBmFnZW5jeTCCASIwDQYJ
KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMKtFiSZ0H8/n/oIdX9sYKHyBzHINHdF
OXnEyGLf5CBheSJJ46IMWAbUCIf7sDS04DA+02G4yq7lAyS2DIq9ipkBNINo6QFp
WpRQqFKkxHBCj27hYUuRMNqQ+IslvOKM1WTXStYErfJt3TzksRPPbkhXCa+BLYX8
LIGRbAwR1152fVw9R+6ElhbreHWkhE6VMrznysbyWYaTo9G7QzptI2OVh2iNHZQ4
OLMwABo582xdujfDF9+FI2SF1l7Hsixm5kqaS2RfMV+ZZ11gboCQsV90eDPu5ad9
Edyg4Pqv3gN0VwTxeHG8ttbwIWJ3ygnb0xhh14YsNMsBPLEG4e/eIsECAwEAAaMN
MAswCQYDVR0TBAIwADANBgkqhkiG9w0BAQsFAAOCAQEAGshhzi4tNbbUuReeITCK
7CcwKBI2zZXZV0PARpjHNdr6SSxG5+1ueZbs665ie8R+JhWUYaPeaMfVuLG2u5Pc
COLqRN+OGuIp0B2NYyYPqGVB+MQCCn8EcUaeAVm3+BNgXzSvGB70rwzUHuwKesO5
J7VLoKeJYJKlhkoMBjT4jue630sJz8xwQs/+4HyocBROlz7tDCee2KYUTv8n+JIe
zwymYemqdGXF9XA5XyzNEJWWDv+UsloeFp8Gems3TnPoeSwIVsq/dx8UWhk1Z3JU
dH77KYv1Zm3XWBHL8oEIGJXB6hcTrz/boeSzj1yG7+Qa0X9R3hdy289djz+YBw36
Vw==
-----END CERTIFICATE-----
28 changes: 28 additions & 0 deletions wedpr-components/blockchain/src/main/resources/conf/sdk.key
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDCrRYkmdB/P5/6
CHV/bGCh8gcxyDR3RTl5xMhi3+QgYXkiSeOiDFgG1AiH+7A0tOAwPtNhuMqu5QMk
tgyKvYqZATSDaOkBaVqUUKhSpMRwQo9u4WFLkTDakPiLJbzijNVk10rWBK3ybd08
5LETz25IVwmvgS2F/CyBkWwMEddedn1cPUfuhJYW63h1pIROlTK858rG8lmGk6PR
u0M6bSNjlYdojR2UODizMAAaOfNsXbo3wxffhSNkhdZex7IsZuZKmktkXzFfmWdd
YG6AkLFfdHgz7uWnfRHcoOD6r94DdFcE8XhxvLbW8CFid8oJ29MYYdeGLDTLATyx
BuHv3iLBAgMBAAECggEAJ7BD8GhPYnHlOoNY+QZuWPXP061eTOaXBiVBOS8uAg/9
MylfOB1OIO4/YwHD9arefdeBHs4evDNCRcy7l9l2lSTywMu1nS0OY2hiOJ8Q0VYw
icl3HYHXNOgTU8L41DMkGi/uON2xXNhbH1v8Ye6LLEJaXiZ20ncL18p+/aLxhndE
D5OfUz4yyquWq9/3IycGG5EowtSkL6yyMk9jcdWnsWwPAJ9hLsASj6ad/CRgIBt4
ubHvWGz//Dglbf+LHI1Ieuqrd3zvW0bMkk0jRpCgPkiinZzeR5NuE5gVbQs+xMKs
BbU93Xk0Xb00KOjl6FKAgCffS97zB8REjTStyttrAQKBgQD6KqY1FqybZbWxhuAs
Mkvta4vIcmSsMeGOOcre8MIFy5AC7WF8zCrWLmM6GltDMhBTaJ/XqnGmq1xZFU4c
tTRMpaChFf0KgM5esM8YaFCfLFrlRg6v9eC+fW9ta4Sw293/zk9sJ6GWMiyiPjb+
A1SGmrXRoLTz7XC123e2UdrLEQKBgQDHNzDk14vV9u1Jju80lcwhV7wSgHEb3Dfh
/q8n4/HdQJQ3ANMwJ7IA8OEg62FzsPguF3R4ZbyMn0FBPG1lVVCV2M0DuVjraXjR
+DyxyD0ue1sCErFJ0pwyvdKRyqriC9+EjvTnsulBqGSnxz+JMLsN0wYRSE8OnRWq
RYb9LoP8sQKBgQD0oLwC8fc7xkvUG4Ye8dgZhK8eBe64C9b60zy0oU25iQN8OVC5
TpUc+COD774KiWw5g/e6VyvnxW36lsDZhcBsqxHWM8BLgwVKxy7cOTWNUTxZMxat
roxk+hf6MceBgp8lxEMaCe8TBmFrDdeMsQj4z1S4dqQ8W5V53/DCUmzXYQKBgQCV
rhEtkApADFTDVQLDlt2WG85ydFEH5tGSGwLNzQXYAIKcRSFoaBrlfBca3eANxeTi
9LqND5u4aJvmARoM7iorPIblimiWEFw4HvSze0kE2KhLiXHtjrHPqjJBWm5EgzlA
5wx53kJGE9j0+s7xLE0PGQPRDmxgBYTWt4CyUDXZMQKBgHJseRzggZvnerO02LLm
EvX3//I2GxgvoeJQtLwwgiHWHCAVShIOt5yIimu+PIkaxfV9eR9+HRsjKXXaOme0
E3h18dESRcj0vAtf6oE+QuqGTkxvXYlABqgm2dpknmguDLs+wsktv2bVtXpqvg8i
rstAgWT+6mcUSpUxMePwt+xO
-----END PRIVATE KEY-----
38 changes: 38 additions & 0 deletions wedpr-components/blockchain/src/main/resources/config.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
[cryptoMaterial]

certPath = "conf" # The certification path
disableSsl = "false" # Communication with nodes without SSL
useSMCrypto = "false" # RPC SM crypto type

# The following configurations take the certPath by default if commented
# caCert = "conf/ca.crt" # CA cert file path
# sslCert = "conf/sdk.crt" # SSL cert file path
# sslKey = "conf/sdk.key" # SSL key file path

# The following configurations take the sm certPath by default if commented
# caCert = "conf/sm_ca.crt" # SM CA cert file path
# sslCert = "conf/sm_sdk.crt" # SM SSL cert file path
# sslKey = "conf/sm_sdk.key" # SM SSL key file path
# enSslCert = "conf/sm_ensdk.crt" # SM encryption cert file path
# enSslKey = "conf/sm_ensdk.key" # SM ssl cert file path

[network]
messageTimeout = "10000"
defaultGroup="group0" # Console default group to connect
peers=["139.159.202.235:30200", "139.159.202.235:30201"] # The peer list to connect

[account]
keyStoreDir = "account" # The directory to load/store the account file, default is "account"
# accountFilePath = "" # The account file path (default load from the path specified by the keyStoreDir)
accountFileFormat = "pem" # The storage format of account file (Default is "pem", "p12" as an option)

# accountAddress = "" # The transactions sending account address
# Default is a randomly generated account
# The randomly generated account is stored in the path specified by the keyStoreDir

# password = "" # The password used to load the account file

[threadPool]
# threadPoolSize = "16" # The size of the thread pool to process message callback
# Default is the number of cpu cores

Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
logging.level.root=INFO

# mybatis sql log
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
spring.jackson.date-format = yyyy-MM-dd HH:mm:ss

spring.jackson.time-zone =GMT+8
# Spring configurations
server.port = 12000
spring.application.name=PPCS-MODELADM
spring.main.allow-bean-definition-overriding =true

spring.servlet.multipart.max-file-size = 20MB
spring.servlet.multipart.max-request-size = -1

# mybatis configuration
#mybatis.mapper-locations=classpath:mapper/*Mapper.xml

## dataset configuration
wedpr.dataset.debugMode=false
wedpr.dataset.debugMode.userTokenField=Wedpr-Test-User-Token

# excel
wedpr.datasource.excel.defaultSheet=0

# maximum number of data per page for paginated queries
wedpr.dataset.maxBatchSize=10

# thread pool config
wedpr.dataset.largeFileDataDir=./wedpr/largeFile/
wedpr.dataset.threadPool.namePrefix=dataset-th
wedpr.dataset.threadPool.maxPoolSize=16
wedpr.dataset.threadPool.corePoolSize=16
wedpr.dataset.threadPool.queueCapacity=100

# data source config
wedpr.dataset.dataSourceType[0].label=CSV\u6587\u4EF6
wedpr.dataset.dataSourceType[0].value=CSV

wedpr.dataset.dataSourceType[1].label=EXCEL\u6587\u4EF6
wedpr.dataset.dataSourceType[1].value=EXCEL

wedpr.dataset.dataSourceType[2].label=HDFS
wedpr.dataset.dataSourceType[2].value=HDFS

wedpr.dataset.dataSourceType[3].label=HIVE
wedpr.dataset.dataSourceType[3].value=HIVE
wedpr.dataset.dataSourceType[3].supportDynamicType=true

wedpr.dataset.dataSourceType[4].label=\u6570\u636E\u5E93
wedpr.dataset.dataSourceType[4].value=DB
wedpr.dataset.dataSourceType[4].supportDynamicType=true
wedpr.dataset.dataSourceType[4].children[0].label=MYSQL
wedpr.dataset.dataSourceType[4].children[0].value=MYSQL
wedpr.dataset.dataSourceType[4].children[1].label=\u8FBE\u68A6
wedpr.dataset.dataSourceType[4].children[1].value=DM
wedpr.dataset.dataSourceType[4].children[2].label=POSTFRESQL
wedpr.dataset.dataSourceType[4].children[2].value=POSTFRESQL
wedpr.dataset.dataSourceType[4].children[3].label=\u9AD8\u65AF
wedpr.dataset.dataSourceType[4].children[3].value=GAUSS
wedpr.dataset.dataSourceType[4].children[4].label=\u4EBA\u5927\u91D1\u4ED3
wedpr.dataset.dataSourceType[4].children[4].value=KING
wedpr.dataset.dataSourceType[4].children[5].label=\u795E\u901A
wedpr.dataset.dataSourceType[4].children[5].value=SHENTONG

# storage download shard size 20M
wedpr.storage.download.shardSize=20971520

# storage type: LOCAL\u3001HDFS
wedpr.storage.type=LOCAL

# LOCAL
wedpr.storage.local.basedir=./wedpr/localStorage/

# HDFS
wedpr.storage.hdfs.baseDir=/user
wedpr.storage.hdfs.url=hdfs://wedpr-0001:9900

# USER
wedpr.user.jwt.secret=123456
# 1h ?unit is ms?
wedpr.user.jwt.expireTime=3600000
wedpr.user.jwt.delimiter=|
wedpr.user.jwt.cacheSize=10000
wedpr.user.jwt.privateKey=
wedpr.user.jwt.publicKey=
wedpr.user.jwt.sessionKey=

springfox.documentation.enabled=true

Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,44 @@ public String executePostAndGetString(BaseRequest request, Integer successCode)
}
}

public String executeHttpsPostAndGetString(
BaseRequest request, Integer successCode, String token) throws Exception {
StringEntity requestEntity = null;
CloseableHttpResponse response = null;
try {
CloseableHttpClient httpClient =
HttpClientPool.getHttpsClient(this.maxConnTotal, this.requestConfig);
HttpPost httpPost = new HttpPost(this.url);
requestEntity = new StringEntity(request.serialize());
httpPost.setEntity(requestEntity);
httpPost.setHeader(CONTENT_TYPE_KEY, DEFAULT_CONTENT_TYPE);
if (token != null) {
httpPost.setHeader("token", token);
}
response = httpClient.execute(httpPost);
if (successCode != null) {
if (response.getStatusLine().getStatusCode() != successCode) {
throw new WeDPRException(
"send request: "
+ request.serialize()
+ " failed, status: "
+ response.getStatusLine().toString()
+ ", detail: "
+ EntityUtils.toString(response.getEntity()));
}
}
String result = EntityUtils.toString(response.getEntity());
logger.info(
"##### executeHttpsPostAndGetString, request: {}, response: {}, response: {}",
request.serialize(),
result,
response.toString());
return result;
} finally {
releaseResource(response, requestEntity);
}
}

private void releaseResource(CloseableHttpResponse response, StringEntity requestEntity)
throws Exception {
HttpClientPool.consume(requestEntity);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,17 @@

import java.io.IOException;
import java.io.InputStream;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import org.apache.http.HttpEntity;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.ssl.SSLContextBuilder;

public class HttpClientPool {
private static final PoolingHttpClientConnectionManager poolingHttpClientConnectionManager =
Expand All @@ -36,6 +42,28 @@ public static CloseableHttpClient getHttpClient(int maxConnTotal, RequestConfig
.build();
}

public static CloseableHttpClient getHttpsClient(
int maxConnTotal, RequestConfig requestConfig) {
CloseableHttpClient build = null;
try {
build =
HttpClients.custom()
.setSSLContext(
SSLContextBuilder.create()
.loadTrustMaterial(new TrustSelfSignedStrategy())
.build())
.setSSLHostnameVerifier(new NoopHostnameVerifier())
.setConnectionManager(poolingHttpClientConnectionManager)
.setMaxConnTotal(maxConnTotal)
.setMaxConnPerRoute((maxConnTotal / 2 > 0 ? maxConnTotal / 2 : 1))
.setDefaultRequestConfig(requestConfig)
.build();
} catch (NoSuchAlgorithmException | KeyManagementException | KeyStoreException e) {
e.printStackTrace();
}
return build;
}

public static void consume(HttpEntity entity) throws IOException {
if (entity == null) {
return;
Expand All @@ -50,7 +78,7 @@ public static void consume(HttpEntity entity) throws IOException {
}

public static String getUrl(String url) {
if (url.startsWith("http://")) {
if (url.startsWith("http://") || url.startsWith("https://")) {
return url;
}
return String.format("http://%s", url);
Expand Down
Loading

0 comments on commit b9cb202

Please sign in to comment.