Commit e6e62524 authored by stopcovid@lunabee.com's avatar stopcovid@lunabee.com
Browse files

Update to 1.1.4

parent 009bbd4c
......@@ -18,10 +18,12 @@ android {
buildTypes {
debug {
buildConfigField 'Boolean', 'USE_LOCAL_DATA', 'false'
buildConfigField 'Boolean', 'USE_LOCAL_DATA', 'true'
buildConfigField 'long', 'REFRESH_STRING_MIN_DURATION', '(long) 0.01'
}
release {
buildConfigField 'Boolean', 'USE_LOCAL_DATA', 'false'
buildConfigField 'long', 'REFRESH_STRING_MIN_DURATION', '1L'
}
}
defaultConfig {
......
......@@ -39,7 +39,7 @@ abstract class ServerManager {
protected open fun url(): String = BuildConfig.SERVER_URL
@WorkerThread
protected fun fetchLast(context: Context, languageCode: String, forceRefresh: Boolean): Boolean {
protected suspend fun fetchLast(context: Context, languageCode: String, forceRefresh: Boolean): Boolean {
return try {
if (shouldRefresh(context) || forceRefresh) {
val filename = "${prefix(context)}${languageCode}${extension()}"
......@@ -95,7 +95,8 @@ abstract class ServerManager {
private fun shouldRefresh(context: Context): Boolean {
return !BuildConfig.USE_LOCAL_DATA
&& abs(System.currentTimeMillis() - PreferenceManager.getDefaultSharedPreferences(context)
.getLong(lastRefreshSharedPrefsKey(), 0L)) > TimeUnit.HOURS.toMillis(1L)
.getLong(lastRefreshSharedPrefsKey(),
0L)) > TimeUnit.HOURS.toMillis(BuildConfig.REFRESH_STRING_MIN_DURATION)
}
private fun saveLastRefresh(context: Context) {
......@@ -103,4 +104,4 @@ abstract class ServerManager {
putLong(lastRefreshSharedPrefsKey(), System.currentTimeMillis())
}
}
}
\ No newline at end of file
}
......@@ -7,38 +7,41 @@
~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~ Created by Lunabee Studio / Date - 2020/04/05 - for the STOP-COVID project
-->
<androidx.coordinatorlayout.widget.CoordinatorLayout
<merge
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusable="true">
xmlns:tools="http://schemas.android.com/tools">
<FrameLayout
android:id="@+id/bottomSheetFrameLayout"
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:behavior_hideable="false"
app:layout_behavior="@string/bottom_sheet_behavior">
android:layout_height="match_parent"
android:focusable="true">
<com.google.android.material.card.MaterialCardView
android:id="@+id/bottomSheetCardView"
style="@style/Widget.MaterialComponents.CardView"
<FrameLayout
android:id="@+id/bottomSheetFrameLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/spacing_medium"
app:cardElevation="@dimen/bottom_sheet_card_elevation">
app:behavior_hideable="false"
app:layout_behavior="@string/bottom_sheet_behavior">
<com.google.android.material.button.MaterialButton
android:id="@+id/bottomSheetButton"
style="@style/Widget.StopCovid.Button"
<com.google.android.material.card.MaterialCardView
android:id="@+id/bottomSheetCardView"
style="@style/Widget.MaterialComponents.CardView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="@dimen/spacing_xlarge"
android:layout_marginVertical="@dimen/spacing_large"
android:textAllCaps="false"
tools:text="@tools:sample/lorem[3]" />
</com.google.android.material.card.MaterialCardView>
</FrameLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
\ No newline at end of file
android:layout_marginTop="@dimen/spacing_medium"
app:cardElevation="@dimen/bottom_sheet_card_elevation">
<com.google.android.material.button.MaterialButton
android:id="@+id/bottomSheetButton"
style="@style/Widget.StopCovid.Button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="@dimen/spacing_xlarge"
android:layout_marginVertical="@dimen/spacing_large"
android:textAllCaps="false"
tools:text="@tools:sample/lorem[3]" />
</com.google.android.material.card.MaterialCardView>
</FrameLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
</merge>
\ No newline at end of file
......@@ -76,26 +76,6 @@ class ServiceTest {
}
}
@Test
fun registerTest() {
server.enqueue(MockResponse().setResponseCode(200)
.setBody(ResourcesHelper.readTestFileAsString("registerSuccess")))
val result = runBlocking {
dataSource.register("", "", "")
}
assertThat(result).isInstanceOf(RobertResultData.Success::class.java)
result as RobertResultData.Success
assertThat(result.data.message).isEqualTo("The application did register successfully")
assertThat(result.data.timeStart).isEqualTo(3796669679L)
assertThat(result.data.configuration?.size).isEqualTo(1)
assertThat(result.data.configuration?.get(0)?.name).isEqualTo("distance")
assertThat(result.data.configuration?.get(0)?.value).isEqualTo(12.0)
testDataErrors {
dataSource.register("", "", "")
}
}
@Test
fun statusTest() {
server.enqueue(MockResponse().setResponseCode(200)
......
{
"message": "The application did register successfully",
"tuples": "test",
"timeStart": 3796669679,
"config": [
{
"name": "distance",
"value": 12
}
]
}
\ No newline at end of file
......@@ -292,7 +292,7 @@ class LocalCryptoManager(private val appContext: Context) {
private const val RSA_WRAP_CIPHER_TYPE = "RSA/NONE/PKCS1Padding"
private const val AES_WRAPPED_PROTECTION_KEY_SHARED_PREFERENCE = "aes_wrapped_local_protection"
private const val BUFFER_SIZE = 4 * 1024
private const val BUFFER_SIZE = 4 * 256
private val prng: SecureRandom = SecureRandom()
}
......
......@@ -91,25 +91,6 @@ class SecureKeystoreDataSource(context: Context, private val cryptoManager: Loca
}
}
override var atRisk: Boolean?
get() {
val encryptedText = sharedPreferences.getString(SHARED_PREF_KEY_AT_RISK, null)
return if (encryptedText != null) {
cryptoManager.decryptToString(encryptedText).toBoolean()
} else {
null
}
}
set(value) {
if (value != null) {
sharedPreferences.edit()
.putString(SHARED_PREF_KEY_AT_RISK, cryptoManager.encryptToString(value.toString()))
.apply()
} else {
sharedPreferences.edit().remove(SHARED_PREF_KEY_AT_RISK).apply()
}
}
override var atRiskLastRefresh: Long?
get() {
val encryptedText = sharedPreferences.getString(SHARED_PREF_KEY_AT_RISK_LAST_REFRESH, null)
......@@ -167,6 +148,25 @@ class SecureKeystoreDataSource(context: Context, private val cryptoManager: Loca
}
}
override var lastRiskReceivedDate: Long?
get() {
val encryptedText = sharedPreferences.getString(SHARED_PREF_KEY_LAST_RISK_RECEIVED_DATE, null)
return if (encryptedText != null) {
cryptoManager.decryptToString(encryptedText).toLongOrNull()
} else {
null
}
}
set(value) {
if (value != null) {
sharedPreferences.edit()
.putString(SHARED_PREF_KEY_LAST_RISK_RECEIVED_DATE, cryptoManager.encryptToString(value.toString()))
.apply()
} else {
sharedPreferences.edit().remove(SHARED_PREF_KEY_LAST_RISK_RECEIVED_DATE).apply()
}
}
override var lastExposureTimeframe: Int?
get() {
val encryptedText = sharedPreferences.getString(SHARED_PREF_KEY_LAST_EXPOSURE_TIMEFRAME, null)
......@@ -478,8 +478,8 @@ class SecureKeystoreDataSource(context: Context, private val cryptoManager: Loca
private const val SHARED_PREF_KEY_KA = "shared.pref.ka"
private const val SHARED_PREF_KEY_KEA = "shared.pref.kea"
private const val SHARED_PREF_KEY_TIME_START = "shared.pref.time_start"
private const val SHARED_PREF_KEY_AT_RISK = "shared.pref.at_risk"
private const val SHARED_PREF_KEY_AT_RISK_LAST_REFRESH = "shared.pref.at_risk_last_refresh"
private const val SHARED_PREF_KEY_LAST_RISK_RECEIVED_DATE = "shared.pref.last_risk_received_date"
private const val SHARED_PREF_KEY_AT_RISK_MIN_HOUR_CONTACT_NOTIF = "shared.pref.at_risk_min_hour_contact_notif"
private const val SHARED_PREF_KEY_AT_RISK_MAX_HOUR_CONTACT_NOTIF = "shared.pref.at_risk_max_hour_contact_notif"
private const val SHARED_PREF_KEY_LAST_EXPOSURE_TIMEFRAME = "shared.pref.last_exposure_timeframe"
......
......@@ -62,24 +62,6 @@ object RetrofitClient {
val certificates: HandshakeCertificates = HandshakeCertificates.Builder()
.addTrustedCertificate(certificateFromString(context, "api_stopcovid_gouv_fr"))
.addTrustedCertificate(certificateFromString(context, "app_stopcovid_gouv_fr"))
.addTrustedCertificate(certificateFromString(context, "giag4"))
.addTrustedCertificate(certificateFromString(context, "giag4ecc"))
.addTrustedCertificate(certificateFromString(context, "googleca1"))
.addTrustedCertificate(certificateFromString(context, "gsr2"))
.addTrustedCertificate(certificateFromString(context, "gsr4"))
.addTrustedCertificate(certificateFromString(context, "gts1d2"))
.addTrustedCertificate(certificateFromString(context, "gts1o1"))
.addTrustedCertificate(certificateFromString(context, "gtsca1d3"))
.addTrustedCertificate(certificateFromString(context, "gtsltsr"))
.addTrustedCertificate(certificateFromString(context, "gtsltsx"))
.addTrustedCertificate(certificateFromString(context, "gtsr1"))
.addTrustedCertificate(certificateFromString(context, "gtsr2"))
.addTrustedCertificate(certificateFromString(context, "gtsr3"))
.addTrustedCertificate(certificateFromString(context, "gtsr4"))
.addTrustedCertificate(certificateFromString(context, "gtsy1"))
.addTrustedCertificate(certificateFromString(context, "gtsy2"))
.addTrustedCertificate(certificateFromString(context, "gtsy3"))
.addTrustedCertificate(certificateFromString(context, "gtsy4"))
.build()
sslSocketFactory(certificates.sslSocketFactory(), certificates.trustManager)
}
......
......@@ -20,7 +20,6 @@ import com.lunabeestudio.framework.remote.RetrofitClient
import com.lunabeestudio.framework.remote.extension.remoteToRobertException
import com.lunabeestudio.framework.remote.model.ApiCommonRS
import com.lunabeestudio.framework.remote.model.ApiDeleteExposureHistoryRQ
import com.lunabeestudio.framework.remote.model.ApiRegisterRQ
import com.lunabeestudio.framework.remote.model.ApiRegisterV2RQ
import com.lunabeestudio.framework.remote.model.ApiReportRQ
import com.lunabeestudio.framework.remote.model.ApiStatusRQ
......@@ -86,16 +85,6 @@ class ServiceDataSource(context: Context, baseUrl: String = BuildConfig.BASE_URL
}
}
override suspend fun register(apiVersion: String, captcha: String, clientPublicECDHKey: String): RobertResultData<RegisterReport> {
val result = tryCatchRequestData {
api.register(apiVersion, ApiRegisterRQ(captcha = captcha, clientPublicECDHKey = clientPublicECDHKey))
}
return when (result) {
is RobertResultData.Success -> RobertResultData.Success(result.data.toDomain())
is RobertResultData.Failure -> RobertResultData.Failure(result.error)
}
}
override suspend fun unregister(apiVersion: String, ssu: ServerStatusUpdate): RobertResult {
return tryCatchRequest {
api.unregister(apiVersion, ApiUnregisterRQ(ebid = ssu.ebid, epochId = ssu.epochId, time = ssu.time, mac = ssu.mac))
......
......@@ -13,7 +13,6 @@ package com.lunabeestudio.framework.remote.server
import com.lunabeestudio.framework.remote.model.ApiCaptchaRS
import com.lunabeestudio.framework.remote.model.ApiCommonRS
import com.lunabeestudio.framework.remote.model.ApiDeleteExposureHistoryRQ
import com.lunabeestudio.framework.remote.model.ApiRegisterRQ
import com.lunabeestudio.framework.remote.model.ApiRegisterRS
import com.lunabeestudio.framework.remote.model.ApiRegisterV2RQ
import com.lunabeestudio.framework.remote.model.ApiReportRQ
......@@ -38,9 +37,6 @@ internal interface StopCovidApi {
@Path("captchaId") captchaId: String,
@Path("type") type: String): Response<ResponseBody>
@POST("/api/{apiVersion}/register")
suspend fun register(@Path("apiVersion") apiVersion: String, @Body registerRQ: ApiRegisterRQ): Response<ApiRegisterRS>
@POST("/api/{apiVersion}/register")
suspend fun registerV2(@Path("apiVersion") apiVersion: String, @Body registerRQ: ApiRegisterV2RQ): Response<ApiRegisterRS>
......
-----BEGIN CERTIFICATE-----
MIIEUjCCAzqgAwIBAgINAfCcV1RXl2CHLHwkczANBgkqhkiG9w0BAQsFADBMMSAw
HgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFs
U2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjAeFw0xODExMDEwMDAwNDJaFw0yMTEy
MTUwMDAwNDJaMEExCzAJBgNVBAYTAlVTMSIwIAYDVQQKExlHb29nbGUgVHJ1c3Qg
U2VydmljZXMgTExDMQ4wDAYDVQQDEwVHSUFHNDCCASIwDQYJKoZIhvcNAQEBBQAD
ggEPADCCAQoCggEBAL0sOwJ4bKMmGuc/3KyrbQedl/kdJXd1HUAVOGHP+MJheunK
R3hDjEpoXWmOUc2K6MGepBtcVy60qFVLrnVD0X4P840ar/wAFQyRanPDp4YIc2lm
VPc5YbUYGOJceGeqQ6LE7keYpgnCr8Kog87Tia+GCh7pNt6d3Mbtcw51LLjfnJuE
5FbSNUrLknPbdbhKwbxSHFur93S3I6z5JsBOtbnWUJQQxycwhcK4Vy7Vy5ZrkgOf
/aTrliflN60oEuyAkn2vN75AXtNMpoyGU+qIA11rhbLuHnbntu5xvIPYDtWKMyFA
le/sxMRtBuZMU6L4rPhSacvYSCMUha0SCjOA12kCAwEAAaOCATwwggE4MA4GA1Ud
DwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwEgYDVR0T
AQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQU7gqTztnU95qpl0RQNWbYzX1vWhAwHwYD
VR0jBBgwFoAUm+IHV2ccHsBqBt5ZtJot39wZhi4wYAYIKwYBBQUHAQEEVDBSMCUG
CCsGAQUFBzABhhlodHRwOi8vb2NzcC5wa2kuZ29vZy9nc3IyMCkGCCsGAQUFBzAC
hh1odHRwOi8vcGtpLmdvb2cvZ3NyMi9nc3IyLmNydDAyBgNVHR8EKzApMCegJaAj
hiFodHRwOi8vY3JsLnBraS5nb29nL2dzcjIvZ3NyMi5jcmwwHQYDVR0gBBYwFDAI
BgZngQwBAgEwCAYGZ4EMAQICMA0GCSqGSIb3DQEBCwUAA4IBAQAONoHxkjYOXrwm
y99ZHUZdBxrOel3cFM0S0+gMdK20hwiu8aIPVtDhGzKao0Xnug1jRhZxT5dHrEYZ
QVWmYj1m6T8RcqvV5mH8hbHmU0mYJlKVOHUxpNDmO8ikPiSvit5sM6zPsu5OpEo2
QaW76wRmYaj/j5Ma/g83+AvvLIqSXC+tAwX+dMY45QrANzEa7CQOWOdQwH5/lgv6
a/7rj+fv+03LeJApWZZu5i2dTzpu6+XFcPaXm5Tv9nulgz00djrY1hjSuxGf2Z5z
GrmenEnn8kHB5lEaEk+840sfFccQimMunBglEe0LgHzjZULqa6BT1xIdkB+023Hf
HBV1amXo
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICzTCCAnSgAwIBAgINAfCcV4rg6fwYVYZ8ZDAKBggqhkjOPQQDAjBQMSQwIgYD
VQQLExtHbG9iYWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2Jh
bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTgxMTAxMDAwMDQyWhcNMjgx
MTAxMDAwMDQyWjBFMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0
IFNlcnZpY2VzIExMQzESMBAGA1UEAxMJR0lBRzQgRUNDMFkwEwYHKoZIzj0CAQYI
KoZIzj0DAQcDQgAEWgDxDsTP7Od9rB8TPUltMacYCHYINthcDjlPu3wP0Csmy6Dr
it3ghqaTqFecqcgks5RwcKQkT9rbY3e8lHuuA6OCATwwggE4MA4GA1UdDwEB/wQE
AwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwEgYDVR0TAQH/BAgw
BgEB/wIBADAdBgNVHQ4EFgQUgIz8FgrI85nOXJO/Y+NKlsucmbQwHwYDVR0jBBgw
FoAUVLB7rUW44kB/+wpu+74zyTyjhNUwYAYIKwYBBQUHAQEEVDBSMCUGCCsGAQUF
BzABhhlodHRwOi8vb2NzcC5wa2kuZ29vZy9nc3I0MCkGCCsGAQUFBzAChh1odHRw
Oi8vcGtpLmdvb2cvZ3NyNC9nc3I0LmNydDAyBgNVHR8EKzApMCegJaAjhiFodHRw
Oi8vY3JsLnBraS5nb29nL2dzcjQvZ3NyNC5jcmwwHQYDVR0gBBYwFDAIBgZngQwB
AgEwCAYGZ4EMAQICMAoGCCqGSM49BAMCA0cAMEQCIHefcgvUaglzgnTWmDYl1CWe
X3GXf0bC9zKDpXDXQSv+AiB4uN8G0OaMfc6LQXcg3EBGX/3ER7kj6WdPct/JGbt3
gw==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEuDCCA6CgAwIBAgIQC9E5g/AsZUQf/kndVg5eLDANBgkqhkiG9w0BAQsFADBl
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv
b3QgQ0EwHhcNMTUwODI1MTIwMDAwWhcNMjUwODI1MTIwMDAwWjBeMQswCQYDVQQG
EwJVUzELMAkGA1UECBMCQ0ExFjAUBgNVBAcTDU1vdW50YWluIFZpZXcxFTATBgNV
BAoTDEdvb2dsZSwgSW5jLjETMBEGA1UEAxMKR29vZ2xlIENBMTCCASIwDQYJKoZI
hvcNAQEBBQADggEPADCCAQoCggEBALqWMezVPbG3lsUiEggEQRlDY/2CplKaBcZz
PnBcFPfEJt01pPkJJG4Fje0nAagRyh6sB7ejmb5IQhG1dw+wtog5JzPK4iXUeOX/
Zg8x1IjtdgB8samqOeD60hryLpAQsVNATvFFfM4P2QxVKETy+uD5PcVpXfU4c5cL
bOgYugpI2ehzORIhYoiHDkr8fLRiB3NP53AQY7KKf3HkSuuNeUXlyqchRxBKh+Nj
+uF6xnQ2ElZYtI2YVA0KBwgo2cSKQGoC2DOaa8lb3VgRk7x+J9I9LszyDPK4gvl2
Mhyp6VvyYGq4FwAwULyEcETcBLr3701WuCSJT4QmMDKOKi84cb0CAwEAAaOCAWkw
ggFlMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgGGMHkGCCsGAQUF
BwEBBG0wazAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEMG
CCsGAQUFBzAChjdodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRB
c3N1cmVkSURSb290Q0EuY3J0MEUGA1UdHwQ+MDwwOqA4oDaGNGh0dHA6Ly9jcmw0
LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcmwwPQYDVR0g
BDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3LmRpZ2ljZXJ0
LmNvbS9DUFMwHQYDVR0OBBYEFBV/772J7ryuGhmJxSredhbMJsZuMB8GA1UdIwQY
MBaAFEXroq/0ksuCMS1Ri6enIZ3zbcgPMA0GCSqGSIb3DQEBCwUAA4IBAQBFZSzB
naSkqUajv9RZ2J8kfmzf3BOAZRjeJCBmcQhU14Spat+Q7bFHoTQZWF07VKPEBdj1
egZxdWF4Y/AAYrmX91N2F7AS+h9iI3gQdKVyJLDGxL09QPqaulVtt+ltXPU0KtQy
B5czZGzvwKfmD/UCI/aen2VQnRy83weQzgDfxv+zVMb/75sUguaVxXiLaH73Fs7F
qUK6uyhnkKFf+b5xZ0dvN3tYSDE7UH1KQHd1nf3iY1l7mz8oTQPRz0pXAF3KCilo
cPgNuFf41ExruL+sX7fwWok2rlzrIzHxqnYYiMZnDw1abrGKDw15ohTG+cZCjpJf
l4NzPnfo6QDWgin+
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G
A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp
Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1
MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG
A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI
hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL
v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8
eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq
tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd
C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa
zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB
mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH
V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n
bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG
3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs
J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO
291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS
ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd
AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk
MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH
bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX
DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD
QSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ
FspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw
DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F
uOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX
kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs
ewv4n4Q=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIESjCCAzKgAwIBAgINAeO0nXfN9AwGGRa24zANBgkqhkiG9w0BAQsFADBMMSAw
HgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFs
U2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjAeFw0xNzA2MTUwMDAwNDJaFw0yMTEy
MTUwMDAwNDJaMEIxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVHb29nbGUgVHJ1c3Qg
U2VydmljZXMxEzARBgNVBAMTCkdUUyBDQSAxRDIwggEiMA0GCSqGSIb3DQEBAQUA
A4IBDwAwggEKAoIBAQCy2Xvh4dc/HJFy//kQzYcVeXS3PkeLsmFV/Qw2xn53Qjqy
+lJbC3GB1k3V6SskTSNeiytyXyFVtSnvRMvrglKrPiekkklBSt6o3THgPN9tek0t
1m0JsA7jYfKy/pBsWnsQZEm0CzwI8up5DGymGolqVjKgKaIwgo+BUQzzornZdbki
nicUukovLGNYh/FdEOZfkbu5W8xH4h51toyPzHVdVwXngsaEDnRyKss7VfVucOtm
acMkuziTNZtoYS+b1q6md3J8cUhYMxCv6YCCHbUHQBv2PeyirUedtJQpNLOML80l
A1g1wCWkVV/hswdWPcjQY7gg+4wdQyz4+anV7G+XAgMBAAGjggEzMIIBLzAOBgNV
HQ8BAf8EBAMCAYYwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBIGA1Ud
EwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFLHdMl3otzdy0s5czib+R3niAQjpMB8G
A1UdIwQYMBaAFJviB1dnHB7AagbeWbSaLd/cGYYuMDUGCCsGAQUFBwEBBCkwJzAl
BggrBgEFBQcwAYYZaHR0cDovL29jc3AucGtpLmdvb2cvZ3NyMjAyBgNVHR8EKzAp
MCegJaAjhiFodHRwOi8vY3JsLnBraS5nb29nL2dzcjIvZ3NyMi5jcmwwPwYDVR0g
BDgwNjA0BgZngQwBAgEwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly9wa2kuZ29vZy9y
ZXBvc2l0b3J5LzANBgkqhkiG9w0BAQsFAAOCAQEAcUrEwyOu9+OyAnmME+hTjoDF
8OPvcWCpqXs0ZYU0vUc7A1cWAJlIOuDg8OrNtkg81aty8NAby2QtOw10aNd0iDF8
aroO8IxNeM7aEPSKlkWXqZetxTUaGGTok7YNnR+5Xh2A6udbnI6uDqaE0tEXzrP7
9oFPPOZon8/xpnbFfafz3X1YD+D2YQEcUY52MytInVyBUXIIF7r9AdPuRvn0smhA
mTEBbE8bxlbrgXPSeVIFkiZbcc2dxNLOI3cPQXppXiElxvi3/3r3R97CAHucWkWc
Kk5GkNl1LNj/jO7M3GnrbOYV0KP/SAusVd/fJZ1CtlGjZpVgxdAi5yJ6UaXMhw==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIESjCCAzKgAwIBAgINAeO0mqGNiqmBJWlQuDANBgkqhkiG9w0BAQsFADBMMSAw
HgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFs
U2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjAeFw0xNzA2MTUwMDAwNDJaFw0yMTEy
MTUwMDAwNDJaMEIxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVHb29nbGUgVHJ1c3Qg
U2VydmljZXMxEzARBgNVBAMTCkdUUyBDQSAxTzEwggEiMA0GCSqGSIb3DQEBAQUA
A4IBDwAwggEKAoIBAQDQGM9F1IvN05zkQO9+tN1pIRvJzzyOTHW5DzEZhD2ePCnv
UA0Qk28FgICfKqC9EksC4T2fWBYk/jCfC3R3VZMdS/dN4ZKCEPZRrAzDsiKUDzRr
mBBJ5wudgzndIMYcLe/RGGFl5yODIKgjEv/SJH/UL+dEaltN11BmsK+eQmMF++Ac
xGNhr59qM/9il71I2dN8FGfcddwuaej4bXhp0LcQBbjxMcI7JP0aM3T4I+DsaxmK
FsbjzaTNC9uzpFlgOIg7rR25xoynUxv8vNmkq7zdPGHXkxWY7oG9j+JkRyBABk7X
rJfoucBZEqFJJSPk7XA0LKW0Y3z5oz2D0c1tJKwHAgMBAAGjggEzMIIBLzAOBgNV
HQ8BAf8EBAMCAYYwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBIGA1Ud
EwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFJjR+G4Q68+b7GCfGJAboOt9Cf0rMB8G
A1UdIwQYMBaAFJviB1dnHB7AagbeWbSaLd/cGYYuMDUGCCsGAQUFBwEBBCkwJzAl
BggrBgEFBQcwAYYZaHR0cDovL29jc3AucGtpLmdvb2cvZ3NyMjAyBgNVHR8EKzAp
MCegJaAjhiFodHRwOi8vY3JsLnBraS5nb29nL2dzcjIvZ3NyMi5jcmwwPwYDVR0g
BDgwNjA0BgZngQwBAgIwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly9wa2kuZ29vZy9y
ZXBvc2l0b3J5LzANBgkqhkiG9w0BAQsFAAOCAQEAGoA+Nnn78y6pRjd9XlQWNa7H
TgiZ/r3RNGkmUmYHPQq6Scti9PEajvwRT2iWTHQr02fesqOqBY2ETUwgZQ+lltoN
FvhsO9tvBCOIazpswWC9aJ9xju4tWDQH8NVU6YZZ/XteDSGU9YzJqPjY8q3MDxrz
mqepBCf5o8mw/wJ4a2G6xzUr6Fb6T8McDO22PLRL6u3M4Tzs3A2M1j6bykJYi8wW
IRdAvKLWZu/axBVbzYmqmwkm5zLSDW5nIAJbELCQCZwMH56t2Dvqofxs6BBcCFIZ
USpxu6x6td0V7SvJCCosirSmIatj/9dSSVDQibet8q/7UK4v4ZUN80atnZz1yg==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDTzCCArigAwIBAgIDFXk3MA0GCSqGSIb3DQEBCwUAME4xCzAJBgNVBAYTAlVT
MRAwDgYDVQQKEwdFcXVpZmF4MS0wKwYDVQQLEyRFcXVpZmF4IFNlY3VyZSBDZXJ0
aWZpY2F0ZSBBdXRob3JpdHkwHhcNMTgwNTI5MjExODA5WhcNMjEwNTI4MjExODA5
WjBCMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVR29vZ2xlIFRydXN0IFNlcnZpY2Vz
MRMwEQYDVQQDEwpHVFMgQ0EgMUQzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
CgKCAQEAsUX4++gDvlpQYGaFi9JmomOPfqAsDVJBCLMQa8Ox2vBPsdd7ZqzqiVJq
uTRnSWNnOJBSuzf+RDZuEZz9eS5kZ19DcwrRU/aIKEhPBcnui7Z//JZpHBF6ai89
CXpChanZXbX6I9ylVomPI9+uuTb63RUAy6++1I/FdU/G/YTVNbJHsHXyBSHm7C53
7EPXowAH5zQZ8t18IoLuPVBrQpDVKvBVMdT9Wc21fvPvrkEY+Il/6Z8NXL/kUmAM
xsSsulpUBwEUKe+1haRtGMsM6DZhN3Tphr+AwTioLnSvaNDyqo+zfpJeXsoiwFLH
+Y6YsP6R5IjVBzUoimFgeWeTSbYPYQIDAQABo4HCMIG/MB8GA1UdIwQYMBaAFEjm
aPkr0rKV10fYIyAQTzOYkJ/UMB0GA1UdDgQWBBRQbcJVUeVAiBsJA/ZH/ACBwQZD
zzASBgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAU
BggrBgEFBQcDAQYIKwYBBQUHAwIwOgYDVR0fBDMwMTAvoC2gK4YpaHR0cDovL2Ny
bC5nZW90cnVzdC5jb20vY3Jscy9zZWN1cmVjYS5jcmwwDQYJKoZIhvcNAQELBQAD
gYEAEFScZI+pEn2EoNsg7jh5Hx5JzRaoJ5kDmYElkz57VxUFsaYTGU+RzCGBbPw7
mC8Xd65ZrRdXB9hP94rONZIM9KBBLd/3f8KBBJ7+206ZMhUcsNdkbIJ/RVcHZrRM
tbLeXtTDPEkJfydThlx5PMRi6khqpYrB3Bd7C5Pp0fSqDfk=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIBxTCCAWugAwIBAgINAfD3nVndblD3QnNxUDAKBggqhkjOPQQDAjBEMQswCQYD
VQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzERMA8G
A1UEAxMIR1RTIExUU1IwHhcNMTgxMTAxMDAwMDQyWhcNNDIxMTAxMDAwMDQyWjBE
MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM
QzERMA8GA1UEAxMIR1RTIExUU1IwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATN
8YyO2u+yCQoZdwAkUNv5c3dokfULfrA6QJgFV2XMuENtQZIG5HUOS6jFn8f0ySlV
eORCxqFyjDJyRn86d+Iko0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUw
AwEB/zAdBgNVHQ4EFgQUPv7/zFLrvzQ+PfNA0OQlsV+4u1IwCgYIKoZIzj0EAwID
SAAwRQIhAPKuf/VtBHqGw3TUwUIq7TfaExp3bH7bjCBmVXJupT9FAiBr0SmCtsuk
miGgpajjf/gFigGM34F9021bCWs1MbL0SA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIC0TCCAnagAwIBAgINAfQKmcm3qFVwT0+3nTAKBggqhkjOPQQDAjBEMQswCQYD
VQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzERMA8G
A1UEAxMIR1RTIExUU1IwHhcNMTkwMTIzMDAwMDQyWhcNMjkwNDAxMDAwMDQyWjBE
MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM
QzERMA8GA1UEAxMIR1RTIExUU1gwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARr
6/PTsGoOg9fXhJkj3CAk6C6DxHPnZ1I+ER40vEe290xgTp0gVplokojbN3pFx07f
zYGYAX5EK7gDQYuhpQGIo4IBSzCCAUcwDgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQW
MBQGCCsGAQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1Ud
DgQWBBSzK6ugSBx+E4rJCMRAQiKiNlHiCjAfBgNVHSMEGDAWgBQ+/v/MUuu/ND49
80DQ5CWxX7i7UjBpBggrBgEFBQcBAQRdMFswKAYIKwYBBQUHMAGGHGh0dHA6Ly9v
Y3NwLnBraS5nb29nL2d0c2x0c3IwLwYIKwYBBQUHMAKGI2h0dHA6Ly9wa2kuZ29v
Zy9ndHNsdHNyL2d0c2x0c3IuY3J0MDgGA1UdHwQxMC8wLaAroCmGJ2h0dHA6Ly9j
cmwucGtpLmdvb2cvZ3RzbHRzci9ndHNsdHNyLmNybDAdBgNVHSAEFjAUMAgGBmeB
DAECATAIBgZngQwBAgIwCgYIKoZIzj0EAwIDSQAwRgIhAPWeg2v4yeimG+lzmZAC
DJOlalpsiwJR0VOeapY8/7aQAiEAiwRsSQXUmfVUW+N643GgvuMH70o2Agz8w67f
SX+k+Lc=
-----END CERTIFICATE-----
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment