Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
client
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Deploy
Releases
Package Registry
Container Registry
Model registry
Operate
Terraform modules
Analyze
Contributor analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
elixxir
client
Commits
33552c6c
Commit
33552c6c
authored
2 years ago
by
Sydney Anne Erickson
Browse files
Options
Downloads
Patches
Plain Diff
dummy: potentially fix tests
parent
3ed95146
No related branches found
No related tags found
3 merge requests
!510
Release
,
!226
WIP: Api2.0
,
!207
WIP: Client Restructure
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
dummy/manager.go
+3
-2
3 additions, 2 deletions
dummy/manager.go
dummy/send.go
+2
-1
2 additions, 1 deletion
dummy/send.go
dummy/utils_test.go
+220
-180
220 additions, 180 deletions
dummy/utils_test.go
with
225 additions
and
183 deletions
dummy/manager.go
+
3
−
2
View file @
33552c6c
...
@@ -66,9 +66,10 @@ type Manager struct {
...
@@ -66,9 +66,10 @@ type Manager struct {
// NewManager creates a new dummy Manager with the specified average send delta
// NewManager creates a new dummy Manager with the specified average send delta
// and the range used for generating random durations.
// and the range used for generating random durations.
func
NewManager
(
maxNumMessages
int
,
avgSendDelta
,
randomRange
time
.
Duration
,
func
NewManager
(
maxNumMessages
int
,
avgSendDelta
,
randomRange
time
.
Duration
,
client
*
api
.
Client
)
*
Manager
{
client
*
api
.
Client
,
manager
interfaces
.
NetworkManager
)
*
Manager
{
clientStorage
:=
client
.
GetStorage
()
return
newManager
(
maxNumMessages
,
avgSendDelta
,
randomRange
,
client
,
return
newManager
(
maxNumMessages
,
avgSendDelta
,
randomRange
,
client
,
client
.
Get
Storage
(),
client
.
GetNetworkInterface
()
,
client
.
GetRng
())
&
clientStorage
,
manager
,
client
.
GetRng
())
}
}
// newManager builds a new dummy Manager from fields explicitly passed in. This
// newManager builds a new dummy Manager from fields explicitly passed in. This
...
...
This diff is collapsed.
Click to expand it.
dummy/send.go
+
2
−
1
View file @
33552c6c
...
@@ -156,7 +156,8 @@ func (m *Manager) newRandomMessages(rng csprng.Source) (
...
@@ -156,7 +156,8 @@ func (m *Manager) newRandomMessages(rng csprng.Source) (
// generated payload, fingerprint, and MAC.
// generated payload, fingerprint, and MAC.
func
(
m
*
Manager
)
newRandomCmixMessage
(
rng
csprng
.
Source
)
(
format
.
Message
,
error
)
{
func
(
m
*
Manager
)
newRandomCmixMessage
(
rng
csprng
.
Source
)
(
format
.
Message
,
error
)
{
// Create new empty cMix message
// Create new empty cMix message
cMixMsg
:=
format
.
NewMessage
(
m
.
store
.
Cmix
()
.
GetGroup
()
.
GetP
()
.
ByteLen
())
clientStorage
:=
*
m
.
store
cMixMsg
:=
format
.
NewMessage
(
clientStorage
.
GetCmixGroup
()
.
GetP
()
.
ByteLen
())
// Generate random message
// Generate random message
randomMsg
,
err
:=
newRandomPayload
(
cMixMsg
.
ContentsSize
(),
rng
)
randomMsg
,
err
:=
newRandomPayload
(
cMixMsg
.
ContentsSize
(),
rng
)
...
...
This diff is collapsed.
Click to expand it.
dummy/utils_test.go
+
220
−
180
View file @
33552c6c
...
@@ -7,205 +7,245 @@
...
@@ -7,205 +7,245 @@
package
dummy
package
dummy
//
import (
import
(
// "io
"
"github.com/pkg/errors
"
// "math/rand
"
"gitlab.com/elixxir/client/cmix
"
// "sync
"
"gitlab.com/elixxir/client/cmix/gateway
"
// "testing
"
"gitlab.com/elixxir/client/cmix/message
"
// "time
"
"gitlab.com/elixxir/client/event
"
"gitlab.com/elixxir/client/interfaces"
//
"git
hu
b.com/
pkg/errors
"
"git
la
b.com/
elixxir/client/stoppable
"
//
"gitlab.com/elixxir/client/
cmix/gateway
"
"gitlab.com/elixxir/client/
storage
"
//
"gitlab.com/elixxir/c
lient/event
"
"gitlab.com/elixxir/c
omms/mixmessages
"
//
"gitlab.com/elixxir/c
lient/interfaces
"
"gitlab.com/elixxir/c
omms/network
"
//
"gitlab.com/elixxir/c
lient/interfaces/messag
e"
"gitlab.com/elixxir/c
rypto/e2
e"
//
"gitlab.com/elixxir/c
lient/interfaces/params
"
"gitlab.com/elixxir/c
rypto/fastRNG
"
//
"gitlab.com/elixxir/
client/stoppable
"
"gitlab.com/elixxir/
primitives/format
"
//
"gitlab.com/
elixxir/client/storage
"
"gitlab.com/
xx_network/comms/connect
"
//
"gitlab.com/
elixxir/comms/network
"
"gitlab.com/
xx_network/crypto/csprng
"
//
"gitlab.com/
elixxir/crypto/e2e
"
"gitlab.com/
xx_network/primitives/id
"
//
"gitlab.com/
elixxir/crypto/fastRNG
"
"gitlab.com/
xx_network/primitives/id/ephemeral
"
//
"gitlab.com/
elixxir
/primitives/
format
"
"gitlab.com/
xx_network
/primitives/
ndf
"
// "gitlab.com/xx_network/comms/connect
"
"io
"
// "gitlab.com/xx_network/crypto/csprng
"
"math/rand
"
// "gitlab.com/xx_network/primitives/id
"
"sync
"
// "gitlab.com/xx_network/primitives/id/ephemeral
"
"testing
"
// "gitlab.com/xx_network/primitives/ndf
"
"time
"
//
)
)
// ////////////////////////////////////////////////////////////////////////////////
// ////////////////////////////////////////////////////////////////////////////////
// // PRNG //
// // PRNG //
// ////////////////////////////////////////////////////////////////////////////////
// ////////////////////////////////////////////////////////////////////////////////
//
// Prng is a PRNG that satisfies the csprng.Source interface.
// Prng is a PRNG that satisfies the csprng.Source interface.
//
type Prng struct{ prng io.Reader }
type
Prng
struct
{
prng
io
.
Reader
}
//
func NewPrng(seed int64) csprng.Source { return &Prng{rand.New(rand.NewSource(seed))} }
func
NewPrng
(
seed
int64
)
csprng
.
Source
{
return
&
Prng
{
rand
.
New
(
rand
.
NewSource
(
seed
))}
}
//
func (s *Prng) Read(b []byte) (int, error) { return s.prng.Read(b) }
func
(
s
*
Prng
)
Read
(
b
[]
byte
)
(
int
,
error
)
{
return
s
.
prng
.
Read
(
b
)
}
//
func (s *Prng) SetSeed([]byte) error { return nil }
func
(
s
*
Prng
)
SetSeed
([]
byte
)
error
{
return
nil
}
// ////////////////////////////////////////////////////////////////////////////////
// ////////////////////////////////////////////////////////////////////////////////
// // Test Managers //
// // Test Managers //
// ////////////////////////////////////////////////////////////////////////////////
// ////////////////////////////////////////////////////////////////////////////////
// // newTestManager creates a new Manager that has groups stored for testing. One
// newTestManager creates a new Manager that has groups stored for testing. One
// // of the groups in the list is also returned.
// of the groups in the list is also returned.
// func newTestManager(maxNumMessages int, avgSendDelta, randomRange time.Duration,
func
newTestManager
(
maxNumMessages
int
,
avgSendDelta
,
randomRange
time
.
Duration
,
// sendErr bool, t *testing.T) *Manager {
sendErr
bool
,
t
*
testing
.
T
)
*
Manager
{
// m := &Manager{
store
:=
storage
.
InitTestingSession
(
t
)
// maxNumMessages: maxNumMessages,
m
:=
&
Manager
{
// avgSendDelta: avgSendDelta,
maxNumMessages
:
maxNumMessages
,
// randomRange: randomRange,
avgSendDelta
:
avgSendDelta
,
// statusChan: make(chan bool, statusChanLen),
randomRange
:
randomRange
,
// store: storage.InitTestingSession(t),
statusChan
:
make
(
chan
bool
,
statusChanLen
),
// net: newTestNetworkManager(sendErr, t),
store
:
&
store
,
// rng: fastRNG.NewStreamGenerator(1000, 10, csprng.NewSystemRNG),
net
:
newTestNetworkManager
(
sendErr
,
t
),
// }
rng
:
fastRNG
.
NewStreamGenerator
(
1000
,
10
,
csprng
.
NewSystemRNG
),
}
// return m
// }
return
m
}
// ////////////////////////////////////////////////////////////////////////////////
// ////////////////////////////////////////////////////////////////////////////////
// // Test Network State //
// // Test Network State //
// ////////////////////////////////////////////////////////////////////////////////
// ////////////////////////////////////////////////////////////////////////////////
// // testNetworkManager is a test implementation of NetworkManager interface.
// // testNetworkManager is a test implementation of NetworkManager interface.
// type testNetworkManager struct {
type
testNetworkManager
struct
{
// instance *network.Instance
instance
*
network
.
Instance
// messages map[id.ID]format.Message
messages
map
[
id
.
ID
]
format
.
Message
// sendErr bool
sendErr
bool
// sync.RWMutex
sync
.
RWMutex
// }
}
// func newTestNetworkManager(sendErr bool, t *testing.T) interfaces.NetworkManager {
func
newTestNetworkManager
(
sendErr
bool
,
t
*
testing
.
T
)
interfaces
.
NetworkManager
{
// instanceComms := &connect.ProtoComms{
instanceComms
:=
&
connect
.
ProtoComms
{
// Manager: connect.NewManagerTesting(t),
Manager
:
connect
.
NewManagerTesting
(
t
),
// }
}
// thisInstance, err := network.NewInstanceTesting(instanceComms, getNDF(),
thisInstance
,
err
:=
network
.
NewInstanceTesting
(
instanceComms
,
getNDF
(),
// getNDF(), nil, nil, t)
getNDF
(),
nil
,
nil
,
t
)
// if err != nil {
if
err
!=
nil
{
// t.Fatalf("Failed to create new test instance: %v", err)
t
.
Fatalf
(
"Failed to create new test instance: %v"
,
err
)
// }
}
// return &testNetworkManager{
return
&
testNetworkManager
{
// instance: thisInstance,
instance
:
thisInstance
,
// messages: make(map[id.ID]format.Message),
messages
:
make
(
map
[
id
.
ID
]
format
.
Message
),
// sendErr: sendErr,
sendErr
:
sendErr
,
// }
}
// }
}
// func (tnm *testNetworkManager) GetMsgListLen() int {
func
(
tnm
*
testNetworkManager
)
GetMsgListLen
()
int
{
// tnm.RLock()
tnm
.
RLock
()
// defer tnm.RUnlock()
defer
tnm
.
RUnlock
()
// return len(tnm.messages)
return
len
(
tnm
.
messages
)
// }
}
// func (tnm *testNetworkManager) GetMsgList() map[id.ID]format.Message {
func
(
tnm
*
testNetworkManager
)
GetMsgList
()
map
[
id
.
ID
]
format
.
Message
{
// tnm.RLock()
tnm
.
RLock
()
// defer tnm.RUnlock()
defer
tnm
.
RUnlock
()
// return tnm.messages
return
tnm
.
messages
// }
}
// func (tnm *testNetworkManager) GetMsg(recipient id.ID) format.Message {
func
(
tnm
*
testNetworkManager
)
GetMsg
(
recipient
id
.
ID
)
format
.
Message
{
// tnm.RLock()
tnm
.
RLock
()
// defer tnm.RUnlock()
defer
tnm
.
RUnlock
()
// return tnm.messages[recipient]
return
tnm
.
messages
[
recipient
]
// }
}
// func (tnm *testNetworkManager) SendE2E(message.Send, params.E2E, *stoppable.Single) (
// TEST
// []id.Round, e2e.MessageID, time.Time, error) {
func
(
tnm
*
testNetworkManager
)
SendE2E
()
(
// return nil, e2e.MessageID{}, time.Time{}, nil
[]
id
.
Round
,
e2e
.
MessageID
,
time
.
Time
,
error
)
{
// }
return
nil
,
e2e
.
MessageID
{},
time
.
Time
{},
nil
}
// func (tnm *testNetworkManager) SendUnsafe(message.Send, params.Unsafe) ([]id.Round, error) {
// return []id.Round{}, nil
// TEST
// }
func
(
tnm
*
testNetworkManager
)
SendUnsafe
()
([]
id
.
Round
,
error
)
{
return
[]
id
.
Round
{},
nil
// func (tnm *testNetworkManager) SendCMIX(message format.Message,
}
// recipient *id.ID, _ params.CMIX) (id.Round, ephemeral.Id, error) {
// tnm.Lock()
func
(
tnm
*
testNetworkManager
)
SendCMIX
(
message
format
.
Message
,
// defer tnm.Unlock()
recipient
*
id
.
ID
,
_
cmix
.
Params
)
(
id
.
Round
,
ephemeral
.
Id
,
error
)
{
tnm
.
Lock
()
// if tnm.sendErr {
defer
tnm
.
Unlock
()
// return 0, ephemeral.Id{}, errors.New("Send error")
// }
if
tnm
.
sendErr
{
return
0
,
ephemeral
.
Id
{},
errors
.
New
(
"Send error"
)
// tnm.messages[*recipient] = message
}
// return 0, ephemeral.Id{}, nil
tnm
.
messages
[
*
recipient
]
=
message
// }
return
0
,
ephemeral
.
Id
{},
nil
// func (tnm *testNetworkManager) SendManyCMIX([]message.TargetedCmixMessage, params.CMIX) (
}
// id.Round, []ephemeral.Id, error) {
// return 0, nil, nil
func
(
tnm
*
testNetworkManager
)
SendManyCMIX
([]
cmix
.
TargetedCmixMessage
,
cmix
.
Params
)
(
// }
id
.
Round
,
[]
ephemeral
.
Id
,
error
)
{
return
0
,
nil
,
nil
// type dummyEventMgr struct{}
}
// func (d *dummyEventMgr) Report(int, string, string, string) {}
type
dummyEventMgr
struct
{}
// func (tnm *testNetworkManager) GetEventManager() event.Reporter {
// return &dummyEventMgr{}
func
(
d
*
dummyEventMgr
)
Report
(
int
,
string
,
string
,
string
)
{}
// }
func
(
tnm
*
testNetworkManager
)
GetEventManager
()
event
.
Reporter
{
return
&
dummyEventMgr
{}
// func (tnm *testNetworkManager) GetInstance() *network.Instance { return tnm.instance }
}
// func (tnm *testNetworkManager) GetHealthTracker() interfaces.HealthTracker { return nil }
// func (tnm *testNetworkManager) Follow(interfaces.ClientErrorReport) (stoppable.Stoppable, error) {
func
(
tnm
*
testNetworkManager
)
GetInstance
()
*
network
.
Instance
{
return
tnm
.
instance
}
// return nil, nil
func
(
tnm
*
testNetworkManager
)
GetAddressSpace
()
uint8
{
return
0
}
// }
func
(
tnm
*
testNetworkManager
)
GetHostParams
()
connect
.
HostParams
{
return
connect
.
HostParams
{}
}
// func (tnm *testNetworkManager) CheckGarbledMessages() {}
func
(
tnm
*
testNetworkManager
)
GetHealthTracker
()
interfaces
.
HealthTracker
{
return
nil
}
// func (tnm *testNetworkManager) InProgressRegistrations() int { return 0 }
func
(
tnm
*
testNetworkManager
)
Follow
(
interfaces
.
ClientErrorReport
)
(
stoppable
.
Stoppable
,
error
)
{
// func (tnm *testNetworkManager) GetSender() *gateway.Sender { return nil }
return
nil
,
nil
// func (tnm *testNetworkManager) GetAddressSize() uint8 { return 0 }
}
// func (tnm *testNetworkManager) RegisterAddressSizeNotification(string) (chan uint8, error) {
func
(
tnm
*
testNetworkManager
)
CheckGarbledMessages
()
{}
// return nil, nil
func
(
tnm
*
testNetworkManager
)
CheckInProgressMessages
()
{}
// }
func
(
tnm
*
testNetworkManager
)
InProgressRegistrations
()
int
{
return
0
}
// func (tnm *testNetworkManager) UnregisterAddressSizeNotification(string) {}
func
(
tnm
*
testNetworkManager
)
GetSender
()
*
gateway
.
Sender
{
return
nil
}
// func (tnm *testNetworkManager) SetPoolFilter(gateway.Filter) {}
func
(
tnm
*
testNetworkManager
)
GetAddressSize
()
uint8
{
return
0
}
// func (tnm *testNetworkManager) GetVerboseRounds() string { return "" }
func
(
tnm
*
testNetworkManager
)
RegisterAddressSizeNotification
(
string
)
(
chan
uint8
,
error
)
{
return
nil
,
nil
}
func
(
tnm
*
testNetworkManager
)
UnregisterAddressSizeNotification
(
string
)
{}
func
(
tnm
*
testNetworkManager
)
SetPoolFilter
(
gateway
.
Filter
)
{}
func
(
tnm
*
testNetworkManager
)
GetVerboseRounds
()
string
{
return
""
}
func
(
tnm
*
testNetworkManager
)
HasNode
(
*
id
.
ID
)
bool
{
return
false
}
func
(
tnm
*
testNetworkManager
)
LookupHistoricalRound
(
id
.
Round
,
func
(
*
mixmessages
.
RoundInfo
,
bool
))
error
{
return
nil
}
func
(
tnm
*
testNetworkManager
)
NumRegisteredNodes
()
int
{
return
0
}
func
(
tnm
*
testNetworkManager
)
RegisterAddressSpaceNotification
(
string
)
(
chan
uint8
,
error
)
{
return
nil
,
nil
}
func
(
tnm
*
testNetworkManager
)
SendToAny
(
func
(
*
connect
.
Host
)
(
interface
{},
error
),
*
stoppable
.
Single
)
(
interface
{},
error
)
{
return
nil
,
nil
}
func
(
tnm
*
testNetworkManager
)
SendToPreferred
([]
*
id
.
ID
,
func
(
*
connect
.
Host
,
*
id
.
ID
,
time
.
Duration
)
(
interface
{},
error
),
*
stoppable
.
Single
,
time
.
Duration
)
(
interface
{},
error
)
{
return
nil
,
nil
}
func
(
tnm
*
testNetworkManager
)
SetGatewayFilter
(
func
(
map
[
id
.
ID
]
int
,
*
ndf
.
NetworkDefinition
)
map
[
id
.
ID
]
int
)
{
}
func
(
tnm
*
testNetworkManager
)
TrackServices
(
message
.
ServicesTracker
)
{}
func
(
tnm
*
testNetworkManager
)
TriggerNodeRegistration
(
*
id
.
ID
)
{}
func
(
tnm
*
testNetworkManager
)
UnregisterAddressSpaceNotification
(
string
)
{}
func
(
tnm
*
testNetworkManager
)
AddFingerprint
(
*
id
.
ID
,
format
.
Fingerprint
,
message
.
Processor
)
error
{
return
nil
}
func
(
tnm
*
testNetworkManager
)
DeleteFingerprint
(
*
id
.
ID
,
format
.
Fingerprint
)
{}
func
(
tnm
*
testNetworkManager
)
DeleteClientFingerprints
(
*
id
.
ID
)
{}
func
(
tnm
*
testNetworkManager
)
AddIdentity
(
*
id
.
ID
,
time
.
Time
,
bool
)
error
{
return
nil
}
func
(
tnm
*
testNetworkManager
)
RemoveIdentity
(
*
id
.
ID
)
{}
func
(
tnm
*
testNetworkManager
)
AddTrigger
(
*
id
.
ID
,
message
.
Service
,
message
.
Processor
)
{}
func
(
tnm
*
testNetworkManager
)
DeleteTrigger
(
*
id
.
ID
,
interfaces
.
Preimage
,
message
.
Processor
)
error
{
return
nil
}
func
(
tnm
*
testNetworkManager
)
DeleteClientTriggers
(
*
id
.
ID
)
{}
// ////////////////////////////////////////////////////////////////////////////////
// ////////////////////////////////////////////////////////////////////////////////
// // NDF Primes //
// // NDF Primes //
// ////////////////////////////////////////////////////////////////////////////////
// ////////////////////////////////////////////////////////////////////////////////
//
func getNDF() *ndf.NetworkDefinition {
func
getNDF
()
*
ndf
.
NetworkDefinition
{
//
return &ndf.NetworkDefinition{
return
&
ndf
.
NetworkDefinition
{
//
E2E: ndf.Group{
E2E
:
ndf
.
Group
{
//
Prime: "E2EE983D031DC1DB6F1A7A67DF0E9A8E5561DB8E8D49413394C049B7A" +
Prime
:
"E2EE983D031DC1DB6F1A7A67DF0E9A8E5561DB8E8D49413394C049B7A"
+
//
"8ACCEDC298708F121951D9CF920EC5D146727AA4AE535B0922C688B55B3D" +
"8ACCEDC298708F121951D9CF920EC5D146727AA4AE535B0922C688B55B3D"
+
//
"D2AEDF6C01C94764DAB937935AA83BE36E67760713AB44A6337C20E78615" +
"D2AEDF6C01C94764DAB937935AA83BE36E67760713AB44A6337C20E78615"
+
//
"75E745D31F8B9E9AD8412118C62A3E2E29DF46B0864D0C951C394A5CBBDC" +
"75E745D31F8B9E9AD8412118C62A3E2E29DF46B0864D0C951C394A5CBBDC"
+
//
"6ADC718DD2A3E041023DBB5AB23EBB4742DE9C1687B5B34FA48C3521632C" +
"6ADC718DD2A3E041023DBB5AB23EBB4742DE9C1687B5B34FA48C3521632C"
+
//
"4A530E8FFB1BC51DADDF453B0B2717C2BC6669ED76B4BDD5C9FF558E88F2" +
"4A530E8FFB1BC51DADDF453B0B2717C2BC6669ED76B4BDD5C9FF558E88F2"
+
//
"6E5785302BEDBCA23EAC5ACE92096EE8A60642FB61E8F3D24990B8CB12EE" +
"6E5785302BEDBCA23EAC5ACE92096EE8A60642FB61E8F3D24990B8CB12EE"
+
//
"448EEF78E184C7242DD161C7738F32BF29A841698978825B4111B4BC3E1E" +
"448EEF78E184C7242DD161C7738F32BF29A841698978825B4111B4BC3E1E"
+
//
"198455095958333D776D8B2BEEED3A1A1A221A6E37E664A64B83981C46FF" +
"198455095958333D776D8B2BEEED3A1A1A221A6E37E664A64B83981C46FF"
+
//
"DDC1A45E3D5211AAF8BFBC072768C4F50D7D7803D2D4F278DE8014A47323" +
"DDC1A45E3D5211AAF8BFBC072768C4F50D7D7803D2D4F278DE8014A47323"
+
//
"631D7E064DE81C0C6BFA43EF0E6998860F1390B5D3FEACAF1696015CB79C" +
"631D7E064DE81C0C6BFA43EF0E6998860F1390B5D3FEACAF1696015CB79C"
+
//
"3F9C2D93D961120CD0E5F12CBB687EAB045241F96789C38E89D796138E63" +
"3F9C2D93D961120CD0E5F12CBB687EAB045241F96789C38E89D796138E63"
+
//
"19BE62E35D87B1048CA28BE389B575E994DCA755471584A09EC723742DC3" +
"19BE62E35D87B1048CA28BE389B575E994DCA755471584A09EC723742DC3"
+
//
"5873847AEF49F66E43873",
"5873847AEF49F66E43873"
,
//
Generator: "2",
Generator
:
"2"
,
//
},
},
//
CMIX: ndf.Group{
CMIX
:
ndf
.
Group
{
//
Prime: "9DB6FB5951B66BB6FE1E140F1D2CE5502374161FD6538DF1648218642" +
Prime
:
"9DB6FB5951B66BB6FE1E140F1D2CE5502374161FD6538DF1648218642"
+
//
"F0B5C48C8F7A41AADFA187324B87674FA1822B00F1ECF8136943D7C55757" +
"F0B5C48C8F7A41AADFA187324B87674FA1822B00F1ECF8136943D7C55757"
+
//
"264E5A1A44FFE012E9936E00C1D3E9310B01C7D179805D3058B2A9F4BB6F" +
"264E5A1A44FFE012E9936E00C1D3E9310B01C7D179805D3058B2A9F4BB6F"
+
//
"9716BFE6117C6B5B3CC4D9BE341104AD4A80AD6C94E005F4B993E14F091E" +
"9716BFE6117C6B5B3CC4D9BE341104AD4A80AD6C94E005F4B993E14F091E"
+
//
"B51743BF33050C38DE235567E1B34C3D6A5C0CEAA1A0F368213C3D19843D" +
"B51743BF33050C38DE235567E1B34C3D6A5C0CEAA1A0F368213C3D19843D"
+
//
"0B4B09DCB9FC72D39C8DE41F1BF14D4BB4563CA28371621CAD3324B6A2D3" +
"0B4B09DCB9FC72D39C8DE41F1BF14D4BB4563CA28371621CAD3324B6A2D3"
+
//
"92145BEBFAC748805236F5CA2FE92B871CD8F9C36D3292B5509CA8CAA77A" +
"92145BEBFAC748805236F5CA2FE92B871CD8F9C36D3292B5509CA8CAA77A"
+
//
"2ADFC7BFD77DDA6F71125A7456FEA153E433256A2261C6A06ED3693797E7" +
"2ADFC7BFD77DDA6F71125A7456FEA153E433256A2261C6A06ED3693797E7"
+
//
"995FAD5AABBCFBE3EDA2741E375404AE25B",
"995FAD5AABBCFBE3EDA2741E375404AE25B"
,
//
Generator: "5C7FF6B06F8F143FE8288433493E4769C4D988ACE5BE25A0E2480" +
Generator
:
"5C7FF6B06F8F143FE8288433493E4769C4D988ACE5BE25A0E2480"
+
//
"9670716C613D7B0CEE6932F8FAA7C44D2CB24523DA53FBE4F6EC3595892D" +
"9670716C613D7B0CEE6932F8FAA7C44D2CB24523DA53FBE4F6EC3595892D"
+
//
"1AA58C4328A06C46A15662E7EAA703A1DECF8BBB2D05DBE2EB956C142A33" +
"1AA58C4328A06C46A15662E7EAA703A1DECF8BBB2D05DBE2EB956C142A33"
+
//
"8661D10461C0D135472085057F3494309FFA73C611F78B32ADBB5740C361" +
"8661D10461C0D135472085057F3494309FFA73C611F78B32ADBB5740C361"
+
//
"C9F35BE90997DB2014E2EF5AA61782F52ABEB8BD6432C4DD097BC5423B28" +
"C9F35BE90997DB2014E2EF5AA61782F52ABEB8BD6432C4DD097BC5423B28"
+
//
"5DAFB60DC364E8161F4A2A35ACA3A10B1C4D203CC76A470A33AFDCBDD929" +
"5DAFB60DC364E8161F4A2A35ACA3A10B1C4D203CC76A470A33AFDCBDD929"
+
//
"59859ABD8B56E1725252D78EAC66E71BA9AE3F1DD2487199874393CD4D83" +
"59859ABD8B56E1725252D78EAC66E71BA9AE3F1DD2487199874393CD4D83"
+
//
"2186800654760E1E34C09E4D155179F9EC0DC4473F996BDCE6EED1CABED8" +
"2186800654760E1E34C09E4D155179F9EC0DC4473F996BDCE6EED1CABED8"
+
//
"B6F116F7AD9CF505DF0F998E34AB27514B0FFE7",
"B6F116F7AD9CF505DF0F998E34AB27514B0FFE7"
,
//
},
},
//
}
}
//
}
}
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment