Commit b53719cf authored by gregor herrmann's avatar gregor herrmann

New upstream version 0.818

parents 511b3cbf cb2abe0a
Revision history for Net::SIP
0.818 2018-11-10
- fixed wrong skip size in t/22_stateless_proxy_ack_on_error.t in case specific
features like IPv6 or TLS where not available
0.817 2018-11-07
- recreate test certificates so that they work with restrictions in openssl 1.1.1
0.816 2018-11-07
- StatelessProxy: make sure ACK to error passes through proxy if NAT is used
- Simple::RTP: add payload type to write callback
- Simple::RTP: don't die() if RTP send fails, just ignore the problem
0.815 2018-06-15
- StatelessProxy: make sure that idfrom/idto in NAT helper are based on
normalized URL, so that different writing (with comment, with <..>..) do
......
......@@ -84,6 +84,7 @@ t/18_register_with_auth_step_by_step.t
t/19_call_with_dtmf.t
t/20_channel_on_hold.t
t/21_channel_on_hold_stateless_proxy.t
t/22_stateless_proxy_ack_on_error.t
t/certs/caller.sip.test.pem
t/certs/listen.sip.test.pem
t/certs/proxy.sip.test.pem
......
......@@ -4,7 +4,7 @@
"unknown"
],
"dynamic_config" : 1,
"generated_by" : "ExtUtils::MakeMaker version 7.0401, CPAN::Meta::Converter version 2.150001",
"generated_by" : "ExtUtils::MakeMaker version 7.24, CPAN::Meta::Converter version 2.150010",
"license" : [
"perl_5"
],
......@@ -49,5 +49,6 @@
"url" : "https://github.com/noxxi/p5-net-sip"
}
},
"version" : "0.815"
"version" : "0.818",
"x_serialization_backend" : "JSON::PP version 2.27400_02"
}
......@@ -7,7 +7,7 @@ build_requires:
configure_requires:
ExtUtils::MakeMaker: '0'
dynamic_config: 1
generated_by: 'ExtUtils::MakeMaker version 7.0401, CPAN::Meta::Converter version 2.150001'
generated_by: 'ExtUtils::MakeMaker version 7.24, CPAN::Meta::Converter version 2.150010'
license: perl
meta-spec:
url: http://module-build.sourceforge.net/META-spec-v1.4.html
......@@ -24,4 +24,5 @@ resources:
homepage: https://github.com/noxxi/p5-net-sip
license: http://dev.perl.org/licenses/
repository: https://github.com/noxxi/p5-net-sip
version: '0.815'
version: '0.818'
x_serialization_backend: 'CPAN::Meta::YAML version 0.018'
......@@ -3,7 +3,7 @@ use warnings;
use 5.010;
package Net::SIP;
our $VERSION = '0.815';
our $VERSION = '0.818';
# this includes nearly everything else
use Net::SIP::Simple ();
......
......@@ -541,13 +541,13 @@ sub receive {
$param->{leg} ||= $leg;
$self->_setup_local_rtp_socks;
invoke_callback($param->{cb_invite},$self,$packet);
my $resp = invoke_callback($param->{cb_invite},$self,$packet);
# send 200 OK with sdp body
my $response = $packet->create_response(
'200','OK',{},$param->{sdp} );
DEBUG( 100,'created response '.$response->as_string );
$self->{endpoint}->new_response( $ctx,$response,$leg,$from );
# by default send 200 OK with sdp body
$resp = $packet->create_response('200','OK',{},$param->{sdp})
if ! $resp || ! UNIVERSAL::isa($resp,'Net::SIP::Packet');
DEBUG( 100,'created response '.$resp->as_string );
$self->{endpoint}->new_response( $ctx,$resp,$leg,$from );
} elsif ( $method eq 'ACK' ) {
$self->rtp_cleanup; # close last RTP session
......
......@@ -163,7 +163,9 @@ Callback usable by B<invoke_callback> in L<Net::SIP::Util> which will be
invoked, when it received an INVITE request
Callback will be invoked with C<< ( SELF, REQUEST ) >> where REQUEST
is the L<Net::SIP::Request> packet for the INVITE.
is the L<Net::SIP::Request> packet for the INVITE. If it returns a
Net::SIP::Packet this will be used as response, otherwise a default response
with code 200 will be created.
=item cb_dtmf
......
......@@ -287,7 +287,7 @@ sub _receive_rtp {
if ( ref($writeto)) {
# callback
invoke_callback($writeto,$payload,$seq,$tstamp,$channel);
invoke_callback($writeto,$payload,$seq,$tstamp,$channel,$mpt & 0x7f);
} elsif ( $writeto ) {
# save into file
my $fd = $targs->{fdr};
......@@ -405,7 +405,7 @@ sub _send_rtp {
0x1234, # source ID
);
DEBUG( 100,"send %d bytes to RTP", length($buf));
send( $sock,$header.$buf,0,$addr ) || die $!;
send( $sock,$header.$buf,0,$addr );
}
###########################################################################
......
......@@ -9,7 +9,7 @@ use strict;
use warnings;
package Net::SIP::StatelessProxy;
use fields qw( dispatcher rewrite_contact nathelper force_rewrite );
use fields qw( dispatcher rewrite_contact nathelper force_rewrite respcode );
use Net::SIP::Util ':all';
use Digest::MD5 qw(md5);
......@@ -50,6 +50,7 @@ sub new {
};
$self->{nathelper} = delete $args{nathelper};
$self->{force_rewrite} = delete $args{force_rewrite};
$self->{respcode} = [ {},{} ];
return $self;
}
......@@ -641,6 +642,11 @@ sub do_nat {
: ( undef,$packet )
;
my $method = $request ? $request->method : '';
my $track_resp_code;
if ($response and $response->method eq 'INVITE') {
my $code = $response->code;
$track_resp_code = $code if $code>=400;
}
# NAT for anything with SDP body
# activation and close of session will be done on ACK|CANCEL|BYE
......@@ -649,7 +655,7 @@ sub do_nat {
or $method eq 'CANCEL'
or $method eq 'BYE' ) {
DEBUG( 100, "no NAT because no SDP body and method is $method" );
return;
return if ! $track_resp_code;
}
......@@ -693,6 +699,18 @@ sub do_nat {
or return [ 0,'no CSEQ in packet' ];
my $callid = $packet->callid;
if ($track_resp_code) {
my $rc = $self->{respcode}[0];
if (keys(%$rc)>5000) {
# expire entries
$self->{respcode}[1] = $rc;
$rc = $self->{respcode}[0] = {};
}
$rc->{$callid,$cseq,$idfrom,$idto} = $track_resp_code;
# no NAT to do, we just needed to track the response code
return;
}
# CANCEL|BYE will be handled first to close session
# no NAT will be done, even if the packet contains SDP (which makes no sense)
if ( $method eq 'CANCEL' ) {
......@@ -729,8 +747,16 @@ sub do_nat {
if ( ! $nathelper->activate_session( $callid,$cseq,$idfrom,$idto ) ) {
if ( $method eq 'ACK' ) {
DEBUG( 50,"session $callid|$cseq $idfrom -> $idto still incomplete in ACK" );
return [ 0,'incomplete session in ACK' ]
my $code = $self->{respcode}[0]{$callid,$cseq,$idfrom,$idto}
|| $self->{respcode}[1]{$callid,$cseq,$idfrom,$idto}
|| -1;
if ($code < 400) {
DEBUG( 50,"session $callid|$cseq $idfrom -> $idto still incomplete in ACK" );
return [ 0,'incomplete session in ACK' ]
} else {
# ignore problem, ACK to response with error code
DEBUG( 100, "session $callid|$cseq $idfrom -> ACK to failure response" );
}
} else {
# ignore problem, session not yet complete
DEBUG( 100, "session $callid|$cseq $idfrom -> $idto not yet complete" );
......
......@@ -30,7 +30,7 @@ for my $t (@tests) {
my ($transport,$family,$nat) = @$t;
SKIP: {
if (my $err = test_use_config($family,$transport)) {
skip $err,20;
skip $err,$testsize;
next;
}
note("------- test with family $family transport $transport $nat");
......
#!/usr/bin/perl
# make sure that ACK to error response gets passed through proxy
use strict;
use warnings;
use Test::More;
do './testlib.pl' || do './t/testlib.pl' || die "no testlib";
use Net::SIP ':all';
use Net::SIP::NATHelper::Local;
use Net::SIP::NATHelper::Server;
use Net::SIP::NATHelper::Client;
use Net::SIP::Blocker;
my @tests;
for my $transport (qw(udp tcp tls)) {
for my $family (qw(ip4 ip6)) {
for my $nat ('no-nat', 'inline-nat', 'remote-nat') {
push @tests, [ $transport, $family, $nat ];
}
}
}
#@tests = ['udp','ip4','no-nat'];
my $testsize = 19;
plan tests => $testsize*@tests;
for my $t (@tests) {
my ($transport,$family,$nat) = @$t;
SKIP: {
if (my $err = test_use_config($family,$transport)) {
skip $err,$testsize;
next;
}
note("------- test with family $family transport $transport $nat");
do_test($transport,$nat)
}
}
killall();
sub do_test {
my ($transport,$natspec) = @_;
my ($luac,$luas,@lproxy);
for (
[ 'caller.sip.test', \$luac ],
[ 'listen.sip.test', \$luas ],
[ 'proxy.sip.test', \$lproxy[0] ],
[ 'proxy.sip.test', \$lproxy[1] ],
) {
my ($name,$config) = @$_;
my ($sock,$addr) = create_socket($transport);
$$config = {
name => $name,
sock => $sock,
addr => $addr,
uri => test_sip_uri($addr),
};
}
note( "UAS on $luas->{addr} " );
note( "UAC on $luac->{addr} " );
note( "PROXY on $lproxy[0]{addr} $lproxy[1]{addr} " );
# restrict legs of proxy so that packets gets routed even
# if all is on the same interface. Enable dumping on
# incoing and outgoing packets to check NAT
for ( $luac,$luas,$lproxy[0],$lproxy[1] ) {
$_->{leg} = TestLeg->new(
sock => $_->{sock},
dump_incoming => [ \&sip_dump_media,'I<' ],
dump_outgoing => [ \&sip_dump_media,'O>' ],
$_ == $lproxy[0] ? ( can_deliver_to => $luac->{addr} ) :(),
$_ == $lproxy[1] ? ( can_deliver_to => $luas->{addr} ) :(),
test_leg_args($_->{name}),
);
}
# socket for nathelper server
my ($nath_sock,$nath_addr) = create_socket('tcp') or die $!;
my $natcb;
if ( $natspec eq 'inline-nat' ) {
$natcb = sub { NATHelper_Local->new( shift ) };
ok(1,'no fork nathelper');
} elsif ( $natspec eq 'remote-nat' ) {
fork_sub( 'nathelper',$nath_sock );
$natcb = sub { NATHelper_Client->new( $nath_addr ) }
} else {
ok(1,'no fork nathelper');
}
# start proxy and UAS and wait until they are ready
my $proxy = fork_sub( 'proxy', @lproxy,$luas->{uri},$natcb );
my $uas = fork_sub( 'uas', $luas );
fd_grep_ok( 'ready',10,$proxy ) || die;
fd_grep_ok( 'ready',10,$uas ) || die;
# UAC: invite
my $uac = fork_sub( 'uac', $luac, $lproxy[0]{uri} );
fd_grep_ok( 'ready',10,$uac ) || die;
fd_grep_ok( qr{O>.*REQ\(INVITE\) SDP: audio=\S+},5,$uac ) || die;
fd_grep_ok( qr{I<.*REQ\(INVITE\) SDP: audio=\S+},5,$proxy ) || die;
fd_grep_ok( qr{O>.*REQ\(INVITE\) SDP: audio=\S+},1,$proxy ) || die;
fd_grep_ok( qr{I<.*REQ\(INVITE\) SDP: audio=\S+},1,$uas ) || die;
# UAS: reject with error 404 - propagate to uac via proxy
fd_grep_ok( qr{O>.*RSP\(INVITE,404\)},5,$uas) || die;
fd_grep_ok( qr{I<.*RSP\(INVITE,404\)},5,$proxy) || die;
fd_grep_ok( qr{O>.*RSP\(INVITE,404\)},1,$proxy) || die;
fd_grep_ok( qr{I<.*RSP\(INVITE,404\)},1,$uac) || die;
# UAC: reply with ACK to error - propagate to uas via proxy
fd_grep_ok( qr{O>.*REQ\(ACK\)},5,$uac ) || die;
fd_grep_ok( qr{I<.*REQ\(ACK\)},5,$proxy ) || die;
fd_grep_ok( qr{O>.*REQ\(ACK\)},1,$proxy ) || die;
fd_grep_ok( qr{I<.*REQ\(ACK\)},1,$uas ) || die;
killall();
}
killall();
#############################################################################
# Proxy
#############################################################################
sub proxy {
my ($lsock_c,$lsock_s,$proxy_uri,$natcb) = @_;
# need loop separately
my $loop = Dispatcher_Eventloop->new;
my $nathelper = invoke_callback( $natcb,$loop );
# create Net::SIP::Simple object
my $proxy = Simple->new(
loop => $loop,
legs => [ $lsock_c->{leg}, $lsock_s->{leg} ],
domain2proxy => { 'example.com' => $proxy_uri },
);
$proxy->create_stateless_proxy(
nathelper => $nathelper
);
print "ready\n";
$proxy->loop;
}
#############################################################################
# UAC
#############################################################################
sub uac {
my ($leg,$proxy_uri) = @_;
my $ua = Simple->new(
from => '<sip:me.uac@example.com>',
leg => $leg->{leg},
outgoing_proxy => $proxy_uri,
);
print "ready\n";
my $done;
my $call = $ua->invite('<sip:you.uas@example.com>',
cb_final => \$done,
) or die;
$ua->loop(10,\$done);
$ua->cleanup;
}
#############################################################################
# UAS
#############################################################################
sub uas {
my ($leg) = @_;
print "UAS created\n";
my $ua = Simple->new(
from => '<sip:me.uas@example.com>',
leg => $leg->{leg},
);
print "ready\n";
$ua->listen(
cb_invite => sub {
my ($self,$request) = @_;
return $request->create_response('404','unknown',{});
}
);
$ua->loop(10);
}
# --------------------------------------------------------------
# NATHelper::Server
# --------------------------------------------------------------
sub nathelper {
my $sock = shift;
NATHelper_Server->new( $sock )->loop;
}
-----BEGIN CERTIFICATE-----
MIIDMTCCAhmgAwIBAgIEEYgGrjANBgkqhkiG9w0BAQsFADASMRAwDgYDVQQDEwdy
b290IENBMB4XDTE2MTEyMTEwMzgxOVoXDTI2MTExOTEwMzgxOVowEjEQMA4GA1UE
AxMHcm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM4MDAPn
6EcCPvK2GWYlAe1EMp9MkoXi2vrvUexmJJfXCkwYstV/I6LT29DVsjxFf9q+z92b
zEiNI6LD5xdHbYOXoMEDV1iPyRLQr4B41zZNa+4Wxg68g+RprSpnUXEja/F/Xlu9
Xad9LkNEYlYQiIMxyyL9xBoRzH2YknQn7gEcpyWaUhatAXZs1BOrU5OiD9BF+dCe
bG18LrwqPKV+gWpIAFG4/eKMTY6VmNgqzuU048zlQtT7E4Vf+9EHQkZ2eWQl3LOl
TO4l0wbb1MSzlv0vtT52zrZlw4tLIrWa20NTxQ0RRanMrwSuMK3jOJ3F02edetSG
MD4gSDnjUSrItjkCAwEAAaOBjjCBizAdBgNVHQ4EFgQUR3Gyzq4S5lBHiMaJsB2S
5H8G+gMwHwYDVR0jBBgwFoAUR3Gyzq4S5lBHiMaJsB2S5H8G+gMwFQYDVR0jBA4w
DKEEpAIwAIIEEYgGrjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIChDAR
BglghkgBhvhCAQEEBAMCAAcwDQYJKoZIhvcNAQELBQADggEBADQn/xbSz9HslaM7
aDUzyqfUettn0zNBKi3aAdxR8icMZawhO+ZI9oqPQCWfnXr7/QkS+dYtf6byi2D8
BGnQ7yLcHi8vDcMtuxBDjlIRVvMN1RJxedn9vFaiCRCB0jOGH/H6g4kwv5oVDTu8
maGupMnkyym1t0qQO/1YblsgtbrYTe/o6EY6QixBc2/zIKL61Q7P66HfJ1qiv6Yt
/p+p967HlHM+79P9KnarMlDMJ7C+kM4AVttKTDYh2OkrhVGzxGuloQf+fL1SG5Rq
fUS07wJIEnD0k0rAzBLHEf4+chWFi9UqymczujFXmT90K54cSu3biIAiv6SSlM8D
ZbZ79Vg=
MIIFGTCCAwGgAwIBAgIFAPP/9L0wDQYJKoZIhvcNAQELBQAwEjEQMA4GA1UEAwwH
cm9vdCBDQTAeFw0xODExMDcyMjMxMzRaFw0yODExMDQyMjMxMzRaMBIxEDAOBgNV
BAMMB3Jvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDq8kJ4
gNSpXs/OnF5RKfYrzaMwBDpSGco6driHo0kQw0XGe7osf8hGlpOjVH55O2y4qLlQ
ezuSQQqCnXRy+ZA5Je4JORQNjyznUhzSV0k0uZktqIZsK6smzMoxRHfLptyAaTXT
9X3InXAibfLP5yLAqvQuQ3GAnx5fZGBZZgkmBS2FbgxOrM254+AL35kRRedwP0dT
rxmLXMFWlueMchcgA2faFmoT3fUNkTWfYVDQWtG7WzMLJ2Ki+keoFJ3sivsMacNb
m2LMasg8Vcnj7wXun1DJDhjouy1ATE3ERCmrdTqeCMLD9zM+N29LjXiIwrEORso/
5RTLGMWHrsxQLbwwOmiq6SI4CqDMWmCV7X68SyJNEDdZ3uHjq8FAQdhoK/BrM5rx
te7RAhQ8/Kj7AE1CjpaTrv80pRmjJBAIfEP7r1L+Xi/0EvSYzvEdXIKmPcsaQnBq
8DCdZ8u0ZZuArZB4SFFaDnVdHR11tJOkcjXpyp1PKpeEp5HFfhgxSP3P5/JGRLbP
/OjCA5HbRcWUItNLI1hcqCAD15CtXATm14TX6866Rgmdn/G2Jb0G0X/X/tka1ukV
We6hHpjw9aX0HupJMBbrLBbE8V5HuX8KHqvQIcuGW9USIqaYZkAXAh9ipUDW6hvL
StPcjn9hTveKVriM7u/617K3fNsjW9wEhvG9sQIDAQABo3YwdDAdBgNVHQ4EFgQU
BJ9HDSzl2Vw6lH+DgmpcWGWtMVgwHwYDVR0jBBgwFoAUBJ9HDSzl2Vw6lH+Dgmpc
WGWtMVgwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAoQwEQYJYIZIAYb4
QgEBBAQDAgAHMA0GCSqGSIb3DQEBCwUAA4ICAQC1E/3HztkAMYGDS35yBjd4LrdM
zy+92D8DYLi9FYjF3CaReeBeCpCsM+4T57NeAcNbtDAkfCMd90W0OS+9+HAZL9Gp
sTuF2dvcdNyx26brtUzkWRnh7v9UvITlNGBw+dYl3aj6wao6GY14B8p+f1wIqEaK
meRHUA+IpoOm0xk+R4Dj/XFHMN5sV5cMoL8z1Wj1PRYy7AmHB1XJLZAzO6/xfxZM
+jL8ljolDL+h4EzJ+5WXr4QsbmyBp6nQ/AhrOLnZQXEwuS28GkfOsEj6HvEiD5te
LfhA+PXQzbNnJUbfxgA8DUJUM6VfvyXyEHcQ+7vkJXjfwUfY6pFnmOQXYXcp/7W+
xV7ynuNqeLseFry1VjryjQ7NN08HW+DDNbixeFshvZtkYD5M/EezoCHthZwzhHAe
Nc4mELCQzw5Q6AU6d9Kb7WR6RFoH2Kx5tNlCODw+AA5BzPB9bohGhM3/qWzxDfoQ
o0HyjBQb6NJ237z24UoO0YQgoLq2NPzNbOQSaE8+TJ7JNxvIfG5n64/+RH1VtvlB
aInGqlnLj4e+O22YnrK5T6i24pMVNnpGCS5tXf/LMqG/X1znI9JeMLCYGnuhe9GO
FwwtZpLlEaA9Vpm6ck78MTQM+L7qAdCmVZfFl8vPaimtneFwEWyTlNGowJSNteWB
C7NzSmQ0X352sp8UGA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDYTCCAkmgAwIBAgIFAJTh/+swDQYJKoZIhvcNAQELBQAwEjEQMA4GA1UEAxMH
cm9vdCBDQTAeFw0xNjExMjExMDM4MTlaFw0yNjExMTkxMDM4MTlaMBoxGDAWBgNV
BAMTD2NhbGxlci5zaXAudGVzdDCCAR4wDQYJKoZIhvcNAQEBBQADggELADCCAQYC
gf4Mt9HS/rx2DBm0NsliH3fpg8Pu6pEJTbvES/k9LDb/muBztbS1CJM5sDto3yv2
kYEw2vcmSGsjGChHve8DR7M8QVxgiLUP94FOimhsszV3LlOv24RPqM36DA6vwLy6
94S9xeTpYfA7VCN1i3LZF778EvOf7NvRsLnROsCDhqSwR4c0zAM7mlH1pmeckvap
UbVc2bUBOClc1GD+iGAUR1FoH9kSp5ZTPYmX3GKt7l4UnLzr+T6yhSrdSGP0ngoh
6/MH+TOVhZW3hP7AvyrOEKOT+PxQYOqxN4xoAnV0Fw0uPiMYJQ+sRT4yeo4twe7V
gh511tsds7WrWbo1ORB4/QIDAQABo4G5MIG2MB0GA1UdDgQWBBRjABSDltxl1ODf
e2+gG2/Bznmo+TAfBgNVHSMEGDAWgBRHcbLOrhLmUEeIxomwHZLkfwb6AzAnBgNV
HSMEIDAeoRakFDASMRAwDgYDVQQDEwdyb290IENBggQRiAauMAkGA1UdEwQCMAAw
DgYDVR0PAQH/BAQDAgWgMBEGCWCGSAGG+EIBAQQEAwIGwDAdBgNVHSUEFjAUBggr
BgEFBQcDAgYIKwYBBQUHAwEwDQYJKoZIhvcNAQELBQADggEBAH4DrJfjXLiKTbe2
HYzyKMX65YhzP3CgCbPhbm0KhukIfQlnp6J2y6Ymf0rbJbKkw8CXxZu+FzV9Am53
6+elYwThpCL7QKdvyoPyYbzHNfZuMfAzlV9m27qm9W/VUbiq8E4GHOusRcFq6IBq
K9tplWUpCkCu6kcw+K/GoEsym8wiU6JBDFmsoUS3/vfQzIaj/9mLHeNOgnDTNSZE
23IamKm/g/ffLq/ADkxkbRSRPp/4uVSaX1GBxCKCDbg+kfrE+oL3Ohcnyncaw8w+
iTDsme80iCr1mcWHI+qDhDPUKhih7V6M5eE2liwkpY+l1CwbOQdl9VHzLvxj7CEj
7/QKfsM=
MIIFPjCCAyagAwIBAgIEOafWTjANBgkqhkiG9w0BAQsFADASMRAwDgYDVQQDDAdy
b290IENBMB4XDTE4MTEwNzIyMzEzNFoXDTI4MTEwNDIyMzEzNFowGjEYMBYGA1UE
AwwPY2FsbGVyLnNpcC50ZXN0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC
AgEAyJnUVv5mObB3T2ld2FEIrtgbJEAUbYBCvf1u1QhQRh3PJJ8rIpfJ7GZe9lQ0
JXEyAA0L0Zx20dIdRBQqTBNb5Dc6Kx1ujB1AeIIyej0vnT/Mm61TnnkpWPU4l+92
/ktlH3SBRa/0W3HTH2zoLRPQa6IKA/T1un/7khPILVPriT14ZPFEJEsqU0owOPcE
x+U9PzrXp8kvZUnuN3aPUlb9XoyPyeDyfQyZtmQgbS0iDZF8F74HOIClZsYe43+O
0W7AwaDDXp5Vl5rz5E6RyvkWwEruYbkxHbvHF5kCnO7rK0KSFDFSxblCQCkBc1V2
Hd0ouWD0bJ2QoEF0AIh5Qqk9an+KTsaSMgd/58XwrznsFfAOtCZC8vgU0PkhDxQ1
b8VyeIwAKn4PMbC0bW0TOe1IFUhe2I0JjXuHxli00yJTKeyxb27JRORMo6VFSFnT
gf10iR4pLekoAlMhN5WRJNPrar1WV1eEFLHBefjNmdqUVbaVn5Z4aDsZ7teUxEzw
0FLHhFkGjVzQGD15W7Qd3xCHt4GoNaOfTbh6ocNrgbCgsL1IZapWqIXp9tjKd1rC
o9pcEsa5fd60OpreJeJWcjyLlFBFo81/b3kAo65BCuZJvMVe7LWBhyb5RUpejqRR
zt5EJgPP6Jm/bMm8BnhVik5qxLiBROvt4MhekaKa7/HqDP8CAwEAAaOBkzCBkDAd
BgNVHQ4EFgQU424vV4QcsLYoVFj+Xzb1OeLEAnQwHwYDVR0jBBgwFoAUBJ9HDSzl
2Vw6lH+DgmpcWGWtMVgwDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMCBaAwEQYJ
YIZIAYb4QgEBBAQDAgbAMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATAN
BgkqhkiG9w0BAQsFAAOCAgEAbgCJpQi54Qz63xYeenqUZQam2I8VB+zl32cQCCgG
40Vqdwvd++UOKU6jB9PhUX0O15PT0rFU1Anmd3SFxy0bMT4sJE8KPHIEOHheVAnp
AG+l8w0JcSjsRXr3IwapF9FBRPH+WBrWxulevsgqtn6+jksbRBhxca40CBq2WLLW
Z7WSHd9RjtqGAcorJACe9vS+dFn/aUj8OkqNdMaZUyFS8hYFDx99qzKFXHCbKnq3
e9dx5dF0PVvlHa6473JNmV/1RDrC9S+V2YGZx5prLHW0c/qNnpzKJ1sXXIuxy/Gx
rGxDG9KGhVFa3j32HfLGgMWbrwZTt3bpRfhgYd85iP1AUlgzCLDusGPXfKvmiQy0
Yk2Pbueg/YbrgK8ODr9pVsISSLLe4NgIGcrjn4b8Sqki/znsIFXnaX1/UIFCwdjV
I5Qwr4/rfv0aFyRkYSzWwEvjsF81cw76BQC0SmlH8E6djrCqNocPm8i2Rqm1WJ/D
K7qdmKoOzqxiL6L1fb3p4UCywhgX/b1BuGaUg5CpYW7UIPIjPcVIHTnXhrC8/+fz
N25ouSYIUeHegrbp8myYMEQmluAfpg2XNjeJIstPzja5DJ7rTR41XcPVFgVPEntO
jakz2B07TUHptOYHzeQbULj455afBsoRGthFqO9rH6NDvxQiDBFmF7l+/RdJhJl+
6pY=
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
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
t9P/r1gjFbxEEewBzAoH7JgXRVWQMk4=
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIDYDCCAkigAwIBAgIEdidqnDANBgkqhkiG9w0BAQsFADASMRAwDgYDVQQDEwdy
b290IENBMB4XDTE2MTEyMTEwMzgxOVoXDTI2MTExOTEwMzgxOVowGjEYMBYGA1UE
AxMPbGlzdGVuLnNpcC50ZXN0MIIBHjANBgkqhkiG9w0BAQEFAAOCAQsAMIIBBgKB
/gy30dL+vHYMGbQ2yWIfd+mDw+7qkQlNu8RL+T0sNv+a4HO1tLUIkzmwO2jfK/aR
gTDa9yZIayMYKEe97wNHszxBXGCItQ/3gU6KaGyzNXcuU6/bhE+ozfoMDq/AvLr3
hL3F5Olh8DtUI3WLctkXvvwS85/s29GwudE6wIOGpLBHhzTMAzuaUfWmZ5yS9qlR
tVzZtQE4KVzUYP6IYBRHUWgf2RKnllM9iZfcYq3uXhScvOv5PrKFKt1IY/SeCiHr
8wf5M5WFlbeE/sC/Ks4Qo5P4/FBg6rE3jGgCdXQXDS4+IxglD6xFPjJ6ji3B7tWC
HnXW2x2ztatZujU5EHj9AgMBAAGjgbkwgbYwHQYDVR0OBBYEFGMAFIOW3GXU4N97
b6Abb8HOeaj5MB8GA1UdIwQYMBaAFEdxss6uEuZQR4jGibAdkuR/BvoDMCcGA1Ud
IwQgMB6hFqQUMBIxEDAOBgNVBAMTB3Jvb3QgQ0GCBBGIBq4wCQYDVR0TBAIwADAO
BgNVHQ8BAf8EBAMCBaAwEQYJYIZIAYb4QgEBBAQDAgbAMB0GA1UdJQQWMBQGCCsG
AQUFBwMCBggrBgEFBQcDATANBgkqhkiG9w0BAQsFAAOCAQEAXCSkNvdhkheRkkZz
aezXli9hjp7jabXwwDqNShZEA6P69fm5Da0CpHv8SBVAiaYOO505qZwYcvRkXHZa
Marx6U1ANvm4kVVsrqdnr4Bsmyyv1SZXnKC9ZjzpqBQ0kT/vQ9DwTI+oRtmRO4WH
co7urc99EGCtYGS2x6Yve0O6ewCei0hf5kKRNnSMASXFj5IFqCutbkwCq6bfDmGG
9bYHeLnKYjrH/x+p13ryQ9pfcG48t5QoRouVjWS9V5CVKaPmQ5NfZSVDYtzkTOUP
4B9wncNmBykstoAN9ujDvoOYe4n+mG7Bx7KjwK7Fcu4m92wTpJvMz4Zdu+LdcoGI
nFLvtw==
MIIFPzCCAyegAwIBAgIFANLeb14wDQYJKoZIhvcNAQELBQAwEjEQMA4GA1UEAwwH
cm9vdCBDQTAeFw0xODExMDcyMjMxMzRaFw0yODExMDQyMjMxMzRaMBoxGDAWBgNV
BAMMD2xpc3Rlbi5zaXAudGVzdDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
ggIBALk66DZnY5lXQCBncHbYAJvrqndMiGrz2FroREnAHb4mZVuOmGW5U7Lm5MEZ
uM2nKv8BovWb6ORsgsGkG6ZSS+pP8tpDVkHK8s9Ngl69t0k0L5+JxC5LcImhMUw0
Vcy7ugrzKetRAVDcRK/thjrn8Jl2nCsFFZoqwVYK1dmAVnyoqCY6PrD8O+SK+Otr
6ymhO8YGrN2Qy181lJFXOjiFRvIbHd0CibpyHzOTxgjq55EQ14py8sgWfQomaoaW
NL8iGVUG7MguMH9LQ4tMHuZX0OwjIUpwHOWGH8WpBhh7UteUaOM9bYziQBF3gLbw
xrN10K4Aeh14pGpXhhAbme2xM6wOJxP/3GzdpWsLNB1NEs34dT9OMUNyxD4mx0N9
Ay0hcS/wahfXGdtcaFhVh2c+0jTGdteGJeuUxjrYaMPgd29l+klBD2dcRRcNI9R5
Hyy/MnZNmgShEz5DDTzk5lEBs//jF6WHUFj3qvVI7kHceX3n8EdwA4ZV7Rb+L6VB
NOwNPNedabwq97c3KqPUCGpnk899FVL6N4nDFE5KxFO6YiqSy+u5YhC5bJJ7N1pD
aeqwQXfbx1WC0V3dyShBzPuJWuYP9YF/7ofsaQ1zoelbDDehF8SLJSrwxqnmIF3a
l1a14/cbBsyRRWvozRgEtzAwnsICy2bOPUBdi2y36dhaWbB1AgMBAAGjgZMwgZAw
HQYDVR0OBBYEFAwIe84m2B2y7lsP3VuORI5sHXvPMB8GA1UdIwQYMBaAFASfRw0s
5dlcOpR/g4JqXFhlrTFYMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgWgMBEG
CWCGSAGG+EIBAQQEAwIGwDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEw
DQYJKoZIhvcNAQELBQADggIBAK5oF7X2+/pIOjT03fIvRmVF4+1bnDOyrFz/x5r+
FcUT8Pe6AsTslE0QC6GAnUWk0+ll2Ru7YO7v3n5kwdmwwp4b9xd5UEMc1QhOh3VX
MM5rVFbVamUxmrUNuSsrTEpBt9AUEgxnmw7ZsDpZolO7qhiPWyY6kdvt+BHDq3Mp
t2rQMJGTazKKbeYUMN/93b4gxn/k//ce54GByS+llyHSLqXvHdWciW2KamDbeXK0
9Ak5mGjUXtmFRKBynRYmLPPIJknL2KuwKDljrTQ9Z0nSrUeGckgqLjfbs9KG09G3
xTbAnbXMtJYVcJsjPTx+r4OD6dTwe/r4JEAmj3Gflm1U4xfWcK+WpK0Xv5cnudaT
yqqbABgQh3G6RIZ0uYYrzZ36a92CPZTLQRtl5I+RQ5tkwZ8z1eHIJ+P8p7Eb4lBB
kQhZFftbu9rEZe7TkWDLNtOVNPogyQU1UzbjgQ+aqdKFJxzJgHIr0wcqcV1SSRyB
U3UGiuJhH0nKCsOsePXPFSwnzGKQL8rWlwpD5w9FdtCySztIxFXp5Xavm9F4S0R4
JK1xnvFxksAIn1+NyuUspmr8L+bVBTtW9mWFuAmmRYx0vo68xyUGIL7H11gOtoQx
K5B/qrYOXvc/gWBOSTaG/Koi/oa1s6BCFlhkmuwfr/mpdLdROjxwmAEKQz42hzlG
J60K
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
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
luuCki9gU4ndOcVHQew/yc50oOcEgm4=
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIDXzCCAkegAwIBAgIEbsE1NzANBgkqhkiG9w0BAQsFADASMRAwDgYDVQQDEwdy
b290IENBMB4XDTE2MTEyMTEwMzgxOVoXDTI2MTExOTEwMzgxOVowGTEXMBUGA1UE
AxMOcHJveHkuc2lwLnRlc3QwggEeMA0GCSqGSIb3DQEBAQUAA4IBCwAwggEGAoH+
DLfR0v68dgwZtDbJYh936YPD7uqRCU27xEv5PSw2/5rgc7W0tQiTObA7aN8r9pGB
MNr3JkhrIxgoR73vA0ezPEFcYIi1D/eBTopobLM1dy5Tr9uET6jN+gwOr8C8uveE
vcXk6WHwO1QjdYty2Re+/BLzn+zb0bC50TrAg4aksEeHNMwDO5pR9aZnnJL2qVG1
XNm1ATgpXNRg/ohgFEdRaB/ZEqeWUz2Jl9xire5eFJy86/k+soUq3Uhj9J4KIevz
B/kzlYWVt4T+wL8qzhCjk/j8UGDqsTeMaAJ1dBcNLj4jGCUPrEU+MnqOLcHu1YIe
ddbbHbO1q1m6NTkQeP0CAwEAAaOBuTCBtjAdBgNVHQ4EFgQUYwAUg5bcZdTg33tv
oBtvwc55qPkwHwYDVR0jBBgwFoAUR3Gyzq4S5lBHiMaJsB2S5H8G+gMwJwYDVR0j
BCAwHqEWpBQwEjEQMA4GA1UEAxMHcm9vdCBDQYIEEYgGrjAJBgNVHRMEAjAAMA4G
A1UdDwEB/wQEAwIFoDARBglghkgBhvhCAQEEBAMCBsAwHQYDVR0lBBYwFAYIKwYB
BQUHAwIGCCsGAQUFBwMBMA0GCSqGSIb3DQEBCwUAA4IBAQBh6FcTtDHg8ZlyESkV
AUenRdhwya1nsVg/ne92dmv+LFgJ5b11kP4/UOL70pmLJYU1S74R1JRd8zK3dgSL
t4tV4TzbmGO92CozlTv0af4fM5k63Dspke6nh/0L5FOB8L4w0bJfZxwJqUBYP2Qf
AtxABT5nSUXIKHiLFRDHQx/NoaIplaXQPWGlATYmX1JeMekL9UZOIr/vhuIWisQK
JbL8Z24WFvmTKweMw1a5L/78dBHXgNN4II2xyKKQEScGav1JdCWclV/bZCK9wyW6
GJnKod2qIcjtnKBQPbMQm3e1Df/NZF5V/oRmqpxlYloAKn+PH7X0hMMzMqLqyjN/
CbQ5
MIIFPjCCAyagAwIBAgIFAMbMNzcwDQYJKoZIhvcNAQELBQAwEjEQMA4GA1UEAwwH
cm9vdCBDQTAeFw0xODExMDcyMjMxMzRaFw0yODExMDQyMjMxMzRaMBkxFzAVBgNV
BAMMDnByb3h5LnNpcC50ZXN0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC
AgEA2NnktmHYL+5wjvegHuPU3VoFxqBcP17kH+0lHnSQ47xd9YAEG34tR8cs5xBR
eHEFKiw1iNfwlW24w76wsxh3tESLNKSPVQ+JpbVGtGD9xLyb0sBGXZlpdKN0xvoT
T6BHKsHHaRbbnd9s+DapDz9Xi19DATUJZsvzRqu9YGSmkoV5jSQFRaiwCl7BfalZ
KlGdOG704/U16Fkg0rZn5hZFpGSgeqBZ7tyAVzOVA4SiIPV8MrX/JbuhM0+jzFnX
I1xz63OsbWus1oRWLtDXFTNEDWEAUi2WRO5Ps3kC1vbYkD3CRa39nFyPJTYEuqgR
eOishIbYb2ShzOetm2wKxXiIqEVKE0y4FWmBfBCmIF3dLIy0naND4OLX1bZIwqKA