From f7793443f326ca3a69702ce98c409286e150fb37 Mon Sep 17 00:00:00 2001 From: kennycud Date: Sat, 23 Mar 2024 06:25:31 -0700 Subject: [PATCH 01/30] call current blockchain height to ensure the current server is set to the blockchain provider and sort the servers to ensure the current server is listed first --- .../qortal/api/resource/CrossChainUtils.java | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/qortal/api/resource/CrossChainUtils.java b/src/main/java/org/qortal/api/resource/CrossChainUtils.java index b07a9d6c..7410ca2b 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainUtils.java +++ b/src/main/java/org/qortal/api/resource/CrossChainUtils.java @@ -16,12 +16,7 @@ import org.qortal.data.crosschain.TransactionSummary; import org.qortal.repository.DataException; import org.qortal.repository.Repository; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Optional; -import java.util.HashMap; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; @@ -31,10 +26,20 @@ public class CrossChainUtils { public static ServerConfigurationInfo buildServerConfigurationInfo(Bitcoiny blockchain) { BitcoinyBlockchainProvider blockchainProvider = blockchain.getBlockchainProvider(); + + // the only reason this is called is to ensure the current server is set on the blockchain provider, + // if there is an exception, then ignore it + try { + blockchainProvider.getCurrentHeight(); + } catch (ForeignBlockchainException e) { + } + ChainableServer currentServer = blockchainProvider.getCurrentServer(); return new ServerConfigurationInfo( - buildInfos(blockchainProvider.getServers(), currentServer), + buildInfos(blockchainProvider.getServers(), currentServer).stream() + .sorted(Comparator.comparing(ServerInfo::isCurrent).reversed()) + .collect(Collectors.toList()), buildInfos(blockchainProvider.getRemainingServers(), currentServer), buildInfos(blockchainProvider.getUselessServers(), currentServer) ); From e83b2263f06733ae7945c349088b0b77222d90c8 Mon Sep 17 00:00:00 2001 From: kennycud Date: Sat, 23 Mar 2024 09:42:33 -0700 Subject: [PATCH 02/30] some simple error logging --- src/main/java/org/qortal/api/resource/CrossChainUtils.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/qortal/api/resource/CrossChainUtils.java b/src/main/java/org/qortal/api/resource/CrossChainUtils.java index 7410ca2b..2c1fabc2 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainUtils.java +++ b/src/main/java/org/qortal/api/resource/CrossChainUtils.java @@ -32,6 +32,7 @@ public class CrossChainUtils { try { blockchainProvider.getCurrentHeight(); } catch (ForeignBlockchainException e) { + LOGGER.warn("Problems getting block height before building server configuration infos"); } ChainableServer currentServer = blockchainProvider.getCurrentServer(); From df39819de009bb7d208dbfad671f630fe52873f9 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Mon, 25 Mar 2024 07:34:26 +0100 Subject: [PATCH 03/30] Update QDN file management - Allow files to move around the network more quickly - Ensuring that metadata isn't saved for blocked names - More selective disk usage - Minor fixes --- pom.xml | 61 ++++++++----------- .../qortal/arbitrary/ArbitraryDataFile.java | 21 ++++++- .../arbitrary/ArbitraryDataFileManager.java | 9 +-- .../arbitrary/ArbitraryMetadataManager.java | 12 +++- .../arbitrary/ArbitraryDataFileTests.java | 2 + 5 files changed, 61 insertions(+), 44 deletions(-) diff --git a/pom.xml b/pom.xml index bbc044a2..4eaaa408 100644 --- a/pom.xml +++ b/pom.xml @@ -10,18 +10,17 @@ 7dc8c6f 0.15.10 1.69 - 3.5.0 ${maven.build.timestamp} 1.4.1 3.8.0 1.11.0 - 2.11.0 - 1.25.0 + 2.15.1 + 1.26.1 3.14.0 1.2.2 0.12.3 4.9.10 - 1.61.1 + 1.62.2 33.0.0-jre 2.2 1.2.1 @@ -33,28 +32,30 @@ 2.41 9.4.54.v20240208 1.1.1 - 20240205 + 20240303 1.17.2 5.10.0 1.0.0 - 2.22.1 + 2.23.0 1.5.0-b01 + 3.5.0 3.12.1 + 3.6.1 3.3.0 + 1.1.0 + 2.16.2 + 0.16 3.3.1 - 3.5.1 + 3.5.2 3.2.5 - 1.1.0 UTF-8 - 3.25.2 + 3.25.3 1.5.3 - 0.16 1.17 1.7.36 2.0.10 - 5.10.3 + 5.11.8 1.2 - 2.16.2 1.9 @@ -70,7 +71,7 @@ org.codehaus.mojo versions-maven-plugin - ${versions-maven-plugin.version} + ${maven-plugin.version} false @@ -238,7 +239,7 @@ com.github.bohnman package-info-maven-plugin - ${package-info-maven-plugin.version} + ${maven-package-info-plugin.version} @@ -268,7 +269,7 @@ org.codehaus.mojo build-helper-maven-plugin - ${build-helper-maven-plugin.version} + ${maven-build-helper-plugin.version} generate-sources @@ -353,7 +354,7 @@ io.github.zlika reproducible-build-maven-plugin - ${reproducible-build-maven-plugin.version} + ${maven-reproducible-build-plugin.version} package @@ -388,15 +389,9 @@ - - org.apache.maven.plugins - - - maven-dependency-plugin - - - [3.6.0,) - + org.apache.maven.plugins + maven-dependency-plugin + ${maven-dependency-plugin.version} unpack @@ -407,15 +402,9 @@ - - com.google.code.maven-replacer-plugin - - - replacer - - - [1.5.3,) - + com.google.code.maven-replacer-plugin + replacer + ${replacer.version} replace @@ -448,7 +437,7 @@ org.codehaus.mojo build-helper-maven-plugin - ${build-helper-maven-plugin.version} + ${maven-build-helper-plugin.version} provided @@ -456,7 +445,7 @@ com.github.bohnman package-info-maven-plugin - ${package-info-maven-plugin.version} + ${maven-package-info-plugin.version} provided diff --git a/src/main/java/org/qortal/arbitrary/ArbitraryDataFile.java b/src/main/java/org/qortal/arbitrary/ArbitraryDataFile.java index 71378461..1bba1a73 100644 --- a/src/main/java/org/qortal/arbitrary/ArbitraryDataFile.java +++ b/src/main/java/org/qortal/arbitrary/ArbitraryDataFile.java @@ -58,6 +58,9 @@ public class ArbitraryDataFile { public static int SHORT_DIGEST_LENGTH = 8; protected Path filePath; + protected byte[] fileContent; + private boolean useTemporaryFile; + protected String hash58; protected byte[] signature; private ArrayList chunks; @@ -90,8 +93,14 @@ public class ArbitraryDataFile { this.signature = signature; LOGGER.trace(String.format("File digest: %s, size: %d bytes", this.hash58, fileContent.length)); + this.fileContent = fileContent; + this.useTemporaryFile = useTemporaryFile; + } + + public void save() throws DataException { + Path outputFilePath; - if (useTemporaryFile) { + if (this.useTemporaryFile) { try { outputFilePath = Files.createTempFile("qortalRawData", null); outputFilePath.toFile().deleteOnExit(); @@ -149,6 +158,7 @@ public class ArbitraryDataFile { case RAW_DATA: arbitraryDataFile = ArbitraryDataFile.fromRawData(data, signature); + arbitraryDataFile.save(); break; } @@ -324,6 +334,7 @@ public class ArbitraryDataFile { out.flush(); ArbitraryDataFileChunk chunk = new ArbitraryDataFileChunk(out.toByteArray(), this.signature); + chunk.save(); ValidationResult validationResult = chunk.isValid(); if (validationResult == ValidationResult.OK) { this.chunks.add(chunk); @@ -406,6 +417,10 @@ public class ArbitraryDataFile { } public boolean delete(int attempts) { + if (this.filePath == null) { + return false; + } + // Keep trying to delete the data until it is deleted, or we reach 10 attempts for (int i=0; i Date: Sun, 26 May 2024 11:08:07 -0700 Subject: [PATCH 04/30] Adding in foreign blockchain server configuration add and remove capabilities. Also adding in connection recording and connection setting capabilities. --- .../resource/CrossChainBitcoinResource.java | 179 +++++++++++++++++ .../resource/CrossChainDigibyteResource.java | 181 +++++++++++++++++- .../resource/CrossChainDogecoinResource.java | 181 +++++++++++++++++- .../resource/CrossChainLitecoinResource.java | 178 +++++++++++++++++ .../CrossChainPirateChainResource.java | 178 +++++++++++++++++ .../resource/CrossChainRavencoinResource.java | 179 +++++++++++++++++ .../qortal/api/resource/CrossChainUtils.java | 130 ++++++++++++- .../BitcoinyBlockchainProvider.java | 60 ++++++ .../crosschain/ChainableServerConnection.java | 71 +++++++ .../ChainableServerConnectionRecorder.java | 45 +++++ .../java/org/qortal/crosschain/ElectrumX.java | 161 ++++++++++------ .../qortal/crosschain/PirateLightClient.java | 109 ++++++++--- .../crosschain/ServerConnectionInfo.java | 82 ++++++++ 13 files changed, 1646 insertions(+), 88 deletions(-) create mode 100644 src/main/java/org/qortal/crosschain/ChainableServerConnection.java create mode 100644 src/main/java/org/qortal/crosschain/ChainableServerConnectionRecorder.java create mode 100644 src/main/java/org/qortal/crosschain/ServerConnectionInfo.java diff --git a/src/main/java/org/qortal/api/resource/CrossChainBitcoinResource.java b/src/main/java/org/qortal/api/resource/CrossChainBitcoinResource.java index ff4aee02..9fc1cafe 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainBitcoinResource.java +++ b/src/main/java/org/qortal/api/resource/CrossChainBitcoinResource.java @@ -18,7 +18,11 @@ import org.qortal.api.model.crosschain.AddressRequest; import org.qortal.api.model.crosschain.BitcoinSendRequest; import org.qortal.crosschain.AddressInfo; import org.qortal.crosschain.Bitcoin; +import org.qortal.crosschain.ChainableServer; +import org.qortal.crosschain.ElectrumX; import org.qortal.crosschain.ForeignBlockchainException; +import org.qortal.crosschain.ServerConnectionInfo; +import org.qortal.crosschain.ServerInfo; import org.qortal.crosschain.SimpleTransaction; import org.qortal.crosschain.ServerConfigurationInfo; @@ -267,6 +271,181 @@ public class CrossChainBitcoinResource { return CrossChainUtils.buildServerConfigurationInfo(Bitcoin.getInstance()); } + @GET + @Path("/serverconnectionhistory") + @Operation( + summary = "Returns Bitcoin server connection history", + description = "Returns Bitcoin server connection history", + responses = { + @ApiResponse( + content = @Content(array = @ArraySchema( schema = @Schema( implementation = ServerConnectionInfo.class ) ) ) + ) + } + ) + public List getServerConnectionHistory() { + + return CrossChainUtils.buildServerConnectionHistory(Bitcoin.getInstance()); + } + + @POST + @Path("/addserver") + @Operation( + summary = "Add server to list of Bitcoin servers", + description = "Add server to list of Bitcoin servers", + requestBody = @RequestBody( + required = true, + content = @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema( + implementation = ServerInfo.class + ) + ) + ), + responses = { + @ApiResponse( + description = "true if removed, false if not found", + content = @Content( + schema = @Schema( + type = "string" + ) + ) + ) + } + + ) + @ApiErrors({ApiError.INVALID_DATA}) + @SecurityRequirement(name = "apiKey") + public String addServer(@HeaderParam(Security.API_KEY_HEADER) String apiKey, ServerInfo serverInfo) { + Security.checkApiCallAllowed(request); + + try { + ElectrumX.Server server = new ElectrumX.Server( + serverInfo.getHostName(), + ChainableServer.ConnectionType.valueOf(serverInfo.getConnectionType()), + serverInfo.getPort() + ); + + if( CrossChainUtils.addServer( Bitcoin.getInstance(), server )) { + return "true"; + } + else { + return "false"; + } + } + catch (IllegalArgumentException | NullPointerException e) { + throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_DATA); + } + catch (Exception e) { + return "false"; + } + } + + @POST + @Path("/removeserver") + @Operation( + summary = "Remove server from list of Bitcoin servers", + description = "Remove server from list of Bitcoin servers", + requestBody = @RequestBody( + required = true, + content = @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema( + implementation = ServerInfo.class + ) + ) + ), + responses = { + @ApiResponse( + description = "true if removed, otherwise", + content = @Content( + schema = @Schema( + type = "string" + ) + ) + ) + } + + ) + @ApiErrors({ApiError.INVALID_DATA}) + @SecurityRequirement(name = "apiKey") + public String removeServer(@HeaderParam(Security.API_KEY_HEADER) String apiKey, ServerInfo serverInfo) { + Security.checkApiCallAllowed(request); + + try { + ElectrumX.Server server = new ElectrumX.Server( + serverInfo.getHostName(), + ChainableServer.ConnectionType.valueOf(serverInfo.getConnectionType()), + serverInfo.getPort() + ); + + if( CrossChainUtils.removeServer( Bitcoin.getInstance(), server ) ) { + + return "true"; + } + else { + return "false"; + } + } + catch (IllegalArgumentException | NullPointerException e) { + throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_DATA); + } + catch (Exception e) { + return "false"; + } + } + + @POST + @Path("/setcurrentserver") + @Operation( + summary = "Set current Bitcoin server", + description = "Set current Bitcoin server", + requestBody = @RequestBody( + required = true, + content = @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema( + implementation = ServerInfo.class + ) + ) + ), + responses = { + @ApiResponse( + description = "connection info", + content = @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema( + implementation = ServerConnectionInfo.class + ) + ) + ) + } + + ) + @ApiErrors({ApiError.INVALID_DATA}) + @SecurityRequirement(name = "apiKey") + public ServerConnectionInfo setCurrentServer(@HeaderParam(Security.API_KEY_HEADER) String apiKey, ServerInfo serverInfo) { + Security.checkApiCallAllowed(request); + + if( serverInfo.getConnectionType() == null || + serverInfo.getHostName() == null) throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_DATA); + try { + return CrossChainUtils.setCurrentServer( Bitcoin.getInstance(), serverInfo ); + } + catch (IllegalArgumentException e) { + throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_DATA); + } + catch (Exception e) { + return new ServerConnectionInfo( + serverInfo, + CrossChainUtils.CORE_API_CALL, + true, + false, + System.currentTimeMillis(), + CrossChainUtils.getNotes(e)); + } + } + + @GET @Path("/feekb") @Operation( diff --git a/src/main/java/org/qortal/api/resource/CrossChainDigibyteResource.java b/src/main/java/org/qortal/api/resource/CrossChainDigibyteResource.java index d78a4ed9..f69007f9 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainDigibyteResource.java +++ b/src/main/java/org/qortal/api/resource/CrossChainDigibyteResource.java @@ -16,8 +16,12 @@ import org.qortal.api.Security; import org.qortal.api.model.crosschain.AddressRequest; import org.qortal.api.model.crosschain.DigibyteSendRequest; import org.qortal.crosschain.AddressInfo; -import org.qortal.crosschain.Digibyte; +import org.qortal.crosschain.ChainableServer; +import org.qortal.crosschain.ElectrumX; import org.qortal.crosschain.ForeignBlockchainException; +import org.qortal.crosschain.Digibyte; +import org.qortal.crosschain.ServerConnectionInfo; +import org.qortal.crosschain.ServerInfo; import org.qortal.crosschain.SimpleTransaction; import org.qortal.crosschain.ServerConfigurationInfo; @@ -266,6 +270,181 @@ public class CrossChainDigibyteResource { return CrossChainUtils.buildServerConfigurationInfo(Digibyte.getInstance()); } + @GET + @Path("/serverconnectionhistory") + @Operation( + summary = "Returns Digibyte server connection history", + description = "Returns Digibyte server connection history", + responses = { + @ApiResponse( + content = @Content(array = @ArraySchema( schema = @Schema( implementation = ServerConnectionInfo.class ) ) ) + ) + } + ) + public List getServerConnectionHistory() { + + return CrossChainUtils.buildServerConnectionHistory(Digibyte.getInstance()); + } + + @POST + @Path("/addserver") + @Operation( + summary = "Add server to list of Digibyte servers", + description = "Add server to list of Digibyte servers", + requestBody = @RequestBody( + required = true, + content = @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema( + implementation = ServerInfo.class + ) + ) + ), + responses = { + @ApiResponse( + description = "true if removed, false if not found", + content = @Content( + schema = @Schema( + type = "string" + ) + ) + ) + } + + ) + @ApiErrors({ApiError.INVALID_DATA}) + @SecurityRequirement(name = "apiKey") + public String addServer(@HeaderParam(Security.API_KEY_HEADER) String apiKey, ServerInfo serverInfo) { + Security.checkApiCallAllowed(request); + + try { + ElectrumX.Server server = new ElectrumX.Server( + serverInfo.getHostName(), + ChainableServer.ConnectionType.valueOf(serverInfo.getConnectionType()), + serverInfo.getPort() + ); + + if( CrossChainUtils.addServer( Digibyte.getInstance(), server )) { + return "true"; + } + else { + return "false"; + } + } + catch (IllegalArgumentException | NullPointerException e) { + throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_DATA); + } + catch (Exception e) { + return "false"; + } + } + + @POST + @Path("/removeserver") + @Operation( + summary = "Remove server from list of Digibyte servers", + description = "Remove server from list of Digibyte servers", + requestBody = @RequestBody( + required = true, + content = @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema( + implementation = ServerInfo.class + ) + ) + ), + responses = { + @ApiResponse( + description = "true if removed, otherwise", + content = @Content( + schema = @Schema( + type = "string" + ) + ) + ) + } + + ) + @ApiErrors({ApiError.INVALID_DATA}) + @SecurityRequirement(name = "apiKey") + public String removeServer(@HeaderParam(Security.API_KEY_HEADER) String apiKey, ServerInfo serverInfo) { + Security.checkApiCallAllowed(request); + + try { + ElectrumX.Server server = new ElectrumX.Server( + serverInfo.getHostName(), + ChainableServer.ConnectionType.valueOf(serverInfo.getConnectionType()), + serverInfo.getPort() + ); + + if( CrossChainUtils.removeServer( Digibyte.getInstance(), server ) ) { + + return "true"; + } + else { + return "false"; + } + } + catch (IllegalArgumentException | NullPointerException e) { + throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_DATA); + } + catch (Exception e) { + return "false"; + } + } + + @POST + @Path("/setcurrentserver") + @Operation( + summary = "Set current Digibyte server", + description = "Set current Digibyte server", + requestBody = @RequestBody( + required = true, + content = @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema( + implementation = ServerInfo.class + ) + ) + ), + responses = { + @ApiResponse( + description = "connection info", + content = @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema( + implementation = ServerConnectionInfo.class + ) + ) + ) + } + + ) + @ApiErrors({ApiError.INVALID_DATA}) + @SecurityRequirement(name = "apiKey") + public ServerConnectionInfo setCurrentServer(@HeaderParam(Security.API_KEY_HEADER) String apiKey, ServerInfo serverInfo) { + Security.checkApiCallAllowed(request); + + if( serverInfo.getConnectionType() == null || + serverInfo.getHostName() == null) throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_DATA); + try { + return CrossChainUtils.setCurrentServer( Digibyte.getInstance(), serverInfo ); + } + catch (IllegalArgumentException e) { + throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_DATA); + } + catch (Exception e) { + return new ServerConnectionInfo( + serverInfo, + CrossChainUtils.CORE_API_CALL, + true, + false, + System.currentTimeMillis(), + CrossChainUtils.getNotes(e)); + } + } + + @GET @Path("/feekb") @Operation( diff --git a/src/main/java/org/qortal/api/resource/CrossChainDogecoinResource.java b/src/main/java/org/qortal/api/resource/CrossChainDogecoinResource.java index 8575a28d..4bb6e102 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainDogecoinResource.java +++ b/src/main/java/org/qortal/api/resource/CrossChainDogecoinResource.java @@ -16,8 +16,12 @@ import org.qortal.api.Security; import org.qortal.api.model.crosschain.AddressRequest; import org.qortal.api.model.crosschain.DogecoinSendRequest; import org.qortal.crosschain.AddressInfo; -import org.qortal.crosschain.Dogecoin; +import org.qortal.crosschain.ChainableServer; +import org.qortal.crosschain.ElectrumX; import org.qortal.crosschain.ForeignBlockchainException; +import org.qortal.crosschain.Dogecoin; +import org.qortal.crosschain.ServerConnectionInfo; +import org.qortal.crosschain.ServerInfo; import org.qortal.crosschain.SimpleTransaction; import org.qortal.crosschain.ServerConfigurationInfo; @@ -266,6 +270,181 @@ public class CrossChainDogecoinResource { return CrossChainUtils.buildServerConfigurationInfo(Dogecoin.getInstance()); } + @GET + @Path("/serverconnectionhistory") + @Operation( + summary = "Returns Dogecoin server connection history", + description = "Returns Dogecoin server connection history", + responses = { + @ApiResponse( + content = @Content(array = @ArraySchema( schema = @Schema( implementation = ServerConnectionInfo.class ) ) ) + ) + } + ) + public List getServerConnectionHistory() { + + return CrossChainUtils.buildServerConnectionHistory(Dogecoin.getInstance()); + } + + @POST + @Path("/addserver") + @Operation( + summary = "Add server to list of Dogecoin servers", + description = "Add server to list of Dogecoin servers", + requestBody = @RequestBody( + required = true, + content = @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema( + implementation = ServerInfo.class + ) + ) + ), + responses = { + @ApiResponse( + description = "true if removed, false if not found", + content = @Content( + schema = @Schema( + type = "string" + ) + ) + ) + } + + ) + @ApiErrors({ApiError.INVALID_DATA}) + @SecurityRequirement(name = "apiKey") + public String addServer(@HeaderParam(Security.API_KEY_HEADER) String apiKey, ServerInfo serverInfo) { + Security.checkApiCallAllowed(request); + + try { + ElectrumX.Server server = new ElectrumX.Server( + serverInfo.getHostName(), + ChainableServer.ConnectionType.valueOf(serverInfo.getConnectionType()), + serverInfo.getPort() + ); + + if( CrossChainUtils.addServer( Dogecoin.getInstance(), server )) { + return "true"; + } + else { + return "false"; + } + } + catch (IllegalArgumentException | NullPointerException e) { + throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_DATA); + } + catch (Exception e) { + return "false"; + } + } + + @POST + @Path("/removeserver") + @Operation( + summary = "Remove server from list of Dogecoin servers", + description = "Remove server from list of Dogecoin servers", + requestBody = @RequestBody( + required = true, + content = @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema( + implementation = ServerInfo.class + ) + ) + ), + responses = { + @ApiResponse( + description = "true if removed, otherwise", + content = @Content( + schema = @Schema( + type = "string" + ) + ) + ) + } + + ) + @ApiErrors({ApiError.INVALID_DATA}) + @SecurityRequirement(name = "apiKey") + public String removeServer(@HeaderParam(Security.API_KEY_HEADER) String apiKey, ServerInfo serverInfo) { + Security.checkApiCallAllowed(request); + + try { + ElectrumX.Server server = new ElectrumX.Server( + serverInfo.getHostName(), + ChainableServer.ConnectionType.valueOf(serverInfo.getConnectionType()), + serverInfo.getPort() + ); + + if( CrossChainUtils.removeServer( Dogecoin.getInstance(), server ) ) { + + return "true"; + } + else { + return "false"; + } + } + catch (IllegalArgumentException | NullPointerException e) { + throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_DATA); + } + catch (Exception e) { + return "false"; + } + } + + @POST + @Path("/setcurrentserver") + @Operation( + summary = "Set current Dogecoin server", + description = "Set current Dogecoin server", + requestBody = @RequestBody( + required = true, + content = @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema( + implementation = ServerInfo.class + ) + ) + ), + responses = { + @ApiResponse( + description = "connection info", + content = @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema( + implementation = ServerConnectionInfo.class + ) + ) + ) + } + + ) + @ApiErrors({ApiError.INVALID_DATA}) + @SecurityRequirement(name = "apiKey") + public ServerConnectionInfo setCurrentServer(@HeaderParam(Security.API_KEY_HEADER) String apiKey, ServerInfo serverInfo) { + Security.checkApiCallAllowed(request); + + if( serverInfo.getConnectionType() == null || + serverInfo.getHostName() == null) throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_DATA); + try { + return CrossChainUtils.setCurrentServer( Dogecoin.getInstance(), serverInfo ); + } + catch (IllegalArgumentException e) { + throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_DATA); + } + catch (Exception e) { + return new ServerConnectionInfo( + serverInfo, + CrossChainUtils.CORE_API_CALL, + true, + false, + System.currentTimeMillis(), + CrossChainUtils.getNotes(e)); + } + } + + @GET @Path("/feekb") @Operation( diff --git a/src/main/java/org/qortal/api/resource/CrossChainLitecoinResource.java b/src/main/java/org/qortal/api/resource/CrossChainLitecoinResource.java index 7667eea1..92519f03 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainLitecoinResource.java +++ b/src/main/java/org/qortal/api/resource/CrossChainLitecoinResource.java @@ -16,8 +16,12 @@ import org.qortal.api.Security; import org.qortal.api.model.crosschain.AddressRequest; import org.qortal.api.model.crosschain.LitecoinSendRequest; import org.qortal.crosschain.AddressInfo; +import org.qortal.crosschain.ChainableServer; +import org.qortal.crosschain.ElectrumX; import org.qortal.crosschain.ForeignBlockchainException; import org.qortal.crosschain.Litecoin; +import org.qortal.crosschain.ServerConnectionInfo; +import org.qortal.crosschain.ServerInfo; import org.qortal.crosschain.SimpleTransaction; import org.qortal.crosschain.ServerConfigurationInfo; @@ -266,6 +270,180 @@ public class CrossChainLitecoinResource { return CrossChainUtils.buildServerConfigurationInfo(Litecoin.getInstance()); } + @GET + @Path("/serverconnectionhistory") + @Operation( + summary = "Returns Litecoin server connection history", + description = "Returns Litecoin server connection history", + responses = { + @ApiResponse( + content = @Content(array = @ArraySchema( schema = @Schema( implementation = ServerConnectionInfo.class ) ) ) + ) + } + ) + public List getServerConnectionHistory() { + + return CrossChainUtils.buildServerConnectionHistory(Litecoin.getInstance()); + } + + @POST + @Path("/addserver") + @Operation( + summary = "Add server to list of Litecoin servers", + description = "Add server to list of Litecoin servers", + requestBody = @RequestBody( + required = true, + content = @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema( + implementation = ServerInfo.class + ) + ) + ), + responses = { + @ApiResponse( + description = "true if removed, false if not found", + content = @Content( + schema = @Schema( + type = "string" + ) + ) + ) + } + + ) + @ApiErrors({ApiError.INVALID_DATA}) + @SecurityRequirement(name = "apiKey") + public String addServer(@HeaderParam(Security.API_KEY_HEADER) String apiKey, ServerInfo serverInfo) { + Security.checkApiCallAllowed(request); + + try { + ElectrumX.Server server = new ElectrumX.Server( + serverInfo.getHostName(), + ChainableServer.ConnectionType.valueOf(serverInfo.getConnectionType()), + serverInfo.getPort() + ); + + if( CrossChainUtils.addServer( Litecoin.getInstance(), server )) { + return "true"; + } + else { + return "false"; + } + } + catch (IllegalArgumentException | NullPointerException e) { + throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_DATA); + } + catch (Exception e) { + return "false"; + } + } + + @POST + @Path("/removeserver") + @Operation( + summary = "Remove server from list of Litecoin servers", + description = "Remove server from list of Litecoin servers", + requestBody = @RequestBody( + required = true, + content = @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema( + implementation = ServerInfo.class + ) + ) + ), + responses = { + @ApiResponse( + description = "true if removed, otherwise", + content = @Content( + schema = @Schema( + type = "string" + ) + ) + ) + } + + ) + @ApiErrors({ApiError.INVALID_DATA}) + @SecurityRequirement(name = "apiKey") + public String removeServer(@HeaderParam(Security.API_KEY_HEADER) String apiKey, ServerInfo serverInfo) { + Security.checkApiCallAllowed(request); + + try { + ElectrumX.Server server = new ElectrumX.Server( + serverInfo.getHostName(), + ChainableServer.ConnectionType.valueOf(serverInfo.getConnectionType()), + serverInfo.getPort() + ); + + if( CrossChainUtils.removeServer( Litecoin.getInstance(), server ) ) { + + return "true"; + } + else { + return "false"; + } + } + catch (IllegalArgumentException | NullPointerException e) { + throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_DATA); + } + catch (Exception e) { + return "false"; + } + } + + @POST + @Path("/setcurrentserver") + @Operation( + summary = "Set current Litecoin server", + description = "Set current Litecoin server", + requestBody = @RequestBody( + required = true, + content = @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema( + implementation = ServerInfo.class + ) + ) + ), + responses = { + @ApiResponse( + description = "connection info", + content = @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema( + implementation = ServerConnectionInfo.class + ) + ) + ) + } + + ) + @ApiErrors({ApiError.INVALID_DATA}) + @SecurityRequirement(name = "apiKey") + public ServerConnectionInfo setCurrentServer(@HeaderParam(Security.API_KEY_HEADER) String apiKey, ServerInfo serverInfo) { + Security.checkApiCallAllowed(request); + + if( serverInfo.getConnectionType() == null || + serverInfo.getHostName() == null) throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_DATA); + try { + return CrossChainUtils.setCurrentServer( Litecoin.getInstance(), serverInfo ); + } + catch (IllegalArgumentException e) { + throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_DATA); + } + catch (Exception e) { + return new ServerConnectionInfo( + serverInfo, + CrossChainUtils.CORE_API_CALL, + true, + false, + System.currentTimeMillis(), + CrossChainUtils.getNotes(e)); + } + } + @POST @Path("/repair") @Operation( diff --git a/src/main/java/org/qortal/api/resource/CrossChainPirateChainResource.java b/src/main/java/org/qortal/api/resource/CrossChainPirateChainResource.java index 03ff43b8..be25b9a3 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainPirateChainResource.java +++ b/src/main/java/org/qortal/api/resource/CrossChainPirateChainResource.java @@ -13,8 +13,12 @@ import org.qortal.api.ApiErrors; import org.qortal.api.ApiExceptionFactory; import org.qortal.api.Security; import org.qortal.api.model.crosschain.PirateChainSendRequest; +import org.qortal.crosschain.ChainableServer; import org.qortal.crosschain.ForeignBlockchainException; import org.qortal.crosschain.PirateChain; +import org.qortal.crosschain.PirateLightClient; +import org.qortal.crosschain.ServerConnectionInfo; +import org.qortal.crosschain.ServerInfo; import org.qortal.crosschain.SimpleTransaction; import org.qortal.crosschain.ServerConfigurationInfo; @@ -352,6 +356,180 @@ public class CrossChainPirateChainResource { return CrossChainUtils.buildServerConfigurationInfo(PirateChain.getInstance()); } + @GET + @Path("/serverconnectionhistory") + @Operation( + summary = "Returns Pirate Chain server connection history", + description = "Returns Pirate Chain server connection history", + responses = { + @ApiResponse( + content = @Content(array = @ArraySchema( schema = @Schema( implementation = ServerConnectionInfo.class ) ) ) + ) + } + ) + public List getServerConnectionHistory() { + + return CrossChainUtils.buildServerConnectionHistory(PirateChain.getInstance()); + } + + @POST + @Path("/addserver") + @Operation( + summary = "Add server to list of Pirate Chain servers", + description = "Add server to list of Pirate Chain servers", + requestBody = @RequestBody( + required = true, + content = @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema( + implementation = ServerInfo.class + ) + ) + ), + responses = { + @ApiResponse( + description = "true if removed, false if not found", + content = @Content( + schema = @Schema( + type = "string" + ) + ) + ) + } + + ) + @ApiErrors({ApiError.INVALID_DATA}) + @SecurityRequirement(name = "apiKey") + public String addServerInfo(@HeaderParam(Security.API_KEY_HEADER) String apiKey, ServerInfo serverInfo) { + Security.checkApiCallAllowed(request); + + try { + PirateLightClient.Server server = new PirateLightClient.Server( + serverInfo.getHostName(), + ChainableServer.ConnectionType.valueOf(serverInfo.getConnectionType()), + serverInfo.getPort() + ); + + if( CrossChainUtils.addServer( PirateChain.getInstance(), server )) { + return "true"; + } + else { + return "false"; + } + } + catch (IllegalArgumentException | NullPointerException e) { + throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_DATA); + } + catch (Exception e) { + return "false"; + } + } + + @POST + @Path("/removeserver") + @Operation( + summary = "Remove server from list of Pirate Chain servers", + description = "Remove server from list of Pirate Chain servers", + requestBody = @RequestBody( + required = true, + content = @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema( + implementation = ServerInfo.class + ) + ) + ), + responses = { + @ApiResponse( + description = "true if removed, otherwise", + content = @Content( + schema = @Schema( + type = "string" + ) + ) + ) + } + + ) + @ApiErrors({ApiError.INVALID_DATA}) + @SecurityRequirement(name = "apiKey") + public String removeServerInfo(@HeaderParam(Security.API_KEY_HEADER) String apiKey, ServerInfo serverInfo) { + Security.checkApiCallAllowed(request); + + try { + PirateLightClient.Server server = new PirateLightClient.Server( + serverInfo.getHostName(), + ChainableServer.ConnectionType.valueOf(serverInfo.getConnectionType()), + serverInfo.getPort() + ); + + if( CrossChainUtils.removeServer( PirateChain.getInstance(), server ) ) { + + return "true"; + } + else { + return "false"; + } + } + catch (IllegalArgumentException | NullPointerException e) { + throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_DATA); + } + catch (Exception e) { + return "false"; + } + } + + @POST + @Path("/setcurrentserver") + @Operation( + summary = "Set current Pirate Chain server", + description = "Set current Pirate Chain server", + requestBody = @RequestBody( + required = true, + content = @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema( + implementation = ServerInfo.class + ) + ) + ), + responses = { + @ApiResponse( + description = "connection info", + content = @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema( + implementation = ServerConnectionInfo.class + ) + ) + ) + } + + ) + @ApiErrors({ApiError.INVALID_DATA}) + @SecurityRequirement(name = "apiKey") + public ServerConnectionInfo setCurrentServerInfo(@HeaderParam(Security.API_KEY_HEADER) String apiKey, ServerInfo serverInfo) { + Security.checkApiCallAllowed(request); + + if( serverInfo.getConnectionType() == null || + serverInfo.getHostName() == null) throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_DATA); + try { + return CrossChainUtils.setCurrentServer( PirateChain.getInstance(), serverInfo ); + } + catch (IllegalArgumentException e) { + throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_DATA); + } + catch (Exception e) { + return new ServerConnectionInfo( + serverInfo, + CrossChainUtils.CORE_API_CALL, + true, + false, + System.currentTimeMillis(), + CrossChainUtils.getNotes(e)); + } + } + @GET @Path("/feekb") @Operation( diff --git a/src/main/java/org/qortal/api/resource/CrossChainRavencoinResource.java b/src/main/java/org/qortal/api/resource/CrossChainRavencoinResource.java index ce5cd668..978345c9 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainRavencoinResource.java +++ b/src/main/java/org/qortal/api/resource/CrossChainRavencoinResource.java @@ -16,8 +16,12 @@ import org.qortal.api.Security; import org.qortal.api.model.crosschain.AddressRequest; import org.qortal.api.model.crosschain.RavencoinSendRequest; import org.qortal.crosschain.AddressInfo; +import org.qortal.crosschain.ChainableServer; +import org.qortal.crosschain.ElectrumX; import org.qortal.crosschain.ForeignBlockchainException; import org.qortal.crosschain.Ravencoin; +import org.qortal.crosschain.ServerConnectionInfo; +import org.qortal.crosschain.ServerInfo; import org.qortal.crosschain.SimpleTransaction; import org.qortal.crosschain.ServerConfigurationInfo; @@ -266,6 +270,181 @@ public class CrossChainRavencoinResource { return CrossChainUtils.buildServerConfigurationInfo(Ravencoin.getInstance()); } + @GET + @Path("/serverconnectionhistory") + @Operation( + summary = "Returns Ravencoin server connection history", + description = "Returns Ravencoin server connection history", + responses = { + @ApiResponse( + content = @Content(array = @ArraySchema( schema = @Schema( implementation = ServerConnectionInfo.class ) ) ) + ) + } + ) + public List getServerConnectionHistory() { + + return CrossChainUtils.buildServerConnectionHistory(Ravencoin.getInstance()); + } + + @POST + @Path("/addserver") + @Operation( + summary = "Add server to list of Ravencoin servers", + description = "Add server to list of Ravencoin servers", + requestBody = @RequestBody( + required = true, + content = @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema( + implementation = ServerInfo.class + ) + ) + ), + responses = { + @ApiResponse( + description = "true if removed, false if not found", + content = @Content( + schema = @Schema( + type = "string" + ) + ) + ) + } + + ) + @ApiErrors({ApiError.INVALID_DATA}) + @SecurityRequirement(name = "apiKey") + public String addServer(@HeaderParam(Security.API_KEY_HEADER) String apiKey, ServerInfo serverInfo) { + Security.checkApiCallAllowed(request); + + try { + ElectrumX.Server server = new ElectrumX.Server( + serverInfo.getHostName(), + ChainableServer.ConnectionType.valueOf(serverInfo.getConnectionType()), + serverInfo.getPort() + ); + + if( CrossChainUtils.addServer( Ravencoin.getInstance(), server )) { + return "true"; + } + else { + return "false"; + } + } + catch (IllegalArgumentException | NullPointerException e) { + throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_DATA); + } + catch (Exception e) { + return "false"; + } + } + + @POST + @Path("/removeserver") + @Operation( + summary = "Remove server from list of Ravencoin servers", + description = "Remove server from list of Ravencoin servers", + requestBody = @RequestBody( + required = true, + content = @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema( + implementation = ServerInfo.class + ) + ) + ), + responses = { + @ApiResponse( + description = "true if removed, otherwise", + content = @Content( + schema = @Schema( + type = "string" + ) + ) + ) + } + + ) + @ApiErrors({ApiError.INVALID_DATA}) + @SecurityRequirement(name = "apiKey") + public String removeServer(@HeaderParam(Security.API_KEY_HEADER) String apiKey, ServerInfo serverInfo) { + Security.checkApiCallAllowed(request); + + try { + ElectrumX.Server server = new ElectrumX.Server( + serverInfo.getHostName(), + ChainableServer.ConnectionType.valueOf(serverInfo.getConnectionType()), + serverInfo.getPort() + ); + + if( CrossChainUtils.removeServer( Ravencoin.getInstance(), server ) ) { + + return "true"; + } + else { + return "false"; + } + } + catch (IllegalArgumentException | NullPointerException e) { + throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_DATA); + } + catch (Exception e) { + return "false"; + } + } + + @POST + @Path("/setcurrentserver") + @Operation( + summary = "Set current Ravencoin server", + description = "Set current Ravencoin server", + requestBody = @RequestBody( + required = true, + content = @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema( + implementation = ServerInfo.class + ) + ) + ), + responses = { + @ApiResponse( + description = "connection info", + content = @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema( + implementation = ServerConnectionInfo.class + ) + ) + ) + } + + ) + @ApiErrors({ApiError.INVALID_DATA}) + @SecurityRequirement(name = "apiKey") + public ServerConnectionInfo setCurrentServer(@HeaderParam(Security.API_KEY_HEADER) String apiKey, ServerInfo serverInfo) { + Security.checkApiCallAllowed(request); + + if( serverInfo.getConnectionType() == null || + serverInfo.getHostName() == null) throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_DATA); + try { + return CrossChainUtils.setCurrentServer( Ravencoin.getInstance(), serverInfo ); + } + catch (IllegalArgumentException e) { + throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_DATA); + } + catch (Exception e) { + return new ServerConnectionInfo( + serverInfo, + CrossChainUtils.CORE_API_CALL, + true, + false, + System.currentTimeMillis(), + CrossChainUtils.getNotes(e)); + } + } + + @GET @Path("/feekb") @Operation( diff --git a/src/main/java/org/qortal/api/resource/CrossChainUtils.java b/src/main/java/org/qortal/api/resource/CrossChainUtils.java index 2c1fabc2..d1453bda 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainUtils.java +++ b/src/main/java/org/qortal/api/resource/CrossChainUtils.java @@ -9,10 +9,7 @@ import org.bitcoinj.script.ScriptBuilder; import org.qortal.crosschain.*; import org.qortal.data.at.ATData; -import org.qortal.data.crosschain.AtomicTransactionData; -import org.qortal.data.crosschain.CrossChainTradeData; -import org.qortal.data.crosschain.TradeBotData; -import org.qortal.data.crosschain.TransactionSummary; +import org.qortal.data.crosschain.*; import org.qortal.repository.DataException; import org.qortal.repository.Repository; @@ -22,6 +19,7 @@ import java.util.stream.Collectors; public class CrossChainUtils { private static final Logger LOGGER = LogManager.getLogger(CrossChainUtils.class); + public static final String CORE_API_CALL = "Core API Call"; public static ServerConfigurationInfo buildServerConfigurationInfo(Bitcoiny blockchain) { @@ -184,6 +182,74 @@ public class CrossChainUtils { return summaries; } + /** + * Add Server + * + * Add foreign blockchain server to list of candidates. + * + * @param bitcoiny the foreign blockchain + * @param server the server + * + * @return true if the add was successful, otherwise false + */ + public static boolean addServer(Bitcoiny bitcoiny, ChainableServer server) { + + return bitcoiny.getBlockchainProvider().addServer(server); + } + + /** + * Remove Server + * + * Remove foreign blockchain server from list of candidates. + * + * @param bitcoiny the foreign blockchain + * @param server the server + * + * @return true if the removal was successful, otherwise false + */ + public static boolean removeServer(Bitcoiny bitcoiny, ChainableServer server){ + + return bitcoiny.getBlockchainProvider().removeServer(server); + } + + /** + * Set Current Server + * + * Set the server to use the intended foreign blockchain. + * + * @param bitcoiny the foreign blockchain + * @param serverInfo the server configuration information + * + * @return the server connection information + */ + public static ServerConnectionInfo setCurrentServer(Bitcoiny bitcoiny, ServerInfo serverInfo) throws ForeignBlockchainException { + + final BitcoinyBlockchainProvider blockchainProvider = bitcoiny.getBlockchainProvider(); + + ChainableServer server = blockchainProvider.getServer( + serverInfo.getHostName(), + ChainableServer.ConnectionType.valueOf(serverInfo.getConnectionType()), + serverInfo.getPort() + ); + + ChainableServerConnection connection = blockchainProvider.setCurrentServer(server, CORE_API_CALL).get(); + + return new ServerConnectionInfo( + new ServerInfo( + 0, + serverInfo.getHostName(), + serverInfo.getPort(), + serverInfo.getConnectionType(), + connection.isSuccess() + ), + CORE_API_CALL, + true, + connection.isSuccess() , + System.currentTimeMillis(), + connection.getNotes() + ); + } + /** * Get P2Sh From Trade Bot * @@ -423,4 +489,60 @@ public class CrossChainUtils { } return totalInputOut; } + + /** + * Get Notes + * + * Build notes from an exception thrown. + * + * @param e the exception + * + * @return the exception message or the exception class name + */ + public static String getNotes(Exception e) { + return e.getMessage() + " (" + e.getClass().getSimpleName() + ")"; + } + + /** + * Build Server Connection History + * + * @param bitcoiny the foreign blockchain + * + * @return the history of connections from latest to first + */ + public static List buildServerConnectionHistory(Bitcoiny bitcoiny) { + + return bitcoiny.getBlockchainProvider().getServerConnections().stream() + .sorted(Comparator.comparing(ChainableServerConnection::getCurrentTimeMillis).reversed()) + .map( + connection -> new ServerConnectionInfo( + serverToServerInfo( connection.getServer()), + connection.getRequestedBy(), + connection.isOpen(), + connection.isSuccess(), + connection.getCurrentTimeMillis(), + connection.getNotes() + ) + ) + .collect(Collectors.toList()); + } + + /** + * Server To Server Info + * + * Make a server info object from a server object. + * + * @param server the server + * + * @return the server info + */ + private static ServerInfo serverToServerInfo(ChainableServer server) { + + return new ServerInfo( + 0, + server.getHostName(), + server.getPort(), + server.getConnectionType().toString(), + false); + } } \ No newline at end of file diff --git a/src/main/java/org/qortal/crosschain/BitcoinyBlockchainProvider.java b/src/main/java/org/qortal/crosschain/BitcoinyBlockchainProvider.java index 238eff38..1b14a474 100644 --- a/src/main/java/org/qortal/crosschain/BitcoinyBlockchainProvider.java +++ b/src/main/java/org/qortal/crosschain/BitcoinyBlockchainProvider.java @@ -3,12 +3,14 @@ package org.qortal.crosschain; import cash.z.wallet.sdk.rpc.CompactFormats.CompactBlock; import java.util.List; +import java.util.Optional; import java.util.Set; public abstract class BitcoinyBlockchainProvider { public static final boolean INCLUDE_UNCONFIRMED = true; public static final boolean EXCLUDE_UNCONFIRMED = false; + public static final String EMPTY = ""; /** Sets the blockchain using this provider instance */ public abstract void setBlockchain(Bitcoiny blockchain); @@ -67,4 +69,62 @@ public abstract class BitcoinyBlockchainProvider { public abstract Set getUselessServers(); public abstract ChainableServer getCurrentServer(); + + /** + * Add Server + * + * Add server to list of candidate servers. + * + * @param server the server + * + * @return true if added, otherwise false + */ + public abstract boolean addServer( ChainableServer server ); + + /** + * Remove Server + * + * Remove server from list of candidate servers. + * + * @param server the server + * + * @return true if removed, otherwise false + */ + public abstract boolean removeServer( ChainableServer server ); + + /** + * Set Current Server + * + * Set server to be used for this foreign blockchain. + * + * @param server the server + * @param requestedBy who requested this setting + * + * @return the connection that was made + * + * @throws ForeignBlockchainException + */ + public abstract Optional setCurrentServer(ChainableServer server, String requestedBy) throws ForeignBlockchainException; + + /** + * Get Server Connections + * + * Get the server connections made to this foreign blockchain, + * + * @return the server connections + */ + public abstract List getServerConnections(); + + /** + * Get Server + * + * Get a server for this foreign blockchain. + * + * @param hostName the host URL + * @param type the type of connection (TCP, SSL) + * @param port the port + * + * @return the server + */ + public abstract ChainableServer getServer(String hostName, ChainableServer.ConnectionType type, int port); } diff --git a/src/main/java/org/qortal/crosschain/ChainableServerConnection.java b/src/main/java/org/qortal/crosschain/ChainableServerConnection.java new file mode 100644 index 00000000..e680061a --- /dev/null +++ b/src/main/java/org/qortal/crosschain/ChainableServerConnection.java @@ -0,0 +1,71 @@ +package org.qortal.crosschain; + +import java.util.Objects; + +public class ChainableServerConnection { + + private ChainableServer server; + private String requestedBy; + private boolean open; + private boolean success; + private long currentTimeMillis; + private String notes; + + public ChainableServerConnection(ChainableServer server, String requestedBy, boolean open, boolean success, long currentTimeMillis, String notes) { + this.server = server; + this.requestedBy = requestedBy; + this.open = open; + this.success = success; + this.currentTimeMillis = currentTimeMillis; + this.notes = notes; + } + + public ChainableServer getServer() { + return server; + } + + public String getRequestedBy() { + return requestedBy; + } + + public boolean isOpen() { + return open; + } + + public boolean isSuccess() { + return success; + } + + public long getCurrentTimeMillis() { + return currentTimeMillis; + } + + public String getNotes() { + return notes; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ChainableServerConnection that = (ChainableServerConnection) o; + return currentTimeMillis == that.currentTimeMillis && Objects.equals(server, that.server); + } + + @Override + public int hashCode() { + return Objects.hash(server, currentTimeMillis); + } + + @Override + public String toString() { + return "ChainableServerConnection{" + + "server=" + server + + ", requestedBy='" + requestedBy + '\'' + + ", open=" + open + + ", success=" + success + + ", currentTimeMillis=" + currentTimeMillis + + ", notes='" + notes + '\'' + + '}'; + } +} diff --git a/src/main/java/org/qortal/crosschain/ChainableServerConnectionRecorder.java b/src/main/java/org/qortal/crosschain/ChainableServerConnectionRecorder.java new file mode 100644 index 00000000..aa26338f --- /dev/null +++ b/src/main/java/org/qortal/crosschain/ChainableServerConnectionRecorder.java @@ -0,0 +1,45 @@ +package org.qortal.crosschain; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +public class ChainableServerConnectionRecorder { + + private List connections; + private int limit; + + public ChainableServerConnectionRecorder(int limit) { + this.connections = new ArrayList<>(limit); + this.limit = limit; + } + + public ChainableServerConnection recordConnection( + ChainableServer server, String requestedBy, boolean open, boolean success, String notes) { + + ChainableServerConnection connection + = new ChainableServerConnection(server, requestedBy, open, success, System.currentTimeMillis(), notes); + + connections.add(connection); + + if( connections.size() > limit) { + ChainableServerConnection firstConnection + = connections.stream().sorted(Comparator.comparing(ChainableServerConnection::getCurrentTimeMillis)) + .findFirst().get(); + connections.remove(firstConnection); + } + return connection; + } + + public int getLimit() { + return limit; + } + + public void setLimit(int limit) { + this.limit = limit; + } + + public List getConnections() { + return this.connections; + } +} diff --git a/src/main/java/org/qortal/crosschain/ElectrumX.java b/src/main/java/org/qortal/crosschain/ElectrumX.java index 27e140e2..ad211c03 100644 --- a/src/main/java/org/qortal/crosschain/ElectrumX.java +++ b/src/main/java/org/qortal/crosschain/ElectrumX.java @@ -8,6 +8,7 @@ import org.apache.logging.log4j.Logger; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.JSONValue; +import org.qortal.api.resource.CrossChainUtils; import org.qortal.crypto.Crypto; import org.qortal.crypto.TrustlessSSLSocketFactory; import org.qortal.utils.BitTwiddling; @@ -26,6 +27,7 @@ import java.util.regex.Pattern; /** ElectrumX network support for querying Bitcoiny-related info like block headers, transaction outputs, etc. */ public class ElectrumX extends BitcoinyBlockchainProvider { + public static final String NULL_RESPONSE_FROM_ELECTRUM_X_SERVER = "Null response from ElectrumX server"; private static final Logger LOGGER = LogManager.getLogger(ElectrumX.class); private static final Random RANDOM = new Random(); @@ -44,6 +46,10 @@ public class ElectrumX extends BitcoinyBlockchainProvider { private static final int RESPONSE_TIME_READINGS = 5; private static final long MAX_AVG_RESPONSE_TIME = 2000L; // ms + public static final String MINIMUM_VERSION_ERROR = "MINIMUM VERSION ERROR"; + public static final String EXPECTED_GENESIS_ERROR = "EXPECTED GENESIS ERROR"; + + private ChainableServerConnectionRecorder recorder = new ChainableServerConnectionRecorder(100); public static class Server implements ChainableServer { String hostname; @@ -421,7 +427,7 @@ public class ElectrumX extends BitcoinyBlockchainProvider { Server uselessServer = (Server) e.getServer(); LOGGER.trace(() -> String.format("Server %s doesn't support verbose transactions - barring use of that server", uselessServer)); this.uselessServers.add(uselessServer); - this.closeServer(uselessServer); + this.closeServer(uselessServer, this.getClass().getSimpleName(), CrossChainUtils.getNotes(e)); continue; } @@ -495,12 +501,13 @@ public class ElectrumX extends BitcoinyBlockchainProvider { // Update: it turns out that they were just using a different key - "address" instead of "addresses" // The code below can remain in place, just in case a peer returns a missing address in the future if (addresses == null || addresses.isEmpty()) { + final String message = String.format("No output addresses returned for transaction %s", txHash); if (this.currentServer != null) { this.uselessServers.add(this.currentServer); - this.closeServer(this.currentServer); + this.closeServer(this.currentServer, this.getClass().getSimpleName(), message); } LOGGER.info("No output addresses returned for transaction {}", txHash); - throw new ForeignBlockchainException(String.format("No output addresses returned for transaction %s", txHash)); + throw new ForeignBlockchainException(message); } outputs.add(new BitcoinyTransaction.Output(scriptPubKey, value, addresses)); @@ -654,8 +661,9 @@ public class ElectrumX extends BitcoinyBlockchainProvider { if (!this.remainingServers.isEmpty()) { long averageResponseTime = this.currentServer.averageResponseTime(); if (averageResponseTime > MAX_AVG_RESPONSE_TIME) { - LOGGER.info("Slow average response time {}ms from {} - trying another server...", averageResponseTime, this.currentServer.getHostName()); - this.closeServer(); + String message = String.format("Slow average response time %dms from %s - trying another server...", averageResponseTime, this.currentServer.getHostName()); + LOGGER.info(message); + this.closeServer(this.getClass().getSimpleName(), message); break; } } @@ -663,8 +671,9 @@ public class ElectrumX extends BitcoinyBlockchainProvider { if (response != null) return response; + LOGGER.info(NULL_RESPONSE_FROM_ELECTRUM_X_SERVER); // Didn't work, try another server... - this.closeServer(); + this.closeServer(this.getClass().getSimpleName(), NULL_RESPONSE_FROM_ELECTRUM_X_SERVER); } // Failed to perform RPC - maybe lack of servers? @@ -680,56 +689,61 @@ public class ElectrumX extends BitcoinyBlockchainProvider { while (!this.remainingServers.isEmpty()) { ChainableServer server = this.remainingServers.remove(RANDOM.nextInt(this.remainingServers.size())); - LOGGER.trace(() -> String.format("Connecting to %s", server)); - - try { - SocketAddress endpoint = new InetSocketAddress(server.getHostName(), server.getPort()); - int timeout = 5000; // ms - - this.socket = new Socket(); - this.socket.connect(endpoint, timeout); - this.socket.setTcpNoDelay(true); - - if (server.getConnectionType() == Server.ConnectionType.SSL) { - SSLSocketFactory factory = TrustlessSSLSocketFactory.getSocketFactory(); - this.socket = factory.createSocket(this.socket, server.getHostName(), server.getPort(), true); - } - - this.scanner = new Scanner(this.socket.getInputStream()); - this.scanner.useDelimiter("\n"); - - // All connections need to start with a version negotiation - this.connectedRpc("server.version"); - - // Check connection is suitable by asking for server features, including genesis block hash - JSONObject featuresJson = (JSONObject) this.connectedRpc("server.features"); - - if (featuresJson == null || Double.valueOf((String) featuresJson.get("protocol_min")) < MIN_PROTOCOL_VERSION) - continue; - - if (this.expectedGenesisHash != null && !((String) featuresJson.get("genesis_hash")).equals(this.expectedGenesisHash)) - continue; - - // Ask for more servers - Set moreServers = serverPeersSubscribe(); - // Discard duplicate servers we already know - moreServers.removeAll(this.servers); - // Add to both lists - this.remainingServers.addAll(moreServers); - this.servers.addAll(moreServers); - - LOGGER.debug(() -> String.format("Connected to %s", server)); - this.currentServer = server; - return true; - } catch (IOException | ForeignBlockchainException | ClassCastException | NullPointerException e) { - // Didn't work, try another server... - closeServer(); - } + Optional chainableServerConnection = makeConnection(server, this.getClass().getSimpleName()); + if(chainableServerConnection.isPresent() && chainableServerConnection.get().isSuccess() ) return true; } return false; } + private Optional makeConnection(ChainableServer server, String requestedBy) { + LOGGER.info(() -> String.format("Connecting to %s", server)); + + try { + SocketAddress endpoint = new InetSocketAddress(server.getHostName(), server.getPort()); + int timeout = 5000; // ms + + this.socket = new Socket(); + this.socket.connect(endpoint, timeout); + this.socket.setTcpNoDelay(true); + + if (server.getConnectionType() == Server.ConnectionType.SSL) { + SSLSocketFactory factory = TrustlessSSLSocketFactory.getSocketFactory(); + this.socket = factory.createSocket(this.socket, server.getHostName(), server.getPort(), true); + } + + this.scanner = new Scanner(this.socket.getInputStream()); + this.scanner.useDelimiter("\n"); + + // All connections need to start with a version negotiation + this.connectedRpc("server.version"); + + // Check connection is suitable by asking for server features, including genesis block hash + JSONObject featuresJson = (JSONObject) this.connectedRpc("server.features"); + + if (featuresJson == null || Double.valueOf((String) featuresJson.get("protocol_min")) < MIN_PROTOCOL_VERSION) + return Optional.of( recorder.recordConnection(server, requestedBy, true, false, MINIMUM_VERSION_ERROR) ); + + if (this.expectedGenesisHash != null && !((String) featuresJson.get("genesis_hash")).equals(this.expectedGenesisHash)) + return Optional.of( recorder.recordConnection(server, requestedBy, true, false, EXPECTED_GENESIS_ERROR) ); + + // Ask for more servers + Set moreServers = serverPeersSubscribe(); + // Discard duplicate servers we already know + moreServers.removeAll(this.servers); + // Add to both lists + this.remainingServers.addAll(moreServers); + this.servers.addAll(moreServers); + + LOGGER.info(() -> String.format("Connected to %s", server)); + this.currentServer = server; + return Optional.of( this.recorder.recordConnection( server, requestedBy, true, true, EMPTY) ); + } catch (IOException | ForeignBlockchainException | ClassCastException | NullPointerException e) { + // Didn't work, try another server... + return Optional.of( this.recorder.recordConnection( server, requestedBy, true, false, CrossChainUtils.getNotes(e))); + } + } + /** * Perform RPC using currently connected server. *

@@ -846,12 +860,19 @@ public class ElectrumX extends BitcoinyBlockchainProvider { /** * Closes connection to server if it is currently connected server. + * * @param server + * @param notes */ - private void closeServer(ChainableServer server) { + private Optional closeServer(ChainableServer server, String requestedBy, String notes) { + + ChainableServerConnection chainableServerConnection; + synchronized (this.serverLock) { if (this.currentServer == null || !this.currentServer.equals(server)) - return; + return Optional.empty(); + + chainableServerConnection = this.recorder.recordConnection(server, requestedBy, false, true, notes); if (this.socket != null && !this.socket.isClosed()) try { @@ -864,12 +885,14 @@ public class ElectrumX extends BitcoinyBlockchainProvider { this.scanner = null; this.currentServer = null; } + + return Optional.of( chainableServerConnection ); } /** Closes connection to currently connected server (if any). */ - private void closeServer() { + private Optional closeServer(String requestedBy, String notes) { synchronized (this.serverLock) { - this.closeServer(this.currentServer); + return this.closeServer(this.currentServer, requestedBy, notes); } } @@ -893,4 +916,32 @@ public class ElectrumX extends BitcoinyBlockchainProvider { public ChainableServer getCurrentServer() { return currentServer; } + + @Override + public boolean addServer(ChainableServer server) { + return this.servers.add(server); + } + + @Override + public boolean removeServer(ChainableServer server) { + boolean removedServer = this.servers.remove(server); + boolean removedRemaining = this.remainingServers.remove(server); + + return removedServer || removedRemaining; + } + + @Override + public Optional setCurrentServer(ChainableServer server, String requestedBy) { + return this.makeConnection(server, requestedBy); + } + + @Override + public List getServerConnections() { + return this.recorder.getConnections(); + } + + @Override + public ChainableServer getServer(String hostName, ChainableServer.ConnectionType type, int port) { + return new ElectrumX.Server(hostName, type, port); + } } diff --git a/src/main/java/org/qortal/crosschain/PirateLightClient.java b/src/main/java/org/qortal/crosschain/PirateLightClient.java index ae7c3cc1..4bb94ecb 100644 --- a/src/main/java/org/qortal/crosschain/PirateLightClient.java +++ b/src/main/java/org/qortal/crosschain/PirateLightClient.java @@ -14,6 +14,7 @@ import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; +import org.qortal.api.resource.CrossChainUtils; import org.qortal.settings.Settings; import org.qortal.transform.TransformationException; @@ -127,6 +128,8 @@ public class PirateLightClient extends BitcoinyBlockchainProvider { } }); + private ChainableServerConnectionRecorder recorder = new ChainableServerConnectionRecorder(100); + // Constructors public PirateLightClient(String netId, String genesisHash, Collection initialServerList, Map defaultPorts) { @@ -443,12 +446,13 @@ public class PirateLightClient extends BitcoinyBlockchainProvider { // Update: it turns out that they were just using a different key - "address" instead of "addresses" // The code below can remain in place, just in case a peer returns a missing address in the future if (addresses == null || addresses.isEmpty()) { + final String message = String.format("No output addresses returned for transaction %s", txHash); if (this.currentServer != null) { this.uselessServers.add(this.currentServer); - this.closeServer(this.currentServer); + this.closeServer(this.currentServer, message, this.getClass().getSimpleName()); } - LOGGER.info("No output addresses returned for transaction {}", txHash); - throw new ForeignBlockchainException(String.format("No output addresses returned for transaction %s", txHash)); + LOGGER.info(message); + throw new ForeignBlockchainException(message); } outputs.add(new BitcoinyTransaction.Output(scriptPubKey, value, addresses)); @@ -557,6 +561,42 @@ public class PirateLightClient extends BitcoinyBlockchainProvider { @Override public ChainableServer getCurrentServer() { return this.currentServer; } + @Override + public boolean addServer(ChainableServer server) { + return this.servers.add(server); + } + + @Override + public boolean removeServer(ChainableServer server) { + boolean removedServer = this.servers.remove(server); + boolean removedRemaining = this.remainingServers.remove(server); + + return removedServer || removedRemaining; + } + + @Override + public Optional setCurrentServer(ChainableServer server, String requestedBy) throws ForeignBlockchainException { + + closeServer( requestedBy, "Connecting to different server by request." ); + Optional connection = makeConnection(server, requestedBy); + + if( !connection.isPresent() || !connection.get().isSuccess() ) { + haveConnection(); + } + + return connection; + } + + @Override + public List getServerConnections() { + return this.recorder.getConnections(); + } + + @Override + public ChainableServer getServer(String hostName, ChainableServer.ConnectionType type, int port) { + return new PirateLightClient.Server(hostName, type, port); + } + // Class-private utility methods @@ -576,8 +616,9 @@ public class PirateLightClient extends BitcoinyBlockchainProvider { if (!this.remainingServers.isEmpty()) { long averageResponseTime = this.currentServer.averageResponseTime(); if (averageResponseTime > MAX_AVG_RESPONSE_TIME) { - LOGGER.info("Slow average response time {}ms from {} - trying another server...", averageResponseTime, this.currentServer.getHostName()); - this.closeServer(); + String message = String.format("Slow average response time %dms from %s - trying another server...", averageResponseTime, this.currentServer.getHostName()); + LOGGER.info(message); + this.closeServer(this.getClass().getSimpleName(), message); continue; } } @@ -601,18 +642,27 @@ public class PirateLightClient extends BitcoinyBlockchainProvider { while (!this.remainingServers.isEmpty()) { ChainableServer server = this.remainingServers.remove(RANDOM.nextInt(this.remainingServers.size())); - LOGGER.trace(() -> String.format("Connecting to %s", server)); - try { - this.channel = ManagedChannelBuilder.forAddress(server.getHostName(), server.getPort()).build(); + Optional chainableServerConnection = makeConnection(server, this.getClass().getSimpleName()); + if( chainableServerConnection.isPresent() && chainableServerConnection.get().isSuccess() ) return true; + } - CompactTxStreamerGrpc.CompactTxStreamerBlockingStub stub = CompactTxStreamerGrpc.newBlockingStub(this.channel); - LightdInfo lightdInfo = stub.getLightdInfo(Empty.newBuilder().build()); + return false; + } - if (lightdInfo == null || lightdInfo.getBlockHeight() <= 0) - continue; + private Optional makeConnection(ChainableServer server, String requestedBy) { + LOGGER.info(() -> String.format("Connecting to %s", server)); - // TODO: find a way to verify that the server is using the expected chain + try { + this.channel = ManagedChannelBuilder.forAddress(server.getHostName(), server.getPort()).build(); + + CompactTxStreamerGrpc.CompactTxStreamerBlockingStub stub = CompactTxStreamerGrpc.newBlockingStub(this.channel); + LightdInfo lightdInfo = stub.getLightdInfo(Empty.newBuilder().build()); + + if (lightdInfo == null || lightdInfo.getBlockHeight() <= 0) + return Optional.of( this.recorder.recordConnection(server, requestedBy,true, false, "lightd info issues") ); + + // TODO: find a way to verify that the server is using the expected chain // if (featuresJson == null || Double.valueOf((String) featuresJson.get("protocol_min")) < MIN_PROTOCOL_VERSION) // continue; @@ -620,28 +670,31 @@ public class PirateLightClient extends BitcoinyBlockchainProvider { // if (this.expectedGenesisHash != null && !((String) featuresJson.get("genesis_hash")).equals(this.expectedGenesisHash)) // continue; - LOGGER.debug(() -> String.format("Connected to %s", server)); - this.currentServer = server; - return true; - } catch (Exception e) { - // Didn't work, try another server... - closeServer(); - } + LOGGER.info(() -> String.format("Connected to %s", server)); + this.currentServer = server; + return Optional.of( this.recorder.recordConnection(server, requestedBy,true, true, EMPTY) ); + } catch (Exception e) { + // Didn't work, try another server... + return Optional.of( this.recorder.recordConnection( server, requestedBy, true, false, CrossChainUtils.getNotes(e))); } - - return false; } - /** * Closes connection to server if it is currently connected server. + * * @param server + * @param requestedBy */ - private void closeServer(ChainableServer server) { + private Optional closeServer(ChainableServer server, String notes, String requestedBy) { + + final ChainableServerConnection connection; + synchronized (this.serverLock) { if (this.currentServer == null || !this.currentServer.equals(server) || this.channel == null) { - return; + return Optional.empty(); } + connection = this.recorder.recordConnection(server, requestedBy, false, true, notes); + // Close the gRPC managed-channel if not shut down already. if (!this.channel.isShutdown()) { try { @@ -669,12 +722,14 @@ public class PirateLightClient extends BitcoinyBlockchainProvider { this.channel = null; this.currentServer = null; } + + return Optional.of( connection ); } /** Closes connection to currently connected server (if any). */ - private void closeServer() { + private Optional closeServer(String requestedBy, String notes) { synchronized (this.serverLock) { - this.closeServer(this.currentServer); + return this.closeServer(this.currentServer, notes, requestedBy); } } diff --git a/src/main/java/org/qortal/crosschain/ServerConnectionInfo.java b/src/main/java/org/qortal/crosschain/ServerConnectionInfo.java new file mode 100644 index 00000000..c4829399 --- /dev/null +++ b/src/main/java/org/qortal/crosschain/ServerConnectionInfo.java @@ -0,0 +1,82 @@ +package org.qortal.crosschain; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import java.util.Objects; + +@XmlAccessorType(XmlAccessType.FIELD) +public class ServerConnectionInfo { + + private ServerInfo serverInfo; + + private String requestedBy; + + private boolean open; + + private boolean success; + + private long timeInMillis; + + private String notes; + + public ServerConnectionInfo() { + } + + public ServerConnectionInfo(ServerInfo serverInfo, String requestedBy, boolean open, boolean success, long timeInMillis, String notes) { + this.serverInfo = serverInfo; + this.requestedBy = requestedBy; + this.open = open; + this.success = success; + this.timeInMillis = timeInMillis; + this.notes = notes; + } + + public ServerInfo getServerInfo() { + return serverInfo; + } + + public String getRequestedBy() { + return requestedBy; + } + + public boolean isOpen() { + return open; + } + + public boolean isSuccess() { + return success; + } + + public long getTimeInMillis() { + return timeInMillis; + } + + public String getNotes() { + return notes; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ServerConnectionInfo that = (ServerConnectionInfo) o; + return timeInMillis == that.timeInMillis && Objects.equals(serverInfo, that.serverInfo); + } + + @Override + public int hashCode() { + return Objects.hash(serverInfo, timeInMillis); + } + + @Override + public String toString() { + return "ServerConnectionInfo{" + + "serverInfo=" + serverInfo + + ", requestedBy='" + requestedBy + '\'' + + ", open=" + open + + ", success=" + success + + ", timeInMillis=" + timeInMillis + + ", notes='" + notes + '\'' + + '}'; + } +} From f916d3581b58f0e66d6e6b97ea04e073d3fabcf9 Mon Sep 17 00:00:00 2001 From: kennycud Date: Mon, 27 May 2024 10:10:45 -0700 Subject: [PATCH 05/30] Corrected incorrect language in the comments. This was copied and pasted 6 times. --- .../java/org/qortal/api/resource/CrossChainBitcoinResource.java | 2 +- .../org/qortal/api/resource/CrossChainDigibyteResource.java | 2 +- .../org/qortal/api/resource/CrossChainDogecoinResource.java | 2 +- .../org/qortal/api/resource/CrossChainLitecoinResource.java | 2 +- .../org/qortal/api/resource/CrossChainPirateChainResource.java | 2 +- .../org/qortal/api/resource/CrossChainRavencoinResource.java | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/qortal/api/resource/CrossChainBitcoinResource.java b/src/main/java/org/qortal/api/resource/CrossChainBitcoinResource.java index 9fc1cafe..1c56c4c7 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainBitcoinResource.java +++ b/src/main/java/org/qortal/api/resource/CrossChainBitcoinResource.java @@ -303,7 +303,7 @@ public class CrossChainBitcoinResource { ), responses = { @ApiResponse( - description = "true if removed, false if not found", + description = "true if added, false if not added", content = @Content( schema = @Schema( type = "string" diff --git a/src/main/java/org/qortal/api/resource/CrossChainDigibyteResource.java b/src/main/java/org/qortal/api/resource/CrossChainDigibyteResource.java index f69007f9..72b10096 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainDigibyteResource.java +++ b/src/main/java/org/qortal/api/resource/CrossChainDigibyteResource.java @@ -302,7 +302,7 @@ public class CrossChainDigibyteResource { ), responses = { @ApiResponse( - description = "true if removed, false if not found", + description = "true if added, false if not added", content = @Content( schema = @Schema( type = "string" diff --git a/src/main/java/org/qortal/api/resource/CrossChainDogecoinResource.java b/src/main/java/org/qortal/api/resource/CrossChainDogecoinResource.java index 4bb6e102..4aa82e2b 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainDogecoinResource.java +++ b/src/main/java/org/qortal/api/resource/CrossChainDogecoinResource.java @@ -302,7 +302,7 @@ public class CrossChainDogecoinResource { ), responses = { @ApiResponse( - description = "true if removed, false if not found", + description = "true if added, false if not added", content = @Content( schema = @Schema( type = "string" diff --git a/src/main/java/org/qortal/api/resource/CrossChainLitecoinResource.java b/src/main/java/org/qortal/api/resource/CrossChainLitecoinResource.java index 92519f03..5b9e29d2 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainLitecoinResource.java +++ b/src/main/java/org/qortal/api/resource/CrossChainLitecoinResource.java @@ -302,7 +302,7 @@ public class CrossChainLitecoinResource { ), responses = { @ApiResponse( - description = "true if removed, false if not found", + description = "true if added, false if not added", content = @Content( schema = @Schema( type = "string" diff --git a/src/main/java/org/qortal/api/resource/CrossChainPirateChainResource.java b/src/main/java/org/qortal/api/resource/CrossChainPirateChainResource.java index be25b9a3..c6378f0b 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainPirateChainResource.java +++ b/src/main/java/org/qortal/api/resource/CrossChainPirateChainResource.java @@ -388,7 +388,7 @@ public class CrossChainPirateChainResource { ), responses = { @ApiResponse( - description = "true if removed, false if not found", + description = "true if added, false if not added", content = @Content( schema = @Schema( type = "string" diff --git a/src/main/java/org/qortal/api/resource/CrossChainRavencoinResource.java b/src/main/java/org/qortal/api/resource/CrossChainRavencoinResource.java index 978345c9..c06122a9 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainRavencoinResource.java +++ b/src/main/java/org/qortal/api/resource/CrossChainRavencoinResource.java @@ -302,7 +302,7 @@ public class CrossChainRavencoinResource { ), responses = { @ApiResponse( - description = "true if removed, false if not found", + description = "true if added, false if not added", content = @Content( schema = @Schema( type = "string" From ef07a444d6b5832aff64ffad142463388b47fa1f Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Sat, 29 Jun 2024 11:49:19 +0200 Subject: [PATCH 06/30] Removed unnecessary imports --- .../org/qortal/api/resource/CrossChainBitcoinResource.java | 1 - src/main/java/org/qortal/gui/SysTray.java | 4 ---- src/test/java/org/qortal/test/at/CrowdfundTests.java | 1 - src/test/java/org/qortal/test/crosschain/BitcoinTests.java | 2 -- .../java/org/qortal/test/crosschain/PirateChainTests.java | 1 - 5 files changed, 9 deletions(-) diff --git a/src/main/java/org/qortal/api/resource/CrossChainBitcoinResource.java b/src/main/java/org/qortal/api/resource/CrossChainBitcoinResource.java index 1c56c4c7..3720a0b5 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainBitcoinResource.java +++ b/src/main/java/org/qortal/api/resource/CrossChainBitcoinResource.java @@ -8,7 +8,6 @@ import io.swagger.v3.oas.annotations.parameters.RequestBody; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; -import org.bitcoinj.core.Coin; import org.bitcoinj.core.Transaction; import org.qortal.api.ApiError; import org.qortal.api.ApiErrors; diff --git a/src/main/java/org/qortal/gui/SysTray.java b/src/main/java/org/qortal/gui/SysTray.java index 74a68618..67c68839 100644 --- a/src/main/java/org/qortal/gui/SysTray.java +++ b/src/main/java/org/qortal/gui/SysTray.java @@ -4,7 +4,6 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.qortal.controller.Controller; import org.qortal.globalization.Translator; -import org.qortal.settings.Settings; import org.qortal.utils.URLViewer; import javax.swing.*; @@ -17,14 +16,11 @@ import java.awt.event.WindowEvent; import java.awt.event.WindowFocusListener; import java.io.IOException; import java.io.InputStream; -import java.net.InetSocketAddress; import java.net.URL; -import java.nio.channels.SocketChannel; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; diff --git a/src/test/java/org/qortal/test/at/CrowdfundTests.java b/src/test/java/org/qortal/test/at/CrowdfundTests.java index 6a60c1ab..1964be64 100644 --- a/src/test/java/org/qortal/test/at/CrowdfundTests.java +++ b/src/test/java/org/qortal/test/at/CrowdfundTests.java @@ -7,7 +7,6 @@ import org.junit.Test; import org.qortal.account.Account; import org.qortal.account.PrivateKeyAccount; import org.qortal.asset.Asset; -import org.qortal.at.AT; import org.qortal.block.Block; import org.qortal.data.at.ATData; import org.qortal.data.at.ATStateData; diff --git a/src/test/java/org/qortal/test/crosschain/BitcoinTests.java b/src/test/java/org/qortal/test/crosschain/BitcoinTests.java index 8c41d2d2..9de5e037 100644 --- a/src/test/java/org/qortal/test/crosschain/BitcoinTests.java +++ b/src/test/java/org/qortal/test/crosschain/BitcoinTests.java @@ -1,7 +1,5 @@ package org.qortal.test.crosschain; -import org.junit.Ignore; -import org.junit.Test; import org.qortal.crosschain.Bitcoin; import org.qortal.crosschain.Bitcoiny; diff --git a/src/test/java/org/qortal/test/crosschain/PirateChainTests.java b/src/test/java/org/qortal/test/crosschain/PirateChainTests.java index 01b9449b..1e0bd876 100644 --- a/src/test/java/org/qortal/test/crosschain/PirateChainTests.java +++ b/src/test/java/org/qortal/test/crosschain/PirateChainTests.java @@ -11,7 +11,6 @@ import org.qortal.crypto.Crypto; import org.qortal.transform.TransformationException; import java.util.List; -import java.util.Set; import static org.junit.Assert.*; import static org.qortal.crosschain.BitcoinyHTLC.Status.*; From 95d42db773f96e705231557ea2f33864fa4439cb Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Sat, 29 Jun 2024 11:52:22 +0200 Subject: [PATCH 07/30] Removed unnecessary semicolons --- src/main/java/org/qortal/api/SearchMode.java | 2 +- src/main/java/org/qortal/api/model/ConnectedPeer.java | 2 +- .../java/org/qortal/api/resource/TransactionsResource.java | 4 ++-- src/main/java/org/qortal/controller/RestartNode.java | 2 +- src/main/java/org/qortal/controller/Synchronizer.java | 4 ++-- .../org/qortal/data/transaction/ArbitraryTransactionData.java | 4 ++-- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/qortal/api/SearchMode.java b/src/main/java/org/qortal/api/SearchMode.java index 85c1c61a..e095b8b7 100644 --- a/src/main/java/org/qortal/api/SearchMode.java +++ b/src/main/java/org/qortal/api/SearchMode.java @@ -2,5 +2,5 @@ package org.qortal.api; public enum SearchMode { LATEST, - ALL; + ALL } diff --git a/src/main/java/org/qortal/api/model/ConnectedPeer.java b/src/main/java/org/qortal/api/model/ConnectedPeer.java index c4198654..996b373f 100644 --- a/src/main/java/org/qortal/api/model/ConnectedPeer.java +++ b/src/main/java/org/qortal/api/model/ConnectedPeer.java @@ -17,7 +17,7 @@ public class ConnectedPeer { public enum Direction { INBOUND, - OUTBOUND; + OUTBOUND } public Direction direction; diff --git a/src/main/java/org/qortal/api/resource/TransactionsResource.java b/src/main/java/org/qortal/api/resource/TransactionsResource.java index ca2404ea..6e4db30c 100644 --- a/src/main/java/org/qortal/api/resource/TransactionsResource.java +++ b/src/main/java/org/qortal/api/resource/TransactionsResource.java @@ -330,8 +330,8 @@ public class TransactionsResource { public enum ConfirmationStatus { CONFIRMED, UNCONFIRMED, - BOTH; - } + BOTH + } @GET @Path("/search") diff --git a/src/main/java/org/qortal/controller/RestartNode.java b/src/main/java/org/qortal/controller/RestartNode.java index b8d81b85..e7a738aa 100644 --- a/src/main/java/org/qortal/controller/RestartNode.java +++ b/src/main/java/org/qortal/controller/RestartNode.java @@ -2,7 +2,7 @@ package org.qortal.controller; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.qortal.ApplyRestart;; +import org.qortal.ApplyRestart; import org.qortal.globalization.Translator; import org.qortal.gui.SysTray; import org.qortal.repository.RepositoryManager; diff --git a/src/main/java/org/qortal/controller/Synchronizer.java b/src/main/java/org/qortal/controller/Synchronizer.java index 113b5846..e15db208 100644 --- a/src/main/java/org/qortal/controller/Synchronizer.java +++ b/src/main/java/org/qortal/controller/Synchronizer.java @@ -90,8 +90,8 @@ public class Synchronizer extends Thread { private static Synchronizer instance; public enum SynchronizationResult { - OK, NOTHING_TO_DO, GENESIS_ONLY, NO_COMMON_BLOCK, TOO_DIVERGENT, NO_REPLY, INFERIOR_CHAIN, INVALID_DATA, NO_BLOCKCHAIN_LOCK, REPOSITORY_ISSUE, SHUTTING_DOWN, CHAIN_TIP_TOO_OLD; - } + OK, NOTHING_TO_DO, GENESIS_ONLY, NO_COMMON_BLOCK, TOO_DIVERGENT, NO_REPLY, INFERIOR_CHAIN, INVALID_DATA, NO_BLOCKCHAIN_LOCK, REPOSITORY_ISSUE, SHUTTING_DOWN, CHAIN_TIP_TOO_OLD + } public static class NewChainTipEvent implements Event { private final BlockData priorChainTip; diff --git a/src/main/java/org/qortal/data/transaction/ArbitraryTransactionData.java b/src/main/java/org/qortal/data/transaction/ArbitraryTransactionData.java index 6e55e280..f3828de8 100644 --- a/src/main/java/org/qortal/data/transaction/ArbitraryTransactionData.java +++ b/src/main/java/org/qortal/data/transaction/ArbitraryTransactionData.java @@ -25,8 +25,8 @@ public class ArbitraryTransactionData extends TransactionData { // "data" field types public enum DataType { RAW_DATA, - DATA_HASH; - } + DATA_HASH + } // Methods public enum Method { From 61ede811cdf2c2a762e4bf09d75bd3aee0194632 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Sat, 29 Jun 2024 11:54:41 +0200 Subject: [PATCH 08/30] Replaced size() == / > 0 with isEmpty() --- .../qortal/account/SelfSponsorshipAlgoV1.java | 2 +- .../qortal/account/SelfSponsorshipAlgoV3.java | 2 +- src/main/java/org/qortal/api/ApiRequest.java | 2 +- .../api/gateway/resource/GatewayResource.java | 2 +- .../qortal/arbitrary/ArbitraryDataBuilder.java | 4 ++-- .../org/qortal/arbitrary/ArbitraryDataFile.java | 10 +++++----- src/main/java/org/qortal/block/Block.java | 2 +- .../java/org/qortal/controller/Synchronizer.java | 16 ++++++++-------- .../arbitrary/ArbitraryDataFileListManager.java | 4 ++-- .../repository/NamesDatabaseIntegrityCheck.java | 2 +- .../java/org/qortal/crosschain/Bitcoiny.java | 2 +- src/main/java/org/qortal/network/Network.java | 2 +- src/main/java/org/qortal/network/Peer.java | 2 +- .../hsqldb/HSQLDBArbitraryRepository.java | 2 +- .../org/qortal/transaction/ChatTransaction.java | 2 +- src/main/java/org/qortal/utils/Base58.java | 2 +- .../java/org/qortal/utils/BlockArchiveUtils.java | 2 +- src/main/java/org/qortal/utils/Unicode.java | 2 +- 18 files changed, 31 insertions(+), 31 deletions(-) diff --git a/src/main/java/org/qortal/account/SelfSponsorshipAlgoV1.java b/src/main/java/org/qortal/account/SelfSponsorshipAlgoV1.java index 65092602..de8663a9 100644 --- a/src/main/java/org/qortal/account/SelfSponsorshipAlgoV1.java +++ b/src/main/java/org/qortal/account/SelfSponsorshipAlgoV1.java @@ -340,7 +340,7 @@ public class SelfSponsorshipAlgoV1 { return true; } transactionDataList.removeIf(t -> t.getTimestamp() >= this.snapshotTimestamp); - return transactionDataList.size() == 0; + return transactionDataList.isEmpty(); } private static List fetchTransactions(Repository repository, List txTypes, String address, boolean reverse) throws DataException { diff --git a/src/main/java/org/qortal/account/SelfSponsorshipAlgoV3.java b/src/main/java/org/qortal/account/SelfSponsorshipAlgoV3.java index 80c1ba2f..3010b39d 100644 --- a/src/main/java/org/qortal/account/SelfSponsorshipAlgoV3.java +++ b/src/main/java/org/qortal/account/SelfSponsorshipAlgoV3.java @@ -344,7 +344,7 @@ public class SelfSponsorshipAlgoV3 { return true; } transactionDataList.removeIf(t -> t.getTimestamp() <= this.snapshotTimestampV1 || t.getTimestamp() >= this.snapshotTimestampV3); - return transactionDataList.size() == 0; + return transactionDataList.isEmpty(); } private static List fetchTransactions(Repository repository, List txTypes, String address, boolean reverse) throws DataException { diff --git a/src/main/java/org/qortal/api/ApiRequest.java b/src/main/java/org/qortal/api/ApiRequest.java index 59bd791a..8036c8d9 100644 --- a/src/main/java/org/qortal/api/ApiRequest.java +++ b/src/main/java/org/qortal/api/ApiRequest.java @@ -141,7 +141,7 @@ public class ApiRequest { } String resultString = result.toString(); - return resultString.length() > 0 ? resultString.substring(0, resultString.length() - 1) : resultString; + return !resultString.isEmpty() ? resultString.substring(0, resultString.length() - 1) : resultString; } /** diff --git a/src/main/java/org/qortal/api/gateway/resource/GatewayResource.java b/src/main/java/org/qortal/api/gateway/resource/GatewayResource.java index 7169fd4a..a6ec61b6 100644 --- a/src/main/java/org/qortal/api/gateway/resource/GatewayResource.java +++ b/src/main/java/org/qortal/api/gateway/resource/GatewayResource.java @@ -140,7 +140,7 @@ public class GatewayResource { } String prefix = StringUtils.join(prefixParts, "/"); - if (prefix != null && prefix.length() > 0) { + if (prefix != null && !prefix.isEmpty()) { prefix = "/" + prefix; } diff --git a/src/main/java/org/qortal/arbitrary/ArbitraryDataBuilder.java b/src/main/java/org/qortal/arbitrary/ArbitraryDataBuilder.java index f438cef6..34130742 100644 --- a/src/main/java/org/qortal/arbitrary/ArbitraryDataBuilder.java +++ b/src/main/java/org/qortal/arbitrary/ArbitraryDataBuilder.java @@ -104,7 +104,7 @@ public class ArbitraryDataBuilder { if (latestPut.getMethod() != Method.PUT) { throw new DataException("Expected PUT but received PATCH"); } - if (transactionDataList.size() == 0) { + if (transactionDataList.isEmpty()) { throw new DataException(String.format("No transactions found for name %s, service %s, " + "identifier: %s, since %d", name, service, this.identifierString(), latestPut.getTimestamp())); } @@ -176,7 +176,7 @@ public class ArbitraryDataBuilder { } private void findLatestSignature() throws DataException { - if (this.transactions.size() == 0) { + if (this.transactions.isEmpty()) { throw new DataException("Unable to find latest signature from empty transaction list"); } diff --git a/src/main/java/org/qortal/arbitrary/ArbitraryDataFile.java b/src/main/java/org/qortal/arbitrary/ArbitraryDataFile.java index 1bba1a73..6e1ca0b9 100644 --- a/src/main/java/org/qortal/arbitrary/ArbitraryDataFile.java +++ b/src/main/java/org/qortal/arbitrary/ArbitraryDataFile.java @@ -354,7 +354,7 @@ public class ArbitraryDataFile { public boolean join() { // Ensure we have chunks - if (this.chunks != null && this.chunks.size() > 0) { + if (this.chunks != null && !this.chunks.isEmpty()) { // Create temporary path for joined file // Use the user-specified temp dir, as it is deterministic, and is more likely to be located on reusable storage hardware @@ -439,7 +439,7 @@ public class ArbitraryDataFile { boolean success = false; // Delete the individual chunks - if (this.chunks != null && this.chunks.size() > 0) { + if (this.chunks != null && !this.chunks.isEmpty()) { Iterator iterator = this.chunks.iterator(); while (iterator.hasNext()) { ArbitraryDataFileChunk chunk = (ArbitraryDataFileChunk) iterator.next(); @@ -709,7 +709,7 @@ public class ArbitraryDataFile { } public byte[] chunkHashes() throws DataException { - if (this.chunks != null && this.chunks.size() > 0) { + if (this.chunks != null && !this.chunks.isEmpty()) { // Return null if we only have one chunk, with the same hash as the parent if (Arrays.equals(this.digest(), this.chunks.get(0).digest())) { return null; @@ -736,7 +736,7 @@ public class ArbitraryDataFile { public List chunkHashList() { List chunks = new ArrayList<>(); - if (this.chunks != null && this.chunks.size() > 0) { + if (this.chunks != null && !this.chunks.isEmpty()) { // Return null if we only have one chunk, with the same hash as the parent if (Arrays.equals(this.digest(), this.chunks.get(0).digest())) { return null; @@ -820,7 +820,7 @@ public class ArbitraryDataFile { String outputString = ""; if (this.chunkCount() > 0) { for (ArbitraryDataFileChunk chunk : this.chunks) { - if (outputString.length() > 0) { + if (!outputString.isEmpty()) { outputString = outputString.concat(","); } outputString = outputString.concat(chunk.digest58()); diff --git a/src/main/java/org/qortal/block/Block.java b/src/main/java/org/qortal/block/Block.java index caaa0c76..bacff5b4 100644 --- a/src/main/java/org/qortal/block/Block.java +++ b/src/main/java/org/qortal/block/Block.java @@ -1086,7 +1086,7 @@ public class Block { // Online accounts should only be included in designated blocks; all others must be empty if (!this.isOnlineAccountsBlock()) { - if (this.blockData.getOnlineAccountsCount() != 0 || accountIndexes.size() != 0) { + if (this.blockData.getOnlineAccountsCount() != 0 || !accountIndexes.isEmpty()) { return ValidationResult.ONLINE_ACCOUNTS_INVALID; } // Not a designated online accounts block and account count is 0. Everything is correct so no need to validate further. diff --git a/src/main/java/org/qortal/controller/Synchronizer.java b/src/main/java/org/qortal/controller/Synchronizer.java index e15db208..5cffdbd4 100644 --- a/src/main/java/org/qortal/controller/Synchronizer.java +++ b/src/main/java/org/qortal/controller/Synchronizer.java @@ -258,7 +258,7 @@ public class Synchronizer extends Thread { peers.removeIf(Controller.hasNoRecentBlock); final int peersRemoved = peersBeforeComparison - peers.size(); - if (peersRemoved > 0 && peers.size() > 0) + if (peersRemoved > 0 && !peers.isEmpty()) LOGGER.debug(String.format("Ignoring %d peers on inferior chains. Peers remaining: %d", peersRemoved, peers.size())); if (peers.isEmpty()) @@ -392,7 +392,7 @@ public class Synchronizer extends Thread { private boolean checkRecoveryModeForPeers(List qualifiedPeers) { List handshakedPeers = Network.getInstance().getImmutableHandshakedPeers(); - if (handshakedPeers.size() > 0) { + if (!handshakedPeers.isEmpty()) { // There is at least one handshaked peer if (qualifiedPeers.isEmpty()) { // There are no 'qualified' peers - i.e. peers that have a recent block we can sync to @@ -445,7 +445,7 @@ public class Synchronizer extends Thread { try (final Repository repository = RepositoryManager.getRepository()) { try { - if (peers.size() == 0) + if (peers.isEmpty()) return SynchronizationResult.NOTHING_TO_DO; // If our latest block is very old, it's best that we don't try and determine the best peers to sync to. @@ -701,7 +701,7 @@ public class Synchronizer extends Thread { // Reduce minChainLength if needed. If we don't have any blocks, this peer will be excluded from chain weight comparisons later in the process, so we shouldn't update minChainLength List peerBlockSummaries = peer.getCommonBlockData().getBlockSummariesAfterCommonBlock(); - if (peerBlockSummaries != null && peerBlockSummaries.size() > 0) + if (peerBlockSummaries != null && !peerBlockSummaries.isEmpty()) if (peerBlockSummaries.size() < minChainLength) minChainLength = peerBlockSummaries.size(); } @@ -728,7 +728,7 @@ public class Synchronizer extends Thread { // Calculate our chain weight BigInteger ourChainWeight = BigInteger.valueOf(0); - if (ourBlockSummaries.size() > 0) + if (!ourBlockSummaries.isEmpty()) ourChainWeight = Block.calcChainWeight(commonBlockSummary.getHeight(), commonBlockSummary.getSignature(), ourBlockSummaries, maxHeightForChainWeightComparisons); LOGGER.debug(String.format("Our chain weight based on %d blocks is %s", (usingSameLengthChainWeight ? minChainLength : ourBlockSummaries.size()), accurateFormatter.format(ourChainWeight))); @@ -780,7 +780,7 @@ public class Synchronizer extends Thread { } // Now that we have selected the best peers, compare them against each other and remove any with lower weights - if (superiorPeersForComparison.size() > 0) { + if (!superiorPeersForComparison.isEmpty()) { BigInteger bestChainWeight = null; for (Peer peer : superiorPeersForComparison) { // Increase bestChainWeight if needed @@ -1290,7 +1290,7 @@ public class Synchronizer extends Thread { cachedCommonBlockData.setBlockSummariesAfterCommonBlock(null); // If we have already received newer blocks from this peer that what we have already, go ahead and apply them - if (peerBlocks.size() > 0) { + if (!peerBlocks.isEmpty()) { final BlockData ourLatestBlockData = repository.getBlockRepository().getLastBlock(); final Block peerLatestBlock = peerBlocks.get(peerBlocks.size() - 1); final Long minLatestBlockTimestamp = Controller.getMinimumLatestBlockTimestamp(); @@ -1352,7 +1352,7 @@ public class Synchronizer extends Thread { if (retryCount >= maxRetries) { // If we have already received newer blocks from this peer that what we have already, go ahead and apply them - if (peerBlocks.size() > 0) { + if (!peerBlocks.isEmpty()) { final BlockData ourLatestBlockData = repository.getBlockRepository().getLastBlock(); final Block peerLatestBlock = peerBlocks.get(peerBlocks.size() - 1); final Long minLatestBlockTimestamp = Controller.getMinimumLatestBlockTimestamp(); diff --git a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataFileListManager.java b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataFileListManager.java index 5ed8df21..1d5e4149 100644 --- a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataFileListManager.java +++ b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataFileListManager.java @@ -605,7 +605,7 @@ public class ArbitraryDataFileListManager { } // Add the chunk hashes - if (arbitraryDataFile.getChunkHashes().size() > 0) { + if (!arbitraryDataFile.getChunkHashes().isEmpty()) { requestedHashes.addAll(arbitraryDataFile.getChunkHashes()); } // Add complete file if there are no hashes @@ -641,7 +641,7 @@ public class ArbitraryDataFileListManager { } // We should only respond if we have at least one hash - if (hashes.size() > 0) { + if (!hashes.isEmpty()) { // Firstly we should keep track of the requesting peer, to allow for potential direct connections later ArbitraryDataFileManager.getInstance().addRecentDataRequest(requestingPeer); diff --git a/src/main/java/org/qortal/controller/repository/NamesDatabaseIntegrityCheck.java b/src/main/java/org/qortal/controller/repository/NamesDatabaseIntegrityCheck.java index 698ad487..35981976 100644 --- a/src/main/java/org/qortal/controller/repository/NamesDatabaseIntegrityCheck.java +++ b/src/main/java/org/qortal/controller/repository/NamesDatabaseIntegrityCheck.java @@ -207,7 +207,7 @@ public class NamesDatabaseIntegrityCheck { // FUTURE: check database integrity for names that have been updated and then the original name re-registered else if (Objects.equals(updateNameTransactionData.getName(), registeredName)) { String newName = updateNameTransactionData.getNewName(); - if (newName == null || newName.length() == 0) { + if (newName == null || newName.isEmpty()) { // If new name is blank (or maybe null, just to be safe), it means that it stayed the same newName = registeredName; } diff --git a/src/main/java/org/qortal/crosschain/Bitcoiny.java b/src/main/java/org/qortal/crosschain/Bitcoiny.java index 1ae70fe9..7f624e20 100644 --- a/src/main/java/org/qortal/crosschain/Bitcoiny.java +++ b/src/main/java/org/qortal/crosschain/Bitcoiny.java @@ -757,7 +757,7 @@ public abstract class Bitcoiny implements ForeignBlockchain { Address address = Address.fromKey(this.params, keyChain.getKey(KeyChain.KeyPurpose.RECEIVE_FUNDS), ScriptType.P2PKH); // if zero transactions, return address - if( 0 == getAddressTransactions(ScriptBuilder.createOutputScript(address).getProgram(), true).size() ) + if(getAddressTransactions(ScriptBuilder.createOutputScript(address).getProgram(), true).isEmpty()) return address.toString(); // else try the next receive funds address diff --git a/src/main/java/org/qortal/network/Network.java b/src/main/java/org/qortal/network/Network.java index b42ab450..0e5885ad 100644 --- a/src/main/java/org/qortal/network/Network.java +++ b/src/main/java/org/qortal/network/Network.java @@ -810,7 +810,7 @@ public class Network { .filter(peer -> peer.hasReachedMaxConnectionAge()) .collect(Collectors.toList()); - if (peersToDisconnect != null && peersToDisconnect.size() > 0) { + if (peersToDisconnect != null && !peersToDisconnect.isEmpty()) { for (Peer peer : peersToDisconnect) { LOGGER.debug("Forcing disconnection of peer {} because connection age ({} ms) " + "has reached the maximum ({} ms)", peer, peer.getConnectionAge(), peer.getMaxConnectionAge()); diff --git a/src/main/java/org/qortal/network/Peer.java b/src/main/java/org/qortal/network/Peer.java index 821f368c..fc28ea87 100644 --- a/src/main/java/org/qortal/network/Peer.java +++ b/src/main/java/org/qortal/network/Peer.java @@ -859,7 +859,7 @@ public class Peer { } } - if (logStats && this.receivedMessageStats.size() > 0) { + if (logStats && !this.receivedMessageStats.isEmpty()) { StringBuilder statsBuilder = new StringBuilder(1024); statsBuilder.append("peer ").append(this).append(" message stats:\n=received="); appendMessageStats(statsBuilder, this.receivedMessageStats); diff --git a/src/main/java/org/qortal/repository/hsqldb/HSQLDBArbitraryRepository.java b/src/main/java/org/qortal/repository/hsqldb/HSQLDBArbitraryRepository.java index eaa7be2a..c49074c5 100644 --- a/src/main/java/org/qortal/repository/hsqldb/HSQLDBArbitraryRepository.java +++ b/src/main/java/org/qortal/repository/hsqldb/HSQLDBArbitraryRepository.java @@ -1024,7 +1024,7 @@ public class HSQLDBArbitraryRepository implements ArbitraryRepository { String tag5 = null; if (tags != null) { - if (tags.size() > 0) tag1 = tags.get(0); + if (!tags.isEmpty()) tag1 = tags.get(0); if (tags.size() > 1) tag2 = tags.get(1); if (tags.size() > 2) tag3 = tags.get(2); if (tags.size() > 3) tag4 = tags.get(3); diff --git a/src/main/java/org/qortal/transaction/ChatTransaction.java b/src/main/java/org/qortal/transaction/ChatTransaction.java index 3004b5b9..a255e781 100644 --- a/src/main/java/org/qortal/transaction/ChatTransaction.java +++ b/src/main/java/org/qortal/transaction/ChatTransaction.java @@ -168,7 +168,7 @@ public class ChatTransaction extends Transaction { // Check for blocked author by registered name List names = this.repository.getNameRepository().getNamesByOwner(this.chatTransactionData.getSender()); - if (names != null && names.size() > 0) { + if (names != null && !names.isEmpty()) { for (NameData nameData : names) { if (nameData != null && nameData.getName() != null) { if (ListUtils.isNameBlocked(nameData.getName())) { diff --git a/src/main/java/org/qortal/utils/Base58.java b/src/main/java/org/qortal/utils/Base58.java index 8fa9ddad..f2ad611c 100644 --- a/src/main/java/org/qortal/utils/Base58.java +++ b/src/main/java/org/qortal/utils/Base58.java @@ -111,7 +111,7 @@ public class Base58 { // // Nothing to do if we have an empty string // - if (string.length() == 0) + if (string.isEmpty()) return null; // // Convert the input string to a byte sequence diff --git a/src/main/java/org/qortal/utils/BlockArchiveUtils.java b/src/main/java/org/qortal/utils/BlockArchiveUtils.java index 33482fc6..99670614 100644 --- a/src/main/java/org/qortal/utils/BlockArchiveUtils.java +++ b/src/main/java/org/qortal/utils/BlockArchiveUtils.java @@ -59,7 +59,7 @@ public class BlockArchiveUtils { if (firstBlock == null || firstBlock.getBlockData().getHeight() != startHeight) { throw new IllegalStateException("Non matching first block when importing from archive"); } - if (blockInfoList.size() > 0) { + if (!blockInfoList.isEmpty()) { BlockTransformation lastBlock = blockInfoList.get(blockInfoList.size() - 1); if (lastBlock == null || lastBlock.getBlockData().getHeight() != endHeight) { throw new IllegalStateException("Non matching last block when importing from archive"); diff --git a/src/main/java/org/qortal/utils/Unicode.java b/src/main/java/org/qortal/utils/Unicode.java index c3e282ce..9b837a07 100644 --- a/src/main/java/org/qortal/utils/Unicode.java +++ b/src/main/java/org/qortal/utils/Unicode.java @@ -141,7 +141,7 @@ public abstract class Unicode { while ((line = bufferedReader.readLine()) != null) { line = line.trim(); - if (line.startsWith("#") || line.length() == 0) + if (line.startsWith("#") || line.isEmpty()) continue; String[] charCodes = line.split(","); From d58fbab1b52297b4249653775f601d858eb7bdf5 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Sat, 29 Jun 2024 11:58:25 +0200 Subject: [PATCH 09/30] Removed pointless boolean Expression --- .../java/cash/z/wallet/sdk/rpc/Service.java | 6 +++--- .../api/gateway/resource/GatewayResource.java | 2 +- .../qortal/api/resource/ArbitraryResource.java | 4 ++-- .../qortal/api/resource/BlocksResource.java | 18 +++++++++--------- .../api/resource/CrossChainResource.java | 2 +- src/main/java/org/qortal/at/AT.java | 2 +- .../org/qortal/controller/BlockMinter.java | 4 ++-- .../java/org/qortal/controller/Controller.java | 2 +- .../org/qortal/controller/Synchronizer.java | 4 ++-- .../java/org/qortal/network/Handshake.java | 6 +++--- .../hsqldb/HSQLDBChatRepository.java | 4 ++-- .../repository/hsqldb/HSQLDBImportExport.java | 2 +- .../transaction/RewardShareTransaction.java | 2 +- .../utils/ArbitraryTransactionUtils.java | 2 +- 14 files changed, 30 insertions(+), 30 deletions(-) diff --git a/src/main/java/cash/z/wallet/sdk/rpc/Service.java b/src/main/java/cash/z/wallet/sdk/rpc/Service.java index 3ffc0247..87c51509 100644 --- a/src/main/java/cash/z/wallet/sdk/rpc/Service.java +++ b/src/main/java/cash/z/wallet/sdk/rpc/Service.java @@ -5290,7 +5290,7 @@ public final class Service { if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(vendor_)) { com.google.protobuf.GeneratedMessageV3.writeString(output, 2, vendor_); } - if (taddrSupport_ != false) { + if (taddrSupport_) { output.writeBool(3, taddrSupport_); } if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(chainName_)) { @@ -5341,7 +5341,7 @@ public final class Service { if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(vendor_)) { size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, vendor_); } - if (taddrSupport_ != false) { + if (taddrSupport_) { size += com.google.protobuf.CodedOutputStream .computeBoolSize(3, taddrSupport_); } @@ -5729,7 +5729,7 @@ public final class Service { vendor_ = other.vendor_; onChanged(); } - if (other.getTaddrSupport() != false) { + if (other.getTaddrSupport()) { setTaddrSupport(other.getTaddrSupport()); } if (!other.getChainName().isEmpty()) { diff --git a/src/main/java/org/qortal/api/gateway/resource/GatewayResource.java b/src/main/java/org/qortal/api/gateway/resource/GatewayResource.java index a6ec61b6..fc67594e 100644 --- a/src/main/java/org/qortal/api/gateway/resource/GatewayResource.java +++ b/src/main/java/org/qortal/api/gateway/resource/GatewayResource.java @@ -41,7 +41,7 @@ public class GatewayResource { private ArbitraryResourceStatus getStatus(Service service, String name, String identifier, Boolean build) { // If "build=true" has been specified in the query string, build the resource before returning its status - if (build != null && build == true) { + if (build != null && build) { try { ArbitraryDataReader reader = new ArbitraryDataReader(name, ArbitraryDataFile.ResourceIdType.NAME, service, null); if (!reader.isBuilding()) { diff --git a/src/main/java/org/qortal/api/resource/ArbitraryResource.java b/src/main/java/org/qortal/api/resource/ArbitraryResource.java index 7752be8c..fe9e8524 100644 --- a/src/main/java/org/qortal/api/resource/ArbitraryResource.java +++ b/src/main/java/org/qortal/api/resource/ArbitraryResource.java @@ -119,7 +119,7 @@ public class ArbitraryResource { // Ensure that "default" and "identifier" parameters cannot coexist boolean defaultRes = Boolean.TRUE.equals(defaultResource); - if (defaultRes == true && identifier != null) { + if (defaultRes && identifier != null) { throw ApiExceptionFactory.INSTANCE.createCustomException(request, ApiError.INVALID_CRITERIA, "identifier cannot be specified when requesting a default resource"); } @@ -1258,7 +1258,7 @@ public class ArbitraryResource { } // Finish here if user has requested a preview - if (preview != null && preview == true) { + if (preview != null && preview) { return this.preview(path, service); } diff --git a/src/main/java/org/qortal/api/resource/BlocksResource.java b/src/main/java/org/qortal/api/resource/BlocksResource.java index 22b40a1f..01d8d2ab 100644 --- a/src/main/java/org/qortal/api/resource/BlocksResource.java +++ b/src/main/java/org/qortal/api/resource/BlocksResource.java @@ -86,7 +86,7 @@ public class BlocksResource { // Check the database first BlockData blockData = repository.getBlockRepository().fromSignature(signature); if (blockData != null) { - if (includeOnlineSignatures == null || includeOnlineSignatures == false) { + if (includeOnlineSignatures == null || !includeOnlineSignatures) { blockData.setOnlineAccountsSignatures(null); } return blockData; @@ -95,7 +95,7 @@ public class BlocksResource { // Not found, so try the block archive blockData = repository.getBlockArchiveRepository().fromSignature(signature); if (blockData != null) { - if (includeOnlineSignatures == null || includeOnlineSignatures == false) { + if (includeOnlineSignatures == null || !includeOnlineSignatures) { blockData.setOnlineAccountsSignatures(null); } return blockData; @@ -304,7 +304,7 @@ public class BlocksResource { try (final Repository repository = RepositoryManager.getRepository()) { BlockData blockData = repository.getBlockRepository().getLastBlock(); - if (includeOnlineSignatures == null || includeOnlineSignatures == false) { + if (includeOnlineSignatures == null || !includeOnlineSignatures) { blockData.setOnlineAccountsSignatures(null); } @@ -474,7 +474,7 @@ public class BlocksResource { // Firstly check the database BlockData blockData = repository.getBlockRepository().fromHeight(height); if (blockData != null) { - if (includeOnlineSignatures == null || includeOnlineSignatures == false) { + if (includeOnlineSignatures == null || !includeOnlineSignatures) { blockData.setOnlineAccountsSignatures(null); } return blockData; @@ -483,7 +483,7 @@ public class BlocksResource { // Not found, so try the archive blockData = repository.getBlockArchiveRepository().fromHeight(height); if (blockData != null) { - if (includeOnlineSignatures == null || includeOnlineSignatures == false) { + if (includeOnlineSignatures == null || !includeOnlineSignatures) { blockData.setOnlineAccountsSignatures(null); } return blockData; @@ -596,7 +596,7 @@ public class BlocksResource { if (height > 1) { // Found match in Blocks table blockData = repository.getBlockRepository().fromHeight(height); - if (includeOnlineSignatures == null || includeOnlineSignatures == false) { + if (includeOnlineSignatures == null || !includeOnlineSignatures) { blockData.setOnlineAccountsSignatures(null); } return blockData; @@ -614,7 +614,7 @@ public class BlocksResource { throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.BLOCK_UNKNOWN); } - if (includeOnlineSignatures == null || includeOnlineSignatures == false) { + if (includeOnlineSignatures == null || !includeOnlineSignatures) { blockData.setOnlineAccountsSignatures(null); } @@ -651,7 +651,7 @@ public class BlocksResource { @QueryParam("includeOnlineSignatures") Boolean includeOnlineSignatures) { try (final Repository repository = RepositoryManager.getRepository()) { List blocks = new ArrayList<>(); - boolean shouldReverse = (reverse != null && reverse == true); + boolean shouldReverse = (reverse != null && reverse); int i = 0; while (i < count) { @@ -664,7 +664,7 @@ public class BlocksResource { break; } } - if (includeOnlineSignatures == null || includeOnlineSignatures == false) { + if (includeOnlineSignatures == null || !includeOnlineSignatures) { blockData.setOnlineAccountsSignatures(null); } diff --git a/src/main/java/org/qortal/api/resource/CrossChainResource.java b/src/main/java/org/qortal/api/resource/CrossChainResource.java index d3919d9b..9e411127 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainResource.java +++ b/src/main/java/org/qortal/api/resource/CrossChainResource.java @@ -376,7 +376,7 @@ public class CrossChainResource { int maximumCount = maxtrades != null ? maxtrades : 10; long minimumPeriod = 4 * 60 * 60 * 1000L; // ms Boolean isFinished = Boolean.TRUE; - boolean useInversePrice = (inverse != null && inverse == true); + boolean useInversePrice = (inverse != null && inverse); try (final Repository repository = RepositoryManager.getRepository()) { Map> acctsByCodeHash = SupportedBlockchain.getFilteredAcctMap(foreignBlockchain); diff --git a/src/main/java/org/qortal/at/AT.java b/src/main/java/org/qortal/at/AT.java index e5cbf4e7..54356401 100644 --- a/src/main/java/org/qortal/at/AT.java +++ b/src/main/java/org/qortal/at/AT.java @@ -132,7 +132,7 @@ public class AT { // Nothing happened? if (state.getSteps() == 0 && Arrays.equals(stateHash, latestAtStateData.getStateHash())) // We currently want to execute frozen ATs, to maintain backwards support. - if (state.isFrozen() == false) + if (!state.isFrozen()) // this.atStateData will be null return Collections.emptyList(); diff --git a/src/main/java/org/qortal/controller/BlockMinter.java b/src/main/java/org/qortal/controller/BlockMinter.java index 49831cba..7272ee95 100644 --- a/src/main/java/org/qortal/controller/BlockMinter.java +++ b/src/main/java/org/qortal/controller/BlockMinter.java @@ -172,7 +172,7 @@ public class BlockMinter extends Thread { // Disregard peers that don't have a recent block, but only if we're not in recovery mode. // In that mode, we want to allow minting on top of older blocks, to recover stalled networks. - if (Synchronizer.getInstance().getRecoveryMode() == false) + if (!Synchronizer.getInstance().getRecoveryMode()) peers.removeIf(Controller.hasNoRecentBlock); // Don't mint if we don't have enough up-to-date peers as where would the transactions/consensus come from? @@ -197,7 +197,7 @@ public class BlockMinter extends Thread { // If our latest block isn't recent then we need to synchronize instead of minting, unless we're in recovery mode. if (!peers.isEmpty() && lastBlockData.getTimestamp() < minLatestBlockTimestamp) - if (Synchronizer.getInstance().getRecoveryMode() == false && recoverInvalidBlock == false) + if (!Synchronizer.getInstance().getRecoveryMode() && !recoverInvalidBlock) continue; // There are enough peers with a recent block and our latest block is recent diff --git a/src/main/java/org/qortal/controller/Controller.java b/src/main/java/org/qortal/controller/Controller.java index 6d2562ab..30537b32 100644 --- a/src/main/java/org/qortal/controller/Controller.java +++ b/src/main/java/org/qortal/controller/Controller.java @@ -775,7 +775,7 @@ public class Controller extends Thread { public static final Predicate hasOldVersion = peer -> { final String minPeerVersion = Settings.getInstance().getMinPeerVersion(); - return peer.isAtLeastVersion(minPeerVersion) == false; + return !peer.isAtLeastVersion(minPeerVersion); }; public static final Predicate hasInvalidSigner = peer -> { diff --git a/src/main/java/org/qortal/controller/Synchronizer.java b/src/main/java/org/qortal/controller/Synchronizer.java index 5cffdbd4..306784f5 100644 --- a/src/main/java/org/qortal/controller/Synchronizer.java +++ b/src/main/java/org/qortal/controller/Synchronizer.java @@ -406,7 +406,7 @@ public class Synchronizer extends Thread { // If enough time has passed, enter recovery mode, which lifts some restrictions on who we can sync with and when we can mint long recoveryModeTimeout = Settings.getInstance().getRecoveryModeTimeout(); if (NTP.getTime() - timePeersLastAvailable > recoveryModeTimeout) { - if (recoveryMode == false) { + if (!recoveryMode) { LOGGER.info(String.format("Peers have been unavailable for %d minutes. Entering recovery mode...", recoveryModeTimeout/60/1000)); recoveryMode = true; } @@ -663,7 +663,7 @@ public class Synchronizer extends Thread { } } - if (useCachedSummaries == false) { + if (!useCachedSummaries) { if (summariesRequired > 0) { LOGGER.trace(String.format("Requesting %d block summar%s from peer %s after common block %.8s. Peer height: %d", summariesRequired, (summariesRequired != 1 ? "ies" : "y"), peer, Base58.encode(commonBlockSummary.getSignature()), peerHeight)); diff --git a/src/main/java/org/qortal/network/Handshake.java b/src/main/java/org/qortal/network/Handshake.java index 221e5e74..782ca2b7 100644 --- a/src/main/java/org/qortal/network/Handshake.java +++ b/src/main/java/org/qortal/network/Handshake.java @@ -70,15 +70,15 @@ public enum Handshake { peer.setPeersVersion(versionString, version); // Ensure the peer is running at least the version specified in MIN_PEER_VERSION - if (peer.isAtLeastVersion(MIN_PEER_VERSION) == false) { + if (!peer.isAtLeastVersion(MIN_PEER_VERSION)) { LOGGER.debug(String.format("Ignoring peer %s because it is on an old version (%s)", peer, versionString)); return null; } - if (Settings.getInstance().getAllowConnectionsWithOlderPeerVersions() == false) { + if (!Settings.getInstance().getAllowConnectionsWithOlderPeerVersions()) { // Ensure the peer is running at least the minimum version allowed for connections final String minPeerVersion = Settings.getInstance().getMinPeerVersion(); - if (peer.isAtLeastVersion(minPeerVersion) == false) { + if (!peer.isAtLeastVersion(minPeerVersion)) { LOGGER.debug(String.format("Ignoring peer %s because it is on an old version (%s)", peer, versionString)); return null; } diff --git a/src/main/java/org/qortal/repository/hsqldb/HSQLDBChatRepository.java b/src/main/java/org/qortal/repository/hsqldb/HSQLDBChatRepository.java index 6bc4fa49..571a587d 100644 --- a/src/main/java/org/qortal/repository/hsqldb/HSQLDBChatRepository.java +++ b/src/main/java/org/qortal/repository/hsqldb/HSQLDBChatRepository.java @@ -69,10 +69,10 @@ public class HSQLDBChatRepository implements ChatRepository { bindParams.add(chatReferenceBytes); } - if (hasChatReference != null && hasChatReference == true) { + if (hasChatReference != null && hasChatReference) { whereClauses.add("chat_reference IS NOT NULL"); } - else if (hasChatReference != null && hasChatReference == false) { + else if (hasChatReference != null && !hasChatReference) { whereClauses.add("chat_reference IS NULL"); } diff --git a/src/main/java/org/qortal/repository/hsqldb/HSQLDBImportExport.java b/src/main/java/org/qortal/repository/hsqldb/HSQLDBImportExport.java index 3e6dd534..4d62fed5 100644 --- a/src/main/java/org/qortal/repository/hsqldb/HSQLDBImportExport.java +++ b/src/main/java/org/qortal/repository/hsqldb/HSQLDBImportExport.java @@ -137,7 +137,7 @@ public class HSQLDBImportExport { String existingTradePrivateKey = (String) existingTradeBotDataItem.get("tradePrivateKey"); // Check if we already have an entry for this trade boolean found = allTradeBotData.stream().anyMatch(tradeBotData -> Base58.encode(tradeBotData.getTradePrivateKey()).equals(existingTradePrivateKey)); - if (found == false) + if (!found) // Add the data from the backup file to our "allTradeBotDataJson" array as it's not currently in the db allTradeBotDataJson.put(existingTradeBotDataItem); } diff --git a/src/main/java/org/qortal/transaction/RewardShareTransaction.java b/src/main/java/org/qortal/transaction/RewardShareTransaction.java index 635c8c8a..b2261181 100644 --- a/src/main/java/org/qortal/transaction/RewardShareTransaction.java +++ b/src/main/java/org/qortal/transaction/RewardShareTransaction.java @@ -43,7 +43,7 @@ public class RewardShareTransaction extends Transaction { } private RewardShareData getExistingRewardShare() throws DataException { - if (this.haveCheckedForExistingRewardShare == false) { + if (!this.haveCheckedForExistingRewardShare) { this.haveCheckedForExistingRewardShare = true; // Look up any existing reward-share (using transaction's reward-share public key) diff --git a/src/main/java/org/qortal/utils/ArbitraryTransactionUtils.java b/src/main/java/org/qortal/utils/ArbitraryTransactionUtils.java index 2d3a2358..f641255f 100644 --- a/src/main/java/org/qortal/utils/ArbitraryTransactionUtils.java +++ b/src/main/java/org/qortal/utils/ArbitraryTransactionUtils.java @@ -398,7 +398,7 @@ public class ArbitraryTransactionUtils { public static ArbitraryResourceStatus getStatus(Service service, String name, String identifier, Boolean build, boolean updateCache) { // If "build" has been specified, build the resource before returning its status - if (build != null && build == true) { + if (build != null && build) { try { ArbitraryDataReader reader = new ArbitraryDataReader(name, ArbitraryDataFile.ResourceIdType.NAME, service, identifier); if (!reader.isBuilding()) { From 806dc6d056e34c4105cb5de9fc6a5f2400ef8ca9 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Sat, 29 Jun 2024 12:11:38 +0200 Subject: [PATCH 10/30] Replaced string.equals() with string.isEmpty() --- src/main/java/org/qortal/api/HTMLParser.java | 2 +- .../java/org/qortal/api/gateway/resource/GatewayResource.java | 2 +- src/main/java/org/qortal/api/resource/ArbitraryResource.java | 2 +- src/main/java/org/qortal/arbitrary/ArbitraryDataReader.java | 2 +- src/main/java/org/qortal/arbitrary/ArbitraryDataRenderer.java | 2 +- src/main/java/org/qortal/arbitrary/ArbitraryDataResource.java | 2 +- .../org/qortal/arbitrary/ArbitraryDataTransactionBuilder.java | 2 +- src/main/java/org/qortal/arbitrary/ArbitraryDataWriter.java | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/qortal/api/HTMLParser.java b/src/main/java/org/qortal/api/HTMLParser.java index f1794594..4887cf84 100644 --- a/src/main/java/org/qortal/api/HTMLParser.java +++ b/src/main/java/org/qortal/api/HTMLParser.java @@ -82,7 +82,7 @@ public class HTMLParser { } public static boolean isHtmlFile(String path) { - if (path.endsWith(".html") || path.endsWith(".htm") || path.equals("")) { + if (path.endsWith(".html") || path.endsWith(".htm") || path.isEmpty()) { return true; } return false; diff --git a/src/main/java/org/qortal/api/gateway/resource/GatewayResource.java b/src/main/java/org/qortal/api/gateway/resource/GatewayResource.java index fc67594e..7f4b2f88 100644 --- a/src/main/java/org/qortal/api/gateway/resource/GatewayResource.java +++ b/src/main/java/org/qortal/api/gateway/resource/GatewayResource.java @@ -80,7 +80,7 @@ public class GatewayResource { private HttpServletResponse parsePath(String inPath, String qdnContext, String secret58, boolean includeResourceIdInPrefix, boolean async) { - if (inPath == null || inPath.equals("")) { + if (inPath == null || inPath.isEmpty()) { // Assume not a real file return ArbitraryDataRenderer.getResponse(response, 404, "Error 404: File Not Found"); } diff --git a/src/main/java/org/qortal/api/resource/ArbitraryResource.java b/src/main/java/org/qortal/api/resource/ArbitraryResource.java index fe9e8524..99fc0020 100644 --- a/src/main/java/org/qortal/api/resource/ArbitraryResource.java +++ b/src/main/java/org/qortal/api/resource/ArbitraryResource.java @@ -491,7 +491,7 @@ public class ArbitraryResource { List transactionDataList; - if (query == null || query.equals("")) { + if (query == null || query.isEmpty()) { transactionDataList = ArbitraryDataStorageManager.getInstance().listAllHostedTransactions(repository, limit, offset); } else { transactionDataList = ArbitraryDataStorageManager.getInstance().searchHostedTransactions(repository,query, limit, offset); diff --git a/src/main/java/org/qortal/arbitrary/ArbitraryDataReader.java b/src/main/java/org/qortal/arbitrary/ArbitraryDataReader.java index 09154a32..78a9ee86 100644 --- a/src/main/java/org/qortal/arbitrary/ArbitraryDataReader.java +++ b/src/main/java/org/qortal/arbitrary/ArbitraryDataReader.java @@ -73,7 +73,7 @@ public class ArbitraryDataReader { } // If identifier is a blank string, or reserved keyword "default", treat it as null - if (identifier == null || identifier.equals("") || identifier.equals("default")) { + if (identifier == null || identifier.isEmpty() || identifier.equals("default")) { identifier = null; } diff --git a/src/main/java/org/qortal/arbitrary/ArbitraryDataRenderer.java b/src/main/java/org/qortal/arbitrary/ArbitraryDataRenderer.java index 9d20df14..5200b5e2 100644 --- a/src/main/java/org/qortal/arbitrary/ArbitraryDataRenderer.java +++ b/src/main/java/org/qortal/arbitrary/ArbitraryDataRenderer.java @@ -199,7 +199,7 @@ public class ArbitraryDataRenderer { } private String getFilename(String directory, String userPath) { - if (userPath == null || userPath.endsWith("/") || userPath.equals("")) { + if (userPath == null || userPath.endsWith("/") || userPath.isEmpty()) { // Locate index file List indexFiles = ArbitraryDataRenderer.indexFiles(); for (String indexFile : indexFiles) { diff --git a/src/main/java/org/qortal/arbitrary/ArbitraryDataResource.java b/src/main/java/org/qortal/arbitrary/ArbitraryDataResource.java index 16faf838..232d3416 100644 --- a/src/main/java/org/qortal/arbitrary/ArbitraryDataResource.java +++ b/src/main/java/org/qortal/arbitrary/ArbitraryDataResource.java @@ -52,7 +52,7 @@ public class ArbitraryDataResource { this.service = service; // If identifier is a blank string, or reserved keyword "default", treat it as null - if (identifier == null || identifier.equals("") || identifier.equals("default")) { + if (identifier == null || identifier.isEmpty() || identifier.equals("default")) { identifier = null; } this.identifier = identifier; diff --git a/src/main/java/org/qortal/arbitrary/ArbitraryDataTransactionBuilder.java b/src/main/java/org/qortal/arbitrary/ArbitraryDataTransactionBuilder.java index 9cfc686a..a77442ec 100644 --- a/src/main/java/org/qortal/arbitrary/ArbitraryDataTransactionBuilder.java +++ b/src/main/java/org/qortal/arbitrary/ArbitraryDataTransactionBuilder.java @@ -81,7 +81,7 @@ public class ArbitraryDataTransactionBuilder { this.service = service; // If identifier is a blank string, or reserved keyword "default", treat it as null - if (identifier == null || identifier.equals("") || identifier.equals("default")) { + if (identifier == null || identifier.isEmpty() || identifier.equals("default")) { identifier = null; } this.identifier = identifier; diff --git a/src/main/java/org/qortal/arbitrary/ArbitraryDataWriter.java b/src/main/java/org/qortal/arbitrary/ArbitraryDataWriter.java index 0098e4fa..e3dcbad7 100644 --- a/src/main/java/org/qortal/arbitrary/ArbitraryDataWriter.java +++ b/src/main/java/org/qortal/arbitrary/ArbitraryDataWriter.java @@ -78,7 +78,7 @@ public class ArbitraryDataWriter { this.compression = compression; // If identifier is a blank string, or reserved keyword "default", treat it as null - if (identifier == null || identifier.equals("") || identifier.equals("default")) { + if (identifier == null || identifier.isEmpty() || identifier.equals("default")) { identifier = null; } this.identifier = identifier; From 64537ad705c88800e6c6f30d576f177d72a6cac5 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Sat, 29 Jun 2024 12:13:12 +0200 Subject: [PATCH 11/30] Fixed synchronization on a non-final field --- src/main/java/org/qortal/controller/ChatNotifier.java | 2 +- .../qortal/controller/arbitrary/ArbitraryDataFileManager.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/qortal/controller/ChatNotifier.java b/src/main/java/org/qortal/controller/ChatNotifier.java index abfcee0d..52f5fd02 100644 --- a/src/main/java/org/qortal/controller/ChatNotifier.java +++ b/src/main/java/org/qortal/controller/ChatNotifier.java @@ -17,7 +17,7 @@ public class ChatNotifier { void notify(ChatTransactionData chatTransactionData); } - private Map listenersBySession = new HashMap<>(); + private final Map listenersBySession = new HashMap<>(); private ChatNotifier() { } diff --git a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataFileManager.java b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataFileManager.java index ed80d85c..5836dcd8 100644 --- a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataFileManager.java +++ b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataFileManager.java @@ -43,7 +43,7 @@ public class ArbitraryDataFileManager extends Thread { /** * Map to keep track of hashes that we might need to relay */ - public List arbitraryRelayMap = Collections.synchronizedList(new ArrayList<>()); + public final List arbitraryRelayMap = Collections.synchronizedList(new ArrayList<>()); /** * List to keep track of any arbitrary data file hash responses @@ -53,7 +53,7 @@ public class ArbitraryDataFileManager extends Thread { /** * List to keep track of peers potentially available for direct connections, based on recent requests */ - private List directConnectionInfo = Collections.synchronizedList(new ArrayList<>()); + private final List directConnectionInfo = Collections.synchronizedList(new ArrayList<>()); /** * Map to keep track of peers requesting QDN data that we hold. From cc951060197b62cf3e4c4debb4e37d1825f35338 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Sat, 29 Jun 2024 12:15:55 +0200 Subject: [PATCH 12/30] Removed unnecessary continue (last statement in a loop) --- .../java/org/qortal/api/resource/AddressesResource.java | 3 +-- src/main/java/org/qortal/controller/BlockMinter.java | 3 +-- src/main/java/org/qortal/controller/Controller.java | 3 +-- .../java/org/qortal/controller/OnlineAccountsManager.java | 1 - .../controller/arbitrary/ArbitraryDataCleanupManager.java | 6 ++---- .../qortal/controller/arbitrary/ArbitraryDataManager.java | 6 ++---- .../controller/arbitrary/ArbitraryDataStorageManager.java | 2 -- src/main/java/org/qortal/controller/tradebot/TradeBot.java | 3 +-- src/test/java/org/qortal/test/apps/SyncReport.java | 3 +-- 9 files changed, 9 insertions(+), 21 deletions(-) diff --git a/src/main/java/org/qortal/api/resource/AddressesResource.java b/src/main/java/org/qortal/api/resource/AddressesResource.java index 688b17fc..66d8412c 100644 --- a/src/main/java/org/qortal/api/resource/AddressesResource.java +++ b/src/main/java/org/qortal/api/resource/AddressesResource.java @@ -233,8 +233,7 @@ public class AddressesResource { } } catch (DataException e) { - continue; - } + } } // Sort by level diff --git a/src/main/java/org/qortal/controller/BlockMinter.java b/src/main/java/org/qortal/controller/BlockMinter.java index 7272ee95..91dd12bb 100644 --- a/src/main/java/org/qortal/controller/BlockMinter.java +++ b/src/main/java/org/qortal/controller/BlockMinter.java @@ -159,8 +159,7 @@ public class BlockMinter extends Thread { int level = mintingAccount.getEffectiveMintingLevel(); if (level < BlockChain.getInstance().getMinAccountLevelForBlockSubmissions()) { madi.remove(); - continue; - } + } } // Needs a mutable copy of the unmodifiableList diff --git a/src/main/java/org/qortal/controller/Controller.java b/src/main/java/org/qortal/controller/Controller.java index 30537b32..2ea376bd 100644 --- a/src/main/java/org/qortal/controller/Controller.java +++ b/src/main/java/org/qortal/controller/Controller.java @@ -1921,8 +1921,7 @@ public class Controller extends Thread { // Disregard peers that don't have a recent block if (peerChainTipData.getTimestamp() == null || peerChainTipData.getTimestamp() < minLatestBlockTimestamp) { iterator.remove(); - continue; - } + } } return peers; diff --git a/src/main/java/org/qortal/controller/OnlineAccountsManager.java b/src/main/java/org/qortal/controller/OnlineAccountsManager.java index 9518b7f3..d37b2aef 100644 --- a/src/main/java/org/qortal/controller/OnlineAccountsManager.java +++ b/src/main/java/org/qortal/controller/OnlineAccountsManager.java @@ -538,7 +538,6 @@ public class OnlineAccountsManager { if (++i > 1 + 1) { iterator.remove(); - continue; } } } catch (DataException e) { diff --git a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataCleanupManager.java b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataCleanupManager.java index 8611ab88..7b434acb 100644 --- a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataCleanupManager.java +++ b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataCleanupManager.java @@ -208,8 +208,7 @@ public class ArbitraryDataCleanupManager extends Thread { Base58.encode(arbitraryTransactionData.getSignature()))); ArbitraryTransactionUtils.convertFileToChunks(arbitraryTransactionData, now, STALE_FILE_TIMEOUT); - continue; - } + } } } catch (DataException e) { @@ -284,8 +283,7 @@ public class ArbitraryDataCleanupManager extends Thread { } } catch (DataException e) { - continue; - } + } } return pathList; diff --git a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataManager.java b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataManager.java index 398dcb5b..37801f50 100644 --- a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataManager.java +++ b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataManager.java @@ -230,8 +230,7 @@ public class ArbitraryDataManager extends Thread { // Remove transactions that we already have local data for if (hasLocalData(arbitraryTransaction)) { iterator.remove(); - continue; - } + } } if (signatures.isEmpty()) { @@ -313,8 +312,7 @@ public class ArbitraryDataManager extends Thread { // Remove transactions that we already have local data for if (hasLocalMetadata(arbitraryTransaction)) { iterator.remove(); - continue; - } + } } if (signatures.isEmpty()) { diff --git a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataStorageManager.java b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataStorageManager.java index f6b2dc0a..91cb9965 100644 --- a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataStorageManager.java +++ b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataStorageManager.java @@ -291,7 +291,6 @@ public class ArbitraryDataStorageManager extends Thread { arbitraryTransactionDataList.add(arbitraryTransactionData); } catch (DataException e) { - continue; } } @@ -345,7 +344,6 @@ public class ArbitraryDataStorageManager extends Thread { } } catch (Exception e) { - continue; } } diff --git a/src/main/java/org/qortal/controller/tradebot/TradeBot.java b/src/main/java/org/qortal/controller/tradebot/TradeBot.java index 43330b07..3699bd2a 100644 --- a/src/main/java/org/qortal/controller/tradebot/TradeBot.java +++ b/src/main/java/org/qortal/controller/tradebot/TradeBot.java @@ -724,8 +724,7 @@ public class TradeBot implements Listener { } catch (DataException e) { LOGGER.info("Unable to determine failed state of AT {}", crossChainTradeData.qortalAtAddress); - continue; - } + } } return updatedCrossChainTrades; diff --git a/src/test/java/org/qortal/test/apps/SyncReport.java b/src/test/java/org/qortal/test/apps/SyncReport.java index 402ae118..803878c8 100644 --- a/src/test/java/org/qortal/test/apps/SyncReport.java +++ b/src/test/java/org/qortal/test/apps/SyncReport.java @@ -180,8 +180,7 @@ public class SyncReport { // Sync went bad syncEvent = null; - continue; - } + } } for (SyncEvent se : syncEvents) { From 5db808e3009ac6967fbc137dae42c2b714d3214b Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Sat, 29 Jun 2024 12:18:52 +0200 Subject: [PATCH 13/30] Replaced reference method with qualifier (websockets) --- .../java/org/qortal/api/websocket/AdminStatusWebSocket.java | 2 +- src/main/java/org/qortal/api/websocket/BlocksWebSocket.java | 2 +- src/main/java/org/qortal/api/websocket/PresenceWebSocket.java | 2 +- src/main/java/org/qortal/api/websocket/TradeBotWebSocket.java | 2 +- .../java/org/qortal/api/websocket/TradeOffersWebSocket.java | 2 +- .../java/org/qortal/api/websocket/TradePresenceWebSocket.java | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/qortal/api/websocket/AdminStatusWebSocket.java b/src/main/java/org/qortal/api/websocket/AdminStatusWebSocket.java index 4d65956e..db382779 100644 --- a/src/main/java/org/qortal/api/websocket/AdminStatusWebSocket.java +++ b/src/main/java/org/qortal/api/websocket/AdminStatusWebSocket.java @@ -31,7 +31,7 @@ public class AdminStatusWebSocket extends ApiWebSocket implements Listener { return; } - EventBus.INSTANCE.addListener(this::listen); + EventBus.INSTANCE.addListener(this); } @Override diff --git a/src/main/java/org/qortal/api/websocket/BlocksWebSocket.java b/src/main/java/org/qortal/api/websocket/BlocksWebSocket.java index 01235755..a6cf77b1 100644 --- a/src/main/java/org/qortal/api/websocket/BlocksWebSocket.java +++ b/src/main/java/org/qortal/api/websocket/BlocksWebSocket.java @@ -28,7 +28,7 @@ public class BlocksWebSocket extends ApiWebSocket implements Listener { public void configure(WebSocketServletFactory factory) { factory.register(BlocksWebSocket.class); - EventBus.INSTANCE.addListener(this::listen); + EventBus.INSTANCE.addListener(this); } @Override diff --git a/src/main/java/org/qortal/api/websocket/PresenceWebSocket.java b/src/main/java/org/qortal/api/websocket/PresenceWebSocket.java index 510b712f..f1083c66 100644 --- a/src/main/java/org/qortal/api/websocket/PresenceWebSocket.java +++ b/src/main/java/org/qortal/api/websocket/PresenceWebSocket.java @@ -86,7 +86,7 @@ public class PresenceWebSocket extends ApiWebSocket implements Listener { return; } - EventBus.INSTANCE.addListener(this::listen); + EventBus.INSTANCE.addListener(this); } @Override diff --git a/src/main/java/org/qortal/api/websocket/TradeBotWebSocket.java b/src/main/java/org/qortal/api/websocket/TradeBotWebSocket.java index 7746f8f8..29713aff 100644 --- a/src/main/java/org/qortal/api/websocket/TradeBotWebSocket.java +++ b/src/main/java/org/qortal/api/websocket/TradeBotWebSocket.java @@ -43,7 +43,7 @@ public class TradeBotWebSocket extends ApiWebSocket implements Listener { // No output this time } - EventBus.INSTANCE.addListener(this::listen); + EventBus.INSTANCE.addListener(this); } @Override diff --git a/src/main/java/org/qortal/api/websocket/TradeOffersWebSocket.java b/src/main/java/org/qortal/api/websocket/TradeOffersWebSocket.java index 3f61fb98..96257f4a 100644 --- a/src/main/java/org/qortal/api/websocket/TradeOffersWebSocket.java +++ b/src/main/java/org/qortal/api/websocket/TradeOffersWebSocket.java @@ -67,7 +67,7 @@ public class TradeOffersWebSocket extends ApiWebSocket implements Listener { return; } - EventBus.INSTANCE.addListener(this::listen); + EventBus.INSTANCE.addListener(this); } @Override diff --git a/src/main/java/org/qortal/api/websocket/TradePresenceWebSocket.java b/src/main/java/org/qortal/api/websocket/TradePresenceWebSocket.java index ba9a8085..4477d761 100644 --- a/src/main/java/org/qortal/api/websocket/TradePresenceWebSocket.java +++ b/src/main/java/org/qortal/api/websocket/TradePresenceWebSocket.java @@ -29,7 +29,7 @@ public class TradePresenceWebSocket extends ApiWebSocket implements Listener { populateCurrentInfo(); - EventBus.INSTANCE.addListener(this::listen); + EventBus.INSTANCE.addListener(this); } @Override From a6cbdaafd84c2ef28166ee289b350d867aa97e14 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Sat, 29 Jun 2024 12:23:57 +0200 Subject: [PATCH 14/30] Updated to bouncycastle 1.70 (AT and Core) --- lib/org/ciyam/AT/1.4.2/AT-1.4.2.jar | Bin 0 -> 161859 bytes lib/org/ciyam/AT/1.4.2/AT-1.4.2.pom | 123 ++++++++++++++++++++++ lib/org/ciyam/AT/maven-metadata-local.xml | 5 +- pom.xml | 4 +- 4 files changed, 128 insertions(+), 4 deletions(-) create mode 100644 lib/org/ciyam/AT/1.4.2/AT-1.4.2.jar create mode 100644 lib/org/ciyam/AT/1.4.2/AT-1.4.2.pom diff --git a/lib/org/ciyam/AT/1.4.2/AT-1.4.2.jar b/lib/org/ciyam/AT/1.4.2/AT-1.4.2.jar new file mode 100644 index 0000000000000000000000000000000000000000..24a1da570cc971038f3f7735a1abe622e312a507 GIT binary patch literal 161859 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 GS@1vk_BKrb literal 0 HcmV?d00001 diff --git a/lib/org/ciyam/AT/1.4.2/AT-1.4.2.pom b/lib/org/ciyam/AT/1.4.2/AT-1.4.2.pom new file mode 100644 index 00000000..49cf55e4 --- /dev/null +++ b/lib/org/ciyam/AT/1.4.2/AT-1.4.2.pom @@ -0,0 +1,123 @@ + + 4.0.0 + org.ciyam + AT + 1.4.2 + jar + + + UTF-8 + false + 1.70 + 4.13.2 + 3.13.0 + 3.3.0 + 3.6.3 + 3.2.5 + 3.4.1 + + + + src/main/java + src/test/java + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 11 + 11 + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + ${skipTests} + + + + org.apache.maven.plugins + maven-source-plugin + ${maven-source-plugin.version} + + + attach-sources + + jar + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + ${maven-javadoc-plugin.version} + + + attach-javadoc + + jar + + + + + + org.apache.maven.plugins + maven-jar-plugin + ${maven-jar-plugin.version} + + + + test-jar + + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + + org.apache.maven.plugins + maven-source-plugin + ${maven-source-plugin.version} + + + org.apache.maven.plugins + maven-javadoc-plugin + ${maven-javadoc-plugin.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven-jar-plugin.version} + + + org.bouncycastle + bcprov-jdk15on + ${bouncycastle.version} + test + + + junit + junit + ${junit.version} + test + + + diff --git a/lib/org/ciyam/AT/maven-metadata-local.xml b/lib/org/ciyam/AT/maven-metadata-local.xml index 355c973f..4ace7241 100644 --- a/lib/org/ciyam/AT/maven-metadata-local.xml +++ b/lib/org/ciyam/AT/maven-metadata-local.xml @@ -3,13 +3,14 @@ org.ciyam AT - 1.4.1 + 1.4.2 1.3.7 1.3.8 1.4.0 1.4.1 + 1.4.2 - 20231212092227 + 20240426084210 diff --git a/pom.xml b/pom.xml index 4eaaa408..6edcba33 100644 --- a/pom.xml +++ b/pom.xml @@ -9,9 +9,9 @@ true 7dc8c6f 0.15.10 - 1.69 + 1.70 ${maven.build.timestamp} - 1.4.1 + 1.4.2 3.8.0 1.11.0 2.15.1 From ea1d4dd9627cb373be7cab8ba462b0cda8bf0948 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Sat, 29 Jun 2024 12:48:06 +0200 Subject: [PATCH 15/30] Updated electrumx with non null objects --- src/main/java/org/qortal/crosschain/ElectrumX.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/qortal/crosschain/ElectrumX.java b/src/main/java/org/qortal/crosschain/ElectrumX.java index ad211c03..0e70f787 100644 --- a/src/main/java/org/qortal/crosschain/ElectrumX.java +++ b/src/main/java/org/qortal/crosschain/ElectrumX.java @@ -142,7 +142,7 @@ public class ElectrumX extends BitcoinyBlockchainProvider { private int nextId = 1; private static final int TX_CACHE_SIZE = 1000; - @SuppressWarnings("serial") + private final Map transactionCache = Collections.synchronizedMap(new LinkedHashMap<>(TX_CACHE_SIZE + 1, 0.75F, true) { // This method is called just after a new entry has been added @Override @@ -222,10 +222,10 @@ public class ElectrumX extends BitcoinyBlockchainProvider { if (!(countObj instanceof Long) || !(hexObj instanceof String)) throw new ForeignBlockchainException.NetworkException("Missing/invalid 'count' or 'hex' entries in JSON from ElectrumX blockchain.block.headers RPC"); - Long returnedCount = (Long) countObj; + long returnedCount = (Long) countObj; String hex = (String) hexObj; - List rawBlockHeaders = new ArrayList<>(returnedCount.intValue()); + List rawBlockHeaders = new ArrayList<>((int) returnedCount); byte[] raw = HashCode.fromString(hex).asBytes(); @@ -592,7 +592,7 @@ public class ElectrumX extends BitcoinyBlockchainProvider { Object peers = this.connectedRpc("server.peers.subscribe"); - for (Object rawPeer : (JSONArray) peers) { + for (Object rawPeer : (JSONArray) Objects.requireNonNull(peers)) { JSONArray peer = (JSONArray) rawPeer; if (peer.size() < 3) // We're expecting at least 3 fields for each peer entry: IP, hostname, features @@ -721,7 +721,7 @@ public class ElectrumX extends BitcoinyBlockchainProvider { // Check connection is suitable by asking for server features, including genesis block hash JSONObject featuresJson = (JSONObject) this.connectedRpc("server.features"); - if (featuresJson == null || Double.valueOf((String) featuresJson.get("protocol_min")) < MIN_PROTOCOL_VERSION) + if (featuresJson == null || Double.parseDouble((String) featuresJson.get("protocol_min")) < MIN_PROTOCOL_VERSION) return Optional.of( recorder.recordConnection(server, requestedBy, true, false, MINIMUM_VERSION_ERROR) ); if (this.expectedGenesisHash != null && !((String) featuresJson.get("genesis_hash")).equals(this.expectedGenesisHash)) @@ -729,9 +729,11 @@ public class ElectrumX extends BitcoinyBlockchainProvider { // Ask for more servers Set moreServers = serverPeersSubscribe(); + // Discard duplicate servers we already know moreServers.removeAll(this.servers); - // Add to both lists + + // Add all servers to both lists this.remainingServers.addAll(moreServers); this.servers.addAll(moreServers); From a140805c363fd00135f7391e6abc0823de248dcc Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Sat, 29 Jun 2024 12:58:58 +0200 Subject: [PATCH 16/30] Updated group transactions (owner check) --- .../org/qortal/transaction/CancelGroupBanTransaction.java | 4 ++++ src/main/java/org/qortal/transaction/GroupBanTransaction.java | 4 ++++ .../java/org/qortal/transaction/GroupKickTransaction.java | 4 ++++ .../java/org/qortal/transaction/UpdateGroupTransaction.java | 4 ++++ 4 files changed, 16 insertions(+) diff --git a/src/main/java/org/qortal/transaction/CancelGroupBanTransaction.java b/src/main/java/org/qortal/transaction/CancelGroupBanTransaction.java index a9577bc5..f3511ded 100644 --- a/src/main/java/org/qortal/transaction/CancelGroupBanTransaction.java +++ b/src/main/java/org/qortal/transaction/CancelGroupBanTransaction.java @@ -70,6 +70,10 @@ public class CancelGroupBanTransaction extends Transaction { if (!this.repository.getGroupRepository().adminExists(groupId, admin.getAddress())) return ValidationResult.NOT_GROUP_ADMIN; + // Can't unban if not group's current owner + if (!admin.getAddress().equals(groupData.getOwner())) + return ValidationResult.INVALID_GROUP_OWNER; + Account member = getMember(); // Check ban actually exists diff --git a/src/main/java/org/qortal/transaction/GroupBanTransaction.java b/src/main/java/org/qortal/transaction/GroupBanTransaction.java index 27c00d5c..1716d206 100644 --- a/src/main/java/org/qortal/transaction/GroupBanTransaction.java +++ b/src/main/java/org/qortal/transaction/GroupBanTransaction.java @@ -70,6 +70,10 @@ public class GroupBanTransaction extends Transaction { if (!this.repository.getGroupRepository().adminExists(groupId, admin.getAddress())) return ValidationResult.NOT_GROUP_ADMIN; + // Can't ban if not group's current owner + if (!admin.getAddress().equals(groupData.getOwner())) + return ValidationResult.INVALID_GROUP_OWNER; + Account offender = getOffender(); // Can't ban group owner diff --git a/src/main/java/org/qortal/transaction/GroupKickTransaction.java b/src/main/java/org/qortal/transaction/GroupKickTransaction.java index d67f3d15..3c426039 100644 --- a/src/main/java/org/qortal/transaction/GroupKickTransaction.java +++ b/src/main/java/org/qortal/transaction/GroupKickTransaction.java @@ -82,6 +82,10 @@ public class GroupKickTransaction extends Transaction { if (!admin.getAddress().equals(groupData.getOwner()) && groupRepository.adminExists(groupId, member.getAddress())) return ValidationResult.INVALID_GROUP_OWNER; + // Can't kick if not group's current owner + if (!admin.getAddress().equals(groupData.getOwner())) + return ValidationResult.INVALID_GROUP_OWNER; + // Check creator has enough funds if (admin.getConfirmedBalance(Asset.QORT) < this.groupKickTransactionData.getFee()) return ValidationResult.NO_BALANCE; diff --git a/src/main/java/org/qortal/transaction/UpdateGroupTransaction.java b/src/main/java/org/qortal/transaction/UpdateGroupTransaction.java index a2546c69..b61594bd 100644 --- a/src/main/java/org/qortal/transaction/UpdateGroupTransaction.java +++ b/src/main/java/org/qortal/transaction/UpdateGroupTransaction.java @@ -83,6 +83,10 @@ public class UpdateGroupTransaction extends Transaction { Account owner = getOwner(); + // Check creator is group's current owner + if (!owner.getAddress().equals(groupData.getOwner())) + return ValidationResult.INVALID_GROUP_OWNER; + // Check creator has enough funds if (owner.getConfirmedBalance(Asset.QORT) < this.updateGroupTransactionData.getFee()) return ValidationResult.NO_BALANCE; From 44b4b081177f442466bff96562fdc6350f147546 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Sat, 29 Jun 2024 13:17:07 +0200 Subject: [PATCH 17/30] Added block minter thread check --- .../org/qortal/controller/Controller.java | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/qortal/controller/Controller.java b/src/main/java/org/qortal/controller/Controller.java index 2ea376bd..6f0f5f80 100644 --- a/src/main/java/org/qortal/controller/Controller.java +++ b/src/main/java/org/qortal/controller/Controller.java @@ -564,6 +564,30 @@ public class Controller extends Thread { // If GUI is enabled, we're no longer starting up but actually running now Gui.getInstance().notifyRunning(); + + // Check every 10 minutes to see if the block minter is running + Timer timer = new Timer(); + + timer.schedule(new TimerTask() { + @Override + public void run() { + if (blockMinter.isAlive()) { + LOGGER.debug("Block minter is running? {}", blockMinter.isAlive()); + } else if (!blockMinter.isAlive()) { + LOGGER.debug("Block minter is running? {}", blockMinter.isAlive()); + blockMinter.shutdown(); + TimeUnit.SECONDS.sleep(10); + try { + // Start new block minter thread + LOGGER.info("Restarting block minter"); + blockMinter.start(); + } catch (Exception e) { + // Couldn't start new block minter thread + LOGGER.info("Starting block minter failed {}", e); + } + } + } + }, 10*60*1000, 10*60*1000); } /** Called by AdvancedInstaller's launch EXE in single-instance mode, when an instance is already running. */ @@ -571,7 +595,6 @@ public class Controller extends Thread { // Return as we don't want to run more than one instance } - // Main thread @Override From 533df9f2b8b9ac8298b4cef650856e9e978b339a Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Sat, 29 Jun 2024 15:01:36 +0200 Subject: [PATCH 18/30] Updated dependencies --- pom.xml | 33 ++++++++++--------- .../org/qortal/controller/Controller.java | 9 +++-- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/pom.xml b/pom.xml index 6edcba33..f3ffe533 100644 --- a/pom.xml +++ b/pom.xml @@ -6,55 +6,56 @@ 4.5.1 jar + UTF-8 true + 7dc8c6f 0.15.10 1.70 ${maven.build.timestamp} 1.4.2 3.8.0 - 1.11.0 - 2.15.1 - 1.26.1 + 1.12.0 + 2.16.1 + 1.26.2 3.14.0 1.2.2 0.12.3 4.9.10 - 1.62.2 - 33.0.0-jre + 1.65.0 + 33.2.1-jre 2.2 1.2.1 2.5.1 - 74.2 + 75.1 4.12 4.0.1 2.3.9 - 2.41 + 2.42 9.4.54.v20240208 1.1.1 20240303 1.17.2 - 5.10.0 + 5.11.0-M2 1.0.0 - 2.23.0 + 2.23.1 1.5.0-b01 - 3.5.0 - 3.12.1 + 3.6.0 + 3.13.0 3.6.1 - 3.3.0 + 3.4.2 1.1.0 2.16.2 0.16 3.3.1 - 3.5.2 - 3.2.5 - UTF-8 + 3.6.0 + 3.3.0 3.25.3 1.5.3 1.17 1.7.36 2.0.10 - 5.11.8 + 5.17.14 1.2 1.9 diff --git a/src/main/java/org/qortal/controller/Controller.java b/src/main/java/org/qortal/controller/Controller.java index 6f0f5f80..17d63313 100644 --- a/src/main/java/org/qortal/controller/Controller.java +++ b/src/main/java/org/qortal/controller/Controller.java @@ -576,14 +576,18 @@ public class Controller extends Thread { } else if (!blockMinter.isAlive()) { LOGGER.debug("Block minter is running? {}", blockMinter.isAlive()); blockMinter.shutdown(); - TimeUnit.SECONDS.sleep(10); + try { + // Wait 10 seconds before restart + TimeUnit.SECONDS.sleep(10); + // Start new block minter thread LOGGER.info("Restarting block minter"); blockMinter.start(); - } catch (Exception e) { + } catch (InterruptedException e) { // Couldn't start new block minter thread LOGGER.info("Starting block minter failed {}", e); + throw new RuntimeException(e); } } } @@ -2024,5 +2028,4 @@ public class Controller extends Thread { public StatsSnapshot getStatsSnapshot() { return this.stats; } - } From 2d9f1d6d81f5c92349c1394c91f821e51a96a642 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Sun, 30 Jun 2024 18:38:34 +0200 Subject: [PATCH 19/30] Update minimum peer version --- src/main/java/org/qortal/settings/Settings.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/qortal/settings/Settings.java b/src/main/java/org/qortal/settings/Settings.java index df59c037..de0ce5ed 100644 --- a/src/main/java/org/qortal/settings/Settings.java +++ b/src/main/java/org/qortal/settings/Settings.java @@ -211,7 +211,7 @@ public class Settings { public long recoveryModeTimeout = 9999999999999L; /** Minimum peer version number required in order to sync with them */ - private String minPeerVersion = "4.5.0"; + private String minPeerVersion = "4.5.1"; /** Whether to allow connections with peers below minPeerVersion * If true, we won't sync with them but they can still sync with us, and will show in the peers list * If false, sync will be blocked both ways, and they will not appear in the peers list */ From a02d1cec75cc66cc04c7a11d95007e6a18f9a0c2 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Sun, 30 Jun 2024 18:41:04 +0200 Subject: [PATCH 20/30] Bump version to 4.5.2 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f3ffe533..4efc6b0a 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.qortal qortal - 4.5.1 + 4.5.2 jar UTF-8 From 1d9347ed2308df1d34d8ea3d3a25bb2c1be5a9c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrg=20Schulthess?= Date: Wed, 10 Jul 2024 20:23:29 +0200 Subject: [PATCH 21/30] fix pingRemote --- src/main/java/org/qortal/network/RNSPeer.java | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/qortal/network/RNSPeer.java b/src/main/java/org/qortal/network/RNSPeer.java index 399775db..c0ce575a 100644 --- a/src/main/java/org/qortal/network/RNSPeer.java +++ b/src/main/java/org/qortal/network/RNSPeer.java @@ -230,14 +230,21 @@ public class RNSPeer { /** Utility methods */ public void pingRemote() { var link = this.peerLink; - log.info("pinging remote: {}", link); - var data = "ping".getBytes(UTF_8); - link.setPacketCallback(this::linkPacketReceived); - Packet pingPacket = new Packet(link, data); - PacketReceipt packetReceipt = pingPacket.send(); - //packetReceipt.setTimeout(3L); - packetReceipt.setTimeoutCallback(this::packetTimedOut); - packetReceipt.setDeliveryCallback(this::packetDelivered); + if (nonNull(link)) { + if (peerLink.getStatus() == ACTIVE) { + log.info("pinging remote: {}", link); + var data = "ping".getBytes(UTF_8); + link.setPacketCallback(this::linkPacketReceived); + Packet pingPacket = new Packet(link, data); + PacketReceipt packetReceipt = pingPacket.send(); + //packetReceipt.setTimeout(3L); + packetReceipt.setTimeoutCallback(this::packetTimedOut); + packetReceipt.setDeliveryCallback(this::packetDelivered); + } else { + log.info("can't send ping to a peer {} with (link) status: {}", + Hex.encodeHexString(peerLink.getDestination().getHash()), peerLink.getStatus()); + } + } } //public void shutdownLink(Link link) { From c79a830f2e2f937f18c9912fbbc1b3dafc43e0ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrg=20Schulthess?= Date: Wed, 10 Jul 2024 21:27:41 +0200 Subject: [PATCH 22/30] re-introduce pingRemote during pruning --- src/main/java/org/qortal/network/RNSNetwork.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/org/qortal/network/RNSNetwork.java b/src/main/java/org/qortal/network/RNSNetwork.java index bac63f9f..003397d4 100644 --- a/src/main/java/org/qortal/network/RNSNetwork.java +++ b/src/main/java/org/qortal/network/RNSNetwork.java @@ -487,6 +487,7 @@ public class RNSNetwork { log.info("prunePeers - pLink: {}, destinationHash: {}", pLink, Hex.encodeHexString(p.getDestinationHash())); log.debug("peer: {}", p); + p.pingRemote(); if (nonNull(pLink)) { if (p.getPeerTimedOut()) { // close peer link for now @@ -504,6 +505,8 @@ public class RNSNetwork { p.shutdown(); peerList.remove(p); } + } else { + peerList.remove(p); } } //removeExpiredPeers(this.linkedPeers); From fabfed552e4b1b282cc34d3c1fd85c01e75f6b3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrg=20Schulthess?= Date: Wed, 10 Jul 2024 21:28:02 +0200 Subject: [PATCH 23/30] add receipt timeout --- src/main/java/org/qortal/network/RNSPeer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/qortal/network/RNSPeer.java b/src/main/java/org/qortal/network/RNSPeer.java index c0ce575a..adb0ee29 100644 --- a/src/main/java/org/qortal/network/RNSPeer.java +++ b/src/main/java/org/qortal/network/RNSPeer.java @@ -237,7 +237,7 @@ public class RNSPeer { link.setPacketCallback(this::linkPacketReceived); Packet pingPacket = new Packet(link, data); PacketReceipt packetReceipt = pingPacket.send(); - //packetReceipt.setTimeout(3L); + packetReceipt.setTimeout(3L); packetReceipt.setTimeoutCallback(this::packetTimedOut); packetReceipt.setDeliveryCallback(this::packetDelivered); } else { From 61e57f9672360a0fe3dfef596c34523c41c95a66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrg=20Schulthess?= Date: Wed, 10 Jul 2024 22:01:39 +0200 Subject: [PATCH 24/30] minimize packet timeout callback --- src/main/java/org/qortal/network/RNSNetwork.java | 5 +---- src/main/java/org/qortal/network/RNSPeer.java | 5 +---- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/qortal/network/RNSNetwork.java b/src/main/java/org/qortal/network/RNSNetwork.java index 003397d4..9dc3df50 100644 --- a/src/main/java/org/qortal/network/RNSNetwork.java +++ b/src/main/java/org/qortal/network/RNSNetwork.java @@ -236,10 +236,7 @@ public class RNSNetwork { } public void packetTimedOut(PacketReceipt receipt) { - log.info("packet timed out"); - if (receipt.getStatus() == PacketReceiptStatus.FAILED) { - log.info("packet timed out, receipt status: {}", PacketReceiptStatus.FAILED); - } + log.info("packet timed out, receipt status: {}", receipt.getStatus()); } public void clientConnected(Link link) { diff --git a/src/main/java/org/qortal/network/RNSPeer.java b/src/main/java/org/qortal/network/RNSPeer.java index adb0ee29..bf65cf81 100644 --- a/src/main/java/org/qortal/network/RNSPeer.java +++ b/src/main/java/org/qortal/network/RNSPeer.java @@ -191,12 +191,9 @@ public class RNSPeer { } public void packetTimedOut(PacketReceipt receipt) { - log.info("packet timed out"); + log.info("packet timed out, receipt status: {}", receipt.getStatus()); if (receipt.getStatus() == PacketReceiptStatus.FAILED) { - log.info("packet timed out, receipt status: {}", PacketReceiptStatus.FAILED); this.peerTimedOut = true; - peerLink.teardown(); - //this.deleteMe = true; } } From a445fdc8f2f6e0b8d7d8ac17c510d9ec9e5d35b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrg=20Schulthess?= Date: Wed, 10 Jul 2024 22:16:40 +0200 Subject: [PATCH 25/30] no pinging during pruning --- src/main/java/org/qortal/network/RNSNetwork.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/qortal/network/RNSNetwork.java b/src/main/java/org/qortal/network/RNSNetwork.java index 9dc3df50..e23c293d 100644 --- a/src/main/java/org/qortal/network/RNSNetwork.java +++ b/src/main/java/org/qortal/network/RNSNetwork.java @@ -484,7 +484,6 @@ public class RNSNetwork { log.info("prunePeers - pLink: {}, destinationHash: {}", pLink, Hex.encodeHexString(p.getDestinationHash())); log.debug("peer: {}", p); - p.pingRemote(); if (nonNull(pLink)) { if (p.getPeerTimedOut()) { // close peer link for now From 185f3f515bd5b3828d3e6e8270f6f65f197eb602 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrg=20Schulthess?= Date: Fri, 12 Jul 2024 19:17:47 +0200 Subject: [PATCH 26/30] a few fixes to the mesh functionality --- .../java/org/qortal/network/RNSNetwork.java | 59 +++++++++++++------ src/main/java/org/qortal/network/RNSPeer.java | 3 +- 2 files changed, 42 insertions(+), 20 deletions(-) diff --git a/src/main/java/org/qortal/network/RNSNetwork.java b/src/main/java/org/qortal/network/RNSNetwork.java index e23c293d..d6b8b220 100644 --- a/src/main/java/org/qortal/network/RNSNetwork.java +++ b/src/main/java/org/qortal/network/RNSNetwork.java @@ -167,7 +167,20 @@ public class RNSNetwork { //rnsNetworkEPC.start(); } - //@Synchronized + private void initConfig(String configDir) throws IOException { + File configDir1 = new File(defaultConfigPath); + if (!configDir1.exists()) { + configDir1.mkdir(); + } + var configPath = Path.of(configDir1.getAbsolutePath()); + Path configFile = configPath.resolve(CONFIG_FILE_NAME); + + if (Files.notExists(configFile)) { + var defaultConfig = this.getClass().getClassLoader().getResourceAsStream("reticulum_default_config.yml"); + Files.copy(defaultConfig, configFile, StandardCopyOption.REPLACE_EXISTING); + } + } + public void shutdown() { isShuttingDown = true; log.info("shutting down Reticulum"); @@ -194,28 +207,21 @@ public class RNSNetwork { } // gracefully close links of peers that point to us for (Link l: incomingLinks) { - var data = concatArrays("close::".getBytes(UTF_8),l.getDestination().getHash()); - Packet closePacket = new Packet(l, data); - var packetReceipt = closePacket.send(); - packetReceipt.setTimeout(3L); - packetReceipt.setDeliveryCallback(this::closePacketDelivered); - packetReceipt.setTimeoutCallback(this::packetTimedOut); + sendCloseToRemote(l); } // Note: we still need to get the packet timeout callback to work... reticulum.exitHandler(); } - private void initConfig(String configDir) throws IOException { - File configDir1 = new File(defaultConfigPath); - if (!configDir1.exists()) { - configDir1.mkdir(); - } - var configPath = Path.of(configDir1.getAbsolutePath()); - Path configFile = configPath.resolve(CONFIG_FILE_NAME); - - if (Files.notExists(configFile)) { - var defaultConfig = this.getClass().getClassLoader().getResourceAsStream("reticulum_default_config.yml"); - Files.copy(defaultConfig, configFile, StandardCopyOption.REPLACE_EXISTING); + public void sendCloseToRemote(Link link) { + if (nonNull(link)) { + var data = concatArrays("close::".getBytes(UTF_8),link.getDestination().getHash()); + Packet closePacket = new Packet(link, data); + var packetReceipt = closePacket.send(); + packetReceipt.setDeliveryCallback(this::closePacketDelivered); + packetReceipt.setTimeoutCallback(this::packetTimedOut); + } else { + log.debug("can't send to null link"); } } @@ -507,7 +513,22 @@ public class RNSNetwork { } //removeExpiredPeers(this.linkedPeers); log.info("number of links (linkedPeers) after prunig: {}", peerList.size()); - log.info("we have {} non-initiator links, list: {}", incomingLinks.size(), incomingLinks); + //log.info("we have {} non-initiator links, list: {}", incomingLinks.size(), incomingLinks); + var activePeerCount = 0; + var lps = RNSNetwork.getInstance().getLinkedPeers(); + for (RNSPeer p: lps) { + pLink = p.getPeerLink(); + p.pingRemote(); + try { + TimeUnit.SECONDS.sleep(2); // allow for peers to disconnect gracefully + } catch (InterruptedException e) { + log.error("exception: {}", e); + } + if ((nonNull(pLink) && (pLink.getStatus() == ACTIVE))) { + activePeerCount = activePeerCount + 1; + } + } + log.info("we have {} active peers", activePeerCount); maybeAnnounce(getBaseDestination()); } diff --git a/src/main/java/org/qortal/network/RNSPeer.java b/src/main/java/org/qortal/network/RNSPeer.java index bf65cf81..17139855 100644 --- a/src/main/java/org/qortal/network/RNSPeer.java +++ b/src/main/java/org/qortal/network/RNSPeer.java @@ -194,6 +194,7 @@ public class RNSPeer { log.info("packet timed out, receipt status: {}", receipt.getStatus()); if (receipt.getStatus() == PacketReceiptStatus.FAILED) { this.peerTimedOut = true; + this.peerLink.teardown(); } } @@ -234,7 +235,7 @@ public class RNSPeer { link.setPacketCallback(this::linkPacketReceived); Packet pingPacket = new Packet(link, data); PacketReceipt packetReceipt = pingPacket.send(); - packetReceipt.setTimeout(3L); + // Note: don't setTimeout, we want it to timeout with FAIL if not deliverable packetReceipt.setTimeoutCallback(this::packetTimedOut); packetReceipt.setDeliveryCallback(this::packetDelivered); } else { From a497edc488a7ccb4ebe30ecab4225faef25f3170 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrg=20Schulthess?= Date: Thu, 1 Aug 2024 13:42:51 +0200 Subject: [PATCH 27/30] fix dependencies for reticulum using nitrited db caching --- .../1.0-SNAPSHOT/maven-metadata-local.xml | 4 +- .../reticulum-network-stack-1.0-SNAPSHOT.jar | Bin 301100 -> 334268 bytes .../maven-metadata-local.xml | 2 +- pom.xml | 278 +++++++++++------- .../java/org/qortal/network/RNSNetwork.java | 19 +- src/main/java/org/qortal/network/RNSPeer.java | 1 + 6 files changed, 188 insertions(+), 116 deletions(-) diff --git a/lib/io/reticulum/reticulum-network-stack/1.0-SNAPSHOT/maven-metadata-local.xml b/lib/io/reticulum/reticulum-network-stack/1.0-SNAPSHOT/maven-metadata-local.xml index ddc85eb7..2d49ab7c 100644 --- a/lib/io/reticulum/reticulum-network-stack/1.0-SNAPSHOT/maven-metadata-local.xml +++ b/lib/io/reticulum/reticulum-network-stack/1.0-SNAPSHOT/maven-metadata-local.xml @@ -7,12 +7,12 @@ true - 20240707083116 + 20240731195206 jar 1.0-SNAPSHOT - 20240707083116 + 20240731195206 pom diff --git a/lib/io/reticulum/reticulum-network-stack/1.0-SNAPSHOT/reticulum-network-stack-1.0-SNAPSHOT.jar b/lib/io/reticulum/reticulum-network-stack/1.0-SNAPSHOT/reticulum-network-stack-1.0-SNAPSHOT.jar index a7473ddf156c6e62f21731d3b3428de69b5c8766..fd6591774c3576ee4a72411e234e51652f485ef0 100644 GIT binary patch delta 127156 zcmbTdWmKD6)HPbXxI2a7?(XjH?(P&Q4xzZaYlAz%ixaH4YmnkDMT>LK>G|GqzxV#U z`H?-JwdR^jp1nshA~hhat|lB*HANU$q!0f-jOyN#QK?W3>)!R6qWv;F|1m`;i-Zv2 z`N8|ibW}!n8Fd+b_`$tRfZ;5}OGH3Up zuro!|p^Uvi3k$>lH&hIU_y43N&AfDi#S-|ReE(bT!w1ZNbnRVP z-K{4EVNKBzg zGkcw3(f-#hP={syKlhOxMz`+0sRcF%_Ak&t#E1G9q&gvOBmO(Ql6)od#Z(<+K>+H< z8Te*46Q3h4Lavyiid0z$RJwC}7CMtL=^p_7oI6DFXa&jAz0cWWmm%=^E zqCr8=Xj|+Ti|PX@=&XbMOq`x2DsdnV#vAv7I27F>e`lxW0gzLo6{awia);i6ce{?n z0w&u7tx#gxTOTNc^ai^?j~{Hdp$_-#-1Kt8q%pD z-}w`?a2^jc)=gxAnt3!)t{HK6aXHAZ+qAd1r)Smr%YOj0Aw2#InzEZcly^oGJfl>K z^}HWIF%hNeZlR-@e-$th?|CR%atP@I`N|~Ql~1dQCUFiq+sl!aBeS%10{X^C;ouQE zxUzj%j7x`mOV(7B(F!Y>mczB0GW$u7D-&~3&WA)K)@7tDlN^c^rO*8q0-tXI(;E8b zn^#IWqhgHGuc-#8?IKZ-(uBB3FK!6iXWAzNs^@ zSYlUr)xj6vDd2kJE;Do`5QmYrcZ3V#HidVFLD@TMQw2f&&-wZI;h(+UWQke_gZ2;5 zQ{L`=1X???{O8iHT=@^M)w%wsQ`8LmUwCDU_Q$_usGi3E!dt;c|B-QrE&i*}Zz}RX7wnuH z?7!qx@1-%+f1Ab$HjBrB`tTt=_1iH?D(C>c$# zf0meolmDjTeT)qCw~Fu+0_4Bo`<>K(uERfw|4rrQY4xwGZ5ke`2JhdN+k!qpk^HT- zEuS39{%>cQh;&f(nE#$T<$I&Zri2e4Rz#pakffR*69QN)oyk`aYs4Iu= zs#b@V6`k5Y+S7hZF#GSD0Y8H}S0}}vpW9Midme2zC%SxZ>U=qG2LJq7NBU7 z$;U>LPl61f?pMxt&OcAhElT#GAdpvbiG!oOO0Z*M|Ea<*HksYNDX(C?L>M6=ix_Gn@!AWEQAmIa*y4~7ADl8$V64t2>~n_*ht;|M#)(3`g8U=py@ z;F<_g6~P!Vz)S@GR@?e$g&1XeIgZ~z*5zSd=xTFp6;|E*8>hwh*2<8a)CB{SSk}1Zu?oA zWs0UVGk-)DY}@1S}5=vS7^G&L(=hy#7zSLV*x?rFBm~#l50Ck)L$o7 z7MqkG5Q`XRqXQ}?!xYtVhInNFSb8*F^jauLHMA~X?ZJ#u>9~=*EYQ`IRJA$wJtov! zhoEe6`jC4xQtLhyG?m;&k0NJha#=iM)Lyo&Oz66Aj)Y26{W&@7>sO(|(#|yd=s!=3 zqEGJ8EOx%JuR0QTGN1>+Efc$i1`}`7IN7v1QK4f2^)RSK8iZV99nU-gBzY`9R)bBE zAL0jP{xC&tE}3<)cq)WkZ&GY|yD?G-gdpl&X4Pn%dck8iI*{Ghj15+hxr91HUxamn z5RVDkhPk^*{e#phOM=fqFp;@(pJV0&oXYM~)VXb{ywbA#%`&0>ApJnUuyqqtq1V8T zh2w<`><;)jNG4}UIijTiYOe-DfBVC{ecmE3np6*TKv5x{15-rZw1CSnzCsd9-lKwL zx7lm#o%!a@g7WcWTMg~9Ic)CEl&mL5aSNRkEu@MJJ>gp}zCfv}&0iam;B77Zp@jlO zl&h_@U>J%iaT)$n&p$FrrT*+3j}IjZ17P3Mhnk*cBHNk;QQ61=-eig}H4tAx#09)t zuF!8PT)b4gS|rO;A4}De@nO3@vaU7>LohS@TOxY8n6_|z($h>2V+G2FceLw~eL@F) z)jfDq{E;_#wmv~!_V>ztx#HGvu_F+vOZ(6n2Dr&33lV_z`5WSb*#1{7}K8DrBjJ2;gE7d>6W zVl$B`1G9K<;@Go&pXXx|^?_#6P9Kilc=)Hu=I2RH$bMsi74!+K)Kd7EIV&TtOSBrr zLr`s?NMy7a2uU)+zwI~AcggcLt*C(`8eTE944dI*4HVBfH(T$wQfZcD3=Kf>G{j&t z4d#uN0d&k#>Wef;p4s&IDz^L3+pF5^z;s0_vB?}q$z$rg{IlgMEWE3F@aY~!`OcI3$#z8~=>m;YmifxjOtpV_ z)=rRGz6fz+)b_wUFCaCd6qu*N<|>hB%7POoX00>{07}kIsObol$#f@XK=)X=vE22t zTEz4=eY^B?I|>!$Mb+XH^eGIbIu3h|=39o3jf|9I17BdH`Y56X-I=g5?mI@&Bvot^ zNzgQG-Uom_zC=h-%?xn4;%EBQ+~d;;W=$wwR0h6h65PMTBG2Mt7X@29U$EQVBi%&XRLF4~F> z^;Z^Z`kxp!oe)DIc~4%>yj$H>TVa*OaMiT9>tg+t!wto&3v??SDVhCvGCOOR;-ziYY}0GEr`5Y(upC(7ao&QZlUlfwGoTafeW zgzCtl*JMT>QTF%{)F&m)WiB~d)pQFf;;zvKu}OBavL+Liq}3>955Ar=oRJ@$(?t-R zj5j?~3wrdw2!n<6K?DOl2XLAv_@S1ZsFMYYEpL=nsU`h>@Ra_s<6-Wl9Y{9q(+H=xHLLdcgiuTpx7Shw1>BBvrKFd2Xax%g=|eH4kSVHrsC-R#jxVs$gLrxZ>pYQKz51YL>x%6 zg@qny8g;bT_f&XbE8n_dCJ4JWdhw;kEIPeCzu~*J;&YKBu^hGCFu$OezK-=4K2zkP_r!iLQwPPO>no%<;aS1;rx0e_oN~QV*Bq zjhT;>h4oJpNh2SHTRUhD$4nC>SF?Ca1|N|u@+a1r1x!?(%7fpijK5F0$w8O0sv_Pu zzswOiIM%tt$M(EPgKUq-Ka?v4vL!S8(FJ>HQpV=hBdd+OAP<280RsU31;uB(QmTaj zPumLYyO_gTo}SMuv1in(#QU~2za#@Vg0&z52R^FntNT-Dp~F4Pp&7{1&Be`c zy#96ti;%O0=A(0YDRKfJ_t|EJnq`d#Ze8>-=POy+yNcj9$=}GD{1)+GyvK7#a1YS6 zjMEyWwYxbcv%FLfX5G=NyDzz8{|4B%zQ z7JMMt)?-lfi-Q~2T15E@8vT%Bu{(!$p#-T~NkHl$IivRwbS0qS98Azk(y}@-_%Vad zbUr%?!u&}5WArAv_|sYBfDdp>Iv}`Ido|WPOgAx-DTKn-`3Eys_MANVK6OZ@J6DUA zJ3c3$k5X$K|BK302=Sd?(pD&cj;W2Zv81K;M&5~wA`AUK7BwYVOzpt{0m`RTNAn1$ zC}<)cKLHO z6l$=uFH1H9HXD6}V>EM8IZ1{uyh(emt||j^!031{7zqHInIL^ZX|x<`_pqUz90(*Q z;)GxEv_gU>~& zb(7g>MbX2LxXCv^dP>hOV$_zL#z?D3-;Q}9c{EbB0k*xL_PQ9ho`N&Xh}SMCsaec2 zbs95(WfjoDN4q40DuUjy*KnZr&9B`>}bEuTn|IYr7+eGmYUi6YG3CTn=8*hhTlZ= z0&|EHI(0hRxQohGzVQZCm6}6yp6mbyO*i1+C4TvBcFISoqVoe=8rl>cP);Uv5s< znQJbje@J^^eUOlARuwaVa?*XEps!;5MiWjnzEB0;%c;1ugN&_g*|&LY&-Qcnj|Z>r z&-N8ExdnyP534UE@J}5x!|>O)rK~3wSR8=pn;Fo~VL3D2E&@Xk@WWnKkWZ{B(*yNO zWX8aXC9hZ0j(I8Nn49C#`o$K$*XTFnLpsXA z8*6Y1Qfm8N6GJZcDPRH4C+R)!cSwe|wdry!!+JSRR@+vf=sVndDYzcd4?M(;wZw6evRv>{lSsp%x1;4mG?LZ7)RKS-z-iC^PQ||M>l^jNl_8{?1NWcq> z09x_8@**iZ-%PVoP^isFV92lOS-^s(fxSA1K$)xYLm?(#>(-wYyf*}Q;4ONEmJk`< z3+5YLc!QookZx zo;^^T-{aLK_L6i1v>~nK47I}SZx%o400++5dkBtnnuZ5NJ{s*ptG^BQ(&0P(z#0Xpz9U0_(F^-ym?Ut1(K8s3% zfHA%PV?HEl5BeXpOv)HzQV#8j1|o@0ve3f%bO_1s;%y3k`hI)T+`}FBEc(+^y7pU9K+qTSuK>R}4FVCB}pd0#D=p?<--DVUZcRQ8I2D z`F^m1@G+-rr~xX=-exKGOTcf_g>31iC^DUXDn!gS3<7(N6ZUr<@V&<=7#poqRT#X{*P3H6Z zQ#Q^&s^kE<$Xh*dozdEoSOeS#LaHhwl?oYuy^Im*?CPp$Em7F&8jMWUPik*6h<{s9 z$N~= z+V(kpKAntUj8KAKlOH+#k!!5<7}I+<@0?9m{36LrqE1pjy@n<@D61lmGR-6X#wt%% z5!UyN;563#n>!F_M3oksu9!EZ%YQ>c;CHk)1u)CquwZIJYH{3`4Jm}@RNkj;Rv|RT zW~Kc^eC#nPlLt#xz=}I&-OOWzHw|23$VA>pDl&1;T1Xv8UZSZu(w2B^Z(NN*Drt@b z0V0d!uQqFqnA1!#aFAHiKBPIOIil_h0ACc^d&;+Fq--ONK78CAxjr(0k9{K0T11GV z1MIkjd7$jmXti?S>HkKq9uys$lz8NZ+hh1Nize~YHQYUxGn-m~h=ToOt5%{t9t5Q1 zIV%wiYm9G95r~!7dSU^tE6aSJhX?cS`MzA#G#q zCcE=%hxJdt>XVZUrc_7K{cdns*=znz5g-lW>lm_xZ?ZwbVKd2UJn)6nL!um77%=i~ ztbFAVv`@W{3+z&Ww?OntE^5b@5;U6F@qWtzb|ts7Q^8f4u!KSSOb+XDLrr~iJzKm- z+7?`u*^FbKGu1XVH)X40r6_?zU@1+;q59jR*_6fV0J^lqw8T!hc*CpoPT}{?T8gGe~}MonIR@zJlzw zmLjL_7e#0IP4s#%_Sl~>lk4xAWnKmYIgs8_>LHvnooqG!(Pn5?EC)O4D3Y;GZRH99 z=|`MF&YnvhW#E%mFEv_2OxQZb4D)Bvc%d^Vyb~?p0kOk3HRQ#jiIGPmK&ji*RAo-n z_ouL@lj2Nm>^HPC%db&9EqWEygVZsl-S+jhhWe;2D33urYLj3oH;!6feZp4gb9 zIRp^qs6X&GXWTe;=;ahBi^Rov-_tw@X*Q&@NF+W1g;SsM$7Bz<00l_#Lg+ zpqPbgL0Y0#8^64^gE`|1mV*Cp9Hi4!1KLglV~T~+li59F*V8z`ac`J;$`TDh5~Kxq zAWzk}TIoPE0dh)QKj1=od9KPZt!VDK8i%PwrUv7LeIZK7A?#CmxQ4QE_;6+{>pTsAK&?4HZQj^`kFzhyJMafIMo2}#3au;kM@|K8hkm7YoE@#%6 zC8QSVAt>e;s|pyDrI*BhEq{Bkyo7Oi>o!SrI7A&NzPJf-1#ospo|AS5$9?2h$Y)6S z+Jtv>Ga6FqKrB22*DK*%R;~i9)8+k)ZAj*Xyt`2PdHA^b#^;v-NWCIA$^c1#q%lL# z<7nPKB)zJl0r{KMTY{h4{)tx=Ux@yk1glY0}Zm%?% z{Qf0~Yx`klAX)2n0+tXJKRTm6R*F~ZY_ZYq(O?0v1{f1oV27-yjvW@&9Lw?V(kAQN zD*{a<8M4(4dz*tsQ+$JbWTfXGEbep({f*t%I;)e22apF-Tyaj6_e2;{7_|$0RmtkF zt9h$?c@}0;CM&7AsMUv6KrhaZZd+Hu%tLXSF6A>mA+4W64#0*VMfCc%Vr1GSo|5BJq{J z;#Vb9AP(k?hwgK5Gz#GvV8_Dej;d;r8s|cAtegeW|L8y7NQm7|~| z-Ti46ZsaPU4y`Pr-vIIXDExWa(PtREbT>T;16-m)*O*W%ZLeI9evq7I-PS|<1R2;wd3?25Q?2D0Z!a>Q<|oo$t9^a@tx z0CWo^4lMA%E@i(77obS}Tf8_Bri;jsDO{Gdxgm+~Sv2e^q{-WOxUQ0wA9WV;~t@*#GpZh0z_WVHvO!S9mnA`!?L@Anyw|y23_L_(6922+~RS6ar zBLyHK%2H4!cq!J2zarSKbLH$L9dL34OLrlVTYG0TrU(h>7yeM}CzKz8dx-m2Y}yzq zX|8?bF0ul^_yD~sXG`A^A~K2HOo>-?U_(|_T{LU#R@!Bh%+3h067J;vQs5;ZZyxq1 zR3a|+b(riAdv|A zpm_WB85}JbF77t`C?q-3`C`1YgDST|BdChw9CN#}nSdP8HoQDyXaiDbaRZ9;LXLIC z)UcWB7U&p`;rj7`S)N1K7&v{vM%S~RV)6{UTKy2wICnS7zDh1IosA$*n4;Yx#*}es z40f>Pn=l-UE$*(?t{D)nnS6wNLwRGR{G{hn>Y`L~KrMat{!|^|>-gknEMoFzcZfp% zRNpYg*u4mCWgI3heCI)ZnBb(Qwf(zktSD$a7IX3-5Y9IO0SsxtXD&lNYcm|cAU-^Eh|az7VN58ex%x)MGyq}ogx zkZwy+zo>)g%w6doUP9)x1f_J&2Y*A&5IudM<8nXm1 z`X!rUt~-L>0*YopJcQ47(^6!)b?TO0# zse14F!Yno=>FME9m`aO~8K(IuY{(-7P9wKGo|sCagG@AaKd*haB{s~9{gYrBlm60C zsLgq##53k6oHE|e%N4aeErp+lybN+`$aEYtkn}8fDlseL8i33T4+bu0-1!khI=713!OLB{2711NeM3!9enaVc6TUqb3FDG7aF_jymeTsNm-9k#1 zp6(9Og4m92 zwXe{eVp~EkmPzMGd75Rz?kn!~4xX}b6?VWepOiVG?(t?TwQ+I{aqU&|xdns`eLPuF z!e1-_Bk`p85Nw>t6xT1sRS9Su#g*p(tdm+u;V9>#v%4pZOm#uoJy&R@7nOtKk9eoH ziUp3O9kONv-lj>Kf&;-i7Lk|7jrPivTgum`{=6+u4I0qk{oGLRheOhR3Kd<5L3#yKeUm|W>I3ylvC7#pN>b6J7BS25n;rDQW z#q(gJjaTIaez^EVgFw76dm{wU{yz(7^mMU^vM`|+scZjio3 z1-~jnKA`|UTZoX2WD~3?-{JC;c}5+QF=ctFo@KrXgE3#3ifh9PzHJ2ij||{Fp(S_Vs+CEkd^*x-U)Wb z((YDQT_Wa_UP^`41k0!q9Q)lBiVaf>!kUY)LSdO*oC>}2r&liWrqcWGSx-{%kzNQO za=cQf${l?H!O(I9Y4*b! z$J@q5KvmF>8OA$8xv8sGwTe(X`|Xweh#)CQB{Y_K!&CyS^G~nV-$$|<-^tS(1snqF zo2A-J!i#cyqt;~#DR0}k9+3vF_!}^I){gOma%pcLpP(57XyPBe*CH1I#DD&rBDeGs zJQYpYrI?I8CVSx_cdM9MNGr=teeOnYimpk(^Ak=^cUAv-H&+G8*#umzN=dt|3rNCNzsG6JW-ElV4bMo_^Fv% z^5=A6Vz)z!%!P2=FXx5>NGXD>TYo??JfAX4xKba!DWVBl>jj<1u)848`nzG)aKGA2(cG+6Vc-X0& zr$n5zZ%nyNhbc_1Qr&8PVo^)C*T>@F%@#1oM`(Y;)dgJr(5D~;{8U(+yS}&cs33qJ z*++e40=D*9mIa}O!ga$m1Z?8SefG6D32Q&Fqa)>K`<6mSqM9YZ;3WHwKV!E+gO!dd zoq?xM>~b6zo}>I4BEmg)L0{Ht*%OV0q|L!zi&fYv*DH5~pX$$O+R~CE3z*?W4vcMTJ=m*oaEx{N$gMkzRsMzyd{0q|o%2aRSw?yl zc-76&IkEzwuhYw~(OZ3Lmy~wFc#5aGwaa()(mQbo3as7)SRe5szb@|)Fpr(#hj!UK ze%9A1cr(b43fUD!ZT_cD)ANroW%B-o?tKAEu&-oHnaDnq=yl0+Ko(!p$ z$jZZc^72|d`mU{6= z%!Pd2nhZb=09ctJ!+a_hfEaqbA+RA%nt-+D@kLDviJyPW6wVZuD1R}BM7BE=8hsC} zJD(1ze9~;*o9|3*niea>d@{YYJytWY759dcZhEcnd)NNWdiV3_*cYsD*E{>A<26_$ zbmW~xly%t@<0)2v`Gq%f30`mwYl&XuM(tD7oW-vrfRXK=lKotD6zZq(ki=zm^xSz< zfPBWh{q^ng?K0{sDzLY*H@v^|4~^QEw_Rv@+BV@ApkH;PI|a+H*u2#WViy4%z~%rYN4oX79I;m6rGw3-3;JcKt&5)_)pv^VgDV?j^NpM`iwriibO48{(b zCPXpj?FLNv_7FM39^5C=F|~tH5Ibh0huTdK{*%cZTFib>M3(n595h=N+YjJORglye z9TMIz1X+u3KtxGi6#vsK|LLDeN`5MWi%1IUfOf8z{*iGtmg>YZ^v8a>qy`xeJgvn= z?d7L*=mN=_S*7qiPai2IL)x+QV2_&hUY3M%CcaTfaeq*^BaIoxR zqam=v%TWoX8>IFyrwSY$=9jAO3ET{hdgZ-=6Ma8}NJNUG<`ViBUK zWGOJ^kKjm;@Y`XR&74GqT$L&tpH_h09uUE1LnNzrfig`^yFu~PXnJl=WJjzbD=oON zNzPmGQ-WE}!qdUML}*3k#ilqnBK}G&TMNaSZJo=8lTYjk(~rko83r{t#g91cw4g6& zn_v=qIKVf|fzJdRk+#2CdXCG%tw?uvHWVC2D+(bUrZ8Vf*#_!P+DmEH6TlOF1@!A# zFiE2=kQ(9VP_{kJHdsz+Yh7Is%W_O6I?*DVt(}C=nsHHZCYGa=BzJ!^a3LBeoM^<1 zr311tRWp*ud@HV_G6>b-LvJS;Ih>E->=)phjTsU5_{k?Dwyrm7=2A!GZ}Q`cWnzRI z%aR*PNarHp?Q%Jsqpv!W=qK_nEWkZLzNI@lY?6cvYbU5>;Ukh|eAAP3r-JF~c zeR!*t!Cbao^c*#>46@3wO98Wn(MMq&CEA8?wtOddGj^1eFIF@bmL*wO3PBnJd z+OO-}RKiE_5MoV70}6F{&}9B6XZK8JR3 z*p-hZsc_@FJd|0ukFJPP0(k5x9b#JyVkyv9OPxDiz55AcV?frbye1KoqVN4A!_a`(dr}?xs?-KBir*1BAO>Iz&ik#WPDt$_l z!YbLj;Crm)M>d8_2~XFl@}^a<--c1|!zZ5PsX zBZCsQsVFM)FcjHX?)HoVT--}R`<}ZT<}VZNN<$rX{XI%UKO_iri2%B@=~z>(91vj- zIRGwmUNRSWhN;$Z@MJ&xHK7l&1G$(V14Oex2arVri8t8 z?fO&EMd1rQEavM@fR`MLm;6b^@n`GHdt}01++pV7%RTayjf`1B&zHoEj_1XawV7aU zm&+@iyosF=m)32j5q?b0vV3oqB8fo!Q2M$bN8i+Cik5Wc2g{PJ*ywkI!6wZhi;o0? zuq1Y86TV6nhdn=SI29>C}u+?;|yxc&~nsZC*= zC;@;Ox*-W=R|pGFLJa`re0IWx<^1{|n_Bku<#7}x5s`!>i@XFpA5Q~ZE;WJ>u71mg zUlD|3WjTHsVY(Nd^&w%eMK3C+4ZosA!kaEv)D>a`!VPQo`{bP2k$=T}-qM+WKyIwA zl4}=|tP_Gz0rE*FTbC^AJ$(}>ih>Qo2wk0N+bu6U*y9hAeiNOOBp;v&K;`=F9H4Pq zmTmBnHCjm=2h(5@`lODXmiBobD6R_}jXdPCy{Q~J=$Y&;d?Qk`?fM*te@v&TIo!@0 zh81x&-CT?o#l{_m9YNfuC@Rm1TFb<&F}j7WkC2<#1#z@^d$MSQDa;&Z{AI) z&NR(OSLALq7w&lPWa(*C!OTmwVo8&$CYlADv$#}s3`F2U+rY7WrV-;W>xuZ5F|)2n zyJMINkkH-IYQ$D#TO4}W6}d6OfufYNh%FHr^C4&;xx@`Xf)TqFkv?JDkyMqH({_3-p0FD&=a#I(k}04bpFfI{9mn7mN#4y(2W0Mju9WrAxk%!tQa=!9LgZ%?7=%_ zP1=0w*4ZWIqa%33&ZH3#e{1P+GVVDfc08e&ad6N=ADymATh9ap{s0N?&cA=O= z?@^!WK^tRULH|*%rzLLrh8)+eRiAExLZGC-`JQ93M*22;sGkXFEd^Je+`9Z$Xj*86 zhIL?OJJg3bJ+w#OPr|Sfq3r1!emD>$A-YOZAe~}kDC&)eKk4pKVt&Co0W%RZQPH&y z*e9q!UBr3V_>+U;;n`N5mc;%rsa`Y8^^=1yK&836m^rO=aco!eYqKAc!e-P!>_KHy zGKzU0e?rDvyXl6D3f6&@EqB$k4%-Bqbe865`);CtThf)_@fvx5p31PHJfDalXC8j< zX|B?Z8@zVGUUPcacgKJ+Q~@AYZaPXbfMy~Sl&ADUH$RwzHU`J2t3IDM^u0&~N9I9i z4|bz0nITe0$l;kAgLj!xjqjOGbT7LpoIkRzieZ?vtvunHMwNEfwuS95`)1T}rhV8w zC1Vcnm8q>Ehr8cMt}XQhY||0DG8{A-9<=|}=T{J?Qtx$&Z!_DeGa!{XUy_&~kZ&~B zp5_?NmI#EC;jJ3opb5DiG@_nZ^gJZt-^>_1FmS{z^Cbz*cxU$b9;}`#xz^P#%yc}> zrD_K9D`dFI32S$xK_kF9AZkKPR+#(F?r=FYaQtoTF}-`Kn^pME4~8z+_Gk7fp;&O` zq6Y*lQviL)7C7%@{(Im(Rvh#K$V-UinADxMjQyBwZeEbqFvQ+sn((noIqO_X&G%D& zbWV%5qaETf7v?T*ftuc*Ji%2`hpM5rT;&@pcn@KI;a_KUDb?WUr9WIeUo{J~ICt!> za=w_;F{XalnC3ntC10xOtt;tXfb{XOOqdAKG$l4X6GM#qbl zZUS(?1!dMZ_GWd+$#-8*Ka`nHm{rgkXT;2V={Xjc*}o-$gW5UG2Ci2s4-&&4u~Q~W zTUQLWy0=HTSfz1ewftm#0b^RHmMcUK9w$7g0#hy;>}Nku0}u8Oa3g$6+3Gm}1?{?w zv0&@VeP#!{8iyLM`_Lt(`ioX=M%`6HtzA5G6XnHyL$i!U<|@O+qJ*9ojjZLFOp8Os zDx~?Y1fCi}Z^?VJ&)8FS_y?#7=>Fk{D!ex|9@XYvi2D{dHn5pDfD*xRG*IZ^Jl6_; zEm#jGUdR|TgVC52%H~ZbtG84psjUkNA#E;*cEV6T{P(K8w#LtnPs{>$E>AtmS>8F` z{6t|3o_qUT-L4@?jxaVFS!?$1VZGG2^CQ2uU9mJSFb`OK&3rtf_@eALBP9#QiJGr5 zwv%Gl0zS;D;kP(R0nq9BXHS|Rwn^_-rII7{G&b+plNXa>ej}KRScxcA&xtRnZO}bW zP)0TmF0k@W${ruFpH59PY5Uhd-{u0i$ap7c!yZc>X{{KummA8K?)H;mmr!eq=Z4#u z2@=;LKbIL3IcBL^U)0o!Q0IZXX+94|xFN@MsX*REJ4Nv)0h1FunYrOePkDiGJ0@ll zY6%l+O*Z%AWD*!?r-TwLYq2p)B_3zl-OiOGEo-r6+LxR)3uWdZnyVh(?ia$z;kMQ? zX?F$?Y*NV&Wq&qf&lW&#g`I`qZ-^`E&nQZp%SxXQE}z|e5{e%$;d#DNV1l!|F9{m! zK2d+(^(#wA17NCVXWlmrizu~10xzU^y?MS7FEajEY@#={w`r^0lk^*w(czcc&#>C; z;%#D$9J46Z-$}5Mk2)b~SM0+0LRNL^WQrX#+9|kqw^`A{iay+b>q4t?hQFz3fWmxU*aRiZTo*TVMdM z7oVk2n;`Ukc;e(ZWHtMhI6>)tURTVXQcUbRS(dkUpl&7qwq2Sq4zy9ioqV_Lvmyf@ zogL=U1&~v(J&$f#_OVIgr7ceK5AZe^o#@M1APSiB;dhr7WVO4B=;}~QE)_0w@mKCG zo^RsQbJ#E0^z%ShvJ{#!_9g76xC6c`#3$a)z$5ir^+h+GEmM|mNue5|+IW8Gj-1j^ zIrTIcTm8{9lR`H6B_=&{IU1yW%~QVcN)gzr2!MTFJz*n0qg{2O^ur9fCcw;dayD-c zJ0G7wDAA}f%F<~=pJ$~do5&Llls0L599Y`wT^)(7y}>y;AWnxz0~joG*IT>UO<`a7 z3!N2Gsrj?@paCPVOi{4{Y{Rf5CL6Jku)Wa27O(VaPCU_s;p}6Ry4&hxc%(f`@);Oh z0cS06Ki|5m1+FhlNs{iSX611M)ti|VqSmBeCNF?NC6rdFU$brBeOb6#zwHU33K)B5 zp0{|N&dN9n1g20$pvYza^8}4_oBpxGtA+UgfpO;t0?)`=1g9 z-K4T(5*(sb0n5l0x08~pJjpZ;&ZEzs;{b!|%(oPwlBk8pfD7$;dd?q%@(S327gx>~ z(Tn|)kuU>&M^UTsC;myH{(&*Z8mFKGpXe4f5|6fTW7TNLway*nwxMiG|IF|)58>5@ zNQH;zyf|8@8^Noi4J~KDLwA%HrCA1{nJ1 z!@maAuC)3}D7q3|t}RW%m!-WHjPuxXC;!6(=gxHLd*-DA=6;!pFaN&T4kQFB2APp} zec7NEUR>%kjR zLti#|WIqtKvP2<{vsu9`6~a+8&XBFca`R)wsN;2I-@QW*qsGf-6aPXVw|qh+xFucR zXS(O7_$l7^EOi4LS1&jI9>e*z^E&Lw}zCdeF*q_!Amq)DWB`HC66Y;z$h4rOMN_+uYsoFXA5TpI{fuH<_v{)FpdJ@}J!X3)DIq+wr*L@X=o>4!sT z1^QTzO258+K14{K#sL7udb&sAr&(LM)fF?jxEDzZUDM3B%za)oZBgzJeyJ_kfx(^{ zJ*=!i(DybmtYPn9!D$#SAC%+>8|d=JDj;d zDMY2Wat7aXPXfS5IR&_yXs7B`^B5S1G|)3kdRS!>@O!}Y82b5V>SIg@ z=t9jY!I*s?gGA`LsaRDS@eQhA?Pxr+|U%9nno8&bI<39)7NGaEBf!g8rjAk*TIN<{;V_I_m;eYWe6{3)*mG~u zF>W77$()FLYTDN$pLAP`^$0ap#($WSs9VH1kK0ZPm$$(EK{Q5nf*8{-P;xm$ZjeC! zhm%1I5g>3^Zuy07mdH5)|0L+ew7`_$Enu7VH@-mb1vOHC@*N!o?eZ9!S@f2H?H7^y zjpuvX%j+)Vk*dC&)~gtZou{#_&g}u6oioZxW};5IaOS7ASH?$GqWwO#kzTfwcfX!_NVQ^qE_05`KnM0fl32L$^A#0fk$++olSxvi}bN zTR^103*Se+kBij1@pB_3EEB#DC7>1bc8u`7k8eKzsyue8f3@%*>kZ3Fv!e?&eo>MC z1bN>}PbzTkL$$Lpp+e0c^ut^JHNxLSH&s}7LMB=*f8(IYAL_o4)2+Vl&Q9!Ji{Ibs z4;%iIgt5erhId6b0=8(x+LY}E(fs`XerEP<>wV@dGyUyIH)-edSz&eVQGB+e0nuAo z&JY7p8sHA$dr#6vjNanH_pa|>g}QNR5&Q@fH&Eg!!uOW%?IQmsI#xcLwt^W?ql~8u z-y6O+e~Wx?7W&kOi`c=1nsx(f!8JIlF&Se-3QeBpF6dE zdqkU?Sd#UA?xOB@ffZ-FJgKPrZ3(5>j}s5{aHP+moZB8X`D*wtWiYBwbY%E{mUdKL zwyX?vD>F=i0(KEF^Up8_hOl95KL99ZKV_H7f8WdP->dB3o7h&&`!qgt^BH{qb;kQG z8Sl4cyl=~Rzt8jj7g)##^8nQYhro17!`4le?*s53)xQzWbn`!p?+1=uVVd+JnygJ_y2gxzmD(Uc;4T@ z{1>HvhcnXg$$>NX{Y`vVGv1A~_ocvjDb!=iTL4-y`0@Y1pBp#sF33+p$qpEF4G${~3sNUr=w)4!wT+{Pe<-3f$vToO zVRg7`?`ABxVJAZ&RX5SDa_mIA##5=GY$rP%yQ%JEXVFLBxPY2u=XUM=>m5k&s`)+s zJsHHeuxKyb1)2c`2CSC<{mMZ6!Cu%7{)|)uZZlw=0S_ANR0DPcjM$6Qu6x;UfDil* z##*mmL3j`N@L@bAn{NX!e;umuuL(uW2LV<9`?G;Cl?{R!Y%nZh!{8+3;|Vq#&R`?p zM{FeA!uE$GI{<#qD&T208vel!gxA;@_==5X1KBvX9~;jq*aS9-O~gT)#OAWetdSkW zR_L`~kL+Kh8Gsr`c)zS$4Yl4i3S&kk1Z>ZEDnf7fd!6 zy3Bu>?|~07@D#toe|#Tw?DJ#h2j+)hAeMHUADJJ6#_M1K3!DE2gIB}R<|pQ-pd&_h zn4g)SgTf2o67vguQu%fm%wh;xB~E63DdiKk*Zhz96)?DkA83A!Pu%1@~Jp zY-oF2Xx||W4skvV6ylHkTF~$v*gfO6vkS-VVwWI&|LAV^f8*5SWvRz2@bTv>x3MkT z*>!ib8`9po(%ycP_V&B9x7+1gDZ6tAyIUsg!i4*=h6nFv8&Z$IPdz@2kB{Nw<9D+s zQjdR5JwB7l`y4(#kB@)9oBbn|;h(9;SKUW=EtUF4>hbN=V?zq=zfzAMq%wS*di*p6 zwme>??`!_)9rcn)5{zwg1{;R~{A z;8m6fZz4gzi_`l9HUU0lhr%apHhh76@oRPre8-wlHb)r4Nvp7PnaX~`G`5AEflAw% z>{gt{JK5QC0u8jt&?atr+KcKJau&J+2(SvAO!$w}u0jM!FW}SP^C=b~!*@vRI6a_a zTspe8fAN8}h{5s21uGZ-!G0;-1qCa|ZRbN)*51hnA}aTr@K6_+brT+%_`nW6V*JV- zeAJ42_*j5aKCzTf-o~fwhe9RRT?t3XUu!r@ zKrQ?ZM$u@ni{=`}XWt;ZrXiUQ`Pjj8p^%*ie8^sfe&%&_u`US^5yn0!8k*EJIXCL{%fA=5OaU zgs9u43Po*KfDMpsEuj2t3-Yh4VF0@ZA!?3p1q+e)5d1=0if#sDT#_$L5hOw>@Ibi% zfBfu5)bzK?o(QX~J>blzyKuk2KGIMgzl$$kxt%Ymbw%Xj3ATtFIKdH-b>k-{`BD_5 z?_jQnd(Sog9)2{cR=hDKJ_mvN9TXdUF$%YDV5lYK@If|xG@=!7R+;R#FpAv{ zi6v3M?SiA(1JKBR567`T$}Ww=W{*Nte-W!zPz~07hJ3=V*xfW?xzF_BKuK0jD6mre zgi2oPqF|1V+I&Rl3jDVU{~dRS9GBoE2d*6~->Z`hwU%>JGEvX*!i*}+Ce*l#_>2IhH8v#QqzsFD5!GDaZ7{7D}zl!p0N%E`d z_qrti75(0r?Sj!(&;K@lC;x|%N-jh_f8Kfym=D~6 zw2;RN*kHa}{!T`G4rZg|?_@TGe(jmDKlt*#heL2Mt=aJ{Y(eGkYdFAPWANR}k*DR! zQQiv3E730XvsV$~n=lk@&JpY#7{~sF8sU4ejC}wh_92|i{tX+^emskP24|z)cmewY zE=K$CC+sV@ihT{&qHWm4f4+s=*d9RP2luk?;SshM{>Z+BC(+7#3d=pq6?lnj@Cw)A z9d06d_?W`|tbiA?GG2te5-h;;*(iLUfbWy>_b~jO!3RhxtH&u9f(<_5%ST!|8P@ST zlv7df+6Ya)0-UY}EQ1TA&Zfc$c+IB4sqmEf8BScz0w8>az9O1we{7~jtL|jBat%N_ z=KK-Dk)9X`A&NhzP6cJeonC~4St@VAj!y^o2XB>Cs~ zlib0-O7icM3M3V!3ySJ!h!ta^9O65$S^;xmJ`Sce1BZet_COhG_nYcGU2midZ(C4?3DGpZ66M|#l4%0lY% zcOt?oWMRQ9Tf6VdEa0U}CL9OhM3|$#D z@phL9nZO7G{GAjJ;?uCd2SW)z1j_hfFp?h*2k}bm=M0$1XJX%Gxhx#p(lX)B8*wwB=2(L318oUB`^cUbpj*;)5xHtR05p96(9>)yo9m8^Rc zDrKlhf1(jgzgM$g(yz_BkAu84*1Z>MEkA&hKpp_LN_qh5C{fu&O7uX3&6C>CCYO20 z0svpb*bJ`!6dDo0>%q?(Adjzrq5K#a!B-&H^J$= z8P4M&_%UyVt9Tfx=_GiZuR|-j4W8%i@G_6Uf7?6?AMp@|^@I3n$l*^%4*vr-3%|`qlBworp|yVwTJvPZpNH1^#q2D8 z2_o(Sb{@ZwU5f8N$M>u8_eT8f;y;v==Eum@9*0IL9r97FF7*vWo4o*b!5S$O1kTcb zfBFXb2IIuR7E6htLmZxFVMMS2n^0B(N(>WDhezau^TAc{TVDXJd_PK-4_U~PENrp< zo+Vju0t}Io zQ@fF^oj{X|)lS%{G%}FSM~zpe4S+L$e}Mn4V^d{5{JM-G7hQScjcmkt&GWuPIkr;W zrJT5Om$GK%cBOf{5~7*BOKDvhP%+y{43vA#?Mi!6=^#+|nl!@$x)RXuPb%>h%5($2 zSDNF=e|Z0NzcM|qEU(OeJyZvLWqH%4i!wvK5lYGow@UTI8)0C;EJJ=!W=uQ#f6^Vw zhDx&w*#joY=W`8qZXWB}dyjUnxl#$3%Cw?0esF2yN;P1r(;6#%+I`9K!E8CZb>??_LuA>J-Y8K=`wFAX<~k zPXqF+vb2>hKPdaImxYU*%$}e{+H%MnO`+lc_ zoO1w2OTWl^?PBD9dNX-T5mK`z(`C#4yiNJbP1H~_2$IU*u;5PR9~@=R$h0(D z?x29#0)~pDpiI|O<%0VOP4T|my*iMvH@FQbnYy#$t;_lx(v+qMn(nW z?9y*!lzu&_yqR9wq%{SpXav-Il($IJc$Yq3P9;Cs22ESxB6|GyHs$lJ@PjgKGihtK zEl$(f7ROWR$@WWhrGAoB_H^xiq6?$SnJ$N)CR!55RV6}Djcsb)RwyM(PzR*VF)ByQ@JV;L z*n=|F20#;^-P)Z1*ag`LfVzR&MkOt1@EfP+?NUouZdV6Zin2W9ZbM{OcBq4pr--Dw zAF>^FWEUKVAFqSTfAo)|lj^u_>Oo0$y8EVlo>XVbH%Z%weEp zq!(4@TfJ51Y=upzn4rE>P^!*T%kp-p3(gBC)w*$V^pa|QQe9qIxIOR8ZzPrIxxsdmVkl4=aGo(L2s)l-t{sg*@G1*<=xe_2;#FL=Pz9qL(j`Ev>4 zMc9m_`opC9lga`w)dmWjNt%ybSiKAhA>fmFuk3<>#9-AeZV%<+kUQUQj`#lxx3e><;(rE;|INgr*Akb6-)st?E~ z?N=~H=KDihzBKsi!zj7Du+t>Wj!Q{z=MyH;!|1R*q8?C_+1? zvd|(Qe|*022ACWuv}!N7M}67l=OyFp3Hr(kb$VVG8?Mmb!PMUYRPg4?V&9=9SX46P zvOt;5kf+lVF=S;^<-ma@yVN&U1_qi%er)h|^{u4(_73%5hn5U187MBl2J|lcZ||dl z0fFMA`oU&IYpN+9yG_9V*F5f*utprMgh61j_7( zq*kd;AJB#Dw3twJghc%SWqPrs=;KBc(0w7ue5ce@@5HldUZd4-D_FbRJB07FIJ1Wny6HHf_r`?U%N0 z7Z|=>yRLFXV1%W>z&`^clG+V8Z*J^@_WysCVNIWAjM%ocG;8MHTp0)ilG<-7rPibU z&Se<`rPEmYl-vOrA_rhdjsX}N80roHKDz^8<6d@RsO$tHKD`$MsTYV5f43L=Q7o`!@aBo zxlO}L4HY4J*DaJ&e;amccS&uJhG4rrozJ#>jc%HY&~Wz;jz5wpP&wGeiKk7-`Q7hxhnZ}NKuT)+#jItvfqYRZjKaKLmR+ZG8f8oR@q@4O-D`}hb z`kb`ew7+%jeV|J{$*NgTPT!y|MKC_BQRkt$H;-%#J&&l5bZA`^l@}c){aw1{H=}yUb>^q(C#1V9 zUjk69d8sn5ZP-vMiwlSv< z&JdgBm42B%B;dEuXnD=`VOESECu8x0OafTi0~JlN(B)6+!%+dbPC9b3d4(iR=p(!K z-qOW>ZH<*)fmD!!HNlP_U|(7N z#h$qX<+u8)PpZsQrVBf?bQlpNvI5!f!2z-Z^(oT@Ie(q!GO?K=PS{sCz4U{nwtI_X zuYxjQ^MFqWe8G2@98hPsX#xV;Nke?fj`yb^5P~Ds|=^I*_%UAaRl^f~b10xLB{VgmV zdg##UL(5C{K%5=L_P|=E(9cYK`3{a`26P>QCHWp&$m#k94j4Ri=w3L_(+v6xyBYq^ zfVX60f7DWdnZx$L7W_JCFO+$Dl*$ZH{2gpCl$S8oH~Rn8_8nkW)Lft^lQK!>*4@1e zm)_gmMFc^*2!coxM5>}l6Qzm@B7%U@L`7+WC`er?DuOI5C>9V@#9mPpP;96mib~y= zWaiGjyYTD(zxTcU;3ktv&N(TQoRge$Qu!p*e=T449DJlTK~)~I`4n8O@SXvt9t+`V zh+Gh%&WwmjnXJ$Q&_XByS^rI5ea3_q5uw1o3->Az zsj7Tpya>Pp^BSSmBr8lkR!@e4J%?!!<0g}9m@XiFl@-x ze>q6NyjRsb4cDdmP(A1x{$J5{8eThtY}I(?tUphm_0gA9vD~sJp;SxT`uG%tH1G>| zxK%w#K?|3h3hJR=in23st)ifT2S=yZEQH@K+!t!x=!e`QV?M(@Z9G3OfCd^p1=4SX zt}b3(jhv#} z4{BKRp|Q09I#`R~dg}?e-FgznS&LzswGeIFU!{Fx zJqM?(4XB*82_>w2)Y2+I9jvYB8tX;W)!L4_TQ8#?)(+Iu+KmQUZ=ylg+h~aOe=Zto zeSq$iJrIiqb=4~sK7diUbYUQJ=VAA1M4vQ%K8rdXnl`< zw|=ms^^+C1j#$;KV^&@3H>;U-+`7{G-MYa#VGXnXwC=V}TT`tw)}z*0Yms%%dLD!I z3P#pmY+IjVZheh~^(%I)KXCwCe>jXC9Kn@v6xYOAxDk%wb~qc~fJ@-9xFmi6$MG^; z8o!Rq;KR5a!MHrBjH{3)xGL#_tCQ}y1{s5Ek_T}u@)*t`PvVQnc3g+Ni7zH^X}6?P+V=f%d{3=?L73j>cEh@wf|}e~Pc658`X- zeB6yL$KB~_+>>s^z38jBH+>ghM-SlZ>0x{WJ&JFnXK_E4jR&xbcp$5W2eI1tX4VJ~ zW>?@L>?%Bzb;83~S3I2c#3NWAJdzE>x3OV(6uSf8&c@<9*gg18HVKbm^YC440lu3( ziN~>(_#XB&9?zb|6WB&Pf06CR_puM~{cIne!uI3o>@a?S9Z}&i{HPtpv+b&Qj@<;$ zvzz1jb|<{R9*h^-qwtgVWW2>u#6 z_A$KKK8?3`(;Trx1wlH45VNp1~{BtruCkfDL;WLRJY86LxP~kWK1ZGizCfM~7Ldik?PN)C2YD*^ z23Z>1OO^%SBg=yys{CJ)r-R4Hnh+stL)m0qs1$i7e^iz{7phFwhia1NL$%3m> zXf4?lT2FR|Hj}qPd&r*9&*beeB74In$w%QzUchO6t3+biNCuqayD%vQzkv54I&}Pxyw0ZO+ zdRg>S+A8`by&`&mwvK*JuZ;ep;>T%+=n2{``WJ1VL1@Pen_iP4X}63R?VeGW_Q>c; ze|u(hqrEZ)(%u;(>Gc_7XrGJ;^u~<)>41z`bYRBgbWp}NdUM7eIymD4dP~OVbV$b6 zbXX?P;h7d4k(oh9W|pO+GON(rGZXaA%m#FH=4EtDW;=RUW>0!|=14j&b2Pm-b1WU7 zIgU=qoKEk{e3(wpTu5hRuAnnBpQaCHe{QD_Wxh>kWgeoBWFDoDW){*pSphmXD@5mI z#Z*{|F3hSzAJ3{wpUCP+pUmn_mt+m1Pi2jxOS7iXWm$9R@~nk)MOGeNnYD(l%GyBl zvbL!3CAu!_6}l$tHM%zIT^0X;KAW|lKA&}fZj2%NLM%!*#VXQ*SVOusb{Tysf7Y75 z9P3P9iQPtDjZLDj#irApv4`od*h0EHww1mSdyBpqd!O!!eMH}h9i;EZj?(vH$LWW$ zKj}x=0s3)vDf(%49r{^z3;KC>Te>g1vkJS>FS2i>UuF-Z`?JT+Z?f0W zZ?m7FhqE`)@3UW{KV-i{f64xoe;&*JlKz(c1N}Yw2>m0NxZ;L{+e17VH$&R2o-oelJm7 zs{o;L3SJErlPCc-L`@ZQP)mr4S}GPmU6VM_;AD)9feJ>CT$1hJ7(H^yf2zRi@GVp}m95$G@QZ#_N25*4B2WaS1qlI(#GQYsm6y zsG`=JagZ&mp@_*BmAOcWe@j&?L)Jk|G!%^>QyfIy3{??l8I%x>MH9#f+ye>GR5XLE zz;q}tnyXmM`2Y@!%R~$HmcT}Fxq^}zt^^U$lK%wdLq9_s(;DT%vyy4yUdgo3Xp|#b zL0yQ4=Aw|eg8vPrLhIqUXiXweI|bK z%L?qKE$CR4FBaHKe;d>Bs+QS-5A~sof>I)Ih*qV8Rjg!W4!T2hQLP&nPw|_{C#uB* z;#uBHT%+gV7mJ@YYJ2{<0YI`3YLo=8eUcv)uugF&7G{ee=t+@(jz;oBa9TiRVI2zpRM{KEjo`$N!%5Lse{Z-^<_3D5dQ0)x%u(Vd6=V2tCKLTs%qEpH-Vps&jB7Qy zq<(Dn?}}5_fBLa1X4LvDG&DBN`!1KqIva&uVifYS!E#3d-v_1Lw&jPk`IQ)8eeK#K zIqTF+pc;(r^3Atc17p5bR8y?{2J7N1v@xGG%q#rfD2}q`IR&hR-ZuOcH``+M?Ucx8 zEf>Pw32!GAMyiC?`Ru9<(0?WLPvjFjpLN*4I;-EMe^4U%OrB7`%RNn>B)0l~?yg01 zv+ftj?P&>-S~0Sf^#W*26G=^(u4y!&HpvHe{YunG@9`&!>|Rz&PfDI%Gi?ho!&uT< zE655MrhweIfz(+ATIJnrG4VL}6kzD%S{=rJdQz*yaIHt9fAU%Xd^X5^W?JKyRE*O^ z0lUS5e_C-n&OI#&mYYxJlV*7^*G2ghjPaG8Q^?2se@0#+?QOzUZ&JzRaom8VG^^~m z?QWBi$vWnpJ1L3^*f5=X3uz#dZLW6|FV+vQ&;$8w#0GZzDt(SE;@nRhyM-)C_NjiQ zUfg4L+e(^D_ni0IRU^Th%uAHJ5U*9J{bSYAe`b`9S4sY^pemJzr}~+$Sp{GCiV%sd z?A{A$jwDrFSRSmcrAJ3To2Yjc&EZ5O?zl&_`dFm3u8w1(B@OP$>A3S?XnN)wO^*AE z=4j{TFr>NkPc2SAR83}L(^q+jW){z6ElpNZXUb2n(J=`J}snn}@oXp=zKPur&yx zEnsQUX$aLO4fGB%Y8+I}{doa#t9W?dq3qF9_ z;p=SHG<+7WL^fK~0_C(offlF`f8Gb~*&OLzOPk$lHh9PB9m{)8LZ)>Vg2-&(wN$C7 zRJn#{ppgyNoq=-dxqQVcC!wNMG)bqF%{~LYQAv%UjJpk)LZHEESbBqzJ!`gE6K2D@ zAvp`+LElZ6<}SgFzacRV7;u0thZH}U2j!m{jHj8fYpu- zw60}?tR8HzH9+<49qd+X3>#|AV#BQ2>^5r&8)ZGqZnvIiqpfXhjP*LZ%ld$gwZ3I{ zTR*XJ)?e%%%-DGBun9QI?!|F75m#aN=FDpdlWBG;R-ezuVHiWW;Nx!%;w>pDtwd8$8WR8@t157KEj^B z$JmqjPqrAJV@rr&%Sk3%L29s-B*9jZdMuALVNa75Ds0PElWuGc>BH8Nek#0G_4XL{ z9J!aRC-eno3u6CL))^qX?wPp4rTAqaqL|>fxSm3vk&ML_7Q!MeM}!^pU}DN zGrEL*PFJ#h^jY==-Ne46+t~rSgB_&1*&+H4`-XnNzNP!ve_{F+`;LCgzNbI3AL$A9 z6C>I7g76{Oxkgc%Ys=k~b;eP(B zibYr{=&If}f+%f`YKS3P+MsPwRWVd^?zBCsB!;PcLHZyZ6vI`%5P1(hDMqNb(&|C_ zi;*fOtafCik%hTclgt&jX>ML~)=AEt?edK2nz0#Tf0QvayqrxDw=1~_t8bEsJ5(Bh zx9KTyrx*>?H`jDi#sK|C^LdNh?3?KI_e}IE80=(@VJ@vP|L$Q9Ytxio zL)8j&0pxLoxES(Wh5Vv4wN`39u}ypdMk7zZ;?;}oK`{O5f9 z$~v4vj{%iUIa{z>sYUV%C~K#ipO*J=mrt6Xl1v}tJXKCpSUchA7*u#ljdT5w4|}{u ze~8w~QEWqw*6Xr?DD-IrIJ*9|)CzkF+y*G8L}0MnL%{9;F}tH0`<iVt|?_l1k>~lOid^OqxydZ6%E1l}hwq7g6(k zpchuMvEr9D*h2A28(5XDy_k}JyY|wie<59a@eOvM>lQn#C1KAxhLUxOr2WffKKvS* z?^A+mIn9*WnVwy?PBh-7DiOfz$U5^fX4D?A3x!?(pP`iaCn#|bN*WJWM8()8(`DYu z7*urTDxGRdm-b4VhqB4?c6rsusV)nGQ>{@06j1+4#a!d?yH&S=-50X#o1lu_e-EnJ zgWv}HX6S3*3b)!r;0}8z++z=edG>I4%pM5~?b~66eFvTJ{{&)Sj2-2d2622d23{ z40hoi-bn4{8Cz#3+<75UU{^xEe_2zidK9dz7AR$lZ7)pw7_$A5mTk6sG>X@J6oWhz z)m;=76RA%y=Ee)`%Krgp)gm~bOv72-$64LOiNrlgV{DYAp7jSf-B%Fmknp6OtVB{f zsAEpPT`jNhM_>EtpYyzx^k8?;i=c0kk?)d`y~)Uj1$Ipn>1t9^PCc@KeuUp<3)G9Y^&G=6H~3=dxp8!_hK^7o0yyUJ2&-wH9)@|DkPFRfT|tnd*-VU zIci?0)g!NPf2vXez-P32e@b2@&!HKV(tL%zQPuPXsBUk9i*1F&-U5y7t$rs~hlrS{ zoo#6{d=e-5ofuOiKtX}q{Ouf{u)c}pUQWlHq^PK*=$w@F+q~>zxHQwQO^n1>RttJt z>^hB!m&LwBFZ#4GH6L|-ZR@6SXp{27C$%Gp4$uR7`;H*0X*ot3f7|b?J@0Nt;;~_f z@dknZhDfsNwbk?u_DiZCw?j?)WvFkzqC~J)p@Y2xdf2;EAMS+f?cFfUehWt0dwgFB z9iXC^Y%H4VLql<&VhMGBb~fyqZlc?gO+-E+pL)GGST&LE#d3+10Zd12T#}P+Tk=dX z{^=b>^Ses4d`GP(e;=hSsO9``s+>1f1R%p~d+SC0elf+v`lIJ>Vq`)sZnVFFTkLOPg#CkG z?b;AGqfj@%NWTF_n%#Nr46~ol%M9`Oh{T0BR=b7aSfemen|5fnwVC2@))i~{ql$Aq zrbO}I)XIG{Z8l5zh!Y+wgTz!Z&2z{#OMA#rVN-tt+`im6N-*VLRM{IiQJ zB&Pd>f9MfD;zESCbqRMVcG(5RjIa?K>~~{=UsZmFc)%Mjb5%?0uOwG7ey~S76;&%mgf44dTt|(GhFeg0y6tQk!1#Dak6SD zvJ(GDmW9vZLeCl3or(fAf1zp#-?s!5x^X2be@*U`o4Y;XJ5|Wt{*Rs{5=A{pC~>2} zFWa}cPl+6TLSx5m_e@4jvwh-rTm^mO_7*a`G1m?!1lD`ialU;S^o_~KwRL%%$7H=Y zQ$Lf{lsC~hmJoT+Bqqrc$c)KEx(AAQk^ITLVK3D@-Y-#J;o?MG6xjVOHSA;}$BShf ze;-ZupoH0@%`LD86XU4~P#9(S3v_Fcg|Gk|<7H)Bn$~b%qj#I-X(X$aJQj0KX?kKZL(o=Gm6Qp`62^7$QusW9BM~*ye>$0j z3M(L#h(uC4^6DQ=zKJ9v6%uAt(mW$e6lhDzpvv#1#;F<7W8!qXc@w8D?8emfFp{gc z;i)l@(5H7NTtij1Rf$STL)9ueJjH-uXH zPQXTMC)m6X2z~=Z6}M1|4}hwCpju!CsljtIT*3##<@^?C$8Uve`7pSi4_5Ou4DB$LO4_V^1O6DFMsR*2hbT;%546O37$Jt;*} zp0&7EzI~rD@36}(L>CvO2vsajkvYM(HZ&GG(2gnelQzhAa#P2IrE;~&#uCMY8GO@R z+ZuRZ`^VP1E86nJaK6T)jXfig8jsJIl$j|Cjrlxj5X22aq(RvDe*|w3DYFoGJdg)Y zJdkBSq^))}xA#_BQ&#n#lh*&b`SvD^O|;*BCWkgu4QNBvs5Vp$YC}~=8>&X~>Eu{Q z+o*=MjjG6}x8)Wwm__{*9X$=fv(gB*A2n_f&+})JDC*B7H|>BtSSt}%O^NgExp{@} z=OLlJjx5$jn`u=te+EtVg0#+qgC^A^x)!k59%>dJq!`taYazWfhsFh614rKZ|@`Crz3DxAqrTeJBYYrYB>@pIO4UTEbh z)^v?P)@ET@TLrdWQt3Mcv%VF!^}CSPSrNckgm7F$a7_`#?L-FdDl%~|5yQ8L5@s1V z4kcj(f0PuD>!T;M86sklxCAoLD46G}8=^a5wo#1>qPt+0QHTqnaqyr~hzq01FvY0L zMbJDLWz^uJa1IInvj_r56uCYY1q#4vR|!&yKff8}H^;g{3D8eysL-Z}p^H6%&iiF_VfJl{{?Hf0me~OUIrvOBcpBi>2nUYPI#MIXJTw zL%vKb_XN$GJVCQUO3>Wos)(h{?CSGP9dsx;Bb?&aMR^E|3TfPW1%G|4;F4;@K1Yjv z=z@ZuJs(Ze(CHVx zyrZ#gOyKP}+d%hiz<+EYb#gY_+Z%KD_+w0rEQC@1=3N7!^(`W1GJG}1b%d-}LA7S& zc#1K5lkazU@0A1-$?O~9gL8^%$>jJ-e=@T!4dldSb|9%FqZV!@!KxX0zgaJ=zV5=1 z>X1u;h0nkxYNor|80g(p)buK8k*H_VkBxO>c{OdGgo{ll_6EHt&`@<^Gbk&XD}nYh zxI(mm?xH1(7OmhR(Ha(tHn2im39Ch0*d(rke9<1Zi4O3l=m;Mxsqhog8IFi9e{fn{ zgShB{LZT-sFM1^}Mt~y*wjc`Yn`_CS>{Boy;n_cve?-!f+LHs~ByE5xF5Z515mZ}m{2(6+Q;y_Uyq_o!{J&;Gxc&i+q>2YmKlNrtCk zT8h7Kqb5TTeSnA?6bF4H#6({xFK&Xmq8~I8{h^f@2pz;AxKRv-Tf{AJf14NrS6VI6K;+bh2{sMpESm1N`3w#d$-K3LCveC#5VCDLr z8agF?#u~4)iQ|>>C4tv@kCXVDxUV2hWWC;GJb8h*atQ1 zUSJ!-&aU>Rqg_lA| z>!d}D=AKYYyJv-Of3G;|bSwO7DqF6Z#?o{BSR_|0xDc-O(JIPp?SefYepSNmb4Bj< zv48b+*_@Q0k3iDThmulslF?(+0t3^o^t4~yPvb1#K9*`SsF!RqwGwax_qRCL$EYc9 z9Ol{c&sF$l9rWgwi#och37^gn3d*Dhj9@>iuaJ9G>f36i1p{JMx*NMrDy>oD8 zQTH_%+qRvKZQEui9otqvv2EM7Z5tiiPCC})?RRFr`F%B2Gk=__b@w^<)_LwzyY{WK z*WSxMz!T7rnon_6mdnvdh_PT$oeCT=2wE%43uQGVa#QV&)s51yLwOsz7fcY;Gi1$4 zc|<~Xln2K|sD>VshgS!*gbJ%FNUsKh53`mkmV(k(pr0}kZ3a-u-Z zH=6|hH;YOjD4;^yBAPK*G%#Sel^E(eU-q-&Pwq1hEKPWnsbzXKptNiJ`Q~TDa2RHw z;zC&CI934+T$*|@(+!b2T@#hHvj2}|6*))CddDf%k`d)_N=9hqnTHbB`4;bx4lN`0ZhRFSJIvu4Fo zW1IYa)`^$#))JNXGPXYaEA%v^rBTM&PG|7K?V5sC7u@w~JM6p4bkwR$t-K?9-e$j3 z(ZC9~p295aLPan;U6+|}TU6*uiyj@q_7nW& zTT=B`qLI4@xGzU^$bz%cU1vK7*OwXzfqeF0ewT#}E@1BSPS#AX+(>UdU9PnCa}zhF zonCSDXpws;!vk}yE89)}?R`I`XcJ1~3dHAtj#dBkw;QBio21w_U&@$Hr7z6U5!dgw zHbXL(id+IcJ~&Lre*Dt?B|)2f!i5BgXGCK`;2w|wY(dKSaU4oCw5{bOW{sE`_x(!zlgEFO0m_G937*oOIM(({l3J%*i8MV2rofED(o%3YCktbDi z0)Hs3Qvqzw43Fupyl00DpsbH`iME~Vi_Uw_EHyG(8s>Mn$y%E37rM8tF6k|6i6lvm zn;w)JD*^gt`cTcoO)hqL$qoU5b4*H~4;$~pIAGFgSS0?Th23|jt2XVp&|z+^caC6e zzPN)j-c=bm2iIu=qZJIx5I3_E93in~(L%aJdCjq_o^ab>t5GMVx4IeJy)Y?LV8AyZj1Qk7TfR{OY zEx=R0-rE+K&|l?AwU}8uyud2;!l>hm3_Maw66`KF&G5Z-6Z zf%&0hgs&&YkGB+{S8S!6*6xu;ven@5f-wt9`U}ETi%lQKO*M5HyEBrNk@l}7OvCo4!U$*-8V)lJfH{iUUc+G^KyLwa4~j8oXOtOvginSAis=?*5T|Ffq&75PBODi$k>5^Y``O%<3ZfE?3;huvQ@dI?tg- zE$#ScMf~B=z7_*z^WCZ*=wV^hE?Pg&yNpu^YjL>71AnSRmSa?zZm?l_5}^0$D)C6D z0&S{Htj^U@NtLyt=*Pz_#U4h?`WEyAk4Mk~I_NTSo~Swuw!B+O%|jjZ2neT77BU6i zdE`PK3W+p?G^LpKIm)GSc~Hp}$EsxZe&inyb-p=J>2K!irh;EV;cPs))6b9Ih@}8d zSj_d#a;8bkg6m-7j2R(`6@Z?lu1p3POj08rHOSI|YlG)Y{O@YV%_(tT6tnO82J%x& zw&(lt;<5gc+;M88u!ULi1p_h@xh1Wi-t`VBOEe$1mHzoi`wTNQICCWXM3>5e{&b2% zny{*Tiy&FS%|VI-EMhW-OZJoQLSr=RpZ!DRH%*k!-K^r*4R09;&sv-yM6N)XJj5h= zA#k@4iO62L-R`*U5r8iH1b0GPRKi}cTWa1P`~h5hPMV~TeF$}g{22Ouzi-*ROZrLo zfb#c<>W7F`rM+Xy!w8k+9KhJndUBKZIGnRMqixZ93hMR{S*0=sRfclRgP(D$kSXV! z_R!X7{vkuo!p1L7e#p@x}*_k;&fA(6%AxyBj zk@6rXuIC#|#0N-%uEyz7@WegV!(tP4#2egcGfTLVderlH$Ulba+jcHhQMApger#wWxpnf6KAy27&xTAgy*B#%AulUo!9OFZ$(Li{} za^cqI_d(53C!A)dk(6=y>KL)9YTM8;ig}rFAoFP6wwX<%Uw1r;|7h5@@LRjv)-JB& zqUF%`4HfVb{1N3n@hN}R6f^GTF55j(G5+Mi_X2E3A#iYcFw$A@9_f~nbFb$}*rV~g z&ur|&yZb$yAxZzf=?-X{0`WHM4!2w4_e9M2zj~)>(#HWblk_KD@mRthlZSL=f*D|_;x5x&A0zx4PbSl~))|k4mb1C? z+J1EnxxNK8mNYZBa|L>=Od-QaFQR&_-dSPZvt>O8*E#3pKdQgHI=TO->@1E|S zwKL$1hk*w^^XGKY^oTs^u|kQ1FSi^hwmd93Wg}c7S`EZFSJmI(G&a2S0lZX-=6v$r zT%Jy|MLudASfM((4JfcGrS00sXrWuIQX0Jj2_j25;p%eMmf`}GBStmN2E{=<6KN}G zkbQ=sI`uxOeMs_ORUrk#6;iXFkXsyj%EExuKH=MVf0SmF6NG*A;b!TAw;@-bO}5`! zNsbKN{C?fY3=tZMr4DfQgB6}eQLMhH;c}{VT;bg-&ir?{i7efGoLo>%LkLNx3r(d} zWf_IIvxkNyb(|XkmZ2+AA3Hpy<$sDeUd%BYCm+a!86dxC7hP2_>vFKrdg$eM`eHiv?y^$=Zn?XLSR}i$`m}c{RunH) z?O^kgwHF)weIA4EbW%#;)N4PjBj#GD9B{8mcB9ytkStRtrornVhMVtCU8a}sH0GwT z5OX9S%@(pHJLS42?QONcu!Y5IlsiCS2#ac>P_}GlTh(o7rcnZM`Ii{4J4C_K{kk@EK_V!_wtu&Hp+eR0A;LGsa!s zqKB_GSy2$~;iAe^6HP;*%RPiC#r?7(4t*ozIJ#hse}!MDL04RqRE4ef(djpHE4v+` zHK`_F*2ZH)w5JP=p4F_lD%B%YR}P?1W3$MWLil88#r)*C`fjN|4daFx^tJ{Vp0fMU zw->m*ZuO$s=t8^Nf^o|MlmVXf`LEVhT*2w98*TPLKUY&peyPoi(nNtkw0gpVQPY7O zQ;3NQl%B%9OT2+Z=*qNvfc?FPqB_?$Pa=Z;66EWLl$aw7DB&f|ma1_+W%V9d3}M8R z=4mO~r9I!LwcbB6kr(jv#WLQ=Lnw9D&*WsJzs$luQs6bfkA4OiPNn- zJVw1r0K$^fP3Y&bZR;TR^}2^Dm`^Se>jB%%nAHxOgcvKjhdQh|jii&|M`sOtUy6BC zSYVrSL&2)8iJ!doaa3WWhSMZdqq=jGzTIResAV}~X_!aB&~ikh`u@T2hL=@Ibj?su zA~nJCI9g2VP~UAi2RzN9Yceaf`|WCu`Ox>QHI3z~ z>8MItSC+(6a_jd@R??j=Wqx&XO%>0AiD!@!KxF0iaJ4n(Vg3cMmaO6h3tKs{)9nZ~ z=)z>WkM-6q_~V*ZG`79VU4j^}K8qv88Hm+ebb|> zmIQtmdOrcSJ_1HtORrqU;BCU9>gI+|WYllLmZ;`S0eL{pKJ~M_@G}g9?Q7$MM__qf z`enF%{vzDRMe_S`r%_Tn04rWMg=;9cj&hz(X!3a(0GtCT*Z-t6-~U2RC;yEu!Dp_r zv{G8KCW0q(jZy2_mTc6sm z3_?;#mT2HmIy7FChFDC;Jgfl5TxX=cFS>No@>RV#CMLG_k$%7S@eF`2+3V?j`REB0 z`2?RP{E`98>~4RW;AKAN8XCqWNe z&v(JsCeLCaCYjCyKbwx=AyF&#`gkh7 zrO~!*s&zoAv?_ct%~7{Y+hEdrG->1N@st&VYAyjL0Yz@^{?xeajUr*%9jde!U}1V8 zDCR9OdY;0*5X$rR?793cPWiJOTEoM^rixV?-tJt4uIv=tkK+6nw>H1H2OnNq-0&|k zp4Gd)s0n{hO-WD@YMq_Nct6X4m)!4WN*iB22>j(z8|``vA$Q!9)vw5URmK-IGss=d zdFKSUF!7xg)6C-6D3q3F1TXi=CIpc z$Vu~bIn8kW`+^6?vlq%((ftMQAwX+TdRiz+8LVLT#LU4{~wSvliCF4$U(buwZ(xHY7gIzL$d?{I!PLiOF0S*dA5 zVSW;`i8iDZRSj9@F?5Tj+)OlI6H#%KAy{ldR#q~}{CXbNL1sPnr5zjgYNB@v}J+8S3IpseO zPtrhhkzb&SGN52EKtMoHKw8ybnx;zUL1)lFKqpv0K-Aw>3p)l!6K4w}mzM5sU^Ezn z|Ey`YIJ0ep00L@7Oz`tSO+kbOflRU61_p2W8U>z$0R3LlGBX1V1N#qctN~kr{X^2* zz#jjd9XZ(w9) zU}i#RVQXqfZ)9!Y=~Ri6uUY9}6uX;kI1<9u>i3t=SIvA!+@NSr@^|1y?Aj*y}sG1zlxx8|ihnC(XNw z&PB3M${Y`5r5sW|iHqh66W!t+J2@>hY8g{F=sWQ2eg{EjTt$tO_HOZylA*sj7x!gy z00f?45GaitQUR=mbI6C6J4mLhH=L+IOquz+=q!CWLOhtTEKdv;&O|GwcsRtjDHi(v zkCdlC_@ax;nf?h1%V3~eR%KOw;wh9~r)r*bLLu?asnO=ntzp0PHQ84h#Ezh37BLQC z{#10^Y%{uR6;v zvOJ#$n|rrxbilZ{D8?)s=23eFUu9dDegNO;FL#15OKRxnL<^)m(Ya4t5w(P$*>l!5 znq!8)P*sX?lGvoRwvl!(Hm1h&(OD#8B7Yf0mlc9!SfB_S3=~Dcni`1l;i3S)VISd{ z%@s^%5&zI$1;e%`{)gh_p|H?`8-P^;-^#;(uQh--vAme1yi94AgeUS$@MCzLu9{r} zEqnK-{2aOq+ItOIkIo0)z5{p9G}7{XN1=^hTWIYTqr=@&x_)_dI?$#Aaqcod@20<; z5ii;35&Rc~N8yV-O}}>kgm_w`J&fPJD|#B^WPN&Kk?+Ybc9R-3Z|86$L~qp)2gUae%Ce{YLq zra-;{FS+5O<5UOHuLJ3Nu=K*4u3V!>z5p?FbVrFw6RlNIxi+@1!TVE9g_NZn*lhHq*8xo1s>oF9t6ykYJR{ClmHDG0&j_Gr$tgwB@~Fvg(@GAU-P_X?^$-u?$7wtgY=N0d810PsWSpc06xV;GwM^3c4ZFK}Tq7lf6EucIcx%a{-@btnZXv^PV@-pz;9x zV?BH`t8xBlGOx5PKwb&q>5Jc;`Q62H(@+D(>B}xVZ;mL&Gk<6@6k%R3aKA?rq0qAm zI3u2QaNc2t5G_qIw%VL70i`?$=O^>fumwI(w-n+ja*4LjizdB5p299a&=l%xW;fopg8m%G-_6_X zFQESwDgF~5+(BP0EWab0=l3A}9u|QAD^6Rx*f2QS8~wioIi3f*6@CZ^2qy?vafsDP z?~nY&_{oF$%z539e1GE)|G|Tc!N01Tlbwy;t`Oql5Pp?|^`ak{gPqPkUxk&62Pm!( zrs5Dn#x9;jqfp#5T zAkz1TKnRSFdNu8$&xQ0lTWe>>*`gBuGz82N@t$!vWh!%wFHrWL;B~6bGOhLy?Hf>4dQVkztg(ipT67YG1V|3!kfJAg@Fa`wTg&f z!aAiL6QTBBXwdXmgex_WA6w18oER;g&-DtZ@eqP+fL5lDwHC-^L$INYK#6MzB&W5+ z&KHK$J%;O0Xs~Beq3o>OHK3MIEPqi53jyxygNNa>A>4TUHG2a6EXfydV+RyYcs+^A z`|tvd5_t`k0KO(CQ9%O`Qc5wwukTy!5D)et{(SPOkoRny^8L59L?YqYev*qsevwVT z)<1m2BLt9cBoYNRI1Si;81FI&*J@NVl6PwMhY6xEAe_XVDD#!qF!v(^0@*cB`2oEC zXV_EJC^%Sh$ORUQU0vcvy|V%GIF^aEXz57beFzJwH$MsDn}RmUcyS(4v&)<0Ink4? zW`7ufS5B(8Jr-Ud--S-SXX>0zS0z2DU2W8c|G|K+nibCvLnz4P!~wGV7J8^yH6CAV zzba%7)WUV|{MnDADbsOGS1cZSSp-N@v(R-$)ra0boy`*}34DmGXE)O7iP5}>L0Dwd ziAw65P2N!^MR|aHC>1~>n+6yDE|=x$&*V|**ODDdB_NFo73RcshHocx?~@=ijTd3B zdGm(%0}>W%@5L4I1JYv6tFAdSM%zU3%uOkl$Ttu%Ynb_yzB&p#(uWd)vY2Jq#e*W1#RBJ0n!QAvJwn1zC&1h9I}r($ z4(&7D>RGY+iyEZjs4}|6vTPQJ?x#Zz*V_iA?MAgBsy+S2O@(y+_r=~10#o`KMpty0 ztMakJh-{DlE>0dr^Q?$hN*wT-=?UMRZg76t)rhQ54b`gJZ(`4-<<2R-rsRbbG1^=H zPD#B#bmQU*t${Q`>omp4VP6zz*ROU!E~&-aRaY9bXy-xINIelNR}Li}U}f$|hEaKb zFVX2j08mgw

  • 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

    ZH3W=?5KO6(pn#XCpkq@wO* z)w*ezV~VM(51d{f-m~mE{=}30T$JyKh4Q-fDhXUNt>?3;!B6w{4PxP?m5c(0n2!<3 z0;1r^f4Hu9V{T`^Ym)}F)fRChV(i^3og;g=P2A7kIzsQ^ZmQrh!n>iZub&l%F4)6l ztAmm6P%Q{oIw!hXKR7664*yWQ%^+0Dsf8E`wP{kvp&rvkC69cyq`=Kj$}9=gagpKF z$H0<(9WNv`%c6=|7=xRyw9%crVhBta2Bi1%Oz_~ZDrugCI9BufNpqvO5f93mO6gIl*#C`*lN>%>VNeZuu(|L?H*C<4&7PU=>hR{^$(8Y}R{akLbCa*h8v`}V%C6YD z&UFL!`ThkmSn3FLE3!7!Z8Y5kO4m8jE0kfy*f+b83Fo&7SM9{sRlokHIY7kLYy=Q} zd=uK1VM_G*g@FA743;hn#x3+7$P%lMVEt+}LFB;HE558iyJy{zV2ETgokfG`US-7} zMBmDSwH>oZ-vKw2y|S=MwXZ%OAl(w|yMlxxU)@~1Va-n!GqRb~{KUxcMAX9KPZdKQ zTYA#q@_d0ySpUt@;gPmT5I|O9QTJTE(%A{Qj!8@Eu*@+7QHAV);AWqPk~xV^f%PcIwuU`~|#zMrErc@9;t|Ct)W25ucq)rR?CJ*+-zr@i0JB$jYZlR&Uig zV5Bjuod^0*g@$9-Nv{=oYp^8;ddjZ4!pt`H#QsSagB*jb9H`LqoXBLQE#At!cqG7+ z0Bu=wBMamcBm)(f499LYuhInWR(w# zSUyXRXz^HxZQ?+yb^Y!4Ysft<%BVGyF1YYZ>LK^O!fOGTaO3;{HH4z0X+}RyXY(s@ zm2xt~ul1)D9J}x``s$YBwz+0$I%GeFt3x)e>4k2;%m6{6JA;XKS%)55ELh_#1J;pJ zJ9jWsPw#1I5x`hcRe9hx-i;`jxLYO7aBP2CfF2^+Do>V z>N@F>G{G^6u*3mo;8i+QbTwyiKY@I1GAxDZbXEG1mKonum8ao(#3ONqICi4HUB@g$`Bj%_4)gzi3Q z#I=?vlF{KUrRE3sb1}0~dK^%7OGlv1*Xd{77KJ#?We3U`k~2h zMZm#U-f?Jskliw3=Sd{FR&^1!A^~^GlNK+-VUv7Ai=|_f=C-H%%_#+!@>Qd>iI7!GrkR-23B#X( zYbsKGd%+H4EI%h-ePPj>%(+Bjt;ov6tWEVd9{`lbJ==7LQ*Mj?aAsRk6VX@|K7V42 ze0M5tzv_V=lZ*X&`&V)1#KZ$&Qt7>1BwcFMi zmk1SpV^)08q%&wK;okjLPz>61c3MnUZ|Q$tN>=-fdVK5d)H$bMg71zTA$Hdj2wXq> zDgZ=xTWR}iy=^Z#fdv^aAp!dRF&V6P2oF`QUHJp26o8WZh4cyI?c#L<*W)P`#zhWp zSeM3q;X4z+2^el`vNKW&uS8nu{8KSD`yn9)X^nq7%S;|Kal(HW5I5SMmpNFA_W^Qe z82o2->f!nB5)@qNRBJCbJ?f_Z@GSo=KY*EO%p@iEpo^~KueyEP7(gQo4AqLAb(E=h5hlR1+ngQ+D@>bhyL*tL3L+hY>?8S9ixTi>YEA`COlSk4z{tRUv=%s)Bf8bwIr-@v7u+`1K-F__-GnKXrp2v22TdL^wzrBQ0t$ z_9MfCHEovQ3LzZLJ$ky7VZPRsLmr^k82%bPcHNeCBtT>4w>fpV)T{E$Ml*(oQF3j> zGMvg}LwOQk<>$M=acxnj_zAXB5B5~GNg zQ?C1XO4p@L$rATPVkBrLXq)yE=3e=}eiB{pn=R9Eh=Y@yjhjujk8G2_xjtYCw8q!1 zvTTStPdOnv==s{L{^Syl&X^A@BF)7u#+m4J``%lCZO;)Vl^>q{3rDfgHH zCA#~=`A?1COAn*%*%5#^NcH~GV)V0}7&LuJ$h`=`kZz+Xl@Tdu1+V*&q``L(!rt@9 zacN2EF7V?g8}&$u_XN8TzT1frlk1SA%itaX6KO^BU9ubMwAJtWQX4;>E8qFw;$ccv z2t(v|E}-sYezL8=uu#Gp!<@SY7M4q7dUX1nwC5xe`Ybl}J9dEa(>D;_{?NShuG)u| zx1MS_!??^g%?at;N%x5D58K|A&laXbP%i?iHLzXxgTF;hapm! zWW5JI8Jck-z7;?=vE1Qd1yY^O+wsMZy5e%d-rZfM)q|Yb&t*`7V0S%4k*|ft+>s4| z)1-r#aVwQ&p*KcaYQB1tseoxTC&*#I3_iiUH9H`Munx4ABltG1v|g~CHZg){DhVjl z-s+9P%`^Sog19(}fDAXKv!iXn`bSu4(No)fSWd#ik{>|i74}WN&_q{C&Tp6HqrhDk!7J*;MpQv~Y1Ch;E zs6LjItLKV_O!pBZ;aaZl%rm`r%6y3Z6krXg+p?orws7*w4B2W!-#N-@GYtHlgRA>O z;zx8wx$poR7BUCV*!qcuHvCDqRNH*i3pVc{XqsDsiPJ`o7q$YQm3_A>smLK*3(K>0 zZx3S+=xf|8JT%wE_a9q5ihCvW$vmL>QYaEW1rKQUsfbF+H9n~oaWibnr8c`V1QB&E zz10TpVy>n7qqIHrrz}^I;OBHI4?A_-Z5{|I$dUln{vV?Xrf8$}#mJNmXqn^z2- z&c6X@WyY=}*$RmMwcBq2Evl;L?t@ibhIr3NhHHB(f&}>PKMzeZ@%06>o>ex!tB$10 zAI}qQ(_EZO$+1hcMW;9s$3a|7fL5-rp9T+zk6Eb}qs^K54Y3y+P9WEj^;~LSZ$Q!- zs=_OY*IGK4!fA0eub~r47gaeu2iGYuM`r_mR=y$~;W;gPv09;Iu=r)f;RFcmip6KX zUY&?Y=H|?jjC}jPq?M)&biF<(@=19U8kTvG<4YAZE~jp78sDd(@_N0HY6%cj67_lqVQN*~NOZc_|6&uzDC97STf>GV68O=QvS;#&qV z`VcSYd}~(9FR~)JOmewSjnTplDrN7YXZxgX#x|2s; z_V)t}`I&SyIt?W4-WFu8^b}_3whV=&+CL_DOdu@k5Pt4>POeu9O?t4*e*EF|nGDsy~>haW|LZEMe!=pGADk{RPrtY_8qv4xT1vqbnYnW+R$Y?p7XTu`Y3SrlZB zO)KvKo8qIR?eja+K2l~athKXzJy+Q9k)gC!;&m!XZ5A##v<(D+&+g`GZ#wkES>6;F zoL%_F;Mb0LrxUUqIeOLbk{Gii`cf=6KcU~El%d@Fpr)Mjwr$E|-@@Y~C1}R}k%p{k`I;!hHYDd)KH9NP9=A&s8~ExDJM#4*(bl9} z%$OzHi2a-9u+&L4UV2lS$Hy+3T?H*ipkv+=3j6Zn0+s(Cc{@6zfA_rMGo& z+`}!q>|ImR>MC|%bGLw+LWs8DalF68TgK!b^g_ax?~scx85$_S^4yM9^$g^0SN0_< z_(^tyys3UwiNHW#(1Hl9IW_xrN&O`Yym3aRxRy^JESCOS&7E`p?i=)IwAouZ&!0F8 z@Z3y#CqPuPE_-~u#ir}GLjC1$KXe2w6ylmbMqgzW`6&2KcP@&88@vJFox?H&McoBJd6@C}#h{60MZ5LRb~-x5ezYMY_U@6}1=+ zz^t{Db+oXiSo;<$f5(J%lyID|%B{)xww~VFgf-C`QLGhV!Ujs{5Y_~1RIwG=3$twv zRz86$cM7Y_8ij9BdW#8bys`t|PNcWEu*S)^B)#mp%&k3NxLf3q;T(N?sJtxK}EGO}9F_9bE)ms-|k*5!tEg)q*t zu0*{g3lnY1un&LtdQm0U{QoDh!5!hwBp1`V8nGzt(m6YF%e!CBvEOmBE6W(pz&4uY zYlSsjV#*Kb?RsIASi_2$S)?0}7Q<3ZznRi+5mu2^Tx{J&SDNQi0kGh9DtL#m3auf< z){vrr`p;sRU!-ZjLe;V!mpLxuZb(Zgpmp)w#f52SC}@9AE9(nVCAmJZQ=EOH{_xya zP6zwBQf6e{b8wn`HLP6>CJ$=K4QqGWRc*P7GSKb9Fb4#C1(^9ERKRFB2o45-681X# zll*c_vw6w_x=gK z&-Ru7FTU^Zd;b*s*X(=$4D%24y?>7H2m9W?!16!xy?=@MRlfGW!uP{7-m87(zsC0k zzV~l%zRvcQ--G#!GTxV@-UBqhe^1Yc_cP|Ri64LIl}G&Ntr_pD(%z2*&O2ZMumA@T z=YR!c0raiY?uUY27+Ny24}u&TrtgCB+n`_?{!V@XreiKX&E5tLJK(^QL;9eK!?Xus z%Icj^joFx2w@Mc3g~i&#(6CzB0gWxI)g92xD;y>Z9AC zxRJW{vl%mGPalM*R=#wzuoo-s{dp*3j)jXu;{VH-Q2o-_uJu|TC6H2YWqW(R@+rH>8a(8qs< zV-+?E(@^y9V*3;q-^f~m0oBQ!M7jH7Zb2}hW!4bEfbOKtq%_ou=M@G6MrPe1!GP(c z6;Rqi?qafovljE*%A#q(K(U_DRxdlGvY0ZAtc=4dhX#l4V%6Iq94wZ<#{`G=vIVPx zL+Q6(J+7BEOuL^o(fC?-u{FVhUUq+6Q1r45!6Ciu_|n2&))g%3WhYYco?f=KkDaQ( zD#Vjv>}**nh(rGl;q@Uh@jRK>$Ie#(TPDI8BGWID2#=jeC0#6&wtth5Z{MeG^s&nr z>|$5i_4TJ=3aubw>Ns3Ad>!t*3S2HDXcFQYh`7TmbqV9zpcd36@;az8jQxMW#udZ_ zi7Q8D;7T>6OI$&$@Nk9w5LZSbghZ3)=*dA7#10!x5GAtEq#$Ui*@$3isRgbq3|e{? z4m`+iSiO_oR9O@(>|-}$N^!8*X?qGiIc?*b*+5EyC0T6`3zlRd=I~%i7GjnLOR^Ai zM6e_aF-HbV@*w6dIS_Nyv|xWpPQ(mSMlQr09ULtYvL=X6E-DfR4krvOB@7&i7#JKy z$QSHow^Av>z{)YfqTn#XyfMA(j#b;gc?B`&&R~H=;2#qL-$xj`lMwj9UiOHMvD?3y zD^cWeDx8jH2BDeZpqWXp!<|=w%WVb&gl48hGeg4oSx`sDVWSy)%4UBm8qoo*7)+xl zxnj=}+Oac$@`_1+}FW!d&=rA}ILa-L@gm>T{@GyJ=pTk%9dlNHR z0jy|w20Xk61Ze(LOp_U?3vj9^_Q3DK^p$u@{wIqv z2C#>%gpz#O1`8Oh$WU%F*oXL+(GQ$!uxAZc2QZPuc|V}P0Ny6MI3!=GjJ_6s1GQfL zJ#aD%%~dU{Z`8da>KeO2w)-WUicRl$6rWFIW8q{r9xh;I za4nmFNHP)bWRqYAD~FwIGE(Lgc$Do6PqGU5C7TK_v1#xp%zKB;fPb)wh*GnVlxHx3 zgg=VSMT$OvRkMEsSp!;(YuLf;Bz6e<4y$CBvMP2XJB;1M4rjaB5$r`apZ$?lbCcEZ zp=<%4%<53nT*zzLBEE_(<|nXvemYyiuVYL3jjVy+&6e?}StEagHSvG2Bl#z6rNY=M z#b8G%7F(?pu{FwYwpIzUqm^;&7-bSWR;gg?lRG$8nuV1R+n{u^ zjY^V5l+#(4au$mz+gP`9JDaaO&f?0G`1~|GQF)p5DDSdO$~SDYYO*crY_?TBn4PRP zuv66I*r{raou;16&QLF6XR1G9XQ}tIbJS;1ZvBy+tA5PR(^U3dZ4^6SJAhrF9l|cu z7P5=9b?kq8+7@<+b_TmbyNF$-UCOT3u430{*RgHdjqFevRkz0*{#~I*=^d(>~`%BY`gY4yF+^u^WJ55X@6xu)`8uv7qZQI1^bCU z9iL~id-Oxu{rWNN0X@um^%&c!_pm;F3)>w~5mSHeh3T*!L_iDZXm8vJ>jFl=1ceDF zO~KVTl(n;eKmo2vMIfNu3<6hXIEw`=D8%)FKmq0s;djG}0fBmS5q}!`)awF;P|V+e z8v{cEMKBcCHyS7o421x$@*4Fz1g`!l$zCF!hh{XW6Ua>c{Xa*{f0wRZH2c5!xu&E_*dnTL@cauSRL>;5gZ< zptc1T$zF}d6&oHHfjtL|l)P)IEVo_@oBPv1}Qxi=1z?UW)87 z;?pRnPm|Gpy9{JGJ<8XW& ziI2et_~_K*KB>pDRM|=Rh&B_icz{n$6_}ZN+|PStO{vtmsmFP#0(Yk19+G-IG*$M9 z)MJfT0M1O6txG*FP8IlD>hWECT#A2>%O2p3smJEjo*|QLBgXH9Psyk4~HZ z02JIur>Lyam#_d5k;QIf53&2% z!>Fk|Ld*t6*l6e=JU#6T#b`EH(3jZ&n}EPn{5OqGdZW%mFDMI31Ji9phOfZ@g3~=M zeU5hUV;gYVrk9A-%bsvvhChD@V)eA0eEsT%pYmg;_ww+JpKS-TamLSPKDvu^r=CJbS3%aI7XuCssOEHKN1`w5PbN*wzjzZwyLTZ5TcuonZ5kl zRonNxH|>5teBe^kck}De`sY8SZc5b^MuPe^>XiIyRF=MgF<;??$p_i>DLAdb{(^$& zJ($e?2GiNcFpK>QmaAx`Mc`0qCScgKBlc@*gd#O9FBRc?aG11NPZ-<%dY zjd6af3y@!q^2ES_O!3xAy$`4LHRQcJ_>X$|J=@^rU3^D_YrFU(z5K~lGst;016Skcxja|4&xpU^^BK`gE}zjb z{>zzt{MQP|=a;5q?|1Q+d-?Bo@z5%n7!7^-`x&V8f5B+(`98Zxu{Zi zo`d?M_u*Wvfgd7Ud>DR$EU*`USHctU6q-8)@EPO$ukwF4h%?Grk^Bv^G4$)8{&E;n z@Dq<;4kjs7nOvI%uMD=J0s$3;7 zh7W`BycA~h5x6L$U?Cp^EBRPh!}o!8d^|*W8ASO6*viMjDVTN!pA6sOQ{abuU$_&? zJ;A5KQ}}=UG_Qac`E>Yz&w!8kO!$oN4}17r9Oi7M@cmd3-=B@Z_aOdG#NWyM0Eupg zBT}t_je)s=0}#ufcGW@{56=eRO};?Q&9cC&=bw5QZXZgfTVj(5|A>@C7?HQ6VMwD0h!Ko&_n{#*)X;YHGqfN zv1~mHBXSq8YuL?1IQZL#D}6KjiTv$j57Mv0j8{Nm!8dRqk%eT)U&7C&alF{0AxzFe zLo(G*L!ZN#4Dz`L?HS+)A^9APK$zFTiF`4VOg)^* zm%@d78C=C1;U>Nue$1O-CqEL&rWxMnE$~m?3SaUD_=Ybrqrr)AowPc1*b0{i4o2Z(;Dqf|Zwwp)Dw_#q(wb1wra#sp%JJ+3 zhZOf`M+GWT^l)~Ij})J_NzoHWcBv|qz+5R;CfmfxKEM`DEYUaiTH2-PRc361pG+sL zWvz{@QpLypB=HQPr#@va(iKuq9}$0=CW#5t=Q*^b?otl1QQbjk<*=DPhbf{nQC4nz z4r=5#(;IdBGi4-w=FIpP2}%T?E~wJQRLAx1&#>Jr*&sXu=#(E)-WGS7hv9V({Z7fIg2$zE>`1AxlwfQOvjb2((Z}v z%BEFU`jnb97cj1sYNsi+n5HbEO_2v#-RhveQ)!UA<0;8CgT`*95xb)_Q(20(>Q&Z| zU(}429sLc9klKxW=43RI{s6gJo1DG+M|`K#Dew2`w@Q)*u6Lrli>Sk z-8_so(49Cb52HnNEi&k}n6^v)+W4>;^gWnSK&z?TB$wLuvR&=GvO3qVNUN@8l=F~9 z&jR4X71f_f$!mxB@Z}27_?0k>Uk#)AH86>9LqUHn+V0oEDtbBYvaN0mx zFj7ra76c0%_2+-b^yIW6f<{ny+D~E7a#b9WQgI4XDo$Za#VJgwIE5({r*KdzPQX=h z3UjD9g`SGjG{eZ!x9qA~(2}t9ph*oob+>=BJGW94|6eObi5b00&n|Xle${A`s~WwX zTQz#yQH_Q;&%q&5HM*ER%U(j&==bb(w1`nP;z2%%R3m@}*UwkAIBX*1y=rNEcW0PuLy&zw93VDSMWG#$Lko zzws}40soQ@;a~Bf!g!g&ao)e-<$Mp{58n^M_ey{Kt;OGkiXz#?HOL5_gNvj#RtOKm zwNmpE5M~ntb%BM*Xgb*#$u)IIpzP~oEyz<(VujK#Y{IF`k_;vQSHs7FAZlY4tYG`I z2c-UX2kLK!O8xC(pZ@kYqtwygejivw`Wr7#>2G|IPk$@J^0HO)Gi=pvp$c2DYm!dK z=-YodHe1`b4Rgwn1HO*3eIM;swqXV_7}hYOPuW5nmH0e=x-xetoN*fdyOHfL%VF** z40@F_j=PnOpRW1dcPVFAst+pXt$t8BfAvn~!kx-R#LXU5E?FH^vDl>yl!wfn$`!rJ z)dcDx(-zc9P=BOXxptK@&%pdjb2@EzKQe#MQsxzu7L-~yLtQXXS}=E>C^ghuVOXi* zHK`tVD~t%5rN|RYjk#xCx=ZmK9!t?-f9MdhErHknK_)*#`6QsS#@_>jie3wbiYTDW(^K_B2zp*d{bkf#TDpXxn!TzeJ8&&b$zP;U7TM;u zWnihf84XNxYR}E6J)~DHPOoiJRFtihtGm^qDCyPVlzkc19JK>pxE;=;$FV!qvfJU5 zQf(V7PDLlks1>P->_<;dbb@~swB%g&s#9Eq9x}~No7byWY~S;X?XbV+%Jl)+#}6c} z#v6{)@>(b<)vkrYQvF&mOO0*H5bE3vNln8`b-Cy=YEGTqtL{g6b9bl*-44TP{nf+L zD2wV53w+*NEcTd8bpQ~#vwO0apPiR$`DqxaQ{mw8r)b{)>+L<@q$q!ufbr^??w;wM z-P_&U-Q)HGIqw}3^ne2eQN#ckP_h{n1tf`>Kva^VU_b>_g2J65h@86IfjJ;NbI$ry z#0U7EVkFP0n@BjNge#cHvPj^*yuIjF;b~e%8!#2=9<$<_^b6SBeN;N$W zXOcjQo`jPP9Z(5ps_Q*^X`(>?l*6dhX$P28u3ynz@SL z+mNH9cf_3(z1vH(SffkP`!%K%U23N2ibN7SyeN=yG)r38T8R%S1AM^6B zR}fQ3MvB&?=+laa%JkVpj++A+Nt}D>bJ!7(X;f)ns)Rf>tSqXZ=?WkXM zo`URToir?!tc`!4%mv*j19~|~51P_HD~5mDJErlzwNuuACm7Mfm-5H2|X}D5ub`G`p)u3D!=;pB=tEOa_BjRJT{7Pb_kA ziQD~wtvYdT18l>>x-+*b^Y(w`aGGxI@9VaIOI^BCws!|83k;!UP9G6FiRkr{@NV-yUyII zPG+5j>nxlqzH~8vMb%H(EQ`2P2y3&7Ts*^_W~()2`!6M;&hs; zs_HUb^%1iySNG_$s96>>%i=__19|wntGs^^($B`l*u*glaHT5G_pnU%ILxM*_bN8E z0^x>ZY?@lf8dbWh?4KpR-b;L=mpG_iX6lzj2p6JkjqxQA&?9*EVz|!l889&(Squr? zv2L!@u`1#7baI&pm*>;6-0Uf&n$1&XpP$H2vAg0}Pxs(b%a*7dOXIN=TM>_^*vfxI zUWz@OVr$a<g7zM4w{MSFxAM3-x?hUX(7{)tRDQp5YdY z6UE--G+2c^Zn1HqaebEaNWJr1kSKq`6){m*#Wq*5tsZBWXuN^FUfv|p#ARPd|3s4% zdkaTRMJ0^+e}xM1^r_ccRdwRrQU6|fB9Tb356U&i!#?(>i#&Y>qqnO3$}iBBU+^cD zUzjNLD<8vt<$Lw63sI;Gft6mj6nUx?SRZ~Vid89;T6I{dRm&8)7<&sD=jwk}YsG$D zM`WeSq1CGs*=txLkx}?(pIXn557p+N`wd0)cob(EcXLp^b5AtG@(!wDpSzqM4&AT3 zp?sse!OJiH@`-fK@6R&idz** zdNjKKsr1M-=bPez44%56LrQw2Rzt)t`3qvN%_jEpy2L7c;VK@h0K`gCyr2^LdvV1T zaI6Y8P4Skxr*%ocA)n0Ksjcv_DPF2}g}j`(<&J6t-Z9~LZE!)QIn=9(&K2f>v^Y{h z?)TRdUz{b$!$lO*s9}E*C0n-GT~F}%P!DNkT7>NFlP;gxJFNHblzhRDQoT>{&%7+$ zG~8S7aB+91OyNk?2 zMq)__tnFjk>(q&mE4p}s9M8;p?vmNGT+PU&ccVt3K3#X5V|6W`siggI z11);E42l`kVrYN5jRt$_W5$VYd9h?(c~4UzUEZPPj#(B!(NPVmBGnOxs{U{K+mEBumrz$sD*e|i86@+au32(i`p0~TDRB> zottz%1n++7gfUlBii=EiwB5>m3IK* z2ud9lvhOil>*Bpopp;SeL5>36aDy9d(iHS|$!S`*cO8H;k%BT0j*4$r3%eU`3+y+F z$kuiGe6D*~d3ah^Qzo(xq+bcAxOi1DO6mp+dShPos(!JDA|=wzbr8B+d?>N^LO5F^ zBaMH|)rYq`7>?4>1lyEQXa=CI8H92(1pUoi7->dfvKfPG%{a_4^WhdV0Sn9mc-Sn2 zXU$@G$7~9pn$6)0jQiGX4g1V?q_J5-l4dFCV|FC{%}(SDoEQh0N0Gs185v@hlcDA@ znGshX%n3Igz z=49gz^9tiWbBeLvoN7F8US+&tPB%U>uQ$FjXBhu6Z!~^4Z!!&Yw&|F2%mQ<++01{O zXLd4gHT#&inS;&w=0tOWd82u|xx~EFe8#-X{KCB3+;84P3(fmz7xR94lDU))G?&rw z=5l(Yxq{wiK1A;_E9jGEC4J6(n7(MPqo0{i(p~0L^bfO!8Rkajn44Ix`811~FR*sz zi>!zF5<+)f8k5bU-^GZ^Edv8 z`3EvR`}h`fKY!aiz~3`#`Dc{yukpDZ`?p1fRY;}Pi3Y4AY0x^JhOBdF*cwe^)>Smm znnfE~3uwYxMhmSqw8(mbHnTR-=GH5;h4mh7X?;msS=(s`Yd1Z@2HMf)w6oomcD38l zZgwZy-R?%q?e6p#`y|@S9!P(C+h@{a?UA&PJ(eDCPo;hB>GUM~etNQ9Mf=+?&;j=Q zbfEoDdaAvHo@Vc+r`vzv^8h_V?Hog~)M$>Ifih4_e05nq4OtHdsPtt9k1 z>CkC1La&#N=uBBeXUP_Hj%-cm%D(hwc^aK3hvD-adYinM&XjXXe~a43D! z3Dc*Xe426^bxPd(H>+17{ok(D{Xa;_RcJ1}yqnpauOr(2af> z7)ZYkTui?SOrqZgrqgYKCG@+%19W>}IsHDcn(hp&r9TE9r$2uMHqhOHjr8ZhGxV3h zOZ3;kR{DG3W4b4>hwcqBx-Zy@?hkgR2ZKEs1W#Z_a1>*~OBoMNWL9u0KCfpYIF~uW zTUj8ufQ5p0vvBY}76~qAxxrN|8eGj{!F4Pie3In_YgnV;vn)UO5=#U(vx4AOO#d!x z65P(31^2P$IRSsxA}7pR=0sWRoCIr=(}cCnY028Y)*Irn;V|OZVpdlw}fY~dEr^?*6=)bTlg+~E@rof zE7_glDt3QYcq3aFev#cBehuT^W{bn`vL)f|?7r|`_CO@YmPQKMvPdag9_hwbM0&9Y zBmLOQ$f;~qWH^S;Wve5Xu}35G*kh6TY+Ym#dpxp=RYe|UPey9kQ<2Rq71_!*M&4wb zBJZ-NBcHHmBVS>78+$48J$oUtgS{B}oxL2{%eH?;4zSmAE%rukOZH}NU-njRKlXO+ z5cW>)1?;`tOWFIm6WE8jSF+D?Z(yJ2-pannUCX}AeTIFN`!f4y?rZFu+;`Zv+@INZ zxxcdQQOdrLhS-j19@`l$W?;fATd&IBe zN5^mC$HZ6iUhyY+@AxL(C;lw&8-I;8d}Q7-eoo#Rer{ehAC-Ui z0>310GasGzF25}A13o_Qb3Q?-{m>$~6nWgE#EIf02#`~eeK^^C5KQP#EO82kD2#+Z zM1L^=7+eb910hKxd6NU{}E!ake-I9D6!^tBq}?>qBE)$Z z%9X7N7w3x$ASym0XKAX!&LU_eE)=66H!um3;v#V|!~)ZyiMRwqac2vBCq|1)A=lXl zPl(G9N;H%QVKGL8ph?a*aJ;UK#-SV1aiIa}xSX-1tr!a(Adzzmkz$-^4h1tG z?FofBYvFq_9w{vfJqwG)1TlXR5}_S%xz165Ld|J9M`5@XbavB)`*}EuBQZEdOcEzR zL8K6|O~y7WjMU)QD==N-$b1+qrik896j=oQHN4`;4y`_0hH>*?jJQ%vg+iw%e@53( z*y+VLimNb3B=9&pi7mpG$qj5^eZ4D^)HE)~zzX1|n`Vk8mwiomDs!L;?77z7;P&Ph0WU)d_1-Wn2?8 z%oM+%viAD{dedZdNe%L?P+9wtd33c=H87dtV;93UNpA-gCSb()6rWrLZ>)j~lPTII z#jmX5*Wm98Xq10`r(5y&Ay2m_jqNBu^|ZRF`HTiqdwM~%eVlIOHvyEhWLi6BP!z9gtwj8h)1n?UjEEA5Sxam!{}T^yo@h=%QQ> zQ+*Zh4DzY}mytKh`kHiAnlKvWsWP6?rSjcJ(QAG8QCqaPAbziky?~Ypzs{`+=%ikr z=Q70?SMdib)Y-L2*nZ?g)%5jro2pOvp+fJrt}!`6#0Hk5UVD zFRjEVe^-AHb5)wN{Y2MSz-PYlLvkaoObuv@q}5t@B|O?*^^O!@t#%dlp+q?0xW}{V zIHa#Cj-!M58uyxP+?6mkJMp^_RCIO-cTW1WfwBP;X;zHlPQ04(o*uN>Pyugv|z%H@uzF}vnHtM z7cV3#n91PFxq^!OvYupv-B(Vl53TM?y5UK8@5NQ$k(+Zz*wa`F~>ud;%|-b z9!S`w`GEx~dZUJ0Nlw>YRYR}g?-Pjhh81nTySHnNjKFxBxjpVi} zq&I((Kh~!V{L`erZ%)esiBNg4vi5zfdq%qEsJ-KkW|@dYb?{y z=ZNW=)rJK^Da%AMHCa$?(S+?fBCv2(s`;v}PnyqQ7>A9 zmD~i{B3p2=XP59UbO?>G_{E`v&`-Hs>P<>|lR$4$3-7odjg+k%*+neAQ19$+QCokN z*X@ODGNoW2D>A_c%llY@#2wy`k;cLki{4sJJUq|Nf$H{Gc zJz2o3$esLYvI?7h9e<8g^XJKC{sMU)yU#ZM64}jPCVO%4P`=ra{8b~sw-|pR{+7{* zzil+*?-(ukdq!*isnL#qW}M7FH_qf=7(@71#wh+z;|l(@F_nL7Ea2OWJNdtiWqgP6 z7~g5E=l?b~@&6dF@E?tL`A^0+zT4Qze>VQ$znGl=YC8NkGs1s26Z{XeCEss$;0Mg( z_(Agoe#jh%Y|~&1%n|s!&?0~41j{h5vP^RtK4)3nywkGGC6;Y2!{->tZL$jYO_DxguTkhZmoXwoXCU985mht-7k z#^;GvQ+k%wjGk>Zrx)P!GOHDxYPF`00YZ zy3sm{zHD`)Z(H5z4y&9VvU;!_t0yb6j%H1)V_0*m7wcp7W__(b>_qE0c8Ya88*BAt z*IFmA=~h2>qjeISWu3xqwfeI=tO0DHbt+qCoyJyKr?bbbGuTtsAoi>^guP@9Wv^Pp z*qhdH_O3O8eQJ$lUs``>vu)NnY=?Co`^`F^Q|m%rV2$Fftc!S0>k@vlbtxZiUB*XQ zWB6!%A7@SBldLQGG;1oKXI;hTTQ~AW)=d7OHH$xD&Ee~%h9#2{G`7_q-+K*EK z4wDjXGcsS<(t#`N*`(SJVw^M~REv0)*#VY{1sHP71PXs$N*Itd3Rin^hhV-J zcL>FT+qD>(gJQ)U;!X&#v5<$@?t&280W-xy425|C48pG$K!o*0k?d|IX0Q`UD{+rv z+1V+ixwse81=+3ewOEAda_HOS0kIgrN@EBeDVAVJ7$?(9wGeC@?dWadKE=i>mO9O{ z;;EoUyaz;WMMDzu^0K+^TdN1I}s1r zb3N==df0zkD(od5_PhxBRS_^cV*YD%q|t=)DuLr;jZcLH_x$XhJ|v5VCy|C!77Z#ZX^#imGm|2<{yT4QF=n?Q;)es`>mxJYh-Vk^th z5;XB~H%VLB(q2BsyD^{2-y!KK7c^at{an4I$kBgZB}9}ZO<9RjL`g)EKRHXLrIg5h1 zhOW^c`)Pd#(}luk|2dSC{tC(|9u(ihPI99)z*l$HM0%`Skw(O-D^#q`JJ8FkUrtl3 zpPH+zGq8m-4Te*C>+WSFfPeXM*Jr^s*l2%XeFQPX1RJg0@S^oId}jRuUs%7vSJocbY3+p{ ztb@d~4iRPp3E6}sY=acql(e=PX=_VTZU?d)g7x$rg7x$}!EWm zvc@`#`1VVg;xRB{y-CL4+zw|Ag*?BX<>_4>h2q~niiS*cf&Q-;6K6H zst(Rr7S1+4&Nd!SA}Z1r=Ol*jD&JgRFQ|Xg6K-P3v{KN3l9V;9vUZ2B?DW@Z3Tmv8 zu9b%uFuJ4zW$8e1I?%#%`Ar_tF&Tf4UNN9)U6VxGPgX*gu^cBGu=AnVPCzre09x8b zaI9SneeK3@qTLiux0}ImyE$BFw}7#BOPFG}g6Vc^m}9r`M}IL26qVw7wP<7LVI9I+ z@LhyG;`_(C+nbhq_!~A|e62sf9-1c8Dt}lHY@Z$#qJ*ZbvxijHevv6u0L*^_*v$!P z?s-au0>xF>?Lpc}Xk(W^C%Y87+DAaS-N|pnHV_u8kpoiX^zcc1)Ne%PuLYsNM1L2@ zC+xgrdJAVjNm@cg;khIu^d3{Z6uL&O^Qji}ij{m zXv6f{2i7Bw{xAfF`@T(D19N{{trkx8OuMzbW5EYNEMo`R1L1VhJ1B=A_L10*M?pKg z434t9LU+3x^ta1lhYsJx6MS68eW^7#sC_9ppY%`Lzb-5?IFA)0#u<;qNPsx8;P8<7Us`*F|p3WinZc;3QXcMp0X~(g?(HVyjr34;UjfD$h9j;ccFpF6#S^%%#kji5x+mRZ$)Dp>Yu5V22(4)z() z(;fueV>~V* z*&x3^T%}kFoXfm=tORB6*WG)|)E$5Jm{3!hHA=@o$Q}!Y z_Bd#6Uk)AZ3DCoyltrAsf?!A;9{jbhL?Wtu!r$`}!8upnWY2v#-Osbvj&b&&VqLc)#%D|Et13A)fTQ%R;Pa1*a6*K63QH zQoZ8kwl77VuhixFDj}+@0!os|JZ-RUQ9Az_(uLvxi;x2hWqh#MHvzY2LeQQKMfS~5 zV$btu55(hBTI#uz!4P(1wFYopC7;3(ZE6Zr|A!Rb_FsQcI3FoofE3<=6fQ&x@A)q% zY+jGT4Wink@OW>?1=Nz7)su~kP+%_x$6k`vVgVmZK-7q-dMs^(`!J9CdW7c}k|~H8 zvC?HQ9?0?m$y_krJtUhD$kTsDmhP1G$y$MAJ@}Vo8MHl3dVZp&AO((c?3eVNM?kF` zMgifGfu(-ku^duH^B!vrnnfO3#stt3Aw>0%fjlzRPf01iJ#)#)qMi{RkxO zH8>%zg){8OV3fTM*X$~|(tZMNw4a2V?G)T@Z-Be)YFKX9z$$waJZC=*AK1^rF8c-e z1LJ=W+MAJ8f0fww7G&37C%N`NNYs9fw6fpO-QybUaEss~t?3}45&TE%GT@93pL)6x zJ>VanZp0{9;ps+P2@CYrlLfcK6s-qgBTqL$Jfn3ZqPT8*uF8C0kt*bJ${5n;ve=2$ z?Qvcgv|Inz8~uNt)p>_OyXIqUnE1$VrC78P$0FW9cv9WVmTk_exf&Wr<>C zG#SM7UTlKtETW)ezK zcxJPe@T^@9S@%~$Bi&J!mntJ7o;Dt;gj^l{U}?tu!S!rstxS8iQ^Wl$_{Q%{?ZAII z0IjfJsBUu*3f#_1uJo$dD#9D*4RJ66Bw?se}m`k z-(d?r->~<<+xA}g%02|&*azTS`yhY(XxIAw>t?_J@x1O75qMLx4<@vQ4dMmed6Mv? zco9PkzRmJq_me*x{Ul!UrsAJ8)2H^1mRif)PQjJe+bB->qs%hyt`E(8d-FzBRz;~k z9`lxOPRsO-F4iN8J1W)nukHPm741^!?ek5p%|yrge3U-CZjW=3ayz0-D0_c-a6Dtk z^tqt*XhY|MY4@W|6BhP}(v-DE+rL@sGQ?CGOWUWc_1d1pDq2iB)uo6ut512*=W3u+?U4Z`uDAbcM{ayRZ*rUn&;KdYOD>(Oix^^V`?%K zYD~RjaHd_;1sdD7Z5tEYwmq?V$F^-_Vq;?4#vNM|XOc7D^PZ}6eq6P?x_7T#SJkfS zAHDW!d~aPWjwu&w+}XrQWp4cz9Ke-$AzH3DiKV@2d1v$-{do1H=9lm0u#tw5vnsyO z$5VwGjoor!lVse#rLalTJ(bgzXJmE6HI>v>8n-waLr+(Cj4oY2&<$Y)LO4aD;Yok< z$=KjB$J`);vP_2>IPg3Hp;?yIWLR74Uy%%RtZQD?G&@a~+@{~eWyMJZ@T)6nTRzw4 zlWToKJ_771mxrx(Pd;q;5N~}SrapOhUD>>UUIrx!ZB-yw{ZcBBX1Q2^&cG`BotwRq zm$0<#r%_+CHl&&vClN&HQ1x4KR`&FpFGYArr!L|Xd_Mguq6m5)0^SgIb#S~T2=RW6 z+kUPv9{i(R0YZ0Kw8}ROFlkiwh(HYTZgK|VHn69Ac1*;vIu~&{C}Mqpr|Y&3AKv7A zRx^dh6v=skq74OI3fY)tzc4I^RNKov;z=5nDKv9?yx_9B#Xsb6@m`FSG3FaL^o7e$mGfbzLlUodMX+}?Mr6a9UJ*pSAm}1ySk1Mad#;D zP3pQRG5|BeHrUw#EebTWCc_euOJY=Rd0dzI@8>l0o7E2*XJ?+sAfm$g;}A|VuMMj z(=_m2wCyoRSU!4gnt9}Slm=Vog1WkNm_X@MreD7*p)Vn;zk_ouF#5M|>mz< zoyY*7s-;psyq2Of c8=pEFOkHB(ay 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%0DI_4n}dqwpM1AF8J2g-}oJPdqYaTSs}iI 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 GBK`+};V=*Y diff --git a/lib/io/reticulum/reticulum-network-stack/maven-metadata-local.xml b/lib/io/reticulum/reticulum-network-stack/maven-metadata-local.xml index 96f17d67..1c66705c 100644 --- a/lib/io/reticulum/reticulum-network-stack/maven-metadata-local.xml +++ b/lib/io/reticulum/reticulum-network-stack/maven-metadata-local.xml @@ -6,6 +6,6 @@ 1.0-SNAPSHOT - 20240707083116 + 20240731195206 diff --git a/pom.xml b/pom.xml index 86369dd0..7dd341be 100644 --- a/pom.xml +++ b/pom.xml @@ -6,6 +6,10 @@ 4.5.1 jar + true 7dc8c6f 0.15.10 @@ -36,14 +40,15 @@ 1.17.2 5.10.0 1.0.0 - 2.23.0 + 2.22.1 1.5.0-b01 3.5.0 3.12.1 3.6.1 3.3.0 1.1.0 - 2.16.2 + + 3.12.1 0.16 3.3.1 3.5.2 @@ -52,13 +57,15 @@ 3.25.3 1.5.3 1.17 - 1.7.36 2.0.10 5.11.8 1.2 1.9 1.18.30 - 2.14.3 + 2.16.1 + 2.0.12 + 4.3.0 + 5.9.2 src/main/java @@ -442,6 +449,10 @@ project.local project file:${project.basedir}/lib + + true + always + @@ -453,6 +464,26 @@ + @@ -578,7 +609,17 @@ guava ${guava.version} + + org.slf4j + slf4j-api + ${slf4j.version} + + + org.apache.logging.log4j + log4j-slf4j2-impl + ${log4j.version} + org.apache.logging.log4j log4j-core @@ -589,24 +630,11 @@ log4j-api ${log4j.version} - - - org.apache.logging.log4j - log4j-slf4j-impl - ${log4j.version} - - - - org.apache.logging.log4j - log4j-jul - ${log4j.version} - - - - org.slf4j - slf4j-api - ${slf4j.version} - + + org.apache.logging.log4j + log4j-jul + ${log4j.version} + javax.servlet @@ -795,97 +823,129 @@ jaxb-runtime ${jaxb-runtime.version} + io.reticulum reticulum-network-stack 1.0-SNAPSHOT - - - - com.fasterxml.jackson.dataformat - jackson-dataformat-yaml - ${jackson.version} - - - com.fasterxml.jackson.core - jackson-databind - ${jackson.version} - - - org.projectlombok - lombok - ${lombok.version} - provided - - - commons-codec - commons-codec - 1.15 - - - org.apache.commons - commons-collections4 - 4.4 - - - org.msgpack - jackson-dataformat-msgpack - 0.9.3 - - - - - - io.netty - netty-all - 4.1.92.Final - - - org.bouncycastle - bcpkix-jdk15on - ${bouncycastle.version} - - - com.macasaet.fernet - fernet-java8 - 1.4.2 - - - - com.igormaznitsa - jbbp - 2.0.4 - - - com.github.seancfoley - ipaddress - 5.4.0 - - - org.msgpack - msgpack-core - 0.9.6 - - + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + + commons-codec + commons-codec + 1.16.1 + + + + org.apache.commons + commons-collections4 + 4.4 + + + + + com.fasterxml.jackson.dataformat + jackson-dataformat-yaml + ${jackson.version} + + + org.yaml + snakeyaml + 2.2 + + + org.msgpack + jackson-dataformat-msgpack + 0.9.8 + + + org.projectlombok + lombok + ${lombok.version} + provided + + + org.bouncycastle + bcpkix-jdk15on + 1.70 + + + com.macasaet.fernet + fernet-java8 + 1.5.0 + + + com.igormaznitsa + jbbp + 2.0.6 + + + io.netty + netty-all + + 5.0.0.Alpha2 + + + com.github.seancfoley + ipaddress + 5.4.2 + + + + org.dizitart + nitrite + ${nitrite.version} + + + org.dizitart + nitrite-mvstore-adapter + ${nitrite.version} + + + com.h2database + h2 + 2.3.230 + test + + + com.h2database + h2-mvstore + 2.3.230 + + + org.junit.jupiter + junit-jupiter + ${junit.version} + test + + + org.mockito + mockito-junit-jupiter + 5.10.0 + test + + diff --git a/src/main/java/org/qortal/network/RNSNetwork.java b/src/main/java/org/qortal/network/RNSNetwork.java index d6b8b220..c2efa889 100644 --- a/src/main/java/org/qortal/network/RNSNetwork.java +++ b/src/main/java/org/qortal/network/RNSNetwork.java @@ -27,7 +27,6 @@ import static io.reticulum.identity.IdentityKnownDestination.recall; import static io.reticulum.utils.IdentityUtils.concatArrays; //import static io.reticulum.constant.ReticulumConstant.TRUNCATED_HASHLENGTH; import static io.reticulum.constant.ReticulumConstant.CONFIG_FILE_NAME; -import lombok.extern.slf4j.Slf4j; import lombok.Data; //import lombok.Setter; //import lombok.Getter; @@ -61,6 +60,11 @@ import java.util.concurrent.TimeUnit; import org.apache.commons.codec.binary.Hex; +// logging +import lombok.extern.slf4j.Slf4j; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; + @Data @Slf4j public class RNSNetwork { @@ -68,8 +72,8 @@ public class RNSNetwork { Reticulum reticulum; //private static final String APP_NAME = "qortal"; static final String APP_NAME = RNSCommon.APP_NAME; - //static final String defaultConfigPath = new String(".reticulum"); // if empty will look in Reticulums default paths - static final String defaultConfigPath = RNSCommon.defaultRNSConfigPath; + static final String defaultConfigPath = new String(".reticulum"); // if empty will look in Reticulums default paths + //static final String defaultConfigPath = RNSCommon.defaultRNSConfigPath; //private final String defaultConfigPath = Settings.getInstance().getDefaultRNSConfigPathForReticulum(); private static Integer MAX_PEERS = 12; //private final Integer MAX_PEERS = Settings.getInstance().getMaxReticulumPeers(); @@ -86,16 +90,23 @@ public class RNSNetwork { //private volatile boolean isShuttingDown = false; //private int totalThreadCount = 0; //// TODO: settings - MaxReticulumPeers, MaxRNSNetworkThreadPoolSize (if needed) + + //private static final Logger logger = LoggerFactory.getLogger(RNSNetwork.class); // Constructor private RNSNetwork () { + log.info("RNSNetwork constructor"); try { + //String configPath = new java.io.File(defaultConfigPath).getCanonicalPath(); + log.info("creating config from {}", defaultConfigPath); initConfig(defaultConfigPath); + //reticulum = new Reticulum(configPath); reticulum = new Reticulum(defaultConfigPath); - log.info("reticulum instance created: {}", reticulum.toString()); } catch (IOException e) { log.error("unable to create Reticulum network", e); } + log.info("reticulum instance created"); + log.info("reticulum instance created: {}", reticulum); // Settings.getInstance().getMaxRNSNetworkThreadPoolSize(), // statically set to 5 below //ExecutorService RNSNetworkExecutor = new ThreadPoolExecutor(1, diff --git a/src/main/java/org/qortal/network/RNSPeer.java b/src/main/java/org/qortal/network/RNSPeer.java index 17139855..618cf865 100644 --- a/src/main/java/org/qortal/network/RNSPeer.java +++ b/src/main/java/org/qortal/network/RNSPeer.java @@ -236,6 +236,7 @@ public class RNSPeer { Packet pingPacket = new Packet(link, data); PacketReceipt packetReceipt = pingPacket.send(); // Note: don't setTimeout, we want it to timeout with FAIL if not deliverable + //packetReceipt.setTimeout(5000L); packetReceipt.setTimeoutCallback(this::packetTimedOut); packetReceipt.setDeliveryCallback(this::packetDelivered); } else { From 18f15d8122374b449c63905a31660e4e6ec274d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrg=20Schulthess?= Date: Wed, 14 Aug 2024 16:21:33 +0200 Subject: [PATCH 28/30] update reticulum library, sync up with qortal version 4.5.2 --- .../1.0-SNAPSHOT/maven-metadata-local.xml | 4 ++-- .../reticulum-network-stack-1.0-SNAPSHOT.jar | Bin 334268 -> 334268 bytes .../maven-metadata-local.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/io/reticulum/reticulum-network-stack/1.0-SNAPSHOT/maven-metadata-local.xml b/lib/io/reticulum/reticulum-network-stack/1.0-SNAPSHOT/maven-metadata-local.xml index 2d49ab7c..0c5034d3 100644 --- a/lib/io/reticulum/reticulum-network-stack/1.0-SNAPSHOT/maven-metadata-local.xml +++ b/lib/io/reticulum/reticulum-network-stack/1.0-SNAPSHOT/maven-metadata-local.xml @@ -7,12 +7,12 @@ true - 20240731195206 + 20240814140435 jar 1.0-SNAPSHOT - 20240731195206 + 20240814140435 pom diff --git a/lib/io/reticulum/reticulum-network-stack/1.0-SNAPSHOT/reticulum-network-stack-1.0-SNAPSHOT.jar b/lib/io/reticulum/reticulum-network-stack/1.0-SNAPSHOT/reticulum-network-stack-1.0-SNAPSHOT.jar index fd6591774c3576ee4a72411e234e51652f485ef0..5695fd2a6c16a6eab1985e2584b56f26005565c3 100644 GIT binary patch delta 3794 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

    #9#Li`%thp= zQryfc#a;Juva0^oqAKtGHa1qnJBZ4vAqmlt8d0CLZmkiVRFv1iLge1N4^t7Hysx5k zc%Zn|4uO;%TCdlNZb-i#bt12T)MD0`M=i4AUDY9k&Xi}3&Z&Fhz zXi|A2n$?V!G^?|nZie^qY`vesG(=llQR6e1g52cis?W!sE3Q+E+M%^AN?XxFQ`k0= z<6yS!<2b)<4V;#Ag2rj(_Gz4&_gLe!REavLwcgu`bjFkMu4=7MJ{!?DoKHj4&dO;RORXx(Wh0{$Gg7r4O7#pDbsH#$Z_zdJu`S3{? zuZu5VgxnXtLLtY}-YyO<*Cx%*smT}Zd?s=)`|&hHd;LVs(l5lprz85nAu5&JZ3m}o zGSXjYW#n)CIW3y6lhehT~3Q#9{Cs6euCs6ezFi2U` zgG9$=ykkMiFT9QF)si;K?@}ApjTeK(JY=OCf|a!-Sj}xnh?=DlqNaZ%#;=1XlkUC-aR6k6fpbcud+iIdB0k)dMeBw7>7Gw?lB8_EYG>f26alW(^b?fB_m LUS#p@`GWre`RhUu diff --git a/lib/io/reticulum/reticulum-network-stack/maven-metadata-local.xml b/lib/io/reticulum/reticulum-network-stack/maven-metadata-local.xml index 1c66705c..ef7609de 100644 --- a/lib/io/reticulum/reticulum-network-stack/maven-metadata-local.xml +++ b/lib/io/reticulum/reticulum-network-stack/maven-metadata-local.xml @@ -6,6 +6,6 @@ 1.0-SNAPSHOT - 20240731195206 + 20240814140435 From afc2884707c23e948d953ad22af03e2c3c4574e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrg=20Schulthess?= Date: Wed, 14 Aug 2024 19:48:47 +0200 Subject: [PATCH 29/30] add starup options for netty --- start.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/start.sh b/start.sh index cc80dceb..cb738fa2 100755 --- a/start.sh +++ b/start.sh @@ -34,7 +34,7 @@ fi # Comment out for bigger systems, e.g. non-routers # or when API documentation is enabled # Uncomment (remove '#' sign) line below if your system has less than 12GB of RAM for optimal RAM defaults -JVM_MEMORY_ARGS="-Xss256m -XX:+UseSerialGC" +#JVM_MEMORY_ARGS="-Xss256m -XX:+UseSerialGC" # Although java.net.preferIPv4Stack is supposed to be false # by default in Java 11, on some platforms (e.g. FreeBSD 12), @@ -43,6 +43,9 @@ JVM_MEMORY_ARGS="-Xss256m -XX:+UseSerialGC" nohup nice -n 20 java \ -Djava.net.preferIPv4Stack=false \ ${JVM_MEMORY_ARGS} \ + --add-opens=java.base/java.lang=ALL-UNNAMED \ + --add-opens=java.base/java.net=ALL-UNNAMED \ + --illegal-access=warn \ -jar qortal.jar \ 1>run.log 2>&1 & From 6c5fedd4569a2662bbfd0d25d0c629c08aae7aa7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrg=20Schulthess?= Date: Wed, 14 Aug 2024 19:49:48 +0200 Subject: [PATCH 30/30] create identities directory if it does not exist --- src/main/java/org/qortal/network/RNSNetwork.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/org/qortal/network/RNSNetwork.java b/src/main/java/org/qortal/network/RNSNetwork.java index c2efa889..35a6895c 100644 --- a/src/main/java/org/qortal/network/RNSNetwork.java +++ b/src/main/java/org/qortal/network/RNSNetwork.java @@ -102,6 +102,10 @@ public class RNSNetwork { initConfig(defaultConfigPath); //reticulum = new Reticulum(configPath); reticulum = new Reticulum(defaultConfigPath); + var identitiesPath = reticulum.getStoragePath().resolve("identities"); + if (Files.notExists(identitiesPath)) { + Files.createDirectories(identitiesPath); + } } catch (IOException e) { log.error("unable to create Reticulum network", e); }