MPU Certification latest

This commit is contained in:
kizzy 2026-06-15 14:37:22 +07:00
parent f070ad1c10
commit 3b7354fc3f
23 changed files with 303 additions and 303 deletions

View File

@ -38,12 +38,14 @@ import com.mob.utsmyanmar.ui.settlement.SettlementViewModel
import com.mob.utsmyanmar.ui.transaction_result.TransactionResultEvent
import com.mob.utsmyanmar.ui.transaction_result.TransactionResultViewModel
import com.mob.utsmyanmar.ui.functions.FunctionsScreen
import com.mob.utsmyanmar.ui.refund_rrn.RRNViewModel
import com.mob.utsmyanmar.ui.tms_setup.TmsSetupRoute
import com.mob.utsmyanmar.ui.tms_setup.TmsSetupViewModel
import com.mob.utsmyanmar.ui.version.VersionScreen
import com.mob.utsmyanmar.viewmodel.SharedViewModel
import com.mob.utsmyanmar.viewmodel.TransProcessViewModel
import com.utsmyanmar.ecr.data.TransType
import com.utsmyanmar.paylibs.model.TradeData
import com.utsmyanmar.paylibs.utils.iso_utils.TransactionsType
@SuppressLint("ContextCastToActivity")
@ -112,16 +114,27 @@ fun AppNavGraph(
}
composable(Routes.SeeMore.route) {
val sharedViewModel: SharedViewModel = hiltViewModel(activity)
SeeMoreScreen(
onBack = { navController.popBackStack() },
onNavigateAmount = { action ->
if (action == "Void") {
navController.navigate(Routes.VoidTrace.route) {
launchSingleTop = true
when (action) {
"Void" -> {
sharedViewModel.transactionsType.value = TransactionsType.VOID
navController.navigate(Routes.VoidTrace.route) {
launchSingleTop = true
}
}
} else {
navController.navigate(Routes.Amount.createRoute(action)) {
launchSingleTop = true
"Pre-Auth Complete Void" -> {
sharedViewModel.transactionsType.value = TransactionsType.PRE_AUTH_COMPLETE_VOID
navController.navigate(Routes.VoidTrace.route) {
launchSingleTop = true
}
}
else -> {
navController.navigate(Routes.Amount.createRoute(action)) {
launchSingleTop = true
}
}
}
}
@ -144,8 +157,9 @@ fun AppNavGraph(
composable(Routes.VoidTrace.route) {
val voidViewModel: VoidViewModel = hiltViewModel()
val sharedViewModel: SharedViewModel = hiltViewModel(activity)
VoidTraceScreen(
sharedViewModel = sharedViewModel,
voidViewModel = voidViewModel,
onNavigateTranDetail = { trace ->
navController.navigate(Routes.VoidTranDetail.createRoute(trace)) {
@ -194,8 +208,19 @@ fun AppNavGraph(
trace = trace,
onBack = { navController.popBackStack() },
onProceedVoid = { payDetail ->
sharedViewModel.transactionsType.value = TransactionsType.VOID
transProcessViewModel.setTransType(TransactionsType.VOID)
if(sharedViewModel.transactionsType.value == TransactionsType.VOID) {
transProcessViewModel.setTransType(TransactionsType.VOID)
payDetail.transType = TransactionsType.VOID.name
payDetail.transactionType = TransactionsType.VOID.value
} else {
transProcessViewModel.setTransType(TransactionsType.PRE_AUTH_COMPLETE_VOID)
payDetail.transType = TransactionsType.PRE_AUTH_COMPLETE_VOID.name
payDetail.transactionType = TransactionsType.PRE_AUTH_COMPLETE_VOID.value
}
val tradeData = TradeData()
tradeData.payDetail = payDetail
transProcessViewModel.setTradeData(tradeData)
sharedViewModel.payDetail.value = payDetail
navController.navigate(Routes.Processing.route) {
popUpTo(Routes.VoidTranDetail.route) {
@ -392,8 +417,11 @@ fun AppNavGraph(
composable(Routes.InputRrn.route) {
val sharedViewModel: SharedViewModel = hiltViewModel(activity)
val rrnViewModel: RRNViewModel = hiltViewModel(activity)
val transProcessViewModel: TransProcessViewModel = hiltViewModel(activity)
InputRrnRoute(
transProcessViewModel = transProcessViewModel,
rrnViewModel = rrnViewModel,
sharedViewModel = sharedViewModel,
onBack = { navController.popBackStack() },
onNavigateProcessing = {

View File

@ -405,8 +405,19 @@ class PinPadViewModel @Inject constructor(
ON_CONFIRM_CLICK -> {
LogUtil.d(TAG, "ON CLICK CONFIRM")
isTerminalStateReached = true
_pinStatus.value = PinPadStatus.ON_CONFIRM
if (
transType.value == TransactionsType.PRE_AUTH_COMPLETE ||
transType.value == TransactionsType.PRE_AUTH_VOID ||
transType.value == TransactionsType.REFUND
) {
isTerminalStateReached = true
_pinStatus.value = PinPadStatus.ON_NEXT_SCREEN
} else {
isTerminalStateReached = true
_pinStatus.value = PinPadStatus.ON_CONFIRM
}
}
ON_CANCEL_CLICK -> {
@ -488,18 +499,11 @@ class PinPadViewModel @Inject constructor(
payDetail?.pinCipher = ""
}
if (
transType.value == TransactionsType.PRE_AUTH_COMPLETE ||
transType.value == TransactionsType.PRE_AUTH_VOID ||
transType.value == TransactionsType.REFUND
) {
isTerminalStateReached = true
_pinStatus.value = PinPadStatus.ON_NEXT_SCREEN
} else {
handler.obtainMessage(
ON_CONFIRM_CLICK
).sendToTarget()
}
}
override fun onCancel() {

View File

@ -200,6 +200,7 @@ fun ReceiptPreview(
ReceiptDivider()
ReceiptRow("Merchant", state.payDetail?.merchantName.toString() )
ReceiptRow("Terminal ID", state.payDetail?.terminalNo.toString() )
ReceiptRow("Trace No", state.payDetail?.voucherNo.toString() )
ReceiptRow("Transaction", state.payDetail?.transType.toString())
ReceiptRow("Amount", POSUtil.getInstance().getDecimalAmountSeparatorFormat(state.payDetail?.amount?:0))
ReceiptRow("Card Type", state.payDetail?.accountType.toString())

View File

@ -6,14 +6,22 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.mob.utsmyanmar.ui.components.NumericEntryScreen
import com.mob.utsmyanmar.viewmodel.SharedViewModel
import com.mob.utsmyanmar.viewmodel.TransProcessViewModel
import com.utsmyanmar.paylibs.model.PayDetail
import com.utsmyanmar.paylibs.model.TradeData
import com.utsmyanmar.paylibs.utils.POSUtil
import com.utsmyanmar.paylibs.utils.iso_utils.TransactionsType
import sunmi.sunmiui.utils.LogUtil
private const val RRN_MAX_LENGTH = 12
@Composable
fun InputRrnRoute(
transProcessViewModel: TransProcessViewModel,
rrnViewModel: RRNViewModel,
sharedViewModel: SharedViewModel,
onBack: () -> Unit,
onNavigateProcessing: () -> Unit
@ -28,6 +36,75 @@ fun InputRrnRoute(
errorMessage = null
}
val payDetailState by rrnViewModel.payDetailState.collectAsStateWithLifecycle()
fun processPreAuthComp(payDetail: PayDetail) {
val newPay = transProcessViewModel.payDetail
newPay?.setReferNo(payDetail.referNo)
newPay?.setApprovalCode(payDetail.getApprovalCode())
newPay?.setTradeTime(payDetail.getTradeTime())
newPay?.setTradeDate(payDetail.getTradeDate())
val tradeData = TradeData()
tradeData.payDetail = newPay
transProcessViewModel.setOldTransPayDetail(payDetail)
transProcessViewModel.setTradeData(tradeData)
rrnViewModel.resetState()
onNavigateProcessing()
}
fun processPreAuthVoid(payDetail: PayDetail) {
val newPay = transProcessViewModel.payDetail
newPay?.setReferNo(payDetail.referNo)
val tradeData = TradeData()
tradeData.payDetail = newPay
transProcessViewModel.setOldTransPayDetail(payDetail)
transProcessViewModel.setTradeData(tradeData)
rrnViewModel.resetState()
onNavigateProcessing()
}
LaunchedEffect(payDetailState) {
LogUtil.d("RRN","paydetail state: $payDetailState")
when (val state = payDetailState) {
is RRNViewModel.PayDetailState.Success -> {
sharedViewModel.payDetail.value = state.data
sharedViewModel.rrNNo.value = state.data.referNo
if(sharedViewModel.transactionsType.value == TransactionsType.PRE_AUTH_COMPLETE) {
processPreAuthComp(state.data)
} else if(sharedViewModel.transactionsType.value == TransactionsType.PRE_AUTH_VOID) {
processPreAuthVoid(state.data)
}
}
is RRNViewModel.PayDetailState.Error -> {
errorMessage = state.message
rrnViewModel.resetState()
// show dialog
// navigate to home
}
else -> Unit
}
}
NumericEntryScreen(
title = "Input RRN",
prompt = "Enter RRN",
@ -38,17 +115,32 @@ fun InputRrnRoute(
onCancelClick = onBack,
onConfirmClick = {
val trimmedRrn = rrn.trim()
if (POSUtil.getInstance().checkNumberField(trimmedRrn)) {
errorMessage = "Invalid RRN"
return@NumericEntryScreen
}
sharedViewModel.rrNNo.value = trimmedRrn
sharedViewModel.payDetail.value?.let { payDetail ->
payDetail.referNo = trimmedRrn
sharedViewModel.payDetail.value = payDetail
if(sharedViewModel.transactionsType.value == TransactionsType.REFUND ) {
val newPay = transProcessViewModel.payDetail
newPay?.setReferNo(trimmedRrn)
val tradeData = TradeData()
tradeData.payDetail = newPay
transProcessViewModel.setTradeData(tradeData)
rrnViewModel.resetState()
onNavigateProcessing()
} else{
rrnViewModel.searchPayDetail(
trimmedRrn,
sharedViewModel.payDetail.value?.cardNo?:""
)
}
onNavigateProcessing()
},
onKeyClick = { value ->
rrn = appendRrnValue(rrn, value)

View File

@ -0,0 +1,56 @@
package com.mob.utsmyanmar.ui.refund_rrn
import androidx.lifecycle.LiveData
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModel
import androidx.lifecycle.asFlow
import androidx.lifecycle.viewModelScope
import com.utsmyanmar.baselib.repo.Repository
import com.utsmyanmar.paylibs.model.PayDetail
import com.utsmyanmar.paylibs.system.SingleLiveEvent
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.launch
import javax.inject.Inject
@HiltViewModel
class RRNViewModel @Inject constructor(
private val repository: Repository
) : ViewModel() {
sealed class PayDetailState {
object Idle : PayDetailState()
object Loading : PayDetailState()
data class Success(val data: PayDetail) : PayDetailState()
data class Error(val message: String) : PayDetailState()
}
private val _payDetailState = MutableStateFlow<PayDetailState>(PayDetailState.Idle)
val payDetailState: StateFlow<PayDetailState> = _payDetailState
fun searchPayDetail(refNo: String, cardNo: String) {
_payDetailState.value = PayDetailState.Loading
viewModelScope.launch {
try {
repository.searchPayDetail(cardNo, refNo)
.asFlow()
.filterNotNull()
.first()
.let { result ->
_payDetailState.value = PayDetailState.Success(result)
}
} catch (e: Exception) {
_payDetailState.value = PayDetailState.Error(e.message ?: "Search failed")
}
}
}
fun resetState() {
_payDetailState.value = PayDetailState.Idle
}
}

View File

@ -40,11 +40,14 @@ import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.mob.utsmyanmar.ui.components.appbar.AppBar
import com.mob.utsmyanmar.ui.theme.Color
import com.mob.utsmyanmar.viewmodel.SharedViewModel
import com.utsmyanmar.paylibs.model.PayDetail
import com.utsmyanmar.paylibs.utils.iso_utils.TransactionsType
import sunmi.sunmiui.utils.LogUtil
@Composable
fun VoidTraceScreen(
sharedViewModel: SharedViewModel,
voidViewModel: VoidViewModel,
onNavigateTranDetail: (String) -> Unit,
onBack: () -> Unit = {}
@ -57,12 +60,18 @@ fun VoidTraceScreen(
val recentTransactions by voidViewModel.getLastThreeTransactions().observeAsState(emptyList())
val transactionSource: LiveData<PayDetail?> = remember(searchedTrace) {
val transType = if(sharedViewModel.transactionsType.value == TransactionsType.VOID) {
TransactionsType.SALE.value
} else {
TransactionsType.PRE_AUTH_COMPLETE.value;
}
LogUtil.d("void screen","transaction type : $transType and trace number : $searchedTrace")
if (searchedTrace.isBlank()) {
MutableLiveData<PayDetail?>(null)
} else {
@Suppress("UNCHECKED_CAST")
voidViewModel.getVoidTrans(
TransactionsType.SALE.value,
transType,
searchedTrace
) as LiveData<PayDetail?>
}

View File

@ -35,18 +35,18 @@ fun ProcessingRoute(
val settlementStatus by settlementViewModel.uiState.collectAsStateWithLifecycle()
val settlementStatusResult by settlementViewModel.events.collectAsStateWithLifecycle(Channel.BUFFERED)
if(sharedViewModel.transactionsType.value == TransactionsType.SETTLEMENT) {
LaunchedEffect(Unit) {
settlementViewModel.startSettlementProcess()
}
LaunchedEffect(settlementStatusResult) {
when(settlementStatusResult) {
LaunchedEffect(settlementStatus.status) {
when(settlementStatus.status) {
TransactionStatus.ON_ERROR,
TransactionStatus.ON_SUCCESS -> onNavigateTransactionResult()
TransactionStatus.ON_SUCCESS -> {
sharedViewModel.payDetail.value = settlementViewModel.getPayDetail()
onNavigateTransactionResult()
}
else -> {}
}
}

View File

@ -205,6 +205,7 @@ class SettlementViewModel @Inject constructor(
}
}
fun getPayDetail() = payDetail
fun setSettlementType(type: SettlementType) {
_uiState.update {
it.copy(settlementType = type)
@ -351,6 +352,7 @@ class SettlementViewModel @Inject constructor(
totalERefundAmount
}
payDetail = currentPayDetail
tradeData.payDetail = currentPayDetail
tradeData.field60 = field60

View File

@ -53,6 +53,7 @@ class TmsSetupViewModel @Inject constructor(
init {
viewModelScope.launch {
waitForHardware()
TMSUtil.getInstance().generateFinalVersion()
downloadConfigs()
}
}
@ -62,6 +63,8 @@ class TmsSetupViewModel @Inject constructor(
it.copy(isLoading = true, isError = false, statusText = "Connecting to TMS server...")
}
val disposable = repository.getParams(buildRequest())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
@ -103,6 +106,7 @@ class TmsSetupViewModel @Inject constructor(
delay(500)
elapsed += 500
}
}
private fun onConfigApplied() {

View File

@ -267,6 +267,7 @@ class TMSSetupsImpl : TMSSetups {
} catch (e: Exception) {
"?"
}
SystemParamsOperation.getInstance().setFinalVersion("PHV$phv-RV$rv-SV$sv")
return "PHV$phv-RV$rv-SV$sv"
}
private fun parseBoolean(data: String): Boolean =

View File

@ -3,7 +3,6 @@ package com.mob.utsmyanmar.viewmodel
import android.text.TextUtils
import androidx.lifecycle.ViewModel
import com.mob.utsmyanmar.model.TransResultStatus
import com.mob.utsmyanmar.ui.processing_card.ProcessingCardState
import com.mob.utsmyanmar.ui.sending_to_host.ProcessingState
import com.utsmyanmar.baselib.repo.Repository
import com.utsmyanmar.paylibs.model.PayDetail
@ -109,6 +108,12 @@ class TransProcessViewModel @Inject constructor(
fun setOldTransPayDetail(payDetail: PayDetail) {
oldTransPayDetail = payDetail
}
fun setNewPayDetail(payDetail: PayDetail) {
this.payDetail = payDetail
tradeData = TradeData()
tradeData.payDetail = payDetail
}
private val _state = MutableStateFlow(ProcessingState())
val state = _state.asStateFlow()
@ -263,9 +268,36 @@ class TransProcessViewModel @Inject constructor(
)
}
override fun processPreVoidDb(payResult: PayDetail) {}
override fun processPreCompDb(payResult: PayDetail) {}
override fun processPreCompVoidDb(payResult: PayDetail) {}
override fun processPreVoidDb(payResult: PayDetail) {
oldTransPayDetail?.apply {
isCanceled = true
repository.updatePayDetail(oldTransPayDetail!!)
}
repository.insertPayDetail(updateCurrentDateAndTime(payResult))
}
override fun processPreCompDb(payResult: PayDetail) {
if (oldTransPayDetail?.getAmount() == payResult.getAmount()) {
oldTransPayDetail?.apply {
isCanceled = true
repository.updatePayDetail(this)
}
} else {
oldTransPayDetail?.apply {
isCanceled = false
repository.updatePayDetail(this)
}
}
repository.insertPayDetail(updateCurrentDateAndTime(payResult))
}
override fun processPreCompVoidDb(payResult: PayDetail) {
payDetail?.apply {
isCanceled = true
repository.updatePayDetail(this)
}
repository.insertPayDetail(updateCurrentDateAndTime(payResult))
}
/*
* Reversal

View File

@ -206,7 +206,7 @@ public abstract class BaseXPrint {
String finalVersion = SystemParamsOperation.getInstance().getFinalVersion();
sunmiPrinterService.setFontSize(textSize, innerResultCallback);
sunmiPrinterService.printText("***** MERCHANT COPY *****" + "\n", innerResultCallback);
// sunmiPrinterService.printText("***** MERCHANT COPY *****" + "\n", innerResultCallback);
sunmiPrinterService.printText(finalVersion + "\n", innerResultCallback);
sunmiPrinterService.printText(receiptFooter + "\n", innerResultCallback);
} catch (RemoteException e) {

View File

@ -50,7 +50,7 @@ public class SignOnProcess {
private SignOnProcess() {
tradeData = Params.newTrade(true);
// payDetail = tradeData.getPayDetail();
isoMsgX = new ISOMsgX.ISOMsgXBuilder(ISOVersion.VERSION_1993, ISOMode.ONLY_HEADER,HostName.MPU)
isoMsgX = new ISOMsgX.ISOMsgXBuilder(ISOVersion.VERSION_1993, ISOMode.ONLY_HEADER,HostName.CARDZONE)
.build();
}
@ -59,7 +59,7 @@ public class SignOnProcess {
flag = false;
return listener -> {
// LogUtil.d(TAG, "Starting TX SignOn");
HostName hostName = HostName.MPU;
HostName hostName = HostName.CARDZONE;
PayDetail payDetail = tradeData.getPayDetail();
payDetail.setProcessCode(TransactionsType.SIGN_ON.processCode);
@ -67,7 +67,7 @@ public class SignOnProcess {
payDetail.setTransactionType(TransactionsType.SIGN_ON.value);
payDetail.setHostName(hostName.name);
byte[] sendBytes = isoMsgX.buildISOPackets(tradeData, BitmapConfig.MPU_NEW_SIGN_ON, MessageType.NETWORK_MANAGEMENT);
byte[] sendBytes = isoMsgX.buildISOPackets(tradeData, BitmapConfig.CZ_SIGN_ON, MessageType.NETWORK_MANAGEMENT);
ISOSocket.getInstance().enqueue(sendBytes, sendBytes.length,false, new ISOCallback() {
@Override
public void onReceive(byte[] bytes, int length) {

View File

@ -174,8 +174,8 @@ public class TransactionsOperation {
if (responseMap.get("F038") != null) {
transPayDetail.setApprovalCode(Objects.requireNonNull(responseMap.get("F038")).getDataStr());
} else {
transPayDetail.setIsNeedReversal(true);
return;
// transPayDetail.setIsNeedReversal(true);
// return;
}
if (responseMap.get("F046") != null) {
@ -376,7 +376,6 @@ public class TransactionsOperation {
newPay.setTransCVM(TransCVM.SIGNATURE);
if((oldPay.getAccountType().equals(CardScheme.MASTERCARD.name) || oldPay.getAccountType().equals(CardScheme.VISA.name))) {
newPay.setProcessCode(TransactionsType.PRE_AUTH_SALE.processCode);
}
// for manual entry reversal which need de 35
@ -391,12 +390,14 @@ public class TransactionsOperation {
newPay.setReferNo(oldPay.getReferNo());
newPay.setTempKSN(oldPay.getTempKSN());
newPay.setTransCVM(oldPay.getTransCVM()); //added on 26 Nov 2025
newPay.setApprovalCode(oldPay.getApprovalCode());
newPay.setTradeTime(oldPay.getTradeTime()); // mpu
newPay.setTradeDate(oldPay.getTradeDate()); // mpu
} else if (transactionsType == TransactionsType.PRE_AUTH_COMPLETE_VOID) {
newPay.setVoucherNo(oldPay.getVoucherNo());
newPay.setCustomOrderNo(oldPay.getVoucherNo());
newPay.setReferNo(oldPay.getReferNo());
newPay.setCardInfo(oldPay.getCardInfo());
/*
* new requirements */
newPay.setCardType(AidlConstants.CardType.IC.getValue());
@ -406,7 +407,7 @@ public class TransactionsOperation {
if(oldPay.getAccountType().equals(CardScheme.MPU.name) || oldPay.getAccountType().equals(CardScheme.MPU_CTLS.name)){
newPay.setTransCVM(TransCVM.NO_CVM);
newPay.setTransCVM(TransCVM.SIGNATURE);
}
newTrade.setPayDetail(newPay);

View File

@ -130,7 +130,7 @@ public class HostUtils {
if (hostName == HostName.BPC) {
msgType = MessageType.REVERSAL;
} else {
msgType = MessageType.FINANCIAL;
msgType = MessageType.REVERSAL;
}
break;
case SETTLEMENT:

View File

@ -374,13 +374,10 @@ public class FieldUtils {
08 mail order/telephone order
* */
// Service point condition code Fill in 00 for ordinary consumer transactions and mobile phone chip transactions, fill in 08 for order consumer transactions, fill in 64 for installment transactions, fill in 65 for points consumption transactions, fill in 67 for mobile phone card-free reservations
// if (payDetail.getTransactionType() == PRE_AUTH_VOID.value) {
// field.setDataStr("06");
// } else {
// field.setDataStr("00");
// }
if(payDetail.getTransactionType() == REFUND.value) {
if (payDetail.getTransactionType() == PRE_AUTH_SALE.value) {
field.setDataStr("06");
}
else if(payDetail.getTransactionType() == REFUND.value) {
field.setDataStr("00"); // MPU
} else if(payDetail.getCardType() == -1) {
field.setDataStr("08");

View File

@ -82,6 +82,7 @@ public class Params {
payDetail.setIsCanceled(false);
payDetail.transNum = System.currentTimeMillis() / 1000;
// need to add host logic in another place
// payDetail.setHostName("MPU");
payDetail.setHostName("MPU");
// payDetail.setHostName("MOB");

View File

@ -0,0 +1,21 @@
-----BEGIN CERTIFICATE-----
MIIDYTCCAkmgAwIBAgIETeycDjANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQGEwJt
eTELMAkGA1UECBMCa2wxDDAKBgNVBAcTA2trbDERMA8GA1UEChMIY2FyZHpvbmUx
ETAPBgNVBAsTCGNhcmR6b25lMREwDwYDVQQDEwhjYXJkem9uZTAeFw0yMTA3MDcw
ODU5MzlaFw0zMTA3MDUwODU5MzlaMGExCzAJBgNVBAYTAm15MQswCQYDVQQIEwJr
bDEMMAoGA1UEBxMDa2tsMREwDwYDVQQKEwhjYXJkem9uZTERMA8GA1UECxMIY2Fy
ZHpvbmUxETAPBgNVBAMTCGNhcmR6b25lMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
MIIBCgKCAQEA2v7WJjmr0b9WpbcsTtk6llJDA5XeReWc3in0sirutMQi+9jLUdgJ
0Kdr0Cro0vbJAcVWTBYnMqnqh7oJQYs6vpIFKJA175ZhclQFAcL2jth+Tsqx9Av1
DxbuuB7yxU7ErkhXe+/B0R8zOag866R3Xg7u09GG4mlQMx5zmo1Hn3lqMU0lxEXM
vhkzVXLUMLhVwu/oJk98u+6pPXoCzXPjBCgy3iR+BaGIR6aiflz8Bi1Rn3XgfnMi
PzOzxKRZu5mNBRijs7ztcjA8Pc2uNI0ux3+jUJTgu2JRIBJs+7BkNcJeLzpW5psz
qfFdwxTKkgfqU9gJwuPaEbdnP0j7Rv2MBwIDAQABoyEwHzAdBgNVHQ4EFgQUOF7s
btNCxmv9HSAkSAPVAHpDXY4wDQYJKoZIhvcNAQELBQADggEBADOJaUnRiVucIb8q
jxplpSE0gOHMng+BMq2gKcqqc+QRc/mgM3n0J8F1A3rzj3udbzen3/9TnOiH17uy
FGLH12sJ7dJWMGAJ2p15N307ckrCab3+3Y1w6OQJLZ8t3eeXFGPVWQJtiOUbyX73
3Fv+TpNl6X1uEdQ0zNDiAvWZQ/e6ynYGF/tSgZLJvgV+8UY5ShCA0Ypousm6sPqb
KQXPCs3kRn1eMgMy8PcmUlZK/5qhD+xZswWgNiQ6EyCWmwpB4O0N9wQbLBTFZkGA
bDke78LVS1nUam9czcNvSDYyjWsk9ud8mo9JfF21qmwCR68btqDgeU0hM9W6lEQo
ezrrz9k=
-----END CERTIFICATE-----

View File

@ -1,23 +0,0 @@
-----BEGIN CERTIFICATE-----
MIID3DCCAsSgAwIBAgIJAIuL4ypXInCoMA0GCSqGSIb3DQEBBQUAMGcxCzAJBgNV
BAYTAk1SMQswCQYDVQQIDAJNUjEMMAoGA1UECgwDTVBVMQwwCgYDVQQLDANNUFUx
DTALBgNVBAMMBHRlc3QxIDAeBgkqhkiG9w0BCQEWEXdhaXlhbkBmcHQuY29tLnZu
MB4XDTIxMDIwMzE3MTExMloXDTIyMDIwMzE3MTExMlowdzELMAkGA1UEBhMCTVIx
DzANBgNVBAgMBllhbmdvbjEPMA0GA1UEBwwGWWFuZ29uMQwwCgYDVQQKDANNUFUx
DDAKBgNVBAsMA01QVTENMAsGA1UEAwwEdGVzdDEbMBkGCSqGSIb3DQEJARYMdGVz
dEBtcHUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAujLe6mWJ
GXliGUoLdJEA37VyBOQ7zLpge7u2QM2UMQXnKosdtZzMzXnVrnctJ6ehzLnhL0Lv
Oissr7qo53haXsJJccHeqcTH5cFkh96IswOrc8/1MMrb4zMjnNjOZaxmB4HeGHKk
KjNLKTTO8It3v/MziBhxUEEKVrN4npeUfsGVPfrvYnZXSWuRLhzYYLtEz/LFg4Yh
28pCXqk2vmGNV62oZ2+SDisoiYdIVEOMRqb/7cJg+cd0JRdvxHsTNuYRHGtJOM10
lEnoI+moE5OIUpp8Z+i4ZcvyThpNbRWf9sRzB8oc32fZ2UWnlN5+bVRLCjlk2jNO
SGdMuMaF0bs3GwIDAQABo3sweTAJBgNVHRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1P
cGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUipyzRYfqRc2P
QCJ0FJp6eAvI1wkwHwYDVR0jBBgwFoAUvYEAOtcvUt4CxCp+9zRG2oJqos8wDQYJ
KoZIhvcNAQEFBQADggEBAAjBQroy74ACyyJCZJ50KBTYQI3Sk82hO/+zZFqsJgWm
mNum31TtfwhvQmi94sXQSar0UsqLTmLC3UTucwEdSKOPzXF5BK4EEbkYgMm78hNK
2zqhGvcWlqun+KPxmnMRFoVmN3Ck2PkcgudvAeV0G3rm0OdLUwLoK2TcREVf1Cwg
C7jX5QtGOgVqnKDZBuoSvdbV30ka7pKkdJAy/Wus4N9hHH+bR2FNkLgTDoXnV8LL
E2dRKVYAh9TtuXiW/ejhPtEc14sMP+8JpCFX3DYx4yRW8ZeMl5jal4LhRFXdDbVl
Wm99KcWM+TNw/nzKwv0zUJXy0HlN82tvLX1/wbBUo8M=
-----END CERTIFICATE-----

Binary file not shown.

Binary file not shown.

View File

@ -1,113 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIG8DCCBNigAwIBAgIQWgAhSkRBOifV9FjHQOJCuDANBgkqhkiG9w0BAQwFADBL
MQswCQYDVQQGEwJBVDEQMA4GA1UEChMHWmVyb1NTTDEqMCgGA1UEAxMhWmVyb1NT
TCBSU0EgRG9tYWluIFNlY3VyZSBTaXRlIENBMB4XDTI0MDkwMzAwMDAwMFoXDTI1
MDkwMzIzNTk1OVowGTEXMBUGA1UEAwwOKi55b21hYmFuay5uZXQwggEiMA0GCSqG
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCAqUfzHF/N4m3xxNr/noBpg9s8edFWghYn
sYEAOQmMD1tVsjFavds9eAO5JBhL2+yQ8dxd5P5yqAHuQmEcBpw0YdPEAsKJbrqG
4VXU40q1DbQipnHiTrQx0RG5aRFsP6OTrRU0MnQMaFGTSgMKYKg0YM24si/JyyiX
eJXpEIXzt10NWpQfJ7T3RrzkkEHsfPzYmiBecUVmCu2Mb0/jym+Hr5eBvEf/mmhR
re/0hofitx9OTwmZt85uPVwpP6miOLpby+/46v7k8PSZ7qJhCv34AnnldY3uA+Ws
ld+Ria5Kpt6dHiBPzer/8HNd2Xkdpo2Ny3jq8N9vo0UJ2H7rWgy7AgMBAAGjggMA
MIIC/DAfBgNVHSMEGDAWgBTI2XhootkZaNU9ct5fCj7ctYaGpjAdBgNVHQ4EFgQU
Iu3iisKOIvooYnMumJGFqW4LTEkwDgYDVR0PAQH/BAQDAgWgMAwGA1UdEwEB/wQC
MAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMEkGA1UdIARCMEAwNAYL
KwYBBAGyMQECAk4wJTAjBggrBgEFBQcCARYXaHR0cHM6Ly9zZWN0aWdvLmNvbS9D
UFMwCAYGZ4EMAQIBMIGIBggrBgEFBQcBAQR8MHowSwYIKwYBBQUHMAKGP2h0dHA6
Ly96ZXJvc3NsLmNydC5zZWN0aWdvLmNvbS9aZXJvU1NMUlNBRG9tYWluU2VjdXJl
U2l0ZUNBLmNydDArBggrBgEFBQcwAYYfaHR0cDovL3plcm9zc2wub2NzcC5zZWN0
aWdvLmNvbTAnBgNVHREEIDAegg4qLnlvbWFiYW5rLm5ldIIMeW9tYWJhbmsubmV0
MIIBfAYKKwYBBAHWeQIEAgSCAWwEggFoAWYAdQDd3Mo0ldfhFgXnlTL6x5/4PRxQ
39sAOhQSdgosrLvIKgAAAZG2rpYwAAAEAwBGMEQCIAdAYV4eBpRPW8pCNmvriCr0
sOJZeBqBHoQ6fBSJHG1CAiAs841ZeuQRpFtLzZxxDXWbQYKJuT8iV6l2bZHsUdDh
owB1AA3h8jAr0w3BQGISCepVLvxHdHyx1+kw7w5CHrR+Tqo0AAABkbaulhAAAAQD
AEYwRAIgCLjpVhxG/w/Fsm+aAmE4t4PVAgASOgVMzoD/eOuor/MCIHN5h/YzzOzy
KbhEl5VkeSLbLUFz99Lq+Ci5Z0jRRTJ9AHYAEvFONL1TckyEBhnDjz96E/jntWKH
iJxtMAWE6+WGJjoAAAGRtq6WDwAABAMARzBFAiEA7uQaaiKBOBPRukDoHqvTzifk
1N8fcbf34xDC+BlelnUCIAZaPHlu2u+DJcxCAGgBoqVtZhdO64tcV6yy1fYqo2fq
MA0GCSqGSIb3DQEBDAUAA4ICAQBrxQPnmGA+CnhEq2ZaqZNQteRXb9+HbLT9Vq/I
6je5BtuYZrF1hd8V/NV3ug+vfWwNjUAILM068BnzfCvAaFxQ/kzmzPgttH2S5e0x
0fkG/I0pLtNj9ABcIcOKAnLK3Ce4ANgkpoHg8LtlBy2Tu9Aj+QgDCxz3Jhk6fIOi
dBlcveoRE3UpzaZ6G6XLz6CLHcFePhca+qlwWh9L3aw7Kr7ykgU62Y+z2R/KBmvg
6lPhumXSMffd3ikESgn+RyVXO6VRyszrIG5/B9NGLc1Of4g0+eE+znWIk4T7eVet
RnBMO5I4pLZb63Af9tuYBBBBOkoW+oWFeqxu0Y8G5EqReZiBvG8NvNi2Zj/wvDB+
aQN8u2oQnWHTqH5TS+3WSymWKsxHu3anYtRsNdLWb898HkYRPENXDLn8jETDyopN
cMBA4qou6di0HOaTmGfGn9cDvrJ/ciYZnT3msCdTSwAk19hacpEtgH3T12FMAtjk
aDj45VD1rRfmWj6j8xLVuOV6G6gjsloh3ruQv0j9va1vbmGufc9VbeUPCqFzL2UZ
vRr8xAggyjtYPpRwtA+SHAD27nnma3XeEBPwdJJs15wvZw2EH7fI4yYwZ3IrTtAq
ICt+BIXVlTQhfgtIC2XCuw3f5e5VlThZRKrJEB1TFAcmW9cCpTrKc5R4cs7XcTbt
m7MTbw==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIG1TCCBL2gAwIBAgIQbFWr29AHksedBwzYEZ7WvzANBgkqhkiG9w0BAQwFADCB
iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl
cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV
BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMjAw
MTMwMDAwMDAwWhcNMzAwMTI5MjM1OTU5WjBLMQswCQYDVQQGEwJBVDEQMA4GA1UE
ChMHWmVyb1NTTDEqMCgGA1UEAxMhWmVyb1NTTCBSU0EgRG9tYWluIFNlY3VyZSBT
aXRlIENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAhmlzfqO1Mdgj
4W3dpBPTVBX1AuvcAyG1fl0dUnw/MeueCWzRWTheZ35LVo91kLI3DDVaZKW+TBAs
JBjEbYmMwcWSTWYCg5334SF0+ctDAsFxsX+rTDh9kSrG/4mp6OShubLaEIUJiZo4
t873TuSd0Wj5DWt3DtpAG8T35l/v+xrN8ub8PSSoX5Vkgw+jWf4KQtNvUFLDq8mF
WhUnPL6jHAADXpvs4lTNYwOtx9yQtbpxwSt7QJY1+ICrmRJB6BuKRt/jfDJF9Jsc
RQVlHIxQdKAJl7oaVnXgDkqtk2qddd3kCDXd74gv813G91z7CjsGyJ93oJIlNS3U
gFbD6V54JMgZ3rSmotYbz98oZxX7MKbtCm1aJ/q+hTv2YK1yMxrnfcieKmOYBbFD
hnW5O6RMA703dBK92j6XRN2EttLkQuujZgy+jXRKtaWMIlkNkWJmOiHmErQngHvt
iNkIcjJumq1ddFX4iaTI40a6zgvIBtxFeDs2RfcaH73er7ctNUUqgQT5rFgJhMmF
x76rQgB5OZUkodb5k2ex7P+Gu4J86bS15094UuYcV09hVeknmTh5Ex9CBKipLS2W
2wKBakf+aVYnNCU6S0nASqt2xrZpGC1v7v6DhuepyyJtn3qSV2PoBiU5Sql+aARp
wUibQMGm44gjyNDqDlVp+ShLQlUH9x8CAwEAAaOCAXUwggFxMB8GA1UdIwQYMBaA
FFN5v1qqK0rPVIDh2JvAnfKyA2bLMB0GA1UdDgQWBBTI2XhootkZaNU9ct5fCj7c
tYaGpjAOBgNVHQ8BAf8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHSUE
FjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwIgYDVR0gBBswGTANBgsrBgEEAbIxAQIC
TjAIBgZngQwBAgEwUAYDVR0fBEkwRzBFoEOgQYY/aHR0cDovL2NybC51c2VydHJ1
c3QuY29tL1VTRVJUcnVzdFJTQUNlcnRpZmljYXRpb25BdXRob3JpdHkuY3JsMHYG
CCsGAQUFBwEBBGowaDA/BggrBgEFBQcwAoYzaHR0cDovL2NydC51c2VydHJ1c3Qu
Y29tL1VTRVJUcnVzdFJTQUFkZFRydXN0Q0EuY3J0MCUGCCsGAQUFBzABhhlodHRw
Oi8vb2NzcC51c2VydHJ1c3QuY29tMA0GCSqGSIb3DQEBDAUAA4ICAQAVDwoIzQDV
ercT0eYqZjBNJ8VNWwVFlQOtZERqn5iWnEVaLZZdzxlbvz2Fx0ExUNuUEgYkIVM4
YocKkCQ7hO5noicoq/DrEYH5IuNcuW1I8JJZ9DLuB1fYvIHlZ2JG46iNbVKA3ygA
Ez86RvDQlt2C494qqPVItRjrz9YlJEGT0DrttyApq0YLFDzf+Z1pkMhh7c+7fXeJ
qmIhfJpduKc8HEQkYQQShen426S3H0JrIAbKcBCiyYFuOhfyvuwVCFDfFvrjADjd
4jX1uQXd161IyFRbm89s2Oj5oU1wDYz5sx+hoCuh6lSs+/uPuWomIq3y1GDFNafW
+LsHBU16lQo5Q2yh25laQsKRgyPmMpHJ98edm6y2sHUabASmRHxvGiuwwE25aDU0
2SAeepyImJ2CzB80YG7WxlynHqNhpE7xfC7PzQlLgmfEHdU+tHFeQazRQnrFkW2W
kqRGIq7cKRnyypvjPMkjeiV9lRdAM9fSJvsB3svUuu1coIG1xxI1yegoGM4r5QP4
RGIVvYaiI76C0djoSbQ/dkIUUXQuB8AL5jyH34g3BZaaXyvpmnV4ilppMXVAnAYG
ON51WhJ6W0xNdNJwzYASZYH+tmCWI+N60Gv2NNMGHwMZ7e9bXgzUCZH5FaBFDGR5
S9VWqHB73Q+OyIVvIbKYcSc2w/aSuFKGSA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB
iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl
cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV
BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw
MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV
BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy
dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B
3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY
tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/
Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2
VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT
79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6
c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT
Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l
c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee
UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE
Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd
BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G
A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF
Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO
VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3
ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs
8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR
iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze
Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ
XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/
qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB
VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB
L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG
jjxDah2nGN59PRbxYvnKkKj9
-----END CERTIFICATE-----

View File

@ -1,113 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIG7zCCBNegAwIBAgIQX5oO6r1lg7MfeJb1v5aSwDANBgkqhkiG9w0BAQwFADBL
MQswCQYDVQQGEwJBVDEQMA4GA1UEChMHWmVyb1NTTDEqMCgGA1UEAxMhWmVyb1NT
TCBSU0EgRG9tYWluIFNlY3VyZSBTaXRlIENBMB4XDTIzMDkyOTAwMDAwMFoXDTI0
MDkyODIzNTk1OVowGTEXMBUGA1UEAwwOKi55b21hYmFuay5uZXQwggEiMA0GCSqG
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCAqUfzHF/N4m3xxNr/noBpg9s8edFWghYn
sYEAOQmMD1tVsjFavds9eAO5JBhL2+yQ8dxd5P5yqAHuQmEcBpw0YdPEAsKJbrqG
4VXU40q1DbQipnHiTrQx0RG5aRFsP6OTrRU0MnQMaFGTSgMKYKg0YM24si/JyyiX
eJXpEIXzt10NWpQfJ7T3RrzkkEHsfPzYmiBecUVmCu2Mb0/jym+Hr5eBvEf/mmhR
re/0hofitx9OTwmZt85uPVwpP6miOLpby+/46v7k8PSZ7qJhCv34AnnldY3uA+Ws
ld+Ria5Kpt6dHiBPzer/8HNd2Xkdpo2Ny3jq8N9vo0UJ2H7rWgy7AgMBAAGjggL/
MIIC+zAfBgNVHSMEGDAWgBTI2XhootkZaNU9ct5fCj7ctYaGpjAdBgNVHQ4EFgQU
Iu3iisKOIvooYnMumJGFqW4LTEkwDgYDVR0PAQH/BAQDAgWgMAwGA1UdEwEB/wQC
MAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMEkGA1UdIARCMEAwNAYL
KwYBBAGyMQECAk4wJTAjBggrBgEFBQcCARYXaHR0cHM6Ly9zZWN0aWdvLmNvbS9D
UFMwCAYGZ4EMAQIBMIGIBggrBgEFBQcBAQR8MHowSwYIKwYBBQUHMAKGP2h0dHA6
Ly96ZXJvc3NsLmNydC5zZWN0aWdvLmNvbS9aZXJvU1NMUlNBRG9tYWluU2VjdXJl
U2l0ZUNBLmNydDArBggrBgEFBQcwAYYfaHR0cDovL3plcm9zc2wub2NzcC5zZWN0
aWdvLmNvbTAnBgNVHREEIDAegg4qLnlvbWFiYW5rLm5ldIIMeW9tYWJhbmsubmV0
MIIBewYKKwYBBAHWeQIEAgSCAWsEggFnAWUAdQB2/4g/Crb7lVHCYcz1h7o0tKTN
uyncaEIKn+ZnTFo6dAAAAYrfFnGoAAAEAwBGMEQCID23iGjCqSL5njxZ4dhGR6xC
lr6Wrn//LYaRhG3luDIHAiBLPvTSOFO9fz8LpL/QZ+49xE5WbvFYBPW6pVcXYvqA
/gB2ANq2v2s/tbYin5vCu1xr6HCRcWy7UYSFNL2kPTBI1/urAAABit8WcgQAAAQD
AEcwRQIgANdbNT0g+H+IUw2MxicwxabC/rsHw9/QwF6KRQW1bKMCIQCHPlGpPhow
CiXAGeBXMt/of2hI0ePkT+2Wq70vzYLa+QB0AO7N0GTV2xrOxVy3nbTNE6Iyh0Z8
vOzew1FIWUZxH7WbAAABit8WcdcAAAQDAEUwQwIfQypm/cC8h3QPtMaBJC5m72O0
rY6wDYEhQQQ2vlcehQIgV4tV4sv8dlrkMjMVXDhKAutb9neYewzaYKYgOAD95C8w
DQYJKoZIhvcNAQEMBQADggIBAAhDQXNDUdbWDhRVIeFnJuueUrpq6IbG3S+l8tt4
qxUEa3xqhUsujry4yNrJvY+rCSjS6QxHytctmLVaFwvKgELNUXqPtEBTYIw/O/v/
+RZnLF2wG4rdD7BzhyBGQZsbcY1nxJlJ1BB8m0+b8aNQesL731ARbn1Tf9Tl46jZ
C9pDE5+KbJHJRy9yE/cyik+W9ndUBgEHRDwtZaMsQVHTstg2pBg2Sw9XvDraYMQI
Qhr2R9hjMHJaZd9pnjXfDkvA2MZvhjGEEHOvPv0k/r+vf4p2eiHhzYZ0Bv0atMVe
RG1sFV7jPvgsi/XhWQgAPUPk8nh/zyImgzVfoiHi4hZkGE2Kv0Gri+lxGyFzZ3rk
SNkcgMRFYoLI993ypLNIkcWTs8k4w5RjbQXYml7lEZHS1GjBcc4yaxX25Viyto74
vVwSjoKj/PrtT6gVOcub1HrXEaWauJgPaeHNcyT7ZpQ0s3PlnLjrLe5YSrlX1Aji
acMq7vQKtGG/6NSShCyIcKAQrFy90tmBV7qs8dwuPh/sUeBPT0fkFQQ50GIswMZU
10f/D0GAxEJtdFdp8zHdYmuz0CfTTao6EOKsszQVdde1GRlo4bWNifjtQPpulhai
dVmhitRmgLHWz2dIgD0kxM5elRsL1U35bumg9ldSacBCthJYvzeHZkPsa7+g2xZD
Mrq3
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIG1TCCBL2gAwIBAgIQbFWr29AHksedBwzYEZ7WvzANBgkqhkiG9w0BAQwFADCB
iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl
cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV
BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMjAw
MTMwMDAwMDAwWhcNMzAwMTI5MjM1OTU5WjBLMQswCQYDVQQGEwJBVDEQMA4GA1UE
ChMHWmVyb1NTTDEqMCgGA1UEAxMhWmVyb1NTTCBSU0EgRG9tYWluIFNlY3VyZSBT
aXRlIENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAhmlzfqO1Mdgj
4W3dpBPTVBX1AuvcAyG1fl0dUnw/MeueCWzRWTheZ35LVo91kLI3DDVaZKW+TBAs
JBjEbYmMwcWSTWYCg5334SF0+ctDAsFxsX+rTDh9kSrG/4mp6OShubLaEIUJiZo4
t873TuSd0Wj5DWt3DtpAG8T35l/v+xrN8ub8PSSoX5Vkgw+jWf4KQtNvUFLDq8mF
WhUnPL6jHAADXpvs4lTNYwOtx9yQtbpxwSt7QJY1+ICrmRJB6BuKRt/jfDJF9Jsc
RQVlHIxQdKAJl7oaVnXgDkqtk2qddd3kCDXd74gv813G91z7CjsGyJ93oJIlNS3U
gFbD6V54JMgZ3rSmotYbz98oZxX7MKbtCm1aJ/q+hTv2YK1yMxrnfcieKmOYBbFD
hnW5O6RMA703dBK92j6XRN2EttLkQuujZgy+jXRKtaWMIlkNkWJmOiHmErQngHvt
iNkIcjJumq1ddFX4iaTI40a6zgvIBtxFeDs2RfcaH73er7ctNUUqgQT5rFgJhMmF
x76rQgB5OZUkodb5k2ex7P+Gu4J86bS15094UuYcV09hVeknmTh5Ex9CBKipLS2W
2wKBakf+aVYnNCU6S0nASqt2xrZpGC1v7v6DhuepyyJtn3qSV2PoBiU5Sql+aARp
wUibQMGm44gjyNDqDlVp+ShLQlUH9x8CAwEAAaOCAXUwggFxMB8GA1UdIwQYMBaA
FFN5v1qqK0rPVIDh2JvAnfKyA2bLMB0GA1UdDgQWBBTI2XhootkZaNU9ct5fCj7c
tYaGpjAOBgNVHQ8BAf8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHSUE
FjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwIgYDVR0gBBswGTANBgsrBgEEAbIxAQIC
TjAIBgZngQwBAgEwUAYDVR0fBEkwRzBFoEOgQYY/aHR0cDovL2NybC51c2VydHJ1
c3QuY29tL1VTRVJUcnVzdFJTQUNlcnRpZmljYXRpb25BdXRob3JpdHkuY3JsMHYG
CCsGAQUFBwEBBGowaDA/BggrBgEFBQcwAoYzaHR0cDovL2NydC51c2VydHJ1c3Qu
Y29tL1VTRVJUcnVzdFJTQUFkZFRydXN0Q0EuY3J0MCUGCCsGAQUFBzABhhlodHRw
Oi8vb2NzcC51c2VydHJ1c3QuY29tMA0GCSqGSIb3DQEBDAUAA4ICAQAVDwoIzQDV
ercT0eYqZjBNJ8VNWwVFlQOtZERqn5iWnEVaLZZdzxlbvz2Fx0ExUNuUEgYkIVM4
YocKkCQ7hO5noicoq/DrEYH5IuNcuW1I8JJZ9DLuB1fYvIHlZ2JG46iNbVKA3ygA
Ez86RvDQlt2C494qqPVItRjrz9YlJEGT0DrttyApq0YLFDzf+Z1pkMhh7c+7fXeJ
qmIhfJpduKc8HEQkYQQShen426S3H0JrIAbKcBCiyYFuOhfyvuwVCFDfFvrjADjd
4jX1uQXd161IyFRbm89s2Oj5oU1wDYz5sx+hoCuh6lSs+/uPuWomIq3y1GDFNafW
+LsHBU16lQo5Q2yh25laQsKRgyPmMpHJ98edm6y2sHUabASmRHxvGiuwwE25aDU0
2SAeepyImJ2CzB80YG7WxlynHqNhpE7xfC7PzQlLgmfEHdU+tHFeQazRQnrFkW2W
kqRGIq7cKRnyypvjPMkjeiV9lRdAM9fSJvsB3svUuu1coIG1xxI1yegoGM4r5QP4
RGIVvYaiI76C0djoSbQ/dkIUUXQuB8AL5jyH34g3BZaaXyvpmnV4ilppMXVAnAYG
ON51WhJ6W0xNdNJwzYASZYH+tmCWI+N60Gv2NNMGHwMZ7e9bXgzUCZH5FaBFDGR5
S9VWqHB73Q+OyIVvIbKYcSc2w/aSuFKGSA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB
iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl
cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV
BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw
MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV
BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy
dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B
3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY
tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/
Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2
VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT
79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6
c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT
Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l
c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee
UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE
Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd
BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G
A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF
Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO
VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3
ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs
8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR
iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze
Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ
XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/
qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB
VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB
L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG
jjxDah2nGN59PRbxYvnKkKj9
-----END CERTIFICATE-----