Compare commits
19 Commits
develop-me
...
develop
Author | SHA1 | Date | |
---|---|---|---|
755df1ec5a | |||
cd91d40dd0 | |||
642dba8dac | |||
4f044555ba | |||
230d5b6bce | |||
73c7700ded | |||
9e66772b53 | |||
5ef66af3f8 | |||
1b29d43580 | |||
dd5af12c7c | |||
af21774d17 | |||
fc250c248e | |||
fc39d5bead | |||
a5c00ba10a | |||
f7053359a5 | |||
056858d412 | |||
3f40baad3e | |||
|
b1c8419af5 | ||
|
271768065c |
10
.env
10
.env
@ -1,7 +1,11 @@
|
||||
PORT=3000
|
||||
IP=0.0.0.0 # Listening IPv4 or IPv6.
|
||||
ANNOUNCED_IP=185.8.154.190 # Announced IPv4 or IPv6 (useful when running mediasoup behind NAT with private IP).
|
||||
RTC_MIN_PORT=2000
|
||||
RTC_MAX_PORT=2020
|
||||
ANNOUNCED_IP=192.168.1.199 # Announced IPv4 or IPv6 (useful when running mediasoup behind NAT with private IP).
|
||||
RTC_MIN_PORT=40000
|
||||
RTC_MAX_PORT=49999
|
||||
SERVER_CERT="./server/ssl/cert.pem"
|
||||
SERVER_KEY="./server/ssl/key.pem"
|
||||
ENABLE_UDP=true
|
||||
ENABLE_TCP=true
|
||||
PREFER_UDP=true
|
||||
PREFER_TCP=false
|
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,2 +1,3 @@
|
||||
/node_modules
|
||||
/dist
|
||||
.idea
|
@ -5,7 +5,7 @@ WORKDIR /app
|
||||
RUN apt-get update && \
|
||||
apt-get install -y build-essential pip net-tools iputils-ping iproute2 curl
|
||||
|
||||
RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash -
|
||||
RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
|
||||
RUN apt-get install -y nodejs
|
||||
|
||||
COPY . /app/
|
||||
|
44
README.md
44
README.md
@ -6,36 +6,54 @@
|
||||
1. Go to `/server/ssl`
|
||||
2. Execute `openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout key.pem -out cert.pem`
|
||||
|
||||
|
||||
### Development
|
||||
|
||||
##### To start in development mode you must:
|
||||
1. Install the dependencies `npm install`.
|
||||
2. Run the `npm start:dev` command to start the server in dev mode.
|
||||
(Any change will trigger a refresh of the server)
|
||||
|
||||
1. Install the dependencies `npm install`.
|
||||
|
||||
2. Go to the `linx-devops/scaling-tools/private-system-truste-cert` project and generate a new server certificate and key:
|
||||
|
||||
sh create_certificate_for_domain.sh 192.168.1.110 #local IP
|
||||
# generates files
|
||||
nginx-selfsigned.crt
|
||||
device.key
|
||||
|
||||
3. You need to update the Video Server in the provisioning to point to your private IP. ex: https://192.168.1.199:3000
|
||||
|
||||
4. The generated files must be moved to server/ssl and renamed as follows:
|
||||
|
||||
cp device.key {mediasoup_project}/server/ssl/key.pem
|
||||
cp nginx-selfsigned.crt {mediosup_project}/server/ssl/cert.pem
|
||||
|
||||
5. Go to https://dev.linx.safemobile.com/dispatcher/resources/help/LINXHelp.html#safemobile-certificate-import and import the certificate for your system type
|
||||
|
||||
6. The ANNOUNCED IP in .env must be configured to use the same private IP used in generating the certificate.
|
||||
|
||||
7. Run the `npm start:dev` command to start the server in dev mode.
|
||||
(Any change will trigger a refresh of the server)
|
||||
|
||||
### Production
|
||||
|
||||
##### To start in production mode you must:
|
||||
1. Install the dependencies `npm install`.
|
||||
2. Run the `npm start:prod` command to start the server in production mode.
|
||||
(To connect to the terminal, use `pm2 log video-server`)
|
||||
(To connect to the terminal, use `pm2 log video-server`)
|
||||
|
||||
|
||||
### Web client
|
||||
|
||||
- The server will start by default on port 3000, and the ssl certificates will have to be configured
|
||||
- The web client can be accessed using the /sfu path
|
||||
ex: https://HOST/sfu/?assetId=1&&accountId=1&producer=true&dest_asset_id=75&assetName=Adi
|
||||
assetId = asset id of the unit on which you are doing the test
|
||||
accountId = account id of the unit on which you are doing the test
|
||||
producer = it will always be true because you are the producer
|
||||
(it's possible to put false, but then you have to have another client with producer true)
|
||||
assetName = asset name of the unit on which you are doing the test
|
||||
dest_asset_id= the addressee with whom the call is made
|
||||
ex: https://HOST/sfu/?assetId=1&&accountId=1&producer=true&dest_asset_id=75&assetName=Adi
|
||||
assetId = asset id of the unit on which you are doing the test
|
||||
accountId = account id of the unit on which you are doing the test
|
||||
producer = it will always be true because you are the producer
|
||||
(it's possible to put false, but then you have to have another client with producer true)
|
||||
assetName = asset name of the unit on which you are doing the test
|
||||
dest_asset_id= the addressee with whom the call is made
|
||||
- To make a call using this client, you need a microphone and permission to use it
|
||||
- For any changes related to the client, the command `npm run watch' will have to be used to generate the bundle.js used by the web client
|
||||
|
||||
### Demo project
|
||||
The demo project used initially and then modified for our needs `https://github.com/jamalag/mediasoup2`
|
||||
The demo project used initially and then modified for our needs `https://github.com/jamalag/mediasoup2`
|
40
app.js
40
app.js
@ -12,6 +12,11 @@ try {
|
||||
console.log('https support is disabled!');
|
||||
}
|
||||
const mediasoup = require('mediasoup');
|
||||
const isUdpEnabled = process.env.ENABLE_UDP === 'true';
|
||||
const isTcpEnabled = process.env.ENABLE_TCP === 'true';
|
||||
const isUdpPreferred = process.env.PREFER_UDP === 'true';
|
||||
const isTcpPreferred = process.env.PREFER_TCP === 'true';
|
||||
let currentConnectionType = isUdpPreferred ? 'udp' : 'tcp';
|
||||
|
||||
let worker;
|
||||
/**
|
||||
@ -537,6 +542,15 @@ const isInitiator = (callId, socketId) => {
|
||||
return videoCalls[callId]?.initiatorSocket?.id === socketId;
|
||||
};
|
||||
|
||||
const emitToParticipants = (callId, event, message) => {
|
||||
try {
|
||||
videoCalls[callId].receiverSocket.emit(event, message);
|
||||
videoCalls[callId].initiatorSocket.emit(event, message);
|
||||
} catch (error) {
|
||||
console.error(`[emitToParticipants] | ERROR | callId: ${callId} | error: ${error.message}`);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
- Called from at event 'createWebRtcTransport' and assigned to the consumer or producer transport
|
||||
- It will return parameters, these are required for the client to create the RecvTransport
|
||||
@ -555,14 +569,34 @@ const createWebRtcTransportLayer = async (callId, callback) => {
|
||||
announcedIp: process.env.ANNOUNCED_IP, // Announced IPv4 or IPv6 (useful when running mediasoup behind NAT with private IP).
|
||||
},
|
||||
],
|
||||
enableUdp: true,
|
||||
enableTcp: true,
|
||||
preferUdp: true,
|
||||
enableUdp: isUdpEnabled,
|
||||
enableTcp: isTcpEnabled,
|
||||
preferUdp: isUdpPreferred,
|
||||
preferTcp: isTcpPreferred,
|
||||
iceConsentTimeout: 3
|
||||
};
|
||||
|
||||
// https://mediasoup.org/documentation/v3/mediasoup/api/#router-createWebRtcTransport
|
||||
let transport = await videoCalls[callId].router.createWebRtcTransport(webRtcTransport_options);
|
||||
|
||||
// `iceselectedtuplechange`: Fires when ICE switches transport (e.g., UDP → TCP).
|
||||
transport.on('iceselectedtuplechange', (selectedTuple) => {
|
||||
const { protocol } = selectedTuple;
|
||||
if (currentConnectionType !== protocol) {
|
||||
console.warn(`⚠️ ${currentConnectionType.toUpperCase()} blocked! Switching to ${protocol.toUpperCase()} for callId: ${callId}`);
|
||||
currentConnectionType = protocol;
|
||||
}
|
||||
});
|
||||
|
||||
// `icestatechange`: Fires when ICE connection state changes (e.g., new, connected, failed).
|
||||
transport.on('icestatechange', (iceState) => {
|
||||
console.log(`[ICE STATE CHANGE] callId: ${callId} | State: ${iceState}`);
|
||||
if (iceState === 'failed' || iceState === 'disconnected') {
|
||||
console.warn(`⚠️ ICE failure detected for callId: ${callId}! Possible UDP blockage.`);
|
||||
emitToParticipants(callId, 'connection-failed', { callId });
|
||||
}
|
||||
});
|
||||
|
||||
// Handler for when DTLS(Datagram Transport Layer Security) changes
|
||||
transport.on('dtlsstatechange', (dtlsState) => {
|
||||
console.log(`transport | dtlsstatechange | calldId ${callId} | dtlsState ${dtlsState}`);
|
||||
|
4
build.sh
4
build.sh
@ -51,11 +51,11 @@ if [ -d "node_modules" ]; then
|
||||
fi
|
||||
|
||||
# Install dependencies
|
||||
#npm install
|
||||
npm install
|
||||
|
||||
## PROJECT NEEDS
|
||||
echo "Building app... from $(git rev-parse --abbrev-ref HEAD)"
|
||||
#npm run-script build
|
||||
npm run-script build
|
||||
cp -r {.env,app.js,package.json,server,public,doc,Dockerfile} dist/
|
||||
#cp -r ./* dist/
|
||||
|
||||
|
BIN
doc/[video] Client-Dispatcher Workflow.png
Normal file
BIN
doc/[video] Client-Dispatcher Workflow.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 968 KiB |
BIN
doc/[video] Video - Connection error.png
Normal file
BIN
doc/[video] Video - Connection error.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 215 KiB |
1150
package-lock.json
generated
1150
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -16,7 +16,7 @@
|
||||
"@types/express": "^4.17.13",
|
||||
"dotenv": "^16.0.1",
|
||||
"express": "^4.18.1",
|
||||
"mediasoup": "^3.10.4",
|
||||
"mediasoup": "^3.15.5",
|
||||
"mediasoup-client": "^3.6.54",
|
||||
"parcel": "^2.7.0",
|
||||
"socket.io": "^2.0.3",
|
||||
|
22
server/ssl/cert-old.pem
Normal file
22
server/ssl/cert-old.pem
Normal file
@ -0,0 +1,22 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDrzCCApegAwIBAgIUfpwrZVz3ogv3YeXbtL5wqIGEXGMwDQYJKoZIhvcNAQEL
|
||||
BQAwZzELMAkGA1UEBhMCUk8xDTALBgNVBAgMBEFsYmExDTALBgNVBAcMBEFsYmEx
|
||||
DDAKBgNVBAoMA0FBQTEQMA4GA1UEAwwHQUFBIENPTTEaMBgGCSqGSIb3DQEJARYL
|
||||
YXNkQGFzZC5jb20wHhcNMjUwMjE4MTAwMDM5WhcNMzUwMjE2MTAwMDM5WjBnMQsw
|
||||
CQYDVQQGEwJSTzENMAsGA1UECAwEQWxiYTENMAsGA1UEBwwEQWxiYTEMMAoGA1UE
|
||||
CgwDQUFBMRAwDgYDVQQDDAdBQUEgQ09NMRowGAYJKoZIhvcNAQkBFgthc2RAYXNk
|
||||
LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL7itjfKeuH5+f7c
|
||||
43gAI+ppmxiwvzqhHLmkmlQrVbSC+P93yGekHIuXpbM3sqGRnvSJL3c9SIEdtVVj
|
||||
yfJCs6KIsujxtiGn3hgQD01B6LqzFjSKnfYSGz8XDsjFW8cnpD1yRi3J7DhUjleM
|
||||
bhQ0ileu9joS2OOhf84mtOkXJyY8q9xJH4ypimogcR98eM6ewnrb5Vhjo8YDaix2
|
||||
6rceNmO/g4biknhXnBGc58/MnyAHtwzZxsu/k1IYtZuBYMPcAo7CQEX4XxXqQpaF
|
||||
zaaoEUYB8KzVDlsr+i5SJzLtrHkyiuJijHq6YyOFkTwUULuJ7Wz0YL1redDCZV4i
|
||||
EIVzBAcCAwEAAaNTMFEwHQYDVR0OBBYEFErSYY3J7ukx2KaRcHmazbMlKNBlMB8G
|
||||
A1UdIwQYMBaAFErSYY3J7ukx2KaRcHmazbMlKNBlMA8GA1UdEwEB/wQFMAMBAf8w
|
||||
DQYJKoZIhvcNAQELBQADggEBAC3TQY6jMGeHIEDEYS7sUbNZxe+azdDlx0DdwgLK
|
||||
t+Zo2O40F55nVTZOUfypjCnLJnZitekptl5P6CPGrp2VX4/C0Ok4swwr+xamsjWt
|
||||
9RR9yG0IpVfnCEziT4dpBPhNf/6ilgdpnkJUWY3LO3BJhM4Js7rfP4D9NgEYHeSR
|
||||
YDN3TuEbi//bp43bhDh8EBQtDx9lPGOSUiKd3I7KfRttsxvLG2wBz3M5HXRc++6p
|
||||
pHE+64YfkwV5xZDvU2M/EqePLp7DdQ9g+vQ68FxI6jMCegBoz+ueyE9RhZOk/cUh
|
||||
uIXwIdFowjkUXgNncuGrR1gWf1mJVCHOsdnGZf3VSykGdWg=
|
||||
-----END CERTIFICATE-----
|
@ -1,25 +1,24 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIEJTCCAw2gAwIBAgIURHg2am+RarQxIVY1f3CicUQgRowwDQYJKoZIhvcNAQEL
|
||||
BQAwgaExCzAJBgNVBAYTAlJPMRIwEAYDVQQIDAlCdWNoYXJlc3QxEjAQBgNVBAcM
|
||||
CUJ1Y2hhcmVzdDETMBEGA1UECgwKU2FmZW1vYmlsZTETMBEGA1UECwwKU2FmZW1v
|
||||
YmlsZTETMBEGA1UEAwwKU2FmZW1vYmlsZTErMCkGCSqGSIb3DQEJARYcbWloYWku
|
||||
Ym96aWVydUBzYWZlbW9iaWxlLmNvbTAeFw0yMjA4MDEyMjA0MjFaFw0zMjA3Mjky
|
||||
MjA0MjFaMIGhMQswCQYDVQQGEwJSTzESMBAGA1UECAwJQnVjaGFyZXN0MRIwEAYD
|
||||
VQQHDAlCdWNoYXJlc3QxEzARBgNVBAoMClNhZmVtb2JpbGUxEzARBgNVBAsMClNh
|
||||
ZmVtb2JpbGUxEzARBgNVBAMMClNhZmVtb2JpbGUxKzApBgkqhkiG9w0BCQEWHG1p
|
||||
aGFpLmJvemllcnVAc2FmZW1vYmlsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IB
|
||||
DwAwggEKAoIBAQCSEk80aBAbmWtPBLcTjFLbvVmxuzDgzrjH7h2Hg/ly8lE/o2nZ
|
||||
1T2ESSuaQFsxw54ukqbj1ooQXF1DoIxSp+CiNzf/FTB6BaMkaG0ayE2Wnm2wkjKp
|
||||
POnAzZgTabJoB/qeUlr9i4xiAyBhiQDk5KjdWYHxeZnSznqfIOPzAdw7ZJVYvqvT
|
||||
GciHnoina5TzPUbpnLcR2LvHcLxuSuWQ6dTz/sfdZRx8lkbR3qltUazmJX+yxJJr
|
||||
kagq2V3cfpfLM8DOzPPEzuKHM6sK6ZgTqbc4ti+ul7Q1V+e0v2xNDtuYHkbaOuyd
|
||||
ucmaZ3R++0ryoWWan5OFWZIKjttKy/yq8MUrAgMBAAGjUzBRMB0GA1UdDgQWBBSM
|
||||
nlDraef71C/filHpA7dDpwmB7zAfBgNVHSMEGDAWgBSMnlDraef71C/filHpA7dD
|
||||
pwmB7zAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBNySms9mXG
|
||||
PVOmFAm9YjMjRY+cUpa0Gm6saxp9VOyrAg2KzdwG6LNGgauNsIra1ytM40NASspN
|
||||
r+L49gUCmASUGOqeZCpJjkKAsGspQ4WQKKI6YW8h5dsSuud2qyQtm+w1RKDq+wih
|
||||
A+B82xWXcFFd52gp6nerib4Pf9ATooOmBMCHFZwC+74sKCv7fXDlzLGdCII8lmI4
|
||||
uq5eFrSS1NeT3iQCwGb9SHfyFkCliaEdpskqmWhonckN0tJVV118SvknV/h9oIsw
|
||||
uEMIib6YOBlrU+FInnpqpc8VuR4vv0Yro9XrvmurzLuN8k/lVVkr6NMzyNY9mbkF
|
||||
9p/Sxd5yIeam
|
||||
MIID9TCCAt2gAwIBAgIJAJZHglUuIBjtMA0GCSqGSIb3DQEBCwUAMIGZMQswCQYD
|
||||
VQQGEwJVUzERMA8GA1UECAwISWxsaW5vaXMxGDAWBgNVBAcMD1JvbGxpbmcgTWVh
|
||||
ZGl3czEYMBYGA1UECgwPU2FmZW1vYmlsZSBMTEMuMQ0wCwYDVQQLDARMSU5YMQ0w
|
||||
CwYDVQQDDARMSU5YMSUwIwYJKoZIhvcNAQkBFhZzdXBwb3J0QHNhZmVtb2JpbGUu
|
||||
Y29tMB4XDTI1MDIyNDEwMTAzNFoXDTM1MDIyMjEwMTAzNFowXjELMAkGA1UEBhMC
|
||||
VVMxETAPBgNVBAgMCElsbGlub2lzMRgwFgYDVQQHDA9Sb2xsaW5nIE1lYWRpd3Mx
|
||||
EzARBgNVBAoMClNhZmVtb2JpbGUxDTALBgNVBAMMBExJTlgwggEiMA0GCSqGSIb3
|
||||
DQEBAQUAA4IBDwAwggEKAoIBAQDEd8LMvdkD4CyZkwVYh4V/RIBMH8d9jK1Yvozd
|
||||
0kPSGrC+ZXemmF7qHAD5g8RDkg1odkVuZa+jj0KlKHKtReF0p9OB/J6fNavlD7mM
|
||||
UiAtEpEgoKx3VlhrYEtIoFk+EJWaN1WObhYNfPtEw8Ncfww1cyDNmOnsifkLg+yh
|
||||
+aNxXzrR3toRF7pxFehrTpMRxx4LiIN2z4vHCdelvu9yJspzRAWd5QSQ6eGr3OPY
|
||||
yn+9v4XfN0YgnWSbH8aJ24bysIB3vOtsULjOfNJivNcx+/gQ9yP4AFhycperiDcu
|
||||
GGTiw+fwk1y6e04XulQ65mgxGTXNHlnM2ZvDyOwDZqL89Uf3AgMBAAGjejB4MB8G
|
||||
A1UdIwQYMBaAFGQaM9lRXGKKghjag6SPD+uHK3K5MAkGA1UdEwQCMAAwCwYDVR0P
|
||||
BAQDAgTwMB4GA1UdEQQXMBWHBMCoAceCDTE5Mi4xNjguMS4xOTkwHQYDVR0OBBYE
|
||||
FHNfBgu/Ixj2j6yDTiDluw6/i3cEMA0GCSqGSIb3DQEBCwUAA4IBAQAojT+cdzfU
|
||||
sVq/ODttG8wS23Du20W2iNdvlAwkgni0UgxTJQ12odtIH9WZAVS46G++t2so87Ki
|
||||
gp6OK25AWtsQ7oLFK2P6VpaVGH6FwRSODFTly7Wv+7US7NmB/DO215+rG7q7C7Ag
|
||||
J6zrsQgLPR6M6rZRrOs9Hd12oX6zRgEaYnbIc/Z1DVPRmCDiQISE5M8LihIO4sOW
|
||||
gmDacLhM9lbuMvbHEkCNnOuAzdWRmvR06CyBXmu/9iusyWYvgwI6bHFAZRYCOTmB
|
||||
+poHSGAlTmivcbNhHyZjS63NafRU7sSuc0JDzWQAdkA1AclSokfC8dJC6fnKBujY
|
||||
o2WFKJMFrFS3
|
||||
-----END CERTIFICATE-----
|
||||
|
28
server/ssl/key-old.pem
Normal file
28
server/ssl/key-old.pem
Normal file
@ -0,0 +1,28 @@
|
||||
-----BEGIN PRIVATE KEY-----
|
||||
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+4rY3ynrh+fn+
|
||||
3ON4ACPqaZsYsL86oRy5pJpUK1W0gvj/d8hnpByLl6WzN7KhkZ70iS93PUiBHbVV
|
||||
Y8nyQrOiiLLo8bYhp94YEA9NQei6sxY0ip32Ehs/Fw7IxVvHJ6Q9ckYtyew4VI5X
|
||||
jG4UNIpXrvY6EtjjoX/OJrTpFycmPKvcSR+MqYpqIHEffHjOnsJ62+VYY6PGA2os
|
||||
duq3HjZjv4OG4pJ4V5wRnOfPzJ8gB7cM2cbLv5NSGLWbgWDD3AKOwkBF+F8V6kKW
|
||||
hc2mqBFGAfCs1Q5bK/ouUicy7ax5MoriYox6umMjhZE8FFC7ie1s9GC9a3nQwmVe
|
||||
IhCFcwQHAgMBAAECggEAMJWSjGuwUCDoZNqC2PGsMoczjxq5aWpFXejL0P2AoGOv
|
||||
jZJGwz5Nd6ge6BkWkbH3M8VQ+/fwotBVbYjrBwq8HvPNGaYf1bwctqIryt2qJw7a
|
||||
6X+Yid986NdtD2PQIsXvsyYJP7FDuuimnBjlkaX3yi6BhDF026co2OcYJ7WZZM0e
|
||||
nc6JR7wGFZM3Dw3ybFvGrK4k7/Iq2N6wqedzCOvDbLXUC16UtmRVIOuiuNm+THrl
|
||||
BiD37AKwB/LZRcdSQ1HeiWlK42Zc+IikHPJhl0PACcJNFNB3u2rdP8maSu5aMLku
|
||||
yHnKCz6w9C1vDKrI/iszW2QCky+mGBD9WKK2u6hxFQKBgQDtcfL8hMKj6Ki/dsqR
|
||||
McGPs1rLgZFAH9axubUth0uLdsEQDZtkoJIzXt8RLS3exuHMKt+Ln6YAOEhKm8Cl
|
||||
OqIg0E/8SNi7QryU9yfqFqcE2QBZL0QVtvYZeUuiHIOrpc0bmTdNvp8i7zWw/oz6
|
||||
ymeJ6vpEWKDpOvUnfm79XJbh+wKBgQDNzVjUNfo5s6QNnZlJvwI3J2mAsfLMVQxp
|
||||
++P41f+dUCoAsEPujxASthdDxRND9oIfsTodA+VkrlLhs1JyTe4PlPcfSl7D5QSV
|
||||
ayXVHF9iLbGM8fWMf6zBTebdaw9GqY3KTOHBH+X+JOHPP9dI6a4l7Ok8tFE9ia8M
|
||||
G8Ce7djUZQKBgDSfGDaWRXyFx0AHV4Ut/bOXD/whzsrjQ3VHrrtUTI2v18FzAoke
|
||||
fMgdslngJVZFxSy2I6yRyPwrfPnr4pm7kMqs380NZ9q4Q4rP62yZcJJGdSlOrEwT
|
||||
rB6hHv3iS9vydq4zGmqEYEghs0hyYVQDH0cVaDlVWvPVORdzka1co6OZAoGBAJHl
|
||||
TV/DlExrqZVtcEnzeyKWchimDjYE5PQNeiPhsYBYYC50xvPLv91D8WI9x9aaXs0Q
|
||||
2t3O8URawK74bS5TSL0LIdWw51WAeatjdkKKBqSXOBNvRGAB8vpmu4+kYgP6F2ae
|
||||
8jvy3R06EErYO0qZPrfsJ7y9KAq0HMA8vGTuwJRxAoGBAMfWJLseheDXKUXndnR9
|
||||
ovNA+spTTFECtoLwhWxwgoL3GYVqSA96RfnmdKHY4d5isQ1g/JN05Uo6bL7HKJCG
|
||||
BwS9WCsa6fHhbJR31fP16UQNNknNSwTtUoeJavwarQ7MB5CT9Fz5HsaC4NGaQkve
|
||||
86Barwb6tt4iu4Y8a2bcG/sE
|
||||
-----END PRIVATE KEY-----
|
@ -1,28 +1,28 @@
|
||||
-----BEGIN PRIVATE KEY-----
|
||||
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCSEk80aBAbmWtP
|
||||
BLcTjFLbvVmxuzDgzrjH7h2Hg/ly8lE/o2nZ1T2ESSuaQFsxw54ukqbj1ooQXF1D
|
||||
oIxSp+CiNzf/FTB6BaMkaG0ayE2Wnm2wkjKpPOnAzZgTabJoB/qeUlr9i4xiAyBh
|
||||
iQDk5KjdWYHxeZnSznqfIOPzAdw7ZJVYvqvTGciHnoina5TzPUbpnLcR2LvHcLxu
|
||||
SuWQ6dTz/sfdZRx8lkbR3qltUazmJX+yxJJrkagq2V3cfpfLM8DOzPPEzuKHM6sK
|
||||
6ZgTqbc4ti+ul7Q1V+e0v2xNDtuYHkbaOuyducmaZ3R++0ryoWWan5OFWZIKjttK
|
||||
y/yq8MUrAgMBAAECggEAMRH1iaVrw9nGMsViuy5op2j0uMApq1vGt2NGiD/NjM/a
|
||||
e4ZqCMOZ5tatzyPPfug4O20Io4Fu4BAnRJCqkxnSXKwwI4D6yAMcyx5JiLXBWtfe
|
||||
AXMbkb7kx+BJNjxLsqb7ijQgXQyEHGjwd9OOeVZXZAStonE3O5ohl1N1QC1fzpN5
|
||||
qBFPaAiNhZgaxrB+pp/uRruZXzNGCwLdhpd2HuryJfxkaAD53mqpHwHJbM7wRQl4
|
||||
NJCbFR/lf4sqPO7zWJGyfU8fFVLuNspSW8AdLcsapOUSMhXTEU+vKbdWM+MYRNuk
|
||||
ltJVWG1nPkbyyGQoUNEh4rSFOX+3aiN435qkPw7wAQKBgQDEPFQJe+2DpS+M0zvq
|
||||
sZVVkEDxwGZfHnO0h57C4dsGPyLSX7A1r+EM8ooZhCgrXZFru3EDzFuO5isCIeml
|
||||
bBET5q2qGEozdb+wUfcHOBZZKR4imY0SYi3lyJdxBeNIOPhUkEpOg3uo2RRklpi6
|
||||
Fk4LYXReJ+t36yZyocTn3PfmxwKBgQC+juTHoJGZjqWtVMygUC8kP5G5GXxY9Yk1
|
||||
7j4Iv8ok1c5xWM6N4GBNG9rKKOD7WQX4dD9IOs35pZqGDaNE44q7na9UabRFR92M
|
||||
I+VAsi1Q2gQPyihW84ESXw6uH85pO5FfGO3fF/ppLXBCVYN85VT+1HFxG+Je2GXE
|
||||
50/3e4Q6fQKBgBl/zVu+IsrseBVQjYSdts37hLTlT2gkyNw4k0S3nIJfSeMUVA1l
|
||||
4VSRX6iZJ68a5X6eSL05nNwgxI3uYjIArOdtHjvwFBRDxLjgrbzeaOkFEslkMpSk
|
||||
9VnaivNA1JvZ60rxxPYW18bFDoVTnFzx8QpBi6GAhnR6tfBHXRLT/9KZAoGAStHI
|
||||
OiltgaFko73b6kYRfGYJTWgYTsV5bldwu/ax4+ye9hosX8Btj1kUerO6QnYdxgO+
|
||||
pRmRrie7mE7agD3nRusO4FHwmhMxhcjCRriu2kP/vENfu2Q4lYIFPZD3dpIQ7gnX
|
||||
u/SqOYnBvgndariQus2nDQYpx5unubwoxb8Vl/ECgYAV7nkyMjkakwbFyiAsUMz6
|
||||
QvSxWC+x5OBv79Nm02bgecdwJny/PULA/R/KHNI/WXHSkM2DdeoMv4XZPdI8TNRo
|
||||
bBD217yfRfOMIX2jIhZeTtTAIiOafBdIG0fUtM9nMPkgQGTvgM0FZPdfAtNY/nFu
|
||||
xvrhZIQLy0ujoDPPBE8+3Q==
|
||||
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDEd8LMvdkD4CyZ
|
||||
kwVYh4V/RIBMH8d9jK1Yvozd0kPSGrC+ZXemmF7qHAD5g8RDkg1odkVuZa+jj0Kl
|
||||
KHKtReF0p9OB/J6fNavlD7mMUiAtEpEgoKx3VlhrYEtIoFk+EJWaN1WObhYNfPtE
|
||||
w8Ncfww1cyDNmOnsifkLg+yh+aNxXzrR3toRF7pxFehrTpMRxx4LiIN2z4vHCdel
|
||||
vu9yJspzRAWd5QSQ6eGr3OPYyn+9v4XfN0YgnWSbH8aJ24bysIB3vOtsULjOfNJi
|
||||
vNcx+/gQ9yP4AFhycperiDcuGGTiw+fwk1y6e04XulQ65mgxGTXNHlnM2ZvDyOwD
|
||||
ZqL89Uf3AgMBAAECggEAM0xx+LO5bmGiQ5c31h3MpaZlOXsyw31v5bQbY+/69Wky
|
||||
rQQhccZnQgl916ioHlyMU7JN/r1eVv6ZEDa3era8X5FSkKY9ZKTG9VBdyl3HOP2Y
|
||||
F0Tcw2wwOhkyjwwPQT1jUpkQJdhouazgjtvursAdl/cvoX9D1RdRh8gyiTh9jKQz
|
||||
Afnbwe/KOje9xsEqJRDXra8erpwBV/7TKlLqvSiGExZqGx9X5pNzU02vfl7L3WTi
|
||||
2f48Ad2P3rSGv5XcOCtGvDGRHtSLWknUCyb0a1qy2aFF1bJo9wVFNAPFD4zrukhA
|
||||
/WaxkS3p/Fai8f+YdHPV9sgZO+2qrjMXNvmh1+V8gQKBgQD7HPbDDk9UQ9XUwAKu
|
||||
o4Np2G6CddR1wxdE2qDDG3Ej5LBxi5OdwVdywim5Cgf/TAySIiNi5qeRSKJi5Sbg
|
||||
/jt0x6v3R/0c14kRXsd09RtcqvRL09jI2eZl+uAINAqtKXsGsSCQXwkiO/MQ0Klc
|
||||
gm2eMKK0VUENQ0qTzhvjFoJtnwKBgQDISo5cuo+6Kd6n26ny8FBwXKY0vY9AzUAU
|
||||
gvpupDb6hQ3vfFWqORTbuPlg9oUSRh+eqVBbYr+VYfuSf0u/9JWdlpHFlGJMJ3cw
|
||||
mraOmvXv8u9YGMf0d2wOXVf6/C2frfmZ89BntNs0cSHflzNvMn7qJxqVfTzIAtxV
|
||||
bLEva8jWqQKBgBtpU/6C52H5bbQlqaVKsCOzvox7NFAOldGsU/Q4YKdcZW5foCOO
|
||||
YW9jho5ua+UQdibVlytKpmwTk7Zb8VyKJA9hZII/1394f7vnrrozr2L0Pmqwm2+B
|
||||
acckFaSPmcLBTm6yky1vUl3sUWI6hOJWUoT8JiatT8aU2+U6kIy/fkldAoGBALyx
|
||||
cLlvkWSDeZ6OVefn+wBAaN0bENCuDYbFdoWx85HEtEJA0rvRlxMBiv+MgAWdRsDF
|
||||
Jk1SFMf5TXbQsl6fYCzc42xOxOSV8bY6q25iEv0B0/cdMZPgxk4qJm7wEVN0Jcii
|
||||
aF6rhjA7vPvWiMBjxCl4uZTILfEIsOdRxQO1+boxAoGACrkNBikkV8mSsBSEkfDQ
|
||||
KAqGCl9zt6hI6cxQ9mSD60JJADXifBDLqMVcNDbTo+leHVAooLxI00kziAz9tfml
|
||||
bDdr3OCLeOMqwWAZervH+rx3gvWqq7cdfMLlmyLwljZEloGjd1gnA4ekNnYwS+c9
|
||||
P4Hmmp4712UC4HkhQLSJ6HU=
|
||||
-----END PRIVATE KEY-----
|
||||
|
Loading…
x
Reference in New Issue
Block a user