summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgjoranv <gjoranv@gmail.com>2017-10-16 10:59:01 +0200
committerGitHub <noreply@github.com>2017-10-16 10:59:01 +0200
commitcc54fb2e6ea49034b3f14389e6c37d733c4679c9 (patch)
treec7b34480a648fe1f520ff9cf5bd3fdab54cc4281
parentc92066256b15bd51f648b8fd83756acd05bc13bc (diff)
parentfff597dc521b52d9b8a5971383661340f594e808 (diff)
Merge branch 'master' into gjoranv/container-test
-rw-r--r--build_settings.cmake2
-rw-r--r--config-model-api/src/main/java/com/yahoo/config/application/api/DeploymentSpec.java13
-rw-r--r--config-model-api/src/main/java/com/yahoo/config/application/api/xml/DeploymentSpecXmlReader.java19
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/admin/LogForwarder.java16
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminBuilderBase.java1
-rw-r--r--config-model/src/main/resources/schema/admin.rnc1
-rw-r--r--config-model/src/test/java/com/yahoo/vespa/model/admin/DedicatedAdminV4Test.java1
-rw-r--r--config-model/src/test/schema-test-files/services.xml2
-rw-r--r--configdefinitions/src/vespa/logforwarder.def1
-rw-r--r--container-search/src/main/java/com/yahoo/search/searchers/InputCheckingSearcher.java5
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/identifiers/AthensDomain.java1
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/Athens.java23
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/NToken.java21
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/NTokenValidator.java12
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/ZmsClientFactory.java11
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/ZmsKeystore.java19
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/mock/AthensMock.java87
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/mock/NTokenMock.java68
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/mock/ZmsClientFactoryMock.java49
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/mock/package-info.java8
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/package-info.java5
-rw-r--r--controller-server/pom.xml50
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java27
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Controller.java54
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/TenantController.java29
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/ClusterCost.java15
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/ClusterInfo.java39
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/Deployment.java22
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/DeploymentCost.java11
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/DeploymentMetrics.java50
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/ApplicationAction.java (renamed from controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/ApplicationAction.java)4
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/AthenzClientFactory.java15
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/AthenzPrincipal.java (renamed from controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/AthensPrincipal.java)23
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/AthenzPublicKey.java (renamed from controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/AthensPublicKey.java)11
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/AthenzService.java (renamed from controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/AthensService.java)14
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/AthenzUtils.java29
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/InvalidTokenException.java (renamed from controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/InvalidTokenException.java)2
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/NToken.java148
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/ZmsClient.java (renamed from controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/ZmsClient.java)14
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/ZmsException.java (renamed from controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/ZmsException.java)13
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/ZmsKeystore.java16
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/ZtsClient.java15
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/ZtsException.java22
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/filter/AthenzPrincipalFilter.java71
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/filter/NTokenValidator.java67
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/impl/AthenzClientFactoryImpl.java101
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/impl/ZmsClientImpl.java217
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/impl/ZmsKeystoreImpl.java118
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/impl/ZtsClientImpl.java51
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/mock/AthensDbMock.java (renamed from controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/mock/AthensDbMock.java)18
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/mock/AthenzClientFactoryMock.java56
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/mock/ZmsClientMock.java (renamed from controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/mock/ZmsClientMock.java)38
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/mock/ZtsClientMock.java34
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ClusterInfoMaintainer.java24
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ControllerMaintenance.java3
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentMetricsMaintainer.java43
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java49
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/CuratorDb.java51
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/VersionStatusSerializer.java118
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java50
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/Authorizer.java34
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/DeployAuthorizer.java27
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/filter/NTokenRequestFilter.java10
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/DeploymentStatistics.java20
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/VersionStatus.java27
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/VespaVersion.java16
-rw-r--r--controller-server/src/main/resources/configdefinitions/athenz.def26
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ConfigServerClientMock.java67
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTest.java20
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTester.java6
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/TestIdentities.java9
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/application/ClusterCostTest.java35
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/application/DeploymentCostTest.java38
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/athenz/filter/AthenzPrincipalFilterTest.java123
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/athenz/filter/AthenzTestUtils.java22
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/athenz/filter/NTokenValidatorTest.java95
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTester.java5
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ClusterInfoMaintainerTest.java2
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentMetricsMaintainerTest.java41
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/FailureRedeployerTest.java8
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializerTest.java17
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/VersionStatusSerializerTest.java53
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/ContainerControllerTester.java16
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/ControllerContainerTest.java2
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiTest.java42
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/MockAuthorizer.java11
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/deployment.json14
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/controller/responses/maintenance.json25
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/DeploymentApiTest.java3
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/responses/root.json2
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/versions/VersionStatusTest.java110
-rw-r--r--eval/src/apps/tensor_conformance/generate.cpp220
-rw-r--r--eval/src/apps/tensor_conformance/tensor_conformance.cpp12
-rw-r--r--eval/src/apps/tensor_conformance/test_spec.json1214
-rw-r--r--eval/src/vespa/eval/eval/test/tensor_conformance.cpp232
-rw-r--r--eval/src/vespa/eval/eval/test/tensor_model.hpp247
-rw-r--r--filedistribution/src/vespa/filedistribution/distributor/filedownloader.cpp6
-rw-r--r--filedistribution/src/vespa/filedistribution/distributor/filedownloadermanager.cpp4
-rw-r--r--filedistribution/src/vespa/filedistribution/model/filedistributionmodelimpl.cpp16
-rw-r--r--logforwarder/src/apps/vespa-logforwarder-start/CMakeLists.txt1
-rw-r--r--logforwarder/src/apps/vespa-logforwarder-start/cf-handler.cpp35
-rw-r--r--logforwarder/src/apps/vespa-logforwarder-start/cf-handler.h2
-rw-r--r--logforwarder/src/apps/vespa-logforwarder-start/child-handler.cpp87
-rw-r--r--logforwarder/src/apps/vespa-logforwarder-start/child-handler.h13
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/retire/RetireIPv4OnlyNodes.java2
-rw-r--r--pom.xml24
-rw-r--r--searchcore/src/tests/proton/documentdb/configurer/configurer_test.cpp111
-rw-r--r--searchcore/src/tests/proton/documentdb/feedhandler/feedhandler_test.cpp94
-rw-r--r--searchcore/src/tests/proton/documentdb/feedview/feedview_test.cpp48
-rw-r--r--searchcore/src/tests/proton/documentdb/storeonlyfeedview/storeonlyfeedview_test.cpp8
-rw-r--r--searchcore/src/tests/proton/feedtoken/feedtoken.cpp83
-rw-r--r--searchcore/src/vespa/searchcore/fdispatch/search/nodemanager.cpp5
-rw-r--r--searchcore/src/vespa/searchcore/proton/attribute/i_attribute_writer.h6
-rw-r--r--searchcore/src/vespa/searchcore/proton/common/feedtoken.cpp64
-rw-r--r--searchcore/src/vespa/searchcore/proton/common/feedtoken.h47
-rw-r--r--searchcore/src/vespa/searchcore/proton/metrics/CMakeLists.txt1
-rw-r--r--searchcore/src/vespa/searchcore/proton/metrics/feed_metrics.cpp60
-rw-r--r--searchcore/src/vespa/searchcore/proton/metrics/feed_metrics.h41
-rw-r--r--searchcore/src/vespa/searchcore/proton/metrics/legacy_documentdb_metrics.cpp1
-rw-r--r--searchcore/src/vespa/searchcore/proton/metrics/legacy_documentdb_metrics.h2
-rw-r--r--searchcore/src/vespa/searchcore/proton/persistenceengine/persistenceengine.cpp45
-rw-r--r--searchcore/src/vespa/searchcore/proton/persistenceengine/transport_latch.cpp13
-rw-r--r--searchcore/src/vespa/searchcore/proton/persistenceengine/transport_latch.h5
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/documentdb.cpp8
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/fast_access_feed_view.cpp46
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/fast_access_feed_view.h57
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/feedhandler.cpp44
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/feedhandler.h9
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/feedstate.cpp4
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/feedstate.h22
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/operationdonecontext.cpp10
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/operationdonecontext.h10
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/putdonecontext.cpp5
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/putdonecontext.h24
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/removedonecontext.cpp4
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/removedonecontext.h13
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/searchable_feed_view.cpp14
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/storeonlydocsubdb.cpp5
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/storeonlyfeedview.cpp90
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/storeonlyfeedview.h16
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/updatedonecontext.cpp17
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/updatedonecontext.h11
-rw-r--r--searchlib/src/tests/queryeval/queryeval.cpp6
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/multisearch.h8
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/orsearch.cpp16
-rw-r--r--staging_vespalib/src/vespa/vespalib/util/document_runnable.cpp13
-rw-r--r--staging_vespalib/src/vespa/vespalib/util/document_runnable.h3
-rw-r--r--storage/src/tests/distributor/distributortest.cpp23
-rw-r--r--storage/src/tests/persistence/persistencetestutils.cpp3
-rw-r--r--storage/src/vespa/storage/distributor/bucketdbupdater.cpp135
-rw-r--r--storage/src/vespa/storage/distributor/bucketdbupdater.h78
-rw-r--r--storage/src/vespa/storage/distributor/distributor.cpp31
-rw-r--r--storage/src/vespa/storage/distributor/distributor.h2
-rw-r--r--storage/src/vespa/storage/persistence/filestorage/filestormanager.cpp227
-rw-r--r--storage/src/vespa/storage/persistence/persistencethread.cpp28
-rw-r--r--storage/src/vespa/storage/persistence/persistencethread.h52
-rw-r--r--storage/src/vespa/storage/storageserver/servicelayernode.cpp12
-rw-r--r--storage/src/vespa/storage/storageserver/storagenodecontext.cpp8
-rw-r--r--storage/src/vespa/storage/storageserver/storagenodecontext.h3
-rw-r--r--storageframework/src/vespa/storageframework/defaultimplementation/thread/threadimpl.h8
-rw-r--r--storageframework/src/vespa/storageframework/defaultimplementation/thread/threadpoolimpl.cpp48
-rw-r--r--storageframework/src/vespa/storageframework/defaultimplementation/thread/threadpoolimpl.h10
-rw-r--r--storageframework/src/vespa/storageframework/generic/component/component.cpp22
-rw-r--r--storageframework/src/vespa/storageframework/generic/component/component.h2
-rw-r--r--storageserver/src/vespa/storageserver/app/servicelayerprocess.cpp4
-rw-r--r--storageserver/src/vespa/storageserver/app/servicelayerprocess.h5
-rw-r--r--vespajlib/src/main/java/com/yahoo/tensor/Tensor.java6
-rw-r--r--vespajlib/src/test/java/com/yahoo/tensor/TensorTestCase.java10
-rw-r--r--vespalog/src/test/bufferedlogtest.cpp5
-rw-r--r--vespalog/src/test/bufferedlogtest.logger1.cpp4
-rw-r--r--vespalog/src/test/bufferedlogtest.logger1.h2
-rw-r--r--vespalog/src/test/bufferedlogtest.logger2.cpp4
-rw-r--r--vespalog/src/test/bufferedlogtest.logger2.h2
-rw-r--r--vespalog/src/vespa/log/bufferedlogger.h8
-rw-r--r--vespalog/src/vespa/log/log.cpp15
-rw-r--r--vespalog/src/vespa/log/log.h44
176 files changed, 4732 insertions, 2296 deletions
diff --git a/build_settings.cmake b/build_settings.cmake
index 425a2eddda7..2cccea9b64f 100644
--- a/build_settings.cmake
+++ b/build_settings.cmake
@@ -21,7 +21,7 @@ set(C_WARN_OPTS "-Winline -Wuninitialized -Werror -Wall -W -Wchar-subscripts -Wc
# Warnings that are specific to C++ compilation
# Note: this is not a union of C_WARN_OPTS, since CMAKE_CXX_FLAGS already includes CMAKE_C_FLAGS, which in turn includes C_WARN_OPTS transitively
-set(CXX_SPECIFIC_WARN_OPTS "-Wsuggest-override -Wnon-virtual-dtor")
+set(CXX_SPECIFIC_WARN_OPTS "-Wsuggest-override -Wnon-virtual-dtor -Wformat-security")
# C and C++ compiler flags
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O3 -fno-omit-frame-pointer ${C_WARN_OPTS} -fPIC ${VESPA_CXX_ABI_FLAGS} -DBOOST_DISABLE_ASSERTS ${VESPA_CPU_ARCH_FLAGS} -mtune=intel ${EXTRA_C_FLAGS}")
diff --git a/config-model-api/src/main/java/com/yahoo/config/application/api/DeploymentSpec.java b/config-model-api/src/main/java/com/yahoo/config/application/api/DeploymentSpec.java
index b86c0a5ca94..eda38f95054 100644
--- a/config-model-api/src/main/java/com/yahoo/config/application/api/DeploymentSpec.java
+++ b/config-model-api/src/main/java/com/yahoo/config/application/api/DeploymentSpec.java
@@ -187,9 +187,18 @@ public class DeploymentSpec {
* @throws IllegalArgumentException if the XML is invalid
*/
public static DeploymentSpec fromXml(String xmlForm) {
- return new DeploymentSpecXmlReader().read(xmlForm);
+ return fromXml(xmlForm, true);
}
-
+
+ /**
+ * Creates a deployment spec from XML.
+ *
+ * @throws IllegalArgumentException if the XML is invalid
+ */
+ public static DeploymentSpec fromXml(String xmlForm, boolean validate) {
+ return new DeploymentSpecXmlReader(validate).read(xmlForm);
+ }
+
public static String toMessageString(Throwable t) {
StringBuilder b = new StringBuilder();
String lastMessage = null;
diff --git a/config-model-api/src/main/java/com/yahoo/config/application/api/xml/DeploymentSpecXmlReader.java b/config-model-api/src/main/java/com/yahoo/config/application/api/xml/DeploymentSpecXmlReader.java
index 0b49325756d..35021d1b44a 100644
--- a/config-model-api/src/main/java/com/yahoo/config/application/api/xml/DeploymentSpecXmlReader.java
+++ b/config-model-api/src/main/java/com/yahoo/config/application/api/xml/DeploymentSpecXmlReader.java
@@ -33,6 +33,22 @@ public class DeploymentSpecXmlReader {
private static final String blockChangeTag = "block-change";
private static final String prodTag = "prod";
+ private final boolean validate;
+
+ /** Creates a validating reader */
+ public DeploymentSpecXmlReader() {
+ this(true);
+ }
+
+ /**
+ * Creates a reader
+ *
+ * @param validate true to validate the input, false to accept any input which can be unabiguously parsed
+ */
+ public DeploymentSpecXmlReader(boolean validate) {
+ this.validate = validate;
+ }
+
public DeploymentSpec read(Reader reader) {
try {
return read(IOUtils.readAll(reader));
@@ -47,7 +63,8 @@ public class DeploymentSpecXmlReader {
List<Step> steps = new ArrayList<>();
Optional<String> globalServiceId = Optional.empty();
Element root = XML.getDocument(xmlForm).getDocumentElement();
- validateTagOrder(root);
+ if (validate)
+ validateTagOrder(root);
for (Element environmentTag : XML.getChildren(root)) {
if ( ! isEnvironmentName(environmentTag.getTagName())) continue;
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/LogForwarder.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/LogForwarder.java
index 46f5807b350..4f766732e4e 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/admin/LogForwarder.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/LogForwarder.java
@@ -13,16 +13,21 @@ public class LogForwarder extends AbstractService implements LogforwarderConfig.
public static class Config {
public final String deploymentServer;
public final String clientName;
+ public final String splunkHome;
- private Config(String ds, String cn) {
+ private Config(String ds, String cn, String sh) {
this.deploymentServer = ds;
this.clientName = cn;
+ this.splunkHome = sh;
}
public Config withDeploymentServer(String ds) {
- return new Config(ds, clientName);
+ return new Config(ds, clientName, splunkHome);
}
public Config withClientName(String cn) {
- return new Config(deploymentServer, cn);
+ return new Config(deploymentServer, cn, splunkHome);
+ }
+ public Config withSplunkHome(String sh) {
+ return new Config(deploymentServer, clientName, sh);
}
}
@@ -40,7 +45,7 @@ public class LogForwarder extends AbstractService implements LogforwarderConfig.
}
public static Config cfg() {
- return new Config(null, null);
+ return new Config(null, null, null);
}
/**
@@ -59,6 +64,9 @@ public class LogForwarder extends AbstractService implements LogforwarderConfig.
public void getConfig(LogforwarderConfig.Builder builder) {
builder.deploymentServer(config.deploymentServer);
builder.clientName(config.clientName);
+ if (config.splunkHome != null) {
+ builder.splunkHome(config.splunkHome);
+ }
}
}
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminBuilderBase.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminBuilderBase.java
index 3049112ac0a..a3a1a0fbebc 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminBuilderBase.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminBuilderBase.java
@@ -117,6 +117,7 @@ public abstract class DomAdminBuilderBase extends VespaDomBuilder.DomConfigProdu
int i = 0;
for (ModelElement e : logForwardingElement.getChildren("splunk")) {
LogForwarder.Config cfg = LogForwarder.cfg()
+ .withSplunkHome(e.getStringAttribute("splunk-home"))
.withDeploymentServer(e.getStringAttribute("deployment-server"))
.withClientName(e.getStringAttribute("client-name"));
for (HostResource host : admin.getHostSystem().getHosts()) {
diff --git a/config-model/src/main/resources/schema/admin.rnc b/config-model/src/main/resources/schema/admin.rnc
index 3ab02af3efd..cdf26807bcb 100644
--- a/config-model/src/main/resources/schema/admin.rnc
+++ b/config-model/src/main/resources/schema/admin.rnc
@@ -117,6 +117,7 @@ ClusterControllers = element cluster-controllers {
LogForwarding = element logforwarding {
element splunk {
+ attribute splunk-home { xsd:string }? &
attribute deployment-server { xsd:string } &
attribute client-name { xsd:string }
}
diff --git a/config-model/src/test/java/com/yahoo/vespa/model/admin/DedicatedAdminV4Test.java b/config-model/src/test/java/com/yahoo/vespa/model/admin/DedicatedAdminV4Test.java
index e3f773a64c2..e2ed57251d9 100644
--- a/config-model/src/test/java/com/yahoo/vespa/model/admin/DedicatedAdminV4Test.java
+++ b/config-model/src/test/java/com/yahoo/vespa/model/admin/DedicatedAdminV4Test.java
@@ -176,6 +176,7 @@ public class DedicatedAdminV4Test {
assertEquals("foo:123", config.deploymentServer());
assertEquals("foocli", config.clientName());
+ assertEquals("/opt/splunkforwarder", config.splunkHome());
}
// Other host's forwarder
diff --git a/config-model/src/test/schema-test-files/services.xml b/config-model/src/test/schema-test-files/services.xml
index 4b6eb12208c..bf2a924e62d 100644
--- a/config-model/src/test/schema-test-files/services.xml
+++ b/config-model/src/test/schema-test-files/services.xml
@@ -27,7 +27,7 @@
</consumer>
</metrics>
<logforwarding>
- <splunk deployment-server="foo:8989" client-name="foobar"/>
+ <splunk deployment-server="foo:8989" client-name="foobar" splunk-home="/opt/splunk"/>
</logforwarding>
</admin>
diff --git a/configdefinitions/src/vespa/logforwarder.def b/configdefinitions/src/vespa/logforwarder.def
index 205e8ad3b8c..0c311524fef 100644
--- a/configdefinitions/src/vespa/logforwarder.def
+++ b/configdefinitions/src/vespa/logforwarder.def
@@ -4,3 +4,4 @@ namespace=cloud.config
deploymentServer string default=""
clientName string default=""
+splunkHome string default="/opt/splunkforwarder"
diff --git a/container-search/src/main/java/com/yahoo/search/searchers/InputCheckingSearcher.java b/container-search/src/main/java/com/yahoo/search/searchers/InputCheckingSearcher.java
index ed1af514e88..018f4fc7aa9 100644
--- a/container-search/src/main/java/com/yahoo/search/searchers/InputCheckingSearcher.java
+++ b/container-search/src/main/java/com/yahoo/search/searchers/InputCheckingSearcher.java
@@ -161,7 +161,7 @@ public class InputCheckingSearcher extends Searcher {
}
asOctets.flip();
CharsetDecoder decoder = StandardCharsets.UTF_8.newDecoder().onMalformedInput(CodingErrorAction.REPORT)
- .onUnmappableCharacter(CodingErrorAction.REPORT);
+ .onUnmappableCharacter(CodingErrorAction.REPORT);
// OK, unmappable character is sort of theoretical, but added to be explicit
try {
decoder.decode(asOctets);
@@ -170,7 +170,7 @@ public class InputCheckingSearcher extends Searcher {
}
utfRejections.add();
throw new IllegalArgumentException("The user input has been determined to be double encoded UTF-8."
- + " Please investigate whether this is a false positive.");
+ + " Please investigate whether this is a false positive.");
}
private int countSingleCharacterUserTerms(Item queryItem) {
@@ -188,4 +188,5 @@ public class InputCheckingSearcher extends Searcher {
return 0;
}
}
+
}
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/identifiers/AthensDomain.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/identifiers/AthensDomain.java
index eb8b5c5256b..194088df7dc 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/identifiers/AthensDomain.java
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/identifiers/AthensDomain.java
@@ -4,6 +4,7 @@ package com.yahoo.vespa.hosted.controller.api.identifiers;
/**
* @author smorgrav
*/
+// TODO Rename to AthenzDomain
public class AthensDomain extends Identifier {
public AthensDomain(String id) {
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/Athens.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/Athens.java
deleted file mode 100644
index 0635fb850b7..00000000000
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/Athens.java
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.vespa.hosted.controller.api.integration.athens;
-
-import com.yahoo.vespa.hosted.controller.api.identifiers.AthensDomain;
-import com.yahoo.vespa.hosted.controller.api.identifiers.ScrewdriverId;
-import com.yahoo.vespa.hosted.controller.api.identifiers.UserId;
-
-/**
- * Interface for integrating controller with Athens.
- *
- * @author mpolden
- */
-public interface Athens {
-
- String principalTokenHeader();
- AthensPrincipal principalFrom(ScrewdriverId screwdriverId);
- AthensPrincipal principalFrom(UserId userId);
- NTokenValidator validator();
- NToken nTokenFrom(String rawToken);
- ZmsClientFactory zmsClientFactory();
- AthensDomain screwdriverDomain();
-
-}
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/NToken.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/NToken.java
deleted file mode 100644
index b74872b4c6a..00000000000
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/NToken.java
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.vespa.hosted.controller.api.integration.athens;
-
-import com.yahoo.vespa.hosted.controller.api.identifiers.AthensDomain;
-import com.yahoo.vespa.hosted.controller.api.identifiers.UserId;
-
-import java.security.PublicKey;
-
-/**
- * @author mpolden
- */
-public interface NToken {
-
- AthensPrincipal getPrincipal();
- UserId getUser();
- AthensDomain getDomain();
- String getToken();
- String getKeyId();
- void validateSignatureAndExpiration(PublicKey publicKey) throws InvalidTokenException;
-
-}
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/NTokenValidator.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/NTokenValidator.java
deleted file mode 100644
index 905d7d864a3..00000000000
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/NTokenValidator.java
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.vespa.hosted.controller.api.integration.athens;
-
-/**
- * @author mpolden
- */
-public interface NTokenValidator {
-
- void preloadPublicKeys();
- AthensPrincipal validate(NToken nToken) throws InvalidTokenException;
-
-}
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/ZmsClientFactory.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/ZmsClientFactory.java
deleted file mode 100644
index e00f3ce2f64..00000000000
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/ZmsClientFactory.java
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.vespa.hosted.controller.api.integration.athens;
-
-/**
- * @author bjorncs
- */
-public interface ZmsClientFactory {
- ZmsClient createClientWithServicePrincipal();
-
- ZmsClient createClientWithAuthorizedServiceToken(NToken authorizedServiceToken);
-}
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/ZmsKeystore.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/ZmsKeystore.java
deleted file mode 100644
index 4f8e5f5ff05..00000000000
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/ZmsKeystore.java
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.vespa.hosted.controller.api.integration.athens;
-
-import java.security.PublicKey;
-import java.util.Optional;
-
-/**
- * Interface for a keystore containing public keys for Athens services
- *
- * @author bjorncs
- */
-@FunctionalInterface
-public interface ZmsKeystore {
- Optional<PublicKey> getPublicKey(AthensService service, String keyId);
-
- default void preloadKeys(AthensService service) {
- // Default implementation is noop
- }
-}
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/mock/AthensMock.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/mock/AthensMock.java
deleted file mode 100644
index 8bed95bfcd4..00000000000
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/mock/AthensMock.java
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.vespa.hosted.controller.api.integration.athens.mock;
-
-import com.google.inject.Inject;
-import com.yahoo.component.AbstractComponent;
-import com.yahoo.vespa.hosted.controller.api.identifiers.AthensDomain;
-import com.yahoo.vespa.hosted.controller.api.identifiers.ScrewdriverId;
-import com.yahoo.vespa.hosted.controller.api.identifiers.UserId;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.Athens;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.AthensPrincipal;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.InvalidTokenException;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.NToken;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.NTokenValidator;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.ZmsClientFactory;
-
-/**
- * @author mpolden
- */
-public class AthensMock extends AbstractComponent implements Athens {
-
- private static final AthensDomain userDomain = new AthensDomain("domain1");
- private static final AthensDomain screwdriverDomain = new AthensDomain("screwdriver-domain");
-
- private final ZmsClientFactory zmsClientFactory;
- private final NTokenValidator nTokenValidator;
-
- public AthensMock(AthensDbMock athensDb, NTokenValidator nTokenValidator) {
- this.zmsClientFactory = new ZmsClientFactoryMock(athensDb);
- this.nTokenValidator = nTokenValidator;
- }
-
- public AthensMock(AthensDbMock athensDbMock) {
- this(athensDbMock, mockValidator);
- }
-
- @Inject
- public AthensMock() {
- this(new AthensDbMock(), mockValidator);
- }
-
- @Override
- public String principalTokenHeader() {
- return "X-Athens-Token";
- }
-
- @Override
- public AthensPrincipal principalFrom(ScrewdriverId screwdriverId) {
- return new AthensPrincipal(screwdriverDomain, new UserId("screwdriver-" + screwdriverId.id()));
- }
-
- @Override
- public AthensPrincipal principalFrom(UserId userId) {
- return new AthensPrincipal(userDomain, userId);
- }
-
- @Override
- public NTokenValidator validator() {
- return nTokenValidator;
- }
-
- @Override
- public NToken nTokenFrom(String rawToken) {
- return new NTokenMock(rawToken);
- }
-
- @Override
- public ZmsClientFactory zmsClientFactory() {
- return zmsClientFactory;
- }
-
- @Override
- public AthensDomain screwdriverDomain() {
- return screwdriverDomain;
- }
-
- private static final NTokenValidator mockValidator = new NTokenValidator() {
- @Override
- public void preloadPublicKeys() {
- }
-
- @Override
- public AthensPrincipal validate(NToken nToken) throws InvalidTokenException {
- return nToken.getPrincipal();
- }
- };
-
-}
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/mock/NTokenMock.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/mock/NTokenMock.java
deleted file mode 100644
index ae23a69e409..00000000000
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/mock/NTokenMock.java
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.vespa.hosted.controller.api.integration.athens.mock;
-
-import com.yahoo.vespa.hosted.controller.api.identifiers.AthensDomain;
-import com.yahoo.vespa.hosted.controller.api.identifiers.UserId;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.AthensPrincipal;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.InvalidTokenException;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.NToken;
-
-import java.security.PublicKey;
-import java.util.Objects;
-
-/**
- * @author mpolden
- */
-public class NTokenMock implements NToken {
-
- private static final AthensDomain domain = new AthensDomain("test");
- private static final UserId userId = new UserId("user");
-
- private final String rawToken;
-
- public NTokenMock(String rawToken) {
- this.rawToken = rawToken;
- }
-
- @Override
- public AthensPrincipal getPrincipal() {
- return new AthensPrincipal(domain, userId);
- }
-
- @Override
- public UserId getUser() {
- return userId;
- }
-
- @Override
- public AthensDomain getDomain() {
- return domain;
- }
-
- @Override
- public String getToken() {
- return "test-token";
- }
-
- @Override
- public String getKeyId() {
- return "test-key";
- }
-
- @Override
- public void validateSignatureAndExpiration(PublicKey publicKey) throws InvalidTokenException {
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (!(o instanceof NTokenMock)) return false;
- NTokenMock that = (NTokenMock) o;
- return Objects.equals(rawToken, that.rawToken);
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(rawToken);
- }
-}
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/mock/ZmsClientFactoryMock.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/mock/ZmsClientFactoryMock.java
deleted file mode 100644
index 8bc8b29fb4c..00000000000
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/mock/ZmsClientFactoryMock.java
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.vespa.hosted.controller.api.integration.athens.mock;
-
-import com.yahoo.component.AbstractComponent;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.NToken;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.ZmsClient;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.ZmsClientFactory;
-
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * @author bjorncs
- */
-public class ZmsClientFactoryMock extends AbstractComponent implements ZmsClientFactory {
-
- private static final Logger log = Logger.getLogger(ZmsClientFactoryMock.class.getName());
-
- private final AthensDbMock athens;
-
- public ZmsClientFactoryMock() {
- this(new AthensDbMock());
- }
-
- ZmsClientFactoryMock(AthensDbMock athens) {
- this.athens = athens;
- }
-
- public AthensDbMock getSetup() {
- return athens;
- }
-
- @Override
- public ZmsClient createClientWithServicePrincipal() {
- log("createClientWithServicePrincipal()");
- return new ZmsClientMock(athens);
- }
-
- @Override
- public ZmsClient createClientWithAuthorizedServiceToken(NToken authorizedServiceToken) {
- log("createClientWithAuthorizedServiceToken(authorizedServiceToken='%s')", authorizedServiceToken);
- return new ZmsClientMock(athens);
- }
-
- private static void log(String format, Object... args) {
- log.log(Level.INFO, String.format(format, args));
- }
-
-}
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/mock/package-info.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/mock/package-info.java
deleted file mode 100644
index d4454503786..00000000000
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/mock/package-info.java
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-/**
- * @author bjorncs
- */
-@ExportPackage
-package com.yahoo.vespa.hosted.controller.api.integration.athens.mock;
-
-import com.yahoo.osgi.annotation.ExportPackage;
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/package-info.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/package-info.java
deleted file mode 100644
index eabe214abf2..00000000000
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/package-info.java
+++ /dev/null
@@ -1,5 +0,0 @@
-// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-@ExportPackage
-package com.yahoo.vespa.hosted.controller.api.integration.athens;
-
-import com.yahoo.osgi.annotation.ExportPackage;
diff --git a/controller-server/pom.xml b/controller-server/pom.xml
index fa21098a092..2e706f6df24 100644
--- a/controller-server/pom.xml
+++ b/controller-server/pom.xml
@@ -92,6 +92,13 @@
<scope>provided</scope>
</dependency>
+ <!-- required for Athenz libraries -->
+ <dependency>
+ <groupId>org.bouncycastle</groupId>
+ <artifactId>bcpkix-jdk15on</artifactId>
+ <scope>provided</scope>
+ </dependency>
+
<!-- compile -->
<dependency>
@@ -117,6 +124,49 @@
<version>1.6</version>
</dependency>
+ <dependency>
+ <groupId>com.yahoo.athenz</groupId>
+ <artifactId>athenz-zms-java-client</artifactId>
+ <scope>compile</scope>
+ <exclusions>
+ <exclusion>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ </exclusion>
+ <!-- Exclude all Jersey bundles provided by JDisc -->
+ <exclusion>
+ <groupId>org.glassfish.jersey.core</groupId>
+ <artifactId>jersey-client</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.glassfish.jersey.media</groupId>
+ <artifactId>jersey-media-json-jackson</artifactId>
+ </exclusion>
+ <!-- BouncyCastle is not bundled due to class loading issues
+ when security provider is registered from inside a OSGi bundle -->
+ <exclusion>
+ <groupId>org.bouncycastle</groupId>
+ <artifactId>bcpkix-jdk15on</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.bouncycastle</groupId>
+ <artifactId>bcprov-jdk15on</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+
+ <dependency>
+ <groupId>com.yahoo.athenz</groupId>
+ <artifactId>athenz-zts-java-client</artifactId>
+ <scope>compile</scope>
+ <exclusions>
+ <exclusion>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+
<!-- test -->
<dependency>
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java
index 672f50f83d7..7512e14643f 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java
@@ -22,10 +22,6 @@ import com.yahoo.vespa.hosted.controller.api.identifiers.DeploymentId;
import com.yahoo.vespa.hosted.controller.api.identifiers.Hostname;
import com.yahoo.vespa.hosted.controller.api.identifiers.RevisionId;
import com.yahoo.vespa.hosted.controller.api.identifiers.TenantId;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.NToken;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.ZmsClient;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.ZmsClientFactory;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.ZmsException;
import com.yahoo.vespa.hosted.controller.api.integration.configserver.ConfigServerClient;
import com.yahoo.vespa.hosted.controller.api.integration.configserver.Log;
import com.yahoo.vespa.hosted.controller.api.integration.configserver.NoInstanceException;
@@ -44,6 +40,10 @@ import com.yahoo.vespa.hosted.controller.application.DeploymentJobs;
import com.yahoo.vespa.hosted.controller.application.DeploymentJobs.JobReport;
import com.yahoo.vespa.hosted.controller.application.JobStatus;
import com.yahoo.vespa.hosted.controller.application.SourceRevision;
+import com.yahoo.vespa.hosted.controller.athenz.AthenzClientFactory;
+import com.yahoo.vespa.hosted.controller.athenz.NToken;
+import com.yahoo.vespa.hosted.controller.athenz.ZmsClient;
+import com.yahoo.vespa.hosted.controller.athenz.ZmsException;
import com.yahoo.vespa.hosted.controller.deployment.DeploymentTrigger;
import com.yahoo.vespa.hosted.controller.maintenance.DeploymentExpirer;
import com.yahoo.vespa.hosted.controller.persistence.ControllerDb;
@@ -84,7 +84,7 @@ public class ApplicationController {
private final CuratorDb curator;
private final RotationRepository rotationRepository;
- private final ZmsClientFactory zmsClientFactory;
+ private final AthenzClientFactory zmsClientFactory;
private final NameService nameService;
private final ConfigServerClient configserverClient;
private final RoutingGenerator routingGenerator;
@@ -94,7 +94,7 @@ public class ApplicationController {
ApplicationController(Controller controller, ControllerDb db, CuratorDb curator,
RotationRepository rotationRepository,
- ZmsClientFactory zmsClientFactory,
+ AthenzClientFactory zmsClientFactory,
NameService nameService, ConfigServerClient configserverClient,
RoutingGenerator routingGenerator, Clock clock) {
this.controller = controller;
@@ -249,7 +249,7 @@ public class ApplicationController {
if (tenant.get().isAthensTenant() && ! token.isPresent())
throw new IllegalArgumentException("Could not create '" + id + "': No NToken provided");
if (tenant.get().isAthensTenant()) {
- ZmsClient zmsClient = zmsClientFactory.createClientWithAuthorizedServiceToken(token.get());
+ ZmsClient zmsClient = zmsClientFactory.createZmsClientWithAuthorizedServiceToken(token.get());
try {
zmsClient.deleteApplication(tenant.get().getAthensDomain().get(),
new com.yahoo.vespa.hosted.controller.api.identifiers.ApplicationId(id.application().value()));
@@ -331,13 +331,10 @@ public class ApplicationController {
applicationPackage.zippedContent());
preparedApplication.activate();
- Deployment previousDeployment = application.deployments().get(zone);
- Deployment newDeployment = previousDeployment;
- if (previousDeployment == null) {
- newDeployment = new Deployment(zone, revision, version, clock.instant(), new HashMap<>(), new HashMap<>());
- } else {
- newDeployment = new Deployment(zone, revision, version, clock.instant(), previousDeployment.clusterUtils(), previousDeployment.clusterInfo());
- }
+ // Use info from previous deployments is available
+ Deployment previousDeployment = application.deployments().getOrDefault(zone, new Deployment(zone, revision, version, clock.instant()));
+ Deployment newDeployment = new Deployment(zone, revision, version, clock.instant(),
+ previousDeployment.clusterUtils(), previousDeployment.clusterInfo(), previousDeployment.metrics());
application = application.with(newDeployment);
store(application, lock);
@@ -493,7 +490,7 @@ public class ApplicationController {
// NB: Next 2 lines should have been one transaction
if (tenant.isAthensTenant())
- zmsClientFactory.createClientWithAuthorizedServiceToken(token.get())
+ zmsClientFactory.createZmsClientWithAuthorizedServiceToken(token.get())
.deleteApplication(tenant.getAthensDomain().get(), new com.yahoo.vespa.hosted.controller.api.identifiers.ApplicationId(id.application().value()));
db.deleteApplication(id);
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Controller.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Controller.java
index 4f5c2ead4da..e338bc17788 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Controller.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Controller.java
@@ -5,6 +5,7 @@ import com.fasterxml.jackson.databind.JsonNode;
import com.google.inject.Inject;
import com.yahoo.component.AbstractComponent;
import com.yahoo.component.Version;
+import com.yahoo.component.Vtag;
import com.yahoo.config.provision.ApplicationId;
import com.yahoo.config.provision.Environment;
import com.yahoo.config.provision.RegionName;
@@ -14,8 +15,6 @@ import com.yahoo.vespa.hosted.controller.api.identifiers.DeploymentId;
import com.yahoo.vespa.hosted.controller.api.identifiers.Property;
import com.yahoo.vespa.hosted.controller.api.identifiers.PropertyId;
import com.yahoo.vespa.hosted.controller.api.integration.MetricsService;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.Athens;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.ZmsClient;
import com.yahoo.vespa.hosted.controller.api.integration.chef.Chef;
import com.yahoo.vespa.hosted.controller.api.integration.configserver.ConfigServerClient;
import com.yahoo.vespa.hosted.controller.api.integration.dns.NameService;
@@ -26,6 +25,8 @@ import com.yahoo.vespa.hosted.controller.api.integration.routing.GlobalRoutingSe
import com.yahoo.vespa.hosted.controller.api.integration.routing.RotationStatus;
import com.yahoo.vespa.hosted.controller.api.integration.routing.RoutingGenerator;
import com.yahoo.vespa.hosted.controller.api.integration.zone.ZoneRegistry;
+import com.yahoo.vespa.hosted.controller.athenz.AthenzClientFactory;
+import com.yahoo.vespa.hosted.controller.athenz.ZmsClient;
import com.yahoo.vespa.hosted.controller.persistence.ControllerDb;
import com.yahoo.vespa.hosted.controller.persistence.CuratorDb;
import com.yahoo.vespa.hosted.controller.versions.VersionStatus;
@@ -40,7 +41,6 @@ import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
-import java.util.concurrent.atomic.AtomicReference;
import java.util.logging.Logger;
/**
@@ -64,15 +64,7 @@ public class Controller extends AbstractComponent {
private final CuratorDb curator;
private final ApplicationController applicationController;
private final TenantController tenantController;
-
- /**
- * Status of Vespa versions across the system.
- * This is expensive to maintain so that is done periodically by a maintenance job
- */
- private final AtomicReference<VersionStatus> versionStatus;
-
private final Clock clock;
-
private final RotationRepository rotationRepository;
private final GitHub gitHub;
private final EntityService entityService;
@@ -81,7 +73,6 @@ public class Controller extends AbstractComponent {
private final ConfigServerClient configServerClient;
private final MetricsService metricsService;
private final Chef chefClient;
- private final Athens athens;
private final ZmsClient zmsClient;
/**
@@ -96,11 +87,11 @@ public class Controller extends AbstractComponent {
GlobalRoutingService globalRoutingService,
ZoneRegistry zoneRegistry, ConfigServerClient configServerClient,
MetricsService metricsService, NameService nameService,
- RoutingGenerator routingGenerator, Chef chefClient, Athens athens) {
+ RoutingGenerator routingGenerator, Chef chefClient, AthenzClientFactory athenzClientFactory) {
this(db, curator, rotationRepository,
gitHub, jiraClient, entityService, globalRoutingService, zoneRegistry,
configServerClient, metricsService, nameService, routingGenerator, chefClient,
- Clock.systemUTC(), athens);
+ Clock.systemUTC(), athenzClientFactory);
}
public Controller(ControllerDb db, CuratorDb curator, RotationRepository rotationRepository,
@@ -108,7 +99,8 @@ public class Controller extends AbstractComponent {
GlobalRoutingService globalRoutingService,
ZoneRegistry zoneRegistry, ConfigServerClient configServerClient,
MetricsService metricsService, NameService nameService,
- RoutingGenerator routingGenerator, Chef chefClient, Clock clock, Athens athens) {
+ RoutingGenerator routingGenerator, Chef chefClient, Clock clock,
+ AthenzClientFactory athenzClientFactory) {
Objects.requireNonNull(db, "Controller db cannot be null");
Objects.requireNonNull(curator, "Curator cannot be null");
Objects.requireNonNull(rotationRepository, "Rotation repository cannot be null");
@@ -123,7 +115,7 @@ public class Controller extends AbstractComponent {
Objects.requireNonNull(routingGenerator, "RoutingGenerator cannot be null");
Objects.requireNonNull(chefClient, "ChefClient cannot be null");
Objects.requireNonNull(clock, "Clock cannot be null");
- Objects.requireNonNull(athens, "Athens cannot be null");
+ Objects.requireNonNull(athenzClientFactory, "Athens cannot be null");
this.rotationRepository = rotationRepository;
this.curator = curator;
@@ -135,13 +127,11 @@ public class Controller extends AbstractComponent {
this.metricsService = metricsService;
this.chefClient = chefClient;
this.clock = clock;
- this.athens = athens;
- this.zmsClient = athens.zmsClientFactory().createClientWithServicePrincipal();
+ this.zmsClient = athenzClientFactory.createZmsClientWithServicePrincipal();
- applicationController = new ApplicationController(this, db, curator, rotationRepository, athens.zmsClientFactory(),
+ applicationController = new ApplicationController(this, db, curator, rotationRepository, athenzClientFactory,
nameService, configServerClient, routingGenerator, clock);
- tenantController = new TenantController(this, db, curator, entityService);
- versionStatus = new AtomicReference<>(VersionStatus.empty());
+ tenantController = new TenantController(this, db, curator, entityService, athenzClientFactory);
}
/** Returns the instance controlling tenants */
@@ -154,10 +144,6 @@ public class Controller extends AbstractComponent {
return zmsClient.getDomainList(prefix);
}
- public Athens athens() {
- return athens;
- }
-
/**
* Fetch list of all active OpsDB properties.
*
@@ -191,11 +177,7 @@ public class Controller extends AbstractComponent {
"sort:!('@timestamp',desc))";
URI kibanaPath = URI.create(kibanaQuery);
- if (kibanaHost.isPresent()) {
- return kibanaHost.get().resolve(kibanaPath);
- } else {
- return null;
- }
+ return kibanaHost.map(uri -> uri.resolve(kibanaPath)).orElse(null);
}
public Set<URI> getRotationUris(ApplicationId id) {
@@ -235,17 +217,19 @@ public class Controller extends AbstractComponent {
! newStatus.systemVersion().equals(currentStatus.systemVersion())) {
log.info("Changing system version from " + printableVersion(currentStatus.systemVersion()) +
" to " + printableVersion(newStatus.systemVersion()));
- curator.writeSystemVersion(newStatus.systemVersion().get().versionNumber());
}
-
- this.versionStatus.set(newStatus);
+ curator.writeVersionStatus(newStatus);
}
/** Returns the latest known version status. Calling this is free but the status may be slightly out of date. */
- public VersionStatus versionStatus() { return versionStatus.get(); }
+ public VersionStatus versionStatus() { return curator.readVersionStatus(); }
/** Returns the current system version: The controller should drive towards running all applications on this version */
- public Version systemVersion() { return curator.readSystemVersion(); }
+ public Version systemVersion() {
+ return versionStatus().systemVersion()
+ .map(VespaVersion::versionNumber)
+ .orElse(Vtag.currentVersion);
+ }
public MetricsService metricsService() { return metricsService; }
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/TenantController.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/TenantController.java
index fafd0b04dd2..229c46f0a22 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/TenantController.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/TenantController.java
@@ -11,11 +11,12 @@ import com.yahoo.vespa.hosted.controller.api.identifiers.PropertyId;
import com.yahoo.vespa.hosted.controller.api.identifiers.TenantId;
import com.yahoo.vespa.hosted.controller.api.identifiers.UserGroup;
import com.yahoo.vespa.hosted.controller.api.identifiers.UserId;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.NToken;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.ZmsClient;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.ZmsClientFactory;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.ZmsException;
import com.yahoo.vespa.hosted.controller.api.integration.entity.EntityService;
+import com.yahoo.vespa.hosted.controller.athenz.AthenzClientFactory;
+import com.yahoo.vespa.hosted.controller.athenz.AthenzUtils;
+import com.yahoo.vespa.hosted.controller.athenz.NToken;
+import com.yahoo.vespa.hosted.controller.athenz.ZmsClient;
+import com.yahoo.vespa.hosted.controller.athenz.ZmsException;
import com.yahoo.vespa.hosted.controller.persistence.ControllerDb;
import com.yahoo.vespa.hosted.controller.persistence.CuratorDb;
import com.yahoo.vespa.hosted.controller.persistence.PersistenceException;
@@ -47,14 +48,15 @@ public class TenantController {
/** For working memory storage and sharing between controllers */
private final CuratorDb curator;
- private final ZmsClientFactory zmsClientFactory;
+ private final AthenzClientFactory athenzClientFactory;
private final EntityService entityService;
- public TenantController(Controller controller, ControllerDb db, CuratorDb curator, EntityService entityService) {
+ public TenantController(Controller controller, ControllerDb db, CuratorDb curator, EntityService entityService,
+ AthenzClientFactory athenzClientFactory) {
this.controller = controller;
this.db = db;
this.curator = curator;
- this.zmsClientFactory = controller.athens().zmsClientFactory();
+ this.athenzClientFactory = athenzClientFactory;
this.entityService = entityService;
}
@@ -64,8 +66,8 @@ public class TenantController {
public List<Tenant> asList(UserId user) {
Set<UserGroup> userGroups = entityService.getUserGroups(user);
- Set<AthensDomain> userDomains = new HashSet<>(zmsClientFactory.createClientWithServicePrincipal()
- .getTenantDomainsForUser(controller.athens().principalFrom(user)));
+ Set<AthensDomain> userDomains = new HashSet<>(athenzClientFactory.createZtsClientWithServicePrincipal()
+ .getTenantDomainsForUser(AthenzUtils.createPrincipal(user)));
Predicate<Tenant> hasUsersGroup = (tenant) -> tenant.getUserGroup().isPresent() && userGroups.contains(tenant.getUserGroup().get());
Predicate<Tenant> hasUsersDomain = (tenant) -> tenant.getAthensDomain().isPresent() && userDomains.contains(tenant.getAthensDomain().get());
@@ -108,7 +110,7 @@ public class TenantController {
if (existingTenantWithDomain.isPresent())
throw new IllegalArgumentException("Could not create " + tenant + ": The Athens domain '" + domain +
"' is already connected to " + existingTenantWithDomain.get());
- ZmsClient zmsClient = zmsClientFactory.createClientWithAuthorizedServiceToken(token.get());
+ ZmsClient zmsClient = athenzClientFactory.createZmsClientWithAuthorizedServiceToken(token.get());
try { zmsClient.deleteTenant(domain); } catch (ZmsException ignored) { }
zmsClient.createTenant(domain);
}
@@ -158,7 +160,7 @@ public class TenantController {
throw new IllegalArgumentException("Could not set domain of " + updatedTenant + " to '" + newDomain +
"':" + existingTenantWithNewDomain.get() + " already has this domain");
- ZmsClient zmsClient = zmsClientFactory.createClientWithAuthorizedServiceToken(token.get());
+ ZmsClient zmsClient = athenzClientFactory.createZmsClientWithAuthorizedServiceToken(token.get());
zmsClient.createTenant(newDomain);
List<Application> applications = controller.applications().asList(TenantName.from(existingTenant.getId().id()));
applications.forEach(a -> zmsClient.addApplication(newDomain, new com.yahoo.vespa.hosted.controller.api.identifiers.ApplicationId(a.id().application().value())));
@@ -184,7 +186,8 @@ public class TenantController {
throw new RuntimeException(e);
}
if (tenant.isAthensTenant())
- zmsClientFactory.createClientWithAuthorizedServiceToken(token.get()).deleteTenant(tenant.getAthensDomain().get());
+ athenzClientFactory.createZmsClientWithAuthorizedServiceToken(token.get())
+ .deleteTenant(tenant.getAthensDomain().get());
log.info("Deleted " + tenant);
}
}
@@ -204,7 +207,7 @@ public class TenantController {
throw new IllegalArgumentException("Could not migrate " + existing + " to " + tenantDomain + ": " +
"Tenant is not currently an OpsDb tenant");
- ZmsClient zmsClient = zmsClientFactory.createClientWithAuthorizedServiceToken(nToken);
+ ZmsClient zmsClient = athenzClientFactory.createZmsClientWithAuthorizedServiceToken(nToken);
zmsClient.createTenant(tenantDomain);
List<Application> applications = controller.applications().asList(TenantName.from(existing.getId().id()));
applications.forEach(a -> {
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/ClusterCost.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/ClusterCost.java
index 03d0cd28ca1..985d6173b29 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/ClusterCost.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/ClusterCost.java
@@ -6,13 +6,14 @@ package com.yahoo.vespa.hosted.controller.application;
* tco and waste for one cluster of one deployment.
*
* The target utilization is defined the following assumptions:
- * 1. CPU contention starts to cause problems on 0.8
- * 2. Memory management starts to casue problems on 0.7
+ * 1. CPU contention starts to cause problems at 0.8
+ * 2. Memory management starts to cause problems at 0.7
* 3. Load is evenly divided between two deployments - each deployments can handle the other.
* 4. Memory and disk are agnostic to query load.
* 5. Peak utilization (daily variations) are twice the size of the average.
*
* With this in mind we get:
+ *
* CPU: 0.8/2/2 = 0.2
* Mem: 0.7
* Disk: 0.7
@@ -40,16 +41,18 @@ public class ClusterCost {
this.targetUtilization = new ClusterUtilization(0.7,0.2, 0.7, 0.3);
this.resultUtilization = calculateResultUtilization(systemUtilization, targetUtilization);
- this.tco = clusterInfo.getCost() * Math.min(1, this.resultUtilization.getMaxUtilization());
- this.waste = clusterInfo.getCost() - tco;
+ this.tco = clusterInfo.getHostnames().size() * clusterInfo.getFlavorCost();
+
+ double unusedUtilization = 1 - Math.min(1, resultUtilization.getMaxUtilization());
+ this.waste = tco * unusedUtilization;
}
- /** @return TCO in dollars */
+ /** @return The TCO in dollars for this cluster (node tco * nodes) */
public double getTco() {
return tco;
}
- /** @return Waste in dollars */
+ /** @return The amount of dollars spent for unused resources in this cluster */
public double getWaste() {
return waste;
}
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/ClusterInfo.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/ClusterInfo.java
index cb39177c811..40fc57acdc8 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/ClusterInfo.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/ClusterInfo.java
@@ -9,31 +9,62 @@ import java.util.List;
* Value object of static cluster information, in particular the TCO
* of the hardware used for this cluster.
*
+ * Some duplication/flattening of flavor info is done to simplify client usage.
+ *
* @author smorgrav
*/
public class ClusterInfo {
private final String flavor;
- private final int cost;
+ private final double flavorCPU;
+ private final double flavorMem;
+ private final double flavorDisk;
+ private final int flavorCost;
private final ClusterSpec.Type clusterType;
private final List<String> hostnames;
- public ClusterInfo(String flavor, int cost, ClusterSpec.Type clusterType, List<String> hostnames) {
+ /**
+ * @param flavor The name of the flavor eg. 'C-2B/24/500'
+ * @param flavorCost The cost of one node in dollars
+ * @param flavorCPU The number of cpu cores granted
+ * @param flavorMem The memory granted in Gb
+ * @param flavorDisk The disk size granted in Gb
+ * @param clusterType The vespa cluster type e.g 'container' or 'content'
+ * @param hostnames All hostnames in this cluster
+ */
+ public ClusterInfo(String flavor, int flavorCost, double flavorCPU, double flavorMem,
+ double flavorDisk, ClusterSpec.Type clusterType, List<String> hostnames) {
this.flavor = flavor;
- this.cost = cost;
+ this.flavorCost = flavorCost;
+ this.flavorCPU = flavorCPU;
+ this.flavorMem = flavorMem;
+ this.flavorDisk = flavorDisk;
this.clusterType = clusterType;
this.hostnames = hostnames;
}
+ /** @return The name of the flavor eg. 'C-2B/24/500' */
public String getFlavor() {
return flavor;
}
- public int getCost() { return cost; }
+ /** @return The cost of one node in dollars */
+ public int getFlavorCost() { return flavorCost; }
+
+ /** @return The disk size granted in Gb */
+ public double getFlavorDisk() { return flavorDisk; }
+
+ /** @return The number of cpu cores granted */
+ public double getFlavorCPU() { return flavorCPU; }
+
+ /** @return The memory granted in Gb */
+ public double getFlavorMem() { return flavorMem; }
+ /** @return The vespa cluster type e.g 'container' or 'content' */
public ClusterSpec.Type getClusterType() {
return clusterType;
}
+ /** @return All hostnames in this cluster */
public List<String> getHostnames() {
return hostnames;
}
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/Deployment.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/Deployment.java
index 01219e940a3..05a7f9667ba 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/Deployment.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/Deployment.java
@@ -14,6 +14,7 @@ import java.util.Objects;
* A deployment of an application in a particular zone.
*
* @author bratseth
+ * @author smorgrav
*/
public class Deployment {
@@ -23,24 +24,28 @@ public class Deployment {
private final Instant deployTime;
private final Map<Id, ClusterUtilization> clusterUtils;
private final Map<Id, ClusterInfo> clusterInfo;
+ private final DeploymentMetrics metrics;
public Deployment(Zone zone, ApplicationRevision revision, Version version, Instant deployTime) {
- this(zone, revision, version, deployTime, new HashMap<>(), new HashMap<>());
+ this(zone, revision, version, deployTime, new HashMap<>(), new HashMap<>(), new DeploymentMetrics());
}
- public Deployment(Zone zone, ApplicationRevision revision, Version version, Instant deployTime, Map<Id, ClusterUtilization> clusterUtils, Map<Id, ClusterInfo> clusterInfo) {
+ public Deployment(Zone zone, ApplicationRevision revision, Version version, Instant deployTime,
+ Map<Id, ClusterUtilization> clusterUtils, Map<Id, ClusterInfo> clusterInfo, DeploymentMetrics metrics) {
Objects.requireNonNull(zone, "zone cannot be null");
Objects.requireNonNull(revision, "revision cannot be null");
Objects.requireNonNull(version, "version cannot be null");
Objects.requireNonNull(deployTime, "deployTime cannot be null");
Objects.requireNonNull(clusterUtils, "clusterUtils cannot be null");
Objects.requireNonNull(clusterInfo, "clusterInfo cannot be null");
+ Objects.requireNonNull(clusterInfo, "deployment metrics cannot be null");
this.zone = zone;
this.revision = revision;
this.version = version;
this.deployTime = deployTime;
this.clusterUtils = clusterUtils;
this.clusterInfo = clusterInfo;
+ this.metrics = metrics;
}
/** Returns the zone this was deployed to */
@@ -64,11 +69,20 @@ public class Deployment {
}
public Deployment withClusterUtils(Map<Id, ClusterUtilization> clusterUtilization) {
- return new Deployment(zone, revision, version, deployTime, clusterUtilization, clusterInfo);
+ return new Deployment(zone, revision, version, deployTime, clusterUtilization, clusterInfo, metrics);
}
public Deployment withClusterInfo(Map<Id, ClusterInfo> newClusterInfo) {
- return new Deployment(zone, revision, version, deployTime, clusterUtils, newClusterInfo);
+ return new Deployment(zone, revision, version, deployTime, clusterUtils, newClusterInfo, metrics);
+ }
+
+ public Deployment withMetrics(DeploymentMetrics metrics) {
+ return new Deployment(zone, revision, version, deployTime, clusterUtils, clusterInfo, metrics);
+ }
+
+ /** @return Key metrics for the deployment (application level) like QPS and document count */
+ public DeploymentMetrics metrics() {
+ return metrics;
}
/**
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/DeploymentCost.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/DeploymentCost.java
index fce825bd99e..585690793bb 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/DeploymentCost.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/DeploymentCost.java
@@ -23,12 +23,16 @@ public class DeploymentCost {
double tco = 0;
double util = 0;
double waste = 0;
+ double maxWaste = -1;
for (ClusterCost costCluster : clusterCosts.values()) {
tco += costCluster.getTco();
waste += costCluster.getWaste();
- int nodesInCluster = costCluster.getClusterInfo().getHostnames().size();
- util = Math.max(util, nodesInCluster*costCluster.getResultUtilization().getMaxUtilization());
+
+ if (costCluster.getWaste() > maxWaste) {
+ util = costCluster.getResultUtilization().getMaxUtilization();
+ maxWaste = costCluster.getWaste();
+ }
}
this.utilization = util;
@@ -40,14 +44,17 @@ public class DeploymentCost {
return clusters;
}
+ /** @return Total cost of ownership for the deployment (sum of all clusters) */
public double getTco() {
return tco;
}
+ /** @return The utilization of clusters that wastes most money in this deployment */
public double getUtilization() {
return utilization;
}
+ /** @return The amount of dollars spent and not utilized */
public double getWaste() {
return waste;
}
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/DeploymentMetrics.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/DeploymentMetrics.java
new file mode 100644
index 00000000000..6812e4cb468
--- /dev/null
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/DeploymentMetrics.java
@@ -0,0 +1,50 @@
+package com.yahoo.vespa.hosted.controller.application;// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+/**
+ * @author smorgrav
+ */
+public class DeploymentMetrics {
+
+ private final double queriesPerSecond;
+ private final double writesPerSecond;
+ private final double documentCount;
+ private final double queryLatencyMillis;
+ private final double writeLatencyMills;
+
+ DeploymentMetrics() {
+ this.queriesPerSecond = 0;
+ this.writesPerSecond = 0;
+ this.documentCount = 0;
+ this.queryLatencyMillis = 0;
+ this.writeLatencyMills = 0;
+ }
+
+ public DeploymentMetrics(double queriesPerSecond, double writesPerSecond, double documentCount,
+ double queryLatencyMillis, double writeLatencyMills) {
+ this.queriesPerSecond = queriesPerSecond;
+ this.writesPerSecond = writesPerSecond;
+ this.documentCount = documentCount;
+ this.queryLatencyMillis = queryLatencyMillis;
+ this.writeLatencyMills = writeLatencyMills;
+ }
+
+ public double queriesPerSecond() {
+ return queriesPerSecond;
+ }
+
+ public double writesPerSecond() {
+ return writesPerSecond;
+ }
+
+ public double documentCount() {
+ return documentCount;
+ }
+
+ public double queryLatencyMillis() {
+ return queryLatencyMillis;
+ }
+
+ public double writeLatencyMillis() {
+ return writeLatencyMills;
+ }
+}
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/ApplicationAction.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/ApplicationAction.java
index cb5731164c8..8614414dc95 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/ApplicationAction.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/ApplicationAction.java
@@ -1,8 +1,8 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.vespa.hosted.controller.api.integration.athens;
+package com.yahoo.vespa.hosted.controller.athenz;
/**
- * @author mpolden
+ * @author bjorncs
*/
public enum ApplicationAction {
deploy("deployer"),
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/AthenzClientFactory.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/AthenzClientFactory.java
new file mode 100644
index 00000000000..b6a21f94f74
--- /dev/null
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/AthenzClientFactory.java
@@ -0,0 +1,15 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.hosted.controller.athenz;
+
+/**
+ * @author bjorncs
+ */
+public interface AthenzClientFactory {
+
+ ZmsClient createZmsClientWithServicePrincipal();
+
+ ZtsClient createZtsClientWithServicePrincipal();
+
+ ZmsClient createZmsClientWithAuthorizedServiceToken(NToken authorizedServiceToken);
+
+}
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/AthensPrincipal.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/AthenzPrincipal.java
index 58b878870b9..03d9f60c6b0 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/AthensPrincipal.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/AthenzPrincipal.java
@@ -1,5 +1,5 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.vespa.hosted.controller.api.integration.athens;
+package com.yahoo.vespa.hosted.controller.athenz;
import com.yahoo.vespa.hosted.controller.api.identifiers.AthensDomain;
import com.yahoo.vespa.hosted.controller.api.identifiers.UserId;
@@ -10,12 +10,12 @@ import java.util.Objects;
/**
* @author bjorncs
*/
-public class AthensPrincipal implements Principal {
+public class AthenzPrincipal implements Principal {
private final AthensDomain domain;
private final UserId userId;
- public AthensPrincipal(AthensDomain domain, UserId userId) {
+ public AthenzPrincipal(AthensDomain domain, UserId userId) {
this.domain = domain;
this.userId = userId;
}
@@ -33,15 +33,23 @@ public class AthensPrincipal implements Principal {
}
@Override
+ public String getName() {
+ return userId.id();
+ }
+
+ @Override
public String toString() {
- return toYRN();
+ return "AthenzPrincipal{" +
+ "domain=" + domain +
+ ", userId=" + userId +
+ '}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
- AthensPrincipal that = (AthensPrincipal) o;
+ AthenzPrincipal that = (AthenzPrincipal) o;
return Objects.equals(domain, that.domain) &&
Objects.equals(userId, that.userId);
}
@@ -51,9 +59,4 @@ public class AthensPrincipal implements Principal {
return Objects.hash(domain, userId);
}
- @Override
- public String getName() {
- return userId.id();
- }
-
}
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/AthensPublicKey.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/AthenzPublicKey.java
index 9bbb5f28d8f..01596ead0f4 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/AthensPublicKey.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/AthenzPublicKey.java
@@ -1,5 +1,5 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.vespa.hosted.controller.api.integration.athens;
+package com.yahoo.vespa.hosted.controller.athenz;
import java.security.PublicKey;
import java.util.Objects;
@@ -7,11 +7,12 @@ import java.util.Objects;
/**
* @author bjorncs
*/
-public class AthensPublicKey {
+public class AthenzPublicKey {
+
private final PublicKey publicKey;
private final String keyId;
- public AthensPublicKey(PublicKey publicKey, String keyId) {
+ public AthenzPublicKey(PublicKey publicKey, String keyId) {
this.publicKey = publicKey;
this.keyId = keyId;
}
@@ -28,7 +29,7 @@ public class AthensPublicKey {
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
- AthensPublicKey that = (AthensPublicKey) o;
+ AthenzPublicKey that = (AthenzPublicKey) o;
return Objects.equals(publicKey, that.publicKey) &&
Objects.equals(keyId, that.keyId);
}
@@ -40,7 +41,7 @@ public class AthensPublicKey {
@Override
public String toString() {
- return "AthensPublicKey{" +
+ return "AthenzPublicKey{" +
"publicKey=" + publicKey +
", keyId='" + keyId + '\'' +
'}';
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/AthensService.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/AthenzService.java
index 42af966be3d..780a14e4446 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/AthensService.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/AthenzService.java
@@ -1,5 +1,5 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.vespa.hosted.controller.api.integration.athens;
+package com.yahoo.vespa.hosted.controller.athenz;
import com.yahoo.vespa.hosted.controller.api.identifiers.AthensDomain;
@@ -8,16 +8,20 @@ import java.util.Objects;
/**
* @author bjorncs
*/
-public class AthensService {
+public class AthenzService {
private final AthensDomain domain;
private final String serviceName;
- public AthensService(AthensDomain domain, String serviceName) {
+ public AthenzService(AthensDomain domain, String serviceName) {
this.domain = domain;
this.serviceName = serviceName;
}
+ public AthenzService(String domain, String serviceName) {
+ this(new AthensDomain(domain), serviceName);
+ }
+
public String toFullServiceName() {
return domain.id() + "." + serviceName;
}
@@ -34,7 +38,7 @@ public class AthensService {
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
- AthensService that = (AthensService) o;
+ AthenzService that = (AthenzService) o;
return Objects.equals(domain, that.domain) &&
Objects.equals(serviceName, that.serviceName);
}
@@ -46,6 +50,6 @@ public class AthensService {
@Override
public String toString() {
- return String.format("AthensService(%s)", toFullServiceName());
+ return String.format("AthenzService(%s)", toFullServiceName());
}
}
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/AthenzUtils.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/AthenzUtils.java
new file mode 100644
index 00000000000..0c0f4729100
--- /dev/null
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/AthenzUtils.java
@@ -0,0 +1,29 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.hosted.controller.athenz;
+
+import com.yahoo.vespa.hosted.controller.api.identifiers.AthensDomain;
+import com.yahoo.vespa.hosted.controller.api.identifiers.ScrewdriverId;
+import com.yahoo.vespa.hosted.controller.api.identifiers.UserId;
+
+/**
+ * @author bjorncs
+ */
+public class AthenzUtils {
+
+ private AthenzUtils() {}
+
+ // TODO Change to "user" as primary user principal domain. Also support "yby" for a limited time as per recent Athenz changes
+ public static final AthensDomain USER_PRINCIPAL_DOMAIN = new AthensDomain("yby");
+ public static final AthensDomain SCREWDRIVER_DOMAIN = new AthensDomain("cd.screwdriver.project");
+ public static final AthenzService ZMS_ATHENZ_SERVICE = new AthenzService("sys.auth", "zms");
+
+ public static AthenzPrincipal createPrincipal(UserId userId) {
+ return new AthenzPrincipal(USER_PRINCIPAL_DOMAIN, userId);
+ }
+
+ public static AthenzPrincipal createPrincipal(ScrewdriverId screwdriverId) {
+ return new AthenzPrincipal(SCREWDRIVER_DOMAIN, new UserId("sd" + screwdriverId.id()));
+ }
+
+
+}
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/InvalidTokenException.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/InvalidTokenException.java
index 9c21d5814cb..e41bd8d4283 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/InvalidTokenException.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/InvalidTokenException.java
@@ -1,5 +1,5 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.vespa.hosted.controller.api.integration.athens;
+package com.yahoo.vespa.hosted.controller.athenz;
/**
* @author bjorncs
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/NToken.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/NToken.java
new file mode 100644
index 00000000000..fec0523aaab
--- /dev/null
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/NToken.java
@@ -0,0 +1,148 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.hosted.controller.athenz;
+
+import com.yahoo.athenz.auth.token.PrincipalToken;
+import com.yahoo.vespa.hosted.controller.api.identifiers.AthensDomain;
+import com.yahoo.vespa.hosted.controller.api.identifiers.UserId;
+
+import java.security.PrivateKey;
+import java.security.PublicKey;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.OptionalLong;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Represents an Athenz NToken (principal token)
+ *
+ * @author bjorncs
+ */
+// TODO Split out encoding/decoding of token into separate class. Move NToken to controller-api.
+public class NToken {
+
+ // Max allowed skew in token timestamp (only for creation, not expiry timestamp)
+ private static final int ALLOWED_TIMESTAMP_OFFSET = (int) TimeUnit.SECONDS.toSeconds(300);
+
+ private final PrincipalToken token;
+
+ // Note: PrincipalToken does not provide any way of constructing an instance from a unsigned token string
+ public NToken(String signedToken) {
+ try {
+ this.token = new PrincipalToken(signedToken);
+ if (this.token.getSignature() == null) {
+ throw new IllegalArgumentException("Signature missing (unsigned token)");
+ }
+ } catch (IllegalArgumentException e) {
+ throw new IllegalArgumentException("Malformed NToken: " + e.getMessage());
+ }
+ }
+
+ public AthenzPrincipal getPrincipal() {
+ return new AthenzPrincipal(getDomain(), getUser());
+ }
+
+ public UserId getUser() {
+ return new UserId(token.getName());
+ }
+
+ public AthensDomain getDomain() {
+ return new AthensDomain(token.getDomain());
+ }
+
+ public String getToken() {
+ return token.getSignedToken();
+ }
+
+ public String getKeyId() {
+ return token.getKeyId();
+ }
+
+ public void validateSignatureAndExpiration(PublicKey publicKey) throws InvalidTokenException {
+ StringBuilder errorMessageBuilder = new StringBuilder();
+ if (!token.validate(publicKey, ALLOWED_TIMESTAMP_OFFSET, true, errorMessageBuilder)) {
+ throw new InvalidTokenException("NToken is expired or has invalid signature: " + errorMessageBuilder.toString());
+ }
+ }
+
+ @Override
+ public String toString() {
+ return String.format("NToken(%s)", getToken());
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ NToken nToken = (NToken) o;
+ return Objects.equals(getToken(), nToken.getToken()); // PrincipalToken does not implement equals()
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(getToken()); // PrincipalToken does not implement hashcode()
+ }
+
+ public static class Builder {
+
+ private final String version;
+ private final AthenzPrincipal principal;
+ private final PrivateKey privateKey;
+ private final String keyId;
+ private Optional<String> salt = Optional.empty();
+ private Optional<String> hostname = Optional.empty();
+ private Optional<String> ip = Optional.empty();
+ private OptionalLong issueTime = OptionalLong.empty();
+ private OptionalLong expirationWindow = OptionalLong.empty();
+
+ /**
+ * NOTE: We must have some signature, else we might end up with problems later on as
+ * {@link PrincipalToken#PrincipalToken(String)} only accepts signed token
+ * (supplying an unsigned token to the constructor will result in inconsistent state)
+ */
+ public Builder(String version, AthenzPrincipal principal, PrivateKey privateKey, String keyId) {
+ this.version = version;
+ this.principal = principal;
+ this.privateKey = privateKey;
+ this.keyId = keyId;
+ }
+
+ public Builder salt(String salt) {
+ this.salt = Optional.of(salt);
+ return this;
+ }
+
+ public Builder hostname(String hostname) {
+ this.hostname = Optional.of(hostname);
+ return this;
+ }
+
+ public Builder ip(String ip) {
+ this.ip = Optional.of(ip);
+ return this;
+ }
+
+ public Builder issueTime(long issueTime) {
+ this.issueTime = OptionalLong.of(issueTime);
+ return this;
+ }
+
+ public Builder expirationWindow(long expirationWindow) {
+ this.expirationWindow = OptionalLong.of(expirationWindow);
+ return this;
+ }
+
+ public NToken build() {
+ PrincipalToken token = new PrincipalToken.Builder(version, principal.getDomain().id(), principal.getName())
+ .keyId(this.keyId)
+ .salt(this.salt.orElse(null))
+ .host(this.hostname.orElse(null))
+ .ip(this.ip.orElse(null))
+ .issueTime(this.issueTime.orElse(0))
+ .expirationWindow(this.expirationWindow.orElse(0))
+ .build();
+ token.sign(this.privateKey);
+ return new NToken(token.getSignedToken());
+ }
+ }
+
+}
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/ZmsClient.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/ZmsClient.java
index 7ff54957e16..274a8fdf438 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/ZmsClient.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/ZmsClient.java
@@ -1,5 +1,5 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.vespa.hosted.controller.api.integration.athens;
+package com.yahoo.vespa.hosted.controller.athenz;
import com.yahoo.vespa.hosted.controller.api.identifiers.ApplicationId;
import com.yahoo.vespa.hosted.controller.api.identifiers.AthensDomain;
@@ -10,6 +10,7 @@ import java.util.List;
* @author bjorncs
*/
public interface ZmsClient {
+
void createTenant(AthensDomain tenantDomain);
void deleteTenant(AthensDomain tenantDomain);
@@ -18,18 +19,17 @@ public interface ZmsClient {
void deleteApplication(AthensDomain tenantDomain, ApplicationId applicationName);
- boolean hasApplicationAccess(AthensPrincipal principal, ApplicationAction action, AthensDomain tenantDomain, ApplicationId applicationName);
+ boolean hasApplicationAccess(AthenzPrincipal principal, ApplicationAction action, AthensDomain tenantDomain, ApplicationId applicationName);
- boolean hasTenantAdminAccess(AthensPrincipal principal, AthensDomain tenantDomain);
+ boolean hasTenantAdminAccess(AthenzPrincipal principal, AthensDomain tenantDomain);
// Used before vespa tenancy is established for the domain.
- boolean isDomainAdmin(AthensPrincipal principal, AthensDomain domain);
+ boolean isDomainAdmin(AthenzPrincipal principal, AthensDomain domain);
List<AthensDomain> getDomainList(String prefix);
- List<AthensDomain> getTenantDomainsForUser(AthensPrincipal principal);
+ AthenzPublicKey getPublicKey(AthenzService service, String keyId);
- AthensPublicKey getPublicKey(AthensService service, String keyId);
+ List<AthenzPublicKey> getPublicKeys(AthenzService service);
- List<AthensPublicKey> getPublicKeys(AthensService service);
}
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/ZmsException.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/ZmsException.java
index ed5b2daca86..59548339d11 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/ZmsException.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/ZmsException.java
@@ -1,5 +1,7 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.vespa.hosted.controller.api.integration.athens;
+package com.yahoo.vespa.hosted.controller.athenz;
+
+import com.yahoo.athenz.zms.ZMSClientException;
/**
* @author bjorncs
@@ -8,14 +10,11 @@ public class ZmsException extends RuntimeException {
private final int code;
- public ZmsException(Throwable t, int code) {
- super(t.getMessage(), t);
- this.code = code;
+ public ZmsException(ZMSClientException e) {
+ super(e.getMessage(), e);
+ this.code = e.getCode();
}
- public ZmsException(int code) {
- this.code = code;
- }
public int getCode() {
return code;
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/ZmsKeystore.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/ZmsKeystore.java
new file mode 100644
index 00000000000..93fed95c768
--- /dev/null
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/ZmsKeystore.java
@@ -0,0 +1,16 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.hosted.controller.athenz;
+
+import java.security.PublicKey;
+import java.util.Optional;
+
+/**
+ * @author bjorncs
+ */
+public interface ZmsKeystore {
+
+ Optional<PublicKey> getPublicKey(AthenzService service, String keyId);
+
+ default void preloadKeys(AthenzService service) { /* Default implementation is noop */ }
+
+}
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/ZtsClient.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/ZtsClient.java
new file mode 100644
index 00000000000..a44f1af0d2a
--- /dev/null
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/ZtsClient.java
@@ -0,0 +1,15 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.hosted.controller.athenz;
+
+import com.yahoo.vespa.hosted.controller.api.identifiers.AthensDomain;
+
+import java.util.List;
+
+/**
+ * @author bjorncs
+ */
+public interface ZtsClient {
+
+ List<AthensDomain> getTenantDomainsForUser(AthenzPrincipal principal);
+
+}
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/ZtsException.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/ZtsException.java
new file mode 100644
index 00000000000..cb0b21ba459
--- /dev/null
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/ZtsException.java
@@ -0,0 +1,22 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.hosted.controller.athenz;
+
+import com.yahoo.athenz.zts.ZTSClientException;
+
+/**
+ * @author bjorncs
+ */
+public class ZtsException extends RuntimeException {
+
+ private final int code;
+
+ public ZtsException(ZTSClientException e) {
+ super(e.getMessage(), e);
+ this.code = e.getCode();
+ }
+
+
+ public int getCode() {
+ return code;
+ }
+}
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/filter/AthenzPrincipalFilter.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/filter/AthenzPrincipalFilter.java
new file mode 100644
index 00000000000..de771ff2e17
--- /dev/null
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/filter/AthenzPrincipalFilter.java
@@ -0,0 +1,71 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.hosted.controller.athenz.filter;
+
+import com.google.inject.Inject;
+import com.yahoo.jdisc.Response;
+import com.yahoo.jdisc.handler.FastContentWriter;
+import com.yahoo.jdisc.handler.ResponseDispatch;
+import com.yahoo.jdisc.handler.ResponseHandler;
+import com.yahoo.jdisc.http.filter.DiscFilterRequest;
+import com.yahoo.jdisc.http.filter.SecurityRequestFilter;
+import com.yahoo.jdisc.http.server.jetty.ErrorResponseContentCreator;
+import com.yahoo.vespa.hosted.controller.athenz.AthenzPrincipal;
+import com.yahoo.vespa.hosted.controller.athenz.InvalidTokenException;
+import com.yahoo.vespa.hosted.controller.athenz.NToken;
+import com.yahoo.vespa.hosted.controller.athenz.ZmsKeystore;
+import com.yahoo.vespa.hosted.controller.athenz.config.AthenzConfig;
+
+import java.util.Optional;
+import java.util.concurrent.Executor;
+
+/**
+ * Performs authentication by validating the principal token (NToken) header.
+ *
+ * @author bjorncs
+ */
+public class AthenzPrincipalFilter implements SecurityRequestFilter {
+
+ private final ErrorResponseContentCreator responseCreator = new ErrorResponseContentCreator();
+ private final NTokenValidator validator;
+ private final String principalTokenHeader;
+
+ /**
+ * @param executor to preload the ZMS public keys with
+ */
+ @Inject
+ public AthenzPrincipalFilter(ZmsKeystore zmsKeystore, Executor executor, AthenzConfig config) {
+ this(new NTokenValidator(zmsKeystore), executor, config.principalHeaderName());
+ }
+
+ AthenzPrincipalFilter(NTokenValidator validator, Executor executor, String principalTokenHeader) {
+ this.validator = validator;
+ this.principalTokenHeader = principalTokenHeader;
+ executor.execute(validator::preloadPublicKeys);
+ }
+
+ @Override
+ public void filter(DiscFilterRequest request, ResponseHandler responseHandler) {
+ String rawToken = request.getHeader(principalTokenHeader);
+ if (rawToken == null || rawToken.isEmpty()) {
+ sendUnauthorized(request, responseHandler, "NToken is missing");
+ return;
+ }
+ try {
+ AthenzPrincipal principal = validator.validate(new NToken(rawToken));
+ request.setUserPrincipal(principal);
+ request.setRemoteUser(principal.getName());
+ } catch (InvalidTokenException e) {
+ sendUnauthorized(request, responseHandler, e.getMessage());
+ }
+ }
+
+ private void sendUnauthorized(DiscFilterRequest request, ResponseHandler responseHandler, String message) {
+ try (FastContentWriter writer = ResponseDispatch.newInstance(Response.Status.UNAUTHORIZED)
+ .connectFastWriter(responseHandler)) {
+ writer.write(
+ responseCreator.createErrorContent(
+ request.getRequestURI(), Response.Status.UNAUTHORIZED, Optional.of(message)));
+ }
+ }
+
+}
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/filter/NTokenValidator.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/filter/NTokenValidator.java
new file mode 100644
index 00000000000..f43d2d8e80e
--- /dev/null
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/filter/NTokenValidator.java
@@ -0,0 +1,67 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.hosted.controller.athenz.filter;
+
+import com.yahoo.log.LogLevel;
+import com.yahoo.vespa.hosted.controller.athenz.AthenzPrincipal;
+import com.yahoo.vespa.hosted.controller.athenz.InvalidTokenException;
+import com.yahoo.vespa.hosted.controller.athenz.NToken;
+import com.yahoo.vespa.hosted.controller.athenz.ZmsKeystore;
+
+import java.security.PublicKey;
+import java.util.Optional;
+import java.util.logging.Logger;
+
+import static com.yahoo.vespa.hosted.controller.athenz.AthenzUtils.ZMS_ATHENZ_SERVICE;
+
+/**
+ * Validates the content of an NToken:
+ * 1) Verifies that the token is signed by the sys.auth.zms service (by validating the signature)
+ * 2) Verifies that the token is not expired
+ *
+ * @author bjorncs
+ */
+class NTokenValidator {
+
+ private static final Logger log = Logger.getLogger(NTokenValidator.class.getName());
+
+ private final ZmsKeystore keystore;
+
+ NTokenValidator(ZmsKeystore keystore) {
+ this.keystore = keystore;
+ }
+
+ void preloadPublicKeys() {
+ keystore.preloadKeys(ZMS_ATHENZ_SERVICE);
+ }
+
+ AthenzPrincipal validate(NToken token) throws InvalidTokenException {
+ PublicKey zmsPublicKey = getPublicKey(token.getKeyId())
+ .orElseThrow(() -> new InvalidTokenException("NToken has an unknown keyId"));
+ validateSignatureAndExpiration(token, zmsPublicKey);
+ return token.getPrincipal();
+ }
+
+ private Optional<PublicKey> getPublicKey(String keyId) throws InvalidTokenException {
+ try {
+ return keystore.getPublicKey(ZMS_ATHENZ_SERVICE, keyId);
+ } catch (Exception e) {
+ logDebug(e.getMessage());
+ throw new InvalidTokenException("Failed to retrieve public key");
+ }
+ }
+
+ private static void validateSignatureAndExpiration(NToken token, PublicKey zmsPublicKey) throws InvalidTokenException {
+ try {
+ token.validateSignatureAndExpiration(zmsPublicKey);
+ } catch (InvalidTokenException e) {
+ // The underlying error message is not user friendly
+ logDebug(e.getMessage());
+ throw new InvalidTokenException("NToken is expired or has invalid signature");
+ }
+ }
+
+ private static void logDebug(String message) {
+ log.log(LogLevel.DEBUG, "Failed to validate NToken: " + message);
+ }
+
+}
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/impl/AthenzClientFactoryImpl.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/impl/AthenzClientFactoryImpl.java
new file mode 100644
index 00000000000..292841d89f3
--- /dev/null
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/impl/AthenzClientFactoryImpl.java
@@ -0,0 +1,101 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.hosted.controller.athenz.impl;
+
+import com.google.inject.Inject;
+import com.yahoo.athenz.auth.Principal;
+import com.yahoo.athenz.auth.impl.PrincipalAuthority;
+import com.yahoo.athenz.auth.impl.SimplePrincipal;
+import com.yahoo.athenz.auth.impl.SimpleServiceIdentityProvider;
+import com.yahoo.athenz.auth.token.PrincipalToken;
+import com.yahoo.athenz.auth.util.Crypto;
+import com.yahoo.athenz.zms.ZMSClient;
+import com.yahoo.athenz.zts.ZTSClient;
+import com.yahoo.vespa.hosted.controller.api.integration.security.KeyService;
+import com.yahoo.vespa.hosted.controller.athenz.AthenzClientFactory;
+import com.yahoo.vespa.hosted.controller.athenz.NToken;
+import com.yahoo.vespa.hosted.controller.athenz.ZmsClient;
+import com.yahoo.vespa.hosted.controller.athenz.ZtsClient;
+import com.yahoo.vespa.hosted.controller.athenz.config.AthenzConfig;
+
+import java.security.PrivateKey;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author bjorncs
+ */
+public class AthenzClientFactoryImpl implements AthenzClientFactory {
+
+ private final KeyService secretService;
+ private final AthenzConfig config;
+ private final AthenzPrincipalAuthority athenzPrincipalAuthority;
+
+ @Inject
+ public AthenzClientFactoryImpl(KeyService secretService, AthenzConfig config) {
+ this.secretService = secretService;
+ this.config = config;
+ this.athenzPrincipalAuthority = new AthenzPrincipalAuthority(config.principalHeaderName());
+ }
+
+ /**
+ * @return A ZMS client instance with the service identity as principal.
+ */
+ @Override
+ public ZmsClient createZmsClientWithServicePrincipal() {
+ return new ZmsClientImpl(new ZMSClient(config.zmsUrl(), createServicePrincipal()), config);
+ }
+
+ /**
+ * @return A ZTS client instance with the service identity as principal.
+ */
+ @Override
+ public ZtsClient createZtsClientWithServicePrincipal() {
+ return new ZtsClientImpl(new ZTSClient(config.ztsUrl(), createServicePrincipal()), config);
+ }
+
+ /**
+ * @return A ZMS client created with a dual principal representing both the tenant admin and the service identity.
+ */
+ @Override
+ public ZmsClient createZmsClientWithAuthorizedServiceToken(NToken authorizedServiceToken) {
+ PrincipalToken signedToken = new PrincipalToken(authorizedServiceToken.getToken());
+ AthenzConfig.Service service = config.service();
+ signedToken.signForAuthorizedService(
+ config.domain() + "." + service.name(), service.publicKeyId(), getServicePrivateKey());
+
+ Principal dualPrincipal = SimplePrincipal.create(
+ "yby", signedToken.getName(), signedToken.getSignedToken(), athenzPrincipalAuthority);
+ return new ZmsClientImpl(new ZMSClient(config.zmsUrl(), dualPrincipal), config);
+
+ }
+
+ private Principal createServicePrincipal() {
+ AthenzConfig.Service service = config.service();
+ // TODO bjorncs: Cache principal token
+ SimpleServiceIdentityProvider identityProvider =
+ new SimpleServiceIdentityProvider(
+ athenzPrincipalAuthority, config.domain(), service.name(),
+ getServicePrivateKey(), service.publicKeyId(), /*tokenTimeout*/TimeUnit.HOURS.toSeconds(1));
+ return identityProvider.getIdentity(config.domain(), service.name());
+ }
+
+ private PrivateKey getServicePrivateKey() {
+ AthenzConfig.Service service = config.service();
+ String privateKey = secretService.getSecret(service.privateKeySecretName(), service.privateKeyVersion()).trim();
+ return Crypto.loadPrivateKey(privateKey);
+ }
+
+ private static class AthenzPrincipalAuthority extends PrincipalAuthority {
+ private final String principalHeaderName;
+
+ public AthenzPrincipalAuthority(String principalHeaderName) {
+ this.principalHeaderName = principalHeaderName;
+ }
+
+ @Override
+ public String getHeader() {
+ return principalHeaderName;
+ }
+ }
+
+
+}
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/impl/ZmsClientImpl.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/impl/ZmsClientImpl.java
new file mode 100644
index 00000000000..48bd8af7dfe
--- /dev/null
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/impl/ZmsClientImpl.java
@@ -0,0 +1,217 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.hosted.controller.athenz.impl;
+
+import com.yahoo.athenz.auth.util.Crypto;
+import com.yahoo.athenz.zms.DomainList;
+import com.yahoo.athenz.zms.ProviderResourceGroupRoles;
+import com.yahoo.athenz.zms.PublicKeyEntry;
+import com.yahoo.athenz.zms.ServiceIdentity;
+import com.yahoo.athenz.zms.Tenancy;
+import com.yahoo.athenz.zms.TenantRoleAction;
+import com.yahoo.athenz.zms.ZMSClient;
+import com.yahoo.athenz.zms.ZMSClientException;
+import com.yahoo.log.LogLevel;
+import com.yahoo.vespa.hosted.controller.api.identifiers.ApplicationId;
+import com.yahoo.vespa.hosted.controller.api.identifiers.AthensDomain;
+import com.yahoo.vespa.hosted.controller.athenz.ApplicationAction;
+import com.yahoo.vespa.hosted.controller.athenz.AthenzPrincipal;
+import com.yahoo.vespa.hosted.controller.athenz.AthenzPublicKey;
+import com.yahoo.vespa.hosted.controller.athenz.AthenzService;
+import com.yahoo.vespa.hosted.controller.athenz.ZmsClient;
+import com.yahoo.vespa.hosted.controller.athenz.ZmsException;
+import com.yahoo.vespa.hosted.controller.athenz.config.AthenzConfig;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.function.Supplier;
+import java.util.logging.Logger;
+
+import static java.util.stream.Collectors.toList;
+
+/**
+ * @author bjorncs
+ */
+public class ZmsClientImpl implements ZmsClient {
+
+ private static final Logger log = Logger.getLogger(ZmsClientImpl.class.getName());
+ private final ZMSClient zmsClient;
+ private final AthenzService service;
+
+ ZmsClientImpl(ZMSClient zmsClient, AthenzConfig config) {
+ this.zmsClient = zmsClient;
+ this.service = new AthenzService(config.domain(), config.service().name());
+ }
+
+ @Override
+ public void createTenant(AthensDomain tenantDomain) {
+ log("putTenancy(tenantDomain=%s, service=%s)", tenantDomain, service);
+ runOrThrow(() -> {
+ Tenancy tenancy = new Tenancy()
+ .setDomain(tenantDomain.id())
+ .setService(service.toFullServiceName())
+ .setResourceGroups(Collections.emptyList());
+ zmsClient.putTenancy(tenantDomain.id(), service.toFullServiceName(), /*auditref*/null, tenancy);
+ });
+ }
+
+ @Override
+ public void deleteTenant(AthensDomain tenantDomain) {
+ log("deleteTenancy(tenantDomain=%s, service=%s)", tenantDomain, service);
+ runOrThrow(() -> zmsClient.deleteTenancy(tenantDomain.id(), service.toFullServiceName(), /*auditref*/null));
+ }
+
+ @Override
+ public void addApplication(AthensDomain tenantDomain, ApplicationId applicationName) {
+ List<TenantRoleAction> tenantRoleActions = createTenantRoleActions();
+ log("putProviderResourceGroupRoles(" +
+ "tenantDomain=%s, providerDomain=%s, service=%s, resourceGroup=%s, roleActions=%s)",
+ tenantDomain, service.getDomain().getName(), service.getServiceName(), applicationName, tenantRoleActions);
+ runOrThrow(() -> {
+ ProviderResourceGroupRoles resourceGroupRoles = new ProviderResourceGroupRoles()
+ .setDomain(service.getDomain().getName())
+ .setService(service.getServiceName())
+ .setTenant(tenantDomain.id())
+ .setResourceGroup(applicationName.id())
+ .setRoles(tenantRoleActions);
+ zmsClient.putProviderResourceGroupRoles(
+ tenantDomain.id(), service.getDomain().getName(), service.getServiceName(),
+ applicationName.id(), /*auditref*/null, resourceGroupRoles);
+ });
+ }
+
+ @Override
+ public void deleteApplication(AthensDomain tenantDomain, ApplicationId applicationName) {
+ log("deleteProviderResourceGroupRoles(tenantDomain=%s, providerDomain=%s, service=%s, resourceGroup=%s)",
+ tenantDomain, service.getDomain().getName(), service.getServiceName(), applicationName);
+ runOrThrow(() -> {
+ zmsClient.deleteProviderResourceGroupRoles(
+ tenantDomain.id(), service.getDomain().getName(), service.getServiceName(), applicationName.id(), /*auditref*/null);
+ });
+ }
+
+ @Override
+ public boolean hasApplicationAccess(
+ AthenzPrincipal principal, ApplicationAction action, AthensDomain tenantDomain, ApplicationId applicationName) {
+ return hasAccess(
+ action.name(), applicationResourceString(tenantDomain, applicationName), principal);
+ }
+
+ @Override
+ public boolean hasTenantAdminAccess(AthenzPrincipal principal, AthensDomain tenantDomain) {
+ return hasAccess(TenantAction._modify_.name(), tenantResourceString(tenantDomain), principal);
+ }
+
+ /**
+ * Used when creating tenancies. As there are no tenancy policies at this point,
+ * we cannot use {@link #hasTenantAdminAccess(AthenzPrincipal, AthensDomain)}
+ */
+ @Override
+ public boolean isDomainAdmin(AthenzPrincipal principal, AthensDomain domain) {
+ log("getMembership(domain=%s, role=%s, principal=%s)", domain, "admin", principal);
+ return getOrThrow(
+ () -> zmsClient.getMembership(domain.id(), "admin", principal.toYRN()).getIsMember());
+ }
+
+ @Override
+ public List<AthensDomain> getDomainList(String prefix) {
+ log.log(LogLevel.DEBUG, String.format("getDomainList(prefix=%s)", prefix));
+ return getOrThrow(
+ () -> {
+ DomainList domainList = zmsClient.getDomainList(
+ /*limit*/null, /*skip*/null, prefix, /*depth*/null, /*domain*/null,
+ /*productId*/ null, /*modifiedSince*/null);
+ return toAthensDomains(domainList.getNames());
+ });
+ }
+
+ @Override
+ public AthenzPublicKey getPublicKey(AthenzService service, String keyId) {
+ log("getPublicKeyEntry(domain=%s, service=%s, keyId=%s)", service.getDomain().id(), service.getServiceName(), keyId);
+ return getOrThrow(() -> {
+ PublicKeyEntry entry = zmsClient.getPublicKeyEntry(service.getDomain().id(), service.getServiceName(), keyId);
+ return fromYbase64EncodedKey(entry.getKey(), keyId);
+ });
+ }
+
+ @Override
+ public List<AthenzPublicKey> getPublicKeys(AthenzService service) {
+ log("getServiceIdentity(domain=%s, service=%s)", service.getDomain().id(), service.getServiceName());
+ return getOrThrow(() -> {
+ ServiceIdentity serviceIdentity = zmsClient.getServiceIdentity(service.getDomain().id(), service.getServiceName());
+ return toAthensPublicKeys(serviceIdentity.getPublicKeys());
+ });
+ }
+
+ private static AthenzPublicKey fromYbase64EncodedKey(String encodedKey, String keyId) {
+ return new AthenzPublicKey(Crypto.loadPublicKey(Crypto.ybase64DecodeString(encodedKey)), keyId);
+ }
+
+ private static List<TenantRoleAction> createTenantRoleActions() {
+ return Arrays.stream(ApplicationAction.values())
+ .map(action -> new TenantRoleAction().setAction(action.name()).setRole(action.roleName))
+ .collect(toList());
+ }
+
+ private static List<AthensDomain> toAthensDomains(List<String> domains) {
+ return domains.stream().map(AthensDomain::new).collect(toList());
+ }
+
+ private static List<AthenzPublicKey> toAthensPublicKeys(List<PublicKeyEntry> publicKeys) {
+ return publicKeys.stream()
+ .map(entry -> fromYbase64EncodedKey(entry.getKey(), entry.getId()))
+ .collect(toList());
+ }
+
+ private boolean hasAccess(String action, String resource, AthenzPrincipal principal) {
+ log("getAccess(action=%s, resource=%s, principal=%s)", action, resource, principal);
+ return getOrThrow(
+ () -> zmsClient.getAccess(action, resource, /*trustDomain*/null, principal.toYRN()).getGranted());
+ }
+
+ private static void log(String format, Object... args) {
+ log.log(LogLevel.DEBUG, String.format(format, args));
+ }
+
+ private static void runOrThrow(Runnable wrappedCode) {
+ try {
+ wrappedCode.run();
+ } catch (ZMSClientException e) {
+ logWarning(e);
+ throw new ZmsException(e);
+ }
+ }
+
+ private static <T> T getOrThrow(Supplier<T> wrappedCode) {
+ try {
+ return wrappedCode.get();
+ } catch (ZMSClientException e) {
+ logWarning(e);
+ throw new ZmsException(e);
+ }
+ }
+
+ private static void logWarning(ZMSClientException e) {
+ log.warning("Error from Athens: " + e.getMessage());
+ }
+
+ private String resourceStringPrefix(AthensDomain tenantDomain) {
+ return String.format("%s:service.%s.tenant.%s",
+ service.getDomain().getName(), service.getServiceName(), tenantDomain.id());
+ }
+
+ private String tenantResourceString(AthensDomain tenantDomain) {
+ return resourceStringPrefix(tenantDomain) + ".wildcard";
+ }
+
+ private String applicationResourceString(AthensDomain tenantDomain, ApplicationId applicationName) {
+ return resourceStringPrefix(tenantDomain) + "." + "res_group" + "." + applicationName.id() + ".wildcard";
+ }
+
+ private enum TenantAction {
+ // This is meant to match only the '*' action of the 'admin' role.
+ // If needed, we can replace it with 'create', 'delete' etc. later.
+ _modify_
+ }
+
+}
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/impl/ZmsKeystoreImpl.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/impl/ZmsKeystoreImpl.java
new file mode 100644
index 00000000000..67f22d42f92
--- /dev/null
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/impl/ZmsKeystoreImpl.java
@@ -0,0 +1,118 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.hosted.controller.athenz.impl;
+
+import com.yahoo.log.LogLevel;
+import com.yahoo.vespa.hosted.controller.athenz.AthenzPublicKey;
+import com.yahoo.vespa.hosted.controller.athenz.AthenzService;
+import com.yahoo.vespa.hosted.controller.athenz.AthenzClientFactory;
+import com.yahoo.vespa.hosted.controller.athenz.ZmsException;
+import com.yahoo.vespa.hosted.controller.athenz.ZmsKeystore;
+
+import java.security.PublicKey;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.logging.Logger;
+
+/**
+ * Downloads and caches public keys for Athens services.
+ *
+ * @author bjorncs
+ */
+public class ZmsKeystoreImpl implements ZmsKeystore {
+ private static final Logger log = Logger.getLogger(ZmsKeystoreImpl.class.getName());
+
+ private final Map<FullKeyId, PublicKey> cachedKeys = new ConcurrentHashMap<>();
+ private final AthenzClientFactory athenzClientFactory;
+
+ ZmsKeystoreImpl(AthenzClientFactory factory) {
+ this.athenzClientFactory = factory;
+ }
+
+ @Override
+ public Optional<PublicKey> getPublicKey(AthenzService service, String keyId) {
+ FullKeyId fullKeyId = new FullKeyId(service, keyId);
+ PublicKey cachedKey = cachedKeys.get(fullKeyId);
+ if (cachedKey != null) {
+ return Optional.of(cachedKey);
+ }
+ Optional<PublicKey> downloadedKey = downloadPublicKey(fullKeyId);
+ downloadedKey.ifPresent(key -> {
+ log.log(LogLevel.INFO, "Adding key " + fullKeyId + " to the cache");
+ cachedKeys.put(fullKeyId, key);
+ });
+ return downloadedKey;
+ }
+
+ @Override
+ public void preloadKeys(AthenzService service) {
+ try {
+ log.log(LogLevel.INFO, "Downloading keys for " + service);
+ List<AthenzPublicKey> publicKeys = athenzClientFactory.createZmsClientWithServicePrincipal()
+ .getPublicKeys(service);
+ for (AthenzPublicKey publicKey : publicKeys) {
+ FullKeyId fullKeyId = new FullKeyId(service, publicKey.getKeyId());
+ log.log(LogLevel.DEBUG, "Adding key " + fullKeyId + " to the cache");
+ cachedKeys.put(fullKeyId, publicKey.getPublicKey());
+ }
+ log.log(LogLevel.INFO, "Successfully downloaded keys for " + service);
+ } catch (ZmsException e) {
+ log.log(LogLevel.WARNING, "Failed to download keys for " + service + ": " + e.getMessage());
+ }
+ }
+
+ private Optional<PublicKey> downloadPublicKey(FullKeyId fullKeyId) {
+ try {
+ log.log(LogLevel.INFO, "Downloading key " + fullKeyId);
+ AthenzPublicKey publicKey = athenzClientFactory.createZmsClientWithServicePrincipal()
+ .getPublicKey(fullKeyId.service, fullKeyId.keyId);
+ return Optional.of(publicKey.getPublicKey());
+ } catch (ZmsException e) {
+ if (e.getCode() == 404) { // Key does not exist
+ log.log(LogLevel.INFO, "Key " + fullKeyId + " not found");
+ return Optional.empty();
+ }
+ String msg = String.format("Unable to retrieve public key from Athens (%s): %s", fullKeyId, e.getMessage());
+ throw createException(msg, e);
+ }
+ }
+
+ private static RuntimeException createException(String message, Exception cause) {
+ log.log(LogLevel.ERROR, message);
+ return new RuntimeException(message, cause);
+ }
+
+ private static class FullKeyId {
+ private final AthenzService service;
+ private final String keyId;
+
+ private FullKeyId(AthenzService service, String keyId) {
+ this.service = service;
+ this.keyId = keyId;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ FullKeyId fullKeyId1 = (FullKeyId) o;
+ return Objects.equals(service, fullKeyId1.service) &&
+ Objects.equals(keyId, fullKeyId1.keyId);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(service, keyId);
+ }
+
+ @Override
+ public String toString() {
+ return "FullKeyId{" +
+ "service=" + service +
+ ", keyId='" + keyId + '\'' +
+ '}';
+ }
+ }
+}
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/impl/ZtsClientImpl.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/impl/ZtsClientImpl.java
new file mode 100644
index 00000000000..d964cc967e8
--- /dev/null
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/impl/ZtsClientImpl.java
@@ -0,0 +1,51 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.hosted.controller.athenz.impl;
+
+import com.yahoo.athenz.zts.TenantDomains;
+import com.yahoo.athenz.zts.ZTSClient;
+import com.yahoo.athenz.zts.ZTSClientException;
+import com.yahoo.log.LogLevel;
+import com.yahoo.vespa.hosted.controller.api.identifiers.AthensDomain;
+import com.yahoo.vespa.hosted.controller.athenz.AthenzPrincipal;
+import com.yahoo.vespa.hosted.controller.athenz.AthenzService;
+import com.yahoo.vespa.hosted.controller.athenz.ZtsClient;
+import com.yahoo.vespa.hosted.controller.athenz.ZtsException;
+import com.yahoo.vespa.hosted.controller.athenz.config.AthenzConfig;
+
+import java.util.List;
+import java.util.logging.Logger;
+
+import static java.util.stream.Collectors.toList;
+
+/**
+ * @author bjorncs
+ */
+public class ZtsClientImpl implements ZtsClient {
+
+ private static final Logger log = Logger.getLogger(ZtsClientImpl.class.getName());
+
+ private final ZTSClient ztsClient;
+ private final AthenzService service;
+
+ public ZtsClientImpl(ZTSClient ztsClient, AthenzConfig config) {
+ this.ztsClient = ztsClient;
+ this.service = new AthenzService(config.domain(), config.service().name());
+ }
+
+ @Override
+ public List<AthensDomain> getTenantDomainsForUser(AthenzPrincipal principal) {
+ log.log(LogLevel.DEBUG, String.format(
+ "getTenantDomains(domain=%s, username=%s, rolename=admin, service=%s)",
+ service.getDomain().getName(), principal, service.getServiceName()));
+ try {
+ TenantDomains domains = ztsClient.getTenantDomains(
+ service.getDomain().getName(), principal.toYRN(), "admin", service.getServiceName());
+ return domains.getTenantDomainNames().stream()
+ .map(AthensDomain::new)
+ .collect(toList());
+ } catch (ZTSClientException e) {
+ throw new ZtsException(e);
+ }
+ }
+
+}
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/mock/AthensDbMock.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/mock/AthensDbMock.java
index 8a02d0dcff5..55fe435c9be 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/mock/AthensDbMock.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/mock/AthensDbMock.java
@@ -1,10 +1,10 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.vespa.hosted.controller.api.integration.athens.mock;
+package com.yahoo.vespa.hosted.controller.athenz.mock;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.ApplicationAction;
import com.yahoo.vespa.hosted.controller.api.identifiers.ApplicationId;
import com.yahoo.vespa.hosted.controller.api.identifiers.AthensDomain;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.AthensPrincipal;
+import com.yahoo.vespa.hosted.controller.athenz.ApplicationAction;
+import com.yahoo.vespa.hosted.controller.athenz.AthenzPrincipal;
import java.util.HashMap;
import java.util.HashSet;
@@ -26,8 +26,8 @@ public class AthensDbMock {
public static class Domain {
public final AthensDomain name;
- public final Set<AthensPrincipal> admins = new HashSet<>();
- public final Set<AthensPrincipal> tenantAdmins = new HashSet<>();
+ public final Set<AthenzPrincipal> admins = new HashSet<>();
+ public final Set<AthenzPrincipal> tenantAdmins = new HashSet<>();
public final Map<ApplicationId, Application> applications = new HashMap<>();
public boolean isVespaTenant = false;
@@ -35,12 +35,12 @@ public class AthensDbMock {
this.name = name;
}
- public Domain admin(AthensPrincipal user) {
+ public Domain admin(AthenzPrincipal user) {
admins.add(user);
return this;
}
- public Domain tenantAdmin(AthensPrincipal user) {
+ public Domain tenantAdmin(AthenzPrincipal user) {
tenantAdmins.add(user);
return this;
}
@@ -56,7 +56,7 @@ public class AthensDbMock {
public static class Application {
- public final Map<ApplicationAction, Set<AthensPrincipal>> acl = new HashMap<>();
+ public final Map<ApplicationAction, Set<AthenzPrincipal>> acl = new HashMap<>();
public Application() {
acl.put(ApplicationAction.deploy, new HashSet<>());
@@ -64,7 +64,7 @@ public class AthensDbMock {
acl.put(ApplicationAction.write, new HashSet<>());
}
- public Application addRoleMember(ApplicationAction action, AthensPrincipal user) {
+ public Application addRoleMember(ApplicationAction action, AthenzPrincipal user) {
acl.get(action).add(user);
return this;
}
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/mock/AthenzClientFactoryMock.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/mock/AthenzClientFactoryMock.java
new file mode 100644
index 00000000000..92c7ba5a007
--- /dev/null
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/mock/AthenzClientFactoryMock.java
@@ -0,0 +1,56 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.hosted.controller.athenz.mock;
+
+import com.yahoo.component.AbstractComponent;
+import com.yahoo.vespa.hosted.controller.athenz.NToken;
+import com.yahoo.vespa.hosted.controller.athenz.ZmsClient;
+import com.yahoo.vespa.hosted.controller.athenz.AthenzClientFactory;
+import com.yahoo.vespa.hosted.controller.athenz.ZtsClient;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * @author bjorncs
+ */
+public class AthenzClientFactoryMock extends AbstractComponent implements AthenzClientFactory {
+
+ private static final Logger log = Logger.getLogger(AthenzClientFactoryMock.class.getName());
+
+ private final AthensDbMock athens;
+
+ public AthenzClientFactoryMock() {
+ this(new AthensDbMock());
+ }
+
+ public AthenzClientFactoryMock(AthensDbMock athens) {
+ this.athens = athens;
+ }
+
+ public AthensDbMock getSetup() {
+ return athens;
+ }
+
+ @Override
+ public ZmsClient createZmsClientWithServicePrincipal() {
+ log("createZmsClientWithServicePrincipal()");
+ return new ZmsClientMock(athens);
+ }
+
+ @Override
+ public ZtsClient createZtsClientWithServicePrincipal() {
+ log("createZtsClientWithServicePrincipal()");
+ return new ZtsClientMock(athens);
+ }
+
+ @Override
+ public ZmsClient createZmsClientWithAuthorizedServiceToken(NToken authorizedServiceToken) {
+ log("createZmsClientWithAuthorizedServiceToken(authorizedServiceToken='%s')", authorizedServiceToken);
+ return new ZmsClientMock(athens);
+ }
+
+ private static void log(String format, Object... args) {
+ log.log(Level.INFO, String.format(format, args));
+ }
+
+}
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/mock/ZmsClientMock.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/mock/ZmsClientMock.java
index 97f391f792d..bba7d410bf7 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/athens/mock/ZmsClientMock.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/mock/ZmsClientMock.java
@@ -1,14 +1,15 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.vespa.hosted.controller.api.integration.athens.mock;
+package com.yahoo.vespa.hosted.controller.athenz.mock;
+import com.yahoo.athenz.zms.ZMSClientException;
import com.yahoo.vespa.hosted.controller.api.identifiers.ApplicationId;
import com.yahoo.vespa.hosted.controller.api.identifiers.AthensDomain;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.ApplicationAction;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.AthensPrincipal;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.AthensPublicKey;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.AthensService;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.ZmsClient;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.ZmsException;
+import com.yahoo.vespa.hosted.controller.athenz.ApplicationAction;
+import com.yahoo.vespa.hosted.controller.athenz.AthenzPrincipal;
+import com.yahoo.vespa.hosted.controller.athenz.AthenzPublicKey;
+import com.yahoo.vespa.hosted.controller.athenz.AthenzService;
+import com.yahoo.vespa.hosted.controller.athenz.ZmsClient;
+import com.yahoo.vespa.hosted.controller.athenz.ZmsException;
import java.util.ArrayList;
import java.util.List;
@@ -16,8 +17,6 @@ import java.util.Optional;
import java.util.logging.Level;
import java.util.logging.Logger;
-import static java.util.stream.Collectors.toList;
-
/**
* @author bjorncs
*/
@@ -62,7 +61,7 @@ public class ZmsClientMock implements ZmsClient {
}
@Override
- public boolean hasApplicationAccess(AthensPrincipal principal, ApplicationAction action, AthensDomain tenantDomain, ApplicationId applicationName) {
+ public boolean hasApplicationAccess(AthenzPrincipal principal, ApplicationAction action, AthensDomain tenantDomain, ApplicationId applicationName) {
log("hasApplicationAccess(principal='%s', action='%s', tenantDomain='%s', applicationName='%s')",
principal, action, tenantDomain, applicationName);
AthensDbMock.Domain domain = getDomainOrThrow(tenantDomain, true);
@@ -74,14 +73,14 @@ public class ZmsClientMock implements ZmsClient {
}
@Override
- public boolean hasTenantAdminAccess(AthensPrincipal principal, AthensDomain tenantDomain) {
+ public boolean hasTenantAdminAccess(AthenzPrincipal principal, AthensDomain tenantDomain) {
log("hasTenantAdminAccess(principal='%s', tenantDomain='%s')", principal, tenantDomain);
return isDomainAdmin(principal, tenantDomain) ||
getDomainOrThrow(tenantDomain, true).tenantAdmins.contains(principal);
}
@Override
- public boolean isDomainAdmin(AthensPrincipal principal, AthensDomain domain) {
+ public boolean isDomainAdmin(AthenzPrincipal principal, AthensDomain domain) {
log("isDomainAdmin(principal='%s', domain='%s')", principal, domain);
return getDomainOrThrow(domain, false).admins.contains(principal);
}
@@ -93,21 +92,12 @@ public class ZmsClientMock implements ZmsClient {
}
@Override
- public List<AthensDomain> getTenantDomainsForUser(AthensPrincipal principal) {
- log("getTenantDomainsForUser(principal='%s')", principal);
- return athens.domains.values().stream()
- .filter(domain -> domain.tenantAdmins.contains(principal) || domain.admins.contains(principal))
- .map(domain -> domain.name)
- .collect(toList());
- }
-
- @Override
- public AthensPublicKey getPublicKey(AthensService service, String keyId) {
+ public AthenzPublicKey getPublicKey(AthenzService service, String keyId) {
throw new UnsupportedOperationException();
}
@Override
- public List<AthensPublicKey> getPublicKeys(AthensService service) {
+ public List<AthenzPublicKey> getPublicKeys(AthenzService service) {
throw new UnsupportedOperationException();
}
@@ -121,7 +111,7 @@ public class ZmsClientMock implements ZmsClient {
}
private static ZmsException zmsException(int code, String message, Object... args) {
- return new ZmsException(new RuntimeException(String.format(message, args)), code);
+ return new ZmsException(new ZMSClientException(code, String.format(message, args)));
}
private static void log(String format, Object... args) {
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/mock/ZtsClientMock.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/mock/ZtsClientMock.java
new file mode 100644
index 00000000000..fa41dcc6446
--- /dev/null
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/athenz/mock/ZtsClientMock.java
@@ -0,0 +1,34 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.hosted.controller.athenz.mock;
+
+import com.yahoo.vespa.hosted.controller.api.identifiers.AthensDomain;
+import com.yahoo.vespa.hosted.controller.athenz.AthenzPrincipal;
+import com.yahoo.vespa.hosted.controller.athenz.ZtsClient;
+
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import static java.util.stream.Collectors.toList;
+
+/**
+ * @author bjorncs
+ */
+public class ZtsClientMock implements ZtsClient {
+ private static final Logger log = Logger.getLogger(ZtsClientMock.class.getName());
+
+ private final AthensDbMock athens;
+
+ public ZtsClientMock(AthensDbMock athens) {
+ this.athens = athens;
+ }
+
+ @Override
+ public List<AthensDomain> getTenantDomainsForUser(AthenzPrincipal principal) {
+ log.log(Level.INFO, "getTenantDomainsForUser(principal='%s')", principal);
+ return athens.domains.values().stream()
+ .filter(domain -> domain.tenantAdmins.contains(principal) || domain.admins.contains(principal))
+ .map(domain -> domain.name)
+ .collect(toList());
+ }
+}
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ClusterInfoMaintainer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ClusterInfoMaintainer.java
index 8f5db8832fa..c807a7f0586 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ClusterInfoMaintainer.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ClusterInfoMaintainer.java
@@ -2,6 +2,8 @@
package com.yahoo.vespa.hosted.controller.maintenance;
import com.yahoo.config.provision.ClusterSpec;
+import com.yahoo.config.provision.Flavor;
+import com.yahoo.config.provision.Zone;
import com.yahoo.vespa.curator.Lock;
import com.yahoo.vespa.hosted.controller.Application;
import com.yahoo.vespa.hosted.controller.Controller;
@@ -15,6 +17,7 @@ import java.time.Duration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Optional;
import java.util.logging.Logger;
import java.util.stream.Collectors;
@@ -38,7 +41,7 @@ public class ClusterInfoMaintainer extends Maintainer {
return node.membership.clusterId;
}
- private Map<ClusterSpec.Id, ClusterInfo> getClusterInfo(NodeList nodes) {
+ private Map<ClusterSpec.Id, ClusterInfo> getClusterInfo(NodeList nodes, Zone zone) {
Map<ClusterSpec.Id, ClusterInfo> infoMap = new HashMap<>();
// Group nodes by clusterid
@@ -53,9 +56,24 @@ public class ClusterInfoMaintainer extends Maintainer {
//Assume they are all equal and use first node as a representatitve for the cluster
NodeList.Node node = clusterNodes.get(0);
+ // Extract flavor info
+ double cpu = 0;
+ double mem = 0;
+ double disk = 0;
+ if (zone.nodeFlavors().isPresent()) {
+ Optional<Flavor> flavorOptional = zone.nodeFlavors().get().getFlavor(node.flavor);
+ if ((flavorOptional.isPresent())) {
+ Flavor flavor = flavorOptional.get();
+ cpu = flavor.getMinCpuCores();
+ mem = flavor.getMinMainMemoryAvailableGb();
+ disk = flavor.getMinMainMemoryAvailableGb();
+ }
+ }
+
// Add to map
List<String> hostnames = clusterNodes.stream().map(node1 -> node1.hostname).collect(Collectors.toList());
- ClusterInfo inf = new ClusterInfo(node.flavor, node.cost, ClusterSpec.Type.from(node.membership.clusterType), hostnames);
+ ClusterInfo inf = new ClusterInfo(node.flavor, node.cost, cpu, mem, disk,
+ ClusterSpec.Type.from(node.membership.clusterType), hostnames);
infoMap.put(new ClusterSpec.Id(id), inf);
}
@@ -71,7 +89,7 @@ public class ClusterInfoMaintainer extends Maintainer {
DeploymentId deploymentId = new DeploymentId(application.id(), deployment.zone());
try {
NodeList nodes = controller().applications().configserverClient().getNodeList(deploymentId);
- Map<ClusterSpec.Id, ClusterInfo> clusterInfo = getClusterInfo(nodes);
+ Map<ClusterSpec.Id, ClusterInfo> clusterInfo = getClusterInfo(nodes, deployment.zone());
Application app = application.with(deployment.withClusterInfo(clusterInfo));
controller.applications().store(app, lock);
} catch (IOException ioe) {
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ControllerMaintenance.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ControllerMaintenance.java
index 880abaaa6f9..fd2e7496ec0 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ControllerMaintenance.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ControllerMaintenance.java
@@ -35,6 +35,7 @@ public class ControllerMaintenance extends AbstractComponent {
private final BlockedChangeDeployer blockedChangeDeployer;
private final ClusterInfoMaintainer clusterInfoMaintainer;
private final ClusterUtilizationMaintainer clusterUtilizationMaintainer;
+ private final DeploymentMetricsMaintainer deploymentMetricsMaintainer;
@SuppressWarnings("unused") // instantiated by Dependency Injection
public ControllerMaintenance(MaintainerConfig maintainerConfig, Controller controller, CuratorDb curator,
@@ -54,6 +55,7 @@ public class ControllerMaintenance extends AbstractComponent {
blockedChangeDeployer = new BlockedChangeDeployer(controller, maintenanceInterval, jobControl);
clusterInfoMaintainer = new ClusterInfoMaintainer(controller, Duration.ofHours(2), jobControl);
clusterUtilizationMaintainer = new ClusterUtilizationMaintainer(controller, Duration.ofHours(2), jobControl);
+ deploymentMetricsMaintainer = new DeploymentMetricsMaintainer(controller, Duration.ofMinutes(10), jobControl);
}
public Upgrader upgrader() { return upgrader; }
@@ -74,6 +76,7 @@ public class ControllerMaintenance extends AbstractComponent {
blockedChangeDeployer.deconstruct();
clusterUtilizationMaintainer.deconstruct();
clusterInfoMaintainer.deconstruct();
+ deploymentMetricsMaintainer.deconstruct();
}
}
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentMetricsMaintainer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentMetricsMaintainer.java
new file mode 100644
index 00000000000..d9ef451ffb7
--- /dev/null
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentMetricsMaintainer.java
@@ -0,0 +1,43 @@
+package com.yahoo.vespa.hosted.controller.maintenance;// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+import com.yahoo.vespa.curator.Lock;
+import com.yahoo.vespa.hosted.controller.Application;
+import com.yahoo.vespa.hosted.controller.Controller;
+import com.yahoo.vespa.hosted.controller.api.integration.MetricsService;
+import com.yahoo.vespa.hosted.controller.application.Deployment;
+import com.yahoo.vespa.hosted.controller.application.DeploymentMetrics;
+
+import java.time.Duration;
+
+/**
+ * Retrieve deployment metrics like qps and document count from the metric service and
+ * update the applications with this info.
+ *
+ * @author smorgrav
+ */
+public class DeploymentMetricsMaintainer extends Maintainer {
+
+ DeploymentMetricsMaintainer(Controller controller, Duration duration, JobControl jobControl) {
+ super(controller, duration, jobControl);
+ }
+
+ @Override
+ protected void maintain() {
+
+ for (Application application : controller().applications().asList()) {
+ try (Lock lock = controller().applications().lock(application.id())) {
+ for (Deployment deployment : application.deployments().values()) {
+
+ MetricsService.DeploymentMetrics metrics = controller().metricsService()
+ .getDeploymentMetrics(application.id(), deployment.zone());
+
+ DeploymentMetrics appMetrics = new DeploymentMetrics(metrics.queriesPerSecond(), metrics.writesPerSecond(),
+ metrics.documentCount(), metrics.queryLatencyMillis(), metrics.writeLatencyMillis());
+
+ Application app = application.with(deployment.withMetrics(appMetrics));
+ controller().applications().store(app, lock);
+ }
+ }
+ }
+ }
+}
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java
index 859e322b227..41d1a2d624c 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java
@@ -22,6 +22,7 @@ import com.yahoo.vespa.hosted.controller.application.ClusterUtilization;
import com.yahoo.vespa.hosted.controller.application.Deployment;
import com.yahoo.vespa.hosted.controller.application.DeploymentJobs;
import com.yahoo.vespa.hosted.controller.application.DeploymentJobs.JobError;
+import com.yahoo.vespa.hosted.controller.application.DeploymentMetrics;
import com.yahoo.vespa.hosted.controller.application.JobStatus;
import com.yahoo.vespa.hosted.controller.application.SourceRevision;
@@ -85,6 +86,9 @@ public class ApplicationSerializer {
private final String clusterInfoField = "clusterInfo";
private final String clusterInfoFlavorField = "flavor";
private final String clusterInfoCostField = "cost";
+ private final String clusterInfoCpuField = "flavorCpu";
+ private final String clusterInfoMemField = "flavorMem";
+ private final String clusterInfoDiskField = "flavorDisk";
private final String clusterInfoTypeField = "clusterType";
private final String clusterInfoHostnamesField = "hostnames";
@@ -95,6 +99,14 @@ public class ApplicationSerializer {
private final String clusterUtilsDiskField = "disk";
private final String clusterUtilsDiskBusyField = "diskbusy";
+ // Deployment metrics fields
+ private final String deploymentMetricsField = "metrics";
+ private final String deploymentMetricsQPSField = "queriesPerSecond";
+ private final String deploymentMetricsWPSField = "writesPerSecond";
+ private final String deploymentMetricsDocsField = "documentCount";
+ private final String deploymentMetricsQueryLatencyField = "queryLatencyMillis";
+ private final String deploymentMetricsWriteLatencyField = "writeLatencyMillis";
+
// ------------------ Serialization
@@ -123,6 +135,16 @@ public class ApplicationSerializer {
toSlime(deployment.revision(), object.setObject(applicationPackageRevisionField));
clusterInfoToSlime(deployment.clusterInfo(), object);
clusterUtilsToSlime(deployment.clusterUtils(), object);
+ metricsToSlime(deployment.metrics(), object);
+ }
+
+ private void metricsToSlime(DeploymentMetrics metrics, Cursor object) {
+ Cursor root = object.setObject(deploymentMetricsField);
+ root.setDouble(deploymentMetricsQPSField, metrics.queriesPerSecond());
+ root.setDouble(deploymentMetricsWPSField, metrics.writesPerSecond());
+ root.setDouble(deploymentMetricsDocsField, metrics.documentCount());
+ root.setDouble(deploymentMetricsQueryLatencyField, metrics.queryLatencyMillis());
+ root.setDouble(deploymentMetricsWriteLatencyField, metrics.writeLatencyMillis());
}
private void clusterInfoToSlime(Map<ClusterSpec.Id, ClusterInfo> clusters, Cursor object) {
@@ -134,7 +156,10 @@ public class ApplicationSerializer {
private void toSlime(ClusterInfo info, Cursor object) {
object.setString(clusterInfoFlavorField, info.getFlavor());
- object.setLong(clusterInfoCostField, info.getCost());
+ object.setLong(clusterInfoCostField, info.getFlavorCost());
+ object.setDouble(clusterInfoCpuField, info.getFlavorCPU());
+ object.setDouble(clusterInfoMemField, info.getFlavorMem());
+ object.setDouble(clusterInfoDiskField, info.getFlavorDisk());
object.setString(clusterInfoTypeField, info.getClusterType().name());
Cursor array = object.setArray(clusterInfoHostnamesField);
for (String host : info.getHostnames()) {
@@ -223,7 +248,7 @@ public class ApplicationSerializer {
Inspector root = slime.get();
ApplicationId id = ApplicationId.fromSerializedForm(root.field(idField).asString());
- DeploymentSpec deploymentSpec = DeploymentSpec.fromXml(root.field(deploymentSpecField).asString());
+ DeploymentSpec deploymentSpec = DeploymentSpec.fromXml(root.field(deploymentSpecField).asString(), false);
ValidationOverrides validationOverrides = ValidationOverrides.fromXml(root.field(validationOverridesField).asString());
List<Deployment> deployments = deploymentsFromSlime(root.field(deploymentsField));
DeploymentJobs deploymentJobs = deploymentJobsFromSlime(root.field(deploymentJobsField));
@@ -246,7 +271,20 @@ public class ApplicationSerializer {
Version.fromString(deploymentObject.field(versionField).asString()),
Instant.ofEpochMilli(deploymentObject.field(deployTimeField).asLong()),
clusterUtilsMapFromSlime(deploymentObject.field(clusterUtilsField)),
- clusterInfoMapFromSlime(deploymentObject.field(clusterInfoField)));
+ clusterInfoMapFromSlime(deploymentObject.field(clusterInfoField)),
+ deploymentMetricsFromSlime(deploymentObject.field(deploymentMetricsField)));
+ }
+
+ private DeploymentMetrics deploymentMetricsFromSlime(Inspector object) {
+
+ double queriesPerSecond = object.field(deploymentMetricsQPSField).asDouble();
+ double writesPerSecond = object.field(deploymentMetricsWPSField).asDouble();
+ double documentCount = object.field(deploymentMetricsDocsField).asDouble();
+ double queryLatencyMillis = object.field(deploymentMetricsQueryLatencyField).asDouble();
+ double writeLatencyMills = object.field(deploymentMetricsWriteLatencyField).asDouble();
+
+ return new DeploymentMetrics(queriesPerSecond, writesPerSecond,
+ documentCount, queryLatencyMillis, writeLatencyMills);
}
private Map<ClusterSpec.Id, ClusterInfo> clusterInfoMapFromSlime(Inspector object) {
@@ -274,10 +312,13 @@ public class ApplicationSerializer {
String flavor = inspector.field(clusterInfoFlavorField).asString();
int cost = (int)inspector.field(clusterInfoCostField).asLong();
String type = inspector.field(clusterInfoTypeField).asString();
+ double flavorCpu = inspector.field(clusterInfoCpuField).asDouble();
+ double flavorMem = inspector.field(clusterInfoMemField).asDouble();
+ double flavorDisk = inspector.field(clusterInfoDiskField).asDouble();
List<String> hostnames = new ArrayList<>();
inspector.field(clusterInfoHostnamesField).traverse((ArrayTraverser)(int index, Inspector value) -> hostnames.add(value.asString()));
- return new ClusterInfo(flavor, cost, ClusterSpec.Type.from(type), hostnames);
+ return new ClusterInfo(flavor, cost, flavorCpu, flavorMem, flavorDisk, ClusterSpec.Type.from(type), hostnames);
}
private Zone zoneFromSlime(Inspector object) {
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/CuratorDb.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/CuratorDb.java
index a70e31d9de8..2ca662ccb66 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/CuratorDb.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/CuratorDb.java
@@ -4,20 +4,21 @@ package com.yahoo.vespa.hosted.controller.persistence;
import com.google.inject.Inject;
import com.yahoo.cloud.config.ClusterInfoConfig;
import com.yahoo.cloud.config.ZookeeperServerConfig;
-import com.yahoo.component.Version;
-import com.yahoo.component.Vtag;
import com.yahoo.config.provision.ApplicationId;
import com.yahoo.net.HostName;
import com.yahoo.path.Path;
import com.yahoo.transaction.NestedTransaction;
+import com.yahoo.vespa.config.SlimeUtils;
import com.yahoo.vespa.curator.Curator;
import com.yahoo.vespa.curator.Lock;
import com.yahoo.vespa.hosted.controller.api.identifiers.TenantId;
import com.yahoo.vespa.hosted.controller.application.DeploymentJobs;
+import com.yahoo.vespa.hosted.controller.versions.VersionStatus;
import com.yahoo.vespa.zookeeper.ZooKeeperServer;
+import java.io.IOException;
+import java.io.UncheckedIOException;
import java.nio.ByteBuffer;
-import java.nio.charset.StandardCharsets;
import java.time.Duration;
import java.util.ArrayDeque;
import java.util.Collections;
@@ -148,18 +149,6 @@ public class CuratorDb {
// -------------- Read and write --------------------------------------------------
- public Version readSystemVersion() {
- Optional<byte[]> data = curator.getData(systemVersionPath());
- if (! data.isPresent() || data.get().length == 0) return Vtag.currentVersion;
- return Version.fromString(new String(data.get(), StandardCharsets.UTF_8));
- }
-
- public void writeSystemVersion(Version version) {
- NestedTransaction transaction = new NestedTransaction();
- curator.set(systemVersionPath(), version.toString().getBytes(StandardCharsets.UTF_8));
- transaction.commit();
- }
-
public Set<String> readInactiveJobs() {
try {
Optional<byte[]> data = curator.getData(inactiveJobsPath());
@@ -199,7 +188,7 @@ public class CuratorDb {
}
public double readUpgradesPerMinute() {
- Optional<byte[]> n = curator.getData(upgradePerMinutePath());
+ Optional<byte[]> n = curator.getData(upgradesPerMinutePath());
if (!n.isPresent() || n.get().length == 0) {
return 0.5; // Default if value has never been written
}
@@ -211,10 +200,34 @@ public class CuratorDb {
throw new IllegalArgumentException("Upgrades per minute must be >= 0");
}
NestedTransaction transaction = new NestedTransaction();
- curator.set(upgradePerMinutePath(), ByteBuffer.allocate(Double.BYTES).putDouble(n).array());
+ curator.set(upgradesPerMinutePath(), ByteBuffer.allocate(Double.BYTES).putDouble(n).array());
+ transaction.commit();
+ }
+
+ public void writeVersionStatus(VersionStatus status) {
+ VersionStatusSerializer serializer = new VersionStatusSerializer();
+ NestedTransaction transaction = new NestedTransaction();
+ try {
+ // TODO: Removes unused data. Remove after October 2017
+ if (curator.getData(systemVersionPath()).isPresent()) {
+ curator.delete(systemVersionPath());
+ }
+ curator.set(versionStatusPath(), SlimeUtils.toJsonBytes(serializer.toSlime(status)));
+ } catch (IOException e) {
+ throw new UncheckedIOException("Failed to serialize version status", e);
+ }
transaction.commit();
}
+ public VersionStatus readVersionStatus() {
+ Optional<byte[]> data = curator.getData(versionStatusPath());
+ if (!data.isPresent() || data.get().length == 0) {
+ return VersionStatus.empty(); // Default if status has never been written
+ }
+ VersionStatusSerializer serializer = new VersionStatusSerializer();
+ return serializer.fromSlime(SlimeUtils.jsonToSlime(data.get()));
+ }
+
public Optional<byte[]> readProvisionState(String provisionId) {
return curator.getData(provisionStatePath().append(provisionId));
}
@@ -264,10 +277,12 @@ public class CuratorDb {
return root.append("jobQueues").append(jobType.name());
}
- private Path upgradePerMinutePath() {
+ private Path upgradesPerMinutePath() {
return root.append("upgrader").append("upgradesPerMinute");
}
+ private Path versionStatusPath() { return root.append("versionStatus"); }
+
private Path provisionStatePath() {
return root.append("provisioning").append("states");
}
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/VersionStatusSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/VersionStatusSerializer.java
new file mode 100644
index 00000000000..e0bc592c82c
--- /dev/null
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/VersionStatusSerializer.java
@@ -0,0 +1,118 @@
+package com.yahoo.vespa.hosted.controller.persistence;
+
+import com.yahoo.component.Version;
+import com.yahoo.config.provision.ApplicationId;
+import com.yahoo.slime.ArrayTraverser;
+import com.yahoo.slime.Cursor;
+import com.yahoo.slime.Inspector;
+import com.yahoo.slime.Slime;
+import com.yahoo.vespa.hosted.controller.versions.DeploymentStatistics;
+import com.yahoo.vespa.hosted.controller.versions.VersionStatus;
+import com.yahoo.vespa.hosted.controller.versions.VespaVersion;
+
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Serializes VersionStatus to and from slime
+ *
+ * @author mpolden
+ */
+public class VersionStatusSerializer {
+
+ // VersionStatus fields
+ private static final String versionsField = "versions";
+
+ // VespaVersion fields
+ private static final String releaseCommitField = "releaseCommit";
+ private static final String releasedAtField = "releasedAt";
+ private static final String isCurrentSystemVersionField = "isCurrentSystemVersion";
+ private static final String deploymentStatisticsField = "deploymentStatistics";
+ private static final String confidenceField = "confidence";
+ private static final String configServersField = "configServerHostnames";
+
+ // DeploymentStatistics fields
+ private static final String versionField = "version";
+ private static final String failingField = "failing";
+ private static final String productionField = "production";
+
+ public Slime toSlime(VersionStatus status) {
+ Slime slime = new Slime();
+ Cursor root = slime.setObject();
+ versionsToSlime(status.versions(), root.setArray(versionsField));
+ return slime;
+ }
+
+ public VersionStatus fromSlime(Slime slime) {
+ Inspector root = slime.get();
+ return new VersionStatus(vespaVersionsFromSlime(root.field(versionsField)));
+ }
+
+ private void versionsToSlime(List<VespaVersion> versions, Cursor array) {
+ versions.forEach(version -> vespaVersionToSlime(version, array.addObject()));
+ }
+
+ private void vespaVersionToSlime(VespaVersion version, Cursor object) {
+ object.setString(releaseCommitField, version.releaseCommit());
+ object.setLong(releasedAtField, version.releasedAt().toEpochMilli());
+ object.setBool(isCurrentSystemVersionField, version.isCurrentSystemVersion());
+ deploymentStatisticsToSlime(version.statistics(), object.setObject(deploymentStatisticsField));
+ object.setString(confidenceField, version.confidence().name());
+ configServersToSlime(version.configServerHostnames(), object.setArray(configServersField));
+ }
+
+ private void configServersToSlime(Set<String> configServerHostnames, Cursor array) {
+ configServerHostnames.forEach(array::addString);
+ }
+
+ private void deploymentStatisticsToSlime(DeploymentStatistics statistics, Cursor object) {
+ object.setString(versionField, statistics.version().toString());
+ applicationsToSlime(statistics.failing(), object.setArray(failingField));
+ applicationsToSlime(statistics.production(), object.setArray(productionField));
+ }
+
+ private void applicationsToSlime(List<ApplicationId> applications, Cursor array) {
+ applications.forEach(application -> array.addString(application.serializedForm()));
+ }
+
+ private List<VespaVersion> vespaVersionsFromSlime(Inspector array) {
+ List<VespaVersion> versions = new ArrayList<>();
+ array.traverse((ArrayTraverser) (i, object) -> versions.add(vespaVersionFromSlime(object)));
+ return Collections.unmodifiableList(versions);
+ }
+
+ private VespaVersion vespaVersionFromSlime(Inspector object) {
+ return new VespaVersion(deploymentStatisticsFromSlime(object.field(deploymentStatisticsField)),
+ object.field(releaseCommitField).asString(),
+ Instant.ofEpochMilli(object.field(releasedAtField).asLong()),
+ object.field(isCurrentSystemVersionField).asBool(),
+ configServersFromSlime(object.field(configServersField)),
+ VespaVersion.Confidence.valueOf(object.field(confidenceField).asString())
+ );
+ }
+
+ private Set<String> configServersFromSlime(Inspector array) {
+ Set<String> configServerHostnames = new LinkedHashSet<>();
+ array.traverse((ArrayTraverser) (i, entry) -> configServerHostnames.add(entry.asString()));
+ return Collections.unmodifiableSet(configServerHostnames);
+ }
+
+ private DeploymentStatistics deploymentStatisticsFromSlime(Inspector object) {
+ return new DeploymentStatistics(Version.fromString(object.field(versionField).asString()),
+ applicationsFromSlime(object.field(failingField)),
+ applicationsFromSlime(object.field(productionField)));
+ }
+
+ private List<ApplicationId> applicationsFromSlime(Inspector array) {
+ List<ApplicationId> applications = new ArrayList<>();
+ array.traverse((ArrayTraverser) (i, entry) -> applications.add(
+ ApplicationId.fromSerializedForm(entry.asString()))
+ );
+ return Collections.unmodifiableList(applications);
+ }
+
+}
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java
index 42e89e7893f..cb6c47ad299 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java
@@ -2,6 +2,7 @@
package com.yahoo.vespa.hosted.controller.restapi.application;
import com.google.common.base.Joiner;
+import com.google.inject.Inject;
import com.yahoo.component.Version;
import com.yahoo.config.provision.ApplicationId;
import com.yahoo.config.provision.ApplicationName;
@@ -50,9 +51,6 @@ import com.yahoo.vespa.hosted.controller.api.identifiers.TenantId;
import com.yahoo.vespa.hosted.controller.api.identifiers.UserGroup;
import com.yahoo.vespa.hosted.controller.api.identifiers.UserId;
import com.yahoo.vespa.hosted.controller.api.integration.MetricsService;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.AthensPrincipal;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.NToken;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.ZmsException;
import com.yahoo.vespa.hosted.controller.api.integration.configserver.ConfigServerException;
import com.yahoo.vespa.hosted.controller.api.integration.configserver.Log;
import com.yahoo.vespa.hosted.controller.api.integration.routing.RotationStatus;
@@ -62,10 +60,15 @@ import com.yahoo.vespa.hosted.controller.application.Change;
import com.yahoo.vespa.hosted.controller.application.ClusterCost;
import com.yahoo.vespa.hosted.controller.application.ClusterUtilization;
import com.yahoo.vespa.hosted.controller.application.Deployment;
-import com.yahoo.vespa.hosted.controller.application.DeploymentJobs;
import com.yahoo.vespa.hosted.controller.application.DeploymentCost;
+import com.yahoo.vespa.hosted.controller.application.DeploymentJobs;
+import com.yahoo.vespa.hosted.controller.application.DeploymentMetrics;
import com.yahoo.vespa.hosted.controller.application.JobStatus;
import com.yahoo.vespa.hosted.controller.application.SourceRevision;
+import com.yahoo.vespa.hosted.controller.athenz.AthenzClientFactory;
+import com.yahoo.vespa.hosted.controller.athenz.AthenzPrincipal;
+import com.yahoo.vespa.hosted.controller.athenz.NToken;
+import com.yahoo.vespa.hosted.controller.athenz.ZmsException;
import com.yahoo.vespa.hosted.controller.restapi.ErrorResponse;
import com.yahoo.vespa.hosted.controller.restapi.MessageResponse;
import com.yahoo.vespa.hosted.controller.restapi.Path;
@@ -105,11 +108,15 @@ public class ApplicationApiHandler extends LoggingRequestHandler {
private final Controller controller;
private final Authorizer authorizer;
+ private final AthenzClientFactory athenzClientFactory;
- public ApplicationApiHandler(Executor executor, AccessLog accessLog, Controller controller, Authorizer authorizer) {
+ @Inject
+ public ApplicationApiHandler(Executor executor, AccessLog accessLog, Controller controller, Authorizer authorizer,
+ AthenzClientFactory athenzClientFactory) {
super(executor, accessLog);
this.controller = controller;
this.authorizer = authorizer;
+ this.athenzClientFactory = athenzClientFactory;
}
@Override
@@ -433,20 +440,13 @@ public class ApplicationApiHandler extends LoggingRequestHandler {
toSlime(appCost, costObject);
// Metrics
- com.yahoo.config.provision.ApplicationId applicationId = com.yahoo.config.provision.ApplicationId.from(tenantName, applicationName, instanceName);
- Zone zoneId = new Zone(Environment.from(environment), RegionName.from(region));
- try {
- MetricsService.DeploymentMetrics metrics = controller.metricsService().getDeploymentMetrics(applicationId, zoneId);
- Cursor metricsObject = response.setObject("metrics");
- metricsObject.setDouble("queriesPerSecond", metrics.queriesPerSecond());
- metricsObject.setDouble("writesPerSecond", metrics.writesPerSecond());
- metricsObject.setDouble("documentCount", metrics.documentCount());
- metricsObject.setDouble("queryLatencyMillis", metrics.queryLatencyMillis());
- metricsObject.setDouble("writeLatencyMillis", metrics.writeLatencyMillis());
- }
- catch (RuntimeException e) {
- log.log(Level.WARNING, "Failed getting Yamas metrics", Exceptions.toMessageString(e));
- }
+ DeploymentMetrics metrics = deployment.metrics();
+ Cursor metricsObject = response.setObject("metrics");
+ metricsObject.setDouble("queriesPerSecond", metrics.queriesPerSecond());
+ metricsObject.setDouble("writesPerSecond", metrics.writesPerSecond());
+ metricsObject.setDouble("documentCount", metrics.documentCount());
+ metricsObject.setDouble("queryLatencyMillis", metrics.queryLatencyMillis());
+ metricsObject.setDouble("writeLatencyMillis", metrics.writeLatencyMillis());
return new SlimeJsonResponse(slime);
}
@@ -760,10 +760,10 @@ public class ApplicationApiHandler extends LoggingRequestHandler {
Inspector deployOptions = SlimeUtils.jsonToSlime(dataParts.get("deployOptions")).get();
- DeployAuthorizer deployAuthorizer = new DeployAuthorizer(controller.athens(), controller.zoneRegistry());
+ DeployAuthorizer deployAuthorizer = new DeployAuthorizer(controller.zoneRegistry(), athenzClientFactory);
Tenant tenant = controller.tenants().tenant(new TenantId(tenantName)).orElseThrow(() -> new NotExistsException(new TenantId(tenantName)));
Principal principal = authorizer.getPrincipal(request);
- if (principal instanceof AthensPrincipal) {
+ if (principal instanceof AthenzPrincipal) {
deployAuthorizer.throwIfUnauthorizedForDeploy(principal,
Environment.from(environment),
tenant,
@@ -1084,8 +1084,8 @@ public class ApplicationApiHandler extends LoggingRequestHandler {
public static void toSlime(DeploymentCost deploymentCost, Cursor object) {
object.setLong("tco", (long)deploymentCost.getTco());
+ object.setLong("waste", (long)deploymentCost.getWaste());
object.setDouble("utilization", deploymentCost.getUtilization());
- object.setDouble("waste", deploymentCost.getWaste());
Cursor clustersObject = object.setObject("cluster");
for (Map.Entry<String, ClusterCost> clusterEntry : deploymentCost.getCluster().entrySet())
toSlime(clusterEntry.getValue(), clustersObject.setObject(clusterEntry.getKey()));
@@ -1096,8 +1096,12 @@ public class ApplicationApiHandler extends LoggingRequestHandler {
object.setString("resource", getResourceName(clusterCost.getResultUtilization()));
object.setDouble("utilization", clusterCost.getResultUtilization().getMaxUtilization());
object.setLong("tco", (int)clusterCost.getTco());
- object.setString("flavor", clusterCost.getClusterInfo().getFlavor());
object.setLong("waste", (int)clusterCost.getWaste());
+ object.setString("flavor", clusterCost.getClusterInfo().getFlavor());
+ object.setDouble("flavorCost", clusterCost.getClusterInfo().getFlavorCost());
+ object.setDouble("flavorCpu", clusterCost.getClusterInfo().getFlavorCPU());
+ object.setDouble("flavorMem", clusterCost.getClusterInfo().getFlavorMem());
+ object.setDouble("flavorDisk", clusterCost.getClusterInfo().getFlavorDisk());
object.setString("type", clusterCost.getClusterInfo().getClusterType().name());
Cursor utilObject = object.setObject("util");
utilObject.setDouble("cpu", clusterCost.getResultUtilization().getCpu());
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/Authorizer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/Authorizer.java
index 8dff39779b9..84e731ec994 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/Authorizer.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/Authorizer.java
@@ -11,10 +11,10 @@ import com.yahoo.vespa.hosted.controller.api.identifiers.TenantId;
import com.yahoo.vespa.hosted.controller.api.identifiers.UserGroup;
import com.yahoo.vespa.hosted.controller.api.identifiers.UserId;
import com.yahoo.vespa.hosted.controller.api.integration.entity.EntityService;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.ZmsClientFactory;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.AthensPrincipal;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.Athens;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.NToken;
+import com.yahoo.vespa.hosted.controller.athenz.AthenzClientFactory;
+import com.yahoo.vespa.hosted.controller.athenz.AthenzPrincipal;
+import com.yahoo.vespa.hosted.controller.athenz.AthenzUtils;
+import com.yahoo.vespa.hosted.controller.athenz.NToken;
import com.yahoo.vespa.hosted.controller.common.ContextAttributes;
import com.yahoo.vespa.hosted.controller.restapi.filter.NTokenRequestFilter;
import com.yahoo.vespa.hosted.controller.restapi.filter.UnauthenticatedUserPrincipal;
@@ -47,15 +47,13 @@ public class Authorizer {
new UserId("screwdriver-test"));
private final Controller controller;
- private final ZmsClientFactory zmsClientFactory;
+ private final AthenzClientFactory athenzClientFactory;
private final EntityService entityService;
- private final Athens athens;
- public Authorizer(Controller controller, EntityService entityService) {
+ public Authorizer(Controller controller, EntityService entityService, AthenzClientFactory athenzClientFactory) {
this.controller = controller;
- this.zmsClientFactory = controller.athens().zmsClientFactory();
+ this.athenzClientFactory = athenzClientFactory;
this.entityService = entityService;
- this.athens = controller.athens();
}
public void throwIfUnauthorized(TenantId tenantId, HttpRequest request) throws ForbiddenException {
@@ -90,19 +88,19 @@ public class Authorizer {
public Optional<NToken> getNToken(HttpRequest request) {
String nTokenHeader = (String)request.getJDiscRequest().context().get(NTokenRequestFilter.NTOKEN_HEADER);
- return Optional.ofNullable(nTokenHeader).map(athens::nTokenFrom);
+ return Optional.ofNullable(nTokenHeader).map(NToken::new);
}
public boolean isSuperUser(HttpRequest request) {
// TODO Check membership of admin role in Vespa's Athens domain
- return isMemberOfVespaBouncerGroup(request) || isScrewdriverPrincipal(athens, getPrincipal(request));
+ return isMemberOfVespaBouncerGroup(request) || isScrewdriverPrincipal(getPrincipal(request));
}
- public static boolean isScrewdriverPrincipal(Athens athens, Principal principal) {
+ public static boolean isScrewdriverPrincipal(Principal principal) {
if (principal instanceof UnauthenticatedUserPrincipal) // Host-based authentication
return SCREWDRIVER_USERS.contains(new UserId(principal.getName()));
- else if (principal instanceof AthensPrincipal)
- return ((AthensPrincipal)principal).getDomain().equals(athens.screwdriverDomain());
+ else if (principal instanceof AthenzPrincipal)
+ return ((AthenzPrincipal)principal).getDomain().equals(AthenzUtils.SCREWDRIVER_DOMAIN);
else
return false;
}
@@ -126,13 +124,13 @@ public class Authorizer {
}
private boolean isAthensTenantAdmin(UserId userId, AthensDomain tenantDomain) {
- return zmsClientFactory.createClientWithServicePrincipal()
- .hasTenantAdminAccess(athens.principalFrom(userId), tenantDomain);
+ return athenzClientFactory.createZmsClientWithServicePrincipal()
+ .hasTenantAdminAccess(AthenzUtils.createPrincipal(userId), tenantDomain);
}
public boolean isAthensDomainAdmin(UserId userId, AthensDomain tenantDomain) {
- return zmsClientFactory.createClientWithServicePrincipal()
- .isDomainAdmin(athens.principalFrom(userId), tenantDomain);
+ return athenzClientFactory.createZmsClientWithServicePrincipal()
+ .isDomainAdmin(AthenzUtils.createPrincipal(userId), tenantDomain);
}
public boolean isGroupMember(UserId userId, UserGroup userGroup) {
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/DeployAuthorizer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/DeployAuthorizer.java
index 5c7cdfdae0a..fa82c9239df 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/DeployAuthorizer.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/DeployAuthorizer.java
@@ -7,11 +7,12 @@ import com.yahoo.vespa.hosted.controller.api.Tenant;
import com.yahoo.vespa.hosted.controller.api.identifiers.AthensDomain;
import com.yahoo.vespa.hosted.controller.api.identifiers.ScrewdriverId;
import com.yahoo.vespa.hosted.controller.api.identifiers.UserId;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.ApplicationAction;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.Athens;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.AthensPrincipal;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.ZmsException;
import com.yahoo.vespa.hosted.controller.api.integration.zone.ZoneRegistry;
+import com.yahoo.vespa.hosted.controller.athenz.ApplicationAction;
+import com.yahoo.vespa.hosted.controller.athenz.AthenzClientFactory;
+import com.yahoo.vespa.hosted.controller.athenz.AthenzPrincipal;
+import com.yahoo.vespa.hosted.controller.athenz.AthenzUtils;
+import com.yahoo.vespa.hosted.controller.athenz.ZmsException;
import com.yahoo.vespa.hosted.controller.restapi.filter.UnauthenticatedUserPrincipal;
import javax.ws.rs.ForbiddenException;
@@ -30,12 +31,12 @@ public class DeployAuthorizer {
private static final Logger log = Logger.getLogger(DeployAuthorizer.class.getName());
- private final Athens athens;
private final ZoneRegistry zoneRegistry;
+ private final AthenzClientFactory athenzClientFactory;
- public DeployAuthorizer(Athens athens, ZoneRegistry zoneRegistry) {
- this.athens = athens;
+ public DeployAuthorizer(ZoneRegistry zoneRegistry, AthenzClientFactory athenzClientFactory) {
this.zoneRegistry = zoneRegistry;
+ this.athenzClientFactory = athenzClientFactory;
}
public void throwIfUnauthorizedForDeploy(Principal principal,
@@ -50,7 +51,7 @@ public class DeployAuthorizer {
private boolean athensCredentialsRequired(Environment environment, Tenant tenant, ApplicationId applicationId, Principal principal) {
if (!environmentRequiresAuthorization(environment)) return false;
- if (! isScrewdriverPrincipal(athens, principal))
+ if (! isScrewdriverPrincipal(principal))
throw loggedForbiddenException(
"Principal '%s' is not a screwdriver principal, and does not have deploy access to application '%s'",
principal.getName(), applicationId.toShortString());
@@ -62,10 +63,10 @@ public class DeployAuthorizer {
// TODO: inline when deployment via ssh is removed
private void checkAthensCredentials(Principal principal, Tenant tenant, ApplicationId applicationId) {
AthensDomain domain = tenant.getAthensDomain().get();
- if (! (principal instanceof AthensPrincipal))
+ if (! (principal instanceof AthenzPrincipal))
throw loggedForbiddenException("Principal '%s' is not authenticated.", principal.getName());
- AthensPrincipal athensPrincipal = (AthensPrincipal)principal;
+ AthenzPrincipal athensPrincipal = (AthenzPrincipal)principal;
if ( ! hasDeployAccessToAthensApplication(athensPrincipal, domain, applicationId))
throw loggedForbiddenException(
"Screwdriver principal '%1$s' does not have deploy access to '%2$s'. " +
@@ -95,14 +96,14 @@ public class DeployAuthorizer {
if (athensCredentialsRequired(environment, tenant, applicationId, principal)) {
ScrewdriverId screwdriverId = optionalScrewdriverId.orElseThrow(
() -> loggedForbiddenException("Screwdriver id must be provided when deploying from Screwdriver."));
- principal = athens.principalFrom(screwdriverId);
+ principal = AthenzUtils.createPrincipal(screwdriverId);
checkAthensCredentials(principal, tenant, applicationId);
}
}
- private boolean hasDeployAccessToAthensApplication(AthensPrincipal principal, AthensDomain domain, ApplicationId applicationId) {
+ private boolean hasDeployAccessToAthensApplication(AthenzPrincipal principal, AthensDomain domain, ApplicationId applicationId) {
try {
- return athens.zmsClientFactory().createClientWithServicePrincipal()
+ return athenzClientFactory.createZmsClientWithServicePrincipal()
.hasApplicationAccess(
principal,
ApplicationAction.deploy,
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/filter/NTokenRequestFilter.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/filter/NTokenRequestFilter.java
index 0138d3ae65c..443a53b476d 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/filter/NTokenRequestFilter.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/filter/NTokenRequestFilter.java
@@ -5,7 +5,7 @@ import com.google.inject.Inject;
import com.yahoo.jdisc.handler.ResponseHandler;
import com.yahoo.jdisc.http.filter.DiscFilterRequest;
import com.yahoo.jdisc.http.filter.SecurityRequestFilter;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.Athens;
+import com.yahoo.vespa.hosted.controller.athenz.config.AthenzConfig;
import com.yahoo.yolean.chain.After;
/**
@@ -16,16 +16,16 @@ public class NTokenRequestFilter implements SecurityRequestFilter {
public static final String NTOKEN_HEADER = "com.yahoo.vespa.hosted.controller.restapi.filter.NTokenRequestFilter.ntoken";
- private final Athens athens;
+ private final String principalHeaderName;
@Inject
- public NTokenRequestFilter(Athens athens) {
- this.athens = athens;
+ public NTokenRequestFilter(AthenzConfig config) {
+ this.principalHeaderName = config.principalHeaderName();
}
@Override
public void filter(DiscFilterRequest request, ResponseHandler responseHandler) {
- String nToken = request.getHeader(athens.principalTokenHeader());
+ String nToken = request.getHeader(principalHeaderName);
if (nToken != null) {
request.setAttribute(NTOKEN_HEADER, nToken);
}
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/DeploymentStatistics.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/DeploymentStatistics.java
index fbd1a74c12c..6174a017a54 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/DeploymentStatistics.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/DeploymentStatistics.java
@@ -6,6 +6,7 @@ import com.yahoo.component.Version;
import com.yahoo.config.provision.ApplicationId;
import java.util.List;
+import java.util.Objects;
/**
* Statistics about deployments on a platform version. This is immutable.
@@ -18,8 +19,9 @@ public class DeploymentStatistics {
private final ImmutableList<ApplicationId> failing;
private final ImmutableList<ApplicationId> production;
- private DeploymentStatistics(Version version,
- List<ApplicationId> failingApplications, List<ApplicationId> production) {
+ /** DO NOT USE. Public for serialization purposes */
+ public DeploymentStatistics(Version version, List<ApplicationId> failingApplications,
+ List<ApplicationId> production) {
this.version = version;
this.failing = ImmutableList.copyOf(failingApplications);
this.production = ImmutableList.copyOf(production);
@@ -59,4 +61,18 @@ public class DeploymentStatistics {
return b.build();
}
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (!(o instanceof DeploymentStatistics)) return false;
+ DeploymentStatistics that = (DeploymentStatistics) o;
+ return Objects.equals(version, that.version) &&
+ Objects.equals(failing, that.failing) &&
+ Objects.equals(production, that.production);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(version, failing, production);
+ }
}
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/VersionStatus.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/VersionStatus.java
index c3f3773cde6..c3b2da42861 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/VersionStatus.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/VersionStatus.java
@@ -5,9 +5,9 @@ import com.google.common.collect.ImmutableList;
import com.yahoo.collections.ListMap;
import com.yahoo.component.Version;
import com.yahoo.component.Vtag;
-import com.yahoo.vespa.hosted.controller.api.integration.github.GitSha;
import com.yahoo.vespa.hosted.controller.Application;
import com.yahoo.vespa.hosted.controller.Controller;
+import com.yahoo.vespa.hosted.controller.api.integration.github.GitSha;
import com.yahoo.vespa.hosted.controller.application.ApplicationList;
import com.yahoo.vespa.hosted.controller.application.Deployment;
import com.yahoo.vespa.hosted.controller.application.DeploymentJobs;
@@ -46,7 +46,7 @@ public class VersionStatus {
private final ImmutableList<VespaVersion> versions;
- /** Create a version status. DO NOT USE: Public for testing only */
+ /** Create a version status. DO NOT USE: Public for testing and serialization only */
public VersionStatus(List<VespaVersion> versions) {
this.versions = ImmutableList.copyOf(versions);
}
@@ -175,11 +175,30 @@ public class VersionStatus {
Collection<String> configServerHostnames,
Controller controller) {
GitSha gitSha = controller.gitHub().getCommit(VESPA_REPO_OWNER, VESPA_REPO, statistics.version().toFullString());
+ Instant releasedAt = Instant.ofEpochMilli(gitSha.commit.author.date.getTime());
+ VespaVersion.Confidence confidence;
+ // Always compute confidence for system version
+ if (isSystemVersion) {
+ confidence = VespaVersion.confidenceFrom(statistics, controller, releasedAt);
+ } else {
+ // Keep existing confidence for non-system versions if already computed
+ confidence = confidenceFor(statistics.version(), controller)
+ .orElse(VespaVersion.confidenceFrom(statistics, controller, releasedAt));
+ }
return new VespaVersion(statistics,
- gitSha.sha, Instant.ofEpochMilli(gitSha.commit.author.date.getTime()),
+ gitSha.sha, releasedAt,
isSystemVersion,
configServerHostnames,
- controller);
+ confidence
+ );
+ }
+
+ /** Returns the current confidence for the given version */
+ private static Optional<VespaVersion.Confidence> confidenceFor(Version version, Controller controller) {
+ return controller.versionStatus().versions().stream()
+ .filter(v -> version.equals(v.versionNumber()))
+ .map(VespaVersion::confidence)
+ .findFirst();
}
}
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/VespaVersion.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/VespaVersion.java
index 3208f4d09c6..c1b9c045fbe 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/VespaVersion.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/VespaVersion.java
@@ -4,7 +4,6 @@ package com.yahoo.vespa.hosted.controller.versions;
import com.google.common.collect.ImmutableSet;
import com.yahoo.component.Version;
import com.yahoo.component.Vtag;
-import com.yahoo.config.application.api.DeploymentSpec.UpgradePolicy;
import com.yahoo.vespa.hosted.controller.Controller;
import com.yahoo.vespa.hosted.controller.application.ApplicationList;
@@ -12,6 +11,8 @@ import java.time.Instant;
import java.util.Collection;
import java.util.Set;
+import static com.yahoo.config.application.api.DeploymentSpec.UpgradePolicy;
+
/**
* Information about a particular Vespa version.
* VespaVersions are identified by their version number and ordered by increasing version numbers.
@@ -26,23 +27,22 @@ public class VespaVersion implements Comparable<VespaVersion> {
private final Instant releasedAt;
private final boolean isCurrentSystemVersion;
private final DeploymentStatistics statistics;
- private final Confidence confidence;
private final ImmutableSet<String> configServerHostnames;
+ private final Confidence confidence;
- public VespaVersion(DeploymentStatistics statistics, String releaseCommit, Instant releasedAt,
+ public VespaVersion(DeploymentStatistics statistics, String releaseCommit, Instant releasedAt,
boolean isCurrentSystemVersion, Collection<String> configServerHostnames,
- Controller controller) {
+ Confidence confidence) {
this.statistics = statistics;
this.releaseCommit = releaseCommit;
this.releasedAt = releasedAt;
this.isCurrentSystemVersion = isCurrentSystemVersion;
this.configServerHostnames = ImmutableSet.copyOf(configServerHostnames);
- this.confidence = deduceConfidenceFrom(statistics, controller, releasedAt);
+ this.confidence = confidence;
}
- private static Confidence deduceConfidenceFrom(DeploymentStatistics statistics,
- Controller controller,
- Instant releasedAt) {
+ public static Confidence confidenceFrom(DeploymentStatistics statistics, Controller controller,
+ Instant releasedAt) {
// 'production on this': All deployment jobs upgrading to this version have completed without failure
ApplicationList productionOnThis = ApplicationList.from(statistics.production(), controller.applications())
.notUpgradingTo(statistics.version())
diff --git a/controller-server/src/main/resources/configdefinitions/athenz.def b/controller-server/src/main/resources/configdefinitions/athenz.def
new file mode 100644
index 00000000000..4e27e3ebd07
--- /dev/null
+++ b/controller-server/src/main/resources/configdefinitions/athenz.def
@@ -0,0 +1,26 @@
+# Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+namespace=vespa.hosted.controller.athenz.config
+
+# Principal header name
+principalHeaderName string default="Athenz-Principal-Auth"
+
+# URL to ZMS API endpoint
+zmsUrl string
+
+# URL to ZTS API endpoint
+ztsUrl string
+
+# Athenz domain for controller identity. The domain is also used for Athenz tenancy integration.
+domain string
+
+# Athenz service name for controller identity
+service.name string
+
+# Athenz service public key id
+service.publicKeyId string
+
+# Version of Athenz service private key
+service.privateKeyVersion int
+
+# Name of Athenz service private key secret
+service.privateKeySecretName string
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ConfigServerClientMock.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ConfigServerClientMock.java
index 9db852374b8..9228e83bbc6 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ConfigServerClientMock.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ConfigServerClientMock.java
@@ -7,16 +7,16 @@ import com.fasterxml.jackson.databind.node.ObjectNode;
import com.yahoo.component.AbstractComponent;
import com.yahoo.component.Version;
import com.yahoo.config.provision.ApplicationId;
-import com.yahoo.vespa.hosted.controller.api.integration.configserver.ConfigServerClient;
-import com.yahoo.vespa.hosted.controller.api.integration.configserver.Log;
-import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeList;
-import com.yahoo.vespa.hosted.controller.api.integration.configserver.PrepareResponse;
import com.yahoo.vespa.hosted.controller.api.application.v4.model.DeployOptions;
import com.yahoo.vespa.hosted.controller.api.application.v4.model.EndpointStatus;
import com.yahoo.vespa.hosted.controller.api.application.v4.model.configserverbindings.ConfigChangeActions;
import com.yahoo.vespa.hosted.controller.api.identifiers.DeploymentId;
import com.yahoo.vespa.hosted.controller.api.identifiers.Hostname;
import com.yahoo.vespa.hosted.controller.api.identifiers.TenantId;
+import com.yahoo.vespa.hosted.controller.api.integration.configserver.ConfigServerClient;
+import com.yahoo.vespa.hosted.controller.api.integration.configserver.Log;
+import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeList;
+import com.yahoo.vespa.hosted.controller.api.integration.configserver.PrepareResponse;
import com.yahoo.vespa.hosted.controller.api.rotation.Rotation;
import com.yahoo.vespa.serviceview.bindings.ApplicationView;
import com.yahoo.vespa.serviceview.bindings.ClusterView;
@@ -28,7 +28,6 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@@ -40,15 +39,11 @@ import java.util.UUID;
*/
public class ConfigServerClientMock extends AbstractComponent implements ConfigServerClient {
- private Map<ApplicationId, byte[]> applicationContent = new HashMap<>();
- private Map<ApplicationId, String> applicationInstances = new HashMap<>();
- private Map<ApplicationId, Boolean> applicationActivated = new HashMap<>();
- private Set<ApplicationId> applicationRestarted = new HashSet<>();
- private Set<String> hostsExplicitlyRestarted = new HashSet<>();
- private Map<String, EndpointStatus> endpoints = new HashMap<>();
-
- private Map<URI, Version> configServerVersions = new HashMap<>();
- private Version defaultConfigServerVersion = new Version(6, 1, 0);
+ private final Map<ApplicationId, String> applicationInstances = new HashMap<>();
+ private final Map<ApplicationId, Boolean> applicationActivated = new HashMap<>();
+ private final Map<String, EndpointStatus> endpoints = new HashMap<>();
+ private final Map<URI, Version> versions = new HashMap<>();
+ private Version defaultVersion = new Version(6, 1, 0);
/** The exception to throw on the next prepare run, or null to continue normally */
private RuntimeException prepareException = null;
@@ -64,18 +59,27 @@ public class ConfigServerClientMock extends AbstractComponent implements ConfigS
public Map<ApplicationId, Boolean> activated() {
return Collections.unmodifiableMap(applicationActivated);
}
+
+ public void throwOnNextPrepare(RuntimeException prepareException) {
+ this.prepareException = prepareException;
+ }
+
+ /**
+ * Returns the (initially empty) mutable map of config server urls to versions.
+ * This API will return defaultVersion as response to any version(url) call for versions not added to the map.
+ */
+ public Map<URI, Version> versions() {
+ return versions;
+ }
@Override
public PreparedApplication prepare(DeploymentId deployment, DeployOptions deployOptions, Set<String> rotationCnames, Set<Rotation> rotations, byte[] content) {
lastPrepareVersion = deployOptions.vespaVersion.map(Version::new);
-
if (prepareException != null) {
RuntimeException prepareException = this.prepareException;
this.prepareException = null;
throw prepareException;
}
-
- applicationContent.put(deployment.applicationId(), content);
applicationActivated.put(deployment.applicationId(), false);
applicationInstances.put(deployment.applicationId(), UUID.randomUUID() + ":4080");
@@ -111,20 +115,8 @@ public class ConfigServerClientMock extends AbstractComponent implements ConfigS
};
}
- public void throwOnNextPrepare(RuntimeException prepareException) {
- this.prepareException = prepareException;
- }
-
- /**
- * Returns the (initially empty) mutable map of config server urls to versions.
- * This API will return defaultConfigserverVersion as response to any version(url) call for versions not added to the map.
- */
- public Map<URI, Version> configServerVersions() {
- return configServerVersions;
- }
-
- public Version getDefaultConfigServerVersion() { return defaultConfigServerVersion; }
- public void setDefaultConfigServerVersion(Version version) { defaultConfigServerVersion = version; }
+ /** Set the default config server version */
+ public void setDefaultVersion(Version version) { this.defaultVersion = version; }
@Override
public List<String> getNodeQueryHost(DeploymentId deployment, String type) {
@@ -137,16 +129,11 @@ public class ConfigServerClientMock extends AbstractComponent implements ConfigS
@Override
public void restart(DeploymentId deployment, Optional<Hostname> hostname) {
- applicationRestarted.add(deployment.applicationId());
- if (hostname.isPresent()) {
- hostsExplicitlyRestarted.add(hostname.get().id());
- }
}
@Override
public void deactivate(DeploymentId deployment) {
applicationActivated.remove(deployment.applicationId());
- applicationContent.remove(deployment.applicationId());
applicationInstances.remove(deployment.applicationId());
}
@@ -197,7 +184,7 @@ public class ConfigServerClientMock extends AbstractComponent implements ConfigS
@Override
public Version version(URI configServerURI) {
- return configServerVersions.getOrDefault(configServerURI, defaultConfigServerVersion);
+ return versions.getOrDefault(configServerURI, defaultVersion);
}
@Override
@@ -207,10 +194,8 @@ public class ConfigServerClientMock extends AbstractComponent implements ConfigS
@Override
public EndpointStatus getGlobalRotationStatus(DeploymentId deployment, String endpoint) {
- EndpointStatus result = new EndpointStatus(EndpointStatus.Status.in, "", "", 1497618757l);
- return endpoints.containsKey(endpoint)
- ? endpoints.get(endpoint)
- : result;
+ EndpointStatus result = new EndpointStatus(EndpointStatus.Status.in, "", "", 1497618757L);
+ return endpoints.getOrDefault(endpoint, result);
}
@Override
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTest.java
index 6fc787d940e..408be6a49c2 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTest.java
@@ -24,9 +24,6 @@ import com.yahoo.vespa.hosted.controller.api.identifiers.PropertyId;
import com.yahoo.vespa.hosted.controller.api.identifiers.TenantId;
import com.yahoo.vespa.hosted.controller.api.identifiers.UserGroup;
import com.yahoo.vespa.hosted.controller.api.integration.BuildService.BuildJob;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.NToken;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.mock.AthensDbMock;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.mock.NTokenMock;
import com.yahoo.vespa.hosted.controller.api.integration.dns.Record;
import com.yahoo.vespa.hosted.controller.application.ApplicationPackage;
import com.yahoo.vespa.hosted.controller.application.ApplicationRevision;
@@ -36,6 +33,8 @@ import com.yahoo.vespa.hosted.controller.application.DeploymentJobs.JobError;
import com.yahoo.vespa.hosted.controller.application.DeploymentJobs.JobReport;
import com.yahoo.vespa.hosted.controller.application.DeploymentJobs.JobType;
import com.yahoo.vespa.hosted.controller.application.JobStatus;
+import com.yahoo.vespa.hosted.controller.athenz.NToken;
+import com.yahoo.vespa.hosted.controller.athenz.mock.AthensDbMock;
import com.yahoo.vespa.hosted.controller.deployment.ApplicationPackageBuilder;
import com.yahoo.vespa.hosted.controller.deployment.BuildSystem;
import com.yahoo.vespa.hosted.controller.deployment.DeploymentTester;
@@ -260,16 +259,19 @@ public class ControllerTest {
Version systemVersion = controller.versionStatus().systemVersion().get().versionNumber();
Version newSystemVersion = new Version(systemVersion.getMajor(), systemVersion.getMinor()+1, 0);
VespaVersion newSystemVespaVersion = new VespaVersion(DeploymentStatistics.empty(newSystemVersion),
- "commit1",
+ "commit1",
Instant.now(),
true,
Collections.emptyList(),
- controller);
+ VespaVersion.Confidence.low
+ );
List<VespaVersion> versions = new ArrayList<>(controller.versionStatus().versions());
for (int i = 0; i < versions.size(); i++) {
VespaVersion c = versions.get(i);
if (c.isCurrentSystemVersion())
- versions.set(i, new VespaVersion(c.statistics(), c.releaseCommit(), c.releasedAt(), false, c.configServerHostnames(), controller));
+ versions.set(i, new VespaVersion(c.statistics(), c.releaseCommit(), c.releasedAt(),
+ false, c.configServerHostnames(),
+ c.confidence()));
}
versions.add(newSystemVespaVersion);
controller.updateVersionStatus(new VersionStatus(versions));
@@ -378,7 +380,7 @@ public class ControllerTest {
assertFalse(mockDomain.isVespaTenant);
// Migrate tenant to Athens
- NToken nToken = new NTokenMock("token");
+ NToken nToken = TestIdentities.userNToken;
tester.controller().tenants().migrateTenantToAthens(
tenantId, athensDomain, new PropertyId("1567"), new Property("vespa_dev.no"), nToken);
@@ -542,7 +544,7 @@ public class ControllerTest {
// Current system version, matches version in test data
Version version = Version.fromString("6.141.117");
- tester.configServer().setDefaultConfigServerVersion(version);
+ tester.configServer().setDefaultVersion(version);
tester.updateVersionStatus(version);
assertEquals(version, tester.controller().versionStatus().systemVersion().get().versionNumber());
@@ -572,7 +574,7 @@ public class ControllerTest {
// New version is released
version = Version.fromString("6.142.1");
- tester.configServer().setDefaultConfigServerVersion(version);
+ tester.configServer().setDefaultVersion(version);
tester.updateVersionStatus(version);
assertEquals(version, tester.controller().versionStatus().systemVersion().get().versionNumber());
tester.upgrader().maintain();
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTester.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTester.java
index 5184cde79c2..8e1234b7e96 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTester.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTester.java
@@ -21,8 +21,6 @@ import com.yahoo.vespa.hosted.controller.api.identifiers.Property;
import com.yahoo.vespa.hosted.controller.api.identifiers.PropertyId;
import com.yahoo.vespa.hosted.controller.api.identifiers.ScrewdriverId;
import com.yahoo.vespa.hosted.controller.api.identifiers.TenantId;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.mock.AthensDbMock;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.mock.AthensMock;
import com.yahoo.vespa.hosted.controller.api.integration.chef.ChefMock;
import com.yahoo.vespa.hosted.controller.api.integration.dns.MemoryNameService;
import com.yahoo.vespa.hosted.controller.api.integration.entity.MemoryEntityService;
@@ -30,6 +28,8 @@ import com.yahoo.vespa.hosted.controller.api.integration.github.GitHubMock;
import com.yahoo.vespa.hosted.controller.api.integration.jira.JiraMock;
import com.yahoo.vespa.hosted.controller.api.integration.routing.MemoryGlobalRoutingService;
import com.yahoo.vespa.hosted.controller.application.ApplicationPackage;
+import com.yahoo.vespa.hosted.controller.athenz.mock.AthensDbMock;
+import com.yahoo.vespa.hosted.controller.athenz.mock.AthenzClientFactoryMock;
import com.yahoo.vespa.hosted.controller.integration.MockMetricsService;
import com.yahoo.vespa.hosted.controller.persistence.ControllerDb;
import com.yahoo.vespa.hosted.controller.persistence.CuratorDb;
@@ -214,7 +214,7 @@ public final class ControllerTester {
new MockRoutingGenerator(),
new ChefMock(),
clock,
- new AthensMock(athensDb));
+ new AthenzClientFactoryMock(athensDb));
controller.updateVersionStatus(VersionStatus.compute(controller));
return controller;
}
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/TestIdentities.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/TestIdentities.java
index 1f52ebcadb7..355b63335c0 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/TestIdentities.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/TestIdentities.java
@@ -1,7 +1,6 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.hosted.controller;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.mock.NTokenMock;
import com.yahoo.vespa.hosted.controller.api.Tenant;
import com.yahoo.vespa.hosted.controller.api.identifiers.EnvironmentId;
import com.yahoo.vespa.hosted.controller.api.identifiers.InstanceId;
@@ -10,7 +9,9 @@ import com.yahoo.vespa.hosted.controller.api.identifiers.RegionId;
import com.yahoo.vespa.hosted.controller.api.identifiers.TenantId;
import com.yahoo.vespa.hosted.controller.api.identifiers.UserGroup;
import com.yahoo.vespa.hosted.controller.api.identifiers.UserId;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.NToken;
+import com.yahoo.vespa.hosted.controller.athenz.AthenzUtils;
+import com.yahoo.vespa.hosted.controller.athenz.NToken;
+import com.yahoo.vespa.hosted.controller.athenz.filter.AthenzTestUtils;
/**
* @author Tony Vaagenes
@@ -33,6 +34,8 @@ public class TestIdentities {
public static Tenant tenant = Tenant.createOpsDbTenant(tenantId, userGroup1, property);
- public static NToken userNToken = new NTokenMock("token");
+ public static NToken userNToken = new NToken.Builder(
+ "U1", AthenzUtils.createPrincipal(userId), AthenzTestUtils.generateRsaKeypair().getPrivate(), "0")
+ .build();
}
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/application/ClusterCostTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/application/ClusterCostTest.java
new file mode 100644
index 00000000000..313f565f546
--- /dev/null
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/application/ClusterCostTest.java
@@ -0,0 +1,35 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.hosted.controller.application;
+
+import com.yahoo.config.provision.ClusterSpec;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author smorgrav
+ */
+public class ClusterCostTest {
+
+ @Test
+ public void clusterCost() throws Exception {
+ List<String> hostnames = new ArrayList<>();
+ hostnames.add("host1");
+ hostnames.add("host2");
+ ClusterInfo info = new ClusterInfo("test", 100, 10, 10, 10, ClusterSpec.Type.container, hostnames);
+ ClusterUtilization util = new ClusterUtilization(0.3, 0.2, 0.5, 0.1);
+ ClusterCost cost = new ClusterCost(info, util);
+
+ // CPU is fully utilized
+ Assert.assertEquals(200, cost.getTco(), Double.MIN_VALUE);
+ Assert.assertEquals(0, cost.getWaste(), Double.MIN_VALUE);
+
+ // Set Disk as the most utilized resource
+ util = new ClusterUtilization(0.3, 0.1, 0.5, 0.1);
+ cost = new ClusterCost(info, util);
+ Assert.assertEquals(200, cost.getTco(), Double.MIN_NORMAL); // TCO is independent of utilization
+ Assert.assertEquals(57.1428571429, cost.getWaste(), 0.001); // Waste is not independent
+ }
+} \ No newline at end of file
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/application/DeploymentCostTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/application/DeploymentCostTest.java
new file mode 100644
index 00000000000..2e58253d768
--- /dev/null
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/application/DeploymentCostTest.java
@@ -0,0 +1,38 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.hosted.controller.application;
+
+import com.yahoo.config.provision.ClusterSpec;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author smorgrav
+ */
+public class DeploymentCostTest {
+
+ @Test
+ public void deploymentCost() {
+ Map<String, ClusterCost> clusters = new HashMap<>();
+ clusters.put("cluster1", createClusterCost(100, 0.2));
+ clusters.put("cluster2", createClusterCost(50, 0.1));
+
+ DeploymentCost cost = new DeploymentCost(clusters);
+ Assert.assertEquals(300, cost.getTco(), Double.MIN_VALUE); // 2*100 + 2*50
+ Assert.assertEquals(28.5714285714, cost.getWaste(), 0.001); // from cluster2
+ Assert.assertEquals(0.7142857142857143, cost.getUtilization(), Double.MIN_VALUE); // from cluster2
+ }
+
+ private ClusterCost createClusterCost(int flavorCost, double cpuUtil) {
+ List<String> hostnames = new ArrayList<>();
+ hostnames.add("host1");
+ hostnames.add("host2");
+ ClusterInfo info = new ClusterInfo("test", flavorCost, 10, 10, 10, ClusterSpec.Type.container, hostnames);
+ ClusterUtilization util = new ClusterUtilization(0.3, cpuUtil, 0.5, 0.1);
+ return new ClusterCost(info, util);
+ }
+} \ No newline at end of file
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/athenz/filter/AthenzPrincipalFilterTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/athenz/filter/AthenzPrincipalFilterTest.java
new file mode 100644
index 00000000000..20db038485d
--- /dev/null
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/athenz/filter/AthenzPrincipalFilterTest.java
@@ -0,0 +1,123 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.hosted.controller.athenz.filter;
+
+import com.yahoo.jdisc.Response;
+import com.yahoo.jdisc.handler.ContentChannel;
+import com.yahoo.jdisc.handler.ReadableContentChannel;
+import com.yahoo.jdisc.handler.ResponseHandler;
+import com.yahoo.jdisc.http.filter.DiscFilterRequest;
+import com.yahoo.vespa.hosted.controller.api.identifiers.UserId;
+import com.yahoo.vespa.hosted.controller.athenz.AthenzPrincipal;
+import com.yahoo.vespa.hosted.controller.athenz.AthenzUtils;
+import com.yahoo.vespa.hosted.controller.athenz.InvalidTokenException;
+import com.yahoo.vespa.hosted.controller.athenz.NToken;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.UncheckedIOException;
+import java.util.Objects;
+
+import static com.yahoo.jdisc.Response.Status.UNAUTHORIZED;
+import static java.util.stream.Collectors.joining;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.junit.Assert.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+/**
+ * @author bjorncs
+ */
+public class AthenzPrincipalFilterTest {
+
+ private static final NToken NTOKEN = createDummyToken();
+ private static final String ATHENZ_PRINCIPAL_HEADER = "Athenz-Principal-Auth";
+
+ private NTokenValidator validator;
+ private AthenzPrincipal principal;
+
+ @Before
+ public void before() {
+ validator = mock(NTokenValidator.class);
+ principal = AthenzUtils.createPrincipal(new UserId("bob"));
+ }
+
+ @Test
+ public void valid_ntoken_is_accepted() throws Exception {
+ DiscFilterRequest request = mock(DiscFilterRequest.class);
+ when(request.getHeader(ATHENZ_PRINCIPAL_HEADER)).thenReturn(NTOKEN.getToken());
+
+ when(validator.validate(NTOKEN)).thenReturn(principal);
+
+ AthenzPrincipalFilter filter = new AthenzPrincipalFilter(validator, Runnable::run, ATHENZ_PRINCIPAL_HEADER);
+ filter.filter(request, new ResponseHandlerMock());
+
+ verify(request).setUserPrincipal(principal);
+ }
+
+ @Test
+ public void missing_token_is_unauthorized() throws Exception {
+ DiscFilterRequest request = mock(DiscFilterRequest.class);
+ when(request.getHeader(ATHENZ_PRINCIPAL_HEADER)).thenReturn(null);
+
+ ResponseHandlerMock responseHandler = new ResponseHandlerMock();
+
+ AthenzPrincipalFilter filter = new AthenzPrincipalFilter(validator, Runnable::run, ATHENZ_PRINCIPAL_HEADER);
+ filter.filter(request, responseHandler);
+
+ assertThat(responseHandler.response, notNullValue());
+ assertThat(responseHandler.response.getStatus(), equalTo(UNAUTHORIZED));
+ assertThat(responseHandler.getResponseContent(), containsString("NToken is missing"));
+ }
+
+ @Test
+ public void invalid_token_is_unauthorized() throws Exception {
+ DiscFilterRequest request = mock(DiscFilterRequest.class);
+ when(request.getHeader(ATHENZ_PRINCIPAL_HEADER)).thenReturn(NTOKEN.getToken());
+
+ when(validator.validate(NTOKEN)).thenThrow(new InvalidTokenException("Invalid token"));
+
+ ResponseHandlerMock responseHandler = new ResponseHandlerMock();
+
+ AthenzPrincipalFilter filter = new AthenzPrincipalFilter(validator, Runnable::run, ATHENZ_PRINCIPAL_HEADER);
+ filter.filter(request, responseHandler);
+
+ assertThat(responseHandler.response, notNullValue());
+ assertThat(responseHandler.response.getStatus(), equalTo(UNAUTHORIZED));
+ assertThat(responseHandler.getResponseContent(), containsString("Invalid token"));
+ }
+
+ private static NToken createDummyToken() {
+ return new NToken.Builder(
+ "U1", AthenzUtils.createPrincipal(new UserId("bob")), AthenzTestUtils.generateRsaKeypair().getPrivate(), "0")
+ .build();
+ }
+
+ private static class ResponseHandlerMock implements ResponseHandler {
+
+ public Response response;
+ public ReadableContentChannel contentChannel;
+
+ @Override
+ public ContentChannel handleResponse(Response r) {
+ response = Objects.requireNonNull(r);
+ contentChannel = new ReadableContentChannel();
+ return contentChannel;
+ }
+
+ public String getResponseContent() {
+ try (BufferedReader br = new BufferedReader(new InputStreamReader(contentChannel.toStream()))) {
+ return br.lines().collect(joining(System.lineSeparator()));
+ } catch (IOException e) {
+ throw new UncheckedIOException(e);
+ }
+ }
+
+ }
+
+}
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/athenz/filter/AthenzTestUtils.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/athenz/filter/AthenzTestUtils.java
new file mode 100644
index 00000000000..40b38254dda
--- /dev/null
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/athenz/filter/AthenzTestUtils.java
@@ -0,0 +1,22 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.hosted.controller.athenz.filter;
+
+import java.security.KeyPair;
+import java.security.KeyPairGenerator;
+import java.security.NoSuchAlgorithmException;
+
+/**
+ * @author bjorncs
+ */
+public class AthenzTestUtils {
+ public static KeyPair generateRsaKeypair() {
+ try {
+ KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
+ keyGen.initialize(512);
+ return keyGen.genKeyPair();
+ } catch (NoSuchAlgorithmException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+}
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/athenz/filter/NTokenValidatorTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/athenz/filter/NTokenValidatorTest.java
new file mode 100644
index 00000000000..e269f2842e2
--- /dev/null
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/athenz/filter/NTokenValidatorTest.java
@@ -0,0 +1,95 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.hosted.controller.athenz.filter;
+
+import com.yahoo.vespa.hosted.controller.api.identifiers.AthensDomain;
+import com.yahoo.vespa.hosted.controller.api.identifiers.UserId;
+import com.yahoo.vespa.hosted.controller.athenz.AthenzPrincipal;
+import com.yahoo.vespa.hosted.controller.athenz.InvalidTokenException;
+import com.yahoo.vespa.hosted.controller.athenz.NToken;
+import com.yahoo.vespa.hosted.controller.athenz.ZmsKeystore;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+import java.security.KeyPair;
+import java.security.NoSuchAlgorithmException;
+import java.util.Optional;
+
+import static com.yahoo.vespa.hosted.controller.athenz.AthenzUtils.ZMS_ATHENZ_SERVICE;
+import static org.junit.Assert.assertEquals;
+
+/**
+ * @author bjorncs
+ */
+public class NTokenValidatorTest {
+
+ private static final KeyPair TRUSTED_KEY = AthenzTestUtils.generateRsaKeypair();
+ private static final KeyPair UNKNOWN_KEY = AthenzTestUtils.generateRsaKeypair();
+ private static final AthenzPrincipal PRINCIPAL = new AthenzPrincipal(new AthensDomain("yby"), new UserId("user"));
+
+ @Rule
+ public ExpectedException exceptionRule = ExpectedException.none();
+
+ @Test
+ public void valid_token_is_accepted() throws NoSuchAlgorithmException, InvalidTokenException {
+ NTokenValidator validator = new NTokenValidator(createKeystore());
+ NToken token = createNToken(PRINCIPAL, System.currentTimeMillis(), TRUSTED_KEY, "0");
+ AthenzPrincipal principal = validator.validate(token);
+ assertEquals("yby.user", principal.toYRN());
+ }
+
+ @Test
+ public void invalid_signature_is_not_accepted() throws InvalidTokenException {
+ NTokenValidator validator = new NTokenValidator(createKeystore());
+ NToken token = createNToken(PRINCIPAL, System.currentTimeMillis(), UNKNOWN_KEY, "0");
+ exceptionRule.expect(InvalidTokenException.class);
+ exceptionRule.expectMessage("NToken is expired or has invalid signature");
+ validator.validate(token);
+ }
+
+ @Test
+ public void expired_token_is_not_accepted() throws InvalidTokenException {
+ NTokenValidator validator = new NTokenValidator(createKeystore());
+ NToken token = createNToken(PRINCIPAL, 1234 /*long time ago*/, TRUSTED_KEY, "0");
+ exceptionRule.expect(InvalidTokenException.class);
+ exceptionRule.expectMessage("NToken is expired or has invalid signature");
+ validator.validate(token);
+ }
+
+ @Test
+ public void unknown_keyId_is_not_accepted() throws InvalidTokenException {
+ NTokenValidator validator = new NTokenValidator(createKeystore());
+ NToken token = createNToken(PRINCIPAL, System.currentTimeMillis(), TRUSTED_KEY, "unknown-key-id");
+ exceptionRule.expect(InvalidTokenException.class);
+ exceptionRule.expectMessage("NToken has an unknown keyId");
+ validator.validate(token);
+ }
+
+ @Test
+ public void failing_to_find_key_should_throw_exception() throws InvalidTokenException {
+ ZmsKeystore keystore = (athensService, keyId) -> { throw new RuntimeException(); };
+ NTokenValidator validator = new NTokenValidator(keystore);
+ NToken token = createNToken(PRINCIPAL, System.currentTimeMillis(), TRUSTED_KEY, "0");
+ exceptionRule.expect(InvalidTokenException.class);
+ exceptionRule.expectMessage("Failed to retrieve public key");
+ validator.validate(token);
+ }
+
+ private static ZmsKeystore createKeystore() {
+ return (athensService, keyId) ->
+ athensService.equals(ZMS_ATHENZ_SERVICE) && keyId.equals("0")
+ ? Optional.of(TRUSTED_KEY.getPublic())
+ : Optional.empty();
+ }
+
+ private static NToken createNToken(AthenzPrincipal principal, long issueTime, KeyPair keyPair, String keyId) {
+ return new NToken.Builder("U1", principal, keyPair.getPrivate(), keyId)
+ .salt("1234")
+ .hostname("host")
+ .ip("1.2.3.4")
+ .issueTime(issueTime / 1000)
+ .expirationWindow(1000)
+ .build();
+ }
+
+}
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTester.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTester.java
index be14947de2b..e45166b1c16 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTester.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTester.java
@@ -90,12 +90,17 @@ public class DeploymentTester {
.filter(c -> c instanceof Change.VersionChange)
.map(Change.VersionChange.class::cast);
}
+
+ public void updateVersionStatus() {
+ controller().updateVersionStatus(VersionStatus.compute(controller(), tester.controller().systemVersion()));
+ }
public void updateVersionStatus(Version currentVersion) {
controller().updateVersionStatus(VersionStatus.compute(controller(), currentVersion));
}
public void upgradeSystem(Version version) {
+ controllerTester().configServer().setDefaultVersion(version);
updateVersionStatus(version);
upgrader().maintain();
}
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ClusterInfoMaintainerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ClusterInfoMaintainerTest.java
index 7ae89082660..13919cefd3b 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ClusterInfoMaintainerTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ClusterInfoMaintainerTest.java
@@ -31,7 +31,7 @@ public class ClusterInfoMaintainerTest {
deployment = tester.controller().applications().get(app).get().deployments().values().stream().findAny().get();
Assert.assertEquals(2, deployment.clusterInfo().size());
- Assert.assertEquals(10, deployment.clusterInfo().get(ClusterSpec.Id.from("clusterA")).getCost());
+ Assert.assertEquals(10, deployment.clusterInfo().get(ClusterSpec.Id.from("clusterA")).getFlavorCost());
}
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentMetricsMaintainerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentMetricsMaintainerTest.java
new file mode 100644
index 00000000000..cb503fc1fb7
--- /dev/null
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentMetricsMaintainerTest.java
@@ -0,0 +1,41 @@
+package com.yahoo.vespa.hosted.controller.maintenance;
+
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+import com.yahoo.config.provision.ApplicationId;
+import com.yahoo.config.provision.Environment;
+import com.yahoo.vespa.hosted.controller.ControllerTester;
+import com.yahoo.vespa.hosted.controller.application.Deployment;
+import com.yahoo.vespa.hosted.controller.persistence.MockCuratorDb;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.time.Duration;
+
+/**
+ * @author smorgrav
+ */
+public class DeploymentMetricsMaintainerTest {
+
+ @Test
+ public void maintain() {
+ ControllerTester tester = new ControllerTester();
+ ApplicationId app = tester.createAndDeploy("tenant1", "domain1", "app1", Environment.dev, 123).id();
+
+ // Pre condition: no metric info on the deployment
+ Deployment deployment = tester.controller().applications().get(app).get().deployments().values().stream().findAny().get();
+ Assert.assertEquals(0, deployment.metrics().documentCount(), Double.MIN_VALUE);
+
+ DeploymentMetricsMaintainer maintainer = new DeploymentMetricsMaintainer(tester.controller(), Duration.ofMinutes(10), new JobControl(new MockCuratorDb()));
+ maintainer.maintain();
+
+ // Post condition:
+ deployment = tester.controller().applications().get(app).get().deployments().values().stream().findAny().get();
+ Assert.assertEquals(1, deployment.metrics().queriesPerSecond(), Double.MIN_VALUE);
+ Assert.assertEquals(2, deployment.metrics().writesPerSecond(), Double.MIN_VALUE);
+ Assert.assertEquals(3, deployment.metrics().documentCount(), Double.MIN_VALUE);
+ Assert.assertEquals(4, deployment.metrics().queryLatencyMillis(), Double.MIN_VALUE);
+ Assert.assertEquals(5, deployment.metrics().writeLatencyMillis(), Double.MIN_VALUE);
+ }
+
+} \ No newline at end of file
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/FailureRedeployerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/FailureRedeployerTest.java
index 286db864c22..4c935747ac6 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/FailureRedeployerTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/FailureRedeployerTest.java
@@ -181,7 +181,7 @@ public class FailureRedeployerTest {
// Current system version, matches version in test data
Version version = Version.fromString("6.141.117");
- tester.configServer().setDefaultConfigServerVersion(version);
+ tester.configServer().setDefaultVersion(version);
tester.updateVersionStatus(version);
assertEquals(version, tester.controller().versionStatus().systemVersion().get().versionNumber());
@@ -200,7 +200,7 @@ public class FailureRedeployerTest {
// New version is released
version = Version.fromString("6.142.1");
- tester.configServer().setDefaultConfigServerVersion(version);
+ tester.configServer().setDefaultVersion(version);
tester.updateVersionStatus(version);
assertEquals(version, tester.controller().versionStatus().systemVersion().get().versionNumber());
tester.upgrader().maintain();
@@ -237,7 +237,7 @@ public class FailureRedeployerTest {
// Current system version, matches version in test data
Version version = Version.fromString("6.42.1");
- tester.configServer().setDefaultConfigServerVersion(version);
+ tester.configServer().setDefaultVersion(version);
tester.updateVersionStatus(version);
assertEquals(version, tester.controller().versionStatus().systemVersion().get().versionNumber());
@@ -262,7 +262,7 @@ public class FailureRedeployerTest {
// Current system version, matches version in test data
Version version = Version.fromString("6.42.1");
- tester.configServer().setDefaultConfigServerVersion(version);
+ tester.configServer().setDefaultVersion(version);
tester.updateVersionStatus(version);
assertEquals(version, tester.controller().versionStatus().systemVersion().get().versionNumber());
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializerTest.java
index 3e73bf4445b..f7fd7cb6fb1 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializerTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializerTest.java
@@ -20,6 +20,7 @@ import com.yahoo.vespa.hosted.controller.application.ClusterUtilization;
import com.yahoo.vespa.hosted.controller.application.Deployment;
import com.yahoo.vespa.hosted.controller.application.DeploymentJobs;
import com.yahoo.vespa.hosted.controller.application.DeploymentJobs.JobError;
+import com.yahoo.vespa.hosted.controller.application.DeploymentMetrics;
import com.yahoo.vespa.hosted.controller.application.JobStatus;
import com.yahoo.vespa.hosted.controller.application.SourceRevision;
import org.junit.Test;
@@ -61,7 +62,7 @@ public class ApplicationSerializerTest {
ApplicationRevision revision2 = ApplicationRevision.from("appHash2", new SourceRevision("repo1", "branch1", "commit1"));
deployments.add(new Deployment(zone1, revision1, Version.fromString("1.2.3"), Instant.ofEpochMilli(3))); // One deployment without cluster info and utils
deployments.add(new Deployment(zone2, revision2, Version.fromString("1.2.3"), Instant.ofEpochMilli(5),
- createClusterUtils(3, 0.2), createClusterInfo(3, 4)));
+ createClusterUtils(3, 0.2), createClusterInfo(3, 4),new DeploymentMetrics(2,3,4,5,6)));
Optional<Long> projectId = Optional.of(123L);
List<JobStatus> statusList = new ArrayList<>();
@@ -118,10 +119,20 @@ public class ApplicationSerializerTest {
// Test cluster info
assertEquals(3, serialized.deployments().get(zone2).clusterInfo().size());
- assertEquals(10, serialized.deployments().get(zone2).clusterInfo().get(ClusterSpec.Id.from("id2")).getCost());
+ assertEquals(10, serialized.deployments().get(zone2).clusterInfo().get(ClusterSpec.Id.from("id2")).getFlavorCost());
assertEquals(ClusterSpec.Type.content, serialized.deployments().get(zone2).clusterInfo().get(ClusterSpec.Id.from("id2")).getClusterType());
assertEquals("flavor2", serialized.deployments().get(zone2).clusterInfo().get(ClusterSpec.Id.from("id2")).getFlavor());
assertEquals(4, serialized.deployments().get(zone2).clusterInfo().get(ClusterSpec.Id.from("id2")).getHostnames().size());
+ assertEquals(2, serialized.deployments().get(zone2).clusterInfo().get(ClusterSpec.Id.from("id2")).getFlavorCPU(), Double.MIN_VALUE);
+ assertEquals(4, serialized.deployments().get(zone2).clusterInfo().get(ClusterSpec.Id.from("id2")).getFlavorMem(), Double.MIN_VALUE);
+ assertEquals(50, serialized.deployments().get(zone2).clusterInfo().get(ClusterSpec.Id.from("id2")).getFlavorDisk(), Double.MIN_VALUE);
+
+ // Test metrics
+ assertEquals(2, serialized.deployments().get(zone2).metrics().queriesPerSecond(), Double.MIN_VALUE);
+ assertEquals(3, serialized.deployments().get(zone2).metrics().writesPerSecond(), Double.MIN_VALUE);
+ assertEquals(4, serialized.deployments().get(zone2).metrics().documentCount(), Double.MIN_VALUE);
+ assertEquals(5, serialized.deployments().get(zone2).metrics().queryLatencyMillis(), Double.MIN_VALUE);
+ assertEquals(6, serialized.deployments().get(zone2).metrics().writeLatencyMillis(), Double.MIN_VALUE);
{ // test more deployment serialization cases
Application original2 = original.withDeploying(Optional.of(Change.ApplicationChange.of(ApplicationRevision.from("hash1"))));
@@ -153,7 +164,7 @@ public class ApplicationSerializerTest {
}
result.put(ClusterSpec.Id.from("id" + cluster), new ClusterInfo("flavor" + cluster, 10,
- ClusterSpec.Type.content, hostnames));
+ 2, 4, 50, ClusterSpec.Type.content, hostnames));
}
return result;
}
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/VersionStatusSerializerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/VersionStatusSerializerTest.java
new file mode 100644
index 00000000000..feaf1289853
--- /dev/null
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/VersionStatusSerializerTest.java
@@ -0,0 +1,53 @@
+package com.yahoo.vespa.hosted.controller.persistence;
+
+import com.yahoo.component.Version;
+import com.yahoo.config.provision.ApplicationId;
+import com.yahoo.vespa.hosted.controller.versions.DeploymentStatistics;
+import com.yahoo.vespa.hosted.controller.versions.VersionStatus;
+import com.yahoo.vespa.hosted.controller.versions.VespaVersion;
+import org.junit.Test;
+
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * @author mpolden
+ */
+public class VersionStatusSerializerTest {
+
+ @Test
+ public void testSerialization() throws Exception {
+ List<VespaVersion> vespaVersions = new ArrayList<>();
+ DeploymentStatistics statistics = new DeploymentStatistics(
+ Version.fromString("5.0"),
+ Arrays.asList(ApplicationId.from("tenant1", "failing1", "default")),
+ Arrays.asList(ApplicationId.from("tenant2", "success1", "default"),
+ ApplicationId.from("tenant2", "success2", "default"))
+ );
+ vespaVersions.add(new VespaVersion(statistics, "dead", Instant.now(), false,
+ Arrays.asList("cfg1", "cfg2", "cfg3"), VespaVersion.Confidence.normal));
+ vespaVersions.add(new VespaVersion(statistics, "cafe", Instant.now(), true,
+ Arrays.asList("cfg1", "cfg2", "cfg3"), VespaVersion.Confidence.normal));
+ VersionStatus status = new VersionStatus(vespaVersions);
+ VersionStatusSerializer serializer = new VersionStatusSerializer();
+ VersionStatus deserialized = serializer.fromSlime(serializer.toSlime(status));
+
+ assertEquals(status.versions().size(), deserialized.versions().size());
+ for (int i = 0; i < status.versions().size(); i++) {
+ VespaVersion a = status.versions().get(i);
+ VespaVersion b = deserialized.versions().get(i);
+ assertEquals(a.releaseCommit(), b.releaseCommit());
+ assertEquals(a.releasedAt(), b.releasedAt());
+ assertEquals(a.isCurrentSystemVersion(), b.isCurrentSystemVersion());
+ assertEquals(a.statistics(), b.statistics());
+ assertEquals(a.configServerHostnames(), b.configServerHostnames());
+ assertEquals(a.confidence(), b.confidence());
+ }
+
+ }
+
+}
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/ContainerControllerTester.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/ContainerControllerTester.java
index a792626d691..99381d538d5 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/ContainerControllerTester.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/ContainerControllerTester.java
@@ -21,13 +21,11 @@ import com.yahoo.vespa.hosted.controller.api.identifiers.PropertyId;
import com.yahoo.vespa.hosted.controller.api.identifiers.ScrewdriverId;
import com.yahoo.vespa.hosted.controller.api.identifiers.TenantId;
import com.yahoo.vespa.hosted.controller.api.identifiers.UserId;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.Athens;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.AthensPrincipal;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.mock.AthensDbMock;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.mock.AthensMock;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.mock.ZmsClientFactoryMock;
import com.yahoo.vespa.hosted.controller.application.ApplicationPackage;
import com.yahoo.vespa.hosted.controller.application.DeploymentJobs;
+import com.yahoo.vespa.hosted.controller.athenz.AthenzPrincipal;
+import com.yahoo.vespa.hosted.controller.athenz.mock.AthensDbMock;
+import com.yahoo.vespa.hosted.controller.athenz.mock.AthenzClientFactoryMock;
import com.yahoo.vespa.hosted.controller.maintenance.JobControl;
import com.yahoo.vespa.hosted.controller.maintenance.Upgrader;
import com.yahoo.vespa.hosted.controller.persistence.CuratorDb;
@@ -97,14 +95,12 @@ public class ContainerControllerTester {
}
public AthensDomain addTenantAthensDomain(String domainName, String userName) {
- Athens athens = (AthensMock) containerTester.container().components().getComponent(
- "com.yahoo.vespa.hosted.controller.api.integration.athens.mock.AthensMock"
- );
- ZmsClientFactoryMock mock = (ZmsClientFactoryMock) athens.zmsClientFactory();
+ AthenzClientFactoryMock mock = (AthenzClientFactoryMock) containerTester.container().components()
+ .getComponent(AthenzClientFactoryMock.class.getName());
AthensDomain athensDomain = new AthensDomain(domainName);
AthensDbMock.Domain domain = new AthensDbMock.Domain(athensDomain);
domain.markAsVespaTenant();
- domain.admin(new AthensPrincipal(new AthensDomain("domain"), new UserId(userName)));
+ domain.admin(new AthenzPrincipal(new AthensDomain("domain"), new UserId(userName)));
mock.getSetup().addDomain(domain);
return athensDomain;
}
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/ControllerContainerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/ControllerContainerTest.java
index fd07428126a..5c102b0d9df 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/ControllerContainerTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/ControllerContainerTest.java
@@ -36,7 +36,7 @@ public class ControllerContainerTest {
" <system>main</system>" +
" </config>" +
" <component id='com.yahoo.vespa.hosted.controller.persistence.MockCuratorDb'/>" +
- " <component id='com.yahoo.vespa.hosted.controller.api.integration.athens.mock.AthensMock'/>" +
+ " <component id='com.yahoo.vespa.hosted.controller.athenz.mock.AthenzClientFactoryMock'/>" +
" <component id='com.yahoo.vespa.hosted.controller.api.integration.chef.ChefMock'/>" +
" <component id='com.yahoo.vespa.hosted.controller.api.integration.dns.MemoryNameService'/>" +
" <component id='com.yahoo.vespa.hosted.controller.api.integration.entity.MemoryEntityService'/>" +
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiTest.java
index 13b1165ccb2..0c9ebedc09b 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiTest.java
@@ -10,17 +10,17 @@ import com.yahoo.vespa.hosted.controller.Application;
import com.yahoo.vespa.hosted.controller.ConfigServerClientMock;
import com.yahoo.vespa.hosted.controller.api.identifiers.AthensDomain;
import com.yahoo.vespa.hosted.controller.api.identifiers.UserId;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.Athens;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.AthensPrincipal;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.mock.AthensDbMock;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.mock.AthensMock;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.mock.ZmsClientFactoryMock;
import com.yahoo.vespa.hosted.controller.api.integration.configserver.ConfigServerException;
import com.yahoo.vespa.hosted.controller.application.ApplicationPackage;
import com.yahoo.vespa.hosted.controller.application.ClusterInfo;
import com.yahoo.vespa.hosted.controller.application.ClusterUtilization;
import com.yahoo.vespa.hosted.controller.application.Deployment;
import com.yahoo.vespa.hosted.controller.application.DeploymentJobs;
+import com.yahoo.vespa.hosted.controller.application.DeploymentMetrics;
+import com.yahoo.vespa.hosted.controller.athenz.AthenzPrincipal;
+import com.yahoo.vespa.hosted.controller.athenz.AthenzUtils;
+import com.yahoo.vespa.hosted.controller.athenz.mock.AthensDbMock;
+import com.yahoo.vespa.hosted.controller.athenz.mock.AthenzClientFactoryMock;
import com.yahoo.vespa.hosted.controller.deployment.ApplicationPackageBuilder;
import com.yahoo.vespa.hosted.controller.restapi.ContainerControllerTester;
import com.yahoo.vespa.hosted.controller.restapi.ContainerTester;
@@ -54,7 +54,7 @@ public class ApplicationApiTest extends ControllerContainerTest {
.region("corp-us-east-1")
.build();
private static final String athensUserDomain = "domain1";
- private static final String athensScrewdriverDomain = "screwdriver-domain";
+ private static final String athensScrewdriverDomain = AthenzUtils.SCREWDRIVER_DOMAIN.id();
@Test
@@ -173,7 +173,7 @@ public class ApplicationApiTest extends ControllerContainerTest {
tester.assertResponse(request("/application/v4/tenant/tenant1/application/application1", "", Request.Method.GET),
new File("application.json"));
// GET an application deployment
- addMockObservedApplicationCost(controllerTester);
+ setDeploymentMaintainedInfo(controllerTester);
tester.assertResponse(request("/application/v4/tenant/tenant1/application/application1/environment/prod/region/corp-us-east-1/instance/default", "", Request.Method.GET),
new File("deployment.json"));
// POST a 'restart application' command
@@ -671,14 +671,12 @@ public class ApplicationApiTest extends ControllerContainerTest {
* mock setup to replicate the action.
*/
private AthensDomain addTenantAthensDomain(String domainName, String userName) {
- Athens athens = (AthensMock) container.components().getComponent(
- "com.yahoo.vespa.hosted.controller.api.integration.athens.mock.AthensMock"
- );
- ZmsClientFactoryMock mock = (ZmsClientFactoryMock) athens.zmsClientFactory();
+ AthenzClientFactoryMock mock = (AthenzClientFactoryMock) container.components()
+ .getComponent(AthenzClientFactoryMock.class.getName());
AthensDomain athensDomain = new AthensDomain(domainName);
AthensDbMock.Domain domain = new AthensDbMock.Domain(athensDomain);
domain.markAsVespaTenant();
- domain.admin(new AthensPrincipal(new AthensDomain(athensUserDomain), new UserId(userName)));
+ domain.admin(AthenzUtils.createPrincipal(new UserId(userName)));
mock.getSetup().addDomain(domain);
return athensDomain;
}
@@ -688,12 +686,10 @@ public class ApplicationApiTest extends ControllerContainerTest {
* mock setup to replicate the action.
*/
private void addScrewdriverUserToDomain(String screwdriverUserId, String domainName) {
- Athens athens = (AthensMock) container.components().getComponent(
- "com.yahoo.vespa.hosted.controller.api.integration.athens.mock.AthensMock"
- );
- ZmsClientFactoryMock mock = (ZmsClientFactoryMock) athens.zmsClientFactory();
+ AthenzClientFactoryMock mock = (AthenzClientFactoryMock) container.components()
+ .getComponent(AthenzClientFactoryMock.class.getName());
AthensDbMock.Domain domain = mock.getSetup().domains.get(new AthensDomain(domainName));
- domain.admin(new AthensPrincipal(new AthensDomain(athensScrewdriverDomain), new UserId(screwdriverUserId)));
+ domain.admin(new AthenzPrincipal(new AthensDomain(athensScrewdriverDomain), new UserId(screwdriverUserId)));
}
private void startAndTestChange(ContainerControllerTester controllerTester, ApplicationId application, long projectId,
@@ -732,7 +728,14 @@ public class ApplicationApiTest extends ControllerContainerTest {
controllerTester.notifyJobCompletion(application, projectId, true, DeploymentJobs.JobType.stagingTest);
}
- private void addMockObservedApplicationCost(ContainerControllerTester controllerTester) {
+ /**
+ * Cluster info, utilization and deployment metrics are maintained async by maintainers.
+ *
+ * This sets these values as if the maintainers has been ran.
+ *
+ * @param controllerTester
+ */
+ private void setDeploymentMaintainedInfo(ContainerControllerTester controllerTester) {
for (Application application : controllerTester.controller().applications().asList()) {
try (Lock lock = controllerTester.controller().applications().lock(application.id())) {
for (Deployment deployment : application.deployments().values()) {
@@ -740,11 +743,12 @@ public class ApplicationApiTest extends ControllerContainerTest {
List<String> hostnames = new ArrayList<>();
hostnames.add("host1");
hostnames.add("host2");
- clusterInfo.put(ClusterSpec.Id.from("cluster1"), new ClusterInfo("flavor1", 37, ClusterSpec.Type.content, hostnames));
+ clusterInfo.put(ClusterSpec.Id.from("cluster1"), new ClusterInfo("flavor1", 37, 2, 4, 50, ClusterSpec.Type.content, hostnames));
Map<ClusterSpec.Id, ClusterUtilization> clusterUtils = new HashMap<>();
clusterUtils.put(ClusterSpec.Id.from("cluster1"), new ClusterUtilization(0.3, 0.6, 0.4, 0.3));
deployment = deployment.withClusterInfo(clusterInfo);
deployment = deployment.withClusterUtils(clusterUtils);
+ deployment = deployment.withMetrics(new DeploymentMetrics(1,2,3,4,5));
application = application.with(deployment);
controllerTester.controller().applications().store(application, lock);
}
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/MockAuthorizer.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/MockAuthorizer.java
index 16557157cf5..6f8dfc681ac 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/MockAuthorizer.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/MockAuthorizer.java
@@ -6,9 +6,10 @@ import com.yahoo.vespa.hosted.controller.Controller;
import com.yahoo.vespa.hosted.controller.TestIdentities;
import com.yahoo.vespa.hosted.controller.api.identifiers.AthensDomain;
import com.yahoo.vespa.hosted.controller.api.identifiers.UserId;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.AthensPrincipal;
-import com.yahoo.vespa.hosted.controller.api.integration.athens.NToken;
import com.yahoo.vespa.hosted.controller.api.integration.entity.EntityService;
+import com.yahoo.vespa.hosted.controller.athenz.AthenzClientFactory;
+import com.yahoo.vespa.hosted.controller.athenz.AthenzPrincipal;
+import com.yahoo.vespa.hosted.controller.athenz.NToken;
import javax.ws.rs.core.SecurityContext;
import java.security.Principal;
@@ -23,15 +24,15 @@ import java.util.Optional;
@SuppressWarnings("unused") // injected
public class MockAuthorizer extends Authorizer {
- public MockAuthorizer(Controller controller, EntityService entityService) {
- super(controller, entityService);
+ public MockAuthorizer(Controller controller, EntityService entityService, AthenzClientFactory athenzClientFactory) {
+ super(controller, entityService, athenzClientFactory);
}
/** Returns a principal given by the request parameters 'domain' and 'user' */
@Override
public Optional<Principal> getPrincipalIfAny(HttpRequest request) {
if (request.getProperty("user") == null) return Optional.empty();
- return Optional.of(new AthensPrincipal(new AthensDomain(request.getProperty("domain")),
+ return Optional.of(new AthenzPrincipal(new AthensDomain(request.getProperty("domain")),
new UserId(request.getProperty("user"))));
}
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/deployment.json b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/deployment.json
index 67fc48d4646..9174e7dd8b2 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/deployment.json
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/deployment.json
@@ -17,17 +17,21 @@
"gitBranch": "master",
"gitCommit": "commit1",
"cost": {
- "tco": 37,
- "utilization": 5.999999999999999,
- "waste": 0.0,
+ "tco": 74,
+ "waste": 0,
+ "utilization": 2.999999999999999,
"cluster": {
"cluster1": {
"count": 2,
"resource": "cpu",
"utilization": 2.999999999999999,
- "tco": 37,
- "flavor": "flavor1",
+ "tco": 74,
"waste": 0,
+ "flavor": "flavor1",
+ "flavorCost":37.0,
+ "flavorCpu":2.0,
+ "flavorMem":4.0,
+ "flavorDisk":50.0,
"type": "content",
"util": {
"cpu": 2.999999999999999,
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/controller/responses/maintenance.json b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/controller/responses/maintenance.json
index e974c315eb2..3633860772b 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/controller/responses/maintenance.json
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/controller/responses/maintenance.json
@@ -4,10 +4,7 @@
"name": "DelayedDeployer"
},
{
- "name": "ClusterUtilizationMaintainer"
- },
- {
- "name":"BlockedChangeDeployer"
+ "name": "BlockedChangeDeployer"
},
{
"name": "Upgrader"
@@ -16,25 +13,31 @@
"name": "FailureRedeployer"
},
{
- "name": "ClusterInfoMaintainer"
+ "name": "VersionStatusUpdater"
},
{
- "name": "DeploymentExpirer"
+ "name": "DeploymentIssueReporter"
},
{
- "name": "MetricsReporter"
+ "name": "DeploymentMetricsMaintainer"
},
{
- "name": "VersionStatusUpdater"
+ "name": "OutstandingChangeDeployer"
},
{
- "name": "DeploymentIssueReporter"
+ "name": "ClusterUtilizationMaintainer"
},
{
- "name": "OutstandingChangeDeployer"
+ "name": "ClusterInfoMaintainer"
+ },
+ {
+ "name": "DeploymentExpirer"
+ },
+ {
+ "name": "MetricsReporter"
}
],
"inactive": [
"DeploymentExpirer"
]
-}
+} \ No newline at end of file
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/DeploymentApiTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/DeploymentApiTest.java
index c002c7fb24a..55a4b46f4a7 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/DeploymentApiTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/DeploymentApiTest.java
@@ -85,7 +85,8 @@ public class DeploymentApiTest extends ControllerContainerTest {
version.releasedAt(),
version.isCurrentSystemVersion(),
ImmutableSet.of("config1.test", "config2.test"),
- controller);
+ VespaVersion.confidenceFrom(version.statistics(), controller, version.releasedAt())
+ );
censored.add(version);
}
return new VersionStatus(censored);
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/responses/root.json b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/responses/root.json
index c2e83373cf7..00bd1ed8208 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/responses/root.json
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/responses/root.json
@@ -2,7 +2,7 @@
"versions": [
{
"version": "(ignore)",
- "confidence": "normal",
+ "confidence": "high",
"commit": "(ignore)",
"date": 0,
"controllerVersion": false,
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/versions/VersionStatusTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/versions/VersionStatusTest.java
index 7bbbf8f0499..17935906186 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/versions/VersionStatusTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/versions/VersionStatusTest.java
@@ -6,6 +6,7 @@ import com.yahoo.component.Vtag;
import com.yahoo.config.provision.Environment;
import com.yahoo.vespa.hosted.controller.Application;
import com.yahoo.vespa.hosted.controller.ApplicationController;
+import com.yahoo.vespa.hosted.controller.Controller;
import com.yahoo.vespa.hosted.controller.ControllerTester;
import com.yahoo.vespa.hosted.controller.api.identifiers.TenantId;
import com.yahoo.vespa.hosted.controller.application.ApplicationPackage;
@@ -13,6 +14,7 @@ import com.yahoo.vespa.hosted.controller.application.DeploymentJobs;
import com.yahoo.vespa.hosted.controller.application.DeploymentJobs.JobError;
import com.yahoo.vespa.hosted.controller.deployment.ApplicationPackageBuilder;
import com.yahoo.vespa.hosted.controller.deployment.DeploymentTester;
+import com.yahoo.vespa.hosted.controller.versions.VespaVersion.Confidence;
import org.junit.Test;
import java.net.URI;
@@ -46,7 +48,7 @@ public class VersionStatusTest {
public void testSystemVersionIsControllerVersionIfConfigserversAreNewer() {
ControllerTester tester = new ControllerTester();
Version largerThanCurrent = new Version(Vtag.currentVersion.getMajor() + 1);
- tester.configServer().setDefaultConfigServerVersion(largerThanCurrent);
+ tester.configServer().setDefaultVersion(largerThanCurrent);
VersionStatus versionStatus = VersionStatus.compute(tester.controller());
assertEquals(Vtag.currentVersion, versionStatus.systemVersion().get().versionNumber());
}
@@ -55,7 +57,7 @@ public class VersionStatusTest {
public void testSystemVersionIsVersionOfOldestConfigServer() throws URISyntaxException {
ControllerTester tester = new ControllerTester();
Version oldest = new Version(5);
- tester.configServer().configServerVersions().put(new URI("http://cfg.prod.corp-us-east-1.test"), oldest);
+ tester.configServer().versions().put(new URI("http://cfg.prod.corp-us-east-1.test"), oldest);
VersionStatus versionStatus = VersionStatus.compute(tester.controller());
assertEquals(oldest, versionStatus.systemVersion().get().versionNumber());
}
@@ -70,7 +72,6 @@ public class VersionStatusTest {
.region("us-east-3")
.build();
- // Application versions which are older than the current version
Version version1 = new Version("5.1");
Version version2 = new Version("5.2");
tester.upgradeSystem(version1);
@@ -90,14 +91,9 @@ public class VersionStatusTest {
// - app3 is in production on version1, but then fails in staging test on version2
tester.completeUpgradeWithError(app3, version2, applicationPackage, stagingTest);
- VersionStatus versionStatus = VersionStatus.compute(tester.controller());
- List<VespaVersion> versions = versionStatus.versions();
- assertEquals("The version of this controller, the default config server version, plus the two versions above exist", 4, versions.size());
-
- VespaVersion v0 = versions.get(2);
- assertEquals(tester.configServer().getDefaultConfigServerVersion(), v0.versionNumber());
- assertEquals(0, v0.statistics().failing().size());
- assertEquals(0, v0.statistics().production().size());
+ tester.updateVersionStatus();
+ List<VespaVersion> versions = tester.controller().versionStatus().versions();
+ assertEquals("The two versions above exist", 2, versions.size());
VespaVersion v1 = versions.get(0);
assertEquals(version1, v1.versionNumber());
@@ -116,11 +112,6 @@ public class VersionStatusTest {
// Only one application is on v2 in at least one zone
assertEquals(1, v2.statistics().production().size());
assertTrue(v2.statistics().production().contains(app2.id()));
-
- VespaVersion v3 = versions.get(3);
- assertEquals(Vtag.currentVersion, v3.versionNumber());
- assertEquals(0, v3.statistics().failing().size());
- assertEquals(0, v3.statistics().production().size());
}
@Test
@@ -130,7 +121,7 @@ public class VersionStatusTest {
Version version0 = new Version("5.0");
tester.upgradeSystem(version0);
- // Setup applications
+ // Setup applications - all running on version0
Application canary0 = tester.createAndDeploy("canary0", 1, "canary");
Application canary1 = tester.createAndDeploy("canary1", 2, "canary");
Application canary2 = tester.createAndDeploy("canary2", 3, "canary");
@@ -146,8 +137,7 @@ public class VersionStatusTest {
Application default9 = tester.createAndDeploy("default9", 13, "default");
Application conservative0 = tester.createAndDeploy("conservative1", 14, "conservative");
-
- // The following applications should not affect confidence calculation:
+ // Applications that do not affect confidence calculation:
// Application without deployment
Application ignored0 = tester.createApplication("ignored0", "tenant1", 1000, 1000L);
@@ -157,30 +147,40 @@ public class VersionStatusTest {
"ignored1",
"default-pr42", 1000);
+ assertEquals("All applications running on this version: High",
+ Confidence.high, confidence(tester.controller(), version0));
+
+ // New version is released
Version version1 = new Version("5.1");
- Version version2 = new Version("5.2");
tester.upgradeSystem(version1);
// Canaries upgrade to new versions and fail
tester.completeUpgrade(canary0, version1, "canary");
tester.completeUpgradeWithError(canary1, version1, "canary", productionUsWest1);
- tester.upgradeSystem(version2);
- tester.completeUpgrade(canary2, version2, "canary");
-
- VersionStatus versionStatus = VersionStatus.compute(tester.controller());
- List<VespaVersion> versions = versionStatus.versions();
-
+ tester.updateVersionStatus();
assertEquals("One canary failed: Broken",
- VespaVersion.Confidence.broken, confidence(versions, version1));
- assertEquals("Nothing has failed but not all canaries has deployed: Low",
- VespaVersion.Confidence.low, confidence(versions, version2));
- assertEquals("Current version of this - no deployments: Low",
- VespaVersion.Confidence.low, confidence(versions, Vtag.currentVersion));
+ Confidence.broken, confidence(tester.controller(), version1));
- // All canaries are upgraded to version2 which raises confidence to normal and more apps upgrade
+ // New version is released
+ Version version2 = new Version("5.2");
+ tester.upgradeSystem(version2);
+ assertEquals("Confidence defaults to low for version with no applications",
+ Confidence.low, confidence(tester.controller(), version2));
+
+ // All canaries upgrade successfully
tester.completeUpgrade(canary0, version2, "canary");
tester.completeUpgrade(canary1, version2, "canary");
+
+ assertEquals("Confidence for remains unchanged for version1: Broken",
+ Confidence.broken, confidence(tester.controller(), version1));
+ assertEquals("Nothing has failed but not all canaries have upgraded: Low",
+ Confidence.low, confidence(tester.controller(), version2));
+
+ // Remaining canary upgrades to version2 which raises confidence to normal and more apps upgrade
+ tester.completeUpgrade(canary2, version2, "canary");
tester.upgradeSystem(version2);
+ assertEquals("Canaries have upgraded: Normal",
+ Confidence.normal, confidence(tester.controller(), version2));
tester.completeUpgrade(default0, version2, "default");
tester.completeUpgrade(default1, version2, "default");
tester.completeUpgrade(default2, version2, "default");
@@ -189,29 +189,27 @@ public class VersionStatusTest {
tester.completeUpgrade(default5, version2, "default");
tester.completeUpgrade(default6, version2, "default");
tester.completeUpgrade(default7, version2, "default");
+ tester.updateVersionStatus();
- versionStatus = VersionStatus.compute(tester.controller());
- versions = versionStatus.versions();
+ // Remember confidence across restart
+ tester.restartController();
- assertEquals("No deployments: Low",
- VespaVersion.Confidence.low, confidence(versions, version0));
+ assertEquals("Confidence remains unchanged for version0: High",
+ Confidence.high, confidence(tester.controller(), version0));
assertEquals("All canaries deployed + < 90% of defaults: Normal",
- VespaVersion.Confidence.normal, confidence(versions, version2));
- assertEquals("Current version of this - no deployments: Low",
- VespaVersion.Confidence.low, confidence(versions, Vtag.currentVersion));
+ Confidence.normal, confidence(tester.controller(), version2));
+ assertTrue("Status for version without applications is removed",
+ tester.controller().versionStatus().versions().stream()
+ .noneMatch(vespaVersion -> vespaVersion.versionNumber().equals(version1)));
// Another default application upgrades, raising confidence to high
tester.completeUpgrade(default8, version2, "default");
+ tester.updateVersionStatus();
- versionStatus = VersionStatus.compute(tester.controller());
- versions = versionStatus.versions();
-
- assertEquals("No deployments: Low",
- VespaVersion.Confidence.low, confidence(versions, version0));
+ assertEquals("Confidence remains unchanged for version0: High",
+ Confidence.high, confidence(tester.controller(), version0));
assertEquals("90% of defaults deployed successfully: High",
- VespaVersion.Confidence.high, confidence(versions, version2));
- assertEquals("Current version of this - no deployments: Low",
- VespaVersion.Confidence.low, confidence(versions, Vtag.currentVersion));
+ VespaVersion.Confidence.high, confidence(tester.controller(), version2));
// A new version is released, all canaries upgrade successfully, but enough "default" apps fail to mark version
// as broken
@@ -225,16 +223,14 @@ public class VersionStatusTest {
tester.completeUpgradeWithError(default1, version3, "default", stagingTest);
tester.completeUpgradeWithError(default2, version3, "default", stagingTest);
tester.completeUpgradeWithError(default9, version3, "default", stagingTest);
+ tester.updateVersionStatus();
- versionStatus = VersionStatus.compute(tester.controller());
- versions = versionStatus.versions();
-
- assertEquals("No deployments: Low",
- VespaVersion.Confidence.low, confidence(versions, version0));
+ assertEquals("Confidence remains unchanged for version0: High",
+ Confidence.high, confidence(tester.controller(), version0));
+ assertEquals("Confidence remains unchanged for version2: High",
+ Confidence.high, confidence(tester.controller(), version2));
assertEquals("40% of defaults failed: Broken",
- VespaVersion.Confidence.broken, confidence(versions, version3));
- assertEquals("Current version of this - no deployments: Low",
- VespaVersion.Confidence.low, confidence(versions, Vtag.currentVersion));
+ VespaVersion.Confidence.broken, confidence(tester.controller(), version3));
}
@Test
@@ -260,8 +256,8 @@ public class VersionStatusTest {
vespaVersions.stream().noneMatch(v -> v.versionNumber().equals(versionWithUnknownTag)));
}
- private VespaVersion.Confidence confidence(List<VespaVersion> versions, Version version) {
- return versions.stream()
+ private Confidence confidence(Controller controller, Version version) {
+ return controller.versionStatus().versions().stream()
.filter(v -> v.statistics().version().equals(version))
.findFirst()
.map(VespaVersion::confidence)
diff --git a/eval/src/apps/tensor_conformance/generate.cpp b/eval/src/apps/tensor_conformance/generate.cpp
index 45ff6243d81..d3374665fd4 100644
--- a/eval/src/apps/tensor_conformance/generate.cpp
+++ b/eval/src/apps/tensor_conformance/generate.cpp
@@ -1,18 +1,222 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
#include "generate.h"
+#include <vespa/eval/eval/test/tensor_model.hpp>
+#include <vespa/eval/eval/operation.h>
+#include <vespa/eval/eval/aggr.h>
+#include <vespa/vespalib/util/stringfmt.h>
-using TensorSpec = vespalib::eval::TensorSpec;
+using namespace vespalib::eval;
+using namespace vespalib::eval::test;
-TensorSpec spec(double value) { return TensorSpec("double").add({}, value); }
+const double my_nan = std::numeric_limits<double>::quiet_NaN();
+
+//-----------------------------------------------------------------------------
+
+void generate_reduce(Aggr aggr, const Sequence &seq, TestBuilder &dst) {
+ std::vector<Layout> layouts = {
+ {x(3)},
+ {x(3),y(5)},
+ {x(3),y(5),z(7)},
+ {x({"a","b","c"})},
+ {x({"a","b","c"}),y({"foo","bar"})},
+ {x({"a","b","c"}),y({"foo","bar"}),z({"i","j","k","l"})},
+ {x(3),y({"foo", "bar"}),z(7)},
+ {x({"a","b","c"}),y(5),z({"i","j","k","l"})}
+ };
+ for (const Layout &layout: layouts) {
+ TensorSpec input = spec(layout, seq);
+ for (const Domain &domain: layout) {
+ vespalib::string expr = vespalib::make_string("reduce(a,%s,%s)",
+ AggrNames::name_of(aggr)->c_str(), domain.dimension.c_str());
+ dst.add(expr, {{"a", input}});
+ }
+ {
+ vespalib::string expr = vespalib::make_string("reduce(a,%s)", AggrNames::name_of(aggr)->c_str());
+ dst.add(expr, {{"a", input}});
+ }
+ }
+}
+
+void generate_tensor_reduce(TestBuilder &dst) {
+ generate_reduce(Aggr::AVG, N(), dst);
+ generate_reduce(Aggr::COUNT, N(), dst);
+ generate_reduce(Aggr::PROD, Sigmoid(N()), dst);
+ generate_reduce(Aggr::SUM, N(), dst);
+ generate_reduce(Aggr::MAX, N(), dst);
+ generate_reduce(Aggr::MIN, N(), dst);
+}
+
+//-----------------------------------------------------------------------------
+
+void generate_map_expr(const vespalib::string &expr, const UnaryOperation &ref_op, const Sequence &seq, TestBuilder &dst) {
+ std::vector<Layout> layouts = {
+ {},
+ {x(3)},
+ {x(3),y(5)},
+ {x(3),y(5),z(7)},
+ {x({"a","b","c"})},
+ {x({"a","b","c"}),y({"foo","bar"})},
+ {x({"a","b","c"}),y({"foo","bar"}),z({"i","j","k","l"})},
+ {x(3),y({"foo", "bar"}),z(7)},
+ {x({"a","b","c"}),y(5),z({"i","j","k","l"})}
+ };
+ for (const Layout &layout: layouts) {
+ dst.add(expr, {{"a", spec(layout, seq)}}, spec(layout, OpSeq(seq, ref_op)));
+ }
+}
+
+void generate_op1_map(const vespalib::string &op1_expr, const UnaryOperation &ref_op, const Sequence &seq, TestBuilder &dst) {
+ generate_map_expr(op1_expr, ref_op, seq, dst);
+ generate_map_expr(vespalib::make_string("map(a,f(a)(%s))", op1_expr.c_str()), ref_op, seq, dst);
+}
+
+void generate_tensor_map(TestBuilder &dst) {
+ generate_op1_map("-a", operation::Neg(), Sub2(Div10(N())), dst);
+ generate_op1_map("!a", operation::Not(), Mask2Seq(SkipNth(3)), dst);
+ generate_op1_map("cos(a)", operation::Cos(), Div10(N()), dst);
+ generate_op1_map("sin(a)", operation::Sin(), Div10(N()), dst);
+ generate_op1_map("tan(a)", operation::Tan(), Div10(N()), dst);
+ generate_op1_map("cosh(a)", operation::Cosh(), Div10(N()), dst);
+ generate_op1_map("sinh(a)", operation::Sinh(), Div10(N()), dst);
+ generate_op1_map("tanh(a)", operation::Tanh(), Div10(N()), dst);
+ generate_op1_map("acos(a)", operation::Acos(), Sigmoid(Div10(N())), dst);
+ generate_op1_map("asin(a)", operation::Asin(), Sigmoid(Div10(N())), dst);
+ generate_op1_map("atan(a)", operation::Atan(), Div10(N()), dst);
+ generate_op1_map("exp(a)", operation::Exp(), Div10(N()), dst);
+ generate_op1_map("log10(a)", operation::Log10(), Div10(N()), dst);
+ generate_op1_map("log(a)", operation::Log(), Div10(N()), dst);
+ generate_op1_map("sqrt(a)", operation::Sqrt(), Div10(N()), dst);
+ generate_op1_map("ceil(a)", operation::Ceil(), Div10(N()), dst);
+ generate_op1_map("fabs(a)", operation::Fabs(), Div10(N()), dst);
+ generate_op1_map("floor(a)", operation::Floor(), Div10(N()), dst);
+ generate_op1_map("isNan(a)", operation::IsNan(), Mask2Seq(SkipNth(3), 1.0, my_nan), dst);
+ generate_op1_map("relu(a)", operation::Relu(), Sub2(Div10(N())), dst);
+ generate_op1_map("sigmoid(a)", operation::Sigmoid(), Sub2(Div10(N())), dst);
+ generate_map_expr("map(a,f(a)((a+1)*2))", MyOp(), Div10(N()), dst);
+}
+
+//-----------------------------------------------------------------------------
+
+void generate_join_expr(const vespalib::string &expr, const Sequence &seq, TestBuilder &dst) {
+ std::vector<Layout> layouts = {
+ {}, {},
+ {x(5)}, {x(5)},
+ {x(5)}, {x(3)},
+ {x(5)}, {y(5)},
+ {x(5)}, {x(5),y(5)},
+ {x(3),y(5)}, {x(4),y(4)},
+ {x(3),y(5)}, {y(5),z(7)},
+ {x({"a","b","c"})}, {x({"a","b","c"})},
+ {x({"a","b","c"})}, {x({"a","b"})},
+ {x({"a","b","c"})}, {y({"foo","bar","baz"})},
+ {x({"a","b","c"})}, {x({"a","b","c"}),y({"foo","bar","baz"})},
+ {x({"a","b"}),y({"foo","bar","baz"})}, {x({"a","b","c"}),y({"foo","bar"})},
+ {x({"a","b"}),y({"foo","bar","baz"})}, {y({"foo","bar"}),z({"i","j","k","l"})},
+ {x(3),y({"foo", "bar"})}, {y({"foo", "bar"}),z(7)},
+ {x({"a","b","c"}),y(5)}, {y(5),z({"i","j","k","l"})}
+ };
+ ASSERT_TRUE((layouts.size() % 2) == 0);
+ for (size_t i = 0; i < layouts.size(); i += 2) {
+ auto a = spec(layouts[i], seq);
+ auto b = spec(layouts[i + 1], seq);
+ dst.add(expr, {{"a", a}, {"b", b}});
+ }
+}
+
+void generate_op2_join(const vespalib::string &op2_expr, const Sequence &seq, TestBuilder &dst) {
+ generate_join_expr(op2_expr, seq, dst);
+ generate_join_expr(vespalib::make_string("join(a,b,f(a,b)(%s))", op2_expr.c_str()), seq, dst);
+}
+
+void generate_tensor_join(TestBuilder &dst) {
+ generate_op2_join("a+b", Div10(N()), dst);
+ generate_op2_join("a-b", Div10(N()), dst);
+ generate_op2_join("a*b", Div10(N()), dst);
+ generate_op2_join("a/b", Div10(N()), dst);
+ generate_op2_join("a%b", Div10(N()), dst);
+ generate_op2_join("a^b", Div10(N()), dst);
+ generate_op2_join("pow(a,b)", Div10(N()), dst);
+ generate_op2_join("a==b", Div10(N()), dst);
+ generate_op2_join("a!=b", Div10(N()), dst);
+ generate_op2_join("a~=b", Div10(N()), dst);
+ generate_op2_join("a<b", Div10(N()), dst);
+ generate_op2_join("a<=b", Div10(N()), dst);
+ generate_op2_join("a>b", Div10(N()), dst);
+ generate_op2_join("a>=b", Div10(N()), dst);
+ generate_op2_join("a&&b", Mask2Seq(SkipNth(3)), dst);
+ generate_op2_join("a||b", Mask2Seq(SkipNth(3)), dst);
+ generate_op2_join("atan2(a,b)", Div10(N()), dst);
+ generate_op2_join("ldexp(a,b)", Div10(N()), dst);
+ generate_op2_join("fmod(a,b)", Div10(N()), dst);
+ generate_op2_join("min(a,b)", Div10(N()), dst);
+ generate_op2_join("max(a,b)", Div10(N()), dst);
+ generate_join_expr("join(a,b,f(a,b)((a+b)/(a*b)))", Div10(N()), dst);
+}
+
+//-----------------------------------------------------------------------------
+
+void generate_dot_product(TestBuilder &dst) {
+ dst.add("reduce(a*b,sum)", {{"a", spec(x(3), Seq({ 2, 3, 5 }))}, {"b", spec(x(3), Seq({ 7, 11, 13 }))}},
+ spec((2 * 7) + (3 * 11) + (5 * 13)));
+ dst.add("reduce(a*b,sum)", {{"a", spec(x(2), Seq({ 2, 3 }))}, {"b", spec(x(3), Seq({ 7, 11, 13 }))}},
+ spec((2 * 7) + (3 * 11)));
+ dst.add("reduce(a*b,sum)", {{"a", spec(x(3), Seq({ 2, 3, 5 }))}, {"b", spec(x(2), Seq({ 7, 11 }))}},
+ spec((2 * 7) + (3 * 11)));
+}
+
+//-----------------------------------------------------------------------------
+
+void generate_tensor_concat(TestBuilder &dst) {
+ dst.add("concat(a,b,x)", {{"a", spec(10.0)}, {"b", spec(20.0)}}, spec(x(2), Seq({10.0, 20.0})));
+ dst.add("concat(a,b,x)", {{"a", spec(x(1), Seq({10.0}))}, {"b", spec(20.0)}}, spec(x(2), Seq({10.0, 20.0})));
+ dst.add("concat(a,b,x)", {{"a", spec(10.0)}, {"b", spec(x(1), Seq({20.0}))}}, spec(x(2), Seq({10.0, 20.0})));
+ dst.add("concat(a,b,x)", {{"a", spec(x(3), Seq({1.0, 2.0, 3.0}))}, {"b", spec(x(2), Seq({4.0, 5.0}))}},
+ spec(x(5), Seq({1.0, 2.0, 3.0, 4.0, 5.0})));
+ dst.add("concat(a,b,y)", {{"a", spec({x(2),y(2)}, Seq({1.0, 2.0, 3.0, 4.0}))}, {"b", spec(y(2), Seq({5.0, 6.0}))}},
+ spec({x(2),y(4)}, Seq({1.0, 2.0, 5.0, 6.0, 3.0, 4.0, 5.0, 6.0})));
+ dst.add("concat(a,b,x)", {{"a", spec({x(2),y(2)}, Seq({1.0, 2.0, 3.0, 4.0}))}, {"b", spec(x(2), Seq({5.0, 6.0}))}},
+ spec({x(4),y(2)}, Seq({1.0, 2.0, 3.0, 4.0, 5.0, 5.0, 6.0, 6.0})));
+ dst.add("concat(a,b,x)", {{"a", spec(z(3), Seq({1.0, 2.0, 3.0}))}, {"b", spec(y(2), Seq({4.0, 5.0}))}},
+ spec({x(2),y(2),z(3)}, Seq({1.0, 2.0, 3.0, 1.0, 2.0, 3.0, 4.0, 4.0, 4.0, 5.0, 5.0, 5.0})));
+ dst.add("concat(a,b,x)", {{"a", spec(y(3), Seq({1.0, 2.0, 3.0}))}, {"b", spec(y(2), Seq({4.0, 5.0}))}},
+ spec({x(2), y(2)}, Seq({1.0, 2.0, 4.0, 5.0})));
+}
+
+//-----------------------------------------------------------------------------
+
+void generate_tensor_rename(TestBuilder &dst) {
+ dst.add("rename(a,x,y)", {{"a", spec(x(5), N())}}, spec(y(5), N()));
+ dst.add("rename(a,y,x)", {{"a", spec({y(5),z(5)}, N())}}, spec({x(5),z(5)}, N()));
+ dst.add("rename(a,z,x)", {{"a", spec({y(5),z(5)}, N())}}, spec({y(5),x(5)}, N()));
+ dst.add("rename(a,x,z)", {{"a", spec({x(5),y(5)}, N())}}, spec({z(5),y(5)}, N()));
+ dst.add("rename(a,y,z)", {{"a", spec({x(5),y(5)}, N())}}, spec({x(5),z(5)}, N()));
+ dst.add("rename(a,(x,y),(y,x))", {{"a", spec({x(5),y(5)}, N())}}, spec({y(5),x(5)}, N()));
+}
+
+//-----------------------------------------------------------------------------
+
+void generate_tensor_lambda(TestBuilder &dst) {
+ dst.add("tensor(x[10])(x+1)", {{}}, spec(x(10), N()));
+ dst.add("tensor(x[5],y[4])(x*4+(y+1))", {{}}, spec({x(5),y(4)}, N()));
+ dst.add("tensor(x[5],y[4])(x==y)", {{}}, spec({x(5),y(4)},
+ Seq({ 1.0, 0.0, 0.0, 0.0,
+ 0.0, 1.0, 0.0, 0.0,
+ 0.0, 0.0, 1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0,
+ 0.0, 0.0, 0.0, 0.0})));
+}
+
+//-----------------------------------------------------------------------------
void
Generator::generate(TestBuilder &dst)
{
- // smoke tests with expected result
- dst.add("a+a", {{"a", spec(2.0)}}, spec(4.0));
- dst.add("a*b", {{"a", spec(2.0)}, {"b", spec(3.0)}}, spec(6.0));
- dst.add("(a+b)*(a-b)", {{"a", spec(5.0)}, {"b", spec(2.0)}}, spec(21.0));
- // smoke test without expected result
- dst.add("(a-b)/(a+b)", {{"a", spec(5.0)}, {"b", spec(2.0)}});
+ generate_tensor_reduce(dst);
+ generate_tensor_map(dst);
+ generate_tensor_join(dst);
+ generate_dot_product(dst);
+ generate_tensor_concat(dst);
+ generate_tensor_rename(dst);
+ generate_tensor_lambda(dst);
}
diff --git a/eval/src/apps/tensor_conformance/tensor_conformance.cpp b/eval/src/apps/tensor_conformance/tensor_conformance.cpp
index cfe9542ecda..f594bdc207f 100644
--- a/eval/src/apps/tensor_conformance/tensor_conformance.cpp
+++ b/eval/src/apps/tensor_conformance/tensor_conformance.cpp
@@ -250,8 +250,8 @@ void for_each_test(Input &in,
while (in.obtain().size > 0) {
Slime slime;
if (JsonFormat::decode(in, slime)) {
- bool is_test = slime.get()["expression"].valid();
- bool is_summary = slime.get()["num_tests"].valid();
+ bool is_test = slime["expression"].valid();
+ bool is_summary = slime["num_tests"].valid();
ASSERT_TRUE(is_test != is_summary);
if (is_test) {
++num_tests;
@@ -259,7 +259,7 @@ void for_each_test(Input &in,
handle_test(slime);
} else {
got_summary = true;
- ASSERT_EQUAL(slime.get()["num_tests"].asLong(), int64_t(num_tests));
+ ASSERT_EQUAL(slime["num_tests"].asLong(), int64_t(num_tests));
handle_summary(slime);
}
} else {
@@ -274,7 +274,7 @@ void for_each_test(Input &in,
void evaluate(Input &in, Output &out) {
auto handle_test = [&out](Slime &slime)
{
- insert_value(slime.get()["result"], "prod_cpp",
+ insert_value(slime["result"], "prod_cpp",
eval_expr(slime.get(), DefaultTensorEngine::ref()));
write_compact(slime, out);
};
@@ -300,10 +300,10 @@ void verify(Input &in, Output &out) {
auto handle_test = [&out,&result_map](Slime &slime)
{
TensorSpec reference_result = eval_expr(slime.get(), SimpleTensorEngine::ref());
- for (const auto &result: extract_fields(slime.get()["result"])) {
+ for (const auto &result: extract_fields(slime["result"])) {
++result_map[result];
TEST_STATE(make_string("verifying result: '%s'", result.c_str()).c_str());
- if (!EXPECT_EQUAL(reference_result, extract_value(slime.get()["result"][result]))) {
+ if (!EXPECT_EQUAL(reference_result, extract_value(slime["result"][result]))) {
dump_test(slime.get());
}
}
diff --git a/eval/src/apps/tensor_conformance/test_spec.json b/eval/src/apps/tensor_conformance/test_spec.json
index c66931c2df8..286cc428cd9 100644
--- a/eval/src/apps/tensor_conformance/test_spec.json
+++ b/eval/src/apps/tensor_conformance/test_spec.json
@@ -1,5 +1,1209 @@
-{"expression":"a+a","inputs":{"a":"0x02004000000000000000"},"result":{"expect":"0x02004010000000000000"}}
-{"expression":"a*b","inputs":{"a":"0x02004000000000000000","b":"0x02004008000000000000"},"result":{"expect":"0x02004018000000000000"}}
-{"expression":"(a+b)*(a-b)","inputs":{"a":"0x02004014000000000000","b":"0x02004000000000000000"},"result":{"expect":"0x02004035000000000000"}}
-{"expression":"(a-b)/(a+b)","inputs":{"a":"0x02004014000000000000","b":"0x02004000000000000000"},"result":{"expect":"0x02003FDB6DB6DB6DB6DB"}}
-{"num_tests":4}
+{"expression":"reduce(a,avg,x)","inputs":{"a":"0x02010178033FF000000000000040000000000000004008000000000000"},"result":{"expect":"0x02004000000000000000"}}
+{"expression":"reduce(a,avg)","inputs":{"a":"0x02010178033FF000000000000040000000000000004008000000000000"},"result":{"expect":"0x02004000000000000000"}}
+{"expression":"reduce(a,avg,x)","inputs":{"a":"0x02020178030179053FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E000000000000"},"result":{"expect":"0x02010179054018000000000000401C000000000000402000000000000040220000000000004024000000000000"}}
+{"expression":"reduce(a,avg,y)","inputs":{"a":"0x02020178030179053FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E000000000000"},"result":{"expect":"0x020101780340080000000000004020000000000000402A000000000000"}}
+{"expression":"reduce(a,avg)","inputs":{"a":"0x02020178030179053FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E000000000000"},"result":{"expect":"0x02004020000000000000"}}
+{"expression":"reduce(a,avg,x)","inputs":{"a":"0x0203017803017905017A073FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E0000000000004030000000000000403100000000000040320000000000004033000000000000403400000000000040350000000000004036000000000000403700000000000040380000000000004039000000000000403A000000000000403B000000000000403C000000000000403D000000000000403E000000000000403F00000000000040400000000000004040800000000000404100000000000040418000000000004042000000000000404280000000000040430000000000004043800000000000404400000000000040448000000000004045000000000000404580000000000040460000000000004046800000000000404700000000000040478000000000004048000000000000404880000000000040490000000000004049800000000000404A000000000000404A800000000000404B000000000000404B800000000000404C000000000000404C800000000000404D000000000000404D800000000000404E000000000000404E800000000000404F000000000000404F8000000000004050000000000000405040000000000040508000000000004050C000000000004051000000000000405140000000000040518000000000004051C000000000004052000000000000405240000000000040528000000000004052C000000000004053000000000000405340000000000040538000000000004053C000000000004054000000000000405440000000000040548000000000004054C000000000004055000000000000405540000000000040558000000000004055C000000000004056000000000000405640000000000040568000000000004056C000000000004057000000000000405740000000000040578000000000004057C000000000004058000000000000405840000000000040588000000000004058C000000000004059000000000000405940000000000040598000000000004059C00000000000405A000000000000405A400000000000"},"result":{"expect":"0x0202017905017A074042000000000000404280000000000040430000000000004043800000000000404400000000000040448000000000004045000000000000404580000000000040460000000000004046800000000000404700000000000040478000000000004048000000000000404880000000000040490000000000004049800000000000404A000000000000404A800000000000404B000000000000404B800000000000404C000000000000404C800000000000404D000000000000404D800000000000404E000000000000404E800000000000404F000000000000404F8000000000004050000000000000405040000000000040508000000000004050C00000000000405100000000000040514000000000004051800000000000"}}
+{"expression":"reduce(a,avg,y)","inputs":{"a":"0x0203017803017905017A073FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E0000000000004030000000000000403100000000000040320000000000004033000000000000403400000000000040350000000000004036000000000000403700000000000040380000000000004039000000000000403A000000000000403B000000000000403C000000000000403D000000000000403E000000000000403F00000000000040400000000000004040800000000000404100000000000040418000000000004042000000000000404280000000000040430000000000004043800000000000404400000000000040448000000000004045000000000000404580000000000040460000000000004046800000000000404700000000000040478000000000004048000000000000404880000000000040490000000000004049800000000000404A000000000000404A800000000000404B000000000000404B800000000000404C000000000000404C800000000000404D000000000000404D800000000000404E000000000000404E800000000000404F000000000000404F8000000000004050000000000000405040000000000040508000000000004050C000000000004051000000000000405140000000000040518000000000004051C000000000004052000000000000405240000000000040528000000000004052C000000000004053000000000000405340000000000040538000000000004053C000000000004054000000000000405440000000000040548000000000004054C000000000004055000000000000405540000000000040558000000000004055C000000000004056000000000000405640000000000040568000000000004056C000000000004057000000000000405740000000000040578000000000004057C000000000004058000000000000405840000000000040588000000000004058C000000000004059000000000000405940000000000040598000000000004059C00000000000405A000000000000405A400000000000"},"result":{"expect":"0x0202017803017A07402E00000000000040300000000000004031000000000000403200000000000040330000000000004034000000000000403500000000000040490000000000004049800000000000404A000000000000404A800000000000404B000000000000404B800000000000404C000000000000405540000000000040558000000000004055C000000000004056000000000000405640000000000040568000000000004056C00000000000"}}
+{"expression":"reduce(a,avg,z)","inputs":{"a":"0x0203017803017905017A073FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E0000000000004030000000000000403100000000000040320000000000004033000000000000403400000000000040350000000000004036000000000000403700000000000040380000000000004039000000000000403A000000000000403B000000000000403C000000000000403D000000000000403E000000000000403F00000000000040400000000000004040800000000000404100000000000040418000000000004042000000000000404280000000000040430000000000004043800000000000404400000000000040448000000000004045000000000000404580000000000040460000000000004046800000000000404700000000000040478000000000004048000000000000404880000000000040490000000000004049800000000000404A000000000000404A800000000000404B000000000000404B800000000000404C000000000000404C800000000000404D000000000000404D800000000000404E000000000000404E800000000000404F000000000000404F8000000000004050000000000000405040000000000040508000000000004050C000000000004051000000000000405140000000000040518000000000004051C000000000004052000000000000405240000000000040528000000000004052C000000000004053000000000000405340000000000040538000000000004053C000000000004054000000000000405440000000000040548000000000004054C000000000004055000000000000405540000000000040558000000000004055C000000000004056000000000000405640000000000040568000000000004056C000000000004057000000000000405740000000000040578000000000004057C000000000004058000000000000405840000000000040588000000000004058C000000000004059000000000000405940000000000040598000000000004059C00000000000405A000000000000405A400000000000"},"result":{"expect":"0x02020178030179054010000000000000402600000000000040320000000000004039000000000000404000000000000040438000000000004047000000000000404A800000000000404E0000000000004050C000000000004052800000000000405440000000000040560000000000004057C000000000004059800000000000"}}
+{"expression":"reduce(a,avg)","inputs":{"a":"0x0203017803017905017A073FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E0000000000004030000000000000403100000000000040320000000000004033000000000000403400000000000040350000000000004036000000000000403700000000000040380000000000004039000000000000403A000000000000403B000000000000403C000000000000403D000000000000403E000000000000403F00000000000040400000000000004040800000000000404100000000000040418000000000004042000000000000404280000000000040430000000000004043800000000000404400000000000040448000000000004045000000000000404580000000000040460000000000004046800000000000404700000000000040478000000000004048000000000000404880000000000040490000000000004049800000000000404A000000000000404A800000000000404B000000000000404B800000000000404C000000000000404C800000000000404D000000000000404D800000000000404E000000000000404E800000000000404F000000000000404F8000000000004050000000000000405040000000000040508000000000004050C000000000004051000000000000405140000000000040518000000000004051C000000000004052000000000000405240000000000040528000000000004052C000000000004053000000000000405340000000000040538000000000004053C000000000004054000000000000405440000000000040548000000000004054C000000000004055000000000000405540000000000040558000000000004055C000000000004056000000000000405640000000000040568000000000004056C000000000004057000000000000405740000000000040578000000000004057C000000000004058000000000000405840000000000040588000000000004058C000000000004059000000000000405940000000000040598000000000004059C00000000000405A000000000000405A400000000000"},"result":{"expect":"0x0200404A800000000000"}}
+{"expression":"reduce(a,avg,x)","inputs":{"a":"0x010101780301613FF00000000000000162400000000000000001634008000000000000"},"result":{"expect":"0x02004000000000000000"}}
+{"expression":"reduce(a,avg)","inputs":{"a":"0x010101780301613FF00000000000000162400000000000000001634008000000000000"},"result":{"expect":"0x02004000000000000000"}}
+{"expression":"reduce(a,avg,x)","inputs":{"a":"0x010201780179060161036261724000000000000000016103666F6F3FF00000000000000162036261724010000000000000016203666F6F40080000000000000163036261724018000000000000016303666F6F4014000000000000"},"result":{"expect":"0x010101790203626172401000000000000003666F6F4008000000000000"}}
+{"expression":"reduce(a,avg,y)","inputs":{"a":"0x010201780179060161036261724000000000000000016103666F6F3FF00000000000000162036261724010000000000000016203666F6F40080000000000000163036261724018000000000000016303666F6F4014000000000000"},"result":{"expect":"0x010101780301613FF80000000000000162400C00000000000001634016000000000000"}}
+{"expression":"reduce(a,avg)","inputs":{"a":"0x010201780179060161036261724000000000000000016103666F6F3FF00000000000000162036261724010000000000000016203666F6F40080000000000000163036261724018000000000000016303666F6F4014000000000000"},"result":{"expect":"0x0200400C000000000000"}}
+{"expression":"reduce(a,avg,x)","inputs":{"a":"0x010301780179017A1801610362617201694014000000000000016103626172016A4018000000000000016103626172016B401C000000000000016103626172016C4020000000000000016103666F6F01693FF0000000000000016103666F6F016A4000000000000000016103666F6F016B4008000000000000016103666F6F016C40100000000000000162036261720169402A000000000000016203626172016A402C000000000000016203626172016B402E000000000000016203626172016C4030000000000000016203666F6F01694022000000000000016203666F6F016A4024000000000000016203666F6F016B4026000000000000016203666F6F016C402800000000000001630362617201694035000000000000016303626172016A4036000000000000016303626172016B4037000000000000016303626172016C4038000000000000016303666F6F01694031000000000000016303666F6F016A4032000000000000016303666F6F016B4033000000000000016303666F6F016C4034000000000000"},"result":{"expect":"0x01020179017A08036261720169402A00000000000003626172016A402C00000000000003626172016B402E00000000000003626172016C403000000000000003666F6F0169402200000000000003666F6F016A402400000000000003666F6F016B402600000000000003666F6F016C4028000000000000"}}
+{"expression":"reduce(a,avg,y)","inputs":{"a":"0x010301780179017A1801610362617201694014000000000000016103626172016A4018000000000000016103626172016B401C000000000000016103626172016C4020000000000000016103666F6F01693FF0000000000000016103666F6F016A4000000000000000016103666F6F016B4008000000000000016103666F6F016C40100000000000000162036261720169402A000000000000016203626172016A402C000000000000016203626172016B402E000000000000016203626172016C4030000000000000016203666F6F01694022000000000000016203666F6F016A4024000000000000016203666F6F016B4026000000000000016203666F6F016C402800000000000001630362617201694035000000000000016303626172016A4036000000000000016303626172016B4037000000000000016303626172016C4038000000000000016303666F6F01694031000000000000016303666F6F016A4032000000000000016303666F6F016B4033000000000000016303666F6F016C4034000000000000"},"result":{"expect":"0x01020178017A0C0161016940080000000000000161016A40100000000000000161016B40140000000000000161016C40180000000000000162016940260000000000000162016A40280000000000000162016B402A0000000000000162016C402C0000000000000163016940330000000000000163016A40340000000000000163016B40350000000000000163016C4036000000000000"}}
+{"expression":"reduce(a,avg,z)","inputs":{"a":"0x010301780179017A1801610362617201694014000000000000016103626172016A4018000000000000016103626172016B401C000000000000016103626172016C4020000000000000016103666F6F01693FF0000000000000016103666F6F016A4000000000000000016103666F6F016B4008000000000000016103666F6F016C40100000000000000162036261720169402A000000000000016203626172016A402C000000000000016203626172016B402E000000000000016203626172016C4030000000000000016203666F6F01694022000000000000016203666F6F016A4024000000000000016203666F6F016B4026000000000000016203666F6F016C402800000000000001630362617201694035000000000000016303626172016A4036000000000000016303626172016B4037000000000000016303626172016C4038000000000000016303666F6F01694031000000000000016303666F6F016A4032000000000000016303666F6F016B4033000000000000016303666F6F016C4034000000000000"},"result":{"expect":"0x01020178017906016103626172401A000000000000016103666F6F4004000000000000016203626172402D000000000000016203666F6F40250000000000000163036261724036800000000000016303666F6F4032800000000000"}}
+{"expression":"reduce(a,avg)","inputs":{"a":"0x010301780179017A1801610362617201694014000000000000016103626172016A4018000000000000016103626172016B401C000000000000016103626172016C4020000000000000016103666F6F01693FF0000000000000016103666F6F016A4000000000000000016103666F6F016B4008000000000000016103666F6F016C40100000000000000162036261720169402A000000000000016203626172016A402C000000000000016203626172016B402E000000000000016203626172016C4030000000000000016203666F6F01694022000000000000016203666F6F016A4024000000000000016203666F6F016B4026000000000000016203666F6F016C402800000000000001630362617201694035000000000000016303626172016A4036000000000000016303626172016B4037000000000000016303626172016C4038000000000000016303666F6F01694031000000000000016303666F6F016A4032000000000000016303666F6F016B4033000000000000016303666F6F016C4034000000000000"},"result":{"expect":"0x02004029000000000000"}}
+{"expression":"reduce(a,avg,x)","inputs":{"a":"0x0301017902017803017A07020362617240200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C0000000000004036000000000000403700000000000040380000000000004039000000000000403A000000000000403B000000000000403C000000000000404200000000000040428000000000004043000000000000404380000000000040440000000000004044800000000000404500000000000003666F6F3FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C000000000000402E000000000000403000000000000040310000000000004032000000000000403300000000000040340000000000004035000000000000403D000000000000403E000000000000403F0000000000004040000000000000404080000000000040410000000000004041800000000000"},"result":{"expect":"0x0301017901017A0702036261724036000000000000403700000000000040380000000000004039000000000000403A000000000000403B000000000000403C00000000000003666F6F402E000000000000403000000000000040310000000000004032000000000000403300000000000040340000000000004035000000000000"}}
+{"expression":"reduce(a,avg,y)","inputs":{"a":"0x0301017902017803017A07020362617240200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C0000000000004036000000000000403700000000000040380000000000004039000000000000403A000000000000403B000000000000403C000000000000404200000000000040428000000000004043000000000000404380000000000040440000000000004044800000000000404500000000000003666F6F3FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C000000000000402E000000000000403000000000000040310000000000004032000000000000403300000000000040340000000000004035000000000000403D000000000000403E000000000000403F0000000000004040000000000000404080000000000040410000000000004041800000000000"},"result":{"expect":"0x0202017803017A0740120000000000004016000000000000401A000000000000401E000000000000402100000000000040230000000000004025000000000000403280000000000040338000000000004034800000000000403580000000000040368000000000004037800000000000403880000000000040404000000000004040C0000000000040414000000000004041C0000000000040424000000000004042C000000000004043400000000000"}}
+{"expression":"reduce(a,avg,z)","inputs":{"a":"0x0301017902017803017A07020362617240200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C0000000000004036000000000000403700000000000040380000000000004039000000000000403A000000000000403B000000000000403C000000000000404200000000000040428000000000004043000000000000404380000000000040440000000000004044800000000000404500000000000003666F6F3FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C000000000000402E000000000000403000000000000040310000000000004032000000000000403300000000000040340000000000004035000000000000403D000000000000403E000000000000403F0000000000004040000000000000404080000000000040410000000000004041800000000000"},"result":{"expect":"0x0301017901017803020362617240260000000000004039000000000000404380000000000003666F6F401000000000000040320000000000004040000000000000"}}
+{"expression":"reduce(a,avg)","inputs":{"a":"0x0301017902017803017A07020362617240200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C0000000000004036000000000000403700000000000040380000000000004039000000000000403A000000000000403B000000000000403C000000000000404200000000000040428000000000004043000000000000404380000000000040440000000000004044800000000000404500000000000003666F6F3FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C000000000000402E000000000000403000000000000040310000000000004032000000000000403300000000000040340000000000004035000000000000403D000000000000403E000000000000403F0000000000004040000000000000404080000000000040410000000000004041800000000000"},"result":{"expect":"0x02004035800000000000"}}
+{"expression":"reduce(a,avg,x)","inputs":{"a":"0x03020178017A010179050C016101693FF000000000000040140000000000004022000000000000402A00000000000040310000000000000161016A400000000000000040180000000000004024000000000000402C00000000000040320000000000000161016B4008000000000000401C0000000000004026000000000000402E00000000000040330000000000000161016C401000000000000040200000000000004028000000000000403000000000000040340000000000000162016940350000000000004039000000000000403D000000000000404080000000000040428000000000000162016A4036000000000000403A000000000000403E000000000000404100000000000040430000000000000162016B4037000000000000403B000000000000403F000000000000404180000000000040438000000000000162016C4038000000000000403C00000000000040400000000000004042000000000000404400000000000001630169404480000000000040468000000000004048800000000000404A800000000000404C8000000000000163016A404500000000000040470000000000004049000000000000404B000000000000404D0000000000000163016B404580000000000040478000000000004049800000000000404B800000000000404D8000000000000163016C40460000000000004048000000000000404A000000000000404C000000000000404E000000000000"},"result":{"expect":"0x0301017A0101790504016940350000000000004039000000000000403D00000000000040408000000000004042800000000000016A4036000000000000403A000000000000403E00000000000040410000000000004043000000000000016B4037000000000000403B000000000000403F00000000000040418000000000004043800000000000016C4038000000000000403C000000000000404000000000000040420000000000004044000000000000"}}
+{"expression":"reduce(a,avg,y)","inputs":{"a":"0x03020178017A010179050C016101693FF000000000000040140000000000004022000000000000402A00000000000040310000000000000161016A400000000000000040180000000000004024000000000000402C00000000000040320000000000000161016B4008000000000000401C0000000000004026000000000000402E00000000000040330000000000000161016C401000000000000040200000000000004028000000000000403000000000000040340000000000000162016940350000000000004039000000000000403D000000000000404080000000000040428000000000000162016A4036000000000000403A000000000000403E000000000000404100000000000040430000000000000162016B4037000000000000403B000000000000403F000000000000404180000000000040438000000000000162016C4038000000000000403C00000000000040400000000000004042000000000000404400000000000001630169404480000000000040468000000000004048800000000000404A800000000000404C8000000000000163016A404500000000000040470000000000004049000000000000404B000000000000404D0000000000000163016B404580000000000040478000000000004049800000000000404B800000000000404D8000000000000163016C40460000000000004048000000000000404A000000000000404C000000000000404E000000000000"},"result":{"expect":"0x01020178017A0C0161016940220000000000000161016A40240000000000000161016B40260000000000000161016C402800000000000001620169403D0000000000000162016A403E0000000000000162016B403F0000000000000162016C40400000000000000163016940488000000000000163016A40490000000000000163016B40498000000000000163016C404A000000000000"}}
+{"expression":"reduce(a,avg,z)","inputs":{"a":"0x03020178017A010179050C016101693FF000000000000040140000000000004022000000000000402A00000000000040310000000000000161016A400000000000000040180000000000004024000000000000402C00000000000040320000000000000161016B4008000000000000401C0000000000004026000000000000402E00000000000040330000000000000161016C401000000000000040200000000000004028000000000000403000000000000040340000000000000162016940350000000000004039000000000000403D000000000000404080000000000040428000000000000162016A4036000000000000403A000000000000403E000000000000404100000000000040430000000000000162016B4037000000000000403B000000000000403F000000000000404180000000000040438000000000000162016C4038000000000000403C00000000000040400000000000004042000000000000404400000000000001630169404480000000000040468000000000004048800000000000404A800000000000404C8000000000000163016A404500000000000040470000000000004049000000000000404B000000000000404D0000000000000163016B404580000000000040478000000000004049800000000000404B800000000000404D8000000000000163016C40460000000000004048000000000000404A000000000000404C000000000000404E000000000000"},"result":{"expect":"0x03010178010179050301614004000000000000401A0000000000004025000000000000402D000000000000403280000000000001624036800000000000403A800000000000403E800000000000404140000000000040434000000000000163404540000000000040474000000000004049400000000000404B400000000000404D400000000000"}}
+{"expression":"reduce(a,avg)","inputs":{"a":"0x03020178017A010179050C016101693FF000000000000040140000000000004022000000000000402A00000000000040310000000000000161016A400000000000000040180000000000004024000000000000402C00000000000040320000000000000161016B4008000000000000401C0000000000004026000000000000402E00000000000040330000000000000161016C401000000000000040200000000000004028000000000000403000000000000040340000000000000162016940350000000000004039000000000000403D000000000000404080000000000040428000000000000162016A4036000000000000403A000000000000403E000000000000404100000000000040430000000000000162016B4037000000000000403B000000000000403F000000000000404180000000000040438000000000000162016C4038000000000000403C00000000000040400000000000004042000000000000404400000000000001630169404480000000000040468000000000004048800000000000404A800000000000404C8000000000000163016A404500000000000040470000000000004049000000000000404B000000000000404D0000000000000163016B404580000000000040478000000000004049800000000000404B800000000000404D8000000000000163016C40460000000000004048000000000000404A000000000000404C000000000000404E000000000000"},"result":{"expect":"0x0200403E800000000000"}}
+{"expression":"reduce(a,count,x)","inputs":{"a":"0x02010178033FF000000000000040000000000000004008000000000000"},"result":{"expect":"0x02004008000000000000"}}
+{"expression":"reduce(a,count)","inputs":{"a":"0x02010178033FF000000000000040000000000000004008000000000000"},"result":{"expect":"0x02004008000000000000"}}
+{"expression":"reduce(a,count,x)","inputs":{"a":"0x02020178030179053FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E000000000000"},"result":{"expect":"0x020101790540080000000000004008000000000000400800000000000040080000000000004008000000000000"}}
+{"expression":"reduce(a,count,y)","inputs":{"a":"0x02020178030179053FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E000000000000"},"result":{"expect":"0x0201017803401400000000000040140000000000004014000000000000"}}
+{"expression":"reduce(a,count)","inputs":{"a":"0x02020178030179053FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E000000000000"},"result":{"expect":"0x0200402E000000000000"}}
+{"expression":"reduce(a,count,x)","inputs":{"a":"0x0203017803017905017A073FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E0000000000004030000000000000403100000000000040320000000000004033000000000000403400000000000040350000000000004036000000000000403700000000000040380000000000004039000000000000403A000000000000403B000000000000403C000000000000403D000000000000403E000000000000403F00000000000040400000000000004040800000000000404100000000000040418000000000004042000000000000404280000000000040430000000000004043800000000000404400000000000040448000000000004045000000000000404580000000000040460000000000004046800000000000404700000000000040478000000000004048000000000000404880000000000040490000000000004049800000000000404A000000000000404A800000000000404B000000000000404B800000000000404C000000000000404C800000000000404D000000000000404D800000000000404E000000000000404E800000000000404F000000000000404F8000000000004050000000000000405040000000000040508000000000004050C000000000004051000000000000405140000000000040518000000000004051C000000000004052000000000000405240000000000040528000000000004052C000000000004053000000000000405340000000000040538000000000004053C000000000004054000000000000405440000000000040548000000000004054C000000000004055000000000000405540000000000040558000000000004055C000000000004056000000000000405640000000000040568000000000004056C000000000004057000000000000405740000000000040578000000000004057C000000000004058000000000000405840000000000040588000000000004058C000000000004059000000000000405940000000000040598000000000004059C00000000000405A000000000000405A400000000000"},"result":{"expect":"0x0202017905017A0740080000000000004008000000000000400800000000000040080000000000004008000000000000400800000000000040080000000000004008000000000000400800000000000040080000000000004008000000000000400800000000000040080000000000004008000000000000400800000000000040080000000000004008000000000000400800000000000040080000000000004008000000000000400800000000000040080000000000004008000000000000400800000000000040080000000000004008000000000000400800000000000040080000000000004008000000000000400800000000000040080000000000004008000000000000400800000000000040080000000000004008000000000000"}}
+{"expression":"reduce(a,count,y)","inputs":{"a":"0x0203017803017905017A073FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E0000000000004030000000000000403100000000000040320000000000004033000000000000403400000000000040350000000000004036000000000000403700000000000040380000000000004039000000000000403A000000000000403B000000000000403C000000000000403D000000000000403E000000000000403F00000000000040400000000000004040800000000000404100000000000040418000000000004042000000000000404280000000000040430000000000004043800000000000404400000000000040448000000000004045000000000000404580000000000040460000000000004046800000000000404700000000000040478000000000004048000000000000404880000000000040490000000000004049800000000000404A000000000000404A800000000000404B000000000000404B800000000000404C000000000000404C800000000000404D000000000000404D800000000000404E000000000000404E800000000000404F000000000000404F8000000000004050000000000000405040000000000040508000000000004050C000000000004051000000000000405140000000000040518000000000004051C000000000004052000000000000405240000000000040528000000000004052C000000000004053000000000000405340000000000040538000000000004053C000000000004054000000000000405440000000000040548000000000004054C000000000004055000000000000405540000000000040558000000000004055C000000000004056000000000000405640000000000040568000000000004056C000000000004057000000000000405740000000000040578000000000004057C000000000004058000000000000405840000000000040588000000000004058C000000000004059000000000000405940000000000040598000000000004059C00000000000405A000000000000405A400000000000"},"result":{"expect":"0x0202017803017A07401400000000000040140000000000004014000000000000401400000000000040140000000000004014000000000000401400000000000040140000000000004014000000000000401400000000000040140000000000004014000000000000401400000000000040140000000000004014000000000000401400000000000040140000000000004014000000000000401400000000000040140000000000004014000000000000"}}
+{"expression":"reduce(a,count,z)","inputs":{"a":"0x0203017803017905017A073FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E0000000000004030000000000000403100000000000040320000000000004033000000000000403400000000000040350000000000004036000000000000403700000000000040380000000000004039000000000000403A000000000000403B000000000000403C000000000000403D000000000000403E000000000000403F00000000000040400000000000004040800000000000404100000000000040418000000000004042000000000000404280000000000040430000000000004043800000000000404400000000000040448000000000004045000000000000404580000000000040460000000000004046800000000000404700000000000040478000000000004048000000000000404880000000000040490000000000004049800000000000404A000000000000404A800000000000404B000000000000404B800000000000404C000000000000404C800000000000404D000000000000404D800000000000404E000000000000404E800000000000404F000000000000404F8000000000004050000000000000405040000000000040508000000000004050C000000000004051000000000000405140000000000040518000000000004051C000000000004052000000000000405240000000000040528000000000004052C000000000004053000000000000405340000000000040538000000000004053C000000000004054000000000000405440000000000040548000000000004054C000000000004055000000000000405540000000000040558000000000004055C000000000004056000000000000405640000000000040568000000000004056C000000000004057000000000000405740000000000040578000000000004057C000000000004058000000000000405840000000000040588000000000004058C000000000004059000000000000405940000000000040598000000000004059C00000000000405A000000000000405A400000000000"},"result":{"expect":"0x0202017803017905401C000000000000401C000000000000401C000000000000401C000000000000401C000000000000401C000000000000401C000000000000401C000000000000401C000000000000401C000000000000401C000000000000401C000000000000401C000000000000401C000000000000401C000000000000"}}
+{"expression":"reduce(a,count)","inputs":{"a":"0x0203017803017905017A073FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E0000000000004030000000000000403100000000000040320000000000004033000000000000403400000000000040350000000000004036000000000000403700000000000040380000000000004039000000000000403A000000000000403B000000000000403C000000000000403D000000000000403E000000000000403F00000000000040400000000000004040800000000000404100000000000040418000000000004042000000000000404280000000000040430000000000004043800000000000404400000000000040448000000000004045000000000000404580000000000040460000000000004046800000000000404700000000000040478000000000004048000000000000404880000000000040490000000000004049800000000000404A000000000000404A800000000000404B000000000000404B800000000000404C000000000000404C800000000000404D000000000000404D800000000000404E000000000000404E800000000000404F000000000000404F8000000000004050000000000000405040000000000040508000000000004050C000000000004051000000000000405140000000000040518000000000004051C000000000004052000000000000405240000000000040528000000000004052C000000000004053000000000000405340000000000040538000000000004053C000000000004054000000000000405440000000000040548000000000004054C000000000004055000000000000405540000000000040558000000000004055C000000000004056000000000000405640000000000040568000000000004056C000000000004057000000000000405740000000000040578000000000004057C000000000004058000000000000405840000000000040588000000000004058C000000000004059000000000000405940000000000040598000000000004059C00000000000405A000000000000405A400000000000"},"result":{"expect":"0x0200405A400000000000"}}
+{"expression":"reduce(a,count,x)","inputs":{"a":"0x010101780301613FF00000000000000162400000000000000001634008000000000000"},"result":{"expect":"0x02004008000000000000"}}
+{"expression":"reduce(a,count)","inputs":{"a":"0x010101780301613FF00000000000000162400000000000000001634008000000000000"},"result":{"expect":"0x02004008000000000000"}}
+{"expression":"reduce(a,count,x)","inputs":{"a":"0x010201780179060161036261724000000000000000016103666F6F3FF00000000000000162036261724010000000000000016203666F6F40080000000000000163036261724018000000000000016303666F6F4014000000000000"},"result":{"expect":"0x010101790203626172400800000000000003666F6F4008000000000000"}}
+{"expression":"reduce(a,count,y)","inputs":{"a":"0x010201780179060161036261724000000000000000016103666F6F3FF00000000000000162036261724010000000000000016203666F6F40080000000000000163036261724018000000000000016303666F6F4014000000000000"},"result":{"expect":"0x0101017803016140000000000000000162400000000000000001634000000000000000"}}
+{"expression":"reduce(a,count)","inputs":{"a":"0x010201780179060161036261724000000000000000016103666F6F3FF00000000000000162036261724010000000000000016203666F6F40080000000000000163036261724018000000000000016303666F6F4014000000000000"},"result":{"expect":"0x02004018000000000000"}}
+{"expression":"reduce(a,count,x)","inputs":{"a":"0x010301780179017A1801610362617201694014000000000000016103626172016A4018000000000000016103626172016B401C000000000000016103626172016C4020000000000000016103666F6F01693FF0000000000000016103666F6F016A4000000000000000016103666F6F016B4008000000000000016103666F6F016C40100000000000000162036261720169402A000000000000016203626172016A402C000000000000016203626172016B402E000000000000016203626172016C4030000000000000016203666F6F01694022000000000000016203666F6F016A4024000000000000016203666F6F016B4026000000000000016203666F6F016C402800000000000001630362617201694035000000000000016303626172016A4036000000000000016303626172016B4037000000000000016303626172016C4038000000000000016303666F6F01694031000000000000016303666F6F016A4032000000000000016303666F6F016B4033000000000000016303666F6F016C4034000000000000"},"result":{"expect":"0x01020179017A08036261720169400800000000000003626172016A400800000000000003626172016B400800000000000003626172016C400800000000000003666F6F0169400800000000000003666F6F016A400800000000000003666F6F016B400800000000000003666F6F016C4008000000000000"}}
+{"expression":"reduce(a,count,y)","inputs":{"a":"0x010301780179017A1801610362617201694014000000000000016103626172016A4018000000000000016103626172016B401C000000000000016103626172016C4020000000000000016103666F6F01693FF0000000000000016103666F6F016A4000000000000000016103666F6F016B4008000000000000016103666F6F016C40100000000000000162036261720169402A000000000000016203626172016A402C000000000000016203626172016B402E000000000000016203626172016C4030000000000000016203666F6F01694022000000000000016203666F6F016A4024000000000000016203666F6F016B4026000000000000016203666F6F016C402800000000000001630362617201694035000000000000016303626172016A4036000000000000016303626172016B4037000000000000016303626172016C4038000000000000016303666F6F01694031000000000000016303666F6F016A4032000000000000016303666F6F016B4033000000000000016303666F6F016C4034000000000000"},"result":{"expect":"0x01020178017A0C0161016940000000000000000161016A40000000000000000161016B40000000000000000161016C40000000000000000162016940000000000000000162016A40000000000000000162016B40000000000000000162016C40000000000000000163016940000000000000000163016A40000000000000000163016B40000000000000000163016C4000000000000000"}}
+{"expression":"reduce(a,count,z)","inputs":{"a":"0x010301780179017A1801610362617201694014000000000000016103626172016A4018000000000000016103626172016B401C000000000000016103626172016C4020000000000000016103666F6F01693FF0000000000000016103666F6F016A4000000000000000016103666F6F016B4008000000000000016103666F6F016C40100000000000000162036261720169402A000000000000016203626172016A402C000000000000016203626172016B402E000000000000016203626172016C4030000000000000016203666F6F01694022000000000000016203666F6F016A4024000000000000016203666F6F016B4026000000000000016203666F6F016C402800000000000001630362617201694035000000000000016303626172016A4036000000000000016303626172016B4037000000000000016303626172016C4038000000000000016303666F6F01694031000000000000016303666F6F016A4032000000000000016303666F6F016B4033000000000000016303666F6F016C4034000000000000"},"result":{"expect":"0x010201780179060161036261724010000000000000016103666F6F40100000000000000162036261724010000000000000016203666F6F40100000000000000163036261724010000000000000016303666F6F4010000000000000"}}
+{"expression":"reduce(a,count)","inputs":{"a":"0x010301780179017A1801610362617201694014000000000000016103626172016A4018000000000000016103626172016B401C000000000000016103626172016C4020000000000000016103666F6F01693FF0000000000000016103666F6F016A4000000000000000016103666F6F016B4008000000000000016103666F6F016C40100000000000000162036261720169402A000000000000016203626172016A402C000000000000016203626172016B402E000000000000016203626172016C4030000000000000016203666F6F01694022000000000000016203666F6F016A4024000000000000016203666F6F016B4026000000000000016203666F6F016C402800000000000001630362617201694035000000000000016303626172016A4036000000000000016303626172016B4037000000000000016303626172016C4038000000000000016303666F6F01694031000000000000016303666F6F016A4032000000000000016303666F6F016B4033000000000000016303666F6F016C4034000000000000"},"result":{"expect":"0x02004038000000000000"}}
+{"expression":"reduce(a,count,x)","inputs":{"a":"0x0301017902017803017A07020362617240200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C0000000000004036000000000000403700000000000040380000000000004039000000000000403A000000000000403B000000000000403C000000000000404200000000000040428000000000004043000000000000404380000000000040440000000000004044800000000000404500000000000003666F6F3FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C000000000000402E000000000000403000000000000040310000000000004032000000000000403300000000000040340000000000004035000000000000403D000000000000403E000000000000403F0000000000004040000000000000404080000000000040410000000000004041800000000000"},"result":{"expect":"0x0301017901017A070203626172400800000000000040080000000000004008000000000000400800000000000040080000000000004008000000000000400800000000000003666F6F4008000000000000400800000000000040080000000000004008000000000000400800000000000040080000000000004008000000000000"}}
+{"expression":"reduce(a,count,y)","inputs":{"a":"0x0301017902017803017A07020362617240200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C0000000000004036000000000000403700000000000040380000000000004039000000000000403A000000000000403B000000000000403C000000000000404200000000000040428000000000004043000000000000404380000000000040440000000000004044800000000000404500000000000003666F6F3FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C000000000000402E000000000000403000000000000040310000000000004032000000000000403300000000000040340000000000004035000000000000403D000000000000403E000000000000403F0000000000004040000000000000404080000000000040410000000000004041800000000000"},"result":{"expect":"0x0202017803017A07400000000000000040000000000000004000000000000000400000000000000040000000000000004000000000000000400000000000000040000000000000004000000000000000400000000000000040000000000000004000000000000000400000000000000040000000000000004000000000000000400000000000000040000000000000004000000000000000400000000000000040000000000000004000000000000000"}}
+{"expression":"reduce(a,count,z)","inputs":{"a":"0x0301017902017803017A07020362617240200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C0000000000004036000000000000403700000000000040380000000000004039000000000000403A000000000000403B000000000000403C000000000000404200000000000040428000000000004043000000000000404380000000000040440000000000004044800000000000404500000000000003666F6F3FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C000000000000402E000000000000403000000000000040310000000000004032000000000000403300000000000040340000000000004035000000000000403D000000000000403E000000000000403F0000000000004040000000000000404080000000000040410000000000004041800000000000"},"result":{"expect":"0x03010179010178030203626172401C000000000000401C000000000000401C00000000000003666F6F401C000000000000401C000000000000401C000000000000"}}
+{"expression":"reduce(a,count)","inputs":{"a":"0x0301017902017803017A07020362617240200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C0000000000004036000000000000403700000000000040380000000000004039000000000000403A000000000000403B000000000000403C000000000000404200000000000040428000000000004043000000000000404380000000000040440000000000004044800000000000404500000000000003666F6F3FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C000000000000402E000000000000403000000000000040310000000000004032000000000000403300000000000040340000000000004035000000000000403D000000000000403E000000000000403F0000000000004040000000000000404080000000000040410000000000004041800000000000"},"result":{"expect":"0x02004045000000000000"}}
+{"expression":"reduce(a,count,x)","inputs":{"a":"0x03020178017A010179050C016101693FF000000000000040140000000000004022000000000000402A00000000000040310000000000000161016A400000000000000040180000000000004024000000000000402C00000000000040320000000000000161016B4008000000000000401C0000000000004026000000000000402E00000000000040330000000000000161016C401000000000000040200000000000004028000000000000403000000000000040340000000000000162016940350000000000004039000000000000403D000000000000404080000000000040428000000000000162016A4036000000000000403A000000000000403E000000000000404100000000000040430000000000000162016B4037000000000000403B000000000000403F000000000000404180000000000040438000000000000162016C4038000000000000403C00000000000040400000000000004042000000000000404400000000000001630169404480000000000040468000000000004048800000000000404A800000000000404C8000000000000163016A404500000000000040470000000000004049000000000000404B000000000000404D0000000000000163016B404580000000000040478000000000004049800000000000404B800000000000404D8000000000000163016C40460000000000004048000000000000404A000000000000404C000000000000404E000000000000"},"result":{"expect":"0x0301017A0101790504016940080000000000004008000000000000400800000000000040080000000000004008000000000000016A40080000000000004008000000000000400800000000000040080000000000004008000000000000016B40080000000000004008000000000000400800000000000040080000000000004008000000000000016C40080000000000004008000000000000400800000000000040080000000000004008000000000000"}}
+{"expression":"reduce(a,count,y)","inputs":{"a":"0x03020178017A010179050C016101693FF000000000000040140000000000004022000000000000402A00000000000040310000000000000161016A400000000000000040180000000000004024000000000000402C00000000000040320000000000000161016B4008000000000000401C0000000000004026000000000000402E00000000000040330000000000000161016C401000000000000040200000000000004028000000000000403000000000000040340000000000000162016940350000000000004039000000000000403D000000000000404080000000000040428000000000000162016A4036000000000000403A000000000000403E000000000000404100000000000040430000000000000162016B4037000000000000403B000000000000403F000000000000404180000000000040438000000000000162016C4038000000000000403C00000000000040400000000000004042000000000000404400000000000001630169404480000000000040468000000000004048800000000000404A800000000000404C8000000000000163016A404500000000000040470000000000004049000000000000404B000000000000404D0000000000000163016B404580000000000040478000000000004049800000000000404B800000000000404D8000000000000163016C40460000000000004048000000000000404A000000000000404C000000000000404E000000000000"},"result":{"expect":"0x01020178017A0C0161016940140000000000000161016A40140000000000000161016B40140000000000000161016C40140000000000000162016940140000000000000162016A40140000000000000162016B40140000000000000162016C40140000000000000163016940140000000000000163016A40140000000000000163016B40140000000000000163016C4014000000000000"}}
+{"expression":"reduce(a,count,z)","inputs":{"a":"0x03020178017A010179050C016101693FF000000000000040140000000000004022000000000000402A00000000000040310000000000000161016A400000000000000040180000000000004024000000000000402C00000000000040320000000000000161016B4008000000000000401C0000000000004026000000000000402E00000000000040330000000000000161016C401000000000000040200000000000004028000000000000403000000000000040340000000000000162016940350000000000004039000000000000403D000000000000404080000000000040428000000000000162016A4036000000000000403A000000000000403E000000000000404100000000000040430000000000000162016B4037000000000000403B000000000000403F000000000000404180000000000040438000000000000162016C4038000000000000403C00000000000040400000000000004042000000000000404400000000000001630169404480000000000040468000000000004048800000000000404A800000000000404C8000000000000163016A404500000000000040470000000000004049000000000000404B000000000000404D0000000000000163016B404580000000000040478000000000004049800000000000404B800000000000404D8000000000000163016C40460000000000004048000000000000404A000000000000404C000000000000404E000000000000"},"result":{"expect":"0x030101780101790503016140100000000000004010000000000000401000000000000040100000000000004010000000000000016240100000000000004010000000000000401000000000000040100000000000004010000000000000016340100000000000004010000000000000401000000000000040100000000000004010000000000000"}}
+{"expression":"reduce(a,count)","inputs":{"a":"0x03020178017A010179050C016101693FF000000000000040140000000000004022000000000000402A00000000000040310000000000000161016A400000000000000040180000000000004024000000000000402C00000000000040320000000000000161016B4008000000000000401C0000000000004026000000000000402E00000000000040330000000000000161016C401000000000000040200000000000004028000000000000403000000000000040340000000000000162016940350000000000004039000000000000403D000000000000404080000000000040428000000000000162016A4036000000000000403A000000000000403E000000000000404100000000000040430000000000000162016B4037000000000000403B000000000000403F000000000000404180000000000040438000000000000162016C4038000000000000403C00000000000040400000000000004042000000000000404400000000000001630169404480000000000040468000000000004048800000000000404A800000000000404C8000000000000163016A404500000000000040470000000000004049000000000000404B000000000000404D0000000000000163016B404580000000000040478000000000004049800000000000404B800000000000404D8000000000000163016C40460000000000004048000000000000404A000000000000404C000000000000404E000000000000"},"result":{"expect":"0x0200404E000000000000"}}
+{"expression":"reduce(a,prod,x)","inputs":{"a":"0x02010178033FE764D4F5D5A2BD3FEC2F7D5A8A79C93FEE7B7CBC36FABD"},"result":{"expect":"0x02003FE3A0C6D6CDDF1C"}}
+{"expression":"reduce(a,prod)","inputs":{"a":"0x02010178033FE764D4F5D5A2BD3FEC2F7D5A8A79C93FEE7B7CBC36FABD"},"result":{"expect":"0x02003FE3A0C6D6CDDF1C"}}
+{"expression":"reduce(a,prod,x)","inputs":{"a":"0x02020178030179053FE764D4F5D5A2BD3FEC2F7D5A8A79C93FEE7B7CBC36FABD3FEF6CA82F0DE1EA3FEFC92C130538E23FEFEBBE888D05813FEFF889631D483C3FEFFD40B84505A23FEFFEFD390A9CC13FEFFFA0CB346F893FEFFFDCF97E0F4A3FEFFFF31D5F129E3FEFFFFB427F64DC3FEFFFFE4193A8783FEFFFFF5BC51E39"},"result":{"expect":"0x02010179053FE755EC89C2D9973FEC28DF270AB4843FEE78DA4B7665D13FEF6BA85949A8FF3FEFC8CCDE39ABB0"}}
+{"expression":"reduce(a,prod,y)","inputs":{"a":"0x02020178030179053FE764D4F5D5A2BD3FEC2F7D5A8A79C93FEE7B7CBC36FABD3FEF6CA82F0DE1EA3FEFC92C130538E23FEFEBBE888D05813FEFF889631D483C3FEFFD40B84505A23FEFFEFD390A9CC13FEFFFA0CB346F893FEFFFDCF97E0F4A3FEFFFF31D5F129E3FEFFFFB427F64DC3FEFFFFE4193A8783FEFFFFF5BC51E39"},"result":{"expect":"0x02010178033FE3255FF45BC60C3FEFE02F161461673FEFFFC8F6CE767E"}}
+{"expression":"reduce(a,prod)","inputs":{"a":"0x02020178030179053FE764D4F5D5A2BD3FEC2F7D5A8A79C93FEE7B7CBC36FABD3FEF6CA82F0DE1EA3FEFC92C130538E23FEFEBBE888D05813FEFF889631D483C3FEFFD40B84505A23FEFFEFD390A9CC13FEFFFA0CB346F893FEFFFDCF97E0F4A3FEFFFF31D5F129E3FEFFFFB427F64DC3FEFFFFE4193A8783FEFFFFF5BC51E39"},"result":{"expect":"0x02003FE31235F3827378"}}
+{"expression":"reduce(a,prod,x)","inputs":{"a":"0x0203017803017905017A073FE764D4F5D5A2BD3FEC2F7D5A8A79C93FEE7B7CBC36FABD3FEF6CA82F0DE1EA3FEFC92C130538E23FEFEBBE888D05813FEFF889631D483C3FEFFD40B84505A23FEFFEFD390A9CC13FEFFFA0CB346F893FEFFFDCF97E0F4A3FEFFFF31D5F129E3FEFFFFB427F64DC3FEFFFFE4193A8783FEFFFFF5BC51E393FEFFFFFC39548FC3FEFFFFFE9C61CF73FEFFFFFF7D2CEBC3FEFFFFFFCFDF5203FEFFFFFFEE4B79A3FEFFFFFFF97C93C3FEFFFFFFFD9A96E3FEFFFFFFFF1E56C3FEFFFFFFFFACFBE3FEFFFFFFFFE175C3FEFFFFFFFFF4C3E3FEFFFFFFFFFBDDE3FEFFFFFFFFFE7AC3FEFFFFFFFFFF70C3FEFFFFFFFFFFCB63FEFFFFFFFFFFECA3FEFFFFFFFFFFF8E3FEFFFFFFFFFFFD63FEFFFFFFFFFFFF03FEFFFFFFFFFFFFA3FEFFFFFFFFFFFFE3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"},"result":{"expect":"0x0202017905017A073FE764D4F5D5A2BC3FEC2F7D5A8A79C93FEE7B7CBC36FABD3FEF6CA82F0DE1EA3FEFC92C130538E23FEFEBBE888D05813FEFF889631D483C3FEFFD40B84505A23FEFFEFD390A9CC13FEFFFA0CB346F893FEFFFDCF97E0F4A3FEFFFF31D5F129E3FEFFFFB427F64DC3FEFFFFE4193A8783FEFFFFF5BC51E393FEFFFFFC39548FC3FEFFFFFE9C61CF73FEFFFFFF7D2CEBC3FEFFFFFFCFDF5203FEFFFFFFEE4B79A3FEFFFFFFF97C93C3FEFFFFFFFD9A96E3FEFFFFFFFF1E56C3FEFFFFFFFFACFBE3FEFFFFFFFFE175C3FEFFFFFFFFF4C3E3FEFFFFFFFFFBDDE3FEFFFFFFFFFE7AC3FEFFFFFFFFFF70C3FEFFFFFFFFFFCB63FEFFFFFFFFFFECA3FEFFFFFFFFFFF8E3FEFFFFFFFFFFFD63FEFFFFFFFFFFFF03FEFFFFFFFFFFFFA"}}
+{"expression":"reduce(a,prod,y)","inputs":{"a":"0x0203017803017905017A073FE764D4F5D5A2BD3FEC2F7D5A8A79C93FEE7B7CBC36FABD3FEF6CA82F0DE1EA3FEFC92C130538E23FEFEBBE888D05813FEFF889631D483C3FEFFD40B84505A23FEFFEFD390A9CC13FEFFFA0CB346F893FEFFFDCF97E0F4A3FEFFFF31D5F129E3FEFFFFB427F64DC3FEFFFFE4193A8783FEFFFFF5BC51E393FEFFFFFC39548FC3FEFFFFFE9C61CF73FEFFFFFF7D2CEBC3FEFFFFFFCFDF5203FEFFFFFFEE4B79A3FEFFFFFFF97C93C3FEFFFFFFFD9A96E3FEFFFFFFFF1E56C3FEFFFFFFFFACFBE3FEFFFFFFFFE175C3FEFFFFFFFFF4C3E3FEFFFFFFFFFBDDE3FEFFFFFFFFFE7AC3FEFFFFFFFFFF70C3FEFFFFFFFFFFCB63FEFFFFFFFFFFECA3FEFFFFFFFFFFF8E3FEFFFFFFFFFFFD63FEFFFFFFFFFFFF03FEFFFFFFFFFFFFA3FEFFFFFFFFFFFFE3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"},"result":{"expect":"0x0202017803017A073FE762D25A1D34B23FEC2E9937280B433FEE7B21F6215AF13FEF6C85C1C891CA3FEFC91F437A7BCC3FEFEBB9CCF1B66A3FEFF887A4B0D8603FEFFFFFFFFFFFFE3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"reduce(a,prod,z)","inputs":{"a":"0x0203017803017905017A073FE764D4F5D5A2BD3FEC2F7D5A8A79C93FEE7B7CBC36FABD3FEF6CA82F0DE1EA3FEFC92C130538E23FEFEBBE888D05813FEFF889631D483C3FEFFD40B84505A23FEFFEFD390A9CC13FEFFFA0CB346F893FEFFFDCF97E0F4A3FEFFFF31D5F129E3FEFFFFB427F64DC3FEFFFFE4193A8783FEFFFFF5BC51E393FEFFFFFC39548FC3FEFFFFFE9C61CF73FEFFFFFF7D2CEBC3FEFFFFFFCFDF5203FEFFFFFFEE4B79A3FEFFFFFFF97C93C3FEFFFFFFFD9A96E3FEFFFFFFFF1E56C3FEFFFFFFFFACFBE3FEFFFFFFFFE175C3FEFFFFFFFFF4C3E3FEFFFFFFFFFBDDE3FEFFFFFFFFFE7AC3FEFFFFFFFFFF70C3FEFFFFFFFFFFCB63FEFFFFFFFFFFECA3FEFFFFFFFFFFF8E3FEFFFFFFFFFFFD63FEFFFFFFFFFFFF03FEFFFFFFFFFFFFA3FEFFFFFFFFFFFFE3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"},"result":{"expect":"0x02020178030179053FE314CD1BECD3773FEFFBA87FF697C23FEFFFFEFC6DCB133FEFFFFFFFC367BC3FEFFFFFFFFFF1DA3FEFFFFFFFFFFFFE3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"reduce(a,prod)","inputs":{"a":"0x0203017803017905017A073FE764D4F5D5A2BD3FEC2F7D5A8A79C93FEE7B7CBC36FABD3FEF6CA82F0DE1EA3FEFC92C130538E23FEFEBBE888D05813FEFF889631D483C3FEFFD40B84505A23FEFFEFD390A9CC13FEFFFA0CB346F893FEFFFDCF97E0F4A3FEFFFF31D5F129E3FEFFFFB427F64DC3FEFFFFE4193A8783FEFFFFF5BC51E393FEFFFFFC39548FC3FEFFFFFE9C61CF73FEFFFFFF7D2CEBC3FEFFFFFFCFDF5203FEFFFFFFEE4B79A3FEFFFFFFF97C93C3FEFFFFFFFD9A96E3FEFFFFFFFF1E56C3FEFFFFFFFFACFBE3FEFFFFFFFFE175C3FEFFFFFFFFF4C3E3FEFFFFFFFFFBDDE3FEFFFFFFFFFE7AC3FEFFFFFFFFFF70C3FEFFFFFFFFFFCB63FEFFFFFFFFFFECA3FEFFFFFFFFFFF8E3FEFFFFFFFFFFFD63FEFFFFFFFFFFFF03FEFFFFFFFFFFFFA3FEFFFFFFFFFFFFE3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"},"result":{"expect":"0x02003FE31235BA8C31C4"}}
+{"expression":"reduce(a,prod,x)","inputs":{"a":"0x010101780301613FE764D4F5D5A2BD01623FEC2F7D5A8A79C901633FEE7B7CBC36FABD"},"result":{"expect":"0x02003FE3A0C6D6CDDF1C"}}
+{"expression":"reduce(a,prod)","inputs":{"a":"0x010101780301613FE764D4F5D5A2BD01623FEC2F7D5A8A79C901633FEE7B7CBC36FABD"},"result":{"expect":"0x02003FE3A0C6D6CDDF1C"}}
+{"expression":"reduce(a,prod,x)","inputs":{"a":"0x010201780179060161036261723FEC2F7D5A8A79C9016103666F6F3FE764D4F5D5A2BD0162036261723FEF6CA82F0DE1EA016203666F6F3FEE7B7CBC36FABD0163036261723FEFEBBE888D0581016303666F6F3FEFC92C130538E2"},"result":{"expect":"0x0101017902036261723FEB9C30A7B9060803666F6F3FE6229FF7F09CEC"}}
+{"expression":"reduce(a,prod,y)","inputs":{"a":"0x010201780179060161036261723FEC2F7D5A8A79C9016103666F6F3FE764D4F5D5A2BD0162036261723FEF6CA82F0DE1EA016203666F6F3FEE7B7CBC36FABD0163036261723FEFEBBE888D0581016303666F6F3FEFC92C130538E2"},"result":{"expect":"0x010101780301613FE49AF213F4B34901623FEDEF21D071F12801633FEFB50D50317D96"}}
+{"expression":"reduce(a,prod)","inputs":{"a":"0x010201780179060161036261723FEC2F7D5A8A79C9016103666F6F3FE764D4F5D5A2BD0162036261723FEF6CA82F0DE1EA016203666F6F3FEE7B7CBC36FABD0163036261723FEFEBBE888D0581016303666F6F3FEFC92C130538E2"},"result":{"expect":"0x02003FE319416D005C7C"}}
+{"expression":"reduce(a,prod,x)","inputs":{"a":"0x010301780179017A1801610362617201693FEFC92C130538E2016103626172016A3FEFEBBE888D0581016103626172016B3FEFF889631D483C016103626172016C3FEFFD40B84505A2016103666F6F01693FE764D4F5D5A2BD016103666F6F016A3FEC2F7D5A8A79C9016103666F6F016B3FEE7B7CBC36FABD016103666F6F016C3FEF6CA82F0DE1EA01620362617201693FEFFFFB427F64DC016203626172016A3FEFFFFE4193A878016203626172016B3FEFFFFF5BC51E39016203626172016C3FEFFFFFC39548FC016203666F6F01693FEFFEFD390A9CC1016203666F6F016A3FEFFFA0CB346F89016203666F6F016B3FEFFFDCF97E0F4A016203666F6F016C3FEFFFF31D5F129E01630362617201693FEFFFFFFF97C93C016303626172016A3FEFFFFFFFD9A96E016303626172016B3FEFFFFFFFF1E56C016303626172016C3FEFFFFFFFFACFBE016303666F6F01693FEFFFFFE9C61CF7016303666F6F016A3FEFFFFFF7D2CEBC016303666F6F016B3FEFFFFFFCFDF520016303666F6F016C3FEFFFFFFEE4B79A"},"result":{"expect":"0x01020179017A080362617201693FEFC9275D3C474103626172016A3FEFEBBCCB1504B303626172016B3FEFF888BEFA9CCB03626172016C3FEFFD407BDA4E9E03666F6F01693FE76417B72E39DD03666F6F016A3FEC2F2977DA44B303666F6F016B3FEE7B5B5C161BC003666F6F016C3FEF6C9B86AB347B"}}
+{"expression":"reduce(a,prod,y)","inputs":{"a":"0x010301780179017A1801610362617201693FEFC92C130538E2016103626172016A3FEFEBBE888D0581016103626172016B3FEFF889631D483C016103626172016C3FEFFD40B84505A2016103666F6F01693FE764D4F5D5A2BD016103666F6F016A3FEC2F7D5A8A79C9016103666F6F016B3FEE7B7CBC36FABD016103666F6F016C3FEF6CA82F0DE1EA01620362617201693FEFFFFB427F64DC016203626172016A3FEFFFFE4193A878016203626172016B3FEFFFFF5BC51E39016203626172016C3FEFFFFFC39548FC016203666F6F01693FEFFEFD390A9CC1016203666F6F016A3FEFFFA0CB346F89016203666F6F016B3FEFFFDCF97E0F4A016203666F6F016C3FEFFFF31D5F129E01630362617201693FEFFFFFFF97C93C016303626172016A3FEFFFFFFFD9A96E016303626172016B3FEFFFFFFFF1E56C016303626172016C3FEFFFFFFFFACFBE016303666F6F01693FEFFFFFE9C61CF7016303666F6F016A3FEFFFFFF7D2CEBC016303666F6F016B3FEFFFFFFCFDF520016303666F6F016C3FEFFFFFFEE4B79A"},"result":{"expect":"0x01020178017A0C016101693FE73CBFE05B9D5C0161016A3FEC1DA6028563590161016B3FEE7460BC1FE1680161016C3FEF69F58D8E659A016201693FEFFEF87BB056F30162016A3FEFFF9F0CCD48330162016B3FEFFFDC5543E1450162016C3FEFFFF2E0F473EE016301693FEFFFFFE95DE6330163016A3FEFFFFFF7AC782A0163016B3FEFFFFFFCEFDA8C0163016C3FEFFFFFFEDF8758"}}
+{"expression":"reduce(a,prod,z)","inputs":{"a":"0x010301780179017A1801610362617201693FEFC92C130538E2016103626172016A3FEFEBBE888D0581016103626172016B3FEFF889631D483C016103626172016C3FEFFD40B84505A2016103666F6F01693FE764D4F5D5A2BD016103666F6F016A3FEC2F7D5A8A79C9016103666F6F016B3FEE7B7CBC36FABD016103666F6F016C3FEF6CA82F0DE1EA01620362617201693FEFFFFB427F64DC016203626172016A3FEFFFFE4193A878016203626172016B3FEFFFFF5BC51E39016203626172016C3FEFFFFFC39548FC016203666F6F01693FEFFEFD390A9CC1016203666F6F016A3FEFFFA0CB346F89016203666F6F016B3FEFFFDCF97E0F4A016203666F6F016C3FEFFFF31D5F129E01630362617201693FEFFFFFFF97C93C016303626172016A3FEFFFFFFFD9A96E016303626172016B3FEFFFFFFFF1E56C016303626172016C3FEFFFFFFFFACFBE016303666F6F01693FEFFFFFE9C61CF7016303666F6F016A3FEFFFFFF7D2CEBC016303666F6F016B3FEFFFFFFCFDF520016303666F6F016C3FEFFFFFFEE4B79A"},"result":{"expect":"0x010201780179060161036261723FEFAAEFF82A7803016103666F6F3FE34666681CF69B0162036261723FEFFFF8A36DE565016203666F6F3FEFFE6E203E29E40163036261723FEFFFFFFF5E27D4016303666F6F3FEFFFFFDD7B9877"}}
+{"expression":"reduce(a,prod)","inputs":{"a":"0x010301780179017A1801610362617201693FEFC92C130538E2016103626172016A3FEFEBBE888D0581016103626172016B3FEFF889631D483C016103626172016C3FEFFD40B84505A2016103666F6F01693FE764D4F5D5A2BD016103666F6F016A3FEC2F7D5A8A79C9016103666F6F016B3FEE7B7CBC36FABD016103666F6F016C3FEF6CA82F0DE1EA01620362617201693FEFFFFB427F64DC016203626172016A3FEFFFFE4193A878016203626172016B3FEFFFFF5BC51E39016203626172016C3FEFFFFFC39548FC016203666F6F01693FEFFEFD390A9CC1016203666F6F016A3FEFFFA0CB346F89016203666F6F016B3FEFFFDCF97E0F4A016203666F6F016C3FEFFFF31D5F129E01630362617201693FEFFFFFFF97C93C016303626172016A3FEFFFFFFFD9A96E016303626172016B3FEFFFFFFFF1E56C016303626172016C3FEFFFFFFFFACFBE016303666F6F01693FEFFFFFE9C61CF7016303666F6F016A3FEFFFFFF7D2CEBC016303666F6F016B3FEFFFFFFCFDF520016303666F6F016C3FEFFFFFFEE4B79A"},"result":{"expect":"0x02003FE31235BA8DFE78"}}
+{"expression":"reduce(a,prod,x)","inputs":{"a":"0x0301017902017803017A0702036261723FEFFD40B84505A23FEFFEFD390A9CC13FEFFFA0CB346F893FEFFFDCF97E0F4A3FEFFFF31D5F129E3FEFFFFB427F64DC3FEFFFFE4193A8783FEFFFFFFFD9A96E3FEFFFFFFFF1E56C3FEFFFFFFFFACFBE3FEFFFFFFFFE175C3FEFFFFFFFFF4C3E3FEFFFFFFFFFBDDE3FEFFFFFFFFFE7AC3FEFFFFFFFFFFFFE3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000003666F6F3FE764D4F5D5A2BD3FEC2F7D5A8A79C93FEE7B7CBC36FABD3FEF6CA82F0DE1EA3FEFC92C130538E23FEFEBBE888D05813FEFF889631D483C3FEFFFFF5BC51E393FEFFFFFC39548FC3FEFFFFFE9C61CF73FEFFFFFF7D2CEBC3FEFFFFFFCFDF5203FEFFFFFFEE4B79A3FEFFFFFFF97C93C3FEFFFFFFFFFF70C3FEFFFFFFFFFFCB63FEFFFFFFFFFFECA3FEFFFFFFFFFFF8E3FEFFFFFFFFFFFD63FEFFFFFFFFFFFF03FEFFFFFFFFFFFFA"},"result":{"expect":"0x0301017901017A0702036261723FEFFD40B81EB2593FEFFEFD38FC829F3FEFFFA0CB2F3F563FEFFFDCF97C26A83FEFFFF31D5E5EDC3FEFFFFB427F22BA3FEFFFFE4193902403666F6F3FE764D47DC5CCF53FEC2F7D25536D573FEE7B7CA70AEF9A3FEF6CA8270656413FEFC92C100855363FEFEBBE8772705C3FEFF88962B529C0"}}
+{"expression":"reduce(a,prod,y)","inputs":{"a":"0x0301017902017803017A0702036261723FEFFD40B84505A23FEFFEFD390A9CC13FEFFFA0CB346F893FEFFFDCF97E0F4A3FEFFFF31D5F129E3FEFFFFB427F64DC3FEFFFFE4193A8783FEFFFFFFFD9A96E3FEFFFFFFFF1E56C3FEFFFFFFFFACFBE3FEFFFFFFFFE175C3FEFFFFFFFFF4C3E3FEFFFFFFFFFBDDE3FEFFFFFFFFFE7AC3FEFFFFFFFFFFFFE3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000003666F6F3FE764D4F5D5A2BD3FEC2F7D5A8A79C93FEE7B7CBC36FABD3FEF6CA82F0DE1EA3FEFC92C130538E23FEFEBBE888D05813FEFF889631D483C3FEFFFFF5BC51E393FEFFFFFC39548FC3FEFFFFFE9C61CF73FEFFFFFF7D2CEBC3FEFFFFFFCFDF5203FEFFFFFFEE4B79A3FEFFFFFFF97C93C3FEFFFFFFFFFF70C3FEFFFFFFFFFFCB63FEFFFFFFFFFFECA3FEFFFFFFFFFFF8E3FEFFFFFFFFFFFD63FEFFFFFFFFFFFF03FEFFFFFFFFFFFFA"},"result":{"expect":"0x0202017803017A073FE762D2D23EC0703FEC2E996C69D52A3FEE7B220B52184C3FEF6C85C9D1F4823FEFC91F467810D23FEFEBB9CE0C8D5D3FEFF887A5190F233FEFFFFF5B9EC7A83FEFFFFFC3872E683FEFFFFFE9C0ECB53FEFFFFFF7D0E6183FEFFFFFFCFD415E3FEFFFFFFEE475783FEFFFFFFF97B0E83FEFFFFFFFFFF70A3FEFFFFFFFFFFCB63FEFFFFFFFFFFECA3FEFFFFFFFFFFF8E3FEFFFFFFFFFFFD63FEFFFFFFFFFFFF03FEFFFFFFFFFFFFA"}}
+{"expression":"reduce(a,prod,z)","inputs":{"a":"0x0301017902017803017A0702036261723FEFFD40B84505A23FEFFEFD390A9CC13FEFFFA0CB346F893FEFFFDCF97E0F4A3FEFFFF31D5F129E3FEFFFFB427F64DC3FEFFFFE4193A8783FEFFFFFFFD9A96E3FEFFFFFFFF1E56C3FEFFFFFFFFACFBE3FEFFFFFFFFE175C3FEFFFFFFFFF4C3E3FEFFFFFFFFFBDDE3FEFFFFFFFFFE7AC3FEFFFFFFFFFFFFE3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000003666F6F3FE764D4F5D5A2BD3FEC2F7D5A8A79C93FEE7B7CBC36FABD3FEF6CA82F0DE1EA3FEFC92C130538E23FEFEBBE888D05813FEFF889631D483C3FEFFFFF5BC51E393FEFFFFFC39548FC3FEFFFFFE9C61CF73FEFFFFFF7D2CEBC3FEFFFFFFCFDF5203FEFFFFFFEE4B79A3FEFFFFFFF97C93C3FEFFFFFFFFFF70C3FEFFFFFFFFFFCB63FEFFFFFFFFFFECA3FEFFFFFFFFFFF8E3FEFFFFFFFFFFFD63FEFFFFFFFFFFFF03FEFFFFFFFFFFFFA"},"result":{"expect":"0x030101790101780302036261723FEFFBA87FF697C23FEFFFFFFFC367BC3FEFFFFFFFFFFFFE03666F6F3FE314CD1BECD3773FEFFFFEFC6DCB143FEFFFFFFFFFF1DA"}}
+{"expression":"reduce(a,prod)","inputs":{"a":"0x0301017902017803017A0702036261723FEFFD40B84505A23FEFFEFD390A9CC13FEFFFA0CB346F893FEFFFDCF97E0F4A3FEFFFF31D5F129E3FEFFFFB427F64DC3FEFFFFE4193A8783FEFFFFFFFD9A96E3FEFFFFFFFF1E56C3FEFFFFFFFFACFBE3FEFFFFFFFFE175C3FEFFFFFFFFF4C3E3FEFFFFFFFFFBDDE3FEFFFFFFFFFE7AC3FEFFFFFFFFFFFFE3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000003666F6F3FE764D4F5D5A2BD3FEC2F7D5A8A79C93FEE7B7CBC36FABD3FEF6CA82F0DE1EA3FEFC92C130538E23FEFEBBE888D05813FEFF889631D483C3FEFFFFF5BC51E393FEFFFFFC39548FC3FEFFFFFE9C61CF73FEFFFFFF7D2CEBC3FEFFFFFFCFDF5203FEFFFFFFEE4B79A3FEFFFFFFF97C93C3FEFFFFFFFFFF70C3FEFFFFFFFFFFCB63FEFFFFFFFFFFECA3FEFFFFFFFFFFF8E3FEFFFFFFFFFFFD63FEFFFFFFFFFFFF03FEFFFFFFFFFFFFA"},"result":{"expect":"0x02003FE31235BA8C31C5"}}
+{"expression":"reduce(a,prod,x)","inputs":{"a":"0x03020178017A010179050C016101693FE764D4F5D5A2BD3FEFC92C130538E23FEFFEFD390A9CC13FEFFFFB427F64DC3FEFFFFFE9C61CF70161016A3FEC2F7D5A8A79C93FEFEBBE888D05813FEFFFA0CB346F893FEFFFFE4193A8783FEFFFFFF7D2CEBC0161016B3FEE7B7CBC36FABD3FEFF889631D483C3FEFFFDCF97E0F4A3FEFFFFF5BC51E393FEFFFFFFCFDF5200161016C3FEF6CA82F0DE1EA3FEFFD40B84505A23FEFFFF31D5F129E3FEFFFFFC39548FC3FEFFFFFFEE4B79A016201693FEFFFFFFF97C93C3FEFFFFFFFFE175C3FEFFFFFFFFFF70C3FEFFFFFFFFFFFD63FF00000000000000162016A3FEFFFFFFFD9A96E3FEFFFFFFFFF4C3E3FEFFFFFFFFFFCB63FEFFFFFFFFFFFF03FF00000000000000162016B3FEFFFFFFFF1E56C3FEFFFFFFFFFBDDE3FEFFFFFFFFFFECA3FEFFFFFFFFFFFFA3FF00000000000000162016C3FEFFFFFFFFACFBE3FEFFFFFFFFFE7AC3FEFFFFFFFFFFF8E3FEFFFFFFFFFFFFE3FF0000000000000016301693FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016A3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016B3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016C3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"},"result":{"expect":"0x0301017A010179050401693FE764D4F58972FF3FEFC92C130353833FEFFEFD390A93CD3FEFFFFB427F64B23FEFFFFFE9C61CF7016A3FEC2F7D5A68B5243FEFEBBE888C52313FEFFFA0CB346C3F3FEFFFFE4193A8683FEFFFFFF7D2CEBC016B3FEE7B7CBC298B653FEFF889631D06293FEFFFDCF97E0E143FEFFFFF5BC51E333FEFFFFFFCFDF520016C3FEF6CA82F08C98C3FEFFD40B844ED503FEFFFF31D5F122C3FEFFFFFC39548FA3FEFFFFFFEE4B79A"}}
+{"expression":"reduce(a,prod,y)","inputs":{"a":"0x03020178017A010179050C016101693FE764D4F5D5A2BD3FEFC92C130538E23FEFFEFD390A9CC13FEFFFFB427F64DC3FEFFFFFE9C61CF70161016A3FEC2F7D5A8A79C93FEFEBBE888D05813FEFFFA0CB346F893FEFFFFE4193A8783FEFFFFFF7D2CEBC0161016B3FEE7B7CBC36FABD3FEFF889631D483C3FEFFFDCF97E0F4A3FEFFFFF5BC51E393FEFFFFFFCFDF5200161016C3FEF6CA82F0DE1EA3FEFFD40B84505A23FEFFFF31D5F129E3FEFFFFFC39548FC3FEFFFFFFEE4B79A016201693FEFFFFFFF97C93C3FEFFFFFFFFE175C3FEFFFFFFFFFF70C3FEFFFFFFFFFFFD63FF00000000000000162016A3FEFFFFFFFD9A96E3FEFFFFFFFFF4C3E3FEFFFFFFFFFFCB63FEFFFFFFFFFFFF03FF00000000000000162016B3FEFFFFFFFF1E56C3FEFFFFFFFFFBDDE3FEFFFFFFFFFFECA3FEFFFFFFFFFFFFA3FF00000000000000162016C3FEFFFFFFFFACFBE3FEFFFFFFFFFE7AC3FEFFFFFFFFFFF8E3FEFFFFFFFFFFFFE3FF0000000000000016301693FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016A3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016B3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016C3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"},"result":{"expect":"0x01020178017A0C016101693FE73C0074DAE91E0161016A3FEC1D50CCB69E9E0161016B3FEE743EC77BF1470161016C3FEF69E8AAF29095016201693FEFFFFFFF95D77A0162016A3FEFFFFFFFD8F2520162016B3FEFFFFFFFF1A20E0162016C3FEFFFFFFFFAB6F6016301693FF00000000000000163016A3FF00000000000000163016B3FF00000000000000163016C3FF0000000000000"}}
+{"expression":"reduce(a,prod,z)","inputs":{"a":"0x03020178017A010179050C016101693FE764D4F5D5A2BD3FEFC92C130538E23FEFFEFD390A9CC13FEFFFFB427F64DC3FEFFFFFE9C61CF70161016A3FEC2F7D5A8A79C93FEFEBBE888D05813FEFFFA0CB346F893FEFFFFE4193A8783FEFFFFFF7D2CEBC0161016B3FEE7B7CBC36FABD3FEFF889631D483C3FEFFFDCF97E0F4A3FEFFFFF5BC51E393FEFFFFFFCFDF5200161016C3FEF6CA82F0DE1EA3FEFFD40B84505A23FEFFFF31D5F129E3FEFFFFFC39548FC3FEFFFFFFEE4B79A016201693FEFFFFFFF97C93C3FEFFFFFFFFE175C3FEFFFFFFFFFF70C3FEFFFFFFFFFFFD63FF00000000000000162016A3FEFFFFFFFD9A96E3FEFFFFFFFFF4C3E3FEFFFFFFFFFFCB63FEFFFFFFFFFFFF03FF00000000000000162016B3FEFFFFFFFF1E56C3FEFFFFFFFFFBDDE3FEFFFFFFFFFFECA3FEFFFFFFFFFFFFA3FF00000000000000162016C3FEFFFFFFFFACFBE3FEFFFFFFFFFE7AC3FEFFFFFFFFFFF8E3FEFFFFFFFFFFFFE3FF0000000000000016301693FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016A3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016B3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016C3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"},"result":{"expect":"0x03010178010179050301613FE34666681CF69B3FEFAAEFF82A78023FEFFE6E203E29E43FEFFFF8A36DE5653FEFFFFFDD7B987701623FEFFFFFFF5E27D43FEFFFFFFFFD09243FEFFFFFFFFFF21A3FEFFFFFFFFFFFBE3FF000000000000001633FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"reduce(a,prod)","inputs":{"a":"0x03020178017A010179050C016101693FE764D4F5D5A2BD3FEFC92C130538E23FEFFEFD390A9CC13FEFFFFB427F64DC3FEFFFFFE9C61CF70161016A3FEC2F7D5A8A79C93FEFEBBE888D05813FEFFFA0CB346F893FEFFFFE4193A8783FEFFFFFF7D2CEBC0161016B3FEE7B7CBC36FABD3FEFF889631D483C3FEFFFDCF97E0F4A3FEFFFFF5BC51E393FEFFFFFFCFDF5200161016C3FEF6CA82F0DE1EA3FEFFD40B84505A23FEFFFF31D5F129E3FEFFFFFC39548FC3FEFFFFFFEE4B79A016201693FEFFFFFFF97C93C3FEFFFFFFFFE175C3FEFFFFFFFFFF70C3FEFFFFFFFFFFFD63FF00000000000000162016A3FEFFFFFFFD9A96E3FEFFFFFFFFF4C3E3FEFFFFFFFFFFCB63FEFFFFFFFFFFFF03FF00000000000000162016B3FEFFFFFFFF1E56C3FEFFFFFFFFFBDDE3FEFFFFFFFFFFECA3FEFFFFFFFFFFFFA3FF00000000000000162016C3FEFFFFFFFFACFBE3FEFFFFFFFFFE7AC3FEFFFFFFFFFFF8E3FEFFFFFFFFFFFFE3FF0000000000000016301693FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016A3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016B3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016C3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"},"result":{"expect":"0x02003FE31235BA8C31C5"}}
+{"expression":"reduce(a,sum,x)","inputs":{"a":"0x02010178033FF000000000000040000000000000004008000000000000"},"result":{"expect":"0x02004018000000000000"}}
+{"expression":"reduce(a,sum)","inputs":{"a":"0x02010178033FF000000000000040000000000000004008000000000000"},"result":{"expect":"0x02004018000000000000"}}
+{"expression":"reduce(a,sum,x)","inputs":{"a":"0x02020178030179053FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E000000000000"},"result":{"expect":"0x0201017905403200000000000040350000000000004038000000000000403B000000000000403E000000000000"}}
+{"expression":"reduce(a,sum,y)","inputs":{"a":"0x02020178030179053FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E000000000000"},"result":{"expect":"0x0201017803402E00000000000040440000000000004050400000000000"}}
+{"expression":"reduce(a,sum)","inputs":{"a":"0x02020178030179053FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E000000000000"},"result":{"expect":"0x0200405E000000000000"}}
+{"expression":"reduce(a,sum,x)","inputs":{"a":"0x0203017803017905017A073FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E0000000000004030000000000000403100000000000040320000000000004033000000000000403400000000000040350000000000004036000000000000403700000000000040380000000000004039000000000000403A000000000000403B000000000000403C000000000000403D000000000000403E000000000000403F00000000000040400000000000004040800000000000404100000000000040418000000000004042000000000000404280000000000040430000000000004043800000000000404400000000000040448000000000004045000000000000404580000000000040460000000000004046800000000000404700000000000040478000000000004048000000000000404880000000000040490000000000004049800000000000404A000000000000404A800000000000404B000000000000404B800000000000404C000000000000404C800000000000404D000000000000404D800000000000404E000000000000404E800000000000404F000000000000404F8000000000004050000000000000405040000000000040508000000000004050C000000000004051000000000000405140000000000040518000000000004051C000000000004052000000000000405240000000000040528000000000004052C000000000004053000000000000405340000000000040538000000000004053C000000000004054000000000000405440000000000040548000000000004054C000000000004055000000000000405540000000000040558000000000004055C000000000004056000000000000405640000000000040568000000000004056C000000000004057000000000000405740000000000040578000000000004057C000000000004058000000000000405840000000000040588000000000004058C000000000004059000000000000405940000000000040598000000000004059C00000000000405A000000000000405A400000000000"},"result":{"expect":"0x0202017905017A07405B000000000000405BC00000000000405C800000000000405D400000000000405E000000000000405EC00000000000405F800000000000406020000000000040608000000000004060E0000000000040614000000000004061A00000000000406200000000000040626000000000004062C00000000000406320000000000040638000000000004063E0000000000040644000000000004064A00000000000406500000000000040656000000000004065C00000000000406620000000000040668000000000004066E0000000000040674000000000004067A00000000000406800000000000040686000000000004068C00000000000406920000000000040698000000000004069E00000000000406A400000000000"}}
+{"expression":"reduce(a,sum,y)","inputs":{"a":"0x0203017803017905017A073FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E0000000000004030000000000000403100000000000040320000000000004033000000000000403400000000000040350000000000004036000000000000403700000000000040380000000000004039000000000000403A000000000000403B000000000000403C000000000000403D000000000000403E000000000000403F00000000000040400000000000004040800000000000404100000000000040418000000000004042000000000000404280000000000040430000000000004043800000000000404400000000000040448000000000004045000000000000404580000000000040460000000000004046800000000000404700000000000040478000000000004048000000000000404880000000000040490000000000004049800000000000404A000000000000404A800000000000404B000000000000404B800000000000404C000000000000404C800000000000404D000000000000404D800000000000404E000000000000404E800000000000404F000000000000404F8000000000004050000000000000405040000000000040508000000000004050C000000000004051000000000000405140000000000040518000000000004051C000000000004052000000000000405240000000000040528000000000004052C000000000004053000000000000405340000000000040538000000000004053C000000000004054000000000000405440000000000040548000000000004054C000000000004055000000000000405540000000000040558000000000004055C000000000004056000000000000405640000000000040568000000000004056C000000000004057000000000000405740000000000040578000000000004057C000000000004058000000000000405840000000000040588000000000004058C000000000004059000000000000405940000000000040598000000000004059C00000000000405A000000000000405A400000000000"},"result":{"expect":"0x0202017803017A074052C000000000004054000000000000405540000000000040568000000000004057C000000000004059000000000000405A400000000000406F400000000000406FE00000000000407040000000000040709000000000004070E0000000000040713000000000004071800000000000407A900000000000407AE00000000000407B300000000000407B800000000000407BD00000000000407C200000000000407C700000000000"}}
+{"expression":"reduce(a,sum,z)","inputs":{"a":"0x0203017803017905017A073FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E0000000000004030000000000000403100000000000040320000000000004033000000000000403400000000000040350000000000004036000000000000403700000000000040380000000000004039000000000000403A000000000000403B000000000000403C000000000000403D000000000000403E000000000000403F00000000000040400000000000004040800000000000404100000000000040418000000000004042000000000000404280000000000040430000000000004043800000000000404400000000000040448000000000004045000000000000404580000000000040460000000000004046800000000000404700000000000040478000000000004048000000000000404880000000000040490000000000004049800000000000404A000000000000404A800000000000404B000000000000404B800000000000404C000000000000404C800000000000404D000000000000404D800000000000404E000000000000404E800000000000404F000000000000404F8000000000004050000000000000405040000000000040508000000000004050C000000000004051000000000000405140000000000040518000000000004051C000000000004052000000000000405240000000000040528000000000004052C000000000004053000000000000405340000000000040538000000000004053C000000000004054000000000000405440000000000040548000000000004054C000000000004055000000000000405540000000000040558000000000004055C000000000004056000000000000405640000000000040568000000000004056C000000000004057000000000000405740000000000040578000000000004057C000000000004058000000000000405840000000000040588000000000004058C000000000004059000000000000405940000000000040598000000000004059C00000000000405A000000000000405A400000000000"},"result":{"expect":"0x0202017803017905403C0000000000004053400000000000405F8000000000004065E00000000000406C000000000000407110000000000040742000000000004077300000000000407A400000000000407D50000000000040803000000000004081B8000000000040834000000000004084C800000000004086500000000000"}}
+{"expression":"reduce(a,sum)","inputs":{"a":"0x0203017803017905017A073FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E0000000000004030000000000000403100000000000040320000000000004033000000000000403400000000000040350000000000004036000000000000403700000000000040380000000000004039000000000000403A000000000000403B000000000000403C000000000000403D000000000000403E000000000000403F00000000000040400000000000004040800000000000404100000000000040418000000000004042000000000000404280000000000040430000000000004043800000000000404400000000000040448000000000004045000000000000404580000000000040460000000000004046800000000000404700000000000040478000000000004048000000000000404880000000000040490000000000004049800000000000404A000000000000404A800000000000404B000000000000404B800000000000404C000000000000404C800000000000404D000000000000404D800000000000404E000000000000404E800000000000404F000000000000404F8000000000004050000000000000405040000000000040508000000000004050C000000000004051000000000000405140000000000040518000000000004051C000000000004052000000000000405240000000000040528000000000004052C000000000004053000000000000405340000000000040538000000000004053C000000000004054000000000000405440000000000040548000000000004054C000000000004055000000000000405540000000000040558000000000004055C000000000004056000000000000405640000000000040568000000000004056C000000000004057000000000000405740000000000040578000000000004057C000000000004058000000000000405840000000000040588000000000004058C000000000004059000000000000405940000000000040598000000000004059C00000000000405A000000000000405A400000000000"},"result":{"expect":"0x020040B5BD0000000000"}}
+{"expression":"reduce(a,sum,x)","inputs":{"a":"0x010101780301613FF00000000000000162400000000000000001634008000000000000"},"result":{"expect":"0x02004018000000000000"}}
+{"expression":"reduce(a,sum)","inputs":{"a":"0x010101780301613FF00000000000000162400000000000000001634008000000000000"},"result":{"expect":"0x02004018000000000000"}}
+{"expression":"reduce(a,sum,x)","inputs":{"a":"0x010201780179060161036261724000000000000000016103666F6F3FF00000000000000162036261724010000000000000016203666F6F40080000000000000163036261724018000000000000016303666F6F4014000000000000"},"result":{"expect":"0x010101790203626172402800000000000003666F6F4022000000000000"}}
+{"expression":"reduce(a,sum,y)","inputs":{"a":"0x010201780179060161036261724000000000000000016103666F6F3FF00000000000000162036261724010000000000000016203666F6F40080000000000000163036261724018000000000000016303666F6F4014000000000000"},"result":{"expect":"0x0101017803016140080000000000000162401C00000000000001634026000000000000"}}
+{"expression":"reduce(a,sum)","inputs":{"a":"0x010201780179060161036261724000000000000000016103666F6F3FF00000000000000162036261724010000000000000016203666F6F40080000000000000163036261724018000000000000016303666F6F4014000000000000"},"result":{"expect":"0x02004035000000000000"}}
+{"expression":"reduce(a,sum,x)","inputs":{"a":"0x010301780179017A1801610362617201694014000000000000016103626172016A4018000000000000016103626172016B401C000000000000016103626172016C4020000000000000016103666F6F01693FF0000000000000016103666F6F016A4000000000000000016103666F6F016B4008000000000000016103666F6F016C40100000000000000162036261720169402A000000000000016203626172016A402C000000000000016203626172016B402E000000000000016203626172016C4030000000000000016203666F6F01694022000000000000016203666F6F016A4024000000000000016203666F6F016B4026000000000000016203666F6F016C402800000000000001630362617201694035000000000000016303626172016A4036000000000000016303626172016B4037000000000000016303626172016C4038000000000000016303666F6F01694031000000000000016303666F6F016A4032000000000000016303666F6F016B4033000000000000016303666F6F016C4034000000000000"},"result":{"expect":"0x01020179017A08036261720169404380000000000003626172016A404500000000000003626172016B404680000000000003626172016C404800000000000003666F6F0169403B00000000000003666F6F016A403E00000000000003666F6F016B404080000000000003666F6F016C4042000000000000"}}
+{"expression":"reduce(a,sum,y)","inputs":{"a":"0x010301780179017A1801610362617201694014000000000000016103626172016A4018000000000000016103626172016B401C000000000000016103626172016C4020000000000000016103666F6F01693FF0000000000000016103666F6F016A4000000000000000016103666F6F016B4008000000000000016103666F6F016C40100000000000000162036261720169402A000000000000016203626172016A402C000000000000016203626172016B402E000000000000016203626172016C4030000000000000016203666F6F01694022000000000000016203666F6F016A4024000000000000016203666F6F016B4026000000000000016203666F6F016C402800000000000001630362617201694035000000000000016303626172016A4036000000000000016303626172016B4037000000000000016303626172016C4038000000000000016303666F6F01694031000000000000016303666F6F016A4032000000000000016303666F6F016B4033000000000000016303666F6F016C4034000000000000"},"result":{"expect":"0x01020178017A0C0161016940180000000000000161016A40200000000000000161016B40240000000000000161016C40280000000000000162016940360000000000000162016A40380000000000000162016B403A0000000000000162016C403C0000000000000163016940430000000000000163016A40440000000000000163016B40450000000000000163016C4046000000000000"}}
+{"expression":"reduce(a,sum,z)","inputs":{"a":"0x010301780179017A1801610362617201694014000000000000016103626172016A4018000000000000016103626172016B401C000000000000016103626172016C4020000000000000016103666F6F01693FF0000000000000016103666F6F016A4000000000000000016103666F6F016B4008000000000000016103666F6F016C40100000000000000162036261720169402A000000000000016203626172016A402C000000000000016203626172016B402E000000000000016203626172016C4030000000000000016203666F6F01694022000000000000016203666F6F016A4024000000000000016203666F6F016B4026000000000000016203666F6F016C402800000000000001630362617201694035000000000000016303626172016A4036000000000000016303626172016B4037000000000000016303626172016C4038000000000000016303666F6F01694031000000000000016303666F6F016A4032000000000000016303666F6F016B4033000000000000016303666F6F016C4034000000000000"},"result":{"expect":"0x01020178017906016103626172403A000000000000016103666F6F4024000000000000016203626172404D000000000000016203666F6F40450000000000000163036261724056800000000000016303666F6F4052800000000000"}}
+{"expression":"reduce(a,sum)","inputs":{"a":"0x010301780179017A1801610362617201694014000000000000016103626172016A4018000000000000016103626172016B401C000000000000016103626172016C4020000000000000016103666F6F01693FF0000000000000016103666F6F016A4000000000000000016103666F6F016B4008000000000000016103666F6F016C40100000000000000162036261720169402A000000000000016203626172016A402C000000000000016203626172016B402E000000000000016203626172016C4030000000000000016203666F6F01694022000000000000016203666F6F016A4024000000000000016203666F6F016B4026000000000000016203666F6F016C402800000000000001630362617201694035000000000000016303626172016A4036000000000000016303626172016B4037000000000000016303626172016C4038000000000000016303666F6F01694031000000000000016303666F6F016A4032000000000000016303666F6F016B4033000000000000016303666F6F016C4034000000000000"},"result":{"expect":"0x02004072C00000000000"}}
+{"expression":"reduce(a,sum,x)","inputs":{"a":"0x0301017902017803017A07020362617240200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C0000000000004036000000000000403700000000000040380000000000004039000000000000403A000000000000403B000000000000403C000000000000404200000000000040428000000000004043000000000000404380000000000040440000000000004044800000000000404500000000000003666F6F3FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C000000000000402E000000000000403000000000000040310000000000004032000000000000403300000000000040340000000000004035000000000000403D000000000000403E000000000000403F0000000000004040000000000000404080000000000040410000000000004041800000000000"},"result":{"expect":"0x0301017901017A0702036261724050800000000000405140000000000040520000000000004052C0000000000040538000000000004054400000000000405500000000000003666F6F404680000000000040480000000000004049800000000000404B000000000000404C800000000000404E000000000000404F800000000000"}}
+{"expression":"reduce(a,sum,y)","inputs":{"a":"0x0301017902017803017A07020362617240200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C0000000000004036000000000000403700000000000040380000000000004039000000000000403A000000000000403B000000000000403C000000000000404200000000000040428000000000004043000000000000404380000000000040440000000000004044800000000000404500000000000003666F6F3FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C000000000000402E000000000000403000000000000040310000000000004032000000000000403300000000000040340000000000004035000000000000403D000000000000403E000000000000403F0000000000004040000000000000404080000000000040410000000000004041800000000000"},"result":{"expect":"0x0202017803017A0740220000000000004026000000000000402A000000000000402E000000000000403100000000000040330000000000004035000000000000404280000000000040438000000000004044800000000000404580000000000040468000000000004047800000000000404880000000000040504000000000004050C0000000000040514000000000004051C0000000000040524000000000004052C000000000004053400000000000"}}
+{"expression":"reduce(a,sum,z)","inputs":{"a":"0x0301017902017803017A07020362617240200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C0000000000004036000000000000403700000000000040380000000000004039000000000000403A000000000000403B000000000000403C000000000000404200000000000040428000000000004043000000000000404380000000000040440000000000004044800000000000404500000000000003666F6F3FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C000000000000402E000000000000403000000000000040310000000000004032000000000000403300000000000040340000000000004035000000000000403D000000000000403E000000000000403F0000000000004040000000000000404080000000000040410000000000004041800000000000"},"result":{"expect":"0x0301017901017803020362617240534000000000004065E00000000000407110000000000003666F6F403C000000000000405F800000000000406C000000000000"}}
+{"expression":"reduce(a,sum)","inputs":{"a":"0x0301017902017803017A07020362617240200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C0000000000004036000000000000403700000000000040380000000000004039000000000000403A000000000000403B000000000000403C000000000000404200000000000040428000000000004043000000000000404380000000000040440000000000004044800000000000404500000000000003666F6F3FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C000000000000402E000000000000403000000000000040310000000000004032000000000000403300000000000040340000000000004035000000000000403D000000000000403E000000000000403F0000000000004040000000000000404080000000000040410000000000004041800000000000"},"result":{"expect":"0x0200408C380000000000"}}
+{"expression":"reduce(a,sum,x)","inputs":{"a":"0x03020178017A010179050C016101693FF000000000000040140000000000004022000000000000402A00000000000040310000000000000161016A400000000000000040180000000000004024000000000000402C00000000000040320000000000000161016B4008000000000000401C0000000000004026000000000000402E00000000000040330000000000000161016C401000000000000040200000000000004028000000000000403000000000000040340000000000000162016940350000000000004039000000000000403D000000000000404080000000000040428000000000000162016A4036000000000000403A000000000000403E000000000000404100000000000040430000000000000162016B4037000000000000403B000000000000403F000000000000404180000000000040438000000000000162016C4038000000000000403C00000000000040400000000000004042000000000000404400000000000001630169404480000000000040468000000000004048800000000000404A800000000000404C8000000000000163016A404500000000000040470000000000004049000000000000404B000000000000404D0000000000000163016B404580000000000040478000000000004049800000000000404B800000000000404D8000000000000163016C40460000000000004048000000000000404A000000000000404C000000000000404E000000000000"},"result":{"expect":"0x0301017A01017905040169404F8000000000004052C000000000004055C000000000004058C00000000000405BC00000000000016A4050800000000000405380000000000040568000000000004059800000000000405C800000000000016B405140000000000040544000000000004057400000000000405A400000000000405D400000000000016C405200000000000040550000000000004058000000000000405B000000000000405E000000000000"}}
+{"expression":"reduce(a,sum,y)","inputs":{"a":"0x03020178017A010179050C016101693FF000000000000040140000000000004022000000000000402A00000000000040310000000000000161016A400000000000000040180000000000004024000000000000402C00000000000040320000000000000161016B4008000000000000401C0000000000004026000000000000402E00000000000040330000000000000161016C401000000000000040200000000000004028000000000000403000000000000040340000000000000162016940350000000000004039000000000000403D000000000000404080000000000040428000000000000162016A4036000000000000403A000000000000403E000000000000404100000000000040430000000000000162016B4037000000000000403B000000000000403F000000000000404180000000000040438000000000000162016C4038000000000000403C00000000000040400000000000004042000000000000404400000000000001630169404480000000000040468000000000004048800000000000404A800000000000404C8000000000000163016A404500000000000040470000000000004049000000000000404B000000000000404D0000000000000163016B404580000000000040478000000000004049800000000000404B800000000000404D8000000000000163016C40460000000000004048000000000000404A000000000000404C000000000000404E000000000000"},"result":{"expect":"0x01020178017A0C0161016940468000000000000161016A40490000000000000161016B404B8000000000000161016C404E0000000000000162016940622000000000000162016A4062C000000000000162016B40636000000000000162016C406400000000000001630169406EA000000000000163016A406F4000000000000163016B406FE000000000000163016C4070400000000000"}}
+{"expression":"reduce(a,sum,z)","inputs":{"a":"0x03020178017A010179050C016101693FF000000000000040140000000000004022000000000000402A00000000000040310000000000000161016A400000000000000040180000000000004024000000000000402C00000000000040320000000000000161016B4008000000000000401C0000000000004026000000000000402E00000000000040330000000000000161016C401000000000000040200000000000004028000000000000403000000000000040340000000000000162016940350000000000004039000000000000403D000000000000404080000000000040428000000000000162016A4036000000000000403A000000000000403E000000000000404100000000000040430000000000000162016B4037000000000000403B000000000000403F000000000000404180000000000040438000000000000162016C4038000000000000403C00000000000040400000000000004042000000000000404400000000000001630169404480000000000040468000000000004048800000000000404A800000000000404C8000000000000163016A404500000000000040470000000000004049000000000000404B000000000000404D0000000000000163016B404580000000000040478000000000004049800000000000404B800000000000404D8000000000000163016C40460000000000004048000000000000404A000000000000404C000000000000404E000000000000"},"result":{"expect":"0x03010178010179050301614024000000000000403A0000000000004045000000000000404D000000000000405280000000000001624056800000000000405A800000000000405E800000000000406140000000000040634000000000000163406540000000000040674000000000004069400000000000406B400000000000406D400000000000"}}
+{"expression":"reduce(a,sum)","inputs":{"a":"0x03020178017A010179050C016101693FF000000000000040140000000000004022000000000000402A00000000000040310000000000000161016A400000000000000040180000000000004024000000000000402C00000000000040320000000000000161016B4008000000000000401C0000000000004026000000000000402E00000000000040330000000000000161016C401000000000000040200000000000004028000000000000403000000000000040340000000000000162016940350000000000004039000000000000403D000000000000404080000000000040428000000000000162016A4036000000000000403A000000000000403E000000000000404100000000000040430000000000000162016B4037000000000000403B000000000000403F000000000000404180000000000040438000000000000162016C4038000000000000403C00000000000040400000000000004042000000000000404400000000000001630169404480000000000040468000000000004048800000000000404A800000000000404C8000000000000163016A404500000000000040470000000000004049000000000000404B000000000000404D0000000000000163016B404580000000000040478000000000004049800000000000404B800000000000404D8000000000000163016C40460000000000004048000000000000404A000000000000404C000000000000404E000000000000"},"result":{"expect":"0x0200409C980000000000"}}
+{"expression":"reduce(a,max,x)","inputs":{"a":"0x02010178033FF000000000000040000000000000004008000000000000"},"result":{"expect":"0x02004008000000000000"}}
+{"expression":"reduce(a,max)","inputs":{"a":"0x02010178033FF000000000000040000000000000004008000000000000"},"result":{"expect":"0x02004008000000000000"}}
+{"expression":"reduce(a,max,x)","inputs":{"a":"0x02020178030179053FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E000000000000"},"result":{"expect":"0x020101790540260000000000004028000000000000402A000000000000402C000000000000402E000000000000"}}
+{"expression":"reduce(a,max,y)","inputs":{"a":"0x02020178030179053FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E000000000000"},"result":{"expect":"0x020101780340140000000000004024000000000000402E000000000000"}}
+{"expression":"reduce(a,max)","inputs":{"a":"0x02020178030179053FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E000000000000"},"result":{"expect":"0x0200402E000000000000"}}
+{"expression":"reduce(a,max,x)","inputs":{"a":"0x0203017803017905017A073FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E0000000000004030000000000000403100000000000040320000000000004033000000000000403400000000000040350000000000004036000000000000403700000000000040380000000000004039000000000000403A000000000000403B000000000000403C000000000000403D000000000000403E000000000000403F00000000000040400000000000004040800000000000404100000000000040418000000000004042000000000000404280000000000040430000000000004043800000000000404400000000000040448000000000004045000000000000404580000000000040460000000000004046800000000000404700000000000040478000000000004048000000000000404880000000000040490000000000004049800000000000404A000000000000404A800000000000404B000000000000404B800000000000404C000000000000404C800000000000404D000000000000404D800000000000404E000000000000404E800000000000404F000000000000404F8000000000004050000000000000405040000000000040508000000000004050C000000000004051000000000000405140000000000040518000000000004051C000000000004052000000000000405240000000000040528000000000004052C000000000004053000000000000405340000000000040538000000000004053C000000000004054000000000000405440000000000040548000000000004054C000000000004055000000000000405540000000000040558000000000004055C000000000004056000000000000405640000000000040568000000000004056C000000000004057000000000000405740000000000040578000000000004057C000000000004058000000000000405840000000000040588000000000004058C000000000004059000000000000405940000000000040598000000000004059C00000000000405A000000000000405A400000000000"},"result":{"expect":"0x0202017905017A074051C000000000004052000000000000405240000000000040528000000000004052C000000000004053000000000000405340000000000040538000000000004053C000000000004054000000000000405440000000000040548000000000004054C000000000004055000000000000405540000000000040558000000000004055C000000000004056000000000000405640000000000040568000000000004056C000000000004057000000000000405740000000000040578000000000004057C000000000004058000000000000405840000000000040588000000000004058C000000000004059000000000000405940000000000040598000000000004059C00000000000405A000000000000405A400000000000"}}
+{"expression":"reduce(a,max,y)","inputs":{"a":"0x0203017803017905017A073FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E0000000000004030000000000000403100000000000040320000000000004033000000000000403400000000000040350000000000004036000000000000403700000000000040380000000000004039000000000000403A000000000000403B000000000000403C000000000000403D000000000000403E000000000000403F00000000000040400000000000004040800000000000404100000000000040418000000000004042000000000000404280000000000040430000000000004043800000000000404400000000000040448000000000004045000000000000404580000000000040460000000000004046800000000000404700000000000040478000000000004048000000000000404880000000000040490000000000004049800000000000404A000000000000404A800000000000404B000000000000404B800000000000404C000000000000404C800000000000404D000000000000404D800000000000404E000000000000404E800000000000404F000000000000404F8000000000004050000000000000405040000000000040508000000000004050C000000000004051000000000000405140000000000040518000000000004051C000000000004052000000000000405240000000000040528000000000004052C000000000004053000000000000405340000000000040538000000000004053C000000000004054000000000000405440000000000040548000000000004054C000000000004055000000000000405540000000000040558000000000004055C000000000004056000000000000405640000000000040568000000000004056C000000000004057000000000000405740000000000040578000000000004057C000000000004058000000000000405840000000000040588000000000004058C000000000004059000000000000405940000000000040598000000000004059C00000000000405A000000000000405A400000000000"},"result":{"expect":"0x0202017803017A07403D000000000000403E000000000000403F00000000000040400000000000004040800000000000404100000000000040418000000000004050000000000000405040000000000040508000000000004050C000000000004051000000000000405140000000000040518000000000004058C000000000004059000000000000405940000000000040598000000000004059C00000000000405A000000000000405A400000000000"}}
+{"expression":"reduce(a,max,z)","inputs":{"a":"0x0203017803017905017A073FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E0000000000004030000000000000403100000000000040320000000000004033000000000000403400000000000040350000000000004036000000000000403700000000000040380000000000004039000000000000403A000000000000403B000000000000403C000000000000403D000000000000403E000000000000403F00000000000040400000000000004040800000000000404100000000000040418000000000004042000000000000404280000000000040430000000000004043800000000000404400000000000040448000000000004045000000000000404580000000000040460000000000004046800000000000404700000000000040478000000000004048000000000000404880000000000040490000000000004049800000000000404A000000000000404A800000000000404B000000000000404B800000000000404C000000000000404C800000000000404D000000000000404D800000000000404E000000000000404E800000000000404F000000000000404F8000000000004050000000000000405040000000000040508000000000004050C000000000004051000000000000405140000000000040518000000000004051C000000000004052000000000000405240000000000040528000000000004052C000000000004053000000000000405340000000000040538000000000004053C000000000004054000000000000405440000000000040548000000000004054C000000000004055000000000000405540000000000040558000000000004055C000000000004056000000000000405640000000000040568000000000004056C000000000004057000000000000405740000000000040578000000000004057C000000000004058000000000000405840000000000040588000000000004058C000000000004059000000000000405940000000000040598000000000004059C00000000000405A000000000000405A400000000000"},"result":{"expect":"0x0202017803017905401C000000000000402C0000000000004035000000000000403C000000000000404180000000000040450000000000004048800000000000404C000000000000404F8000000000004051800000000000405340000000000040550000000000004056C000000000004058800000000000405A400000000000"}}
+{"expression":"reduce(a,max)","inputs":{"a":"0x0203017803017905017A073FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E0000000000004030000000000000403100000000000040320000000000004033000000000000403400000000000040350000000000004036000000000000403700000000000040380000000000004039000000000000403A000000000000403B000000000000403C000000000000403D000000000000403E000000000000403F00000000000040400000000000004040800000000000404100000000000040418000000000004042000000000000404280000000000040430000000000004043800000000000404400000000000040448000000000004045000000000000404580000000000040460000000000004046800000000000404700000000000040478000000000004048000000000000404880000000000040490000000000004049800000000000404A000000000000404A800000000000404B000000000000404B800000000000404C000000000000404C800000000000404D000000000000404D800000000000404E000000000000404E800000000000404F000000000000404F8000000000004050000000000000405040000000000040508000000000004050C000000000004051000000000000405140000000000040518000000000004051C000000000004052000000000000405240000000000040528000000000004052C000000000004053000000000000405340000000000040538000000000004053C000000000004054000000000000405440000000000040548000000000004054C000000000004055000000000000405540000000000040558000000000004055C000000000004056000000000000405640000000000040568000000000004056C000000000004057000000000000405740000000000040578000000000004057C000000000004058000000000000405840000000000040588000000000004058C000000000004059000000000000405940000000000040598000000000004059C00000000000405A000000000000405A400000000000"},"result":{"expect":"0x0200405A400000000000"}}
+{"expression":"reduce(a,max,x)","inputs":{"a":"0x010101780301613FF00000000000000162400000000000000001634008000000000000"},"result":{"expect":"0x02004008000000000000"}}
+{"expression":"reduce(a,max)","inputs":{"a":"0x010101780301613FF00000000000000162400000000000000001634008000000000000"},"result":{"expect":"0x02004008000000000000"}}
+{"expression":"reduce(a,max,x)","inputs":{"a":"0x010201780179060161036261724000000000000000016103666F6F3FF00000000000000162036261724010000000000000016203666F6F40080000000000000163036261724018000000000000016303666F6F4014000000000000"},"result":{"expect":"0x010101790203626172401800000000000003666F6F4014000000000000"}}
+{"expression":"reduce(a,max,y)","inputs":{"a":"0x010201780179060161036261724000000000000000016103666F6F3FF00000000000000162036261724010000000000000016203666F6F40080000000000000163036261724018000000000000016303666F6F4014000000000000"},"result":{"expect":"0x0101017803016140000000000000000162401000000000000001634018000000000000"}}
+{"expression":"reduce(a,max)","inputs":{"a":"0x010201780179060161036261724000000000000000016103666F6F3FF00000000000000162036261724010000000000000016203666F6F40080000000000000163036261724018000000000000016303666F6F4014000000000000"},"result":{"expect":"0x02004018000000000000"}}
+{"expression":"reduce(a,max,x)","inputs":{"a":"0x010301780179017A1801610362617201694014000000000000016103626172016A4018000000000000016103626172016B401C000000000000016103626172016C4020000000000000016103666F6F01693FF0000000000000016103666F6F016A4000000000000000016103666F6F016B4008000000000000016103666F6F016C40100000000000000162036261720169402A000000000000016203626172016A402C000000000000016203626172016B402E000000000000016203626172016C4030000000000000016203666F6F01694022000000000000016203666F6F016A4024000000000000016203666F6F016B4026000000000000016203666F6F016C402800000000000001630362617201694035000000000000016303626172016A4036000000000000016303626172016B4037000000000000016303626172016C4038000000000000016303666F6F01694031000000000000016303666F6F016A4032000000000000016303666F6F016B4033000000000000016303666F6F016C4034000000000000"},"result":{"expect":"0x01020179017A08036261720169403500000000000003626172016A403600000000000003626172016B403700000000000003626172016C403800000000000003666F6F0169403100000000000003666F6F016A403200000000000003666F6F016B403300000000000003666F6F016C4034000000000000"}}
+{"expression":"reduce(a,max,y)","inputs":{"a":"0x010301780179017A1801610362617201694014000000000000016103626172016A4018000000000000016103626172016B401C000000000000016103626172016C4020000000000000016103666F6F01693FF0000000000000016103666F6F016A4000000000000000016103666F6F016B4008000000000000016103666F6F016C40100000000000000162036261720169402A000000000000016203626172016A402C000000000000016203626172016B402E000000000000016203626172016C4030000000000000016203666F6F01694022000000000000016203666F6F016A4024000000000000016203666F6F016B4026000000000000016203666F6F016C402800000000000001630362617201694035000000000000016303626172016A4036000000000000016303626172016B4037000000000000016303626172016C4038000000000000016303666F6F01694031000000000000016303666F6F016A4032000000000000016303666F6F016B4033000000000000016303666F6F016C4034000000000000"},"result":{"expect":"0x01020178017A0C0161016940140000000000000161016A40180000000000000161016B401C0000000000000161016C402000000000000001620169402A0000000000000162016A402C0000000000000162016B402E0000000000000162016C40300000000000000163016940350000000000000163016A40360000000000000163016B40370000000000000163016C4038000000000000"}}
+{"expression":"reduce(a,max,z)","inputs":{"a":"0x010301780179017A1801610362617201694014000000000000016103626172016A4018000000000000016103626172016B401C000000000000016103626172016C4020000000000000016103666F6F01693FF0000000000000016103666F6F016A4000000000000000016103666F6F016B4008000000000000016103666F6F016C40100000000000000162036261720169402A000000000000016203626172016A402C000000000000016203626172016B402E000000000000016203626172016C4030000000000000016203666F6F01694022000000000000016203666F6F016A4024000000000000016203666F6F016B4026000000000000016203666F6F016C402800000000000001630362617201694035000000000000016303626172016A4036000000000000016303626172016B4037000000000000016303626172016C4038000000000000016303666F6F01694031000000000000016303666F6F016A4032000000000000016303666F6F016B4033000000000000016303666F6F016C4034000000000000"},"result":{"expect":"0x010201780179060161036261724020000000000000016103666F6F40100000000000000162036261724030000000000000016203666F6F40280000000000000163036261724038000000000000016303666F6F4034000000000000"}}
+{"expression":"reduce(a,max)","inputs":{"a":"0x010301780179017A1801610362617201694014000000000000016103626172016A4018000000000000016103626172016B401C000000000000016103626172016C4020000000000000016103666F6F01693FF0000000000000016103666F6F016A4000000000000000016103666F6F016B4008000000000000016103666F6F016C40100000000000000162036261720169402A000000000000016203626172016A402C000000000000016203626172016B402E000000000000016203626172016C4030000000000000016203666F6F01694022000000000000016203666F6F016A4024000000000000016203666F6F016B4026000000000000016203666F6F016C402800000000000001630362617201694035000000000000016303626172016A4036000000000000016303626172016B4037000000000000016303626172016C4038000000000000016303666F6F01694031000000000000016303666F6F016A4032000000000000016303666F6F016B4033000000000000016303666F6F016C4034000000000000"},"result":{"expect":"0x02004038000000000000"}}
+{"expression":"reduce(a,max,x)","inputs":{"a":"0x0301017902017803017A07020362617240200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C0000000000004036000000000000403700000000000040380000000000004039000000000000403A000000000000403B000000000000403C000000000000404200000000000040428000000000004043000000000000404380000000000040440000000000004044800000000000404500000000000003666F6F3FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C000000000000402E000000000000403000000000000040310000000000004032000000000000403300000000000040340000000000004035000000000000403D000000000000403E000000000000403F0000000000004040000000000000404080000000000040410000000000004041800000000000"},"result":{"expect":"0x0301017901017A070203626172404200000000000040428000000000004043000000000000404380000000000040440000000000004044800000000000404500000000000003666F6F403D000000000000403E000000000000403F0000000000004040000000000000404080000000000040410000000000004041800000000000"}}
+{"expression":"reduce(a,max,y)","inputs":{"a":"0x0301017902017803017A07020362617240200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C0000000000004036000000000000403700000000000040380000000000004039000000000000403A000000000000403B000000000000403C000000000000404200000000000040428000000000004043000000000000404380000000000040440000000000004044800000000000404500000000000003666F6F3FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C000000000000402E000000000000403000000000000040310000000000004032000000000000403300000000000040340000000000004035000000000000403D000000000000403E000000000000403F0000000000004040000000000000404080000000000040410000000000004041800000000000"},"result":{"expect":"0x0202017803017A0740200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C0000000000004036000000000000403700000000000040380000000000004039000000000000403A000000000000403B000000000000403C0000000000004042000000000000404280000000000040430000000000004043800000000000404400000000000040448000000000004045000000000000"}}
+{"expression":"reduce(a,max,z)","inputs":{"a":"0x0301017902017803017A07020362617240200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C0000000000004036000000000000403700000000000040380000000000004039000000000000403A000000000000403B000000000000403C000000000000404200000000000040428000000000004043000000000000404380000000000040440000000000004044800000000000404500000000000003666F6F3FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C000000000000402E000000000000403000000000000040310000000000004032000000000000403300000000000040340000000000004035000000000000403D000000000000403E000000000000403F0000000000004040000000000000404080000000000040410000000000004041800000000000"},"result":{"expect":"0x03010179010178030203626172402C000000000000403C000000000000404500000000000003666F6F401C00000000000040350000000000004041800000000000"}}
+{"expression":"reduce(a,max)","inputs":{"a":"0x0301017902017803017A07020362617240200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C0000000000004036000000000000403700000000000040380000000000004039000000000000403A000000000000403B000000000000403C000000000000404200000000000040428000000000004043000000000000404380000000000040440000000000004044800000000000404500000000000003666F6F3FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C000000000000402E000000000000403000000000000040310000000000004032000000000000403300000000000040340000000000004035000000000000403D000000000000403E000000000000403F0000000000004040000000000000404080000000000040410000000000004041800000000000"},"result":{"expect":"0x02004045000000000000"}}
+{"expression":"reduce(a,max,x)","inputs":{"a":"0x03020178017A010179050C016101693FF000000000000040140000000000004022000000000000402A00000000000040310000000000000161016A400000000000000040180000000000004024000000000000402C00000000000040320000000000000161016B4008000000000000401C0000000000004026000000000000402E00000000000040330000000000000161016C401000000000000040200000000000004028000000000000403000000000000040340000000000000162016940350000000000004039000000000000403D000000000000404080000000000040428000000000000162016A4036000000000000403A000000000000403E000000000000404100000000000040430000000000000162016B4037000000000000403B000000000000403F000000000000404180000000000040438000000000000162016C4038000000000000403C00000000000040400000000000004042000000000000404400000000000001630169404480000000000040468000000000004048800000000000404A800000000000404C8000000000000163016A404500000000000040470000000000004049000000000000404B000000000000404D0000000000000163016B404580000000000040478000000000004049800000000000404B800000000000404D8000000000000163016C40460000000000004048000000000000404A000000000000404C000000000000404E000000000000"},"result":{"expect":"0x0301017A01017905040169404480000000000040468000000000004048800000000000404A800000000000404C800000000000016A404500000000000040470000000000004049000000000000404B000000000000404D000000000000016B404580000000000040478000000000004049800000000000404B800000000000404D800000000000016C40460000000000004048000000000000404A000000000000404C000000000000404E000000000000"}}
+{"expression":"reduce(a,max,y)","inputs":{"a":"0x03020178017A010179050C016101693FF000000000000040140000000000004022000000000000402A00000000000040310000000000000161016A400000000000000040180000000000004024000000000000402C00000000000040320000000000000161016B4008000000000000401C0000000000004026000000000000402E00000000000040330000000000000161016C401000000000000040200000000000004028000000000000403000000000000040340000000000000162016940350000000000004039000000000000403D000000000000404080000000000040428000000000000162016A4036000000000000403A000000000000403E000000000000404100000000000040430000000000000162016B4037000000000000403B000000000000403F000000000000404180000000000040438000000000000162016C4038000000000000403C00000000000040400000000000004042000000000000404400000000000001630169404480000000000040468000000000004048800000000000404A800000000000404C8000000000000163016A404500000000000040470000000000004049000000000000404B000000000000404D0000000000000163016B404580000000000040478000000000004049800000000000404B800000000000404D8000000000000163016C40460000000000004048000000000000404A000000000000404C000000000000404E000000000000"},"result":{"expect":"0x01020178017A0C0161016940310000000000000161016A40320000000000000161016B40330000000000000161016C40340000000000000162016940428000000000000162016A40430000000000000162016B40438000000000000162016C404400000000000001630169404C8000000000000163016A404D0000000000000163016B404D8000000000000163016C404E000000000000"}}
+{"expression":"reduce(a,max,z)","inputs":{"a":"0x03020178017A010179050C016101693FF000000000000040140000000000004022000000000000402A00000000000040310000000000000161016A400000000000000040180000000000004024000000000000402C00000000000040320000000000000161016B4008000000000000401C0000000000004026000000000000402E00000000000040330000000000000161016C401000000000000040200000000000004028000000000000403000000000000040340000000000000162016940350000000000004039000000000000403D000000000000404080000000000040428000000000000162016A4036000000000000403A000000000000403E000000000000404100000000000040430000000000000162016B4037000000000000403B000000000000403F000000000000404180000000000040438000000000000162016C4038000000000000403C00000000000040400000000000004042000000000000404400000000000001630169404480000000000040468000000000004048800000000000404A800000000000404C8000000000000163016A404500000000000040470000000000004049000000000000404B000000000000404D0000000000000163016B404580000000000040478000000000004049800000000000404B800000000000404D8000000000000163016C40460000000000004048000000000000404A000000000000404C000000000000404E000000000000"},"result":{"expect":"0x03010178010179050301614010000000000000402000000000000040280000000000004030000000000000403400000000000001624038000000000000403C000000000000404000000000000040420000000000004044000000000000016340460000000000004048000000000000404A000000000000404C000000000000404E000000000000"}}
+{"expression":"reduce(a,max)","inputs":{"a":"0x03020178017A010179050C016101693FF000000000000040140000000000004022000000000000402A00000000000040310000000000000161016A400000000000000040180000000000004024000000000000402C00000000000040320000000000000161016B4008000000000000401C0000000000004026000000000000402E00000000000040330000000000000161016C401000000000000040200000000000004028000000000000403000000000000040340000000000000162016940350000000000004039000000000000403D000000000000404080000000000040428000000000000162016A4036000000000000403A000000000000403E000000000000404100000000000040430000000000000162016B4037000000000000403B000000000000403F000000000000404180000000000040438000000000000162016C4038000000000000403C00000000000040400000000000004042000000000000404400000000000001630169404480000000000040468000000000004048800000000000404A800000000000404C8000000000000163016A404500000000000040470000000000004049000000000000404B000000000000404D0000000000000163016B404580000000000040478000000000004049800000000000404B800000000000404D8000000000000163016C40460000000000004048000000000000404A000000000000404C000000000000404E000000000000"},"result":{"expect":"0x0200404E000000000000"}}
+{"expression":"reduce(a,min,x)","inputs":{"a":"0x02010178033FF000000000000040000000000000004008000000000000"},"result":{"expect":"0x02003FF0000000000000"}}
+{"expression":"reduce(a,min)","inputs":{"a":"0x02010178033FF000000000000040000000000000004008000000000000"},"result":{"expect":"0x02003FF0000000000000"}}
+{"expression":"reduce(a,min,x)","inputs":{"a":"0x02020178030179053FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E000000000000"},"result":{"expect":"0x02010179053FF00000000000004000000000000000400800000000000040100000000000004014000000000000"}}
+{"expression":"reduce(a,min,y)","inputs":{"a":"0x02020178030179053FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E000000000000"},"result":{"expect":"0x02010178033FF000000000000040180000000000004026000000000000"}}
+{"expression":"reduce(a,min)","inputs":{"a":"0x02020178030179053FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E000000000000"},"result":{"expect":"0x02003FF0000000000000"}}
+{"expression":"reduce(a,min,x)","inputs":{"a":"0x0203017803017905017A073FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E0000000000004030000000000000403100000000000040320000000000004033000000000000403400000000000040350000000000004036000000000000403700000000000040380000000000004039000000000000403A000000000000403B000000000000403C000000000000403D000000000000403E000000000000403F00000000000040400000000000004040800000000000404100000000000040418000000000004042000000000000404280000000000040430000000000004043800000000000404400000000000040448000000000004045000000000000404580000000000040460000000000004046800000000000404700000000000040478000000000004048000000000000404880000000000040490000000000004049800000000000404A000000000000404A800000000000404B000000000000404B800000000000404C000000000000404C800000000000404D000000000000404D800000000000404E000000000000404E800000000000404F000000000000404F8000000000004050000000000000405040000000000040508000000000004050C000000000004051000000000000405140000000000040518000000000004051C000000000004052000000000000405240000000000040528000000000004052C000000000004053000000000000405340000000000040538000000000004053C000000000004054000000000000405440000000000040548000000000004054C000000000004055000000000000405540000000000040558000000000004055C000000000004056000000000000405640000000000040568000000000004056C000000000004057000000000000405740000000000040578000000000004057C000000000004058000000000000405840000000000040588000000000004058C000000000004059000000000000405940000000000040598000000000004059C00000000000405A000000000000405A400000000000"},"result":{"expect":"0x0202017905017A073FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E0000000000004030000000000000403100000000000040320000000000004033000000000000403400000000000040350000000000004036000000000000403700000000000040380000000000004039000000000000403A000000000000403B000000000000403C000000000000403D000000000000403E000000000000403F0000000000004040000000000000404080000000000040410000000000004041800000000000"}}
+{"expression":"reduce(a,min,y)","inputs":{"a":"0x0203017803017905017A073FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E0000000000004030000000000000403100000000000040320000000000004033000000000000403400000000000040350000000000004036000000000000403700000000000040380000000000004039000000000000403A000000000000403B000000000000403C000000000000403D000000000000403E000000000000403F00000000000040400000000000004040800000000000404100000000000040418000000000004042000000000000404280000000000040430000000000004043800000000000404400000000000040448000000000004045000000000000404580000000000040460000000000004046800000000000404700000000000040478000000000004048000000000000404880000000000040490000000000004049800000000000404A000000000000404A800000000000404B000000000000404B800000000000404C000000000000404C800000000000404D000000000000404D800000000000404E000000000000404E800000000000404F000000000000404F8000000000004050000000000000405040000000000040508000000000004050C000000000004051000000000000405140000000000040518000000000004051C000000000004052000000000000405240000000000040528000000000004052C000000000004053000000000000405340000000000040538000000000004053C000000000004054000000000000405440000000000040548000000000004054C000000000004055000000000000405540000000000040558000000000004055C000000000004056000000000000405640000000000040568000000000004056C000000000004057000000000000405740000000000040578000000000004057C000000000004058000000000000405840000000000040588000000000004058C000000000004059000000000000405940000000000040598000000000004059C00000000000405A000000000000405A400000000000"},"result":{"expect":"0x0202017803017A073FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040420000000000004042800000000000404300000000000040438000000000004044000000000000404480000000000040450000000000004051C000000000004052000000000000405240000000000040528000000000004052C0000000000040530000000000004053400000000000"}}
+{"expression":"reduce(a,min,z)","inputs":{"a":"0x0203017803017905017A073FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E0000000000004030000000000000403100000000000040320000000000004033000000000000403400000000000040350000000000004036000000000000403700000000000040380000000000004039000000000000403A000000000000403B000000000000403C000000000000403D000000000000403E000000000000403F00000000000040400000000000004040800000000000404100000000000040418000000000004042000000000000404280000000000040430000000000004043800000000000404400000000000040448000000000004045000000000000404580000000000040460000000000004046800000000000404700000000000040478000000000004048000000000000404880000000000040490000000000004049800000000000404A000000000000404A800000000000404B000000000000404B800000000000404C000000000000404C800000000000404D000000000000404D800000000000404E000000000000404E800000000000404F000000000000404F8000000000004050000000000000405040000000000040508000000000004050C000000000004051000000000000405140000000000040518000000000004051C000000000004052000000000000405240000000000040528000000000004052C000000000004053000000000000405340000000000040538000000000004053C000000000004054000000000000405440000000000040548000000000004054C000000000004055000000000000405540000000000040558000000000004055C000000000004056000000000000405640000000000040568000000000004056C000000000004057000000000000405740000000000040578000000000004057C000000000004058000000000000405840000000000040588000000000004058C000000000004059000000000000405940000000000040598000000000004059C00000000000405A000000000000405A400000000000"},"result":{"expect":"0x02020178030179053FF00000000000004020000000000000402E0000000000004036000000000000403D000000000000404200000000000040458000000000004049000000000000404C80000000000040500000000000004051C000000000004053800000000000405540000000000040570000000000004058C00000000000"}}
+{"expression":"reduce(a,min)","inputs":{"a":"0x0203017803017905017A073FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E0000000000004030000000000000403100000000000040320000000000004033000000000000403400000000000040350000000000004036000000000000403700000000000040380000000000004039000000000000403A000000000000403B000000000000403C000000000000403D000000000000403E000000000000403F00000000000040400000000000004040800000000000404100000000000040418000000000004042000000000000404280000000000040430000000000004043800000000000404400000000000040448000000000004045000000000000404580000000000040460000000000004046800000000000404700000000000040478000000000004048000000000000404880000000000040490000000000004049800000000000404A000000000000404A800000000000404B000000000000404B800000000000404C000000000000404C800000000000404D000000000000404D800000000000404E000000000000404E800000000000404F000000000000404F8000000000004050000000000000405040000000000040508000000000004050C000000000004051000000000000405140000000000040518000000000004051C000000000004052000000000000405240000000000040528000000000004052C000000000004053000000000000405340000000000040538000000000004053C000000000004054000000000000405440000000000040548000000000004054C000000000004055000000000000405540000000000040558000000000004055C000000000004056000000000000405640000000000040568000000000004056C000000000004057000000000000405740000000000040578000000000004057C000000000004058000000000000405840000000000040588000000000004058C000000000004059000000000000405940000000000040598000000000004059C00000000000405A000000000000405A400000000000"},"result":{"expect":"0x02003FF0000000000000"}}
+{"expression":"reduce(a,min,x)","inputs":{"a":"0x010101780301613FF00000000000000162400000000000000001634008000000000000"},"result":{"expect":"0x02003FF0000000000000"}}
+{"expression":"reduce(a,min)","inputs":{"a":"0x010101780301613FF00000000000000162400000000000000001634008000000000000"},"result":{"expect":"0x02003FF0000000000000"}}
+{"expression":"reduce(a,min,x)","inputs":{"a":"0x010201780179060161036261724000000000000000016103666F6F3FF00000000000000162036261724010000000000000016203666F6F40080000000000000163036261724018000000000000016303666F6F4014000000000000"},"result":{"expect":"0x010101790203626172400000000000000003666F6F3FF0000000000000"}}
+{"expression":"reduce(a,min,y)","inputs":{"a":"0x010201780179060161036261724000000000000000016103666F6F3FF00000000000000162036261724010000000000000016203666F6F40080000000000000163036261724018000000000000016303666F6F4014000000000000"},"result":{"expect":"0x010101780301613FF00000000000000162400800000000000001634014000000000000"}}
+{"expression":"reduce(a,min)","inputs":{"a":"0x010201780179060161036261724000000000000000016103666F6F3FF00000000000000162036261724010000000000000016203666F6F40080000000000000163036261724018000000000000016303666F6F4014000000000000"},"result":{"expect":"0x02003FF0000000000000"}}
+{"expression":"reduce(a,min,x)","inputs":{"a":"0x010301780179017A1801610362617201694014000000000000016103626172016A4018000000000000016103626172016B401C000000000000016103626172016C4020000000000000016103666F6F01693FF0000000000000016103666F6F016A4000000000000000016103666F6F016B4008000000000000016103666F6F016C40100000000000000162036261720169402A000000000000016203626172016A402C000000000000016203626172016B402E000000000000016203626172016C4030000000000000016203666F6F01694022000000000000016203666F6F016A4024000000000000016203666F6F016B4026000000000000016203666F6F016C402800000000000001630362617201694035000000000000016303626172016A4036000000000000016303626172016B4037000000000000016303626172016C4038000000000000016303666F6F01694031000000000000016303666F6F016A4032000000000000016303666F6F016B4033000000000000016303666F6F016C4034000000000000"},"result":{"expect":"0x01020179017A08036261720169401400000000000003626172016A401800000000000003626172016B401C00000000000003626172016C402000000000000003666F6F01693FF000000000000003666F6F016A400000000000000003666F6F016B400800000000000003666F6F016C4010000000000000"}}
+{"expression":"reduce(a,min,y)","inputs":{"a":"0x010301780179017A1801610362617201694014000000000000016103626172016A4018000000000000016103626172016B401C000000000000016103626172016C4020000000000000016103666F6F01693FF0000000000000016103666F6F016A4000000000000000016103666F6F016B4008000000000000016103666F6F016C40100000000000000162036261720169402A000000000000016203626172016A402C000000000000016203626172016B402E000000000000016203626172016C4030000000000000016203666F6F01694022000000000000016203666F6F016A4024000000000000016203666F6F016B4026000000000000016203666F6F016C402800000000000001630362617201694035000000000000016303626172016A4036000000000000016303626172016B4037000000000000016303626172016C4038000000000000016303666F6F01694031000000000000016303666F6F016A4032000000000000016303666F6F016B4033000000000000016303666F6F016C4034000000000000"},"result":{"expect":"0x01020178017A0C016101693FF00000000000000161016A40000000000000000161016B40080000000000000161016C40100000000000000162016940220000000000000162016A40240000000000000162016B40260000000000000162016C40280000000000000163016940310000000000000163016A40320000000000000163016B40330000000000000163016C4034000000000000"}}
+{"expression":"reduce(a,min,z)","inputs":{"a":"0x010301780179017A1801610362617201694014000000000000016103626172016A4018000000000000016103626172016B401C000000000000016103626172016C4020000000000000016103666F6F01693FF0000000000000016103666F6F016A4000000000000000016103666F6F016B4008000000000000016103666F6F016C40100000000000000162036261720169402A000000000000016203626172016A402C000000000000016203626172016B402E000000000000016203626172016C4030000000000000016203666F6F01694022000000000000016203666F6F016A4024000000000000016203666F6F016B4026000000000000016203666F6F016C402800000000000001630362617201694035000000000000016303626172016A4036000000000000016303626172016B4037000000000000016303626172016C4038000000000000016303666F6F01694031000000000000016303666F6F016A4032000000000000016303666F6F016B4033000000000000016303666F6F016C4034000000000000"},"result":{"expect":"0x010201780179060161036261724014000000000000016103666F6F3FF0000000000000016203626172402A000000000000016203666F6F40220000000000000163036261724035000000000000016303666F6F4031000000000000"}}
+{"expression":"reduce(a,min)","inputs":{"a":"0x010301780179017A1801610362617201694014000000000000016103626172016A4018000000000000016103626172016B401C000000000000016103626172016C4020000000000000016103666F6F01693FF0000000000000016103666F6F016A4000000000000000016103666F6F016B4008000000000000016103666F6F016C40100000000000000162036261720169402A000000000000016203626172016A402C000000000000016203626172016B402E000000000000016203626172016C4030000000000000016203666F6F01694022000000000000016203666F6F016A4024000000000000016203666F6F016B4026000000000000016203666F6F016C402800000000000001630362617201694035000000000000016303626172016A4036000000000000016303626172016B4037000000000000016303626172016C4038000000000000016303666F6F01694031000000000000016303666F6F016A4032000000000000016303666F6F016B4033000000000000016303666F6F016C4034000000000000"},"result":{"expect":"0x02003FF0000000000000"}}
+{"expression":"reduce(a,min,x)","inputs":{"a":"0x0301017902017803017A07020362617240200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C0000000000004036000000000000403700000000000040380000000000004039000000000000403A000000000000403B000000000000403C000000000000404200000000000040428000000000004043000000000000404380000000000040440000000000004044800000000000404500000000000003666F6F3FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C000000000000402E000000000000403000000000000040310000000000004032000000000000403300000000000040340000000000004035000000000000403D000000000000403E000000000000403F0000000000004040000000000000404080000000000040410000000000004041800000000000"},"result":{"expect":"0x0301017901017A07020362617240200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C00000000000003666F6F3FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C000000000000"}}
+{"expression":"reduce(a,min,y)","inputs":{"a":"0x0301017902017803017A07020362617240200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C0000000000004036000000000000403700000000000040380000000000004039000000000000403A000000000000403B000000000000403C000000000000404200000000000040428000000000004043000000000000404380000000000040440000000000004044800000000000404500000000000003666F6F3FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C000000000000402E000000000000403000000000000040310000000000004032000000000000403300000000000040340000000000004035000000000000403D000000000000403E000000000000403F0000000000004040000000000000404080000000000040410000000000004041800000000000"},"result":{"expect":"0x0202017803017A073FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C000000000000402E000000000000403000000000000040310000000000004032000000000000403300000000000040340000000000004035000000000000403D000000000000403E000000000000403F0000000000004040000000000000404080000000000040410000000000004041800000000000"}}
+{"expression":"reduce(a,min,z)","inputs":{"a":"0x0301017902017803017A07020362617240200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C0000000000004036000000000000403700000000000040380000000000004039000000000000403A000000000000403B000000000000403C000000000000404200000000000040428000000000004043000000000000404380000000000040440000000000004044800000000000404500000000000003666F6F3FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C000000000000402E000000000000403000000000000040310000000000004032000000000000403300000000000040340000000000004035000000000000403D000000000000403E000000000000403F0000000000004040000000000000404080000000000040410000000000004041800000000000"},"result":{"expect":"0x0301017901017803020362617240200000000000004036000000000000404200000000000003666F6F3FF0000000000000402E000000000000403D000000000000"}}
+{"expression":"reduce(a,min)","inputs":{"a":"0x0301017902017803017A07020362617240200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C0000000000004036000000000000403700000000000040380000000000004039000000000000403A000000000000403B000000000000403C000000000000404200000000000040428000000000004043000000000000404380000000000040440000000000004044800000000000404500000000000003666F6F3FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C000000000000402E000000000000403000000000000040310000000000004032000000000000403300000000000040340000000000004035000000000000403D000000000000403E000000000000403F0000000000004040000000000000404080000000000040410000000000004041800000000000"},"result":{"expect":"0x02003FF0000000000000"}}
+{"expression":"reduce(a,min,x)","inputs":{"a":"0x03020178017A010179050C016101693FF000000000000040140000000000004022000000000000402A00000000000040310000000000000161016A400000000000000040180000000000004024000000000000402C00000000000040320000000000000161016B4008000000000000401C0000000000004026000000000000402E00000000000040330000000000000161016C401000000000000040200000000000004028000000000000403000000000000040340000000000000162016940350000000000004039000000000000403D000000000000404080000000000040428000000000000162016A4036000000000000403A000000000000403E000000000000404100000000000040430000000000000162016B4037000000000000403B000000000000403F000000000000404180000000000040438000000000000162016C4038000000000000403C00000000000040400000000000004042000000000000404400000000000001630169404480000000000040468000000000004048800000000000404A800000000000404C8000000000000163016A404500000000000040470000000000004049000000000000404B000000000000404D0000000000000163016B404580000000000040478000000000004049800000000000404B800000000000404D8000000000000163016C40460000000000004048000000000000404A000000000000404C000000000000404E000000000000"},"result":{"expect":"0x0301017A010179050401693FF000000000000040140000000000004022000000000000402A0000000000004031000000000000016A400000000000000040180000000000004024000000000000402C0000000000004032000000000000016B4008000000000000401C0000000000004026000000000000402E0000000000004033000000000000016C40100000000000004020000000000000402800000000000040300000000000004034000000000000"}}
+{"expression":"reduce(a,min,y)","inputs":{"a":"0x03020178017A010179050C016101693FF000000000000040140000000000004022000000000000402A00000000000040310000000000000161016A400000000000000040180000000000004024000000000000402C00000000000040320000000000000161016B4008000000000000401C0000000000004026000000000000402E00000000000040330000000000000161016C401000000000000040200000000000004028000000000000403000000000000040340000000000000162016940350000000000004039000000000000403D000000000000404080000000000040428000000000000162016A4036000000000000403A000000000000403E000000000000404100000000000040430000000000000162016B4037000000000000403B000000000000403F000000000000404180000000000040438000000000000162016C4038000000000000403C00000000000040400000000000004042000000000000404400000000000001630169404480000000000040468000000000004048800000000000404A800000000000404C8000000000000163016A404500000000000040470000000000004049000000000000404B000000000000404D0000000000000163016B404580000000000040478000000000004049800000000000404B800000000000404D8000000000000163016C40460000000000004048000000000000404A000000000000404C000000000000404E000000000000"},"result":{"expect":"0x01020178017A0C016101693FF00000000000000161016A40000000000000000161016B40080000000000000161016C40100000000000000162016940350000000000000162016A40360000000000000162016B40370000000000000162016C40380000000000000163016940448000000000000163016A40450000000000000163016B40458000000000000163016C4046000000000000"}}
+{"expression":"reduce(a,min,z)","inputs":{"a":"0x03020178017A010179050C016101693FF000000000000040140000000000004022000000000000402A00000000000040310000000000000161016A400000000000000040180000000000004024000000000000402C00000000000040320000000000000161016B4008000000000000401C0000000000004026000000000000402E00000000000040330000000000000161016C401000000000000040200000000000004028000000000000403000000000000040340000000000000162016940350000000000004039000000000000403D000000000000404080000000000040428000000000000162016A4036000000000000403A000000000000403E000000000000404100000000000040430000000000000162016B4037000000000000403B000000000000403F000000000000404180000000000040438000000000000162016C4038000000000000403C00000000000040400000000000004042000000000000404400000000000001630169404480000000000040468000000000004048800000000000404A800000000000404C8000000000000163016A404500000000000040470000000000004049000000000000404B000000000000404D0000000000000163016B404580000000000040478000000000004049800000000000404B800000000000404D8000000000000163016C40460000000000004048000000000000404A000000000000404C000000000000404E000000000000"},"result":{"expect":"0x03010178010179050301613FF000000000000040140000000000004022000000000000402A0000000000004031000000000000016240350000000000004039000000000000403D000000000000404080000000000040428000000000000163404480000000000040468000000000004048800000000000404A800000000000404C800000000000"}}
+{"expression":"reduce(a,min)","inputs":{"a":"0x03020178017A010179050C016101693FF000000000000040140000000000004022000000000000402A00000000000040310000000000000161016A400000000000000040180000000000004024000000000000402C00000000000040320000000000000161016B4008000000000000401C0000000000004026000000000000402E00000000000040330000000000000161016C401000000000000040200000000000004028000000000000403000000000000040340000000000000162016940350000000000004039000000000000403D000000000000404080000000000040428000000000000162016A4036000000000000403A000000000000403E000000000000404100000000000040430000000000000162016B4037000000000000403B000000000000403F000000000000404180000000000040438000000000000162016C4038000000000000403C00000000000040400000000000004042000000000000404400000000000001630169404480000000000040468000000000004048800000000000404A800000000000404C8000000000000163016A404500000000000040470000000000004049000000000000404B000000000000404D0000000000000163016B404580000000000040478000000000004049800000000000404B800000000000404D8000000000000163016C40460000000000004048000000000000404A000000000000404C000000000000404E000000000000"},"result":{"expect":"0x02003FF0000000000000"}}
+{"expression":"-a","inputs":{"a":"0x0200BFFE666666666666"},"result":{"expect":"0x02003FFE666666666666"}}
+{"expression":"-a","inputs":{"a":"0x0201017803BFFE666666666666BFFCCCCCCCCCCCCDBFFB333333333333"},"result":{"expect":"0x02010178033FFE6666666666663FFCCCCCCCCCCCCD3FFB333333333333"}}
+{"expression":"-a","inputs":{"a":"0x0202017803017905BFFE666666666666BFFCCCCCCCCCCCCDBFFB333333333333BFF999999999999ABFF8000000000000BFF6666666666666BFF4CCCCCCCCCCCDBFF3333333333333BFF199999999999ABFF0000000000000BFECCCCCCCCCCCCCBFE999999999999ABFE6666666666666BFE3333333333334BFE0000000000000"},"result":{"expect":"0x02020178030179053FFE6666666666663FFCCCCCCCCCCCCD3FFB3333333333333FF999999999999A3FF80000000000003FF66666666666663FF4CCCCCCCCCCCD3FF33333333333333FF199999999999A3FF00000000000003FECCCCCCCCCCCCC3FE999999999999A3FE66666666666663FE33333333333343FE0000000000000"}}
+{"expression":"-a","inputs":{"a":"0x0203017803017905017A07BFFE666666666666BFFCCCCCCCCCCCCDBFFB333333333333BFF999999999999ABFF8000000000000BFF6666666666666BFF4CCCCCCCCCCCDBFF3333333333333BFF199999999999ABFF0000000000000BFECCCCCCCCCCCCCBFE999999999999ABFE6666666666666BFE3333333333334BFE0000000000000BFD9999999999998BFD3333333333334BFC9999999999998BFB99999999999A000000000000000003FB99999999999A03FC99999999999A03FD33333333333303FD99999999999983FE00000000000003FE33333333333343FE66666666666683FE99999999999983FECCCCCCCCCCCCC3FF00000000000003FF199999999999A3FF33333333333343FF4CCCCCCCCCCCC3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333343FFCCCCCCCCCCCCC3FFE66666666666640000000000000004000CCCCCCCCCCCC400199999999999A4002666666666666400333333333333440040000000000004004CCCCCCCCCCCC400599999999999A4006666666666666400733333333333440080000000000004008CCCCCCCCCCCC400999999999999A400A666666666666400B333333333334400C000000000000400CCCCCCCCCCCCC400D99999999999A400E666666666666400F333333333334401000000000000040106666666666664010CCCCCCCCCCCD4011333333333333401199999999999A401200000000000040126666666666664012CCCCCCCCCCCD4013333333333333401399999999999A401400000000000040146666666666664014CCCCCCCCCCCD4015333333333333401599999999999A401600000000000040166666666666664016CCCCCCCCCCCD4017333333333333401799999999999A401800000000000040186666666666664018CCCCCCCCCCCC4019333333333334401999999999999A401A000000000000401A666666666666401ACCCCCCCCCCCC401B333333333334401B99999999999A401C000000000000401C666666666666401CCCCCCCCCCCCC401D333333333334401D99999999999A401E000000000000401E666666666666401ECCCCCCCCCCCC401F333333333334401F99999999999A402000000000000040203333333333334020666666666666402099999999999A4020CCCCCCCCCCCD4021000000000000"},"result":{"expect":"0x0203017803017905017A073FFE6666666666663FFCCCCCCCCCCCCD3FFB3333333333333FF999999999999A3FF80000000000003FF66666666666663FF4CCCCCCCCCCCD3FF33333333333333FF199999999999A3FF00000000000003FECCCCCCCCCCCCC3FE999999999999A3FE66666666666663FE33333333333343FE00000000000003FD99999999999983FD33333333333343FC99999999999983FB99999999999A08000000000000000BFB99999999999A0BFC99999999999A0BFD3333333333330BFD9999999999998BFE0000000000000BFE3333333333334BFE6666666666668BFE9999999999998BFECCCCCCCCCCCCCBFF0000000000000BFF199999999999ABFF3333333333334BFF4CCCCCCCCCCCCBFF6666666666666BFF8000000000000BFF999999999999ABFFB333333333334BFFCCCCCCCCCCCCCBFFE666666666666C000000000000000C000CCCCCCCCCCCCC00199999999999AC002666666666666C003333333333334C004000000000000C004CCCCCCCCCCCCC00599999999999AC006666666666666C007333333333334C008000000000000C008CCCCCCCCCCCCC00999999999999AC00A666666666666C00B333333333334C00C000000000000C00CCCCCCCCCCCCCC00D99999999999AC00E666666666666C00F333333333334C010000000000000C010666666666666C010CCCCCCCCCCCDC011333333333333C01199999999999AC012000000000000C012666666666666C012CCCCCCCCCCCDC013333333333333C01399999999999AC014000000000000C014666666666666C014CCCCCCCCCCCDC015333333333333C01599999999999AC016000000000000C016666666666666C016CCCCCCCCCCCDC017333333333333C01799999999999AC018000000000000C018666666666666C018CCCCCCCCCCCCC019333333333334C01999999999999AC01A000000000000C01A666666666666C01ACCCCCCCCCCCCC01B333333333334C01B99999999999AC01C000000000000C01C666666666666C01CCCCCCCCCCCCCC01D333333333334C01D99999999999AC01E000000000000C01E666666666666C01ECCCCCCCCCCCCC01F333333333334C01F99999999999AC020000000000000C020333333333333C020666666666666C02099999999999AC020CCCCCCCCCCCDC021000000000000"}}
+{"expression":"-a","inputs":{"a":"0x01010178030161BFFE6666666666660162BFFCCCCCCCCCCCCD0163BFFB333333333333"},"result":{"expect":"0x010101780301613FFE66666666666601623FFCCCCCCCCCCCCD01633FFB333333333333"}}
+{"expression":"-a","inputs":{"a":"0x01020178017906016103626172BFFCCCCCCCCCCCCD016103666F6FBFFE666666666666016203626172BFF999999999999A016203666F6FBFFB333333333333016303626172BFF6666666666666016303666F6FBFF8000000000000"},"result":{"expect":"0x010201780179060161036261723FFCCCCCCCCCCCCD016103666F6F3FFE6666666666660162036261723FF999999999999A016203666F6F3FFB3333333333330163036261723FF6666666666666016303666F6F3FF8000000000000"}}
+{"expression":"-a","inputs":{"a":"0x010301780179017A180161036261720169BFF8000000000000016103626172016ABFF6666666666666016103626172016BBFF4CCCCCCCCCCCD016103626172016CBFF3333333333333016103666F6F0169BFFE666666666666016103666F6F016ABFFCCCCCCCCCCCCD016103666F6F016BBFFB333333333333016103666F6F016CBFF999999999999A0162036261720169BFE6666666666666016203626172016ABFE3333333333334016203626172016BBFE0000000000000016203626172016CBFD9999999999998016203666F6F0169BFF199999999999A016203666F6F016ABFF0000000000000016203666F6F016BBFECCCCCCCCCCCCC016203666F6F016CBFE999999999999A01630362617201693FB99999999999A0016303626172016A3FC99999999999A0016303626172016B3FD3333333333330016303626172016C3FD9999999999998016303666F6F0169BFD3333333333334016303666F6F016ABFC9999999999998016303666F6F016BBFB99999999999A0016303666F6F016C0000000000000000"},"result":{"expect":"0x010301780179017A1801610362617201693FF8000000000000016103626172016A3FF6666666666666016103626172016B3FF4CCCCCCCCCCCD016103626172016C3FF3333333333333016103666F6F01693FFE666666666666016103666F6F016A3FFCCCCCCCCCCCCD016103666F6F016B3FFB333333333333016103666F6F016C3FF999999999999A01620362617201693FE6666666666666016203626172016A3FE3333333333334016203626172016B3FE0000000000000016203626172016C3FD9999999999998016203666F6F01693FF199999999999A016203666F6F016A3FF0000000000000016203666F6F016B3FECCCCCCCCCCCCC016203666F6F016C3FE999999999999A0163036261720169BFB99999999999A0016303626172016ABFC99999999999A0016303626172016BBFD3333333333330016303626172016CBFD9999999999998016303666F6F01693FD3333333333334016303666F6F016A3FC9999999999998016303666F6F016B3FB99999999999A0016303666F6F016C8000000000000000"}}
+{"expression":"-a","inputs":{"a":"0x0301017902017803017A070203626172BFF3333333333333BFF199999999999ABFF0000000000000BFECCCCCCCCCCCCCBFE999999999999ABFE6666666666666BFE33333333333343FC99999999999A03FD33333333333303FD99999999999983FE00000000000003FE33333333333343FE66666666666683FE99999999999983FF999999999999A3FFB3333333333343FFCCCCCCCCCCCCC3FFE66666666666640000000000000004000CCCCCCCCCCCC400199999999999A03666F6FBFFE666666666666BFFCCCCCCCCCCCCDBFFB333333333333BFF999999999999ABFF8000000000000BFF6666666666666BFF4CCCCCCCCCCCDBFE0000000000000BFD9999999999998BFD3333333333334BFC9999999999998BFB99999999999A000000000000000003FB99999999999A03FECCCCCCCCCCCCC3FF00000000000003FF199999999999A3FF33333333333343FF4CCCCCCCCCCCC3FF66666666666663FF8000000000000"},"result":{"expect":"0x0301017902017803017A0702036261723FF33333333333333FF199999999999A3FF00000000000003FECCCCCCCCCCCCC3FE999999999999A3FE66666666666663FE3333333333334BFC99999999999A0BFD3333333333330BFD9999999999998BFE0000000000000BFE3333333333334BFE6666666666668BFE9999999999998BFF999999999999ABFFB333333333334BFFCCCCCCCCCCCCCBFFE666666666666C000000000000000C000CCCCCCCCCCCCC00199999999999A03666F6F3FFE6666666666663FFCCCCCCCCCCCCD3FFB3333333333333FF999999999999A3FF80000000000003FF66666666666663FF4CCCCCCCCCCCD3FE00000000000003FD99999999999983FD33333333333343FC99999999999983FB99999999999A08000000000000000BFB99999999999A0BFECCCCCCCCCCCCCBFF0000000000000BFF199999999999ABFF3333333333334BFF4CCCCCCCCCCCCBFF6666666666666BFF8000000000000"}}
+{"expression":"-a","inputs":{"a":"0x03020178017A010179050C01610169BFFE666666666666BFF8000000000000BFF199999999999ABFE6666666666666BFD33333333333340161016ABFFCCCCCCCCCCCCDBFF6666666666666BFF0000000000000BFE3333333333334BFC99999999999980161016BBFFB333333333333BFF4CCCCCCCCCCCDBFECCCCCCCCCCCCCBFE0000000000000BFB99999999999A00161016CBFF999999999999ABFF3333333333333BFE999999999999ABFD99999999999980000000000000000016201693FB99999999999A03FE00000000000003FECCCCCCCCCCCCC3FF4CCCCCCCCCCCC3FFB3333333333340162016A3FC99999999999A03FE33333333333343FF00000000000003FF66666666666663FFCCCCCCCCCCCCC0162016B3FD33333333333303FE66666666666683FF199999999999A3FF80000000000003FFE6666666666660162016C3FD99999999999983FE99999999999983FF33333333333343FF999999999999A4000000000000000016301694000CCCCCCCCCCCC40040000000000004007333333333334400A666666666666400D99999999999A0163016A400199999999999A4004CCCCCCCCCCCC4008000000000000400B333333333334400E6666666666660163016B4002666666666666400599999999999A4008CCCCCCCCCCCC400C000000000000400F3333333333340163016C40033333333333344006666666666666400999999999999A400CCCCCCCCCCCCC4010000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FFE6666666666663FF80000000000003FF199999999999A3FE66666666666663FD33333333333340161016A3FFCCCCCCCCCCCCD3FF66666666666663FF00000000000003FE33333333333343FC99999999999980161016B3FFB3333333333333FF4CCCCCCCCCCCD3FECCCCCCCCCCCCC3FE00000000000003FB99999999999A00161016C3FF999999999999A3FF33333333333333FE999999999999A3FD9999999999998800000000000000001620169BFB99999999999A0BFE0000000000000BFECCCCCCCCCCCCCBFF4CCCCCCCCCCCCBFFB3333333333340162016ABFC99999999999A0BFE3333333333334BFF0000000000000BFF6666666666666BFFCCCCCCCCCCCCC0162016BBFD3333333333330BFE6666666666668BFF199999999999ABFF8000000000000BFFE6666666666660162016CBFD9999999999998BFE9999999999998BFF3333333333334BFF999999999999AC00000000000000001630169C000CCCCCCCCCCCCC004000000000000C007333333333334C00A666666666666C00D99999999999A0163016AC00199999999999AC004CCCCCCCCCCCCC008000000000000C00B333333333334C00E6666666666660163016BC002666666666666C00599999999999AC008CCCCCCCCCCCCC00C000000000000C00F3333333333340163016CC003333333333334C006666666666666C00999999999999AC00CCCCCCCCCCCCCC010000000000000"}}
+{"expression":"map(a,f(a)(-a))","inputs":{"a":"0x0200BFFE666666666666"},"result":{"expect":"0x02003FFE666666666666"}}
+{"expression":"map(a,f(a)(-a))","inputs":{"a":"0x0201017803BFFE666666666666BFFCCCCCCCCCCCCDBFFB333333333333"},"result":{"expect":"0x02010178033FFE6666666666663FFCCCCCCCCCCCCD3FFB333333333333"}}
+{"expression":"map(a,f(a)(-a))","inputs":{"a":"0x0202017803017905BFFE666666666666BFFCCCCCCCCCCCCDBFFB333333333333BFF999999999999ABFF8000000000000BFF6666666666666BFF4CCCCCCCCCCCDBFF3333333333333BFF199999999999ABFF0000000000000BFECCCCCCCCCCCCCBFE999999999999ABFE6666666666666BFE3333333333334BFE0000000000000"},"result":{"expect":"0x02020178030179053FFE6666666666663FFCCCCCCCCCCCCD3FFB3333333333333FF999999999999A3FF80000000000003FF66666666666663FF4CCCCCCCCCCCD3FF33333333333333FF199999999999A3FF00000000000003FECCCCCCCCCCCCC3FE999999999999A3FE66666666666663FE33333333333343FE0000000000000"}}
+{"expression":"map(a,f(a)(-a))","inputs":{"a":"0x0203017803017905017A07BFFE666666666666BFFCCCCCCCCCCCCDBFFB333333333333BFF999999999999ABFF8000000000000BFF6666666666666BFF4CCCCCCCCCCCDBFF3333333333333BFF199999999999ABFF0000000000000BFECCCCCCCCCCCCCBFE999999999999ABFE6666666666666BFE3333333333334BFE0000000000000BFD9999999999998BFD3333333333334BFC9999999999998BFB99999999999A000000000000000003FB99999999999A03FC99999999999A03FD33333333333303FD99999999999983FE00000000000003FE33333333333343FE66666666666683FE99999999999983FECCCCCCCCCCCCC3FF00000000000003FF199999999999A3FF33333333333343FF4CCCCCCCCCCCC3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333343FFCCCCCCCCCCCCC3FFE66666666666640000000000000004000CCCCCCCCCCCC400199999999999A4002666666666666400333333333333440040000000000004004CCCCCCCCCCCC400599999999999A4006666666666666400733333333333440080000000000004008CCCCCCCCCCCC400999999999999A400A666666666666400B333333333334400C000000000000400CCCCCCCCCCCCC400D99999999999A400E666666666666400F333333333334401000000000000040106666666666664010CCCCCCCCCCCD4011333333333333401199999999999A401200000000000040126666666666664012CCCCCCCCCCCD4013333333333333401399999999999A401400000000000040146666666666664014CCCCCCCCCCCD4015333333333333401599999999999A401600000000000040166666666666664016CCCCCCCCCCCD4017333333333333401799999999999A401800000000000040186666666666664018CCCCCCCCCCCC4019333333333334401999999999999A401A000000000000401A666666666666401ACCCCCCCCCCCC401B333333333334401B99999999999A401C000000000000401C666666666666401CCCCCCCCCCCCC401D333333333334401D99999999999A401E000000000000401E666666666666401ECCCCCCCCCCCC401F333333333334401F99999999999A402000000000000040203333333333334020666666666666402099999999999A4020CCCCCCCCCCCD4021000000000000"},"result":{"expect":"0x0203017803017905017A073FFE6666666666663FFCCCCCCCCCCCCD3FFB3333333333333FF999999999999A3FF80000000000003FF66666666666663FF4CCCCCCCCCCCD3FF33333333333333FF199999999999A3FF00000000000003FECCCCCCCCCCCCC3FE999999999999A3FE66666666666663FE33333333333343FE00000000000003FD99999999999983FD33333333333343FC99999999999983FB99999999999A08000000000000000BFB99999999999A0BFC99999999999A0BFD3333333333330BFD9999999999998BFE0000000000000BFE3333333333334BFE6666666666668BFE9999999999998BFECCCCCCCCCCCCCBFF0000000000000BFF199999999999ABFF3333333333334BFF4CCCCCCCCCCCCBFF6666666666666BFF8000000000000BFF999999999999ABFFB333333333334BFFCCCCCCCCCCCCCBFFE666666666666C000000000000000C000CCCCCCCCCCCCC00199999999999AC002666666666666C003333333333334C004000000000000C004CCCCCCCCCCCCC00599999999999AC006666666666666C007333333333334C008000000000000C008CCCCCCCCCCCCC00999999999999AC00A666666666666C00B333333333334C00C000000000000C00CCCCCCCCCCCCCC00D99999999999AC00E666666666666C00F333333333334C010000000000000C010666666666666C010CCCCCCCCCCCDC011333333333333C01199999999999AC012000000000000C012666666666666C012CCCCCCCCCCCDC013333333333333C01399999999999AC014000000000000C014666666666666C014CCCCCCCCCCCDC015333333333333C01599999999999AC016000000000000C016666666666666C016CCCCCCCCCCCDC017333333333333C01799999999999AC018000000000000C018666666666666C018CCCCCCCCCCCCC019333333333334C01999999999999AC01A000000000000C01A666666666666C01ACCCCCCCCCCCCC01B333333333334C01B99999999999AC01C000000000000C01C666666666666C01CCCCCCCCCCCCCC01D333333333334C01D99999999999AC01E000000000000C01E666666666666C01ECCCCCCCCCCCCC01F333333333334C01F99999999999AC020000000000000C020333333333333C020666666666666C02099999999999AC020CCCCCCCCCCCDC021000000000000"}}
+{"expression":"map(a,f(a)(-a))","inputs":{"a":"0x01010178030161BFFE6666666666660162BFFCCCCCCCCCCCCD0163BFFB333333333333"},"result":{"expect":"0x010101780301613FFE66666666666601623FFCCCCCCCCCCCCD01633FFB333333333333"}}
+{"expression":"map(a,f(a)(-a))","inputs":{"a":"0x01020178017906016103626172BFFCCCCCCCCCCCCD016103666F6FBFFE666666666666016203626172BFF999999999999A016203666F6FBFFB333333333333016303626172BFF6666666666666016303666F6FBFF8000000000000"},"result":{"expect":"0x010201780179060161036261723FFCCCCCCCCCCCCD016103666F6F3FFE6666666666660162036261723FF999999999999A016203666F6F3FFB3333333333330163036261723FF6666666666666016303666F6F3FF8000000000000"}}
+{"expression":"map(a,f(a)(-a))","inputs":{"a":"0x010301780179017A180161036261720169BFF8000000000000016103626172016ABFF6666666666666016103626172016BBFF4CCCCCCCCCCCD016103626172016CBFF3333333333333016103666F6F0169BFFE666666666666016103666F6F016ABFFCCCCCCCCCCCCD016103666F6F016BBFFB333333333333016103666F6F016CBFF999999999999A0162036261720169BFE6666666666666016203626172016ABFE3333333333334016203626172016BBFE0000000000000016203626172016CBFD9999999999998016203666F6F0169BFF199999999999A016203666F6F016ABFF0000000000000016203666F6F016BBFECCCCCCCCCCCCC016203666F6F016CBFE999999999999A01630362617201693FB99999999999A0016303626172016A3FC99999999999A0016303626172016B3FD3333333333330016303626172016C3FD9999999999998016303666F6F0169BFD3333333333334016303666F6F016ABFC9999999999998016303666F6F016BBFB99999999999A0016303666F6F016C0000000000000000"},"result":{"expect":"0x010301780179017A1801610362617201693FF8000000000000016103626172016A3FF6666666666666016103626172016B3FF4CCCCCCCCCCCD016103626172016C3FF3333333333333016103666F6F01693FFE666666666666016103666F6F016A3FFCCCCCCCCCCCCD016103666F6F016B3FFB333333333333016103666F6F016C3FF999999999999A01620362617201693FE6666666666666016203626172016A3FE3333333333334016203626172016B3FE0000000000000016203626172016C3FD9999999999998016203666F6F01693FF199999999999A016203666F6F016A3FF0000000000000016203666F6F016B3FECCCCCCCCCCCCC016203666F6F016C3FE999999999999A0163036261720169BFB99999999999A0016303626172016ABFC99999999999A0016303626172016BBFD3333333333330016303626172016CBFD9999999999998016303666F6F01693FD3333333333334016303666F6F016A3FC9999999999998016303666F6F016B3FB99999999999A0016303666F6F016C8000000000000000"}}
+{"expression":"map(a,f(a)(-a))","inputs":{"a":"0x0301017902017803017A070203626172BFF3333333333333BFF199999999999ABFF0000000000000BFECCCCCCCCCCCCCBFE999999999999ABFE6666666666666BFE33333333333343FC99999999999A03FD33333333333303FD99999999999983FE00000000000003FE33333333333343FE66666666666683FE99999999999983FF999999999999A3FFB3333333333343FFCCCCCCCCCCCCC3FFE66666666666640000000000000004000CCCCCCCCCCCC400199999999999A03666F6FBFFE666666666666BFFCCCCCCCCCCCCDBFFB333333333333BFF999999999999ABFF8000000000000BFF6666666666666BFF4CCCCCCCCCCCDBFE0000000000000BFD9999999999998BFD3333333333334BFC9999999999998BFB99999999999A000000000000000003FB99999999999A03FECCCCCCCCCCCCC3FF00000000000003FF199999999999A3FF33333333333343FF4CCCCCCCCCCCC3FF66666666666663FF8000000000000"},"result":{"expect":"0x0301017902017803017A0702036261723FF33333333333333FF199999999999A3FF00000000000003FECCCCCCCCCCCCC3FE999999999999A3FE66666666666663FE3333333333334BFC99999999999A0BFD3333333333330BFD9999999999998BFE0000000000000BFE3333333333334BFE6666666666668BFE9999999999998BFF999999999999ABFFB333333333334BFFCCCCCCCCCCCCCBFFE666666666666C000000000000000C000CCCCCCCCCCCCC00199999999999A03666F6F3FFE6666666666663FFCCCCCCCCCCCCD3FFB3333333333333FF999999999999A3FF80000000000003FF66666666666663FF4CCCCCCCCCCCD3FE00000000000003FD99999999999983FD33333333333343FC99999999999983FB99999999999A08000000000000000BFB99999999999A0BFECCCCCCCCCCCCCBFF0000000000000BFF199999999999ABFF3333333333334BFF4CCCCCCCCCCCCBFF6666666666666BFF8000000000000"}}
+{"expression":"map(a,f(a)(-a))","inputs":{"a":"0x03020178017A010179050C01610169BFFE666666666666BFF8000000000000BFF199999999999ABFE6666666666666BFD33333333333340161016ABFFCCCCCCCCCCCCDBFF6666666666666BFF0000000000000BFE3333333333334BFC99999999999980161016BBFFB333333333333BFF4CCCCCCCCCCCDBFECCCCCCCCCCCCCBFE0000000000000BFB99999999999A00161016CBFF999999999999ABFF3333333333333BFE999999999999ABFD99999999999980000000000000000016201693FB99999999999A03FE00000000000003FECCCCCCCCCCCCC3FF4CCCCCCCCCCCC3FFB3333333333340162016A3FC99999999999A03FE33333333333343FF00000000000003FF66666666666663FFCCCCCCCCCCCCC0162016B3FD33333333333303FE66666666666683FF199999999999A3FF80000000000003FFE6666666666660162016C3FD99999999999983FE99999999999983FF33333333333343FF999999999999A4000000000000000016301694000CCCCCCCCCCCC40040000000000004007333333333334400A666666666666400D99999999999A0163016A400199999999999A4004CCCCCCCCCCCC4008000000000000400B333333333334400E6666666666660163016B4002666666666666400599999999999A4008CCCCCCCCCCCC400C000000000000400F3333333333340163016C40033333333333344006666666666666400999999999999A400CCCCCCCCCCCCC4010000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FFE6666666666663FF80000000000003FF199999999999A3FE66666666666663FD33333333333340161016A3FFCCCCCCCCCCCCD3FF66666666666663FF00000000000003FE33333333333343FC99999999999980161016B3FFB3333333333333FF4CCCCCCCCCCCD3FECCCCCCCCCCCCC3FE00000000000003FB99999999999A00161016C3FF999999999999A3FF33333333333333FE999999999999A3FD9999999999998800000000000000001620169BFB99999999999A0BFE0000000000000BFECCCCCCCCCCCCCBFF4CCCCCCCCCCCCBFFB3333333333340162016ABFC99999999999A0BFE3333333333334BFF0000000000000BFF6666666666666BFFCCCCCCCCCCCCC0162016BBFD3333333333330BFE6666666666668BFF199999999999ABFF8000000000000BFFE6666666666660162016CBFD9999999999998BFE9999999999998BFF3333333333334BFF999999999999AC00000000000000001630169C000CCCCCCCCCCCCC004000000000000C007333333333334C00A666666666666C00D99999999999A0163016AC00199999999999AC004CCCCCCCCCCCCC008000000000000C00B333333333334C00E6666666666660163016BC002666666666666C00599999999999AC008CCCCCCCCCCCCC00C000000000000C00F3333333333340163016CC003333333333334C006666666666666C00999999999999AC00CCCCCCCCCCCCCC010000000000000"}}
+{"expression":"!a","inputs":{"a":"0x02000000000000000000"},"result":{"expect":"0x02003FF0000000000000"}}
+{"expression":"!a","inputs":{"a":"0x020101780300000000000000003FF00000000000003FF0000000000000"},"result":{"expect":"0x02010178033FF000000000000000000000000000000000000000000000"}}
+{"expression":"!a","inputs":{"a":"0x020201780301790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000"},"result":{"expect":"0x02020178030179053FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000"}}
+{"expression":"!a","inputs":{"a":"0x0203017803017905017A0700000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000"},"result":{"expect":"0x0203017803017905017A073FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000"}}
+{"expression":"!a","inputs":{"a":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000"},"result":{"expect":"0x010101780301613FF00000000000000162000000000000000001630000000000000000"}}
+{"expression":"!a","inputs":{"a":"0x010201780179060161036261723FF0000000000000016103666F6F00000000000000000162036261720000000000000000016203666F6F3FF00000000000000163036261723FF0000000000000016303666F6F3FF0000000000000"},"result":{"expect":"0x010201780179060161036261720000000000000000016103666F6F3FF00000000000000162036261723FF0000000000000016203666F6F00000000000000000163036261720000000000000000016303666F6F0000000000000000"}}
+{"expression":"!a","inputs":{"a":"0x010301780179017A1801610362617201693FF0000000000000016103626172016A3FF0000000000000016103626172016B0000000000000000016103626172016C3FF0000000000000016103666F6F01690000000000000000016103666F6F016A3FF0000000000000016103666F6F016B3FF0000000000000016103666F6F016C000000000000000001620362617201690000000000000000016203626172016A3FF0000000000000016203626172016B3FF0000000000000016203626172016C0000000000000000016203666F6F01693FF0000000000000016203666F6F016A0000000000000000016203666F6F016B3FF0000000000000016203666F6F016C3FF000000000000001630362617201693FF0000000000000016303626172016A0000000000000000016303626172016B3FF0000000000000016303626172016C3FF0000000000000016303666F6F01693FF0000000000000016303666F6F016A3FF0000000000000016303666F6F016B0000000000000000016303666F6F016C3FF0000000000000"},"result":{"expect":"0x010301780179017A1801610362617201690000000000000000016103626172016A0000000000000000016103626172016B3FF0000000000000016103626172016C0000000000000000016103666F6F01693FF0000000000000016103666F6F016A0000000000000000016103666F6F016B0000000000000000016103666F6F016C3FF000000000000001620362617201693FF0000000000000016203626172016A0000000000000000016203626172016B0000000000000000016203626172016C3FF0000000000000016203666F6F01690000000000000000016203666F6F016A3FF0000000000000016203666F6F016B0000000000000000016203666F6F016C000000000000000001630362617201690000000000000000016303626172016A3FF0000000000000016303626172016B0000000000000000016303626172016C0000000000000000016303666F6F01690000000000000000016303666F6F016A0000000000000000016303666F6F016B3FF0000000000000016303666F6F016C0000000000000000"}}
+{"expression":"!a","inputs":{"a":"0x0301017902017803017A0702036261723FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000003666F6F00000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x0301017902017803017A070203626172000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF00000000000000000000000000000000000000000000003666F6F3FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF00000000000000000000000000000"}}
+{"expression":"!a","inputs":{"a":"0x03020178017A010179050C0161016900000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000000161016A3FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000161016B3FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000000161016C00000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000016201693FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000000162016A00000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000000162016B3FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000162016C3FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000016301693FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000163016A3FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000000163016B00000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000000163016C3FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FF0000000000000000000000000000000000000000000003FF000000000000000000000000000000161016A000000000000000000000000000000003FF0000000000000000000000000000000000000000000000161016B00000000000000003FF0000000000000000000000000000000000000000000003FF00000000000000161016C3FF0000000000000000000000000000000000000000000003FF000000000000000000000000000000162016900000000000000003FF0000000000000000000000000000000000000000000003FF00000000000000162016A3FF0000000000000000000000000000000000000000000003FF000000000000000000000000000000162016B000000000000000000000000000000003FF0000000000000000000000000000000000000000000000162016C00000000000000003FF0000000000000000000000000000000000000000000003FF000000000000001630169000000000000000000000000000000003FF0000000000000000000000000000000000000000000000163016A00000000000000003FF0000000000000000000000000000000000000000000003FF00000000000000163016B3FF0000000000000000000000000000000000000000000003FF000000000000000000000000000000163016C000000000000000000000000000000003FF000000000000000000000000000000000000000000000"}}
+{"expression":"map(a,f(a)(!a))","inputs":{"a":"0x02000000000000000000"},"result":{"expect":"0x02003FF0000000000000"}}
+{"expression":"map(a,f(a)(!a))","inputs":{"a":"0x020101780300000000000000003FF00000000000003FF0000000000000"},"result":{"expect":"0x02010178033FF000000000000000000000000000000000000000000000"}}
+{"expression":"map(a,f(a)(!a))","inputs":{"a":"0x020201780301790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000"},"result":{"expect":"0x02020178030179053FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000"}}
+{"expression":"map(a,f(a)(!a))","inputs":{"a":"0x0203017803017905017A0700000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000"},"result":{"expect":"0x0203017803017905017A073FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000"}}
+{"expression":"map(a,f(a)(!a))","inputs":{"a":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000"},"result":{"expect":"0x010101780301613FF00000000000000162000000000000000001630000000000000000"}}
+{"expression":"map(a,f(a)(!a))","inputs":{"a":"0x010201780179060161036261723FF0000000000000016103666F6F00000000000000000162036261720000000000000000016203666F6F3FF00000000000000163036261723FF0000000000000016303666F6F3FF0000000000000"},"result":{"expect":"0x010201780179060161036261720000000000000000016103666F6F3FF00000000000000162036261723FF0000000000000016203666F6F00000000000000000163036261720000000000000000016303666F6F0000000000000000"}}
+{"expression":"map(a,f(a)(!a))","inputs":{"a":"0x010301780179017A1801610362617201693FF0000000000000016103626172016A3FF0000000000000016103626172016B0000000000000000016103626172016C3FF0000000000000016103666F6F01690000000000000000016103666F6F016A3FF0000000000000016103666F6F016B3FF0000000000000016103666F6F016C000000000000000001620362617201690000000000000000016203626172016A3FF0000000000000016203626172016B3FF0000000000000016203626172016C0000000000000000016203666F6F01693FF0000000000000016203666F6F016A0000000000000000016203666F6F016B3FF0000000000000016203666F6F016C3FF000000000000001630362617201693FF0000000000000016303626172016A0000000000000000016303626172016B3FF0000000000000016303626172016C3FF0000000000000016303666F6F01693FF0000000000000016303666F6F016A3FF0000000000000016303666F6F016B0000000000000000016303666F6F016C3FF0000000000000"},"result":{"expect":"0x010301780179017A1801610362617201690000000000000000016103626172016A0000000000000000016103626172016B3FF0000000000000016103626172016C0000000000000000016103666F6F01693FF0000000000000016103666F6F016A0000000000000000016103666F6F016B0000000000000000016103666F6F016C3FF000000000000001620362617201693FF0000000000000016203626172016A0000000000000000016203626172016B0000000000000000016203626172016C3FF0000000000000016203666F6F01690000000000000000016203666F6F016A3FF0000000000000016203666F6F016B0000000000000000016203666F6F016C000000000000000001630362617201690000000000000000016303626172016A3FF0000000000000016303626172016B0000000000000000016303626172016C0000000000000000016303666F6F01690000000000000000016303666F6F016A0000000000000000016303666F6F016B3FF0000000000000016303666F6F016C0000000000000000"}}
+{"expression":"map(a,f(a)(!a))","inputs":{"a":"0x0301017902017803017A0702036261723FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000003666F6F00000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x0301017902017803017A070203626172000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF00000000000000000000000000000000000000000000003666F6F3FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF00000000000000000000000000000"}}
+{"expression":"map(a,f(a)(!a))","inputs":{"a":"0x03020178017A010179050C0161016900000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000000161016A3FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000161016B3FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000000161016C00000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000016201693FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000000162016A00000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000000162016B3FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000162016C3FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000016301693FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000163016A3FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000000163016B00000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000000163016C3FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FF0000000000000000000000000000000000000000000003FF000000000000000000000000000000161016A000000000000000000000000000000003FF0000000000000000000000000000000000000000000000161016B00000000000000003FF0000000000000000000000000000000000000000000003FF00000000000000161016C3FF0000000000000000000000000000000000000000000003FF000000000000000000000000000000162016900000000000000003FF0000000000000000000000000000000000000000000003FF00000000000000162016A3FF0000000000000000000000000000000000000000000003FF000000000000000000000000000000162016B000000000000000000000000000000003FF0000000000000000000000000000000000000000000000162016C00000000000000003FF0000000000000000000000000000000000000000000003FF000000000000001630169000000000000000000000000000000003FF0000000000000000000000000000000000000000000000163016A00000000000000003FF0000000000000000000000000000000000000000000003FF00000000000000163016B3FF0000000000000000000000000000000000000000000003FF000000000000000000000000000000163016C000000000000000000000000000000003FF000000000000000000000000000000000000000000000"}}
+{"expression":"cos(a)","inputs":{"a":"0x02003FB999999999999A"},"result":{"expect":"0x02003FEFD712F9A817C1"}}
+{"expression":"cos(a)","inputs":{"a":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FEFD712F9A817C13FEF5CB49577627A3FEE921DD42F09BA"}}
+{"expression":"cos(a)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178030179053FEFD712F9A817C13FEF5CB49577627A3FEE921DD42F09BA3FED7954E7DBA2F83FEC1528065B7D503FEA69263C485B153FE87996529F9D933FE64B6BDE7198653FE3E43A9692E21C3FE14A280FB5068C3FDD07B806C761113FD730DE943B79D43FD11EB3682A4C5F3FC5C17BBC13570B3FB21BD54FC5F9A7"}}
+{"expression":"cos(a)","inputs":{"a":"0x0203017803017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD4011333333333333401199999999999A401200000000000040126666666666664012CCCCCCCCCCCD4013333333333333401399999999999A401400000000000040146666666666664014CCCCCCCCCCCD4015333333333333401599999999999A401600000000000040166666666666664016CCCCCCCCCCCD4017333333333333401799999999999A401800000000000040186666666666664018CCCCCCCCCCCD4019333333333333401999999999999A401A000000000000401A666666666666401ACCCCCCCCCCCD401B333333333333401B99999999999A401C000000000000401C666666666666401CCCCCCCCCCCCD401D333333333333401D99999999999A401E000000000000401E666666666666401ECCCCCCCCCCCD401F333333333333401F99999999999A402000000000000040203333333333334020666666666666402099999999999A4020CCCCCCCCCCCD402100000000000040213333333333334021666666666666402199999999999A4021CCCCCCCCCCCD402200000000000040223333333333334022666666666666402299999999999A4022CCCCCCCCCCCD402300000000000040233333333333334023666666666666402399999999999A4023CCCCCCCCCCCD402400000000000040243333333333334024666666666666402499999999999A4024CCCCCCCCCCCD4025000000000000"},"result":{"expect":"0x0203017803017905017A073FEFD712F9A817C13FEF5CB49577627A3FEE921DD42F09BA3FED7954E7DBA2F83FEC1528065B7D503FEA69263C485B153FE87996529F9D933FE64B6BDE7198653FE3E43A9692E21C3FE14A280FB5068C3FDD07B806C761113FD730DE943B79D43FD11EB3682A4C5F3FC5C17BBC13570B3FB21BD54FC5F9A7BF9DE67AC55F1633BFC07DF9F4A26C86BFCD14F54F250E7ABFD4B0C6B93445ABBFDAA22657537205BFE027B304989ECABFE2D5004B88AD70BFE5522217302FE1BFE798BAB490D185BFE9A2F7EF858B7DBFEB6BA1F680F470BFECEE28B36603A6BFEE26AF7757704ABFEF1216DBA340C9BFEFAE04BE85E5D2BFEFF8EA4756A624BFEFF207E2B9CBB6BFEF996F2CA70BB6BFEEF002C35EBE04BFEDF77403C11A5FBFECB23EB4D22C59BFEB23A2AD7DD937BFE94F9B84DBA8EBBFE73AD66234C8EABFE4EAA606DB24C1BFE264F5306A2D6ABFDF606EEC8AC71DBFD9A6B192163B53BFD3AB577C62C2AABFCAFB5B54583D6ABFBCB6072B598DCABF895F3A43506A343FB66655584E40403FC7DFA3277C16643FD22785706B4AD93FD830C98EE45C9C3FDDFC2D59376AEE3FE1BD6F3F7432D53FE44F676F25B08C3FE6AD6C3C07D4483FE8D16F88830A7F3FEAB5F7960DFE2A3FEC562D06A772233FEDADE73EF950293FEEB9B7097822F53FEF76EF5F4998B23FEFE3AC4079A9CE3FEFFED789FC7A413FEFC82BBD1E4CA13FEF4034B145C3C83FEE684E2E41C42D3FED42A072B5E51B3FEBD21AAF88DCFB3FEA1A6B8672124B3FE81FF79ED920173FE5E7CE691EA5463FE3779D2D0CA0EA3FE0D5A0848A01CB3FDC1128CF6B887D3FD62F45E66F5C2F3FD014A429AC16E13FC3A1C134C1C59E3FABA00B7D845AFABFA78D9732562AABBFC29FBEBF632F94BFCF2C746FB6AF1DBFD5B4B6970D1EA6BFDB9BADA059A170BFE09E033D53AE3FBFE343AE773AB08EBFE5B8131ACC20FBBFE7F4E9CF633AD1BFE9F479562D158DBFEBB1A52E0FEB79BFED27FAA6A6196BBFEE53BC40DBB50ABFEF31EB4014A490BFEFC04F53629ED4BFEFFD7C43328F13BFEFE8D594EB0C48BFEF82901B2CEEB6BFEECBB16EB638EABFEDC60D5140EE7DBFEC7441010D641ABFEAD9AC890C6B1FBFE8FA6A1EC3FF04BFE6DB43A4039D37BFE481A6673F777BBFE1F39541E710BCBFDE6F3270721E39"}}
+{"expression":"cos(a)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FEFD712F9A817C101623FEF5CB49577627A01633FEE921DD42F09BA"}}
+{"expression":"cos(a)","inputs":{"a":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179060161036261723FEF5CB49577627A016103666F6F3FEFD712F9A817C10162036261723FED7954E7DBA2F8016203666F6F3FEE921DD42F09BA0163036261723FEA69263C485B15016303666F6F3FEC1528065B7D50"}}
+{"expression":"cos(a)","inputs":{"a":"0x010301780179017A1801610362617201693FE0000000000000016103626172016A3FE3333333333333016103626172016B3FE6666666666666016103626172016C3FE999999999999A016103666F6F01693FB999999999999A016103666F6F016A3FC999999999999A016103666F6F016B3FD3333333333333016103666F6F016C3FD999999999999A01620362617201693FF4CCCCCCCCCCCD016203626172016A3FF6666666666666016203626172016B3FF8000000000000016203626172016C3FF999999999999A016203666F6F01693FECCCCCCCCCCCCD016203666F6F016A3FF0000000000000016203666F6F016B3FF199999999999A016203666F6F016C3FF333333333333301630362617201694000CCCCCCCCCCCD016303626172016A400199999999999A016303626172016B4002666666666666016303626172016C4003333333333333016303666F6F01693FFB333333333333016303666F6F016A3FFCCCCCCCCCCCCD016303666F6F016B3FFE666666666666016303666F6F016C4000000000000000"},"result":{"expect":"0x010301780179017A1801610362617201693FEC1528065B7D50016103626172016A3FEA69263C485B15016103626172016B3FE87996529F9D93016103626172016C3FE64B6BDE719865016103666F6F01693FEFD712F9A817C1016103666F6F016A3FEF5CB49577627A016103666F6F016B3FEE921DD42F09BA016103666F6F016C3FED7954E7DBA2F801620362617201693FD11EB3682A4C5F016203626172016A3FC5C17BBC13570B016203626172016B3FB21BD54FC5F9A7016203626172016CBF9DE67AC55F1633016203666F6F01693FE3E43A9692E21C016203666F6F016A3FE14A280FB5068C016203666F6F016B3FDD07B806C76111016203666F6F016C3FD730DE943B79D40163036261720169BFE027B304989ECA016303626172016ABFE2D5004B88AD70016303626172016BBFE5522217302FE1016303626172016CBFE798BAB490D185016303666F6F0169BFC07DF9F4A26C86016303666F6F016ABFCD14F54F250E7A016303666F6F016BBFD4B0C6B93445AB016303666F6F016CBFDAA22657537205"}}
+{"expression":"cos(a)","inputs":{"a":"0x0301017902017803017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF6666666666666400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD03666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0301017902017803017A0702036261723FE64B6BDE7198653FE3E43A9692E21C3FE14A280FB5068C3FDD07B806C761113FD730DE943B79D43FD11EB3682A4C5F3FC5C17BBC13570BBFE2D5004B88AD70BFE5522217302FE1BFE798BAB490D185BFE9A2F7EF858B7DBFEB6BA1F680F470BFECEE28B36603A6BFEE26AF7757704ABFECB23EB4D22C59BFEB23A2AD7DD937BFE94F9B84DBA8EBBFE73AD66234C8EABFE4EAA606DB24C1BFE264F5306A2D6ABFDF606EEC8AC71D03666F6F3FEFD712F9A817C13FEF5CB49577627A3FEE921DD42F09BA3FED7954E7DBA2F83FEC1528065B7D503FEA69263C485B153FE87996529F9D933FB21BD54FC5F9A7BF9DE67AC55F1633BFC07DF9F4A26C86BFCD14F54F250E7ABFD4B0C6B93445ABBFDAA22657537205BFE027B304989ECABFEF1216DBA340C9BFEFAE04BE85E5D2BFEFF8EA4756A624BFEFF207E2B9CBB6BFEF996F2CA70BB6BFEEF002C35EBE04BFEDF77403C11A5F"}}
+{"expression":"cos(a)","inputs":{"a":"0x03020178017A010179050C016101693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB3333333333330161016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD0161016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE6666666666660161016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000016201694000CCCCCCCCCCCD40040000000000004007333333333333400A666666666666400D99999999999A0162016A400199999999999A4004CCCCCCCCCCCD4008000000000000400B333333333333400E6666666666660162016B4002666666666666400599999999999A4008CCCCCCCCCCCD400C000000000000400F3333333333330162016C40033333333333334006666666666666400999999999999A400CCCCCCCCCCCCD40100000000000000163016940106666666666664012000000000000401399999999999A40153333333333334016CCCCCCCCCCCD0163016A4010CCCCCCCCCCCD40126666666666664014000000000000401599999999999A40173333333333330163016B40113333333333334012CCCCCCCCCCCD40146666666666664016000000000000401799999999999A0163016C401199999999999A40133333333333334014CCCCCCCCCCCD40166666666666664018000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FEFD712F9A817C13FEC1528065B7D503FE3E43A9692E21C3FD11EB3682A4C5FBFC07DF9F4A26C860161016A3FEF5CB49577627A3FEA69263C485B153FE14A280FB5068C3FC5C17BBC13570BBFCD14F54F250E7A0161016B3FEE921DD42F09BA3FE87996529F9D933FDD07B806C761113FB21BD54FC5F9A7BFD4B0C6B93445AB0161016C3FED7954E7DBA2F83FE64B6BDE7198653FD730DE943B79D4BF9DE67AC55F1633BFDAA2265753720501620169BFE027B304989ECABFE9A2F7EF858B7DBFEF1216DBA340C9BFEF996F2CA70BB6BFEB23A2AD7DD9370162016ABFE2D5004B88AD70BFEB6BA1F680F470BFEFAE04BE85E5D2BFEEF002C35EBE04BFE94F9B84DBA8EB0162016BBFE5522217302FE1BFECEE28B36603A6BFEFF8EA4756A624BFEDF77403C11A5FBFE73AD66234C8EA0162016CBFE798BAB490D185BFEE26AF7757704ABFEFF207E2B9CBB6BFECB23EB4D22C59BFE4EAA606DB24C101630169BFE264F5306A2D6ABFCAFB5B54583D6A3FC7DFA3277C16643FE1BD6F3F7432D53FEAB5F7960DFE2A0163016ABFDF606EEC8AC71DBFBCB6072B598DCA3FD22785706B4AD93FE44F676F25B08C3FEC562D06A772230163016BBFD9A6B192163B53BF895F3A43506A343FD830C98EE45C9C3FE6AD6C3C07D4483FEDADE73EF950290163016CBFD3AB577C62C2AA3FB66655584E40403FDDFC2D59376AEE3FE8D16F88830A7F3FEEB9B7097822F5"}}
+{"expression":"map(a,f(a)(cos(a)))","inputs":{"a":"0x02003FB999999999999A"},"result":{"expect":"0x02003FEFD712F9A817C1"}}
+{"expression":"map(a,f(a)(cos(a)))","inputs":{"a":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FEFD712F9A817C13FEF5CB49577627A3FEE921DD42F09BA"}}
+{"expression":"map(a,f(a)(cos(a)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178030179053FEFD712F9A817C13FEF5CB49577627A3FEE921DD42F09BA3FED7954E7DBA2F83FEC1528065B7D503FEA69263C485B153FE87996529F9D933FE64B6BDE7198653FE3E43A9692E21C3FE14A280FB5068C3FDD07B806C761113FD730DE943B79D43FD11EB3682A4C5F3FC5C17BBC13570B3FB21BD54FC5F9A7"}}
+{"expression":"map(a,f(a)(cos(a)))","inputs":{"a":"0x0203017803017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD4011333333333333401199999999999A401200000000000040126666666666664012CCCCCCCCCCCD4013333333333333401399999999999A401400000000000040146666666666664014CCCCCCCCCCCD4015333333333333401599999999999A401600000000000040166666666666664016CCCCCCCCCCCD4017333333333333401799999999999A401800000000000040186666666666664018CCCCCCCCCCCD4019333333333333401999999999999A401A000000000000401A666666666666401ACCCCCCCCCCCD401B333333333333401B99999999999A401C000000000000401C666666666666401CCCCCCCCCCCCD401D333333333333401D99999999999A401E000000000000401E666666666666401ECCCCCCCCCCCD401F333333333333401F99999999999A402000000000000040203333333333334020666666666666402099999999999A4020CCCCCCCCCCCD402100000000000040213333333333334021666666666666402199999999999A4021CCCCCCCCCCCD402200000000000040223333333333334022666666666666402299999999999A4022CCCCCCCCCCCD402300000000000040233333333333334023666666666666402399999999999A4023CCCCCCCCCCCD402400000000000040243333333333334024666666666666402499999999999A4024CCCCCCCCCCCD4025000000000000"},"result":{"expect":"0x0203017803017905017A073FEFD712F9A817C13FEF5CB49577627A3FEE921DD42F09BA3FED7954E7DBA2F83FEC1528065B7D503FEA69263C485B153FE87996529F9D933FE64B6BDE7198653FE3E43A9692E21C3FE14A280FB5068C3FDD07B806C761113FD730DE943B79D43FD11EB3682A4C5F3FC5C17BBC13570B3FB21BD54FC5F9A7BF9DE67AC55F1633BFC07DF9F4A26C86BFCD14F54F250E7ABFD4B0C6B93445ABBFDAA22657537205BFE027B304989ECABFE2D5004B88AD70BFE5522217302FE1BFE798BAB490D185BFE9A2F7EF858B7DBFEB6BA1F680F470BFECEE28B36603A6BFEE26AF7757704ABFEF1216DBA340C9BFEFAE04BE85E5D2BFEFF8EA4756A624BFEFF207E2B9CBB6BFEF996F2CA70BB6BFEEF002C35EBE04BFEDF77403C11A5FBFECB23EB4D22C59BFEB23A2AD7DD937BFE94F9B84DBA8EBBFE73AD66234C8EABFE4EAA606DB24C1BFE264F5306A2D6ABFDF606EEC8AC71DBFD9A6B192163B53BFD3AB577C62C2AABFCAFB5B54583D6ABFBCB6072B598DCABF895F3A43506A343FB66655584E40403FC7DFA3277C16643FD22785706B4AD93FD830C98EE45C9C3FDDFC2D59376AEE3FE1BD6F3F7432D53FE44F676F25B08C3FE6AD6C3C07D4483FE8D16F88830A7F3FEAB5F7960DFE2A3FEC562D06A772233FEDADE73EF950293FEEB9B7097822F53FEF76EF5F4998B23FEFE3AC4079A9CE3FEFFED789FC7A413FEFC82BBD1E4CA13FEF4034B145C3C83FEE684E2E41C42D3FED42A072B5E51B3FEBD21AAF88DCFB3FEA1A6B8672124B3FE81FF79ED920173FE5E7CE691EA5463FE3779D2D0CA0EA3FE0D5A0848A01CB3FDC1128CF6B887D3FD62F45E66F5C2F3FD014A429AC16E13FC3A1C134C1C59E3FABA00B7D845AFABFA78D9732562AABBFC29FBEBF632F94BFCF2C746FB6AF1DBFD5B4B6970D1EA6BFDB9BADA059A170BFE09E033D53AE3FBFE343AE773AB08EBFE5B8131ACC20FBBFE7F4E9CF633AD1BFE9F479562D158DBFEBB1A52E0FEB79BFED27FAA6A6196BBFEE53BC40DBB50ABFEF31EB4014A490BFEFC04F53629ED4BFEFFD7C43328F13BFEFE8D594EB0C48BFEF82901B2CEEB6BFEECBB16EB638EABFEDC60D5140EE7DBFEC7441010D641ABFEAD9AC890C6B1FBFE8FA6A1EC3FF04BFE6DB43A4039D37BFE481A6673F777BBFE1F39541E710BCBFDE6F3270721E39"}}
+{"expression":"map(a,f(a)(cos(a)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FEFD712F9A817C101623FEF5CB49577627A01633FEE921DD42F09BA"}}
+{"expression":"map(a,f(a)(cos(a)))","inputs":{"a":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179060161036261723FEF5CB49577627A016103666F6F3FEFD712F9A817C10162036261723FED7954E7DBA2F8016203666F6F3FEE921DD42F09BA0163036261723FEA69263C485B15016303666F6F3FEC1528065B7D50"}}
+{"expression":"map(a,f(a)(cos(a)))","inputs":{"a":"0x010301780179017A1801610362617201693FE0000000000000016103626172016A3FE3333333333333016103626172016B3FE6666666666666016103626172016C3FE999999999999A016103666F6F01693FB999999999999A016103666F6F016A3FC999999999999A016103666F6F016B3FD3333333333333016103666F6F016C3FD999999999999A01620362617201693FF4CCCCCCCCCCCD016203626172016A3FF6666666666666016203626172016B3FF8000000000000016203626172016C3FF999999999999A016203666F6F01693FECCCCCCCCCCCCD016203666F6F016A3FF0000000000000016203666F6F016B3FF199999999999A016203666F6F016C3FF333333333333301630362617201694000CCCCCCCCCCCD016303626172016A400199999999999A016303626172016B4002666666666666016303626172016C4003333333333333016303666F6F01693FFB333333333333016303666F6F016A3FFCCCCCCCCCCCCD016303666F6F016B3FFE666666666666016303666F6F016C4000000000000000"},"result":{"expect":"0x010301780179017A1801610362617201693FEC1528065B7D50016103626172016A3FEA69263C485B15016103626172016B3FE87996529F9D93016103626172016C3FE64B6BDE719865016103666F6F01693FEFD712F9A817C1016103666F6F016A3FEF5CB49577627A016103666F6F016B3FEE921DD42F09BA016103666F6F016C3FED7954E7DBA2F801620362617201693FD11EB3682A4C5F016203626172016A3FC5C17BBC13570B016203626172016B3FB21BD54FC5F9A7016203626172016CBF9DE67AC55F1633016203666F6F01693FE3E43A9692E21C016203666F6F016A3FE14A280FB5068C016203666F6F016B3FDD07B806C76111016203666F6F016C3FD730DE943B79D40163036261720169BFE027B304989ECA016303626172016ABFE2D5004B88AD70016303626172016BBFE5522217302FE1016303626172016CBFE798BAB490D185016303666F6F0169BFC07DF9F4A26C86016303666F6F016ABFCD14F54F250E7A016303666F6F016BBFD4B0C6B93445AB016303666F6F016CBFDAA22657537205"}}
+{"expression":"map(a,f(a)(cos(a)))","inputs":{"a":"0x0301017902017803017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF6666666666666400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD03666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0301017902017803017A0702036261723FE64B6BDE7198653FE3E43A9692E21C3FE14A280FB5068C3FDD07B806C761113FD730DE943B79D43FD11EB3682A4C5F3FC5C17BBC13570BBFE2D5004B88AD70BFE5522217302FE1BFE798BAB490D185BFE9A2F7EF858B7DBFEB6BA1F680F470BFECEE28B36603A6BFEE26AF7757704ABFECB23EB4D22C59BFEB23A2AD7DD937BFE94F9B84DBA8EBBFE73AD66234C8EABFE4EAA606DB24C1BFE264F5306A2D6ABFDF606EEC8AC71D03666F6F3FEFD712F9A817C13FEF5CB49577627A3FEE921DD42F09BA3FED7954E7DBA2F83FEC1528065B7D503FEA69263C485B153FE87996529F9D933FB21BD54FC5F9A7BF9DE67AC55F1633BFC07DF9F4A26C86BFCD14F54F250E7ABFD4B0C6B93445ABBFDAA22657537205BFE027B304989ECABFEF1216DBA340C9BFEFAE04BE85E5D2BFEFF8EA4756A624BFEFF207E2B9CBB6BFEF996F2CA70BB6BFEEF002C35EBE04BFEDF77403C11A5F"}}
+{"expression":"map(a,f(a)(cos(a)))","inputs":{"a":"0x03020178017A010179050C016101693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB3333333333330161016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD0161016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE6666666666660161016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000016201694000CCCCCCCCCCCD40040000000000004007333333333333400A666666666666400D99999999999A0162016A400199999999999A4004CCCCCCCCCCCD4008000000000000400B333333333333400E6666666666660162016B4002666666666666400599999999999A4008CCCCCCCCCCCD400C000000000000400F3333333333330162016C40033333333333334006666666666666400999999999999A400CCCCCCCCCCCCD40100000000000000163016940106666666666664012000000000000401399999999999A40153333333333334016CCCCCCCCCCCD0163016A4010CCCCCCCCCCCD40126666666666664014000000000000401599999999999A40173333333333330163016B40113333333333334012CCCCCCCCCCCD40146666666666664016000000000000401799999999999A0163016C401199999999999A40133333333333334014CCCCCCCCCCCD40166666666666664018000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FEFD712F9A817C13FEC1528065B7D503FE3E43A9692E21C3FD11EB3682A4C5FBFC07DF9F4A26C860161016A3FEF5CB49577627A3FEA69263C485B153FE14A280FB5068C3FC5C17BBC13570BBFCD14F54F250E7A0161016B3FEE921DD42F09BA3FE87996529F9D933FDD07B806C761113FB21BD54FC5F9A7BFD4B0C6B93445AB0161016C3FED7954E7DBA2F83FE64B6BDE7198653FD730DE943B79D4BF9DE67AC55F1633BFDAA2265753720501620169BFE027B304989ECABFE9A2F7EF858B7DBFEF1216DBA340C9BFEF996F2CA70BB6BFEB23A2AD7DD9370162016ABFE2D5004B88AD70BFEB6BA1F680F470BFEFAE04BE85E5D2BFEEF002C35EBE04BFE94F9B84DBA8EB0162016BBFE5522217302FE1BFECEE28B36603A6BFEFF8EA4756A624BFEDF77403C11A5FBFE73AD66234C8EA0162016CBFE798BAB490D185BFEE26AF7757704ABFEFF207E2B9CBB6BFECB23EB4D22C59BFE4EAA606DB24C101630169BFE264F5306A2D6ABFCAFB5B54583D6A3FC7DFA3277C16643FE1BD6F3F7432D53FEAB5F7960DFE2A0163016ABFDF606EEC8AC71DBFBCB6072B598DCA3FD22785706B4AD93FE44F676F25B08C3FEC562D06A772230163016BBFD9A6B192163B53BF895F3A43506A343FD830C98EE45C9C3FE6AD6C3C07D4483FEDADE73EF950290163016CBFD3AB577C62C2AA3FB66655584E40403FDDFC2D59376AEE3FE8D16F88830A7F3FEEB9B7097822F5"}}
+{"expression":"sin(a)","inputs":{"a":"0x02003FB999999999999A"},"result":{"expect":"0x02003FB98EAECB8BCB2C"}}
+{"expression":"sin(a)","inputs":{"a":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FB98EAECB8BCB2C3FC96DFF233DD2BC3FD2E9CD95BABA33"}}
+{"expression":"sin(a)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178030179053FB98EAECB8BCB2C3FC96DFF233DD2BC3FD2E9CD95BABA333FD8EC3AE92B676B3FDEAEE8744B05F03FE2118D17A541593FE49D6E694619B83FE6F494C2BFFECD3FE91103985DA8413FEAED548F090CEE3FEC84C54C2D63383FEDD343A21A55C43FEED577F9C51E4B3FEF88CDDF44E1023FEFEB7A9B2C6D8B"}}
+{"expression":"sin(a)","inputs":{"a":"0x0203017803017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD4011333333333333401199999999999A401200000000000040126666666666664012CCCCCCCCCCCD4013333333333333401399999999999A401400000000000040146666666666664014CCCCCCCCCCCD4015333333333333401599999999999A401600000000000040166666666666664016CCCCCCCCCCCD4017333333333333401799999999999A401800000000000040186666666666664018CCCCCCCCCCCD4019333333333333401999999999999A401A000000000000401A666666666666401ACCCCCCCCCCCD401B333333333333401B99999999999A401C000000000000401C666666666666401CCCCCCCCCCCCD401D333333333333401D99999999999A401E000000000000401E666666666666401ECCCCCCCCCCCD401F333333333333401F99999999999A402000000000000040203333333333334020666666666666402099999999999A4020CCCCCCCCCCCD402100000000000040213333333333334021666666666666402199999999999A4021CCCCCCCCCCCD402200000000000040223333333333334022666666666666402299999999999A4022CCCCCCCCCCCD402300000000000040233333333333334023666666666666402399999999999A4023CCCCCCCCCCCD402400000000000040243333333333334024666666666666402499999999999A4024CCCCCCCCCCCD4025000000000000"},"result":{"expect":"0x0203017803017905017A073FB98EAECB8BCB2C3FC96DFF233DD2BC3FD2E9CD95BABA333FD8EC3AE92B676B3FDEAEE8744B05F03FE2118D17A541593FE49D6E694619B83FE6F494C2BFFECD3FE91103985DA8413FEAED548F090CEE3FEC84C54C2D63383FEDD343A21A55C43FEED577F9C51E4B3FEF88CDDF44E1023FEFEB7A9B2C6D8B3FEFFC81C7E042C53FEFBBB7D72F98B63FEF29C281BD15F03FEE48171F1A38573FED18F6EAD1B4463FEB9F693FEB72FB3FE9DF33D9AAD7083FE7DCD12D582F243FE59D64F5C3D19B3FE326AF0DCFCAB13FE07EFCBBA085BB3FDB5A312424A70C3FD57072235DE5C83FCE9FB8D64830E33FC210386DB6D55B3FA54A0F8298102EBFADE33739E82D32BFC43102CAB70C87BFD05AC910FF4C6CBFD6733B7EBA621FBFDC524143F0D1F1BFE0F46AEC2E1B41BFE39456FFECC09DBFE6022E2D1FB3CBBFE837B9DDDC1EAEBFEA2F537AE2C8B8BFEBE3F2DFD012D8BFED513B3A018A25BFEE7386314528EFBFEF47ED3DC74080BFEFCC51135DECB9BFEFFF5F0F37EC52BFEFE0949A0C3E00BFEF70407622EBA4BFEEAF81F5E09933BFEDA0461CD822BCBFEC4542B2BA24D7BFEAA1EF54BC123BBFE8BA7C97320570BFE693C94E0AB057BFE433561796F5BBBFE19F37497AC7A0BFDDBC0AC78EDFD8BFD7ED98640BBD1BBFD1E1F18AB0A2C0BFC75119D733FB7BBFB54558DBBECD1D3F9137A9C2CB3E7E3FBDD62B2F352A2C3FCB890D40C6CB3C3FD3F04B2FE909833FD9E90FA43588FC3FDF9F8D9AEA10FB3FE282941BD81ABF3FE50608C26D0A083FE753B6E16463863FE965BA25E3C90F3FEB36C6DC1D74453FECC2377B0529F63FEE041886FCAE303FEEF932AD10F80D3FEF9F12FCEE54583FEFF4112C80B72F3FEFF753D53A5FA93FEFA8D2A028CF7B3FEF09565B49B4673FEE1A76F7E933333FECDE97772B614F3FEB58DFCF2DF7993FE98D34D85FD9FC3FE7802E57B4B12D3FE5370B3F2EA2033FE2B7A442CAD2DD3FE0085CE42337803FDA6026360C2F913FD46C1B899FD9173FCC87A81DD59BA93FBFDC3EBECE2C503F995EBAA84441E2BFB33D1A94A4277ABFC650570815B6E9BFD16486AEB1A154BFD77464E0B36E02BFDD4844A120B670BFE1689EF5F34F52BFE400942955E6D4BFE6655F99D0663FBFE890E1D4D1362FBFEA7D8DEF6F8D9FBFEC2677B8F04315"}}
+{"expression":"sin(a)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FB98EAECB8BCB2C01623FC96DFF233DD2BC01633FD2E9CD95BABA33"}}
+{"expression":"sin(a)","inputs":{"a":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179060161036261723FC96DFF233DD2BC016103666F6F3FB98EAECB8BCB2C0162036261723FD8EC3AE92B676B016203666F6F3FD2E9CD95BABA330163036261723FE2118D17A54159016303666F6F3FDEAEE8744B05F0"}}
+{"expression":"sin(a)","inputs":{"a":"0x010301780179017A1801610362617201693FE0000000000000016103626172016A3FE3333333333333016103626172016B3FE6666666666666016103626172016C3FE999999999999A016103666F6F01693FB999999999999A016103666F6F016A3FC999999999999A016103666F6F016B3FD3333333333333016103666F6F016C3FD999999999999A01620362617201693FF4CCCCCCCCCCCD016203626172016A3FF6666666666666016203626172016B3FF8000000000000016203626172016C3FF999999999999A016203666F6F01693FECCCCCCCCCCCCD016203666F6F016A3FF0000000000000016203666F6F016B3FF199999999999A016203666F6F016C3FF333333333333301630362617201694000CCCCCCCCCCCD016303626172016A400199999999999A016303626172016B4002666666666666016303626172016C4003333333333333016303666F6F01693FFB333333333333016303666F6F016A3FFCCCCCCCCCCCCD016303666F6F016B3FFE666666666666016303666F6F016C4000000000000000"},"result":{"expect":"0x010301780179017A1801610362617201693FDEAEE8744B05F0016103626172016A3FE2118D17A54159016103626172016B3FE49D6E694619B8016103626172016C3FE6F494C2BFFECD016103666F6F01693FB98EAECB8BCB2C016103666F6F016A3FC96DFF233DD2BC016103666F6F016B3FD2E9CD95BABA33016103666F6F016C3FD8EC3AE92B676B01620362617201693FEED577F9C51E4B016203626172016A3FEF88CDDF44E102016203626172016B3FEFEB7A9B2C6D8B016203626172016C3FEFFC81C7E042C5016203666F6F01693FE91103985DA841016203666F6F016A3FEAED548F090CEE016203666F6F016B3FEC84C54C2D6338016203666F6F016C3FEDD343A21A55C401630362617201693FEB9F693FEB72FB016303626172016A3FE9DF33D9AAD708016303626172016B3FE7DCD12D582F24016303626172016C3FE59D64F5C3D19B016303666F6F01693FEFBBB7D72F98B6016303666F6F016A3FEF29C281BD15F0016303666F6F016B3FEE48171F1A3857016303666F6F016C3FED18F6EAD1B446"}}
+{"expression":"sin(a)","inputs":{"a":"0x0301017902017803017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF6666666666666400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD03666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0301017902017803017A0702036261723FE6F494C2BFFECD3FE91103985DA8413FEAED548F090CEE3FEC84C54C2D63383FEDD343A21A55C43FEED577F9C51E4B3FEF88CDDF44E1023FE9DF33D9AAD7083FE7DCD12D582F243FE59D64F5C3D19B3FE326AF0DCFCAB13FE07EFCBBA085BB3FDB5A312424A70C3FD57072235DE5C8BFDC524143F0D1F1BFE0F46AEC2E1B41BFE39456FFECC09DBFE6022E2D1FB3CBBFE837B9DDDC1EAEBFEA2F537AE2C8B8BFEBE3F2DFD012D803666F6F3FB98EAECB8BCB2C3FC96DFF233DD2BC3FD2E9CD95BABA333FD8EC3AE92B676B3FDEAEE8744B05F03FE2118D17A541593FE49D6E694619B83FEFEB7A9B2C6D8B3FEFFC81C7E042C53FEFBBB7D72F98B63FEF29C281BD15F03FEE48171F1A38573FED18F6EAD1B4463FEB9F693FEB72FB3FCE9FB8D64830E33FC210386DB6D55B3FA54A0F8298102EBFADE33739E82D32BFC43102CAB70C87BFD05AC910FF4C6CBFD6733B7EBA621F"}}
+{"expression":"sin(a)","inputs":{"a":"0x03020178017A010179050C016101693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB3333333333330161016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD0161016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE6666666666660161016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000016201694000CCCCCCCCCCCD40040000000000004007333333333333400A666666666666400D99999999999A0162016A400199999999999A4004CCCCCCCCCCCD4008000000000000400B333333333333400E6666666666660162016B4002666666666666400599999999999A4008CCCCCCCCCCCD400C000000000000400F3333333333330162016C40033333333333334006666666666666400999999999999A400CCCCCCCCCCCCD40100000000000000163016940106666666666664012000000000000401399999999999A40153333333333334016CCCCCCCCCCCD0163016A4010CCCCCCCCCCCD40126666666666664014000000000000401599999999999A40173333333333330163016B40113333333333334012CCCCCCCCCCCD40146666666666664016000000000000401799999999999A0163016C401199999999999A40133333333333334014CCCCCCCCCCCD40166666666666664018000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FB98EAECB8BCB2C3FDEAEE8744B05F03FE91103985DA8413FEED577F9C51E4B3FEFBBB7D72F98B60161016A3FC96DFF233DD2BC3FE2118D17A541593FEAED548F090CEE3FEF88CDDF44E1023FEF29C281BD15F00161016B3FD2E9CD95BABA333FE49D6E694619B83FEC84C54C2D63383FEFEB7A9B2C6D8B3FEE48171F1A38570161016C3FD8EC3AE92B676B3FE6F494C2BFFECD3FEDD343A21A55C43FEFFC81C7E042C53FED18F6EAD1B446016201693FEB9F693FEB72FB3FE326AF0DCFCAB13FCE9FB8D64830E3BFC43102CAB70C87BFE0F46AEC2E1B410162016A3FE9DF33D9AAD7083FE07EFCBBA085BB3FC210386DB6D55BBFD05AC910FF4C6CBFE39456FFECC09D0162016B3FE7DCD12D582F243FDB5A312424A70C3FA54A0F8298102EBFD6733B7EBA621FBFE6022E2D1FB3CB0162016C3FE59D64F5C3D19B3FD57072235DE5C8BFADE33739E82D32BFDC524143F0D1F1BFE837B9DDDC1EAE01630169BFEA2F537AE2C8B8BFEF47ED3DC74080BFEF70407622EBA4BFEAA1EF54BC123BBFE19F37497AC7A00163016ABFEBE3F2DFD012D8BFEFCC51135DECB9BFEEAF81F5E09933BFE8BA7C97320570BFDDBC0AC78EDFD80163016BBFED513B3A018A25BFEFFF5F0F37EC52BFEDA0461CD822BCBFE693C94E0AB057BFD7ED98640BBD1B0163016CBFEE7386314528EFBFEFE0949A0C3E00BFEC4542B2BA24D7BFE433561796F5BBBFD1E1F18AB0A2C0"}}
+{"expression":"map(a,f(a)(sin(a)))","inputs":{"a":"0x02003FB999999999999A"},"result":{"expect":"0x02003FB98EAECB8BCB2C"}}
+{"expression":"map(a,f(a)(sin(a)))","inputs":{"a":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FB98EAECB8BCB2C3FC96DFF233DD2BC3FD2E9CD95BABA33"}}
+{"expression":"map(a,f(a)(sin(a)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178030179053FB98EAECB8BCB2C3FC96DFF233DD2BC3FD2E9CD95BABA333FD8EC3AE92B676B3FDEAEE8744B05F03FE2118D17A541593FE49D6E694619B83FE6F494C2BFFECD3FE91103985DA8413FEAED548F090CEE3FEC84C54C2D63383FEDD343A21A55C43FEED577F9C51E4B3FEF88CDDF44E1023FEFEB7A9B2C6D8B"}}
+{"expression":"map(a,f(a)(sin(a)))","inputs":{"a":"0x0203017803017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD4011333333333333401199999999999A401200000000000040126666666666664012CCCCCCCCCCCD4013333333333333401399999999999A401400000000000040146666666666664014CCCCCCCCCCCD4015333333333333401599999999999A401600000000000040166666666666664016CCCCCCCCCCCD4017333333333333401799999999999A401800000000000040186666666666664018CCCCCCCCCCCD4019333333333333401999999999999A401A000000000000401A666666666666401ACCCCCCCCCCCD401B333333333333401B99999999999A401C000000000000401C666666666666401CCCCCCCCCCCCD401D333333333333401D99999999999A401E000000000000401E666666666666401ECCCCCCCCCCCD401F333333333333401F99999999999A402000000000000040203333333333334020666666666666402099999999999A4020CCCCCCCCCCCD402100000000000040213333333333334021666666666666402199999999999A4021CCCCCCCCCCCD402200000000000040223333333333334022666666666666402299999999999A4022CCCCCCCCCCCD402300000000000040233333333333334023666666666666402399999999999A4023CCCCCCCCCCCD402400000000000040243333333333334024666666666666402499999999999A4024CCCCCCCCCCCD4025000000000000"},"result":{"expect":"0x0203017803017905017A073FB98EAECB8BCB2C3FC96DFF233DD2BC3FD2E9CD95BABA333FD8EC3AE92B676B3FDEAEE8744B05F03FE2118D17A541593FE49D6E694619B83FE6F494C2BFFECD3FE91103985DA8413FEAED548F090CEE3FEC84C54C2D63383FEDD343A21A55C43FEED577F9C51E4B3FEF88CDDF44E1023FEFEB7A9B2C6D8B3FEFFC81C7E042C53FEFBBB7D72F98B63FEF29C281BD15F03FEE48171F1A38573FED18F6EAD1B4463FEB9F693FEB72FB3FE9DF33D9AAD7083FE7DCD12D582F243FE59D64F5C3D19B3FE326AF0DCFCAB13FE07EFCBBA085BB3FDB5A312424A70C3FD57072235DE5C83FCE9FB8D64830E33FC210386DB6D55B3FA54A0F8298102EBFADE33739E82D32BFC43102CAB70C87BFD05AC910FF4C6CBFD6733B7EBA621FBFDC524143F0D1F1BFE0F46AEC2E1B41BFE39456FFECC09DBFE6022E2D1FB3CBBFE837B9DDDC1EAEBFEA2F537AE2C8B8BFEBE3F2DFD012D8BFED513B3A018A25BFEE7386314528EFBFEF47ED3DC74080BFEFCC51135DECB9BFEFFF5F0F37EC52BFEFE0949A0C3E00BFEF70407622EBA4BFEEAF81F5E09933BFEDA0461CD822BCBFEC4542B2BA24D7BFEAA1EF54BC123BBFE8BA7C97320570BFE693C94E0AB057BFE433561796F5BBBFE19F37497AC7A0BFDDBC0AC78EDFD8BFD7ED98640BBD1BBFD1E1F18AB0A2C0BFC75119D733FB7BBFB54558DBBECD1D3F9137A9C2CB3E7E3FBDD62B2F352A2C3FCB890D40C6CB3C3FD3F04B2FE909833FD9E90FA43588FC3FDF9F8D9AEA10FB3FE282941BD81ABF3FE50608C26D0A083FE753B6E16463863FE965BA25E3C90F3FEB36C6DC1D74453FECC2377B0529F63FEE041886FCAE303FEEF932AD10F80D3FEF9F12FCEE54583FEFF4112C80B72F3FEFF753D53A5FA93FEFA8D2A028CF7B3FEF09565B49B4673FEE1A76F7E933333FECDE97772B614F3FEB58DFCF2DF7993FE98D34D85FD9FC3FE7802E57B4B12D3FE5370B3F2EA2033FE2B7A442CAD2DD3FE0085CE42337803FDA6026360C2F913FD46C1B899FD9173FCC87A81DD59BA93FBFDC3EBECE2C503F995EBAA84441E2BFB33D1A94A4277ABFC650570815B6E9BFD16486AEB1A154BFD77464E0B36E02BFDD4844A120B670BFE1689EF5F34F52BFE400942955E6D4BFE6655F99D0663FBFE890E1D4D1362FBFEA7D8DEF6F8D9FBFEC2677B8F04315"}}
+{"expression":"map(a,f(a)(sin(a)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FB98EAECB8BCB2C01623FC96DFF233DD2BC01633FD2E9CD95BABA33"}}
+{"expression":"map(a,f(a)(sin(a)))","inputs":{"a":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179060161036261723FC96DFF233DD2BC016103666F6F3FB98EAECB8BCB2C0162036261723FD8EC3AE92B676B016203666F6F3FD2E9CD95BABA330163036261723FE2118D17A54159016303666F6F3FDEAEE8744B05F0"}}
+{"expression":"map(a,f(a)(sin(a)))","inputs":{"a":"0x010301780179017A1801610362617201693FE0000000000000016103626172016A3FE3333333333333016103626172016B3FE6666666666666016103626172016C3FE999999999999A016103666F6F01693FB999999999999A016103666F6F016A3FC999999999999A016103666F6F016B3FD3333333333333016103666F6F016C3FD999999999999A01620362617201693FF4CCCCCCCCCCCD016203626172016A3FF6666666666666016203626172016B3FF8000000000000016203626172016C3FF999999999999A016203666F6F01693FECCCCCCCCCCCCD016203666F6F016A3FF0000000000000016203666F6F016B3FF199999999999A016203666F6F016C3FF333333333333301630362617201694000CCCCCCCCCCCD016303626172016A400199999999999A016303626172016B4002666666666666016303626172016C4003333333333333016303666F6F01693FFB333333333333016303666F6F016A3FFCCCCCCCCCCCCD016303666F6F016B3FFE666666666666016303666F6F016C4000000000000000"},"result":{"expect":"0x010301780179017A1801610362617201693FDEAEE8744B05F0016103626172016A3FE2118D17A54159016103626172016B3FE49D6E694619B8016103626172016C3FE6F494C2BFFECD016103666F6F01693FB98EAECB8BCB2C016103666F6F016A3FC96DFF233DD2BC016103666F6F016B3FD2E9CD95BABA33016103666F6F016C3FD8EC3AE92B676B01620362617201693FEED577F9C51E4B016203626172016A3FEF88CDDF44E102016203626172016B3FEFEB7A9B2C6D8B016203626172016C3FEFFC81C7E042C5016203666F6F01693FE91103985DA841016203666F6F016A3FEAED548F090CEE016203666F6F016B3FEC84C54C2D6338016203666F6F016C3FEDD343A21A55C401630362617201693FEB9F693FEB72FB016303626172016A3FE9DF33D9AAD708016303626172016B3FE7DCD12D582F24016303626172016C3FE59D64F5C3D19B016303666F6F01693FEFBBB7D72F98B6016303666F6F016A3FEF29C281BD15F0016303666F6F016B3FEE48171F1A3857016303666F6F016C3FED18F6EAD1B446"}}
+{"expression":"map(a,f(a)(sin(a)))","inputs":{"a":"0x0301017902017803017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF6666666666666400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD03666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0301017902017803017A0702036261723FE6F494C2BFFECD3FE91103985DA8413FEAED548F090CEE3FEC84C54C2D63383FEDD343A21A55C43FEED577F9C51E4B3FEF88CDDF44E1023FE9DF33D9AAD7083FE7DCD12D582F243FE59D64F5C3D19B3FE326AF0DCFCAB13FE07EFCBBA085BB3FDB5A312424A70C3FD57072235DE5C8BFDC524143F0D1F1BFE0F46AEC2E1B41BFE39456FFECC09DBFE6022E2D1FB3CBBFE837B9DDDC1EAEBFEA2F537AE2C8B8BFEBE3F2DFD012D803666F6F3FB98EAECB8BCB2C3FC96DFF233DD2BC3FD2E9CD95BABA333FD8EC3AE92B676B3FDEAEE8744B05F03FE2118D17A541593FE49D6E694619B83FEFEB7A9B2C6D8B3FEFFC81C7E042C53FEFBBB7D72F98B63FEF29C281BD15F03FEE48171F1A38573FED18F6EAD1B4463FEB9F693FEB72FB3FCE9FB8D64830E33FC210386DB6D55B3FA54A0F8298102EBFADE33739E82D32BFC43102CAB70C87BFD05AC910FF4C6CBFD6733B7EBA621F"}}
+{"expression":"map(a,f(a)(sin(a)))","inputs":{"a":"0x03020178017A010179050C016101693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB3333333333330161016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD0161016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE6666666666660161016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000016201694000CCCCCCCCCCCD40040000000000004007333333333333400A666666666666400D99999999999A0162016A400199999999999A4004CCCCCCCCCCCD4008000000000000400B333333333333400E6666666666660162016B4002666666666666400599999999999A4008CCCCCCCCCCCD400C000000000000400F3333333333330162016C40033333333333334006666666666666400999999999999A400CCCCCCCCCCCCD40100000000000000163016940106666666666664012000000000000401399999999999A40153333333333334016CCCCCCCCCCCD0163016A4010CCCCCCCCCCCD40126666666666664014000000000000401599999999999A40173333333333330163016B40113333333333334012CCCCCCCCCCCD40146666666666664016000000000000401799999999999A0163016C401199999999999A40133333333333334014CCCCCCCCCCCD40166666666666664018000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FB98EAECB8BCB2C3FDEAEE8744B05F03FE91103985DA8413FEED577F9C51E4B3FEFBBB7D72F98B60161016A3FC96DFF233DD2BC3FE2118D17A541593FEAED548F090CEE3FEF88CDDF44E1023FEF29C281BD15F00161016B3FD2E9CD95BABA333FE49D6E694619B83FEC84C54C2D63383FEFEB7A9B2C6D8B3FEE48171F1A38570161016C3FD8EC3AE92B676B3FE6F494C2BFFECD3FEDD343A21A55C43FEFFC81C7E042C53FED18F6EAD1B446016201693FEB9F693FEB72FB3FE326AF0DCFCAB13FCE9FB8D64830E3BFC43102CAB70C87BFE0F46AEC2E1B410162016A3FE9DF33D9AAD7083FE07EFCBBA085BB3FC210386DB6D55BBFD05AC910FF4C6CBFE39456FFECC09D0162016B3FE7DCD12D582F243FDB5A312424A70C3FA54A0F8298102EBFD6733B7EBA621FBFE6022E2D1FB3CB0162016C3FE59D64F5C3D19B3FD57072235DE5C8BFADE33739E82D32BFDC524143F0D1F1BFE837B9DDDC1EAE01630169BFEA2F537AE2C8B8BFEF47ED3DC74080BFEF70407622EBA4BFEAA1EF54BC123BBFE19F37497AC7A00163016ABFEBE3F2DFD012D8BFEFCC51135DECB9BFEEAF81F5E09933BFE8BA7C97320570BFDDBC0AC78EDFD80163016BBFED513B3A018A25BFEFFF5F0F37EC52BFEDA0461CD822BCBFE693C94E0AB057BFD7ED98640BBD1B0163016CBFEE7386314528EFBFEFE0949A0C3E00BFEC4542B2BA24D7BFE433561796F5BBBFD1E1F18AB0A2C0"}}
+{"expression":"tan(a)","inputs":{"a":"0x02003FB999999999999A"},"result":{"expect":"0x02003FB9AF8877430B80"}}
+{"expression":"tan(a)","inputs":{"a":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FB9AF8877430B803FC9F267068A55EC3FD3CC2A44E29998"}}
+{"expression":"tan(a)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178030179053FB9AF8877430B803FC9F267068A55EC3FD3CC2A44E299983FDB0F0B49DCDCD83FE17B4F5BF3474A3FE5E472E03A280C3FEAF406C2FC78AE3FF079664793B60B3FF4299BA9C2A1383FF8EB245CBEE3A63FFF6FA7D286214E400493C43ACB164D400CD11B1696E97E401731086DC00A35402C33ED50B88777"}}
+{"expression":"tan(a)","inputs":{"a":"0x0203017803017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD4011333333333333401199999999999A401200000000000040126666666666664012CCCCCCCCCCCD4013333333333333401399999999999A401400000000000040146666666666664014CCCCCCCCCCCD4015333333333333401599999999999A401600000000000040166666666666664016CCCCCCCCCCCD4017333333333333401799999999999A401800000000000040186666666666664018CCCCCCCCCCCD4019333333333333401999999999999A401A000000000000401A666666666666401ACCCCCCCCCCCD401B333333333333401B99999999999A401C000000000000401C666666666666401CCCCCCCCCCCCD401D333333333333401D99999999999A401E000000000000401E666666666666401ECCCCCCCCCCCD401F333333333333401F99999999999A402000000000000040203333333333334020666666666666402099999999999A4020CCCCCCCCCCCD402100000000000040213333333333334021666666666666402199999999999A4021CCCCCCCCCCCD402200000000000040223333333333334022666666666666402299999999999A4022CCCCCCCCCCCD402300000000000040233333333333334023666666666666402399999999999A4023CCCCCCCCCCCD402400000000000040243333333333334024666666666666402499999999999A4024CCCCCCCCCCCD4025000000000000"},"result":{"expect":"0x0203017803017905017A073FB9AF8877430B803FC9F267068A55EC3FD3CC2A44E299983FDB0F0B49DCDCD83FE17B4F5BF3474A3FE5E472E03A280C3FEAF406C2FC78AE3FF079664793B60B3FF4299BA9C2A1383FF8EB245CBEE3A63FFF6FA7D286214E400493C43ACB164D400CD11B1696E97E401731086DC00A35402C33ED50B88777C0411DC3A1F73BEAC01EC952123D33F2C0112521C7CA80BDC0076AB21A0DF38BC0017AF62E0950F8BFFB5B880C6F419EBFF5FB2DE2B500EBBFF1E84C9047C337BFED4FFD331A1C6CBFE7E79B4E00BB15BFE340478A535B2BBFDE412B62BA7143BFD6C10031EC6D8FBFCF8A364255739FBFC23EF71254B86FBFA54EC734D416903FADF048F92660603FC4728C74EFFCF33FD0EA916F405CD13FD7F9360C8212A73FDF94F57ABCC0183FE3FDD037DA35543FE8C0F8B3CAA42E3FEE514D7FDCC3DA3FF2866F9BE4DE133FF6C6C3B4A4F47E3FFC71C9347017784002496A9CA760A94008C54566FDBDEC40128CA0C62BF5954021B868D80B4C1140542D9DE890C6A9C026C50DC43253B3C01511E9B3C687CBC00B0B4B739BBB07C00398597A58D5D2BFFE2B96D13EA593BFF80537409587B1BFF37B0C1674A47BBFEFDBD31615B07ABFEA0BD2C907E03EBFE51C83499B4CC8BFE0CA10D11279EFBFD9CC91A8E776FCBFD29FD86EBB95BEBFC7B6AC3AFF3643BFB5583DEE907AF93F9138494AF2A7463FBE0A94A390BBE93FCC320B15C520E83FD4FBA0262423563FDC5623343B6BE13FE22FD752AF75CB3FE6B109DE2CBE283FEBE2E6E13EEA793FF109CD601B305A3FF4DFBA34F373AF3FF9DD6F83006FB1400064EF1934ECE04005A5EA99227D5B400ED170AD3162CE4019C5805C97CBEA403281BF104956AFC035B7119FEAF168C01B32E78F49A1E4C00FDBF39CABB7C1C00630A37877CC77C000BB24225BAC36BFFA54D4C53D3438BFF538C9CD26B92ABFF150013B15FD40BFEC567B80303594BFE713A29CC6B6A4BFE2868AC2A1D792BFDCF2BD61315C1CBFD58C805D64CFB4BFCD4421B0D2E0C3BFC00E13BA44EE32BF9960B92D8859EA3FB34B121CC03DD03FC6A92B1538D9403FD212A6916D90193FD93561369E93C63FE07737A93F0A8E3FE4BF5F34BE37823FE9A010E3634DCB3FEF5AF2C1E7E6863FF32ADA63074E7F3FF79C55F5777A7A3FFD9930BC49E27B"}}
+{"expression":"tan(a)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FB9AF8877430B8001623FC9F267068A55EC01633FD3CC2A44E29998"}}
+{"expression":"tan(a)","inputs":{"a":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179060161036261723FC9F267068A55EC016103666F6F3FB9AF8877430B800162036261723FDB0F0B49DCDCD8016203666F6F3FD3CC2A44E299980163036261723FE5E472E03A280C016303666F6F3FE17B4F5BF3474A"}}
+{"expression":"tan(a)","inputs":{"a":"0x010301780179017A1801610362617201693FE0000000000000016103626172016A3FE3333333333333016103626172016B3FE6666666666666016103626172016C3FE999999999999A016103666F6F01693FB999999999999A016103666F6F016A3FC999999999999A016103666F6F016B3FD3333333333333016103666F6F016C3FD999999999999A01620362617201693FF4CCCCCCCCCCCD016203626172016A3FF6666666666666016203626172016B3FF8000000000000016203626172016C3FF999999999999A016203666F6F01693FECCCCCCCCCCCCD016203666F6F016A3FF0000000000000016203666F6F016B3FF199999999999A016203666F6F016C3FF333333333333301630362617201694000CCCCCCCCCCCD016303626172016A400199999999999A016303626172016B4002666666666666016303626172016C4003333333333333016303666F6F01693FFB333333333333016303666F6F016A3FFCCCCCCCCCCCCD016303666F6F016B3FFE666666666666016303666F6F016C4000000000000000"},"result":{"expect":"0x010301780179017A1801610362617201693FE17B4F5BF3474A016103626172016A3FE5E472E03A280C016103626172016B3FEAF406C2FC78AE016103626172016C3FF079664793B60B016103666F6F01693FB9AF8877430B80016103666F6F016A3FC9F267068A55EC016103666F6F016B3FD3CC2A44E29998016103666F6F016C3FDB0F0B49DCDCD80162036261720169400CD11B1696E97E016203626172016A401731086DC00A35016203626172016B402C33ED50B88777016203626172016CC0411DC3A1F73BEA016203666F6F01693FF4299BA9C2A138016203666F6F016A3FF8EB245CBEE3A6016203666F6F016B3FFF6FA7D286214E016203666F6F016C400493C43ACB164D0163036261720169BFFB5B880C6F419E016303626172016ABFF5FB2DE2B500EB016303626172016BBFF1E84C9047C337016303626172016CBFED4FFD331A1C6C016303666F6F0169C01EC952123D33F2016303666F6F016AC0112521C7CA80BD016303666F6F016BC0076AB21A0DF38B016303666F6F016CC0017AF62E0950F8"}}
+{"expression":"tan(a)","inputs":{"a":"0x0301017902017803017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF6666666666666400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD03666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0301017902017803017A0702036261723FF079664793B60B3FF4299BA9C2A1383FF8EB245CBEE3A63FFF6FA7D286214E400493C43ACB164D400CD11B1696E97E401731086DC00A35BFF5FB2DE2B500EBBFF1E84C9047C337BFED4FFD331A1C6CBFE7E79B4E00BB15BFE340478A535B2BBFDE412B62BA7143BFD6C10031EC6D8F3FDF94F57ABCC0183FE3FDD037DA35543FE8C0F8B3CAA42E3FEE514D7FDCC3DA3FF2866F9BE4DE133FF6C6C3B4A4F47E3FFC71C93470177803666F6F3FB9AF8877430B803FC9F267068A55EC3FD3CC2A44E299983FDB0F0B49DCDCD83FE17B4F5BF3474A3FE5E472E03A280C3FEAF406C2FC78AE402C33ED50B88777C0411DC3A1F73BEAC01EC952123D33F2C0112521C7CA80BDC0076AB21A0DF38BC0017AF62E0950F8BFFB5B880C6F419EBFCF8A364255739FBFC23EF71254B86FBFA54EC734D416903FADF048F92660603FC4728C74EFFCF33FD0EA916F405CD13FD7F9360C8212A7"}}
+{"expression":"tan(a)","inputs":{"a":"0x03020178017A010179050C016101693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB3333333333330161016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD0161016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE6666666666660161016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000016201694000CCCCCCCCCCCD40040000000000004007333333333333400A666666666666400D99999999999A0162016A400199999999999A4004CCCCCCCCCCCD4008000000000000400B333333333333400E6666666666660162016B4002666666666666400599999999999A4008CCCCCCCCCCCD400C000000000000400F3333333333330162016C40033333333333334006666666666666400999999999999A400CCCCCCCCCCCCD40100000000000000163016940106666666666664012000000000000401399999999999A40153333333333334016CCCCCCCCCCCD0163016A4010CCCCCCCCCCCD40126666666666664014000000000000401599999999999A40173333333333330163016B40113333333333334012CCCCCCCCCCCD40146666666666664016000000000000401799999999999A0163016C401199999999999A40133333333333334014CCCCCCCCCCCD40166666666666664018000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FB9AF8877430B803FE17B4F5BF3474A3FF4299BA9C2A138400CD11B1696E97EC01EC952123D33F20161016A3FC9F267068A55EC3FE5E472E03A280C3FF8EB245CBEE3A6401731086DC00A35C0112521C7CA80BD0161016B3FD3CC2A44E299983FEAF406C2FC78AE3FFF6FA7D286214E402C33ED50B88777C0076AB21A0DF38B0161016C3FDB0F0B49DCDCD83FF079664793B60B400493C43ACB164DC0411DC3A1F73BEAC0017AF62E0950F801620169BFFB5B880C6F419EBFE7E79B4E00BB15BFCF8A364255739F3FC4728C74EFFCF33FE3FDD037DA35540162016ABFF5FB2DE2B500EBBFE340478A535B2BBFC23EF71254B86F3FD0EA916F405CD13FE8C0F8B3CAA42E0162016BBFF1E84C9047C337BFDE412B62BA7143BFA54EC734D416903FD7F9360C8212A73FEE514D7FDCC3DA0162016CBFED4FFD331A1C6CBFD6C10031EC6D8F3FADF048F92660603FDF94F57ABCC0183FF2866F9BE4DE13016301693FF6C6C3B4A4F47E40128CA0C62BF595C01511E9B3C687CBBFF80537409587B1BFE51C83499B4CC80163016A3FFC71C9347017784021B868D80B4C11C00B0B4B739BBB07BFF37B0C1674A47BBFE0CA10D11279EF0163016B4002496A9CA760A940542D9DE890C6A9C00398597A58D5D2BFEFDBD31615B07ABFD9CC91A8E776FC0163016C4008C54566FDBDECC026C50DC43253B3BFFE2B96D13EA593BFEA0BD2C907E03EBFD29FD86EBB95BE"}}
+{"expression":"map(a,f(a)(tan(a)))","inputs":{"a":"0x02003FB999999999999A"},"result":{"expect":"0x02003FB9AF8877430B80"}}
+{"expression":"map(a,f(a)(tan(a)))","inputs":{"a":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FB9AF8877430B803FC9F267068A55EC3FD3CC2A44E29998"}}
+{"expression":"map(a,f(a)(tan(a)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178030179053FB9AF8877430B803FC9F267068A55EC3FD3CC2A44E299983FDB0F0B49DCDCD83FE17B4F5BF3474A3FE5E472E03A280C3FEAF406C2FC78AE3FF079664793B60B3FF4299BA9C2A1383FF8EB245CBEE3A63FFF6FA7D286214E400493C43ACB164D400CD11B1696E97E401731086DC00A35402C33ED50B88777"}}
+{"expression":"map(a,f(a)(tan(a)))","inputs":{"a":"0x0203017803017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD4011333333333333401199999999999A401200000000000040126666666666664012CCCCCCCCCCCD4013333333333333401399999999999A401400000000000040146666666666664014CCCCCCCCCCCD4015333333333333401599999999999A401600000000000040166666666666664016CCCCCCCCCCCD4017333333333333401799999999999A401800000000000040186666666666664018CCCCCCCCCCCD4019333333333333401999999999999A401A000000000000401A666666666666401ACCCCCCCCCCCD401B333333333333401B99999999999A401C000000000000401C666666666666401CCCCCCCCCCCCD401D333333333333401D99999999999A401E000000000000401E666666666666401ECCCCCCCCCCCD401F333333333333401F99999999999A402000000000000040203333333333334020666666666666402099999999999A4020CCCCCCCCCCCD402100000000000040213333333333334021666666666666402199999999999A4021CCCCCCCCCCCD402200000000000040223333333333334022666666666666402299999999999A4022CCCCCCCCCCCD402300000000000040233333333333334023666666666666402399999999999A4023CCCCCCCCCCCD402400000000000040243333333333334024666666666666402499999999999A4024CCCCCCCCCCCD4025000000000000"},"result":{"expect":"0x0203017803017905017A073FB9AF8877430B803FC9F267068A55EC3FD3CC2A44E299983FDB0F0B49DCDCD83FE17B4F5BF3474A3FE5E472E03A280C3FEAF406C2FC78AE3FF079664793B60B3FF4299BA9C2A1383FF8EB245CBEE3A63FFF6FA7D286214E400493C43ACB164D400CD11B1696E97E401731086DC00A35402C33ED50B88777C0411DC3A1F73BEAC01EC952123D33F2C0112521C7CA80BDC0076AB21A0DF38BC0017AF62E0950F8BFFB5B880C6F419EBFF5FB2DE2B500EBBFF1E84C9047C337BFED4FFD331A1C6CBFE7E79B4E00BB15BFE340478A535B2BBFDE412B62BA7143BFD6C10031EC6D8FBFCF8A364255739FBFC23EF71254B86FBFA54EC734D416903FADF048F92660603FC4728C74EFFCF33FD0EA916F405CD13FD7F9360C8212A73FDF94F57ABCC0183FE3FDD037DA35543FE8C0F8B3CAA42E3FEE514D7FDCC3DA3FF2866F9BE4DE133FF6C6C3B4A4F47E3FFC71C9347017784002496A9CA760A94008C54566FDBDEC40128CA0C62BF5954021B868D80B4C1140542D9DE890C6A9C026C50DC43253B3C01511E9B3C687CBC00B0B4B739BBB07C00398597A58D5D2BFFE2B96D13EA593BFF80537409587B1BFF37B0C1674A47BBFEFDBD31615B07ABFEA0BD2C907E03EBFE51C83499B4CC8BFE0CA10D11279EFBFD9CC91A8E776FCBFD29FD86EBB95BEBFC7B6AC3AFF3643BFB5583DEE907AF93F9138494AF2A7463FBE0A94A390BBE93FCC320B15C520E83FD4FBA0262423563FDC5623343B6BE13FE22FD752AF75CB3FE6B109DE2CBE283FEBE2E6E13EEA793FF109CD601B305A3FF4DFBA34F373AF3FF9DD6F83006FB1400064EF1934ECE04005A5EA99227D5B400ED170AD3162CE4019C5805C97CBEA403281BF104956AFC035B7119FEAF168C01B32E78F49A1E4C00FDBF39CABB7C1C00630A37877CC77C000BB24225BAC36BFFA54D4C53D3438BFF538C9CD26B92ABFF150013B15FD40BFEC567B80303594BFE713A29CC6B6A4BFE2868AC2A1D792BFDCF2BD61315C1CBFD58C805D64CFB4BFCD4421B0D2E0C3BFC00E13BA44EE32BF9960B92D8859EA3FB34B121CC03DD03FC6A92B1538D9403FD212A6916D90193FD93561369E93C63FE07737A93F0A8E3FE4BF5F34BE37823FE9A010E3634DCB3FEF5AF2C1E7E6863FF32ADA63074E7F3FF79C55F5777A7A3FFD9930BC49E27B"}}
+{"expression":"map(a,f(a)(tan(a)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FB9AF8877430B8001623FC9F267068A55EC01633FD3CC2A44E29998"}}
+{"expression":"map(a,f(a)(tan(a)))","inputs":{"a":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179060161036261723FC9F267068A55EC016103666F6F3FB9AF8877430B800162036261723FDB0F0B49DCDCD8016203666F6F3FD3CC2A44E299980163036261723FE5E472E03A280C016303666F6F3FE17B4F5BF3474A"}}
+{"expression":"map(a,f(a)(tan(a)))","inputs":{"a":"0x010301780179017A1801610362617201693FE0000000000000016103626172016A3FE3333333333333016103626172016B3FE6666666666666016103626172016C3FE999999999999A016103666F6F01693FB999999999999A016103666F6F016A3FC999999999999A016103666F6F016B3FD3333333333333016103666F6F016C3FD999999999999A01620362617201693FF4CCCCCCCCCCCD016203626172016A3FF6666666666666016203626172016B3FF8000000000000016203626172016C3FF999999999999A016203666F6F01693FECCCCCCCCCCCCD016203666F6F016A3FF0000000000000016203666F6F016B3FF199999999999A016203666F6F016C3FF333333333333301630362617201694000CCCCCCCCCCCD016303626172016A400199999999999A016303626172016B4002666666666666016303626172016C4003333333333333016303666F6F01693FFB333333333333016303666F6F016A3FFCCCCCCCCCCCCD016303666F6F016B3FFE666666666666016303666F6F016C4000000000000000"},"result":{"expect":"0x010301780179017A1801610362617201693FE17B4F5BF3474A016103626172016A3FE5E472E03A280C016103626172016B3FEAF406C2FC78AE016103626172016C3FF079664793B60B016103666F6F01693FB9AF8877430B80016103666F6F016A3FC9F267068A55EC016103666F6F016B3FD3CC2A44E29998016103666F6F016C3FDB0F0B49DCDCD80162036261720169400CD11B1696E97E016203626172016A401731086DC00A35016203626172016B402C33ED50B88777016203626172016CC0411DC3A1F73BEA016203666F6F01693FF4299BA9C2A138016203666F6F016A3FF8EB245CBEE3A6016203666F6F016B3FFF6FA7D286214E016203666F6F016C400493C43ACB164D0163036261720169BFFB5B880C6F419E016303626172016ABFF5FB2DE2B500EB016303626172016BBFF1E84C9047C337016303626172016CBFED4FFD331A1C6C016303666F6F0169C01EC952123D33F2016303666F6F016AC0112521C7CA80BD016303666F6F016BC0076AB21A0DF38B016303666F6F016CC0017AF62E0950F8"}}
+{"expression":"map(a,f(a)(tan(a)))","inputs":{"a":"0x0301017902017803017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF6666666666666400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD03666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0301017902017803017A0702036261723FF079664793B60B3FF4299BA9C2A1383FF8EB245CBEE3A63FFF6FA7D286214E400493C43ACB164D400CD11B1696E97E401731086DC00A35BFF5FB2DE2B500EBBFF1E84C9047C337BFED4FFD331A1C6CBFE7E79B4E00BB15BFE340478A535B2BBFDE412B62BA7143BFD6C10031EC6D8F3FDF94F57ABCC0183FE3FDD037DA35543FE8C0F8B3CAA42E3FEE514D7FDCC3DA3FF2866F9BE4DE133FF6C6C3B4A4F47E3FFC71C93470177803666F6F3FB9AF8877430B803FC9F267068A55EC3FD3CC2A44E299983FDB0F0B49DCDCD83FE17B4F5BF3474A3FE5E472E03A280C3FEAF406C2FC78AE402C33ED50B88777C0411DC3A1F73BEAC01EC952123D33F2C0112521C7CA80BDC0076AB21A0DF38BC0017AF62E0950F8BFFB5B880C6F419EBFCF8A364255739FBFC23EF71254B86FBFA54EC734D416903FADF048F92660603FC4728C74EFFCF33FD0EA916F405CD13FD7F9360C8212A7"}}
+{"expression":"map(a,f(a)(tan(a)))","inputs":{"a":"0x03020178017A010179050C016101693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB3333333333330161016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD0161016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE6666666666660161016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000016201694000CCCCCCCCCCCD40040000000000004007333333333333400A666666666666400D99999999999A0162016A400199999999999A4004CCCCCCCCCCCD4008000000000000400B333333333333400E6666666666660162016B4002666666666666400599999999999A4008CCCCCCCCCCCD400C000000000000400F3333333333330162016C40033333333333334006666666666666400999999999999A400CCCCCCCCCCCCD40100000000000000163016940106666666666664012000000000000401399999999999A40153333333333334016CCCCCCCCCCCD0163016A4010CCCCCCCCCCCD40126666666666664014000000000000401599999999999A40173333333333330163016B40113333333333334012CCCCCCCCCCCD40146666666666664016000000000000401799999999999A0163016C401199999999999A40133333333333334014CCCCCCCCCCCD40166666666666664018000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FB9AF8877430B803FE17B4F5BF3474A3FF4299BA9C2A138400CD11B1696E97EC01EC952123D33F20161016A3FC9F267068A55EC3FE5E472E03A280C3FF8EB245CBEE3A6401731086DC00A35C0112521C7CA80BD0161016B3FD3CC2A44E299983FEAF406C2FC78AE3FFF6FA7D286214E402C33ED50B88777C0076AB21A0DF38B0161016C3FDB0F0B49DCDCD83FF079664793B60B400493C43ACB164DC0411DC3A1F73BEAC0017AF62E0950F801620169BFFB5B880C6F419EBFE7E79B4E00BB15BFCF8A364255739F3FC4728C74EFFCF33FE3FDD037DA35540162016ABFF5FB2DE2B500EBBFE340478A535B2BBFC23EF71254B86F3FD0EA916F405CD13FE8C0F8B3CAA42E0162016BBFF1E84C9047C337BFDE412B62BA7143BFA54EC734D416903FD7F9360C8212A73FEE514D7FDCC3DA0162016CBFED4FFD331A1C6CBFD6C10031EC6D8F3FADF048F92660603FDF94F57ABCC0183FF2866F9BE4DE13016301693FF6C6C3B4A4F47E40128CA0C62BF595C01511E9B3C687CBBFF80537409587B1BFE51C83499B4CC80163016A3FFC71C9347017784021B868D80B4C11C00B0B4B739BBB07BFF37B0C1674A47BBFE0CA10D11279EF0163016B4002496A9CA760A940542D9DE890C6A9C00398597A58D5D2BFEFDBD31615B07ABFD9CC91A8E776FC0163016C4008C54566FDBDECC026C50DC43253B3BFFE2B96D13EA593BFEA0BD2C907E03EBFD29FD86EBB95BE"}}
+{"expression":"cosh(a)","inputs":{"a":"0x02003FB999999999999A"},"result":{"expect":"0x02003FF0147F40224B38"}}
+{"expression":"cosh(a)","inputs":{"a":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FF0147F40224B383FF0523184B1EE9D3FF0B9B4E0B6EC4C"}}
+{"expression":"cosh(a)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178030179053FF0147F40224B383FF0523184B1EE9D3FF0B9B4E0B6EC4C3FF14C128B1A7C2C3FF20AC1862AE8D03FF2F7AA606E56303FF4152C1862342F3FF566222FAE825A3FF6EDEBFD5D86803FF8B07551D9F5503FFAB24082D6F9113FFCF871F8DFA8003FFF88DD5C2795044001350A412F0A804002D1BC21E22022"}}
+{"expression":"cosh(a)","inputs":{"a":"0x0203017803017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD4011333333333333401199999999999A401200000000000040126666666666664012CCCCCCCCCCCD4013333333333333401399999999999A401400000000000040146666666666664014CCCCCCCCCCCD4015333333333333401599999999999A401600000000000040166666666666664016CCCCCCCCCCCD4017333333333333401799999999999A401800000000000040186666666666664018CCCCCCCCCCCD4019333333333333401999999999999A401A000000000000401A666666666666401ACCCCCCCCCCCD401B333333333333401B99999999999A401C000000000000401C666666666666401CCCCCCCCCCCCD401D333333333333401D99999999999A401E000000000000401E666666666666401ECCCCCCCCCCCD401F333333333333401F99999999999A402000000000000040203333333333334020666666666666402099999999999A4020CCCCCCCCCCCD402100000000000040213333333333334021666666666666402199999999999A4021CCCCCCCCCCCD402200000000000040223333333333334022666666666666402299999999999A4022CCCCCCCCCCCD402300000000000040233333333333334023666666666666402399999999999A4023CCCCCCCCCCCD402400000000000040243333333333334024666666666666402499999999999A4024CCCCCCCCCCCD4025000000000000"},"result":{"expect":"0x0203017803017905017A073FF0147F40224B383FF0523184B1EE9D3FF0B9B4E0B6EC4C3FF14C128B1A7C2C3FF20AC1862AE8D03FF2F7AA606E56303FF4152C1862342F3FF566222FAE825A3FF6EDEBFD5D86803FF8B07551D9F5503FFAB24082D6F9113FFCF871F8DFA8003FFF88DD5C2795044001350A412F0A804002D1BC21E2202240049EA5B153125D4006A063DAD344F74008DC1AE58BD6D7400B5783A0F8AAB7400E18FA0DF2D9BC401093C6D4ED2D7340124589C2CEF9C14014261D2B7D618040163A505BAEDDE840188776E4B30AA3401B137642174316401DE4D4F525D240402081659E7A607940223AAACAED2BB1402422A497D6185E40263E35479AFBFD402892C34A71B792402B2647145E3E5A402DFF5A694CAEB1403092A4A33C887B403250124A3CA07D40343C6B68E7BD6340365C9D757C59534038B61ABD3F1CC5403B4EE858DE3E80403E2DAD98F061824040ACE28909C20940426DA7BA2CBB0240445DA42F240C79404681CEB06413584048DFA3B77D356D404B7D337D8FCF85404E6131844D2CE64050C982E0A9933240528D6FCBEFF3AA405480E568BDF76F4056A8E365AAC4CA40590AF009D7E905405BAD265C831F92405E9645C9B6718B4060E6E1B6159D2F4062ADEE9455E4194064A4D765F3FC074066D0A4B06BA24F406936E67DB9B919406BDDC29CF0766B406ECC04628691BC40710497085E60A24072CEC60A59B4FD4074C92524BD9DDC4076F8C5BBCD4B7C40796341A69E26DE407C0EC988C8A46B407F0234AE7705FB4081228949BA3A8B4082EFDF2112744A4084EDB9DE03AFC040872133D14E1EF140898FF0AEA7314E408C402BFFAED3CD408F38C91BEAA0AE409140B26758798E409311346C1DB0F540951290BDECC6BC409749EAA93F4E764099BCEFCF595DAA409C71E6B2AE9B68409F6FBECAFA076C40A15F11251D39C740A332C4E00D669F40A537A8E70B8D1440A772E991FCDF8740A9EA3E8112E92F40ACA3F942CCEE5B40AFA715845D889540B17DA57AF77EE540B35490884ECAA440B55D027868B0B340B79C30BE7A7BDC40BA17DD0B3504D640BCD6640C8F676040BFDECDBAAC368540C19C6FADCE5A0D40C37697B614FFBC40C5829DD053712E40C7C5C09B15224840CA45CBE94012F740CD09279BD639B340D00B7405C63B5240D1BB7016220CC0"}}
+{"expression":"cosh(a)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FF0147F40224B3801623FF0523184B1EE9D01633FF0B9B4E0B6EC4C"}}
+{"expression":"cosh(a)","inputs":{"a":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179060161036261723FF0523184B1EE9D016103666F6F3FF0147F40224B380162036261723FF14C128B1A7C2C016203666F6F3FF0B9B4E0B6EC4C0163036261723FF2F7AA606E5630016303666F6F3FF20AC1862AE8D0"}}
+{"expression":"cosh(a)","inputs":{"a":"0x010301780179017A1801610362617201693FE0000000000000016103626172016A3FE3333333333333016103626172016B3FE6666666666666016103626172016C3FE999999999999A016103666F6F01693FB999999999999A016103666F6F016A3FC999999999999A016103666F6F016B3FD3333333333333016103666F6F016C3FD999999999999A01620362617201693FF4CCCCCCCCCCCD016203626172016A3FF6666666666666016203626172016B3FF8000000000000016203626172016C3FF999999999999A016203666F6F01693FECCCCCCCCCCCCD016203666F6F016A3FF0000000000000016203666F6F016B3FF199999999999A016203666F6F016C3FF333333333333301630362617201694000CCCCCCCCCCCD016303626172016A400199999999999A016303626172016B4002666666666666016303626172016C4003333333333333016303666F6F01693FFB333333333333016303666F6F016A3FFCCCCCCCCCCCCD016303666F6F016B3FFE666666666666016303666F6F016C4000000000000000"},"result":{"expect":"0x010301780179017A1801610362617201693FF20AC1862AE8D0016103626172016A3FF2F7AA606E5630016103626172016B3FF4152C1862342F016103626172016C3FF566222FAE825A016103666F6F01693FF0147F40224B38016103666F6F016A3FF0523184B1EE9D016103666F6F016B3FF0B9B4E0B6EC4C016103666F6F016C3FF14C128B1A7C2C01620362617201693FFF88DD5C279504016203626172016A4001350A412F0A80016203626172016B4002D1BC21E22022016203626172016C40049EA5B153125D016203666F6F01693FF6EDEBFD5D8680016203666F6F016A3FF8B07551D9F550016203666F6F016B3FFAB24082D6F911016203666F6F016C3FFCF871F8DFA8000163036261720169401093C6D4ED2D73016303626172016A40124589C2CEF9C1016303626172016B4014261D2B7D6180016303626172016C40163A505BAEDDE8016303666F6F01694006A063DAD344F7016303666F6F016A4008DC1AE58BD6D7016303666F6F016B400B5783A0F8AAB7016303666F6F016C400E18FA0DF2D9BC"}}
+{"expression":"cosh(a)","inputs":{"a":"0x0301017902017803017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF6666666666666400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD03666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0301017902017803017A0702036261723FF566222FAE825A3FF6EDEBFD5D86803FF8B07551D9F5503FFAB24082D6F9113FFCF871F8DFA8003FFF88DD5C2795044001350A412F0A8040124589C2CEF9C14014261D2B7D618040163A505BAEDDE840188776E4B30AA3401B137642174316401DE4D4F525D240402081659E7A6079403250124A3CA07D40343C6B68E7BD6340365C9D757C59534038B61ABD3F1CC5403B4EE858DE3E80403E2DAD98F061824040ACE28909C20903666F6F3FF0147F40224B383FF0523184B1EE9D3FF0B9B4E0B6EC4C3FF14C128B1A7C2C3FF20AC1862AE8D03FF2F7AA606E56303FF4152C1862342F4002D1BC21E2202240049EA5B153125D4006A063DAD344F74008DC1AE58BD6D7400B5783A0F8AAB7400E18FA0DF2D9BC401093C6D4ED2D7340223AAACAED2BB1402422A497D6185E40263E35479AFBFD402892C34A71B792402B2647145E3E5A402DFF5A694CAEB1403092A4A33C887B"}}
+{"expression":"cosh(a)","inputs":{"a":"0x03020178017A010179050C016101693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB3333333333330161016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD0161016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE6666666666660161016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000016201694000CCCCCCCCCCCD40040000000000004007333333333333400A666666666666400D99999999999A0162016A400199999999999A4004CCCCCCCCCCCD4008000000000000400B333333333333400E6666666666660162016B4002666666666666400599999999999A4008CCCCCCCCCCCD400C000000000000400F3333333333330162016C40033333333333334006666666666666400999999999999A400CCCCCCCCCCCCD40100000000000000163016940106666666666664012000000000000401399999999999A40153333333333334016CCCCCCCCCCCD0163016A4010CCCCCCCCCCCD40126666666666664014000000000000401599999999999A40173333333333330163016B40113333333333334012CCCCCCCCCCCD40146666666666664016000000000000401799999999999A0163016C401199999999999A40133333333333334014CCCCCCCCCCCD40166666666666664018000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FF0147F40224B383FF20AC1862AE8D03FF6EDEBFD5D86803FFF88DD5C2795044006A063DAD344F70161016A3FF0523184B1EE9D3FF2F7AA606E56303FF8B07551D9F5504001350A412F0A804008DC1AE58BD6D70161016B3FF0B9B4E0B6EC4C3FF4152C1862342F3FFAB24082D6F9114002D1BC21E22022400B5783A0F8AAB70161016C3FF14C128B1A7C2C3FF566222FAE825A3FFCF871F8DFA80040049EA5B153125D400E18FA0DF2D9BC01620169401093C6D4ED2D7340188776E4B30AA340223AAACAED2BB1402B2647145E3E5A40343C6B68E7BD630162016A40124589C2CEF9C1401B137642174316402422A497D6185E402DFF5A694CAEB140365C9D757C59530162016B4014261D2B7D6180401DE4D4F525D24040263E35479AFBFD403092A4A33C887B4038B61ABD3F1CC50162016C40163A505BAEDDE8402081659E7A6079402892C34A71B792403250124A3CA07D403B4EE858DE3E8001630169403E2DAD98F06182404681CEB06413584050C982E0A9933240590AF009D7E9054062ADEE9455E4190163016A4040ACE28909C2094048DFA3B77D356D40528D6FCBEFF3AA405BAD265C831F924064A4D765F3FC070163016B40426DA7BA2CBB02404B7D337D8FCF85405480E568BDF76F405E9645C9B6718B4066D0A4B06BA24F0163016C40445DA42F240C79404E6131844D2CE64056A8E365AAC4CA4060E6E1B6159D2F406936E67DB9B919"}}
+{"expression":"map(a,f(a)(cosh(a)))","inputs":{"a":"0x02003FB999999999999A"},"result":{"expect":"0x02003FF0147F40224B38"}}
+{"expression":"map(a,f(a)(cosh(a)))","inputs":{"a":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FF0147F40224B383FF0523184B1EE9D3FF0B9B4E0B6EC4C"}}
+{"expression":"map(a,f(a)(cosh(a)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178030179053FF0147F40224B383FF0523184B1EE9D3FF0B9B4E0B6EC4C3FF14C128B1A7C2C3FF20AC1862AE8D03FF2F7AA606E56303FF4152C1862342F3FF566222FAE825A3FF6EDEBFD5D86803FF8B07551D9F5503FFAB24082D6F9113FFCF871F8DFA8003FFF88DD5C2795044001350A412F0A804002D1BC21E22022"}}
+{"expression":"map(a,f(a)(cosh(a)))","inputs":{"a":"0x0203017803017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD4011333333333333401199999999999A401200000000000040126666666666664012CCCCCCCCCCCD4013333333333333401399999999999A401400000000000040146666666666664014CCCCCCCCCCCD4015333333333333401599999999999A401600000000000040166666666666664016CCCCCCCCCCCD4017333333333333401799999999999A401800000000000040186666666666664018CCCCCCCCCCCD4019333333333333401999999999999A401A000000000000401A666666666666401ACCCCCCCCCCCD401B333333333333401B99999999999A401C000000000000401C666666666666401CCCCCCCCCCCCD401D333333333333401D99999999999A401E000000000000401E666666666666401ECCCCCCCCCCCD401F333333333333401F99999999999A402000000000000040203333333333334020666666666666402099999999999A4020CCCCCCCCCCCD402100000000000040213333333333334021666666666666402199999999999A4021CCCCCCCCCCCD402200000000000040223333333333334022666666666666402299999999999A4022CCCCCCCCCCCD402300000000000040233333333333334023666666666666402399999999999A4023CCCCCCCCCCCD402400000000000040243333333333334024666666666666402499999999999A4024CCCCCCCCCCCD4025000000000000"},"result":{"expect":"0x0203017803017905017A073FF0147F40224B383FF0523184B1EE9D3FF0B9B4E0B6EC4C3FF14C128B1A7C2C3FF20AC1862AE8D03FF2F7AA606E56303FF4152C1862342F3FF566222FAE825A3FF6EDEBFD5D86803FF8B07551D9F5503FFAB24082D6F9113FFCF871F8DFA8003FFF88DD5C2795044001350A412F0A804002D1BC21E2202240049EA5B153125D4006A063DAD344F74008DC1AE58BD6D7400B5783A0F8AAB7400E18FA0DF2D9BC401093C6D4ED2D7340124589C2CEF9C14014261D2B7D618040163A505BAEDDE840188776E4B30AA3401B137642174316401DE4D4F525D240402081659E7A607940223AAACAED2BB1402422A497D6185E40263E35479AFBFD402892C34A71B792402B2647145E3E5A402DFF5A694CAEB1403092A4A33C887B403250124A3CA07D40343C6B68E7BD6340365C9D757C59534038B61ABD3F1CC5403B4EE858DE3E80403E2DAD98F061824040ACE28909C20940426DA7BA2CBB0240445DA42F240C79404681CEB06413584048DFA3B77D356D404B7D337D8FCF85404E6131844D2CE64050C982E0A9933240528D6FCBEFF3AA405480E568BDF76F4056A8E365AAC4CA40590AF009D7E905405BAD265C831F92405E9645C9B6718B4060E6E1B6159D2F4062ADEE9455E4194064A4D765F3FC074066D0A4B06BA24F406936E67DB9B919406BDDC29CF0766B406ECC04628691BC40710497085E60A24072CEC60A59B4FD4074C92524BD9DDC4076F8C5BBCD4B7C40796341A69E26DE407C0EC988C8A46B407F0234AE7705FB4081228949BA3A8B4082EFDF2112744A4084EDB9DE03AFC040872133D14E1EF140898FF0AEA7314E408C402BFFAED3CD408F38C91BEAA0AE409140B26758798E409311346C1DB0F540951290BDECC6BC409749EAA93F4E764099BCEFCF595DAA409C71E6B2AE9B68409F6FBECAFA076C40A15F11251D39C740A332C4E00D669F40A537A8E70B8D1440A772E991FCDF8740A9EA3E8112E92F40ACA3F942CCEE5B40AFA715845D889540B17DA57AF77EE540B35490884ECAA440B55D027868B0B340B79C30BE7A7BDC40BA17DD0B3504D640BCD6640C8F676040BFDECDBAAC368540C19C6FADCE5A0D40C37697B614FFBC40C5829DD053712E40C7C5C09B15224840CA45CBE94012F740CD09279BD639B340D00B7405C63B5240D1BB7016220CC0"}}
+{"expression":"map(a,f(a)(cosh(a)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FF0147F40224B3801623FF0523184B1EE9D01633FF0B9B4E0B6EC4C"}}
+{"expression":"map(a,f(a)(cosh(a)))","inputs":{"a":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179060161036261723FF0523184B1EE9D016103666F6F3FF0147F40224B380162036261723FF14C128B1A7C2C016203666F6F3FF0B9B4E0B6EC4C0163036261723FF2F7AA606E5630016303666F6F3FF20AC1862AE8D0"}}
+{"expression":"map(a,f(a)(cosh(a)))","inputs":{"a":"0x010301780179017A1801610362617201693FE0000000000000016103626172016A3FE3333333333333016103626172016B3FE6666666666666016103626172016C3FE999999999999A016103666F6F01693FB999999999999A016103666F6F016A3FC999999999999A016103666F6F016B3FD3333333333333016103666F6F016C3FD999999999999A01620362617201693FF4CCCCCCCCCCCD016203626172016A3FF6666666666666016203626172016B3FF8000000000000016203626172016C3FF999999999999A016203666F6F01693FECCCCCCCCCCCCD016203666F6F016A3FF0000000000000016203666F6F016B3FF199999999999A016203666F6F016C3FF333333333333301630362617201694000CCCCCCCCCCCD016303626172016A400199999999999A016303626172016B4002666666666666016303626172016C4003333333333333016303666F6F01693FFB333333333333016303666F6F016A3FFCCCCCCCCCCCCD016303666F6F016B3FFE666666666666016303666F6F016C4000000000000000"},"result":{"expect":"0x010301780179017A1801610362617201693FF20AC1862AE8D0016103626172016A3FF2F7AA606E5630016103626172016B3FF4152C1862342F016103626172016C3FF566222FAE825A016103666F6F01693FF0147F40224B38016103666F6F016A3FF0523184B1EE9D016103666F6F016B3FF0B9B4E0B6EC4C016103666F6F016C3FF14C128B1A7C2C01620362617201693FFF88DD5C279504016203626172016A4001350A412F0A80016203626172016B4002D1BC21E22022016203626172016C40049EA5B153125D016203666F6F01693FF6EDEBFD5D8680016203666F6F016A3FF8B07551D9F550016203666F6F016B3FFAB24082D6F911016203666F6F016C3FFCF871F8DFA8000163036261720169401093C6D4ED2D73016303626172016A40124589C2CEF9C1016303626172016B4014261D2B7D6180016303626172016C40163A505BAEDDE8016303666F6F01694006A063DAD344F7016303666F6F016A4008DC1AE58BD6D7016303666F6F016B400B5783A0F8AAB7016303666F6F016C400E18FA0DF2D9BC"}}
+{"expression":"map(a,f(a)(cosh(a)))","inputs":{"a":"0x0301017902017803017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF6666666666666400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD03666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0301017902017803017A0702036261723FF566222FAE825A3FF6EDEBFD5D86803FF8B07551D9F5503FFAB24082D6F9113FFCF871F8DFA8003FFF88DD5C2795044001350A412F0A8040124589C2CEF9C14014261D2B7D618040163A505BAEDDE840188776E4B30AA3401B137642174316401DE4D4F525D240402081659E7A6079403250124A3CA07D40343C6B68E7BD6340365C9D757C59534038B61ABD3F1CC5403B4EE858DE3E80403E2DAD98F061824040ACE28909C20903666F6F3FF0147F40224B383FF0523184B1EE9D3FF0B9B4E0B6EC4C3FF14C128B1A7C2C3FF20AC1862AE8D03FF2F7AA606E56303FF4152C1862342F4002D1BC21E2202240049EA5B153125D4006A063DAD344F74008DC1AE58BD6D7400B5783A0F8AAB7400E18FA0DF2D9BC401093C6D4ED2D7340223AAACAED2BB1402422A497D6185E40263E35479AFBFD402892C34A71B792402B2647145E3E5A402DFF5A694CAEB1403092A4A33C887B"}}
+{"expression":"map(a,f(a)(cosh(a)))","inputs":{"a":"0x03020178017A010179050C016101693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB3333333333330161016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD0161016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE6666666666660161016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000016201694000CCCCCCCCCCCD40040000000000004007333333333333400A666666666666400D99999999999A0162016A400199999999999A4004CCCCCCCCCCCD4008000000000000400B333333333333400E6666666666660162016B4002666666666666400599999999999A4008CCCCCCCCCCCD400C000000000000400F3333333333330162016C40033333333333334006666666666666400999999999999A400CCCCCCCCCCCCD40100000000000000163016940106666666666664012000000000000401399999999999A40153333333333334016CCCCCCCCCCCD0163016A4010CCCCCCCCCCCD40126666666666664014000000000000401599999999999A40173333333333330163016B40113333333333334012CCCCCCCCCCCD40146666666666664016000000000000401799999999999A0163016C401199999999999A40133333333333334014CCCCCCCCCCCD40166666666666664018000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FF0147F40224B383FF20AC1862AE8D03FF6EDEBFD5D86803FFF88DD5C2795044006A063DAD344F70161016A3FF0523184B1EE9D3FF2F7AA606E56303FF8B07551D9F5504001350A412F0A804008DC1AE58BD6D70161016B3FF0B9B4E0B6EC4C3FF4152C1862342F3FFAB24082D6F9114002D1BC21E22022400B5783A0F8AAB70161016C3FF14C128B1A7C2C3FF566222FAE825A3FFCF871F8DFA80040049EA5B153125D400E18FA0DF2D9BC01620169401093C6D4ED2D7340188776E4B30AA340223AAACAED2BB1402B2647145E3E5A40343C6B68E7BD630162016A40124589C2CEF9C1401B137642174316402422A497D6185E402DFF5A694CAEB140365C9D757C59530162016B4014261D2B7D6180401DE4D4F525D24040263E35479AFBFD403092A4A33C887B4038B61ABD3F1CC50162016C40163A505BAEDDE8402081659E7A6079402892C34A71B792403250124A3CA07D403B4EE858DE3E8001630169403E2DAD98F06182404681CEB06413584050C982E0A9933240590AF009D7E9054062ADEE9455E4190163016A4040ACE28909C2094048DFA3B77D356D40528D6FCBEFF3AA405BAD265C831F924064A4D765F3FC070163016B40426DA7BA2CBB02404B7D337D8FCF85405480E568BDF76F405E9645C9B6718B4066D0A4B06BA24F0163016C40445DA42F240C79404E6131844D2CE64056A8E365AAC4CA4060E6E1B6159D2F406936E67DB9B919"}}
+{"expression":"sinh(a)","inputs":{"a":"0x02003FB999999999999A"},"result":{"expect":"0x02003FB9A487337B59B3"}}
+{"expression":"sinh(a)","inputs":{"a":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FB9A487337B59B33FC9C560CD35EF823FD37D42AF54B926"}}
+{"expression":"sinh(a)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178030179053FB9A487337B59B33FC9C560CD35EF823FD37D42AF54B9263FDA49C41F850ED23FE0ACD00FE63B973FE45F775546A77D3FE8465153D5BDBC3FEC6B5D3C9C16EF3FF06C9CCD5B6AF83FF2CD9FC44EB9823FF55ECFE1B2B2153FF826C0F34123483FFB2C9310045C643FFE7804D9E7541C400108C3AABD6A60"}}
+{"expression":"sinh(a)","inputs":{"a":"0x0203017803017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD4011333333333333401199999999999A401200000000000040126666666666664012CCCCCCCCCCCD4013333333333333401399999999999A401400000000000040146666666666664014CCCCCCCCCCCD4015333333333333401599999999999A401600000000000040166666666666664016CCCCCCCCCCCD4017333333333333401799999999999A401800000000000040186666666666664018CCCCCCCCCCCD4019333333333333401999999999999A401A000000000000401A666666666666401ACCCCCCCCCCCD401B333333333333401B99999999999A401C000000000000401C666666666666401CCCCCCCCCCCCD401D333333333333401D99999999999A401E000000000000401E666666666666401ECCCCCCCCCCCD401F333333333333401F99999999999A402000000000000040203333333333334020666666666666402099999999999A4020CCCCCCCCCCCD402100000000000040213333333333334021666666666666402199999999999A4021CCCCCCCCCCCD402200000000000040223333333333334022666666666666402299999999999A4022CCCCCCCCCCCD402300000000000040233333333333334023666666666666402399999999999A4023CCCCCCCCCCCD402400000000000040243333333333334024666666666666402499999999999A4024CCCCCCCCCCCD4025000000000000"},"result":{"expect":"0x0203017803017905017A073FB9A487337B59B33FC9C560CD35EF823FD37D42AF54B9263FDA49C41F850ED23FE0ACD00FE63B973FE45F775546A77D3FE8465153D5BDBC3FEC6B5D3C9C16EF3FF06C9CCD5B6AF83FF2CD9FC44EB9823FF55ECFE1B2B2153FF826C0F34123483FFB2C9310045C643FFE7804D9E7541C400108C3AABD6A6040030129C5635D7C40052A411348AC5640078992AC540633400A253298B81D35400D03CF63B6E1A0401016619D230D2A4011D41360B922FD4013BF72EA61AF1A4015DD6B30E4B6E840183368CDB0B6D3401AC767E2A1B654401DA0036F88823C402062431F5DE40B40221E7ECA07D84B40240926E70949AE402627249735007D40287DE481D7B796402B1364BAA2B89C402DEE441C2E9A1F40308AE99F364F3B403249139A3E4F914034361720F61B9F403656E35E36D7254038B0EC2A5371B3403B4A3803703630403E296F7D9585EA4040AAF72905BE5F40426BEB1CDA1FF840445C11E1595DAF40468062AB5FA9FC4048DE5A56945091404B7C0974D8F5F0404E6023D82DF5E04050C908DF6DE2C640528D0166F0737440548081852230564056A8890384D34A40590A9E4194C393405BACDC5C994386405E9602D48D06614060E6C36B1A25E94062ADD32B565D454064A4BE98B5E83E4066D08E3F636553406936D22F67C805406BDDB03D4E0647406ECBF3C2804AF04071048F82DD113A4072CEBF3C14D29B4074C91EFC453B364076F8C0295A47C64079633C9BE9C102407C0EC4F8E7E70F407F02308DB9AEA3408122876BA380C94082EFDD707ABF004084EDB85696A2B4408721326F20D75F40898FEF6E2E3C5D408C402ADDB5198D408F38C815892C5C409140B1F0A3C1CA4093113400B4D79F409512905CBC9936409749EA514ECA664099BCEF7FC732FA409C71E66AAEEB00409F6FBE89D458D840A15F1107A3EE2B40A332C4C56222A340A537A8CEE9FC5A40A772E97C272E4F40A9EA3E6D5125ED40ACA3F930EC7A6540AFA7157430966F40B17DA573A60DE740B3549081AFA1B640B55D02726AD89D40B79C30B90E9AB440BA17DD064D36AB40BCD664081F1AAB40BFDECDB6A80BE940C19C6FABFD30A540C37697B4701A6C40C5829DCED6999240C7C5C099BC889C40CA45CBE808445140CD09279ABC172D40D00B74054696B040D1BB7015AE8DB6"}}
+{"expression":"sinh(a)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FB9A487337B59B301623FC9C560CD35EF8201633FD37D42AF54B926"}}
+{"expression":"sinh(a)","inputs":{"a":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179060161036261723FC9C560CD35EF82016103666F6F3FB9A487337B59B30162036261723FDA49C41F850ED2016203666F6F3FD37D42AF54B9260163036261723FE45F775546A77D016303666F6F3FE0ACD00FE63B97"}}
+{"expression":"sinh(a)","inputs":{"a":"0x010301780179017A1801610362617201693FE0000000000000016103626172016A3FE3333333333333016103626172016B3FE6666666666666016103626172016C3FE999999999999A016103666F6F01693FB999999999999A016103666F6F016A3FC999999999999A016103666F6F016B3FD3333333333333016103666F6F016C3FD999999999999A01620362617201693FF4CCCCCCCCCCCD016203626172016A3FF6666666666666016203626172016B3FF8000000000000016203626172016C3FF999999999999A016203666F6F01693FECCCCCCCCCCCCD016203666F6F016A3FF0000000000000016203666F6F016B3FF199999999999A016203666F6F016C3FF333333333333301630362617201694000CCCCCCCCCCCD016303626172016A400199999999999A016303626172016B4002666666666666016303626172016C4003333333333333016303666F6F01693FFB333333333333016303666F6F016A3FFCCCCCCCCCCCCD016303666F6F016B3FFE666666666666016303666F6F016C4000000000000000"},"result":{"expect":"0x010301780179017A1801610362617201693FE0ACD00FE63B97016103626172016A3FE45F775546A77D016103626172016B3FE8465153D5BDBC016103626172016C3FEC6B5D3C9C16EF016103666F6F01693FB9A487337B59B3016103666F6F016A3FC9C560CD35EF82016103666F6F016B3FD37D42AF54B926016103666F6F016C3FDA49C41F850ED201620362617201693FFB2C9310045C64016203626172016A3FFE7804D9E7541C016203626172016B400108C3AABD6A60016203626172016C40030129C5635D7C016203666F6F01693FF06C9CCD5B6AF8016203666F6F016A3FF2CD9FC44EB982016203666F6F016B3FF55ECFE1B2B215016203666F6F016C3FF826C0F34123480163036261720169401016619D230D2A016303626172016A4011D41360B922FD016303626172016B4013BF72EA61AF1A016303626172016C4015DD6B30E4B6E8016303666F6F016940052A411348AC56016303666F6F016A40078992AC540633016303666F6F016B400A253298B81D35016303666F6F016C400D03CF63B6E1A0"}}
+{"expression":"sinh(a)","inputs":{"a":"0x0301017902017803017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF6666666666666400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD03666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0301017902017803017A0702036261723FEC6B5D3C9C16EF3FF06C9CCD5B6AF83FF2CD9FC44EB9823FF55ECFE1B2B2153FF826C0F34123483FFB2C9310045C643FFE7804D9E7541C4011D41360B922FD4013BF72EA61AF1A4015DD6B30E4B6E840183368CDB0B6D3401AC767E2A1B654401DA0036F88823C402062431F5DE40B403249139A3E4F914034361720F61B9F403656E35E36D7254038B0EC2A5371B3403B4A3803703630403E296F7D9585EA4040AAF72905BE5F03666F6F3FB9A487337B59B33FC9C560CD35EF823FD37D42AF54B9263FDA49C41F850ED23FE0ACD00FE63B973FE45F775546A77D3FE8465153D5BDBC400108C3AABD6A6040030129C5635D7C40052A411348AC5640078992AC540633400A253298B81D35400D03CF63B6E1A0401016619D230D2A40221E7ECA07D84B40240926E70949AE402627249735007D40287DE481D7B796402B1364BAA2B89C402DEE441C2E9A1F40308AE99F364F3B"}}
+{"expression":"sinh(a)","inputs":{"a":"0x03020178017A010179050C016101693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB3333333333330161016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD0161016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE6666666666660161016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000016201694000CCCCCCCCCCCD40040000000000004007333333333333400A666666666666400D99999999999A0162016A400199999999999A4004CCCCCCCCCCCD4008000000000000400B333333333333400E6666666666660162016B4002666666666666400599999999999A4008CCCCCCCCCCCD400C000000000000400F3333333333330162016C40033333333333334006666666666666400999999999999A400CCCCCCCCCCCCD40100000000000000163016940106666666666664012000000000000401399999999999A40153333333333334016CCCCCCCCCCCD0163016A4010CCCCCCCCCCCD40126666666666664014000000000000401599999999999A40173333333333330163016B40113333333333334012CCCCCCCCCCCD40146666666666664016000000000000401799999999999A0163016C401199999999999A40133333333333334014CCCCCCCCCCCD40166666666666664018000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FB9A487337B59B33FE0ACD00FE63B973FF06C9CCD5B6AF83FFB2C9310045C6440052A411348AC560161016A3FC9C560CD35EF823FE45F775546A77D3FF2CD9FC44EB9823FFE7804D9E7541C40078992AC5406330161016B3FD37D42AF54B9263FE8465153D5BDBC3FF55ECFE1B2B215400108C3AABD6A60400A253298B81D350161016C3FDA49C41F850ED23FEC6B5D3C9C16EF3FF826C0F341234840030129C5635D7C400D03CF63B6E1A001620169401016619D230D2A40183368CDB0B6D340221E7ECA07D84B402B1364BAA2B89C4034361720F61B9F0162016A4011D41360B922FD401AC767E2A1B65440240926E70949AE402DEE441C2E9A1F403656E35E36D7250162016B4013BF72EA61AF1A401DA0036F88823C402627249735007D40308AE99F364F3B4038B0EC2A5371B30162016C4015DD6B30E4B6E8402062431F5DE40B40287DE481D7B796403249139A3E4F91403B4A380370363001630169403E296F7D9585EA40468062AB5FA9FC4050C908DF6DE2C640590A9E4194C3934062ADD32B565D450163016A4040AAF72905BE5F4048DE5A5694509140528D0166F07374405BACDC5C9943864064A4BE98B5E83E0163016B40426BEB1CDA1FF8404B7C0974D8F5F04054808185223056405E9602D48D06614066D08E3F6365530163016C40445C11E1595DAF404E6023D82DF5E04056A8890384D34A4060E6C36B1A25E9406936D22F67C805"}}
+{"expression":"map(a,f(a)(sinh(a)))","inputs":{"a":"0x02003FB999999999999A"},"result":{"expect":"0x02003FB9A487337B59B3"}}
+{"expression":"map(a,f(a)(sinh(a)))","inputs":{"a":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FB9A487337B59B33FC9C560CD35EF823FD37D42AF54B926"}}
+{"expression":"map(a,f(a)(sinh(a)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178030179053FB9A487337B59B33FC9C560CD35EF823FD37D42AF54B9263FDA49C41F850ED23FE0ACD00FE63B973FE45F775546A77D3FE8465153D5BDBC3FEC6B5D3C9C16EF3FF06C9CCD5B6AF83FF2CD9FC44EB9823FF55ECFE1B2B2153FF826C0F34123483FFB2C9310045C643FFE7804D9E7541C400108C3AABD6A60"}}
+{"expression":"map(a,f(a)(sinh(a)))","inputs":{"a":"0x0203017803017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD4011333333333333401199999999999A401200000000000040126666666666664012CCCCCCCCCCCD4013333333333333401399999999999A401400000000000040146666666666664014CCCCCCCCCCCD4015333333333333401599999999999A401600000000000040166666666666664016CCCCCCCCCCCD4017333333333333401799999999999A401800000000000040186666666666664018CCCCCCCCCCCD4019333333333333401999999999999A401A000000000000401A666666666666401ACCCCCCCCCCCD401B333333333333401B99999999999A401C000000000000401C666666666666401CCCCCCCCCCCCD401D333333333333401D99999999999A401E000000000000401E666666666666401ECCCCCCCCCCCD401F333333333333401F99999999999A402000000000000040203333333333334020666666666666402099999999999A4020CCCCCCCCCCCD402100000000000040213333333333334021666666666666402199999999999A4021CCCCCCCCCCCD402200000000000040223333333333334022666666666666402299999999999A4022CCCCCCCCCCCD402300000000000040233333333333334023666666666666402399999999999A4023CCCCCCCCCCCD402400000000000040243333333333334024666666666666402499999999999A4024CCCCCCCCCCCD4025000000000000"},"result":{"expect":"0x0203017803017905017A073FB9A487337B59B33FC9C560CD35EF823FD37D42AF54B9263FDA49C41F850ED23FE0ACD00FE63B973FE45F775546A77D3FE8465153D5BDBC3FEC6B5D3C9C16EF3FF06C9CCD5B6AF83FF2CD9FC44EB9823FF55ECFE1B2B2153FF826C0F34123483FFB2C9310045C643FFE7804D9E7541C400108C3AABD6A6040030129C5635D7C40052A411348AC5640078992AC540633400A253298B81D35400D03CF63B6E1A0401016619D230D2A4011D41360B922FD4013BF72EA61AF1A4015DD6B30E4B6E840183368CDB0B6D3401AC767E2A1B654401DA0036F88823C402062431F5DE40B40221E7ECA07D84B40240926E70949AE402627249735007D40287DE481D7B796402B1364BAA2B89C402DEE441C2E9A1F40308AE99F364F3B403249139A3E4F914034361720F61B9F403656E35E36D7254038B0EC2A5371B3403B4A3803703630403E296F7D9585EA4040AAF72905BE5F40426BEB1CDA1FF840445C11E1595DAF40468062AB5FA9FC4048DE5A56945091404B7C0974D8F5F0404E6023D82DF5E04050C908DF6DE2C640528D0166F0737440548081852230564056A8890384D34A40590A9E4194C393405BACDC5C994386405E9602D48D06614060E6C36B1A25E94062ADD32B565D454064A4BE98B5E83E4066D08E3F636553406936D22F67C805406BDDB03D4E0647406ECBF3C2804AF04071048F82DD113A4072CEBF3C14D29B4074C91EFC453B364076F8C0295A47C64079633C9BE9C102407C0EC4F8E7E70F407F02308DB9AEA3408122876BA380C94082EFDD707ABF004084EDB85696A2B4408721326F20D75F40898FEF6E2E3C5D408C402ADDB5198D408F38C815892C5C409140B1F0A3C1CA4093113400B4D79F409512905CBC9936409749EA514ECA664099BCEF7FC732FA409C71E66AAEEB00409F6FBE89D458D840A15F1107A3EE2B40A332C4C56222A340A537A8CEE9FC5A40A772E97C272E4F40A9EA3E6D5125ED40ACA3F930EC7A6540AFA7157430966F40B17DA573A60DE740B3549081AFA1B640B55D02726AD89D40B79C30B90E9AB440BA17DD064D36AB40BCD664081F1AAB40BFDECDB6A80BE940C19C6FABFD30A540C37697B4701A6C40C5829DCED6999240C7C5C099BC889C40CA45CBE808445140CD09279ABC172D40D00B74054696B040D1BB7015AE8DB6"}}
+{"expression":"map(a,f(a)(sinh(a)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FB9A487337B59B301623FC9C560CD35EF8201633FD37D42AF54B926"}}
+{"expression":"map(a,f(a)(sinh(a)))","inputs":{"a":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179060161036261723FC9C560CD35EF82016103666F6F3FB9A487337B59B30162036261723FDA49C41F850ED2016203666F6F3FD37D42AF54B9260163036261723FE45F775546A77D016303666F6F3FE0ACD00FE63B97"}}
+{"expression":"map(a,f(a)(sinh(a)))","inputs":{"a":"0x010301780179017A1801610362617201693FE0000000000000016103626172016A3FE3333333333333016103626172016B3FE6666666666666016103626172016C3FE999999999999A016103666F6F01693FB999999999999A016103666F6F016A3FC999999999999A016103666F6F016B3FD3333333333333016103666F6F016C3FD999999999999A01620362617201693FF4CCCCCCCCCCCD016203626172016A3FF6666666666666016203626172016B3FF8000000000000016203626172016C3FF999999999999A016203666F6F01693FECCCCCCCCCCCCD016203666F6F016A3FF0000000000000016203666F6F016B3FF199999999999A016203666F6F016C3FF333333333333301630362617201694000CCCCCCCCCCCD016303626172016A400199999999999A016303626172016B4002666666666666016303626172016C4003333333333333016303666F6F01693FFB333333333333016303666F6F016A3FFCCCCCCCCCCCCD016303666F6F016B3FFE666666666666016303666F6F016C4000000000000000"},"result":{"expect":"0x010301780179017A1801610362617201693FE0ACD00FE63B97016103626172016A3FE45F775546A77D016103626172016B3FE8465153D5BDBC016103626172016C3FEC6B5D3C9C16EF016103666F6F01693FB9A487337B59B3016103666F6F016A3FC9C560CD35EF82016103666F6F016B3FD37D42AF54B926016103666F6F016C3FDA49C41F850ED201620362617201693FFB2C9310045C64016203626172016A3FFE7804D9E7541C016203626172016B400108C3AABD6A60016203626172016C40030129C5635D7C016203666F6F01693FF06C9CCD5B6AF8016203666F6F016A3FF2CD9FC44EB982016203666F6F016B3FF55ECFE1B2B215016203666F6F016C3FF826C0F34123480163036261720169401016619D230D2A016303626172016A4011D41360B922FD016303626172016B4013BF72EA61AF1A016303626172016C4015DD6B30E4B6E8016303666F6F016940052A411348AC56016303666F6F016A40078992AC540633016303666F6F016B400A253298B81D35016303666F6F016C400D03CF63B6E1A0"}}
+{"expression":"map(a,f(a)(sinh(a)))","inputs":{"a":"0x0301017902017803017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF6666666666666400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD03666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0301017902017803017A0702036261723FEC6B5D3C9C16EF3FF06C9CCD5B6AF83FF2CD9FC44EB9823FF55ECFE1B2B2153FF826C0F34123483FFB2C9310045C643FFE7804D9E7541C4011D41360B922FD4013BF72EA61AF1A4015DD6B30E4B6E840183368CDB0B6D3401AC767E2A1B654401DA0036F88823C402062431F5DE40B403249139A3E4F914034361720F61B9F403656E35E36D7254038B0EC2A5371B3403B4A3803703630403E296F7D9585EA4040AAF72905BE5F03666F6F3FB9A487337B59B33FC9C560CD35EF823FD37D42AF54B9263FDA49C41F850ED23FE0ACD00FE63B973FE45F775546A77D3FE8465153D5BDBC400108C3AABD6A6040030129C5635D7C40052A411348AC5640078992AC540633400A253298B81D35400D03CF63B6E1A0401016619D230D2A40221E7ECA07D84B40240926E70949AE402627249735007D40287DE481D7B796402B1364BAA2B89C402DEE441C2E9A1F40308AE99F364F3B"}}
+{"expression":"map(a,f(a)(sinh(a)))","inputs":{"a":"0x03020178017A010179050C016101693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB3333333333330161016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD0161016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE6666666666660161016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000016201694000CCCCCCCCCCCD40040000000000004007333333333333400A666666666666400D99999999999A0162016A400199999999999A4004CCCCCCCCCCCD4008000000000000400B333333333333400E6666666666660162016B4002666666666666400599999999999A4008CCCCCCCCCCCD400C000000000000400F3333333333330162016C40033333333333334006666666666666400999999999999A400CCCCCCCCCCCCD40100000000000000163016940106666666666664012000000000000401399999999999A40153333333333334016CCCCCCCCCCCD0163016A4010CCCCCCCCCCCD40126666666666664014000000000000401599999999999A40173333333333330163016B40113333333333334012CCCCCCCCCCCD40146666666666664016000000000000401799999999999A0163016C401199999999999A40133333333333334014CCCCCCCCCCCD40166666666666664018000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FB9A487337B59B33FE0ACD00FE63B973FF06C9CCD5B6AF83FFB2C9310045C6440052A411348AC560161016A3FC9C560CD35EF823FE45F775546A77D3FF2CD9FC44EB9823FFE7804D9E7541C40078992AC5406330161016B3FD37D42AF54B9263FE8465153D5BDBC3FF55ECFE1B2B215400108C3AABD6A60400A253298B81D350161016C3FDA49C41F850ED23FEC6B5D3C9C16EF3FF826C0F341234840030129C5635D7C400D03CF63B6E1A001620169401016619D230D2A40183368CDB0B6D340221E7ECA07D84B402B1364BAA2B89C4034361720F61B9F0162016A4011D41360B922FD401AC767E2A1B65440240926E70949AE402DEE441C2E9A1F403656E35E36D7250162016B4013BF72EA61AF1A401DA0036F88823C402627249735007D40308AE99F364F3B4038B0EC2A5371B30162016C4015DD6B30E4B6E8402062431F5DE40B40287DE481D7B796403249139A3E4F91403B4A380370363001630169403E296F7D9585EA40468062AB5FA9FC4050C908DF6DE2C640590A9E4194C3934062ADD32B565D450163016A4040AAF72905BE5F4048DE5A5694509140528D0166F07374405BACDC5C9943864064A4BE98B5E83E0163016B40426BEB1CDA1FF8404B7C0974D8F5F04054808185223056405E9602D48D06614066D08E3F6365530163016C40445C11E1595DAF404E6023D82DF5E04056A8890384D34A4060E6C36B1A25E9406936D22F67C805"}}
+{"expression":"tanh(a)","inputs":{"a":"0x02003FB999999999999A"},"result":{"expect":"0x02003FB983D7795F413A"}}
+{"expression":"tanh(a)","inputs":{"a":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FB983D7795F413A3FC9439830B3A5903FD2A4DDA7D914FA"}}
+{"expression":"tanh(a)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178030179053FB983D7795F413A3FC9439830B3A5903FD2A4DDA7D914FA3FD8511573C242D63FDD9353D7568AF33FE12F8292D2CCFC3FE356FB17AF2E923FE53FCA0A748A423FE6EBE982D6605D3FE85EFAB514F3943FE99DB01FDE24053FEAAD4C6D28DCAF3FEB933C726E9B3A3FEC54CCFACFA1183FECF6F9786DF577"}}
+{"expression":"tanh(a)","inputs":{"a":"0x0203017803017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD4011333333333333401199999999999A401200000000000040126666666666664012CCCCCCCCCCCD4013333333333333401399999999999A401400000000000040146666666666664014CCCCCCCCCCCD4015333333333333401599999999999A401600000000000040166666666666664016CCCCCCCCCCCD4017333333333333401799999999999A401800000000000040186666666666664018CCCCCCCCCCCD4019333333333333401999999999999A401A000000000000401A666666666666401ACCCCCCCCCCCD401B333333333333401B99999999999A401C000000000000401C666666666666401CCCCCCCCCCCCD401D333333333333401D99999999999A401E000000000000401E666666666666401ECCCCCCCCCCCD401F333333333333401F99999999999A402000000000000040203333333333334020666666666666402099999999999A4020CCCCCCCCCCCD402100000000000040213333333333334021666666666666402199999999999A4021CCCCCCCCCCCD402200000000000040223333333333334022666666666666402299999999999A4022CCCCCCCCCCCD402300000000000040233333333333334023666666666666402399999999999A4023CCCCCCCCCCCD402400000000000040243333333333334024666666666666402499999999999A4024CCCCCCCCCCCD4025000000000000"},"result":{"expect":"0x0203017803017905017A073FB983D7795F413A3FC9439830B3A5903FD2A4DDA7D914FA3FD8511573C242D63FDD9353D7568AF33FE12F8292D2CCFC3FE356FB17AF2E923FE53FCA0A748A423FE6EBE982D6605D3FE85EFAB514F3943FE99DB01FDE24053FEAAD4C6D28DCAF3FEB933C726E9B3A3FEC54CCFACFA1183FECF6F9786DF5773FED7E4F0D5DAD303FEDEEDF00D3E7F53FEE4C3C1F9A968E3FEE997F4C3BCD483FEED9505E1BC3D43FEF0DF13843075E3FEF3949A819042D3FEF5CF31E1C81033FEF7A43B1F623503FEF9258260A71C23FEFA61CCB69A6603FEFB655437478D53FEFC3A32D87C3723FEFCE8BD82660E83FEFD77D111A0B003FEFDED130CA91243FEFE4D27BE70B933FEFE9BDF44F7C033FEFEDC5AF87E3383FEFF112C63A90773FEFF3C6EDA3A2963FEFF5FDC948488C3FEFF7CE0126A2893FEFF94A269AEF873FEFFA81708A0B423FEFFB8055F328883FEFFC510CD4C09B3FEFFCFBF24C09553FEFFD87DFFC38C53FEFFDFA721539833FEFFE5840BAA36E3FEFFEA50F0EEA103FEFFEE3F1BF80C23FEFFF176E9994C13FEFFF419668DF113FEFFF641A285DA73FEFFF805C5D55893FEFFF977F4E09A23FEFFFAA70A595BE3FEFFFB9F2FC1E913FEFFFC6A5A500D83FEFFFD10B1303023FEFFFD98E14151B3FEFFFE0861A4EEF3FEFFFE63ABE253C3FEFFFEAE69DD8FE3FEFFFEEB9B79E833FEFFFF1DB56A2C03FEFFFF46BA6B57C3FEFFFF684FEC9B93FEFFFF83CEF8EBF3FEFFFF9A520FD1F3FEFFFFACC07BB5A3FEFFFFBBD79A16D3FEFFFFC832750F23FEFFFFD24FFC2DC3FEFFFFDA981C98F3FEFFFFE15FECCB43FEFFFFE6ED16C4D3FEFFFFEB78A3C733FEFFFFEF314653A3FEFFFFF23D39F083FEFFFFF4BBCBF7C3FEFFFFF6C69D3103FEFFFFF872A91F83FEFFFFF9D11D9663FEFFFFFAF00B37E3FEFFFFFBDAF5F783FEFFFFFC9B4B6923FEFFFFFD38C39F03FEFFFFFDB9B077D3FEFFFFFE233E8D43FEFFFFFE79AA5CE3FEFFFFFEC06BCEB3FEFFFFFEFA59D783FEFFFFFF29C7A5A3FEFFFFFF509C8433FEFFFFFF70676973FEFFFFFF8A6EF9E3FEFFFFFF9FBEA413FEFFFFFFB1315C83FEFFFFFFBF7A6723FEFFFFFFCB2C8913FEFFFFFFD4BFEC73FEFFFFFFDC96F353FEFFFFFFE3022A53FEFFFFFFE8438403FEFFFFFFEC90FED3FEFFFFFFF016CF93FEFFFFFFF2F9279"}}
+{"expression":"tanh(a)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FB983D7795F413A01623FC9439830B3A59001633FD2A4DDA7D914FA"}}
+{"expression":"tanh(a)","inputs":{"a":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179060161036261723FC9439830B3A590016103666F6F3FB983D7795F413A0162036261723FD8511573C242D6016203666F6F3FD2A4DDA7D914FA0163036261723FE12F8292D2CCFC016303666F6F3FDD9353D7568AF3"}}
+{"expression":"tanh(a)","inputs":{"a":"0x010301780179017A1801610362617201693FE0000000000000016103626172016A3FE3333333333333016103626172016B3FE6666666666666016103626172016C3FE999999999999A016103666F6F01693FB999999999999A016103666F6F016A3FC999999999999A016103666F6F016B3FD3333333333333016103666F6F016C3FD999999999999A01620362617201693FF4CCCCCCCCCCCD016203626172016A3FF6666666666666016203626172016B3FF8000000000000016203626172016C3FF999999999999A016203666F6F01693FECCCCCCCCCCCCD016203666F6F016A3FF0000000000000016203666F6F016B3FF199999999999A016203666F6F016C3FF333333333333301630362617201694000CCCCCCCCCCCD016303626172016A400199999999999A016303626172016B4002666666666666016303626172016C4003333333333333016303666F6F01693FFB333333333333016303666F6F016A3FFCCCCCCCCCCCCD016303666F6F016B3FFE666666666666016303666F6F016C4000000000000000"},"result":{"expect":"0x010301780179017A1801610362617201693FDD9353D7568AF3016103626172016A3FE12F8292D2CCFC016103626172016B3FE356FB17AF2E92016103626172016C3FE53FCA0A748A42016103666F6F01693FB983D7795F413A016103666F6F016A3FC9439830B3A590016103666F6F016B3FD2A4DDA7D914FA016103666F6F016C3FD8511573C242D601620362617201693FEB933C726E9B3A016203626172016A3FEC54CCFACFA118016203626172016B3FECF6F9786DF577016203626172016C3FED7E4F0D5DAD30016203666F6F01693FE6EBE982D6605D016203666F6F016A3FE85EFAB514F394016203666F6F016B3FE99DB01FDE2405016203666F6F016C3FEAAD4C6D28DCAF01630362617201693FEF0DF13843075E016303626172016A3FEF3949A819042D016303626172016B3FEF5CF31E1C8103016303626172016C3FEF7A43B1F62350016303666F6F01693FEDEEDF00D3E7F5016303666F6F016A3FEE4C3C1F9A968E016303666F6F016B3FEE997F4C3BCD48016303666F6F016C3FEED9505E1BC3D4"}}
+{"expression":"tanh(a)","inputs":{"a":"0x0301017902017803017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF6666666666666400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD03666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0301017902017803017A0702036261723FE53FCA0A748A423FE6EBE982D6605D3FE85EFAB514F3943FE99DB01FDE24053FEAAD4C6D28DCAF3FEB933C726E9B3A3FEC54CCFACFA1183FEF3949A819042D3FEF5CF31E1C81033FEF7A43B1F623503FEF9258260A71C23FEFA61CCB69A6603FEFB655437478D53FEFC3A32D87C3723FEFF3C6EDA3A2963FEFF5FDC948488C3FEFF7CE0126A2893FEFF94A269AEF873FEFFA81708A0B423FEFFB8055F328883FEFFC510CD4C09B03666F6F3FB983D7795F413A3FC9439830B3A5903FD2A4DDA7D914FA3FD8511573C242D63FDD9353D7568AF33FE12F8292D2CCFC3FE356FB17AF2E923FECF6F9786DF5773FED7E4F0D5DAD303FEDEEDF00D3E7F53FEE4C3C1F9A968E3FEE997F4C3BCD483FEED9505E1BC3D43FEF0DF13843075E3FEFCE8BD82660E83FEFD77D111A0B003FEFDED130CA91243FEFE4D27BE70B933FEFE9BDF44F7C033FEFEDC5AF87E3383FEFF112C63A9077"}}
+{"expression":"tanh(a)","inputs":{"a":"0x03020178017A010179050C016101693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB3333333333330161016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD0161016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE6666666666660161016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000016201694000CCCCCCCCCCCD40040000000000004007333333333333400A666666666666400D99999999999A0162016A400199999999999A4004CCCCCCCCCCCD4008000000000000400B333333333333400E6666666666660162016B4002666666666666400599999999999A4008CCCCCCCCCCCD400C000000000000400F3333333333330162016C40033333333333334006666666666666400999999999999A400CCCCCCCCCCCCD40100000000000000163016940106666666666664012000000000000401399999999999A40153333333333334016CCCCCCCCCCCD0163016A4010CCCCCCCCCCCD40126666666666664014000000000000401599999999999A40173333333333330163016B40113333333333334012CCCCCCCCCCCD40146666666666664016000000000000401799999999999A0163016C401199999999999A40133333333333334014CCCCCCCCCCCD40166666666666664018000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FB983D7795F413A3FDD9353D7568AF33FE6EBE982D6605D3FEB933C726E9B3A3FEDEEDF00D3E7F50161016A3FC9439830B3A5903FE12F8292D2CCFC3FE85EFAB514F3943FEC54CCFACFA1183FEE4C3C1F9A968E0161016B3FD2A4DDA7D914FA3FE356FB17AF2E923FE99DB01FDE24053FECF6F9786DF5773FEE997F4C3BCD480161016C3FD8511573C242D63FE53FCA0A748A423FEAAD4C6D28DCAF3FED7E4F0D5DAD303FEED9505E1BC3D4016201693FEF0DF13843075E3FEF9258260A71C23FEFCE8BD82660E83FEFE9BDF44F7C033FEFF5FDC948488C0162016A3FEF3949A819042D3FEFA61CCB69A6603FEFD77D111A0B003FEFEDC5AF87E3383FEFF7CE0126A2890162016B3FEF5CF31E1C81033FEFB655437478D53FEFDED130CA91243FEFF112C63A90773FEFF94A269AEF870162016C3FEF7A43B1F623503FEFC3A32D87C3723FEFE4D27BE70B933FEFF3C6EDA3A2963FEFFA81708A0B42016301693FEFFB8055F328883FEFFDFA721539833FEFFF176E9994C13FEFFF977F4E09A23FEFFFD10B1303020163016A3FEFFC510CD4C09B3FEFFE5840BAA36E3FEFFF419668DF113FEFFFAA70A595BE3FEFFFD98E14151B0163016B3FEFFCFBF24C09553FEFFEA50F0EEA103FEFFF641A285DA73FEFFFB9F2FC1E913FEFFFE0861A4EEF0163016C3FEFFD87DFFC38C53FEFFEE3F1BF80C23FEFFF805C5D55893FEFFFC6A5A500D83FEFFFE63ABE253C"}}
+{"expression":"map(a,f(a)(tanh(a)))","inputs":{"a":"0x02003FB999999999999A"},"result":{"expect":"0x02003FB983D7795F413A"}}
+{"expression":"map(a,f(a)(tanh(a)))","inputs":{"a":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FB983D7795F413A3FC9439830B3A5903FD2A4DDA7D914FA"}}
+{"expression":"map(a,f(a)(tanh(a)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178030179053FB983D7795F413A3FC9439830B3A5903FD2A4DDA7D914FA3FD8511573C242D63FDD9353D7568AF33FE12F8292D2CCFC3FE356FB17AF2E923FE53FCA0A748A423FE6EBE982D6605D3FE85EFAB514F3943FE99DB01FDE24053FEAAD4C6D28DCAF3FEB933C726E9B3A3FEC54CCFACFA1183FECF6F9786DF577"}}
+{"expression":"map(a,f(a)(tanh(a)))","inputs":{"a":"0x0203017803017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD4011333333333333401199999999999A401200000000000040126666666666664012CCCCCCCCCCCD4013333333333333401399999999999A401400000000000040146666666666664014CCCCCCCCCCCD4015333333333333401599999999999A401600000000000040166666666666664016CCCCCCCCCCCD4017333333333333401799999999999A401800000000000040186666666666664018CCCCCCCCCCCD4019333333333333401999999999999A401A000000000000401A666666666666401ACCCCCCCCCCCD401B333333333333401B99999999999A401C000000000000401C666666666666401CCCCCCCCCCCCD401D333333333333401D99999999999A401E000000000000401E666666666666401ECCCCCCCCCCCD401F333333333333401F99999999999A402000000000000040203333333333334020666666666666402099999999999A4020CCCCCCCCCCCD402100000000000040213333333333334021666666666666402199999999999A4021CCCCCCCCCCCD402200000000000040223333333333334022666666666666402299999999999A4022CCCCCCCCCCCD402300000000000040233333333333334023666666666666402399999999999A4023CCCCCCCCCCCD402400000000000040243333333333334024666666666666402499999999999A4024CCCCCCCCCCCD4025000000000000"},"result":{"expect":"0x0203017803017905017A073FB983D7795F413A3FC9439830B3A5903FD2A4DDA7D914FA3FD8511573C242D63FDD9353D7568AF33FE12F8292D2CCFC3FE356FB17AF2E923FE53FCA0A748A423FE6EBE982D6605D3FE85EFAB514F3943FE99DB01FDE24053FEAAD4C6D28DCAF3FEB933C726E9B3A3FEC54CCFACFA1183FECF6F9786DF5773FED7E4F0D5DAD303FEDEEDF00D3E7F53FEE4C3C1F9A968E3FEE997F4C3BCD483FEED9505E1BC3D43FEF0DF13843075E3FEF3949A819042D3FEF5CF31E1C81033FEF7A43B1F623503FEF9258260A71C23FEFA61CCB69A6603FEFB655437478D53FEFC3A32D87C3723FEFCE8BD82660E83FEFD77D111A0B003FEFDED130CA91243FEFE4D27BE70B933FEFE9BDF44F7C033FEFEDC5AF87E3383FEFF112C63A90773FEFF3C6EDA3A2963FEFF5FDC948488C3FEFF7CE0126A2893FEFF94A269AEF873FEFFA81708A0B423FEFFB8055F328883FEFFC510CD4C09B3FEFFCFBF24C09553FEFFD87DFFC38C53FEFFDFA721539833FEFFE5840BAA36E3FEFFEA50F0EEA103FEFFEE3F1BF80C23FEFFF176E9994C13FEFFF419668DF113FEFFF641A285DA73FEFFF805C5D55893FEFFF977F4E09A23FEFFFAA70A595BE3FEFFFB9F2FC1E913FEFFFC6A5A500D83FEFFFD10B1303023FEFFFD98E14151B3FEFFFE0861A4EEF3FEFFFE63ABE253C3FEFFFEAE69DD8FE3FEFFFEEB9B79E833FEFFFF1DB56A2C03FEFFFF46BA6B57C3FEFFFF684FEC9B93FEFFFF83CEF8EBF3FEFFFF9A520FD1F3FEFFFFACC07BB5A3FEFFFFBBD79A16D3FEFFFFC832750F23FEFFFFD24FFC2DC3FEFFFFDA981C98F3FEFFFFE15FECCB43FEFFFFE6ED16C4D3FEFFFFEB78A3C733FEFFFFEF314653A3FEFFFFF23D39F083FEFFFFF4BBCBF7C3FEFFFFF6C69D3103FEFFFFF872A91F83FEFFFFF9D11D9663FEFFFFFAF00B37E3FEFFFFFBDAF5F783FEFFFFFC9B4B6923FEFFFFFD38C39F03FEFFFFFDB9B077D3FEFFFFFE233E8D43FEFFFFFE79AA5CE3FEFFFFFEC06BCEB3FEFFFFFEFA59D783FEFFFFFF29C7A5A3FEFFFFFF509C8433FEFFFFFF70676973FEFFFFFF8A6EF9E3FEFFFFFF9FBEA413FEFFFFFFB1315C83FEFFFFFFBF7A6723FEFFFFFFCB2C8913FEFFFFFFD4BFEC73FEFFFFFFDC96F353FEFFFFFFE3022A53FEFFFFFFE8438403FEFFFFFFEC90FED3FEFFFFFFF016CF93FEFFFFFFF2F9279"}}
+{"expression":"map(a,f(a)(tanh(a)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FB983D7795F413A01623FC9439830B3A59001633FD2A4DDA7D914FA"}}
+{"expression":"map(a,f(a)(tanh(a)))","inputs":{"a":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179060161036261723FC9439830B3A590016103666F6F3FB983D7795F413A0162036261723FD8511573C242D6016203666F6F3FD2A4DDA7D914FA0163036261723FE12F8292D2CCFC016303666F6F3FDD9353D7568AF3"}}
+{"expression":"map(a,f(a)(tanh(a)))","inputs":{"a":"0x010301780179017A1801610362617201693FE0000000000000016103626172016A3FE3333333333333016103626172016B3FE6666666666666016103626172016C3FE999999999999A016103666F6F01693FB999999999999A016103666F6F016A3FC999999999999A016103666F6F016B3FD3333333333333016103666F6F016C3FD999999999999A01620362617201693FF4CCCCCCCCCCCD016203626172016A3FF6666666666666016203626172016B3FF8000000000000016203626172016C3FF999999999999A016203666F6F01693FECCCCCCCCCCCCD016203666F6F016A3FF0000000000000016203666F6F016B3FF199999999999A016203666F6F016C3FF333333333333301630362617201694000CCCCCCCCCCCD016303626172016A400199999999999A016303626172016B4002666666666666016303626172016C4003333333333333016303666F6F01693FFB333333333333016303666F6F016A3FFCCCCCCCCCCCCD016303666F6F016B3FFE666666666666016303666F6F016C4000000000000000"},"result":{"expect":"0x010301780179017A1801610362617201693FDD9353D7568AF3016103626172016A3FE12F8292D2CCFC016103626172016B3FE356FB17AF2E92016103626172016C3FE53FCA0A748A42016103666F6F01693FB983D7795F413A016103666F6F016A3FC9439830B3A590016103666F6F016B3FD2A4DDA7D914FA016103666F6F016C3FD8511573C242D601620362617201693FEB933C726E9B3A016203626172016A3FEC54CCFACFA118016203626172016B3FECF6F9786DF577016203626172016C3FED7E4F0D5DAD30016203666F6F01693FE6EBE982D6605D016203666F6F016A3FE85EFAB514F394016203666F6F016B3FE99DB01FDE2405016203666F6F016C3FEAAD4C6D28DCAF01630362617201693FEF0DF13843075E016303626172016A3FEF3949A819042D016303626172016B3FEF5CF31E1C8103016303626172016C3FEF7A43B1F62350016303666F6F01693FEDEEDF00D3E7F5016303666F6F016A3FEE4C3C1F9A968E016303666F6F016B3FEE997F4C3BCD48016303666F6F016C3FEED9505E1BC3D4"}}
+{"expression":"map(a,f(a)(tanh(a)))","inputs":{"a":"0x0301017902017803017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF6666666666666400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD03666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0301017902017803017A0702036261723FE53FCA0A748A423FE6EBE982D6605D3FE85EFAB514F3943FE99DB01FDE24053FEAAD4C6D28DCAF3FEB933C726E9B3A3FEC54CCFACFA1183FEF3949A819042D3FEF5CF31E1C81033FEF7A43B1F623503FEF9258260A71C23FEFA61CCB69A6603FEFB655437478D53FEFC3A32D87C3723FEFF3C6EDA3A2963FEFF5FDC948488C3FEFF7CE0126A2893FEFF94A269AEF873FEFFA81708A0B423FEFFB8055F328883FEFFC510CD4C09B03666F6F3FB983D7795F413A3FC9439830B3A5903FD2A4DDA7D914FA3FD8511573C242D63FDD9353D7568AF33FE12F8292D2CCFC3FE356FB17AF2E923FECF6F9786DF5773FED7E4F0D5DAD303FEDEEDF00D3E7F53FEE4C3C1F9A968E3FEE997F4C3BCD483FEED9505E1BC3D43FEF0DF13843075E3FEFCE8BD82660E83FEFD77D111A0B003FEFDED130CA91243FEFE4D27BE70B933FEFE9BDF44F7C033FEFEDC5AF87E3383FEFF112C63A9077"}}
+{"expression":"map(a,f(a)(tanh(a)))","inputs":{"a":"0x03020178017A010179050C016101693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB3333333333330161016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD0161016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE6666666666660161016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000016201694000CCCCCCCCCCCD40040000000000004007333333333333400A666666666666400D99999999999A0162016A400199999999999A4004CCCCCCCCCCCD4008000000000000400B333333333333400E6666666666660162016B4002666666666666400599999999999A4008CCCCCCCCCCCD400C000000000000400F3333333333330162016C40033333333333334006666666666666400999999999999A400CCCCCCCCCCCCD40100000000000000163016940106666666666664012000000000000401399999999999A40153333333333334016CCCCCCCCCCCD0163016A4010CCCCCCCCCCCD40126666666666664014000000000000401599999999999A40173333333333330163016B40113333333333334012CCCCCCCCCCCD40146666666666664016000000000000401799999999999A0163016C401199999999999A40133333333333334014CCCCCCCCCCCD40166666666666664018000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FB983D7795F413A3FDD9353D7568AF33FE6EBE982D6605D3FEB933C726E9B3A3FEDEEDF00D3E7F50161016A3FC9439830B3A5903FE12F8292D2CCFC3FE85EFAB514F3943FEC54CCFACFA1183FEE4C3C1F9A968E0161016B3FD2A4DDA7D914FA3FE356FB17AF2E923FE99DB01FDE24053FECF6F9786DF5773FEE997F4C3BCD480161016C3FD8511573C242D63FE53FCA0A748A423FEAAD4C6D28DCAF3FED7E4F0D5DAD303FEED9505E1BC3D4016201693FEF0DF13843075E3FEF9258260A71C23FEFCE8BD82660E83FEFE9BDF44F7C033FEFF5FDC948488C0162016A3FEF3949A819042D3FEFA61CCB69A6603FEFD77D111A0B003FEFEDC5AF87E3383FEFF7CE0126A2890162016B3FEF5CF31E1C81033FEFB655437478D53FEFDED130CA91243FEFF112C63A90773FEFF94A269AEF870162016C3FEF7A43B1F623503FEFC3A32D87C3723FEFE4D27BE70B933FEFF3C6EDA3A2963FEFFA81708A0B42016301693FEFFB8055F328883FEFFDFA721539833FEFFF176E9994C13FEFFF977F4E09A23FEFFFD10B1303020163016A3FEFFC510CD4C09B3FEFFE5840BAA36E3FEFFF419668DF113FEFFFAA70A595BE3FEFFFD98E14151B0163016B3FEFFCFBF24C09553FEFFEA50F0EEA103FEFFF641A285DA73FEFFFB9F2FC1E913FEFFFE0861A4EEF0163016C3FEFFD87DFFC38C53FEFFEE3F1BF80C23FEFFF805C5D55893FEFFFC6A5A500D83FEFFFE63ABE253C"}}
+{"expression":"acos(a)","inputs":{"a":"0x02003FE0CCA12729AFB8"},"result":{"expect":"0x02003FF04A292B02A075"}}
+{"expression":"acos(a)","inputs":{"a":"0x02010178033FE0CCA12729AFB83FE1983D7795F4143FE261D545E46A8B"},"result":{"expect":"0x02010178033FF04A292B02A0753FEFA2DD25F534F13FEEAF1748E5C5A3"}}
+{"expression":"acos(a)","inputs":{"a":"0x02020178030179053FE0CCA12729AFB83FE1983D7795F4143FE261D545E46A8B3FE32873061674B23FE3EB2FD4D343913FE4A93769F6453E3FE561CB52A194763FE614455CF090B63FE6C0192BDC382E3FE764D4F5D5A2BD3FE802217B20C9023FE897C14969667D3FE9258F68070E5E3FE9AB7D8BD797483FEA2991F2A97914"},"result":{"expect":"0x02020178030179053FF04A292B02A0753FEFA2DD25F534F13FEEAF1748E5C5A33FEDB9D521101D5B3FECC3E9DFD275683FEBCE2484AAE47C3FEAD94D1BC729013FE9E6224E17FF153FE8F5574FE8BE1B3FE8079235D8AAA83FE71D6AB318C1A43FE637693F4D0FF83FE556069E9D4DC33FE479ABC37FED283FE3A2B1FFA9ACBD"}}
+{"expression":"acos(a)","inputs":{"a":"0x0203017803017905017A073FE0CCA12729AFB83FE1983D7795F4143FE261D545E46A8B3FE32873061674B23FE3EB2FD4D343913FE4A93769F6453E3FE561CB52A194763FE614455CF090B63FE6C0192BDC382E3FE764D4F5D5A2BD3FE802217B20C9023FE897C14969667D3FE9258F68070E5E3FE9AB7D8BD797483FEA2991F2A979143FEA9FE5053A45203FEB0E9EDC4324D83FEB75F4C16B302F3FEBD626C0B5B6063FEC2F7D5A8A79C93FEC8247621BC0C83FECCED80FEF12023FED15854CD0D92B3FED56A636946E583FED9291DDB596F83FEDC99E39374D9E3FEDFC1F4CE6E8223FEE2A667D67D08C3FEE54C20D06AA953FEE7B7CBC36FABD3FEE9EDD88B9D8AF3FEEBF2786AED6983FEEDC99CF2C9D4D3FEEF76F8069F3FA3FEF0FDFCBF19A933FEF261E0FCD4B463FEF3A59F801F5823FEF4CBFA61DE6A33FEF5D77DCF758083FEF6CA82F0DE1EA3FEF7A732E4B69463FEF86F89C2183AF3FEF925599378CD23FEF9CA4D40C82163FEFA5FEB616FE8F3FEFAE798F0E40823FEFB629BE21D26E3FEFBD21D8FB11A83FEFC372D07518CD3FEFC92C130538E23FEFCE5BACD8BFA43FEFD30E65B4D32F3FEFD74FDCAB1CF83FEFDB2AA1BA3C6B3FEFDEA84D73D7203FEFE1D196C3E1BA3FEFE4AE66F5A36A3FEFE745EC1330753FEFE99EA9BBCE223FEFEBBE888D05813FEFEDAAE43934F83FEFEF68986548923FEFF0FC0C65F7393FEFF2693DF385C93FEFF3B3CAE9A9D03FEFF4DEFA27BE023FEFF5EDC3A4177B3FEFF6E2D7C3F19D3FEFF7C0A60819EE3FEFF889631D483C3FEFF93F0E5DE28B3FEFF9E376D1D14B3FEFFA783FB7FEAC3FEFFAFEE4A424463FEFFB78BD3AA3B93FEFFBE7009351453FEFFC4AC84B51D53FEFFCA5134D77C33FEFFCF6C857E1CB3FEFFD40B84505A23FEFFD83A01DC2373FEFFDC02AF994433FEFFDF6F3B191333FEFFE28866A604D3FEFFE5561F907333FEFFE7DF92604AB3FEFFEA2B3D1E27B3FEFFEC3EFFE1C633FEFFEE202BCF6283FEFFEFD390A9CC13FEFFF15D891B6543FEFFF2C205D51B73FEFFF404979F78F3FEFFF52878775093FEFFF63093CD1D33FEFFF71F8DFC0623FEFFF7F7CB0B7D23FEFFF8BB74CCA603FEFFF96C80631433FEFFFA0CB346F893FEFFFA9DA7CD7F33FEFFFB20D142ED33FEFFFB977FA0F2F3FEFFFC02E2EAAC43FEFFFC640E36E19"},"result":{"expect":"0x0203017803017905017A073FF04A292B02A0753FEFA2DD25F534F13FEEAF1748E5C5A33FEDB9D521101D5B3FECC3E9DFD275683FEBCE2484AAE47C3FEAD94D1BC729013FE9E6224E17FF153FE8F5574FE8BE1B3FE8079235D8AAA83FE71D6AB318C1A43FE637693F4D0FF83FE556069E9D4DC33FE479ABC37FED283FE3A2B1FFA9ACBD3FE2D1637843BBA63FE205FBD106D6FF3FE140A901FC29FC3FE0818C4C49E6003FDF917686EAB7453FDE2C81C389C2013FDCD43D3F9685023FDB889B1118E1B43FDA497E8A09BFC33FD916BE363A9F533FD7F025BA663A7B3FD6D57790AAB7303FD5C66EA04F51FB3FD4C2BFB00C3DED3FD3CA1AB319300C3FD2DC2BF21514323FD1F89D1170130D3FD11F15F768EB5E3FD04F3D93EFE0D83FCF117519C78DC23FCD9667A24F622C3FCC2CA22A0EE4173FCAD37674967B893FC98A394C771A6F3FC850430F622CA13FC724F01E47BA963FC607A135043F403FC4F7BBACDB21753FC3F4A9ACA8726D3FC2FDDA4965FAE03FC212C19955C5183FC132D8BBDFCDD73FC05D9DD7F195CC3FBF252824EA1FB13FBDA286FC8144963FBC32720D67200C3FBAD40CAC114FED3FB986837088B6803FB8490BF70598723FB71AE49C9BAF6C3FB5FB543913F3723FB4E9A9D6E60AEF3FB3E53C6A1D177C3FB2ED6A86D26E423FB2019A17CC06C73FB1213815B3AC083FB04BB83F46918F3FAF0129A59567253FAD7E9C920F31573FAC0ED623E596F63FAAB0EEA669E27F3FA964095145816F3FA82753CD79F7B03FA6FA05BE877F803FA5DB604FC76E7E3FA4CAADC5FE28B43FA3C741152054EA3FA2D0757A40DA8D3FA1E5AE1997BA8D3FA10655A08DCE053FA031DDEBB621C23F9ECF7F613611FE3F9D4EF4568613B33F9BE1259EA118183F9A8529F93C1B143F993A236E7066833F97FF3EC52D117B3F96D3B2FFE82B4B3F95B6C0DF51F92D3F94A7B26ACD00923F93A5DA7E6F2F3E3F92B0945E5189CF3F91C7434EF50BF83F90E95232850E213F9016332AC0ECBB3F8E9ABE7EB24BFF3F8D1CAC11194AC63F8BB13ABBAB8AD63F8A578210EFD2243F890EA4F381A1B53F87D5D109A270893F86AC3E37888C453F85912E2018A5703F8483EBABC100C03F8383CA95288E243F829026FB6FA8BA3F81A864F9BBB3153F80CBF043D041A53F7FF4778EEDBCE83F7E6582A4F5A65F"}}
+{"expression":"acos(a)","inputs":{"a":"0x010101780301613FE0CCA12729AFB801623FE1983D7795F41401633FE261D545E46A8B"},"result":{"expect":"0x010101780301613FF04A292B02A07501623FEFA2DD25F534F101633FEEAF1748E5C5A3"}}
+{"expression":"acos(a)","inputs":{"a":"0x010201780179060161036261723FE1983D7795F414016103666F6F3FE0CCA12729AFB80162036261723FE32873061674B2016203666F6F3FE261D545E46A8B0163036261723FE4A93769F6453E016303666F6F3FE3EB2FD4D34391"},"result":{"expect":"0x010201780179060161036261723FEFA2DD25F534F1016103666F6F3FF04A292B02A0750162036261723FEDB9D521101D5B016203666F6F3FEEAF1748E5C5A30163036261723FEBCE2484AAE47C016303666F6F3FECC3E9DFD27568"}}
+{"expression":"acos(a)","inputs":{"a":"0x010301780179017A1801610362617201693FE3EB2FD4D34391016103626172016A3FE4A93769F6453E016103626172016B3FE561CB52A19476016103626172016C3FE614455CF090B6016103666F6F01693FE0CCA12729AFB8016103666F6F016A3FE1983D7795F414016103666F6F016B3FE261D545E46A8B016103666F6F016C3FE32873061674B201620362617201693FE9258F68070E5E016203626172016A3FE9AB7D8BD79748016203626172016B3FEA2991F2A97914016203626172016C3FEA9FE5053A4520016203666F6F01693FE6C0192BDC382E016203666F6F016A3FE764D4F5D5A2BD016203666F6F016B3FE802217B20C902016203666F6F016C3FE897C14969667D01630362617201693FEC8247621BC0C8016303626172016A3FECCED80FEF1202016303626172016B3FED15854CD0D92B016303626172016C3FED56A636946E58016303666F6F01693FEB0E9EDC4324D8016303666F6F016A3FEB75F4C16B302F016303666F6F016B3FEBD626C0B5B606016303666F6F016C3FEC2F7D5A8A79C9"},"result":{"expect":"0x010301780179017A1801610362617201693FECC3E9DFD27568016103626172016A3FEBCE2484AAE47C016103626172016B3FEAD94D1BC72901016103626172016C3FE9E6224E17FF15016103666F6F01693FF04A292B02A075016103666F6F016A3FEFA2DD25F534F1016103666F6F016B3FEEAF1748E5C5A3016103666F6F016C3FEDB9D521101D5B01620362617201693FE556069E9D4DC3016203626172016A3FE479ABC37FED28016203626172016B3FE3A2B1FFA9ACBD016203626172016C3FE2D1637843BBA6016203666F6F01693FE8F5574FE8BE1B016203666F6F016A3FE8079235D8AAA8016203666F6F016B3FE71D6AB318C1A4016203666F6F016C3FE637693F4D0FF801630362617201693FDE2C81C389C201016303626172016A3FDCD43D3F968502016303626172016B3FDB889B1118E1B4016303626172016C3FDA497E8A09BFC3016303666F6F01693FE205FBD106D6FF016303666F6F016A3FE140A901FC29FC016303666F6F016B3FE0818C4C49E600016303666F6F016C3FDF917686EAB745"}}
+{"expression":"acos(a)","inputs":{"a":"0x0301017902017803017A0702036261723FE614455CF090B63FE6C0192BDC382E3FE764D4F5D5A2BD3FE802217B20C9023FE897C14969667D3FE9258F68070E5E3FE9AB7D8BD797483FECCED80FEF12023FED15854CD0D92B3FED56A636946E583FED9291DDB596F83FEDC99E39374D9E3FEDFC1F4CE6E8223FEE2A667D67D08C3FEF261E0FCD4B463FEF3A59F801F5823FEF4CBFA61DE6A33FEF5D77DCF758083FEF6CA82F0DE1EA3FEF7A732E4B69463FEF86F89C2183AF03666F6F3FE0CCA12729AFB83FE1983D7795F4143FE261D545E46A8B3FE32873061674B23FE3EB2FD4D343913FE4A93769F6453E3FE561CB52A194763FEA2991F2A979143FEA9FE5053A45203FEB0E9EDC4324D83FEB75F4C16B302F3FEBD626C0B5B6063FEC2F7D5A8A79C93FEC8247621BC0C83FEE54C20D06AA953FEE7B7CBC36FABD3FEE9EDD88B9D8AF3FEEBF2786AED6983FEEDC99CF2C9D4D3FEEF76F8069F3FA3FEF0FDFCBF19A93"},"result":{"expect":"0x0301017902017803017A0702036261723FE9E6224E17FF153FE8F5574FE8BE1B3FE8079235D8AAA83FE71D6AB318C1A43FE637693F4D0FF83FE556069E9D4DC33FE479ABC37FED283FDCD43D3F9685023FDB889B1118E1B43FDA497E8A09BFC33FD916BE363A9F533FD7F025BA663A7B3FD6D57790AAB7303FD5C66EA04F51FB3FCD9667A24F622C3FCC2CA22A0EE4173FCAD37674967B893FC98A394C771A6F3FC850430F622CA13FC724F01E47BA963FC607A135043F4003666F6F3FF04A292B02A0753FEFA2DD25F534F13FEEAF1748E5C5A33FEDB9D521101D5B3FECC3E9DFD275683FEBCE2484AAE47C3FEAD94D1BC729013FE3A2B1FFA9ACBD3FE2D1637843BBA63FE205FBD106D6FF3FE140A901FC29FC3FE0818C4C49E6003FDF917686EAB7453FDE2C81C389C2013FD4C2BFB00C3DED3FD3CA1AB319300C3FD2DC2BF21514323FD1F89D1170130D3FD11F15F768EB5E3FD04F3D93EFE0D83FCF117519C78DC2"}}
+{"expression":"acos(a)","inputs":{"a":"0x03020178017A010179050C016101693FE0CCA12729AFB83FE3EB2FD4D343913FE6C0192BDC382E3FE9258F68070E5E3FEB0E9EDC4324D80161016A3FE1983D7795F4143FE4A93769F6453E3FE764D4F5D5A2BD3FE9AB7D8BD797483FEB75F4C16B302F0161016B3FE261D545E46A8B3FE561CB52A194763FE802217B20C9023FEA2991F2A979143FEBD626C0B5B6060161016C3FE32873061674B23FE614455CF090B63FE897C14969667D3FEA9FE5053A45203FEC2F7D5A8A79C9016201693FEC8247621BC0C83FED9291DDB596F83FEE54C20D06AA953FEEDC99CF2C9D4D3FEF3A59F801F5820162016A3FECCED80FEF12023FEDC99E39374D9E3FEE7B7CBC36FABD3FEEF76F8069F3FA3FEF4CBFA61DE6A30162016B3FED15854CD0D92B3FEDFC1F4CE6E8223FEE9EDD88B9D8AF3FEF0FDFCBF19A933FEF5D77DCF758080162016C3FED56A636946E583FEE2A667D67D08C3FEEBF2786AED6983FEF261E0FCD4B463FEF6CA82F0DE1EA016301693FEF7A732E4B69463FEFA5FEB616FE8F3FEFC372D07518CD3FEFD74FDCAB1CF83FEFE4AE66F5A36A0163016A3FEF86F89C2183AF3FEFAE798F0E40823FEFC92C130538E23FEFDB2AA1BA3C6B3FEFE745EC1330750163016B3FEF925599378CD23FEFB629BE21D26E3FEFCE5BACD8BFA43FEFDEA84D73D7203FEFE99EA9BBCE220163016C3FEF9CA4D40C82163FEFBD21D8FB11A83FEFD30E65B4D32F3FEFE1D196C3E1BA3FEFEBBE888D0581"},"result":{"expect":"0x03020178017A010179050C016101693FF04A292B02A0753FECC3E9DFD275683FE8F5574FE8BE1B3FE556069E9D4DC33FE205FBD106D6FF0161016A3FEFA2DD25F534F13FEBCE2484AAE47C3FE8079235D8AAA83FE479ABC37FED283FE140A901FC29FC0161016B3FEEAF1748E5C5A33FEAD94D1BC729013FE71D6AB318C1A43FE3A2B1FFA9ACBD3FE0818C4C49E6000161016C3FEDB9D521101D5B3FE9E6224E17FF153FE637693F4D0FF83FE2D1637843BBA63FDF917686EAB745016201693FDE2C81C389C2013FD916BE363A9F533FD4C2BFB00C3DED3FD11F15F768EB5E3FCC2CA22A0EE4170162016A3FDCD43D3F9685023FD7F025BA663A7B3FD3CA1AB319300C3FD04F3D93EFE0D83FCAD37674967B890162016B3FDB889B1118E1B43FD6D57790AAB7303FD2DC2BF21514323FCF117519C78DC23FC98A394C771A6F0162016C3FDA497E8A09BFC33FD5C66EA04F51FB3FD1F89D1170130D3FCD9667A24F622C3FC850430F622CA1016301693FC724F01E47BA963FC2FDDA4965FAE03FBF252824EA1FB13FB986837088B6803FB4E9A9D6E60AEF0163016A3FC607A135043F403FC212C19955C5183FBDA286FC8144963FB8490BF70598723FB3E53C6A1D177C0163016B3FC4F7BBACDB21753FC132D8BBDFCDD73FBC32720D67200C3FB71AE49C9BAF6C3FB2ED6A86D26E420163016C3FC3F4A9ACA8726D3FC05D9DD7F195CC3FBAD40CAC114FED3FB5FB543913F3723FB2019A17CC06C7"}}
+{"expression":"map(a,f(a)(acos(a)))","inputs":{"a":"0x02003FE0CCA12729AFB8"},"result":{"expect":"0x02003FF04A292B02A075"}}
+{"expression":"map(a,f(a)(acos(a)))","inputs":{"a":"0x02010178033FE0CCA12729AFB83FE1983D7795F4143FE261D545E46A8B"},"result":{"expect":"0x02010178033FF04A292B02A0753FEFA2DD25F534F13FEEAF1748E5C5A3"}}
+{"expression":"map(a,f(a)(acos(a)))","inputs":{"a":"0x02020178030179053FE0CCA12729AFB83FE1983D7795F4143FE261D545E46A8B3FE32873061674B23FE3EB2FD4D343913FE4A93769F6453E3FE561CB52A194763FE614455CF090B63FE6C0192BDC382E3FE764D4F5D5A2BD3FE802217B20C9023FE897C14969667D3FE9258F68070E5E3FE9AB7D8BD797483FEA2991F2A97914"},"result":{"expect":"0x02020178030179053FF04A292B02A0753FEFA2DD25F534F13FEEAF1748E5C5A33FEDB9D521101D5B3FECC3E9DFD275683FEBCE2484AAE47C3FEAD94D1BC729013FE9E6224E17FF153FE8F5574FE8BE1B3FE8079235D8AAA83FE71D6AB318C1A43FE637693F4D0FF83FE556069E9D4DC33FE479ABC37FED283FE3A2B1FFA9ACBD"}}
+{"expression":"map(a,f(a)(acos(a)))","inputs":{"a":"0x0203017803017905017A073FE0CCA12729AFB83FE1983D7795F4143FE261D545E46A8B3FE32873061674B23FE3EB2FD4D343913FE4A93769F6453E3FE561CB52A194763FE614455CF090B63FE6C0192BDC382E3FE764D4F5D5A2BD3FE802217B20C9023FE897C14969667D3FE9258F68070E5E3FE9AB7D8BD797483FEA2991F2A979143FEA9FE5053A45203FEB0E9EDC4324D83FEB75F4C16B302F3FEBD626C0B5B6063FEC2F7D5A8A79C93FEC8247621BC0C83FECCED80FEF12023FED15854CD0D92B3FED56A636946E583FED9291DDB596F83FEDC99E39374D9E3FEDFC1F4CE6E8223FEE2A667D67D08C3FEE54C20D06AA953FEE7B7CBC36FABD3FEE9EDD88B9D8AF3FEEBF2786AED6983FEEDC99CF2C9D4D3FEEF76F8069F3FA3FEF0FDFCBF19A933FEF261E0FCD4B463FEF3A59F801F5823FEF4CBFA61DE6A33FEF5D77DCF758083FEF6CA82F0DE1EA3FEF7A732E4B69463FEF86F89C2183AF3FEF925599378CD23FEF9CA4D40C82163FEFA5FEB616FE8F3FEFAE798F0E40823FEFB629BE21D26E3FEFBD21D8FB11A83FEFC372D07518CD3FEFC92C130538E23FEFCE5BACD8BFA43FEFD30E65B4D32F3FEFD74FDCAB1CF83FEFDB2AA1BA3C6B3FEFDEA84D73D7203FEFE1D196C3E1BA3FEFE4AE66F5A36A3FEFE745EC1330753FEFE99EA9BBCE223FEFEBBE888D05813FEFEDAAE43934F83FEFEF68986548923FEFF0FC0C65F7393FEFF2693DF385C93FEFF3B3CAE9A9D03FEFF4DEFA27BE023FEFF5EDC3A4177B3FEFF6E2D7C3F19D3FEFF7C0A60819EE3FEFF889631D483C3FEFF93F0E5DE28B3FEFF9E376D1D14B3FEFFA783FB7FEAC3FEFFAFEE4A424463FEFFB78BD3AA3B93FEFFBE7009351453FEFFC4AC84B51D53FEFFCA5134D77C33FEFFCF6C857E1CB3FEFFD40B84505A23FEFFD83A01DC2373FEFFDC02AF994433FEFFDF6F3B191333FEFFE28866A604D3FEFFE5561F907333FEFFE7DF92604AB3FEFFEA2B3D1E27B3FEFFEC3EFFE1C633FEFFEE202BCF6283FEFFEFD390A9CC13FEFFF15D891B6543FEFFF2C205D51B73FEFFF404979F78F3FEFFF52878775093FEFFF63093CD1D33FEFFF71F8DFC0623FEFFF7F7CB0B7D23FEFFF8BB74CCA603FEFFF96C80631433FEFFFA0CB346F893FEFFFA9DA7CD7F33FEFFFB20D142ED33FEFFFB977FA0F2F3FEFFFC02E2EAAC43FEFFFC640E36E19"},"result":{"expect":"0x0203017803017905017A073FF04A292B02A0753FEFA2DD25F534F13FEEAF1748E5C5A33FEDB9D521101D5B3FECC3E9DFD275683FEBCE2484AAE47C3FEAD94D1BC729013FE9E6224E17FF153FE8F5574FE8BE1B3FE8079235D8AAA83FE71D6AB318C1A43FE637693F4D0FF83FE556069E9D4DC33FE479ABC37FED283FE3A2B1FFA9ACBD3FE2D1637843BBA63FE205FBD106D6FF3FE140A901FC29FC3FE0818C4C49E6003FDF917686EAB7453FDE2C81C389C2013FDCD43D3F9685023FDB889B1118E1B43FDA497E8A09BFC33FD916BE363A9F533FD7F025BA663A7B3FD6D57790AAB7303FD5C66EA04F51FB3FD4C2BFB00C3DED3FD3CA1AB319300C3FD2DC2BF21514323FD1F89D1170130D3FD11F15F768EB5E3FD04F3D93EFE0D83FCF117519C78DC23FCD9667A24F622C3FCC2CA22A0EE4173FCAD37674967B893FC98A394C771A6F3FC850430F622CA13FC724F01E47BA963FC607A135043F403FC4F7BBACDB21753FC3F4A9ACA8726D3FC2FDDA4965FAE03FC212C19955C5183FC132D8BBDFCDD73FC05D9DD7F195CC3FBF252824EA1FB13FBDA286FC8144963FBC32720D67200C3FBAD40CAC114FED3FB986837088B6803FB8490BF70598723FB71AE49C9BAF6C3FB5FB543913F3723FB4E9A9D6E60AEF3FB3E53C6A1D177C3FB2ED6A86D26E423FB2019A17CC06C73FB1213815B3AC083FB04BB83F46918F3FAF0129A59567253FAD7E9C920F31573FAC0ED623E596F63FAAB0EEA669E27F3FA964095145816F3FA82753CD79F7B03FA6FA05BE877F803FA5DB604FC76E7E3FA4CAADC5FE28B43FA3C741152054EA3FA2D0757A40DA8D3FA1E5AE1997BA8D3FA10655A08DCE053FA031DDEBB621C23F9ECF7F613611FE3F9D4EF4568613B33F9BE1259EA118183F9A8529F93C1B143F993A236E7066833F97FF3EC52D117B3F96D3B2FFE82B4B3F95B6C0DF51F92D3F94A7B26ACD00923F93A5DA7E6F2F3E3F92B0945E5189CF3F91C7434EF50BF83F90E95232850E213F9016332AC0ECBB3F8E9ABE7EB24BFF3F8D1CAC11194AC63F8BB13ABBAB8AD63F8A578210EFD2243F890EA4F381A1B53F87D5D109A270893F86AC3E37888C453F85912E2018A5703F8483EBABC100C03F8383CA95288E243F829026FB6FA8BA3F81A864F9BBB3153F80CBF043D041A53F7FF4778EEDBCE83F7E6582A4F5A65F"}}
+{"expression":"map(a,f(a)(acos(a)))","inputs":{"a":"0x010101780301613FE0CCA12729AFB801623FE1983D7795F41401633FE261D545E46A8B"},"result":{"expect":"0x010101780301613FF04A292B02A07501623FEFA2DD25F534F101633FEEAF1748E5C5A3"}}
+{"expression":"map(a,f(a)(acos(a)))","inputs":{"a":"0x010201780179060161036261723FE1983D7795F414016103666F6F3FE0CCA12729AFB80162036261723FE32873061674B2016203666F6F3FE261D545E46A8B0163036261723FE4A93769F6453E016303666F6F3FE3EB2FD4D34391"},"result":{"expect":"0x010201780179060161036261723FEFA2DD25F534F1016103666F6F3FF04A292B02A0750162036261723FEDB9D521101D5B016203666F6F3FEEAF1748E5C5A30163036261723FEBCE2484AAE47C016303666F6F3FECC3E9DFD27568"}}
+{"expression":"map(a,f(a)(acos(a)))","inputs":{"a":"0x010301780179017A1801610362617201693FE3EB2FD4D34391016103626172016A3FE4A93769F6453E016103626172016B3FE561CB52A19476016103626172016C3FE614455CF090B6016103666F6F01693FE0CCA12729AFB8016103666F6F016A3FE1983D7795F414016103666F6F016B3FE261D545E46A8B016103666F6F016C3FE32873061674B201620362617201693FE9258F68070E5E016203626172016A3FE9AB7D8BD79748016203626172016B3FEA2991F2A97914016203626172016C3FEA9FE5053A4520016203666F6F01693FE6C0192BDC382E016203666F6F016A3FE764D4F5D5A2BD016203666F6F016B3FE802217B20C902016203666F6F016C3FE897C14969667D01630362617201693FEC8247621BC0C8016303626172016A3FECCED80FEF1202016303626172016B3FED15854CD0D92B016303626172016C3FED56A636946E58016303666F6F01693FEB0E9EDC4324D8016303666F6F016A3FEB75F4C16B302F016303666F6F016B3FEBD626C0B5B606016303666F6F016C3FEC2F7D5A8A79C9"},"result":{"expect":"0x010301780179017A1801610362617201693FECC3E9DFD27568016103626172016A3FEBCE2484AAE47C016103626172016B3FEAD94D1BC72901016103626172016C3FE9E6224E17FF15016103666F6F01693FF04A292B02A075016103666F6F016A3FEFA2DD25F534F1016103666F6F016B3FEEAF1748E5C5A3016103666F6F016C3FEDB9D521101D5B01620362617201693FE556069E9D4DC3016203626172016A3FE479ABC37FED28016203626172016B3FE3A2B1FFA9ACBD016203626172016C3FE2D1637843BBA6016203666F6F01693FE8F5574FE8BE1B016203666F6F016A3FE8079235D8AAA8016203666F6F016B3FE71D6AB318C1A4016203666F6F016C3FE637693F4D0FF801630362617201693FDE2C81C389C201016303626172016A3FDCD43D3F968502016303626172016B3FDB889B1118E1B4016303626172016C3FDA497E8A09BFC3016303666F6F01693FE205FBD106D6FF016303666F6F016A3FE140A901FC29FC016303666F6F016B3FE0818C4C49E600016303666F6F016C3FDF917686EAB745"}}
+{"expression":"map(a,f(a)(acos(a)))","inputs":{"a":"0x0301017902017803017A0702036261723FE614455CF090B63FE6C0192BDC382E3FE764D4F5D5A2BD3FE802217B20C9023FE897C14969667D3FE9258F68070E5E3FE9AB7D8BD797483FECCED80FEF12023FED15854CD0D92B3FED56A636946E583FED9291DDB596F83FEDC99E39374D9E3FEDFC1F4CE6E8223FEE2A667D67D08C3FEF261E0FCD4B463FEF3A59F801F5823FEF4CBFA61DE6A33FEF5D77DCF758083FEF6CA82F0DE1EA3FEF7A732E4B69463FEF86F89C2183AF03666F6F3FE0CCA12729AFB83FE1983D7795F4143FE261D545E46A8B3FE32873061674B23FE3EB2FD4D343913FE4A93769F6453E3FE561CB52A194763FEA2991F2A979143FEA9FE5053A45203FEB0E9EDC4324D83FEB75F4C16B302F3FEBD626C0B5B6063FEC2F7D5A8A79C93FEC8247621BC0C83FEE54C20D06AA953FEE7B7CBC36FABD3FEE9EDD88B9D8AF3FEEBF2786AED6983FEEDC99CF2C9D4D3FEEF76F8069F3FA3FEF0FDFCBF19A93"},"result":{"expect":"0x0301017902017803017A0702036261723FE9E6224E17FF153FE8F5574FE8BE1B3FE8079235D8AAA83FE71D6AB318C1A43FE637693F4D0FF83FE556069E9D4DC33FE479ABC37FED283FDCD43D3F9685023FDB889B1118E1B43FDA497E8A09BFC33FD916BE363A9F533FD7F025BA663A7B3FD6D57790AAB7303FD5C66EA04F51FB3FCD9667A24F622C3FCC2CA22A0EE4173FCAD37674967B893FC98A394C771A6F3FC850430F622CA13FC724F01E47BA963FC607A135043F4003666F6F3FF04A292B02A0753FEFA2DD25F534F13FEEAF1748E5C5A33FEDB9D521101D5B3FECC3E9DFD275683FEBCE2484AAE47C3FEAD94D1BC729013FE3A2B1FFA9ACBD3FE2D1637843BBA63FE205FBD106D6FF3FE140A901FC29FC3FE0818C4C49E6003FDF917686EAB7453FDE2C81C389C2013FD4C2BFB00C3DED3FD3CA1AB319300C3FD2DC2BF21514323FD1F89D1170130D3FD11F15F768EB5E3FD04F3D93EFE0D83FCF117519C78DC2"}}
+{"expression":"map(a,f(a)(acos(a)))","inputs":{"a":"0x03020178017A010179050C016101693FE0CCA12729AFB83FE3EB2FD4D343913FE6C0192BDC382E3FE9258F68070E5E3FEB0E9EDC4324D80161016A3FE1983D7795F4143FE4A93769F6453E3FE764D4F5D5A2BD3FE9AB7D8BD797483FEB75F4C16B302F0161016B3FE261D545E46A8B3FE561CB52A194763FE802217B20C9023FEA2991F2A979143FEBD626C0B5B6060161016C3FE32873061674B23FE614455CF090B63FE897C14969667D3FEA9FE5053A45203FEC2F7D5A8A79C9016201693FEC8247621BC0C83FED9291DDB596F83FEE54C20D06AA953FEEDC99CF2C9D4D3FEF3A59F801F5820162016A3FECCED80FEF12023FEDC99E39374D9E3FEE7B7CBC36FABD3FEEF76F8069F3FA3FEF4CBFA61DE6A30162016B3FED15854CD0D92B3FEDFC1F4CE6E8223FEE9EDD88B9D8AF3FEF0FDFCBF19A933FEF5D77DCF758080162016C3FED56A636946E583FEE2A667D67D08C3FEEBF2786AED6983FEF261E0FCD4B463FEF6CA82F0DE1EA016301693FEF7A732E4B69463FEFA5FEB616FE8F3FEFC372D07518CD3FEFD74FDCAB1CF83FEFE4AE66F5A36A0163016A3FEF86F89C2183AF3FEFAE798F0E40823FEFC92C130538E23FEFDB2AA1BA3C6B3FEFE745EC1330750163016B3FEF925599378CD23FEFB629BE21D26E3FEFCE5BACD8BFA43FEFDEA84D73D7203FEFE99EA9BBCE220163016C3FEF9CA4D40C82163FEFBD21D8FB11A83FEFD30E65B4D32F3FEFE1D196C3E1BA3FEFEBBE888D0581"},"result":{"expect":"0x03020178017A010179050C016101693FF04A292B02A0753FECC3E9DFD275683FE8F5574FE8BE1B3FE556069E9D4DC33FE205FBD106D6FF0161016A3FEFA2DD25F534F13FEBCE2484AAE47C3FE8079235D8AAA83FE479ABC37FED283FE140A901FC29FC0161016B3FEEAF1748E5C5A33FEAD94D1BC729013FE71D6AB318C1A43FE3A2B1FFA9ACBD3FE0818C4C49E6000161016C3FEDB9D521101D5B3FE9E6224E17FF153FE637693F4D0FF83FE2D1637843BBA63FDF917686EAB745016201693FDE2C81C389C2013FD916BE363A9F533FD4C2BFB00C3DED3FD11F15F768EB5E3FCC2CA22A0EE4170162016A3FDCD43D3F9685023FD7F025BA663A7B3FD3CA1AB319300C3FD04F3D93EFE0D83FCAD37674967B890162016B3FDB889B1118E1B43FD6D57790AAB7303FD2DC2BF21514323FCF117519C78DC23FC98A394C771A6F0162016C3FDA497E8A09BFC33FD5C66EA04F51FB3FD1F89D1170130D3FCD9667A24F622C3FC850430F622CA1016301693FC724F01E47BA963FC2FDDA4965FAE03FBF252824EA1FB13FB986837088B6803FB4E9A9D6E60AEF0163016A3FC607A135043F403FC212C19955C5183FBDA286FC8144963FB8490BF70598723FB3E53C6A1D177C0163016B3FC4F7BBACDB21753FC132D8BBDFCDD73FBC32720D67200C3FB71AE49C9BAF6C3FB2ED6A86D26E420163016C3FC3F4A9ACA8726D3FC05D9DD7F195CC3FBAD40CAC114FED3FB5FB543913F3723FB2019A17CC06C7"}}
+{"expression":"asin(a)","inputs":{"a":"0x02003FE0CCA12729AFB8"},"result":{"expect":"0x02003FE1AFA452831947"}}
+{"expression":"asin(a)","inputs":{"a":"0x02010178033FE0CCA12729AFB83FE1983D7795F4143FE261D545E46A8B"},"result":{"expect":"0x02010178033FE1AFA4528319473FE2A119829325403FE394DF5FA2948D"}}
+{"expression":"asin(a)","inputs":{"a":"0x02020178030179053FE0CCA12729AFB83FE1983D7795F4143FE261D545E46A8B3FE32873061674B23FE3EB2FD4D343913FE4A93769F6453E3FE561CB52A194763FE614455CF090B63FE6C0192BDC382E3FE764D4F5D5A2BD3FE802217B20C9023FE897C14969667D3FE9258F68070E5E3FE9AB7D8BD797483FEA2991F2A97914"},"result":{"expect":"0x02020178030179053FE1AFA4528319473FE2A119829325403FE394DF5FA2948D3FE48A2187783CD63FE5800CC8B5E4C93FE675D223DD75B43FE76AA98CC1312F3FE85DD45A705B1B3FE94E9F589F9C163FEA3C6472AFAF883FEB268BF56F988D3FEC0C8D693B4A383FECEDF009EB0C6D3FEDCA4AE5086D093FEEA144A8DEAD73"}}
+{"expression":"asin(a)","inputs":{"a":"0x0203017803017905017A073FE0CCA12729AFB83FE1983D7795F4143FE261D545E46A8B3FE32873061674B23FE3EB2FD4D343913FE4A93769F6453E3FE561CB52A194763FE614455CF090B63FE6C0192BDC382E3FE764D4F5D5A2BD3FE802217B20C9023FE897C14969667D3FE9258F68070E5E3FE9AB7D8BD797483FEA2991F2A979143FEA9FE5053A45203FEB0E9EDC4324D83FEB75F4C16B302F3FEBD626C0B5B6063FEC2F7D5A8A79C93FEC8247621BC0C83FECCED80FEF12023FED15854CD0D92B3FED56A636946E583FED9291DDB596F83FEDC99E39374D9E3FEDFC1F4CE6E8223FEE2A667D67D08C3FEE54C20D06AA953FEE7B7CBC36FABD3FEE9EDD88B9D8AF3FEEBF2786AED6983FEEDC99CF2C9D4D3FEEF76F8069F3FA3FEF0FDFCBF19A933FEF261E0FCD4B463FEF3A59F801F5823FEF4CBFA61DE6A33FEF5D77DCF758083FEF6CA82F0DE1EA3FEF7A732E4B69463FEF86F89C2183AF3FEF925599378CD23FEF9CA4D40C82163FEFA5FEB616FE8F3FEFAE798F0E40823FEFB629BE21D26E3FEFBD21D8FB11A83FEFC372D07518CD3FEFC92C130538E23FEFCE5BACD8BFA43FEFD30E65B4D32F3FEFD74FDCAB1CF83FEFDB2AA1BA3C6B3FEFDEA84D73D7203FEFE1D196C3E1BA3FEFE4AE66F5A36A3FEFE745EC1330753FEFE99EA9BBCE223FEFEBBE888D05813FEFEDAAE43934F83FEFEF68986548923FEFF0FC0C65F7393FEFF2693DF385C93FEFF3B3CAE9A9D03FEFF4DEFA27BE023FEFF5EDC3A4177B3FEFF6E2D7C3F19D3FEFF7C0A60819EE3FEFF889631D483C3FEFF93F0E5DE28B3FEFF9E376D1D14B3FEFFA783FB7FEAC3FEFFAFEE4A424463FEFFB78BD3AA3B93FEFFBE7009351453FEFFC4AC84B51D53FEFFCA5134D77C33FEFFCF6C857E1CB3FEFFD40B84505A23FEFFD83A01DC2373FEFFDC02AF994433FEFFDF6F3B191333FEFFE28866A604D3FEFFE5561F907333FEFFE7DF92604AB3FEFFEA2B3D1E27B3FEFFEC3EFFE1C633FEFFEE202BCF6283FEFFEFD390A9CC13FEFFF15D891B6543FEFFF2C205D51B73FEFFF404979F78F3FEFFF52878775093FEFFF63093CD1D33FEFFF71F8DFC0623FEFFF7F7CB0B7D23FEFFF8BB74CCA603FEFFF96C80631433FEFFFA0CB346F893FEFFFA9DA7CD7F33FEFFFB20D142ED33FEFFFB977FA0F2F3FEFFFC02E2EAAC43FEFFFC640E36E19"},"result":{"expect":"0x0203017803017905017A073FE1AFA4528319473FE2A119829325403FE394DF5FA2948D3FE48A2187783CD63FE5800CC8B5E4C93FE675D223DD75B43FE76AA98CC1312F3FE85DD45A705B1B3FE94E9F589F9C163FEA3C6472AFAF883FEB268BF56F988D3FEC0C8D693B4A383FECEDF009EB0C6D3FEDCA4AE5086D093FEEA144A8DEAD733FEF729330449E8A3FF01EFD6BC0C1993FF081A6D346181A3FF0E1352E1F3A183FF13D9DB2897F473FF196DAE361BC983FF1ECEC045E8BD83FF23FD48FFDF4AB3FF28F9BB1C1BD283FF2DC4BC6B585443FF325F1E5AA9E7A3FF36C9D70197F4C3FF3B05FAC3058993FF3F14B68411D9D3FF42F74A77DE1153FF46AF057BEE80C3FF4A3D40FE828553FF4DA35D669F2413FF50E2BEF4834E23FF53FCCB10B3B603FF56F2E5FFA40D33FF59C670F0250953FF5C78C85B15DA73FF5F0B42AB549CA3FF617F2F257E7843FF63D5D507B35C63FF661072DA3A5303FF68303DEA8C8EA3FF6A3661EAF1ECB3FF6C2400B176DBC3FF6DFA3211974753FF6FBA03CC8335D3FF716479945FA5F3FF72FA8D1F58B1D3FF747D2E47C18CF3FF75ED4336DBB173FF774BA898318193FF789931D3BA1B03FF79D6A94D3D3913FF7B04D0A7A72223FF7C24610B2EDE13FF7D360B6D5CC693FF7E3A78DA25BA13FF7F324ABD706343FF801E1B2C76CAC3FF80FE7D2E8F2583FF81D3FD04FC3FF3FF829F2071781DF3FF836066FB3B38E3FF84184A32500613FF84C73DF10DE043FF856DB09BA010D3FF860C0B5D85D5B3FF86A2B264FF11C3FF8732051C5F1A43FF87BA5E6143BD33FF883C14B9B2A713FF88B77A87226443FF892CDE3776F443FF899C8A73FBEA83FF8A06C64E67C0A3FF8A6BD56BF54D03FF8ACBF82EA14C93FF8B276BDC9A8B83FF8B7E6AC5F3CAC3FF8BD12C68A6B7E3FF8C1FE592F78D23FF8C6AC88448C6B3FF8CB2050C6E5343FF8CF5C8A98F9163FF8D363EA4A705B3FF8D73902CAE6F13FF8DADE470858E83FF8DE560B7A18E03FF8E1A2879929653FF8E4C5D746C8803FF8E7C1FC21FA833FF8EA98DECCD6033FF8ED4C50224D743FF8EFDE0A5D29D53FF8F24FB230E8373FF8F4A2D7D51C003FF8F6D8F803FBCD3FF8F8F37CECAB173FF8FAF3BF19DBFC3FF8FCDB064D4DC73FF8FEAA8A50B5B23FF9006373BC8C953FF90206DCB53F5B3FF90395D19F3772"}}
+{"expression":"asin(a)","inputs":{"a":"0x010101780301613FE0CCA12729AFB801623FE1983D7795F41401633FE261D545E46A8B"},"result":{"expect":"0x010101780301613FE1AFA45283194701623FE2A1198293254001633FE394DF5FA2948D"}}
+{"expression":"asin(a)","inputs":{"a":"0x010201780179060161036261723FE1983D7795F414016103666F6F3FE0CCA12729AFB80162036261723FE32873061674B2016203666F6F3FE261D545E46A8B0163036261723FE4A93769F6453E016303666F6F3FE3EB2FD4D34391"},"result":{"expect":"0x010201780179060161036261723FE2A11982932540016103666F6F3FE1AFA4528319470162036261723FE48A2187783CD6016203666F6F3FE394DF5FA2948D0163036261723FE675D223DD75B4016303666F6F3FE5800CC8B5E4C9"}}
+{"expression":"asin(a)","inputs":{"a":"0x010301780179017A1801610362617201693FE3EB2FD4D34391016103626172016A3FE4A93769F6453E016103626172016B3FE561CB52A19476016103626172016C3FE614455CF090B6016103666F6F01693FE0CCA12729AFB8016103666F6F016A3FE1983D7795F414016103666F6F016B3FE261D545E46A8B016103666F6F016C3FE32873061674B201620362617201693FE9258F68070E5E016203626172016A3FE9AB7D8BD79748016203626172016B3FEA2991F2A97914016203626172016C3FEA9FE5053A4520016203666F6F01693FE6C0192BDC382E016203666F6F016A3FE764D4F5D5A2BD016203666F6F016B3FE802217B20C902016203666F6F016C3FE897C14969667D01630362617201693FEC8247621BC0C8016303626172016A3FECCED80FEF1202016303626172016B3FED15854CD0D92B016303626172016C3FED56A636946E58016303666F6F01693FEB0E9EDC4324D8016303666F6F016A3FEB75F4C16B302F016303666F6F016B3FEBD626C0B5B606016303666F6F016C3FEC2F7D5A8A79C9"},"result":{"expect":"0x010301780179017A1801610362617201693FE5800CC8B5E4C9016103626172016A3FE675D223DD75B4016103626172016B3FE76AA98CC1312F016103626172016C3FE85DD45A705B1B016103666F6F01693FE1AFA452831947016103666F6F016A3FE2A11982932540016103666F6F016B3FE394DF5FA2948D016103666F6F016C3FE48A2187783CD601620362617201693FECEDF009EB0C6D016203626172016A3FEDCA4AE5086D09016203626172016B3FEEA144A8DEAD73016203626172016C3FEF729330449E8A016203666F6F01693FE94E9F589F9C16016203666F6F016A3FEA3C6472AFAF88016203666F6F016B3FEB268BF56F988D016203666F6F016C3FEC0C8D693B4A3801630362617201693FF196DAE361BC98016303626172016A3FF1ECEC045E8BD8016303626172016B3FF23FD48FFDF4AB016303626172016C3FF28F9BB1C1BD28016303666F6F01693FF01EFD6BC0C199016303666F6F016A3FF081A6D346181A016303666F6F016B3FF0E1352E1F3A18016303666F6F016C3FF13D9DB2897F47"}}
+{"expression":"asin(a)","inputs":{"a":"0x0301017902017803017A0702036261723FE614455CF090B63FE6C0192BDC382E3FE764D4F5D5A2BD3FE802217B20C9023FE897C14969667D3FE9258F68070E5E3FE9AB7D8BD797483FECCED80FEF12023FED15854CD0D92B3FED56A636946E583FED9291DDB596F83FEDC99E39374D9E3FEDFC1F4CE6E8223FEE2A667D67D08C3FEF261E0FCD4B463FEF3A59F801F5823FEF4CBFA61DE6A33FEF5D77DCF758083FEF6CA82F0DE1EA3FEF7A732E4B69463FEF86F89C2183AF03666F6F3FE0CCA12729AFB83FE1983D7795F4143FE261D545E46A8B3FE32873061674B23FE3EB2FD4D343913FE4A93769F6453E3FE561CB52A194763FEA2991F2A979143FEA9FE5053A45203FEB0E9EDC4324D83FEB75F4C16B302F3FEBD626C0B5B6063FEC2F7D5A8A79C93FEC8247621BC0C83FEE54C20D06AA953FEE7B7CBC36FABD3FEE9EDD88B9D8AF3FEEBF2786AED6983FEEDC99CF2C9D4D3FEEF76F8069F3FA3FEF0FDFCBF19A93"},"result":{"expect":"0x0301017902017803017A0702036261723FE85DD45A705B1B3FE94E9F589F9C163FEA3C6472AFAF883FEB268BF56F988D3FEC0C8D693B4A383FECEDF009EB0C6D3FEDCA4AE5086D093FF1ECEC045E8BD83FF23FD48FFDF4AB3FF28F9BB1C1BD283FF2DC4BC6B585443FF325F1E5AA9E7A3FF36C9D70197F4C3FF3B05FAC3058993FF56F2E5FFA40D33FF59C670F0250953FF5C78C85B15DA73FF5F0B42AB549CA3FF617F2F257E7843FF63D5D507B35C63FF661072DA3A53003666F6F3FE1AFA4528319473FE2A119829325403FE394DF5FA2948D3FE48A2187783CD63FE5800CC8B5E4C93FE675D223DD75B43FE76AA98CC1312F3FEEA144A8DEAD733FEF729330449E8A3FF01EFD6BC0C1993FF081A6D346181A3FF0E1352E1F3A183FF13D9DB2897F473FF196DAE361BC983FF3F14B68411D9D3FF42F74A77DE1153FF46AF057BEE80C3FF4A3D40FE828553FF4DA35D669F2413FF50E2BEF4834E23FF53FCCB10B3B60"}}
+{"expression":"asin(a)","inputs":{"a":"0x03020178017A010179050C016101693FE0CCA12729AFB83FE3EB2FD4D343913FE6C0192BDC382E3FE9258F68070E5E3FEB0E9EDC4324D80161016A3FE1983D7795F4143FE4A93769F6453E3FE764D4F5D5A2BD3FE9AB7D8BD797483FEB75F4C16B302F0161016B3FE261D545E46A8B3FE561CB52A194763FE802217B20C9023FEA2991F2A979143FEBD626C0B5B6060161016C3FE32873061674B23FE614455CF090B63FE897C14969667D3FEA9FE5053A45203FEC2F7D5A8A79C9016201693FEC8247621BC0C83FED9291DDB596F83FEE54C20D06AA953FEEDC99CF2C9D4D3FEF3A59F801F5820162016A3FECCED80FEF12023FEDC99E39374D9E3FEE7B7CBC36FABD3FEEF76F8069F3FA3FEF4CBFA61DE6A30162016B3FED15854CD0D92B3FEDFC1F4CE6E8223FEE9EDD88B9D8AF3FEF0FDFCBF19A933FEF5D77DCF758080162016C3FED56A636946E583FEE2A667D67D08C3FEEBF2786AED6983FEF261E0FCD4B463FEF6CA82F0DE1EA016301693FEF7A732E4B69463FEFA5FEB616FE8F3FEFC372D07518CD3FEFD74FDCAB1CF83FEFE4AE66F5A36A0163016A3FEF86F89C2183AF3FEFAE798F0E40823FEFC92C130538E23FEFDB2AA1BA3C6B3FEFE745EC1330750163016B3FEF925599378CD23FEFB629BE21D26E3FEFCE5BACD8BFA43FEFDEA84D73D7203FEFE99EA9BBCE220163016C3FEF9CA4D40C82163FEFBD21D8FB11A83FEFD30E65B4D32F3FEFE1D196C3E1BA3FEFEBBE888D0581"},"result":{"expect":"0x03020178017A010179050C016101693FE1AFA4528319473FE5800CC8B5E4C93FE94E9F589F9C163FECEDF009EB0C6D3FF01EFD6BC0C1990161016A3FE2A119829325403FE675D223DD75B43FEA3C6472AFAF883FEDCA4AE5086D093FF081A6D346181A0161016B3FE394DF5FA2948D3FE76AA98CC1312F3FEB268BF56F988D3FEEA144A8DEAD733FF0E1352E1F3A180161016C3FE48A2187783CD63FE85DD45A705B1B3FEC0C8D693B4A383FEF729330449E8A3FF13D9DB2897F47016201693FF196DAE361BC983FF2DC4BC6B585443FF3F14B68411D9D3FF4DA35D669F2413FF59C670F0250950162016A3FF1ECEC045E8BD83FF325F1E5AA9E7A3FF42F74A77DE1153FF50E2BEF4834E23FF5C78C85B15DA70162016B3FF23FD48FFDF4AB3FF36C9D70197F4C3FF46AF057BEE80C3FF53FCCB10B3B603FF5F0B42AB549CA0162016C3FF28F9BB1C1BD283FF3B05FAC3058993FF4A3D40FE828553FF56F2E5FFA40D33FF617F2F257E784016301693FF63D5D507B35C63FF6C2400B176DBC3FF72FA8D1F58B1D3FF789931D3BA1B03FF7D360B6D5CC690163016A3FF661072DA3A5303FF6DFA3211974753FF747D2E47C18CF3FF79D6A94D3D3913FF7E3A78DA25BA10163016B3FF68303DEA8C8EA3FF6FBA03CC8335D3FF75ED4336DBB173FF7B04D0A7A72223FF7F324ABD706340163016C3FF6A3661EAF1ECB3FF716479945FA5F3FF774BA898318193FF7C24610B2EDE13FF801E1B2C76CAC"}}
+{"expression":"map(a,f(a)(asin(a)))","inputs":{"a":"0x02003FE0CCA12729AFB8"},"result":{"expect":"0x02003FE1AFA452831947"}}
+{"expression":"map(a,f(a)(asin(a)))","inputs":{"a":"0x02010178033FE0CCA12729AFB83FE1983D7795F4143FE261D545E46A8B"},"result":{"expect":"0x02010178033FE1AFA4528319473FE2A119829325403FE394DF5FA2948D"}}
+{"expression":"map(a,f(a)(asin(a)))","inputs":{"a":"0x02020178030179053FE0CCA12729AFB83FE1983D7795F4143FE261D545E46A8B3FE32873061674B23FE3EB2FD4D343913FE4A93769F6453E3FE561CB52A194763FE614455CF090B63FE6C0192BDC382E3FE764D4F5D5A2BD3FE802217B20C9023FE897C14969667D3FE9258F68070E5E3FE9AB7D8BD797483FEA2991F2A97914"},"result":{"expect":"0x02020178030179053FE1AFA4528319473FE2A119829325403FE394DF5FA2948D3FE48A2187783CD63FE5800CC8B5E4C93FE675D223DD75B43FE76AA98CC1312F3FE85DD45A705B1B3FE94E9F589F9C163FEA3C6472AFAF883FEB268BF56F988D3FEC0C8D693B4A383FECEDF009EB0C6D3FEDCA4AE5086D093FEEA144A8DEAD73"}}
+{"expression":"map(a,f(a)(asin(a)))","inputs":{"a":"0x0203017803017905017A073FE0CCA12729AFB83FE1983D7795F4143FE261D545E46A8B3FE32873061674B23FE3EB2FD4D343913FE4A93769F6453E3FE561CB52A194763FE614455CF090B63FE6C0192BDC382E3FE764D4F5D5A2BD3FE802217B20C9023FE897C14969667D3FE9258F68070E5E3FE9AB7D8BD797483FEA2991F2A979143FEA9FE5053A45203FEB0E9EDC4324D83FEB75F4C16B302F3FEBD626C0B5B6063FEC2F7D5A8A79C93FEC8247621BC0C83FECCED80FEF12023FED15854CD0D92B3FED56A636946E583FED9291DDB596F83FEDC99E39374D9E3FEDFC1F4CE6E8223FEE2A667D67D08C3FEE54C20D06AA953FEE7B7CBC36FABD3FEE9EDD88B9D8AF3FEEBF2786AED6983FEEDC99CF2C9D4D3FEEF76F8069F3FA3FEF0FDFCBF19A933FEF261E0FCD4B463FEF3A59F801F5823FEF4CBFA61DE6A33FEF5D77DCF758083FEF6CA82F0DE1EA3FEF7A732E4B69463FEF86F89C2183AF3FEF925599378CD23FEF9CA4D40C82163FEFA5FEB616FE8F3FEFAE798F0E40823FEFB629BE21D26E3FEFBD21D8FB11A83FEFC372D07518CD3FEFC92C130538E23FEFCE5BACD8BFA43FEFD30E65B4D32F3FEFD74FDCAB1CF83FEFDB2AA1BA3C6B3FEFDEA84D73D7203FEFE1D196C3E1BA3FEFE4AE66F5A36A3FEFE745EC1330753FEFE99EA9BBCE223FEFEBBE888D05813FEFEDAAE43934F83FEFEF68986548923FEFF0FC0C65F7393FEFF2693DF385C93FEFF3B3CAE9A9D03FEFF4DEFA27BE023FEFF5EDC3A4177B3FEFF6E2D7C3F19D3FEFF7C0A60819EE3FEFF889631D483C3FEFF93F0E5DE28B3FEFF9E376D1D14B3FEFFA783FB7FEAC3FEFFAFEE4A424463FEFFB78BD3AA3B93FEFFBE7009351453FEFFC4AC84B51D53FEFFCA5134D77C33FEFFCF6C857E1CB3FEFFD40B84505A23FEFFD83A01DC2373FEFFDC02AF994433FEFFDF6F3B191333FEFFE28866A604D3FEFFE5561F907333FEFFE7DF92604AB3FEFFEA2B3D1E27B3FEFFEC3EFFE1C633FEFFEE202BCF6283FEFFEFD390A9CC13FEFFF15D891B6543FEFFF2C205D51B73FEFFF404979F78F3FEFFF52878775093FEFFF63093CD1D33FEFFF71F8DFC0623FEFFF7F7CB0B7D23FEFFF8BB74CCA603FEFFF96C80631433FEFFFA0CB346F893FEFFFA9DA7CD7F33FEFFFB20D142ED33FEFFFB977FA0F2F3FEFFFC02E2EAAC43FEFFFC640E36E19"},"result":{"expect":"0x0203017803017905017A073FE1AFA4528319473FE2A119829325403FE394DF5FA2948D3FE48A2187783CD63FE5800CC8B5E4C93FE675D223DD75B43FE76AA98CC1312F3FE85DD45A705B1B3FE94E9F589F9C163FEA3C6472AFAF883FEB268BF56F988D3FEC0C8D693B4A383FECEDF009EB0C6D3FEDCA4AE5086D093FEEA144A8DEAD733FEF729330449E8A3FF01EFD6BC0C1993FF081A6D346181A3FF0E1352E1F3A183FF13D9DB2897F473FF196DAE361BC983FF1ECEC045E8BD83FF23FD48FFDF4AB3FF28F9BB1C1BD283FF2DC4BC6B585443FF325F1E5AA9E7A3FF36C9D70197F4C3FF3B05FAC3058993FF3F14B68411D9D3FF42F74A77DE1153FF46AF057BEE80C3FF4A3D40FE828553FF4DA35D669F2413FF50E2BEF4834E23FF53FCCB10B3B603FF56F2E5FFA40D33FF59C670F0250953FF5C78C85B15DA73FF5F0B42AB549CA3FF617F2F257E7843FF63D5D507B35C63FF661072DA3A5303FF68303DEA8C8EA3FF6A3661EAF1ECB3FF6C2400B176DBC3FF6DFA3211974753FF6FBA03CC8335D3FF716479945FA5F3FF72FA8D1F58B1D3FF747D2E47C18CF3FF75ED4336DBB173FF774BA898318193FF789931D3BA1B03FF79D6A94D3D3913FF7B04D0A7A72223FF7C24610B2EDE13FF7D360B6D5CC693FF7E3A78DA25BA13FF7F324ABD706343FF801E1B2C76CAC3FF80FE7D2E8F2583FF81D3FD04FC3FF3FF829F2071781DF3FF836066FB3B38E3FF84184A32500613FF84C73DF10DE043FF856DB09BA010D3FF860C0B5D85D5B3FF86A2B264FF11C3FF8732051C5F1A43FF87BA5E6143BD33FF883C14B9B2A713FF88B77A87226443FF892CDE3776F443FF899C8A73FBEA83FF8A06C64E67C0A3FF8A6BD56BF54D03FF8ACBF82EA14C93FF8B276BDC9A8B83FF8B7E6AC5F3CAC3FF8BD12C68A6B7E3FF8C1FE592F78D23FF8C6AC88448C6B3FF8CB2050C6E5343FF8CF5C8A98F9163FF8D363EA4A705B3FF8D73902CAE6F13FF8DADE470858E83FF8DE560B7A18E03FF8E1A2879929653FF8E4C5D746C8803FF8E7C1FC21FA833FF8EA98DECCD6033FF8ED4C50224D743FF8EFDE0A5D29D53FF8F24FB230E8373FF8F4A2D7D51C003FF8F6D8F803FBCD3FF8F8F37CECAB173FF8FAF3BF19DBFC3FF8FCDB064D4DC73FF8FEAA8A50B5B23FF9006373BC8C953FF90206DCB53F5B3FF90395D19F3772"}}
+{"expression":"map(a,f(a)(asin(a)))","inputs":{"a":"0x010101780301613FE0CCA12729AFB801623FE1983D7795F41401633FE261D545E46A8B"},"result":{"expect":"0x010101780301613FE1AFA45283194701623FE2A1198293254001633FE394DF5FA2948D"}}
+{"expression":"map(a,f(a)(asin(a)))","inputs":{"a":"0x010201780179060161036261723FE1983D7795F414016103666F6F3FE0CCA12729AFB80162036261723FE32873061674B2016203666F6F3FE261D545E46A8B0163036261723FE4A93769F6453E016303666F6F3FE3EB2FD4D34391"},"result":{"expect":"0x010201780179060161036261723FE2A11982932540016103666F6F3FE1AFA4528319470162036261723FE48A2187783CD6016203666F6F3FE394DF5FA2948D0163036261723FE675D223DD75B4016303666F6F3FE5800CC8B5E4C9"}}
+{"expression":"map(a,f(a)(asin(a)))","inputs":{"a":"0x010301780179017A1801610362617201693FE3EB2FD4D34391016103626172016A3FE4A93769F6453E016103626172016B3FE561CB52A19476016103626172016C3FE614455CF090B6016103666F6F01693FE0CCA12729AFB8016103666F6F016A3FE1983D7795F414016103666F6F016B3FE261D545E46A8B016103666F6F016C3FE32873061674B201620362617201693FE9258F68070E5E016203626172016A3FE9AB7D8BD79748016203626172016B3FEA2991F2A97914016203626172016C3FEA9FE5053A4520016203666F6F01693FE6C0192BDC382E016203666F6F016A3FE764D4F5D5A2BD016203666F6F016B3FE802217B20C902016203666F6F016C3FE897C14969667D01630362617201693FEC8247621BC0C8016303626172016A3FECCED80FEF1202016303626172016B3FED15854CD0D92B016303626172016C3FED56A636946E58016303666F6F01693FEB0E9EDC4324D8016303666F6F016A3FEB75F4C16B302F016303666F6F016B3FEBD626C0B5B606016303666F6F016C3FEC2F7D5A8A79C9"},"result":{"expect":"0x010301780179017A1801610362617201693FE5800CC8B5E4C9016103626172016A3FE675D223DD75B4016103626172016B3FE76AA98CC1312F016103626172016C3FE85DD45A705B1B016103666F6F01693FE1AFA452831947016103666F6F016A3FE2A11982932540016103666F6F016B3FE394DF5FA2948D016103666F6F016C3FE48A2187783CD601620362617201693FECEDF009EB0C6D016203626172016A3FEDCA4AE5086D09016203626172016B3FEEA144A8DEAD73016203626172016C3FEF729330449E8A016203666F6F01693FE94E9F589F9C16016203666F6F016A3FEA3C6472AFAF88016203666F6F016B3FEB268BF56F988D016203666F6F016C3FEC0C8D693B4A3801630362617201693FF196DAE361BC98016303626172016A3FF1ECEC045E8BD8016303626172016B3FF23FD48FFDF4AB016303626172016C3FF28F9BB1C1BD28016303666F6F01693FF01EFD6BC0C199016303666F6F016A3FF081A6D346181A016303666F6F016B3FF0E1352E1F3A18016303666F6F016C3FF13D9DB2897F47"}}
+{"expression":"map(a,f(a)(asin(a)))","inputs":{"a":"0x0301017902017803017A0702036261723FE614455CF090B63FE6C0192BDC382E3FE764D4F5D5A2BD3FE802217B20C9023FE897C14969667D3FE9258F68070E5E3FE9AB7D8BD797483FECCED80FEF12023FED15854CD0D92B3FED56A636946E583FED9291DDB596F83FEDC99E39374D9E3FEDFC1F4CE6E8223FEE2A667D67D08C3FEF261E0FCD4B463FEF3A59F801F5823FEF4CBFA61DE6A33FEF5D77DCF758083FEF6CA82F0DE1EA3FEF7A732E4B69463FEF86F89C2183AF03666F6F3FE0CCA12729AFB83FE1983D7795F4143FE261D545E46A8B3FE32873061674B23FE3EB2FD4D343913FE4A93769F6453E3FE561CB52A194763FEA2991F2A979143FEA9FE5053A45203FEB0E9EDC4324D83FEB75F4C16B302F3FEBD626C0B5B6063FEC2F7D5A8A79C93FEC8247621BC0C83FEE54C20D06AA953FEE7B7CBC36FABD3FEE9EDD88B9D8AF3FEEBF2786AED6983FEEDC99CF2C9D4D3FEEF76F8069F3FA3FEF0FDFCBF19A93"},"result":{"expect":"0x0301017902017803017A0702036261723FE85DD45A705B1B3FE94E9F589F9C163FEA3C6472AFAF883FEB268BF56F988D3FEC0C8D693B4A383FECEDF009EB0C6D3FEDCA4AE5086D093FF1ECEC045E8BD83FF23FD48FFDF4AB3FF28F9BB1C1BD283FF2DC4BC6B585443FF325F1E5AA9E7A3FF36C9D70197F4C3FF3B05FAC3058993FF56F2E5FFA40D33FF59C670F0250953FF5C78C85B15DA73FF5F0B42AB549CA3FF617F2F257E7843FF63D5D507B35C63FF661072DA3A53003666F6F3FE1AFA4528319473FE2A119829325403FE394DF5FA2948D3FE48A2187783CD63FE5800CC8B5E4C93FE675D223DD75B43FE76AA98CC1312F3FEEA144A8DEAD733FEF729330449E8A3FF01EFD6BC0C1993FF081A6D346181A3FF0E1352E1F3A183FF13D9DB2897F473FF196DAE361BC983FF3F14B68411D9D3FF42F74A77DE1153FF46AF057BEE80C3FF4A3D40FE828553FF4DA35D669F2413FF50E2BEF4834E23FF53FCCB10B3B60"}}
+{"expression":"map(a,f(a)(asin(a)))","inputs":{"a":"0x03020178017A010179050C016101693FE0CCA12729AFB83FE3EB2FD4D343913FE6C0192BDC382E3FE9258F68070E5E3FEB0E9EDC4324D80161016A3FE1983D7795F4143FE4A93769F6453E3FE764D4F5D5A2BD3FE9AB7D8BD797483FEB75F4C16B302F0161016B3FE261D545E46A8B3FE561CB52A194763FE802217B20C9023FEA2991F2A979143FEBD626C0B5B6060161016C3FE32873061674B23FE614455CF090B63FE897C14969667D3FEA9FE5053A45203FEC2F7D5A8A79C9016201693FEC8247621BC0C83FED9291DDB596F83FEE54C20D06AA953FEEDC99CF2C9D4D3FEF3A59F801F5820162016A3FECCED80FEF12023FEDC99E39374D9E3FEE7B7CBC36FABD3FEEF76F8069F3FA3FEF4CBFA61DE6A30162016B3FED15854CD0D92B3FEDFC1F4CE6E8223FEE9EDD88B9D8AF3FEF0FDFCBF19A933FEF5D77DCF758080162016C3FED56A636946E583FEE2A667D67D08C3FEEBF2786AED6983FEF261E0FCD4B463FEF6CA82F0DE1EA016301693FEF7A732E4B69463FEFA5FEB616FE8F3FEFC372D07518CD3FEFD74FDCAB1CF83FEFE4AE66F5A36A0163016A3FEF86F89C2183AF3FEFAE798F0E40823FEFC92C130538E23FEFDB2AA1BA3C6B3FEFE745EC1330750163016B3FEF925599378CD23FEFB629BE21D26E3FEFCE5BACD8BFA43FEFDEA84D73D7203FEFE99EA9BBCE220163016C3FEF9CA4D40C82163FEFBD21D8FB11A83FEFD30E65B4D32F3FEFE1D196C3E1BA3FEFEBBE888D0581"},"result":{"expect":"0x03020178017A010179050C016101693FE1AFA4528319473FE5800CC8B5E4C93FE94E9F589F9C163FECEDF009EB0C6D3FF01EFD6BC0C1990161016A3FE2A119829325403FE675D223DD75B43FEA3C6472AFAF883FEDCA4AE5086D093FF081A6D346181A0161016B3FE394DF5FA2948D3FE76AA98CC1312F3FEB268BF56F988D3FEEA144A8DEAD733FF0E1352E1F3A180161016C3FE48A2187783CD63FE85DD45A705B1B3FEC0C8D693B4A383FEF729330449E8A3FF13D9DB2897F47016201693FF196DAE361BC983FF2DC4BC6B585443FF3F14B68411D9D3FF4DA35D669F2413FF59C670F0250950162016A3FF1ECEC045E8BD83FF325F1E5AA9E7A3FF42F74A77DE1153FF50E2BEF4834E23FF5C78C85B15DA70162016B3FF23FD48FFDF4AB3FF36C9D70197F4C3FF46AF057BEE80C3FF53FCCB10B3B603FF5F0B42AB549CA0162016C3FF28F9BB1C1BD283FF3B05FAC3058993FF4A3D40FE828553FF56F2E5FFA40D33FF617F2F257E784016301693FF63D5D507B35C63FF6C2400B176DBC3FF72FA8D1F58B1D3FF789931D3BA1B03FF7D360B6D5CC690163016A3FF661072DA3A5303FF6DFA3211974753FF747D2E47C18CF3FF79D6A94D3D3913FF7E3A78DA25BA10163016B3FF68303DEA8C8EA3FF6FBA03CC8335D3FF75ED4336DBB173FF7B04D0A7A72223FF7F324ABD706340163016C3FF6A3661EAF1ECB3FF716479945FA5F3FF774BA898318193FF7C24610B2EDE13FF801E1B2C76CAC"}}
+{"expression":"atan(a)","inputs":{"a":"0x02003FB999999999999A"},"result":{"expect":"0x02003FB983E282E2CC4D"}}
+{"expression":"atan(a)","inputs":{"a":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FB983E282E2CC4D3FC94441F8F7260C3FD2A73A661EAF06"}}
+{"expression":"atan(a)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178030179053FB983E282E2CC4D3FC94441F8F7260C3FD2A73A661EAF063FD85A376B677DC03FDDAC670561BB4F3FE14B1DD5F90CE13FE38B112D7BD4AD3FE5977A5103EA933FE77338A80603BE3FE921FB54442D183FEAA7C8545183CD3FEC08AAE496EFA63FED488143AD8C443FEE6AE1355353CF3FEF730BD281F69B"}}
+{"expression":"atan(a)","inputs":{"a":"0x0203017803017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD4011333333333333401199999999999A401200000000000040126666666666664012CCCCCCCCCCCD4013333333333333401399999999999A401400000000000040146666666666664014CCCCCCCCCCCD4015333333333333401599999999999A401600000000000040166666666666664016CCCCCCCCCCCD4017333333333333401799999999999A401800000000000040186666666666664018CCCCCCCCCCCD4019333333333333401999999999999A401A000000000000401A666666666666401ACCCCCCCCCCCD401B333333333333401B99999999999A401C000000000000401C666666666666401CCCCCCCCCCCCD401D333333333333401D99999999999A401E000000000000401E666666666666401ECCCCCCCCCCCD401F333333333333401F99999999999A402000000000000040203333333333334020666666666666402099999999999A4020CCCCCCCCCCCD402100000000000040213333333333334021666666666666402199999999999A4021CCCCCCCCCCCD402200000000000040223333333333334022666666666666402299999999999A4022CCCCCCCCCCCD402300000000000040233333333333334023666666666666402399999999999A4023CCCCCCCCCCCD402400000000000040243333333333334024666666666666402499999999999A4024CCCCCCCCCCCD4025000000000000"},"result":{"expect":"0x0203017803017905017A073FB983E282E2CC4D3FC94441F8F7260C3FD2A73A661EAF063FD85A376B677DC03FDDAC670561BB4F3FE14B1DD5F90CE13FE38B112D7BD4AD3FE5977A5103EA933FE77338A80603BE3FE921FB54442D183FEAA7C8545183CD3FEC08AAE496EFA63FED488143AD8C443FEE6AE1355353CF3FEF730BD281F69B3FF031F57E54ADBE3FF0A00A3BCE369F3FF104E80200BA003FF1618F66769C693FF1B6E192EBBE443FF205A4030058993FF24E83FA9B4E483FF29219A49709A13FF2D0EAD60663953FF30B6D796A4DA83FF34209A8C109803FF3751B7ED2AEC13FF3A4F4A8668B693FF3D1DDBDAD64F03FF3FC176B7A85603FF423DB7312CEBC3FF4495D868232253FF46CCC069C173F3FF48E50A711C89D3FF4AE10FC6589A53FF4CC2EF6F1A7103FF4E8C94DBF54E53FF503FBDB7F996E3FF51DDFEF9EBC943FF5368C951E9CFD3FF54E16D0A3F5133FF56491D6EC41CD3FF57A0F3CB41AD73FF58E9F20EF0D553FF5A25052114E603FF5B5306F0FEB7C3FF5C74C04A4AF413FF5D8AEA74F117A3FF5E9630A7AAA8E3FF5F973152548573FF608E7F45288B83FF617CA2B906EFA3FF62621A3C77CB43FF633F5B889326A3FF6414D44094C7C3FF64E2EA9E86D153FF65A9FE0F207753FF666A67BEB2F363FF67247B18C4D843FF67D8863BC99BD3FF6886D2623789F3FF692FA442186183FF69D33C640FCC23FF6A71D772B60CB3FF6B0BAE830C0703FF6BA0F756B7B143FF6C31E498A4A303FF6CBEA614937203FF6D4768EA1396A3FF6DCC57BB565FD3FF6E4D9AD83DD983FF6ECB5866003F03FF6F45B483AF72D3FF6FBCD16BEBE403FF7030CF94031973FF70A1CDC8B3BC93FF710FE948CB4CC3FF717B3DDDCC9553FF71E3E5F2C979F3FF7249FAA996A213FF72AD93EE7BEE23FF730EC88A816253FF736DAE34754A93FF73CA59A0C5BE23FF7424DE90454D43FF747D4FDDF08893FF74D3BF8BC82613FF75283ECED1D003FF757ADE1A501BE3FF75CBAD2A40BD53FF761ABB0D2EC513FF7668162D6591B3FF76B3CC59900DB3FF76FDEACCCEE113FF77467E364F6013FF778D92C06C36F3FF77D33417601AC3FF78176D6F922013FF785A498B82BF83FF789BD2C1600543FF78DC130046E823FF791B13D53751C3FF7958DE6FBFF433FF79957BA666AB33FF79D0F3FAD1C92"}}
+{"expression":"atan(a)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FB983E282E2CC4D01623FC94441F8F7260C01633FD2A73A661EAF06"}}
+{"expression":"atan(a)","inputs":{"a":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179060161036261723FC94441F8F7260C016103666F6F3FB983E282E2CC4D0162036261723FD85A376B677DC0016203666F6F3FD2A73A661EAF060163036261723FE14B1DD5F90CE1016303666F6F3FDDAC670561BB4F"}}
+{"expression":"atan(a)","inputs":{"a":"0x010301780179017A1801610362617201693FE0000000000000016103626172016A3FE3333333333333016103626172016B3FE6666666666666016103626172016C3FE999999999999A016103666F6F01693FB999999999999A016103666F6F016A3FC999999999999A016103666F6F016B3FD3333333333333016103666F6F016C3FD999999999999A01620362617201693FF4CCCCCCCCCCCD016203626172016A3FF6666666666666016203626172016B3FF8000000000000016203626172016C3FF999999999999A016203666F6F01693FECCCCCCCCCCCCD016203666F6F016A3FF0000000000000016203666F6F016B3FF199999999999A016203666F6F016C3FF333333333333301630362617201694000CCCCCCCCCCCD016303626172016A400199999999999A016303626172016B4002666666666666016303626172016C4003333333333333016303666F6F01693FFB333333333333016303666F6F016A3FFCCCCCCCCCCCCD016303666F6F016B3FFE666666666666016303666F6F016C4000000000000000"},"result":{"expect":"0x010301780179017A1801610362617201693FDDAC670561BB4F016103626172016A3FE14B1DD5F90CE1016103626172016B3FE38B112D7BD4AD016103626172016C3FE5977A5103EA93016103666F6F01693FB983E282E2CC4D016103666F6F016A3FC94441F8F7260C016103666F6F016B3FD2A73A661EAF06016103666F6F016C3FD85A376B677DC001620362617201693FED488143AD8C44016203626172016A3FEE6AE1355353CF016203626172016B3FEF730BD281F69B016203626172016C3FF031F57E54ADBE016203666F6F01693FE77338A80603BE016203666F6F016A3FE921FB54442D18016203666F6F016B3FEAA7C8545183CD016203666F6F016C3FEC08AAE496EFA601630362617201693FF205A403005899016303626172016A3FF24E83FA9B4E48016303626172016B3FF29219A49709A1016303626172016C3FF2D0EAD6066395016303666F6F01693FF0A00A3BCE369F016303666F6F016A3FF104E80200BA00016303666F6F016B3FF1618F66769C69016303666F6F016C3FF1B6E192EBBE44"}}
+{"expression":"atan(a)","inputs":{"a":"0x0301017902017803017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF6666666666666400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD03666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0301017902017803017A0702036261723FE5977A5103EA933FE77338A80603BE3FE921FB54442D183FEAA7C8545183CD3FEC08AAE496EFA63FED488143AD8C443FEE6AE1355353CF3FF24E83FA9B4E483FF29219A49709A13FF2D0EAD60663953FF30B6D796A4DA83FF34209A8C109803FF3751B7ED2AEC13FF3A4F4A8668B693FF4CC2EF6F1A7103FF4E8C94DBF54E53FF503FBDB7F996E3FF51DDFEF9EBC943FF5368C951E9CFD3FF54E16D0A3F5133FF56491D6EC41CD03666F6F3FB983E282E2CC4D3FC94441F8F7260C3FD2A73A661EAF063FD85A376B677DC03FDDAC670561BB4F3FE14B1DD5F90CE13FE38B112D7BD4AD3FEF730BD281F69B3FF031F57E54ADBE3FF0A00A3BCE369F3FF104E80200BA003FF1618F66769C693FF1B6E192EBBE443FF205A4030058993FF3D1DDBDAD64F03FF3FC176B7A85603FF423DB7312CEBC3FF4495D868232253FF46CCC069C173F3FF48E50A711C89D3FF4AE10FC6589A5"}}
+{"expression":"atan(a)","inputs":{"a":"0x03020178017A010179050C016101693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB3333333333330161016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD0161016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE6666666666660161016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000016201694000CCCCCCCCCCCD40040000000000004007333333333333400A666666666666400D99999999999A0162016A400199999999999A4004CCCCCCCCCCCD4008000000000000400B333333333333400E6666666666660162016B4002666666666666400599999999999A4008CCCCCCCCCCCD400C000000000000400F3333333333330162016C40033333333333334006666666666666400999999999999A400CCCCCCCCCCCCD40100000000000000163016940106666666666664012000000000000401399999999999A40153333333333334016CCCCCCCCCCCD0163016A4010CCCCCCCCCCCD40126666666666664014000000000000401599999999999A40173333333333330163016B40113333333333334012CCCCCCCCCCCD40146666666666664016000000000000401799999999999A0163016C401199999999999A40133333333333334014CCCCCCCCCCCD40166666666666664018000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FB983E282E2CC4D3FDDAC670561BB4F3FE77338A80603BE3FED488143AD8C443FF0A00A3BCE369F0161016A3FC94441F8F7260C3FE14B1DD5F90CE13FE921FB54442D183FEE6AE1355353CF3FF104E80200BA000161016B3FD2A73A661EAF063FE38B112D7BD4AD3FEAA7C8545183CD3FEF730BD281F69B3FF1618F66769C690161016C3FD85A376B677DC03FE5977A5103EA933FEC08AAE496EFA63FF031F57E54ADBE3FF1B6E192EBBE44016201693FF205A4030058993FF30B6D796A4DA83FF3D1DDBDAD64F03FF46CCC069C173F3FF4E8C94DBF54E50162016A3FF24E83FA9B4E483FF34209A8C109803FF3FC176B7A85603FF48E50A711C89D3FF503FBDB7F996E0162016B3FF29219A49709A13FF3751B7ED2AEC13FF423DB7312CEBC3FF4AE10FC6589A53FF51DDFEF9EBC940162016C3FF2D0EAD60663953FF3A4F4A8668B693FF4495D868232253FF4CC2EF6F1A7103FF5368C951E9CFD016301693FF54E16D0A3F5133FF5A25052114E603FF5E9630A7AAA8E3FF62621A3C77CB43FF65A9FE0F207750163016A3FF56491D6EC41CD3FF5B5306F0FEB7C3FF5F973152548573FF633F5B889326A3FF666A67BEB2F360163016B3FF57A0F3CB41AD73FF5C74C04A4AF413FF608E7F45288B83FF6414D44094C7C3FF67247B18C4D840163016C3FF58E9F20EF0D553FF5D8AEA74F117A3FF617CA2B906EFA3FF64E2EA9E86D153FF67D8863BC99BD"}}
+{"expression":"map(a,f(a)(atan(a)))","inputs":{"a":"0x02003FB999999999999A"},"result":{"expect":"0x02003FB983E282E2CC4D"}}
+{"expression":"map(a,f(a)(atan(a)))","inputs":{"a":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FB983E282E2CC4D3FC94441F8F7260C3FD2A73A661EAF06"}}
+{"expression":"map(a,f(a)(atan(a)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178030179053FB983E282E2CC4D3FC94441F8F7260C3FD2A73A661EAF063FD85A376B677DC03FDDAC670561BB4F3FE14B1DD5F90CE13FE38B112D7BD4AD3FE5977A5103EA933FE77338A80603BE3FE921FB54442D183FEAA7C8545183CD3FEC08AAE496EFA63FED488143AD8C443FEE6AE1355353CF3FEF730BD281F69B"}}
+{"expression":"map(a,f(a)(atan(a)))","inputs":{"a":"0x0203017803017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD4011333333333333401199999999999A401200000000000040126666666666664012CCCCCCCCCCCD4013333333333333401399999999999A401400000000000040146666666666664014CCCCCCCCCCCD4015333333333333401599999999999A401600000000000040166666666666664016CCCCCCCCCCCD4017333333333333401799999999999A401800000000000040186666666666664018CCCCCCCCCCCD4019333333333333401999999999999A401A000000000000401A666666666666401ACCCCCCCCCCCD401B333333333333401B99999999999A401C000000000000401C666666666666401CCCCCCCCCCCCD401D333333333333401D99999999999A401E000000000000401E666666666666401ECCCCCCCCCCCD401F333333333333401F99999999999A402000000000000040203333333333334020666666666666402099999999999A4020CCCCCCCCCCCD402100000000000040213333333333334021666666666666402199999999999A4021CCCCCCCCCCCD402200000000000040223333333333334022666666666666402299999999999A4022CCCCCCCCCCCD402300000000000040233333333333334023666666666666402399999999999A4023CCCCCCCCCCCD402400000000000040243333333333334024666666666666402499999999999A4024CCCCCCCCCCCD4025000000000000"},"result":{"expect":"0x0203017803017905017A073FB983E282E2CC4D3FC94441F8F7260C3FD2A73A661EAF063FD85A376B677DC03FDDAC670561BB4F3FE14B1DD5F90CE13FE38B112D7BD4AD3FE5977A5103EA933FE77338A80603BE3FE921FB54442D183FEAA7C8545183CD3FEC08AAE496EFA63FED488143AD8C443FEE6AE1355353CF3FEF730BD281F69B3FF031F57E54ADBE3FF0A00A3BCE369F3FF104E80200BA003FF1618F66769C693FF1B6E192EBBE443FF205A4030058993FF24E83FA9B4E483FF29219A49709A13FF2D0EAD60663953FF30B6D796A4DA83FF34209A8C109803FF3751B7ED2AEC13FF3A4F4A8668B693FF3D1DDBDAD64F03FF3FC176B7A85603FF423DB7312CEBC3FF4495D868232253FF46CCC069C173F3FF48E50A711C89D3FF4AE10FC6589A53FF4CC2EF6F1A7103FF4E8C94DBF54E53FF503FBDB7F996E3FF51DDFEF9EBC943FF5368C951E9CFD3FF54E16D0A3F5133FF56491D6EC41CD3FF57A0F3CB41AD73FF58E9F20EF0D553FF5A25052114E603FF5B5306F0FEB7C3FF5C74C04A4AF413FF5D8AEA74F117A3FF5E9630A7AAA8E3FF5F973152548573FF608E7F45288B83FF617CA2B906EFA3FF62621A3C77CB43FF633F5B889326A3FF6414D44094C7C3FF64E2EA9E86D153FF65A9FE0F207753FF666A67BEB2F363FF67247B18C4D843FF67D8863BC99BD3FF6886D2623789F3FF692FA442186183FF69D33C640FCC23FF6A71D772B60CB3FF6B0BAE830C0703FF6BA0F756B7B143FF6C31E498A4A303FF6CBEA614937203FF6D4768EA1396A3FF6DCC57BB565FD3FF6E4D9AD83DD983FF6ECB5866003F03FF6F45B483AF72D3FF6FBCD16BEBE403FF7030CF94031973FF70A1CDC8B3BC93FF710FE948CB4CC3FF717B3DDDCC9553FF71E3E5F2C979F3FF7249FAA996A213FF72AD93EE7BEE23FF730EC88A816253FF736DAE34754A93FF73CA59A0C5BE23FF7424DE90454D43FF747D4FDDF08893FF74D3BF8BC82613FF75283ECED1D003FF757ADE1A501BE3FF75CBAD2A40BD53FF761ABB0D2EC513FF7668162D6591B3FF76B3CC59900DB3FF76FDEACCCEE113FF77467E364F6013FF778D92C06C36F3FF77D33417601AC3FF78176D6F922013FF785A498B82BF83FF789BD2C1600543FF78DC130046E823FF791B13D53751C3FF7958DE6FBFF433FF79957BA666AB33FF79D0F3FAD1C92"}}
+{"expression":"map(a,f(a)(atan(a)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FB983E282E2CC4D01623FC94441F8F7260C01633FD2A73A661EAF06"}}
+{"expression":"map(a,f(a)(atan(a)))","inputs":{"a":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179060161036261723FC94441F8F7260C016103666F6F3FB983E282E2CC4D0162036261723FD85A376B677DC0016203666F6F3FD2A73A661EAF060163036261723FE14B1DD5F90CE1016303666F6F3FDDAC670561BB4F"}}
+{"expression":"map(a,f(a)(atan(a)))","inputs":{"a":"0x010301780179017A1801610362617201693FE0000000000000016103626172016A3FE3333333333333016103626172016B3FE6666666666666016103626172016C3FE999999999999A016103666F6F01693FB999999999999A016103666F6F016A3FC999999999999A016103666F6F016B3FD3333333333333016103666F6F016C3FD999999999999A01620362617201693FF4CCCCCCCCCCCD016203626172016A3FF6666666666666016203626172016B3FF8000000000000016203626172016C3FF999999999999A016203666F6F01693FECCCCCCCCCCCCD016203666F6F016A3FF0000000000000016203666F6F016B3FF199999999999A016203666F6F016C3FF333333333333301630362617201694000CCCCCCCCCCCD016303626172016A400199999999999A016303626172016B4002666666666666016303626172016C4003333333333333016303666F6F01693FFB333333333333016303666F6F016A3FFCCCCCCCCCCCCD016303666F6F016B3FFE666666666666016303666F6F016C4000000000000000"},"result":{"expect":"0x010301780179017A1801610362617201693FDDAC670561BB4F016103626172016A3FE14B1DD5F90CE1016103626172016B3FE38B112D7BD4AD016103626172016C3FE5977A5103EA93016103666F6F01693FB983E282E2CC4D016103666F6F016A3FC94441F8F7260C016103666F6F016B3FD2A73A661EAF06016103666F6F016C3FD85A376B677DC001620362617201693FED488143AD8C44016203626172016A3FEE6AE1355353CF016203626172016B3FEF730BD281F69B016203626172016C3FF031F57E54ADBE016203666F6F01693FE77338A80603BE016203666F6F016A3FE921FB54442D18016203666F6F016B3FEAA7C8545183CD016203666F6F016C3FEC08AAE496EFA601630362617201693FF205A403005899016303626172016A3FF24E83FA9B4E48016303626172016B3FF29219A49709A1016303626172016C3FF2D0EAD6066395016303666F6F01693FF0A00A3BCE369F016303666F6F016A3FF104E80200BA00016303666F6F016B3FF1618F66769C69016303666F6F016C3FF1B6E192EBBE44"}}
+{"expression":"map(a,f(a)(atan(a)))","inputs":{"a":"0x0301017902017803017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF6666666666666400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD03666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0301017902017803017A0702036261723FE5977A5103EA933FE77338A80603BE3FE921FB54442D183FEAA7C8545183CD3FEC08AAE496EFA63FED488143AD8C443FEE6AE1355353CF3FF24E83FA9B4E483FF29219A49709A13FF2D0EAD60663953FF30B6D796A4DA83FF34209A8C109803FF3751B7ED2AEC13FF3A4F4A8668B693FF4CC2EF6F1A7103FF4E8C94DBF54E53FF503FBDB7F996E3FF51DDFEF9EBC943FF5368C951E9CFD3FF54E16D0A3F5133FF56491D6EC41CD03666F6F3FB983E282E2CC4D3FC94441F8F7260C3FD2A73A661EAF063FD85A376B677DC03FDDAC670561BB4F3FE14B1DD5F90CE13FE38B112D7BD4AD3FEF730BD281F69B3FF031F57E54ADBE3FF0A00A3BCE369F3FF104E80200BA003FF1618F66769C693FF1B6E192EBBE443FF205A4030058993FF3D1DDBDAD64F03FF3FC176B7A85603FF423DB7312CEBC3FF4495D868232253FF46CCC069C173F3FF48E50A711C89D3FF4AE10FC6589A5"}}
+{"expression":"map(a,f(a)(atan(a)))","inputs":{"a":"0x03020178017A010179050C016101693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB3333333333330161016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD0161016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE6666666666660161016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000016201694000CCCCCCCCCCCD40040000000000004007333333333333400A666666666666400D99999999999A0162016A400199999999999A4004CCCCCCCCCCCD4008000000000000400B333333333333400E6666666666660162016B4002666666666666400599999999999A4008CCCCCCCCCCCD400C000000000000400F3333333333330162016C40033333333333334006666666666666400999999999999A400CCCCCCCCCCCCD40100000000000000163016940106666666666664012000000000000401399999999999A40153333333333334016CCCCCCCCCCCD0163016A4010CCCCCCCCCCCD40126666666666664014000000000000401599999999999A40173333333333330163016B40113333333333334012CCCCCCCCCCCD40146666666666664016000000000000401799999999999A0163016C401199999999999A40133333333333334014CCCCCCCCCCCD40166666666666664018000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FB983E282E2CC4D3FDDAC670561BB4F3FE77338A80603BE3FED488143AD8C443FF0A00A3BCE369F0161016A3FC94441F8F7260C3FE14B1DD5F90CE13FE921FB54442D183FEE6AE1355353CF3FF104E80200BA000161016B3FD2A73A661EAF063FE38B112D7BD4AD3FEAA7C8545183CD3FEF730BD281F69B3FF1618F66769C690161016C3FD85A376B677DC03FE5977A5103EA933FEC08AAE496EFA63FF031F57E54ADBE3FF1B6E192EBBE44016201693FF205A4030058993FF30B6D796A4DA83FF3D1DDBDAD64F03FF46CCC069C173F3FF4E8C94DBF54E50162016A3FF24E83FA9B4E483FF34209A8C109803FF3FC176B7A85603FF48E50A711C89D3FF503FBDB7F996E0162016B3FF29219A49709A13FF3751B7ED2AEC13FF423DB7312CEBC3FF4AE10FC6589A53FF51DDFEF9EBC940162016C3FF2D0EAD60663953FF3A4F4A8668B693FF4495D868232253FF4CC2EF6F1A7103FF5368C951E9CFD016301693FF54E16D0A3F5133FF5A25052114E603FF5E9630A7AAA8E3FF62621A3C77CB43FF65A9FE0F207750163016A3FF56491D6EC41CD3FF5B5306F0FEB7C3FF5F973152548573FF633F5B889326A3FF666A67BEB2F360163016B3FF57A0F3CB41AD73FF5C74C04A4AF413FF608E7F45288B83FF6414D44094C7C3FF67247B18C4D840163016C3FF58E9F20EF0D553FF5D8AEA74F117A3FF617CA2B906EFA3FF64E2EA9E86D153FF67D8863BC99BD"}}
+{"expression":"exp(a)","inputs":{"a":"0x02003FB999999999999A"},"result":{"expect":"0x02003FF1AEC7B35A00D4"}}
+{"expression":"exp(a)","inputs":{"a":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FF1AEC7B35A00D43FF38ADD9E58AC8D3FF599058C8C1A96"}}
+{"expression":"exp(a)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178030179053FF1AEC7B35A00D43FF38ADD9E58AC8D3FF599058C8C1A963FF7DE8392FBBFE03FFA61298E1E069C3FFD27660B11A9EF40001C2A612689874001CDE866FE46E94003AD44655C78BC4005BF0A8B145769400808883244D593400A8F99761065A4400D5AB83615F8B44010388657115A474011ED3FE64FC541"}}
+{"expression":"exp(a)","inputs":{"a":"0x0203017803017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD4011333333333333401199999999999A401200000000000040126666666666664012CCCCCCCCCCCD4013333333333333401399999999999A401400000000000040146666666666664014CCCCCCCCCCCD4015333333333333401599999999999A401600000000000040166666666666664016CCCCCCCCCCCD4017333333333333401799999999999A401800000000000040186666666666664018CCCCCCCCCCCD4019333333333333401999999999999A401A000000000000401A666666666666401ACCCCCCCCCCCD401B333333333333401B99999999999A401C000000000000401C666666666666401CCCCCCCCCCCCD401D333333333333401D99999999999A401E000000000000401E666666666666401ECCCCCCCCCCCD401F333333333333401F99999999999A402000000000000040203333333333334020666666666666402099999999999A4020CCCCCCCCCCCD402100000000000040213333333333334021666666666666402199999999999A4021CCCCCCCCCCCD402200000000000040223333333333334022666666666666402299999999999A4022CCCCCCCCCCCD402300000000000040233333333333334023666666666666402399999999999A4023CCCCCCCCCCCD402400000000000040243333333333334024666666666666402499999999999A4024CCCCCCCCCCCD4025000000000000"},"result":{"expect":"0x0203017803017905017A073FF1AEC7B35A00D43FF38ADD9E58AC8D3FF599058C8C1A963FF7DE8392FBBFE03FFA61298E1E069C3FFD27660B11A9EF40001C2A612689874001CDE866FE46E94003AD44655C78BC4005BF0A8B145769400808883244D593400A8F99761065A4400D5AB83615F8B44010388657115A474011ED3FE64FC5414013CFE7BB5B37EC4015E552770DF8A7401832D6C8EFEE85401ABE5B1CD863F6401D8E64B8D4DDAE4020551439081D4F40220CCE91C40E5F4023F2C80AEF884D40260BDDC649CA6840285D6FD931E0BB402AED6F125C7CB5402DC26C32572A3E403071D45EEC224240322C94CA7A81FE403415E5BF6FB106403632ACEF67FE3D40388853E624B794403B1CD5E7807B7B403DF6CF42BDA46840408EC721396BDB40424C92F23D78074044394144EEEC81404659C069D9983C4048B38373C9473C404B4C902E273A58404E2B8E8B42F3B64050ABECD907C03440526CC96B836D7D40545CDB083EB51440568118ADE1DEAA4058DEFF0708C2FF405B7C9E793462BB405E60AAAE3D91634060C945E00BBAFC40628D389970338F406480B376F013E34066A8B63497CC0A40690AC725B6564C406BAD015C8E318C406E96244F21BBF64070E6D29097E18C4072ADE0DFD620AF4074A4CAFF54F2234076D09977E783D1407936DC5690C08F407BDDB96D1F3E59407ECBFC12836E5640810493459DB8EE4082CEC2A33743CC4084C92210816C894086F8C2F293C9A14089633F2143F3F0408C0EC740D845BD408F02329E185A4F409122885AAEDDAA4092EFDE48C699A54094EDB91A4D293A4097213320377B2840998FF00E6AB6D5409C402B6EB1F6AD409F38C898B9E68540A140B22BFE1DAC40A311343669444A40A512908D54AFF940A749EA7D470C6E40A9BCEFA790485240AC71E68EAEC33440AF6FBEAA67302240B15F11166093F940B332C4D2B7C4A140B537A8DAFAC4B740B772E9871206EB40B9EA3E7732078E40BCA3F939DCB46040BFA7157C470F8240C17DA5774EC66640C3549084FF362D40C55D027569C4A840C79C30BBC48B4840CA17DD08C11DC140CCD6640A57410540CFDECDB8AA213740D19C6FACE5C55940D37697B5428D1440D5829DCF95056040D7C5C09A68D57240DA45CBE8A42BA440DD09279B49287040E00B740586690140E1BB7015E84D3B"}}
+{"expression":"exp(a)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FF1AEC7B35A00D401623FF38ADD9E58AC8D01633FF599058C8C1A96"}}
+{"expression":"exp(a)","inputs":{"a":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179060161036261723FF38ADD9E58AC8D016103666F6F3FF1AEC7B35A00D40162036261723FF7DE8392FBBFE0016203666F6F3FF599058C8C1A960163036261723FFD27660B11A9EF016303666F6F3FFA61298E1E069C"}}
+{"expression":"exp(a)","inputs":{"a":"0x010301780179017A1801610362617201693FE0000000000000016103626172016A3FE3333333333333016103626172016B3FE6666666666666016103626172016C3FE999999999999A016103666F6F01693FB999999999999A016103666F6F016A3FC999999999999A016103666F6F016B3FD3333333333333016103666F6F016C3FD999999999999A01620362617201693FF4CCCCCCCCCCCD016203626172016A3FF6666666666666016203626172016B3FF8000000000000016203626172016C3FF999999999999A016203666F6F01693FECCCCCCCCCCCCD016203666F6F016A3FF0000000000000016203666F6F016B3FF199999999999A016203666F6F016C3FF333333333333301630362617201694000CCCCCCCCCCCD016303626172016A400199999999999A016303626172016B4002666666666666016303626172016C4003333333333333016303666F6F01693FFB333333333333016303666F6F016A3FFCCCCCCCCCCCCD016303666F6F016B3FFE666666666666016303666F6F016C4000000000000000"},"result":{"expect":"0x010301780179017A1801610362617201693FFA61298E1E069C016103626172016A3FFD27660B11A9EF016103626172016B40001C2A61268987016103626172016C4001CDE866FE46E9016103666F6F01693FF1AEC7B35A00D4016103666F6F016A3FF38ADD9E58AC8D016103666F6F016B3FF599058C8C1A96016103666F6F016C3FF7DE8392FBBFE00162036261720169400D5AB83615F8B4016203626172016A4010388657115A47016203626172016B4011ED3FE64FC541016203626172016C4013CFE7BB5B37EC016203666F6F01694003AD44655C78BC016203666F6F016A4005BF0A8B145769016203666F6F016B400808883244D593016203666F6F016C400A8F99761065A401630362617201694020551439081D4F016303626172016A40220CCE91C40E5F016303626172016B4023F2C80AEF884D016303626172016C40260BDDC649CA68016303666F6F01694015E552770DF8A7016303666F6F016A401832D6C8EFEE85016303666F6F016B401ABE5B1CD863F6016303666F6F016C401D8E64B8D4DDAE"}}
+{"expression":"exp(a)","inputs":{"a":"0x0301017902017803017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF6666666666666400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD03666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0301017902017803017A0702036261724001CDE866FE46E94003AD44655C78BC4005BF0A8B145769400808883244D593400A8F99761065A4400D5AB83615F8B44010388657115A4740220CCE91C40E5F4023F2C80AEF884D40260BDDC649CA6840285D6FD931E0BB402AED6F125C7CB5402DC26C32572A3E403071D45EEC224240424C92F23D78074044394144EEEC81404659C069D9983C4048B38373C9473C404B4C902E273A58404E2B8E8B42F3B64050ABECD907C03403666F6F3FF1AEC7B35A00D43FF38ADD9E58AC8D3FF599058C8C1A963FF7DE8392FBBFE03FFA61298E1E069C3FFD27660B11A9EF40001C2A612689874011ED3FE64FC5414013CFE7BB5B37EC4015E552770DF8A7401832D6C8EFEE85401ABE5B1CD863F6401D8E64B8D4DDAE4020551439081D4F40322C94CA7A81FE403415E5BF6FB106403632ACEF67FE3D40388853E624B794403B1CD5E7807B7B403DF6CF42BDA46840408EC721396BDB"}}
+{"expression":"exp(a)","inputs":{"a":"0x03020178017A010179050C016101693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB3333333333330161016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD0161016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE6666666666660161016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000016201694000CCCCCCCCCCCD40040000000000004007333333333333400A666666666666400D99999999999A0162016A400199999999999A4004CCCCCCCCCCCD4008000000000000400B333333333333400E6666666666660162016B4002666666666666400599999999999A4008CCCCCCCCCCCD400C000000000000400F3333333333330162016C40033333333333334006666666666666400999999999999A400CCCCCCCCCCCCD40100000000000000163016940106666666666664012000000000000401399999999999A40153333333333334016CCCCCCCCCCCD0163016A4010CCCCCCCCCCCD40126666666666664014000000000000401599999999999A40173333333333330163016B40113333333333334012CCCCCCCCCCCD40146666666666664016000000000000401799999999999A0163016C401199999999999A40133333333333334014CCCCCCCCCCCD40166666666666664018000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FF1AEC7B35A00D43FFA61298E1E069C4003AD44655C78BC400D5AB83615F8B44015E552770DF8A70161016A3FF38ADD9E58AC8D3FFD27660B11A9EF4005BF0A8B1457694010388657115A47401832D6C8EFEE850161016B3FF599058C8C1A9640001C2A61268987400808883244D5934011ED3FE64FC541401ABE5B1CD863F60161016C3FF7DE8392FBBFE04001CDE866FE46E9400A8F99761065A44013CFE7BB5B37EC401D8E64B8D4DDAE016201694020551439081D4F40285D6FD931E0BB40322C94CA7A81FE403B1CD5E7807B7B4044394144EEEC810162016A40220CCE91C40E5F402AED6F125C7CB5403415E5BF6FB106403DF6CF42BDA468404659C069D9983C0162016B4023F2C80AEF884D402DC26C32572A3E403632ACEF67FE3D40408EC721396BDB4048B38373C9473C0162016C40260BDDC649CA68403071D45EEC224240388853E624B79440424C92F23D7807404B4C902E273A5801630169404E2B8E8B42F3B640568118ADE1DEAA4060C945E00BBAFC40690AC725B6564C4072ADE0DFD620AF0163016A4050ABECD907C0344058DEFF0708C2FF40628D389970338F406BAD015C8E318C4074A4CAFF54F2230163016B40526CC96B836D7D405B7C9E793462BB406480B376F013E3406E96244F21BBF64076D09977E783D10163016C40545CDB083EB514405E60AAAE3D91634066A8B63497CC0A4070E6D29097E18C407936DC5690C08F"}}
+{"expression":"map(a,f(a)(exp(a)))","inputs":{"a":"0x02003FB999999999999A"},"result":{"expect":"0x02003FF1AEC7B35A00D4"}}
+{"expression":"map(a,f(a)(exp(a)))","inputs":{"a":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FF1AEC7B35A00D43FF38ADD9E58AC8D3FF599058C8C1A96"}}
+{"expression":"map(a,f(a)(exp(a)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178030179053FF1AEC7B35A00D43FF38ADD9E58AC8D3FF599058C8C1A963FF7DE8392FBBFE03FFA61298E1E069C3FFD27660B11A9EF40001C2A612689874001CDE866FE46E94003AD44655C78BC4005BF0A8B145769400808883244D593400A8F99761065A4400D5AB83615F8B44010388657115A474011ED3FE64FC541"}}
+{"expression":"map(a,f(a)(exp(a)))","inputs":{"a":"0x0203017803017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD4011333333333333401199999999999A401200000000000040126666666666664012CCCCCCCCCCCD4013333333333333401399999999999A401400000000000040146666666666664014CCCCCCCCCCCD4015333333333333401599999999999A401600000000000040166666666666664016CCCCCCCCCCCD4017333333333333401799999999999A401800000000000040186666666666664018CCCCCCCCCCCD4019333333333333401999999999999A401A000000000000401A666666666666401ACCCCCCCCCCCD401B333333333333401B99999999999A401C000000000000401C666666666666401CCCCCCCCCCCCD401D333333333333401D99999999999A401E000000000000401E666666666666401ECCCCCCCCCCCD401F333333333333401F99999999999A402000000000000040203333333333334020666666666666402099999999999A4020CCCCCCCCCCCD402100000000000040213333333333334021666666666666402199999999999A4021CCCCCCCCCCCD402200000000000040223333333333334022666666666666402299999999999A4022CCCCCCCCCCCD402300000000000040233333333333334023666666666666402399999999999A4023CCCCCCCCCCCD402400000000000040243333333333334024666666666666402499999999999A4024CCCCCCCCCCCD4025000000000000"},"result":{"expect":"0x0203017803017905017A073FF1AEC7B35A00D43FF38ADD9E58AC8D3FF599058C8C1A963FF7DE8392FBBFE03FFA61298E1E069C3FFD27660B11A9EF40001C2A612689874001CDE866FE46E94003AD44655C78BC4005BF0A8B145769400808883244D593400A8F99761065A4400D5AB83615F8B44010388657115A474011ED3FE64FC5414013CFE7BB5B37EC4015E552770DF8A7401832D6C8EFEE85401ABE5B1CD863F6401D8E64B8D4DDAE4020551439081D4F40220CCE91C40E5F4023F2C80AEF884D40260BDDC649CA6840285D6FD931E0BB402AED6F125C7CB5402DC26C32572A3E403071D45EEC224240322C94CA7A81FE403415E5BF6FB106403632ACEF67FE3D40388853E624B794403B1CD5E7807B7B403DF6CF42BDA46840408EC721396BDB40424C92F23D78074044394144EEEC81404659C069D9983C4048B38373C9473C404B4C902E273A58404E2B8E8B42F3B64050ABECD907C03440526CC96B836D7D40545CDB083EB51440568118ADE1DEAA4058DEFF0708C2FF405B7C9E793462BB405E60AAAE3D91634060C945E00BBAFC40628D389970338F406480B376F013E34066A8B63497CC0A40690AC725B6564C406BAD015C8E318C406E96244F21BBF64070E6D29097E18C4072ADE0DFD620AF4074A4CAFF54F2234076D09977E783D1407936DC5690C08F407BDDB96D1F3E59407ECBFC12836E5640810493459DB8EE4082CEC2A33743CC4084C92210816C894086F8C2F293C9A14089633F2143F3F0408C0EC740D845BD408F02329E185A4F409122885AAEDDAA4092EFDE48C699A54094EDB91A4D293A4097213320377B2840998FF00E6AB6D5409C402B6EB1F6AD409F38C898B9E68540A140B22BFE1DAC40A311343669444A40A512908D54AFF940A749EA7D470C6E40A9BCEFA790485240AC71E68EAEC33440AF6FBEAA67302240B15F11166093F940B332C4D2B7C4A140B537A8DAFAC4B740B772E9871206EB40B9EA3E7732078E40BCA3F939DCB46040BFA7157C470F8240C17DA5774EC66640C3549084FF362D40C55D027569C4A840C79C30BBC48B4840CA17DD08C11DC140CCD6640A57410540CFDECDB8AA213740D19C6FACE5C55940D37697B5428D1440D5829DCF95056040D7C5C09A68D57240DA45CBE8A42BA440DD09279B49287040E00B740586690140E1BB7015E84D3B"}}
+{"expression":"map(a,f(a)(exp(a)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FF1AEC7B35A00D401623FF38ADD9E58AC8D01633FF599058C8C1A96"}}
+{"expression":"map(a,f(a)(exp(a)))","inputs":{"a":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179060161036261723FF38ADD9E58AC8D016103666F6F3FF1AEC7B35A00D40162036261723FF7DE8392FBBFE0016203666F6F3FF599058C8C1A960163036261723FFD27660B11A9EF016303666F6F3FFA61298E1E069C"}}
+{"expression":"map(a,f(a)(exp(a)))","inputs":{"a":"0x010301780179017A1801610362617201693FE0000000000000016103626172016A3FE3333333333333016103626172016B3FE6666666666666016103626172016C3FE999999999999A016103666F6F01693FB999999999999A016103666F6F016A3FC999999999999A016103666F6F016B3FD3333333333333016103666F6F016C3FD999999999999A01620362617201693FF4CCCCCCCCCCCD016203626172016A3FF6666666666666016203626172016B3FF8000000000000016203626172016C3FF999999999999A016203666F6F01693FECCCCCCCCCCCCD016203666F6F016A3FF0000000000000016203666F6F016B3FF199999999999A016203666F6F016C3FF333333333333301630362617201694000CCCCCCCCCCCD016303626172016A400199999999999A016303626172016B4002666666666666016303626172016C4003333333333333016303666F6F01693FFB333333333333016303666F6F016A3FFCCCCCCCCCCCCD016303666F6F016B3FFE666666666666016303666F6F016C4000000000000000"},"result":{"expect":"0x010301780179017A1801610362617201693FFA61298E1E069C016103626172016A3FFD27660B11A9EF016103626172016B40001C2A61268987016103626172016C4001CDE866FE46E9016103666F6F01693FF1AEC7B35A00D4016103666F6F016A3FF38ADD9E58AC8D016103666F6F016B3FF599058C8C1A96016103666F6F016C3FF7DE8392FBBFE00162036261720169400D5AB83615F8B4016203626172016A4010388657115A47016203626172016B4011ED3FE64FC541016203626172016C4013CFE7BB5B37EC016203666F6F01694003AD44655C78BC016203666F6F016A4005BF0A8B145769016203666F6F016B400808883244D593016203666F6F016C400A8F99761065A401630362617201694020551439081D4F016303626172016A40220CCE91C40E5F016303626172016B4023F2C80AEF884D016303626172016C40260BDDC649CA68016303666F6F01694015E552770DF8A7016303666F6F016A401832D6C8EFEE85016303666F6F016B401ABE5B1CD863F6016303666F6F016C401D8E64B8D4DDAE"}}
+{"expression":"map(a,f(a)(exp(a)))","inputs":{"a":"0x0301017902017803017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF6666666666666400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD03666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0301017902017803017A0702036261724001CDE866FE46E94003AD44655C78BC4005BF0A8B145769400808883244D593400A8F99761065A4400D5AB83615F8B44010388657115A4740220CCE91C40E5F4023F2C80AEF884D40260BDDC649CA6840285D6FD931E0BB402AED6F125C7CB5402DC26C32572A3E403071D45EEC224240424C92F23D78074044394144EEEC81404659C069D9983C4048B38373C9473C404B4C902E273A58404E2B8E8B42F3B64050ABECD907C03403666F6F3FF1AEC7B35A00D43FF38ADD9E58AC8D3FF599058C8C1A963FF7DE8392FBBFE03FFA61298E1E069C3FFD27660B11A9EF40001C2A612689874011ED3FE64FC5414013CFE7BB5B37EC4015E552770DF8A7401832D6C8EFEE85401ABE5B1CD863F6401D8E64B8D4DDAE4020551439081D4F40322C94CA7A81FE403415E5BF6FB106403632ACEF67FE3D40388853E624B794403B1CD5E7807B7B403DF6CF42BDA46840408EC721396BDB"}}
+{"expression":"map(a,f(a)(exp(a)))","inputs":{"a":"0x03020178017A010179050C016101693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB3333333333330161016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD0161016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE6666666666660161016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000016201694000CCCCCCCCCCCD40040000000000004007333333333333400A666666666666400D99999999999A0162016A400199999999999A4004CCCCCCCCCCCD4008000000000000400B333333333333400E6666666666660162016B4002666666666666400599999999999A4008CCCCCCCCCCCD400C000000000000400F3333333333330162016C40033333333333334006666666666666400999999999999A400CCCCCCCCCCCCD40100000000000000163016940106666666666664012000000000000401399999999999A40153333333333334016CCCCCCCCCCCD0163016A4010CCCCCCCCCCCD40126666666666664014000000000000401599999999999A40173333333333330163016B40113333333333334012CCCCCCCCCCCD40146666666666664016000000000000401799999999999A0163016C401199999999999A40133333333333334014CCCCCCCCCCCD40166666666666664018000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FF1AEC7B35A00D43FFA61298E1E069C4003AD44655C78BC400D5AB83615F8B44015E552770DF8A70161016A3FF38ADD9E58AC8D3FFD27660B11A9EF4005BF0A8B1457694010388657115A47401832D6C8EFEE850161016B3FF599058C8C1A9640001C2A61268987400808883244D5934011ED3FE64FC541401ABE5B1CD863F60161016C3FF7DE8392FBBFE04001CDE866FE46E9400A8F99761065A44013CFE7BB5B37EC401D8E64B8D4DDAE016201694020551439081D4F40285D6FD931E0BB40322C94CA7A81FE403B1CD5E7807B7B4044394144EEEC810162016A40220CCE91C40E5F402AED6F125C7CB5403415E5BF6FB106403DF6CF42BDA468404659C069D9983C0162016B4023F2C80AEF884D402DC26C32572A3E403632ACEF67FE3D40408EC721396BDB4048B38373C9473C0162016C40260BDDC649CA68403071D45EEC224240388853E624B79440424C92F23D7807404B4C902E273A5801630169404E2B8E8B42F3B640568118ADE1DEAA4060C945E00BBAFC40690AC725B6564C4072ADE0DFD620AF0163016A4050ABECD907C0344058DEFF0708C2FF40628D389970338F406BAD015C8E318C4074A4CAFF54F2230163016B40526CC96B836D7D405B7C9E793462BB406480B376F013E3406E96244F21BBF64076D09977E783D10163016C40545CDB083EB514405E60AAAE3D91634066A8B63497CC0A4070E6D29097E18C407936DC5690C08F"}}
+{"expression":"log10(a)","inputs":{"a":"0x02003FB999999999999A"},"result":{"expect":"0x0200BFF0000000000000"}}
+{"expression":"log10(a)","inputs":{"a":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x0201017803BFF0000000000000BFE65DF657B04300BFE0BB6C34D81502"}}
+{"expression":"log10(a)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x0202017803017905BFF0000000000000BFE65DF657B04300BFE0BB6C34D81502BFD977D95EC10C02BFD34413509F79FFBFCC658A32216008BFC3D3D3D21CCF04BFB8CF183886480BBFA76D869B02A02E00000000000000003FA5316C0A18ADD63FB44538DE3B27EB3FBD2B643BC124F43FC2B452CF2224FA3FC68A288B60B7FC"}}
+{"expression":"log10(a)","inputs":{"a":"0x0203017803017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD4011333333333333401199999999999A401200000000000040126666666666664012CCCCCCCCCCCD4013333333333333401399999999999A401400000000000040146666666666664014CCCCCCCCCCCD4015333333333333401599999999999A401600000000000040166666666666664016CCCCCCCCCCCD4017333333333333401799999999999A401800000000000040186666666666664018CCCCCCCCCCCD4019333333333333401999999999999A401A000000000000401A666666666666401ACCCCCCCCCCCD401B333333333333401B99999999999A401C000000000000401C666666666666401CCCCCCCCCCCCD401D333333333333401D99999999999A401E000000000000401E666666666666401ECCCCCCCCCCCD401F333333333333401F99999999999A402000000000000040203333333333334020666666666666402099999999999A4020CCCCCCCCCCCD402100000000000040213333333333334021666666666666402199999999999A4021CCCCCCCCCCCD402200000000000040223333333333334022666666666666402299999999999A4022CCCCCCCCCCCD402300000000000040233333333333334023666666666666402399999999999A4023CCCCCCCCCCCD402400000000000040243333333333334024666666666666402499999999999A4024CCCCCCCCCCCD4025000000000000"},"result":{"expect":"0x0203017803017905017A07BFF0000000000000BFE65DF657B04300BFE0BB6C34D81502BFD977D95EC10C02BFD34413509F79FFBFCC658A32216008BFC3D3D3D21CCF04BFB8CF183886480BBFA76D869B02A02E00000000000000003FA5316C0A18ADD63FB44538DE3B27EB3FBD2B643BC124F43FC2B452CF2224FA3FC68A288B60B7FC3FCA209A84FBCFF93FCD7F59AA5BECB93FD056627D3F25F93FD1D71957EF04413FD34413509F79FF3FD49F3DAD416E7C3FD5EA40D1E28FBA3FD7268C826FE5FC3FD85561882E43FA3FD977D95EC10C023FDA8EEC5F8FC33C3FDB9B76C2EF81F83FDC9E3CB8308C7C3FDD97EDC5AD8FA83FDE8927964FD5FD3FDF727851619F993FE02A30498EB0FE3FE097AA8BC975DB3FE101E012E6B82E3FE1690163290F403FE1CD3AE6EF4FFC3FE22EB561CCC1003FE28D9654473F203FE2EA0052A00F9D3FE34413509F79FF3FE39BECE40418B03FE3F1A87EF0743D3FE4455FA37861EB3FE4972A114104DC3FE4E71DEE0018FE3FE5354FE987AFFE3FE581D35DF1753C3FE5CCBA6C66DEFC3FE6161616F1987F3FE65DF657B043013FE6A46A35BEE62D3FE6E97FD8179E9E3FE72D4496A6F4873FE76FC509C77DFB3FE7B10D1851CDDE3FE7F1280468033E3FE83020771F6D203FE86E008B2684D43FE8AAD1D681E1DC3FE8E69D7377A7FE3FE9216C08BE37DF3FE95B45D1008CCC3FE99432A1C8A23C3FE9CC39F1DE6DFD3FEA0362DF28679F3FEA39B4341932DB3FEA6F346CB4CA5C3FEAA3E9BB36752D3FEAD7DA0C5FDDFD3FEB0B0B0B78CC3F3FEB3D82260640A63FEB6F448F3F0CFC3FEBA057434368C83FEBD0BF0A1C7E003FEC00807A8871003FEC2F9FFC96FC203FEC5E21CC1A571C3FEC8C09FAEFCC9C3FECB95C732312DC3FECE61CF8EF36FE3FED124F2C9FABFA3FED3DF68C53D5B03FED691675A735B23FED93B22740313D3FEDBDCCC2473E2F3FEDE7694BC81EEA3FEE108AADFEB2D23FEE3933B990C1DC3FEE616726B60D4C3FEE8927964FD5FD3FEEB07792F0F0DD3FEED75991D76CFD3FEEFDCFF3D8BACB3FEF23DD0641323B3FEF498303A7C5213FEF6EC414B69BFC3FEF93A250E94D9C3FEFB81FBF41557E3FEFDC3E56F160DA3FF00000000000003FF011B349F11FB63FF02339EF0751963FF03494CE447B5D3FF045C4C033ADCE3FF056CA97287D1F"}}
+{"expression":"log10(a)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x01010178030161BFF00000000000000162BFE65DF657B043000163BFE0BB6C34D81502"}}
+{"expression":"log10(a)","inputs":{"a":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x01020178017906016103626172BFE65DF657B04300016103666F6FBFF0000000000000016203626172BFD977D95EC10C02016203666F6FBFE0BB6C34D81502016303626172BFCC658A32216008016303666F6FBFD34413509F79FF"}}
+{"expression":"log10(a)","inputs":{"a":"0x010301780179017A1801610362617201693FE0000000000000016103626172016A3FE3333333333333016103626172016B3FE6666666666666016103626172016C3FE999999999999A016103666F6F01693FB999999999999A016103666F6F016A3FC999999999999A016103666F6F016B3FD3333333333333016103666F6F016C3FD999999999999A01620362617201693FF4CCCCCCCCCCCD016203626172016A3FF6666666666666016203626172016B3FF8000000000000016203626172016C3FF999999999999A016203666F6F01693FECCCCCCCCCCCCD016203666F6F016A3FF0000000000000016203666F6F016B3FF199999999999A016203666F6F016C3FF333333333333301630362617201694000CCCCCCCCCCCD016303626172016A400199999999999A016303626172016B4002666666666666016303626172016C4003333333333333016303666F6F01693FFB333333333333016303666F6F016A3FFCCCCCCCCCCCCD016303666F6F016B3FFE666666666666016303666F6F016C4000000000000000"},"result":{"expect":"0x010301780179017A180161036261720169BFD34413509F79FF016103626172016ABFCC658A32216008016103626172016BBFC3D3D3D21CCF04016103626172016CBFB8CF183886480B016103666F6F0169BFF0000000000000016103666F6F016ABFE65DF657B04300016103666F6F016BBFE0BB6C34D81502016103666F6F016CBFD977D95EC10C0201620362617201693FBD2B643BC124F4016203626172016A3FC2B452CF2224FA016203626172016B3FC68A288B60B7FC016203626172016C3FCA209A84FBCFF9016203666F6F0169BFA76D869B02A02E016203666F6F016A0000000000000000016203666F6F016B3FA5316C0A18ADD6016203666F6F016C3FB44538DE3B27EB01630362617201693FD49F3DAD416E7C016303626172016A3FD5EA40D1E28FBA016303626172016B3FD7268C826FE5FC016303626172016C3FD85561882E43FA016303666F6F01693FCD7F59AA5BECB9016303666F6F016A3FD056627D3F25F9016303666F6F016B3FD1D71957EF0441016303666F6F016C3FD34413509F79FF"}}
+{"expression":"log10(a)","inputs":{"a":"0x0301017902017803017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF6666666666666400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD03666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0301017902017803017A070203626172BFB8CF183886480BBFA76D869B02A02E00000000000000003FA5316C0A18ADD63FB44538DE3B27EB3FBD2B643BC124F43FC2B452CF2224FA3FD5EA40D1E28FBA3FD7268C826FE5FC3FD85561882E43FA3FD977D95EC10C023FDA8EEC5F8FC33C3FDB9B76C2EF81F83FDC9E3CB8308C7C3FE1CD3AE6EF4FFC3FE22EB561CCC1003FE28D9654473F203FE2EA0052A00F9D3FE34413509F79FF3FE39BECE40418B03FE3F1A87EF0743D03666F6FBFF0000000000000BFE65DF657B04300BFE0BB6C34D81502BFD977D95EC10C02BFD34413509F79FFBFCC658A32216008BFC3D3D3D21CCF043FC68A288B60B7FC3FCA209A84FBCFF93FCD7F59AA5BECB93FD056627D3F25F93FD1D71957EF04413FD34413509F79FF3FD49F3DAD416E7C3FDD97EDC5AD8FA83FDE8927964FD5FD3FDF727851619F993FE02A30498EB0FE3FE097AA8BC975DB3FE101E012E6B82E3FE1690163290F40"}}
+{"expression":"log10(a)","inputs":{"a":"0x03020178017A010179050C016101693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB3333333333330161016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD0161016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE6666666666660161016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000016201694000CCCCCCCCCCCD40040000000000004007333333333333400A666666666666400D99999999999A0162016A400199999999999A4004CCCCCCCCCCCD4008000000000000400B333333333333400E6666666666660162016B4002666666666666400599999999999A4008CCCCCCCCCCCD400C000000000000400F3333333333330162016C40033333333333334006666666666666400999999999999A400CCCCCCCCCCCCD40100000000000000163016940106666666666664012000000000000401399999999999A40153333333333334016CCCCCCCCCCCD0163016A4010CCCCCCCCCCCD40126666666666664014000000000000401599999999999A40173333333333330163016B40113333333333334012CCCCCCCCCCCD40146666666666664016000000000000401799999999999A0163016C401199999999999A40133333333333334014CCCCCCCCCCCD40166666666666664018000000000000"},"result":{"expect":"0x03020178017A010179050C01610169BFF0000000000000BFD34413509F79FFBFA76D869B02A02E3FBD2B643BC124F43FCD7F59AA5BECB90161016ABFE65DF657B04300BFCC658A3221600800000000000000003FC2B452CF2224FA3FD056627D3F25F90161016BBFE0BB6C34D81502BFC3D3D3D21CCF043FA5316C0A18ADD63FC68A288B60B7FC3FD1D71957EF04410161016CBFD977D95EC10C02BFB8CF183886480B3FB44538DE3B27EB3FCA209A84FBCFF93FD34413509F79FF016201693FD49F3DAD416E7C3FD977D95EC10C023FDD97EDC5AD8FA83FE097AA8BC975DB3FE22EB561CCC1000162016A3FD5EA40D1E28FBA3FDA8EEC5F8FC33C3FDE8927964FD5FD3FE101E012E6B82E3FE28D9654473F200162016B3FD7268C826FE5FC3FDB9B76C2EF81F83FDF727851619F993FE1690163290F403FE2EA0052A00F9D0162016C3FD85561882E43FA3FDC9E3CB8308C7C3FE02A30498EB0FE3FE1CD3AE6EF4FFC3FE34413509F79FF016301693FE39BECE40418B03FE4E71DEE0018FE3FE6161616F1987F3FE72D4496A6F4873FE83020771F6D200163016A3FE3F1A87EF0743D3FE5354FE987AFFE3FE65DF657B043013FE76FC509C77DFB3FE86E008B2684D40163016B3FE4455FA37861EB3FE581D35DF1753C3FE6A46A35BEE62D3FE7B10D1851CDDE3FE8AAD1D681E1DC0163016C3FE4972A114104DC3FE5CCBA6C66DEFC3FE6E97FD8179E9E3FE7F1280468033E3FE8E69D7377A7FE"}}
+{"expression":"map(a,f(a)(log10(a)))","inputs":{"a":"0x02003FB999999999999A"},"result":{"expect":"0x0200BFF0000000000000"}}
+{"expression":"map(a,f(a)(log10(a)))","inputs":{"a":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x0201017803BFF0000000000000BFE65DF657B04300BFE0BB6C34D81502"}}
+{"expression":"map(a,f(a)(log10(a)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x0202017803017905BFF0000000000000BFE65DF657B04300BFE0BB6C34D81502BFD977D95EC10C02BFD34413509F79FFBFCC658A32216008BFC3D3D3D21CCF04BFB8CF183886480BBFA76D869B02A02E00000000000000003FA5316C0A18ADD63FB44538DE3B27EB3FBD2B643BC124F43FC2B452CF2224FA3FC68A288B60B7FC"}}
+{"expression":"map(a,f(a)(log10(a)))","inputs":{"a":"0x0203017803017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD4011333333333333401199999999999A401200000000000040126666666666664012CCCCCCCCCCCD4013333333333333401399999999999A401400000000000040146666666666664014CCCCCCCCCCCD4015333333333333401599999999999A401600000000000040166666666666664016CCCCCCCCCCCD4017333333333333401799999999999A401800000000000040186666666666664018CCCCCCCCCCCD4019333333333333401999999999999A401A000000000000401A666666666666401ACCCCCCCCCCCD401B333333333333401B99999999999A401C000000000000401C666666666666401CCCCCCCCCCCCD401D333333333333401D99999999999A401E000000000000401E666666666666401ECCCCCCCCCCCD401F333333333333401F99999999999A402000000000000040203333333333334020666666666666402099999999999A4020CCCCCCCCCCCD402100000000000040213333333333334021666666666666402199999999999A4021CCCCCCCCCCCD402200000000000040223333333333334022666666666666402299999999999A4022CCCCCCCCCCCD402300000000000040233333333333334023666666666666402399999999999A4023CCCCCCCCCCCD402400000000000040243333333333334024666666666666402499999999999A4024CCCCCCCCCCCD4025000000000000"},"result":{"expect":"0x0203017803017905017A07BFF0000000000000BFE65DF657B04300BFE0BB6C34D81502BFD977D95EC10C02BFD34413509F79FFBFCC658A32216008BFC3D3D3D21CCF04BFB8CF183886480BBFA76D869B02A02E00000000000000003FA5316C0A18ADD63FB44538DE3B27EB3FBD2B643BC124F43FC2B452CF2224FA3FC68A288B60B7FC3FCA209A84FBCFF93FCD7F59AA5BECB93FD056627D3F25F93FD1D71957EF04413FD34413509F79FF3FD49F3DAD416E7C3FD5EA40D1E28FBA3FD7268C826FE5FC3FD85561882E43FA3FD977D95EC10C023FDA8EEC5F8FC33C3FDB9B76C2EF81F83FDC9E3CB8308C7C3FDD97EDC5AD8FA83FDE8927964FD5FD3FDF727851619F993FE02A30498EB0FE3FE097AA8BC975DB3FE101E012E6B82E3FE1690163290F403FE1CD3AE6EF4FFC3FE22EB561CCC1003FE28D9654473F203FE2EA0052A00F9D3FE34413509F79FF3FE39BECE40418B03FE3F1A87EF0743D3FE4455FA37861EB3FE4972A114104DC3FE4E71DEE0018FE3FE5354FE987AFFE3FE581D35DF1753C3FE5CCBA6C66DEFC3FE6161616F1987F3FE65DF657B043013FE6A46A35BEE62D3FE6E97FD8179E9E3FE72D4496A6F4873FE76FC509C77DFB3FE7B10D1851CDDE3FE7F1280468033E3FE83020771F6D203FE86E008B2684D43FE8AAD1D681E1DC3FE8E69D7377A7FE3FE9216C08BE37DF3FE95B45D1008CCC3FE99432A1C8A23C3FE9CC39F1DE6DFD3FEA0362DF28679F3FEA39B4341932DB3FEA6F346CB4CA5C3FEAA3E9BB36752D3FEAD7DA0C5FDDFD3FEB0B0B0B78CC3F3FEB3D82260640A63FEB6F448F3F0CFC3FEBA057434368C83FEBD0BF0A1C7E003FEC00807A8871003FEC2F9FFC96FC203FEC5E21CC1A571C3FEC8C09FAEFCC9C3FECB95C732312DC3FECE61CF8EF36FE3FED124F2C9FABFA3FED3DF68C53D5B03FED691675A735B23FED93B22740313D3FEDBDCCC2473E2F3FEDE7694BC81EEA3FEE108AADFEB2D23FEE3933B990C1DC3FEE616726B60D4C3FEE8927964FD5FD3FEEB07792F0F0DD3FEED75991D76CFD3FEEFDCFF3D8BACB3FEF23DD0641323B3FEF498303A7C5213FEF6EC414B69BFC3FEF93A250E94D9C3FEFB81FBF41557E3FEFDC3E56F160DA3FF00000000000003FF011B349F11FB63FF02339EF0751963FF03494CE447B5D3FF045C4C033ADCE3FF056CA97287D1F"}}
+{"expression":"map(a,f(a)(log10(a)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x01010178030161BFF00000000000000162BFE65DF657B043000163BFE0BB6C34D81502"}}
+{"expression":"map(a,f(a)(log10(a)))","inputs":{"a":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x01020178017906016103626172BFE65DF657B04300016103666F6FBFF0000000000000016203626172BFD977D95EC10C02016203666F6FBFE0BB6C34D81502016303626172BFCC658A32216008016303666F6FBFD34413509F79FF"}}
+{"expression":"map(a,f(a)(log10(a)))","inputs":{"a":"0x010301780179017A1801610362617201693FE0000000000000016103626172016A3FE3333333333333016103626172016B3FE6666666666666016103626172016C3FE999999999999A016103666F6F01693FB999999999999A016103666F6F016A3FC999999999999A016103666F6F016B3FD3333333333333016103666F6F016C3FD999999999999A01620362617201693FF4CCCCCCCCCCCD016203626172016A3FF6666666666666016203626172016B3FF8000000000000016203626172016C3FF999999999999A016203666F6F01693FECCCCCCCCCCCCD016203666F6F016A3FF0000000000000016203666F6F016B3FF199999999999A016203666F6F016C3FF333333333333301630362617201694000CCCCCCCCCCCD016303626172016A400199999999999A016303626172016B4002666666666666016303626172016C4003333333333333016303666F6F01693FFB333333333333016303666F6F016A3FFCCCCCCCCCCCCD016303666F6F016B3FFE666666666666016303666F6F016C4000000000000000"},"result":{"expect":"0x010301780179017A180161036261720169BFD34413509F79FF016103626172016ABFCC658A32216008016103626172016BBFC3D3D3D21CCF04016103626172016CBFB8CF183886480B016103666F6F0169BFF0000000000000016103666F6F016ABFE65DF657B04300016103666F6F016BBFE0BB6C34D81502016103666F6F016CBFD977D95EC10C0201620362617201693FBD2B643BC124F4016203626172016A3FC2B452CF2224FA016203626172016B3FC68A288B60B7FC016203626172016C3FCA209A84FBCFF9016203666F6F0169BFA76D869B02A02E016203666F6F016A0000000000000000016203666F6F016B3FA5316C0A18ADD6016203666F6F016C3FB44538DE3B27EB01630362617201693FD49F3DAD416E7C016303626172016A3FD5EA40D1E28FBA016303626172016B3FD7268C826FE5FC016303626172016C3FD85561882E43FA016303666F6F01693FCD7F59AA5BECB9016303666F6F016A3FD056627D3F25F9016303666F6F016B3FD1D71957EF0441016303666F6F016C3FD34413509F79FF"}}
+{"expression":"map(a,f(a)(log10(a)))","inputs":{"a":"0x0301017902017803017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF6666666666666400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD03666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0301017902017803017A070203626172BFB8CF183886480BBFA76D869B02A02E00000000000000003FA5316C0A18ADD63FB44538DE3B27EB3FBD2B643BC124F43FC2B452CF2224FA3FD5EA40D1E28FBA3FD7268C826FE5FC3FD85561882E43FA3FD977D95EC10C023FDA8EEC5F8FC33C3FDB9B76C2EF81F83FDC9E3CB8308C7C3FE1CD3AE6EF4FFC3FE22EB561CCC1003FE28D9654473F203FE2EA0052A00F9D3FE34413509F79FF3FE39BECE40418B03FE3F1A87EF0743D03666F6FBFF0000000000000BFE65DF657B04300BFE0BB6C34D81502BFD977D95EC10C02BFD34413509F79FFBFCC658A32216008BFC3D3D3D21CCF043FC68A288B60B7FC3FCA209A84FBCFF93FCD7F59AA5BECB93FD056627D3F25F93FD1D71957EF04413FD34413509F79FF3FD49F3DAD416E7C3FDD97EDC5AD8FA83FDE8927964FD5FD3FDF727851619F993FE02A30498EB0FE3FE097AA8BC975DB3FE101E012E6B82E3FE1690163290F40"}}
+{"expression":"map(a,f(a)(log10(a)))","inputs":{"a":"0x03020178017A010179050C016101693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB3333333333330161016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD0161016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE6666666666660161016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000016201694000CCCCCCCCCCCD40040000000000004007333333333333400A666666666666400D99999999999A0162016A400199999999999A4004CCCCCCCCCCCD4008000000000000400B333333333333400E6666666666660162016B4002666666666666400599999999999A4008CCCCCCCCCCCD400C000000000000400F3333333333330162016C40033333333333334006666666666666400999999999999A400CCCCCCCCCCCCD40100000000000000163016940106666666666664012000000000000401399999999999A40153333333333334016CCCCCCCCCCCD0163016A4010CCCCCCCCCCCD40126666666666664014000000000000401599999999999A40173333333333330163016B40113333333333334012CCCCCCCCCCCD40146666666666664016000000000000401799999999999A0163016C401199999999999A40133333333333334014CCCCCCCCCCCD40166666666666664018000000000000"},"result":{"expect":"0x03020178017A010179050C01610169BFF0000000000000BFD34413509F79FFBFA76D869B02A02E3FBD2B643BC124F43FCD7F59AA5BECB90161016ABFE65DF657B04300BFCC658A3221600800000000000000003FC2B452CF2224FA3FD056627D3F25F90161016BBFE0BB6C34D81502BFC3D3D3D21CCF043FA5316C0A18ADD63FC68A288B60B7FC3FD1D71957EF04410161016CBFD977D95EC10C02BFB8CF183886480B3FB44538DE3B27EB3FCA209A84FBCFF93FD34413509F79FF016201693FD49F3DAD416E7C3FD977D95EC10C023FDD97EDC5AD8FA83FE097AA8BC975DB3FE22EB561CCC1000162016A3FD5EA40D1E28FBA3FDA8EEC5F8FC33C3FDE8927964FD5FD3FE101E012E6B82E3FE28D9654473F200162016B3FD7268C826FE5FC3FDB9B76C2EF81F83FDF727851619F993FE1690163290F403FE2EA0052A00F9D0162016C3FD85561882E43FA3FDC9E3CB8308C7C3FE02A30498EB0FE3FE1CD3AE6EF4FFC3FE34413509F79FF016301693FE39BECE40418B03FE4E71DEE0018FE3FE6161616F1987F3FE72D4496A6F4873FE83020771F6D200163016A3FE3F1A87EF0743D3FE5354FE987AFFE3FE65DF657B043013FE76FC509C77DFB3FE86E008B2684D40163016B3FE4455FA37861EB3FE581D35DF1753C3FE6A46A35BEE62D3FE7B10D1851CDDE3FE8AAD1D681E1DC0163016C3FE4972A114104DC3FE5CCBA6C66DEFC3FE6E97FD8179E9E3FE7F1280468033E3FE8E69D7377A7FE"}}
+{"expression":"log(a)","inputs":{"a":"0x02003FB999999999999A"},"result":{"expect":"0x0200C0026BB1BBB55515"}}
+{"expression":"log(a)","inputs":{"a":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x0201017803C0026BB1BBB55515BFF9C041F7ED8D33BFF34378FCBDA721"}}
+{"expression":"log(a)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x0202017803017905C0026BB1BBB55515BFF9C041F7ED8D33BFF34378FCBDA721BFED5240F0E0E077BFE62E42FEFA39EFBFE058AEFA811452BFD6D3C324E13F50BFCC8FF7C79A9A20BFBAF8E8210A415C00000000000000003FB8663F793C46CC3FC7565011E496753FD0CA937BE1B9DC3FD588C2D913348F3FD9F323ECBF984C"}}
+{"expression":"log(a)","inputs":{"a":"0x0203017803017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD4011333333333333401199999999999A401200000000000040126666666666664012CCCCCCCCCCCD4013333333333333401399999999999A401400000000000040146666666666664014CCCCCCCCCCCD4015333333333333401599999999999A401600000000000040166666666666664016CCCCCCCCCCCD4017333333333333401799999999999A401800000000000040186666666666664018CCCCCCCCCCCD4019333333333333401999999999999A401A000000000000401A666666666666401ACCCCCCCCCCCD401B333333333333401B99999999999A401C000000000000401C666666666666401CCCCCCCCCCCCD401D333333333333401D99999999999A401E000000000000401E666666666666401ECCCCCCCCCCCD401F333333333333401F99999999999A402000000000000040203333333333334020666666666666402099999999999A4020CCCCCCCCCCCD402100000000000040213333333333334021666666666666402199999999999A4021CCCCCCCCCCCD402200000000000040223333333333334022666666666666402299999999999A4022CCCCCCCCCCCD402300000000000040233333333333334023666666666666402399999999999A4023CCCCCCCCCCCD402400000000000040243333333333334024666666666666402499999999999A4024CCCCCCCCCCCD4025000000000000"},"result":{"expect":"0x0203017803017905017A07C0026BB1BBB55515BFF9C041F7ED8D33BFF34378FCBDA721BFED5240F0E0E077BFE62E42FEFA39EFBFE058AEFA811452BFD6D3C324E13F50BFCC8FF7C79A9A20BFBAF8E8210A415C00000000000000003FB8663F793C46CC3FC7565011E496753FD0CA937BE1B9DC3FD588C2D913348F3FD9F323ECBF984C3FDE148A1A2726CF3FE0FAE81914A9913FE2CF25FAD8F1C43FE48A11293D785B3FE62E42FEFA39EF3FE7BDF362E9666E3FE93B0AEE21C2C93FEAA73108717B693FEC03D703735F8C3FED5240F0E0E0783FEE938CBCEB16DD3FEFC8B7F138BDEA3FF0795235C1EA1B3FF1090E203152123FF193EA7AAD030B3FF21A3919B7AC893FF29C440606E6AB3FF31A4E7240C7773FF394958C0771C03FF40B512EB53D603FF47EB47CE995D93FF4EEEE650AE5503FF55C2A141BD9253FF5C68F59A571813FF62E42FEFA39EF3FF6936713B2AE703FF6F61B30F1D02F3FF7567CB4BF2DF73FF7B4A6F68DFE5C3FF810B375DCE91E3FF86ABA03B5DAAC3FF8C2D0E7B737423FF9190D0136CCBE3FF96D81E4FA0A843FF9C041F7ED8D333FFA115E873757D33FFA60E7DDF2A8663FFAAEED58D9CF2A3FFAFB7D78197BED3FFB46A5EF8151A03FFB9073B53F07133FFBD8F30F4BBF393FFC202F9FAE6F0A3FFC66346FB1FBB83FFCAB0BFA2A20023FFCEEC034DF06083FFD315A9934C9813FFD72E42C21B6413FFDB365858403A33FFDF2E6D6E5FBAA3FFE316FF1BDE46E3FFE6F084D359A8B3FFEABB70B848EB83FFEE782FEE5C0C03FFF2272AE325A573FFF5C8C5928B0F93FFF95D5FC66B2D13FFFCE55551E156E40000307F244012440001E85798EB9A3400039A5C9CC7B0E4000546B52E30F6240006ED86C91473D400088EF57AA0DD14000A2B23F3BAB734000BC2339A4B1004000D5444997E5B44000EE175F1073EE4001069E5837769340011EDB023BF0FE400136CF1A1E257740014E7C4D6F2A8E400165E43B058DAA40017D0873A7C0D7400193EA7AAD030B4001AA8BC69564674001C0EDC1997BD24001D711CA3257CA4001ECF9339A2A1D400202A5464624B1400218174059F4DB40022D50561542DA40024251B23B93BE4002571C7676E54140026BB1BBB555164002801292821F4C40029440035A3A654002A83B0EFCD2C24002BC04AEB7E2AF4002CF9DD4B12035"}}
+{"expression":"log(a)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x01010178030161C0026BB1BBB555150162BFF9C041F7ED8D330163BFF34378FCBDA721"}}
+{"expression":"log(a)","inputs":{"a":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x01020178017906016103626172BFF9C041F7ED8D33016103666F6FC0026BB1BBB55515016203626172BFED5240F0E0E077016203666F6FBFF34378FCBDA721016303626172BFE058AEFA811452016303666F6FBFE62E42FEFA39EF"}}
+{"expression":"log(a)","inputs":{"a":"0x010301780179017A1801610362617201693FE0000000000000016103626172016A3FE3333333333333016103626172016B3FE6666666666666016103626172016C3FE999999999999A016103666F6F01693FB999999999999A016103666F6F016A3FC999999999999A016103666F6F016B3FD3333333333333016103666F6F016C3FD999999999999A01620362617201693FF4CCCCCCCCCCCD016203626172016A3FF6666666666666016203626172016B3FF8000000000000016203626172016C3FF999999999999A016203666F6F01693FECCCCCCCCCCCCD016203666F6F016A3FF0000000000000016203666F6F016B3FF199999999999A016203666F6F016C3FF333333333333301630362617201694000CCCCCCCCCCCD016303626172016A400199999999999A016303626172016B4002666666666666016303626172016C4003333333333333016303666F6F01693FFB333333333333016303666F6F016A3FFCCCCCCCCCCCCD016303666F6F016B3FFE666666666666016303666F6F016C4000000000000000"},"result":{"expect":"0x010301780179017A180161036261720169BFE62E42FEFA39EF016103626172016ABFE058AEFA811452016103626172016BBFD6D3C324E13F50016103626172016CBFCC8FF7C79A9A20016103666F6F0169C0026BB1BBB55515016103666F6F016ABFF9C041F7ED8D33016103666F6F016BBFF34378FCBDA721016103666F6F016CBFED5240F0E0E07701620362617201693FD0CA937BE1B9DC016203626172016A3FD588C2D913348F016203626172016B3FD9F323ECBF984C016203626172016C3FDE148A1A2726CF016203666F6F0169BFBAF8E8210A415C016203666F6F016A0000000000000000016203666F6F016B3FB8663F793C46CC016203666F6F016C3FC7565011E4967501630362617201693FE7BDF362E9666E016303626172016A3FE93B0AEE21C2C9016303626172016B3FEAA73108717B69016303626172016C3FEC03D703735F8C016303666F6F01693FE0FAE81914A991016303666F6F016A3FE2CF25FAD8F1C4016303666F6F016B3FE48A11293D785B016303666F6F016C3FE62E42FEFA39EF"}}
+{"expression":"log(a)","inputs":{"a":"0x0301017902017803017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF6666666666666400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD03666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0301017902017803017A070203626172BFCC8FF7C79A9A20BFBAF8E8210A415C00000000000000003FB8663F793C46CC3FC7565011E496753FD0CA937BE1B9DC3FD588C2D913348F3FE93B0AEE21C2C93FEAA73108717B693FEC03D703735F8C3FED5240F0E0E0783FEE938CBCEB16DD3FEFC8B7F138BDEA3FF0795235C1EA1B3FF47EB47CE995D93FF4EEEE650AE5503FF55C2A141BD9253FF5C68F59A571813FF62E42FEFA39EF3FF6936713B2AE703FF6F61B30F1D02F03666F6FC0026BB1BBB55515BFF9C041F7ED8D33BFF34378FCBDA721BFED5240F0E0E077BFE62E42FEFA39EFBFE058AEFA811452BFD6D3C324E13F503FD9F323ECBF984C3FDE148A1A2726CF3FE0FAE81914A9913FE2CF25FAD8F1C43FE48A11293D785B3FE62E42FEFA39EF3FE7BDF362E9666E3FF1090E203152123FF193EA7AAD030B3FF21A3919B7AC893FF29C440606E6AB3FF31A4E7240C7773FF394958C0771C03FF40B512EB53D60"}}
+{"expression":"log(a)","inputs":{"a":"0x03020178017A010179050C016101693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB3333333333330161016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD0161016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE6666666666660161016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000016201694000CCCCCCCCCCCD40040000000000004007333333333333400A666666666666400D99999999999A0162016A400199999999999A4004CCCCCCCCCCCD4008000000000000400B333333333333400E6666666666660162016B4002666666666666400599999999999A4008CCCCCCCCCCCD400C000000000000400F3333333333330162016C40033333333333334006666666666666400999999999999A400CCCCCCCCCCCCD40100000000000000163016940106666666666664012000000000000401399999999999A40153333333333334016CCCCCCCCCCCD0163016A4010CCCCCCCCCCCD40126666666666664014000000000000401599999999999A40173333333333330163016B40113333333333334012CCCCCCCCCCCD40146666666666664016000000000000401799999999999A0163016C401199999999999A40133333333333334014CCCCCCCCCCCD40166666666666664018000000000000"},"result":{"expect":"0x03020178017A010179050C01610169C0026BB1BBB55515BFE62E42FEFA39EFBFBAF8E8210A415C3FD0CA937BE1B9DC3FE0FAE81914A9910161016ABFF9C041F7ED8D33BFE058AEFA81145200000000000000003FD588C2D913348F3FE2CF25FAD8F1C40161016BBFF34378FCBDA721BFD6D3C324E13F503FB8663F793C46CC3FD9F323ECBF984C3FE48A11293D785B0161016CBFED5240F0E0E077BFCC8FF7C79A9A203FC7565011E496753FDE148A1A2726CF3FE62E42FEFA39EF016201693FE7BDF362E9666E3FED5240F0E0E0783FF1090E203152123FF31A4E7240C7773FF4EEEE650AE5500162016A3FE93B0AEE21C2C93FEE938CBCEB16DD3FF193EA7AAD030B3FF394958C0771C03FF55C2A141BD9250162016B3FEAA73108717B693FEFC8B7F138BDEA3FF21A3919B7AC893FF40B512EB53D603FF5C68F59A571810162016C3FEC03D703735F8C3FF0795235C1EA1B3FF29C440606E6AB3FF47EB47CE995D93FF62E42FEFA39EF016301693FF6936713B2AE703FF810B375DCE91E3FF96D81E4FA0A843FFAAEED58D9CF2A3FFBD8F30F4BBF390163016A3FF6F61B30F1D02F3FF86ABA03B5DAAC3FF9C041F7ED8D333FFAFB7D78197BED3FFC202F9FAE6F0A0163016B3FF7567CB4BF2DF73FF8C2D0E7B737423FFA115E873757D33FFB46A5EF8151A03FFC66346FB1FBB80163016C3FF7B4A6F68DFE5C3FF9190D0136CCBE3FFA60E7DDF2A8663FFB9073B53F07133FFCAB0BFA2A2002"}}
+{"expression":"map(a,f(a)(log(a)))","inputs":{"a":"0x02003FB999999999999A"},"result":{"expect":"0x0200C0026BB1BBB55515"}}
+{"expression":"map(a,f(a)(log(a)))","inputs":{"a":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x0201017803C0026BB1BBB55515BFF9C041F7ED8D33BFF34378FCBDA721"}}
+{"expression":"map(a,f(a)(log(a)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x0202017803017905C0026BB1BBB55515BFF9C041F7ED8D33BFF34378FCBDA721BFED5240F0E0E077BFE62E42FEFA39EFBFE058AEFA811452BFD6D3C324E13F50BFCC8FF7C79A9A20BFBAF8E8210A415C00000000000000003FB8663F793C46CC3FC7565011E496753FD0CA937BE1B9DC3FD588C2D913348F3FD9F323ECBF984C"}}
+{"expression":"map(a,f(a)(log(a)))","inputs":{"a":"0x0203017803017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD4011333333333333401199999999999A401200000000000040126666666666664012CCCCCCCCCCCD4013333333333333401399999999999A401400000000000040146666666666664014CCCCCCCCCCCD4015333333333333401599999999999A401600000000000040166666666666664016CCCCCCCCCCCD4017333333333333401799999999999A401800000000000040186666666666664018CCCCCCCCCCCD4019333333333333401999999999999A401A000000000000401A666666666666401ACCCCCCCCCCCD401B333333333333401B99999999999A401C000000000000401C666666666666401CCCCCCCCCCCCD401D333333333333401D99999999999A401E000000000000401E666666666666401ECCCCCCCCCCCD401F333333333333401F99999999999A402000000000000040203333333333334020666666666666402099999999999A4020CCCCCCCCCCCD402100000000000040213333333333334021666666666666402199999999999A4021CCCCCCCCCCCD402200000000000040223333333333334022666666666666402299999999999A4022CCCCCCCCCCCD402300000000000040233333333333334023666666666666402399999999999A4023CCCCCCCCCCCD402400000000000040243333333333334024666666666666402499999999999A4024CCCCCCCCCCCD4025000000000000"},"result":{"expect":"0x0203017803017905017A07C0026BB1BBB55515BFF9C041F7ED8D33BFF34378FCBDA721BFED5240F0E0E077BFE62E42FEFA39EFBFE058AEFA811452BFD6D3C324E13F50BFCC8FF7C79A9A20BFBAF8E8210A415C00000000000000003FB8663F793C46CC3FC7565011E496753FD0CA937BE1B9DC3FD588C2D913348F3FD9F323ECBF984C3FDE148A1A2726CF3FE0FAE81914A9913FE2CF25FAD8F1C43FE48A11293D785B3FE62E42FEFA39EF3FE7BDF362E9666E3FE93B0AEE21C2C93FEAA73108717B693FEC03D703735F8C3FED5240F0E0E0783FEE938CBCEB16DD3FEFC8B7F138BDEA3FF0795235C1EA1B3FF1090E203152123FF193EA7AAD030B3FF21A3919B7AC893FF29C440606E6AB3FF31A4E7240C7773FF394958C0771C03FF40B512EB53D603FF47EB47CE995D93FF4EEEE650AE5503FF55C2A141BD9253FF5C68F59A571813FF62E42FEFA39EF3FF6936713B2AE703FF6F61B30F1D02F3FF7567CB4BF2DF73FF7B4A6F68DFE5C3FF810B375DCE91E3FF86ABA03B5DAAC3FF8C2D0E7B737423FF9190D0136CCBE3FF96D81E4FA0A843FF9C041F7ED8D333FFA115E873757D33FFA60E7DDF2A8663FFAAEED58D9CF2A3FFAFB7D78197BED3FFB46A5EF8151A03FFB9073B53F07133FFBD8F30F4BBF393FFC202F9FAE6F0A3FFC66346FB1FBB83FFCAB0BFA2A20023FFCEEC034DF06083FFD315A9934C9813FFD72E42C21B6413FFDB365858403A33FFDF2E6D6E5FBAA3FFE316FF1BDE46E3FFE6F084D359A8B3FFEABB70B848EB83FFEE782FEE5C0C03FFF2272AE325A573FFF5C8C5928B0F93FFF95D5FC66B2D13FFFCE55551E156E40000307F244012440001E85798EB9A3400039A5C9CC7B0E4000546B52E30F6240006ED86C91473D400088EF57AA0DD14000A2B23F3BAB734000BC2339A4B1004000D5444997E5B44000EE175F1073EE4001069E5837769340011EDB023BF0FE400136CF1A1E257740014E7C4D6F2A8E400165E43B058DAA40017D0873A7C0D7400193EA7AAD030B4001AA8BC69564674001C0EDC1997BD24001D711CA3257CA4001ECF9339A2A1D400202A5464624B1400218174059F4DB40022D50561542DA40024251B23B93BE4002571C7676E54140026BB1BBB555164002801292821F4C40029440035A3A654002A83B0EFCD2C24002BC04AEB7E2AF4002CF9DD4B12035"}}
+{"expression":"map(a,f(a)(log(a)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x01010178030161C0026BB1BBB555150162BFF9C041F7ED8D330163BFF34378FCBDA721"}}
+{"expression":"map(a,f(a)(log(a)))","inputs":{"a":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x01020178017906016103626172BFF9C041F7ED8D33016103666F6FC0026BB1BBB55515016203626172BFED5240F0E0E077016203666F6FBFF34378FCBDA721016303626172BFE058AEFA811452016303666F6FBFE62E42FEFA39EF"}}
+{"expression":"map(a,f(a)(log(a)))","inputs":{"a":"0x010301780179017A1801610362617201693FE0000000000000016103626172016A3FE3333333333333016103626172016B3FE6666666666666016103626172016C3FE999999999999A016103666F6F01693FB999999999999A016103666F6F016A3FC999999999999A016103666F6F016B3FD3333333333333016103666F6F016C3FD999999999999A01620362617201693FF4CCCCCCCCCCCD016203626172016A3FF6666666666666016203626172016B3FF8000000000000016203626172016C3FF999999999999A016203666F6F01693FECCCCCCCCCCCCD016203666F6F016A3FF0000000000000016203666F6F016B3FF199999999999A016203666F6F016C3FF333333333333301630362617201694000CCCCCCCCCCCD016303626172016A400199999999999A016303626172016B4002666666666666016303626172016C4003333333333333016303666F6F01693FFB333333333333016303666F6F016A3FFCCCCCCCCCCCCD016303666F6F016B3FFE666666666666016303666F6F016C4000000000000000"},"result":{"expect":"0x010301780179017A180161036261720169BFE62E42FEFA39EF016103626172016ABFE058AEFA811452016103626172016BBFD6D3C324E13F50016103626172016CBFCC8FF7C79A9A20016103666F6F0169C0026BB1BBB55515016103666F6F016ABFF9C041F7ED8D33016103666F6F016BBFF34378FCBDA721016103666F6F016CBFED5240F0E0E07701620362617201693FD0CA937BE1B9DC016203626172016A3FD588C2D913348F016203626172016B3FD9F323ECBF984C016203626172016C3FDE148A1A2726CF016203666F6F0169BFBAF8E8210A415C016203666F6F016A0000000000000000016203666F6F016B3FB8663F793C46CC016203666F6F016C3FC7565011E4967501630362617201693FE7BDF362E9666E016303626172016A3FE93B0AEE21C2C9016303626172016B3FEAA73108717B69016303626172016C3FEC03D703735F8C016303666F6F01693FE0FAE81914A991016303666F6F016A3FE2CF25FAD8F1C4016303666F6F016B3FE48A11293D785B016303666F6F016C3FE62E42FEFA39EF"}}
+{"expression":"map(a,f(a)(log(a)))","inputs":{"a":"0x0301017902017803017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF6666666666666400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD03666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0301017902017803017A070203626172BFCC8FF7C79A9A20BFBAF8E8210A415C00000000000000003FB8663F793C46CC3FC7565011E496753FD0CA937BE1B9DC3FD588C2D913348F3FE93B0AEE21C2C93FEAA73108717B693FEC03D703735F8C3FED5240F0E0E0783FEE938CBCEB16DD3FEFC8B7F138BDEA3FF0795235C1EA1B3FF47EB47CE995D93FF4EEEE650AE5503FF55C2A141BD9253FF5C68F59A571813FF62E42FEFA39EF3FF6936713B2AE703FF6F61B30F1D02F03666F6FC0026BB1BBB55515BFF9C041F7ED8D33BFF34378FCBDA721BFED5240F0E0E077BFE62E42FEFA39EFBFE058AEFA811452BFD6D3C324E13F503FD9F323ECBF984C3FDE148A1A2726CF3FE0FAE81914A9913FE2CF25FAD8F1C43FE48A11293D785B3FE62E42FEFA39EF3FE7BDF362E9666E3FF1090E203152123FF193EA7AAD030B3FF21A3919B7AC893FF29C440606E6AB3FF31A4E7240C7773FF394958C0771C03FF40B512EB53D60"}}
+{"expression":"map(a,f(a)(log(a)))","inputs":{"a":"0x03020178017A010179050C016101693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB3333333333330161016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD0161016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE6666666666660161016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000016201694000CCCCCCCCCCCD40040000000000004007333333333333400A666666666666400D99999999999A0162016A400199999999999A4004CCCCCCCCCCCD4008000000000000400B333333333333400E6666666666660162016B4002666666666666400599999999999A4008CCCCCCCCCCCD400C000000000000400F3333333333330162016C40033333333333334006666666666666400999999999999A400CCCCCCCCCCCCD40100000000000000163016940106666666666664012000000000000401399999999999A40153333333333334016CCCCCCCCCCCD0163016A4010CCCCCCCCCCCD40126666666666664014000000000000401599999999999A40173333333333330163016B40113333333333334012CCCCCCCCCCCD40146666666666664016000000000000401799999999999A0163016C401199999999999A40133333333333334014CCCCCCCCCCCD40166666666666664018000000000000"},"result":{"expect":"0x03020178017A010179050C01610169C0026BB1BBB55515BFE62E42FEFA39EFBFBAF8E8210A415C3FD0CA937BE1B9DC3FE0FAE81914A9910161016ABFF9C041F7ED8D33BFE058AEFA81145200000000000000003FD588C2D913348F3FE2CF25FAD8F1C40161016BBFF34378FCBDA721BFD6D3C324E13F503FB8663F793C46CC3FD9F323ECBF984C3FE48A11293D785B0161016CBFED5240F0E0E077BFCC8FF7C79A9A203FC7565011E496753FDE148A1A2726CF3FE62E42FEFA39EF016201693FE7BDF362E9666E3FED5240F0E0E0783FF1090E203152123FF31A4E7240C7773FF4EEEE650AE5500162016A3FE93B0AEE21C2C93FEE938CBCEB16DD3FF193EA7AAD030B3FF394958C0771C03FF55C2A141BD9250162016B3FEAA73108717B693FEFC8B7F138BDEA3FF21A3919B7AC893FF40B512EB53D603FF5C68F59A571810162016C3FEC03D703735F8C3FF0795235C1EA1B3FF29C440606E6AB3FF47EB47CE995D93FF62E42FEFA39EF016301693FF6936713B2AE703FF810B375DCE91E3FF96D81E4FA0A843FFAAEED58D9CF2A3FFBD8F30F4BBF390163016A3FF6F61B30F1D02F3FF86ABA03B5DAAC3FF9C041F7ED8D333FFAFB7D78197BED3FFC202F9FAE6F0A0163016B3FF7567CB4BF2DF73FF8C2D0E7B737423FFA115E873757D33FFB46A5EF8151A03FFC66346FB1FBB80163016C3FF7B4A6F68DFE5C3FF9190D0136CCBE3FFA60E7DDF2A8663FFB9073B53F07133FFCAB0BFA2A2002"}}
+{"expression":"sqrt(a)","inputs":{"a":"0x02003FB999999999999A"},"result":{"expect":"0x02003FD43D136248490F"}}
+{"expression":"sqrt(a)","inputs":{"a":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FD43D136248490F3FDC9F25C5BFEDD93FE186F174F88472"}}
+{"expression":"sqrt(a)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178030179053FD43D136248490F3FDC9F25C5BFEDD93FE186F174F884723FE43D136248490F3FE6A09E667F3BCD3FE8C97EF43F72483FEAC5EB3F7AB2F83FEC9F25C5BFEDD93FEE5B9D136C6D963FF00000000000003FF0C7EBC96A56F63FF186F174F884723FF23E2896280F233FF2EE73DADC9B573FF3988E1409212E"}}
+{"expression":"sqrt(a)","inputs":{"a":"0x0203017803017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD4011333333333333401199999999999A401200000000000040126666666666664012CCCCCCCCCCCD4013333333333333401399999999999A401400000000000040146666666666664014CCCCCCCCCCCD4015333333333333401599999999999A401600000000000040166666666666664016CCCCCCCCCCCD4017333333333333401799999999999A401800000000000040186666666666664018CCCCCCCCCCCD4019333333333333401999999999999A401A000000000000401A666666666666401ACCCCCCCCCCCD401B333333333333401B99999999999A401C000000000000401C666666666666401CCCCCCCCCCCCD401D333333333333401D99999999999A401E000000000000401E666666666666401ECCCCCCCCCCCD401F333333333333401F99999999999A402000000000000040203333333333334020666666666666402099999999999A4020CCCCCCCCCCCD402100000000000040213333333333334021666666666666402199999999999A4021CCCCCCCCCCCD402200000000000040223333333333334022666666666666402299999999999A4022CCCCCCCCCCCD402300000000000040233333333333334023666666666666402399999999999A4023CCCCCCCCCCCD402400000000000040243333333333334024666666666666402499999999999A4024CCCCCCCCCCCD4025000000000000"},"result":{"expect":"0x0203017803017905017A073FD43D136248490F3FDC9F25C5BFEDD93FE186F174F884723FE43D136248490F3FE6A09E667F3BCD3FE8C97EF43F72483FEAC5EB3F7AB2F83FEC9F25C5BFEDD93FEE5B9D136C6D963FF00000000000003FF0C7EBC96A56F63FF186F174F884723FF23E2896280F233FF2EE73DADC9B573FF3988E1409212E3FF43D136248490F3FF4DC87D61451DA3FF5775C544FF2633FF60DF2453AB7233FF6A09E667F3BCD3FF72FAAFC7E3CD73FF7BB598C88B4AD3FF843E43D85E5B13FF8C97EF43F72483FF94C583ADA5B533FF9CC99FF02C4813FFA4A6A2F74C6AC3FFAC5EB3F7AB2F83FFB3F3C957429DA3FFBB67AE8584CAA3FFC2BC08F4BFA983FFC9F25C5BFEDD93FFD10C0E60BE3083FFD80A69C19E42A3FFDEEEA11683F493FFE5B9D136C6D963FFEC6D0353167A93FFF3092ECE5BC353FFF98F3ADEF13F24000000000000000400032E249CC617140006526AA25A13B400096D2BC865F234000C7EBC96A56F64000F876CCDF6CD9400128787C6F7D7A400157F54C76D72F400186F174F884724001B570F5FF3FED4001E3779B97F4A8400211090171020F40023E2896280F2340026AD99E4F00174002971F372F95B64002C2FC595456A74002EE73DADC9B574003198871A0E80E4003443CB52C2A8540036E93208DED544003988E1409212E4003C22FD6A2B7B14003EB7A9792F3C6400414706F9C063A40043D136248490F400465655F122FF640048D684277CF0B4004B51DD6FBA9BB4004DC87D61451DA400503A7E90C397B40052A7FA9D2F8EA40055110A3C12C5E4005775C544FF26340059D642BC4FC1C4005C3298DD40B254005E8ADD236A58F40060DF2453AB723400632F82848C789400657C0B2625EB440067C4D109924644006A09E667F3BCD4006C4B5CE9152314006E8945A9ACD9240070C3B1414801740072FAAFC7E3CD7400752E50DB3A3A2400775EA3A3C72D2400798BB6D98A8324007BB598C88B4AD4007DDC575520155400800000000000040082209FEA1FD38400843E43D85E5B14008658F83702DC24008870C91D106234008A85C24F706594008C97EF43F72484008EA75B2443DF040090B410D07F01E40092BE1AE1F827140094C583ADA5B5340096CA554687C8940098CC997FEFF4C4009ACC59EFAF54B4009CC99FF02C4814009EC474A261264"}}
+{"expression":"sqrt(a)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FD43D136248490F01623FDC9F25C5BFEDD901633FE186F174F88472"}}
+{"expression":"sqrt(a)","inputs":{"a":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179060161036261723FDC9F25C5BFEDD9016103666F6F3FD43D136248490F0162036261723FE43D136248490F016203666F6F3FE186F174F884720163036261723FE8C97EF43F7248016303666F6F3FE6A09E667F3BCD"}}
+{"expression":"sqrt(a)","inputs":{"a":"0x010301780179017A1801610362617201693FE0000000000000016103626172016A3FE3333333333333016103626172016B3FE6666666666666016103626172016C3FE999999999999A016103666F6F01693FB999999999999A016103666F6F016A3FC999999999999A016103666F6F016B3FD3333333333333016103666F6F016C3FD999999999999A01620362617201693FF4CCCCCCCCCCCD016203626172016A3FF6666666666666016203626172016B3FF8000000000000016203626172016C3FF999999999999A016203666F6F01693FECCCCCCCCCCCCD016203666F6F016A3FF0000000000000016203666F6F016B3FF199999999999A016203666F6F016C3FF333333333333301630362617201694000CCCCCCCCCCCD016303626172016A400199999999999A016303626172016B4002666666666666016303626172016C4003333333333333016303666F6F01693FFB333333333333016303666F6F016A3FFCCCCCCCCCCCCD016303666F6F016B3FFE666666666666016303666F6F016C4000000000000000"},"result":{"expect":"0x010301780179017A1801610362617201693FE6A09E667F3BCD016103626172016A3FE8C97EF43F7248016103626172016B3FEAC5EB3F7AB2F8016103626172016C3FEC9F25C5BFEDD9016103666F6F01693FD43D136248490F016103666F6F016A3FDC9F25C5BFEDD9016103666F6F016B3FE186F174F88472016103666F6F016C3FE43D136248490F01620362617201693FF23E2896280F23016203626172016A3FF2EE73DADC9B57016203626172016B3FF3988E1409212E016203626172016C3FF43D136248490F016203666F6F01693FEE5B9D136C6D96016203666F6F016A3FF0000000000000016203666F6F016B3FF0C7EBC96A56F6016203666F6F016C3FF186F174F8847201630362617201693FF72FAAFC7E3CD7016303626172016A3FF7BB598C88B4AD016303626172016B3FF843E43D85E5B1016303626172016C3FF8C97EF43F7248016303666F6F01693FF4DC87D61451DA016303666F6F016A3FF5775C544FF263016303666F6F016B3FF60DF2453AB723016303666F6F016C3FF6A09E667F3BCD"}}
+{"expression":"sqrt(a)","inputs":{"a":"0x0301017902017803017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF6666666666666400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD03666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0301017902017803017A0702036261723FEC9F25C5BFEDD93FEE5B9D136C6D963FF00000000000003FF0C7EBC96A56F63FF186F174F884723FF23E2896280F233FF2EE73DADC9B573FF7BB598C88B4AD3FF843E43D85E5B13FF8C97EF43F72483FF94C583ADA5B533FF9CC99FF02C4813FFA4A6A2F74C6AC3FFAC5EB3F7AB2F83FFE5B9D136C6D963FFEC6D0353167A93FFF3092ECE5BC353FFF98F3ADEF13F24000000000000000400032E249CC617140006526AA25A13B03666F6F3FD43D136248490F3FDC9F25C5BFEDD93FE186F174F884723FE43D136248490F3FE6A09E667F3BCD3FE8C97EF43F72483FEAC5EB3F7AB2F83FF3988E1409212E3FF43D136248490F3FF4DC87D61451DA3FF5775C544FF2633FF60DF2453AB7233FF6A09E667F3BCD3FF72FAAFC7E3CD73FFB3F3C957429DA3FFBB67AE8584CAA3FFC2BC08F4BFA983FFC9F25C5BFEDD93FFD10C0E60BE3083FFD80A69C19E42A3FFDEEEA11683F49"}}
+{"expression":"sqrt(a)","inputs":{"a":"0x03020178017A010179050C016101693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB3333333333330161016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD0161016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE6666666666660161016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000016201694000CCCCCCCCCCCD40040000000000004007333333333333400A666666666666400D99999999999A0162016A400199999999999A4004CCCCCCCCCCCD4008000000000000400B333333333333400E6666666666660162016B4002666666666666400599999999999A4008CCCCCCCCCCCD400C000000000000400F3333333333330162016C40033333333333334006666666666666400999999999999A400CCCCCCCCCCCCD40100000000000000163016940106666666666664012000000000000401399999999999A40153333333333334016CCCCCCCCCCCD0163016A4010CCCCCCCCCCCD40126666666666664014000000000000401599999999999A40173333333333330163016B40113333333333334012CCCCCCCCCCCD40146666666666664016000000000000401799999999999A0163016C401199999999999A40133333333333334014CCCCCCCCCCCD40166666666666664018000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FD43D136248490F3FE6A09E667F3BCD3FEE5B9D136C6D963FF23E2896280F233FF4DC87D61451DA0161016A3FDC9F25C5BFEDD93FE8C97EF43F72483FF00000000000003FF2EE73DADC9B573FF5775C544FF2630161016B3FE186F174F884723FEAC5EB3F7AB2F83FF0C7EBC96A56F63FF3988E1409212E3FF60DF2453AB7230161016C3FE43D136248490F3FEC9F25C5BFEDD93FF186F174F884723FF43D136248490F3FF6A09E667F3BCD016201693FF72FAAFC7E3CD73FF94C583ADA5B533FFB3F3C957429DA3FFD10C0E60BE3083FFEC6D0353167A90162016A3FF7BB598C88B4AD3FF9CC99FF02C4813FFBB67AE8584CAA3FFD80A69C19E42A3FFF3092ECE5BC350162016B3FF843E43D85E5B13FFA4A6A2F74C6AC3FFC2BC08F4BFA983FFDEEEA11683F493FFF98F3ADEF13F20162016C3FF8C97EF43F72483FFAC5EB3F7AB2F83FFC9F25C5BFEDD93FFE5B9D136C6D96400000000000000001630169400032E249CC61714000F876CCDF6CD94001B570F5FF3FED40026AD99E4F00174003198871A0E80E0163016A40006526AA25A13B400128787C6F7D7A4001E3779B97F4A84002971F372F95B64003443CB52C2A850163016B400096D2BC865F23400157F54C76D72F400211090171020F4002C2FC595456A740036E93208DED540163016C4000C7EBC96A56F6400186F174F8847240023E2896280F234002EE73DADC9B574003988E1409212E"}}
+{"expression":"map(a,f(a)(sqrt(a)))","inputs":{"a":"0x02003FB999999999999A"},"result":{"expect":"0x02003FD43D136248490F"}}
+{"expression":"map(a,f(a)(sqrt(a)))","inputs":{"a":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FD43D136248490F3FDC9F25C5BFEDD93FE186F174F88472"}}
+{"expression":"map(a,f(a)(sqrt(a)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178030179053FD43D136248490F3FDC9F25C5BFEDD93FE186F174F884723FE43D136248490F3FE6A09E667F3BCD3FE8C97EF43F72483FEAC5EB3F7AB2F83FEC9F25C5BFEDD93FEE5B9D136C6D963FF00000000000003FF0C7EBC96A56F63FF186F174F884723FF23E2896280F233FF2EE73DADC9B573FF3988E1409212E"}}
+{"expression":"map(a,f(a)(sqrt(a)))","inputs":{"a":"0x0203017803017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD4011333333333333401199999999999A401200000000000040126666666666664012CCCCCCCCCCCD4013333333333333401399999999999A401400000000000040146666666666664014CCCCCCCCCCCD4015333333333333401599999999999A401600000000000040166666666666664016CCCCCCCCCCCD4017333333333333401799999999999A401800000000000040186666666666664018CCCCCCCCCCCD4019333333333333401999999999999A401A000000000000401A666666666666401ACCCCCCCCCCCD401B333333333333401B99999999999A401C000000000000401C666666666666401CCCCCCCCCCCCD401D333333333333401D99999999999A401E000000000000401E666666666666401ECCCCCCCCCCCD401F333333333333401F99999999999A402000000000000040203333333333334020666666666666402099999999999A4020CCCCCCCCCCCD402100000000000040213333333333334021666666666666402199999999999A4021CCCCCCCCCCCD402200000000000040223333333333334022666666666666402299999999999A4022CCCCCCCCCCCD402300000000000040233333333333334023666666666666402399999999999A4023CCCCCCCCCCCD402400000000000040243333333333334024666666666666402499999999999A4024CCCCCCCCCCCD4025000000000000"},"result":{"expect":"0x0203017803017905017A073FD43D136248490F3FDC9F25C5BFEDD93FE186F174F884723FE43D136248490F3FE6A09E667F3BCD3FE8C97EF43F72483FEAC5EB3F7AB2F83FEC9F25C5BFEDD93FEE5B9D136C6D963FF00000000000003FF0C7EBC96A56F63FF186F174F884723FF23E2896280F233FF2EE73DADC9B573FF3988E1409212E3FF43D136248490F3FF4DC87D61451DA3FF5775C544FF2633FF60DF2453AB7233FF6A09E667F3BCD3FF72FAAFC7E3CD73FF7BB598C88B4AD3FF843E43D85E5B13FF8C97EF43F72483FF94C583ADA5B533FF9CC99FF02C4813FFA4A6A2F74C6AC3FFAC5EB3F7AB2F83FFB3F3C957429DA3FFBB67AE8584CAA3FFC2BC08F4BFA983FFC9F25C5BFEDD93FFD10C0E60BE3083FFD80A69C19E42A3FFDEEEA11683F493FFE5B9D136C6D963FFEC6D0353167A93FFF3092ECE5BC353FFF98F3ADEF13F24000000000000000400032E249CC617140006526AA25A13B400096D2BC865F234000C7EBC96A56F64000F876CCDF6CD9400128787C6F7D7A400157F54C76D72F400186F174F884724001B570F5FF3FED4001E3779B97F4A8400211090171020F40023E2896280F2340026AD99E4F00174002971F372F95B64002C2FC595456A74002EE73DADC9B574003198871A0E80E4003443CB52C2A8540036E93208DED544003988E1409212E4003C22FD6A2B7B14003EB7A9792F3C6400414706F9C063A40043D136248490F400465655F122FF640048D684277CF0B4004B51DD6FBA9BB4004DC87D61451DA400503A7E90C397B40052A7FA9D2F8EA40055110A3C12C5E4005775C544FF26340059D642BC4FC1C4005C3298DD40B254005E8ADD236A58F40060DF2453AB723400632F82848C789400657C0B2625EB440067C4D109924644006A09E667F3BCD4006C4B5CE9152314006E8945A9ACD9240070C3B1414801740072FAAFC7E3CD7400752E50DB3A3A2400775EA3A3C72D2400798BB6D98A8324007BB598C88B4AD4007DDC575520155400800000000000040082209FEA1FD38400843E43D85E5B14008658F83702DC24008870C91D106234008A85C24F706594008C97EF43F72484008EA75B2443DF040090B410D07F01E40092BE1AE1F827140094C583ADA5B5340096CA554687C8940098CC997FEFF4C4009ACC59EFAF54B4009CC99FF02C4814009EC474A261264"}}
+{"expression":"map(a,f(a)(sqrt(a)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FD43D136248490F01623FDC9F25C5BFEDD901633FE186F174F88472"}}
+{"expression":"map(a,f(a)(sqrt(a)))","inputs":{"a":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179060161036261723FDC9F25C5BFEDD9016103666F6F3FD43D136248490F0162036261723FE43D136248490F016203666F6F3FE186F174F884720163036261723FE8C97EF43F7248016303666F6F3FE6A09E667F3BCD"}}
+{"expression":"map(a,f(a)(sqrt(a)))","inputs":{"a":"0x010301780179017A1801610362617201693FE0000000000000016103626172016A3FE3333333333333016103626172016B3FE6666666666666016103626172016C3FE999999999999A016103666F6F01693FB999999999999A016103666F6F016A3FC999999999999A016103666F6F016B3FD3333333333333016103666F6F016C3FD999999999999A01620362617201693FF4CCCCCCCCCCCD016203626172016A3FF6666666666666016203626172016B3FF8000000000000016203626172016C3FF999999999999A016203666F6F01693FECCCCCCCCCCCCD016203666F6F016A3FF0000000000000016203666F6F016B3FF199999999999A016203666F6F016C3FF333333333333301630362617201694000CCCCCCCCCCCD016303626172016A400199999999999A016303626172016B4002666666666666016303626172016C4003333333333333016303666F6F01693FFB333333333333016303666F6F016A3FFCCCCCCCCCCCCD016303666F6F016B3FFE666666666666016303666F6F016C4000000000000000"},"result":{"expect":"0x010301780179017A1801610362617201693FE6A09E667F3BCD016103626172016A3FE8C97EF43F7248016103626172016B3FEAC5EB3F7AB2F8016103626172016C3FEC9F25C5BFEDD9016103666F6F01693FD43D136248490F016103666F6F016A3FDC9F25C5BFEDD9016103666F6F016B3FE186F174F88472016103666F6F016C3FE43D136248490F01620362617201693FF23E2896280F23016203626172016A3FF2EE73DADC9B57016203626172016B3FF3988E1409212E016203626172016C3FF43D136248490F016203666F6F01693FEE5B9D136C6D96016203666F6F016A3FF0000000000000016203666F6F016B3FF0C7EBC96A56F6016203666F6F016C3FF186F174F8847201630362617201693FF72FAAFC7E3CD7016303626172016A3FF7BB598C88B4AD016303626172016B3FF843E43D85E5B1016303626172016C3FF8C97EF43F7248016303666F6F01693FF4DC87D61451DA016303666F6F016A3FF5775C544FF263016303666F6F016B3FF60DF2453AB723016303666F6F016C3FF6A09E667F3BCD"}}
+{"expression":"map(a,f(a)(sqrt(a)))","inputs":{"a":"0x0301017902017803017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF6666666666666400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD03666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0301017902017803017A0702036261723FEC9F25C5BFEDD93FEE5B9D136C6D963FF00000000000003FF0C7EBC96A56F63FF186F174F884723FF23E2896280F233FF2EE73DADC9B573FF7BB598C88B4AD3FF843E43D85E5B13FF8C97EF43F72483FF94C583ADA5B533FF9CC99FF02C4813FFA4A6A2F74C6AC3FFAC5EB3F7AB2F83FFE5B9D136C6D963FFEC6D0353167A93FFF3092ECE5BC353FFF98F3ADEF13F24000000000000000400032E249CC617140006526AA25A13B03666F6F3FD43D136248490F3FDC9F25C5BFEDD93FE186F174F884723FE43D136248490F3FE6A09E667F3BCD3FE8C97EF43F72483FEAC5EB3F7AB2F83FF3988E1409212E3FF43D136248490F3FF4DC87D61451DA3FF5775C544FF2633FF60DF2453AB7233FF6A09E667F3BCD3FF72FAAFC7E3CD73FFB3F3C957429DA3FFBB67AE8584CAA3FFC2BC08F4BFA983FFC9F25C5BFEDD93FFD10C0E60BE3083FFD80A69C19E42A3FFDEEEA11683F49"}}
+{"expression":"map(a,f(a)(sqrt(a)))","inputs":{"a":"0x03020178017A010179050C016101693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB3333333333330161016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD0161016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE6666666666660161016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000016201694000CCCCCCCCCCCD40040000000000004007333333333333400A666666666666400D99999999999A0162016A400199999999999A4004CCCCCCCCCCCD4008000000000000400B333333333333400E6666666666660162016B4002666666666666400599999999999A4008CCCCCCCCCCCD400C000000000000400F3333333333330162016C40033333333333334006666666666666400999999999999A400CCCCCCCCCCCCD40100000000000000163016940106666666666664012000000000000401399999999999A40153333333333334016CCCCCCCCCCCD0163016A4010CCCCCCCCCCCD40126666666666664014000000000000401599999999999A40173333333333330163016B40113333333333334012CCCCCCCCCCCD40146666666666664016000000000000401799999999999A0163016C401199999999999A40133333333333334014CCCCCCCCCCCD40166666666666664018000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FD43D136248490F3FE6A09E667F3BCD3FEE5B9D136C6D963FF23E2896280F233FF4DC87D61451DA0161016A3FDC9F25C5BFEDD93FE8C97EF43F72483FF00000000000003FF2EE73DADC9B573FF5775C544FF2630161016B3FE186F174F884723FEAC5EB3F7AB2F83FF0C7EBC96A56F63FF3988E1409212E3FF60DF2453AB7230161016C3FE43D136248490F3FEC9F25C5BFEDD93FF186F174F884723FF43D136248490F3FF6A09E667F3BCD016201693FF72FAAFC7E3CD73FF94C583ADA5B533FFB3F3C957429DA3FFD10C0E60BE3083FFEC6D0353167A90162016A3FF7BB598C88B4AD3FF9CC99FF02C4813FFBB67AE8584CAA3FFD80A69C19E42A3FFF3092ECE5BC350162016B3FF843E43D85E5B13FFA4A6A2F74C6AC3FFC2BC08F4BFA983FFDEEEA11683F493FFF98F3ADEF13F20162016C3FF8C97EF43F72483FFAC5EB3F7AB2F83FFC9F25C5BFEDD93FFE5B9D136C6D96400000000000000001630169400032E249CC61714000F876CCDF6CD94001B570F5FF3FED40026AD99E4F00174003198871A0E80E0163016A40006526AA25A13B400128787C6F7D7A4001E3779B97F4A84002971F372F95B64003443CB52C2A850163016B400096D2BC865F23400157F54C76D72F400211090171020F4002C2FC595456A740036E93208DED540163016C4000C7EBC96A56F6400186F174F8847240023E2896280F234002EE73DADC9B574003988E1409212E"}}
+{"expression":"ceil(a)","inputs":{"a":"0x02003FB999999999999A"},"result":{"expect":"0x02003FF0000000000000"}}
+{"expression":"ceil(a)","inputs":{"a":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"ceil(a)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178030179053FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000040000000000000004000000000000000400000000000000040000000000000004000000000000000"}}
+{"expression":"ceil(a)","inputs":{"a":"0x0203017803017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD4011333333333333401199999999999A401200000000000040126666666666664012CCCCCCCCCCCD4013333333333333401399999999999A401400000000000040146666666666664014CCCCCCCCCCCD4015333333333333401599999999999A401600000000000040166666666666664016CCCCCCCCCCCD4017333333333333401799999999999A401800000000000040186666666666664018CCCCCCCCCCCD4019333333333333401999999999999A401A000000000000401A666666666666401ACCCCCCCCCCCD401B333333333333401B99999999999A401C000000000000401C666666666666401CCCCCCCCCCCCD401D333333333333401D99999999999A401E000000000000401E666666666666401ECCCCCCCCCCCD401F333333333333401F99999999999A402000000000000040203333333333334020666666666666402099999999999A4020CCCCCCCCCCCD402100000000000040213333333333334021666666666666402199999999999A4021CCCCCCCCCCCD402200000000000040223333333333334022666666666666402299999999999A4022CCCCCCCCCCCD402300000000000040233333333333334023666666666666402399999999999A4023CCCCCCCCCCCD402400000000000040243333333333334024666666666666402499999999999A4024CCCCCCCCCCCD4025000000000000"},"result":{"expect":"0x0203017803017905017A073FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000040000000000000004000000000000000400000000000000040000000000000004000000000000000400000000000000040000000000000004000000000000000400000000000000040000000000000004008000000000000400800000000000040080000000000004008000000000000400800000000000040080000000000004008000000000000400800000000000040080000000000004008000000000000401000000000000040100000000000004010000000000000401000000000000040100000000000004010000000000000401000000000000040100000000000004010000000000000401000000000000040140000000000004014000000000000401400000000000040140000000000004014000000000000401400000000000040140000000000004014000000000000401400000000000040140000000000004018000000000000401800000000000040180000000000004018000000000000401800000000000040180000000000004018000000000000401800000000000040180000000000004018000000000000401C000000000000401C000000000000401C000000000000401C000000000000401C000000000000401C000000000000401C000000000000401C000000000000401C000000000000401C00000000000040200000000000004020000000000000402000000000000040200000000000004020000000000000402000000000000040200000000000004020000000000000402000000000000040200000000000004022000000000000402200000000000040220000000000004022000000000000402200000000000040220000000000004022000000000000402200000000000040220000000000004022000000000000402400000000000040240000000000004024000000000000402400000000000040240000000000004024000000000000402400000000000040240000000000004024000000000000402400000000000040260000000000004026000000000000402600000000000040260000000000004026000000000000"}}
+{"expression":"ceil(a)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FF000000000000001623FF000000000000001633FF0000000000000"}}
+{"expression":"ceil(a)","inputs":{"a":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179060161036261723FF0000000000000016103666F6F3FF00000000000000162036261723FF0000000000000016203666F6F3FF00000000000000163036261723FF0000000000000016303666F6F3FF0000000000000"}}
+{"expression":"ceil(a)","inputs":{"a":"0x010301780179017A1801610362617201693FE0000000000000016103626172016A3FE3333333333333016103626172016B3FE6666666666666016103626172016C3FE999999999999A016103666F6F01693FB999999999999A016103666F6F016A3FC999999999999A016103666F6F016B3FD3333333333333016103666F6F016C3FD999999999999A01620362617201693FF4CCCCCCCCCCCD016203626172016A3FF6666666666666016203626172016B3FF8000000000000016203626172016C3FF999999999999A016203666F6F01693FECCCCCCCCCCCCD016203666F6F016A3FF0000000000000016203666F6F016B3FF199999999999A016203666F6F016C3FF333333333333301630362617201694000CCCCCCCCCCCD016303626172016A400199999999999A016303626172016B4002666666666666016303626172016C4003333333333333016303666F6F01693FFB333333333333016303666F6F016A3FFCCCCCCCCCCCCD016303666F6F016B3FFE666666666666016303666F6F016C4000000000000000"},"result":{"expect":"0x010301780179017A1801610362617201693FF0000000000000016103626172016A3FF0000000000000016103626172016B3FF0000000000000016103626172016C3FF0000000000000016103666F6F01693FF0000000000000016103666F6F016A3FF0000000000000016103666F6F016B3FF0000000000000016103666F6F016C3FF000000000000001620362617201694000000000000000016203626172016A4000000000000000016203626172016B4000000000000000016203626172016C4000000000000000016203666F6F01693FF0000000000000016203666F6F016A3FF0000000000000016203666F6F016B4000000000000000016203666F6F016C400000000000000001630362617201694008000000000000016303626172016A4008000000000000016303626172016B4008000000000000016303626172016C4008000000000000016303666F6F01694000000000000000016303666F6F016A4000000000000000016303666F6F016B4000000000000000016303666F6F016C4000000000000000"}}
+{"expression":"ceil(a)","inputs":{"a":"0x0301017902017803017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF6666666666666400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD03666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0301017902017803017A0702036261723FF00000000000003FF00000000000003FF000000000000040000000000000004000000000000000400000000000000040000000000000004008000000000000400800000000000040080000000000004008000000000000400800000000000040080000000000004008000000000000401000000000000040100000000000004010000000000000401000000000000040100000000000004014000000000000401400000000000003666F6F3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000040000000000000004000000000000000400000000000000040000000000000004000000000000000400000000000000040080000000000004008000000000000400800000000000040100000000000004010000000000000401000000000000040100000000000004010000000000000"}}
+{"expression":"ceil(a)","inputs":{"a":"0x03020178017A010179050C016101693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB3333333333330161016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD0161016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE6666666666660161016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000016201694000CCCCCCCCCCCD40040000000000004007333333333333400A666666666666400D99999999999A0162016A400199999999999A4004CCCCCCCCCCCD4008000000000000400B333333333333400E6666666666660162016B4002666666666666400599999999999A4008CCCCCCCCCCCD400C000000000000400F3333333333330162016C40033333333333334006666666666666400999999999999A400CCCCCCCCCCCCD40100000000000000163016940106666666666664012000000000000401399999999999A40153333333333334016CCCCCCCCCCCD0163016A4010CCCCCCCCCCCD40126666666666664014000000000000401599999999999A40173333333333330163016B40113333333333334012CCCCCCCCCCCD40146666666666664016000000000000401799999999999A0163016C401199999999999A40133333333333334014CCCCCCCCCCCD40166666666666664018000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FF00000000000003FF00000000000003FF0000000000000400000000000000040000000000000000161016A3FF00000000000003FF00000000000003FF0000000000000400000000000000040000000000000000161016B3FF00000000000003FF00000000000004000000000000000400000000000000040000000000000000161016C3FF00000000000003FF000000000000040000000000000004000000000000000400000000000000001620169400800000000000040080000000000004008000000000000401000000000000040100000000000000162016A400800000000000040080000000000004008000000000000401000000000000040100000000000000162016B400800000000000040080000000000004010000000000000401000000000000040100000000000000162016C4008000000000000400800000000000040100000000000004010000000000000401000000000000001630169401400000000000040140000000000004014000000000000401800000000000040180000000000000163016A401400000000000040140000000000004014000000000000401800000000000040180000000000000163016B401400000000000040140000000000004018000000000000401800000000000040180000000000000163016C40140000000000004014000000000000401800000000000040180000000000004018000000000000"}}
+{"expression":"map(a,f(a)(ceil(a)))","inputs":{"a":"0x02003FB999999999999A"},"result":{"expect":"0x02003FF0000000000000"}}
+{"expression":"map(a,f(a)(ceil(a)))","inputs":{"a":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"map(a,f(a)(ceil(a)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178030179053FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000040000000000000004000000000000000400000000000000040000000000000004000000000000000"}}
+{"expression":"map(a,f(a)(ceil(a)))","inputs":{"a":"0x0203017803017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD4011333333333333401199999999999A401200000000000040126666666666664012CCCCCCCCCCCD4013333333333333401399999999999A401400000000000040146666666666664014CCCCCCCCCCCD4015333333333333401599999999999A401600000000000040166666666666664016CCCCCCCCCCCD4017333333333333401799999999999A401800000000000040186666666666664018CCCCCCCCCCCD4019333333333333401999999999999A401A000000000000401A666666666666401ACCCCCCCCCCCD401B333333333333401B99999999999A401C000000000000401C666666666666401CCCCCCCCCCCCD401D333333333333401D99999999999A401E000000000000401E666666666666401ECCCCCCCCCCCD401F333333333333401F99999999999A402000000000000040203333333333334020666666666666402099999999999A4020CCCCCCCCCCCD402100000000000040213333333333334021666666666666402199999999999A4021CCCCCCCCCCCD402200000000000040223333333333334022666666666666402299999999999A4022CCCCCCCCCCCD402300000000000040233333333333334023666666666666402399999999999A4023CCCCCCCCCCCD402400000000000040243333333333334024666666666666402499999999999A4024CCCCCCCCCCCD4025000000000000"},"result":{"expect":"0x0203017803017905017A073FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000040000000000000004000000000000000400000000000000040000000000000004000000000000000400000000000000040000000000000004000000000000000400000000000000040000000000000004008000000000000400800000000000040080000000000004008000000000000400800000000000040080000000000004008000000000000400800000000000040080000000000004008000000000000401000000000000040100000000000004010000000000000401000000000000040100000000000004010000000000000401000000000000040100000000000004010000000000000401000000000000040140000000000004014000000000000401400000000000040140000000000004014000000000000401400000000000040140000000000004014000000000000401400000000000040140000000000004018000000000000401800000000000040180000000000004018000000000000401800000000000040180000000000004018000000000000401800000000000040180000000000004018000000000000401C000000000000401C000000000000401C000000000000401C000000000000401C000000000000401C000000000000401C000000000000401C000000000000401C000000000000401C00000000000040200000000000004020000000000000402000000000000040200000000000004020000000000000402000000000000040200000000000004020000000000000402000000000000040200000000000004022000000000000402200000000000040220000000000004022000000000000402200000000000040220000000000004022000000000000402200000000000040220000000000004022000000000000402400000000000040240000000000004024000000000000402400000000000040240000000000004024000000000000402400000000000040240000000000004024000000000000402400000000000040260000000000004026000000000000402600000000000040260000000000004026000000000000"}}
+{"expression":"map(a,f(a)(ceil(a)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FF000000000000001623FF000000000000001633FF0000000000000"}}
+{"expression":"map(a,f(a)(ceil(a)))","inputs":{"a":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179060161036261723FF0000000000000016103666F6F3FF00000000000000162036261723FF0000000000000016203666F6F3FF00000000000000163036261723FF0000000000000016303666F6F3FF0000000000000"}}
+{"expression":"map(a,f(a)(ceil(a)))","inputs":{"a":"0x010301780179017A1801610362617201693FE0000000000000016103626172016A3FE3333333333333016103626172016B3FE6666666666666016103626172016C3FE999999999999A016103666F6F01693FB999999999999A016103666F6F016A3FC999999999999A016103666F6F016B3FD3333333333333016103666F6F016C3FD999999999999A01620362617201693FF4CCCCCCCCCCCD016203626172016A3FF6666666666666016203626172016B3FF8000000000000016203626172016C3FF999999999999A016203666F6F01693FECCCCCCCCCCCCD016203666F6F016A3FF0000000000000016203666F6F016B3FF199999999999A016203666F6F016C3FF333333333333301630362617201694000CCCCCCCCCCCD016303626172016A400199999999999A016303626172016B4002666666666666016303626172016C4003333333333333016303666F6F01693FFB333333333333016303666F6F016A3FFCCCCCCCCCCCCD016303666F6F016B3FFE666666666666016303666F6F016C4000000000000000"},"result":{"expect":"0x010301780179017A1801610362617201693FF0000000000000016103626172016A3FF0000000000000016103626172016B3FF0000000000000016103626172016C3FF0000000000000016103666F6F01693FF0000000000000016103666F6F016A3FF0000000000000016103666F6F016B3FF0000000000000016103666F6F016C3FF000000000000001620362617201694000000000000000016203626172016A4000000000000000016203626172016B4000000000000000016203626172016C4000000000000000016203666F6F01693FF0000000000000016203666F6F016A3FF0000000000000016203666F6F016B4000000000000000016203666F6F016C400000000000000001630362617201694008000000000000016303626172016A4008000000000000016303626172016B4008000000000000016303626172016C4008000000000000016303666F6F01694000000000000000016303666F6F016A4000000000000000016303666F6F016B4000000000000000016303666F6F016C4000000000000000"}}
+{"expression":"map(a,f(a)(ceil(a)))","inputs":{"a":"0x0301017902017803017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF6666666666666400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD03666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0301017902017803017A0702036261723FF00000000000003FF00000000000003FF000000000000040000000000000004000000000000000400000000000000040000000000000004008000000000000400800000000000040080000000000004008000000000000400800000000000040080000000000004008000000000000401000000000000040100000000000004010000000000000401000000000000040100000000000004014000000000000401400000000000003666F6F3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000040000000000000004000000000000000400000000000000040000000000000004000000000000000400000000000000040080000000000004008000000000000400800000000000040100000000000004010000000000000401000000000000040100000000000004010000000000000"}}
+{"expression":"map(a,f(a)(ceil(a)))","inputs":{"a":"0x03020178017A010179050C016101693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB3333333333330161016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD0161016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE6666666666660161016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000016201694000CCCCCCCCCCCD40040000000000004007333333333333400A666666666666400D99999999999A0162016A400199999999999A4004CCCCCCCCCCCD4008000000000000400B333333333333400E6666666666660162016B4002666666666666400599999999999A4008CCCCCCCCCCCD400C000000000000400F3333333333330162016C40033333333333334006666666666666400999999999999A400CCCCCCCCCCCCD40100000000000000163016940106666666666664012000000000000401399999999999A40153333333333334016CCCCCCCCCCCD0163016A4010CCCCCCCCCCCD40126666666666664014000000000000401599999999999A40173333333333330163016B40113333333333334012CCCCCCCCCCCD40146666666666664016000000000000401799999999999A0163016C401199999999999A40133333333333334014CCCCCCCCCCCD40166666666666664018000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FF00000000000003FF00000000000003FF0000000000000400000000000000040000000000000000161016A3FF00000000000003FF00000000000003FF0000000000000400000000000000040000000000000000161016B3FF00000000000003FF00000000000004000000000000000400000000000000040000000000000000161016C3FF00000000000003FF000000000000040000000000000004000000000000000400000000000000001620169400800000000000040080000000000004008000000000000401000000000000040100000000000000162016A400800000000000040080000000000004008000000000000401000000000000040100000000000000162016B400800000000000040080000000000004010000000000000401000000000000040100000000000000162016C4008000000000000400800000000000040100000000000004010000000000000401000000000000001630169401400000000000040140000000000004014000000000000401800000000000040180000000000000163016A401400000000000040140000000000004014000000000000401800000000000040180000000000000163016B401400000000000040140000000000004018000000000000401800000000000040180000000000000163016C40140000000000004014000000000000401800000000000040180000000000004018000000000000"}}
+{"expression":"fabs(a)","inputs":{"a":"0x02003FB999999999999A"},"result":{"expect":"0x02003FB999999999999A"}}
+{"expression":"fabs(a)","inputs":{"a":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"}}
+{"expression":"fabs(a)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"}}
+{"expression":"fabs(a)","inputs":{"a":"0x0203017803017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD4011333333333333401199999999999A401200000000000040126666666666664012CCCCCCCCCCCD4013333333333333401399999999999A401400000000000040146666666666664014CCCCCCCCCCCD4015333333333333401599999999999A401600000000000040166666666666664016CCCCCCCCCCCD4017333333333333401799999999999A401800000000000040186666666666664018CCCCCCCCCCCD4019333333333333401999999999999A401A000000000000401A666666666666401ACCCCCCCCCCCD401B333333333333401B99999999999A401C000000000000401C666666666666401CCCCCCCCCCCCD401D333333333333401D99999999999A401E000000000000401E666666666666401ECCCCCCCCCCCD401F333333333333401F99999999999A402000000000000040203333333333334020666666666666402099999999999A4020CCCCCCCCCCCD402100000000000040213333333333334021666666666666402199999999999A4021CCCCCCCCCCCD402200000000000040223333333333334022666666666666402299999999999A4022CCCCCCCCCCCD402300000000000040233333333333334023666666666666402399999999999A4023CCCCCCCCCCCD402400000000000040243333333333334024666666666666402499999999999A4024CCCCCCCCCCCD4025000000000000"},"result":{"expect":"0x0203017803017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD4011333333333333401199999999999A401200000000000040126666666666664012CCCCCCCCCCCD4013333333333333401399999999999A401400000000000040146666666666664014CCCCCCCCCCCD4015333333333333401599999999999A401600000000000040166666666666664016CCCCCCCCCCCD4017333333333333401799999999999A401800000000000040186666666666664018CCCCCCCCCCCD4019333333333333401999999999999A401A000000000000401A666666666666401ACCCCCCCCCCCD401B333333333333401B99999999999A401C000000000000401C666666666666401CCCCCCCCCCCCD401D333333333333401D99999999999A401E000000000000401E666666666666401ECCCCCCCCCCCD401F333333333333401F99999999999A402000000000000040203333333333334020666666666666402099999999999A4020CCCCCCCCCCCD402100000000000040213333333333334021666666666666402199999999999A4021CCCCCCCCCCCD402200000000000040223333333333334022666666666666402299999999999A4022CCCCCCCCCCCD402300000000000040233333333333334023666666666666402399999999999A4023CCCCCCCCCCCD402400000000000040243333333333334024666666666666402499999999999A4024CCCCCCCCCCCD4025000000000000"}}
+{"expression":"fabs(a)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"}}
+{"expression":"fabs(a)","inputs":{"a":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"}}
+{"expression":"fabs(a)","inputs":{"a":"0x010301780179017A1801610362617201693FE0000000000000016103626172016A3FE3333333333333016103626172016B3FE6666666666666016103626172016C3FE999999999999A016103666F6F01693FB999999999999A016103666F6F016A3FC999999999999A016103666F6F016B3FD3333333333333016103666F6F016C3FD999999999999A01620362617201693FF4CCCCCCCCCCCD016203626172016A3FF6666666666666016203626172016B3FF8000000000000016203626172016C3FF999999999999A016203666F6F01693FECCCCCCCCCCCCD016203666F6F016A3FF0000000000000016203666F6F016B3FF199999999999A016203666F6F016C3FF333333333333301630362617201694000CCCCCCCCCCCD016303626172016A400199999999999A016303626172016B4002666666666666016303626172016C4003333333333333016303666F6F01693FFB333333333333016303666F6F016A3FFCCCCCCCCCCCCD016303666F6F016B3FFE666666666666016303666F6F016C4000000000000000"},"result":{"expect":"0x010301780179017A1801610362617201693FE0000000000000016103626172016A3FE3333333333333016103626172016B3FE6666666666666016103626172016C3FE999999999999A016103666F6F01693FB999999999999A016103666F6F016A3FC999999999999A016103666F6F016B3FD3333333333333016103666F6F016C3FD999999999999A01620362617201693FF4CCCCCCCCCCCD016203626172016A3FF6666666666666016203626172016B3FF8000000000000016203626172016C3FF999999999999A016203666F6F01693FECCCCCCCCCCCCD016203666F6F016A3FF0000000000000016203666F6F016B3FF199999999999A016203666F6F016C3FF333333333333301630362617201694000CCCCCCCCCCCD016303626172016A400199999999999A016303626172016B4002666666666666016303626172016C4003333333333333016303666F6F01693FFB333333333333016303666F6F016A3FFCCCCCCCCCCCCD016303666F6F016B3FFE666666666666016303666F6F016C4000000000000000"}}
+{"expression":"fabs(a)","inputs":{"a":"0x0301017902017803017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF6666666666666400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD03666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0301017902017803017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF6666666666666400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD03666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"}}
+{"expression":"fabs(a)","inputs":{"a":"0x03020178017A010179050C016101693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB3333333333330161016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD0161016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE6666666666660161016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000016201694000CCCCCCCCCCCD40040000000000004007333333333333400A666666666666400D99999999999A0162016A400199999999999A4004CCCCCCCCCCCD4008000000000000400B333333333333400E6666666666660162016B4002666666666666400599999999999A4008CCCCCCCCCCCD400C000000000000400F3333333333330162016C40033333333333334006666666666666400999999999999A400CCCCCCCCCCCCD40100000000000000163016940106666666666664012000000000000401399999999999A40153333333333334016CCCCCCCCCCCD0163016A4010CCCCCCCCCCCD40126666666666664014000000000000401599999999999A40173333333333330163016B40113333333333334012CCCCCCCCCCCD40146666666666664016000000000000401799999999999A0163016C401199999999999A40133333333333334014CCCCCCCCCCCD40166666666666664018000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB3333333333330161016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD0161016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE6666666666660161016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000016201694000CCCCCCCCCCCD40040000000000004007333333333333400A666666666666400D99999999999A0162016A400199999999999A4004CCCCCCCCCCCD4008000000000000400B333333333333400E6666666666660162016B4002666666666666400599999999999A4008CCCCCCCCCCCD400C000000000000400F3333333333330162016C40033333333333334006666666666666400999999999999A400CCCCCCCCCCCCD40100000000000000163016940106666666666664012000000000000401399999999999A40153333333333334016CCCCCCCCCCCD0163016A4010CCCCCCCCCCCD40126666666666664014000000000000401599999999999A40173333333333330163016B40113333333333334012CCCCCCCCCCCD40146666666666664016000000000000401799999999999A0163016C401199999999999A40133333333333334014CCCCCCCCCCCD40166666666666664018000000000000"}}
+{"expression":"map(a,f(a)(fabs(a)))","inputs":{"a":"0x02003FB999999999999A"},"result":{"expect":"0x02003FB999999999999A"}}
+{"expression":"map(a,f(a)(fabs(a)))","inputs":{"a":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"}}
+{"expression":"map(a,f(a)(fabs(a)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"}}
+{"expression":"map(a,f(a)(fabs(a)))","inputs":{"a":"0x0203017803017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD4011333333333333401199999999999A401200000000000040126666666666664012CCCCCCCCCCCD4013333333333333401399999999999A401400000000000040146666666666664014CCCCCCCCCCCD4015333333333333401599999999999A401600000000000040166666666666664016CCCCCCCCCCCD4017333333333333401799999999999A401800000000000040186666666666664018CCCCCCCCCCCD4019333333333333401999999999999A401A000000000000401A666666666666401ACCCCCCCCCCCD401B333333333333401B99999999999A401C000000000000401C666666666666401CCCCCCCCCCCCD401D333333333333401D99999999999A401E000000000000401E666666666666401ECCCCCCCCCCCD401F333333333333401F99999999999A402000000000000040203333333333334020666666666666402099999999999A4020CCCCCCCCCCCD402100000000000040213333333333334021666666666666402199999999999A4021CCCCCCCCCCCD402200000000000040223333333333334022666666666666402299999999999A4022CCCCCCCCCCCD402300000000000040233333333333334023666666666666402399999999999A4023CCCCCCCCCCCD402400000000000040243333333333334024666666666666402499999999999A4024CCCCCCCCCCCD4025000000000000"},"result":{"expect":"0x0203017803017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD4011333333333333401199999999999A401200000000000040126666666666664012CCCCCCCCCCCD4013333333333333401399999999999A401400000000000040146666666666664014CCCCCCCCCCCD4015333333333333401599999999999A401600000000000040166666666666664016CCCCCCCCCCCD4017333333333333401799999999999A401800000000000040186666666666664018CCCCCCCCCCCD4019333333333333401999999999999A401A000000000000401A666666666666401ACCCCCCCCCCCD401B333333333333401B99999999999A401C000000000000401C666666666666401CCCCCCCCCCCCD401D333333333333401D99999999999A401E000000000000401E666666666666401ECCCCCCCCCCCD401F333333333333401F99999999999A402000000000000040203333333333334020666666666666402099999999999A4020CCCCCCCCCCCD402100000000000040213333333333334021666666666666402199999999999A4021CCCCCCCCCCCD402200000000000040223333333333334022666666666666402299999999999A4022CCCCCCCCCCCD402300000000000040233333333333334023666666666666402399999999999A4023CCCCCCCCCCCD402400000000000040243333333333334024666666666666402499999999999A4024CCCCCCCCCCCD4025000000000000"}}
+{"expression":"map(a,f(a)(fabs(a)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"}}
+{"expression":"map(a,f(a)(fabs(a)))","inputs":{"a":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"}}
+{"expression":"map(a,f(a)(fabs(a)))","inputs":{"a":"0x010301780179017A1801610362617201693FE0000000000000016103626172016A3FE3333333333333016103626172016B3FE6666666666666016103626172016C3FE999999999999A016103666F6F01693FB999999999999A016103666F6F016A3FC999999999999A016103666F6F016B3FD3333333333333016103666F6F016C3FD999999999999A01620362617201693FF4CCCCCCCCCCCD016203626172016A3FF6666666666666016203626172016B3FF8000000000000016203626172016C3FF999999999999A016203666F6F01693FECCCCCCCCCCCCD016203666F6F016A3FF0000000000000016203666F6F016B3FF199999999999A016203666F6F016C3FF333333333333301630362617201694000CCCCCCCCCCCD016303626172016A400199999999999A016303626172016B4002666666666666016303626172016C4003333333333333016303666F6F01693FFB333333333333016303666F6F016A3FFCCCCCCCCCCCCD016303666F6F016B3FFE666666666666016303666F6F016C4000000000000000"},"result":{"expect":"0x010301780179017A1801610362617201693FE0000000000000016103626172016A3FE3333333333333016103626172016B3FE6666666666666016103626172016C3FE999999999999A016103666F6F01693FB999999999999A016103666F6F016A3FC999999999999A016103666F6F016B3FD3333333333333016103666F6F016C3FD999999999999A01620362617201693FF4CCCCCCCCCCCD016203626172016A3FF6666666666666016203626172016B3FF8000000000000016203626172016C3FF999999999999A016203666F6F01693FECCCCCCCCCCCCD016203666F6F016A3FF0000000000000016203666F6F016B3FF199999999999A016203666F6F016C3FF333333333333301630362617201694000CCCCCCCCCCCD016303626172016A400199999999999A016303626172016B4002666666666666016303626172016C4003333333333333016303666F6F01693FFB333333333333016303666F6F016A3FFCCCCCCCCCCCCD016303666F6F016B3FFE666666666666016303666F6F016C4000000000000000"}}
+{"expression":"map(a,f(a)(fabs(a)))","inputs":{"a":"0x0301017902017803017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF6666666666666400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD03666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0301017902017803017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF6666666666666400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD03666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"}}
+{"expression":"map(a,f(a)(fabs(a)))","inputs":{"a":"0x03020178017A010179050C016101693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB3333333333330161016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD0161016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE6666666666660161016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000016201694000CCCCCCCCCCCD40040000000000004007333333333333400A666666666666400D99999999999A0162016A400199999999999A4004CCCCCCCCCCCD4008000000000000400B333333333333400E6666666666660162016B4002666666666666400599999999999A4008CCCCCCCCCCCD400C000000000000400F3333333333330162016C40033333333333334006666666666666400999999999999A400CCCCCCCCCCCCD40100000000000000163016940106666666666664012000000000000401399999999999A40153333333333334016CCCCCCCCCCCD0163016A4010CCCCCCCCCCCD40126666666666664014000000000000401599999999999A40173333333333330163016B40113333333333334012CCCCCCCCCCCD40146666666666664016000000000000401799999999999A0163016C401199999999999A40133333333333334014CCCCCCCCCCCD40166666666666664018000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB3333333333330161016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD0161016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE6666666666660161016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000016201694000CCCCCCCCCCCD40040000000000004007333333333333400A666666666666400D99999999999A0162016A400199999999999A4004CCCCCCCCCCCD4008000000000000400B333333333333400E6666666666660162016B4002666666666666400599999999999A4008CCCCCCCCCCCD400C000000000000400F3333333333330162016C40033333333333334006666666666666400999999999999A400CCCCCCCCCCCCD40100000000000000163016940106666666666664012000000000000401399999999999A40153333333333334016CCCCCCCCCCCD0163016A4010CCCCCCCCCCCD40126666666666664014000000000000401599999999999A40173333333333330163016B40113333333333334012CCCCCCCCCCCD40146666666666664016000000000000401799999999999A0163016C401199999999999A40133333333333334014CCCCCCCCCCCD40166666666666664018000000000000"}}
+{"expression":"floor(a)","inputs":{"a":"0x02003FB999999999999A"},"result":{"expect":"0x02000000000000000000"}}
+{"expression":"floor(a)","inputs":{"a":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x0201017803000000000000000000000000000000000000000000000000"}}
+{"expression":"floor(a)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178030179050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"floor(a)","inputs":{"a":"0x0203017803017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD4011333333333333401199999999999A401200000000000040126666666666664012CCCCCCCCCCCD4013333333333333401399999999999A401400000000000040146666666666664014CCCCCCCCCCCD4015333333333333401599999999999A401600000000000040166666666666664016CCCCCCCCCCCD4017333333333333401799999999999A401800000000000040186666666666664018CCCCCCCCCCCD4019333333333333401999999999999A401A000000000000401A666666666666401ACCCCCCCCCCCD401B333333333333401B99999999999A401C000000000000401C666666666666401CCCCCCCCCCCCD401D333333333333401D99999999999A401E000000000000401E666666666666401ECCCCCCCCCCCD401F333333333333401F99999999999A402000000000000040203333333333334020666666666666402099999999999A4020CCCCCCCCCCCD402100000000000040213333333333334021666666666666402199999999999A4021CCCCCCCCCCCD402200000000000040223333333333334022666666666666402299999999999A4022CCCCCCCCCCCD402300000000000040233333333333334023666666666666402399999999999A4023CCCCCCCCCCCD402400000000000040243333333333334024666666666666402499999999999A4024CCCCCCCCCCCD4025000000000000"},"result":{"expect":"0x0203017803017905017A070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000040000000000000004000000000000000400000000000000040000000000000004000000000000000400000000000000040000000000000004000000000000000400000000000000040000000000000004008000000000000400800000000000040080000000000004008000000000000400800000000000040080000000000004008000000000000400800000000000040080000000000004008000000000000401000000000000040100000000000004010000000000000401000000000000040100000000000004010000000000000401000000000000040100000000000004010000000000000401000000000000040140000000000004014000000000000401400000000000040140000000000004014000000000000401400000000000040140000000000004014000000000000401400000000000040140000000000004018000000000000401800000000000040180000000000004018000000000000401800000000000040180000000000004018000000000000401800000000000040180000000000004018000000000000401C000000000000401C000000000000401C000000000000401C000000000000401C000000000000401C000000000000401C000000000000401C000000000000401C000000000000401C00000000000040200000000000004020000000000000402000000000000040200000000000004020000000000000402000000000000040200000000000004020000000000000402000000000000040200000000000004022000000000000402200000000000040220000000000004022000000000000402200000000000040220000000000004022000000000000402200000000000040220000000000004022000000000000402400000000000040240000000000004024000000000000402400000000000040240000000000004024000000000000"}}
+{"expression":"floor(a)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x0101017803016100000000000000000162000000000000000001630000000000000000"}}
+{"expression":"floor(a)","inputs":{"a":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179060161036261720000000000000000016103666F6F00000000000000000162036261720000000000000000016203666F6F00000000000000000163036261720000000000000000016303666F6F0000000000000000"}}
+{"expression":"floor(a)","inputs":{"a":"0x010301780179017A1801610362617201693FE0000000000000016103626172016A3FE3333333333333016103626172016B3FE6666666666666016103626172016C3FE999999999999A016103666F6F01693FB999999999999A016103666F6F016A3FC999999999999A016103666F6F016B3FD3333333333333016103666F6F016C3FD999999999999A01620362617201693FF4CCCCCCCCCCCD016203626172016A3FF6666666666666016203626172016B3FF8000000000000016203626172016C3FF999999999999A016203666F6F01693FECCCCCCCCCCCCD016203666F6F016A3FF0000000000000016203666F6F016B3FF199999999999A016203666F6F016C3FF333333333333301630362617201694000CCCCCCCCCCCD016303626172016A400199999999999A016303626172016B4002666666666666016303626172016C4003333333333333016303666F6F01693FFB333333333333016303666F6F016A3FFCCCCCCCCCCCCD016303666F6F016B3FFE666666666666016303666F6F016C4000000000000000"},"result":{"expect":"0x010301780179017A1801610362617201690000000000000000016103626172016A0000000000000000016103626172016B0000000000000000016103626172016C0000000000000000016103666F6F01690000000000000000016103666F6F016A0000000000000000016103666F6F016B0000000000000000016103666F6F016C000000000000000001620362617201693FF0000000000000016203626172016A3FF0000000000000016203626172016B3FF0000000000000016203626172016C3FF0000000000000016203666F6F01690000000000000000016203666F6F016A3FF0000000000000016203666F6F016B3FF0000000000000016203666F6F016C3FF000000000000001630362617201694000000000000000016303626172016A4000000000000000016303626172016B4000000000000000016303626172016C4000000000000000016303666F6F01693FF0000000000000016303666F6F016A3FF0000000000000016303666F6F016B3FF0000000000000016303666F6F016C4000000000000000"}}
+{"expression":"floor(a)","inputs":{"a":"0x0301017902017803017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF6666666666666400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD03666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0301017902017803017A070203626172000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000004000000000000000400000000000000040000000000000004000000000000000400000000000000040000000000000004000000000000000400800000000000040080000000000004008000000000000400800000000000040100000000000004010000000000000401000000000000003666F6F00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000400000000000000040000000000000004000000000000000400800000000000040080000000000004008000000000000400800000000000040080000000000004008000000000000"}}
+{"expression":"floor(a)","inputs":{"a":"0x03020178017A010179050C016101693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB3333333333330161016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD0161016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE6666666666660161016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000016201694000CCCCCCCCCCCD40040000000000004007333333333333400A666666666666400D99999999999A0162016A400199999999999A4004CCCCCCCCCCCD4008000000000000400B333333333333400E6666666666660162016B4002666666666666400599999999999A4008CCCCCCCCCCCD400C000000000000400F3333333333330162016C40033333333333334006666666666666400999999999999A400CCCCCCCCCCCCD40100000000000000163016940106666666666664012000000000000401399999999999A40153333333333334016CCCCCCCCCCCD0163016A4010CCCCCCCCCCCD40126666666666664014000000000000401599999999999A40173333333333330163016B40113333333333334012CCCCCCCCCCCD40146666666666664016000000000000401799999999999A0163016C401199999999999A40133333333333334014CCCCCCCCCCCD40166666666666664018000000000000"},"result":{"expect":"0x03020178017A010179050C016101690000000000000000000000000000000000000000000000003FF00000000000003FF00000000000000161016A000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000161016B000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000161016C000000000000000000000000000000003FF00000000000003FF0000000000000400000000000000001620169400000000000000040000000000000004000000000000000400800000000000040080000000000000162016A400000000000000040000000000000004008000000000000400800000000000040080000000000000162016B400000000000000040000000000000004008000000000000400800000000000040080000000000000162016C4000000000000000400000000000000040080000000000004008000000000000401000000000000001630169401000000000000040100000000000004010000000000000401400000000000040140000000000000163016A401000000000000040100000000000004014000000000000401400000000000040140000000000000163016B401000000000000040100000000000004014000000000000401400000000000040140000000000000163016C40100000000000004010000000000000401400000000000040140000000000004018000000000000"}}
+{"expression":"map(a,f(a)(floor(a)))","inputs":{"a":"0x02003FB999999999999A"},"result":{"expect":"0x02000000000000000000"}}
+{"expression":"map(a,f(a)(floor(a)))","inputs":{"a":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x0201017803000000000000000000000000000000000000000000000000"}}
+{"expression":"map(a,f(a)(floor(a)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x02020178030179050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"map(a,f(a)(floor(a)))","inputs":{"a":"0x0203017803017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD4011333333333333401199999999999A401200000000000040126666666666664012CCCCCCCCCCCD4013333333333333401399999999999A401400000000000040146666666666664014CCCCCCCCCCCD4015333333333333401599999999999A401600000000000040166666666666664016CCCCCCCCCCCD4017333333333333401799999999999A401800000000000040186666666666664018CCCCCCCCCCCD4019333333333333401999999999999A401A000000000000401A666666666666401ACCCCCCCCCCCD401B333333333333401B99999999999A401C000000000000401C666666666666401CCCCCCCCCCCCD401D333333333333401D99999999999A401E000000000000401E666666666666401ECCCCCCCCCCCD401F333333333333401F99999999999A402000000000000040203333333333334020666666666666402099999999999A4020CCCCCCCCCCCD402100000000000040213333333333334021666666666666402199999999999A4021CCCCCCCCCCCD402200000000000040223333333333334022666666666666402299999999999A4022CCCCCCCCCCCD402300000000000040233333333333334023666666666666402399999999999A4023CCCCCCCCCCCD402400000000000040243333333333334024666666666666402499999999999A4024CCCCCCCCCCCD4025000000000000"},"result":{"expect":"0x0203017803017905017A070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000040000000000000004000000000000000400000000000000040000000000000004000000000000000400000000000000040000000000000004000000000000000400000000000000040000000000000004008000000000000400800000000000040080000000000004008000000000000400800000000000040080000000000004008000000000000400800000000000040080000000000004008000000000000401000000000000040100000000000004010000000000000401000000000000040100000000000004010000000000000401000000000000040100000000000004010000000000000401000000000000040140000000000004014000000000000401400000000000040140000000000004014000000000000401400000000000040140000000000004014000000000000401400000000000040140000000000004018000000000000401800000000000040180000000000004018000000000000401800000000000040180000000000004018000000000000401800000000000040180000000000004018000000000000401C000000000000401C000000000000401C000000000000401C000000000000401C000000000000401C000000000000401C000000000000401C000000000000401C000000000000401C00000000000040200000000000004020000000000000402000000000000040200000000000004020000000000000402000000000000040200000000000004020000000000000402000000000000040200000000000004022000000000000402200000000000040220000000000004022000000000000402200000000000040220000000000004022000000000000402200000000000040220000000000004022000000000000402400000000000040240000000000004024000000000000402400000000000040240000000000004024000000000000"}}
+{"expression":"map(a,f(a)(floor(a)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x0101017803016100000000000000000162000000000000000001630000000000000000"}}
+{"expression":"map(a,f(a)(floor(a)))","inputs":{"a":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179060161036261720000000000000000016103666F6F00000000000000000162036261720000000000000000016203666F6F00000000000000000163036261720000000000000000016303666F6F0000000000000000"}}
+{"expression":"map(a,f(a)(floor(a)))","inputs":{"a":"0x010301780179017A1801610362617201693FE0000000000000016103626172016A3FE3333333333333016103626172016B3FE6666666666666016103626172016C3FE999999999999A016103666F6F01693FB999999999999A016103666F6F016A3FC999999999999A016103666F6F016B3FD3333333333333016103666F6F016C3FD999999999999A01620362617201693FF4CCCCCCCCCCCD016203626172016A3FF6666666666666016203626172016B3FF8000000000000016203626172016C3FF999999999999A016203666F6F01693FECCCCCCCCCCCCD016203666F6F016A3FF0000000000000016203666F6F016B3FF199999999999A016203666F6F016C3FF333333333333301630362617201694000CCCCCCCCCCCD016303626172016A400199999999999A016303626172016B4002666666666666016303626172016C4003333333333333016303666F6F01693FFB333333333333016303666F6F016A3FFCCCCCCCCCCCCD016303666F6F016B3FFE666666666666016303666F6F016C4000000000000000"},"result":{"expect":"0x010301780179017A1801610362617201690000000000000000016103626172016A0000000000000000016103626172016B0000000000000000016103626172016C0000000000000000016103666F6F01690000000000000000016103666F6F016A0000000000000000016103666F6F016B0000000000000000016103666F6F016C000000000000000001620362617201693FF0000000000000016203626172016A3FF0000000000000016203626172016B3FF0000000000000016203626172016C3FF0000000000000016203666F6F01690000000000000000016203666F6F016A3FF0000000000000016203666F6F016B3FF0000000000000016203666F6F016C3FF000000000000001630362617201694000000000000000016303626172016A4000000000000000016303626172016B4000000000000000016303626172016C4000000000000000016303666F6F01693FF0000000000000016303666F6F016A3FF0000000000000016303666F6F016B3FF0000000000000016303666F6F016C4000000000000000"}}
+{"expression":"map(a,f(a)(floor(a)))","inputs":{"a":"0x0301017902017803017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF6666666666666400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD03666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0301017902017803017A070203626172000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000004000000000000000400000000000000040000000000000004000000000000000400000000000000040000000000000004000000000000000400800000000000040080000000000004008000000000000400800000000000040100000000000004010000000000000401000000000000003666F6F00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000400000000000000040000000000000004000000000000000400800000000000040080000000000004008000000000000400800000000000040080000000000004008000000000000"}}
+{"expression":"map(a,f(a)(floor(a)))","inputs":{"a":"0x03020178017A010179050C016101693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB3333333333330161016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD0161016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE6666666666660161016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000016201694000CCCCCCCCCCCD40040000000000004007333333333333400A666666666666400D99999999999A0162016A400199999999999A4004CCCCCCCCCCCD4008000000000000400B333333333333400E6666666666660162016B4002666666666666400599999999999A4008CCCCCCCCCCCD400C000000000000400F3333333333330162016C40033333333333334006666666666666400999999999999A400CCCCCCCCCCCCD40100000000000000163016940106666666666664012000000000000401399999999999A40153333333333334016CCCCCCCCCCCD0163016A4010CCCCCCCCCCCD40126666666666664014000000000000401599999999999A40173333333333330163016B40113333333333334012CCCCCCCCCCCD40146666666666664016000000000000401799999999999A0163016C401199999999999A40133333333333334014CCCCCCCCCCCD40166666666666664018000000000000"},"result":{"expect":"0x03020178017A010179050C016101690000000000000000000000000000000000000000000000003FF00000000000003FF00000000000000161016A000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000161016B000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000161016C000000000000000000000000000000003FF00000000000003FF0000000000000400000000000000001620169400000000000000040000000000000004000000000000000400800000000000040080000000000000162016A400000000000000040000000000000004008000000000000400800000000000040080000000000000162016B400000000000000040000000000000004008000000000000400800000000000040080000000000000162016C4000000000000000400000000000000040080000000000004008000000000000401000000000000001630169401000000000000040100000000000004010000000000000401400000000000040140000000000000163016A401000000000000040100000000000004014000000000000401400000000000040140000000000000163016B401000000000000040100000000000004014000000000000401400000000000040140000000000000163016C40100000000000004010000000000000401400000000000040140000000000004018000000000000"}}
+{"expression":"isNan(a)","inputs":{"a":"0x02007FF8000000000000"},"result":{"expect":"0x02003FF0000000000000"}}
+{"expression":"isNan(a)","inputs":{"a":"0x02010178037FF80000000000003FF00000000000003FF0000000000000"},"result":{"expect":"0x02010178033FF000000000000000000000000000000000000000000000"}}
+{"expression":"isNan(a)","inputs":{"a":"0x02020178030179057FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF0000000000000"},"result":{"expect":"0x02020178030179053FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000"}}
+{"expression":"isNan(a)","inputs":{"a":"0x0203017803017905017A077FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF0000000000000"},"result":{"expect":"0x0203017803017905017A073FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000"}}
+{"expression":"isNan(a)","inputs":{"a":"0x010101780301617FF800000000000001623FF000000000000001633FF0000000000000"},"result":{"expect":"0x010101780301613FF00000000000000162000000000000000001630000000000000000"}}
+{"expression":"isNan(a)","inputs":{"a":"0x010201780179060161036261723FF0000000000000016103666F6F7FF80000000000000162036261727FF8000000000000016203666F6F3FF00000000000000163036261723FF0000000000000016303666F6F3FF0000000000000"},"result":{"expect":"0x010201780179060161036261720000000000000000016103666F6F3FF00000000000000162036261723FF0000000000000016203666F6F00000000000000000163036261720000000000000000016303666F6F0000000000000000"}}
+{"expression":"isNan(a)","inputs":{"a":"0x010301780179017A1801610362617201693FF0000000000000016103626172016A3FF0000000000000016103626172016B7FF8000000000000016103626172016C3FF0000000000000016103666F6F01697FF8000000000000016103666F6F016A3FF0000000000000016103666F6F016B3FF0000000000000016103666F6F016C7FF800000000000001620362617201697FF8000000000000016203626172016A3FF0000000000000016203626172016B3FF0000000000000016203626172016C7FF8000000000000016203666F6F01693FF0000000000000016203666F6F016A7FF8000000000000016203666F6F016B3FF0000000000000016203666F6F016C3FF000000000000001630362617201693FF0000000000000016303626172016A7FF8000000000000016303626172016B3FF0000000000000016303626172016C3FF0000000000000016303666F6F01693FF0000000000000016303666F6F016A3FF0000000000000016303666F6F016B7FF8000000000000016303666F6F016C3FF0000000000000"},"result":{"expect":"0x010301780179017A1801610362617201690000000000000000016103626172016A0000000000000000016103626172016B3FF0000000000000016103626172016C0000000000000000016103666F6F01693FF0000000000000016103666F6F016A0000000000000000016103666F6F016B0000000000000000016103666F6F016C3FF000000000000001620362617201693FF0000000000000016203626172016A0000000000000000016203626172016B0000000000000000016203626172016C3FF0000000000000016203666F6F01690000000000000000016203666F6F016A3FF0000000000000016203666F6F016B0000000000000000016203666F6F016C000000000000000001630362617201690000000000000000016303626172016A3FF0000000000000016303626172016B0000000000000000016303626172016C0000000000000000016303666F6F01690000000000000000016303666F6F016A0000000000000000016303666F6F016B3FF0000000000000016303666F6F016C0000000000000000"}}
+{"expression":"isNan(a)","inputs":{"a":"0x0301017902017803017A0702036261723FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF000000000000003666F6F7FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF0000000000000"},"result":{"expect":"0x0301017902017803017A070203626172000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF00000000000000000000000000000000000000000000003666F6F3FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF00000000000000000000000000000"}}
+{"expression":"isNan(a)","inputs":{"a":"0x03020178017A010179050C016101697FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000000161016A3FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000000161016B3FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000000161016C7FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF0000000000000016201693FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000000162016A7FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000000162016B3FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000000162016C3FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF8000000000000016301693FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000000163016A3FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000000163016B7FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000000163016C3FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF0000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FF0000000000000000000000000000000000000000000003FF000000000000000000000000000000161016A000000000000000000000000000000003FF0000000000000000000000000000000000000000000000161016B00000000000000003FF0000000000000000000000000000000000000000000003FF00000000000000161016C3FF0000000000000000000000000000000000000000000003FF000000000000000000000000000000162016900000000000000003FF0000000000000000000000000000000000000000000003FF00000000000000162016A3FF0000000000000000000000000000000000000000000003FF000000000000000000000000000000162016B000000000000000000000000000000003FF0000000000000000000000000000000000000000000000162016C00000000000000003FF0000000000000000000000000000000000000000000003FF000000000000001630169000000000000000000000000000000003FF0000000000000000000000000000000000000000000000163016A00000000000000003FF0000000000000000000000000000000000000000000003FF00000000000000163016B3FF0000000000000000000000000000000000000000000003FF000000000000000000000000000000163016C000000000000000000000000000000003FF000000000000000000000000000000000000000000000"}}
+{"expression":"map(a,f(a)(isNan(a)))","inputs":{"a":"0x02007FF8000000000000"},"result":{"expect":"0x02003FF0000000000000"}}
+{"expression":"map(a,f(a)(isNan(a)))","inputs":{"a":"0x02010178037FF80000000000003FF00000000000003FF0000000000000"},"result":{"expect":"0x02010178033FF000000000000000000000000000000000000000000000"}}
+{"expression":"map(a,f(a)(isNan(a)))","inputs":{"a":"0x02020178030179057FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF0000000000000"},"result":{"expect":"0x02020178030179053FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000"}}
+{"expression":"map(a,f(a)(isNan(a)))","inputs":{"a":"0x0203017803017905017A077FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF0000000000000"},"result":{"expect":"0x0203017803017905017A073FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000"}}
+{"expression":"map(a,f(a)(isNan(a)))","inputs":{"a":"0x010101780301617FF800000000000001623FF000000000000001633FF0000000000000"},"result":{"expect":"0x010101780301613FF00000000000000162000000000000000001630000000000000000"}}
+{"expression":"map(a,f(a)(isNan(a)))","inputs":{"a":"0x010201780179060161036261723FF0000000000000016103666F6F7FF80000000000000162036261727FF8000000000000016203666F6F3FF00000000000000163036261723FF0000000000000016303666F6F3FF0000000000000"},"result":{"expect":"0x010201780179060161036261720000000000000000016103666F6F3FF00000000000000162036261723FF0000000000000016203666F6F00000000000000000163036261720000000000000000016303666F6F0000000000000000"}}
+{"expression":"map(a,f(a)(isNan(a)))","inputs":{"a":"0x010301780179017A1801610362617201693FF0000000000000016103626172016A3FF0000000000000016103626172016B7FF8000000000000016103626172016C3FF0000000000000016103666F6F01697FF8000000000000016103666F6F016A3FF0000000000000016103666F6F016B3FF0000000000000016103666F6F016C7FF800000000000001620362617201697FF8000000000000016203626172016A3FF0000000000000016203626172016B3FF0000000000000016203626172016C7FF8000000000000016203666F6F01693FF0000000000000016203666F6F016A7FF8000000000000016203666F6F016B3FF0000000000000016203666F6F016C3FF000000000000001630362617201693FF0000000000000016303626172016A7FF8000000000000016303626172016B3FF0000000000000016303626172016C3FF0000000000000016303666F6F01693FF0000000000000016303666F6F016A3FF0000000000000016303666F6F016B7FF8000000000000016303666F6F016C3FF0000000000000"},"result":{"expect":"0x010301780179017A1801610362617201690000000000000000016103626172016A0000000000000000016103626172016B3FF0000000000000016103626172016C0000000000000000016103666F6F01693FF0000000000000016103666F6F016A0000000000000000016103666F6F016B0000000000000000016103666F6F016C3FF000000000000001620362617201693FF0000000000000016203626172016A0000000000000000016203626172016B0000000000000000016203626172016C3FF0000000000000016203666F6F01690000000000000000016203666F6F016A3FF0000000000000016203666F6F016B0000000000000000016203666F6F016C000000000000000001630362617201690000000000000000016303626172016A3FF0000000000000016303626172016B0000000000000000016303626172016C0000000000000000016303666F6F01690000000000000000016303666F6F016A0000000000000000016303666F6F016B3FF0000000000000016303666F6F016C0000000000000000"}}
+{"expression":"map(a,f(a)(isNan(a)))","inputs":{"a":"0x0301017902017803017A0702036261723FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF000000000000003666F6F7FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF0000000000000"},"result":{"expect":"0x0301017902017803017A070203626172000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF00000000000000000000000000000000000000000000003666F6F3FF0000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF00000000000000000000000000000"}}
+{"expression":"map(a,f(a)(isNan(a)))","inputs":{"a":"0x03020178017A010179050C016101697FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000000161016A3FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000000161016B3FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000000161016C7FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF0000000000000016201693FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000000162016A7FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000000162016B3FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000000162016C3FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF8000000000000016301693FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF00000000000000163016A3FF00000000000007FF80000000000003FF00000000000003FF00000000000007FF80000000000000163016B7FF80000000000003FF00000000000003FF00000000000007FF80000000000003FF00000000000000163016C3FF00000000000003FF00000000000007FF80000000000003FF00000000000003FF0000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FF0000000000000000000000000000000000000000000003FF000000000000000000000000000000161016A000000000000000000000000000000003FF0000000000000000000000000000000000000000000000161016B00000000000000003FF0000000000000000000000000000000000000000000003FF00000000000000161016C3FF0000000000000000000000000000000000000000000003FF000000000000000000000000000000162016900000000000000003FF0000000000000000000000000000000000000000000003FF00000000000000162016A3FF0000000000000000000000000000000000000000000003FF000000000000000000000000000000162016B000000000000000000000000000000003FF0000000000000000000000000000000000000000000000162016C00000000000000003FF0000000000000000000000000000000000000000000003FF000000000000001630169000000000000000000000000000000003FF0000000000000000000000000000000000000000000000163016A00000000000000003FF0000000000000000000000000000000000000000000003FF00000000000000163016B3FF0000000000000000000000000000000000000000000003FF000000000000000000000000000000163016C000000000000000000000000000000003FF000000000000000000000000000000000000000000000"}}
+{"expression":"relu(a)","inputs":{"a":"0x0200BFFE666666666666"},"result":{"expect":"0x02000000000000000000"}}
+{"expression":"relu(a)","inputs":{"a":"0x0201017803BFFE666666666666BFFCCCCCCCCCCCCDBFFB333333333333"},"result":{"expect":"0x0201017803000000000000000000000000000000000000000000000000"}}
+{"expression":"relu(a)","inputs":{"a":"0x0202017803017905BFFE666666666666BFFCCCCCCCCCCCCDBFFB333333333333BFF999999999999ABFF8000000000000BFF6666666666666BFF4CCCCCCCCCCCDBFF3333333333333BFF199999999999ABFF0000000000000BFECCCCCCCCCCCCCBFE999999999999ABFE6666666666666BFE3333333333334BFE0000000000000"},"result":{"expect":"0x0202017803017905000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"relu(a)","inputs":{"a":"0x0203017803017905017A07BFFE666666666666BFFCCCCCCCCCCCCDBFFB333333333333BFF999999999999ABFF8000000000000BFF6666666666666BFF4CCCCCCCCCCCDBFF3333333333333BFF199999999999ABFF0000000000000BFECCCCCCCCCCCCCBFE999999999999ABFE6666666666666BFE3333333333334BFE0000000000000BFD9999999999998BFD3333333333334BFC9999999999998BFB99999999999A000000000000000003FB99999999999A03FC99999999999A03FD33333333333303FD99999999999983FE00000000000003FE33333333333343FE66666666666683FE99999999999983FECCCCCCCCCCCCC3FF00000000000003FF199999999999A3FF33333333333343FF4CCCCCCCCCCCC3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333343FFCCCCCCCCCCCCC3FFE66666666666640000000000000004000CCCCCCCCCCCC400199999999999A4002666666666666400333333333333440040000000000004004CCCCCCCCCCCC400599999999999A4006666666666666400733333333333440080000000000004008CCCCCCCCCCCC400999999999999A400A666666666666400B333333333334400C000000000000400CCCCCCCCCCCCC400D99999999999A400E666666666666400F333333333334401000000000000040106666666666664010CCCCCCCCCCCD4011333333333333401199999999999A401200000000000040126666666666664012CCCCCCCCCCCD4013333333333333401399999999999A401400000000000040146666666666664014CCCCCCCCCCCD4015333333333333401599999999999A401600000000000040166666666666664016CCCCCCCCCCCD4017333333333333401799999999999A401800000000000040186666666666664018CCCCCCCCCCCC4019333333333334401999999999999A401A000000000000401A666666666666401ACCCCCCCCCCCC401B333333333334401B99999999999A401C000000000000401C666666666666401CCCCCCCCCCCCC401D333333333334401D99999999999A401E000000000000401E666666666666401ECCCCCCCCCCCC401F333333333334401F99999999999A402000000000000040203333333333334020666666666666402099999999999A4020CCCCCCCCCCCD4021000000000000"},"result":{"expect":"0x0203017803017905017A07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FB99999999999A03FC99999999999A03FD33333333333303FD99999999999983FE00000000000003FE33333333333343FE66666666666683FE99999999999983FECCCCCCCCCCCCC3FF00000000000003FF199999999999A3FF33333333333343FF4CCCCCCCCCCCC3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333343FFCCCCCCCCCCCCC3FFE66666666666640000000000000004000CCCCCCCCCCCC400199999999999A4002666666666666400333333333333440040000000000004004CCCCCCCCCCCC400599999999999A4006666666666666400733333333333440080000000000004008CCCCCCCCCCCC400999999999999A400A666666666666400B333333333334400C000000000000400CCCCCCCCCCCCC400D99999999999A400E666666666666400F333333333334401000000000000040106666666666664010CCCCCCCCCCCD4011333333333333401199999999999A401200000000000040126666666666664012CCCCCCCCCCCD4013333333333333401399999999999A401400000000000040146666666666664014CCCCCCCCCCCD4015333333333333401599999999999A401600000000000040166666666666664016CCCCCCCCCCCD4017333333333333401799999999999A401800000000000040186666666666664018CCCCCCCCCCCC4019333333333334401999999999999A401A000000000000401A666666666666401ACCCCCCCCCCCC401B333333333334401B99999999999A401C000000000000401C666666666666401CCCCCCCCCCCCC401D333333333334401D99999999999A401E000000000000401E666666666666401ECCCCCCCCCCCC401F333333333334401F99999999999A402000000000000040203333333333334020666666666666402099999999999A4020CCCCCCCCCCCD4021000000000000"}}
+{"expression":"relu(a)","inputs":{"a":"0x01010178030161BFFE6666666666660162BFFCCCCCCCCCCCCD0163BFFB333333333333"},"result":{"expect":"0x0101017803016100000000000000000162000000000000000001630000000000000000"}}
+{"expression":"relu(a)","inputs":{"a":"0x01020178017906016103626172BFFCCCCCCCCCCCCD016103666F6FBFFE666666666666016203626172BFF999999999999A016203666F6FBFFB333333333333016303626172BFF6666666666666016303666F6FBFF8000000000000"},"result":{"expect":"0x010201780179060161036261720000000000000000016103666F6F00000000000000000162036261720000000000000000016203666F6F00000000000000000163036261720000000000000000016303666F6F0000000000000000"}}
+{"expression":"relu(a)","inputs":{"a":"0x010301780179017A180161036261720169BFF8000000000000016103626172016ABFF6666666666666016103626172016BBFF4CCCCCCCCCCCD016103626172016CBFF3333333333333016103666F6F0169BFFE666666666666016103666F6F016ABFFCCCCCCCCCCCCD016103666F6F016BBFFB333333333333016103666F6F016CBFF999999999999A0162036261720169BFE6666666666666016203626172016ABFE3333333333334016203626172016BBFE0000000000000016203626172016CBFD9999999999998016203666F6F0169BFF199999999999A016203666F6F016ABFF0000000000000016203666F6F016BBFECCCCCCCCCCCCC016203666F6F016CBFE999999999999A01630362617201693FB99999999999A0016303626172016A3FC99999999999A0016303626172016B3FD3333333333330016303626172016C3FD9999999999998016303666F6F0169BFD3333333333334016303666F6F016ABFC9999999999998016303666F6F016BBFB99999999999A0016303666F6F016C0000000000000000"},"result":{"expect":"0x010301780179017A1801610362617201690000000000000000016103626172016A0000000000000000016103626172016B0000000000000000016103626172016C0000000000000000016103666F6F01690000000000000000016103666F6F016A0000000000000000016103666F6F016B0000000000000000016103666F6F016C000000000000000001620362617201690000000000000000016203626172016A0000000000000000016203626172016B0000000000000000016203626172016C0000000000000000016203666F6F01690000000000000000016203666F6F016A0000000000000000016203666F6F016B0000000000000000016203666F6F016C000000000000000001630362617201693FB99999999999A0016303626172016A3FC99999999999A0016303626172016B3FD3333333333330016303626172016C3FD9999999999998016303666F6F01690000000000000000016303666F6F016A0000000000000000016303666F6F016B0000000000000000016303666F6F016C0000000000000000"}}
+{"expression":"relu(a)","inputs":{"a":"0x0301017902017803017A070203626172BFF3333333333333BFF199999999999ABFF0000000000000BFECCCCCCCCCCCCCBFE999999999999ABFE6666666666666BFE33333333333343FC99999999999A03FD33333333333303FD99999999999983FE00000000000003FE33333333333343FE66666666666683FE99999999999983FF999999999999A3FFB3333333333343FFCCCCCCCCCCCCC3FFE66666666666640000000000000004000CCCCCCCCCCCC400199999999999A03666F6FBFFE666666666666BFFCCCCCCCCCCCCDBFFB333333333333BFF999999999999ABFF8000000000000BFF6666666666666BFF4CCCCCCCCCCCDBFE0000000000000BFD9999999999998BFD3333333333334BFC9999999999998BFB99999999999A000000000000000003FB99999999999A03FECCCCCCCCCCCCC3FF00000000000003FF199999999999A3FF33333333333343FF4CCCCCCCCCCCC3FF66666666666663FF8000000000000"},"result":{"expect":"0x0301017902017803017A07020362617200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FC99999999999A03FD33333333333303FD99999999999983FE00000000000003FE33333333333343FE66666666666683FE99999999999983FF999999999999A3FFB3333333333343FFCCCCCCCCCCCCC3FFE66666666666640000000000000004000CCCCCCCCCCCC400199999999999A03666F6F00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FB99999999999A03FECCCCCCCCCCCCC3FF00000000000003FF199999999999A3FF33333333333343FF4CCCCCCCCCCCC3FF66666666666663FF8000000000000"}}
+{"expression":"relu(a)","inputs":{"a":"0x03020178017A010179050C01610169BFFE666666666666BFF8000000000000BFF199999999999ABFE6666666666666BFD33333333333340161016ABFFCCCCCCCCCCCCDBFF6666666666666BFF0000000000000BFE3333333333334BFC99999999999980161016BBFFB333333333333BFF4CCCCCCCCCCCDBFECCCCCCCCCCCCCBFE0000000000000BFB99999999999A00161016CBFF999999999999ABFF3333333333333BFE999999999999ABFD99999999999980000000000000000016201693FB99999999999A03FE00000000000003FECCCCCCCCCCCCC3FF4CCCCCCCCCCCC3FFB3333333333340162016A3FC99999999999A03FE33333333333343FF00000000000003FF66666666666663FFCCCCCCCCCCCCC0162016B3FD33333333333303FE66666666666683FF199999999999A3FF80000000000003FFE6666666666660162016C3FD99999999999983FE99999999999983FF33333333333343FF999999999999A4000000000000000016301694000CCCCCCCCCCCC40040000000000004007333333333334400A666666666666400D99999999999A0163016A400199999999999A4004CCCCCCCCCCCC4008000000000000400B333333333334400E6666666666660163016B4002666666666666400599999999999A4008CCCCCCCCCCCC400C000000000000400F3333333333340163016C40033333333333344006666666666666400999999999999A400CCCCCCCCCCCCC4010000000000000"},"result":{"expect":"0x03020178017A010179050C01610169000000000000000000000000000000000000000000000000000000000000000000000000000000000161016A000000000000000000000000000000000000000000000000000000000000000000000000000000000161016B000000000000000000000000000000000000000000000000000000000000000000000000000000000161016C00000000000000000000000000000000000000000000000000000000000000000000000000000000016201693FB99999999999A03FE00000000000003FECCCCCCCCCCCCC3FF4CCCCCCCCCCCC3FFB3333333333340162016A3FC99999999999A03FE33333333333343FF00000000000003FF66666666666663FFCCCCCCCCCCCCC0162016B3FD33333333333303FE66666666666683FF199999999999A3FF80000000000003FFE6666666666660162016C3FD99999999999983FE99999999999983FF33333333333343FF999999999999A4000000000000000016301694000CCCCCCCCCCCC40040000000000004007333333333334400A666666666666400D99999999999A0163016A400199999999999A4004CCCCCCCCCCCC4008000000000000400B333333333334400E6666666666660163016B4002666666666666400599999999999A4008CCCCCCCCCCCC400C000000000000400F3333333333340163016C40033333333333344006666666666666400999999999999A400CCCCCCCCCCCCC4010000000000000"}}
+{"expression":"map(a,f(a)(relu(a)))","inputs":{"a":"0x0200BFFE666666666666"},"result":{"expect":"0x02000000000000000000"}}
+{"expression":"map(a,f(a)(relu(a)))","inputs":{"a":"0x0201017803BFFE666666666666BFFCCCCCCCCCCCCDBFFB333333333333"},"result":{"expect":"0x0201017803000000000000000000000000000000000000000000000000"}}
+{"expression":"map(a,f(a)(relu(a)))","inputs":{"a":"0x0202017803017905BFFE666666666666BFFCCCCCCCCCCCCDBFFB333333333333BFF999999999999ABFF8000000000000BFF6666666666666BFF4CCCCCCCCCCCDBFF3333333333333BFF199999999999ABFF0000000000000BFECCCCCCCCCCCCCBFE999999999999ABFE6666666666666BFE3333333333334BFE0000000000000"},"result":{"expect":"0x0202017803017905000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"map(a,f(a)(relu(a)))","inputs":{"a":"0x0203017803017905017A07BFFE666666666666BFFCCCCCCCCCCCCDBFFB333333333333BFF999999999999ABFF8000000000000BFF6666666666666BFF4CCCCCCCCCCCDBFF3333333333333BFF199999999999ABFF0000000000000BFECCCCCCCCCCCCCBFE999999999999ABFE6666666666666BFE3333333333334BFE0000000000000BFD9999999999998BFD3333333333334BFC9999999999998BFB99999999999A000000000000000003FB99999999999A03FC99999999999A03FD33333333333303FD99999999999983FE00000000000003FE33333333333343FE66666666666683FE99999999999983FECCCCCCCCCCCCC3FF00000000000003FF199999999999A3FF33333333333343FF4CCCCCCCCCCCC3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333343FFCCCCCCCCCCCCC3FFE66666666666640000000000000004000CCCCCCCCCCCC400199999999999A4002666666666666400333333333333440040000000000004004CCCCCCCCCCCC400599999999999A4006666666666666400733333333333440080000000000004008CCCCCCCCCCCC400999999999999A400A666666666666400B333333333334400C000000000000400CCCCCCCCCCCCC400D99999999999A400E666666666666400F333333333334401000000000000040106666666666664010CCCCCCCCCCCD4011333333333333401199999999999A401200000000000040126666666666664012CCCCCCCCCCCD4013333333333333401399999999999A401400000000000040146666666666664014CCCCCCCCCCCD4015333333333333401599999999999A401600000000000040166666666666664016CCCCCCCCCCCD4017333333333333401799999999999A401800000000000040186666666666664018CCCCCCCCCCCC4019333333333334401999999999999A401A000000000000401A666666666666401ACCCCCCCCCCCC401B333333333334401B99999999999A401C000000000000401C666666666666401CCCCCCCCCCCCC401D333333333334401D99999999999A401E000000000000401E666666666666401ECCCCCCCCCCCC401F333333333334401F99999999999A402000000000000040203333333333334020666666666666402099999999999A4020CCCCCCCCCCCD4021000000000000"},"result":{"expect":"0x0203017803017905017A07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FB99999999999A03FC99999999999A03FD33333333333303FD99999999999983FE00000000000003FE33333333333343FE66666666666683FE99999999999983FECCCCCCCCCCCCC3FF00000000000003FF199999999999A3FF33333333333343FF4CCCCCCCCCCCC3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333343FFCCCCCCCCCCCCC3FFE66666666666640000000000000004000CCCCCCCCCCCC400199999999999A4002666666666666400333333333333440040000000000004004CCCCCCCCCCCC400599999999999A4006666666666666400733333333333440080000000000004008CCCCCCCCCCCC400999999999999A400A666666666666400B333333333334400C000000000000400CCCCCCCCCCCCC400D99999999999A400E666666666666400F333333333334401000000000000040106666666666664010CCCCCCCCCCCD4011333333333333401199999999999A401200000000000040126666666666664012CCCCCCCCCCCD4013333333333333401399999999999A401400000000000040146666666666664014CCCCCCCCCCCD4015333333333333401599999999999A401600000000000040166666666666664016CCCCCCCCCCCD4017333333333333401799999999999A401800000000000040186666666666664018CCCCCCCCCCCC4019333333333334401999999999999A401A000000000000401A666666666666401ACCCCCCCCCCCC401B333333333334401B99999999999A401C000000000000401C666666666666401CCCCCCCCCCCCC401D333333333334401D99999999999A401E000000000000401E666666666666401ECCCCCCCCCCCC401F333333333334401F99999999999A402000000000000040203333333333334020666666666666402099999999999A4020CCCCCCCCCCCD4021000000000000"}}
+{"expression":"map(a,f(a)(relu(a)))","inputs":{"a":"0x01010178030161BFFE6666666666660162BFFCCCCCCCCCCCCD0163BFFB333333333333"},"result":{"expect":"0x0101017803016100000000000000000162000000000000000001630000000000000000"}}
+{"expression":"map(a,f(a)(relu(a)))","inputs":{"a":"0x01020178017906016103626172BFFCCCCCCCCCCCCD016103666F6FBFFE666666666666016203626172BFF999999999999A016203666F6FBFFB333333333333016303626172BFF6666666666666016303666F6FBFF8000000000000"},"result":{"expect":"0x010201780179060161036261720000000000000000016103666F6F00000000000000000162036261720000000000000000016203666F6F00000000000000000163036261720000000000000000016303666F6F0000000000000000"}}
+{"expression":"map(a,f(a)(relu(a)))","inputs":{"a":"0x010301780179017A180161036261720169BFF8000000000000016103626172016ABFF6666666666666016103626172016BBFF4CCCCCCCCCCCD016103626172016CBFF3333333333333016103666F6F0169BFFE666666666666016103666F6F016ABFFCCCCCCCCCCCCD016103666F6F016BBFFB333333333333016103666F6F016CBFF999999999999A0162036261720169BFE6666666666666016203626172016ABFE3333333333334016203626172016BBFE0000000000000016203626172016CBFD9999999999998016203666F6F0169BFF199999999999A016203666F6F016ABFF0000000000000016203666F6F016BBFECCCCCCCCCCCCC016203666F6F016CBFE999999999999A01630362617201693FB99999999999A0016303626172016A3FC99999999999A0016303626172016B3FD3333333333330016303626172016C3FD9999999999998016303666F6F0169BFD3333333333334016303666F6F016ABFC9999999999998016303666F6F016BBFB99999999999A0016303666F6F016C0000000000000000"},"result":{"expect":"0x010301780179017A1801610362617201690000000000000000016103626172016A0000000000000000016103626172016B0000000000000000016103626172016C0000000000000000016103666F6F01690000000000000000016103666F6F016A0000000000000000016103666F6F016B0000000000000000016103666F6F016C000000000000000001620362617201690000000000000000016203626172016A0000000000000000016203626172016B0000000000000000016203626172016C0000000000000000016203666F6F01690000000000000000016203666F6F016A0000000000000000016203666F6F016B0000000000000000016203666F6F016C000000000000000001630362617201693FB99999999999A0016303626172016A3FC99999999999A0016303626172016B3FD3333333333330016303626172016C3FD9999999999998016303666F6F01690000000000000000016303666F6F016A0000000000000000016303666F6F016B0000000000000000016303666F6F016C0000000000000000"}}
+{"expression":"map(a,f(a)(relu(a)))","inputs":{"a":"0x0301017902017803017A070203626172BFF3333333333333BFF199999999999ABFF0000000000000BFECCCCCCCCCCCCCBFE999999999999ABFE6666666666666BFE33333333333343FC99999999999A03FD33333333333303FD99999999999983FE00000000000003FE33333333333343FE66666666666683FE99999999999983FF999999999999A3FFB3333333333343FFCCCCCCCCCCCCC3FFE66666666666640000000000000004000CCCCCCCCCCCC400199999999999A03666F6FBFFE666666666666BFFCCCCCCCCCCCCDBFFB333333333333BFF999999999999ABFF8000000000000BFF6666666666666BFF4CCCCCCCCCCCDBFE0000000000000BFD9999999999998BFD3333333333334BFC9999999999998BFB99999999999A000000000000000003FB99999999999A03FECCCCCCCCCCCCC3FF00000000000003FF199999999999A3FF33333333333343FF4CCCCCCCCCCCC3FF66666666666663FF8000000000000"},"result":{"expect":"0x0301017902017803017A07020362617200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FC99999999999A03FD33333333333303FD99999999999983FE00000000000003FE33333333333343FE66666666666683FE99999999999983FF999999999999A3FFB3333333333343FFCCCCCCCCCCCCC3FFE66666666666640000000000000004000CCCCCCCCCCCC400199999999999A03666F6F00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FB99999999999A03FECCCCCCCCCCCCC3FF00000000000003FF199999999999A3FF33333333333343FF4CCCCCCCCCCCC3FF66666666666663FF8000000000000"}}
+{"expression":"map(a,f(a)(relu(a)))","inputs":{"a":"0x03020178017A010179050C01610169BFFE666666666666BFF8000000000000BFF199999999999ABFE6666666666666BFD33333333333340161016ABFFCCCCCCCCCCCCDBFF6666666666666BFF0000000000000BFE3333333333334BFC99999999999980161016BBFFB333333333333BFF4CCCCCCCCCCCDBFECCCCCCCCCCCCCBFE0000000000000BFB99999999999A00161016CBFF999999999999ABFF3333333333333BFE999999999999ABFD99999999999980000000000000000016201693FB99999999999A03FE00000000000003FECCCCCCCCCCCCC3FF4CCCCCCCCCCCC3FFB3333333333340162016A3FC99999999999A03FE33333333333343FF00000000000003FF66666666666663FFCCCCCCCCCCCCC0162016B3FD33333333333303FE66666666666683FF199999999999A3FF80000000000003FFE6666666666660162016C3FD99999999999983FE99999999999983FF33333333333343FF999999999999A4000000000000000016301694000CCCCCCCCCCCC40040000000000004007333333333334400A666666666666400D99999999999A0163016A400199999999999A4004CCCCCCCCCCCC4008000000000000400B333333333334400E6666666666660163016B4002666666666666400599999999999A4008CCCCCCCCCCCC400C000000000000400F3333333333340163016C40033333333333344006666666666666400999999999999A400CCCCCCCCCCCCC4010000000000000"},"result":{"expect":"0x03020178017A010179050C01610169000000000000000000000000000000000000000000000000000000000000000000000000000000000161016A000000000000000000000000000000000000000000000000000000000000000000000000000000000161016B000000000000000000000000000000000000000000000000000000000000000000000000000000000161016C00000000000000000000000000000000000000000000000000000000000000000000000000000000016201693FB99999999999A03FE00000000000003FECCCCCCCCCCCCC3FF4CCCCCCCCCCCC3FFB3333333333340162016A3FC99999999999A03FE33333333333343FF00000000000003FF66666666666663FFCCCCCCCCCCCCC0162016B3FD33333333333303FE66666666666683FF199999999999A3FF80000000000003FFE6666666666660162016C3FD99999999999983FE99999999999983FF33333333333343FF999999999999A4000000000000000016301694000CCCCCCCCCCCC40040000000000004007333333333334400A666666666666400D99999999999A0163016A400199999999999A4004CCCCCCCCCCCC4008000000000000400B333333333334400E6666666666660163016B4002666666666666400599999999999A4008CCCCCCCCCCCC400C000000000000400F3333333333340163016C40033333333333344006666666666666400999999999999A400CCCCCCCCCCCCC4010000000000000"}}
+{"expression":"sigmoid(a)","inputs":{"a":"0x0200BFFE666666666666"},"result":{"expect":"0x02003FC0A764FD2927E7"}}
+{"expression":"sigmoid(a)","inputs":{"a":"0x0201017803BFFE666666666666BFFCCCCCCCCCCCCDBFFB333333333333"},"result":{"expect":"0x02010178033FC0A764FD2927E73FC2282CFA533F463FC3C5848EF36C9E"}}
+{"expression":"sigmoid(a)","inputs":{"a":"0x0202017803017905BFFE666666666666BFFCCCCCCCCCCCCDBFFB333333333333BFF999999999999ABFF8000000000000BFF6666666666666BFF4CCCCCCCCCCCDBFF3333333333333BFF199999999999ABFF0000000000000BFECCCCCCCCCCCCCBFE999999999999ABFE6666666666666BFE3333333333334BFE0000000000000"},"result":{"expect":"0x02020178030179053FC0A764FD2927E73FC2282CFA533F463FC3C5848EF36C9E3FC5806BEB16EB7F3FC759B8355A1BB03FC95209D0A1A2DE3FCB69C25FE3C6883FCDA0FADA5A66093FCFF77A137CDBF93FD136561454BA863FD27FCDA8478FA33FD3D775461EDE953FD53C695ABCD7153FD6AD912C1375833FD829A0565978DE"}}
+{"expression":"sigmoid(a)","inputs":{"a":"0x0203017803017905017A07BFFE666666666666BFFCCCCCCCCCCCCDBFFB333333333333BFF999999999999ABFF8000000000000BFF6666666666666BFF4CCCCCCCCCCCDBFF3333333333333BFF199999999999ABFF0000000000000BFECCCCCCCCCCCCCBFE999999999999ABFE6666666666666BFE3333333333334BFE0000000000000BFD9999999999998BFD3333333333334BFC9999999999998BFB99999999999A000000000000000003FB99999999999A03FC99999999999A03FD33333333333303FD99999999999983FE00000000000003FE33333333333343FE66666666666683FE99999999999983FECCCCCCCCCCCCC3FF00000000000003FF199999999999A3FF33333333333343FF4CCCCCCCCCCCC3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333343FFCCCCCCCCCCCCC3FFE66666666666640000000000000004000CCCCCCCCCCCC400199999999999A4002666666666666400333333333333440040000000000004004CCCCCCCCCCCC400599999999999A4006666666666666400733333333333440080000000000004008CCCCCCCCCCCC400999999999999A400A666666666666400B333333333334400C000000000000400CCCCCCCCCCCCC400D99999999999A400E666666666666400F333333333334401000000000000040106666666666664010CCCCCCCCCCCD4011333333333333401199999999999A401200000000000040126666666666664012CCCCCCCCCCCD4013333333333333401399999999999A401400000000000040146666666666664014CCCCCCCCCCCD4015333333333333401599999999999A401600000000000040166666666666664016CCCCCCCCCCCD4017333333333333401799999999999A401800000000000040186666666666664018CCCCCCCCCCCC4019333333333334401999999999999A401A000000000000401A666666666666401ACCCCCCCCCCCC401B333333333334401B99999999999A401C000000000000401C666666666666401CCCCCCCCCCCCC401D333333333334401D99999999999A401E000000000000401E666666666666401ECCCCCCCCCCCC401F333333333334401F99999999999A402000000000000040203333333333334020666666666666402099999999999A4020CCCCCCCCCCCD4021000000000000"},"result":{"expect":"0x0203017803017905017A073FC0A764FD2927E73FC2282CFA533F463FC3C5848EF36C9E3FC5806BEB16EB7F3FC759B8355A1BB03FC95209D0A1A2DE3FCB69C25FE3C6883FCDA0FADA5A66093FCFF77A137CDBF93FD136561454BA863FD27FCDA8478FA33FD3D775461EDE953FD53C695ABCD7153FD6AD912C1375833FD829A0565978DE3FD9AF19F3D3169C3FDB3C5574372AEB3FDCCF8510D417DA3FDE66BDB1ACA0903FE00000000000003FE0CCA12729AFB83FE1983D7795F4143FE261D545E46A8A3FE32873061674B23FE3EB2FD4D343913FE4A93769F6453E3FE561CB52A194763FE614455CF090B63FE6C0192BDC382E3FE764D4F5D5A2BD3FE802217B20C9023FE897C14969667F3FE9258F68070E5E3FE9AB7D8BD797483FEA2991F2A979143FEA9FE5053A45203FEB0E9EDC4324D83FEB75F4C16B302F3FEBD626C0B5B6063FEC2F7D5A8A79C93FEC8247621BC0C83FECCED80FEF12023FED15854CD0D92B3FED56A636946E583FED9291DDB596F83FEDC99E39374D9C3FEDFC1F4CE6E8223FEE2A667D67D08C3FEE54C20D06AA953FEE7B7CBC36FABD3FEE9EDD88B9D8AF3FEEBF2786AED6983FEEDC99CF2C9D4D3FEEF76F8069F3FB3FEF0FDFCBF19A933FEF261E0FCD4B463FEF3A59F801F5823FEF4CBFA61DE6A33FEF5D77DCF758083FEF6CA82F0DE1EA3FEF7A732E4B69463FEF86F89C2183AF3FEF925599378CD23FEF9CA4D40C82163FEFA5FEB616FE8F3FEFAE798F0E40823FEFB629BE21D26E3FEFBD21D8FB11A83FEFC372D07518CD3FEFC92C130538E23FEFCE5BACD8BFA43FEFD30E65B4D32F3FEFD74FDCAB1CF83FEFDB2AA1BA3C6B3FEFDEA84D73D7203FEFE1D196C3E1BA3FEFE4AE66F5A36A3FEFE745EC1330753FEFE99EA9BBCE223FEFEBBE888D05813FEFEDAAE43934F83FEFEF68986548923FEFF0FC0C65F7393FEFF2693DF385C93FEFF3B3CAE9A9D03FEFF4DEFA27BE023FEFF5EDC3A4177B3FEFF6E2D7C3F19D3FEFF7C0A60819EE3FEFF889631D483C3FEFF93F0E5DE28B3FEFF9E376D1D14B3FEFFA783FB7FEAC3FEFFAFEE4A424463FEFFB78BD3AA3B93FEFFBE7009351453FEFFC4AC84B51D53FEFFCA5134D77C33FEFFCF6C857E1CB3FEFFD40B84505A23FEFFD83A01DC2373FEFFDC02AF994433FEFFDF6F3B191333FEFFE28866A604D3FEFFE5561F90733"}}
+{"expression":"sigmoid(a)","inputs":{"a":"0x01010178030161BFFE6666666666660162BFFCCCCCCCCCCCCD0163BFFB333333333333"},"result":{"expect":"0x010101780301613FC0A764FD2927E701623FC2282CFA533F4601633FC3C5848EF36C9E"}}
+{"expression":"sigmoid(a)","inputs":{"a":"0x01020178017906016103626172BFFCCCCCCCCCCCCD016103666F6FBFFE666666666666016203626172BFF999999999999A016203666F6FBFFB333333333333016303626172BFF6666666666666016303666F6FBFF8000000000000"},"result":{"expect":"0x010201780179060161036261723FC2282CFA533F46016103666F6F3FC0A764FD2927E70162036261723FC5806BEB16EB7F016203666F6F3FC3C5848EF36C9E0163036261723FC95209D0A1A2DE016303666F6F3FC759B8355A1BB0"}}
+{"expression":"sigmoid(a)","inputs":{"a":"0x010301780179017A180161036261720169BFF8000000000000016103626172016ABFF6666666666666016103626172016BBFF4CCCCCCCCCCCD016103626172016CBFF3333333333333016103666F6F0169BFFE666666666666016103666F6F016ABFFCCCCCCCCCCCCD016103666F6F016BBFFB333333333333016103666F6F016CBFF999999999999A0162036261720169BFE6666666666666016203626172016ABFE3333333333334016203626172016BBFE0000000000000016203626172016CBFD9999999999998016203666F6F0169BFF199999999999A016203666F6F016ABFF0000000000000016203666F6F016BBFECCCCCCCCCCCCC016203666F6F016CBFE999999999999A01630362617201693FB99999999999A0016303626172016A3FC99999999999A0016303626172016B3FD3333333333330016303626172016C3FD9999999999998016303666F6F0169BFD3333333333334016303666F6F016ABFC9999999999998016303666F6F016BBFB99999999999A0016303666F6F016C0000000000000000"},"result":{"expect":"0x010301780179017A1801610362617201693FC759B8355A1BB0016103626172016A3FC95209D0A1A2DE016103626172016B3FCB69C25FE3C688016103626172016C3FCDA0FADA5A6609016103666F6F01693FC0A764FD2927E7016103666F6F016A3FC2282CFA533F46016103666F6F016B3FC3C5848EF36C9E016103666F6F016C3FC5806BEB16EB7F01620362617201693FD53C695ABCD715016203626172016A3FD6AD912C137583016203626172016B3FD829A0565978DE016203626172016C3FD9AF19F3D3169C016203666F6F01693FCFF77A137CDBF9016203666F6F016A3FD136561454BA86016203666F6F016B3FD27FCDA8478FA3016203666F6F016C3FD3D775461EDE9501630362617201693FE0CCA12729AFB8016303626172016A3FE1983D7795F414016303626172016B3FE261D545E46A8A016303626172016C3FE32873061674B2016303666F6F01693FDB3C5574372AEB016303666F6F016A3FDCCF8510D417DA016303666F6F016B3FDE66BDB1ACA090016303666F6F016C3FE0000000000000"}}
+{"expression":"sigmoid(a)","inputs":{"a":"0x0301017902017803017A070203626172BFF3333333333333BFF199999999999ABFF0000000000000BFECCCCCCCCCCCCCBFE999999999999ABFE6666666666666BFE33333333333343FC99999999999A03FD33333333333303FD99999999999983FE00000000000003FE33333333333343FE66666666666683FE99999999999983FF999999999999A3FFB3333333333343FFCCCCCCCCCCCCC3FFE66666666666640000000000000004000CCCCCCCCCCCC400199999999999A03666F6FBFFE666666666666BFFCCCCCCCCCCCCDBFFB333333333333BFF999999999999ABFF8000000000000BFF6666666666666BFF4CCCCCCCCCCCDBFE0000000000000BFD9999999999998BFD3333333333334BFC9999999999998BFB99999999999A000000000000000003FB99999999999A03FECCCCCCCCCCCCC3FF00000000000003FF199999999999A3FF33333333333343FF4CCCCCCCCCCCC3FF66666666666663FF8000000000000"},"result":{"expect":"0x0301017902017803017A0702036261723FCDA0FADA5A66093FCFF77A137CDBF93FD136561454BA863FD27FCDA8478FA33FD3D775461EDE953FD53C695ABCD7153FD6AD912C1375833FE1983D7795F4143FE261D545E46A8A3FE32873061674B23FE3EB2FD4D343913FE4A93769F6453E3FE561CB52A194763FE614455CF090B63FEA9FE5053A45203FEB0E9EDC4324D83FEB75F4C16B302F3FEBD626C0B5B6063FEC2F7D5A8A79C93FEC8247621BC0C83FECCED80FEF120203666F6F3FC0A764FD2927E73FC2282CFA533F463FC3C5848EF36C9E3FC5806BEB16EB7F3FC759B8355A1BB03FC95209D0A1A2DE3FCB69C25FE3C6883FD829A0565978DE3FD9AF19F3D3169C3FDB3C5574372AEB3FDCCF8510D417DA3FDE66BDB1ACA0903FE00000000000003FE0CCA12729AFB83FE6C0192BDC382E3FE764D4F5D5A2BD3FE802217B20C9023FE897C14969667F3FE9258F68070E5E3FE9AB7D8BD797483FEA2991F2A97914"}}
+{"expression":"sigmoid(a)","inputs":{"a":"0x03020178017A010179050C01610169BFFE666666666666BFF8000000000000BFF199999999999ABFE6666666666666BFD33333333333340161016ABFFCCCCCCCCCCCCDBFF6666666666666BFF0000000000000BFE3333333333334BFC99999999999980161016BBFFB333333333333BFF4CCCCCCCCCCCDBFECCCCCCCCCCCCCBFE0000000000000BFB99999999999A00161016CBFF999999999999ABFF3333333333333BFE999999999999ABFD99999999999980000000000000000016201693FB99999999999A03FE00000000000003FECCCCCCCCCCCCC3FF4CCCCCCCCCCCC3FFB3333333333340162016A3FC99999999999A03FE33333333333343FF00000000000003FF66666666666663FFCCCCCCCCCCCCC0162016B3FD33333333333303FE66666666666683FF199999999999A3FF80000000000003FFE6666666666660162016C3FD99999999999983FE99999999999983FF33333333333343FF999999999999A4000000000000000016301694000CCCCCCCCCCCC40040000000000004007333333333334400A666666666666400D99999999999A0163016A400199999999999A4004CCCCCCCCCCCC4008000000000000400B333333333334400E6666666666660163016B4002666666666666400599999999999A4008CCCCCCCCCCCC400C000000000000400F3333333333340163016C40033333333333344006666666666666400999999999999A400CCCCCCCCCCCCC4010000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FC0A764FD2927E73FC759B8355A1BB03FCFF77A137CDBF93FD53C695ABCD7153FDB3C5574372AEB0161016A3FC2282CFA533F463FC95209D0A1A2DE3FD136561454BA863FD6AD912C1375833FDCCF8510D417DA0161016B3FC3C5848EF36C9E3FCB69C25FE3C6883FD27FCDA8478FA33FD829A0565978DE3FDE66BDB1ACA0900161016C3FC5806BEB16EB7F3FCDA0FADA5A66093FD3D775461EDE953FD9AF19F3D3169C3FE0000000000000016201693FE0CCA12729AFB83FE3EB2FD4D343913FE6C0192BDC382E3FE9258F68070E5E3FEB0E9EDC4324D80162016A3FE1983D7795F4143FE4A93769F6453E3FE764D4F5D5A2BD3FE9AB7D8BD797483FEB75F4C16B302F0162016B3FE261D545E46A8A3FE561CB52A194763FE802217B20C9023FEA2991F2A979143FEBD626C0B5B6060162016C3FE32873061674B23FE614455CF090B63FE897C14969667F3FEA9FE5053A45203FEC2F7D5A8A79C9016301693FEC8247621BC0C83FED9291DDB596F83FEE54C20D06AA953FEEDC99CF2C9D4D3FEF3A59F801F5820163016A3FECCED80FEF12023FEDC99E39374D9C3FEE7B7CBC36FABD3FEEF76F8069F3FB3FEF4CBFA61DE6A30163016B3FED15854CD0D92B3FEDFC1F4CE6E8223FEE9EDD88B9D8AF3FEF0FDFCBF19A933FEF5D77DCF758080163016C3FED56A636946E583FEE2A667D67D08C3FEEBF2786AED6983FEF261E0FCD4B463FEF6CA82F0DE1EA"}}
+{"expression":"map(a,f(a)(sigmoid(a)))","inputs":{"a":"0x0200BFFE666666666666"},"result":{"expect":"0x02003FC0A764FD2927E7"}}
+{"expression":"map(a,f(a)(sigmoid(a)))","inputs":{"a":"0x0201017803BFFE666666666666BFFCCCCCCCCCCCCDBFFB333333333333"},"result":{"expect":"0x02010178033FC0A764FD2927E73FC2282CFA533F463FC3C5848EF36C9E"}}
+{"expression":"map(a,f(a)(sigmoid(a)))","inputs":{"a":"0x0202017803017905BFFE666666666666BFFCCCCCCCCCCCCDBFFB333333333333BFF999999999999ABFF8000000000000BFF6666666666666BFF4CCCCCCCCCCCDBFF3333333333333BFF199999999999ABFF0000000000000BFECCCCCCCCCCCCCBFE999999999999ABFE6666666666666BFE3333333333334BFE0000000000000"},"result":{"expect":"0x02020178030179053FC0A764FD2927E73FC2282CFA533F463FC3C5848EF36C9E3FC5806BEB16EB7F3FC759B8355A1BB03FC95209D0A1A2DE3FCB69C25FE3C6883FCDA0FADA5A66093FCFF77A137CDBF93FD136561454BA863FD27FCDA8478FA33FD3D775461EDE953FD53C695ABCD7153FD6AD912C1375833FD829A0565978DE"}}
+{"expression":"map(a,f(a)(sigmoid(a)))","inputs":{"a":"0x0203017803017905017A07BFFE666666666666BFFCCCCCCCCCCCCDBFFB333333333333BFF999999999999ABFF8000000000000BFF6666666666666BFF4CCCCCCCCCCCDBFF3333333333333BFF199999999999ABFF0000000000000BFECCCCCCCCCCCCCBFE999999999999ABFE6666666666666BFE3333333333334BFE0000000000000BFD9999999999998BFD3333333333334BFC9999999999998BFB99999999999A000000000000000003FB99999999999A03FC99999999999A03FD33333333333303FD99999999999983FE00000000000003FE33333333333343FE66666666666683FE99999999999983FECCCCCCCCCCCCC3FF00000000000003FF199999999999A3FF33333333333343FF4CCCCCCCCCCCC3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333343FFCCCCCCCCCCCCC3FFE66666666666640000000000000004000CCCCCCCCCCCC400199999999999A4002666666666666400333333333333440040000000000004004CCCCCCCCCCCC400599999999999A4006666666666666400733333333333440080000000000004008CCCCCCCCCCCC400999999999999A400A666666666666400B333333333334400C000000000000400CCCCCCCCCCCCC400D99999999999A400E666666666666400F333333333334401000000000000040106666666666664010CCCCCCCCCCCD4011333333333333401199999999999A401200000000000040126666666666664012CCCCCCCCCCCD4013333333333333401399999999999A401400000000000040146666666666664014CCCCCCCCCCCD4015333333333333401599999999999A401600000000000040166666666666664016CCCCCCCCCCCD4017333333333333401799999999999A401800000000000040186666666666664018CCCCCCCCCCCC4019333333333334401999999999999A401A000000000000401A666666666666401ACCCCCCCCCCCC401B333333333334401B99999999999A401C000000000000401C666666666666401CCCCCCCCCCCCC401D333333333334401D99999999999A401E000000000000401E666666666666401ECCCCCCCCCCCC401F333333333334401F99999999999A402000000000000040203333333333334020666666666666402099999999999A4020CCCCCCCCCCCD4021000000000000"},"result":{"expect":"0x0203017803017905017A073FC0A764FD2927E73FC2282CFA533F463FC3C5848EF36C9E3FC5806BEB16EB7F3FC759B8355A1BB03FC95209D0A1A2DE3FCB69C25FE3C6883FCDA0FADA5A66093FCFF77A137CDBF93FD136561454BA863FD27FCDA8478FA33FD3D775461EDE953FD53C695ABCD7153FD6AD912C1375833FD829A0565978DE3FD9AF19F3D3169C3FDB3C5574372AEB3FDCCF8510D417DA3FDE66BDB1ACA0903FE00000000000003FE0CCA12729AFB83FE1983D7795F4143FE261D545E46A8A3FE32873061674B23FE3EB2FD4D343913FE4A93769F6453E3FE561CB52A194763FE614455CF090B63FE6C0192BDC382E3FE764D4F5D5A2BD3FE802217B20C9023FE897C14969667F3FE9258F68070E5E3FE9AB7D8BD797483FEA2991F2A979143FEA9FE5053A45203FEB0E9EDC4324D83FEB75F4C16B302F3FEBD626C0B5B6063FEC2F7D5A8A79C93FEC8247621BC0C83FECCED80FEF12023FED15854CD0D92B3FED56A636946E583FED9291DDB596F83FEDC99E39374D9C3FEDFC1F4CE6E8223FEE2A667D67D08C3FEE54C20D06AA953FEE7B7CBC36FABD3FEE9EDD88B9D8AF3FEEBF2786AED6983FEEDC99CF2C9D4D3FEEF76F8069F3FB3FEF0FDFCBF19A933FEF261E0FCD4B463FEF3A59F801F5823FEF4CBFA61DE6A33FEF5D77DCF758083FEF6CA82F0DE1EA3FEF7A732E4B69463FEF86F89C2183AF3FEF925599378CD23FEF9CA4D40C82163FEFA5FEB616FE8F3FEFAE798F0E40823FEFB629BE21D26E3FEFBD21D8FB11A83FEFC372D07518CD3FEFC92C130538E23FEFCE5BACD8BFA43FEFD30E65B4D32F3FEFD74FDCAB1CF83FEFDB2AA1BA3C6B3FEFDEA84D73D7203FEFE1D196C3E1BA3FEFE4AE66F5A36A3FEFE745EC1330753FEFE99EA9BBCE223FEFEBBE888D05813FEFEDAAE43934F83FEFEF68986548923FEFF0FC0C65F7393FEFF2693DF385C93FEFF3B3CAE9A9D03FEFF4DEFA27BE023FEFF5EDC3A4177B3FEFF6E2D7C3F19D3FEFF7C0A60819EE3FEFF889631D483C3FEFF93F0E5DE28B3FEFF9E376D1D14B3FEFFA783FB7FEAC3FEFFAFEE4A424463FEFFB78BD3AA3B93FEFFBE7009351453FEFFC4AC84B51D53FEFFCA5134D77C33FEFFCF6C857E1CB3FEFFD40B84505A23FEFFD83A01DC2373FEFFDC02AF994433FEFFDF6F3B191333FEFFE28866A604D3FEFFE5561F90733"}}
+{"expression":"map(a,f(a)(sigmoid(a)))","inputs":{"a":"0x01010178030161BFFE6666666666660162BFFCCCCCCCCCCCCD0163BFFB333333333333"},"result":{"expect":"0x010101780301613FC0A764FD2927E701623FC2282CFA533F4601633FC3C5848EF36C9E"}}
+{"expression":"map(a,f(a)(sigmoid(a)))","inputs":{"a":"0x01020178017906016103626172BFFCCCCCCCCCCCCD016103666F6FBFFE666666666666016203626172BFF999999999999A016203666F6FBFFB333333333333016303626172BFF6666666666666016303666F6FBFF8000000000000"},"result":{"expect":"0x010201780179060161036261723FC2282CFA533F46016103666F6F3FC0A764FD2927E70162036261723FC5806BEB16EB7F016203666F6F3FC3C5848EF36C9E0163036261723FC95209D0A1A2DE016303666F6F3FC759B8355A1BB0"}}
+{"expression":"map(a,f(a)(sigmoid(a)))","inputs":{"a":"0x010301780179017A180161036261720169BFF8000000000000016103626172016ABFF6666666666666016103626172016BBFF4CCCCCCCCCCCD016103626172016CBFF3333333333333016103666F6F0169BFFE666666666666016103666F6F016ABFFCCCCCCCCCCCCD016103666F6F016BBFFB333333333333016103666F6F016CBFF999999999999A0162036261720169BFE6666666666666016203626172016ABFE3333333333334016203626172016BBFE0000000000000016203626172016CBFD9999999999998016203666F6F0169BFF199999999999A016203666F6F016ABFF0000000000000016203666F6F016BBFECCCCCCCCCCCCC016203666F6F016CBFE999999999999A01630362617201693FB99999999999A0016303626172016A3FC99999999999A0016303626172016B3FD3333333333330016303626172016C3FD9999999999998016303666F6F0169BFD3333333333334016303666F6F016ABFC9999999999998016303666F6F016BBFB99999999999A0016303666F6F016C0000000000000000"},"result":{"expect":"0x010301780179017A1801610362617201693FC759B8355A1BB0016103626172016A3FC95209D0A1A2DE016103626172016B3FCB69C25FE3C688016103626172016C3FCDA0FADA5A6609016103666F6F01693FC0A764FD2927E7016103666F6F016A3FC2282CFA533F46016103666F6F016B3FC3C5848EF36C9E016103666F6F016C3FC5806BEB16EB7F01620362617201693FD53C695ABCD715016203626172016A3FD6AD912C137583016203626172016B3FD829A0565978DE016203626172016C3FD9AF19F3D3169C016203666F6F01693FCFF77A137CDBF9016203666F6F016A3FD136561454BA86016203666F6F016B3FD27FCDA8478FA3016203666F6F016C3FD3D775461EDE9501630362617201693FE0CCA12729AFB8016303626172016A3FE1983D7795F414016303626172016B3FE261D545E46A8A016303626172016C3FE32873061674B2016303666F6F01693FDB3C5574372AEB016303666F6F016A3FDCCF8510D417DA016303666F6F016B3FDE66BDB1ACA090016303666F6F016C3FE0000000000000"}}
+{"expression":"map(a,f(a)(sigmoid(a)))","inputs":{"a":"0x0301017902017803017A070203626172BFF3333333333333BFF199999999999ABFF0000000000000BFECCCCCCCCCCCCCBFE999999999999ABFE6666666666666BFE33333333333343FC99999999999A03FD33333333333303FD99999999999983FE00000000000003FE33333333333343FE66666666666683FE99999999999983FF999999999999A3FFB3333333333343FFCCCCCCCCCCCCC3FFE66666666666640000000000000004000CCCCCCCCCCCC400199999999999A03666F6FBFFE666666666666BFFCCCCCCCCCCCCDBFFB333333333333BFF999999999999ABFF8000000000000BFF6666666666666BFF4CCCCCCCCCCCDBFE0000000000000BFD9999999999998BFD3333333333334BFC9999999999998BFB99999999999A000000000000000003FB99999999999A03FECCCCCCCCCCCCC3FF00000000000003FF199999999999A3FF33333333333343FF4CCCCCCCCCCCC3FF66666666666663FF8000000000000"},"result":{"expect":"0x0301017902017803017A0702036261723FCDA0FADA5A66093FCFF77A137CDBF93FD136561454BA863FD27FCDA8478FA33FD3D775461EDE953FD53C695ABCD7153FD6AD912C1375833FE1983D7795F4143FE261D545E46A8A3FE32873061674B23FE3EB2FD4D343913FE4A93769F6453E3FE561CB52A194763FE614455CF090B63FEA9FE5053A45203FEB0E9EDC4324D83FEB75F4C16B302F3FEBD626C0B5B6063FEC2F7D5A8A79C93FEC8247621BC0C83FECCED80FEF120203666F6F3FC0A764FD2927E73FC2282CFA533F463FC3C5848EF36C9E3FC5806BEB16EB7F3FC759B8355A1BB03FC95209D0A1A2DE3FCB69C25FE3C6883FD829A0565978DE3FD9AF19F3D3169C3FDB3C5574372AEB3FDCCF8510D417DA3FDE66BDB1ACA0903FE00000000000003FE0CCA12729AFB83FE6C0192BDC382E3FE764D4F5D5A2BD3FE802217B20C9023FE897C14969667F3FE9258F68070E5E3FE9AB7D8BD797483FEA2991F2A97914"}}
+{"expression":"map(a,f(a)(sigmoid(a)))","inputs":{"a":"0x03020178017A010179050C01610169BFFE666666666666BFF8000000000000BFF199999999999ABFE6666666666666BFD33333333333340161016ABFFCCCCCCCCCCCCDBFF6666666666666BFF0000000000000BFE3333333333334BFC99999999999980161016BBFFB333333333333BFF4CCCCCCCCCCCDBFECCCCCCCCCCCCCBFE0000000000000BFB99999999999A00161016CBFF999999999999ABFF3333333333333BFE999999999999ABFD99999999999980000000000000000016201693FB99999999999A03FE00000000000003FECCCCCCCCCCCCC3FF4CCCCCCCCCCCC3FFB3333333333340162016A3FC99999999999A03FE33333333333343FF00000000000003FF66666666666663FFCCCCCCCCCCCCC0162016B3FD33333333333303FE66666666666683FF199999999999A3FF80000000000003FFE6666666666660162016C3FD99999999999983FE99999999999983FF33333333333343FF999999999999A4000000000000000016301694000CCCCCCCCCCCC40040000000000004007333333333334400A666666666666400D99999999999A0163016A400199999999999A4004CCCCCCCCCCCC4008000000000000400B333333333334400E6666666666660163016B4002666666666666400599999999999A4008CCCCCCCCCCCC400C000000000000400F3333333333340163016C40033333333333344006666666666666400999999999999A400CCCCCCCCCCCCC4010000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FC0A764FD2927E73FC759B8355A1BB03FCFF77A137CDBF93FD53C695ABCD7153FDB3C5574372AEB0161016A3FC2282CFA533F463FC95209D0A1A2DE3FD136561454BA863FD6AD912C1375833FDCCF8510D417DA0161016B3FC3C5848EF36C9E3FCB69C25FE3C6883FD27FCDA8478FA33FD829A0565978DE3FDE66BDB1ACA0900161016C3FC5806BEB16EB7F3FCDA0FADA5A66093FD3D775461EDE953FD9AF19F3D3169C3FE0000000000000016201693FE0CCA12729AFB83FE3EB2FD4D343913FE6C0192BDC382E3FE9258F68070E5E3FEB0E9EDC4324D80162016A3FE1983D7795F4143FE4A93769F6453E3FE764D4F5D5A2BD3FE9AB7D8BD797483FEB75F4C16B302F0162016B3FE261D545E46A8A3FE561CB52A194763FE802217B20C9023FEA2991F2A979143FEBD626C0B5B6060162016C3FE32873061674B23FE614455CF090B63FE897C14969667F3FEA9FE5053A45203FEC2F7D5A8A79C9016301693FEC8247621BC0C83FED9291DDB596F83FEE54C20D06AA953FEEDC99CF2C9D4D3FEF3A59F801F5820163016A3FECCED80FEF12023FEDC99E39374D9C3FEE7B7CBC36FABD3FEEF76F8069F3FB3FEF4CBFA61DE6A30163016B3FED15854CD0D92B3FEDFC1F4CE6E8223FEE9EDD88B9D8AF3FEF0FDFCBF19A933FEF5D77DCF758080163016C3FED56A636946E583FEE2A667D67D08C3FEEBF2786AED6983FEF261E0FCD4B463FEF6CA82F0DE1EA"}}
+{"expression":"map(a,f(a)((a+1)*2))","inputs":{"a":"0x02003FB999999999999A"},"result":{"expect":"0x0200400199999999999A"}}
+{"expression":"map(a,f(a)((a+1)*2))","inputs":{"a":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x0201017803400199999999999A40033333333333334004CCCCCCCCCCCD"}}
+{"expression":"map(a,f(a)((a+1)*2))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000"},"result":{"expect":"0x0202017803017905400199999999999A40033333333333334004CCCCCCCCCCCD40066666666666664008000000000000400999999999999A400B333333333333400CCCCCCCCCCCCD400E66666666666640100000000000004010CCCCCCCCCCCD401199999999999A401266666666666640133333333333334014000000000000"}}
+{"expression":"map(a,f(a)((a+1)*2))","inputs":{"a":"0x0203017803017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD4011333333333333401199999999999A401200000000000040126666666666664012CCCCCCCCCCCD4013333333333333401399999999999A401400000000000040146666666666664014CCCCCCCCCCCD4015333333333333401599999999999A401600000000000040166666666666664016CCCCCCCCCCCD4017333333333333401799999999999A401800000000000040186666666666664018CCCCCCCCCCCD4019333333333333401999999999999A401A000000000000401A666666666666401ACCCCCCCCCCCD401B333333333333401B99999999999A401C000000000000401C666666666666401CCCCCCCCCCCCD401D333333333333401D99999999999A401E000000000000401E666666666666401ECCCCCCCCCCCD401F333333333333401F99999999999A402000000000000040203333333333334020666666666666402099999999999A4020CCCCCCCCCCCD402100000000000040213333333333334021666666666666402199999999999A4021CCCCCCCCCCCD402200000000000040223333333333334022666666666666402299999999999A4022CCCCCCCCCCCD402300000000000040233333333333334023666666666666402399999999999A4023CCCCCCCCCCCD402400000000000040243333333333334024666666666666402499999999999A4024CCCCCCCCCCCD4025000000000000"},"result":{"expect":"0x0203017803017905017A07400199999999999A40033333333333334004CCCCCCCCCCCD40066666666666664008000000000000400999999999999A400B333333333333400CCCCCCCCCCCCD400E66666666666640100000000000004010CCCCCCCCCCCD401199999999999A4012666666666666401333333333333340140000000000004014CCCCCCCCCCCD401599999999999A4016666666666666401733333333333340180000000000004018CCCCCCCCCCCD401999999999999A401A666666666666401B333333333333401C000000000000401CCCCCCCCCCCCD401D99999999999A401E666666666666401F333333333333402000000000000040206666666666664020CCCCCCCCCCCD4021333333333333402199999999999A402200000000000040226666666666664022CCCCCCCCCCCD4023333333333333402399999999999A402400000000000040246666666666664024CCCCCCCCCCCD4025333333333333402599999999999A402600000000000040266666666666664026CCCCCCCCCCCD4027333333333333402799999999999A402800000000000040286666666666664028CCCCCCCCCCCD4029333333333333402999999999999A402A000000000000402A666666666666402ACCCCCCCCCCCD402B333333333333402B99999999999A402C000000000000402C666666666666402CCCCCCCCCCCCD402D333333333333402D99999999999A402E000000000000402E666666666666402ECCCCCCCCCCCD402F333333333333402F99999999999A403000000000000040303333333333334030666666666666403099999999999A4030CCCCCCCCCCCD403100000000000040313333333333334031666666666666403199999999999A4031CCCCCCCCCCCD403200000000000040323333333333334032666666666666403299999999999A4032CCCCCCCCCCCD403300000000000040333333333333334033666666666666403399999999999A4033CCCCCCCCCCCD403400000000000040343333333333334034666666666666403499999999999A4034CCCCCCCCCCCD403500000000000040353333333333334035666666666666403599999999999A4035CCCCCCCCCCCD403600000000000040363333333333334036666666666666403699999999999A4036CCCCCCCCCCCD4037000000000000"}}
+{"expression":"map(a,f(a)((a+1)*2))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x01010178030161400199999999999A0162400333333333333301634004CCCCCCCCCCCD"}}
+{"expression":"map(a,f(a)((a+1)*2))","inputs":{"a":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179060161036261724003333333333333016103666F6F400199999999999A0162036261724006666666666666016203666F6F4004CCCCCCCCCCCD016303626172400999999999999A016303666F6F4008000000000000"}}
+{"expression":"map(a,f(a)((a+1)*2))","inputs":{"a":"0x010301780179017A1801610362617201693FE0000000000000016103626172016A3FE3333333333333016103626172016B3FE6666666666666016103626172016C3FE999999999999A016103666F6F01693FB999999999999A016103666F6F016A3FC999999999999A016103666F6F016B3FD3333333333333016103666F6F016C3FD999999999999A01620362617201693FF4CCCCCCCCCCCD016203626172016A3FF6666666666666016203626172016B3FF8000000000000016203626172016C3FF999999999999A016203666F6F01693FECCCCCCCCCCCCD016203666F6F016A3FF0000000000000016203666F6F016B3FF199999999999A016203666F6F016C3FF333333333333301630362617201694000CCCCCCCCCCCD016303626172016A400199999999999A016303626172016B4002666666666666016303626172016C4003333333333333016303666F6F01693FFB333333333333016303666F6F016A3FFCCCCCCCCCCCCD016303666F6F016B3FFE666666666666016303666F6F016C4000000000000000"},"result":{"expect":"0x010301780179017A1801610362617201694008000000000000016103626172016A400999999999999A016103626172016B400B333333333333016103626172016C400CCCCCCCCCCCCD016103666F6F0169400199999999999A016103666F6F016A4003333333333333016103666F6F016B4004CCCCCCCCCCCD016103666F6F016C400666666666666601620362617201694012666666666666016203626172016A4013333333333333016203626172016B4014000000000000016203626172016C4014CCCCCCCCCCCD016203666F6F0169400E666666666666016203666F6F016A4010000000000000016203666F6F016B4010CCCCCCCCCCCD016203666F6F016C401199999999999A01630362617201694018CCCCCCCCCCCD016303626172016A401999999999999A016303626172016B401A666666666666016303626172016C401B333333333333016303666F6F0169401599999999999A016303666F6F016A4016666666666666016303666F6F016B4017333333333333016303666F6F016C4018000000000000"}}
+{"expression":"map(a,f(a)((a+1)*2))","inputs":{"a":"0x0301017902017803017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF6666666666666400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400CCCCCCCCCCCCD400D99999999999A400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD03666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0301017902017803017A070203626172400CCCCCCCCCCCCD400E66666666666640100000000000004010CCCCCCCCCCCD401199999999999A40126666666666664013333333333333401999999999999A401A666666666666401B333333333333401C000000000000401CCCCCCCCCCCCD401D99999999999A401E66666666666640226666666666664022CCCCCCCCCCCD4023333333333333402399999999999A402400000000000040246666666666664024CCCCCCCCCCCD03666F6F400199999999999A40033333333333334004CCCCCCCCCCCD40066666666666664008000000000000400999999999999A400B33333333333340140000000000004014CCCCCCCCCCCD401599999999999A4016666666666666401733333333333340180000000000004018CCCCCCCCCCCD401F333333333333402000000000000040206666666666664020CCCCCCCCCCCD4021333333333333402199999999999A4022000000000000"}}
+{"expression":"map(a,f(a)((a+1)*2))","inputs":{"a":"0x03020178017A010179050C016101693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB3333333333330161016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD0161016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE6666666666660161016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000016201694000CCCCCCCCCCCD40040000000000004007333333333333400A666666666666400D99999999999A0162016A400199999999999A4004CCCCCCCCCCCD4008000000000000400B333333333333400E6666666666660162016B4002666666666666400599999999999A4008CCCCCCCCCCCD400C000000000000400F3333333333330162016C40033333333333334006666666666666400999999999999A400CCCCCCCCCCCCD40100000000000000163016940106666666666664012000000000000401399999999999A40153333333333334016CCCCCCCCCCCD0163016A4010CCCCCCCCCCCD40126666666666664014000000000000401599999999999A40173333333333330163016B40113333333333334012CCCCCCCCCCCD40146666666666664016000000000000401799999999999A0163016C401199999999999A40133333333333334014CCCCCCCCCCCD40166666666666664018000000000000"},"result":{"expect":"0x03020178017A010179050C01610169400199999999999A4008000000000000400E6666666666664012666666666666401599999999999A0161016A4003333333333333400999999999999A4010000000000000401333333333333340166666666666660161016B4004CCCCCCCCCCCD400B3333333333334010CCCCCCCCCCCD401400000000000040173333333333330161016C4006666666666666400CCCCCCCCCCCCD401199999999999A4014CCCCCCCCCCCD4018000000000000016201694018CCCCCCCCCCCD401C000000000000401F33333333333340213333333333334022CCCCCCCCCCCD0162016A401999999999999A401CCCCCCCCCCCCD4020000000000000402199999999999A40233333333333330162016B401A666666666666401D99999999999A40206666666666664022000000000000402399999999999A0162016C401B333333333333401E6666666666664020CCCCCCCCCCCD402266666666666640240000000000000163016940246666666666664026000000000000402799999999999A4029333333333333402ACCCCCCCCCCCD0163016A4024CCCCCCCCCCCD40266666666666664028000000000000402999999999999A402B3333333333330163016B40253333333333334026CCCCCCCCCCCD4028666666666666402A000000000000402B99999999999A0163016C402599999999999A40273333333333334028CCCCCCCCCCCD402A666666666666402C000000000000"}}
+{"expression":"a+b","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FC999999999999A"}}
+{"expression":"a+b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FC999999999999A3FD999999999999A3FE33333333333333FE999999999999A3FF0000000000000"}}
+{"expression":"a+b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FC999999999999A3FD999999999999A3FE3333333333333"}}
+{"expression":"a+b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FC999999999999A3FD33333333333343FD999999999999A3FE00000000000003FE33333333333333FD33333333333343FD999999999999A3FE00000000000003FE33333333333343FE66666666666663FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FE00000000000003FE33333333333343FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF0000000000000"}}
+{"expression":"a+b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FC999999999999A3FD33333333333343FD999999999999A3FE00000000000003FE33333333333333FE999999999999A3FECCCCCCCCCCCCC3FF00000000000003FF199999999999A3FF33333333333333FF66666666666673FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD40000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004CCCCCCCCCCCD400599999999999A400666666666666640073333333333334008000000000000"}}
+{"expression":"a+b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FC999999999999A3FD999999999999A3FE33333333333333FE999999999999A3FF199999999999A3FF4CCCCCCCCCCCC3FF80000000000003FFB3333333333344000000000000000400199999999999A40033333333333344004CCCCCCCCCCCC"}}
+{"expression":"a+b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FC999999999999A3FD33333333333343FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE99999999999993FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF99999999999993FFCCCCCCCCCCCCD3FFE66666666666740000000000000004000CCCCCCCCCCCD4001999999999999400266666666666640033333333333334004CCCCCCCCCCCD40059999999999994006666666666666400733333333333340080000000000004008CCCCCCCCCCCD4009999999999999400B333333333333400C000000000000400CCCCCCCCCCCCD400D99999999999A400E666666666666400F33333333333340100000000000003FE66666666666663FE999999999999A3FECCCCCCCCCCCCC3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCC3FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCC4002666666666666400333333333333440040000000000004004CCCCCCCCCCCD400599999999999A400666666666666640073333333333344008CCCCCCCCCCCD4009999999999999400A666666666666400B333333333333400C000000000000400CCCCCCCCCCCCD400D999999999999400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD4011333333333333401199999999999A40120000000000003FF33333333333343FF4CCCCCCCCCCCD3FF66666666666673FF80000000000003FF999999999999A3FFB3333333333343FFCCCCCCCCCCCCD40000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCC4006666666666666400733333333333440080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333334400CCCCCCCCCCCCD400D999999999999400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCC401199999999999A401200000000000040126666666666664012CCCCCCCCCCCD4013333333333333401399999999999A4014000000000000"}}
+{"expression":"a+b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FC999999999999A01623FD999999999999A01633FE3333333333333"}}
+{"expression":"a+b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FC999999999999A01623FD999999999999A"}}
+{"expression":"a+b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x0101017903036261723FC999999999999A0362617A3FD333333333333303666F6F3FB999999999999A"},"result":{"expect":"0x010201780179090161036261723FD333333333333401610362617A3FD999999999999A016103666F6F3FC999999999999A0162036261723FD999999999999A01620362617A3FE0000000000000016203666F6F3FD33333333333340163036261723FE000000000000001630362617A3FE3333333333333016303666F6F3FD999999999999A"}}
+{"expression":"a+b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010201780179090161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A0163036261723FE999999999999A01630362617A3FECCCCCCCCCCCCD016303666F6F3FE6666666666666"},"result":{"expect":"0x010201780179090161036261723FD333333333333401610362617A3FD999999999999A016103666F6F3FC999999999999A0162036261723FE666666666666601620362617A3FE999999999999A016203666F6F3FE33333333333340163036261723FF199999999999A01630362617A3FF3333333333333016303666F6F3FF0000000000000"}}
+{"expression":"a+b","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179040161036261723FD999999999999A016103666F6F3FC999999999999A0162036261723FECCCCCCCCCCCCD016203666F6F3FE6666666666666"}}
+{"expression":"a+b","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x01020179017A080362617201693FE000000000000003626172016A3FE333333333333303626172016B3FE666666666666603626172016C3FE999999999999A03666F6F01693FB999999999999A03666F6F016A3FC999999999999A03666F6F016B3FD333333333333303666F6F016C3FD999999999999A"},"result":{"expect":"0x010301780179017A1001610362617201693FE6666666666666016103626172016A3FE999999999999A016103626172016B3FECCCCCCCCCCCCC016103626172016C3FF0000000000000016103666F6F01693FC999999999999A016103666F6F016A3FD3333333333334016103666F6F016B3FD999999999999A016103666F6F016C3FE000000000000001620362617201693FF0000000000000016203626172016A3FF199999999999A016203626172016B3FF3333333333333016203626172016C3FF4CCCCCCCCCCCD016203666F6F01693FE0000000000000016203666F6F016A3FE3333333333334016203666F6F016B3FE6666666666666016203666F6F016C3FE999999999999A"}}
+{"expression":"a+b","inputs":{"a":"0x030101790101780302036261723FC999999999999A3FD999999999999A3FE333333333333303666F6F3FB999999999999A3FD33333333333333FE0000000000000","b":"0x0301017901017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF666666666666603666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE6666666666666"},"result":{"expect":"0x0301017902017803017A0702036261723FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF99999999999993FF33333333333343FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333343FFCCCCCCCCCCCCC3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333343FFCCCCCCCCCCCCC3FFE666666666666400000000000000003666F6F3FC999999999999A3FD33333333333343FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE99999999999993FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCC3FF00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF3333333333333"}}
+{"expression":"a+b","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FC999999999999A3FE66666666666663FF33333333333333FFB333333333334400199999999999A0161016A3FD33333333333343FE999999999999A3FF4CCCCCCCCCCCD3FFCCCCCCCCCCCCC40026666666666660161016B3FD999999999999A3FECCCCCCCCCCCCC3FF66666666666673FFE66666666666640033333333333330161016C3FE00000000000003FF00000000000003FF800000000000040000000000000004004000000000000016201693FE66666666666663FF33333333333333FFB333333333334400199999999999A400599999999999A0162016A3FE999999999999A3FF4CCCCCCCCCCCC3FFCCCCCCCCCCCCD400266666666666640066666666666660162016B3FECCCCCCCCCCCCC3FF66666666666663FFE666666666667400333333333333340073333333333330162016C3FF00000000000003FF8000000000000400000000000000040040000000000004008000000000000016301693FF33333333333343FFB333333333333400199999999999A400599999999999A400999999999999A0163016A3FF4CCCCCCCCCCCD3FFCCCCCCCCCCCCC40026666666666664006666666666666400A6666666666660163016B3FF66666666666673FFE66666666666640033333333333344007333333333333400B3333333333330163016C3FF8000000000000400000000000000040040000000000004008000000000000400C000000000000"}}
+{"expression":"join(a,b,f(a,b)(a+b))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FC999999999999A"}}
+{"expression":"join(a,b,f(a,b)(a+b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FC999999999999A3FD999999999999A3FE33333333333333FE999999999999A3FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a+b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FC999999999999A3FD999999999999A3FE3333333333333"}}
+{"expression":"join(a,b,f(a,b)(a+b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FC999999999999A3FD33333333333343FD999999999999A3FE00000000000003FE33333333333333FD33333333333343FD999999999999A3FE00000000000003FE33333333333343FE66666666666663FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FE00000000000003FE33333333333343FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a+b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FC999999999999A3FD33333333333343FD999999999999A3FE00000000000003FE33333333333333FE999999999999A3FECCCCCCCCCCCCC3FF00000000000003FF199999999999A3FF33333333333333FF66666666666673FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD40000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004CCCCCCCCCCCD400599999999999A400666666666666640073333333333334008000000000000"}}
+{"expression":"join(a,b,f(a,b)(a+b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FC999999999999A3FD999999999999A3FE33333333333333FE999999999999A3FF199999999999A3FF4CCCCCCCCCCCC3FF80000000000003FFB3333333333344000000000000000400199999999999A40033333333333344004CCCCCCCCCCCC"}}
+{"expression":"join(a,b,f(a,b)(a+b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FC999999999999A3FD33333333333343FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE99999999999993FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF99999999999993FFCCCCCCCCCCCCD3FFE66666666666740000000000000004000CCCCCCCCCCCD4001999999999999400266666666666640033333333333334004CCCCCCCCCCCD40059999999999994006666666666666400733333333333340080000000000004008CCCCCCCCCCCD4009999999999999400B333333333333400C000000000000400CCCCCCCCCCCCD400D99999999999A400E666666666666400F33333333333340100000000000003FE66666666666663FE999999999999A3FECCCCCCCCCCCCC3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCC3FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCC4002666666666666400333333333333440040000000000004004CCCCCCCCCCCD400599999999999A400666666666666640073333333333344008CCCCCCCCCCCD4009999999999999400A666666666666400B333333333333400C000000000000400CCCCCCCCCCCCD400D999999999999400F333333333333401000000000000040106666666666664010CCCCCCCCCCCD4011333333333333401199999999999A40120000000000003FF33333333333343FF4CCCCCCCCCCCD3FF66666666666673FF80000000000003FF999999999999A3FFB3333333333343FFCCCCCCCCCCCCD40000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCC4006666666666666400733333333333440080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333334400CCCCCCCCCCCCD400D999999999999400E666666666666400F333333333333401000000000000040106666666666664010CCCCCCCCCCCC401199999999999A401200000000000040126666666666664012CCCCCCCCCCCD4013333333333333401399999999999A4014000000000000"}}
+{"expression":"join(a,b,f(a,b)(a+b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FC999999999999A01623FD999999999999A01633FE3333333333333"}}
+{"expression":"join(a,b,f(a,b)(a+b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FC999999999999A01623FD999999999999A"}}
+{"expression":"join(a,b,f(a,b)(a+b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x0101017903036261723FC999999999999A0362617A3FD333333333333303666F6F3FB999999999999A"},"result":{"expect":"0x010201780179090161036261723FD333333333333401610362617A3FD999999999999A016103666F6F3FC999999999999A0162036261723FD999999999999A01620362617A3FE0000000000000016203666F6F3FD33333333333340163036261723FE000000000000001630362617A3FE3333333333333016303666F6F3FD999999999999A"}}
+{"expression":"join(a,b,f(a,b)(a+b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010201780179090161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A0163036261723FE999999999999A01630362617A3FECCCCCCCCCCCCD016303666F6F3FE6666666666666"},"result":{"expect":"0x010201780179090161036261723FD333333333333401610362617A3FD999999999999A016103666F6F3FC999999999999A0162036261723FE666666666666601620362617A3FE999999999999A016203666F6F3FE33333333333340163036261723FF199999999999A01630362617A3FF3333333333333016303666F6F3FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a+b))","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179040161036261723FD999999999999A016103666F6F3FC999999999999A0162036261723FECCCCCCCCCCCCD016203666F6F3FE6666666666666"}}
+{"expression":"join(a,b,f(a,b)(a+b))","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x01020179017A080362617201693FE000000000000003626172016A3FE333333333333303626172016B3FE666666666666603626172016C3FE999999999999A03666F6F01693FB999999999999A03666F6F016A3FC999999999999A03666F6F016B3FD333333333333303666F6F016C3FD999999999999A"},"result":{"expect":"0x010301780179017A1001610362617201693FE6666666666666016103626172016A3FE999999999999A016103626172016B3FECCCCCCCCCCCCC016103626172016C3FF0000000000000016103666F6F01693FC999999999999A016103666F6F016A3FD3333333333334016103666F6F016B3FD999999999999A016103666F6F016C3FE000000000000001620362617201693FF0000000000000016203626172016A3FF199999999999A016203626172016B3FF3333333333333016203626172016C3FF4CCCCCCCCCCCD016203666F6F01693FE0000000000000016203666F6F016A3FE3333333333334016203666F6F016B3FE6666666666666016203666F6F016C3FE999999999999A"}}
+{"expression":"join(a,b,f(a,b)(a+b))","inputs":{"a":"0x030101790101780302036261723FC999999999999A3FD999999999999A3FE333333333333303666F6F3FB999999999999A3FD33333333333333FE0000000000000","b":"0x0301017901017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF666666666666603666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE6666666666666"},"result":{"expect":"0x0301017902017803017A0702036261723FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF99999999999993FF33333333333343FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333343FFCCCCCCCCCCCCC3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333343FFCCCCCCCCCCCCC3FFE666666666666400000000000000003666F6F3FC999999999999A3FD33333333333343FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE99999999999993FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCC3FF00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF3333333333333"}}
+{"expression":"join(a,b,f(a,b)(a+b))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FC999999999999A3FE66666666666663FF33333333333333FFB333333333334400199999999999A0161016A3FD33333333333343FE999999999999A3FF4CCCCCCCCCCCD3FFCCCCCCCCCCCCC40026666666666660161016B3FD999999999999A3FECCCCCCCCCCCCC3FF66666666666673FFE66666666666640033333333333330161016C3FE00000000000003FF00000000000003FF800000000000040000000000000004004000000000000016201693FE66666666666663FF33333333333333FFB333333333334400199999999999A400599999999999A0162016A3FE999999999999A3FF4CCCCCCCCCCCC3FFCCCCCCCCCCCCD400266666666666640066666666666660162016B3FECCCCCCCCCCCCC3FF66666666666663FFE666666666667400333333333333340073333333333330162016C3FF00000000000003FF8000000000000400000000000000040040000000000004008000000000000016301693FF33333333333343FFB333333333333400199999999999A400599999999999A400999999999999A0163016A3FF4CCCCCCCCCCCD3FFCCCCCCCCCCCCC40026666666666664006666666666666400A6666666666660163016B3FF66666666666673FFE66666666666640033333333333344007333333333333400B3333333333330163016C3FF8000000000000400000000000000040040000000000004008000000000000400C000000000000"}}
+{"expression":"a-b","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02000000000000000000"}}
+{"expression":"a-b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020101780500000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"a-b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x0201017803000000000000000000000000000000000000000000000000"}}
+{"expression":"a-b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179050000000000000000BFB999999999999ABFC9999999999999BFD3333333333334BFD999999999999A3FB999999999999A0000000000000000BFB9999999999998BFC999999999999ABFD33333333333333FC99999999999993FB99999999999980000000000000000BFB999999999999CBFC999999999999A3FD33333333333343FC999999999999A3FB999999999999C0000000000000000BFB99999999999983FD999999999999A3FD33333333333333FC999999999999A3FB99999999999980000000000000000"}}
+{"expression":"a-b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179050000000000000000BFB999999999999ABFC9999999999999BFD3333333333334BFD999999999999ABFD9999999999999BFDFFFFFFFFFFFFFBFE3333333333334BFE6666666666666BFE999999999999ABFE999999999999ABFECCCCCCCCCCCCCBFF0000000000000BFF1999999999999BFF3333333333333BFF3333333333334BFF4CCCCCCCCCCCCBFF6666666666666BFF8000000000000BFF999999999999ABFF999999999999ABFFB333333333334BFFCCCCCCCCCCCCCBFFE666666666666C000000000000000"}}
+{"expression":"a-b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x020201780301790400000000000000000000000000000000000000000000000000000000000000003FB99999999999983FB99999999999983FB99999999999A03FB99999999999983FC999999999999C3FC99999999999983FC99999999999983FC9999999999998"}}
+{"expression":"a-b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A070000000000000000BFB999999999999ABFC9999999999999BFD3333333333334BFD999999999999ABFE0000000000000BFE3333333333333BFE3333333333334BFE6666666666666BFE999999999999ABFECCCCCCCCCCCCEBFF0000000000000BFF199999999999ABFF3333333333333BFF3333333333333BFF4CCCCCCCCCCCDBFF6666666666666BFF8000000000000BFF9999999999999BFFB333333333333BFFCCCCCCCCCCCCDBFFCCCCCCCCCCCCEBFFE666666666666C000000000000000C000CCCCCCCCCCCDC00199999999999AC002666666666667C003333333333333C003333333333333C004000000000000C004CCCCCCCCCCCDC00599999999999AC006666666666666C007333333333333C0080000000000003FE00000000000003FD99999999999993FD33333333333333FC99999999999983FB99999999999980000000000000000BFB9999999999998BFB99999999999A0BFC999999999999CBFD3333333333334BFD999999999999CBFE0000000000000BFE3333333333334BFE6666666666666BFE6666666666666BFE999999999999ABFECCCCCCCCCCCCCBFF0000000000000BFF1999999999999BFF3333333333333BFF4CCCCCCCCCCCDBFF4CCCCCCCCCCCEBFF6666666666666BFF8000000000000BFF999999999999ABFFB333333333334BFFCCCCCCCCCCCCEBFFE666666666666BFFE666666666666C000000000000000C000CCCCCCCCCCCDC00199999999999AC002666666666666C003333333333333C0040000000000003FF00000000000003FECCCCCCCCCCCCE3FE999999999999A3FE66666666666673FE33333333333343FE00000000000013FD999999999999C3FD99999999999983FD33333333333323FC99999999999983FB99999999999900000000000000000BFB99999999999A0BFC9999999999998BFC9999999999998BFD3333333333334BFD9999999999998BFE0000000000000BFE3333333333332BFE6666666666666BFE999999999999ABFE999999999999CBFECCCCCCCCCCCCCBFF0000000000000BFF199999999999ABFF3333333333334BFF4CCCCCCCCCCCEBFF6666666666666BFF6666666666666BFF8000000000000BFF999999999999ABFFB333333333334BFFCCCCCCCCCCCCCBFFE666666666666C000000000000000"}}
+{"expression":"a-b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x0101017803016100000000000000000162000000000000000001630000000000000000"}}
+{"expression":"a-b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x01010178020161000000000000000001620000000000000000"}}
+{"expression":"a-b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x0101017903036261723FC999999999999A0362617A3FD333333333333303666F6F3FB999999999999A"},"result":{"expect":"0x01020178017909016103626172BFB999999999999A01610362617ABFC9999999999999016103666F6F0000000000000000016203626172000000000000000001620362617ABFB9999999999998016203666F6F3FB999999999999A0163036261723FB999999999999801630362617A0000000000000000016303666F6F3FC9999999999999"}}
+{"expression":"a-b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010201780179090161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A0163036261723FE999999999999A01630362617A3FECCCCCCCCCCCCD016303666F6F3FE6666666666666"},"result":{"expect":"0x01020178017909016103626172BFB999999999999A01610362617ABFC9999999999999016103666F6F0000000000000000016203626172BFD333333333333301620362617ABFD9999999999999016203666F6FBFC999999999999A016303626172BFE000000000000001630362617ABFE3333333333334016303666F6FBFD9999999999999"}}
+{"expression":"a-b","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179040161036261720000000000000000016103666F6F00000000000000000162036261723FB9999999999998016203666F6F3FB999999999999C"}}
+{"expression":"a-b","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x01020179017A080362617201693FE000000000000003626172016A3FE333333333333303626172016B3FE666666666666603626172016C3FE999999999999A03666F6F01693FB999999999999A03666F6F016A3FC999999999999A03666F6F016B3FD333333333333303666F6F016C3FD999999999999A"},"result":{"expect":"0x010301780179017A100161036261720169BFD3333333333333016103626172016ABFD9999999999999016103626172016BBFDFFFFFFFFFFFFF016103626172016CBFE3333333333334016103666F6F01690000000000000000016103666F6F016ABFB999999999999A016103666F6F016BBFC9999999999999016103666F6F016CBFD333333333333401620362617201690000000000000000016203626172016ABFB9999999999998016203626172016BBFC9999999999998016203626172016CBFD3333333333334016203666F6F01693FD3333333333334016203666F6F016A3FC999999999999A016203666F6F016B3FB999999999999C016203666F6F016C0000000000000000"}}
+{"expression":"a-b","inputs":{"a":"0x030101790101780302036261723FC999999999999A3FD999999999999A3FE333333333333303666F6F3FB999999999999A3FD33333333333333FE0000000000000","b":"0x0301017901017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF666666666666603666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE6666666666666"},"result":{"expect":"0x0301017902017803017A070203626172BFE3333333333334BFE6666666666666BFE999999999999ABFECCCCCCCCCCCCEBFF0000000000000BFF199999999999ABFF3333333333333BFD999999999999ABFE0000000000000BFE3333333333333BFE6666666666667BFE9999999999999BFECCCCCCCCCCCCDBFEFFFFFFFFFFFFFBFC999999999999CBFD3333333333334BFD999999999999ABFE0000000000001BFE3333333333333BFE6666666666667BFE999999999999903666F6F0000000000000000BFB999999999999ABFC9999999999999BFD3333333333334BFD999999999999ABFE0000000000000BFE33333333333333FC99999999999993FB99999999999980000000000000000BFB999999999999CBFC999999999999ABFD3333333333333BFD99999999999993FD999999999999A3FD33333333333333FC999999999999A3FB99999999999980000000000000000BFB9999999999998BFC9999999999998"}}
+{"expression":"a-b","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101690000000000000000BFD3333333333333BFE3333333333334BFECCCCCCCCCCCCDBFF33333333333330161016ABFB999999999999ABFD9999999999999BFE6666666666666BFEFFFFFFFFFFFFFBFF4CCCCCCCCCCCD0161016BBFC9999999999999BFDFFFFFFFFFFFFFBFE999999999999ABFF199999999999ABFF66666666666660161016CBFD3333333333334BFE3333333333334BFECCCCCCCCCCCCCBFF3333333333334BFF8000000000000016201693FE00000000000003FC9999999999998BFB9999999999998BFD999999999999ABFE66666666666660162016A3FD99999999999993FB9999999999998BFC9999999999998BFDFFFFFFFFFFFFEBFE999999999999A0162016B3FD33333333333330000000000000000BFD3333333333334BFE3333333333333BFECCCCCCCCCCCCC0162016C3FC9999999999998BFB99999999999A0BFD9999999999998BFE6666666666667BFF0000000000000016301693FF00000000000003FE66666666666663FD999999999999A3FB9999999999990BFC99999999999980163016A3FECCCCCCCCCCCCE3FE33333333333333FD33333333333340000000000000000BFD33333333333340163016B3FE999999999999A3FE00000000000003FC9999999999998BFB99999999999A0BFD99999999999980163016C3FE66666666666673FD99999999999983FB99999999999A0BFC99999999999A0BFE0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a-b))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a-b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020101780500000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a-b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x0201017803000000000000000000000000000000000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a-b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179050000000000000000BFB999999999999ABFC9999999999999BFD3333333333334BFD999999999999A3FB999999999999A0000000000000000BFB9999999999998BFC999999999999ABFD33333333333333FC99999999999993FB99999999999980000000000000000BFB999999999999CBFC999999999999A3FD33333333333343FC999999999999A3FB999999999999C0000000000000000BFB99999999999983FD999999999999A3FD33333333333333FC999999999999A3FB99999999999980000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a-b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179050000000000000000BFB999999999999ABFC9999999999999BFD3333333333334BFD999999999999ABFD9999999999999BFDFFFFFFFFFFFFFBFE3333333333334BFE6666666666666BFE999999999999ABFE999999999999ABFECCCCCCCCCCCCCBFF0000000000000BFF1999999999999BFF3333333333333BFF3333333333334BFF4CCCCCCCCCCCCBFF6666666666666BFF8000000000000BFF999999999999ABFF999999999999ABFFB333333333334BFFCCCCCCCCCCCCCBFFE666666666666C000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a-b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x020201780301790400000000000000000000000000000000000000000000000000000000000000003FB99999999999983FB99999999999983FB99999999999A03FB99999999999983FC999999999999C3FC99999999999983FC99999999999983FC9999999999998"}}
+{"expression":"join(a,b,f(a,b)(a-b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A070000000000000000BFB999999999999ABFC9999999999999BFD3333333333334BFD999999999999ABFE0000000000000BFE3333333333333BFE3333333333334BFE6666666666666BFE999999999999ABFECCCCCCCCCCCCEBFF0000000000000BFF199999999999ABFF3333333333333BFF3333333333333BFF4CCCCCCCCCCCDBFF6666666666666BFF8000000000000BFF9999999999999BFFB333333333333BFFCCCCCCCCCCCCDBFFCCCCCCCCCCCCEBFFE666666666666C000000000000000C000CCCCCCCCCCCDC00199999999999AC002666666666667C003333333333333C003333333333333C004000000000000C004CCCCCCCCCCCDC00599999999999AC006666666666666C007333333333333C0080000000000003FE00000000000003FD99999999999993FD33333333333333FC99999999999983FB99999999999980000000000000000BFB9999999999998BFB99999999999A0BFC999999999999CBFD3333333333334BFD999999999999CBFE0000000000000BFE3333333333334BFE6666666666666BFE6666666666666BFE999999999999ABFECCCCCCCCCCCCCBFF0000000000000BFF1999999999999BFF3333333333333BFF4CCCCCCCCCCCDBFF4CCCCCCCCCCCEBFF6666666666666BFF8000000000000BFF999999999999ABFFB333333333334BFFCCCCCCCCCCCCEBFFE666666666666BFFE666666666666C000000000000000C000CCCCCCCCCCCDC00199999999999AC002666666666666C003333333333333C0040000000000003FF00000000000003FECCCCCCCCCCCCE3FE999999999999A3FE66666666666673FE33333333333343FE00000000000013FD999999999999C3FD99999999999983FD33333333333323FC99999999999983FB99999999999900000000000000000BFB99999999999A0BFC9999999999998BFC9999999999998BFD3333333333334BFD9999999999998BFE0000000000000BFE3333333333332BFE6666666666666BFE999999999999ABFE999999999999CBFECCCCCCCCCCCCCBFF0000000000000BFF199999999999ABFF3333333333334BFF4CCCCCCCCCCCEBFF6666666666666BFF6666666666666BFF8000000000000BFF999999999999ABFFB333333333334BFFCCCCCCCCCCCCCBFFE666666666666C000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a-b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x0101017803016100000000000000000162000000000000000001630000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a-b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x01010178020161000000000000000001620000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a-b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x0101017903036261723FC999999999999A0362617A3FD333333333333303666F6F3FB999999999999A"},"result":{"expect":"0x01020178017909016103626172BFB999999999999A01610362617ABFC9999999999999016103666F6F0000000000000000016203626172000000000000000001620362617ABFB9999999999998016203666F6F3FB999999999999A0163036261723FB999999999999801630362617A0000000000000000016303666F6F3FC9999999999999"}}
+{"expression":"join(a,b,f(a,b)(a-b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010201780179090161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A0163036261723FE999999999999A01630362617A3FECCCCCCCCCCCCD016303666F6F3FE6666666666666"},"result":{"expect":"0x01020178017909016103626172BFB999999999999A01610362617ABFC9999999999999016103666F6F0000000000000000016203626172BFD333333333333301620362617ABFD9999999999999016203666F6FBFC999999999999A016303626172BFE000000000000001630362617ABFE3333333333334016303666F6FBFD9999999999999"}}
+{"expression":"join(a,b,f(a,b)(a-b))","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179040161036261720000000000000000016103666F6F00000000000000000162036261723FB9999999999998016203666F6F3FB999999999999C"}}
+{"expression":"join(a,b,f(a,b)(a-b))","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x01020179017A080362617201693FE000000000000003626172016A3FE333333333333303626172016B3FE666666666666603626172016C3FE999999999999A03666F6F01693FB999999999999A03666F6F016A3FC999999999999A03666F6F016B3FD333333333333303666F6F016C3FD999999999999A"},"result":{"expect":"0x010301780179017A100161036261720169BFD3333333333333016103626172016ABFD9999999999999016103626172016BBFDFFFFFFFFFFFFF016103626172016CBFE3333333333334016103666F6F01690000000000000000016103666F6F016ABFB999999999999A016103666F6F016BBFC9999999999999016103666F6F016CBFD333333333333401620362617201690000000000000000016203626172016ABFB9999999999998016203626172016BBFC9999999999998016203626172016CBFD3333333333334016203666F6F01693FD3333333333334016203666F6F016A3FC999999999999A016203666F6F016B3FB999999999999C016203666F6F016C0000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a-b))","inputs":{"a":"0x030101790101780302036261723FC999999999999A3FD999999999999A3FE333333333333303666F6F3FB999999999999A3FD33333333333333FE0000000000000","b":"0x0301017901017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF666666666666603666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE6666666666666"},"result":{"expect":"0x0301017902017803017A070203626172BFE3333333333334BFE6666666666666BFE999999999999ABFECCCCCCCCCCCCEBFF0000000000000BFF199999999999ABFF3333333333333BFD999999999999ABFE0000000000000BFE3333333333333BFE6666666666667BFE9999999999999BFECCCCCCCCCCCCDBFEFFFFFFFFFFFFFBFC999999999999CBFD3333333333334BFD999999999999ABFE0000000000001BFE3333333333333BFE6666666666667BFE999999999999903666F6F0000000000000000BFB999999999999ABFC9999999999999BFD3333333333334BFD999999999999ABFE0000000000000BFE33333333333333FC99999999999993FB99999999999980000000000000000BFB999999999999CBFC999999999999ABFD3333333333333BFD99999999999993FD999999999999A3FD33333333333333FC999999999999A3FB99999999999980000000000000000BFB9999999999998BFC9999999999998"}}
+{"expression":"join(a,b,f(a,b)(a-b))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101690000000000000000BFD3333333333333BFE3333333333334BFECCCCCCCCCCCCDBFF33333333333330161016ABFB999999999999ABFD9999999999999BFE6666666666666BFEFFFFFFFFFFFFFBFF4CCCCCCCCCCCD0161016BBFC9999999999999BFDFFFFFFFFFFFFFBFE999999999999ABFF199999999999ABFF66666666666660161016CBFD3333333333334BFE3333333333334BFECCCCCCCCCCCCCBFF3333333333334BFF8000000000000016201693FE00000000000003FC9999999999998BFB9999999999998BFD999999999999ABFE66666666666660162016A3FD99999999999993FB9999999999998BFC9999999999998BFDFFFFFFFFFFFFEBFE999999999999A0162016B3FD33333333333330000000000000000BFD3333333333334BFE3333333333333BFECCCCCCCCCCCCC0162016C3FC9999999999998BFB99999999999A0BFD9999999999998BFE6666666666667BFF0000000000000016301693FF00000000000003FE66666666666663FD999999999999A3FB9999999999990BFC99999999999980163016A3FECCCCCCCCCCCCE3FE33333333333333FD33333333333340000000000000000BFD33333333333340163016B3FE999999999999A3FE00000000000003FC9999999999998BFB99999999999A0BFD99999999999980163016C3FE66666666666673FD99999999999983FB99999999999A0BFC99999999999A0BFE0000000000000"}}
+{"expression":"a*b","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003F847AE147AE147C"}}
+{"expression":"a*b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053F847AE147AE147C3FA47AE147AE147C3FB70A3D70A3D70A3FC47AE147AE147C3FD0000000000000"}}
+{"expression":"a*b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033F847AE147AE147C3FA47AE147AE147C3FB70A3D70A3D70A"}}
+{"expression":"a*b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053F847AE147AE147C3F947AE147AE147C3F9EB851EB851EB83FA47AE147AE147C3FA999999999999A3F947AE147AE147C3FA47AE147AE147C3FAEB851EB851EB83FB47AE147AE147C3FB999999999999A3F9EB851EB851EB83FAEB851EB851EB83FB70A3D70A3D70A3FBEB851EB851EB83FC33333333333333FA47AE147AE147C3FB47AE147AE147C3FBEB851EB851EB83FC47AE147AE147C3FC999999999999A3FA999999999999A3FB999999999999A3FC33333333333333FC999999999999A3FD0000000000000"}}
+{"expression":"a*b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053F847AE147AE147C3F947AE147AE147C3F9EB851EB851EB83FA47AE147AE147C3FA999999999999A3FBEB851EB851EB83FC1EB851EB851EB3FC47AE147AE147C3FC70A3D70A3D70B3FC999999999999A3FD51EB851EB851F3FD70A3D70A3D70A3FD8F5C28F5C28F63FDAE147AE147AE13FDCCCCCCCCCCCCC3FE47AE147AE147C3FE5C28F5C28F5C33FE70A3D70A3D70B3FE851EB851EB8523FE999999999999A3FF0CCCCCCCCCCCD3FF199999999999A3FF26666666666663FF33333333333333FF4000000000000"}}
+{"expression":"a*b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043F847AE147AE147C3FA47AE147AE147C3FB70A3D70A3D70A3FC47AE147AE147C3FD33333333333333FDAE147AE147AE13FE1EB851EB851EB3FE70A3D70A3D70B3FEFAE147AE147AF3FF33333333333333FF6E147AE147AE23FFAE147AE147AE1"}}
+{"expression":"a*b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073F847AE147AE147C3F947AE147AE147C3F9EB851EB851EB83FA47AE147AE147C3FA999999999999A3FAEB851EB851EB83FB1EB851EB851EB3FC47AE147AE147C3FC70A3D70A3D70B3FC999999999999A3FCC28F5C28F5C2A3FCEB851EB851EB83FD0A3D70A3D70A43FD1EB851EB851EB3FDCCCCCCCCCCCCC3FDEB851EB851EB83FE051EB851EB8523FE147AE147AE1483FE23D70A3D70A3D3FE33333333333333FE428F5C28F5C293FEC28F5C28F5C2A3FED70A3D70A3D703FEEB851EB851EB83FF00000000000003FF0A3D70A3D70A43FF147AE147AE1483FF1EB851EB851EB3FF73333333333333FF80000000000003FF8CCCCCCCCCCCD3FF999999999999A3FFA6666666666663FFB3333333333333FFC0000000000003FAEB851EB851EB83FBEB851EB851EB83FC70A3D70A3D70A3FCEB851EB851EB83FD33333333333333FD70A3D70A3D70A3FDAE147AE147AE13FE1EB851EB851EB3FE428F5C28F5C293FE66666666666663FE8A3D70A3D70A43FEAE147AE147AE13FED1EB851EB851E3FEF5C28F5C28F5B3FF33333333333343FF47AE147AE147C3FF5C28F5C28F5C33FF70A3D70A3D70B3FF851EB851EB8523FF999999999999A3FFAE147AE147AE23FFFAE147AE147AF40008F5C28F5C28F400147AE147AE14840020000000000004002B851EB851EB9400370A3D70A3D71400428F5C28F5C29400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C0000000000003FBC28F5C28F5C2A3FCC28F5C28F5C2A3FD51EB851EB851F3FDC28F5C28F5C2A3FE199999999999A3FE51EB851EB851F3FE8A3D70A3D70A43FEEB851EB851EB83FF147AE147AE1483FF33333333333333FF51EB851EB851F3FF70A3D70A3D70A3FF8F5C28F5C28F63FFAE147AE147AE13FFF3333333333344000A3D70A3D70A44001AE147AE147AE4002B851EB851EB94003C28F5C28F5C24004CCCCCCCCCCCD4005D70A3D70A3D84008A3D70A3D70A44009C28F5C28F5C2400AE147AE147AE1400C000000000000400D1EB851EB851E400E3D70A3D70A3D400F5C28F5C28F5B40116666666666664012000000000000401299999999999A40133333333333344013CCCCCCCCCCCC40146666666666664015000000000000"}}
+{"expression":"a*b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613F847AE147AE147C01623FA47AE147AE147C01633FB70A3D70A3D70A"}}
+{"expression":"a*b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613F847AE147AE147C01623FA47AE147AE147C"}}
+{"expression":"a*b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x0101017903036261723FC999999999999A0362617A3FD333333333333303666F6F3FB999999999999A"},"result":{"expect":"0x010201780179090161036261723F947AE147AE147C01610362617A3F9EB851EB851EB8016103666F6F3F847AE147AE147C0162036261723FA47AE147AE147C01620362617A3FAEB851EB851EB8016203666F6F3F947AE147AE147C0163036261723FAEB851EB851EB801630362617A3FB70A3D70A3D70A016303666F6F3F9EB851EB851EB8"}}
+{"expression":"a*b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010201780179090161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A0163036261723FE999999999999A01630362617A3FECCCCCCCCCCCCD016303666F6F3FE6666666666666"},"result":{"expect":"0x010201780179090161036261723F947AE147AE147C01610362617A3F9EB851EB851EB8016103666F6F3F847AE147AE147C0162036261723FB999999999999A01620362617A3FBEB851EB851EB8016203666F6F3FB47AE147AE147C0163036261723FCEB851EB851EB801630362617A3FD147AE147AE148016303666F6F3FCAE147AE147AE1"}}
+{"expression":"a*b","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179040161036261723FA47AE147AE147C016103666F6F3F847AE147AE147C0162036261723FC999999999999A016203666F6F3FBEB851EB851EB8"}}
+{"expression":"a*b","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x01020179017A080362617201693FE000000000000003626172016A3FE333333333333303626172016B3FE666666666666603626172016C3FE999999999999A03666F6F01693FB999999999999A03666F6F016A3FC999999999999A03666F6F016B3FD333333333333303666F6F016C3FD999999999999A"},"result":{"expect":"0x010301780179017A1001610362617201693FB999999999999A016103626172016A3FBEB851EB851EB8016103626172016B3FC1EB851EB851EB016103626172016C3FC47AE147AE147C016103666F6F01693F847AE147AE147C016103666F6F016A3F947AE147AE147C016103666F6F016B3F9EB851EB851EB8016103666F6F016C3FA47AE147AE147C01620362617201693FD0000000000000016203626172016A3FD3333333333333016203626172016B3FD6666666666666016203626172016C3FD999999999999A016203666F6F01693FA47AE147AE147C016203666F6F016A3FB47AE147AE147C016203666F6F016B3FBEB851EB851EB8016203666F6F016C3FC47AE147AE147C"}}
+{"expression":"a*b","inputs":{"a":"0x030101790101780302036261723FC999999999999A3FD999999999999A3FE333333333333303666F6F3FB999999999999A3FD33333333333333FE0000000000000","b":"0x0301017901017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF666666666666603666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE6666666666666"},"result":{"expect":"0x0301017902017803017A0702036261723FC47AE147AE147C3FC70A3D70A3D70B3FC999999999999A3FCC28F5C28F5C2A3FCEB851EB851EB83FD0A3D70A3D70A43FD1EB851EB851EB3FD47AE147AE147C3FD70A3D70A3D70B3FD999999999999A3FDC28F5C28F5C2A3FDEB851EB851EB83FE0A3D70A3D70A43FE1EB851EB851EB3FDEB851EB851EB83FE147AE147AE1483FE33333333333333FE51EB851EB851F3FE70A3D70A3D70A3FE8F5C28F5C28F63FEAE147AE147AE103666F6F3F847AE147AE147C3F947AE147AE147C3F9EB851EB851EB83FA47AE147AE147C3FA999999999999A3FAEB851EB851EB83FB1EB851EB851EB3F9EB851EB851EB83FAEB851EB851EB83FB70A3D70A3D70A3FBEB851EB851EB83FC33333333333333FC70A3D70A3D70A3FCAE147AE147AE13FA999999999999A3FB999999999999A3FC33333333333333FC999999999999A3FD00000000000003FD33333333333333FD6666666666666"}}
+{"expression":"a*b","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693F847AE147AE147C3FB999999999999A3FD147AE147AE1483FE0A3D70A3D70A43FEB3333333333330161016A3F947AE147AE147C3FBEB851EB851EB83FD33333333333333FE1EB851EB851EB3FECCCCCCCCCCCCD0161016B3F9EB851EB851EB83FC1EB851EB851EB3FD51EB851EB851F3FE33333333333343FEE6666666666660161016C3FA47AE147AE147C3FC47AE147AE147C3FD70A3D70A3D70A3FE47AE147AE147C3FF0000000000000016201693FAEB851EB851EB83FD66666666666663FE70A3D70A3D70B3FF2B851EB851EB93FFB3333333333330162016A3FBEB851EB851EB83FDAE147AE147AE13FE999999999999A3FF428F5C28F5C293FFCCCCCCCCCCCCD0162016B3FC70A3D70A3D70A3FDF5C28F5C28F5B3FEC28F5C28F5C2A3FF599999999999A3FFE6666666666660162016C3FCEB851EB851EB83FE1EB851EB851EB3FEEB851EB851EB83FF70A3D70A3D70B4000000000000000016301693FBC28F5C28F5C2A3FE33333333333333FF2B851EB851EB93FFD1EB851EB851E40046666666666660163016A3FCC28F5C28F5C2A3FE70A3D70A3D70A3FF4CCCCCCCCCCCD3FFF5C28F5C28F5B400599999999999A0163016B3FD51EB851EB851F3FEAE147AE147AE13FF6E147AE147AE24000CCCCCCCCCCCC4006CCCCCCCCCCCC0163016C3FDC28F5C28F5C2A3FEEB851EB851EB83FF8F5C28F5C28F64001EB851EB851EB4008000000000000"}}
+{"expression":"join(a,b,f(a,b)(a*b))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003F847AE147AE147C"}}
+{"expression":"join(a,b,f(a,b)(a*b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053F847AE147AE147C3FA47AE147AE147C3FB70A3D70A3D70A3FC47AE147AE147C3FD0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a*b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033F847AE147AE147C3FA47AE147AE147C3FB70A3D70A3D70A"}}
+{"expression":"join(a,b,f(a,b)(a*b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053F847AE147AE147C3F947AE147AE147C3F9EB851EB851EB83FA47AE147AE147C3FA999999999999A3F947AE147AE147C3FA47AE147AE147C3FAEB851EB851EB83FB47AE147AE147C3FB999999999999A3F9EB851EB851EB83FAEB851EB851EB83FB70A3D70A3D70A3FBEB851EB851EB83FC33333333333333FA47AE147AE147C3FB47AE147AE147C3FBEB851EB851EB83FC47AE147AE147C3FC999999999999A3FA999999999999A3FB999999999999A3FC33333333333333FC999999999999A3FD0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a*b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053F847AE147AE147C3F947AE147AE147C3F9EB851EB851EB83FA47AE147AE147C3FA999999999999A3FBEB851EB851EB83FC1EB851EB851EB3FC47AE147AE147C3FC70A3D70A3D70B3FC999999999999A3FD51EB851EB851F3FD70A3D70A3D70A3FD8F5C28F5C28F63FDAE147AE147AE13FDCCCCCCCCCCCCC3FE47AE147AE147C3FE5C28F5C28F5C33FE70A3D70A3D70B3FE851EB851EB8523FE999999999999A3FF0CCCCCCCCCCCD3FF199999999999A3FF26666666666663FF33333333333333FF4000000000000"}}
+{"expression":"join(a,b,f(a,b)(a*b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043F847AE147AE147C3FA47AE147AE147C3FB70A3D70A3D70A3FC47AE147AE147C3FD33333333333333FDAE147AE147AE13FE1EB851EB851EB3FE70A3D70A3D70B3FEFAE147AE147AF3FF33333333333333FF6E147AE147AE23FFAE147AE147AE1"}}
+{"expression":"join(a,b,f(a,b)(a*b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073F847AE147AE147C3F947AE147AE147C3F9EB851EB851EB83FA47AE147AE147C3FA999999999999A3FAEB851EB851EB83FB1EB851EB851EB3FC47AE147AE147C3FC70A3D70A3D70B3FC999999999999A3FCC28F5C28F5C2A3FCEB851EB851EB83FD0A3D70A3D70A43FD1EB851EB851EB3FDCCCCCCCCCCCCC3FDEB851EB851EB83FE051EB851EB8523FE147AE147AE1483FE23D70A3D70A3D3FE33333333333333FE428F5C28F5C293FEC28F5C28F5C2A3FED70A3D70A3D703FEEB851EB851EB83FF00000000000003FF0A3D70A3D70A43FF147AE147AE1483FF1EB851EB851EB3FF73333333333333FF80000000000003FF8CCCCCCCCCCCD3FF999999999999A3FFA6666666666663FFB3333333333333FFC0000000000003FAEB851EB851EB83FBEB851EB851EB83FC70A3D70A3D70A3FCEB851EB851EB83FD33333333333333FD70A3D70A3D70A3FDAE147AE147AE13FE1EB851EB851EB3FE428F5C28F5C293FE66666666666663FE8A3D70A3D70A43FEAE147AE147AE13FED1EB851EB851E3FEF5C28F5C28F5B3FF33333333333343FF47AE147AE147C3FF5C28F5C28F5C33FF70A3D70A3D70B3FF851EB851EB8523FF999999999999A3FFAE147AE147AE23FFFAE147AE147AF40008F5C28F5C28F400147AE147AE14840020000000000004002B851EB851EB9400370A3D70A3D71400428F5C28F5C29400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C0000000000003FBC28F5C28F5C2A3FCC28F5C28F5C2A3FD51EB851EB851F3FDC28F5C28F5C2A3FE199999999999A3FE51EB851EB851F3FE8A3D70A3D70A43FEEB851EB851EB83FF147AE147AE1483FF33333333333333FF51EB851EB851F3FF70A3D70A3D70A3FF8F5C28F5C28F63FFAE147AE147AE13FFF3333333333344000A3D70A3D70A44001AE147AE147AE4002B851EB851EB94003C28F5C28F5C24004CCCCCCCCCCCD4005D70A3D70A3D84008A3D70A3D70A44009C28F5C28F5C2400AE147AE147AE1400C000000000000400D1EB851EB851E400E3D70A3D70A3D400F5C28F5C28F5B40116666666666664012000000000000401299999999999A40133333333333344013CCCCCCCCCCCC40146666666666664015000000000000"}}
+{"expression":"join(a,b,f(a,b)(a*b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613F847AE147AE147C01623FA47AE147AE147C01633FB70A3D70A3D70A"}}
+{"expression":"join(a,b,f(a,b)(a*b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613F847AE147AE147C01623FA47AE147AE147C"}}
+{"expression":"join(a,b,f(a,b)(a*b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x0101017903036261723FC999999999999A0362617A3FD333333333333303666F6F3FB999999999999A"},"result":{"expect":"0x010201780179090161036261723F947AE147AE147C01610362617A3F9EB851EB851EB8016103666F6F3F847AE147AE147C0162036261723FA47AE147AE147C01620362617A3FAEB851EB851EB8016203666F6F3F947AE147AE147C0163036261723FAEB851EB851EB801630362617A3FB70A3D70A3D70A016303666F6F3F9EB851EB851EB8"}}
+{"expression":"join(a,b,f(a,b)(a*b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010201780179090161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A0163036261723FE999999999999A01630362617A3FECCCCCCCCCCCCD016303666F6F3FE6666666666666"},"result":{"expect":"0x010201780179090161036261723F947AE147AE147C01610362617A3F9EB851EB851EB8016103666F6F3F847AE147AE147C0162036261723FB999999999999A01620362617A3FBEB851EB851EB8016203666F6F3FB47AE147AE147C0163036261723FCEB851EB851EB801630362617A3FD147AE147AE148016303666F6F3FCAE147AE147AE1"}}
+{"expression":"join(a,b,f(a,b)(a*b))","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179040161036261723FA47AE147AE147C016103666F6F3F847AE147AE147C0162036261723FC999999999999A016203666F6F3FBEB851EB851EB8"}}
+{"expression":"join(a,b,f(a,b)(a*b))","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x01020179017A080362617201693FE000000000000003626172016A3FE333333333333303626172016B3FE666666666666603626172016C3FE999999999999A03666F6F01693FB999999999999A03666F6F016A3FC999999999999A03666F6F016B3FD333333333333303666F6F016C3FD999999999999A"},"result":{"expect":"0x010301780179017A1001610362617201693FB999999999999A016103626172016A3FBEB851EB851EB8016103626172016B3FC1EB851EB851EB016103626172016C3FC47AE147AE147C016103666F6F01693F847AE147AE147C016103666F6F016A3F947AE147AE147C016103666F6F016B3F9EB851EB851EB8016103666F6F016C3FA47AE147AE147C01620362617201693FD0000000000000016203626172016A3FD3333333333333016203626172016B3FD6666666666666016203626172016C3FD999999999999A016203666F6F01693FA47AE147AE147C016203666F6F016A3FB47AE147AE147C016203666F6F016B3FBEB851EB851EB8016203666F6F016C3FC47AE147AE147C"}}
+{"expression":"join(a,b,f(a,b)(a*b))","inputs":{"a":"0x030101790101780302036261723FC999999999999A3FD999999999999A3FE333333333333303666F6F3FB999999999999A3FD33333333333333FE0000000000000","b":"0x0301017901017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF666666666666603666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE6666666666666"},"result":{"expect":"0x0301017902017803017A0702036261723FC47AE147AE147C3FC70A3D70A3D70B3FC999999999999A3FCC28F5C28F5C2A3FCEB851EB851EB83FD0A3D70A3D70A43FD1EB851EB851EB3FD47AE147AE147C3FD70A3D70A3D70B3FD999999999999A3FDC28F5C28F5C2A3FDEB851EB851EB83FE0A3D70A3D70A43FE1EB851EB851EB3FDEB851EB851EB83FE147AE147AE1483FE33333333333333FE51EB851EB851F3FE70A3D70A3D70A3FE8F5C28F5C28F63FEAE147AE147AE103666F6F3F847AE147AE147C3F947AE147AE147C3F9EB851EB851EB83FA47AE147AE147C3FA999999999999A3FAEB851EB851EB83FB1EB851EB851EB3F9EB851EB851EB83FAEB851EB851EB83FB70A3D70A3D70A3FBEB851EB851EB83FC33333333333333FC70A3D70A3D70A3FCAE147AE147AE13FA999999999999A3FB999999999999A3FC33333333333333FC999999999999A3FD00000000000003FD33333333333333FD6666666666666"}}
+{"expression":"join(a,b,f(a,b)(a*b))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693F847AE147AE147C3FB999999999999A3FD147AE147AE1483FE0A3D70A3D70A43FEB3333333333330161016A3F947AE147AE147C3FBEB851EB851EB83FD33333333333333FE1EB851EB851EB3FECCCCCCCCCCCCD0161016B3F9EB851EB851EB83FC1EB851EB851EB3FD51EB851EB851F3FE33333333333343FEE6666666666660161016C3FA47AE147AE147C3FC47AE147AE147C3FD70A3D70A3D70A3FE47AE147AE147C3FF0000000000000016201693FAEB851EB851EB83FD66666666666663FE70A3D70A3D70B3FF2B851EB851EB93FFB3333333333330162016A3FBEB851EB851EB83FDAE147AE147AE13FE999999999999A3FF428F5C28F5C293FFCCCCCCCCCCCCD0162016B3FC70A3D70A3D70A3FDF5C28F5C28F5B3FEC28F5C28F5C2A3FF599999999999A3FFE6666666666660162016C3FCEB851EB851EB83FE1EB851EB851EB3FEEB851EB851EB83FF70A3D70A3D70B4000000000000000016301693FBC28F5C28F5C2A3FE33333333333333FF2B851EB851EB93FFD1EB851EB851E40046666666666660163016A3FCC28F5C28F5C2A3FE70A3D70A3D70A3FF4CCCCCCCCCCCD3FFF5C28F5C28F5B400599999999999A0163016B3FD51EB851EB851F3FEAE147AE147AE13FF6E147AE147AE24000CCCCCCCCCCCC4006CCCCCCCCCCCC0163016C3FDC28F5C28F5C2A3FEEB851EB851EB83FF8F5C28F5C28F64001EB851EB851EB4008000000000000"}}
+{"expression":"a/b","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FF0000000000000"}}
+{"expression":"a/b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"a/b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"a/b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FF00000000000003FE00000000000003FD55555555555563FD00000000000003FC999999999999A40000000000000003FF00000000000003FE55555555555563FE00000000000003FD999999999999A4007FFFFFFFFFFFF3FF7FFFFFFFFFFFF3FF00000000000003FE7FFFFFFFFFFFF3FE3333333333333401000000000000040000000000000003FF55555555555563FF00000000000003FE999999999999A401400000000000040040000000000003FFAAAAAAAAAAAAB3FF40000000000003FF0000000000000"}}
+{"expression":"a/b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FF00000000000003FE00000000000003FD55555555555563FD00000000000003FC999999999999A3FD55555555555563FD24924924924933FD00000000000003FCC71C71C71C71D3FC999999999999A3FD1745D1745D1743FD00000000000003FCD89D89D89D89D3FCB6DB6DB6DB6DC3FC99999999999993FD00000000000003FCE1E1E1E1E1E1F3FCC71C71C71C71D3FCAF286BCA1AF293FC999999999999A3FCE79E79E79E79E3FCD1745D1745D173FCBD37A6F4DE9BE3FCAAAAAAAAAAAAB3FC999999999999A"}}
+{"expression":"a/b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF33333333333333FF2AAAAAAAAAAAB3FF24924924924933FF20000000000003FF38E38E38E38E43FF33333333333333FF2E8BA2E8BA2E83FF2AAAAAAAAAAAB"}}
+{"expression":"a/b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FF00000000000003FE00000000000003FD55555555555563FD00000000000003FC999999999999A3FC55555555555563FC24924924924933FD00000000000003FCC71C71C71C71D3FC999999999999A3FC745D1745D17463FC55555555555563FC3B13B13B13B143FC24924924924933FC99999999999993FC7FFFFFFFFFFFF3FC69696969696973FC55555555555553FC435E50D79435E3FC33333333333333FC24924924924923FC745D1745D17463FC642C8590B21653FC55555555555563FC47AE147AE147B3FC3B13B13B13B143FC2F684BDA12F683FC24924924924933FC611A7B9611A7C3FC55555555555553FC4A5294A5294A53FC40000000000003FC364D9364D93653FC2D2D2D2D2D2D33FC24924924924924017FFFFFFFFFFFF4007FFFFFFFFFFFF40000000000000003FF7FFFFFFFFFFFF3FF33333333333333FF00000000000003FEB6DB6DB6DB6DC3FEBFFFFFFFFFFFF3FE8E38E38E38E383FE66666666666663FE45D1745D1745C3FE2AAAAAAAAAAAB3FE13B13B13B13B13FE00000000000003FE11111111111113FE00000000000003FDE1E1E1E1E1E1F3FDC71C71C71C71D3FDAF286BCA1AF293FD999999999999A3FD86186186186183FDA2E8BA2E8BA2E3FD90B21642C85913FD80000000000003FD70A3D70A3D70A3FD62762762762763FD55555555555553FD49249249249253FD611A7B9611A7C3FD55555555555553FD4A5294A5294A53FD40000000000003FD364D9364D93653FD2D2D2D2D2D2D33FD249249249249240260000000000004016000000000000400D5555555555564006000000000000400199999999999A3FFD5555555555563FF924924924924A3FF7FFFFFFFFFFFF3FF55555555555553FF33333333333333FF1745D1745D1743FF00000000000003FED89D89D89D89D3FEB6DB6DB6DB6DC3FEBBBBBBBBBBBBC3FEA0000000000003FE87878787878793FE71C71C71C71C73FE5E50D79435E513FE4CCCCCCCCCCCD3FE3CF3CF3CF3CF43FE45D1745D1745C3FE37A6F4DE9BD383FE2AAAAAAAAAAAB3FE1EB851EB851EB3FE13B13B13B13B13FE097B425ED097B3FE00000000000003FE08D3DCB08D3DD3FE00000000000003FDEF7BDEF7BDEF73FDE0000000000003FDD1745D1745D183FDC3C3C3C3C3C3C3FDB6DB6DB6DB6DB"}}
+{"expression":"a/b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FF000000000000001623FF000000000000001633FF0000000000000"}}
+{"expression":"a/b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FF000000000000001623FF0000000000000"}}
+{"expression":"a/b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x0101017903036261723FC999999999999A0362617A3FD333333333333303666F6F3FB999999999999A"},"result":{"expect":"0x010201780179090161036261723FE000000000000001610362617A3FD5555555555556016103666F6F3FF00000000000000162036261723FF000000000000001620362617A3FE5555555555556016203666F6F40000000000000000163036261723FF7FFFFFFFFFFFF01630362617A3FF0000000000000016303666F6F4007FFFFFFFFFFFF"}}
+{"expression":"a/b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010201780179090161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A0163036261723FE999999999999A01630362617A3FECCCCCCCCCCCCD016303666F6F3FE6666666666666"},"result":{"expect":"0x010201780179090161036261723FE000000000000001610362617A3FD5555555555556016103666F6F3FF00000000000000162036261723FD999999999999A01620362617A3FD5555555555556016203666F6F3FE00000000000000163036261723FD7FFFFFFFFFFFF01630362617A3FD5555555555555016303666F6F3FDB6DB6DB6DB6DC"}}
+{"expression":"a/b","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179040161036261723FF0000000000000016103666F6F3FF00000000000000162036261723FF4000000000000016203666F6F3FF5555555555556"}}
+{"expression":"a/b","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x01020179017A080362617201693FE000000000000003626172016A3FE333333333333303626172016B3FE666666666666603626172016C3FE999999999999A03666F6F01693FB999999999999A03666F6F016A3FC999999999999A03666F6F016B3FD333333333333303666F6F016C3FD999999999999A"},"result":{"expect":"0x010301780179017A1001610362617201693FD999999999999A016103626172016A3FD5555555555556016103626172016B3FD2492492492493016103626172016C3FD0000000000000016103666F6F01693FF0000000000000016103666F6F016A3FE0000000000000016103666F6F016B3FD5555555555556016103666F6F016C3FD000000000000001620362617201693FF0000000000000016203626172016A3FEAAAAAAAAAAAAB016203626172016B3FE6DB6DB6DB6DB7016203626172016C3FE4000000000000016203666F6F01694010000000000000016203666F6F016A4000000000000000016203666F6F016B3FF5555555555556016203666F6F016C3FF0000000000000"}}
+{"expression":"a/b","inputs":{"a":"0x030101790101780302036261723FC999999999999A3FD999999999999A3FE333333333333303666F6F3FB999999999999A3FD33333333333333FE0000000000000","b":"0x0301017901017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF666666666666603666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE6666666666666"},"result":{"expect":"0x0301017902017803017A0702036261723FD00000000000003FCC71C71C71C71D3FC999999999999A3FC745D1745D17463FC55555555555563FC3B13B13B13B143FC24924924924933FE00000000000003FDC71C71C71C71D3FD999999999999A3FD745D1745D17463FD55555555555563FD3B13B13B13B143FD24924924924933FE7FFFFFFFFFFFF3FE55555555555553FE33333333333333FE1745D1745D1743FE00000000000003FDD89D89D89D89D3FDB6DB6DB6DB6DC03666F6F3FF00000000000003FE00000000000003FD55555555555563FD00000000000003FC999999999999A3FC55555555555563FC24924924924934007FFFFFFFFFFFF3FF7FFFFFFFFFFFF3FF00000000000003FE7FFFFFFFFFFFF3FE33333333333333FE00000000000003FDB6DB6DB6DB6DC401400000000000040040000000000003FFAAAAAAAAAAAAB3FF40000000000003FF00000000000003FEAAAAAAAAAAAAB3FE6DB6DB6DB6DB7"}}
+{"expression":"a/b","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FF00000000000003FD999999999999A3FD55555555555553FD3B13B13B13B143FD2D2D2D2D2D2D30161016A3FE00000000000003FD55555555555563FD33333333333333FD24924924924933FD1C71C71C71C720161016B3FD55555555555563FD24924924924933FD1745D1745D1743FD11111111111113FD0D79435E50D790161016C3FD00000000000003FD00000000000003FD00000000000003FD00000000000003FD0000000000000016201694017FFFFFFFFFFFF3FF66666666666663FEC71C71C71C71D3FE62762762762763FE2D2D2D2D2D2D30162016A4007FFFFFFFFFFFF3FF2AAAAAAAAAAAB3FE999999999999A3FE49249249249253FE1C71C71C71C720162016B40000000000000003FF00000000000003FE745D1745D17463FE33333333333333FE0D79435E50D790162016C3FF7FFFFFFFFFFFF3FEBFFFFFFFFFFFF3FE55555555555563FE20000000000003FE000000000000001630169402600000000000040033333333333333FF71C71C71C71C73FF13B13B13B13B13FEC3C3C3C3C3C3C0163016A401600000000000040000000000000003FF4CCCCCCCCCCCD3FF00000000000003FEAAAAAAAAAAAAA0163016B400D5555555555563FFB6DB6DB6DB6DC3FF2E8BA2E8BA2E83FEDDDDDDDDDDDDD3FE9435E50D794360163016C40060000000000003FF7FFFFFFFFFFFF3FF15555555555563FEBFFFFFFFFFFFF3FE8000000000000"}}
+{"expression":"join(a,b,f(a,b)(a/b))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a/b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a/b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a/b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FF00000000000003FE00000000000003FD55555555555563FD00000000000003FC999999999999A40000000000000003FF00000000000003FE55555555555563FE00000000000003FD999999999999A4007FFFFFFFFFFFF3FF7FFFFFFFFFFFF3FF00000000000003FE7FFFFFFFFFFFF3FE3333333333333401000000000000040000000000000003FF55555555555563FF00000000000003FE999999999999A401400000000000040040000000000003FFAAAAAAAAAAAAB3FF40000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a/b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FF00000000000003FE00000000000003FD55555555555563FD00000000000003FC999999999999A3FD55555555555563FD24924924924933FD00000000000003FCC71C71C71C71D3FC999999999999A3FD1745D1745D1743FD00000000000003FCD89D89D89D89D3FCB6DB6DB6DB6DC3FC99999999999993FD00000000000003FCE1E1E1E1E1E1F3FCC71C71C71C71D3FCAF286BCA1AF293FC999999999999A3FCE79E79E79E79E3FCD1745D1745D173FCBD37A6F4DE9BE3FCAAAAAAAAAAAAB3FC999999999999A"}}
+{"expression":"join(a,b,f(a,b)(a/b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF33333333333333FF2AAAAAAAAAAAB3FF24924924924933FF20000000000003FF38E38E38E38E43FF33333333333333FF2E8BA2E8BA2E83FF2AAAAAAAAAAAB"}}
+{"expression":"join(a,b,f(a,b)(a/b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FF00000000000003FE00000000000003FD55555555555563FD00000000000003FC999999999999A3FC55555555555563FC24924924924933FD00000000000003FCC71C71C71C71D3FC999999999999A3FC745D1745D17463FC55555555555563FC3B13B13B13B143FC24924924924933FC99999999999993FC7FFFFFFFFFFFF3FC69696969696973FC55555555555553FC435E50D79435E3FC33333333333333FC24924924924923FC745D1745D17463FC642C8590B21653FC55555555555563FC47AE147AE147B3FC3B13B13B13B143FC2F684BDA12F683FC24924924924933FC611A7B9611A7C3FC55555555555553FC4A5294A5294A53FC40000000000003FC364D9364D93653FC2D2D2D2D2D2D33FC24924924924924017FFFFFFFFFFFF4007FFFFFFFFFFFF40000000000000003FF7FFFFFFFFFFFF3FF33333333333333FF00000000000003FEB6DB6DB6DB6DC3FEBFFFFFFFFFFFF3FE8E38E38E38E383FE66666666666663FE45D1745D1745C3FE2AAAAAAAAAAAB3FE13B13B13B13B13FE00000000000003FE11111111111113FE00000000000003FDE1E1E1E1E1E1F3FDC71C71C71C71D3FDAF286BCA1AF293FD999999999999A3FD86186186186183FDA2E8BA2E8BA2E3FD90B21642C85913FD80000000000003FD70A3D70A3D70A3FD62762762762763FD55555555555553FD49249249249253FD611A7B9611A7C3FD55555555555553FD4A5294A5294A53FD40000000000003FD364D9364D93653FD2D2D2D2D2D2D33FD249249249249240260000000000004016000000000000400D5555555555564006000000000000400199999999999A3FFD5555555555563FF924924924924A3FF7FFFFFFFFFFFF3FF55555555555553FF33333333333333FF1745D1745D1743FF00000000000003FED89D89D89D89D3FEB6DB6DB6DB6DC3FEBBBBBBBBBBBBC3FEA0000000000003FE87878787878793FE71C71C71C71C73FE5E50D79435E513FE4CCCCCCCCCCCD3FE3CF3CF3CF3CF43FE45D1745D1745C3FE37A6F4DE9BD383FE2AAAAAAAAAAAB3FE1EB851EB851EB3FE13B13B13B13B13FE097B425ED097B3FE00000000000003FE08D3DCB08D3DD3FE00000000000003FDEF7BDEF7BDEF73FDE0000000000003FDD1745D1745D183FDC3C3C3C3C3C3C3FDB6DB6DB6DB6DB"}}
+{"expression":"join(a,b,f(a,b)(a/b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FF000000000000001623FF000000000000001633FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a/b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FF000000000000001623FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a/b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x0101017903036261723FC999999999999A0362617A3FD333333333333303666F6F3FB999999999999A"},"result":{"expect":"0x010201780179090161036261723FE000000000000001610362617A3FD5555555555556016103666F6F3FF00000000000000162036261723FF000000000000001620362617A3FE5555555555556016203666F6F40000000000000000163036261723FF7FFFFFFFFFFFF01630362617A3FF0000000000000016303666F6F4007FFFFFFFFFFFF"}}
+{"expression":"join(a,b,f(a,b)(a/b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010201780179090161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A0163036261723FE999999999999A01630362617A3FECCCCCCCCCCCCD016303666F6F3FE6666666666666"},"result":{"expect":"0x010201780179090161036261723FE000000000000001610362617A3FD5555555555556016103666F6F3FF00000000000000162036261723FD999999999999A01620362617A3FD5555555555556016203666F6F3FE00000000000000163036261723FD7FFFFFFFFFFFF01630362617A3FD5555555555555016303666F6F3FDB6DB6DB6DB6DC"}}
+{"expression":"join(a,b,f(a,b)(a/b))","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179040161036261723FF0000000000000016103666F6F3FF00000000000000162036261723FF4000000000000016203666F6F3FF5555555555556"}}
+{"expression":"join(a,b,f(a,b)(a/b))","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x01020179017A080362617201693FE000000000000003626172016A3FE333333333333303626172016B3FE666666666666603626172016C3FE999999999999A03666F6F01693FB999999999999A03666F6F016A3FC999999999999A03666F6F016B3FD333333333333303666F6F016C3FD999999999999A"},"result":{"expect":"0x010301780179017A1001610362617201693FD999999999999A016103626172016A3FD5555555555556016103626172016B3FD2492492492493016103626172016C3FD0000000000000016103666F6F01693FF0000000000000016103666F6F016A3FE0000000000000016103666F6F016B3FD5555555555556016103666F6F016C3FD000000000000001620362617201693FF0000000000000016203626172016A3FEAAAAAAAAAAAAB016203626172016B3FE6DB6DB6DB6DB7016203626172016C3FE4000000000000016203666F6F01694010000000000000016203666F6F016A4000000000000000016203666F6F016B3FF5555555555556016203666F6F016C3FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a/b))","inputs":{"a":"0x030101790101780302036261723FC999999999999A3FD999999999999A3FE333333333333303666F6F3FB999999999999A3FD33333333333333FE0000000000000","b":"0x0301017901017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF666666666666603666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE6666666666666"},"result":{"expect":"0x0301017902017803017A0702036261723FD00000000000003FCC71C71C71C71D3FC999999999999A3FC745D1745D17463FC55555555555563FC3B13B13B13B143FC24924924924933FE00000000000003FDC71C71C71C71D3FD999999999999A3FD745D1745D17463FD55555555555563FD3B13B13B13B143FD24924924924933FE7FFFFFFFFFFFF3FE55555555555553FE33333333333333FE1745D1745D1743FE00000000000003FDD89D89D89D89D3FDB6DB6DB6DB6DC03666F6F3FF00000000000003FE00000000000003FD55555555555563FD00000000000003FC999999999999A3FC55555555555563FC24924924924934007FFFFFFFFFFFF3FF7FFFFFFFFFFFF3FF00000000000003FE7FFFFFFFFFFFF3FE33333333333333FE00000000000003FDB6DB6DB6DB6DC401400000000000040040000000000003FFAAAAAAAAAAAAB3FF40000000000003FF00000000000003FEAAAAAAAAAAAAB3FE6DB6DB6DB6DB7"}}
+{"expression":"join(a,b,f(a,b)(a/b))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FF00000000000003FD999999999999A3FD55555555555553FD3B13B13B13B143FD2D2D2D2D2D2D30161016A3FE00000000000003FD55555555555563FD33333333333333FD24924924924933FD1C71C71C71C720161016B3FD55555555555563FD24924924924933FD1745D1745D1743FD11111111111113FD0D79435E50D790161016C3FD00000000000003FD00000000000003FD00000000000003FD00000000000003FD0000000000000016201694017FFFFFFFFFFFF3FF66666666666663FEC71C71C71C71D3FE62762762762763FE2D2D2D2D2D2D30162016A4007FFFFFFFFFFFF3FF2AAAAAAAAAAAB3FE999999999999A3FE49249249249253FE1C71C71C71C720162016B40000000000000003FF00000000000003FE745D1745D17463FE33333333333333FE0D79435E50D790162016C3FF7FFFFFFFFFFFF3FEBFFFFFFFFFFFF3FE55555555555563FE20000000000003FE000000000000001630169402600000000000040033333333333333FF71C71C71C71C73FF13B13B13B13B13FEC3C3C3C3C3C3C0163016A401600000000000040000000000000003FF4CCCCCCCCCCCD3FF00000000000003FEAAAAAAAAAAAAA0163016B400D5555555555563FFB6DB6DB6DB6DC3FF2E8BA2E8BA2E83FEDDDDDDDDDDDDD3FE9435E50D794360163016C40060000000000003FF7FFFFFFFFFFFF3FF15555555555563FEBFFFFFFFFFFFF3FE8000000000000"}}
+{"expression":"a%b","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02000000000000000000"}}
+{"expression":"a%b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020101780500000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"a%b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x0201017803000000000000000000000000000000000000000000000000"}}
+{"expression":"a%b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020201780501790500000000000000003FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A000000000000000000000000000000003FC999999999999A3FC999999999999A3FC999999999999A3FB99999999999983FB999999999999800000000000000003FD33333333333333FD3333333333333000000000000000000000000000000003FB999999999999C00000000000000003FD999999999999A3FB99999999999983FB99999999999983FC999999999999A3FB99999999999980000000000000000"}}
+{"expression":"a%b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x020201780501790500000000000000003FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE0000000000000"}}
+{"expression":"a%b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x020201780301790400000000000000000000000000000000000000000000000000000000000000003FB99999999999983FB99999999999983FB99999999999A03FB99999999999983FC999999999999C3FC99999999999983FC99999999999983FC9999999999998"}}
+{"expression":"a%b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A0700000000000000003FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FB99999999999963FC999999999999800000000000000003FC99999999999983FB999999999999800000000000000003FE33333333333333FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003C800000000000003FB999999999999C3FC999999999999E3FD33333333333343FB99999999999A03FE00000000000013FD999999999999C3FD99999999999983FD33333333333323FC99999999999983FB999999999999000000000000000003FF33333333333333FF33333333333333FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF8000000000000"}}
+{"expression":"a%b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x0101017803016100000000000000000162000000000000000001630000000000000000"}}
+{"expression":"a%b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x01010178020161000000000000000001620000000000000000"}}
+{"expression":"a%b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x0101017903036261723FC999999999999A0362617A3FD333333333333303666F6F3FB999999999999A"},"result":{"expect":"0x010201780179090161036261723FB999999999999A01610362617A3FB999999999999A016103666F6F0000000000000000016203626172000000000000000001620362617A3FC999999999999A016203666F6F00000000000000000163036261723FB999999999999801630362617A0000000000000000016303666F6F3FB9999999999998"}}
+{"expression":"a%b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010201780179090161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A0163036261723FE999999999999A01630362617A3FECCCCCCCCCCCCD016303666F6F3FE6666666666666"},"result":{"expect":"0x010201780179090161036261723FB999999999999A01610362617A3FB999999999999A016103666F6F00000000000000000162036261723FC999999999999A01620362617A3FC999999999999A016203666F6F3FC999999999999A0163036261723FD333333333333301630362617A3FD3333333333333016303666F6F3FD3333333333333"}}
+{"expression":"a%b","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179040161036261720000000000000000016103666F6F00000000000000000162036261723FB9999999999998016203666F6F3FB999999999999C"}}
+{"expression":"a%b","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x01020179017A080362617201693FE000000000000003626172016A3FE333333333333303626172016B3FE666666666666603626172016C3FE999999999999A03666F6F01693FB999999999999A03666F6F016A3FC999999999999A03666F6F016B3FD333333333333303666F6F016C3FD999999999999A"},"result":{"expect":"0x010301780179017A1001610362617201693FC999999999999A016103626172016A3FC999999999999A016103626172016B3FC999999999999A016103626172016C3FC999999999999A016103666F6F01690000000000000000016103666F6F016A3FB999999999999A016103666F6F016B3FB999999999999A016103666F6F016C3FB999999999999A01620362617201690000000000000000016203626172016A3FE0000000000000016203626172016B3FE0000000000000016203626172016C3FE0000000000000016203666F6F01690000000000000000016203666F6F016A0000000000000000016203666F6F016B3FB999999999999C016203666F6F016C0000000000000000"}}
+{"expression":"a%b","inputs":{"a":"0x030101790101780302036261723FC999999999999A3FD999999999999A3FE333333333333303666F6F3FB999999999999A3FD33333333333333FE0000000000000","b":"0x0301017901017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF666666666666603666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE6666666666666"},"result":{"expect":"0x0301017902017803017A0702036261723FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE333333333333303666F6F00000000000000003FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB99999999999983FB999999999999800000000000000003FD33333333333333FD33333333333333FD33333333333333FD33333333333333FB99999999999983FB99999999999983FC999999999999A3FB999999999999800000000000000003FE00000000000003FE0000000000000"}}
+{"expression":"a%b","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C0161016900000000000000003FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016A3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016B3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016C3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000016201693FB99999999999963FC99999999999983FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016A3FC99999999999983FB99999999999983FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016B000000000000000000000000000000003FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016C3FC99999999999983FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF0000000000000016301693C800000000000003FC99999999999983FD999999999999A3FB99999999999903FF80000000000000163016A3FB999999999999C00000000000000003FD333333333333400000000000000003FF80000000000000163016B3FC999999999999E3FE00000000000003FC99999999999983FF66666666666663FF80000000000000163016C3FD33333333333343FD99999999999983FB99999999999A03FF66666666666663FF8000000000000"}}
+{"expression":"join(a,b,f(a,b)(a%b))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a%b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020101780500000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a%b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x0201017803000000000000000000000000000000000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a%b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020201780501790500000000000000003FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A000000000000000000000000000000003FC999999999999A3FC999999999999A3FC999999999999A3FB99999999999983FB999999999999800000000000000003FD33333333333333FD3333333333333000000000000000000000000000000003FB999999999999C00000000000000003FD999999999999A3FB99999999999983FB99999999999983FC999999999999A3FB99999999999980000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a%b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x020201780501790500000000000000003FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a%b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x020201780301790400000000000000000000000000000000000000000000000000000000000000003FB99999999999983FB99999999999983FB99999999999A03FB99999999999983FC999999999999C3FC99999999999983FC99999999999983FC9999999999998"}}
+{"expression":"join(a,b,f(a,b)(a%b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A0700000000000000003FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FB99999999999963FC999999999999800000000000000003FC99999999999983FB999999999999800000000000000003FE33333333333333FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003C800000000000003FB999999999999C3FC999999999999E3FD33333333333343FB99999999999A03FE00000000000013FD999999999999C3FD99999999999983FD33333333333323FC99999999999983FB999999999999000000000000000003FF33333333333333FF33333333333333FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF8000000000000"}}
+{"expression":"join(a,b,f(a,b)(a%b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x0101017803016100000000000000000162000000000000000001630000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a%b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x01010178020161000000000000000001620000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a%b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x0101017903036261723FC999999999999A0362617A3FD333333333333303666F6F3FB999999999999A"},"result":{"expect":"0x010201780179090161036261723FB999999999999A01610362617A3FB999999999999A016103666F6F0000000000000000016203626172000000000000000001620362617A3FC999999999999A016203666F6F00000000000000000163036261723FB999999999999801630362617A0000000000000000016303666F6F3FB9999999999998"}}
+{"expression":"join(a,b,f(a,b)(a%b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010201780179090161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A0163036261723FE999999999999A01630362617A3FECCCCCCCCCCCCD016303666F6F3FE6666666666666"},"result":{"expect":"0x010201780179090161036261723FB999999999999A01610362617A3FB999999999999A016103666F6F00000000000000000162036261723FC999999999999A01620362617A3FC999999999999A016203666F6F3FC999999999999A0163036261723FD333333333333301630362617A3FD3333333333333016303666F6F3FD3333333333333"}}
+{"expression":"join(a,b,f(a,b)(a%b))","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179040161036261720000000000000000016103666F6F00000000000000000162036261723FB9999999999998016203666F6F3FB999999999999C"}}
+{"expression":"join(a,b,f(a,b)(a%b))","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x01020179017A080362617201693FE000000000000003626172016A3FE333333333333303626172016B3FE666666666666603626172016C3FE999999999999A03666F6F01693FB999999999999A03666F6F016A3FC999999999999A03666F6F016B3FD333333333333303666F6F016C3FD999999999999A"},"result":{"expect":"0x010301780179017A1001610362617201693FC999999999999A016103626172016A3FC999999999999A016103626172016B3FC999999999999A016103626172016C3FC999999999999A016103666F6F01690000000000000000016103666F6F016A3FB999999999999A016103666F6F016B3FB999999999999A016103666F6F016C3FB999999999999A01620362617201690000000000000000016203626172016A3FE0000000000000016203626172016B3FE0000000000000016203626172016C3FE0000000000000016203666F6F01690000000000000000016203666F6F016A0000000000000000016203666F6F016B3FB999999999999C016203666F6F016C0000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a%b))","inputs":{"a":"0x030101790101780302036261723FC999999999999A3FD999999999999A3FE333333333333303666F6F3FB999999999999A3FD33333333333333FE0000000000000","b":"0x0301017901017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF666666666666603666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE6666666666666"},"result":{"expect":"0x0301017902017803017A0702036261723FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE333333333333303666F6F00000000000000003FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB99999999999983FB999999999999800000000000000003FD33333333333333FD33333333333333FD33333333333333FD33333333333333FB99999999999983FB99999999999983FC999999999999A3FB999999999999800000000000000003FE00000000000003FE0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a%b))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C0161016900000000000000003FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016A3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016B3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016C3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000016201693FB99999999999963FC99999999999983FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016A3FC99999999999983FB99999999999983FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016B000000000000000000000000000000003FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016C3FC99999999999983FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF0000000000000016301693C800000000000003FC99999999999983FD999999999999A3FB99999999999903FF80000000000000163016A3FB999999999999C00000000000000003FD333333333333400000000000000003FF80000000000000163016B3FC999999999999E3FE00000000000003FC99999999999983FF66666666666663FF80000000000000163016C3FD33333333333343FD99999999999983FB99999999999A03FF66666666666663FF8000000000000"}}
+{"expression":"a^b","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FE96B230BCDC434"}}
+{"expression":"a^b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FE96B230BCDC4343FE731651F09A68E3FE64C8E84C5F4E93FE62E3E1817C1C43FE6A09E667F3BCD"}}
+{"expression":"a^b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FE96B230BCDC4343FE731651F09A68E3FE64C8E84C5F4E9"}}
+{"expression":"a^b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FE96B230BCDC4343FE430CD74F6D4783FE009B9CF3342533FD97A967F7524B33FD43D136248490F3FEB3E2D38A030B13FE731651F09A68E3FE3BEBDCC9D061B3FE0CF4D9B8C79053FDC9F25C5BFEDD93FEC5EC42B8B4A193FE926EFF16629A53FE64C8E84C5F4E93FE3C5064A1418B73FE186F174F884723FED32BCC99E79D23FEAA4469FBF12063FE84F1DDC1979893FE62E3E1817C1C43FE43D136248490F3FEDDB680117AB123FEBDB8CDADBE1203FE9FDF8BCCE533E3FE8406003B2AE5C3FE6A09E667F3BCD"}}
+{"expression":"a^b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FE96B230BCDC4343FE430CD74F6D4783FE009B9CF3342533FD97A967F7524B33FD43D136248490F3FD85DE4AA7BFC063FD4BE914A0AC7523FD1A91920AA33D63FCE11FB92951F8D3FC999999999999A3FD105A8E6ED2C753FCE2EB9881431F93FCAC2449F53F2B03FC7B93ABF4B50DD3FC50854F2C3D2223FCD8BE7091AE7E23FCAF5A24955081F3FC89959ECFD79DC3FC671FA3B35627A3FC47AE147AE147C3FCDDB680117AB123FCBDB8CDADBE11F3FC9FDF8BCCE533E3FC8406003B2AE5D3FC6A09E667F3BCD"}}
+{"expression":"a^b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FE96B230BCDC4343FE731651F09A68E3FE64C8E84C5F4E93FE62E3E1817C1C43FE8C97EF43F72483FE9D5C3DF24FB633FEB5F55FBDF12BA3FED69CF10804E693FF16EDC6D3C743C3FF33333333333333FF55A5A3EBFA9133FF7F592E087B65A"}}
+{"expression":"a^b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FE96B230BCDC4343FE430CD74F6D4783FE009B9CF3342533FD97A967F7524B33FD43D136248490F3FD0137987DD704C3FC98A13577C93C13FD1A91920AA33D63FCE11FB92951F8D3FC999999999999A3FC5CB57608026F33FC28DEA7F3AEBA63FBF9796142E702A3FBAE548F8E0C1A43FC50854F2C3D2223FC2A593BD9B85113FC08819F76D9F8D3FBD5017B9C942F93FB9FCE3BAB663693FB70A3D70A3D70A3FB46D31151C9BBF3FC10CF9FFD671EF3FBF1D96DC4991553FBC6426853D20FD3FB9E7C6E43390B83FB7A31F3A7BECB53FB5914EA110D34B3FB3ADE18A64617E3FC125FBEE2506643FC00000000000003FBDDB680117AB123FBBDB8CDADBE11F3FB9FDF8BCCE533E3FB8406003B2AE5D3FB6A09E667F3BCD3FEE680A48D168723FECE4658B6543243FEB740EC5D2AA1A3FEA160FDC35D2CB3FE8C97EF43F72483FE78D7DD8F4883C3FE6613966362A653FE80E68263B1BFB3FE7369F7D10F6863FE66666666666663FE59D79103A1FBA3FE4DB9608E352C43FE4207E29C0D5E53FE36BF482A783413FE6E5B7D16657E23FE6645DBC0597E73FE5E5DE6318DBC83FE56A29A68AED8E3FE4F12FC15F00C13FE47AE147AE147C3FE4072F24AFB0A73FE96128962B8A153FE91D10418F0C823FE8D9AEA11BD8103FE89701CA9CF25E3FE85507D900A37C3FE813BEEC4AACF63FE7D3252986A5EA3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF02739C65D58BF3FF04ED3B73257833FF076CEBE41BF7A3FF09F2BC99051DD3FF0C7EBC96A56F63FF0F10FB06934B03FF11A98737912E13FF28332F16166A53FF2DA65B57E7F983FF33333333333333FF38DA2F91C82C43FF3E9BCB96FEDF13FF447884AA31CC03FF4A70DA8169F5C3FF7B734C33413AD3FF85899CE90E5E53FF8FE493556F45B3FF9A8602A4B50503FFA56FCA6E7E9C63FFB0A3D70A3D70B3FFBC2421E5F8F004000C58069F8993F4001586C869D8A724001F05FB6735B3840028D86049083C04003300CFDDFFAB14003D823BE552C18400485FAFE93999D4009ED592591221D400B000000000000400C1E044C616F57400D47DE6F15B0FF400E7E0BC7D3E01D400FC10EE66FE364401088B7E0E7B3FF"}}
+{"expression":"a^b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FE96B230BCDC43401623FE731651F09A68E01633FE64C8E84C5F4E9"}}
+{"expression":"a^b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FE96B230BCDC43401623FE731651F09A68E"}}
+{"expression":"a^b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x0101017903036261723FC999999999999A0362617A3FD333333333333303666F6F3FB999999999999A"},"result":{"expect":"0x010201780179090161036261723FE430CD74F6D47801610362617A3FE009B9CF334253016103666F6F3FE96B230BCDC4340162036261723FE731651F09A68E01620362617A3FE3BEBDCC9D061B016203666F6F3FEB3E2D38A030B10163036261723FE926EFF16629A501630362617A3FE64C8E84C5F4E9016303666F6F3FEC5EC42B8B4A19"}}
+{"expression":"a^b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010201780179090161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A0163036261723FE999999999999A01630362617A3FECCCCCCCCCCCCD016303666F6F3FE6666666666666"},"result":{"expect":"0x010201780179090161036261723FE430CD74F6D47801610362617A3FE009B9CF334253016103666F6F3FE96B230BCDC4340162036261723FDC9F25C5BFEDD901620362617A3FD85DE4AA7BFC06016203666F6F3FE0CF4D9B8C79050163036261723FD86D691AD2627A01630362617A3FD5A8131B97FD82016303666F6F3FDB8D809C615F41"}}
+{"expression":"a^b","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179040161036261723FE731651F09A68E016103666F6F3FE96B230BCDC4340162036261723FE8406003B2AE5C016203666F6F3FE84F1DDC197989"}}
+{"expression":"a^b","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x01020179017A080362617201693FE000000000000003626172016A3FE333333333333303626172016B3FE666666666666603626172016C3FE999999999999A03666F6F01693FB999999999999A03666F6F016A3FC999999999999A03666F6F016B3FD333333333333303666F6F016C3FD999999999999A"},"result":{"expect":"0x010301780179017A1001610362617201693FDC9F25C5BFEDD9016103626172016A3FD85DE4AA7BFC06016103626172016B3FD4BE914A0AC752016103626172016C3FD1A91920AA33D6016103666F6F01693FE96B230BCDC434016103666F6F016A3FE430CD74F6D478016103666F6F016B3FE009B9CF334253016103666F6F016C3FD97A967F7524B301620362617201693FE6A09E667F3BCD016203626172016A3FE51CB453B9536C016203626172016B3FE3B2C47BFF8329016203626172016C3FE2611186BAE674016203666F6F01693FED32BCC99E79D2016203666F6F016A3FEAA4469FBF1206016203666F6F016B3FE84F1DDC197989016203666F6F016C3FE62E3E1817C1C4"}}
+{"expression":"a^b","inputs":{"a":"0x030101790101780302036261723FC999999999999A3FD999999999999A3FE333333333333303666F6F3FB999999999999A3FD33333333333333FE0000000000000","b":"0x0301017901017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF666666666666603666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE6666666666666"},"result":{"expect":"0x0301017902017803017A0702036261723FD1A91920AA33D63FCE11FB92951F8D3FC999999999999A3FC5CB57608026F33FC28DEA7F3AEBA63FBF9796142E702A3FBAE548F8E0C1A43FDEBFB0683CD8533FDC0E78CA02BB173FD999999999999A3FD75BCA3AE52E423FD550387FCC0E6C3FD3727E49ADFAD43FD1BE981346349E3FE543E8FBAE1CEA3FE434CDF6C1F4C83FE33333333333333FE23E6C92173EAA3FE155D686D65B7C3FE078D5A9E4CC763FDF4DACA1DA302703666F6F3FE96B230BCDC4343FE430CD74F6D4783FE009B9CF3342533FD97A967F7524B33FD43D136248490F3FD0137987DD704C3FC98A13577C93C13FEC5EC42B8B4A193FE926EFF16629A53FE64C8E84C5F4E93FE3C5064A1418B73FE186F174F884723FDF13F63C03331E3FDB8D809C615F413FEDDB680117AB123FEBDB8CDADBE1203FE9FDF8BCCE533E3FE8406003B2AE5C3FE6A09E667F3BCD3FE51CB453B9536C3FE3B2C47BFF8329"}}
+{"expression":"a^b","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FE96B230BCDC4343FDC9F25C5BFEDD93FD5A8131B97FD823FD3727E49ADFAD43FD3B2C47BFF83290161016A3FE430CD74F6D4783FD85DE4AA7BFC063FD33333333333333FD1BE981346349E3FD2611186BAE6740161016B3FE009B9CF3342533FD4BE914A0AC7523FD105A8E6ED2C753FD030DC4EA03A733FD125FBEE2506640161016C3FD97A967F7524B33FD1A91920AA33D63FCE2EB9881431F93FCD8BE7091AE7E23FD0000000000000016201693FEE680A48D168723FEAC5EB3F7AB2F83FEA2D7BB1B6C0F13FEBE76765499C1E3FF00000000000000162016A3FECE4658B6543243FE9D5C3DF24FB633FE999999999999A3FEB9C8924C99ABC3FF00000000000000162016B3FEB740EC5D2AA1A3FE8EE06AA5599B03FE908FAEDDB9CD13FEB5273C4AE62A13FF00000000000000162016C3FEA160FDC35D2CB3FE80E68263B1BFB3FE87B8D3F012DD53FEB09252A00B5A63FF0000000000000016301693FF02739C65D58BF3FF186F174F884723FF442E9BB77515D3FF8C776772A337F3FFFE077EA4184BA0163016A3FF04ED3B73257833FF1D980099BA1493FF4CCCCCCCCCCCD3FF9A088BB80392C40009912C0E98B3D0163016B3FF076CEBE41BF7A3FF22D937B32C2D33FF55A5A3EBFA9133FFA810898CE7313400148E6190B6C130163016C3FF09F2BC99051DD3FF28332F16166A53FF5EBAB035ACD4C3FFB693721891CFE4002000000000000"}}
+{"expression":"join(a,b,f(a,b)(a^b))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FE96B230BCDC434"}}
+{"expression":"join(a,b,f(a,b)(a^b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FE96B230BCDC4343FE731651F09A68E3FE64C8E84C5F4E93FE62E3E1817C1C43FE6A09E667F3BCD"}}
+{"expression":"join(a,b,f(a,b)(a^b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FE96B230BCDC4343FE731651F09A68E3FE64C8E84C5F4E9"}}
+{"expression":"join(a,b,f(a,b)(a^b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FE96B230BCDC4343FE430CD74F6D4783FE009B9CF3342533FD97A967F7524B33FD43D136248490F3FEB3E2D38A030B13FE731651F09A68E3FE3BEBDCC9D061B3FE0CF4D9B8C79053FDC9F25C5BFEDD93FEC5EC42B8B4A193FE926EFF16629A53FE64C8E84C5F4E93FE3C5064A1418B73FE186F174F884723FED32BCC99E79D23FEAA4469FBF12063FE84F1DDC1979893FE62E3E1817C1C43FE43D136248490F3FEDDB680117AB123FEBDB8CDADBE1203FE9FDF8BCCE533E3FE8406003B2AE5C3FE6A09E667F3BCD"}}
+{"expression":"join(a,b,f(a,b)(a^b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FE96B230BCDC4343FE430CD74F6D4783FE009B9CF3342533FD97A967F7524B33FD43D136248490F3FD85DE4AA7BFC063FD4BE914A0AC7523FD1A91920AA33D63FCE11FB92951F8D3FC999999999999A3FD105A8E6ED2C753FCE2EB9881431F93FCAC2449F53F2B03FC7B93ABF4B50DD3FC50854F2C3D2223FCD8BE7091AE7E23FCAF5A24955081F3FC89959ECFD79DC3FC671FA3B35627A3FC47AE147AE147C3FCDDB680117AB123FCBDB8CDADBE11F3FC9FDF8BCCE533E3FC8406003B2AE5D3FC6A09E667F3BCD"}}
+{"expression":"join(a,b,f(a,b)(a^b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FE96B230BCDC4343FE731651F09A68E3FE64C8E84C5F4E93FE62E3E1817C1C43FE8C97EF43F72483FE9D5C3DF24FB633FEB5F55FBDF12BA3FED69CF10804E693FF16EDC6D3C743C3FF33333333333333FF55A5A3EBFA9133FF7F592E087B65A"}}
+{"expression":"join(a,b,f(a,b)(a^b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FE96B230BCDC4343FE430CD74F6D4783FE009B9CF3342533FD97A967F7524B33FD43D136248490F3FD0137987DD704C3FC98A13577C93C13FD1A91920AA33D63FCE11FB92951F8D3FC999999999999A3FC5CB57608026F33FC28DEA7F3AEBA63FBF9796142E702A3FBAE548F8E0C1A43FC50854F2C3D2223FC2A593BD9B85113FC08819F76D9F8D3FBD5017B9C942F93FB9FCE3BAB663693FB70A3D70A3D70A3FB46D31151C9BBF3FC10CF9FFD671EF3FBF1D96DC4991553FBC6426853D20FD3FB9E7C6E43390B83FB7A31F3A7BECB53FB5914EA110D34B3FB3ADE18A64617E3FC125FBEE2506643FC00000000000003FBDDB680117AB123FBBDB8CDADBE11F3FB9FDF8BCCE533E3FB8406003B2AE5D3FB6A09E667F3BCD3FEE680A48D168723FECE4658B6543243FEB740EC5D2AA1A3FEA160FDC35D2CB3FE8C97EF43F72483FE78D7DD8F4883C3FE6613966362A653FE80E68263B1BFB3FE7369F7D10F6863FE66666666666663FE59D79103A1FBA3FE4DB9608E352C43FE4207E29C0D5E53FE36BF482A783413FE6E5B7D16657E23FE6645DBC0597E73FE5E5DE6318DBC83FE56A29A68AED8E3FE4F12FC15F00C13FE47AE147AE147C3FE4072F24AFB0A73FE96128962B8A153FE91D10418F0C823FE8D9AEA11BD8103FE89701CA9CF25E3FE85507D900A37C3FE813BEEC4AACF63FE7D3252986A5EA3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF02739C65D58BF3FF04ED3B73257833FF076CEBE41BF7A3FF09F2BC99051DD3FF0C7EBC96A56F63FF0F10FB06934B03FF11A98737912E13FF28332F16166A53FF2DA65B57E7F983FF33333333333333FF38DA2F91C82C43FF3E9BCB96FEDF13FF447884AA31CC03FF4A70DA8169F5C3FF7B734C33413AD3FF85899CE90E5E53FF8FE493556F45B3FF9A8602A4B50503FFA56FCA6E7E9C63FFB0A3D70A3D70B3FFBC2421E5F8F004000C58069F8993F4001586C869D8A724001F05FB6735B3840028D86049083C04003300CFDDFFAB14003D823BE552C18400485FAFE93999D4009ED592591221D400B000000000000400C1E044C616F57400D47DE6F15B0FF400E7E0BC7D3E01D400FC10EE66FE364401088B7E0E7B3FF"}}
+{"expression":"join(a,b,f(a,b)(a^b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FE96B230BCDC43401623FE731651F09A68E01633FE64C8E84C5F4E9"}}
+{"expression":"join(a,b,f(a,b)(a^b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FE96B230BCDC43401623FE731651F09A68E"}}
+{"expression":"join(a,b,f(a,b)(a^b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x0101017903036261723FC999999999999A0362617A3FD333333333333303666F6F3FB999999999999A"},"result":{"expect":"0x010201780179090161036261723FE430CD74F6D47801610362617A3FE009B9CF334253016103666F6F3FE96B230BCDC4340162036261723FE731651F09A68E01620362617A3FE3BEBDCC9D061B016203666F6F3FEB3E2D38A030B10163036261723FE926EFF16629A501630362617A3FE64C8E84C5F4E9016303666F6F3FEC5EC42B8B4A19"}}
+{"expression":"join(a,b,f(a,b)(a^b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010201780179090161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A0163036261723FE999999999999A01630362617A3FECCCCCCCCCCCCD016303666F6F3FE6666666666666"},"result":{"expect":"0x010201780179090161036261723FE430CD74F6D47801610362617A3FE009B9CF334253016103666F6F3FE96B230BCDC4340162036261723FDC9F25C5BFEDD901620362617A3FD85DE4AA7BFC06016203666F6F3FE0CF4D9B8C79050163036261723FD86D691AD2627A01630362617A3FD5A8131B97FD82016303666F6F3FDB8D809C615F41"}}
+{"expression":"join(a,b,f(a,b)(a^b))","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179040161036261723FE731651F09A68E016103666F6F3FE96B230BCDC4340162036261723FE8406003B2AE5C016203666F6F3FE84F1DDC197989"}}
+{"expression":"join(a,b,f(a,b)(a^b))","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x01020179017A080362617201693FE000000000000003626172016A3FE333333333333303626172016B3FE666666666666603626172016C3FE999999999999A03666F6F01693FB999999999999A03666F6F016A3FC999999999999A03666F6F016B3FD333333333333303666F6F016C3FD999999999999A"},"result":{"expect":"0x010301780179017A1001610362617201693FDC9F25C5BFEDD9016103626172016A3FD85DE4AA7BFC06016103626172016B3FD4BE914A0AC752016103626172016C3FD1A91920AA33D6016103666F6F01693FE96B230BCDC434016103666F6F016A3FE430CD74F6D478016103666F6F016B3FE009B9CF334253016103666F6F016C3FD97A967F7524B301620362617201693FE6A09E667F3BCD016203626172016A3FE51CB453B9536C016203626172016B3FE3B2C47BFF8329016203626172016C3FE2611186BAE674016203666F6F01693FED32BCC99E79D2016203666F6F016A3FEAA4469FBF1206016203666F6F016B3FE84F1DDC197989016203666F6F016C3FE62E3E1817C1C4"}}
+{"expression":"join(a,b,f(a,b)(a^b))","inputs":{"a":"0x030101790101780302036261723FC999999999999A3FD999999999999A3FE333333333333303666F6F3FB999999999999A3FD33333333333333FE0000000000000","b":"0x0301017901017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF666666666666603666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE6666666666666"},"result":{"expect":"0x0301017902017803017A0702036261723FD1A91920AA33D63FCE11FB92951F8D3FC999999999999A3FC5CB57608026F33FC28DEA7F3AEBA63FBF9796142E702A3FBAE548F8E0C1A43FDEBFB0683CD8533FDC0E78CA02BB173FD999999999999A3FD75BCA3AE52E423FD550387FCC0E6C3FD3727E49ADFAD43FD1BE981346349E3FE543E8FBAE1CEA3FE434CDF6C1F4C83FE33333333333333FE23E6C92173EAA3FE155D686D65B7C3FE078D5A9E4CC763FDF4DACA1DA302703666F6F3FE96B230BCDC4343FE430CD74F6D4783FE009B9CF3342533FD97A967F7524B33FD43D136248490F3FD0137987DD704C3FC98A13577C93C13FEC5EC42B8B4A193FE926EFF16629A53FE64C8E84C5F4E93FE3C5064A1418B73FE186F174F884723FDF13F63C03331E3FDB8D809C615F413FEDDB680117AB123FEBDB8CDADBE1203FE9FDF8BCCE533E3FE8406003B2AE5C3FE6A09E667F3BCD3FE51CB453B9536C3FE3B2C47BFF8329"}}
+{"expression":"join(a,b,f(a,b)(a^b))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FE96B230BCDC4343FDC9F25C5BFEDD93FD5A8131B97FD823FD3727E49ADFAD43FD3B2C47BFF83290161016A3FE430CD74F6D4783FD85DE4AA7BFC063FD33333333333333FD1BE981346349E3FD2611186BAE6740161016B3FE009B9CF3342533FD4BE914A0AC7523FD105A8E6ED2C753FD030DC4EA03A733FD125FBEE2506640161016C3FD97A967F7524B33FD1A91920AA33D63FCE2EB9881431F93FCD8BE7091AE7E23FD0000000000000016201693FEE680A48D168723FEAC5EB3F7AB2F83FEA2D7BB1B6C0F13FEBE76765499C1E3FF00000000000000162016A3FECE4658B6543243FE9D5C3DF24FB633FE999999999999A3FEB9C8924C99ABC3FF00000000000000162016B3FEB740EC5D2AA1A3FE8EE06AA5599B03FE908FAEDDB9CD13FEB5273C4AE62A13FF00000000000000162016C3FEA160FDC35D2CB3FE80E68263B1BFB3FE87B8D3F012DD53FEB09252A00B5A63FF0000000000000016301693FF02739C65D58BF3FF186F174F884723FF442E9BB77515D3FF8C776772A337F3FFFE077EA4184BA0163016A3FF04ED3B73257833FF1D980099BA1493FF4CCCCCCCCCCCD3FF9A088BB80392C40009912C0E98B3D0163016B3FF076CEBE41BF7A3FF22D937B32C2D33FF55A5A3EBFA9133FFA810898CE7313400148E6190B6C130163016C3FF09F2BC99051DD3FF28332F16166A53FF5EBAB035ACD4C3FFB693721891CFE4002000000000000"}}
+{"expression":"pow(a,b)","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FE96B230BCDC434"}}
+{"expression":"pow(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FE96B230BCDC4343FE731651F09A68E3FE64C8E84C5F4E93FE62E3E1817C1C43FE6A09E667F3BCD"}}
+{"expression":"pow(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FE96B230BCDC4343FE731651F09A68E3FE64C8E84C5F4E9"}}
+{"expression":"pow(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FE96B230BCDC4343FE430CD74F6D4783FE009B9CF3342533FD97A967F7524B33FD43D136248490F3FEB3E2D38A030B13FE731651F09A68E3FE3BEBDCC9D061B3FE0CF4D9B8C79053FDC9F25C5BFEDD93FEC5EC42B8B4A193FE926EFF16629A53FE64C8E84C5F4E93FE3C5064A1418B73FE186F174F884723FED32BCC99E79D23FEAA4469FBF12063FE84F1DDC1979893FE62E3E1817C1C43FE43D136248490F3FEDDB680117AB123FEBDB8CDADBE1203FE9FDF8BCCE533E3FE8406003B2AE5C3FE6A09E667F3BCD"}}
+{"expression":"pow(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FE96B230BCDC4343FE430CD74F6D4783FE009B9CF3342533FD97A967F7524B33FD43D136248490F3FD85DE4AA7BFC063FD4BE914A0AC7523FD1A91920AA33D63FCE11FB92951F8D3FC999999999999A3FD105A8E6ED2C753FCE2EB9881431F93FCAC2449F53F2B03FC7B93ABF4B50DD3FC50854F2C3D2223FCD8BE7091AE7E23FCAF5A24955081F3FC89959ECFD79DC3FC671FA3B35627A3FC47AE147AE147C3FCDDB680117AB123FCBDB8CDADBE11F3FC9FDF8BCCE533E3FC8406003B2AE5D3FC6A09E667F3BCD"}}
+{"expression":"pow(a,b)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FE96B230BCDC4343FE731651F09A68E3FE64C8E84C5F4E93FE62E3E1817C1C43FE8C97EF43F72483FE9D5C3DF24FB633FEB5F55FBDF12BA3FED69CF10804E693FF16EDC6D3C743C3FF33333333333333FF55A5A3EBFA9133FF7F592E087B65A"}}
+{"expression":"pow(a,b)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FE96B230BCDC4343FE430CD74F6D4783FE009B9CF3342533FD97A967F7524B33FD43D136248490F3FD0137987DD704C3FC98A13577C93C13FD1A91920AA33D63FCE11FB92951F8D3FC999999999999A3FC5CB57608026F33FC28DEA7F3AEBA63FBF9796142E702A3FBAE548F8E0C1A43FC50854F2C3D2223FC2A593BD9B85113FC08819F76D9F8D3FBD5017B9C942F93FB9FCE3BAB663693FB70A3D70A3D70A3FB46D31151C9BBF3FC10CF9FFD671EF3FBF1D96DC4991553FBC6426853D20FD3FB9E7C6E43390B83FB7A31F3A7BECB53FB5914EA110D34B3FB3ADE18A64617E3FC125FBEE2506643FC00000000000003FBDDB680117AB123FBBDB8CDADBE11F3FB9FDF8BCCE533E3FB8406003B2AE5D3FB6A09E667F3BCD3FEE680A48D168723FECE4658B6543243FEB740EC5D2AA1A3FEA160FDC35D2CB3FE8C97EF43F72483FE78D7DD8F4883C3FE6613966362A653FE80E68263B1BFB3FE7369F7D10F6863FE66666666666663FE59D79103A1FBA3FE4DB9608E352C43FE4207E29C0D5E53FE36BF482A783413FE6E5B7D16657E23FE6645DBC0597E73FE5E5DE6318DBC83FE56A29A68AED8E3FE4F12FC15F00C13FE47AE147AE147C3FE4072F24AFB0A73FE96128962B8A153FE91D10418F0C823FE8D9AEA11BD8103FE89701CA9CF25E3FE85507D900A37C3FE813BEEC4AACF63FE7D3252986A5EA3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF02739C65D58BF3FF04ED3B73257833FF076CEBE41BF7A3FF09F2BC99051DD3FF0C7EBC96A56F63FF0F10FB06934B03FF11A98737912E13FF28332F16166A53FF2DA65B57E7F983FF33333333333333FF38DA2F91C82C43FF3E9BCB96FEDF13FF447884AA31CC03FF4A70DA8169F5C3FF7B734C33413AD3FF85899CE90E5E53FF8FE493556F45B3FF9A8602A4B50503FFA56FCA6E7E9C63FFB0A3D70A3D70B3FFBC2421E5F8F004000C58069F8993F4001586C869D8A724001F05FB6735B3840028D86049083C04003300CFDDFFAB14003D823BE552C18400485FAFE93999D4009ED592591221D400B000000000000400C1E044C616F57400D47DE6F15B0FF400E7E0BC7D3E01D400FC10EE66FE364401088B7E0E7B3FF"}}
+{"expression":"pow(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FE96B230BCDC43401623FE731651F09A68E01633FE64C8E84C5F4E9"}}
+{"expression":"pow(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FE96B230BCDC43401623FE731651F09A68E"}}
+{"expression":"pow(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x0101017903036261723FC999999999999A0362617A3FD333333333333303666F6F3FB999999999999A"},"result":{"expect":"0x010201780179090161036261723FE430CD74F6D47801610362617A3FE009B9CF334253016103666F6F3FE96B230BCDC4340162036261723FE731651F09A68E01620362617A3FE3BEBDCC9D061B016203666F6F3FEB3E2D38A030B10163036261723FE926EFF16629A501630362617A3FE64C8E84C5F4E9016303666F6F3FEC5EC42B8B4A19"}}
+{"expression":"pow(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010201780179090161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A0163036261723FE999999999999A01630362617A3FECCCCCCCCCCCCD016303666F6F3FE6666666666666"},"result":{"expect":"0x010201780179090161036261723FE430CD74F6D47801610362617A3FE009B9CF334253016103666F6F3FE96B230BCDC4340162036261723FDC9F25C5BFEDD901620362617A3FD85DE4AA7BFC06016203666F6F3FE0CF4D9B8C79050163036261723FD86D691AD2627A01630362617A3FD5A8131B97FD82016303666F6F3FDB8D809C615F41"}}
+{"expression":"pow(a,b)","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179040161036261723FE731651F09A68E016103666F6F3FE96B230BCDC4340162036261723FE8406003B2AE5C016203666F6F3FE84F1DDC197989"}}
+{"expression":"pow(a,b)","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x01020179017A080362617201693FE000000000000003626172016A3FE333333333333303626172016B3FE666666666666603626172016C3FE999999999999A03666F6F01693FB999999999999A03666F6F016A3FC999999999999A03666F6F016B3FD333333333333303666F6F016C3FD999999999999A"},"result":{"expect":"0x010301780179017A1001610362617201693FDC9F25C5BFEDD9016103626172016A3FD85DE4AA7BFC06016103626172016B3FD4BE914A0AC752016103626172016C3FD1A91920AA33D6016103666F6F01693FE96B230BCDC434016103666F6F016A3FE430CD74F6D478016103666F6F016B3FE009B9CF334253016103666F6F016C3FD97A967F7524B301620362617201693FE6A09E667F3BCD016203626172016A3FE51CB453B9536C016203626172016B3FE3B2C47BFF8329016203626172016C3FE2611186BAE674016203666F6F01693FED32BCC99E79D2016203666F6F016A3FEAA4469FBF1206016203666F6F016B3FE84F1DDC197989016203666F6F016C3FE62E3E1817C1C4"}}
+{"expression":"pow(a,b)","inputs":{"a":"0x030101790101780302036261723FC999999999999A3FD999999999999A3FE333333333333303666F6F3FB999999999999A3FD33333333333333FE0000000000000","b":"0x0301017901017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF666666666666603666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE6666666666666"},"result":{"expect":"0x0301017902017803017A0702036261723FD1A91920AA33D63FCE11FB92951F8D3FC999999999999A3FC5CB57608026F33FC28DEA7F3AEBA63FBF9796142E702A3FBAE548F8E0C1A43FDEBFB0683CD8533FDC0E78CA02BB173FD999999999999A3FD75BCA3AE52E423FD550387FCC0E6C3FD3727E49ADFAD43FD1BE981346349E3FE543E8FBAE1CEA3FE434CDF6C1F4C83FE33333333333333FE23E6C92173EAA3FE155D686D65B7C3FE078D5A9E4CC763FDF4DACA1DA302703666F6F3FE96B230BCDC4343FE430CD74F6D4783FE009B9CF3342533FD97A967F7524B33FD43D136248490F3FD0137987DD704C3FC98A13577C93C13FEC5EC42B8B4A193FE926EFF16629A53FE64C8E84C5F4E93FE3C5064A1418B73FE186F174F884723FDF13F63C03331E3FDB8D809C615F413FEDDB680117AB123FEBDB8CDADBE1203FE9FDF8BCCE533E3FE8406003B2AE5C3FE6A09E667F3BCD3FE51CB453B9536C3FE3B2C47BFF8329"}}
+{"expression":"pow(a,b)","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FE96B230BCDC4343FDC9F25C5BFEDD93FD5A8131B97FD823FD3727E49ADFAD43FD3B2C47BFF83290161016A3FE430CD74F6D4783FD85DE4AA7BFC063FD33333333333333FD1BE981346349E3FD2611186BAE6740161016B3FE009B9CF3342533FD4BE914A0AC7523FD105A8E6ED2C753FD030DC4EA03A733FD125FBEE2506640161016C3FD97A967F7524B33FD1A91920AA33D63FCE2EB9881431F93FCD8BE7091AE7E23FD0000000000000016201693FEE680A48D168723FEAC5EB3F7AB2F83FEA2D7BB1B6C0F13FEBE76765499C1E3FF00000000000000162016A3FECE4658B6543243FE9D5C3DF24FB633FE999999999999A3FEB9C8924C99ABC3FF00000000000000162016B3FEB740EC5D2AA1A3FE8EE06AA5599B03FE908FAEDDB9CD13FEB5273C4AE62A13FF00000000000000162016C3FEA160FDC35D2CB3FE80E68263B1BFB3FE87B8D3F012DD53FEB09252A00B5A63FF0000000000000016301693FF02739C65D58BF3FF186F174F884723FF442E9BB77515D3FF8C776772A337F3FFFE077EA4184BA0163016A3FF04ED3B73257833FF1D980099BA1493FF4CCCCCCCCCCCD3FF9A088BB80392C40009912C0E98B3D0163016B3FF076CEBE41BF7A3FF22D937B32C2D33FF55A5A3EBFA9133FFA810898CE7313400148E6190B6C130163016C3FF09F2BC99051DD3FF28332F16166A53FF5EBAB035ACD4C3FFB693721891CFE4002000000000000"}}
+{"expression":"join(a,b,f(a,b)(pow(a,b)))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FE96B230BCDC434"}}
+{"expression":"join(a,b,f(a,b)(pow(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FE96B230BCDC4343FE731651F09A68E3FE64C8E84C5F4E93FE62E3E1817C1C43FE6A09E667F3BCD"}}
+{"expression":"join(a,b,f(a,b)(pow(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FE96B230BCDC4343FE731651F09A68E3FE64C8E84C5F4E9"}}
+{"expression":"join(a,b,f(a,b)(pow(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FE96B230BCDC4343FE430CD74F6D4783FE009B9CF3342533FD97A967F7524B33FD43D136248490F3FEB3E2D38A030B13FE731651F09A68E3FE3BEBDCC9D061B3FE0CF4D9B8C79053FDC9F25C5BFEDD93FEC5EC42B8B4A193FE926EFF16629A53FE64C8E84C5F4E93FE3C5064A1418B73FE186F174F884723FED32BCC99E79D23FEAA4469FBF12063FE84F1DDC1979893FE62E3E1817C1C43FE43D136248490F3FEDDB680117AB123FEBDB8CDADBE1203FE9FDF8BCCE533E3FE8406003B2AE5C3FE6A09E667F3BCD"}}
+{"expression":"join(a,b,f(a,b)(pow(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FE96B230BCDC4343FE430CD74F6D4783FE009B9CF3342533FD97A967F7524B33FD43D136248490F3FD85DE4AA7BFC063FD4BE914A0AC7523FD1A91920AA33D63FCE11FB92951F8D3FC999999999999A3FD105A8E6ED2C753FCE2EB9881431F93FCAC2449F53F2B03FC7B93ABF4B50DD3FC50854F2C3D2223FCD8BE7091AE7E23FCAF5A24955081F3FC89959ECFD79DC3FC671FA3B35627A3FC47AE147AE147C3FCDDB680117AB123FCBDB8CDADBE11F3FC9FDF8BCCE533E3FC8406003B2AE5D3FC6A09E667F3BCD"}}
+{"expression":"join(a,b,f(a,b)(pow(a,b)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FE96B230BCDC4343FE731651F09A68E3FE64C8E84C5F4E93FE62E3E1817C1C43FE8C97EF43F72483FE9D5C3DF24FB633FEB5F55FBDF12BA3FED69CF10804E693FF16EDC6D3C743C3FF33333333333333FF55A5A3EBFA9133FF7F592E087B65A"}}
+{"expression":"join(a,b,f(a,b)(pow(a,b)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FE96B230BCDC4343FE430CD74F6D4783FE009B9CF3342533FD97A967F7524B33FD43D136248490F3FD0137987DD704C3FC98A13577C93C13FD1A91920AA33D63FCE11FB92951F8D3FC999999999999A3FC5CB57608026F33FC28DEA7F3AEBA63FBF9796142E702A3FBAE548F8E0C1A43FC50854F2C3D2223FC2A593BD9B85113FC08819F76D9F8D3FBD5017B9C942F93FB9FCE3BAB663693FB70A3D70A3D70A3FB46D31151C9BBF3FC10CF9FFD671EF3FBF1D96DC4991553FBC6426853D20FD3FB9E7C6E43390B83FB7A31F3A7BECB53FB5914EA110D34B3FB3ADE18A64617E3FC125FBEE2506643FC00000000000003FBDDB680117AB123FBBDB8CDADBE11F3FB9FDF8BCCE533E3FB8406003B2AE5D3FB6A09E667F3BCD3FEE680A48D168723FECE4658B6543243FEB740EC5D2AA1A3FEA160FDC35D2CB3FE8C97EF43F72483FE78D7DD8F4883C3FE6613966362A653FE80E68263B1BFB3FE7369F7D10F6863FE66666666666663FE59D79103A1FBA3FE4DB9608E352C43FE4207E29C0D5E53FE36BF482A783413FE6E5B7D16657E23FE6645DBC0597E73FE5E5DE6318DBC83FE56A29A68AED8E3FE4F12FC15F00C13FE47AE147AE147C3FE4072F24AFB0A73FE96128962B8A153FE91D10418F0C823FE8D9AEA11BD8103FE89701CA9CF25E3FE85507D900A37C3FE813BEEC4AACF63FE7D3252986A5EA3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF02739C65D58BF3FF04ED3B73257833FF076CEBE41BF7A3FF09F2BC99051DD3FF0C7EBC96A56F63FF0F10FB06934B03FF11A98737912E13FF28332F16166A53FF2DA65B57E7F983FF33333333333333FF38DA2F91C82C43FF3E9BCB96FEDF13FF447884AA31CC03FF4A70DA8169F5C3FF7B734C33413AD3FF85899CE90E5E53FF8FE493556F45B3FF9A8602A4B50503FFA56FCA6E7E9C63FFB0A3D70A3D70B3FFBC2421E5F8F004000C58069F8993F4001586C869D8A724001F05FB6735B3840028D86049083C04003300CFDDFFAB14003D823BE552C18400485FAFE93999D4009ED592591221D400B000000000000400C1E044C616F57400D47DE6F15B0FF400E7E0BC7D3E01D400FC10EE66FE364401088B7E0E7B3FF"}}
+{"expression":"join(a,b,f(a,b)(pow(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FE96B230BCDC43401623FE731651F09A68E01633FE64C8E84C5F4E9"}}
+{"expression":"join(a,b,f(a,b)(pow(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FE96B230BCDC43401623FE731651F09A68E"}}
+{"expression":"join(a,b,f(a,b)(pow(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x0101017903036261723FC999999999999A0362617A3FD333333333333303666F6F3FB999999999999A"},"result":{"expect":"0x010201780179090161036261723FE430CD74F6D47801610362617A3FE009B9CF334253016103666F6F3FE96B230BCDC4340162036261723FE731651F09A68E01620362617A3FE3BEBDCC9D061B016203666F6F3FEB3E2D38A030B10163036261723FE926EFF16629A501630362617A3FE64C8E84C5F4E9016303666F6F3FEC5EC42B8B4A19"}}
+{"expression":"join(a,b,f(a,b)(pow(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010201780179090161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A0163036261723FE999999999999A01630362617A3FECCCCCCCCCCCCD016303666F6F3FE6666666666666"},"result":{"expect":"0x010201780179090161036261723FE430CD74F6D47801610362617A3FE009B9CF334253016103666F6F3FE96B230BCDC4340162036261723FDC9F25C5BFEDD901620362617A3FD85DE4AA7BFC06016203666F6F3FE0CF4D9B8C79050163036261723FD86D691AD2627A01630362617A3FD5A8131B97FD82016303666F6F3FDB8D809C615F41"}}
+{"expression":"join(a,b,f(a,b)(pow(a,b)))","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179040161036261723FE731651F09A68E016103666F6F3FE96B230BCDC4340162036261723FE8406003B2AE5C016203666F6F3FE84F1DDC197989"}}
+{"expression":"join(a,b,f(a,b)(pow(a,b)))","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x01020179017A080362617201693FE000000000000003626172016A3FE333333333333303626172016B3FE666666666666603626172016C3FE999999999999A03666F6F01693FB999999999999A03666F6F016A3FC999999999999A03666F6F016B3FD333333333333303666F6F016C3FD999999999999A"},"result":{"expect":"0x010301780179017A1001610362617201693FDC9F25C5BFEDD9016103626172016A3FD85DE4AA7BFC06016103626172016B3FD4BE914A0AC752016103626172016C3FD1A91920AA33D6016103666F6F01693FE96B230BCDC434016103666F6F016A3FE430CD74F6D478016103666F6F016B3FE009B9CF334253016103666F6F016C3FD97A967F7524B301620362617201693FE6A09E667F3BCD016203626172016A3FE51CB453B9536C016203626172016B3FE3B2C47BFF8329016203626172016C3FE2611186BAE674016203666F6F01693FED32BCC99E79D2016203666F6F016A3FEAA4469FBF1206016203666F6F016B3FE84F1DDC197989016203666F6F016C3FE62E3E1817C1C4"}}
+{"expression":"join(a,b,f(a,b)(pow(a,b)))","inputs":{"a":"0x030101790101780302036261723FC999999999999A3FD999999999999A3FE333333333333303666F6F3FB999999999999A3FD33333333333333FE0000000000000","b":"0x0301017901017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF666666666666603666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE6666666666666"},"result":{"expect":"0x0301017902017803017A0702036261723FD1A91920AA33D63FCE11FB92951F8D3FC999999999999A3FC5CB57608026F33FC28DEA7F3AEBA63FBF9796142E702A3FBAE548F8E0C1A43FDEBFB0683CD8533FDC0E78CA02BB173FD999999999999A3FD75BCA3AE52E423FD550387FCC0E6C3FD3727E49ADFAD43FD1BE981346349E3FE543E8FBAE1CEA3FE434CDF6C1F4C83FE33333333333333FE23E6C92173EAA3FE155D686D65B7C3FE078D5A9E4CC763FDF4DACA1DA302703666F6F3FE96B230BCDC4343FE430CD74F6D4783FE009B9CF3342533FD97A967F7524B33FD43D136248490F3FD0137987DD704C3FC98A13577C93C13FEC5EC42B8B4A193FE926EFF16629A53FE64C8E84C5F4E93FE3C5064A1418B73FE186F174F884723FDF13F63C03331E3FDB8D809C615F413FEDDB680117AB123FEBDB8CDADBE1203FE9FDF8BCCE533E3FE8406003B2AE5C3FE6A09E667F3BCD3FE51CB453B9536C3FE3B2C47BFF8329"}}
+{"expression":"join(a,b,f(a,b)(pow(a,b)))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FE96B230BCDC4343FDC9F25C5BFEDD93FD5A8131B97FD823FD3727E49ADFAD43FD3B2C47BFF83290161016A3FE430CD74F6D4783FD85DE4AA7BFC063FD33333333333333FD1BE981346349E3FD2611186BAE6740161016B3FE009B9CF3342533FD4BE914A0AC7523FD105A8E6ED2C753FD030DC4EA03A733FD125FBEE2506640161016C3FD97A967F7524B33FD1A91920AA33D63FCE2EB9881431F93FCD8BE7091AE7E23FD0000000000000016201693FEE680A48D168723FEAC5EB3F7AB2F83FEA2D7BB1B6C0F13FEBE76765499C1E3FF00000000000000162016A3FECE4658B6543243FE9D5C3DF24FB633FE999999999999A3FEB9C8924C99ABC3FF00000000000000162016B3FEB740EC5D2AA1A3FE8EE06AA5599B03FE908FAEDDB9CD13FEB5273C4AE62A13FF00000000000000162016C3FEA160FDC35D2CB3FE80E68263B1BFB3FE87B8D3F012DD53FEB09252A00B5A63FF0000000000000016301693FF02739C65D58BF3FF186F174F884723FF442E9BB77515D3FF8C776772A337F3FFFE077EA4184BA0163016A3FF04ED3B73257833FF1D980099BA1493FF4CCCCCCCCCCCD3FF9A088BB80392C40009912C0E98B3D0163016B3FF076CEBE41BF7A3FF22D937B32C2D33FF55A5A3EBFA9133FFA810898CE7313400148E6190B6C130163016C3FF09F2BC99051DD3FF28332F16166A53FF5EBAB035ACD4C3FFB693721891CFE4002000000000000"}}
+{"expression":"a==b","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FF0000000000000"}}
+{"expression":"a==b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"a==b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"a==b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000"}}
+{"expression":"a==b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"a==b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"a==b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"a==b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FF000000000000001623FF000000000000001633FF0000000000000"}}
+{"expression":"a==b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FF000000000000001623FF0000000000000"}}
+{"expression":"a==b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x0101017903036261723FC999999999999A0362617A3FD333333333333303666F6F3FB999999999999A"},"result":{"expect":"0x01020178017909016103626172000000000000000001610362617A0000000000000000016103666F6F3FF00000000000000162036261723FF000000000000001620362617A0000000000000000016203666F6F0000000000000000016303626172000000000000000001630362617A3FF0000000000000016303666F6F0000000000000000"}}
+{"expression":"a==b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010201780179090161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A0163036261723FE999999999999A01630362617A3FECCCCCCCCCCCCD016303666F6F3FE6666666666666"},"result":{"expect":"0x01020178017909016103626172000000000000000001610362617A0000000000000000016103666F6F3FF0000000000000016203626172000000000000000001620362617A0000000000000000016203666F6F0000000000000000016303626172000000000000000001630362617A0000000000000000016303666F6F0000000000000000"}}
+{"expression":"a==b","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179040161036261723FF0000000000000016103666F6F3FF00000000000000162036261720000000000000000016203666F6F0000000000000000"}}
+{"expression":"a==b","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x01020179017A080362617201693FE000000000000003626172016A3FE333333333333303626172016B3FE666666666666603626172016C3FE999999999999A03666F6F01693FB999999999999A03666F6F016A3FC999999999999A03666F6F016B3FD333333333333303666F6F016C3FD999999999999A"},"result":{"expect":"0x010301780179017A1001610362617201690000000000000000016103626172016A0000000000000000016103626172016B0000000000000000016103626172016C0000000000000000016103666F6F01693FF0000000000000016103666F6F016A0000000000000000016103666F6F016B0000000000000000016103666F6F016C000000000000000001620362617201693FF0000000000000016203626172016A0000000000000000016203626172016B0000000000000000016203626172016C0000000000000000016203666F6F01690000000000000000016203666F6F016A0000000000000000016203666F6F016B0000000000000000016203666F6F016C3FF0000000000000"}}
+{"expression":"a==b","inputs":{"a":"0x030101790101780302036261723FC999999999999A3FD999999999999A3FE333333333333303666F6F3FB999999999999A3FD33333333333333FE0000000000000","b":"0x0301017901017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF666666666666603666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE6666666666666"},"result":{"expect":"0x0301017902017803017A07020362617200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003666F6F3FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000"}}
+{"expression":"a==b","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FF000000000000000000000000000000000000000000000000000000000000000000000000000000161016A000000000000000000000000000000000000000000000000000000000000000000000000000000000161016B000000000000000000000000000000000000000000000000000000000000000000000000000000000161016C0000000000000000000000000000000000000000000000000000000000000000000000000000000001620169000000000000000000000000000000000000000000000000000000000000000000000000000000000162016A000000000000000000000000000000000000000000000000000000000000000000000000000000000162016B00000000000000003FF00000000000000000000000000000000000000000000000000000000000000162016C0000000000000000000000000000000000000000000000000000000000000000000000000000000001630169000000000000000000000000000000000000000000000000000000000000000000000000000000000163016A0000000000000000000000000000000000000000000000003FF000000000000000000000000000000163016B000000000000000000000000000000000000000000000000000000000000000000000000000000000163016C00000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a==b))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a==b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a==b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a==b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a==b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a==b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a==b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a==b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FF000000000000001623FF000000000000001633FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a==b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FF000000000000001623FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a==b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x0101017903036261723FC999999999999A0362617A3FD333333333333303666F6F3FB999999999999A"},"result":{"expect":"0x01020178017909016103626172000000000000000001610362617A0000000000000000016103666F6F3FF00000000000000162036261723FF000000000000001620362617A0000000000000000016203666F6F0000000000000000016303626172000000000000000001630362617A3FF0000000000000016303666F6F0000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a==b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010201780179090161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A0163036261723FE999999999999A01630362617A3FECCCCCCCCCCCCD016303666F6F3FE6666666666666"},"result":{"expect":"0x01020178017909016103626172000000000000000001610362617A0000000000000000016103666F6F3FF0000000000000016203626172000000000000000001620362617A0000000000000000016203666F6F0000000000000000016303626172000000000000000001630362617A0000000000000000016303666F6F0000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a==b))","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179040161036261723FF0000000000000016103666F6F3FF00000000000000162036261720000000000000000016203666F6F0000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a==b))","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x01020179017A080362617201693FE000000000000003626172016A3FE333333333333303626172016B3FE666666666666603626172016C3FE999999999999A03666F6F01693FB999999999999A03666F6F016A3FC999999999999A03666F6F016B3FD333333333333303666F6F016C3FD999999999999A"},"result":{"expect":"0x010301780179017A1001610362617201690000000000000000016103626172016A0000000000000000016103626172016B0000000000000000016103626172016C0000000000000000016103666F6F01693FF0000000000000016103666F6F016A0000000000000000016103666F6F016B0000000000000000016103666F6F016C000000000000000001620362617201693FF0000000000000016203626172016A0000000000000000016203626172016B0000000000000000016203626172016C0000000000000000016203666F6F01690000000000000000016203666F6F016A0000000000000000016203666F6F016B0000000000000000016203666F6F016C3FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a==b))","inputs":{"a":"0x030101790101780302036261723FC999999999999A3FD999999999999A3FE333333333333303666F6F3FB999999999999A3FD33333333333333FE0000000000000","b":"0x0301017901017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF666666666666603666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE6666666666666"},"result":{"expect":"0x0301017902017803017A07020362617200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003666F6F3FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a==b))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FF000000000000000000000000000000000000000000000000000000000000000000000000000000161016A000000000000000000000000000000000000000000000000000000000000000000000000000000000161016B000000000000000000000000000000000000000000000000000000000000000000000000000000000161016C0000000000000000000000000000000000000000000000000000000000000000000000000000000001620169000000000000000000000000000000000000000000000000000000000000000000000000000000000162016A000000000000000000000000000000000000000000000000000000000000000000000000000000000162016B00000000000000003FF00000000000000000000000000000000000000000000000000000000000000162016C0000000000000000000000000000000000000000000000000000000000000000000000000000000001630169000000000000000000000000000000000000000000000000000000000000000000000000000000000163016A0000000000000000000000000000000000000000000000003FF000000000000000000000000000000163016B000000000000000000000000000000000000000000000000000000000000000000000000000000000163016C00000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"a!=b","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02000000000000000000"}}
+{"expression":"a!=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020101780500000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"a!=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x0201017803000000000000000000000000000000000000000000000000"}}
+{"expression":"a!=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020201780501790500000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000000000000000000"}}
+{"expression":"a!=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x020201780501790500000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"a!=b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x020201780301790400000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"a!=b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A0700000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"a!=b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x0101017803016100000000000000000162000000000000000001630000000000000000"}}
+{"expression":"a!=b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x01010178020161000000000000000001620000000000000000"}}
+{"expression":"a!=b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x0101017903036261723FC999999999999A0362617A3FD333333333333303666F6F3FB999999999999A"},"result":{"expect":"0x010201780179090161036261723FF000000000000001610362617A3FF0000000000000016103666F6F0000000000000000016203626172000000000000000001620362617A3FF0000000000000016203666F6F3FF00000000000000163036261723FF000000000000001630362617A0000000000000000016303666F6F3FF0000000000000"}}
+{"expression":"a!=b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010201780179090161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A0163036261723FE999999999999A01630362617A3FECCCCCCCCCCCCD016303666F6F3FE6666666666666"},"result":{"expect":"0x010201780179090161036261723FF000000000000001610362617A3FF0000000000000016103666F6F00000000000000000162036261723FF000000000000001620362617A3FF0000000000000016203666F6F3FF00000000000000163036261723FF000000000000001630362617A3FF0000000000000016303666F6F3FF0000000000000"}}
+{"expression":"a!=b","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179040161036261720000000000000000016103666F6F00000000000000000162036261723FF0000000000000016203666F6F3FF0000000000000"}}
+{"expression":"a!=b","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x01020179017A080362617201693FE000000000000003626172016A3FE333333333333303626172016B3FE666666666666603626172016C3FE999999999999A03666F6F01693FB999999999999A03666F6F016A3FC999999999999A03666F6F016B3FD333333333333303666F6F016C3FD999999999999A"},"result":{"expect":"0x010301780179017A1001610362617201693FF0000000000000016103626172016A3FF0000000000000016103626172016B3FF0000000000000016103626172016C3FF0000000000000016103666F6F01690000000000000000016103666F6F016A3FF0000000000000016103666F6F016B3FF0000000000000016103666F6F016C3FF000000000000001620362617201690000000000000000016203626172016A3FF0000000000000016203626172016B3FF0000000000000016203626172016C3FF0000000000000016203666F6F01693FF0000000000000016203666F6F016A3FF0000000000000016203666F6F016B3FF0000000000000016203666F6F016C0000000000000000"}}
+{"expression":"a!=b","inputs":{"a":"0x030101790101780302036261723FC999999999999A3FD999999999999A3FE333333333333303666F6F3FB999999999999A3FD33333333333333FE0000000000000","b":"0x0301017901017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF666666666666603666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE6666666666666"},"result":{"expect":"0x0301017902017803017A0702036261723FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000003666F6F00000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000"}}
+{"expression":"a!=b","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C0161016900000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016A3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016B3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016C3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000016201693FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000162016A3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000162016B3FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000162016C3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000016301693FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016A3FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000000163016B3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016C3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a!=b))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a!=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020101780500000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a!=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x0201017803000000000000000000000000000000000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a!=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020201780501790500000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a!=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x020201780501790500000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a!=b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x020201780301790400000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a!=b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A0700000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a!=b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x0101017803016100000000000000000162000000000000000001630000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a!=b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x01010178020161000000000000000001620000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a!=b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x0101017903036261723FC999999999999A0362617A3FD333333333333303666F6F3FB999999999999A"},"result":{"expect":"0x010201780179090161036261723FF000000000000001610362617A3FF0000000000000016103666F6F0000000000000000016203626172000000000000000001620362617A3FF0000000000000016203666F6F3FF00000000000000163036261723FF000000000000001630362617A0000000000000000016303666F6F3FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a!=b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010201780179090161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A0163036261723FE999999999999A01630362617A3FECCCCCCCCCCCCD016303666F6F3FE6666666666666"},"result":{"expect":"0x010201780179090161036261723FF000000000000001610362617A3FF0000000000000016103666F6F00000000000000000162036261723FF000000000000001620362617A3FF0000000000000016203666F6F3FF00000000000000163036261723FF000000000000001630362617A3FF0000000000000016303666F6F3FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a!=b))","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179040161036261720000000000000000016103666F6F00000000000000000162036261723FF0000000000000016203666F6F3FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a!=b))","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x01020179017A080362617201693FE000000000000003626172016A3FE333333333333303626172016B3FE666666666666603626172016C3FE999999999999A03666F6F01693FB999999999999A03666F6F016A3FC999999999999A03666F6F016B3FD333333333333303666F6F016C3FD999999999999A"},"result":{"expect":"0x010301780179017A1001610362617201693FF0000000000000016103626172016A3FF0000000000000016103626172016B3FF0000000000000016103626172016C3FF0000000000000016103666F6F01690000000000000000016103666F6F016A3FF0000000000000016103666F6F016B3FF0000000000000016103666F6F016C3FF000000000000001620362617201690000000000000000016203626172016A3FF0000000000000016203626172016B3FF0000000000000016203626172016C3FF0000000000000016203666F6F01693FF0000000000000016203666F6F016A3FF0000000000000016203666F6F016B3FF0000000000000016203666F6F016C0000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a!=b))","inputs":{"a":"0x030101790101780302036261723FC999999999999A3FD999999999999A3FE333333333333303666F6F3FB999999999999A3FD33333333333333FE0000000000000","b":"0x0301017901017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF666666666666603666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE6666666666666"},"result":{"expect":"0x0301017902017803017A0702036261723FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000003666F6F00000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a!=b))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C0161016900000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016A3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016B3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016C3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000016201693FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000162016A3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000162016B3FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000162016C3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000016301693FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016A3FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000000163016B3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016C3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"a~=b","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FF0000000000000"}}
+{"expression":"a~=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"a~=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"a~=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000"}}
+{"expression":"a~=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"a~=b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"a~=b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"a~=b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FF000000000000001623FF000000000000001633FF0000000000000"}}
+{"expression":"a~=b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FF000000000000001623FF0000000000000"}}
+{"expression":"a~=b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x0101017903036261723FC999999999999A0362617A3FD333333333333303666F6F3FB999999999999A"},"result":{"expect":"0x01020178017909016103626172000000000000000001610362617A0000000000000000016103666F6F3FF00000000000000162036261723FF000000000000001620362617A0000000000000000016203666F6F0000000000000000016303626172000000000000000001630362617A3FF0000000000000016303666F6F0000000000000000"}}
+{"expression":"a~=b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010201780179090161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A0163036261723FE999999999999A01630362617A3FECCCCCCCCCCCCD016303666F6F3FE6666666666666"},"result":{"expect":"0x01020178017909016103626172000000000000000001610362617A0000000000000000016103666F6F3FF0000000000000016203626172000000000000000001620362617A0000000000000000016203666F6F0000000000000000016303626172000000000000000001630362617A0000000000000000016303666F6F0000000000000000"}}
+{"expression":"a~=b","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179040161036261723FF0000000000000016103666F6F3FF00000000000000162036261720000000000000000016203666F6F0000000000000000"}}
+{"expression":"a~=b","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x01020179017A080362617201693FE000000000000003626172016A3FE333333333333303626172016B3FE666666666666603626172016C3FE999999999999A03666F6F01693FB999999999999A03666F6F016A3FC999999999999A03666F6F016B3FD333333333333303666F6F016C3FD999999999999A"},"result":{"expect":"0x010301780179017A1001610362617201690000000000000000016103626172016A0000000000000000016103626172016B0000000000000000016103626172016C0000000000000000016103666F6F01693FF0000000000000016103666F6F016A0000000000000000016103666F6F016B0000000000000000016103666F6F016C000000000000000001620362617201693FF0000000000000016203626172016A0000000000000000016203626172016B0000000000000000016203626172016C0000000000000000016203666F6F01690000000000000000016203666F6F016A0000000000000000016203666F6F016B0000000000000000016203666F6F016C3FF0000000000000"}}
+{"expression":"a~=b","inputs":{"a":"0x030101790101780302036261723FC999999999999A3FD999999999999A3FE333333333333303666F6F3FB999999999999A3FD33333333333333FE0000000000000","b":"0x0301017901017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF666666666666603666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE6666666666666"},"result":{"expect":"0x0301017902017803017A07020362617200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003666F6F3FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000"}}
+{"expression":"a~=b","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FF000000000000000000000000000000000000000000000000000000000000000000000000000000161016A000000000000000000000000000000000000000000000000000000000000000000000000000000000161016B000000000000000000000000000000000000000000000000000000000000000000000000000000000161016C0000000000000000000000000000000000000000000000000000000000000000000000000000000001620169000000000000000000000000000000000000000000000000000000000000000000000000000000000162016A000000000000000000000000000000000000000000000000000000000000000000000000000000000162016B00000000000000003FF00000000000000000000000000000000000000000000000000000000000000162016C0000000000000000000000000000000000000000000000000000000000000000000000000000000001630169000000000000000000000000000000000000000000000000000000000000000000000000000000000163016A0000000000000000000000000000000000000000000000003FF000000000000000000000000000000163016B000000000000000000000000000000000000000000000000000000000000000000000000000000000163016C00000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a~=b))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a~=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a~=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a~=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a~=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a~=b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a~=b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a~=b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FF000000000000001623FF000000000000001633FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a~=b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FF000000000000001623FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a~=b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x0101017903036261723FC999999999999A0362617A3FD333333333333303666F6F3FB999999999999A"},"result":{"expect":"0x01020178017909016103626172000000000000000001610362617A0000000000000000016103666F6F3FF00000000000000162036261723FF000000000000001620362617A0000000000000000016203666F6F0000000000000000016303626172000000000000000001630362617A3FF0000000000000016303666F6F0000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a~=b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010201780179090161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A0163036261723FE999999999999A01630362617A3FECCCCCCCCCCCCD016303666F6F3FE6666666666666"},"result":{"expect":"0x01020178017909016103626172000000000000000001610362617A0000000000000000016103666F6F3FF0000000000000016203626172000000000000000001620362617A0000000000000000016203666F6F0000000000000000016303626172000000000000000001630362617A0000000000000000016303666F6F0000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a~=b))","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179040161036261723FF0000000000000016103666F6F3FF00000000000000162036261720000000000000000016203666F6F0000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a~=b))","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x01020179017A080362617201693FE000000000000003626172016A3FE333333333333303626172016B3FE666666666666603626172016C3FE999999999999A03666F6F01693FB999999999999A03666F6F016A3FC999999999999A03666F6F016B3FD333333333333303666F6F016C3FD999999999999A"},"result":{"expect":"0x010301780179017A1001610362617201690000000000000000016103626172016A0000000000000000016103626172016B0000000000000000016103626172016C0000000000000000016103666F6F01693FF0000000000000016103666F6F016A0000000000000000016103666F6F016B0000000000000000016103666F6F016C000000000000000001620362617201693FF0000000000000016203626172016A0000000000000000016203626172016B0000000000000000016203626172016C0000000000000000016203666F6F01690000000000000000016203666F6F016A0000000000000000016203666F6F016B0000000000000000016203666F6F016C3FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a~=b))","inputs":{"a":"0x030101790101780302036261723FC999999999999A3FD999999999999A3FE333333333333303666F6F3FB999999999999A3FD33333333333333FE0000000000000","b":"0x0301017901017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF666666666666603666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE6666666666666"},"result":{"expect":"0x0301017902017803017A07020362617200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003666F6F3FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a~=b))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FF000000000000000000000000000000000000000000000000000000000000000000000000000000161016A000000000000000000000000000000000000000000000000000000000000000000000000000000000161016B000000000000000000000000000000000000000000000000000000000000000000000000000000000161016C0000000000000000000000000000000000000000000000000000000000000000000000000000000001620169000000000000000000000000000000000000000000000000000000000000000000000000000000000162016A000000000000000000000000000000000000000000000000000000000000000000000000000000000162016B00000000000000003FF00000000000000000000000000000000000000000000000000000000000000162016C0000000000000000000000000000000000000000000000000000000000000000000000000000000001630169000000000000000000000000000000000000000000000000000000000000000000000000000000000163016A0000000000000000000000000000000000000000000000003FF000000000000000000000000000000163016B000000000000000000000000000000000000000000000000000000000000000000000000000000000163016C00000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"a<b","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02000000000000000000"}}
+{"expression":"a<b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020101780500000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"a<b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x0201017803000000000000000000000000000000000000000000000000"}}
+{"expression":"a<b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020201780501790500000000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"a<b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x020201780501790500000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"a<b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x0202017803017904000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"a<b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A0700000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"a<b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x0101017803016100000000000000000162000000000000000001630000000000000000"}}
+{"expression":"a<b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x01010178020161000000000000000001620000000000000000"}}
+{"expression":"a<b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x0101017903036261723FC999999999999A0362617A3FD333333333333303666F6F3FB999999999999A"},"result":{"expect":"0x010201780179090161036261723FF000000000000001610362617A3FF0000000000000016103666F6F0000000000000000016203626172000000000000000001620362617A3FF0000000000000016203666F6F0000000000000000016303626172000000000000000001630362617A0000000000000000016303666F6F0000000000000000"}}
+{"expression":"a<b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010201780179090161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A0163036261723FE999999999999A01630362617A3FECCCCCCCCCCCCD016303666F6F3FE6666666666666"},"result":{"expect":"0x010201780179090161036261723FF000000000000001610362617A3FF0000000000000016103666F6F00000000000000000162036261723FF000000000000001620362617A3FF0000000000000016203666F6F3FF00000000000000163036261723FF000000000000001630362617A3FF0000000000000016303666F6F3FF0000000000000"}}
+{"expression":"a<b","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179040161036261720000000000000000016103666F6F00000000000000000162036261720000000000000000016203666F6F0000000000000000"}}
+{"expression":"a<b","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x01020179017A080362617201693FE000000000000003626172016A3FE333333333333303626172016B3FE666666666666603626172016C3FE999999999999A03666F6F01693FB999999999999A03666F6F016A3FC999999999999A03666F6F016B3FD333333333333303666F6F016C3FD999999999999A"},"result":{"expect":"0x010301780179017A1001610362617201693FF0000000000000016103626172016A3FF0000000000000016103626172016B3FF0000000000000016103626172016C3FF0000000000000016103666F6F01690000000000000000016103666F6F016A3FF0000000000000016103666F6F016B3FF0000000000000016103666F6F016C3FF000000000000001620362617201690000000000000000016203626172016A3FF0000000000000016203626172016B3FF0000000000000016203626172016C3FF0000000000000016203666F6F01690000000000000000016203666F6F016A0000000000000000016203666F6F016B0000000000000000016203666F6F016C0000000000000000"}}
+{"expression":"a<b","inputs":{"a":"0x030101790101780302036261723FC999999999999A3FD999999999999A3FE333333333333303666F6F3FB999999999999A3FD33333333333333FE0000000000000","b":"0x0301017901017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF666666666666603666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE6666666666666"},"result":{"expect":"0x0301017902017803017A0702036261723FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000003666F6F00000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF0000000000000"}}
+{"expression":"a<b","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C0161016900000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016A3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016B3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016C3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000001620169000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000162016A000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000162016B000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000162016C00000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016900000000000000000000000000000000000000000000000000000000000000003FF00000000000000163016A00000000000000000000000000000000000000000000000000000000000000003FF00000000000000163016B0000000000000000000000000000000000000000000000003FF00000000000003FF00000000000000163016C0000000000000000000000000000000000000000000000003FF00000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a<b))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a<b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020101780500000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a<b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x0201017803000000000000000000000000000000000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a<b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020201780501790500000000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a<b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x020201780501790500000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a<b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x0202017803017904000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a<b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A0700000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a<b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x0101017803016100000000000000000162000000000000000001630000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a<b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x01010178020161000000000000000001620000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a<b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x0101017903036261723FC999999999999A0362617A3FD333333333333303666F6F3FB999999999999A"},"result":{"expect":"0x010201780179090161036261723FF000000000000001610362617A3FF0000000000000016103666F6F0000000000000000016203626172000000000000000001620362617A3FF0000000000000016203666F6F0000000000000000016303626172000000000000000001630362617A0000000000000000016303666F6F0000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a<b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010201780179090161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A0163036261723FE999999999999A01630362617A3FECCCCCCCCCCCCD016303666F6F3FE6666666666666"},"result":{"expect":"0x010201780179090161036261723FF000000000000001610362617A3FF0000000000000016103666F6F00000000000000000162036261723FF000000000000001620362617A3FF0000000000000016203666F6F3FF00000000000000163036261723FF000000000000001630362617A3FF0000000000000016303666F6F3FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a<b))","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179040161036261720000000000000000016103666F6F00000000000000000162036261720000000000000000016203666F6F0000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a<b))","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x01020179017A080362617201693FE000000000000003626172016A3FE333333333333303626172016B3FE666666666666603626172016C3FE999999999999A03666F6F01693FB999999999999A03666F6F016A3FC999999999999A03666F6F016B3FD333333333333303666F6F016C3FD999999999999A"},"result":{"expect":"0x010301780179017A1001610362617201693FF0000000000000016103626172016A3FF0000000000000016103626172016B3FF0000000000000016103626172016C3FF0000000000000016103666F6F01690000000000000000016103666F6F016A3FF0000000000000016103666F6F016B3FF0000000000000016103666F6F016C3FF000000000000001620362617201690000000000000000016203626172016A3FF0000000000000016203626172016B3FF0000000000000016203626172016C3FF0000000000000016203666F6F01690000000000000000016203666F6F016A0000000000000000016203666F6F016B0000000000000000016203666F6F016C0000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a<b))","inputs":{"a":"0x030101790101780302036261723FC999999999999A3FD999999999999A3FE333333333333303666F6F3FB999999999999A3FD33333333333333FE0000000000000","b":"0x0301017901017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF666666666666603666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE6666666666666"},"result":{"expect":"0x0301017902017803017A0702036261723FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000003666F6F00000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a<b))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C0161016900000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016A3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016B3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016C3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000001620169000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000162016A000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000162016B000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000162016C00000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016900000000000000000000000000000000000000000000000000000000000000003FF00000000000000163016A00000000000000000000000000000000000000000000000000000000000000003FF00000000000000163016B0000000000000000000000000000000000000000000000003FF00000000000003FF00000000000000163016C0000000000000000000000000000000000000000000000003FF00000000000003FF0000000000000"}}
+{"expression":"a<=b","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FF0000000000000"}}
+{"expression":"a<=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"a<=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"a<=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000"}}
+{"expression":"a<=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"a<=b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"a<=b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"a<=b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FF000000000000001623FF000000000000001633FF0000000000000"}}
+{"expression":"a<=b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FF000000000000001623FF0000000000000"}}
+{"expression":"a<=b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x0101017903036261723FC999999999999A0362617A3FD333333333333303666F6F3FB999999999999A"},"result":{"expect":"0x010201780179090161036261723FF000000000000001610362617A3FF0000000000000016103666F6F3FF00000000000000162036261723FF000000000000001620362617A3FF0000000000000016203666F6F0000000000000000016303626172000000000000000001630362617A3FF0000000000000016303666F6F0000000000000000"}}
+{"expression":"a<=b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010201780179090161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A0163036261723FE999999999999A01630362617A3FECCCCCCCCCCCCD016303666F6F3FE6666666666666"},"result":{"expect":"0x010201780179090161036261723FF000000000000001610362617A3FF0000000000000016103666F6F3FF00000000000000162036261723FF000000000000001620362617A3FF0000000000000016203666F6F3FF00000000000000163036261723FF000000000000001630362617A3FF0000000000000016303666F6F3FF0000000000000"}}
+{"expression":"a<=b","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179040161036261723FF0000000000000016103666F6F3FF00000000000000162036261720000000000000000016203666F6F0000000000000000"}}
+{"expression":"a<=b","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x01020179017A080362617201693FE000000000000003626172016A3FE333333333333303626172016B3FE666666666666603626172016C3FE999999999999A03666F6F01693FB999999999999A03666F6F016A3FC999999999999A03666F6F016B3FD333333333333303666F6F016C3FD999999999999A"},"result":{"expect":"0x010301780179017A1001610362617201693FF0000000000000016103626172016A3FF0000000000000016103626172016B3FF0000000000000016103626172016C3FF0000000000000016103666F6F01693FF0000000000000016103666F6F016A3FF0000000000000016103666F6F016B3FF0000000000000016103666F6F016C3FF000000000000001620362617201693FF0000000000000016203626172016A3FF0000000000000016203626172016B3FF0000000000000016203626172016C3FF0000000000000016203666F6F01690000000000000000016203666F6F016A0000000000000000016203666F6F016B0000000000000000016203666F6F016C3FF0000000000000"}}
+{"expression":"a<=b","inputs":{"a":"0x030101790101780302036261723FC999999999999A3FD999999999999A3FE333333333333303666F6F3FB999999999999A3FD33333333333333FE0000000000000","b":"0x0301017901017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF666666666666603666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE6666666666666"},"result":{"expect":"0x0301017902017803017A0702036261723FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000003666F6F3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"a<=b","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016A3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016B3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016C3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000001620169000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000162016A000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000162016B00000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000162016C00000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016900000000000000000000000000000000000000000000000000000000000000003FF00000000000000163016A0000000000000000000000000000000000000000000000003FF00000000000003FF00000000000000163016B0000000000000000000000000000000000000000000000003FF00000000000003FF00000000000000163016C0000000000000000000000000000000000000000000000003FF00000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a<=b))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a<=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a<=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a<=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a<=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a<=b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a<=b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a<=b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FF000000000000001623FF000000000000001633FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a<=b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FF000000000000001623FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a<=b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x0101017903036261723FC999999999999A0362617A3FD333333333333303666F6F3FB999999999999A"},"result":{"expect":"0x010201780179090161036261723FF000000000000001610362617A3FF0000000000000016103666F6F3FF00000000000000162036261723FF000000000000001620362617A3FF0000000000000016203666F6F0000000000000000016303626172000000000000000001630362617A3FF0000000000000016303666F6F0000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a<=b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010201780179090161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A0163036261723FE999999999999A01630362617A3FECCCCCCCCCCCCD016303666F6F3FE6666666666666"},"result":{"expect":"0x010201780179090161036261723FF000000000000001610362617A3FF0000000000000016103666F6F3FF00000000000000162036261723FF000000000000001620362617A3FF0000000000000016203666F6F3FF00000000000000163036261723FF000000000000001630362617A3FF0000000000000016303666F6F3FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a<=b))","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179040161036261723FF0000000000000016103666F6F3FF00000000000000162036261720000000000000000016203666F6F0000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a<=b))","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x01020179017A080362617201693FE000000000000003626172016A3FE333333333333303626172016B3FE666666666666603626172016C3FE999999999999A03666F6F01693FB999999999999A03666F6F016A3FC999999999999A03666F6F016B3FD333333333333303666F6F016C3FD999999999999A"},"result":{"expect":"0x010301780179017A1001610362617201693FF0000000000000016103626172016A3FF0000000000000016103626172016B3FF0000000000000016103626172016C3FF0000000000000016103666F6F01693FF0000000000000016103666F6F016A3FF0000000000000016103666F6F016B3FF0000000000000016103666F6F016C3FF000000000000001620362617201693FF0000000000000016203626172016A3FF0000000000000016203626172016B3FF0000000000000016203626172016C3FF0000000000000016203666F6F01690000000000000000016203666F6F016A0000000000000000016203666F6F016B0000000000000000016203666F6F016C3FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a<=b))","inputs":{"a":"0x030101790101780302036261723FC999999999999A3FD999999999999A3FE333333333333303666F6F3FB999999999999A3FD33333333333333FE0000000000000","b":"0x0301017901017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF666666666666603666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE6666666666666"},"result":{"expect":"0x0301017902017803017A0702036261723FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000003666F6F3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a<=b))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016A3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016B3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016C3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000001620169000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000162016A000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000000162016B00000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000162016C00000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016900000000000000000000000000000000000000000000000000000000000000003FF00000000000000163016A0000000000000000000000000000000000000000000000003FF00000000000003FF00000000000000163016B0000000000000000000000000000000000000000000000003FF00000000000003FF00000000000000163016C0000000000000000000000000000000000000000000000003FF00000000000003FF0000000000000"}}
+{"expression":"a>b","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02000000000000000000"}}
+{"expression":"a>b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020101780500000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"a>b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x0201017803000000000000000000000000000000000000000000000000"}}
+{"expression":"a>b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x0202017805017905000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000000000000000000"}}
+{"expression":"a>b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"a>b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x020201780301790400000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"a>b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"a>b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x0101017803016100000000000000000162000000000000000001630000000000000000"}}
+{"expression":"a>b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x01010178020161000000000000000001620000000000000000"}}
+{"expression":"a>b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x0101017903036261723FC999999999999A0362617A3FD333333333333303666F6F3FB999999999999A"},"result":{"expect":"0x01020178017909016103626172000000000000000001610362617A0000000000000000016103666F6F0000000000000000016203626172000000000000000001620362617A0000000000000000016203666F6F3FF00000000000000163036261723FF000000000000001630362617A0000000000000000016303666F6F3FF0000000000000"}}
+{"expression":"a>b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010201780179090161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A0163036261723FE999999999999A01630362617A3FECCCCCCCCCCCCD016303666F6F3FE6666666666666"},"result":{"expect":"0x01020178017909016103626172000000000000000001610362617A0000000000000000016103666F6F0000000000000000016203626172000000000000000001620362617A0000000000000000016203666F6F0000000000000000016303626172000000000000000001630362617A0000000000000000016303666F6F0000000000000000"}}
+{"expression":"a>b","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179040161036261720000000000000000016103666F6F00000000000000000162036261723FF0000000000000016203666F6F3FF0000000000000"}}
+{"expression":"a>b","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x01020179017A080362617201693FE000000000000003626172016A3FE333333333333303626172016B3FE666666666666603626172016C3FE999999999999A03666F6F01693FB999999999999A03666F6F016A3FC999999999999A03666F6F016B3FD333333333333303666F6F016C3FD999999999999A"},"result":{"expect":"0x010301780179017A1001610362617201690000000000000000016103626172016A0000000000000000016103626172016B0000000000000000016103626172016C0000000000000000016103666F6F01690000000000000000016103666F6F016A0000000000000000016103666F6F016B0000000000000000016103666F6F016C000000000000000001620362617201690000000000000000016203626172016A0000000000000000016203626172016B0000000000000000016203626172016C0000000000000000016203666F6F01693FF0000000000000016203666F6F016A3FF0000000000000016203666F6F016B3FF0000000000000016203666F6F016C0000000000000000"}}
+{"expression":"a>b","inputs":{"a":"0x030101790101780302036261723FC999999999999A3FD999999999999A3FE333333333333303666F6F3FB999999999999A3FD33333333333333FE0000000000000","b":"0x0301017901017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF666666666666603666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE6666666666666"},"result":{"expect":"0x0301017902017803017A07020362617200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003666F6F00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"a>b","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C01610169000000000000000000000000000000000000000000000000000000000000000000000000000000000161016A000000000000000000000000000000000000000000000000000000000000000000000000000000000161016B000000000000000000000000000000000000000000000000000000000000000000000000000000000161016C00000000000000000000000000000000000000000000000000000000000000000000000000000000016201693FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000162016A3FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000162016B3FF000000000000000000000000000000000000000000000000000000000000000000000000000000162016C3FF00000000000000000000000000000000000000000000000000000000000000000000000000000016301693FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000163016A3FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000000163016B3FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000000163016C3FF00000000000003FF00000000000003FF000000000000000000000000000000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a>b))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a>b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020101780500000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a>b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x0201017803000000000000000000000000000000000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a>b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x0202017805017905000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a>b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a>b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x020201780301790400000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a>b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a>b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x0101017803016100000000000000000162000000000000000001630000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a>b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x01010178020161000000000000000001620000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a>b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x0101017903036261723FC999999999999A0362617A3FD333333333333303666F6F3FB999999999999A"},"result":{"expect":"0x01020178017909016103626172000000000000000001610362617A0000000000000000016103666F6F0000000000000000016203626172000000000000000001620362617A0000000000000000016203666F6F3FF00000000000000163036261723FF000000000000001630362617A0000000000000000016303666F6F3FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a>b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010201780179090161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A0163036261723FE999999999999A01630362617A3FECCCCCCCCCCCCD016303666F6F3FE6666666666666"},"result":{"expect":"0x01020178017909016103626172000000000000000001610362617A0000000000000000016103666F6F0000000000000000016203626172000000000000000001620362617A0000000000000000016203666F6F0000000000000000016303626172000000000000000001630362617A0000000000000000016303666F6F0000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a>b))","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179040161036261720000000000000000016103666F6F00000000000000000162036261723FF0000000000000016203666F6F3FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a>b))","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x01020179017A080362617201693FE000000000000003626172016A3FE333333333333303626172016B3FE666666666666603626172016C3FE999999999999A03666F6F01693FB999999999999A03666F6F016A3FC999999999999A03666F6F016B3FD333333333333303666F6F016C3FD999999999999A"},"result":{"expect":"0x010301780179017A1001610362617201690000000000000000016103626172016A0000000000000000016103626172016B0000000000000000016103626172016C0000000000000000016103666F6F01690000000000000000016103666F6F016A0000000000000000016103666F6F016B0000000000000000016103666F6F016C000000000000000001620362617201690000000000000000016203626172016A0000000000000000016203626172016B0000000000000000016203626172016C0000000000000000016203666F6F01693FF0000000000000016203666F6F016A3FF0000000000000016203666F6F016B3FF0000000000000016203666F6F016C0000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a>b))","inputs":{"a":"0x030101790101780302036261723FC999999999999A3FD999999999999A3FE333333333333303666F6F3FB999999999999A3FD33333333333333FE0000000000000","b":"0x0301017901017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF666666666666603666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE6666666666666"},"result":{"expect":"0x0301017902017803017A07020362617200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003666F6F00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a>b))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C01610169000000000000000000000000000000000000000000000000000000000000000000000000000000000161016A000000000000000000000000000000000000000000000000000000000000000000000000000000000161016B000000000000000000000000000000000000000000000000000000000000000000000000000000000161016C00000000000000000000000000000000000000000000000000000000000000000000000000000000016201693FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000162016A3FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000162016B3FF000000000000000000000000000000000000000000000000000000000000000000000000000000162016C3FF00000000000000000000000000000000000000000000000000000000000000000000000000000016301693FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000163016A3FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000000163016B3FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000000163016C3FF00000000000003FF00000000000003FF000000000000000000000000000000000000000000000"}}
+{"expression":"a>=b","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FF0000000000000"}}
+{"expression":"a>=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"a>=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"a>=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"a>=b","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"a>=b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"a>=b","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"a>=b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FF000000000000001623FF000000000000001633FF0000000000000"}}
+{"expression":"a>=b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FF000000000000001623FF0000000000000"}}
+{"expression":"a>=b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x0101017903036261723FC999999999999A0362617A3FD333333333333303666F6F3FB999999999999A"},"result":{"expect":"0x01020178017909016103626172000000000000000001610362617A0000000000000000016103666F6F3FF00000000000000162036261723FF000000000000001620362617A0000000000000000016203666F6F3FF00000000000000163036261723FF000000000000001630362617A3FF0000000000000016303666F6F3FF0000000000000"}}
+{"expression":"a>=b","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010201780179090161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A0163036261723FE999999999999A01630362617A3FECCCCCCCCCCCCD016303666F6F3FE6666666666666"},"result":{"expect":"0x01020178017909016103626172000000000000000001610362617A0000000000000000016103666F6F3FF0000000000000016203626172000000000000000001620362617A0000000000000000016203666F6F0000000000000000016303626172000000000000000001630362617A0000000000000000016303666F6F0000000000000000"}}
+{"expression":"a>=b","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179040161036261723FF0000000000000016103666F6F3FF00000000000000162036261723FF0000000000000016203666F6F3FF0000000000000"}}
+{"expression":"a>=b","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x01020179017A080362617201693FE000000000000003626172016A3FE333333333333303626172016B3FE666666666666603626172016C3FE999999999999A03666F6F01693FB999999999999A03666F6F016A3FC999999999999A03666F6F016B3FD333333333333303666F6F016C3FD999999999999A"},"result":{"expect":"0x010301780179017A1001610362617201690000000000000000016103626172016A0000000000000000016103626172016B0000000000000000016103626172016C0000000000000000016103666F6F01693FF0000000000000016103666F6F016A0000000000000000016103666F6F016B0000000000000000016103666F6F016C000000000000000001620362617201693FF0000000000000016203626172016A0000000000000000016203626172016B0000000000000000016203626172016C0000000000000000016203666F6F01693FF0000000000000016203666F6F016A3FF0000000000000016203666F6F016B3FF0000000000000016203666F6F016C3FF0000000000000"}}
+{"expression":"a>=b","inputs":{"a":"0x030101790101780302036261723FC999999999999A3FD999999999999A3FE333333333333303666F6F3FB999999999999A3FD33333333333333FE0000000000000","b":"0x0301017901017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF666666666666603666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE6666666666666"},"result":{"expect":"0x0301017902017803017A07020362617200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003666F6F3FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000000000000000000"}}
+{"expression":"a>=b","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FF000000000000000000000000000000000000000000000000000000000000000000000000000000161016A000000000000000000000000000000000000000000000000000000000000000000000000000000000161016B000000000000000000000000000000000000000000000000000000000000000000000000000000000161016C00000000000000000000000000000000000000000000000000000000000000000000000000000000016201693FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000162016A3FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000162016B3FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000162016C3FF00000000000000000000000000000000000000000000000000000000000000000000000000000016301693FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000163016A3FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000163016B3FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000000163016C3FF00000000000003FF00000000000003FF000000000000000000000000000000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a>=b))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a>=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a>=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a>=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a>=b))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a>=b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a>=b))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a>=b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FF000000000000001623FF000000000000001633FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a>=b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FF000000000000001623FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a>=b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x0101017903036261723FC999999999999A0362617A3FD333333333333303666F6F3FB999999999999A"},"result":{"expect":"0x01020178017909016103626172000000000000000001610362617A0000000000000000016103666F6F3FF00000000000000162036261723FF000000000000001620362617A0000000000000000016203666F6F3FF00000000000000163036261723FF000000000000001630362617A3FF0000000000000016303666F6F3FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a>=b))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010201780179090161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A0163036261723FE999999999999A01630362617A3FECCCCCCCCCCCCD016303666F6F3FE6666666666666"},"result":{"expect":"0x01020178017909016103626172000000000000000001610362617A0000000000000000016103666F6F3FF0000000000000016203626172000000000000000001620362617A0000000000000000016203666F6F0000000000000000016303626172000000000000000001630362617A0000000000000000016303666F6F0000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a>=b))","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179040161036261723FF0000000000000016103666F6F3FF00000000000000162036261723FF0000000000000016203666F6F3FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a>=b))","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x01020179017A080362617201693FE000000000000003626172016A3FE333333333333303626172016B3FE666666666666603626172016C3FE999999999999A03666F6F01693FB999999999999A03666F6F016A3FC999999999999A03666F6F016B3FD333333333333303666F6F016C3FD999999999999A"},"result":{"expect":"0x010301780179017A1001610362617201690000000000000000016103626172016A0000000000000000016103626172016B0000000000000000016103626172016C0000000000000000016103666F6F01693FF0000000000000016103666F6F016A0000000000000000016103666F6F016B0000000000000000016103666F6F016C000000000000000001620362617201693FF0000000000000016203626172016A0000000000000000016203626172016B0000000000000000016203626172016C0000000000000000016203666F6F01693FF0000000000000016203666F6F016A3FF0000000000000016203666F6F016B3FF0000000000000016203666F6F016C3FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a>=b))","inputs":{"a":"0x030101790101780302036261723FC999999999999A3FD999999999999A3FE333333333333303666F6F3FB999999999999A3FD33333333333333FE0000000000000","b":"0x0301017901017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF666666666666603666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE6666666666666"},"result":{"expect":"0x0301017902017803017A07020362617200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003666F6F3FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a>=b))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FF000000000000000000000000000000000000000000000000000000000000000000000000000000161016A000000000000000000000000000000000000000000000000000000000000000000000000000000000161016B000000000000000000000000000000000000000000000000000000000000000000000000000000000161016C00000000000000000000000000000000000000000000000000000000000000000000000000000000016201693FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000162016A3FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000162016B3FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000162016C3FF00000000000000000000000000000000000000000000000000000000000000000000000000000016301693FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000163016A3FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000000163016B3FF00000000000003FF00000000000003FF0000000000000000000000000000000000000000000000163016C3FF00000000000003FF00000000000003FF000000000000000000000000000000000000000000000"}}
+{"expression":"a&&b","inputs":{"a":"0x02000000000000000000","b":"0x02000000000000000000"},"result":{"expect":"0x02000000000000000000"}}
+{"expression":"a&&b","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"}}
+{"expression":"a&&b","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020101780300000000000000003FF00000000000003FF0000000000000"},"result":{"expect":"0x020101780300000000000000003FF00000000000003FF0000000000000"}}
+{"expression":"a&&b","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020101790500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x02020178050179050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"}}
+{"expression":"a&&b","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020201780501790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000"},"result":{"expect":"0x0202017805017905000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000"}}
+{"expression":"a&&b","inputs":{"a":"0x020201780301790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000","b":"0x020201780401790400000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000"},"result":{"expect":"0x020201780301790400000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF00000000000003FF0000000000000000000000000000000000000000000003FF0000000000000"}}
+{"expression":"a&&b","inputs":{"a":"0x020201780301790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000","b":"0x0202017905017A0700000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x0203017803017905017A0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"}}
+{"expression":"a&&b","inputs":{"a":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000","b":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000"},"result":{"expect":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000"}}
+{"expression":"a&&b","inputs":{"a":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000","b":"0x01010178020161000000000000000001623FF0000000000000"},"result":{"expect":"0x01010178020161000000000000000001623FF0000000000000"}}
+{"expression":"a&&b","inputs":{"a":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000","b":"0x0101017903036261723FF00000000000000362617A3FF000000000000003666F6F0000000000000000"},"result":{"expect":"0x01020178017909016103626172000000000000000001610362617A0000000000000000016103666F6F00000000000000000162036261723FF000000000000001620362617A3FF0000000000000016203666F6F00000000000000000163036261723FF000000000000001630362617A3FF0000000000000016303666F6F0000000000000000"}}
+{"expression":"a&&b","inputs":{"a":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000","b":"0x010201780179090161036261723FF000000000000001610362617A3FF0000000000000016103666F6F00000000000000000162036261723FF000000000000001620362617A3FF0000000000000016203666F6F00000000000000000163036261723FF000000000000001630362617A3FF0000000000000016303666F6F0000000000000000"},"result":{"expect":"0x01020178017909016103626172000000000000000001610362617A0000000000000000016103666F6F00000000000000000162036261723FF000000000000001620362617A3FF0000000000000016203666F6F00000000000000000163036261723FF000000000000001630362617A3FF0000000000000016303666F6F0000000000000000"}}
+{"expression":"a&&b","inputs":{"a":"0x010201780179060161036261723FF000000000000001610362617A3FF0000000000000016103666F6F00000000000000000162036261723FF000000000000001620362617A3FF0000000000000016203666F6F0000000000000000","b":"0x010201780179060161036261723FF0000000000000016103666F6F00000000000000000162036261720000000000000000016203666F6F3FF00000000000000163036261723FF0000000000000016303666F6F3FF0000000000000"},"result":{"expect":"0x010201780179040161036261723FF0000000000000016103666F6F00000000000000000162036261720000000000000000016203666F6F0000000000000000"}}
+{"expression":"a&&b","inputs":{"a":"0x010201780179060161036261723FF000000000000001610362617A3FF0000000000000016103666F6F00000000000000000162036261723FF000000000000001620362617A3FF0000000000000016203666F6F0000000000000000","b":"0x01020179017A080362617201693FF000000000000003626172016A3FF000000000000003626172016B000000000000000003626172016C3FF000000000000003666F6F0169000000000000000003666F6F016A3FF000000000000003666F6F016B3FF000000000000003666F6F016C0000000000000000"},"result":{"expect":"0x010301780179017A1001610362617201693FF0000000000000016103626172016A3FF0000000000000016103626172016B0000000000000000016103626172016C3FF0000000000000016103666F6F01690000000000000000016103666F6F016A0000000000000000016103666F6F016B0000000000000000016103666F6F016C000000000000000001620362617201693FF0000000000000016203626172016A3FF0000000000000016203626172016B0000000000000000016203626172016C3FF0000000000000016203666F6F01690000000000000000016203666F6F016A0000000000000000016203666F6F016B0000000000000000016203666F6F016C0000000000000000"}}
+{"expression":"a&&b","inputs":{"a":"0x030101790101780302036261723FF000000000000000000000000000003FF000000000000003666F6F00000000000000003FF00000000000003FF0000000000000","b":"0x0301017901017A0702036261723FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF000000000000003666F6F00000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000"},"result":{"expect":"0x0301017902017803017A0702036261723FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF000000000000003666F6F000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000"}}
+{"expression":"a&&b","inputs":{"a":"0x030101780101790503016100000000000000003FF00000000000003FF000000000000000000000000000003FF000000000000001623FF000000000000000000000000000003FF00000000000003FF0000000000000000000000000000001633FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000","b":"0x0301017A0101790504016900000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000016A3FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000016B3FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000016C00000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x03020178017A010179050C0161016900000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000000161016A00000000000000003FF0000000000000000000000000000000000000000000003FF00000000000000161016B000000000000000000000000000000003FF0000000000000000000000000000000000000000000000161016C00000000000000003FF00000000000003FF000000000000000000000000000003FF000000000000001620169000000000000000000000000000000003FF0000000000000000000000000000000000000000000000162016A3FF0000000000000000000000000000000000000000000003FF000000000000000000000000000000162016B3FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000000162016C000000000000000000000000000000003FF0000000000000000000000000000000000000000000000163016900000000000000003FF0000000000000000000000000000000000000000000003FF00000000000000163016A3FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000163016B3FF0000000000000000000000000000000000000000000003FF000000000000000000000000000000163016C00000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a&&b))","inputs":{"a":"0x02000000000000000000","b":"0x02000000000000000000"},"result":{"expect":"0x02000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a&&b))","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a&&b))","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020101780300000000000000003FF00000000000003FF0000000000000"},"result":{"expect":"0x020101780300000000000000003FF00000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a&&b))","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020101790500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x02020178050179050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a&&b))","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020201780501790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000"},"result":{"expect":"0x0202017805017905000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a&&b))","inputs":{"a":"0x020201780301790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000","b":"0x020201780401790400000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000"},"result":{"expect":"0x020201780301790400000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000000000000000000000000000000000003FF00000000000003FF0000000000000000000000000000000000000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a&&b))","inputs":{"a":"0x020201780301790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000","b":"0x0202017905017A0700000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x0203017803017905017A0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a&&b))","inputs":{"a":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000","b":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000"},"result":{"expect":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a&&b))","inputs":{"a":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000","b":"0x01010178020161000000000000000001623FF0000000000000"},"result":{"expect":"0x01010178020161000000000000000001623FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a&&b))","inputs":{"a":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000","b":"0x0101017903036261723FF00000000000000362617A3FF000000000000003666F6F0000000000000000"},"result":{"expect":"0x01020178017909016103626172000000000000000001610362617A0000000000000000016103666F6F00000000000000000162036261723FF000000000000001620362617A3FF0000000000000016203666F6F00000000000000000163036261723FF000000000000001630362617A3FF0000000000000016303666F6F0000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a&&b))","inputs":{"a":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000","b":"0x010201780179090161036261723FF000000000000001610362617A3FF0000000000000016103666F6F00000000000000000162036261723FF000000000000001620362617A3FF0000000000000016203666F6F00000000000000000163036261723FF000000000000001630362617A3FF0000000000000016303666F6F0000000000000000"},"result":{"expect":"0x01020178017909016103626172000000000000000001610362617A0000000000000000016103666F6F00000000000000000162036261723FF000000000000001620362617A3FF0000000000000016203666F6F00000000000000000163036261723FF000000000000001630362617A3FF0000000000000016303666F6F0000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a&&b))","inputs":{"a":"0x010201780179060161036261723FF000000000000001610362617A3FF0000000000000016103666F6F00000000000000000162036261723FF000000000000001620362617A3FF0000000000000016203666F6F0000000000000000","b":"0x010201780179060161036261723FF0000000000000016103666F6F00000000000000000162036261720000000000000000016203666F6F3FF00000000000000163036261723FF0000000000000016303666F6F3FF0000000000000"},"result":{"expect":"0x010201780179040161036261723FF0000000000000016103666F6F00000000000000000162036261720000000000000000016203666F6F0000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a&&b))","inputs":{"a":"0x010201780179060161036261723FF000000000000001610362617A3FF0000000000000016103666F6F00000000000000000162036261723FF000000000000001620362617A3FF0000000000000016203666F6F0000000000000000","b":"0x01020179017A080362617201693FF000000000000003626172016A3FF000000000000003626172016B000000000000000003626172016C3FF000000000000003666F6F0169000000000000000003666F6F016A3FF000000000000003666F6F016B3FF000000000000003666F6F016C0000000000000000"},"result":{"expect":"0x010301780179017A1001610362617201693FF0000000000000016103626172016A3FF0000000000000016103626172016B0000000000000000016103626172016C3FF0000000000000016103666F6F01690000000000000000016103666F6F016A0000000000000000016103666F6F016B0000000000000000016103666F6F016C000000000000000001620362617201693FF0000000000000016203626172016A3FF0000000000000016203626172016B0000000000000000016203626172016C3FF0000000000000016203666F6F01690000000000000000016203666F6F016A0000000000000000016203666F6F016B0000000000000000016203666F6F016C0000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a&&b))","inputs":{"a":"0x030101790101780302036261723FF000000000000000000000000000003FF000000000000003666F6F00000000000000003FF00000000000003FF0000000000000","b":"0x0301017901017A0702036261723FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF000000000000003666F6F00000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000"},"result":{"expect":"0x0301017902017803017A0702036261723FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF000000000000003666F6F000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000000000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a&&b))","inputs":{"a":"0x030101780101790503016100000000000000003FF00000000000003FF000000000000000000000000000003FF000000000000001623FF000000000000000000000000000003FF00000000000003FF0000000000000000000000000000001633FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000","b":"0x0301017A0101790504016900000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000016A3FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000016B3FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000016C00000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x03020178017A010179050C0161016900000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000000161016A00000000000000003FF0000000000000000000000000000000000000000000003FF00000000000000161016B000000000000000000000000000000003FF0000000000000000000000000000000000000000000000161016C00000000000000003FF00000000000003FF000000000000000000000000000003FF000000000000001620169000000000000000000000000000000003FF0000000000000000000000000000000000000000000000162016A3FF0000000000000000000000000000000000000000000003FF000000000000000000000000000000162016B3FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000000162016C000000000000000000000000000000003FF0000000000000000000000000000000000000000000000163016900000000000000003FF0000000000000000000000000000000000000000000003FF00000000000000163016A3FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000163016B3FF0000000000000000000000000000000000000000000003FF000000000000000000000000000000163016C00000000000000003FF0000000000000000000000000000000000000000000003FF0000000000000"}}
+{"expression":"a||b","inputs":{"a":"0x02000000000000000000","b":"0x02000000000000000000"},"result":{"expect":"0x02000000000000000000"}}
+{"expression":"a||b","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"}}
+{"expression":"a||b","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020101780300000000000000003FF00000000000003FF0000000000000"},"result":{"expect":"0x020101780300000000000000003FF00000000000003FF0000000000000"}}
+{"expression":"a||b","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020101790500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x020201780501790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"a||b","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020201780501790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000"},"result":{"expect":"0x020201780501790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"a||b","inputs":{"a":"0x020201780301790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000","b":"0x020201780401790400000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000"},"result":{"expect":"0x020201780301790400000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"a||b","inputs":{"a":"0x020201780301790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000","b":"0x0202017905017A0700000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x0203017803017905017A0700000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"a||b","inputs":{"a":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000","b":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000"},"result":{"expect":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000"}}
+{"expression":"a||b","inputs":{"a":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000","b":"0x01010178020161000000000000000001623FF0000000000000"},"result":{"expect":"0x01010178020161000000000000000001623FF0000000000000"}}
+{"expression":"a||b","inputs":{"a":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000","b":"0x0101017903036261723FF00000000000000362617A3FF000000000000003666F6F0000000000000000"},"result":{"expect":"0x010201780179090161036261723FF000000000000001610362617A3FF0000000000000016103666F6F00000000000000000162036261723FF000000000000001620362617A3FF0000000000000016203666F6F3FF00000000000000163036261723FF000000000000001630362617A3FF0000000000000016303666F6F3FF0000000000000"}}
+{"expression":"a||b","inputs":{"a":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000","b":"0x010201780179090161036261723FF000000000000001610362617A3FF0000000000000016103666F6F00000000000000000162036261723FF000000000000001620362617A3FF0000000000000016203666F6F00000000000000000163036261723FF000000000000001630362617A3FF0000000000000016303666F6F0000000000000000"},"result":{"expect":"0x010201780179090161036261723FF000000000000001610362617A3FF0000000000000016103666F6F00000000000000000162036261723FF000000000000001620362617A3FF0000000000000016203666F6F3FF00000000000000163036261723FF000000000000001630362617A3FF0000000000000016303666F6F3FF0000000000000"}}
+{"expression":"a||b","inputs":{"a":"0x010201780179060161036261723FF000000000000001610362617A3FF0000000000000016103666F6F00000000000000000162036261723FF000000000000001620362617A3FF0000000000000016203666F6F0000000000000000","b":"0x010201780179060161036261723FF0000000000000016103666F6F00000000000000000162036261720000000000000000016203666F6F3FF00000000000000163036261723FF0000000000000016303666F6F3FF0000000000000"},"result":{"expect":"0x010201780179040161036261723FF0000000000000016103666F6F00000000000000000162036261723FF0000000000000016203666F6F3FF0000000000000"}}
+{"expression":"a||b","inputs":{"a":"0x010201780179060161036261723FF000000000000001610362617A3FF0000000000000016103666F6F00000000000000000162036261723FF000000000000001620362617A3FF0000000000000016203666F6F0000000000000000","b":"0x01020179017A080362617201693FF000000000000003626172016A3FF000000000000003626172016B000000000000000003626172016C3FF000000000000003666F6F0169000000000000000003666F6F016A3FF000000000000003666F6F016B3FF000000000000003666F6F016C0000000000000000"},"result":{"expect":"0x010301780179017A1001610362617201693FF0000000000000016103626172016A3FF0000000000000016103626172016B3FF0000000000000016103626172016C3FF0000000000000016103666F6F01690000000000000000016103666F6F016A3FF0000000000000016103666F6F016B3FF0000000000000016103666F6F016C000000000000000001620362617201693FF0000000000000016203626172016A3FF0000000000000016203626172016B3FF0000000000000016203626172016C3FF0000000000000016203666F6F01690000000000000000016203666F6F016A3FF0000000000000016203666F6F016B3FF0000000000000016203666F6F016C0000000000000000"}}
+{"expression":"a||b","inputs":{"a":"0x030101790101780302036261723FF000000000000000000000000000003FF000000000000003666F6F00000000000000003FF00000000000003FF0000000000000","b":"0x0301017901017A0702036261723FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF000000000000003666F6F00000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000"},"result":{"expect":"0x0301017902017803017A0702036261723FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000003666F6F00000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"a||b","inputs":{"a":"0x030101780101790503016100000000000000003FF00000000000003FF000000000000000000000000000003FF000000000000001623FF000000000000000000000000000003FF00000000000003FF0000000000000000000000000000001633FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000","b":"0x0301017A0101790504016900000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000016A3FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000016B3FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000016C00000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x03020178017A010179050C0161016900000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000000161016A3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016B3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016C00000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000016201693FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000162016A3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000162016B3FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000000162016C3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000016301693FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016A3FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000163016B3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016C3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a||b))","inputs":{"a":"0x02000000000000000000","b":"0x02000000000000000000"},"result":{"expect":"0x02000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a||b))","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a||b))","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020101780300000000000000003FF00000000000003FF0000000000000"},"result":{"expect":"0x020101780300000000000000003FF00000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a||b))","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020101790500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x020201780501790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a||b))","inputs":{"a":"0x020101780500000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000","b":"0x020201780501790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000"},"result":{"expect":"0x020201780501790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a||b))","inputs":{"a":"0x020201780301790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000","b":"0x020201780401790400000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000"},"result":{"expect":"0x020201780301790400000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a||b))","inputs":{"a":"0x020201780301790500000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000","b":"0x0202017905017A0700000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x0203017803017905017A0700000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a||b))","inputs":{"a":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000","b":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000"},"result":{"expect":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a||b))","inputs":{"a":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000","b":"0x01010178020161000000000000000001623FF0000000000000"},"result":{"expect":"0x01010178020161000000000000000001623FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a||b))","inputs":{"a":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000","b":"0x0101017903036261723FF00000000000000362617A3FF000000000000003666F6F0000000000000000"},"result":{"expect":"0x010201780179090161036261723FF000000000000001610362617A3FF0000000000000016103666F6F00000000000000000162036261723FF000000000000001620362617A3FF0000000000000016203666F6F3FF00000000000000163036261723FF000000000000001630362617A3FF0000000000000016303666F6F3FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a||b))","inputs":{"a":"0x01010178030161000000000000000001623FF000000000000001633FF0000000000000","b":"0x010201780179090161036261723FF000000000000001610362617A3FF0000000000000016103666F6F00000000000000000162036261723FF000000000000001620362617A3FF0000000000000016203666F6F00000000000000000163036261723FF000000000000001630362617A3FF0000000000000016303666F6F0000000000000000"},"result":{"expect":"0x010201780179090161036261723FF000000000000001610362617A3FF0000000000000016103666F6F00000000000000000162036261723FF000000000000001620362617A3FF0000000000000016203666F6F3FF00000000000000163036261723FF000000000000001630362617A3FF0000000000000016303666F6F3FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a||b))","inputs":{"a":"0x010201780179060161036261723FF000000000000001610362617A3FF0000000000000016103666F6F00000000000000000162036261723FF000000000000001620362617A3FF0000000000000016203666F6F0000000000000000","b":"0x010201780179060161036261723FF0000000000000016103666F6F00000000000000000162036261720000000000000000016203666F6F3FF00000000000000163036261723FF0000000000000016303666F6F3FF0000000000000"},"result":{"expect":"0x010201780179040161036261723FF0000000000000016103666F6F00000000000000000162036261723FF0000000000000016203666F6F3FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a||b))","inputs":{"a":"0x010201780179060161036261723FF000000000000001610362617A3FF0000000000000016103666F6F00000000000000000162036261723FF000000000000001620362617A3FF0000000000000016203666F6F0000000000000000","b":"0x01020179017A080362617201693FF000000000000003626172016A3FF000000000000003626172016B000000000000000003626172016C3FF000000000000003666F6F0169000000000000000003666F6F016A3FF000000000000003666F6F016B3FF000000000000003666F6F016C0000000000000000"},"result":{"expect":"0x010301780179017A1001610362617201693FF0000000000000016103626172016A3FF0000000000000016103626172016B3FF0000000000000016103626172016C3FF0000000000000016103666F6F01690000000000000000016103666F6F016A3FF0000000000000016103666F6F016B3FF0000000000000016103666F6F016C000000000000000001620362617201693FF0000000000000016203626172016A3FF0000000000000016203626172016B3FF0000000000000016203626172016C3FF0000000000000016203666F6F01690000000000000000016203666F6F016A3FF0000000000000016203666F6F016B3FF0000000000000016203666F6F016C0000000000000000"}}
+{"expression":"join(a,b,f(a,b)(a||b))","inputs":{"a":"0x030101790101780302036261723FF000000000000000000000000000003FF000000000000003666F6F00000000000000003FF00000000000003FF0000000000000","b":"0x0301017901017A0702036261723FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF000000000000003666F6F00000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000"},"result":{"expect":"0x0301017902017803017A0702036261723FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF000000000000003666F6F00000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"join(a,b,f(a,b)(a||b))","inputs":{"a":"0x030101780101790503016100000000000000003FF00000000000003FF000000000000000000000000000003FF000000000000001623FF000000000000000000000000000003FF00000000000003FF0000000000000000000000000000001633FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000","b":"0x0301017A0101790504016900000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000016A3FF00000000000003FF000000000000000000000000000003FF00000000000003FF0000000000000016B3FF000000000000000000000000000003FF00000000000003FF00000000000000000000000000000016C00000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000"},"result":{"expect":"0x03020178017A010179050C0161016900000000000000003FF00000000000003FF000000000000000000000000000003FF00000000000000161016A3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016B3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000161016C00000000000000003FF00000000000003FF000000000000000000000000000003FF0000000000000016201693FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000162016A3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000162016B3FF000000000000000000000000000003FF00000000000003FF000000000000000000000000000000162016C3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000016301693FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016A3FF00000000000003FF000000000000000000000000000003FF00000000000003FF00000000000000163016B3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000000163016C3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF0000000000000"}}
+{"expression":"atan2(a,b)","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FE921FB54442D18"}}
+{"expression":"atan2(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D18"}}
+{"expression":"atan2(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FE921FB54442D183FE921FB54442D183FE921FB54442D18"}}
+{"expression":"atan2(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FE921FB54442D183FDDAC670561BB4F3FD4978FA3269EE23FCF5B75F92C80DD3FC94441F8F7260C3FF1B6E192EBBE443FE921FB54442D183FE2D0EAD60663963FDDAC670561BB4F3FD85A376B677DC03FF3FC176B7A85603FEF730BD281F69B3FE921FB54442D183FE4978FA3269EE13FE14B1DD5F90CE13FF5368C951E9CFD3FF1B6E192EBBE443FEDAC670561BB503FE921FB54442D183FE5977A5103EA933FF5F973152548573FF30B6D796A4DA83FF07C6C6947A6A83FECAC7C57846F9E3FE921FB54442D18"}}
+{"expression":"atan2(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FE921FB54442D183FDDAC670561BB4F3FD4978FA3269EE23FCF5B75F92C80DD3FC94441F8F7260C3FD4978FA3269EE23FD1CFA95F7A8DCF3FCF5B75F92C80DD3FCBFD581196F5C23FC94441F8F7260C3FD10A4608E628493FCF5B75F92C80DD3FCD07BEA194B9913FCB051B394C33AB3FC94441F8F7260B3FCF5B75F92C80DD3FCD94610502338C3FCBFD581196F5C23FCA8F3C814A92D73FC94441F8F7260C3FCDEB4BEABF5A573FCC9AE19AA8FE1E3FCB665729A20CE23FCA4A6567A8DCF43FC94441F8F7260B"}}
+{"expression":"atan2(a,b)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FEC08AAE496EFA63FEB96E5A78C5C513FEB434EE31013FD3FEB034F38649C873FEC5277A4A086A23FEC08AAE496EFA63FEBCB1321414BE03FEB96E5A78C5C51"}}
+{"expression":"atan2(a,b)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FE921FB54442D183FDDAC670561BB4F3FD4978FA3269EE23FCF5B75F92C80DD3FC94441F8F7260C3FC52397843C9ADE3FC229AEC47638DD3FCF5B75F92C80DD3FCBFD581196F5C23FC94441F8F7260C3FC7057081D704E63FC52397843C9ADE3FC38A03609B65453FC229AEC47638DD3FC94441F8F7260B3FC7B97B4BCE5B023FC65BA89B2161AB3FC52397843C9ADD3FC40B87C210A2E53FC30ED367D7CD043FC229AEC47638DC3FC7057081D704E63FC60A593E8618943FC52397843C9ADE3FC44ED0CD36E62E3FC38A03609B65453FC2D376AB2BDC173FC229AEC47638DD3FC5DAA6C2C7EF143FC52397843C9ADD3FC47808811538043FC3D6EEE8C6626C3FC33F5EF6C590243FC2B08797D7AFC63FC229AEC47638DD3FF67D8863BC99BD3FF3FC176B7A85603FF1B6E192EBBE443FEF730BD281F69B3FEC08AAE496EFA63FE921FB54442D183FE6AD1100FBFDDF3FE700A7C57846333FE5274400EEA72A3FE38B112D7BD4AD3FE222A54FDE6FA73FE0E5FC62BB05C33FDF9CBC4269AB2A3FDDAC670561BB4F3FDF5B75F92C80DE3FDDAC670561BB4F3FDC266181253B883FDAC42FFA7BCBCF3FD9816449B6FD543FD85A376B677DC03FD74B6E64A9083C3FD8DA36C0BE6CAA3FD7DF07E4BC36343FD6F61941E4DEF13FD61D9527631EA93FD553DFE7B697BA3FD4978FA3269EE13FD3E765551408AD3FD540765A5B20A23FD4978FA3269EE13FD3F87F84C579703FD362773707EBCC3FD2D4BD36A057653FD24EAAB4C991EE3FD1CFA95F7A8DCE3FF7AEA38C1ACBD13FF6414D44094C7C3FF4DF69D20AA3063FF38D6A6CE133533FF24E83FA9B4E483FF124A857547B083FF010A8AC54F5453FEF730BD281F69B3FEDAC670561BB4F3FEC08AAE496EFA63FEA85EE761A35A13FE921FB54442D183FE7DA79F20CC4433FE6AD1100FBFDDF3FE6D9D4BC9D58283FE5D58987169B183FE4E41E9E3C36163FE403F933FEDF173FE3339C815096583FE271AA72553ED53FE1BCE31303A0353FE222A54FDE6FA73FE17F4B4FADFC703FE0E5FC62BB05C33FE055EB9AF3EB4A3FDF9CBC4269AB2A3FDE9D53842EF0533FDDAC670561BB4F3FDE8CD3A58C421F3FDDAC670561BB4F3FDCD7A29A45A6ED3FDC0DB4C94EC9EF3FDB4DDD66A37B403FDA976C28F401F63FD9E9BF3D20DC71"}}
+{"expression":"atan2(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FE921FB54442D1801623FE921FB54442D1801633FE921FB54442D18"}}
+{"expression":"atan2(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FE921FB54442D1801623FE921FB54442D18"}}
+{"expression":"atan2(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x0101017903036261723FC999999999999A0362617A3FD333333333333303666F6F3FB999999999999A"},"result":{"expect":"0x010201780179090161036261723FDDAC670561BB4F01610362617A3FD4978FA3269EE2016103666F6F3FE921FB54442D180162036261723FE921FB54442D1801620362617A3FE2D0EAD6066396016203666F6F3FF1B6E192EBBE440163036261723FEF730BD281F69B01630362617A3FE921FB54442D18016303666F6F3FF3FC176B7A8560"}}
+{"expression":"atan2(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010201780179090161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A0163036261723FE999999999999A01630362617A3FECCCCCCCCCCCCD016303666F6F3FE6666666666666"},"result":{"expect":"0x010201780179090161036261723FDDAC670561BB4F01610362617A3FD4978FA3269EE2016103666F6F3FE921FB54442D180162036261723FD85A376B677DC001620362617A3FD4978FA3269EE2016203666F6F3FDDAC670561BB4F0163036261723FD6F61941E4DEF001630362617A3FD4978FA3269EE1016303666F6F3FD9E9BF3D20DC71"}}
+{"expression":"atan2(a,b)","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179040161036261723FE921FB54442D18016103666F6F3FE921FB54442D180162036261723FECAC7C57846F9E016203666F6F3FEDAC670561BB50"}}
+{"expression":"atan2(a,b)","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x01020179017A080362617201693FE000000000000003626172016A3FE333333333333303626172016B3FE666666666666603626172016C3FE999999999999A03666F6F01693FB999999999999A03666F6F016A3FC999999999999A03666F6F016B3FD333333333333303666F6F016C3FD999999999999A"},"result":{"expect":"0x010301780179017A1001610362617201693FD85A376B677DC0016103626172016A3FD4978FA3269EE2016103626172016B3FD1CFA95F7A8DCF016103626172016C3FCF5B75F92C80DD016103666F6F01693FE921FB54442D18016103666F6F016A3FDDAC670561BB4F016103666F6F016B3FD4978FA3269EE2016103666F6F016C3FCF5B75F92C80DD01620362617201693FE921FB54442D18016203626172016A3FE63B4BC3F16A8B016203626172016B3FE3D91573350661016203626172016C3FE1E00BABDEFEB4016203666F6F01693FF5368C951E9CFD016203666F6F016A3FF1B6E192EBBE44016203666F6F016B3FEDAC670561BB50016203666F6F016C3FE921FB54442D18"}}
+{"expression":"atan2(a,b)","inputs":{"a":"0x030101790101780302036261723FC999999999999A3FD999999999999A3FE333333333333303666F6F3FB999999999999A3FD33333333333333FE0000000000000","b":"0x0301017901017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF666666666666603666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE6666666666666"},"result":{"expect":"0x0301017902017803017A0702036261723FCF5B75F92C80DD3FCBFD581196F5C23FC94441F8F7260C3FC7057081D704E63FC52397843C9ADE3FC38A03609B65453FC229AEC47638DD3FDDAC670561BB4F3FDAC42FFA7BCBCF3FD85A376B677DC03FD652439D8BE7153FD4978FA3269EE23FD31A9B43436DE13FD1CFA95F7A8DCF3FE4978FA3269EE13FE2D0EAD60663953FE14B1DD5F90CE13FDFF54BF3BEC8423FDDAC670561BB4F3FDBAC91A9A723ED3FD9E9BF3D20DC7103666F6F3FE921FB54442D183FDDAC670561BB4F3FD4978FA3269EE23FCF5B75F92C80DD3FC94441F8F7260C3FC52397843C9ADE3FC229AEC47638DD3FF3FC176B7A85603FEF730BD281F69B3FE921FB54442D183FE4978FA3269EE13FE14B1DD5F90CE13FDDAC670561BB4F3FD9E9BF3D20DC713FF5F973152548573FF30B6D796A4DA83FF07C6C6947A6A83FECAC7C57846F9E3FE921FB54442D183FE63B4BC3F16A8B3FE3D91573350661"}}
+{"expression":"atan2(a,b)","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FE921FB54442D183FD85A376B677DC03FD4978FA3269EE13FD31A9B43436DE13FD24EAAB4C991EE0161016A3FDDAC670561BB4F3FD4978FA3269EE23FD2A73A661EAF063FD1CFA95F7A8DCF3FD15731754A18210161016B3FD4978FA3269EE23FD1CFA95F7A8DCF3FD10A4608E628493FD0ADB5A7741C043FD077FDE3124EAA0161016C3FCF5B75F92C80DD3FCF5B75F92C80DD3FCF5B75F92C80DD3FCF5B75F92C80DD3FCF5B75F92C80DD016201693FF67D8863BC99BD3FEE6AE1355353CF3FE740A77023BDA93FE3609F33CE6BDF3FE103E230EBECF30162016A3FF3FC176B7A85603FEB96E5A78C5C513FE5977A5103EA933FE2486589DBA9E03FE03A26A486E6310162016B3FF1B6E192EBBE443FE921FB54442D183FE41F1963C0045F3FE14B1DD5F90CE13FDF01AFB73642BE0162016C3FEF730BD281F69B3FE700A7C57846333FE2D0EAD60663963FE0657E94DB30D03FDDAC670561BB4F016301693FF7AEA38C1ACBD13FF2D0EAD60663953FEEE35774B9EE523FEA514023A34D203FE722A598D15D3A0163016A3FF6414D44094C7C3FF1B6E192EBBE443FED488143AD8C443FE921FB54442D183FE63B4BC3F16A8A0163016B3FF4DF69D20AA3063FF0AEFD22E6AA373FEBCB1321414BE03FE8079C6293AEDF3FE562A07DC47C8F0163016C3FF38D6A6CE133533FEF730BD281F69B3FEA697CB67B95EE3FE700A7C57846333FE4978FA3269EE1"}}
+{"expression":"join(a,b,f(a,b)(atan2(a,b)))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FE921FB54442D18"}}
+{"expression":"join(a,b,f(a,b)(atan2(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D18"}}
+{"expression":"join(a,b,f(a,b)(atan2(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FE921FB54442D183FE921FB54442D183FE921FB54442D18"}}
+{"expression":"join(a,b,f(a,b)(atan2(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FE921FB54442D183FDDAC670561BB4F3FD4978FA3269EE23FCF5B75F92C80DD3FC94441F8F7260C3FF1B6E192EBBE443FE921FB54442D183FE2D0EAD60663963FDDAC670561BB4F3FD85A376B677DC03FF3FC176B7A85603FEF730BD281F69B3FE921FB54442D183FE4978FA3269EE13FE14B1DD5F90CE13FF5368C951E9CFD3FF1B6E192EBBE443FEDAC670561BB503FE921FB54442D183FE5977A5103EA933FF5F973152548573FF30B6D796A4DA83FF07C6C6947A6A83FECAC7C57846F9E3FE921FB54442D18"}}
+{"expression":"join(a,b,f(a,b)(atan2(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FE921FB54442D183FDDAC670561BB4F3FD4978FA3269EE23FCF5B75F92C80DD3FC94441F8F7260C3FD4978FA3269EE23FD1CFA95F7A8DCF3FCF5B75F92C80DD3FCBFD581196F5C23FC94441F8F7260C3FD10A4608E628493FCF5B75F92C80DD3FCD07BEA194B9913FCB051B394C33AB3FC94441F8F7260B3FCF5B75F92C80DD3FCD94610502338C3FCBFD581196F5C23FCA8F3C814A92D73FC94441F8F7260C3FCDEB4BEABF5A573FCC9AE19AA8FE1E3FCB665729A20CE23FCA4A6567A8DCF43FC94441F8F7260B"}}
+{"expression":"join(a,b,f(a,b)(atan2(a,b)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FE921FB54442D183FE921FB54442D183FE921FB54442D183FE921FB54442D183FEC08AAE496EFA63FEB96E5A78C5C513FEB434EE31013FD3FEB034F38649C873FEC5277A4A086A23FEC08AAE496EFA63FEBCB1321414BE03FEB96E5A78C5C51"}}
+{"expression":"join(a,b,f(a,b)(atan2(a,b)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FE921FB54442D183FDDAC670561BB4F3FD4978FA3269EE23FCF5B75F92C80DD3FC94441F8F7260C3FC52397843C9ADE3FC229AEC47638DD3FCF5B75F92C80DD3FCBFD581196F5C23FC94441F8F7260C3FC7057081D704E63FC52397843C9ADE3FC38A03609B65453FC229AEC47638DD3FC94441F8F7260B3FC7B97B4BCE5B023FC65BA89B2161AB3FC52397843C9ADD3FC40B87C210A2E53FC30ED367D7CD043FC229AEC47638DC3FC7057081D704E63FC60A593E8618943FC52397843C9ADE3FC44ED0CD36E62E3FC38A03609B65453FC2D376AB2BDC173FC229AEC47638DD3FC5DAA6C2C7EF143FC52397843C9ADD3FC47808811538043FC3D6EEE8C6626C3FC33F5EF6C590243FC2B08797D7AFC63FC229AEC47638DD3FF67D8863BC99BD3FF3FC176B7A85603FF1B6E192EBBE443FEF730BD281F69B3FEC08AAE496EFA63FE921FB54442D183FE6AD1100FBFDDF3FE700A7C57846333FE5274400EEA72A3FE38B112D7BD4AD3FE222A54FDE6FA73FE0E5FC62BB05C33FDF9CBC4269AB2A3FDDAC670561BB4F3FDF5B75F92C80DE3FDDAC670561BB4F3FDC266181253B883FDAC42FFA7BCBCF3FD9816449B6FD543FD85A376B677DC03FD74B6E64A9083C3FD8DA36C0BE6CAA3FD7DF07E4BC36343FD6F61941E4DEF13FD61D9527631EA93FD553DFE7B697BA3FD4978FA3269EE13FD3E765551408AD3FD540765A5B20A23FD4978FA3269EE13FD3F87F84C579703FD362773707EBCC3FD2D4BD36A057653FD24EAAB4C991EE3FD1CFA95F7A8DCE3FF7AEA38C1ACBD13FF6414D44094C7C3FF4DF69D20AA3063FF38D6A6CE133533FF24E83FA9B4E483FF124A857547B083FF010A8AC54F5453FEF730BD281F69B3FEDAC670561BB4F3FEC08AAE496EFA63FEA85EE761A35A13FE921FB54442D183FE7DA79F20CC4433FE6AD1100FBFDDF3FE6D9D4BC9D58283FE5D58987169B183FE4E41E9E3C36163FE403F933FEDF173FE3339C815096583FE271AA72553ED53FE1BCE31303A0353FE222A54FDE6FA73FE17F4B4FADFC703FE0E5FC62BB05C33FE055EB9AF3EB4A3FDF9CBC4269AB2A3FDE9D53842EF0533FDDAC670561BB4F3FDE8CD3A58C421F3FDDAC670561BB4F3FDCD7A29A45A6ED3FDC0DB4C94EC9EF3FDB4DDD66A37B403FDA976C28F401F63FD9E9BF3D20DC71"}}
+{"expression":"join(a,b,f(a,b)(atan2(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FE921FB54442D1801623FE921FB54442D1801633FE921FB54442D18"}}
+{"expression":"join(a,b,f(a,b)(atan2(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FE921FB54442D1801623FE921FB54442D18"}}
+{"expression":"join(a,b,f(a,b)(atan2(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x0101017903036261723FC999999999999A0362617A3FD333333333333303666F6F3FB999999999999A"},"result":{"expect":"0x010201780179090161036261723FDDAC670561BB4F01610362617A3FD4978FA3269EE2016103666F6F3FE921FB54442D180162036261723FE921FB54442D1801620362617A3FE2D0EAD6066396016203666F6F3FF1B6E192EBBE440163036261723FEF730BD281F69B01630362617A3FE921FB54442D18016303666F6F3FF3FC176B7A8560"}}
+{"expression":"join(a,b,f(a,b)(atan2(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010201780179090161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A0163036261723FE999999999999A01630362617A3FECCCCCCCCCCCCD016303666F6F3FE6666666666666"},"result":{"expect":"0x010201780179090161036261723FDDAC670561BB4F01610362617A3FD4978FA3269EE2016103666F6F3FE921FB54442D180162036261723FD85A376B677DC001620362617A3FD4978FA3269EE2016203666F6F3FDDAC670561BB4F0163036261723FD6F61941E4DEF001630362617A3FD4978FA3269EE1016303666F6F3FD9E9BF3D20DC71"}}
+{"expression":"join(a,b,f(a,b)(atan2(a,b)))","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179040161036261723FE921FB54442D18016103666F6F3FE921FB54442D180162036261723FECAC7C57846F9E016203666F6F3FEDAC670561BB50"}}
+{"expression":"join(a,b,f(a,b)(atan2(a,b)))","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x01020179017A080362617201693FE000000000000003626172016A3FE333333333333303626172016B3FE666666666666603626172016C3FE999999999999A03666F6F01693FB999999999999A03666F6F016A3FC999999999999A03666F6F016B3FD333333333333303666F6F016C3FD999999999999A"},"result":{"expect":"0x010301780179017A1001610362617201693FD85A376B677DC0016103626172016A3FD4978FA3269EE2016103626172016B3FD1CFA95F7A8DCF016103626172016C3FCF5B75F92C80DD016103666F6F01693FE921FB54442D18016103666F6F016A3FDDAC670561BB4F016103666F6F016B3FD4978FA3269EE2016103666F6F016C3FCF5B75F92C80DD01620362617201693FE921FB54442D18016203626172016A3FE63B4BC3F16A8B016203626172016B3FE3D91573350661016203626172016C3FE1E00BABDEFEB4016203666F6F01693FF5368C951E9CFD016203666F6F016A3FF1B6E192EBBE44016203666F6F016B3FEDAC670561BB50016203666F6F016C3FE921FB54442D18"}}
+{"expression":"join(a,b,f(a,b)(atan2(a,b)))","inputs":{"a":"0x030101790101780302036261723FC999999999999A3FD999999999999A3FE333333333333303666F6F3FB999999999999A3FD33333333333333FE0000000000000","b":"0x0301017901017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF666666666666603666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE6666666666666"},"result":{"expect":"0x0301017902017803017A0702036261723FCF5B75F92C80DD3FCBFD581196F5C23FC94441F8F7260C3FC7057081D704E63FC52397843C9ADE3FC38A03609B65453FC229AEC47638DD3FDDAC670561BB4F3FDAC42FFA7BCBCF3FD85A376B677DC03FD652439D8BE7153FD4978FA3269EE23FD31A9B43436DE13FD1CFA95F7A8DCF3FE4978FA3269EE13FE2D0EAD60663953FE14B1DD5F90CE13FDFF54BF3BEC8423FDDAC670561BB4F3FDBAC91A9A723ED3FD9E9BF3D20DC7103666F6F3FE921FB54442D183FDDAC670561BB4F3FD4978FA3269EE23FCF5B75F92C80DD3FC94441F8F7260C3FC52397843C9ADE3FC229AEC47638DD3FF3FC176B7A85603FEF730BD281F69B3FE921FB54442D183FE4978FA3269EE13FE14B1DD5F90CE13FDDAC670561BB4F3FD9E9BF3D20DC713FF5F973152548573FF30B6D796A4DA83FF07C6C6947A6A83FECAC7C57846F9E3FE921FB54442D183FE63B4BC3F16A8B3FE3D91573350661"}}
+{"expression":"join(a,b,f(a,b)(atan2(a,b)))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FE921FB54442D183FD85A376B677DC03FD4978FA3269EE13FD31A9B43436DE13FD24EAAB4C991EE0161016A3FDDAC670561BB4F3FD4978FA3269EE23FD2A73A661EAF063FD1CFA95F7A8DCF3FD15731754A18210161016B3FD4978FA3269EE23FD1CFA95F7A8DCF3FD10A4608E628493FD0ADB5A7741C043FD077FDE3124EAA0161016C3FCF5B75F92C80DD3FCF5B75F92C80DD3FCF5B75F92C80DD3FCF5B75F92C80DD3FCF5B75F92C80DD016201693FF67D8863BC99BD3FEE6AE1355353CF3FE740A77023BDA93FE3609F33CE6BDF3FE103E230EBECF30162016A3FF3FC176B7A85603FEB96E5A78C5C513FE5977A5103EA933FE2486589DBA9E03FE03A26A486E6310162016B3FF1B6E192EBBE443FE921FB54442D183FE41F1963C0045F3FE14B1DD5F90CE13FDF01AFB73642BE0162016C3FEF730BD281F69B3FE700A7C57846333FE2D0EAD60663963FE0657E94DB30D03FDDAC670561BB4F016301693FF7AEA38C1ACBD13FF2D0EAD60663953FEEE35774B9EE523FEA514023A34D203FE722A598D15D3A0163016A3FF6414D44094C7C3FF1B6E192EBBE443FED488143AD8C443FE921FB54442D183FE63B4BC3F16A8A0163016B3FF4DF69D20AA3063FF0AEFD22E6AA373FEBCB1321414BE03FE8079C6293AEDF3FE562A07DC47C8F0163016C3FF38D6A6CE133533FEF730BD281F69B3FEA697CB67B95EE3FE700A7C57846333FE4978FA3269EE1"}}
+{"expression":"ldexp(a,b)","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FB999999999999A"}}
+{"expression":"ldexp(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"}}
+{"expression":"ldexp(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"}}
+{"expression":"ldexp(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE0000000000000"}}
+{"expression":"ldexp(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD999999999999A3FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FF999999999999A40000000000000004000000000000000400000000000000040000000000000004000000000000000"}}
+{"expression":"ldexp(a,b)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF199999999999A40033333333333334004CCCCCCCCCCCD4006666666666666"}}
+{"expression":"ldexp(a,b)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FF33333333333333FF33333333333333FF999999999999A3FF999999999999A3FF999999999999A3FF999999999999A3FF999999999999A3FF999999999999A3FF999999999999A40000000000000004010000000000000401000000000000040100000000000004010000000000000401000000000000040100000000000003FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE66666666666663FE66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF999999999999A3FF999999999999A3FF999999999999A3FF999999999999A3FF999999999999A400999999999999A400999999999999A400CCCCCCCCCCCCD400CCCCCCCCCCCCD400CCCCCCCCCCCCD400CCCCCCCCCCCCD400CCCCCCCCCCCCD400CCCCCCCCCCCCD400CCCCCCCCCCCCD40100000000000004020000000000000402000000000000040200000000000004020000000000000402000000000000040200000000000003FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF33333333333333FF3333333333333400333333333333340033333333333334003333333333333400333333333333340033333333333334004CCCCCCCCCCCD4004CCCCCCCCCCCD4004CCCCCCCCCCCD4004CCCCCCCCCCCD4004CCCCCCCCCCCD4014CCCCCCCCCCCD4014CCCCCCCCCCCD40166666666666664016666666666666401666666666666640166666666666664016666666666666401666666666666640166666666666664018000000000000402800000000000040280000000000004028000000000000402800000000000040280000000000004028000000000000"}}
+{"expression":"ldexp(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"}}
+{"expression":"ldexp(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FB999999999999A01623FC999999999999A"}}
+{"expression":"ldexp(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x0101017903036261723FC999999999999A0362617A3FD333333333333303666F6F3FB999999999999A"},"result":{"expect":"0x010201780179090161036261723FB999999999999A01610362617A3FB999999999999A016103666F6F3FB999999999999A0162036261723FC999999999999A01620362617A3FC999999999999A016203666F6F3FC999999999999A0163036261723FD333333333333301630362617A3FD3333333333333016303666F6F3FD3333333333333"}}
+{"expression":"ldexp(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010201780179090161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A0163036261723FE999999999999A01630362617A3FECCCCCCCCCCCCD016303666F6F3FE6666666666666"},"result":{"expect":"0x010201780179090161036261723FB999999999999A01610362617A3FB999999999999A016103666F6F3FB999999999999A0162036261723FC999999999999A01620362617A3FC999999999999A016203666F6F3FC999999999999A0163036261723FD333333333333301630362617A3FD3333333333333016303666F6F3FD3333333333333"}}
+{"expression":"ldexp(a,b)","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179040161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FE0000000000000016203666F6F3FD999999999999A"}}
+{"expression":"ldexp(a,b)","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x01020179017A080362617201693FE000000000000003626172016A3FE333333333333303626172016B3FE666666666666603626172016C3FE999999999999A03666F6F01693FB999999999999A03666F6F016A3FC999999999999A03666F6F016B3FD333333333333303666F6F016C3FD999999999999A"},"result":{"expect":"0x010301780179017A1001610362617201693FC999999999999A016103626172016A3FC999999999999A016103626172016B3FC999999999999A016103626172016C3FC999999999999A016103666F6F01693FB999999999999A016103666F6F016A3FB999999999999A016103666F6F016B3FB999999999999A016103666F6F016C3FB999999999999A01620362617201693FE0000000000000016203626172016A3FE0000000000000016203626172016B3FE0000000000000016203626172016C3FE0000000000000016203666F6F01693FD999999999999A016203666F6F016A3FD999999999999A016203666F6F016B3FD999999999999A016203666F6F016C3FD999999999999A"}}
+{"expression":"ldexp(a,b)","inputs":{"a":"0x030101790101780302036261723FC999999999999A3FD999999999999A3FE333333333333303666F6F3FB999999999999A3FD33333333333333FE0000000000000","b":"0x0301017901017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF666666666666603666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE6666666666666"},"result":{"expect":"0x0301017902017803017A0702036261723FC999999999999A3FC999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE33333333333333FE33333333333333FF33333333333333FF33333333333333FF33333333333333FF33333333333333FF333333333333303666F6F3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE0000000000000"}}
+{"expression":"ldexp(a,b)","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FB999999999999A3FC999999999999A3FD33333333333333FE999999999999A3FF00000000000000161016A3FB999999999999A3FC999999999999A3FE33333333333333FE999999999999A3FF00000000000000161016B3FB999999999999A3FC999999999999A3FE33333333333333FE999999999999A3FF00000000000000161016C3FB999999999999A3FC999999999999A3FE33333333333333FE999999999999A4000000000000000016201693FE33333333333333FE66666666666663FE999999999999A3FFCCCCCCCCCCCCD40000000000000000162016A3FE33333333333333FE66666666666663FF999999999999A3FFCCCCCCCCCCCCD40000000000000000162016B3FE33333333333333FE66666666666663FF999999999999A3FFCCCCCCCCCCCCD40000000000000000162016C3FE33333333333333FE66666666666663FF999999999999A3FFCCCCCCCCCCCCD4010000000000000016301693FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD400666666666666640080000000000000163016A3FF199999999999A3FF33333333333334004CCCCCCCCCCCD400666666666666640080000000000000163016B3FF199999999999A3FF33333333333334004CCCCCCCCCCCD400666666666666640080000000000000163016C3FF199999999999A3FF33333333333334004CCCCCCCCCCCD40066666666666664018000000000000"}}
+{"expression":"join(a,b,f(a,b)(ldexp(a,b)))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FB999999999999A"}}
+{"expression":"join(a,b,f(a,b)(ldexp(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"}}
+{"expression":"join(a,b,f(a,b)(ldexp(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"}}
+{"expression":"join(a,b,f(a,b)(ldexp(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE0000000000000"}}
+{"expression":"join(a,b,f(a,b)(ldexp(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD999999999999A3FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FF999999999999A40000000000000004000000000000000400000000000000040000000000000004000000000000000"}}
+{"expression":"join(a,b,f(a,b)(ldexp(a,b)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF199999999999A40033333333333334004CCCCCCCCCCCD4006666666666666"}}
+{"expression":"join(a,b,f(a,b)(ldexp(a,b)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FF33333333333333FF33333333333333FF999999999999A3FF999999999999A3FF999999999999A3FF999999999999A3FF999999999999A3FF999999999999A3FF999999999999A40000000000000004010000000000000401000000000000040100000000000004010000000000000401000000000000040100000000000003FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE66666666666663FE66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF999999999999A3FF999999999999A3FF999999999999A3FF999999999999A3FF999999999999A400999999999999A400999999999999A400CCCCCCCCCCCCD400CCCCCCCCCCCCD400CCCCCCCCCCCCD400CCCCCCCCCCCCD400CCCCCCCCCCCCD400CCCCCCCCCCCCD400CCCCCCCCCCCCD40100000000000004020000000000000402000000000000040200000000000004020000000000000402000000000000040200000000000003FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF33333333333333FF3333333333333400333333333333340033333333333334003333333333333400333333333333340033333333333334004CCCCCCCCCCCD4004CCCCCCCCCCCD4004CCCCCCCCCCCD4004CCCCCCCCCCCD4004CCCCCCCCCCCD4014CCCCCCCCCCCD4014CCCCCCCCCCCD40166666666666664016666666666666401666666666666640166666666666664016666666666666401666666666666640166666666666664018000000000000402800000000000040280000000000004028000000000000402800000000000040280000000000004028000000000000"}}
+{"expression":"join(a,b,f(a,b)(ldexp(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"}}
+{"expression":"join(a,b,f(a,b)(ldexp(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FB999999999999A01623FC999999999999A"}}
+{"expression":"join(a,b,f(a,b)(ldexp(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x0101017903036261723FC999999999999A0362617A3FD333333333333303666F6F3FB999999999999A"},"result":{"expect":"0x010201780179090161036261723FB999999999999A01610362617A3FB999999999999A016103666F6F3FB999999999999A0162036261723FC999999999999A01620362617A3FC999999999999A016203666F6F3FC999999999999A0163036261723FD333333333333301630362617A3FD3333333333333016303666F6F3FD3333333333333"}}
+{"expression":"join(a,b,f(a,b)(ldexp(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010201780179090161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A0163036261723FE999999999999A01630362617A3FECCCCCCCCCCCCD016303666F6F3FE6666666666666"},"result":{"expect":"0x010201780179090161036261723FB999999999999A01610362617A3FB999999999999A016103666F6F3FB999999999999A0162036261723FC999999999999A01620362617A3FC999999999999A016203666F6F3FC999999999999A0163036261723FD333333333333301630362617A3FD3333333333333016303666F6F3FD3333333333333"}}
+{"expression":"join(a,b,f(a,b)(ldexp(a,b)))","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179040161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FE0000000000000016203666F6F3FD999999999999A"}}
+{"expression":"join(a,b,f(a,b)(ldexp(a,b)))","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x01020179017A080362617201693FE000000000000003626172016A3FE333333333333303626172016B3FE666666666666603626172016C3FE999999999999A03666F6F01693FB999999999999A03666F6F016A3FC999999999999A03666F6F016B3FD333333333333303666F6F016C3FD999999999999A"},"result":{"expect":"0x010301780179017A1001610362617201693FC999999999999A016103626172016A3FC999999999999A016103626172016B3FC999999999999A016103626172016C3FC999999999999A016103666F6F01693FB999999999999A016103666F6F016A3FB999999999999A016103666F6F016B3FB999999999999A016103666F6F016C3FB999999999999A01620362617201693FE0000000000000016203626172016A3FE0000000000000016203626172016B3FE0000000000000016203626172016C3FE0000000000000016203666F6F01693FD999999999999A016203666F6F016A3FD999999999999A016203666F6F016B3FD999999999999A016203666F6F016C3FD999999999999A"}}
+{"expression":"join(a,b,f(a,b)(ldexp(a,b)))","inputs":{"a":"0x030101790101780302036261723FC999999999999A3FD999999999999A3FE333333333333303666F6F3FB999999999999A3FD33333333333333FE0000000000000","b":"0x0301017901017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF666666666666603666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE6666666666666"},"result":{"expect":"0x0301017902017803017A0702036261723FC999999999999A3FC999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE33333333333333FE33333333333333FF33333333333333FF33333333333333FF33333333333333FF33333333333333FF333333333333303666F6F3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE0000000000000"}}
+{"expression":"join(a,b,f(a,b)(ldexp(a,b)))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FB999999999999A3FC999999999999A3FD33333333333333FE999999999999A3FF00000000000000161016A3FB999999999999A3FC999999999999A3FE33333333333333FE999999999999A3FF00000000000000161016B3FB999999999999A3FC999999999999A3FE33333333333333FE999999999999A3FF00000000000000161016C3FB999999999999A3FC999999999999A3FE33333333333333FE999999999999A4000000000000000016201693FE33333333333333FE66666666666663FE999999999999A3FFCCCCCCCCCCCCD40000000000000000162016A3FE33333333333333FE66666666666663FF999999999999A3FFCCCCCCCCCCCCD40000000000000000162016B3FE33333333333333FE66666666666663FF999999999999A3FFCCCCCCCCCCCCD40000000000000000162016C3FE33333333333333FE66666666666663FF999999999999A3FFCCCCCCCCCCCCD4010000000000000016301693FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD400666666666666640080000000000000163016A3FF199999999999A3FF33333333333334004CCCCCCCCCCCD400666666666666640080000000000000163016B3FF199999999999A3FF33333333333334004CCCCCCCCCCCD400666666666666640080000000000000163016C3FF199999999999A3FF33333333333334004CCCCCCCCCCCD40066666666666664018000000000000"}}
+{"expression":"fmod(a,b)","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02000000000000000000"}}
+{"expression":"fmod(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020101780500000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"fmod(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x0201017803000000000000000000000000000000000000000000000000"}}
+{"expression":"fmod(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020201780501790500000000000000003FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A000000000000000000000000000000003FC999999999999A3FC999999999999A3FC999999999999A3FB99999999999983FB999999999999800000000000000003FD33333333333333FD3333333333333000000000000000000000000000000003FB999999999999C00000000000000003FD999999999999A3FB99999999999983FB99999999999983FC999999999999A3FB99999999999980000000000000000"}}
+{"expression":"fmod(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x020201780501790500000000000000003FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE0000000000000"}}
+{"expression":"fmod(a,b)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x020201780301790400000000000000000000000000000000000000000000000000000000000000003FB99999999999983FB99999999999983FB99999999999A03FB99999999999983FC999999999999C3FC99999999999983FC99999999999983FC9999999999998"}}
+{"expression":"fmod(a,b)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A0700000000000000003FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FB99999999999963FC999999999999800000000000000003FC99999999999983FB999999999999800000000000000003FE33333333333333FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003C800000000000003FB999999999999C3FC999999999999E3FD33333333333343FB99999999999A03FE00000000000013FD999999999999C3FD99999999999983FD33333333333323FC99999999999983FB999999999999000000000000000003FF33333333333333FF33333333333333FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF8000000000000"}}
+{"expression":"fmod(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x0101017803016100000000000000000162000000000000000001630000000000000000"}}
+{"expression":"fmod(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x01010178020161000000000000000001620000000000000000"}}
+{"expression":"fmod(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x0101017903036261723FC999999999999A0362617A3FD333333333333303666F6F3FB999999999999A"},"result":{"expect":"0x010201780179090161036261723FB999999999999A01610362617A3FB999999999999A016103666F6F0000000000000000016203626172000000000000000001620362617A3FC999999999999A016203666F6F00000000000000000163036261723FB999999999999801630362617A0000000000000000016303666F6F3FB9999999999998"}}
+{"expression":"fmod(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010201780179090161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A0163036261723FE999999999999A01630362617A3FECCCCCCCCCCCCD016303666F6F3FE6666666666666"},"result":{"expect":"0x010201780179090161036261723FB999999999999A01610362617A3FB999999999999A016103666F6F00000000000000000162036261723FC999999999999A01620362617A3FC999999999999A016203666F6F3FC999999999999A0163036261723FD333333333333301630362617A3FD3333333333333016303666F6F3FD3333333333333"}}
+{"expression":"fmod(a,b)","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179040161036261720000000000000000016103666F6F00000000000000000162036261723FB9999999999998016203666F6F3FB999999999999C"}}
+{"expression":"fmod(a,b)","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x01020179017A080362617201693FE000000000000003626172016A3FE333333333333303626172016B3FE666666666666603626172016C3FE999999999999A03666F6F01693FB999999999999A03666F6F016A3FC999999999999A03666F6F016B3FD333333333333303666F6F016C3FD999999999999A"},"result":{"expect":"0x010301780179017A1001610362617201693FC999999999999A016103626172016A3FC999999999999A016103626172016B3FC999999999999A016103626172016C3FC999999999999A016103666F6F01690000000000000000016103666F6F016A3FB999999999999A016103666F6F016B3FB999999999999A016103666F6F016C3FB999999999999A01620362617201690000000000000000016203626172016A3FE0000000000000016203626172016B3FE0000000000000016203626172016C3FE0000000000000016203666F6F01690000000000000000016203666F6F016A0000000000000000016203666F6F016B3FB999999999999C016203666F6F016C0000000000000000"}}
+{"expression":"fmod(a,b)","inputs":{"a":"0x030101790101780302036261723FC999999999999A3FD999999999999A3FE333333333333303666F6F3FB999999999999A3FD33333333333333FE0000000000000","b":"0x0301017901017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF666666666666603666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE6666666666666"},"result":{"expect":"0x0301017902017803017A0702036261723FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE333333333333303666F6F00000000000000003FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB99999999999983FB999999999999800000000000000003FD33333333333333FD33333333333333FD33333333333333FD33333333333333FB99999999999983FB99999999999983FC999999999999A3FB999999999999800000000000000003FE00000000000003FE0000000000000"}}
+{"expression":"fmod(a,b)","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C0161016900000000000000003FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016A3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016B3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016C3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000016201693FB99999999999963FC99999999999983FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016A3FC99999999999983FB99999999999983FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016B000000000000000000000000000000003FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016C3FC99999999999983FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF0000000000000016301693C800000000000003FC99999999999983FD999999999999A3FB99999999999903FF80000000000000163016A3FB999999999999C00000000000000003FD333333333333400000000000000003FF80000000000000163016B3FC999999999999E3FE00000000000003FC99999999999983FF66666666666663FF80000000000000163016C3FD33333333333343FD99999999999983FB99999999999A03FF66666666666663FF8000000000000"}}
+{"expression":"join(a,b,f(a,b)(fmod(a,b)))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(fmod(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020101780500000000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(fmod(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x0201017803000000000000000000000000000000000000000000000000"}}
+{"expression":"join(a,b,f(a,b)(fmod(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x020201780501790500000000000000003FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A000000000000000000000000000000003FC999999999999A3FC999999999999A3FC999999999999A3FB99999999999983FB999999999999800000000000000003FD33333333333333FD3333333333333000000000000000000000000000000003FB999999999999C00000000000000003FD999999999999A3FB99999999999983FB99999999999983FC999999999999A3FB99999999999980000000000000000"}}
+{"expression":"join(a,b,f(a,b)(fmod(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x020201780501790500000000000000003FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE0000000000000"}}
+{"expression":"join(a,b,f(a,b)(fmod(a,b)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x020201780301790400000000000000000000000000000000000000000000000000000000000000003FB99999999999983FB99999999999983FB99999999999A03FB99999999999983FC999999999999C3FC99999999999983FC99999999999983FC9999999999998"}}
+{"expression":"join(a,b,f(a,b)(fmod(a,b)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A0700000000000000003FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FB99999999999963FC999999999999800000000000000003FC99999999999983FB999999999999800000000000000003FE33333333333333FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003C800000000000003FB999999999999C3FC999999999999E3FD33333333333343FB99999999999A03FE00000000000013FD999999999999C3FD99999999999983FD33333333333323FC99999999999983FB999999999999000000000000000003FF33333333333333FF33333333333333FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF8000000000000"}}
+{"expression":"join(a,b,f(a,b)(fmod(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x0101017803016100000000000000000162000000000000000001630000000000000000"}}
+{"expression":"join(a,b,f(a,b)(fmod(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x01010178020161000000000000000001620000000000000000"}}
+{"expression":"join(a,b,f(a,b)(fmod(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x0101017903036261723FC999999999999A0362617A3FD333333333333303666F6F3FB999999999999A"},"result":{"expect":"0x010201780179090161036261723FB999999999999A01610362617A3FB999999999999A016103666F6F0000000000000000016203626172000000000000000001620362617A3FC999999999999A016203666F6F00000000000000000163036261723FB999999999999801630362617A0000000000000000016303666F6F3FB9999999999998"}}
+{"expression":"join(a,b,f(a,b)(fmod(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010201780179090161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A0163036261723FE999999999999A01630362617A3FECCCCCCCCCCCCD016303666F6F3FE6666666666666"},"result":{"expect":"0x010201780179090161036261723FB999999999999A01610362617A3FB999999999999A016103666F6F00000000000000000162036261723FC999999999999A01620362617A3FC999999999999A016203666F6F3FC999999999999A0163036261723FD333333333333301630362617A3FD3333333333333016303666F6F3FD3333333333333"}}
+{"expression":"join(a,b,f(a,b)(fmod(a,b)))","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179040161036261720000000000000000016103666F6F00000000000000000162036261723FB9999999999998016203666F6F3FB999999999999C"}}
+{"expression":"join(a,b,f(a,b)(fmod(a,b)))","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x01020179017A080362617201693FE000000000000003626172016A3FE333333333333303626172016B3FE666666666666603626172016C3FE999999999999A03666F6F01693FB999999999999A03666F6F016A3FC999999999999A03666F6F016B3FD333333333333303666F6F016C3FD999999999999A"},"result":{"expect":"0x010301780179017A1001610362617201693FC999999999999A016103626172016A3FC999999999999A016103626172016B3FC999999999999A016103626172016C3FC999999999999A016103666F6F01690000000000000000016103666F6F016A3FB999999999999A016103666F6F016B3FB999999999999A016103666F6F016C3FB999999999999A01620362617201690000000000000000016203626172016A3FE0000000000000016203626172016B3FE0000000000000016203626172016C3FE0000000000000016203666F6F01690000000000000000016203666F6F016A0000000000000000016203666F6F016B3FB999999999999C016203666F6F016C0000000000000000"}}
+{"expression":"join(a,b,f(a,b)(fmod(a,b)))","inputs":{"a":"0x030101790101780302036261723FC999999999999A3FD999999999999A3FE333333333333303666F6F3FB999999999999A3FD33333333333333FE0000000000000","b":"0x0301017901017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF666666666666603666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE6666666666666"},"result":{"expect":"0x0301017902017803017A0702036261723FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE333333333333303666F6F00000000000000003FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB99999999999983FB999999999999800000000000000003FD33333333333333FD33333333333333FD33333333333333FD33333333333333FB99999999999983FB99999999999983FC999999999999A3FB999999999999800000000000000003FE00000000000003FE0000000000000"}}
+{"expression":"join(a,b,f(a,b)(fmod(a,b)))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C0161016900000000000000003FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016A3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016B3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016C3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000016201693FB99999999999963FC99999999999983FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016A3FC99999999999983FB99999999999983FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016B000000000000000000000000000000003FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016C3FC99999999999983FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF0000000000000016301693C800000000000003FC99999999999983FD999999999999A3FB99999999999903FF80000000000000163016A3FB999999999999C00000000000000003FD333333333333400000000000000003FF80000000000000163016B3FC999999999999E3FE00000000000003FC99999999999983FF66666666666663FF80000000000000163016C3FD33333333333343FD99999999999983FB99999999999A03FF66666666666663FF8000000000000"}}
+{"expression":"min(a,b)","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FB999999999999A"}}
+{"expression":"min(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"}}
+{"expression":"min(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"}}
+{"expression":"min(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FB999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FD999999999999A3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"}}
+{"expression":"min(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE0000000000000"}}
+{"expression":"min(a,b)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF3333333333333"}}
+{"expression":"min(a,b)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE33333333333333FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF33333333333333FF33333333333333FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF8000000000000"}}
+{"expression":"min(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"}}
+{"expression":"min(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FB999999999999A01623FC999999999999A"}}
+{"expression":"min(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x0101017903036261723FC999999999999A0362617A3FD333333333333303666F6F3FB999999999999A"},"result":{"expect":"0x010201780179090161036261723FB999999999999A01610362617A3FB999999999999A016103666F6F3FB999999999999A0162036261723FC999999999999A01620362617A3FC999999999999A016203666F6F3FB999999999999A0163036261723FC999999999999A01630362617A3FD3333333333333016303666F6F3FB999999999999A"}}
+{"expression":"min(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010201780179090161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A0163036261723FE999999999999A01630362617A3FECCCCCCCCCCCCD016303666F6F3FE6666666666666"},"result":{"expect":"0x010201780179090161036261723FB999999999999A01610362617A3FB999999999999A016103666F6F3FB999999999999A0162036261723FC999999999999A01620362617A3FC999999999999A016203666F6F3FC999999999999A0163036261723FD333333333333301630362617A3FD3333333333333016303666F6F3FD3333333333333"}}
+{"expression":"min(a,b)","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179040161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD3333333333333"}}
+{"expression":"min(a,b)","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x01020179017A080362617201693FE000000000000003626172016A3FE333333333333303626172016B3FE666666666666603626172016C3FE999999999999A03666F6F01693FB999999999999A03666F6F016A3FC999999999999A03666F6F016B3FD333333333333303666F6F016C3FD999999999999A"},"result":{"expect":"0x010301780179017A1001610362617201693FC999999999999A016103626172016A3FC999999999999A016103626172016B3FC999999999999A016103626172016C3FC999999999999A016103666F6F01693FB999999999999A016103666F6F016A3FB999999999999A016103666F6F016B3FB999999999999A016103666F6F016C3FB999999999999A01620362617201693FE0000000000000016203626172016A3FE0000000000000016203626172016B3FE0000000000000016203626172016C3FE0000000000000016203666F6F01693FB999999999999A016203666F6F016A3FC999999999999A016203666F6F016B3FD3333333333333016203666F6F016C3FD999999999999A"}}
+{"expression":"min(a,b)","inputs":{"a":"0x030101790101780302036261723FC999999999999A3FD999999999999A3FE333333333333303666F6F3FB999999999999A3FD33333333333333FE0000000000000","b":"0x0301017901017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF666666666666603666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE6666666666666"},"result":{"expect":"0x0301017902017803017A0702036261723FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE333333333333303666F6F3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE00000000000003FE0000000000000"}}
+{"expression":"min(a,b)","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016A3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016B3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016C3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000016201693FB999999999999A3FE00000000000003FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016A3FC999999999999A3FE33333333333333FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016B3FD33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016C3FD999999999999A3FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF0000000000000016301693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF80000000000000163016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FF80000000000000163016B3FD33333333333333FE66666666666663FF199999999999A3FF66666666666663FF80000000000000163016C3FD999999999999A3FE999999999999A3FF33333333333333FF66666666666663FF8000000000000"}}
+{"expression":"join(a,b,f(a,b)(min(a,b)))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FB999999999999A"}}
+{"expression":"join(a,b,f(a,b)(min(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"}}
+{"expression":"join(a,b,f(a,b)(min(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"}}
+{"expression":"join(a,b,f(a,b)(min(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FB999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FD999999999999A3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"}}
+{"expression":"join(a,b,f(a,b)(min(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE0000000000000"}}
+{"expression":"join(a,b,f(a,b)(min(a,b)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF3333333333333"}}
+{"expression":"join(a,b,f(a,b)(min(a,b)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE33333333333333FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE66666666666663FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FE999999999999A3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FECCCCCCCCCCCCD3FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FF00000000000003FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF33333333333333FF33333333333333FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF66666666666663FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF80000000000003FF8000000000000"}}
+{"expression":"join(a,b,f(a,b)(min(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"}}
+{"expression":"join(a,b,f(a,b)(min(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FB999999999999A01623FC999999999999A"}}
+{"expression":"join(a,b,f(a,b)(min(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x0101017903036261723FC999999999999A0362617A3FD333333333333303666F6F3FB999999999999A"},"result":{"expect":"0x010201780179090161036261723FB999999999999A01610362617A3FB999999999999A016103666F6F3FB999999999999A0162036261723FC999999999999A01620362617A3FC999999999999A016203666F6F3FB999999999999A0163036261723FC999999999999A01630362617A3FD3333333333333016303666F6F3FB999999999999A"}}
+{"expression":"join(a,b,f(a,b)(min(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010201780179090161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A0163036261723FE999999999999A01630362617A3FECCCCCCCCCCCCD016303666F6F3FE6666666666666"},"result":{"expect":"0x010201780179090161036261723FB999999999999A01610362617A3FB999999999999A016103666F6F3FB999999999999A0162036261723FC999999999999A01620362617A3FC999999999999A016203666F6F3FC999999999999A0163036261723FD333333333333301630362617A3FD3333333333333016303666F6F3FD3333333333333"}}
+{"expression":"join(a,b,f(a,b)(min(a,b)))","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179040161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD3333333333333"}}
+{"expression":"join(a,b,f(a,b)(min(a,b)))","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x01020179017A080362617201693FE000000000000003626172016A3FE333333333333303626172016B3FE666666666666603626172016C3FE999999999999A03666F6F01693FB999999999999A03666F6F016A3FC999999999999A03666F6F016B3FD333333333333303666F6F016C3FD999999999999A"},"result":{"expect":"0x010301780179017A1001610362617201693FC999999999999A016103626172016A3FC999999999999A016103626172016B3FC999999999999A016103626172016C3FC999999999999A016103666F6F01693FB999999999999A016103666F6F016A3FB999999999999A016103666F6F016B3FB999999999999A016103666F6F016C3FB999999999999A01620362617201693FE0000000000000016203626172016A3FE0000000000000016203626172016B3FE0000000000000016203626172016C3FE0000000000000016203666F6F01693FB999999999999A016203666F6F016A3FC999999999999A016203666F6F016B3FD3333333333333016203666F6F016C3FD999999999999A"}}
+{"expression":"join(a,b,f(a,b)(min(a,b)))","inputs":{"a":"0x030101790101780302036261723FC999999999999A3FD999999999999A3FE333333333333303666F6F3FB999999999999A3FD33333333333333FE0000000000000","b":"0x0301017901017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF666666666666603666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE6666666666666"},"result":{"expect":"0x0301017902017803017A0702036261723FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FC999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE333333333333303666F6F3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FB999999999999A3FC999999999999A3FD33333333333333FD33333333333333FD33333333333333FD33333333333333FD33333333333333FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE00000000000003FE0000000000000"}}
+{"expression":"join(a,b,f(a,b)(min(a,b)))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016A3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016B3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000000161016C3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000016201693FB999999999999A3FE00000000000003FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016A3FC999999999999A3FE33333333333333FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016B3FD33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000000162016C3FD999999999999A3FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF0000000000000016301693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FF80000000000000163016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FF80000000000000163016B3FD33333333333333FE66666666666663FF199999999999A3FF66666666666663FF80000000000000163016C3FD999999999999A3FE999999999999A3FF33333333333333FF66666666666663FF8000000000000"}}
+{"expression":"max(a,b)","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FB999999999999A"}}
+{"expression":"max(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"}}
+{"expression":"max(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"}}
+{"expression":"max(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FC999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FE00000000000003FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE0000000000000"}}
+{"expression":"max(a,b)","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"}}
+{"expression":"max(a,b)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF6666666666666"}}
+{"expression":"max(a,b)","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C0000000000003FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C0000000000003FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF33333333333333FF33333333333333FF33333333333333FF33333333333333FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"}}
+{"expression":"max(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"}}
+{"expression":"max(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FB999999999999A01623FC999999999999A"}}
+{"expression":"max(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x0101017903036261723FC999999999999A0362617A3FD333333333333303666F6F3FB999999999999A"},"result":{"expect":"0x010201780179090161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FC999999999999A01620362617A3FD3333333333333016203666F6F3FC999999999999A0163036261723FD333333333333301630362617A3FD3333333333333016303666F6F3FD3333333333333"}}
+{"expression":"max(a,b)","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010201780179090161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A0163036261723FE999999999999A01630362617A3FECCCCCCCCCCCCD016303666F6F3FE6666666666666"},"result":{"expect":"0x010201780179090161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A0163036261723FE999999999999A01630362617A3FECCCCCCCCCCCCD016303666F6F3FE6666666666666"}}
+{"expression":"max(a,b)","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179040161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FE0000000000000016203666F6F3FD999999999999A"}}
+{"expression":"max(a,b)","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x01020179017A080362617201693FE000000000000003626172016A3FE333333333333303626172016B3FE666666666666603626172016C3FE999999999999A03666F6F01693FB999999999999A03666F6F016A3FC999999999999A03666F6F016B3FD333333333333303666F6F016C3FD999999999999A"},"result":{"expect":"0x010301780179017A1001610362617201693FE0000000000000016103626172016A3FE3333333333333016103626172016B3FE6666666666666016103626172016C3FE999999999999A016103666F6F01693FB999999999999A016103666F6F016A3FC999999999999A016103666F6F016B3FD3333333333333016103666F6F016C3FD999999999999A01620362617201693FE0000000000000016203626172016A3FE3333333333333016203626172016B3FE6666666666666016203626172016C3FE999999999999A016203666F6F01693FD999999999999A016203666F6F016A3FD999999999999A016203666F6F016B3FD999999999999A016203666F6F016C3FD999999999999A"}}
+{"expression":"max(a,b)","inputs":{"a":"0x030101790101780302036261723FC999999999999A3FD999999999999A3FE333333333333303666F6F3FB999999999999A3FD33333333333333FE0000000000000","b":"0x0301017901017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF666666666666603666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE6666666666666"},"result":{"expect":"0x0301017902017803017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF666666666666603666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE33333333333333FE6666666666666"}}
+{"expression":"max(a,b)","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB3333333333330161016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD0161016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE6666666666660161016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000016201693FE33333333333333FE66666666666663FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB3333333333330162016A3FE33333333333333FE66666666666663FF00000000000003FF66666666666663FFCCCCCCCCCCCCD0162016B3FE33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE6666666666660162016C3FE33333333333333FE999999999999A3FF33333333333333FF999999999999A4000000000000000016301693FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FFB3333333333330163016A3FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FFCCCCCCCCCCCCD0163016B3FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF80000000000003FFE6666666666660163016C3FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF999999999999A4000000000000000"}}
+{"expression":"join(a,b,f(a,b)(max(a,b)))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02003FB999999999999A"}}
+{"expression":"join(a,b,f(a,b)(max(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"}}
+{"expression":"join(a,b,f(a,b)(max(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"}}
+{"expression":"join(a,b,f(a,b)(max(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FC999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FE00000000000003FD999999999999A3FD999999999999A3FD999999999999A3FD999999999999A3FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE0000000000000"}}
+{"expression":"join(a,b,f(a,b)(max(a,b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"}}
+{"expression":"join(a,b,f(a,b)(max(a,b)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF6666666666666"}}
+{"expression":"join(a,b,f(a,b)(max(a,b)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C0000000000003FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C0000000000003FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF199999999999A3FF33333333333333FF33333333333333FF33333333333333FF33333333333333FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"}}
+{"expression":"join(a,b,f(a,b)(max(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"}}
+{"expression":"join(a,b,f(a,b)(max(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201613FB999999999999A01623FC999999999999A"}}
+{"expression":"join(a,b,f(a,b)(max(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x0101017903036261723FC999999999999A0362617A3FD333333333333303666F6F3FB999999999999A"},"result":{"expect":"0x010201780179090161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FC999999999999A01620362617A3FD3333333333333016203666F6F3FC999999999999A0163036261723FD333333333333301630362617A3FD3333333333333016303666F6F3FD3333333333333"}}
+{"expression":"join(a,b,f(a,b)(max(a,b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010201780179090161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A0163036261723FE999999999999A01630362617A3FECCCCCCCCCCCCD016303666F6F3FE6666666666666"},"result":{"expect":"0x010201780179090161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A0163036261723FE999999999999A01630362617A3FECCCCCCCCCCCCD016303666F6F3FE6666666666666"}}
+{"expression":"join(a,b,f(a,b)(max(a,b)))","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179040161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FE0000000000000016203666F6F3FD999999999999A"}}
+{"expression":"join(a,b,f(a,b)(max(a,b)))","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x01020179017A080362617201693FE000000000000003626172016A3FE333333333333303626172016B3FE666666666666603626172016C3FE999999999999A03666F6F01693FB999999999999A03666F6F016A3FC999999999999A03666F6F016B3FD333333333333303666F6F016C3FD999999999999A"},"result":{"expect":"0x010301780179017A1001610362617201693FE0000000000000016103626172016A3FE3333333333333016103626172016B3FE6666666666666016103626172016C3FE999999999999A016103666F6F01693FB999999999999A016103666F6F016A3FC999999999999A016103666F6F016B3FD3333333333333016103666F6F016C3FD999999999999A01620362617201693FE0000000000000016203626172016A3FE3333333333333016203626172016B3FE6666666666666016203626172016C3FE999999999999A016203666F6F01693FD999999999999A016203666F6F016A3FD999999999999A016203666F6F016B3FD999999999999A016203666F6F016C3FD999999999999A"}}
+{"expression":"join(a,b,f(a,b)(max(a,b)))","inputs":{"a":"0x030101790101780302036261723FC999999999999A3FD999999999999A3FE333333333333303666F6F3FB999999999999A3FD33333333333333FE0000000000000","b":"0x0301017901017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF666666666666603666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE6666666666666"},"result":{"expect":"0x0301017902017803017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF666666666666603666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FD33333333333333FD33333333333333FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE00000000000003FE33333333333333FE6666666666666"}}
+{"expression":"join(a,b,f(a,b)(max(a,b)))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB3333333333330161016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD0161016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE6666666666660161016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000016201693FE33333333333333FE66666666666663FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB3333333333330162016A3FE33333333333333FE66666666666663FF00000000000003FF66666666666663FFCCCCCCCCCCCCD0162016B3FE33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE6666666666660162016C3FE33333333333333FE999999999999A3FF33333333333333FF999999999999A4000000000000000016301693FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FFB3333333333330163016A3FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FFCCCCCCCCCCCCD0163016B3FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF80000000000003FFE6666666666660163016C3FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF999999999999A4000000000000000"}}
+{"expression":"join(a,b,f(a,b)((a+b)/(a*b)))","inputs":{"a":"0x02003FB999999999999A","b":"0x02003FB999999999999A"},"result":{"expect":"0x02004033FFFFFFFFFFFF"}}
+{"expression":"join(a,b,f(a,b)((a+b)/(a*b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02010178054033FFFFFFFFFFFF4023FFFFFFFFFFFF401AAAAAAAAAAAAB4013FFFFFFFFFFFF4010000000000000"}}
+{"expression":"join(a,b,f(a,b)((a+b)/(a*b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010178033FB999999999999A3FC999999999999A3FD3333333333333"},"result":{"expect":"0x02010178034033FFFFFFFFFFFF4023FFFFFFFFFFFF401AAAAAAAAAAAAB"}}
+{"expression":"join(a,b,f(a,b)((a+b)/(a*b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02010179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000"},"result":{"expect":"0x02020178050179054033FFFFFFFFFFFF402E000000000000402AAAAAAAAAAAAB4028FFFFFFFFFFFF4027FFFFFFFFFFFF402E0000000000004023FFFFFFFFFFFF4020AAAAAAAAAAAB401E000000000000401BFFFFFFFFFFFF402AAAAAAAAAAAAB4020AAAAAAAAAAAB401AAAAAAAAAAAAB401755555555555540155555555555564028FFFFFFFFFFFF401E00000000000040175555555555554013FFFFFFFFFFFF40120000000000004027FFFFFFFFFFFF401BFFFFFFFFFFFF401555555555555640120000000000004010000000000000"}}
+{"expression":"join(a,b,f(a,b)((a+b)/(a*b)))","inputs":{"a":"0x02010178053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE0000000000000","b":"0x02020178050179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A400266666666666640033333333333334004000000000000"},"result":{"expect":"0x02020178050179054033FFFFFFFFFFFF402E000000000000402AAAAAAAAAAAAB4028FFFFFFFFFFFF4027FFFFFFFFFFFF401AAAAAAAAAAAAB4019B6DB6DB6DB6E4018FFFFFFFFFFFF401871C71C71C71C4017FFFFFFFFFFFF4010F83E0F83E0F84010AAAAAAAAAAAB4010690690690691401030C30C30C30C40100000000000014008FFFFFFFFFFFF4008B4B4B4B4B4B5400871C71C71C71C400835E50D79435E4007FFFFFFFFFFFF4003CF3CF3CF3CF44003A2E8BA2E8BA340037A6F4DE9BD3840035555555555554003333333333333"}}
+{"expression":"join(a,b,f(a,b)((a+b)/(a*b)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x02020178040179043FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A"},"result":{"expect":"0x02020178030179044033FFFFFFFFFFFF4023FFFFFFFFFFFF401AAAAAAAAAAAAB4013FFFFFFFFFFFF400D5555555555564008C30C30C30C3040056DB6DB6DB6DC4002E38E38E38E394000295FAD40A57E3FFD5555555555563FFADA67D508F3783FF8C30C30C30C30"}}
+{"expression":"join(a,b,f(a,b)((a+b)/(a*b)))","inputs":{"a":"0x02020178030179053FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0202017905017A073FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF80000000000003FF999999999999A3FFB3333333333333FFCCCCCCCCCCCCD3FFE66666666666640000000000000004000CCCCCCCCCCCD400199999999999A4002666666666666400333333333333340040000000000004004CCCCCCCCCCCD400599999999999A4006666666666666400733333333333340080000000000004008CCCCCCCCCCCD400999999999999A400A666666666666400B333333333333400C000000000000"},"result":{"expect":"0x0203017803017905017A074033FFFFFFFFFFFF402E000000000000402AAAAAAAAAAAAB4028FFFFFFFFFFFF4027FFFFFFFFFFFF40275555555555554026DB6DB6DB6DB74018FFFFFFFFFFFF401871C71C71C71C4017FFFFFFFFFFFF4017A2E8BA2E8BA24017555555555555401713B13B13B13B4016DB6DB6DB6DB74010000000000001400FAAAAAAAAAAAC400F5F5F5F5F5F5F400F1C71C71C71C7400EE08FB823EE09400EAAAAAAAAAAAA400E79E79E79E79E4007A2E8BA2E8BA240077A6F4DE9BD3840075555555555554007333333333333400713B13B13B13B4006F684BDA12F684006DB6DB6DB6DB74002C234F72C234F4002AAAAAAAAAAAB400294A5294A5295400280000000000040026C9B26C9B26D40025A5A5A5A5A5A40024924924924924027555555555555401AAAAAAAAAAAAB40140000000000004010AAAAAAAAAAAB400D555555555556400AAAAAAAAAAAAB4008C30C30C30C3040056DB6DB6DB6DC400451451451451540036DB6DB6DB6DC4002B3884FCACE214002186186186186400195195195195240012492492492493FFEAAAAAAAAAAA93FFE0000000000003FFD6969696969693FFCE38E38E38E383FFC6BCA1AF286BD3FFBFFFFFFFFFFFF3FFB9E79E79E79E83FF90CEDE62433B73FF8BBFB0D9A96E13FF871C71C71C71C3FF82D82D82D82D83FF7EE7EE7EE7EE73FF7B425ED097B423FF77DF7DF7DF7DF3FF58469EE58469F3FF55555555555553FF5294A5294A5293FF50000000000003FF4D9364D9364D93FF4B4B4B4B4B4B53FF49249249249254025D1745D1745D24017A2E8BA2E8BA24010F83E0F83E0F8400B45D1745D1745400745D1745D174640049B26C9B26C9B4002B3884FCACE214000AAAAAAAAAAAB3FFF1C71C71C71C73FFD5555555555563FFBE0F83E0F83E03FFAAAAAAAAAAAAB3FF9A41A41A41A413FF8C30C30C30C303FF6F96F96F96F963FF64EC4EC4EC4ED3FF5B82E55B82E563FF53253253253253FF4BA8F07414BAA3FF44EC4EC4EC4EC3FF3ED3ED3ED3ED43FF2B3884FCACE213FF262957741314B3FF21861861861863FF1D41D41D41D423FF19519519519523FF15AC056B015AC3FF12492492492493FF02F149902F14A3FF00000000000003FEFA7E9FA7E9FA73FEF5555555555543FEF07C1F07C1F093FEEBEBEBEBEBEC03FEE79E79E79E79E"}}
+{"expression":"join(a,b,f(a,b)((a+b)/(a*b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333"},"result":{"expect":"0x010101780301614033FFFFFFFFFFFF01624023FFFFFFFFFFFF0163401AAAAAAAAAAAAB"}}
+{"expression":"join(a,b,f(a,b)((a+b)/(a*b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010101780201613FB999999999999A01623FC999999999999A"},"result":{"expect":"0x010101780201614033FFFFFFFFFFFF01624023FFFFFFFFFFFF"}}
+{"expression":"join(a,b,f(a,b)((a+b)/(a*b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x0101017903036261723FC999999999999A0362617A3FD333333333333303666F6F3FB999999999999A"},"result":{"expect":"0x01020178017909016103626172402E00000000000001610362617A402AAAAAAAAAAAAB016103666F6F4033FFFFFFFFFFFF0162036261724023FFFFFFFFFFFF01620362617A4020AAAAAAAAAAAB016203666F6F402E0000000000000163036261724020AAAAAAAAAAAB01630362617A401AAAAAAAAAAAAB016303666F6F402AAAAAAAAAAAAB"}}
+{"expression":"join(a,b,f(a,b)((a+b)/(a*b)))","inputs":{"a":"0x010101780301613FB999999999999A01623FC999999999999A01633FD3333333333333","b":"0x010201780179090161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A0163036261723FE999999999999A01630362617A3FECCCCCCCCCCCCD016303666F6F3FE6666666666666"},"result":{"expect":"0x01020178017909016103626172402E00000000000001610362617A402AAAAAAAAAAAAB016103666F6F4033FFFFFFFFFFFF016203626172401BFFFFFFFFFFFF01620362617A401AAAAAAAAAAAAB016203666F6F401E000000000000016303626172401255555555555601630362617A4011C71C71C71C71016303666F6F40130C30C30C30C3"}}
+{"expression":"join(a,b,f(a,b)((a+b)/(a*b)))","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x010201780179060161036261723FC999999999999A016103666F6F3FB999999999999A0162036261723FD999999999999A016203666F6F3FD33333333333330163036261723FE3333333333333016303666F6F3FE0000000000000"},"result":{"expect":"0x010201780179040161036261724023FFFFFFFFFFFF016103666F6F4033FFFFFFFFFFFF0162036261724012000000000000016203666F6F4017555555555555"}}
+{"expression":"join(a,b,f(a,b)((a+b)/(a*b)))","inputs":{"a":"0x010201780179060161036261723FC999999999999A01610362617A3FD3333333333333016103666F6F3FB999999999999A0162036261723FE000000000000001620362617A3FE3333333333333016203666F6F3FD999999999999A","b":"0x01020179017A080362617201693FE000000000000003626172016A3FE333333333333303626172016B3FE666666666666603626172016C3FE999999999999A03666F6F01693FB999999999999A03666F6F016A3FC999999999999A03666F6F016B3FD333333333333303666F6F016C3FD999999999999A"},"result":{"expect":"0x010301780179017A100161036261720169401BFFFFFFFFFFFF016103626172016A401AAAAAAAAAAAAB016103626172016B4019B6DB6DB6DB6E016103626172016C4018FFFFFFFFFFFF016103666F6F01694033FFFFFFFFFFFF016103666F6F016A402E000000000000016103666F6F016B402AAAAAAAAAAAAB016103666F6F016C4028FFFFFFFFFFFF01620362617201694010000000000000016203626172016A400D555555555556016203626172016B400B6DB6DB6DB6DC016203626172016C400A000000000000016203666F6F01694028FFFFFFFFFFFF016203666F6F016A401E000000000000016203666F6F016B4017555555555555016203666F6F016C4013FFFFFFFFFFFF"}}
+{"expression":"join(a,b,f(a,b)((a+b)/(a*b)))","inputs":{"a":"0x030101790101780302036261723FC999999999999A3FD999999999999A3FE333333333333303666F6F3FB999999999999A3FD33333333333333FE0000000000000","b":"0x0301017901017A0702036261723FE999999999999A3FECCCCCCCCCCCCD3FF00000000000003FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF666666666666603666F6F3FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE00000000000003FE33333333333333FE6666666666666"},"result":{"expect":"0x0301017902017803017A0702036261724018FFFFFFFFFFFF401871C71C71C71C4017FFFFFFFFFFFF4017A2E8BA2E8BA24017555555555555401713B13B13B13B4016DB6DB6DB6DB7400E000000000000400CE38E38E38E38400BFFFFFFFFFFFF400B45D1745D1745400AAAAAAAAAAAAB400A2762762762774009B6DB6DB6DB6E4007555555555555400638E38E38E38E400555555555555640049B26C9B26C9B400400000000000040037CB7CB7CB7CB40030C30C30C30C303666F6F4033FFFFFFFFFFFF402E000000000000402AAAAAAAAAAAAB4028FFFFFFFFFFFF4027FFFFFFFFFFFF40275555555555554026DB6DB6DB6DB7402AAAAAAAAAAAAB4020AAAAAAAAAAAB401AAAAAAAAAAAAB40175555555555554015555555555556401400000000000040130C30C30C30C34027FFFFFFFFFFFF401BFFFFFFFFFFFF401555555555555640120000000000004010000000000000400D555555555556400B6DB6DB6DB6DC"}}
+{"expression":"join(a,b,f(a,b)((a+b)/(a*b)))","inputs":{"a":"0x03010178010179050301613FB999999999999A3FC999999999999A3FD33333333333333FD999999999999A3FE000000000000001623FE33333333333333FE66666666666663FE999999999999A3FECCCCCCCCCCCCD3FF000000000000001633FF199999999999A3FF33333333333333FF4CCCCCCCCCCCD3FF66666666666663FF8000000000000","b":"0x0301017A010179050401693FB999999999999A3FE00000000000003FECCCCCCCCCCCCD3FF4CCCCCCCCCCCD3FFB333333333333016A3FC999999999999A3FE33333333333333FF00000000000003FF66666666666663FFCCCCCCCCCCCCD016B3FD33333333333333FE66666666666663FF199999999999A3FF80000000000003FFE666666666666016C3FD999999999999A3FE999999999999A3FF33333333333333FF999999999999A4000000000000000"},"result":{"expect":"0x03020178017A010179050C016101694033FFFFFFFFFFFF401BFFFFFFFFFFFF4011C71C71C71C71400A2762762762774004B4B4B4B4B4B50161016A402E000000000000401AAAAAAAAAAAAB40115555555555564009B6DB6DB6DB6E400471C71C71C71C0161016B402AAAAAAAAAAAAB4019B6DB6DB6DB6E4010F83E0F83E0F84009555555555554400435E50D79435E0161016C4028FFFFFFFFFFFF4018FFFFFFFFFFFF4010AAAAAAAAAAAB4008FFFFFFFFFFFF4004000000000000016201694027555555555555400B6DB6DB6DB6DC4002E38E38E38E393FFE15E15E15E15E3FF969696969696A0162016A401AAAAAAAAAAAAB4008C30C30C30C3040020000000000003FFD34D34D34D34D3FF8E38E38E38E380162016B40140000000000004006DB6DB6DB6DB7400145D1745D17463FFC71C71C71C71C3FF86BCA1AF286BD0162016C4010AAAAAAAAAAAB40056DB6DB6DB6DC4000AAAAAAAAAAAB3FFBC71C71C71C713FF8000000000000016301694025D1745D1745D24006AAAAAAAAAAAB3FFE15E15E15E15E3FF7BC7BC7BC7BC93FF41414141414150163016A4017A2E8BA2E8BA240040000000000003FFC4EC4EC4EC4EB3FF6DB6DB6DB6DB73FF38E38E38E38E30163016B4010F83E0F83E0F840021861861861863FFADA67D508F3783FF61861861861873FF31674C59D31680163016C400B45D1745D17454000AAAAAAAAAAAB3FF9A41A41A41A413FF56DB6DB6DB6DC3FF2AAAAAAAAAAAB"}}
+{"expression":"reduce(a*b,sum)","inputs":{"a":"0x0201017803400000000000000040080000000000004014000000000000","b":"0x0201017803401C0000000000004026000000000000402A000000000000"},"result":{"expect":"0x0200405C000000000000"}}
+{"expression":"reduce(a*b,sum)","inputs":{"a":"0x020101780240000000000000004008000000000000","b":"0x0201017803401C0000000000004026000000000000402A000000000000"},"result":{"expect":"0x02004047800000000000"}}
+{"expression":"reduce(a*b,sum)","inputs":{"a":"0x0201017803400000000000000040080000000000004014000000000000","b":"0x0201017802401C0000000000004026000000000000"},"result":{"expect":"0x02004047800000000000"}}
+{"expression":"concat(a,b,x)","inputs":{"a":"0x02004024000000000000","b":"0x02004034000000000000"},"result":{"expect":"0x020101780240240000000000004034000000000000"}}
+{"expression":"concat(a,b,x)","inputs":{"a":"0x02010178014024000000000000","b":"0x02004034000000000000"},"result":{"expect":"0x020101780240240000000000004034000000000000"}}
+{"expression":"concat(a,b,x)","inputs":{"a":"0x02004024000000000000","b":"0x02010178014034000000000000"},"result":{"expect":"0x020101780240240000000000004034000000000000"}}
+{"expression":"concat(a,b,x)","inputs":{"a":"0x02010178033FF000000000000040000000000000004008000000000000","b":"0x020101780240100000000000004014000000000000"},"result":{"expect":"0x02010178053FF00000000000004000000000000000400800000000000040100000000000004014000000000000"}}
+{"expression":"concat(a,b,y)","inputs":{"a":"0x02020178020179023FF0000000000000400000000000000040080000000000004010000000000000","b":"0x020101790240140000000000004018000000000000"},"result":{"expect":"0x02020178020179043FF00000000000004000000000000000401400000000000040180000000000004008000000000000401000000000000040140000000000004018000000000000"}}
+{"expression":"concat(a,b,x)","inputs":{"a":"0x02020178020179023FF0000000000000400000000000000040080000000000004010000000000000","b":"0x020101780240140000000000004018000000000000"},"result":{"expect":"0x02020178040179023FF00000000000004000000000000000400800000000000040100000000000004014000000000000401400000000000040180000000000004018000000000000"}}
+{"expression":"concat(a,b,x)","inputs":{"a":"0x0201017A033FF000000000000040000000000000004008000000000000","b":"0x020101790240100000000000004014000000000000"},"result":{"expect":"0x0203017802017902017A033FF0000000000000400000000000000040080000000000003FF000000000000040000000000000004008000000000000401000000000000040100000000000004010000000000000401400000000000040140000000000004014000000000000"}}
+{"expression":"concat(a,b,x)","inputs":{"a":"0x02010179033FF000000000000040000000000000004008000000000000","b":"0x020101790240100000000000004014000000000000"},"result":{"expect":"0x02020178020179023FF0000000000000400000000000000040100000000000004014000000000000"}}
+{"expression":"rename(a,x,y)","inputs":{"a":"0x02010178053FF00000000000004000000000000000400800000000000040100000000000004014000000000000"},"result":{"expect":"0x02010179053FF00000000000004000000000000000400800000000000040100000000000004014000000000000"}}
+{"expression":"rename(a,y,x)","inputs":{"a":"0x0202017905017A053FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E0000000000004030000000000000403100000000000040320000000000004033000000000000403400000000000040350000000000004036000000000000403700000000000040380000000000004039000000000000"},"result":{"expect":"0x0202017805017A053FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E0000000000004030000000000000403100000000000040320000000000004033000000000000403400000000000040350000000000004036000000000000403700000000000040380000000000004039000000000000"}}
+{"expression":"rename(a,z,x)","inputs":{"a":"0x0202017905017A053FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E0000000000004030000000000000403100000000000040320000000000004033000000000000403400000000000040350000000000004036000000000000403700000000000040380000000000004039000000000000"},"result":{"expect":"0x02020178050179053FF000000000000040180000000000004026000000000000403000000000000040350000000000004000000000000000401C00000000000040280000000000004031000000000000403600000000000040080000000000004020000000000000402A0000000000004032000000000000403700000000000040100000000000004022000000000000402C0000000000004033000000000000403800000000000040140000000000004024000000000000402E00000000000040340000000000004039000000000000"}}
+{"expression":"rename(a,x,z)","inputs":{"a":"0x02020178050179053FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E0000000000004030000000000000403100000000000040320000000000004033000000000000403400000000000040350000000000004036000000000000403700000000000040380000000000004039000000000000"},"result":{"expect":"0x0202017905017A053FF000000000000040180000000000004026000000000000403000000000000040350000000000004000000000000000401C00000000000040280000000000004031000000000000403600000000000040080000000000004020000000000000402A0000000000004032000000000000403700000000000040100000000000004022000000000000402C0000000000004033000000000000403800000000000040140000000000004024000000000000402E00000000000040340000000000004039000000000000"}}
+{"expression":"rename(a,y,z)","inputs":{"a":"0x02020178050179053FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E0000000000004030000000000000403100000000000040320000000000004033000000000000403400000000000040350000000000004036000000000000403700000000000040380000000000004039000000000000"},"result":{"expect":"0x0202017805017A053FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E0000000000004030000000000000403100000000000040320000000000004033000000000000403400000000000040350000000000004036000000000000403700000000000040380000000000004039000000000000"}}
+{"expression":"rename(a,(x,y),(y,x))","inputs":{"a":"0x02020178050179053FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E0000000000004030000000000000403100000000000040320000000000004033000000000000403400000000000040350000000000004036000000000000403700000000000040380000000000004039000000000000"},"result":{"expect":"0x02020178050179053FF000000000000040180000000000004026000000000000403000000000000040350000000000004000000000000000401C00000000000040280000000000004031000000000000403600000000000040080000000000004020000000000000402A0000000000004032000000000000403700000000000040100000000000004022000000000000402C0000000000004033000000000000403800000000000040140000000000004024000000000000402E00000000000040340000000000004039000000000000"}}
+{"expression":"tensor(x[10])(x+1)","inputs":{},"result":{"expect":"0x020101780A3FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C000000000000402000000000000040220000000000004024000000000000"}}
+{"expression":"tensor(x[5],y[4])(x*4+(y+1))","inputs":{},"result":{"expect":"0x02020178050179043FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E00000000000040300000000000004031000000000000403200000000000040330000000000004034000000000000"}}
+{"expression":"tensor(x[5],y[4])(x==y)","inputs":{},"result":{"expect":"0x02020178050179043FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000000000000000000000000000000000000000000000000000000000000000000000"}}
+{"num_tests":1208}
diff --git a/eval/src/vespa/eval/eval/test/tensor_conformance.cpp b/eval/src/vespa/eval/eval/test/tensor_conformance.cpp
index bd8bdf8cd11..8e9c117756b 100644
--- a/eval/src/vespa/eval/eval/test/tensor_conformance.cpp
+++ b/eval/src/vespa/eval/eval/test/tensor_conformance.cpp
@@ -12,6 +12,7 @@
#include <vespa/vespalib/objects/nbostream.h>
#include <vespa/vespalib/data/slime/slime.h>
#include <vespa/vespalib/io/mapped_file_input.h>
+#include "tensor_model.hpp"
namespace vespalib {
namespace eval {
@@ -22,237 +23,6 @@ using slime::Cursor;
using slime::Inspector;
using slime::JsonFormat;
-// Random access sequence of numbers
-struct Sequence {
- virtual double operator[](size_t i) const = 0;
- virtual ~Sequence() {}
-};
-
-// Sequence of natural numbers (starting at 1)
-struct N : Sequence {
- double operator[](size_t i) const override { return (1.0 + i); }
-};
-
-// Sequence of another sequence divided by 10
-struct Div10 : Sequence {
- const Sequence &seq;
- Div10(const Sequence &seq_in) : seq(seq_in) {}
- double operator[](size_t i) const override { return (seq[i] / 10.0); }
-};
-
-// Sequence of another sequence minus 2
-struct Sub2 : Sequence {
- const Sequence &seq;
- Sub2(const Sequence &seq_in) : seq(seq_in) {}
- double operator[](size_t i) const override { return (seq[i] - 2.0); }
-};
-
-// Sequence of a unary operator applied to a sequence
-struct OpSeq : Sequence {
- const Sequence &seq;
- const UnaryOperation &op;
- OpSeq(const Sequence &seq_in, const UnaryOperation &op_in) : seq(seq_in), op(op_in) {}
- double operator[](size_t i) const override { return op.eval(seq[i]); }
-};
-
-// Sequence of applying sigmoid to another sequence
-struct Sigmoid : Sequence {
- const Sequence &seq;
- Sigmoid(const Sequence &seq_in) : seq(seq_in) {}
- double operator[](size_t i) const override { return operation::Sigmoid().eval(seq[i]); }
-};
-
-// pre-defined sequence of numbers
-struct Seq : Sequence {
- std::vector<double> seq;
- Seq() : seq() {}
- Seq(const std::vector<double> &seq_in) : seq(seq_in) {}
- double operator[](size_t i) const override {
- ASSERT_LESS(i, seq.size());
- return seq[i];
- }
-};
-
-// Random access bit mask
-struct Mask {
- virtual bool operator[](size_t i) const = 0;
- virtual ~Mask() {}
-};
-
-// Mask with all bits set
-struct All : Mask {
- bool operator[](size_t) const override { return true; }
-};
-
-// Mask with no bits set
-struct None : Mask {
- bool operator[](size_t) const override { return false; }
-};
-
-// Mask with false for each Nth index
-struct SkipNth : Mask {
- size_t n;
- SkipNth(size_t n_in) : n(n_in) {}
- bool operator[](size_t i) const override { return (i % n) != 0; }
-};
-
-// pre-defined mask
-struct Bits : Mask {
- std::vector<bool> bits;
- Bits(const std::vector<bool> &bits_in) : bits(bits_in) {}
- ~Bits() { }
- bool operator[](size_t i) const override {
- ASSERT_LESS(i, bits.size());
- return bits[i];
- }
-};
-
-// A mask converted to a sequence of two unique values (mapped from true and false)
-struct Mask2Seq : Sequence {
- const Mask &mask;
- double true_value;
- double false_value;
- Mask2Seq(const Mask &mask_in, double true_value_in = 1.0, double false_value_in = 0.0)
- : mask(mask_in), true_value(true_value_in), false_value(false_value_in) {}
- double operator[](size_t i) const override { return mask[i] ? true_value : false_value; }
-};
-
-// custom op1
-struct MyOp : CustomUnaryOperation {
- double eval(double a) const override { return ((a + 1) * 2); }
-};
-
-// A collection of labels for a single dimension
-struct Domain {
- vespalib::string dimension;
- size_t size; // indexed
- std::vector<vespalib::string> keys; // mapped
- Domain(const vespalib::string &dimension_in, size_t size_in)
- : dimension(dimension_in), size(size_in), keys() {}
- Domain(const vespalib::string &dimension_in, const std::vector<vespalib::string> &keys_in)
- : dimension(dimension_in), size(0), keys(keys_in) {}
- ~Domain();
-};
-
-Domain::~Domain() { }
-
-using Layout = std::vector<Domain>;
-
-Domain x() { return Domain("x", {}); }
-Domain x(size_t size) { return Domain("x", size); }
-Domain x(const std::vector<vespalib::string> &keys) { return Domain("x", keys); }
-
-Domain y() { return Domain("y", {}); }
-Domain y(size_t size) { return Domain("y", size); }
-Domain y(const std::vector<vespalib::string> &keys) { return Domain("y", keys); }
-
-Domain z(size_t size) { return Domain("z", size); }
-Domain z(const std::vector<vespalib::string> &keys) { return Domain("z", keys); }
-
-// Infer the tensor type spanned by the given spaces
-vespalib::string infer_type(const Layout &layout) {
- if (layout.empty()) {
- return "double";
- }
- std::vector<ValueType::Dimension> dimensions;
- for (const auto &domain: layout) {
- if (domain.size == 0) {
- dimensions.emplace_back(domain.dimension); // mapped
- } else {
- dimensions.emplace_back(domain.dimension, domain.size); // indexed
- }
- }
- return ValueType::tensor_type(dimensions).to_spec();
-}
-
-// Wrapper for the things needed to generate a tensor
-struct Source {
- using Address = TensorSpec::Address;
-
- const Layout &layout;
- const Sequence &seq;
- const Mask &mask;
- Source(const Layout &layout_in, const Sequence &seq_in, const Mask &mask_in)
- : layout(layout_in), seq(seq_in), mask(mask_in) {}
-};
-
-// Mix layout with a number sequence to make a tensor spec
-class TensorSpecBuilder
-{
-private:
- using Label = TensorSpec::Label;
- using Address = TensorSpec::Address;
-
- Source _source;
- TensorSpec _spec;
- Address _addr;
- size_t _idx;
-
- void generate(size_t layout_idx) {
- if (layout_idx == _source.layout.size()) {
- if (_source.mask[_idx]) {
- _spec.add(_addr, _source.seq[_idx]);
- }
- ++_idx;
- } else {
- const Domain &domain = _source.layout[layout_idx];
- if (domain.size > 0) { // indexed
- for (size_t i = 0; i < domain.size; ++i) {
- _addr.emplace(domain.dimension, Label(i)).first->second = Label(i);
- generate(layout_idx + 1);
- }
- } else { // mapped
- for (const vespalib::string &key: domain.keys) {
- _addr.emplace(domain.dimension, Label(key)).first->second = Label(key);
- generate(layout_idx + 1);
- }
- }
- }
- }
-
-public:
- TensorSpecBuilder(const Layout &layout, const Sequence &seq, const Mask &mask)
- : _source(layout, seq, mask), _spec(infer_type(layout)), _addr(), _idx(0) {}
- TensorSpec build() {
- generate(0);
- return _spec;
- }
-};
-TensorSpec spec(const Layout &layout, const Sequence &seq, const Mask &mask) {
- return TensorSpecBuilder(layout, seq, mask).build();
-}
-TensorSpec spec(const Layout &layout, const Sequence &seq) {
- return spec(layout, seq, All());
-}
-TensorSpec spec(const Layout &layout) {
- return spec(layout, Seq(), None());
-}
-TensorSpec spec(const Domain &domain, const Sequence &seq, const Mask &mask) {
- return spec(Layout({domain}), seq, mask);
-}
-TensorSpec spec(const Domain &domain, const Sequence &seq) {
- return spec(Layout({domain}), seq);
-}
-TensorSpec spec(const Domain &domain) {
- return spec(Layout({domain}));
-}
-TensorSpec spec(double value) {
- return spec(Layout({}), Seq({value}));
-}
-TensorSpec spec() {
- return spec(Layout({}));
-}
-
-TensorSpec spec(const vespalib::string &type,
- const std::vector<std::pair<TensorSpec::Address, TensorSpec::Value>> &cells) {
- TensorSpec spec("tensor(" + type + ")");
-
- for (const auto &cell : cells) {
- spec.add(cell.first, cell.second);
- }
- return spec;
-}
-
double as_double(const TensorSpec &spec) {
return spec.cells().empty() ? 0.0 : spec.cells().begin()->second.value;
}
diff --git a/eval/src/vespa/eval/eval/test/tensor_model.hpp b/eval/src/vespa/eval/eval/test/tensor_model.hpp
new file mode 100644
index 00000000000..8f031174289
--- /dev/null
+++ b/eval/src/vespa/eval/eval/test/tensor_model.hpp
@@ -0,0 +1,247 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/eval/eval/tensor_spec.h>
+#include <vespa/eval/eval/value_type.h>
+#include <vespa/eval/eval/operation.h>
+
+namespace vespalib {
+namespace eval {
+namespace test {
+
+// Random access sequence of numbers
+struct Sequence {
+ virtual double operator[](size_t i) const = 0;
+ virtual ~Sequence() {}
+};
+
+// Sequence of natural numbers (starting at 1)
+struct N : Sequence {
+ double operator[](size_t i) const override { return (1.0 + i); }
+};
+
+// Sequence of another sequence divided by 10
+struct Div10 : Sequence {
+ const Sequence &seq;
+ Div10(const Sequence &seq_in) : seq(seq_in) {}
+ double operator[](size_t i) const override { return (seq[i] / 10.0); }
+};
+
+// Sequence of another sequence minus 2
+struct Sub2 : Sequence {
+ const Sequence &seq;
+ Sub2(const Sequence &seq_in) : seq(seq_in) {}
+ double operator[](size_t i) const override { return (seq[i] - 2.0); }
+};
+
+// Sequence of a unary operator applied to a sequence
+struct OpSeq : Sequence {
+ const Sequence &seq;
+ const UnaryOperation &op;
+ OpSeq(const Sequence &seq_in, const UnaryOperation &op_in) : seq(seq_in), op(op_in) {}
+ double operator[](size_t i) const override { return op.eval(seq[i]); }
+};
+
+// Sequence of applying sigmoid to another sequence
+struct Sigmoid : Sequence {
+ const Sequence &seq;
+ Sigmoid(const Sequence &seq_in) : seq(seq_in) {}
+ double operator[](size_t i) const override { return operation::Sigmoid().eval(seq[i]); }
+};
+
+// pre-defined sequence of numbers
+struct Seq : Sequence {
+ std::vector<double> seq;
+ Seq() : seq() {}
+ Seq(const std::vector<double> &seq_in) : seq(seq_in) {}
+ double operator[](size_t i) const override {
+ ASSERT_LESS(i, seq.size());
+ return seq[i];
+ }
+};
+
+// Random access bit mask
+struct Mask {
+ virtual bool operator[](size_t i) const = 0;
+ virtual ~Mask() {}
+};
+
+// Mask with all bits set
+struct All : Mask {
+ bool operator[](size_t) const override { return true; }
+};
+
+// Mask with no bits set
+struct None : Mask {
+ bool operator[](size_t) const override { return false; }
+};
+
+// Mask with false for each Nth index
+struct SkipNth : Mask {
+ size_t n;
+ SkipNth(size_t n_in) : n(n_in) {}
+ bool operator[](size_t i) const override { return (i % n) != 0; }
+};
+
+// pre-defined mask
+struct Bits : Mask {
+ std::vector<bool> bits;
+ Bits(const std::vector<bool> &bits_in) : bits(bits_in) {}
+ ~Bits() { }
+ bool operator[](size_t i) const override {
+ ASSERT_LESS(i, bits.size());
+ return bits[i];
+ }
+};
+
+// A mask converted to a sequence of two unique values (mapped from true and false)
+struct Mask2Seq : Sequence {
+ const Mask &mask;
+ double true_value;
+ double false_value;
+ Mask2Seq(const Mask &mask_in, double true_value_in = 1.0, double false_value_in = 0.0)
+ : mask(mask_in), true_value(true_value_in), false_value(false_value_in) {}
+ double operator[](size_t i) const override { return mask[i] ? true_value : false_value; }
+};
+
+// custom op1
+struct MyOp : CustomUnaryOperation {
+ double eval(double a) const override { return ((a + 1) * 2); }
+};
+
+// A collection of labels for a single dimension
+struct Domain {
+ vespalib::string dimension;
+ size_t size; // indexed
+ std::vector<vespalib::string> keys; // mapped
+ Domain(const Domain &);
+ Domain(const vespalib::string &dimension_in, size_t size_in)
+ : dimension(dimension_in), size(size_in), keys() {}
+ Domain(const vespalib::string &dimension_in, const std::vector<vespalib::string> &keys_in)
+ : dimension(dimension_in), size(0), keys(keys_in) {}
+ ~Domain();
+};
+Domain::Domain(const Domain &) = default;
+Domain::~Domain() {}
+
+using Layout = std::vector<Domain>;
+
+Domain x() { return Domain("x", {}); }
+Domain x(size_t size) { return Domain("x", size); }
+Domain x(const std::vector<vespalib::string> &keys) { return Domain("x", keys); }
+
+Domain y() { return Domain("y", {}); }
+Domain y(size_t size) { return Domain("y", size); }
+Domain y(const std::vector<vespalib::string> &keys) { return Domain("y", keys); }
+
+Domain z() { return Domain("z", {}); }
+Domain z(size_t size) { return Domain("z", size); }
+Domain z(const std::vector<vespalib::string> &keys) { return Domain("z", keys); }
+
+// Infer the tensor type spanned by the given spaces
+vespalib::string infer_type(const Layout &layout) {
+ if (layout.empty()) {
+ return "double";
+ }
+ std::vector<ValueType::Dimension> dimensions;
+ for (const auto &domain: layout) {
+ if (domain.size == 0) {
+ dimensions.emplace_back(domain.dimension); // mapped
+ } else {
+ dimensions.emplace_back(domain.dimension, domain.size); // indexed
+ }
+ }
+ return ValueType::tensor_type(dimensions).to_spec();
+}
+
+// Wrapper for the things needed to generate a tensor
+struct Source {
+ using Address = TensorSpec::Address;
+
+ const Layout &layout;
+ const Sequence &seq;
+ const Mask &mask;
+ Source(const Layout &layout_in, const Sequence &seq_in, const Mask &mask_in)
+ : layout(layout_in), seq(seq_in), mask(mask_in) {}
+};
+
+// Mix layout with a number sequence to make a tensor spec
+class TensorSpecBuilder
+{
+private:
+ using Label = TensorSpec::Label;
+ using Address = TensorSpec::Address;
+
+ Source _source;
+ TensorSpec _spec;
+ Address _addr;
+ size_t _idx;
+
+ void generate(size_t layout_idx) {
+ if (layout_idx == _source.layout.size()) {
+ if (_source.mask[_idx]) {
+ _spec.add(_addr, _source.seq[_idx]);
+ }
+ ++_idx;
+ } else {
+ const Domain &domain = _source.layout[layout_idx];
+ if (domain.size > 0) { // indexed
+ for (size_t i = 0; i < domain.size; ++i) {
+ _addr.emplace(domain.dimension, Label(i)).first->second = Label(i);
+ generate(layout_idx + 1);
+ }
+ } else { // mapped
+ for (const vespalib::string &key: domain.keys) {
+ _addr.emplace(domain.dimension, Label(key)).first->second = Label(key);
+ generate(layout_idx + 1);
+ }
+ }
+ }
+ }
+
+public:
+ TensorSpecBuilder(const Layout &layout, const Sequence &seq, const Mask &mask)
+ : _source(layout, seq, mask), _spec(infer_type(layout)), _addr(), _idx(0) {}
+ TensorSpec build() {
+ generate(0);
+ return _spec;
+ }
+};
+TensorSpec spec(const Layout &layout, const Sequence &seq, const Mask &mask) {
+ return TensorSpecBuilder(layout, seq, mask).build();
+}
+TensorSpec spec(const Layout &layout, const Sequence &seq) {
+ return spec(layout, seq, All());
+}
+TensorSpec spec(const Layout &layout) {
+ return spec(layout, Seq(), None());
+}
+TensorSpec spec(const Domain &domain, const Sequence &seq, const Mask &mask) {
+ return spec(Layout({domain}), seq, mask);
+}
+TensorSpec spec(const Domain &domain, const Sequence &seq) {
+ return spec(Layout({domain}), seq);
+}
+TensorSpec spec(const Domain &domain) {
+ return spec(Layout({domain}));
+}
+TensorSpec spec(double value) {
+ return spec(Layout({}), Seq({value}));
+}
+TensorSpec spec() {
+ return spec(Layout({}));
+}
+
+TensorSpec spec(const vespalib::string &type,
+ const std::vector<std::pair<TensorSpec::Address, TensorSpec::Value>> &cells) {
+ TensorSpec spec("tensor(" + type + ")");
+
+ for (const auto &cell : cells) {
+ spec.add(cell.first, cell.second);
+ }
+ return spec;
+}
+
+} // namespace vespalib::eval::test
+} // namespace vespalib::eval
+} // namespace vespalib
diff --git a/filedistribution/src/vespa/filedistribution/distributor/filedownloader.cpp b/filedistribution/src/vespa/filedistribution/distributor/filedownloader.cpp
index 9668e09bcc8..b917bc015ec 100644
--- a/filedistribution/src/vespa/filedistribution/distributor/filedownloader.cpp
+++ b/filedistribution/src/vespa/filedistribution/distributor/filedownloader.cpp
@@ -285,7 +285,7 @@ FileDownloader::pathToCompletedFile(const std::string& fileReference) const {
boost::optional<FileDownloader::ResumeDataBuffer>
FileDownloader::getResumeData(const std::string& fileReference) {
- LOG(debug, ("Reading resume data for " + fileReference).c_str());
+ LOG(debug, "Reading resume data for '%s'", fileReference.c_str());
try {
fs::path path = (_dbPath / fileReference).string() + resumeDataSuffix;
if (fs::exists(path)) {
@@ -294,7 +294,7 @@ FileDownloader::getResumeData(const std::string& fileReference) {
std::istream_iterator<char> iterator(file), end;
std::copy(iterator, end, std::back_inserter(result));
- LOG(debug, ("Successfully retrieved resume data for " + fileReference).c_str());
+ LOG(debug, "Successfully retrieved resume data for '%s'", fileReference.c_str());
if (result.size() < 50) {
LOG(info, "Very small resume file %zu bytes.", result.size());
}
@@ -303,7 +303,7 @@ FileDownloader::getResumeData(const std::string& fileReference) {
}
} catch(...) {
//resume data is only an optimization
- LOG(info, ("Error while reading resume data for " + fileReference).c_str());
+ LOG(info, "Error while reading resume data for '%s'", fileReference.c_str());
}
return boost::optional<ResumeDataBuffer>();
}
diff --git a/filedistribution/src/vespa/filedistribution/distributor/filedownloadermanager.cpp b/filedistribution/src/vespa/filedistribution/distributor/filedownloadermanager.cpp
index 669cc550003..1763b798f03 100644
--- a/filedistribution/src/vespa/filedistribution/distributor/filedownloadermanager.cpp
+++ b/filedistribution/src/vespa/filedistribution/distributor/filedownloadermanager.cpp
@@ -14,10 +14,10 @@ using filedistribution::Path;
namespace {
void logStartDownload(const std::set<std::string> & filesToDownload) {
std::ostringstream msg;
- msg <<"StartDownloads:" <<std::endl;
+ msg << "StartDownloads:" << std::endl;
std::copy(filesToDownload.begin(), filesToDownload.end(),
std::ostream_iterator<std::string>(msg, "\n"));
- LOG(debug, msg.str().c_str());
+ LOG(debug, "%s", msg.str().c_str());
}
} //anonymous namespace
diff --git a/filedistribution/src/vespa/filedistribution/model/filedistributionmodelimpl.cpp b/filedistribution/src/vespa/filedistribution/model/filedistributionmodelimpl.cpp
index 9ce31e0dd3a..e0338cffd52 100644
--- a/filedistribution/src/vespa/filedistribution/model/filedistributionmodelimpl.cpp
+++ b/filedistribution/src/vespa/filedistribution/model/filedistributionmodelimpl.cpp
@@ -13,11 +13,11 @@ LOG_SETUP(".filedistributionmodel");
namespace fs = boost::filesystem;
using filedistribution::ZKFileDBModel;
+using std::make_shared;
namespace {
//peer format: hostName:port
-
void
addPeerEntry(const std::string& peer,
filedistribution::FileDistributionModelImpl::PeerEntries& result) {
@@ -73,8 +73,7 @@ struct FileDistributionModelImpl::DeployedFilesChangedCallback :
std::weak_ptr<FileDistributionModelImpl> _parent;
- DeployedFilesChangedCallback(
- const std::shared_ptr<FileDistributionModelImpl> & parent)
+ DeployedFilesChangedCallback(const std::shared_ptr<FileDistributionModelImpl> & parent)
:_parent(parent)
{}
@@ -111,7 +110,7 @@ FileDistributionModelImpl::getPeers(const std::string& fileReference, size_t max
LOG(debug, "Found %zu peers for path '%s'", result.size(), path.string().c_str());
return result;
} catch(ZKNodeDoesNotExistsException&) {
- LOG(debug, ("No peer entries available for " + fileReference).c_str());
+ LOG(debug, "No peer entries available for '%s'", fileReference.c_str());
return PeerEntries();
}
}
@@ -119,8 +118,7 @@ FileDistributionModelImpl::getPeers(const std::string& fileReference, size_t max
fs::path
FileDistributionModelImpl::getPeerEntryPath(const std::string& fileReference) {
std::ostringstream entry;
- entry <<_hostName
- <<ZKFileDBModel::_peerEntrySeparator <<_port;
+ entry <<_hostName << ZKFileDBModel::_peerEntrySeparator <<_port;
return _fileDBModel.getPeersPath(fileReference) / entry.str();
}
@@ -167,8 +165,7 @@ std::set<std::string>
FileDistributionModelImpl::getFilesToDownload() {
DeployedFilesToDownload d(_zk.get());
std::vector<std::string> deployed = d.getDeployedFilesToDownload(_hostName,
- DeployedFilesChangedCallback::SP(
- new DeployedFilesChangedCallback(shared_from_this())));
+ make_shared<DeployedFilesChangedCallback>(shared_from_this()));
std::set<std::string> result(deployed.begin(), deployed.end());
@@ -187,8 +184,7 @@ FileDistributionModelImpl::updateActiveFileReferences(
std::sort(sortedFileReferences.begin(), sortedFileReferences.end());
LockGuard guard(_activeFileReferencesMutex);
- bool changed =
- sortedFileReferences != _activeFileReferences;
+ bool changed = sortedFileReferences != _activeFileReferences;
sortedFileReferences.swap(_activeFileReferences);
return changed;
diff --git a/logforwarder/src/apps/vespa-logforwarder-start/CMakeLists.txt b/logforwarder/src/apps/vespa-logforwarder-start/CMakeLists.txt
index 9a402bb58da..aa5584ec108 100644
--- a/logforwarder/src/apps/vespa-logforwarder-start/CMakeLists.txt
+++ b/logforwarder/src/apps/vespa-logforwarder-start/CMakeLists.txt
@@ -3,6 +3,7 @@ vespa_add_executable(logforwarder-start_app
SOURCES
main.cpp
cf-handler.cpp
+ child-handler.cpp
OUTPUT_NAME vespa-logforwarder-start
INSTALL bin
DEPENDS
diff --git a/logforwarder/src/apps/vespa-logforwarder-start/cf-handler.cpp b/logforwarder/src/apps/vespa-logforwarder-start/cf-handler.cpp
index e34a83030e8..5517017eefa 100644
--- a/logforwarder/src/apps/vespa-logforwarder-start/cf-handler.cpp
+++ b/logforwarder/src/apps/vespa-logforwarder-start/cf-handler.cpp
@@ -3,6 +3,7 @@
#include "cf-handler.h"
#include <dirent.h>
#include <stdio.h>
+#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <vespa/defaults.h>
@@ -25,21 +26,35 @@ CfHandler::subscribe(const std::string & configId, uint64_t timeoutMS)
}
namespace {
-std::string
-cfFilePath() {
- std::string path = vespa::Defaults::underVespaHome("var/db/vespa/splunk");
+
+bool fixDir(const vespalib::string &path) {
+ if (path.size() == 0) return true;
+ size_t lastSlash = path.rfind('/');
+ if (lastSlash != vespalib::string::npos) {
+ vespalib::string parent = path.substr(0, lastSlash);
+ if (!fixDir(parent)) return false;
+ }
DIR *dp = opendir(path.c_str());
if (dp == NULL) {
if (errno != ENOENT || mkdir(path.c_str(), 0755) != 0) {
perror(path.c_str());
+ return false;
}
} else {
closedir(dp);
}
+ return true;
+}
+
+vespalib::string
+cfFilePath(const vespalib::string &parent) {
+ vespalib::string path = parent + "/etc/system/local";
+ fixDir(path);
path += "/deploymentclient.conf";
return path;
}
-}
+
+} // namespace <unnamed>
void
CfHandler::doConfigure()
@@ -47,8 +62,8 @@ CfHandler::doConfigure()
std::unique_ptr<LogforwarderConfig> cfg(_handle->getConfig());
const LogforwarderConfig& config(*cfg);
- std::string path = cfFilePath();
- std::string tmpPath = path + ".new";
+ vespalib::string path = cfFilePath(config.splunkHome);
+ vespalib::string tmpPath = path + ".new";
FILE *fp = fopen(tmpPath.c_str(), "w");
if (fp == NULL) return;
@@ -60,6 +75,14 @@ CfHandler::doConfigure()
fclose(fp);
rename(tmpPath.c_str(), path.c_str());
+
+ if (config.clientName.size() == 0 ||
+ config.deploymentServer.size() == 0)
+ {
+ childHandler.stopChild(config.splunkHome);
+ } else {
+ childHandler.startChild(config.splunkHome);
+ }
}
void
diff --git a/logforwarder/src/apps/vespa-logforwarder-start/cf-handler.h b/logforwarder/src/apps/vespa-logforwarder-start/cf-handler.h
index 99f0a6cd6d5..0dcf2be7058 100644
--- a/logforwarder/src/apps/vespa-logforwarder-start/cf-handler.h
+++ b/logforwarder/src/apps/vespa-logforwarder-start/cf-handler.h
@@ -3,11 +3,13 @@
#include <vespa/config/config.h>
#include <vespa/config-logforwarder.h>
+#include "child-handler.h"
using cloud::config::LogforwarderConfig;
class CfHandler {
private:
+ ChildHandler childHandler;
config::ConfigSubscriber _subscriber;
config::ConfigHandle<LogforwarderConfig>::UP _handle;
void subscribe(const std::string & configId, uint64_t timeoutMS);
diff --git a/logforwarder/src/apps/vespa-logforwarder-start/child-handler.cpp b/logforwarder/src/apps/vespa-logforwarder-start/child-handler.cpp
new file mode 100644
index 00000000000..6ed209cbe5b
--- /dev/null
+++ b/logforwarder/src/apps/vespa-logforwarder-start/child-handler.cpp
@@ -0,0 +1,87 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "child-handler.h"
+
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+#include <vespa/log/log.h>
+LOG_SETUP(".child-handler");
+
+ChildHandler::ChildHandler() : _childRunning(false) {}
+
+namespace {
+
+void
+runSplunk(const vespalib::string &prefix, const char *a1, const char *a2 = 0)
+{
+ const char *argv[] = { 0, a1, a2, 0 };
+ vespalib::string path = prefix + "/bin/splunk";
+ argv[0] = path.c_str();
+ LOG(debug, "starting splunk forwarder with command: '%s' '%s' '%s'",
+ argv[0], argv[1], argv[2]);
+ fflush(stdout);
+ pid_t child = fork();
+ if (child == -1) {
+ perror("fork()");
+ return;
+ }
+ if (child == 0) {
+ vespalib::string env = "SPLUNK_HOME=" + prefix;
+ char *cenv = const_cast<char *>(env.c_str()); // safe cast
+ putenv(cenv);
+ LOG(debug, "added to environment: '%s'", cenv);
+ char **cargv = const_cast<char **>(argv); // safe cast
+ execv(argv[0], cargv);
+ // if execv fails:
+ perror(argv[0]);
+ exit(1);
+ }
+ LOG(debug, "child running with pid %d", (int)child);
+ int waitStatus = 0;
+ if (waitpid(child, &waitStatus, 0) == -1) {
+ perror("waitpid()");
+ return;
+ }
+ if (WIFEXITED(waitStatus) && WEXITSTATUS(waitStatus) == 0) {
+ // all OK
+ LOG(debug, "child ran ok, exit status 0");
+ return;
+ }
+ if (WIFEXITED(waitStatus)) {
+ LOG(warning, "failed starting splunk forwarder (exit status %d)",
+ WEXITSTATUS(waitStatus));
+ } else if (WIFSIGNALED(waitStatus)) {
+ LOG(warning, "failed starting splunk forwarder (exit on signal %d)",
+ WTERMSIG(waitStatus));
+ } else {
+ LOG(warning, "failed starting splunk forwarder (abnormal exit status %d)",
+ waitStatus);
+ }
+}
+
+} // namespace <unnamed>
+
+
+void
+ChildHandler::startChild(const vespalib::string &prefix)
+{
+ if (! _childRunning) {
+ runSplunk(prefix, "start", "--accept-license");
+ _childRunning = true;
+ // it is possible that splunk was already running, and
+ // then the above won't do anything, so we need to
+ // *also* do the restart below, after a small delay.
+ sleep(1);
+ }
+ runSplunk(prefix, "restart");
+}
+
+void
+ChildHandler::stopChild(const vespalib::string &prefix)
+{
+ runSplunk(prefix, "stop");
+ _childRunning = false;
+}
diff --git a/logforwarder/src/apps/vespa-logforwarder-start/child-handler.h b/logforwarder/src/apps/vespa-logforwarder-start/child-handler.h
new file mode 100644
index 00000000000..0c07b208871
--- /dev/null
+++ b/logforwarder/src/apps/vespa-logforwarder-start/child-handler.h
@@ -0,0 +1,13 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#pragma once
+
+#include <vespa/vespalib/stllike/string.h>
+
+class ChildHandler {
+private:
+ bool _childRunning;
+public:
+ void startChild(const vespalib::string &prefix);
+ void stopChild(const vespalib::string &prefix);
+ ChildHandler();
+};
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/retire/RetireIPv4OnlyNodes.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/retire/RetireIPv4OnlyNodes.java
index e7ce155503a..24ae73d0a81 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/retire/RetireIPv4OnlyNodes.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/retire/RetireIPv4OnlyNodes.java
@@ -39,6 +39,8 @@ public class RetireIPv4OnlyNodes implements RetirementPolicy {
return zone.environment() == Environment.prod;
} else if (zone.region().equals(RegionName.from("ap-northeast-1"))) {
return zone.environment() == Environment.prod;
+ } else if (zone.region().equals(RegionName.from("eu-west-1"))) {
+ return zone.environment() == Environment.prod;
}
}
diff --git a/pom.xml b/pom.xml
index 36d6dae8c0c..80ff9f1f905 100644
--- a/pom.xml
+++ b/pom.xml
@@ -37,6 +37,18 @@
<url>git@github.com:vespa-engine/vespa.git</url>
</scm>
+ <repositories>
+ <!-- Required for Athenz libraries -->
+ <repository>
+ <snapshots>
+ <enabled>false</enabled>
+ </snapshots>
+ <id>bintray-yahoo-maven</id>
+ <name>bintray</name>
+ <url>http://yahoo.bintray.com/maven</url>
+ </repository>
+ </repositories>
+
<build>
<finalName>${project.artifactId}</finalName>
<extensions>
@@ -898,6 +910,16 @@
<artifactId>icu4j</artifactId>
<version>57.1</version>
</dependency>
+ <dependency>
+ <groupId>com.yahoo.athenz</groupId>
+ <artifactId>athenz-zms-java-client</artifactId>
+ <version>${athenz.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>com.yahoo.athenz</groupId>
+ <artifactId>athenz-zts-java-client</artifactId>
+ <version>${athenz.version}</version>
+ </dependency>
</dependencies>
</dependencyManagement>
@@ -908,6 +930,8 @@
<aries.spifly.version>1.0.8</aries.spifly.version>
<aries.util.version>1.0.0</aries.util.version>
<asm-debug-all.version>5.0.3</asm-debug-all.version>
+ <!-- Athenz dependencies. Make sure these dependencies matches those in Vespa's internal repositories -->
+ <athenz.version>1.7.28</athenz.version>
<bouncycastle.version>1.49</bouncycastle.version>
<commons-lang.version>2.6</commons-lang.version>
<!-- WARNING: If you change curator version, you also need to update
diff --git a/searchcore/src/tests/proton/documentdb/configurer/configurer_test.cpp b/searchcore/src/tests/proton/documentdb/configurer/configurer_test.cpp
index 315fb7e86eb..87efd74659d 100644
--- a/searchcore/src/tests/proton/documentdb/configurer/configurer_test.cpp
+++ b/searchcore/src/tests/proton/documentdb/configurer/configurer_test.cpp
@@ -9,7 +9,6 @@
#include <vespa/searchcore/proton/documentmetastore/documentmetastore.h>
#include <vespa/searchcore/proton/documentmetastore/lidreusedelayer.h>
#include <vespa/searchcore/proton/matching/error_constant_value.h>
-#include <vespa/searchcore/proton/metrics/feed_metrics.h>
#include <vespa/searchcore/proton/index/index_writer.h>
#include <vespa/searchcore/proton/index/indexmanager.h>
#include <vespa/searchcore/proton/reprocessing/attribute_reprocessing_initializer.h>
@@ -47,7 +46,7 @@ using proton::matching::SessionManager;
using searchcorespi::IndexSearchable;
using searchcorespi::index::IThreadingService;
using proton::test::MockGidToLidChangeHandler;
-
+using std::make_shared;
using CCR = DocumentDBConfig::ComparisonResult;
using Configurer = SearchableDocSubDBConfigurer;
@@ -178,14 +177,8 @@ Fixture::Fixture()
vespalib::rmdir(BASE_DIR, true);
vespalib::mkdir(BASE_DIR);
initViewSet(_views);
- _configurer.reset(new Configurer(_views._summaryMgr,
- _views.searchView,
- _views.feedView,
- _queryLimiter,
- _constantValueRepo,
- _clock,
- "test",
- 0));
+ _configurer.reset(new Configurer(_views._summaryMgr, _views.searchView, _views.feedView, _queryLimiter,
+ _constantValueRepo, _clock, "test", 0));
}
Fixture::~Fixture() {}
@@ -193,53 +186,33 @@ void
Fixture::initViewSet(ViewSet &views)
{
Matchers::SP matchers(new Matchers(_clock, _queryLimiter, _constantValueRepo));
- IndexManager::SP indexMgr(new IndexManager(BASE_DIR, searchcorespi::index::WarmupConfig(),
- 2, 0, Schema(), 1, views._reconfigurer,
- views._writeService, _summaryExecutor, TuneFileIndexManager(),
- TuneFileAttributes(), views._fileHeaderContext));
- AttributeManager::SP attrMgr(new AttributeManager(BASE_DIR,
- "test.subdb",
- TuneFileAttributes(),
- views._fileHeaderContext,
- views._writeService.
- attributeFieldWriter(),
- views._hwInfo));
+ auto indexMgr = make_shared<IndexManager>(BASE_DIR, searchcorespi::index::WarmupConfig(), 2, 0, Schema(), 1,
+ views._reconfigurer, views._writeService, _summaryExecutor,
+ TuneFileIndexManager(), TuneFileAttributes(), views._fileHeaderContext);
+ auto attrMgr = make_shared<AttributeManager>(BASE_DIR, "test.subdb", TuneFileAttributes(), views._fileHeaderContext,
+ views._writeService.attributeFieldWriter(),views._hwInfo);
ProtonConfig protonCfg;
- SummaryManager::SP summaryMgr(
- new SummaryManager(_summaryExecutor, search::LogDocumentStore::Config(),
- GrowStrategy(), BASE_DIR, views._docTypeName,
- TuneFileSummary(), views._fileHeaderContext,
- views._noTlSyncer, search::IBucketizer::SP()));
- SessionManager::SP sesMgr(
- new SessionManager(protonCfg.grouping.sessionmanager.maxentries));
- DocumentMetaStoreContext::SP metaStore(
- new DocumentMetaStoreContext(std::make_shared<BucketDBOwner>()));
+ auto summaryMgr = make_shared<SummaryManager>
+ (_summaryExecutor, search::LogDocumentStore::Config(), GrowStrategy(), BASE_DIR, views._docTypeName,
+ TuneFileSummary(), views._fileHeaderContext,views._noTlSyncer, search::IBucketizer::SP());
+ auto sesMgr = make_shared<SessionManager>(protonCfg.grouping.sessionmanager.maxentries);
+ auto metaStore = make_shared<DocumentMetaStoreContext>(make_shared<BucketDBOwner>());
IIndexWriter::SP indexWriter(new IndexWriter(indexMgr));
AttributeWriter::SP attrWriter(new AttributeWriter(attrMgr));
ISummaryAdapter::SP summaryAdapter(new SummaryAdapter(summaryMgr));
- views._gidToLidChangeHandler = std::make_shared<MockGidToLidChangeHandler>();
+ views._gidToLidChangeHandler = make_shared<MockGidToLidChangeHandler>();
Schema::SP schema(new Schema());
views._summaryMgr = summaryMgr;
views._dmsc = metaStore;
- views._lidReuseDelayer.reset(
- new documentmetastore::LidReuseDelayer(views._writeService,
- metaStore->get()));
+ views._lidReuseDelayer.reset(new documentmetastore::LidReuseDelayer(views._writeService, metaStore->get()));
IndexSearchable::SP indexSearchable;
- MatchView::SP matchView(new MatchView(matchers, indexSearchable, attrMgr,
- sesMgr, metaStore, views._docIdLimit));
- views.searchView.set(
- SearchView::SP(
- new SearchView(
- summaryMgr->createSummarySetup(SummaryConfig(),
- SummarymapConfig(),
- JuniperrcConfig(),
- views.repo,
- attrMgr),
- matchView)));
- PerDocTypeFeedMetrics metrics(0);
+ MatchView::SP matchView(new MatchView(matchers, indexSearchable, attrMgr, sesMgr, metaStore, views._docIdLimit));
+ views.searchView.set(make_shared<SearchView>
+ (summaryMgr->createSummarySetup(SummaryConfig(), SummarymapConfig(),
+ JuniperrcConfig(), views.repo, attrMgr),
+ matchView));
views.feedView.set(
- SearchableFeedView::SP(
- new SearchableFeedView(StoreOnlyFeedView::Context(summaryAdapter,
+ make_shared<SearchableFeedView>(StoreOnlyFeedView::Context(summaryAdapter,
schema,
views.searchView.get()->getDocumentMetaStore(),
*views._gidToLidChangeHandler,
@@ -251,11 +224,10 @@ Fixture::initViewSet(ViewSet &views)
views.serialNum,
views.serialNum,
views._docTypeName,
- metrics,
0u /* subDbId */,
SubDbType::READY),
FastAccessFeedView::Context(attrWriter, views._docIdLimit),
- SearchableFeedView::Context(indexWriter))));
+ SearchableFeedView::Context(indexWriter)));
}
@@ -263,7 +235,6 @@ using MySummaryAdapter = test::MockSummaryAdapter;
struct MyFastAccessFeedView
{
- PerDocTypeFeedMetrics _metrics;
DummyFileHeaderContext _fileHeaderContext;
DocIdLimit _docIdLimit;
IThreadingService &_writeService;
@@ -276,13 +247,12 @@ struct MyFastAccessFeedView
VarHolder<FastAccessFeedView::SP> _feedView;
MyFastAccessFeedView(IThreadingService &writeService)
- : _metrics(0),
- _fileHeaderContext(),
+ : _fileHeaderContext(),
_docIdLimit(0),
_writeService(writeService),
_hwInfo(),
_dmsc(),
- _gidToLidChangeHandler(std::make_shared<DummyGidToLidChangeHandler>()),
+ _gidToLidChangeHandler(make_shared<DummyGidToLidChangeHandler>()),
_lidReuseDelayer(),
_commitTimeTracker(TimeStamp()),
_feedView()
@@ -295,30 +265,21 @@ struct MyFastAccessFeedView
void init() {
ISummaryAdapter::SP summaryAdapter(new MySummaryAdapter());
Schema::SP schema(new Schema());
- DocumentMetaStoreContext::SP docMetaCtx(
- new DocumentMetaStoreContext(std::make_shared<BucketDBOwner>()));
- _dmsc = docMetaCtx;
- _lidReuseDelayer.reset(
- new documentmetastore::LidReuseDelayer(_writeService,
- docMetaCtx->get()));
+ _dmsc = make_shared<DocumentMetaStoreContext>(std::make_shared<BucketDBOwner>());
+ _lidReuseDelayer.reset(new documentmetastore::LidReuseDelayer(_writeService, _dmsc->get()));
DocumentTypeRepo::SP repo = createRepo();
- StoreOnlyFeedView::Context storeOnlyCtx(summaryAdapter, schema, docMetaCtx, *_gidToLidChangeHandler, repo, _writeService, *_lidReuseDelayer, _commitTimeTracker);
- StoreOnlyFeedView::PersistentParams params(1, 1, DocTypeName(DOC_TYPE), _metrics, 0, SubDbType::NOTREADY);
- AttributeManager::SP mgr(new AttributeManager(BASE_DIR, "test.subdb",
- TuneFileAttributes(),
- _fileHeaderContext,
- _writeService.
- attributeFieldWriter(),
- _hwInfo));
+ StoreOnlyFeedView::Context storeOnlyCtx(summaryAdapter, schema, _dmsc, *_gidToLidChangeHandler, repo,
+ _writeService, *_lidReuseDelayer, _commitTimeTracker);
+ StoreOnlyFeedView::PersistentParams params(1, 1, DocTypeName(DOC_TYPE), 0, SubDbType::NOTREADY);
+ auto mgr = make_shared<AttributeManager>(BASE_DIR, "test.subdb", TuneFileAttributes(), _fileHeaderContext,
+ _writeService.attributeFieldWriter(), _hwInfo);
IAttributeWriter::SP writer(new AttributeWriter(mgr));
FastAccessFeedView::Context fastUpdateCtx(writer, _docIdLimit);
- _feedView.set(FastAccessFeedView::SP(new FastAccessFeedView(storeOnlyCtx,
- params, fastUpdateCtx)));;
+ _feedView.set(FastAccessFeedView::SP(new FastAccessFeedView(storeOnlyCtx, params, fastUpdateCtx)));;
}
};
-MyFastAccessFeedView::~MyFastAccessFeedView() {
-}
+MyFastAccessFeedView::~MyFastAccessFeedView() = default;
struct FastAccessFixture
{
@@ -328,8 +289,7 @@ struct FastAccessFixture
FastAccessFixture()
: _writeService(),
_view(_writeService),
- _configurer(_view._feedView,
- IAttributeWriterFactory::UP(new AttributeWriterFactory), "test")
+ _configurer(_view._feedView, IAttributeWriterFactory::UP(new AttributeWriterFactory), "test")
{
vespalib::rmdir(BASE_DIR, true);
vespalib::mkdir(BASE_DIR);
@@ -339,11 +299,10 @@ struct FastAccessFixture
}
};
-
DocumentDBConfig::SP
createConfig()
{
- return test::DocumentDBConfigBuilder(0, std::make_shared<Schema>(), "client", DOC_TYPE).
+ return test::DocumentDBConfigBuilder(0, make_shared<Schema>(), "client", DOC_TYPE).
repo(createRepo()).build();
}
diff --git a/searchcore/src/tests/proton/documentdb/feedhandler/feedhandler_test.cpp b/searchcore/src/tests/proton/documentdb/feedhandler/feedhandler_test.cpp
index cccbbededd1..b0b06a238c9 100644
--- a/searchcore/src/tests/proton/documentdb/feedhandler/feedhandler_test.cpp
+++ b/searchcore/src/tests/proton/documentdb/feedhandler/feedhandler_test.cpp
@@ -14,7 +14,6 @@
#include <vespa/searchcore/proton/feedoperation/removeoperation.h>
#include <vespa/searchcore/proton/feedoperation/updateoperation.h>
#include <vespa/searchcore/proton/feedoperation/wipehistoryoperation.h>
-#include <vespa/searchcore/proton/metrics/feed_metrics.h>
#include <vespa/searchcore/proton/persistenceengine/i_resource_write_filter.h>
#include <vespa/searchcore/proton/server/configstore.h>
#include <vespa/searchcore/proton/server/ddbstate.h>
@@ -306,7 +305,7 @@ struct MyTransport : public FeedToken::ITransport {
bool documentWasFound;
MyTransport();
~MyTransport();
- virtual void send(Reply::UP, ResultUP res, bool documentWasFound_, double) override {
+ void send(ResultUP res, bool documentWasFound_) override {
result = std::move(res);
documentWasFound = documentWasFound_;
gate.countDown();
@@ -316,21 +315,12 @@ struct MyTransport : public FeedToken::ITransport {
MyTransport::MyTransport() : gate(), result(), documentWasFound(false) {}
MyTransport::~MyTransport() {}
-Reply::UP getReply(uint32_t type) {
- if (type == DocumentProtocol::REPLY_REMOVEDOCUMENT) {
- return Reply::UP(new RemoveDocumentReply);
- } else if (type == DocumentProtocol::REPLY_UPDATEDOCUMENT) {
- return Reply::UP(new UpdateDocumentReply);
- }
- return Reply::UP(new DocumentReply(type));
-}
-
struct FeedTokenContext {
MyTransport transport;
FeedToken::UP token_ap;
FeedToken &token;
- FeedTokenContext(uint32_t type = 0);
+ FeedTokenContext();
~FeedTokenContext();
bool await(uint32_t timeout = 80000) { return transport.gate.await(timeout); }
const Result *getResult() {
@@ -341,24 +331,23 @@ struct FeedTokenContext {
}
};
-FeedTokenContext::FeedTokenContext(uint32_t type)
+FeedTokenContext::FeedTokenContext()
: transport(),
- token_ap(new FeedToken(transport, getReply(type))),
+ token_ap(new FeedToken(transport)),
token(*token_ap)
{
- token.getReply().getTrace().setLevel(9);
}
-FeedTokenContext::~FeedTokenContext() {}
+
+FeedTokenContext::~FeedTokenContext() = default;
struct PutContext {
FeedTokenContext tokenCtx;
DocumentContext docCtx;
typedef std::shared_ptr<PutContext> SP;
PutContext(const vespalib::string &docId, DocBuilder &builder) :
- tokenCtx(DocumentProtocol::REPLY_PUTDOCUMENT),
+ tokenCtx(),
docCtx(docId, builder)
- {
- }
+ {}
};
@@ -372,12 +361,10 @@ struct PutHandler {
builder(db),
timestamp(0),
puts()
- {
- }
+ {}
void put(const vespalib::string &docId) {
PutContext::SP pc(new PutContext(docId, builder));
- FeedOperation::UP op(new PutOperation(pc->docCtx.bucketId,
- timestamp, pc->docCtx.doc));
+ FeedOperation::UP op(new PutOperation(pc->docCtx.bucketId, timestamp, pc->docCtx.doc));
handler.handleOperation(pc->tokenCtx.token, std::move(op));
timestamp = Timestamp(timestamp + 1);
puts.push_back(pc);
@@ -393,18 +380,6 @@ struct PutHandler {
};
-struct MyFeedMetrics : public metrics::MetricSet
-{
- PerDocTypeFeedMetrics _feed;
-
- MyFeedMetrics()
- : metrics::MetricSet("myfeedmetrics", "", "My feed metrics", NULL),
- _feed(this)
- {
- }
-};
-
-
struct MyTlsWriter : TlsWriter {
int store_count;
int erase_count;
@@ -419,7 +394,6 @@ struct MyTlsWriter : TlsWriter {
}
};
-
struct FeedHandlerFixture
{
DummyFileHeaderContext _fileHeaderContext;
@@ -432,7 +406,6 @@ struct FeedHandlerFixture
DDBState _state;
MyReplayConfig replayConfig;
MyFeedView feedView;
- MyFeedMetrics feedMetrics;
MyTlsWriter tls_writer;
BucketDBOwner _bucketDB;
bucketdb::BucketDBHandler _bucketDBHandler;
@@ -449,8 +422,8 @@ struct FeedHandlerFixture
feedView(schema.getRepo()),
_bucketDB(),
_bucketDBHandler(_bucketDB),
- handler(writeService, tlsSpec, schema.getDocType(),
- feedMetrics._feed, _state, owner, writeFilter, replayConfig, tls, &tls_writer)
+ handler(writeService, tlsSpec, schema.getDocType(), _state, owner,
+ writeFilter, replayConfig, tls, &tls_writer)
{
_state.enterLoadState();
_state.enterReplayTransactionLogState();
@@ -507,12 +480,10 @@ TEST_F("require that heartBeat calls FeedView's heartBeat",
TEST_F("require that outdated remove is ignored", FeedHandlerFixture)
{
DocumentContext doc_context("doc:test:foo", *f.schema.builder);
- FeedOperation::UP op(new RemoveOperation(doc_context.bucketId,
- Timestamp(10),
- doc_context.doc->getId()));
+ FeedOperation::UP op(new RemoveOperation(doc_context.bucketId, Timestamp(10), doc_context.doc->getId()));
static_cast<DocumentOperation &>(*op).setPrevDbDocumentId(DbDocumentId(4));
static_cast<DocumentOperation &>(*op).setPrevTimestamp(Timestamp(10000));
- FeedTokenContext token_context(DocumentProtocol::REPLY_REMOVEDOCUMENT);
+ FeedTokenContext token_context;
f.handler.performOperation(std::move(token_context.token_ap), std::move(op));
EXPECT_EQUAL(0, f.feedView.remove_count);
EXPECT_EQUAL(0, f.tls_writer.store_count);
@@ -599,28 +570,21 @@ TEST_F("require that flush cannot unprune", FeedHandlerFixture)
EXPECT_EQUAL(10u, f.handler.getPrunedSerialNum());
}
-TEST_F("require that remove of unknown document with known data type "
- "stores remove", FeedHandlerFixture)
+TEST_F("require that remove of unknown document with known data type stores remove", FeedHandlerFixture)
{
- DocumentContext doc_context("id:test:searchdocument::foo",
- *f.schema.builder);
- FeedOperation::UP op(new RemoveOperation(doc_context.bucketId,
- Timestamp(10),
- doc_context.doc->getId()));
- FeedTokenContext token_context(DocumentProtocol::REPLY_REMOVEDOCUMENT);
+ DocumentContext doc_context("id:test:searchdocument::foo", *f.schema.builder);
+ FeedOperation::UP op(new RemoveOperation(doc_context.bucketId, Timestamp(10), doc_context.doc->getId()));
+ FeedTokenContext token_context;
f.handler.performOperation(std::move(token_context.token_ap), std::move(op));
EXPECT_EQUAL(1, f.feedView.remove_count);
EXPECT_EQUAL(1, f.tls_writer.store_count);
}
-TEST_F("require that partial update for non-existing document is tagged as such",
- FeedHandlerFixture)
+TEST_F("require that partial update for non-existing document is tagged as such", FeedHandlerFixture)
{
UpdateContext upCtx("id:test:searchdocument::foo", *f.schema.builder);
- FeedOperation::UP op(new UpdateOperation(upCtx.bucketId,
- Timestamp(10),
- upCtx.update));
- FeedTokenContext token_context(DocumentProtocol::REPLY_UPDATEDOCUMENT);
+ FeedOperation::UP op(new UpdateOperation(upCtx.bucketId, Timestamp(10), upCtx.update));
+ FeedTokenContext token_context;
f.handler.performOperation(std::move(token_context.token_ap), std::move(op));
const UpdateResult *result = static_cast<const UpdateResult *>(token_context.getResult());
@@ -631,18 +595,14 @@ TEST_F("require that partial update for non-existing document is tagged as such"
EXPECT_EQUAL(0, f.tls_writer.store_count);
}
-TEST_F("require that partial update for non-existing document is created if specified",
- FeedHandlerFixture)
+TEST_F("require that partial update for non-existing document is created if specified", FeedHandlerFixture)
{
f.handler.setSerialNum(15);
UpdateContext upCtx("id:test:searchdocument::foo", *f.schema.builder);
upCtx.update->setCreateIfNonExistent(true);
- f.feedView.metaStore.insert(upCtx.update->getId().getGlobalId(),
- MyDocumentMetaStore::Entry(5, 5, Timestamp(10)));
- FeedOperation::UP op(new UpdateOperation(upCtx.bucketId,
- Timestamp(10),
- upCtx.update));
- FeedTokenContext token_context(DocumentProtocol::REPLY_UPDATEDOCUMENT);
+ f.feedView.metaStore.insert(upCtx.update->getId().getGlobalId(), MyDocumentMetaStore::Entry(5, 5, Timestamp(10)));
+ FeedOperation::UP op(new UpdateOperation(upCtx.bucketId, Timestamp(10), upCtx.update));
+ FeedTokenContext token_context;
f.handler.performOperation(std::move(token_context.token_ap), std::move(op));
const UpdateResult *result = static_cast<const UpdateResult *>(token_context.getResult());
@@ -678,7 +638,7 @@ TEST_F("require that update is rejected if resource limit is reached", FeedHandl
UpdateContext updCtx("id:test:searchdocument::foo", *f.schema.builder);
FeedOperation::UP op = std::make_unique<UpdateOperation>(updCtx.bucketId, Timestamp(10), updCtx.update);
- FeedTokenContext token(DocumentProtocol::REPLY_UPDATEDOCUMENT);
+ FeedTokenContext token;
f.handler.performOperation(std::move(token.token_ap), std::move(op));
EXPECT_EQUAL(0, f.feedView.update_count);
EXPECT_TRUE(dynamic_cast<const UpdateResult *>(token.getResult()));
@@ -694,7 +654,7 @@ TEST_F("require that remove is NOT rejected if resource limit is reached", FeedH
DocumentContext docCtx("id:test:searchdocument::foo", *f.schema.builder);
FeedOperation::UP op = std::make_unique<RemoveOperation>(docCtx.bucketId, Timestamp(10), docCtx.doc->getId());
- FeedTokenContext token(DocumentProtocol::REPLY_REMOVEDOCUMENT);
+ FeedTokenContext token;
f.handler.performOperation(std::move(token.token_ap), std::move(op));
EXPECT_EQUAL(1, f.feedView.remove_count);
EXPECT_EQUAL(Result::NONE, token.getResult()->getErrorCode());
diff --git a/searchcore/src/tests/proton/documentdb/feedview/feedview_test.cpp b/searchcore/src/tests/proton/documentdb/feedview/feedview_test.cpp
index c820a9f392c..4eefbed0a53 100644
--- a/searchcore/src/tests/proton/documentdb/feedview/feedview_test.cpp
+++ b/searchcore/src/tests/proton/documentdb/feedview/feedview_test.cpp
@@ -10,7 +10,6 @@
#include <vespa/searchcore/proton/common/feedtoken.h>
#include <vespa/searchcore/proton/documentmetastore/lidreusedelayer.h>
#include <vespa/searchcore/proton/index/i_index_writer.h>
-#include <vespa/searchcore/proton/metrics/feed_metrics.h>
#include <vespa/searchcore/proton/server/executorthreadingservice.h>
#include <vespa/searchcore/proton/server/ifrozenbuckethandler.h>
#include <vespa/searchcore/proton/server/isummaryadapter.h>
@@ -30,9 +29,6 @@
#include <vespa/searchlib/docstore/cachestats.h>
#include <vespa/searchlib/docstore/idocumentstore.h>
#include <vespa/searchlib/index/docbuilder.h>
-#include <vespa/vespalib/testkit/testapp.h>
-#include <vespa/vespalib/util/blockingthreadstackexecutor.h>
-#include <mutex>
#include <vespa/log/log.h>
LOG_SETUP("feedview_test");
@@ -132,8 +128,6 @@ struct MyTracer
struct ParamsContext
{
DocTypeName _docTypeName;
- FeedMetrics _feedMetrics;
- PerDocTypeFeedMetrics _metrics;
SearchableFeedView::PersistentParams _params;
ParamsContext(const vespalib::string &docType, const vespalib::string &baseDir);
@@ -143,9 +137,7 @@ struct ParamsContext
ParamsContext::ParamsContext(const vespalib::string &docType, const vespalib::string &baseDir)
: _docTypeName(docType),
- _feedMetrics(),
- _metrics(&_feedMetrics),
- _params(0, 0, _docTypeName, _metrics, subdb_id, SubDbType::READY)
+ _params(0, 0, _docTypeName, subdb_id, SubDbType::READY)
{
(void) baseDir;
}
@@ -420,11 +412,7 @@ struct MyTransport : public FeedToken::ITransport
MyTracer &_tracer;
MyTransport(MyTracer &tracer);
~MyTransport();
- virtual void send(mbus::Reply::UP reply,
- ResultUP result,
- bool documentWasFound,
- double latency_ms) override {
- (void) reply; (void) documentWasFound, (void) latency_ms;
+ void send(ResultUP result, bool ) override {
lastResult = std::move(result);
_tracer.traceAck(lastResult);
_gate.countDown();
@@ -492,36 +480,20 @@ DocumentContext::DocumentContext(const vespalib::string &docId, uint64_t timesta
{}
DocumentContext::~DocumentContext() {}
-namespace {
-
-mbus::Reply::UP
-createReply(MessageType mtype)
-{
- if (mtype == DocumentProtocol::REPLY_UPDATEDOCUMENT) {
- return mbus::Reply::UP(new documentapi::UpdateDocumentReply);
- } else if (mtype == DocumentProtocol::REPLY_REMOVEDOCUMENT) {
- return mbus::Reply::UP(new documentapi::RemoveDocumentReply);
- } else {
- return mbus::Reply::UP(new documentapi::DocumentReply(mtype));
- }
-}
-
-} // namespace
-
struct FeedTokenContext
{
MyTransport mt;
FeedToken ft;
typedef std::shared_ptr<FeedTokenContext> SP;
typedef std::vector<SP> List;
- FeedTokenContext(MyTracer &tracer, MessageType mtype);
+ FeedTokenContext(MyTracer &tracer);
~FeedTokenContext();
};
-FeedTokenContext::FeedTokenContext(MyTracer &tracer, MessageType mtype)
- : mt(tracer), ft(mt, createReply(mtype))
+FeedTokenContext::FeedTokenContext(MyTracer &tracer)
+ : mt(tracer), ft(mt)
{}
-FeedTokenContext::~FeedTokenContext() {}
+FeedTokenContext::~FeedTokenContext() = default;
struct FixtureBase
{
@@ -612,7 +584,7 @@ struct FixtureBase
}
void putAndWait(const DocumentContext &docCtx) {
- FeedTokenContext token(_tracer, DocumentProtocol::REPLY_PUTDOCUMENT);
+ FeedTokenContext token(_tracer);
PutOperation op(docCtx.bid, docCtx.ts, docCtx.doc);
runInMaster([&] () { performPut(&token.ft, op); });
}
@@ -624,7 +596,7 @@ struct FixtureBase
}
void updateAndWait(const DocumentContext &docCtx) {
- FeedTokenContext token(_tracer, DocumentProtocol::REPLY_UPDATEDOCUMENT);
+ FeedTokenContext token(_tracer);
UpdateOperation op(docCtx.bid, docCtx.ts, docCtx.upd);
runInMaster([&] () { performUpdate(&token.ft, op); });
}
@@ -636,13 +608,13 @@ struct FixtureBase
getFeedView().handleRemove(token, op);
} else {
if (token != NULL) {
- token->ack(op.getType(), pc._metrics);
+ token->ack();
}
}
}
void removeAndWait(const DocumentContext &docCtx) {
- FeedTokenContext token(_tracer, DocumentProtocol::REPLY_REMOVEDOCUMENT);
+ FeedTokenContext token(_tracer);
RemoveOperation op(docCtx.bid, docCtx.ts, docCtx.doc->getId());
runInMaster([&] () { performRemove(&token.ft, op); });
}
diff --git a/searchcore/src/tests/proton/documentdb/storeonlyfeedview/storeonlyfeedview_test.cpp b/searchcore/src/tests/proton/documentdb/storeonlyfeedview/storeonlyfeedview_test.cpp
index 1ec201fdbd2..bbdabe2d0ef 100644
--- a/searchcore/src/tests/proton/documentdb/storeonlyfeedview/storeonlyfeedview_test.cpp
+++ b/searchcore/src/tests/proton/documentdb/storeonlyfeedview/storeonlyfeedview_test.cpp
@@ -1,13 +1,10 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
#include <vespa/document/base/documentid.h>
-#include <vespa/document/base/globalid.h>
-#include <vespa/document/bucket/bucketid.h>
#include <vespa/document/datatype/datatype.h>
#include <vespa/searchcommon/common/schema.h>
#include <vespa/searchcore/proton/common/commit_time_tracker.h>
#include <vespa/searchcore/proton/documentmetastore/lidreusedelayer.h>
-#include <vespa/searchcore/proton/metrics/feed_metrics.h>
#include <vespa/searchcore/proton/server/executorthreadingservice.h>
#include <vespa/searchcore/proton/server/putdonecontext.h>
#include <vespa/searchcore/proton/server/removedonecontext.h>
@@ -15,8 +12,6 @@
#include <vespa/searchcore/proton/reference/dummy_gid_to_lid_change_handler.h>
#include <vespa/searchcore/proton/test/mock_summary_adapter.h>
#include <vespa/searchcore/proton/test/thread_utils.h>
-#include <vespa/searchlib/common/idestructorcallback.h>
-#include <vespa/searchlib/common/serialnum.h>
#include <vespa/searchlib/index/docbuilder.h>
#include <vespa/vespalib/testkit/testapp.h>
@@ -225,8 +220,7 @@ struct FixtureBase {
commitTimeTracker(fastos::TimeStamp()),
feedview()
{
- PerDocTypeFeedMetrics metrics(0);
- StoreOnlyFeedView::PersistentParams params(0, 0, DocTypeName("foo"), metrics, subdb_id, subDbType);
+ StoreOnlyFeedView::PersistentParams params(0, 0, DocTypeName("foo"), subdb_id, subDbType);
metaStore->constructFreeList();
ISummaryAdapter::SP adapter = std::make_unique<MySummaryAdapter>(removeCount, putCount, heartbeatCount);
feedview = std::make_unique<FeedViewType>(adapter, metaStore, writeService, lidReuseDelayer,
diff --git a/searchcore/src/tests/proton/feedtoken/feedtoken.cpp b/searchcore/src/tests/proton/feedtoken/feedtoken.cpp
index 9df65ae3437..530c9ebef39 100644
--- a/searchcore/src/tests/proton/feedtoken/feedtoken.cpp
+++ b/searchcore/src/tests/proton/feedtoken/feedtoken.cpp
@@ -1,57 +1,39 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-#include <vespa/messagebus/emptyreply.h>
-#include <vespa/messagebus/testlib/receptor.h>
-#include <vespa/documentapi/messagebus/messages/removedocumentreply.h>
-#include <vespa/searchcore/proton/common/feedtoken.h>
#include <vespa/vespalib/testkit/testapp.h>
+#include <vespa/searchcore/proton/common/feedtoken.h>
#include <vespa/vespalib/util/exceptions.h>
using namespace proton;
class LocalTransport : public FeedToken::ITransport {
private:
- mbus::Receptor _receptor;
- double _latency_ms;
+ size_t _receivedCount;
public:
LocalTransport()
- : _receptor(),
- _latency_ms(0.0)
- {
- // empty
- }
-
- void send(mbus::Reply::UP reply, ResultUP, bool, double latency_ms) override {
- _receptor.handleReply(std::move(reply));
- _latency_ms = latency_ms;
- }
+ : _receivedCount(0)
+ { }
- mbus::Reply::UP getReply() {
- return _receptor.getReply();
+ void send(ResultUP, bool) override {
+ _receivedCount++;
}
- double getLatencyMs() const {
- return _latency_ms;
- }
+ size_t getReceivedCount() const { return _receivedCount; }
};
class Test : public vespalib::TestApp {
private:
void testAck();
- void testAutoReply();
void testFail();
void testHandover();
- void testIntegrity();
public:
int Main() override {
TEST_INIT("feedtoken_test");
testAck(); TEST_FLUSH();
-// testAutoReply(); TEST_FLUSH();
testFail(); TEST_FLUSH();
testHandover(); TEST_FLUSH();
-// testIntegrity(); TEST_FLUSH();
TEST_DONE();
}
@@ -63,41 +45,18 @@ void
Test::testAck()
{
LocalTransport transport;
- mbus::Reply::UP msg(new documentapi::RemoveDocumentReply());
- FeedToken token(transport, std::move(msg));
+ FeedToken token(transport);
token.ack();
- mbus::Reply::UP reply = transport.getReply();
- ASSERT_TRUE(reply.get() != NULL);
- EXPECT_TRUE(!reply->hasErrors());
-}
-
-void
-Test::testAutoReply()
-{
- mbus::Receptor receptor;
- mbus::Reply::UP reply(new documentapi::RemoveDocumentReply());
- reply->pushHandler(receptor);
- {
- LocalTransport transport;
- FeedToken token(transport, std::move(reply));
- }
- reply = receptor.getReply(0);
- ASSERT_TRUE(reply.get() != NULL);
- EXPECT_TRUE(reply->hasErrors());
+ EXPECT_EQUAL(1u, transport.getReceivedCount());
}
void
Test::testFail()
{
LocalTransport transport;
- mbus::Reply::UP reply(new documentapi::RemoveDocumentReply());
- FeedToken token(transport, std::move(reply));
- token.fail(69, "6699");
- reply = transport.getReply();
- ASSERT_TRUE(reply.get() != NULL);
- EXPECT_EQUAL(1u, reply->getNumErrors());
- EXPECT_EQUAL(69u, reply->getError(0).getCode());
- EXPECT_EQUAL("6699", reply->getError(0).getMessage());
+ FeedToken token(transport);
+ token.fail();
+ EXPECT_EQUAL(1u, transport.getReceivedCount());
}
void
@@ -110,25 +69,11 @@ Test::testHandover()
};
LocalTransport transport;
- mbus::Reply::UP reply(new documentapi::RemoveDocumentReply());
- FeedToken token(transport, std::move(reply));
+ FeedToken token(transport);
token = MyHandover::handover(token);
token.ack();
- reply = transport.getReply();
- ASSERT_TRUE(reply.get() != NULL);
- EXPECT_TRUE(!reply->hasErrors());
+ EXPECT_EQUAL(1u, transport.getReceivedCount());
}
-void
-Test::testIntegrity()
-{
- LocalTransport transport;
- try {
- FeedToken token(transport, mbus::Reply::UP());
- EXPECT_TRUE(false); // should throw an exception
- } catch (vespalib::IllegalArgumentException &e) {
- (void)e; // expected
- }
-}
diff --git a/searchcore/src/vespa/searchcore/fdispatch/search/nodemanager.cpp b/searchcore/src/vespa/searchcore/fdispatch/search/nodemanager.cpp
index fd60b16ee70..10f70b2e518 100644
--- a/searchcore/src/vespa/searchcore/fdispatch/search/nodemanager.cpp
+++ b/searchcore/src/vespa/searchcore/fdispatch/search/nodemanager.cpp
@@ -239,10 +239,11 @@ FastS_NodeManager::SetCollDesc(FastS_DataSetCollDesc *configDesc,
break;
FastOS_Thread::Sleep(100);
};
- if (allup)
+ if (allup) {
LOG(debug, "All new engines up after %d ms", rwait);
- else
+ } else {
LOG(debug, "Some new engines still down after %d ms", rwait);
+ }
}
gencnt = SetDataSetCollection(newCollection);
diff --git a/searchcore/src/vespa/searchcore/proton/attribute/i_attribute_writer.h b/searchcore/src/vespa/searchcore/proton/attribute/i_attribute_writer.h
index 7455ccda5a3..abcf132d537 100644
--- a/searchcore/src/vespa/searchcore/proton/attribute/i_attribute_writer.h
+++ b/searchcore/src/vespa/searchcore/proton/attribute/i_attribute_writer.h
@@ -9,11 +9,7 @@
#include <vespa/searchcore/proton/attribute/i_attribute_manager.h>
#include <vespa/searchcore/proton/feedoperation/lidvectorcontext.h>
-namespace search {
-
-class IDestructorCallback;
-
-}
+namespace search { class IDestructorCallback; }
namespace proton {
diff --git a/searchcore/src/vespa/searchcore/proton/common/feedtoken.cpp b/searchcore/src/vespa/searchcore/proton/common/feedtoken.cpp
index 545a303cb16..008fafa332b 100644
--- a/searchcore/src/vespa/searchcore/proton/common/feedtoken.cpp
+++ b/searchcore/src/vespa/searchcore/proton/common/feedtoken.cpp
@@ -1,93 +1,53 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
#include "feedtoken.h"
-#include <vespa/searchcore/proton/metrics/feed_metrics.h>
namespace proton {
-FeedToken::FeedToken(ITransport &transport, mbus::Reply::UP reply) :
- _state(new State(transport, std::move(reply), 1))
+FeedToken::FeedToken(ITransport &transport) :
+ _state(new State(transport, 1))
{
}
-FeedToken::State::State(ITransport & transport, mbus::Reply::UP reply, uint32_t numAcksRequired) :
+FeedToken::State::State(ITransport & transport, uint32_t numAcksRequired) :
_transport(transport),
- _reply(std::move(reply)),
_result(new storage::spi::Result()),
_documentWasFound(false),
- _unAckedCount(numAcksRequired),
- _lock(),
- _startTime()
+ _unAckedCount(numAcksRequired)
{
- assert(_reply);
- _startTime.SetNow();
+ assert(_unAckedCount > 0);
}
FeedToken::State::~State()
{
- assert(!_reply);
+ assert(_unAckedCount == 0);
}
void
FeedToken::State::ack()
{
- assert(_reply);
uint32_t prev(_unAckedCount--);
if (prev == 1) {
- _transport.send(std::move(_reply), std::move(_result), _documentWasFound, _startTime.MilliSecsToNow());
+ _transport.send(std::move(_result), _documentWasFound);
}
assert(prev >= 1);
}
-
-void
-FeedToken::State::ack(const FeedOperation::Type opType,
- PerDocTypeFeedMetrics &metrics)
-{
- assert(_reply);
- uint32_t prev(_unAckedCount--);
- if (prev == 1) {
- _transport.send(std::move(_reply), std::move(_result), _documentWasFound, _startTime.MilliSecsToNow());
- switch (opType) {
- case FeedOperation::PUT:
- metrics.RegisterPut(_startTime);
- break;
- case FeedOperation::REMOVE:
- case FeedOperation::REMOVE_BATCH:
- metrics.RegisterRemove(_startTime);
- break;
- case FeedOperation::UPDATE_42:
- case FeedOperation::UPDATE:
- metrics.RegisterUpdate(_startTime);
- break;
- case FeedOperation::MOVE:
- metrics.RegisterMove(_startTime);
- break;
- default:
- ;
- }
- }
- assert(prev >= 1);
-}
-
-
void
FeedToken::State::incNeededAcks()
{
- assert(_reply);
uint32_t prev(_unAckedCount++);
assert(prev >= 1);
(void) prev;
}
-
void
-FeedToken::State::fail(uint32_t errNum, const vespalib::string &errMsg)
+FeedToken::State::fail()
{
- assert(_reply);
- vespalib::LockGuard guard(_lock);
- _reply->addError(mbus::Error(errNum, errMsg));
- _transport.send(std::move(_reply), std::move(_result), _documentWasFound, _startTime.MilliSecsToNow());
+ uint32_t prev = _unAckedCount.exchange(0);
+ if (prev > 0) {
+ _transport.send(std::move(_result), _documentWasFound);
+ }
}
} // namespace proton
diff --git a/searchcore/src/vespa/searchcore/proton/common/feedtoken.h b/searchcore/src/vespa/searchcore/proton/common/feedtoken.h
index 722827ded87..856c8a22652 100644
--- a/searchcore/src/vespa/searchcore/proton/common/feedtoken.h
+++ b/searchcore/src/vespa/searchcore/proton/common/feedtoken.h
@@ -1,16 +1,13 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
#pragma once
-#include <vespa/messagebus/reply.h>
#include <vespa/persistence/spi/persistenceprovider.h>
#include <vespa/vespalib/util/exception.h>
#include <vespa/vespalib/util/sync.h>
-#include <vespa/searchcore/proton/feedoperation/feedoperation.h>
#include <atomic>
namespace proton {
-class PerDocTypeFeedMetrics;
typedef std::unique_ptr<storage::spi::Result> ResultUP;
/**
@@ -23,10 +20,7 @@ public:
class ITransport {
public:
virtual ~ITransport() { }
- virtual void send(mbus::Reply::UP reply,
- ResultUP result,
- bool documentWasFound,
- double latency_ms) = 0;
+ virtual void send(ResultUP result, bool documentWasFound) = 0;
};
private:
@@ -34,30 +28,21 @@ private:
public:
State(const State &) = delete;
State & operator = (const State &) = delete;
- State(ITransport & transport, mbus::Reply::UP reply, uint32_t numAcksRequired);
+ State(ITransport & transport, uint32_t numAcksRequired);
~State();
- void ack();
-
- void ack(const FeedOperation::Type opType, PerDocTypeFeedMetrics &metrics);
-
void incNeededAcks();
-
- void fail(uint32_t errNum, const vespalib::string &errMsg);
- mbus::Reply & getReply() { return *_reply; }
+ void ack();
+ void fail();
void setResult(ResultUP result, bool documentWasFound) {
_documentWasFound = documentWasFound;
_result = std::move(result);
}
const storage::spi::Result &getResult() { return *_result; }
- FastOS_Time getStartTime() const { return _startTime; }
private:
- ITransport &_transport;
- mbus::Reply::UP _reply;
- ResultUP _result;
- bool _documentWasFound;
+ ITransport &_transport;
+ ResultUP _result;
+ bool _documentWasFound;
std::atomic<uint32_t> _unAckedCount;
- vespalib::Lock _lock;
- FastOS_Time _startTime;
};
std::shared_ptr<State> _state;
@@ -72,9 +57,8 @@ public:
* vespalib::IllegalArgumentException.
*
* @param transport The transport to pass the reply to.
- * @param reply The mbus::Reply corresponding to this operation.
*/
- FeedToken(ITransport &transport, mbus::Reply::UP reply);
+ FeedToken(ITransport &transport);
FeedToken(FeedToken &&) = default;
FeedToken & operator =(FeedToken &&) = default;
@@ -89,10 +73,6 @@ public:
*/
void ack() const { _state->ack(); }
- void ack(const FeedOperation::Type opType, PerDocTypeFeedMetrics &metrics) const {
- _state->ack(opType, metrics);
- }
-
void incNeededAcks() const {
_state->incNeededAcks();
}
@@ -105,14 +85,7 @@ public:
* @param errNum A numerical representation of the error.
* @param errMsg A readable string detailing the error.
*/
- void fail(uint32_t errNum, const vespalib::string &errMsg) const { _state->fail(errNum, errMsg); }
-
- /**
- * Gives you access to the underlying reply message.
- *
- * @return The reply
- */
- mbus::Reply & getReply() const { return _state->getReply(); }
+ void fail() const { _state->fail(); }
/**
* Gives you access to the underlying result.
@@ -127,8 +100,6 @@ public:
void setResult(ResultUP result, bool documentWasFound) {
_state->setResult(std::move(result), documentWasFound);
}
-
- FastOS_Time getStartTime() const { return _state->getStartTime(); }
};
} // namespace proton
diff --git a/searchcore/src/vespa/searchcore/proton/metrics/CMakeLists.txt b/searchcore/src/vespa/searchcore/proton/metrics/CMakeLists.txt
index 9f599208aa2..95d5f153f35 100644
--- a/searchcore/src/vespa/searchcore/proton/metrics/CMakeLists.txt
+++ b/searchcore/src/vespa/searchcore/proton/metrics/CMakeLists.txt
@@ -7,7 +7,6 @@ vespa_add_library(searchcore_proton_metrics STATIC
documentdb_metrics_collection.cpp
documentdb_tagged_metrics.cpp
executor_metrics.cpp
- feed_metrics.cpp
job_load_sampler.cpp
job_tracker.cpp
job_tracked_flush_target.cpp
diff --git a/searchcore/src/vespa/searchcore/proton/metrics/feed_metrics.cpp b/searchcore/src/vespa/searchcore/proton/metrics/feed_metrics.cpp
deleted file mode 100644
index 06b2f8a5fca..00000000000
--- a/searchcore/src/vespa/searchcore/proton/metrics/feed_metrics.cpp
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-
-#include "feed_metrics.h"
-
-using vespalib::LockGuard;
-
-namespace proton {
-
-FeedMetrics::FeedMetrics()
- : metrics::MetricSet("feed", "", "Feed metrics", 0),
- count("count", "logdefault", "Feed messages handled", this),
- latency("latency", "logdefault", "Feed message latency", this)
-{
-}
-
-FeedMetrics::~FeedMetrics() {}
-
-PerDocTypeFeedMetrics::PerDocTypeFeedMetrics(MetricSet *parent)
- : MetricSet("feedmetrics", "", "Feed metrics", parent),
- _update_lock(),
- _puts("puts", "", "Number of feed put operations", this),
- _updates("updates", "", "Number of feed update operations", this),
- _removes("removes", "", "Number of feed remove operations", this),
- _moves("moves", "", "Number of feed move operations", this),
- _put_latency("put_latency", "", "Latency for feed puts", this),
- _update_latency("update_latency", "", "Latency for feed updates", this),
- _remove_latency("remove_latency", "", "Latency for feed removes", this),
- _move_latency("move_latency", "", "Latency for feed moves", this)
-{
-}
-
-PerDocTypeFeedMetrics::~PerDocTypeFeedMetrics() {}
-
-void PerDocTypeFeedMetrics::RegisterPut(const FastOS_Time &start_time) {
- LockGuard lock(_update_lock);
- _puts.inc(1);
- _put_latency.addValue(start_time.MilliSecsToNow() / 1000.0);
-}
-
-void PerDocTypeFeedMetrics::RegisterUpdate(const FastOS_Time &start_time) {
- LockGuard lock(_update_lock);
- _updates.inc(1);
- _update_latency.addValue(start_time.MilliSecsToNow() / 1000.0);
-}
-
-void PerDocTypeFeedMetrics::RegisterRemove(const FastOS_Time &start_time) {
- LockGuard lock(_update_lock);
- _removes.inc(1);
- _remove_latency.addValue(start_time.MilliSecsToNow() / 1000.0);
-}
-
-void
-PerDocTypeFeedMetrics::RegisterMove(const FastOS_Time &start_time)
-{
- LockGuard lock(_update_lock);
- _moves.inc(1);
- _move_latency.addValue(start_time.MilliSecsToNow() / 1000.0);
-}
-
-} // namespace proton
diff --git a/searchcore/src/vespa/searchcore/proton/metrics/feed_metrics.h b/searchcore/src/vespa/searchcore/proton/metrics/feed_metrics.h
deleted file mode 100644
index 8d8a8bcbb88..00000000000
--- a/searchcore/src/vespa/searchcore/proton/metrics/feed_metrics.h
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-
-#pragma once
-
-#include <vespa/metrics/metrics.h>
-#include <vespa/vespalib/util/sync.h>
-
-namespace proton {
-
-struct FeedMetrics : metrics::MetricSet
-{
- vespalib::Lock updateLock;
- metrics::LongCountMetric count;
- metrics::DoubleAverageMetric latency;
-
- FeedMetrics();
- ~FeedMetrics();
-};
-
-class PerDocTypeFeedMetrics : metrics::MetricSet {
- vespalib::Lock _update_lock;
- metrics::LongCountMetric _puts;
- metrics::LongCountMetric _updates;
- metrics::LongCountMetric _removes;
- metrics::LongCountMetric _moves;
- metrics::DoubleAverageMetric _put_latency;
- metrics::DoubleAverageMetric _update_latency;
- metrics::DoubleAverageMetric _remove_latency;
- metrics::DoubleAverageMetric _move_latency;
-
-public:
- PerDocTypeFeedMetrics(metrics::MetricSet *parent);
- ~PerDocTypeFeedMetrics();
- void RegisterPut(const FastOS_Time &start_time);
- void RegisterUpdate(const FastOS_Time &start_time);
- void RegisterRemove(const FastOS_Time &start_time);
- void RegisterMove(const FastOS_Time &start_time);
-};
-
-} // namespace proton
-
diff --git a/searchcore/src/vespa/searchcore/proton/metrics/legacy_documentdb_metrics.cpp b/searchcore/src/vespa/searchcore/proton/metrics/legacy_documentdb_metrics.cpp
index d324c4a7373..2c753d24c69 100644
--- a/searchcore/src/vespa/searchcore/proton/metrics/legacy_documentdb_metrics.cpp
+++ b/searchcore/src/vespa/searchcore/proton/metrics/legacy_documentdb_metrics.cpp
@@ -152,7 +152,6 @@ LegacyDocumentDBMetrics::LegacyDocumentDBMetrics(const std::string &docTypeName,
executor("executor", this),
indexExecutor("indexexecutor", this),
summaryExecutor("summaryexecutor", this),
- feed(this),
sessionManager(this),
ready("ready", this),
notReady("notready", this),
diff --git a/searchcore/src/vespa/searchcore/proton/metrics/legacy_documentdb_metrics.h b/searchcore/src/vespa/searchcore/proton/metrics/legacy_documentdb_metrics.h
index 78a13002d7a..0abad83a3a6 100644
--- a/searchcore/src/vespa/searchcore/proton/metrics/legacy_documentdb_metrics.h
+++ b/searchcore/src/vespa/searchcore/proton/metrics/legacy_documentdb_metrics.h
@@ -6,7 +6,6 @@
#include "executor_metrics.h"
#include <vespa/metrics/metrics.h>
#include "sessionmanager_metrics.h"
-#include "feed_metrics.h"
#include <vespa/searchcore/proton/matching/matching_stats.h>
namespace proton {
@@ -117,7 +116,6 @@ struct LegacyDocumentDBMetrics : metrics::MetricSet
ExecutorMetrics executor;
ExecutorMetrics indexExecutor;
ExecutorMetrics summaryExecutor;
- PerDocTypeFeedMetrics feed;
search::grouping::SessionManagerMetrics sessionManager;
SubDBMetrics ready;
SubDBMetrics notReady;
diff --git a/searchcore/src/vespa/searchcore/proton/persistenceengine/persistenceengine.cpp b/searchcore/src/vespa/searchcore/proton/persistenceengine/persistenceengine.cpp
index 69a3a902af8..feebbf4cf2a 100644
--- a/searchcore/src/vespa/searchcore/proton/persistenceengine/persistenceengine.cpp
+++ b/searchcore/src/vespa/searchcore/proton/persistenceengine/persistenceengine.cpp
@@ -182,17 +182,14 @@ PersistenceEngine::getHandlerSnapshot(document::BucketSpace bucketSpace) const
}
PersistenceEngine::HandlerSnapshot::UP
-PersistenceEngine::getHandlerSnapshot(document::BucketSpace bucketSpace,
- const DocumentId &id) const
+PersistenceEngine::getHandlerSnapshot(document::BucketSpace bucketSpace, const DocumentId &id) const
{
LockGuard guard(_lock);
return _handlers.getHandlerSnapshot(bucketSpace, id);
}
-PersistenceEngine::PersistenceEngine(IPersistenceEngineOwner &owner,
- const IResourceWriteFilter &writeFilter,
- ssize_t defaultSerializedSize,
- bool ignoreMaxBytes)
+PersistenceEngine::PersistenceEngine(IPersistenceEngineOwner &owner, const IResourceWriteFilter &writeFilter,
+ ssize_t defaultSerializedSize, bool ignoreMaxBytes)
: AbstractPersistenceProvider(),
_defaultSerializedSize(defaultSerializedSize),
_ignoreMaxBytes(ignoreMaxBytes),
@@ -216,8 +213,7 @@ PersistenceEngine::~PersistenceEngine()
IPersistenceHandler::SP
-PersistenceEngine::putHandler(document::BucketSpace bucketSpace,
- const DocTypeName &docType,
+PersistenceEngine::putHandler(document::BucketSpace bucketSpace, const DocTypeName &docType,
const IPersistenceHandler::SP &handler)
{
LockGuard guard(_lock);
@@ -226,8 +222,7 @@ PersistenceEngine::putHandler(document::BucketSpace bucketSpace,
IPersistenceHandler::SP
-PersistenceEngine::getHandler(document::BucketSpace bucketSpace,
- const DocTypeName &docType) const
+PersistenceEngine::getHandler(document::BucketSpace bucketSpace, const DocTypeName &docType) const
{
LockGuard guard(_lock);
return _handlers.getHandler(bucketSpace, docType);
@@ -235,8 +230,7 @@ PersistenceEngine::getHandler(document::BucketSpace bucketSpace,
IPersistenceHandler::SP
-PersistenceEngine::removeHandler(document::BucketSpace bucketSpace,
- const DocTypeName &docType)
+PersistenceEngine::removeHandler(document::BucketSpace bucketSpace, const DocTypeName &docType)
{
// TODO: Grab bucket list and treat them as modified
LockGuard guard(_lock);
@@ -367,8 +361,7 @@ PersistenceEngine::put(const Bucket& b, Timestamp t, const document::Document::S
docType.toString().c_str()));
}
TransportLatch latch(1);
- FeedToken token(latch, mbus::Reply::UP(new documentapi::FeedReply(
- documentapi::DocumentProtocol::REPLY_PUTDOCUMENT)));
+ FeedToken token(latch);
handler->handlePut(token, b, t, doc);
latch.await();
return latch.getResult();
@@ -390,7 +383,7 @@ PersistenceEngine::remove(const Bucket& b, Timestamp t, const DocumentId& did, C
TransportLatch latch(snap->size());
for (; snap->handlers().valid(); snap->handlers().next()) {
IPersistenceHandler *handler = snap->handlers().get();
- FeedToken token(latch, Reply::UP(new RemoveDocumentReply));
+ FeedToken token(latch);
handler->handleRemove(token, b, t, did);
}
latch.await();
@@ -421,7 +414,7 @@ PersistenceEngine::update(const Bucket& b, Timestamp t, const DocumentUpdate::SP
IPersistenceHandler::SP handler = getHandler(b.getBucketSpace(), docType);
TransportLatch latch(1);
if (handler.get() != NULL) {
- FeedToken token(latch, mbus::Reply::UP(new documentapi::UpdateDocumentReply()));
+ FeedToken token(latch);
LOG(debug, "update = %s", upd->toXml().c_str());
handler->handleUpdate(token, b, t, upd);
latch.await();
@@ -433,10 +426,7 @@ PersistenceEngine::update(const Bucket& b, Timestamp t, const DocumentUpdate::SP
PersistenceEngine::GetResult
-PersistenceEngine::get(const Bucket& b,
- const document::FieldSet& fields,
- const DocumentId& did,
- Context& context) const
+PersistenceEngine::get(const Bucket& b, const document::FieldSet& fields, const DocumentId& did, Context& context) const
{
std::shared_lock<std::shared_timed_mutex> rguard(_rwMutex);
HandlerSnapshot::UP snapshot = getHandlerSnapshot(b.getBucketSpace());
@@ -465,11 +455,8 @@ PersistenceEngine::get(const Bucket& b,
PersistenceEngine::CreateIteratorResult
-PersistenceEngine::createIterator(const Bucket &bucket,
- const document::FieldSet& fields,
- const Selection &selection,
- IncludedVersions versions,
- Context & context)
+PersistenceEngine::createIterator(const Bucket &bucket, const document::FieldSet& fields, const Selection &selection,
+ IncludedVersions versions, Context & context)
{
std::shared_lock<std::shared_timed_mutex> rguard(_rwMutex);
HandlerSnapshot::UP snapshot = getHandlerSnapshot(bucket.getBucketSpace());
@@ -552,7 +539,7 @@ PersistenceEngine::createBucket(const Bucket &b, Context &)
TransportLatch latch(snap->size());
for (; snap->handlers().valid(); snap->handlers().next()) {
IPersistenceHandler *handler = snap->handlers().get();
- FeedToken token(latch, Reply::UP(new DocumentReply(0)));
+ FeedToken token(latch);
handler->handleCreateBucket(token, b);
}
latch.await();
@@ -569,7 +556,7 @@ PersistenceEngine::deleteBucket(const Bucket& b, Context&)
TransportLatch latch(snap->size());
for (; snap->handlers().valid(); snap->handlers().next()) {
IPersistenceHandler *handler = snap->handlers().get();
- FeedToken token(latch, Reply::UP(new DocumentReply(0)));
+ FeedToken token(latch);
handler->handleDeleteBucket(token, b);
}
latch.await();
@@ -612,7 +599,7 @@ PersistenceEngine::split(const Bucket& source, const Bucket& target1, const Buck
TransportLatch latch(snap->size());
for (; snap->handlers().valid(); snap->handlers().next()) {
IPersistenceHandler *handler = snap->handlers().get();
- FeedToken token(latch, Reply::UP(new DocumentReply(0)));
+ FeedToken token(latch);
handler->handleSplit(token, source, target1, target2);
}
latch.await();
@@ -631,7 +618,7 @@ PersistenceEngine::join(const Bucket& source1, const Bucket& source2, const Buck
TransportLatch latch(snap->size());
for (; snap->handlers().valid(); snap->handlers().next()) {
IPersistenceHandler *handler = snap->handlers().get();
- FeedToken token(latch, Reply::UP(new DocumentReply(0)));
+ FeedToken token(latch);
handler->handleJoin(token, source1, source2, target);
}
latch.await();
diff --git a/searchcore/src/vespa/searchcore/proton/persistenceengine/transport_latch.cpp b/searchcore/src/vespa/searchcore/proton/persistenceengine/transport_latch.cpp
index e719a0aa962..e0d512ae6e0 100644
--- a/searchcore/src/vespa/searchcore/proton/persistenceengine/transport_latch.cpp
+++ b/searchcore/src/vespa/searchcore/proton/persistenceengine/transport_latch.cpp
@@ -16,16 +16,11 @@ TransportLatch::TransportLatch(uint32_t cnt)
TransportLatch::~TransportLatch() {}
void
-TransportLatch::send(mbus::Reply::UP reply,
- ResultUP result,
- bool documentWasFound,
- double latency_ms)
+TransportLatch::send(ResultUP result, bool documentWasFound)
{
- (void) reply;
- (void) latency_ms;
{
vespalib::LockGuard guard(_lock);
- if (!_result.get()) {
+ if (!_result) {
_result = std::move(result);
} else if (result->hasError()) {
_result.reset(new Result(mergeErrorResults(*_result, *result)));
@@ -40,9 +35,7 @@ Result
TransportLatch::mergeErrorResults(const Result &lhs, const Result &rhs)
{
Result::ErrorType error = (lhs.getErrorCode() > rhs.getErrorCode() ? lhs : rhs).getErrorCode();
- return Result(error, vespalib::make_string("%s, %s",
- lhs.getErrorMessage().c_str(),
- rhs.getErrorMessage().c_str()));
+ return Result(error, vespalib::make_string("%s, %s", lhs.getErrorMessage().c_str(), rhs.getErrorMessage().c_str()));
}
} // proton
diff --git a/searchcore/src/vespa/searchcore/proton/persistenceengine/transport_latch.h b/searchcore/src/vespa/searchcore/proton/persistenceengine/transport_latch.h
index 747c95358b4..12f92722dfa 100644
--- a/searchcore/src/vespa/searchcore/proton/persistenceengine/transport_latch.h
+++ b/searchcore/src/vespa/searchcore/proton/persistenceengine/transport_latch.h
@@ -20,10 +20,7 @@ private:
public:
TransportLatch(uint32_t cnt);
~TransportLatch();
- virtual void send(mbus::Reply::UP reply,
- ResultUP result,
- bool documentWasFound,
- double latency_ms) override;
+ void send(ResultUP result, bool documentWasFound) override;
void await() {
_latch.await();
}
diff --git a/searchcore/src/vespa/searchcore/proton/server/documentdb.cpp b/searchcore/src/vespa/searchcore/proton/server/documentdb.cpp
index cffa014534e..4198803d1fe 100644
--- a/searchcore/src/vespa/searchcore/proton/server/documentdb.cpp
+++ b/searchcore/src/vespa/searchcore/proton/server/documentdb.cpp
@@ -125,9 +125,7 @@ DocumentDB::DocumentDB(const vespalib::string &baseDir,
_state(),
_dmUsageForwarder(_writeService.master()),
_writeFilter(),
- _feedHandler(_writeService, tlsSpec, docTypeName,
- getMetricsCollection().getLegacyMetrics().feed,
- _state, *this, _writeFilter, *this, tlsDirectWriter),
+ _feedHandler(_writeService, tlsSpec, docTypeName, _state, *this, _writeFilter, *this, tlsDirectWriter),
_subDBs(*this, *this, _feedHandler, _docTypeName, _writeService, warmupExecutor,
summaryExecutor, fileHeaderContext, metricsWireService, getMetricsCollection(),
queryLimiter, clock, _configMutex, _baseDir, protonCfg, hwInfo),
@@ -138,7 +136,7 @@ DocumentDB::DocumentDB(const vespalib::string &baseDir,
_lastDocStoreCacheStats(),
_calc()
{
- assert(configSnapshot.get() != NULL);
+ assert(configSnapshot);
LOG(debug, "DocumentDB(%s): Creating database in directory '%s'",
_docTypeName.toString().c_str(), _baseDir.c_str());
@@ -277,7 +275,7 @@ DocumentDB::newConfigSnapshot(DocumentDBConfig::SP snapshot)
_pendingConfigSnapshot.set(snapshot);
{
lock_guard guard(_configMutex);
- if (_activeConfigSnapshot.get() == NULL) {
+ if ( ! _activeConfigSnapshot) {
LOG(debug,
"DocumentDB(%s): Ignoring new available config snapshot. "
"The document database does not have"
diff --git a/searchcore/src/vespa/searchcore/proton/server/fast_access_feed_view.cpp b/searchcore/src/vespa/searchcore/proton/server/fast_access_feed_view.cpp
index e46caca4fba..2b2849d025c 100644
--- a/searchcore/src/vespa/searchcore/proton/server/fast_access_feed_view.cpp
+++ b/searchcore/src/vespa/searchcore/proton/server/fast_access_feed_view.cpp
@@ -36,11 +36,8 @@ FastAccessFeedView::getUpdateScope(const DocumentUpdate &upd)
* Otherwise we can drop it and ack the operation right away.
*/
void
-FastAccessFeedView::putAttributes(SerialNum serialNum,
- search::DocumentIdT lid,
- const Document &doc,
- bool immediateCommit,
- OnPutDoneType onWriteDone)
+FastAccessFeedView::putAttributes(SerialNum serialNum, search::DocumentIdT lid, const Document &doc,
+ bool immediateCommit, OnPutDoneType onWriteDone)
{
_attributeWriter->put(serialNum, doc, lid, immediateCommit, onWriteDone);
if (immediateCommit && onWriteDone) {
@@ -49,29 +46,22 @@ FastAccessFeedView::putAttributes(SerialNum serialNum,
}
void
-FastAccessFeedView::updateAttributes(SerialNum serialNum,
- search::DocumentIdT lid,
- const DocumentUpdate &upd,
- bool immediateCommit,
- OnOperationDoneType onWriteDone)
+FastAccessFeedView::updateAttributes(SerialNum serialNum, search::DocumentIdT lid, const DocumentUpdate &upd,
+ bool immediateCommit, OnOperationDoneType onWriteDone)
{
_attributeWriter->update(serialNum, upd, lid, immediateCommit, onWriteDone);
}
void
-FastAccessFeedView::removeAttributes(SerialNum serialNum,
- search::DocumentIdT lid,
- bool immediateCommit,
- OnRemoveDoneType onWriteDone)
+FastAccessFeedView::removeAttributes(SerialNum serialNum, search::DocumentIdT lid,
+ bool immediateCommit, OnRemoveDoneType onWriteDone)
{
_attributeWriter->remove(serialNum, lid, immediateCommit, onWriteDone);
}
void
-FastAccessFeedView::removeAttributes(SerialNum serialNum,
- const LidVector &lidsToRemove,
- bool immediateCommit,
- OnWriteDoneType onWriteDone)
+FastAccessFeedView::removeAttributes(SerialNum serialNum, const LidVector &lidsToRemove,
+ bool immediateCommit, OnWriteDoneType onWriteDone)
{
_attributeWriter->remove(lidsToRemove, serialNum, immediateCommit, onWriteDone);
}
@@ -83,8 +73,7 @@ FastAccessFeedView::heartBeatAttributes(SerialNum serialNum)
}
FastAccessFeedView::FastAccessFeedView(const StoreOnlyFeedView::Context &storeOnlyCtx,
- const PersistentParams &params,
- const Context &ctx)
+ const PersistentParams &params, const Context &ctx)
: Parent(storeOnlyCtx, params),
_attributeWriter(ctx._attrWriter),
_docIdLimit(ctx._docIdLimit)
@@ -103,8 +92,7 @@ FastAccessFeedView::handleCompactLidSpace(const CompactLidSpaceOperation &op)
}
void
-FastAccessFeedView::forceCommit(SerialNum serialNum,
- OnForceCommitDoneType onCommitDone)
+FastAccessFeedView::forceCommit(SerialNum serialNum, OnForceCommitDoneType onCommitDone)
{
_attributeWriter->forceCommit(serialNum, onCommitDone);
onCommitDone->registerCommittedDocIdLimit(_metaStore.getCommittedDocIdLimit(), &_docIdLimit);
@@ -119,5 +107,19 @@ FastAccessFeedView::sync()
_writeService.attributeFieldWriter().sync();
}
+bool
+FastAccessFeedView::fastPartialUpdateAttribute(const vespalib::string &fieldName) const {
+ search::AttributeVector *attribute = _attributeWriter->getWritableAttribute(fieldName);
+ if (attribute == nullptr) {
+ // Partial update to non-attribute field must update document
+ return false;
+ }
+ search::attribute::BasicType::Type attrType = attribute->getBasicType();
+ // Partial update to tensor, predicate or reference attribute
+ // must update document
+ return ((attrType != search::attribute::BasicType::Type::PREDICATE) &&
+ (attrType != search::attribute::BasicType::Type::TENSOR) &&
+ (attrType != search::attribute::BasicType::Type::REFERENCE));
+}
} // namespace proton
diff --git a/searchcore/src/vespa/searchcore/proton/server/fast_access_feed_view.h b/searchcore/src/vespa/searchcore/proton/server/fast_access_feed_view.h
index 4056aecd24c..e1b0cf83f64 100644
--- a/searchcore/src/vespa/searchcore/proton/server/fast_access_feed_view.h
+++ b/searchcore/src/vespa/searchcore/proton/server/fast_access_feed_view.h
@@ -39,39 +39,28 @@ private:
const IAttributeWriter::SP _attributeWriter;
DocIdLimit &_docIdLimit;
- virtual UpdateScope getUpdateScope(const document::DocumentUpdate &upd) override;
+ UpdateScope getUpdateScope(const document::DocumentUpdate &upd) override;
- virtual void putAttributes(SerialNum serialNum,
- search::DocumentIdT lid,
- const document::Document &doc,
- bool immediateCommit,
- OnPutDoneType onWriteDone) override;
+ void putAttributes(SerialNum serialNum, search::DocumentIdT lid, const document::Document &doc,
+ bool immediateCommit, OnPutDoneType onWriteDone) override;
- virtual void updateAttributes(SerialNum serialNum,
- search::DocumentIdT lid,
- const document::DocumentUpdate &upd,
- bool immediateCommit,
- OnOperationDoneType onWriteDone) override;
+ void updateAttributes(SerialNum serialNum, search::DocumentIdT lid, const document::DocumentUpdate &upd,
+ bool immediateCommit, OnOperationDoneType onWriteDone) override;
- virtual void removeAttributes(SerialNum serialNum,
- search::DocumentIdT lid,
- bool immediateCommit,
- OnRemoveDoneType onWriteDone) override;
+ void removeAttributes(SerialNum serialNum, search::DocumentIdT lid,
+ bool immediateCommit, OnRemoveDoneType onWriteDone) override;
- virtual void removeAttributes(SerialNum serialNum,
- const LidVector &lidsToRemove,
- bool immediateCommit,
- OnWriteDoneType onWriteDone) override;
+ void removeAttributes(SerialNum serialNum, const LidVector &lidsToRemove,
+ bool immediateCommit, OnWriteDoneType onWriteDone) override;
- virtual void heartBeatAttributes(SerialNum serialNum) override;
+ void heartBeatAttributes(SerialNum serialNum) override;
protected:
- virtual void forceCommit(SerialNum serialNum, OnForceCommitDoneType onCommitDone) override;
+ void forceCommit(SerialNum serialNum, OnForceCommitDoneType onCommitDone) override;
public:
FastAccessFeedView(const StoreOnlyFeedView::Context &storeOnlyCtx,
- const PersistentParams &params,
- const Context &ctx);
+ const PersistentParams &params, const Context &ctx);
~FastAccessFeedView();
virtual const IAttributeWriter::SP &getAttributeWriter() const {
@@ -82,24 +71,10 @@ public:
return _docIdLimit;
}
- virtual void handleCompactLidSpace(const CompactLidSpaceOperation &op) override;
-
- virtual void sync() override;
-
- bool fastPartialUpdateAttribute(const vespalib::string &fieldName) {
- search::AttributeVector *attribute =
- _attributeWriter->getWritableAttribute(fieldName);
- if (attribute == nullptr) {
- // Partial update to non-attribute field must update document
- return false;
- }
- search::attribute::BasicType::Type attrType = attribute->getBasicType();
- // Partial update to tensor, predicate or reference attribute
- // must update document
- return ((attrType != search::attribute::BasicType::Type::PREDICATE) &&
- (attrType != search::attribute::BasicType::Type::TENSOR) &&
- (attrType != search::attribute::BasicType::Type::REFERENCE));
- }
+ void handleCompactLidSpace(const CompactLidSpaceOperation &op) override;
+ void sync() override;
+
+ bool fastPartialUpdateAttribute(const vespalib::string &fieldName) const;
};
} // namespace proton
diff --git a/searchcore/src/vespa/searchcore/proton/server/feedhandler.cpp b/searchcore/src/vespa/searchcore/proton/server/feedhandler.cpp
index bb5f058429a..9300af5c3f0 100644
--- a/searchcore/src/vespa/searchcore/proton/server/feedhandler.cpp
+++ b/searchcore/src/vespa/searchcore/proton/server/feedhandler.cpp
@@ -49,27 +49,9 @@ namespace proton {
namespace {
-void
-setUpdateWasFound(mbus::Reply &reply, bool was_found)
-{
- assert(static_cast<DocumentReply&>(reply).getType() == DocumentProtocol::REPLY_UPDATEDOCUMENT);
- UpdateDocumentReply &update_rep = static_cast<UpdateDocumentReply&>(reply);
- update_rep.setWasFound(was_found);
-}
-
-void
-setRemoveWasFound(mbus::Reply &reply, bool was_found)
-{
- assert(static_cast<DocumentReply&>(reply).getType() == DocumentProtocol::REPLY_REMOVEDOCUMENT);
- RemoveDocumentReply &remove_rep = static_cast<RemoveDocumentReply&>(reply);
- remove_rep.setWasFound(was_found);
-}
-
bool
-ignoreOperation(const DocumentOperation &op)
-{
- return (op.getPrevTimestamp() != 0)
- && (op.getTimestamp() < op.getPrevTimestamp());
+ignoreOperation(const DocumentOperation &op) {
+ return (op.getPrevTimestamp() != 0) && (op.getTimestamp() < op.getPrevTimestamp());
}
} // namespace
@@ -119,7 +101,7 @@ void FeedHandler::performPut(FeedToken::UP token, PutOperation &op) {
op.getDocument()->getId().toString().c_str(), (uint64_t)op.getTimestamp(), (uint64_t)op.getPrevTimestamp());
if (token) {
token->setResult(ResultUP(new Result), false);
- token->ack(op.getType(), _metrics);
+ token->ack();
}
return;
}
@@ -142,8 +124,7 @@ FeedHandler::performUpdate(FeedToken::UP token, UpdateOperation &op)
} else {
if (token) {
token->setResult(ResultUP(new UpdateResult(Timestamp(0))), false);
- setUpdateWasFound(token->getReply(), false);
- token->ack(op.getType(), _metrics);
+ token->ack();
}
}
}
@@ -155,7 +136,6 @@ FeedHandler::performInternalUpdate(FeedToken::UP token, UpdateOperation &op)
storeOperation(op);
if (token) {
token->setResult(ResultUP(new UpdateResult(op.getPrevTimestamp())), true);
- setUpdateWasFound(token->getReply(), true);
}
_activeFeedView->handleUpdate(token.get(), op);
}
@@ -172,10 +152,9 @@ FeedHandler::createNonExistingDocument(FeedToken::UP token, const UpdateOperatio
storeOperation(putOp);
if (token) {
token->setResult(ResultUP(new UpdateResult(putOp.getTimestamp())), true);
- setUpdateWasFound(token->getReply(), true);
}
TransportLatch latch(1);
- FeedToken putToken(latch, mbus::Reply::UP(new FeedReply(DocumentProtocol::REPLY_PUTDOCUMENT)));
+ FeedToken putToken(latch);
_activeFeedView->handlePut(&putToken, putOp);
latch.await();
if (token) {
@@ -191,7 +170,7 @@ void FeedHandler::performRemove(FeedToken::UP token, RemoveOperation &op) {
op.getDocumentId().toString().c_str(), (uint64_t)op.getTimestamp(), (uint64_t)op.getPrevTimestamp());
if (token) {
token->setResult(ResultUP(new RemoveResult(false)), false);
- token->ack(op.getType(), _metrics);
+ token->ack();
}
return;
}
@@ -202,7 +181,6 @@ void FeedHandler::performRemove(FeedToken::UP token, RemoveOperation &op) {
if (token) {
bool documentWasFound = !op.getPrevMarkedAsRemoved();
token->setResult(ResultUP(new RemoveResult(documentWasFound)), documentWasFound);
- setRemoveWasFound(token->getReply(), documentWasFound);
}
_activeFeedView->handleRemove(token.get(), op);
} else if (op.hasDocType()) {
@@ -210,14 +188,12 @@ void FeedHandler::performRemove(FeedToken::UP token, RemoveOperation &op) {
storeOperation(op);
if (token) {
token->setResult(ResultUP(new RemoveResult(false)), false);
- setRemoveWasFound(token->getReply(), false);
}
_activeFeedView->handleRemove(token.get(), op);
} else {
if (token) {
token->setResult(ResultUP(new RemoveResult(false)), false);
- setRemoveWasFound(token->getReply(), false);
- token->ack(op.getType(), _metrics);
+ token->ack();
}
}
}
@@ -367,7 +343,6 @@ FeedHandler::changeFeedState(FeedState::SP newState, const LockGuard &)
FeedHandler::FeedHandler(IThreadingService &writeService,
const vespalib::string &tlsSpec,
const DocTypeName &docTypeName,
- PerDocTypeFeedMetrics &metrics,
DDBState &state,
IFeedHandlerOwner &owner,
const IResourceWriteFilter &writeFilter,
@@ -395,9 +370,8 @@ FeedHandler::FeedHandler(IThreadingService &writeService,
_delayedPrune(false),
_feedLock(),
_feedState(std::make_shared<InitState>(getDocTypeName())),
- _activeFeedView(NULL),
+ _activeFeedView(nullptr),
_bucketDBHandler(nullptr),
- _metrics(metrics),
_syncLock(),
_syncedSerialNum(0),
_allowSync(false)
@@ -499,7 +473,7 @@ void feedOperationRejected(FeedToken *token, const vespalib::string &opType, con
auto message = make_string("%s operation rejected for document '%s' of type '%s': '%s'",
opType.c_str(), docId.c_str(), docTypeName.toString().c_str(), rejectMessage.c_str());
token->setResult(ResultUP(new ResultType(Result::RESOURCE_EXHAUSTED, message)), false);
- token->fail(documentapi::DocumentProtocol::ERROR_REJECTED, message);
+ token->fail();
}
}
diff --git a/searchcore/src/vespa/searchcore/proton/server/feedhandler.h b/searchcore/src/vespa/searchcore/proton/server/feedhandler.h
index 335a86e0279..dc955cfeb79 100644
--- a/searchcore/src/vespa/searchcore/proton/server/feedhandler.h
+++ b/searchcore/src/vespa/searchcore/proton/server/feedhandler.h
@@ -29,7 +29,6 @@ class IFeedView;
class IResourceWriteFilter;
class IReplayConfig;
class JoinBucketsOperation;
-class PerDocTypeFeedMetrics;
class PutOperation;
class RemoveOperation;
class SplitBucketOperation;
@@ -92,8 +91,6 @@ private:
// used by master write thread tasks
IFeedView *_activeFeedView;
bucketdb::IBucketDBHandler *_bucketDBHandler;
- PerDocTypeFeedMetrics &_metrics;
-
vespalib::Lock _syncLock;
SerialNum _syncedSerialNum;
bool _allowSync; // Sanity check
@@ -143,16 +140,14 @@ public:
* @param writeService The thread service used for all write tasks.
* @param tlsSpec The spec to connect to the transaction log server.
* @param docTypeName The name and version of the document type we are feed handler for.
- * @param metrics Feeding metrics.
* @param state Document db state
* @param owner Reference to the owner of this feed handler.
* @param replayConfig Reference to interface used for replaying config changes.
- * @param writer Inject writer for tls, or NULL to use internal.
+ * @param writer Inject writer for tls, or nullptr to use internal.
*/
FeedHandler(IThreadingService &writeService,
const vespalib::string &tlsSpec,
const DocTypeName &docTypeName,
- PerDocTypeFeedMetrics &metrics,
DDBState &state,
IFeedHandlerOwner &owner,
const IResourceWriteFilter &writerFilter,
@@ -160,7 +155,7 @@ public:
search::transactionlog::Writer & writer,
TlsWriter * tlsWriter = nullptr);
- virtual ~FeedHandler();
+ ~FeedHandler() override;
/**
* Init this feed handler.
diff --git a/searchcore/src/vespa/searchcore/proton/server/feedstate.cpp b/searchcore/src/vespa/searchcore/proton/server/feedstate.cpp
index 2ec3de61dea..3628505ed66 100644
--- a/searchcore/src/vespa/searchcore/proton/server/feedstate.cpp
+++ b/searchcore/src/vespa/searchcore/proton/server/feedstate.cpp
@@ -1,6 +1,7 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
#include "feedstate.h"
+#include <vespa/searchcore/proton/feedoperation/feedoperation.h>
#include <vespa/vespalib/util/exceptions.h>
using document::BucketId;
@@ -26,8 +27,7 @@ void FeedState::throwExceptionInReceive(const vespalib::string &docType,
}
void
-FeedState::throwExceptionInHandleOperation(const vespalib::string &docType,
- const FeedOperation &op)
+FeedState::throwExceptionInHandleOperation(const vespalib::string &docType, const FeedOperation &op)
{
throw IllegalStateException
(make_string("We should not receive any feed operations"
diff --git a/searchcore/src/vespa/searchcore/proton/server/feedstate.h b/searchcore/src/vespa/searchcore/proton/server/feedstate.h
index 13dd6ea9dc8..472f5cb224f 100644
--- a/searchcore/src/vespa/searchcore/proton/server/feedstate.h
+++ b/searchcore/src/vespa/searchcore/proton/server/feedstate.h
@@ -12,27 +12,22 @@
namespace proton {
+class FeedOperation;
/**
* Class representing the current state of a feed handler.
*/
class FeedState {
public:
- enum Type { NORMAL,
- REPLAY_TRANSACTION_LOG,
- INIT };
+ enum Type { NORMAL, REPLAY_TRANSACTION_LOG, INIT };
private:
Type _type;
protected:
- void throwExceptionInReceive(const vespalib::string &docType,
- uint64_t serialRangeFrom,
- uint64_t serialRangeTo,
- size_t packetSize);
-
- void throwExceptionInHandleOperation(const vespalib::string &docType,
- const FeedOperation &op);
+ void throwExceptionInReceive(const vespalib::string &docType, uint64_t serialRangeFrom,
+ uint64_t serialRangeTo, size_t packetSize);
+ void throwExceptionInHandleOperation(const vespalib::string &docType, const FeedOperation &op);
public:
typedef std::shared_ptr<FeedState> SP;
@@ -43,11 +38,8 @@ public:
Type getType() const { return _type; }
vespalib::string getName() const;
- virtual void handleOperation(FeedToken token, FeedOperation::UP op) = 0;
-
- virtual void receive(const PacketWrapper::SP &wrap,
- vespalib::Executor &executor) = 0;
+ virtual void handleOperation(FeedToken token, std::unique_ptr<FeedOperation> op) = 0;
+ virtual void receive(const PacketWrapper::SP &wrap, vespalib::Executor &executor) = 0;
};
} // namespace proton
-
diff --git a/searchcore/src/vespa/searchcore/proton/server/operationdonecontext.cpp b/searchcore/src/vespa/searchcore/proton/server/operationdonecontext.cpp
index 19235bb1e23..9c0115f0084 100644
--- a/searchcore/src/vespa/searchcore/proton/server/operationdonecontext.cpp
+++ b/searchcore/src/vespa/searchcore/proton/server/operationdonecontext.cpp
@@ -5,12 +5,8 @@
namespace proton {
-OperationDoneContext::OperationDoneContext(std::unique_ptr<FeedToken> token,
- const FeedOperation::Type opType,
- PerDocTypeFeedMetrics &metrics)
- : _token(std::move(token)),
- _opType(opType),
- _metrics(metrics)
+OperationDoneContext::OperationDoneContext(std::unique_ptr<FeedToken> token)
+ : _token(std::move(token))
{
}
@@ -24,7 +20,7 @@ OperationDoneContext::ack()
{
if (_token) {
std::unique_ptr<FeedToken> token(std::move(_token));
- token->ack(_opType, _metrics);
+ token->ack();
}
}
diff --git a/searchcore/src/vespa/searchcore/proton/server/operationdonecontext.h b/searchcore/src/vespa/searchcore/proton/server/operationdonecontext.h
index 3f7a6436604..b801987844b 100644
--- a/searchcore/src/vespa/searchcore/proton/server/operationdonecontext.h
+++ b/searchcore/src/vespa/searchcore/proton/server/operationdonecontext.h
@@ -7,7 +7,6 @@
namespace proton {
-class PerDocTypeFeedMetrics;
class FeedToken;
/**
@@ -20,18 +19,13 @@ class FeedToken;
class OperationDoneContext : public search::IDestructorCallback
{
std::unique_ptr<FeedToken> _token;
- const FeedOperation::Type _opType;
- PerDocTypeFeedMetrics &_metrics;
-
protected:
void ack();
public:
- OperationDoneContext(std::unique_ptr<FeedToken> token,
- const FeedOperation::Type opType,
- PerDocTypeFeedMetrics &metrics);
+ OperationDoneContext(std::unique_ptr<FeedToken> token);
- virtual ~OperationDoneContext();
+ ~OperationDoneContext() override;
FeedToken *getToken() { return _token.get(); }
};
diff --git a/searchcore/src/vespa/searchcore/proton/server/putdonecontext.cpp b/searchcore/src/vespa/searchcore/proton/server/putdonecontext.cpp
index efb5a58dd2e..649eebb26f5 100644
--- a/searchcore/src/vespa/searchcore/proton/server/putdonecontext.cpp
+++ b/searchcore/src/vespa/searchcore/proton/server/putdonecontext.cpp
@@ -8,14 +8,13 @@
namespace proton {
PutDoneContext::PutDoneContext(std::unique_ptr<FeedToken> token,
- const FeedOperation::Type opType,
- PerDocTypeFeedMetrics &metrics,
+
IGidToLidChangeHandler &gidToLidChangeHandler,
const document::GlobalId &gid,
uint32_t lid,
search::SerialNum serialNum,
bool enableNotifyPut)
- : OperationDoneContext(std::move(token), opType, metrics),
+ : OperationDoneContext(std::move(token)),
_lid(lid),
_docIdLimit(nullptr),
_gidToLidChangeHandler(gidToLidChangeHandler),
diff --git a/searchcore/src/vespa/searchcore/proton/server/putdonecontext.h b/searchcore/src/vespa/searchcore/proton/server/putdonecontext.h
index bddf9dabd90..3e98b02dda6 100644
--- a/searchcore/src/vespa/searchcore/proton/server/putdonecontext.h
+++ b/searchcore/src/vespa/searchcore/proton/server/putdonecontext.h
@@ -6,9 +6,7 @@
#include <vespa/document/base/globalid.h>
#include <vespa/searchlib/common/serialnum.h>
-namespace proton
-{
-
+namespace proton {
class DocIdLimit;
class IGidToLidChangeHandler;
@@ -30,21 +28,11 @@ class PutDoneContext : public OperationDoneContext
bool _enableNotifyPut;
public:
- PutDoneContext(std::unique_ptr<FeedToken> token,
- const FeedOperation::Type opType,
- PerDocTypeFeedMetrics &metrics,
- IGidToLidChangeHandler &gidToLidChangeHandler,
- const document::GlobalId &gid,
- uint32_t lid,
- search::SerialNum serialNum,
- bool enableNotifyPut);
-
- virtual ~PutDoneContext();
-
- void registerPutLid(DocIdLimit *docIdLimit)
- {
- _docIdLimit = docIdLimit;
- }
+ PutDoneContext(std::unique_ptr<FeedToken> token, IGidToLidChangeHandler &gidToLidChangeHandler,
+ const document::GlobalId &gid, uint32_t lid, search::SerialNum serialNum, bool enableNotifyPut);
+ ~PutDoneContext() override;
+
+ void registerPutLid(DocIdLimit *docIdLimit) { _docIdLimit = docIdLimit; }
};
diff --git a/searchcore/src/vespa/searchcore/proton/server/removedonecontext.cpp b/searchcore/src/vespa/searchcore/proton/server/removedonecontext.cpp
index 627e8d9f627..bd9a8240d73 100644
--- a/searchcore/src/vespa/searchcore/proton/server/removedonecontext.cpp
+++ b/searchcore/src/vespa/searchcore/proton/server/removedonecontext.cpp
@@ -8,13 +8,11 @@
namespace proton {
RemoveDoneContext::RemoveDoneContext(std::unique_ptr<FeedToken> token,
- const FeedOperation::Type opType,
- PerDocTypeFeedMetrics &metrics,
vespalib::Executor &executor,
IDocumentMetaStore &documentMetaStore,
PendingNotifyRemoveDone &&pendingNotifyRemoveDone,
uint32_t lid)
- : OperationDoneContext(std::move(token), opType, metrics),
+ : OperationDoneContext(std::move(token)),
_executor(executor),
_task(),
_pendingNotifyRemoveDone(std::move(pendingNotifyRemoveDone))
diff --git a/searchcore/src/vespa/searchcore/proton/server/removedonecontext.h b/searchcore/src/vespa/searchcore/proton/server/removedonecontext.h
index c4fafb4e886..83f6013dd85 100644
--- a/searchcore/src/vespa/searchcore/proton/server/removedonecontext.h
+++ b/searchcore/src/vespa/searchcore/proton/server/removedonecontext.h
@@ -8,8 +8,7 @@
#include <vespa/searchlib/common/serialnum.h>
#include <vespa/searchcore/proton/reference/pending_notify_remove_done.h>
-namespace proton
-{
+namespace proton {
class IDocumentMetaStore;
@@ -29,15 +28,11 @@ class RemoveDoneContext : public OperationDoneContext
PendingNotifyRemoveDone _pendingNotifyRemoveDone;
public:
- RemoveDoneContext(std::unique_ptr<FeedToken> token,
- const FeedOperation::Type opType,
- PerDocTypeFeedMetrics &metrics,
- vespalib::Executor &executor,
- IDocumentMetaStore &documentMetaStore,
- PendingNotifyRemoveDone &&pendingNotifyRemoveDone,
+ RemoveDoneContext(std::unique_ptr<FeedToken> token, vespalib::Executor &executor,
+ IDocumentMetaStore &documentMetaStore, PendingNotifyRemoveDone &&pendingNotifyRemoveDone,
uint32_t lid);
- virtual ~RemoveDoneContext();
+ ~RemoveDoneContext() override;
};
diff --git a/searchcore/src/vespa/searchcore/proton/server/searchable_feed_view.cpp b/searchcore/src/vespa/searchcore/proton/server/searchable_feed_view.cpp
index d3d73b42fbe..0c87d24899d 100644
--- a/searchcore/src/vespa/searchcore/proton/server/searchable_feed_view.cpp
+++ b/searchcore/src/vespa/searchcore/proton/server/searchable_feed_view.cpp
@@ -5,7 +5,6 @@
#include "operationdonecontext.h"
#include "removedonecontext.h"
#include <vespa/searchcore/proton/common/feedtoken.h>
-#include <vespa/searchcore/proton/metrics/feed_metrics.h>
#include <vespa/searchcore/proton/documentmetastore/ilidreusedelayer.h>
#include <vespa/vespalib/text/stringtokenizer.h>
#include <vespa/vespalib/util/closuretask.h>
@@ -35,10 +34,8 @@ SearchableFeedView::Context::Context(const IIndexWriter::SP &indexWriter)
SearchableFeedView::Context::~Context() = default;
-SearchableFeedView::SearchableFeedView(const StoreOnlyFeedView::Context &storeOnlyCtx,
- const PersistentParams &params,
- const FastAccessFeedView::Context &fastUpdateCtx,
- Context ctx)
+SearchableFeedView::SearchableFeedView(const StoreOnlyFeedView::Context &storeOnlyCtx, const PersistentParams &params,
+ const FastAccessFeedView::Context &fastUpdateCtx, Context ctx)
: Parent(storeOnlyCtx, params, fastUpdateCtx),
_indexWriter(ctx._indexWriter),
_hasIndexedFields(_schema->getNumIndexFields() > 0)
@@ -191,11 +188,8 @@ SearchableFeedView::performIndexRemove(SerialNum serialNum, const LidVector &lid
assert(_writeService.index().isCurrentThread());
for (const auto lid : lidsToRemove) {
VLOG(getDebugLevel(lid, nullptr),
- "database(%s): performIndexRemove: serialNum(%" PRIu64 "), "
- "lid(%d)",
- _params._docTypeName.toString().c_str(),
- serialNum,
- lid);
+ "database(%s): performIndexRemove: serialNum(%" PRIu64 "), lid(%d)",
+ _params._docTypeName.toString().c_str(), serialNum, lid);
_indexWriter->remove(serialNum, lid);
}
diff --git a/searchcore/src/vespa/searchcore/proton/server/storeonlydocsubdb.cpp b/searchcore/src/vespa/searchcore/proton/server/storeonlydocsubdb.cpp
index e931a28c6a5..bba03621f8a 100644
--- a/searchcore/src/vespa/searchcore/proton/server/storeonlydocsubdb.cpp
+++ b/searchcore/src/vespa/searchcore/proton/server/storeonlydocsubdb.cpp
@@ -160,7 +160,7 @@ StoreOnlyDocSubDB::clearViews() {
size_t
StoreOnlyDocSubDB::getNumDocs() const
{
- if (_metaStoreCtx.get() != NULL) {
+ if (_metaStoreCtx) {
return _metaStoreCtx->get().getNumUsedLids();
} else {
return 0u;
@@ -378,8 +378,7 @@ StoreOnlyDocSubDB::getFeedViewPersistentParams()
{
SerialNum flushedDMSSN(_flushedDocumentMetaStoreSerialNum);
SerialNum flushedDSSN(_flushedDocumentStoreSerialNum);
- return StoreOnlyFeedView::PersistentParams(flushedDMSSN, flushedDSSN, _docTypeName,
- _metrics.feed, _subDbId, _subDbType);
+ return StoreOnlyFeedView::PersistentParams(flushedDMSSN, flushedDSSN, _docTypeName, _subDbId, _subDbType);
}
void
diff --git a/searchcore/src/vespa/searchcore/proton/server/storeonlyfeedview.cpp b/searchcore/src/vespa/searchcore/proton/server/storeonlyfeedview.cpp
index de3e1648085..8c8559115bd 100644
--- a/searchcore/src/vespa/searchcore/proton/server/storeonlyfeedview.cpp
+++ b/searchcore/src/vespa/searchcore/proton/server/storeonlyfeedview.cpp
@@ -11,10 +11,8 @@
#include <vespa/searchcore/proton/common/commit_time_tracker.h>
#include <vespa/searchcore/proton/common/feedtoken.h>
#include <vespa/searchcore/proton/documentmetastore/ilidreusedelayer.h>
-#include <vespa/searchcore/proton/metrics/feed_metrics.h>
#include <vespa/searchcore/proton/reference/i_gid_to_lid_change_handler.h>
#include <vespa/document/datatype/documenttype.h>
-#include <vespa/document/fieldvalue/document.h>
#include <vespa/vespalib/util/exceptions.h>
#include <vespa/log/log.h>
@@ -54,19 +52,18 @@ private:
IDestructorCallback::SP _moveDoneCtx;
public:
- PutDoneContextForMove(std::unique_ptr<FeedToken> token, const FeedOperation::Type opType,
- PerDocTypeFeedMetrics &metrics,
+ PutDoneContextForMove(std::unique_ptr<FeedToken> token,
IGidToLidChangeHandler &gidToLidChangeHandler,
const document::GlobalId &gid,
uint32_t lid, search::SerialNum serialNum, bool enableNotifyPut, IDestructorCallback::SP moveDoneCtx)
- : PutDoneContext(std::move(token), opType, metrics, gidToLidChangeHandler, gid, lid, serialNum, enableNotifyPut),
+ : PutDoneContext(std::move(token), gidToLidChangeHandler, gid, lid, serialNum, enableNotifyPut),
_moveDoneCtx(std::move(moveDoneCtx))
{}
- virtual ~PutDoneContextForMove() {}
+ ~PutDoneContextForMove() = default;
};
std::shared_ptr<PutDoneContext>
-createPutDoneContext(FeedToken::UP &token, FeedOperation::Type opType, PerDocTypeFeedMetrics &metrics,
+createPutDoneContext(FeedToken::UP &token,
IGidToLidChangeHandler &gidToLidChangeHandler,
const document::GlobalId &gid, uint32_t lid,
SerialNum serialNum, bool enableNotifyPut,
@@ -74,25 +71,24 @@ createPutDoneContext(FeedToken::UP &token, FeedOperation::Type opType, PerDocTyp
{
std::shared_ptr<PutDoneContext> result;
if (moveDoneCtx) {
- result = std::make_shared<PutDoneContextForMove>(std::move(token), opType, metrics, gidToLidChangeHandler, gid, lid, serialNum, enableNotifyPut, std::move(moveDoneCtx));
+ result = std::make_shared<PutDoneContextForMove>(std::move(token), gidToLidChangeHandler, gid, lid, serialNum, enableNotifyPut, std::move(moveDoneCtx));
} else {
- result = std::make_shared<PutDoneContext>(std::move(token), opType, metrics, gidToLidChangeHandler, gid, lid, serialNum, enableNotifyPut);
+ result = std::make_shared<PutDoneContext>(std::move(token), gidToLidChangeHandler, gid, lid, serialNum, enableNotifyPut);
}
return result;
}
std::shared_ptr<PutDoneContext>
-createPutDoneContext(FeedToken::UP &token, FeedOperation::Type opType, PerDocTypeFeedMetrics &metrics, IGidToLidChangeHandler &gidToLidChangeHandler,
+createPutDoneContext(FeedToken::UP &token, IGidToLidChangeHandler &gidToLidChangeHandler,
const document::GlobalId &gid, uint32_t lid, SerialNum serialNum, bool enableNotifyPut)
{
- return createPutDoneContext(token, opType, metrics, gidToLidChangeHandler, gid, lid, serialNum, enableNotifyPut, IDestructorCallback::SP());
+ return createPutDoneContext(token, gidToLidChangeHandler, gid, lid, serialNum, enableNotifyPut, IDestructorCallback::SP());
}
std::shared_ptr<UpdateDoneContext>
-createUpdateDoneContext(FeedToken::UP &token, FeedOperation::Type opType,
- PerDocTypeFeedMetrics &metrics, const DocumentUpdate::SP &upd)
+createUpdateDoneContext(FeedToken::UP &token, const DocumentUpdate::SP &upd)
{
- return std::make_shared<UpdateDoneContext>(std::move(token), opType, metrics, upd);
+ return std::make_shared<UpdateDoneContext>(std::move(token), upd);
}
void setPrev(DocumentOperation &op, const documentmetastore::IStore::Result &result,
@@ -110,32 +106,28 @@ private:
IDestructorCallback::SP _moveDoneCtx;
public:
- RemoveDoneContextForMove(std::unique_ptr<FeedToken> token, const FeedOperation::Type opType,
- PerDocTypeFeedMetrics &metrics, vespalib::Executor &executor,
+ RemoveDoneContextForMove(std::unique_ptr<FeedToken> token, vespalib::Executor &executor,
IDocumentMetaStore &documentMetaStore,
PendingNotifyRemoveDone &&pendingNotifyRemoveDone,
uint32_t lid,
IDestructorCallback::SP moveDoneCtx)
- : RemoveDoneContext(std::move(token), opType, metrics, executor, documentMetaStore, std::move(pendingNotifyRemoveDone) ,lid),
+ : RemoveDoneContext(std::move(token), executor, documentMetaStore, std::move(pendingNotifyRemoveDone) ,lid),
_moveDoneCtx(std::move(moveDoneCtx))
{}
- virtual ~RemoveDoneContextForMove() {}
+ ~RemoveDoneContextForMove() = default;
};
std::shared_ptr<RemoveDoneContext>
-createRemoveDoneContext(std::unique_ptr<FeedToken> token, const FeedOperation::Type opType,
- PerDocTypeFeedMetrics &metrics, vespalib::Executor &executor,
- IDocumentMetaStore &documentMetaStore,
- PendingNotifyRemoveDone &&pendingNotifyRemoveDone,
- uint32_t lid,
- IDestructorCallback::SP moveDoneCtx)
+createRemoveDoneContext(std::unique_ptr<FeedToken> token, vespalib::Executor &executor,
+ IDocumentMetaStore &documentMetaStore, PendingNotifyRemoveDone &&pendingNotifyRemoveDone,
+ uint32_t lid, IDestructorCallback::SP moveDoneCtx)
{
if (moveDoneCtx) {
return std::make_shared<RemoveDoneContextForMove>
- (std::move(token), opType, metrics, executor, documentMetaStore, std::move(pendingNotifyRemoveDone), lid, std::move(moveDoneCtx));
+ (std::move(token), executor, documentMetaStore, std::move(pendingNotifyRemoveDone), lid, std::move(moveDoneCtx));
} else {
return std::make_shared<RemoveDoneContext>
- (std::move(token), opType, metrics, executor, documentMetaStore, std::move(pendingNotifyRemoveDone), lid);
+ (std::move(token), executor, documentMetaStore, std::move(pendingNotifyRemoveDone), lid);
}
}
@@ -216,6 +208,8 @@ StoreOnlyFeedView::StoreOnlyFeedView(const Context &ctx, const PersistentParams
_docType = _repo->getDocumentType(_params._docTypeName.getName());
}
+StoreOnlyFeedView::~StoreOnlyFeedView() = default;
+
void
StoreOnlyFeedView::sync()
{
@@ -240,10 +234,10 @@ StoreOnlyFeedView::forceCommit(SerialNum serialNum, OnForceCommitDoneType onComm
}
void
-StoreOnlyFeedView::considerEarlyAck(FeedToken::UP &token, FeedOperation::Type opType)
+StoreOnlyFeedView::considerEarlyAck(FeedToken::UP &token)
{
if (_commitTimeTracker.hasVisibilityDelay() && token) {
- token->ack(opType, _params._metrics);
+ token->ack();
token.reset();
}
}
@@ -289,7 +283,7 @@ StoreOnlyFeedView::internalPut(FeedToken::UP token, const PutOperation &putOp)
_params._subDbId, doc->toString(true).size(), doc->toString(true).c_str());
PendingNotifyRemoveDone pendingNotifyRemoveDone = adjustMetaStore(putOp, docId);
- considerEarlyAck(token, putOp.getType());
+ considerEarlyAck(token);
bool docAlreadyExists = putOp.getValidPrevDbdId(_params._subDbId);
@@ -297,18 +291,19 @@ StoreOnlyFeedView::internalPut(FeedToken::UP token, const PutOperation &putOp)
bool immediateCommit = _commitTimeTracker.needCommit();
const document::GlobalId &gid = docId.getGlobalId();
std::shared_ptr<PutDoneContext> onWriteDone =
- createPutDoneContext(token, putOp.getType(), _params._metrics,
- _gidToLidChangeHandler, gid, putOp.getLid(), serialNum, putOp.changedDbdId() && useDocumentMetaStore(serialNum));
+ createPutDoneContext(token, _gidToLidChangeHandler, gid, putOp.getLid(), serialNum,
+ putOp.changedDbdId() && useDocumentMetaStore(serialNum));
putSummary(serialNum, putOp.getLid(), doc, onWriteDone);
putAttributes(serialNum, putOp.getLid(), *doc, immediateCommit, onWriteDone);
putIndexedFields(serialNum, putOp.getLid(), doc, immediateCommit, onWriteDone);
}
if (docAlreadyExists && putOp.changedDbdId()) {
assert(!putOp.getValidDbdId(_params._subDbId));
- internalRemove(std::move(token), serialNum, std::move(pendingNotifyRemoveDone), putOp.getPrevLid(), putOp.getType(), IDestructorCallback::SP());
+ internalRemove(std::move(token), serialNum, std::move(pendingNotifyRemoveDone),
+ putOp.getPrevLid(), IDestructorCallback::SP());
}
if (token) {
- token->ack(putOp.getType(), _params._metrics);
+ token->ack();
}
}
@@ -432,13 +427,12 @@ StoreOnlyFeedView::internalUpdate(FeedToken::UP token, const UpdateOperation &up
(void) updateOk;
_metaStore.commit(serialNum, serialNum);
}
- considerEarlyAck(token, updOp.getType());
+ considerEarlyAck(token);
bool immediateCommit = _commitTimeTracker.needCommit();
- auto onWriteDone = createUpdateDoneContext(token, updOp.getType(), _params._metrics, updOp.getUpdate());
+ auto onWriteDone = createUpdateDoneContext(token, updOp.getUpdate());
updateAttributes(serialNum, lid, upd, immediateCommit, onWriteDone);
-
UpdateScope updateScope(getUpdateScope(upd));
if (updateScope.hasIndexOrNonAttributeFields()) {
PromisedDoc promisedDoc;
@@ -555,7 +549,7 @@ StoreOnlyFeedView::internalRemove(FeedToken::UP token, const RemoveOperation &rm
rmOp.getSubDbId(), rmOp.getLid(), rmOp.getPrevSubDbId(), rmOp.getPrevLid(), _params._subDbId);
PendingNotifyRemoveDone pendingNotifyRemoveDone = adjustMetaStore(rmOp, docId);
- considerEarlyAck(token, rmOp.getType());
+ considerEarlyAck(token);
if (rmOp.getValidDbdId(_params._subDbId)) {
Document::UP clearDoc(new Document(*_docType, docId));
@@ -566,22 +560,25 @@ StoreOnlyFeedView::internalRemove(FeedToken::UP token, const RemoveOperation &rm
if (rmOp.getValidPrevDbdId(_params._subDbId)) {
if (rmOp.changedDbdId()) {
assert(!rmOp.getValidDbdId(_params._subDbId));
- internalRemove(std::move(token), serialNum, std::move(pendingNotifyRemoveDone), rmOp.getPrevLid(), rmOp.getType(), IDestructorCallback::SP());
+ internalRemove(std::move(token), serialNum, std::move(pendingNotifyRemoveDone),
+ rmOp.getPrevLid(), IDestructorCallback::SP());
}
}
if (token) {
- token->ack(rmOp.getType(), _params._metrics);
+ token->ack();
}
}
void
-StoreOnlyFeedView::internalRemove(FeedToken::UP token, SerialNum serialNum, PendingNotifyRemoveDone &&pendingNotifyRemoveDone, Lid lid,
- FeedOperation::Type opType, IDestructorCallback::SP moveDoneCtx)
+StoreOnlyFeedView::internalRemove(FeedToken::UP token, SerialNum serialNum,
+ PendingNotifyRemoveDone &&pendingNotifyRemoveDone, Lid lid,
+ IDestructorCallback::SP moveDoneCtx)
{
bool explicitReuseLid = _lidReuseDelayer.delayReuse(lid);
std::shared_ptr<RemoveDoneContext> onWriteDone;
- onWriteDone = createRemoveDoneContext(std::move(token), opType, _params._metrics, _writeService.master(),
- _metaStore, std::move(pendingNotifyRemoveDone), (explicitReuseLid ? lid : 0u), moveDoneCtx);
+ onWriteDone = createRemoveDoneContext(std::move(token), _writeService.master(), _metaStore,
+ std::move(pendingNotifyRemoveDone), (explicitReuseLid ? lid : 0u),
+ std::move(moveDoneCtx));
removeSummary(serialNum, lid, onWriteDone);
bool immediateCommit = _commitTimeTracker.needCommit();
removeAttributes(serialNum, lid, immediateCommit, onWriteDone);
@@ -732,15 +729,14 @@ StoreOnlyFeedView::handleMove(const MoveOperation &moveOp, IDestructorCallback::
const document::GlobalId &gid = docId.getGlobalId();
FeedToken::UP token;
std::shared_ptr<PutDoneContext> onWriteDone =
- createPutDoneContext(token, moveOp.getType(), _params._metrics,
- _gidToLidChangeHandler, gid, moveOp.getLid(),
- serialNum, moveOp.changedDbdId() && useDocumentMetaStore(serialNum), doneCtx);
+ createPutDoneContext(token, _gidToLidChangeHandler, gid, moveOp.getLid(), serialNum,
+ moveOp.changedDbdId() && useDocumentMetaStore(serialNum), doneCtx);
putSummary(serialNum, moveOp.getLid(), doc, onWriteDone);
putAttributes(serialNum, moveOp.getLid(), *doc, immediateCommit, onWriteDone);
putIndexedFields(serialNum, moveOp.getLid(), doc, immediateCommit, onWriteDone);
}
if (docAlreadyExists && moveOp.changedDbdId()) {
- internalRemove(FeedToken::UP(), serialNum, std::move(pendingNotifyRemoveDone), moveOp.getPrevLid(), moveOp.getType(), doneCtx);
+ internalRemove(FeedToken::UP(), serialNum, std::move(pendingNotifyRemoveDone), moveOp.getPrevLid(), doneCtx);
}
}
diff --git a/searchcore/src/vespa/searchcore/proton/server/storeonlyfeedview.h b/searchcore/src/vespa/searchcore/proton/server/storeonlyfeedview.h
index 021c2b2f8f7..baaf77bbe59 100644
--- a/searchcore/src/vespa/searchcore/proton/server/storeonlyfeedview.h
+++ b/searchcore/src/vespa/searchcore/proton/server/storeonlyfeedview.h
@@ -27,7 +27,6 @@ namespace document { class GLobalId; }
namespace proton {
class IReplayConfig;
-class PerDocTypeFeedMetrics;
class ForceCommitContext;
class OperationDoneContext;
class PutDoneContext;
@@ -104,20 +103,17 @@ public:
const SerialNum _flushedDocumentMetaStoreSerialNum;
const SerialNum _flushedDocumentStoreSerialNum;
const DocTypeName _docTypeName;
- PerDocTypeFeedMetrics &_metrics;
const uint32_t _subDbId;
const SubDbType _subDbType;
PersistentParams(SerialNum flushedDocumentMetaStoreSerialNum,
SerialNum flushedDocumentStoreSerialNum,
const DocTypeName &docTypeName,
- PerDocTypeFeedMetrics &metrics,
uint32_t subDbId,
SubDbType subDbType)
: _flushedDocumentMetaStoreSerialNum(flushedDocumentMetaStoreSerialNum),
_flushedDocumentStoreSerialNum(flushedDocumentStoreSerialNum),
_docTypeName(docTypeName),
- _metrics(metrics),
_subDbId(subDbId),
_subDbType(subDbType)
{}
@@ -183,14 +179,14 @@ private:
size_t removeDocuments(const RemoveDocumentsOperation &op, bool remove_index_and_attribute_fields,
bool immediateCommit);
- void internalRemove(FeedTokenUP token, SerialNum serialNum, PendingNotifyRemoveDone &&pendingNotifyRemoveDone, Lid lid,
- FeedOperation::Type opType, std::shared_ptr<search::IDestructorCallback> moveDoneCtx);
+ void internalRemove(FeedTokenUP token, SerialNum serialNum, PendingNotifyRemoveDone &&pendingNotifyRemoveDone,
+ Lid lid, std::shared_ptr<search::IDestructorCallback> moveDoneCtx);
// Ack token early if visibility delay is nonzero
- void considerEarlyAck(FeedTokenUP &token, FeedOperation::Type opType);
+ void considerEarlyAck(FeedTokenUP &token);
- void makeUpdatedDocument(SerialNum serialNum, Lid lid, DocumentUpdateSP upd,
- OnOperationDoneType onWriteDone,PromisedDoc promisedDoc, PromisedStream promisedStream);
+ void makeUpdatedDocument(SerialNum serialNum, Lid lid, DocumentUpdateSP upd, OnOperationDoneType onWriteDone,
+ PromisedDoc promisedDoc, PromisedStream promisedStream);
protected:
virtual void internalDeleteBucket(const DeleteBucketOperation &delOp);
@@ -225,7 +221,7 @@ protected:
public:
StoreOnlyFeedView(const Context &ctx, const PersistentParams &params);
- virtual ~StoreOnlyFeedView() {}
+ ~StoreOnlyFeedView() override;
const ISummaryAdapter::SP &getSummaryAdapter() const { return _summaryAdapter; }
const search::index::Schema::SP &getSchema() const { return _schema; }
diff --git a/searchcore/src/vespa/searchcore/proton/server/updatedonecontext.cpp b/searchcore/src/vespa/searchcore/proton/server/updatedonecontext.cpp
index 5eb7e2ed7f9..171990c32d3 100644
--- a/searchcore/src/vespa/searchcore/proton/server/updatedonecontext.cpp
+++ b/searchcore/src/vespa/searchcore/proton/server/updatedonecontext.cpp
@@ -3,23 +3,14 @@
#include "updatedonecontext.h"
#include <vespa/searchcore/proton/common/feedtoken.h>
-namespace proton
-{
-
+namespace proton {
-UpdateDoneContext::UpdateDoneContext(std::unique_ptr<FeedToken> token,
- const FeedOperation::Type opType,
- PerDocTypeFeedMetrics &metrics,
- const document::DocumentUpdate::SP &upd)
- : OperationDoneContext(std::move(token), opType, metrics),
+UpdateDoneContext::UpdateDoneContext(std::unique_ptr<FeedToken> token, const document::DocumentUpdate::SP &upd)
+ : OperationDoneContext(std::move(token)),
_upd(upd)
{
}
-
-UpdateDoneContext::~UpdateDoneContext()
-{
-}
-
+UpdateDoneContext::~UpdateDoneContext() = default;
} // namespace proton
diff --git a/searchcore/src/vespa/searchcore/proton/server/updatedonecontext.h b/searchcore/src/vespa/searchcore/proton/server/updatedonecontext.h
index df47538d6dd..4701db300de 100644
--- a/searchcore/src/vespa/searchcore/proton/server/updatedonecontext.h
+++ b/searchcore/src/vespa/searchcore/proton/server/updatedonecontext.h
@@ -5,8 +5,7 @@
#include "operationdonecontext.h"
#include <vespa/document/update/documentupdate.h>
-namespace proton
-{
+namespace proton {
/**
* Context class for document update operations that acks operation when
@@ -19,12 +18,8 @@ class UpdateDoneContext : public OperationDoneContext
{
document::DocumentUpdate::SP _upd;
public:
- UpdateDoneContext(std::unique_ptr<FeedToken> token,
- const FeedOperation::Type opType,
- PerDocTypeFeedMetrics &metrics,
- const document::DocumentUpdate::SP &upd);
-
- virtual ~UpdateDoneContext();
+ UpdateDoneContext(std::unique_ptr<FeedToken> token, const document::DocumentUpdate::SP &upd);
+ ~UpdateDoneContext() override;
const document::DocumentUpdate &getUpdate() { return *_upd; }
};
diff --git a/searchlib/src/tests/queryeval/queryeval.cpp b/searchlib/src/tests/queryeval/queryeval.cpp
index 9dc4f2eef89..c6dd6a430cc 100644
--- a/searchlib/src/tests/queryeval/queryeval.cpp
+++ b/searchlib/src/tests/queryeval/queryeval.cpp
@@ -287,6 +287,10 @@ private:
virtual void doSeek(uint32_t docid) override { (void) docid; }
};
+struct MultiSearchRemoveTest {
+ static SearchIterator::UP remove(MultiSearch &ms, size_t idx) { return ms.remove(idx); }
+};
+
TEST("testMultiSearch") {
MultiSearch::Children children;
children.push_back(new EmptySearch());
@@ -300,7 +304,7 @@ TEST("testMultiSearch") {
EXPECT_EQUAL(0u, ms._accumInsert);
EXPECT_EQUAL(0u, ms._accumRemove);
- EXPECT_EQUAL(children[1], ms.remove(1).get());
+ EXPECT_EQUAL(children[1], MultiSearchRemoveTest::remove(ms, 1).get());
EXPECT_EQUAL(2u, ms.getChildren().size());
EXPECT_EQUAL(children[0], ms.getChildren()[0]);
EXPECT_EQUAL(children[2], ms.getChildren()[1]);
diff --git a/searchlib/src/vespa/searchlib/queryeval/multisearch.h b/searchlib/src/vespa/searchlib/queryeval/multisearch.h
index fc1a9ec11cd..16bbd5d4ecc 100644
--- a/searchlib/src/vespa/searchlib/queryeval/multisearch.h
+++ b/searchlib/src/vespa/searchlib/queryeval/multisearch.h
@@ -5,14 +5,20 @@
#include "searchiterator.h"
#include <vector>
+class MultiSearchRemoveTest;
+
namespace search::queryeval {
+class MultiBitVectorIteratorBase;
+
/**
* A virtual intermediate class that serves as the basis for combining searches
* like and, or any or others that take a list of children.
**/
class MultiSearch : public SearchIterator
{
+ friend class ::MultiSearchRemoveTest;
+ friend class ::search::queryeval::MultiBitVectorIteratorBase;
public:
/**
* Defines how to represent the children iterators. vespalib::Array usage
@@ -32,13 +38,13 @@ public:
virtual bool isAndNot() const { return false; }
virtual bool isOr() const { return false; }
void insert(size_t index, SearchIterator::UP search);
- SearchIterator::UP remove(size_t index);
virtual bool needUnpack(size_t index) const { (void) index; return true; }
void initRange(uint32_t beginId, uint32_t endId) override;
protected:
void doUnpack(uint32_t docid) override;
void visitMembers(vespalib::ObjectVisitor &visitor) const override;
private:
+ SearchIterator::UP remove(size_t index); // friends only
/**
* Call back when children are removed / inserted after the Iterator has been constructed.
* This is to support code that make assumptions that iterators do not move around or disappear.
diff --git a/searchlib/src/vespa/searchlib/queryeval/orsearch.cpp b/searchlib/src/vespa/searchlib/queryeval/orsearch.cpp
index 6d59482d799..977080f8266 100644
--- a/searchlib/src/vespa/searchlib/queryeval/orsearch.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/orsearch.cpp
@@ -16,34 +16,20 @@ public:
void unpack(uint32_t docid, MultiSearch & search) {
const MultiSearch::Children & children(search.getChildren());
size_t sz(children.size());
- for (size_t i(0); i < sz; ) {
+ for (size_t i(0); i < sz; ++i) {
if (__builtin_expect(children[i]->getDocId() < docid, false)) {
children[i]->doSeek(docid);
- if (children[i]->getDocId() == search::endDocId) {
- sz = deactivate(search, i);
- continue;
- }
}
if (__builtin_expect(children[i]->getDocId() == docid, false)) {
children[i]->doUnpack(docid);
}
- i++;
}
}
void onRemove(size_t index) { (void) index; }
void onInsert(size_t index) { (void) index; }
bool needUnpack(size_t index) const { (void) index; return true; }
-private:
- static size_t deactivate(MultiSearch &children, size_t idx);
};
-size_t
-FullUnpack::deactivate(MultiSearch & search, size_t idx)
-{
- search.remove(idx);
- return search.getChildren().size();
-}
-
class SelectiveUnpack
{
public:
diff --git a/staging_vespalib/src/vespa/vespalib/util/document_runnable.cpp b/staging_vespalib/src/vespa/vespalib/util/document_runnable.cpp
index a612d5652ff..c0a32197c07 100644
--- a/staging_vespalib/src/vespa/vespalib/util/document_runnable.cpp
+++ b/staging_vespalib/src/vespa/vespalib/util/document_runnable.cpp
@@ -2,15 +2,18 @@
#include "document_runnable.h"
#include <vespa/vespalib/util/exceptions.h>
-#include <vespa/vespalib/util/stringfmt.h>
namespace document {
-Runnable::Runnable(FastOS_ThreadPool* pool)
+Runnable::Runnable()
: _stateLock(),
_state(NOT_RUNNING)
{
- if (pool) start(*pool);
+}
+
+Runnable::~Runnable() {
+ vespalib::MonitorGuard monitorGuard(_stateLock);
+ assert(_state == NOT_RUNNING);
}
bool Runnable::start(FastOS_ThreadPool& pool)
@@ -19,7 +22,7 @@ bool Runnable::start(FastOS_ThreadPool& pool)
while (_state == STOPPING) monitor.wait();
if (_state != NOT_RUNNING) return false;
_state = STARTING;
- if (pool.NewThread(this) == NULL) {
+ if (pool.NewThread(this) == nullptr) {
throw vespalib::IllegalStateException("Faled starting a new thread", VESPA_STRLOC);
}
return true;
@@ -42,7 +45,7 @@ bool Runnable::onStop()
bool Runnable::join() const
{
vespalib::MonitorGuard monitor(_stateLock);
- if (_state == STARTING || _state == RUNNING) return false;
+ assert ((_state != STARTING) && (_state != RUNNING));
while (_state != NOT_RUNNING) monitor.wait();
return true;
}
diff --git a/staging_vespalib/src/vespa/vespalib/util/document_runnable.h b/staging_vespalib/src/vespa/vespalib/util/document_runnable.h
index 456c7fefdbb..60a67189b5b 100644
--- a/staging_vespalib/src/vespa/vespalib/util/document_runnable.h
+++ b/staging_vespalib/src/vespa/vespalib/util/document_runnable.h
@@ -42,7 +42,8 @@ public:
* Create a runnable.
* @param pool If set, runnable will be started in constructor.
*/
- Runnable(FastOS_ThreadPool* pool = 0);
+ Runnable();
+ ~Runnable();
/**
* Start this runnable.
diff --git a/storage/src/tests/distributor/distributortest.cpp b/storage/src/tests/distributor/distributortest.cpp
index 12a4118aa08..d0941571a6a 100644
--- a/storage/src/tests/distributor/distributortest.cpp
+++ b/storage/src/tests/distributor/distributortest.cpp
@@ -50,6 +50,7 @@ class Distributor_Test : public CppUnit::TestFixture,
CPPUNIT_TEST(merge_busy_inhibit_duration_is_propagated_to_pending_message_tracker);
CPPUNIT_TEST(external_client_requests_are_handled_individually_in_priority_order);
CPPUNIT_TEST(internal_messages_are_started_in_fifo_order_batch);
+ CPPUNIT_TEST(closing_aborts_priority_queued_client_requests);
CPPUNIT_TEST_SUITE_END();
protected:
@@ -81,6 +82,7 @@ protected:
void merge_busy_inhibit_duration_is_propagated_to_pending_message_tracker();
void external_client_requests_are_handled_individually_in_priority_order();
void internal_messages_are_started_in_fifo_order_batch();
+ void closing_aborts_priority_queued_client_requests();
public:
void setUp() override {
@@ -927,6 +929,27 @@ void Distributor_Test::internal_messages_are_started_in_fifo_order_batch() {
CPPUNIT_ASSERT_EQUAL(api::BucketInfo(1, 1, 1), e.getBucketInfo().getNode(0)->getBucketInfo());
}
+void Distributor_Test::closing_aborts_priority_queued_client_requests() {
+ setupDistributor(Redundancy(1), NodeCount(1), "storage:1 distributor:1");
+ document::BucketId bucket(16, 1);
+ addNodesToBucketDB(bucket, "0=1/1/1/t");
+
+ document::DocumentId id("id:foo:testdoctype1:n=1:foo");
+ vespalib::stringref field_set = "";
+ for (int i = 0; i < 10; ++i) {
+ auto cmd = std::make_shared<api::GetCommand>(document::BucketId(), id, field_set);
+ _distributor->onDown(cmd);
+ }
+ tickDistributorNTimes(1);
+ // Closing should trigger 1 abort via startet GetOperation and 9 aborts from pri queue
+ _distributor->close();
+ CPPUNIT_ASSERT_EQUAL(size_t(10), _sender.replies.size());
+ for (auto& msg : _sender.replies) {
+ CPPUNIT_ASSERT_EQUAL(api::ReturnCode::ABORTED,
+ dynamic_cast<api::StorageReply&>(*msg).getResult().getResult());
+ }
+}
+
}
}
diff --git a/storage/src/tests/persistence/persistencetestutils.cpp b/storage/src/tests/persistence/persistencetestutils.cpp
index 0fd5a30d8bd..6be021a549c 100644
--- a/storage/src/tests/persistence/persistencetestutils.cpp
+++ b/storage/src/tests/persistence/persistencetestutils.cpp
@@ -98,8 +98,7 @@ PersistenceTestUtils::createPersistenceThread(uint32_t disk)
getEnv()._fileStorHandler,
getEnv()._metrics,
disk,
- 255,
- false));
+ 255));
}
document::Document::SP
diff --git a/storage/src/vespa/storage/distributor/bucketdbupdater.cpp b/storage/src/vespa/storage/distributor/bucketdbupdater.cpp
index 67942d3d447..ce7f7afc670 100644
--- a/storage/src/vespa/storage/distributor/bucketdbupdater.cpp
+++ b/storage/src/vespa/storage/distributor/bucketdbupdater.cpp
@@ -26,27 +26,23 @@ BucketDBUpdater::BucketDBUpdater(Distributor& owner, ManagedBucketSpace& bucketS
{
}
-BucketDBUpdater::~BucketDBUpdater() {}
+BucketDBUpdater::~BucketDBUpdater() = default;
void
BucketDBUpdater::flush()
{
- for (std::map<uint64_t, BucketRequest>::iterator
- i(_sentMessages.begin()), end(_sentMessages.end());
- i != end; ++i)
- {
+ for (auto & entry : _sentMessages) {
// Cannot sendDown MergeBucketReplies during flushing, since
// all lower links have been closed
- if (i->second._mergeReplyGuard.get()) {
- i->second._mergeReplyGuard->resetReply();
+ if (entry.second._mergeReplyGuard) {
+ entry.second._mergeReplyGuard->resetReply();
}
}
_sentMessages.clear();
}
void
-BucketDBUpdater::print(std::ostream& out, bool verbose,
- const std::string& indent) const
+BucketDBUpdater::print(std::ostream& out, bool verbose, const std::string& indent) const
{
(void) verbose; (void) indent;
out << "BucketDBUpdater";
@@ -55,17 +51,15 @@ BucketDBUpdater::print(std::ostream& out, bool verbose,
bool
BucketDBUpdater::hasPendingClusterState() const
{
- return _pendingClusterState.get() != nullptr;
+ return static_cast<bool>(_pendingClusterState);
}
BucketOwnership
BucketDBUpdater::checkOwnershipInPendingState(const document::BucketId& b) const
{
if (hasPendingClusterState()) {
- const lib::ClusterState& state(
- _pendingClusterState->getNewClusterState());
- const lib::Distribution& distribution(
- _pendingClusterState->getDistribution());
+ const lib::ClusterState& state(_pendingClusterState->getNewClusterState());
+ const lib::Distribution& distribution(_pendingClusterState->getDistribution());
if (!_bucketSpaceComponent.ownsBucketInState(distribution, state, b)) {
return BucketOwnership::createNotOwnedInState(state);
}
@@ -74,22 +68,6 @@ BucketDBUpdater::checkOwnershipInPendingState(const document::BucketId& b) const
}
void
-BucketDBUpdater::clearPending(uint16_t node)
-{
- for (std::map<uint64_t, BucketRequest>::iterator iter(
- _sentMessages.begin()); iter != _sentMessages.end();)
- {
- if (iter->second.targetNode == node) {
- std::map<uint64_t, BucketRequest>::iterator del = iter;
- iter++;
- _sentMessages.erase(del);
- } else {
- iter++;
- }
- }
-}
-
-void
BucketDBUpdater::sendRequestBucketInfo(
uint16_t node,
const document::BucketId& bucket,
@@ -145,9 +123,8 @@ BucketDBUpdater::removeSuperfluousBuckets(
_bucketSpaceComponent.getBucketDatabase().forEach(proc);
- for (uint32_t i = 0; i < proc.getBucketsToRemove().size(); ++i) {
- _bucketSpaceComponent.getBucketDatabase()
- .remove(proc.getBucketsToRemove()[i]);
+ for (const auto & entry :proc.getBucketsToRemove()) {
+ _bucketSpaceComponent.getBucketDatabase().remove(entry);
}
}
@@ -247,9 +224,8 @@ BucketDBUpdater::onSetSystemState(
BucketDBUpdater::MergeReplyGuard::~MergeReplyGuard()
{
- if (_reply.get()) {
- _updater.getDistributorComponent().getDistributor()
- .handleCompletedMerge(_reply);
+ if (_reply) {
+ _updater.getDistributorComponent().getDistributor().handleCompletedMerge(_reply);
}
}
@@ -293,13 +269,8 @@ BucketDBUpdater::sendAllQueuedBucketRechecks()
"via NotifyBucketChange commands",
_enqueuedRechecks.size());
- typedef std::set<EnqueuedBucketRecheck>::const_iterator const_iterator;
- for (const_iterator it(_enqueuedRechecks.begin()),
- e(_enqueuedRechecks.end()); it != e; ++it)
- {
- sendRequestBucketInfo(it->node,
- it->bucket,
- std::shared_ptr<MergeReplyGuard>());
+ for (const auto & entry :_enqueuedRechecks) {
+ sendRequestBucketInfo(entry.node, entry.bucket, std::shared_ptr<MergeReplyGuard>());
}
_enqueuedRechecks.clear();
}
@@ -382,14 +353,14 @@ BucketDBUpdater::handleSingleBucketInfoFailure(
if (req.bucket != document::BucketId(0)) {
framework::MilliSecTime sendTime(_bucketSpaceComponent.getClock());
sendTime += framework::MilliSecTime(100);
- _delayedRequests.push_back(std::make_pair(sendTime, req));
+ _delayedRequests.emplace_back(sendTime, req);
}
}
void
BucketDBUpdater::resendDelayedMessages()
{
- if (_pendingClusterState.get()) {
+ if (_pendingClusterState) {
_pendingClusterState->resendDelayedMessages();
}
if (_delayedRequests.empty()) return; // Don't fetch time if not needed
@@ -398,9 +369,7 @@ BucketDBUpdater::resendDelayedMessages()
&& currentTime >= _delayedRequests.front().first)
{
BucketRequest& req(_delayedRequests.front().second);
- sendRequestBucketInfo(req.targetNode,
- req.bucket,
- std::shared_ptr<MergeReplyGuard>());
+ sendRequestBucketInfo(req.targetNode, req.bucket, std::shared_ptr<MergeReplyGuard>());
_delayedRequests.pop_front();
}
}
@@ -408,19 +377,13 @@ BucketDBUpdater::resendDelayedMessages()
void
BucketDBUpdater::convertBucketInfoToBucketList(
const std::shared_ptr<api::RequestBucketInfoReply>& repl,
- uint16_t targetNode,
- BucketListMerger::BucketList& newList)
+ uint16_t targetNode, BucketListMerger::BucketList& newList)
{
- for (uint32_t i = 0; i < repl->getBucketInfo().size(); i++) {
- LOG(debug,
- "Received bucket information from node %u for bucket %s: %s",
- targetNode,
- repl->getBucketInfo()[i]._bucketId.toString().c_str(),
- repl->getBucketInfo()[i]._info.toString().c_str());
+ for (const auto & entry : repl->getBucketInfo()) {
+ LOG(debug, "Received bucket information from node %u for bucket %s: %s", targetNode,
+ entry._bucketId.toString().c_str(), entry._info.toString().c_str());
- newList.push_back(BucketListMerger::BucketEntry(
- repl->getBucketInfo()[i]._bucketId,
- repl->getBucketInfo()[i]._info));
+ newList.emplace_back(entry._bucketId, entry._info);
}
}
@@ -446,8 +409,7 @@ bool
BucketDBUpdater::processSingleBucketInfoReply(
const std::shared_ptr<api::RequestBucketInfoReply> & repl)
{
- std::map<uint64_t, BucketRequest>::iterator iter =
- _sentMessages.find(repl->getMsgId());
+ auto iter = _sentMessages.find(repl->getMsgId());
// Has probably been deleted for some reason earlier.
if (iter == _sentMessages.end()) {
@@ -477,36 +439,30 @@ BucketDBUpdater::addBucketInfoForNode(
{
const BucketCopy* copy(e->getNode(node));
if (copy) {
- existing.push_back(BucketListMerger::BucketEntry(
- e.getBucketId(), copy->getBucketInfo()));
+ existing.emplace_back(e.getBucketId(), copy->getBucketInfo());
}
}
void
-BucketDBUpdater::findRelatedBucketsInDatabase(
- uint16_t node,
- const document::BucketId& bucketId,
- BucketListMerger::BucketList& existing)
+BucketDBUpdater::findRelatedBucketsInDatabase(uint16_t node, const document::BucketId& bucketId,
+ BucketListMerger::BucketList& existing)
{
std::vector<BucketDatabase::Entry> entries;
_bucketSpaceComponent.getBucketDatabase().getAll(bucketId, entries);
- for (uint32_t j = 0; j < entries.size(); ++j) {
- addBucketInfoForNode(entries[j], node, existing);
+ for (const BucketDatabase::Entry & entry : entries) {
+ addBucketInfoForNode(entry, node, existing);
}
}
void
BucketDBUpdater::updateDatabase(uint16_t node, BucketListMerger& merger)
{
- for (uint32_t i = 0; i < merger.getRemovedEntries().size(); i++) {
- _bucketSpaceComponent.removeNodeFromDB(merger.getRemovedEntries()[i], node);
+ for (const document::BucketId & bucket : merger.getRemovedEntries()) {
+ _bucketSpaceComponent.removeNodeFromDB(bucket, node);
}
- for (uint32_t i = 0; i < merger.getAddedEntries().size(); i++) {
- const BucketListMerger::BucketEntry& entry(
- merger.getAddedEntries()[i]);
-
+ for (const BucketListMerger::BucketEntry& entry : merger.getAddedEntries()) {
_bucketSpaceComponent.updateBucketDatabase(
entry.first,
BucketCopy(merger.getTimestamp(), node, entry.second),
@@ -603,12 +559,11 @@ BucketDBUpdater::reportXmlStatus(vespalib::xml::XmlOutputStream& xos,
<< XmlTag("systemstate_active")
<< XmlContent(_bucketSpaceComponent.getClusterState().toString())
<< XmlEndTag();
- if (_pendingClusterState.get() != 0) {
+ if (_pendingClusterState) {
xos << *_pendingClusterState;
}
xos << XmlTag("systemstate_history");
- typedef std::list<PendingClusterState::Summary>::const_reverse_iterator HistoryIter;
- for (HistoryIter i(_history.rbegin()), e(_history.rend()); i != e; ++i) {
+ for (auto i(_history.rbegin()), e(_history.rend()); i != e; ++i) {
xos << XmlTag("change")
<< XmlAttribute("from", i->_prevClusterState)
<< XmlAttribute("to", i->_newClusterState)
@@ -617,18 +572,16 @@ BucketDBUpdater::reportXmlStatus(vespalib::xml::XmlOutputStream& xos,
}
xos << XmlEndTag()
<< XmlTag("single_bucket_requests");
- for (std::map<uint64_t, BucketRequest>::const_iterator iter
- = _sentMessages.begin(); iter != _sentMessages.end(); iter++)
+ for (const auto & entry : _sentMessages)
{
xos << XmlTag("storagenode")
- << XmlAttribute("index", iter->second.targetNode);
- if (iter->second.bucket.getRawId() == 0) {
+ << XmlAttribute("index", entry.second.targetNode);
+ if (entry.second.bucket.getRawId() == 0) {
xos << XmlAttribute("bucket", ALL);
} else {
- xos << XmlAttribute("bucket", iter->second.bucket.getId(),
- XmlAttribute::HEX);
+ xos << XmlAttribute("bucket", entry.second.bucket.getId(), XmlAttribute::HEX);
}
- xos << XmlAttribute("sendtimestamp", iter->second.timestamp)
+ xos << XmlAttribute("sendtimestamp", entry.second.timestamp)
<< XmlEndTag();
}
xos << XmlEndTag() << XmlEndTag();
@@ -642,17 +595,13 @@ BucketDBUpdater::BucketListGenerator::process(BucketDatabase::Entry& e)
const BucketCopy* copy(e->getNode(_node));
if (copy) {
- _entries.push_back(
- BucketListMerger::BucketEntry(
- bucketId,
- copy->getBucketInfo()));
+ _entries.emplace_back(bucketId, copy->getBucketInfo());
}
return true;
}
void
-BucketDBUpdater::NodeRemover::logRemove(const document::BucketId& bucketId,
- const char* msg) const
+BucketDBUpdater::NodeRemover::logRemove(const document::BucketId& bucketId, const char* msg) const
{
LOG(spam, "Removing bucket %s: %s", bucketId.toString().c_str(), msg);
LOG_BUCKET_OPERATION_NO_LOCK(bucketId, msg);
@@ -748,7 +697,7 @@ BucketDBUpdater::NodeRemover::process(BucketDatabase::Entry& e)
BucketDBUpdater::NodeRemover::~NodeRemover()
{
- if (_removedBuckets.size() > 0) {
+ if ( !_removedBuckets.empty()) {
std::ostringstream ost;
ost << "After system state change "
<< _oldState.getTextualDifference(_state) << ", we removed "
@@ -760,7 +709,7 @@ BucketDBUpdater::NodeRemover::~NodeRemover()
if (_removedBuckets.size() >= 10) {
ost << " ...";
}
- LOGBM(info, ost.str().c_str());
+ LOGBM(info, "%s", ost.str().c_str());
}
}
diff --git a/storage/src/vespa/storage/distributor/bucketdbupdater.h b/storage/src/vespa/storage/distributor/bucketdbupdater.h
index 6081f782cd5..d3b2bbf86ca 100644
--- a/storage/src/vespa/storage/distributor/bucketdbupdater.h
+++ b/storage/src/vespa/storage/distributor/bucketdbupdater.h
@@ -36,16 +36,11 @@ public:
~BucketDBUpdater();
void flush();
-
BucketOwnership checkOwnershipInPendingState(const document::BucketId&) const;
-
void recheckBucketInfo(uint32_t nodeIdx, const document::BucketId& bid);
bool onSetSystemState(const std::shared_ptr<api::SetSystemStateCommand>& cmd) override;
-
- bool onRequestBucketInfoReply(
- const std::shared_ptr<api::RequestBucketInfoReply> & repl) override;
-
+ bool onRequestBucketInfoReply(const std::shared_ptr<api::RequestBucketInfoReply> & repl) override;
bool onMergeBucketReply(const std::shared_ptr<api::MergeBucketReply>& reply) override;
bool onNotifyBucketChange(const std::shared_ptr<api::NotifyBucketChangeCommand>&) override;
void resendDelayedMessages();
@@ -72,8 +67,7 @@ private:
ManagedBucketSpaceComponent _bucketSpaceComponent;
class MergeReplyGuard {
public:
- MergeReplyGuard(BucketDBUpdater& updater,
- const std::shared_ptr<api::MergeBucketReply>& reply)
+ MergeReplyGuard(BucketDBUpdater& updater, const std::shared_ptr<api::MergeBucketReply>& reply)
: _updater(updater), _reply(reply) {}
~MergeReplyGuard();
@@ -90,9 +84,7 @@ private:
BucketRequest()
: targetNode(0), bucket(0), timestamp(0) {};
- BucketRequest(uint16_t t,
- uint64_t currentTime,
- const document::BucketId& b,
+ BucketRequest(uint16_t t, uint64_t currentTime, const document::BucketId& b,
const std::shared_ptr<MergeReplyGuard>& guard)
: targetNode(t),
bucket(b),
@@ -112,8 +104,7 @@ private:
EnqueuedBucketRecheck() : node(0), bucket() {}
- EnqueuedBucketRecheck(uint16_t _node,
- const document::BucketId& _bucket)
+ EnqueuedBucketRecheck(uint16_t _node, const document::BucketId& _bucket)
: node(_node),
bucket(_bucket)
{}
@@ -130,35 +121,21 @@ private:
};
bool hasPendingClusterState() const;
-
- void clearPending(uint16_t node);
-
- bool pendingClusterStateAccepted(
- const std::shared_ptr<api::RequestBucketInfoReply>& repl);
- bool bucketOwnedAccordingToPendingState(
- const document::BucketId& bucketId) const;
- bool processSingleBucketInfoReply(
- const std::shared_ptr<api::RequestBucketInfoReply>& repl);
- void handleSingleBucketInfoFailure(
- const std::shared_ptr<api::RequestBucketInfoReply>& repl,
- const BucketRequest& req);
+ bool pendingClusterStateAccepted(const std::shared_ptr<api::RequestBucketInfoReply>& repl);
+ bool bucketOwnedAccordingToPendingState(const document::BucketId& bucketId) const;
+ bool processSingleBucketInfoReply(const std::shared_ptr<api::RequestBucketInfoReply>& repl);
+ void handleSingleBucketInfoFailure(const std::shared_ptr<api::RequestBucketInfoReply>& repl,
+ const BucketRequest& req);
bool isPendingClusterStateCompleted() const;
void processCompletedPendingClusterState();
- void mergeBucketInfoWithDatabase(
- const std::shared_ptr<api::RequestBucketInfoReply>& repl,
- const BucketRequest& req);
- void convertBucketInfoToBucketList(
- const std::shared_ptr<api::RequestBucketInfoReply>& repl,
- uint16_t targetNode,
- BucketListMerger::BucketList& newList);
- void sendRequestBucketInfo(
- uint16_t node,
- const document::BucketId& bucket,
- const std::shared_ptr<MergeReplyGuard>& mergeReply);
- void addBucketInfoForNode(
- const BucketDatabase::Entry& e,
- uint16_t node,
- BucketListMerger::BucketList& existing) const;
+ void mergeBucketInfoWithDatabase(const std::shared_ptr<api::RequestBucketInfoReply>& repl,
+ const BucketRequest& req);
+ void convertBucketInfoToBucketList(const std::shared_ptr<api::RequestBucketInfoReply>& repl,
+ uint16_t targetNode, BucketListMerger::BucketList& newList);
+ void sendRequestBucketInfo(uint16_t node, const document::BucketId& bucket,
+ const std::shared_ptr<MergeReplyGuard>& mergeReply);
+ void addBucketInfoForNode(const BucketDatabase::Entry& e, uint16_t node,
+ BucketListMerger::BucketList& existing) const;
void ensureTransitionTimerStarted();
void completeTransitionTimer();
/**
@@ -167,10 +144,8 @@ private:
* in bucketId, or that bucketId is contained in, that have copies
* on the given node.
*/
- void findRelatedBucketsInDatabase(
- uint16_t node,
- const document::BucketId& bucketId,
- BucketListMerger::BucketList& existing);
+ void findRelatedBucketsInDatabase(uint16_t node, const document::BucketId& bucketId,
+ BucketListMerger::BucketList& existing);
/**
Updates the bucket database from the information generated by the given
@@ -178,18 +153,15 @@ private:
*/
void updateDatabase(uint16_t node, BucketListMerger& merger);
- void updateState(const lib::ClusterState& oldState,
- const lib::ClusterState& newState);
+ void updateState(const lib::ClusterState& oldState, const lib::ClusterState& newState);
- void removeSuperfluousBuckets(const lib::Distribution& newDistribution,
- const lib::ClusterState& newState);
+ void removeSuperfluousBuckets(const lib::Distribution& newDistribution, const lib::ClusterState& newState);
void replyToPreviousPendingClusterStateIfAny();
void enableCurrentClusterStateInDistributor();
void addCurrentStateToClusterStateHistory();
- void enqueueRecheckUntilPendingStateEnabled(uint16_t node,
- const document::BucketId&);
+ void enqueueRecheckUntilPendingStateEnabled(uint16_t node, const document::BucketId&);
void sendAllQueuedBucketRechecks();
friend class BucketDBUpdater_Test;
@@ -198,8 +170,7 @@ private:
class BucketListGenerator
{
public:
- BucketListGenerator(uint16_t node,
- BucketListMerger::BucketList& entries)
+ BucketListGenerator(uint16_t node, BucketListMerger::BucketList& entries)
: _node(node), _entries(entries) {};
bool process(BucketDatabase::Entry&);
@@ -237,8 +208,7 @@ private:
return _removedBuckets;
}
private:
- void setCopiesInEntry(BucketDatabase::Entry& e,
- const std::vector<BucketCopy>& copies) const;
+ void setCopiesInEntry(BucketDatabase::Entry& e, const std::vector<BucketCopy>& copies) const;
void removeEmptyBucket(const document::BucketId& bucketId);
const lib::ClusterState _oldState;
diff --git a/storage/src/vespa/storage/distributor/distributor.cpp b/storage/src/vespa/storage/distributor/distributor.cpp
index 53df19fd10c..3dfe5103654 100644
--- a/storage/src/vespa/storage/distributor/distributor.cpp
+++ b/storage/src/vespa/storage/distributor/distributor.cpp
@@ -203,23 +203,26 @@ Distributor::onOpen()
}
}
-void
-Distributor::onClose()
-{
- for (uint32_t i=0; i<_messageQueue.size(); ++i) {
- std::shared_ptr<api::StorageMessage> msg = _messageQueue[i];
+void Distributor::send_shutdown_abort_reply(const std::shared_ptr<api::StorageMessage>& msg) {
+ api::StorageReply::UP reply(
+ std::dynamic_pointer_cast<api::StorageCommand>(msg)->makeReply());
+ reply->setResult(api::ReturnCode(api::ReturnCode::ABORTED, "Distributor is shutting down"));
+ sendUp(std::shared_ptr<api::StorageMessage>(reply.release()));
+}
+
+void Distributor::onClose() {
+ for (auto& msg : _messageQueue) {
if (!msg->getType().isReply()) {
- api::StorageReply::UP reply(
- std::dynamic_pointer_cast<api::StorageCommand>(msg)
- ->makeReply());
- reply->setResult(api::ReturnCode(api::ReturnCode::ABORTED,
- "Distributor is shutting down"));
- sendUp(std::shared_ptr<api::StorageMessage>(reply.release()));
+ send_shutdown_abort_reply(msg);
}
}
_messageQueue.clear();
+ while (!_client_request_priority_queue.empty()) {
+ send_shutdown_abort_reply(_client_request_priority_queue.top());
+ _client_request_priority_queue.pop();
+ }
- LOG(debug, "Distributor::onFlush invoked");
+ LOG(debug, "Distributor::onClose invoked");
_bucketDBUpdater.flush();
_operationOwner.onClose();
_maintenanceOperationOwner.onClose();
@@ -619,10 +622,10 @@ void Distributor::startExternalOperations() {
const bool start_single_client_request = !_client_request_priority_queue.empty();
if (start_single_client_request) {
- auto& msg = _client_request_priority_queue.top();
+ const auto& msg = _client_request_priority_queue.top();
MBUS_TRACE(msg->getTrace(), 9, "Distributor: Grabbed from "
"client request priority queue to be processed.");
- handle_or_propagate_message(msg); // TODO move() once we've move-enabled our message chains
+ handle_or_propagate_message(msg);
_client_request_priority_queue.pop();
}
diff --git a/storage/src/vespa/storage/distributor/distributor.h b/storage/src/vespa/storage/distributor/distributor.h
index 438001acc40..5856aca71a1 100644
--- a/storage/src/vespa/storage/distributor/distributor.h
+++ b/storage/src/vespa/storage/distributor/distributor.h
@@ -187,11 +187,11 @@ private:
};
void setNodeStateUp();
-
bool handleMessage(const std::shared_ptr<api::StorageMessage>& msg);
bool isMaintenanceReply(const api::StorageReply& reply) const;
void handleStatusRequests();
+ void send_shutdown_abort_reply(const std::shared_ptr<api::StorageMessage>&);
void handle_or_propagate_message(const std::shared_ptr<api::StorageMessage>& msg);
void startExternalOperations();
diff --git a/storage/src/vespa/storage/persistence/filestorage/filestormanager.cpp b/storage/src/vespa/storage/persistence/filestorage/filestormanager.cpp
index b46217f6443..ac3d901fd65 100644
--- a/storage/src/vespa/storage/persistence/filestorage/filestormanager.cpp
+++ b/storage/src/vespa/storage/persistence/filestorage/filestormanager.cpp
@@ -89,8 +89,7 @@ FileStorManager::~FileStorManager()
}
void
-FileStorManager::print(std::ostream& out, bool verbose,
- const std::string& indent) const
+FileStorManager::print(std::ostream& out, bool verbose, const std::string& indent) const
{
(void) verbose; (void) indent;
out << "FileStorManager";
@@ -128,20 +127,14 @@ FileStorManager::configure(std::unique_ptr<vespa::config::content::StorFilestorC
LOG(spam, "Setting up disk %u", i);
for (uint32_t j = 0; j < 4; j++) {
_disks[i].push_back(DiskThread::SP(
- new PersistenceThread(
- _compReg, _configUri, *_provider,
- *_filestorHandler,
- *_metrics->disks[i]->threads[j],
- i, 255, false)));
+ new PersistenceThread(_compReg, _configUri, *_provider, *_filestorHandler,
+ *_metrics->disks[i]->threads[j], i, 255)));
}
for (uint32_t j = 4; j < 6; j++) {
_disks[i].push_back(DiskThread::SP(
- new PersistenceThread(
- _compReg, _configUri, *_provider,
- *_filestorHandler,
- *_metrics->disks[i]->threads[j],
- i, 100)));
+ new PersistenceThread(_compReg, _configUri, *_provider, *_filestorHandler,
+ *_metrics->disks[i]->threads[j], i, 100)));
}
}
@@ -149,12 +142,8 @@ FileStorManager::configure(std::unique_ptr<vespa::config::content::StorFilestorC
LOG(spam, "Setting up disk %u, thread %u with priority %d",
i, j, _config->threads[j].lowestpri);
_disks[i].push_back(DiskThread::SP(
- new PersistenceThread(
- _compReg, _configUri, *_provider,
- *_filestorHandler,
- *_metrics->disks[i]->threads[j],
- i, _config->threads[j].lowestpri,
- false)));
+ new PersistenceThread(_compReg, _configUri, *_provider, *_filestorHandler,
+ *_metrics->disks[i]->threads[j], i, _config->threads[j].lowestpri)));
}
} else {
@@ -389,11 +378,9 @@ FileStorManager::onRevert(const shared_ptr<api::RevertCommand>& cmd)
}
bool
-FileStorManager::onMultiOperation(
- const std::shared_ptr<api::MultiOperationCommand>& cmd)
+FileStorManager::onMultiOperation(const std::shared_ptr<api::MultiOperationCommand>& cmd)
{
- StorBucketDatabase::WrappedEntry entry(mapOperationToBucketAndDisk(
- *cmd, 0));
+ StorBucketDatabase::WrappedEntry entry(mapOperationToBucketAndDisk(*cmd, 0));
if (entry.exist()) {
handlePersistenceMessage(cmd, entry->disk);
}
@@ -401,11 +388,9 @@ FileStorManager::onMultiOperation(
}
bool
-FileStorManager::onBatchPutRemove(
- const std::shared_ptr<api::BatchPutRemoveCommand>& cmd)
+FileStorManager::onBatchPutRemove(const std::shared_ptr<api::BatchPutRemoveCommand>& cmd)
{
- StorBucketDatabase::WrappedEntry entry(mapOperationToBucketAndDisk(
- *cmd, 0));
+ StorBucketDatabase::WrappedEntry entry(mapOperationToBucketAndDisk(*cmd, 0));
if (entry.exist()) {
handlePersistenceMessage(cmd, entry->disk);
}
@@ -413,11 +398,9 @@ FileStorManager::onBatchPutRemove(
}
bool
-FileStorManager::onRemoveLocation(
- const std::shared_ptr<api::RemoveLocationCommand>& cmd)
+FileStorManager::onRemoveLocation(const std::shared_ptr<api::RemoveLocationCommand>& cmd)
{
- StorBucketDatabase::WrappedEntry entry(mapOperationToDisk(
- *cmd, cmd->getBucketId()));
+ StorBucketDatabase::WrappedEntry entry(mapOperationToDisk(*cmd, cmd->getBucketId()));
if (entry.exist()) {
handlePersistenceMessage(cmd, entry->disk);
}
@@ -425,11 +408,9 @@ FileStorManager::onRemoveLocation(
}
bool
-FileStorManager::onStatBucket(
- const std::shared_ptr<api::StatBucketCommand>& cmd)
+FileStorManager::onStatBucket(const std::shared_ptr<api::StatBucketCommand>& cmd)
{
- StorBucketDatabase::WrappedEntry entry(mapOperationToDisk(
- *cmd, cmd->getBucketId()));
+ StorBucketDatabase::WrappedEntry entry(mapOperationToDisk(*cmd, cmd->getBucketId()));
if (entry.exist()) {
handlePersistenceMessage(cmd, entry->disk);
}
@@ -478,8 +459,7 @@ FileStorManager::onCreateBucket(
}
}
}
- std::shared_ptr<api::CreateBucketReply> reply(
- (api::CreateBucketReply*)cmd->makeReply().release());
+ std::shared_ptr<api::CreateBucketReply> reply((api::CreateBucketReply*)cmd->makeReply().release());
reply->setBucketInfo(api::BucketInfo(0, 0, 0, 0, 0, true, cmd->getActive()));
reply->setResult(code);
sendUp(reply);
@@ -491,12 +471,10 @@ FileStorManager::onDeleteBucket(const shared_ptr<api::DeleteBucketCommand>& cmd)
{
uint16_t disk;
{
- StorBucketDatabase::WrappedEntry entry(
- _component.getBucketDatabase().get(
- cmd->getBucketId(), "FileStorManager::onDeleteBucket"));
+ StorBucketDatabase::WrappedEntry entry(_component.getBucketDatabase().get(cmd->getBucketId(),
+ "FileStorManager::onDeleteBucket"));
if (!entry.exist()) {
- LOG(debug, "%s was already deleted",
- cmd->getBucketId().toString().c_str());
+ LOG(debug, "%s was already deleted", cmd->getBucketId().toString().c_str());
std::shared_ptr<api::StorageReply> reply(cmd->makeReply().release());
sendUp(reply);
return true;
@@ -520,10 +498,8 @@ FileStorManager::onDeleteBucket(const shared_ptr<api::DeleteBucketCommand>& cmd)
LOG(debug, "Rejecting bucket delete: %s", ost.str().c_str());
std::shared_ptr<api::StorageReply> reply(cmd->makeReply().release());
- static_cast<api::DeleteBucketReply&>(*reply).setBucketInfo(
- entry->getBucketInfo());
- reply->setResult(api::ReturnCode(api::ReturnCode::REJECTED,
- ost.str()));
+ static_cast<api::DeleteBucketReply&>(*reply).setBucketInfo(entry->getBucketInfo());
+ reply->setResult(api::ReturnCode(api::ReturnCode::REJECTED, ost.str()));
entry.unlock();
sendUp(reply);
return true;
@@ -538,13 +514,10 @@ FileStorManager::onDeleteBucket(const shared_ptr<api::DeleteBucketCommand>& cmd)
disk = entry->disk;
entry.remove();
}
- _filestorHandler->failOperations(
- cmd->getBucketId(),
- disk,
- api::ReturnCode(api::ReturnCode::BUCKET_DELETED,
- vespalib::make_string(
- "Bucket %s about to be deleted anyway",
- cmd->getBucketId().toString().c_str())));
+ _filestorHandler->failOperations(cmd->getBucketId(), disk,
+ api::ReturnCode(api::ReturnCode::BUCKET_DELETED,
+ vespalib::make_string("Bucket %s about to be deleted anyway",
+ cmd->getBucketId().toString().c_str())));
return true;
}
@@ -564,10 +537,7 @@ FileStorManager::ensureConsistentBucket(
// Don't create empty bucket if merge isn't allowed to continue.
entry.remove();
}
- replyDroppedOperation(msg,
- bucket,
- api::ReturnCode::ABORTED,
- "bucket is inconsistently split");
+ replyDroppedOperation(msg, bucket, api::ReturnCode::ABORTED, "bucket is inconsistently split");
return StorBucketDatabase::WrappedEntry();
}
@@ -577,10 +547,8 @@ FileStorManager::ensureConsistentBucket(
bool
FileStorManager::onMergeBucket(const shared_ptr<api::MergeBucketCommand>& cmd)
{
- StorBucketDatabase::WrappedEntry entry(
- ensureConsistentBucket(cmd->getBucketId(),
- *cmd,
- "FileStorManager::onMergeBucket"));
+ StorBucketDatabase::WrappedEntry entry(ensureConsistentBucket(cmd->getBucketId(), *cmd,
+ "FileStorManager::onMergeBucket"));
if (!entry.exist()) {
return true;
}
@@ -589,26 +557,20 @@ FileStorManager::onMergeBucket(const shared_ptr<api::MergeBucketCommand>& cmd)
entry->disk = _component.getIdealPartition(cmd->getBucketId());
if (_partitions[entry->disk].isUp()) {
entry->info = api::BucketInfo(0, 0, 0, 0, 0, true, false);
- LOG(debug, "Created bucket %s on disk %d (node index is %d) due "
- "to merge being received.",
- cmd->getBucketId().toString().c_str(),
- entry->disk, _component.getIndex());
+ LOG(debug, "Created bucket %s on disk %d (node index is %d) due to merge being received.",
+ cmd->getBucketId().toString().c_str(), entry->disk, _component.getIndex());
// Call before writing bucket entry as we need to have bucket
// lock while calling
handlePersistenceMessage(cmd, entry->disk);
entry.write();
} else {
entry.remove();
- api::ReturnCode code(
- api::ReturnCode::IO_FAILURE,
+ api::ReturnCode code(api::ReturnCode::IO_FAILURE,
vespalib::make_string(
"Trying to perform merge %s whose bucket belongs on target disk %d, which is down. Cluster state version of command is %d, our system state version is %d",
- cmd->toString().c_str(),
- entry->disk,
- cmd->getClusterStateVersion(),
+ cmd->toString().c_str(), entry->disk, cmd->getClusterStateVersion(),
_component.getStateUpdater().getSystemState()->getVersion()));
- LOGBT(debug, cmd->getBucketId().toString(),
- "%s", code.getMessage().c_str());
+ LOGBT(debug, cmd->getBucketId().toString(), "%s", code.getMessage().c_str());
api::MergeBucketReply::SP reply(new api::MergeBucketReply(*cmd));
reply->setResult(code);
sendUp(reply);
@@ -668,17 +630,13 @@ FileStorManager::onGetBucketDiff(
}
bool
-FileStorManager::validateApplyDiffCommandBucket(
- api::StorageMessage& msg,
- const StorBucketDatabase::WrappedEntry& entry)
+FileStorManager::validateApplyDiffCommandBucket(api::StorageMessage& msg, const StorBucketDatabase::WrappedEntry& entry)
{
if (!entry.exist()) {
return false;
}
if (!_component.getBucketDatabase().isConsistent(entry)) {
- replyDroppedOperation(msg,
- entry.getBucketId(),
- api::ReturnCode::ABORTED,
+ replyDroppedOperation(msg, entry.getBucketId(), api::ReturnCode::ABORTED,
"bucket became inconsistent during merging");
return false;
}
@@ -686,31 +644,26 @@ FileStorManager::validateApplyDiffCommandBucket(
}
bool
-FileStorManager::validateDiffReplyBucket(
- const StorBucketDatabase::WrappedEntry& entry,
- const document::BucketId& bucket)
+FileStorManager::validateDiffReplyBucket(const StorBucketDatabase::WrappedEntry& entry,
+ const document::BucketId& bucket)
{
if (!entry.exist()) {
_filestorHandler->clearMergeStatus(bucket,
- api::ReturnCode(api::ReturnCode::BUCKET_NOT_FOUND,
- "Bucket removed during merge"));
+ api::ReturnCode(api::ReturnCode::BUCKET_NOT_FOUND, "Bucket removed during merge"));
return false;
}
if (!_component.getBucketDatabase().isConsistent(entry)) {
_filestorHandler->clearMergeStatus(bucket,
- api::ReturnCode(api::ReturnCode::ABORTED,
- "Bucket became inconsistent during merging"));
+ api::ReturnCode(api::ReturnCode::ABORTED, "Bucket became inconsistent during merging"));
return false;
}
return true;
}
bool
-FileStorManager::onGetBucketDiffReply(
- const shared_ptr<api::GetBucketDiffReply>& reply)
+FileStorManager::onGetBucketDiffReply(const shared_ptr<api::GetBucketDiffReply>& reply)
{
- StorBucketDatabase::WrappedEntry entry(mapOperationToDisk(
- *reply, reply->getBucketId()));
+ StorBucketDatabase::WrappedEntry entry(mapOperationToDisk(*reply, reply->getBucketId()));
if (validateDiffReplyBucket(entry, reply->getBucketId())) {
handlePersistenceMessage(reply, entry->disk);
}
@@ -718,11 +671,9 @@ FileStorManager::onGetBucketDiffReply(
}
bool
-FileStorManager::onApplyBucketDiff(
- const shared_ptr<api::ApplyBucketDiffCommand>& cmd)
+FileStorManager::onApplyBucketDiff(const shared_ptr<api::ApplyBucketDiffCommand>& cmd)
{
- StorBucketDatabase::WrappedEntry entry(mapOperationToDisk(
- *cmd, cmd->getBucketId()));
+ StorBucketDatabase::WrappedEntry entry(mapOperationToDisk(*cmd, cmd->getBucketId()));
if (validateApplyDiffCommandBucket(*cmd, entry)) {
handlePersistenceMessage(cmd, entry->disk);
}
@@ -730,8 +681,7 @@ FileStorManager::onApplyBucketDiff(
}
bool
-FileStorManager::onApplyBucketDiffReply(
- const shared_ptr<api::ApplyBucketDiffReply>& reply)
+FileStorManager::onApplyBucketDiffReply(const shared_ptr<api::ApplyBucketDiffReply>& reply)
{
StorBucketDatabase::WrappedEntry entry(mapOperationToDisk(
*reply, reply->getBucketId()));
@@ -742,8 +692,7 @@ FileStorManager::onApplyBucketDiffReply(
}
bool
-FileStorManager::onJoinBuckets(
- const std::shared_ptr<api::JoinBucketsCommand>& cmd)
+FileStorManager::onJoinBuckets(const std::shared_ptr<api::JoinBucketsCommand>& cmd)
{
StorBucketDatabase::WrappedEntry entry(_component.getBucketDatabase().get(
cmd->getBucketId(), "FileStorManager::onJoinBuckets"));
@@ -757,11 +706,9 @@ FileStorManager::onJoinBuckets(
}
bool
-FileStorManager::onSplitBucket(
- const std::shared_ptr<api::SplitBucketCommand>& cmd)
+FileStorManager::onSplitBucket(const std::shared_ptr<api::SplitBucketCommand>& cmd)
{
- StorBucketDatabase::WrappedEntry entry(mapOperationToDisk(
- *cmd, cmd->getBucketId()));
+ StorBucketDatabase::WrappedEntry entry(mapOperationToDisk(*cmd, cmd->getBucketId()));
if (entry.exist()) {
handlePersistenceMessage(cmd, entry->disk);
}
@@ -772,8 +719,7 @@ bool
FileStorManager::onSetBucketState(
const std::shared_ptr<api::SetBucketStateCommand>& cmd)
{
- StorBucketDatabase::WrappedEntry entry(mapOperationToDisk(
- *cmd, cmd->getBucketId()));
+ StorBucketDatabase::WrappedEntry entry(mapOperationToDisk(*cmd, cmd->getBucketId()));
if (entry.exist()) {
handlePersistenceMessage(cmd, entry->disk);
}
@@ -786,10 +732,8 @@ FileStorManager::onInternal(const shared_ptr<api::InternalCommand>& msg)
switch (msg->getType()) {
case GetIterCommand::ID:
{
- shared_ptr<GetIterCommand> cmd(
- std::static_pointer_cast<GetIterCommand>(msg));
- StorBucketDatabase::WrappedEntry entry(mapOperationToDisk(
- *cmd, cmd->getBucketId()));
+ shared_ptr<GetIterCommand> cmd(std::static_pointer_cast<GetIterCommand>(msg));
+ StorBucketDatabase::WrappedEntry entry(mapOperationToDisk(*cmd, cmd->getBucketId()));
if (entry.exist()) {
handlePersistenceMessage(cmd, entry->disk);
}
@@ -797,10 +741,8 @@ FileStorManager::onInternal(const shared_ptr<api::InternalCommand>& msg)
}
case CreateIteratorCommand::ID:
{
- shared_ptr<CreateIteratorCommand> cmd(
- std::static_pointer_cast<CreateIteratorCommand>(msg));
- StorBucketDatabase::WrappedEntry entry(mapOperationToDisk(
- *cmd, cmd->getBucketId()));
+ shared_ptr<CreateIteratorCommand> cmd(std::static_pointer_cast<CreateIteratorCommand>(msg));
+ StorBucketDatabase::WrappedEntry entry(mapOperationToDisk(*cmd, cmd->getBucketId()));
if (entry.exist()) {
handlePersistenceMessage(cmd, entry->disk);
}
@@ -808,28 +750,22 @@ FileStorManager::onInternal(const shared_ptr<api::InternalCommand>& msg)
}
case DestroyIteratorCommand::ID:
{
- spi::Context context(msg->getLoadType(), msg->getPriority(),
- msg->getTrace().getLevel());
- shared_ptr<DestroyIteratorCommand> cmd(
- std::static_pointer_cast<DestroyIteratorCommand>(msg));
+ spi::Context context(msg->getLoadType(), msg->getPriority(), msg->getTrace().getLevel());
+ shared_ptr<DestroyIteratorCommand> cmd(std::static_pointer_cast<DestroyIteratorCommand>(msg));
_provider->destroyIterator(cmd->getIteratorId(), context);
msg->getTrace().getRoot().addChild(context.getTrace().getRoot());
return true;
}
case ReadBucketList::ID:
{
- shared_ptr<ReadBucketList> cmd(
- std::static_pointer_cast<ReadBucketList>(msg));
-
+ shared_ptr<ReadBucketList> cmd(std::static_pointer_cast<ReadBucketList>(msg));
handlePersistenceMessage(cmd, cmd->getPartition());
return true;
}
case ReadBucketInfo::ID:
{
- shared_ptr<ReadBucketInfo> cmd(
- std::static_pointer_cast<ReadBucketInfo>(msg));
- StorBucketDatabase::WrappedEntry entry(mapOperationToDisk(
- *cmd, cmd->getBucketId()));
+ shared_ptr<ReadBucketInfo> cmd(std::static_pointer_cast<ReadBucketInfo>(msg));
+ StorBucketDatabase::WrappedEntry entry(mapOperationToDisk(*cmd, cmd->getBucketId()));
if (entry.exist()) {
handlePersistenceMessage(cmd, entry->disk);
}
@@ -837,10 +773,8 @@ FileStorManager::onInternal(const shared_ptr<api::InternalCommand>& msg)
}
case InternalBucketJoinCommand::ID:
{
- shared_ptr<InternalBucketJoinCommand> cmd(
- std::static_pointer_cast<InternalBucketJoinCommand>(msg));
- StorBucketDatabase::WrappedEntry entry(mapOperationToDisk(
- *cmd, cmd->getBucketId()));
+ shared_ptr<InternalBucketJoinCommand> cmd(std::static_pointer_cast<InternalBucketJoinCommand>(msg));
+ StorBucketDatabase::WrappedEntry entry(mapOperationToDisk(*cmd, cmd->getBucketId()));
if (entry.exist()) {
handlePersistenceMessage(cmd, entry->disk);
}
@@ -848,10 +782,8 @@ FileStorManager::onInternal(const shared_ptr<api::InternalCommand>& msg)
}
case RepairBucketCommand::ID:
{
- shared_ptr<RepairBucketCommand> cmd(
- std::static_pointer_cast<RepairBucketCommand>(msg));
- StorBucketDatabase::WrappedEntry entry(mapOperationToDisk(
- *cmd, cmd->getBucketId()));
+ shared_ptr<RepairBucketCommand> cmd(std::static_pointer_cast<RepairBucketCommand>(msg));
+ StorBucketDatabase::WrappedEntry entry(mapOperationToDisk(*cmd, cmd->getBucketId()));
if (entry.exist()) {
handlePersistenceMessage(cmd, entry->disk);
}
@@ -859,10 +791,8 @@ FileStorManager::onInternal(const shared_ptr<api::InternalCommand>& msg)
}
case BucketDiskMoveCommand::ID:
{
- shared_ptr<BucketDiskMoveCommand> cmd(
- std::static_pointer_cast<BucketDiskMoveCommand>(msg));
- StorBucketDatabase::WrappedEntry entry(mapOperationToDisk(
- *cmd, cmd->getBucketId()));
+ shared_ptr<BucketDiskMoveCommand> cmd(std::static_pointer_cast<BucketDiskMoveCommand>(msg));
+ StorBucketDatabase::WrappedEntry entry(mapOperationToDisk(*cmd, cmd->getBucketId()));
if (entry.exist()) {
handlePersistenceMessage(cmd, entry->disk);
}
@@ -870,10 +800,8 @@ FileStorManager::onInternal(const shared_ptr<api::InternalCommand>& msg)
}
case RecheckBucketInfoCommand::ID:
{
- shared_ptr<RecheckBucketInfoCommand> cmd(
- std::static_pointer_cast<RecheckBucketInfoCommand>(msg));
- StorBucketDatabase::WrappedEntry entry(mapOperationToDisk(
- *cmd, cmd->getBucketId()));
+ shared_ptr<RecheckBucketInfoCommand> cmd(std::static_pointer_cast<RecheckBucketInfoCommand>(msg));
+ StorBucketDatabase::WrappedEntry entry(mapOperationToDisk(*cmd, cmd->getBucketId()));
if (entry.exist()) {
handlePersistenceMessage(cmd, entry->disk);
}
@@ -881,8 +809,7 @@ FileStorManager::onInternal(const shared_ptr<api::InternalCommand>& msg)
}
case AbortBucketOperationsCommand::ID:
{
- shared_ptr<AbortBucketOperationsCommand> cmd(
- std::static_pointer_cast<AbortBucketOperationsCommand>(msg));
+ shared_ptr<AbortBucketOperationsCommand> cmd(std::static_pointer_cast<AbortBucketOperationsCommand>(msg));
handleAbortBucketOperations(cmd);
return true;
}
@@ -892,8 +819,7 @@ FileStorManager::onInternal(const shared_ptr<api::InternalCommand>& msg)
}
void
-FileStorManager::handleAbortBucketOperations(
- const shared_ptr<AbortBucketOperationsCommand>& cmd)
+FileStorManager::handleAbortBucketOperations(const shared_ptr<AbortBucketOperationsCommand>& cmd)
{
_filestorHandler->abortQueuedOperations(*cmd);
sendReply(api::StorageReply::SP(cmd->makeReply().release()));
@@ -925,8 +851,7 @@ FileStorManager::sendReply(const std::shared_ptr<api::StorageReply>& reply)
LOG(spam, "Sending reply %s", reply->toString().c_str());
if (reply->getType() == api::MessageType::INTERNAL_REPLY) {
- std::shared_ptr<api::InternalReply> rep(
- std::dynamic_pointer_cast<api::InternalReply>(reply));
+ std::shared_ptr<api::InternalReply> rep(std::dynamic_pointer_cast<api::InternalReply>(reply));
assert(rep.get());
if (onInternalReply(rep)) return;
}
@@ -1021,8 +946,7 @@ FileStorManager::isMerging(const document::BucketId& bucket) const
namespace {
struct Deactivator {
- StorBucketDatabase::Decision operator()(
- document::BucketId::Type, StorBucketDatabase::Entry& data)
+ StorBucketDatabase::Decision operator()(document::BucketId::Type, StorBucketDatabase::Entry& data)
{
data.info.setActive(false);
return StorBucketDatabase::UPDATE;
@@ -1034,21 +958,16 @@ void
FileStorManager::updateState()
{
lib::ClusterState::CSP state(_component.getStateUpdater().getSystemState());
- spi::ClusterState spiState(
- *state, _component.getIndex(), *_component.getDistribution());
+ spi::ClusterState spiState(*state, _component.getIndex(), *_component.getDistribution());
lib::Node node(_component.getNodeType(), _component.getIndex());
bool nodeUp = state->getNodeState(node).getState().oneOf("uir");
- LOG(debug, "FileStorManager received cluster state '%s'",
- state->toString().c_str());
+ LOG(debug, "FileStorManager received cluster state '%s'", state->toString().c_str());
// If edge where we go down
if (_nodeUpInLastNodeStateSeenByProvider && !nodeUp) {
- LOG(debug,
- "Received cluster state where this node is down; "
- "de-activating all buckets in database");
+ LOG(debug, "Received cluster state where this node is down; de-activating all buckets in database");
Deactivator deactivator;
- _component.getBucketDatabase().all(
- deactivator, "FileStorManager::updateState");
+ _component.getBucketDatabase().all(deactivator, "FileStorManager::updateState");
}
_provider->setClusterState(spiState);
_nodeUpInLastNodeStateSeenByProvider = nodeUp;
diff --git a/storage/src/vespa/storage/persistence/persistencethread.cpp b/storage/src/vespa/storage/persistence/persistencethread.cpp
index 0ab512cd63f..11f8b5d1cf4 100644
--- a/storage/src/vespa/storage/persistence/persistencethread.cpp
+++ b/storage/src/vespa/storage/persistence/persistencethread.cpp
@@ -5,7 +5,6 @@
#include "bucketownershipnotifier.h"
#include "testandsethelper.h"
#include <vespa/storageapi/message/multioperation.h>
-#include <vespa/storage/bucketdb/storbucketdb.h>
#include <vespa/storageapi/message/bucketsplitting.h>
#include <vespa/storage/common/bucketoperationlogger.h>
#include <vespa/document/fieldset/fieldsetrepo.h>
@@ -24,15 +23,8 @@ PersistenceThread::PersistenceThread(ServiceLayerComponentRegister& compReg,
FileStorHandler& filestorHandler,
FileStorThreadMetrics& metrics,
uint16_t deviceIndex,
- uint8_t lowestPriority,
- bool startThread)
- : _env(configUri,
- compReg,
- filestorHandler,
- metrics,
- deviceIndex,
- lowestPriority,
- provider),
+ uint8_t lowestPriority)
+ : _env(configUri, compReg, filestorHandler, metrics, deviceIndex, lowestPriority, provider),
_warnOnSlowOperations(5000),
_spi(provider),
_processAllHandler(_env, provider),
@@ -43,13 +35,10 @@ PersistenceThread::PersistenceThread(ServiceLayerComponentRegister& compReg,
_flushMonitor(),
_closed(false)
{
- (void) startThread;
std::ostringstream threadName;
- threadName << "Disk " << _env._partition << " thread "
- << (void*) this;
+ threadName << "Disk " << _env._partition << " thread " << (void*) this;
_component.reset(new ServiceLayerComponent(compReg, threadName.str()));
- _bucketOwnershipNotifier.reset(
- new BucketOwnershipNotifier(*_component, filestorHandler));
+ _bucketOwnershipNotifier.reset(new BucketOwnershipNotifier(*_component, filestorHandler));
framework::MilliSecTime maxProcessingTime(60 * 1000);
framework::MilliSecTime waitTime(1000);
_thread = _component->startThread(*this, maxProcessingTime, waitTime);
@@ -57,8 +46,7 @@ PersistenceThread::PersistenceThread(ServiceLayerComponentRegister& compReg,
PersistenceThread::~PersistenceThread()
{
- LOG(debug, "Shutting down persistence thread. Waiting for current "
- "operation to finish.");
+ LOG(debug, "Shutting down persistence thread. Waiting for current operation to finish.");
_thread->interrupt();
LOG(debug, "Waiting for thread to terminate.");
_thread->join();
@@ -66,8 +54,7 @@ PersistenceThread::~PersistenceThread()
}
spi::Bucket
-PersistenceThread::getBucket(const DocumentId& id,
- const BucketId& bucket) const
+PersistenceThread::getBucket(const DocumentId& id, const BucketId& bucket) const
{
BucketId docBucket(_env._bucketFactory.getBucketId(id));
docBucket.setUsedBits(bucket.getUsedBits());
@@ -82,8 +69,7 @@ PersistenceThread::getBucket(const DocumentId& id,
}
bool
-PersistenceThread::checkForError(const spi::Result& response,
- MessageTracker& tracker)
+PersistenceThread::checkForError(const spi::Result& response, MessageTracker& tracker)
{
uint32_t code = _env.convertErrorCode(response);
diff --git a/storage/src/vespa/storage/persistence/persistencethread.h b/storage/src/vespa/storage/persistence/persistencethread.h
index 218d2f7dd23..4d714dc878a 100644
--- a/storage/src/vespa/storage/persistence/persistencethread.h
+++ b/storage/src/vespa/storage/persistence/persistencethread.h
@@ -16,31 +16,22 @@ namespace storage {
class BucketOwnershipNotifier;
class TestAndSetHelper;
-class PersistenceThread : public DiskThread, public Types
+class PersistenceThread final : public DiskThread, public Types
{
public:
- PersistenceThread(ServiceLayerComponentRegister&,
- const config::ConfigUri & configUri,
- spi::PersistenceProvider& provider,
- FileStorHandler& filestorHandler,
- FileStorThreadMetrics& metrics,
- uint16_t deviceIndex,
- uint8_t lowestPriority,
- bool startThread = false);
+ PersistenceThread(ServiceLayerComponentRegister&, const config::ConfigUri & configUri,
+ spi::PersistenceProvider& provider, FileStorHandler& filestorHandler,
+ FileStorThreadMetrics& metrics, uint16_t deviceIndex, uint8_t lowestPriority);
~PersistenceThread();
/** Waits for current operation to be finished. */
void flush() override;
-
- bool isMerging(const BucketId& bucket) const;
-
framework::Thread& getThread() override { return *_thread; }
MessageTracker::UP handlePut(api::PutCommand& cmd);
MessageTracker::UP handleRemove(api::RemoveCommand& cmd);
MessageTracker::UP handleUpdate(api::UpdateCommand& cmd);
MessageTracker::UP handleGet(api::GetCommand& cmd);
-
MessageTracker::UP handleMultiOperation(api::MultiOperationCommand& cmd);
MessageTracker::UP handleRevert(api::RevertCommand& cmd);
MessageTracker::UP handleCreateBucket(api::CreateBucketCommand& cmd);
@@ -57,37 +48,31 @@ public:
MessageTracker::UP handleRecheckBucketInfo(RecheckBucketInfoCommand& cmd);
private:
- PersistenceUtil _env;
- uint32_t _warnOnSlowOperations;
-
+ PersistenceUtil _env;
+ uint32_t _warnOnSlowOperations;
spi::PersistenceProvider& _spi;
- ProcessAllHandler _processAllHandler;
- MergeHandler _mergeHandler;
- DiskMoveOperationHandler _diskMoveHandler;
+ ProcessAllHandler _processAllHandler;
+ MergeHandler _mergeHandler;
+ DiskMoveOperationHandler _diskMoveHandler;
ServiceLayerComponent::UP _component;
- framework::Thread::UP _thread;
- spi::Context _context;
+ framework::Thread::UP _thread;
+ spi::Context _context;
std::unique_ptr<BucketOwnershipNotifier> _bucketOwnershipNotifier;
+ vespalib::Monitor _flushMonitor;
+ bool _closed;
- vespalib::Monitor _flushMonitor;
- bool _closed;
-
- void setBucketInfo(MessageTracker& tracker,
- const document::BucketId& bucketId);
+ void setBucketInfo(MessageTracker& tracker, const document::BucketId& bucketId);
- bool checkProviderBucketInfoMatches(const spi::Bucket&,
- const api::BucketInfo&) const;
+ bool checkProviderBucketInfoMatches(const spi::Bucket&, const api::BucketInfo&) const;
- void updateBucketDatabase(const document::BucketId& id,
- const api::BucketInfo& info);
+ void updateBucketDatabase(const document::BucketId& id, const api::BucketInfo& info);
/**
* Sanity-checking of join command parameters. Invokes tracker.fail() with
* an appropriate error and returns false iff the command does not validate
* OK. Returns true and does not touch the tracker otherwise.
*/
- bool validateJoinCommand(const api::JoinBucketsCommand& cmd,
- MessageTracker& tracker) const;
+ bool validateJoinCommand(const api::JoinBucketsCommand& cmd, MessageTracker& tracker) const;
// Message handling functions
MessageTracker::UP handleCommand(api::StorageCommand&);
@@ -102,8 +87,7 @@ private:
bool checkForError(const spi::Result& response, MessageTracker& tracker);
spi::Bucket getBucket(const DocumentId& id, const BucketId& bucket) const;
- void flushAllReplies(const document::BucketId& bucketId,
- std::vector<MessageTracker::UP>& trackers);
+ void flushAllReplies(const document::BucketId& bucketId, std::vector<MessageTracker::UP>& trackers);
friend class TestAndSetHelper;
bool tasConditionExists(const api::TestAndSetCommand & cmd);
diff --git a/storage/src/vespa/storage/storageserver/servicelayernode.cpp b/storage/src/vespa/storage/storageserver/servicelayernode.cpp
index e2861ef42cd..9faf380d2ba 100644
--- a/storage/src/vespa/storage/storageserver/servicelayernode.cpp
+++ b/storage/src/vespa/storage/storageserver/servicelayernode.cpp
@@ -28,13 +28,11 @@ using StorServerConfigBuilder = vespa::config::content::core::StorServerConfigBu
namespace storage {
-ServiceLayerNode::ServiceLayerNode(
- const config::ConfigUri & configUri,
- ServiceLayerNodeContext& context,
- ApplicationGenerationFetcher& generationFetcher,
- spi::PersistenceProvider& persistenceProvider,
- const VisitorFactory::Map& externalVisitors)
- : StorageNode(configUri, context, generationFetcher, std::unique_ptr<HostInfo>(new HostInfo)),
+ServiceLayerNode::ServiceLayerNode(const config::ConfigUri & configUri, ServiceLayerNodeContext& context,
+ ApplicationGenerationFetcher& generationFetcher,
+ spi::PersistenceProvider& persistenceProvider,
+ const VisitorFactory::Map& externalVisitors)
+ : StorageNode(configUri, context, generationFetcher, std::make_unique<HostInfo>()),
_context(context),
_persistenceProvider(persistenceProvider),
_partitions(0),
diff --git a/storage/src/vespa/storage/storageserver/storagenodecontext.cpp b/storage/src/vespa/storage/storageserver/storagenodecontext.cpp
index 5f4ceff2a6b..2e1aa52e68d 100644
--- a/storage/src/vespa/storage/storageserver/storagenodecontext.cpp
+++ b/storage/src/vespa/storage/storageserver/storagenodecontext.cpp
@@ -4,16 +4,16 @@
#include <vespa/storageframework/defaultimplementation/memory/prioritymemorylogic.h>
-using storage::framework::defaultimplementation::AllocationLogic;
-
namespace storage {
+using framework::defaultimplementation::AllocationLogic;
+using framework::defaultimplementation::PriorityMemoryLogic;
+
StorageNodeContext::StorageNodeContext(ComponentRegister::UP compReg, framework::Clock::UP clock)
: _componentRegister(std::move(compReg)),
_clock(std::move(clock)),
_threadPool(*_clock),
- _memoryLogic(new framework::defaultimplementation::PriorityMemoryLogic(
- *_clock, 1024 * 1024 * 1024)),
+ _memoryLogic(new PriorityMemoryLogic(*_clock, 1024 * 1024 * 1024)),
_memoryManager(AllocationLogic::UP(_memoryLogic))
{
_componentRegister->setClock(*_clock);
diff --git a/storage/src/vespa/storage/storageserver/storagenodecontext.h b/storage/src/vespa/storage/storageserver/storagenodecontext.h
index 7d6f3b0aef5..0149f975f63 100644
--- a/storage/src/vespa/storage/storageserver/storagenodecontext.h
+++ b/storage/src/vespa/storage/storageserver/storagenodecontext.h
@@ -53,8 +53,7 @@ struct StorageNodeContext {
protected:
// Initialization has been split in two as subclass needs to initialize
// component register before sending it on.
- StorageNodeContext(ComponentRegister::UP,
- framework::Clock::UP);
+ StorageNodeContext(ComponentRegister::UP, framework::Clock::UP);
private:
ComponentRegister::UP _componentRegister;
diff --git a/storageframework/src/vespa/storageframework/defaultimplementation/thread/threadimpl.h b/storageframework/src/vespa/storageframework/defaultimplementation/thread/threadimpl.h
index bdc491a5da6..798251f0573 100644
--- a/storageframework/src/vespa/storageframework/defaultimplementation/thread/threadimpl.h
+++ b/storageframework/src/vespa/storageframework/defaultimplementation/thread/threadimpl.h
@@ -49,12 +49,8 @@ class ThreadImpl : public Thread
void run();
public:
- ThreadImpl(ThreadPoolImpl&,
- Runnable&,
- vespalib::stringref id,
- uint64_t waitTimeMs,
- uint64_t maxProcessTimeMs,
- int ticksBeforeWait);
+ ThreadImpl(ThreadPoolImpl&, Runnable&, vespalib::stringref id, uint64_t waitTimeMs,
+ uint64_t maxProcessTimeMs, int ticksBeforeWait);
~ThreadImpl();
bool interrupted() const override;
diff --git a/storageframework/src/vespa/storageframework/defaultimplementation/thread/threadpoolimpl.cpp b/storageframework/src/vespa/storageframework/defaultimplementation/thread/threadpoolimpl.cpp
index eae02c71cfb..09c805b2b85 100644
--- a/storageframework/src/vespa/storageframework/defaultimplementation/thread/threadpoolimpl.cpp
+++ b/storageframework/src/vespa/storageframework/defaultimplementation/thread/threadpoolimpl.cpp
@@ -3,12 +3,12 @@
#include "threadpoolimpl.h"
#include "threadimpl.h"
#include <vespa/vespalib/util/exceptions.h>
+#include <thread>
+using namespace std::chrono_literals;
using vespalib::IllegalStateException;
-namespace storage {
-namespace framework {
-namespace defaultimplementation {
+namespace storage::framework::defaultimplementation {
ThreadPoolImpl::ThreadPoolImpl(Clock& clock)
: _backendThreadPool(512 * 1024),
@@ -21,11 +21,11 @@ ThreadPoolImpl::~ThreadPoolImpl()
{
vespalib::LockGuard lock(_threadVectorLock);
_stopping = true;
- for (uint32_t i=0, n=_threads.size(); i<n; ++i) {
- _threads[i]->interrupt();
+ for (ThreadImpl * thread : _threads) {
+ thread->interrupt();
}
- for (uint32_t i=0, n=_threads.size(); i<n; ++i) {
- _threads[i]->join();
+ for (ThreadImpl * thread : _threads) {
+ thread->join();
}
}
for (uint32_t i=0; true; i+=10) {
@@ -34,30 +34,25 @@ ThreadPoolImpl::~ThreadPoolImpl()
if (_threads.empty()) break;
}
if (i > 1000) {
- fprintf(stderr, "Failed to kill thread pool. Threads won't die. (And "
- "if allowing thread pool object to be deleted this "
- "will create a segfault later)\n");
+ fprintf(stderr, "Failed to kill thread pool. Threads won't die. (And if allowing thread pool object"
+ " to be deleted this will create a segfault later)\n");
abort();
}
- FastOS_Thread::Sleep(10);
+ std::this_thread::sleep_for(10ms);
}
_backendThreadPool.Close();
}
Thread::UP
-ThreadPoolImpl::startThread(Runnable& runnable,
- vespalib::stringref id,
- uint64_t waitTimeMs,
- uint64_t maxProcessTime,
- int ticksBeforeWait)
+ThreadPoolImpl::startThread(Runnable& runnable, vespalib::stringref id, uint64_t waitTimeMs,
+ uint64_t maxProcessTime, int ticksBeforeWait)
{
vespalib::LockGuard lock(_threadVectorLock);
if (_stopping) {
- throw vespalib::IllegalStateException("Threadpool is stopping", VESPA_STRLOC);
+ throw IllegalStateException("Threadpool is stopping", VESPA_STRLOC);
}
ThreadImpl* ti;
- Thread::UP t(ti = new ThreadImpl(
- *this, runnable, id, waitTimeMs, maxProcessTime, ticksBeforeWait));
+ Thread::UP t(ti = new ThreadImpl(*this, runnable, id, waitTimeMs, maxProcessTime, ticksBeforeWait));
_threads.push_back(ti);
return t;
}
@@ -66,9 +61,8 @@ void
ThreadPoolImpl::visitThreads(ThreadVisitor& visitor) const
{
vespalib::LockGuard lock(_threadVectorLock);
- for (uint32_t i=0, n=_threads.size(); i<n; ++i) {
- visitor.visitThread(_threads[i]->getId(), _threads[i]->getProperties(),
- _threads[i]->getTickData());
+ for (const ThreadImpl * thread : _threads) {
+ visitor.visitThread(thread->getId(), thread->getProperties(), thread->getTickData());
}
}
@@ -78,14 +72,12 @@ ThreadPoolImpl::unregisterThread(ThreadImpl& t)
vespalib::LockGuard lock(_threadVectorLock);
std::vector<ThreadImpl*> threads;
threads.reserve(_threads.size());
- for (uint32_t i=0, n=_threads.size(); i<n; ++i) {
- if (_threads[i] != &t) {
- threads.push_back(_threads[i]);
+ for (ThreadImpl * thread : _threads) {
+ if (thread != &t) {
+ threads.push_back(thread);
}
}
_threads.swap(threads);
}
-} // defaultimplementation
-} // framework
-} // storage
+}
diff --git a/storageframework/src/vespa/storageframework/defaultimplementation/thread/threadpoolimpl.h b/storageframework/src/vespa/storageframework/defaultimplementation/thread/threadpoolimpl.h
index 2b16836eba2..4e973c2ad20 100644
--- a/storageframework/src/vespa/storageframework/defaultimplementation/thread/threadpoolimpl.h
+++ b/storageframework/src/vespa/storageframework/defaultimplementation/thread/threadpoolimpl.h
@@ -12,11 +12,11 @@ class ThreadImpl;
struct ThreadPoolImpl : public ThreadPool
{
- FastOS_ThreadPool _backendThreadPool;
- std::vector<ThreadImpl*> _threads;
- vespalib::Lock _threadVectorLock;
- Clock& _clock;
- bool _stopping;
+ FastOS_ThreadPool _backendThreadPool;
+ std::vector<ThreadImpl*> _threads;
+ vespalib::Lock _threadVectorLock;
+ Clock & _clock;
+ bool _stopping;
public:
ThreadPoolImpl(Clock&);
diff --git a/storageframework/src/vespa/storageframework/generic/component/component.cpp b/storageframework/src/vespa/storageframework/generic/component/component.cpp
index a35cad68b00..869df4296ef 100644
--- a/storageframework/src/vespa/storageframework/generic/component/component.cpp
+++ b/storageframework/src/vespa/storageframework/generic/component/component.cpp
@@ -33,9 +33,7 @@ Component::Component(ComponentRegister& cr, vespalib::stringref name)
cr.registerComponent(*this);
}
-Component::~Component()
-{
-}
+Component::~Component() = default;
void
Component::registerComponentStateListener(ComponentStateListener& l)
@@ -67,8 +65,7 @@ Component::registerMetricUpdateHook(MetricUpdateHook& hook, SecondTime period)
assert(_metricUpdateHook.first == 0);
_metricUpdateHook = std::make_pair(&hook, period);
if (_metricReg != 0) {
- _metricReg->registerUpdateHook(
- _name, *_metricUpdateHook.first, _metricUpdateHook.second);
+ _metricReg->registerUpdateHook(_name, *_metricUpdateHook.first, _metricUpdateHook.second);
}
}
@@ -86,8 +83,7 @@ void
Component::setMetricRegistrator(MetricRegistrator& mr) {
_metricReg = &mr;
if (_metricUpdateHook.first != 0) {
- _metricReg->registerUpdateHook(
- _name, *_metricUpdateHook.first, _metricUpdateHook.second);
+ _metricReg->registerUpdateHook(_name, *_metricUpdateHook.first, _metricUpdateHook.second);
}
if (_metric != 0) {
_metricReg->registerMetric(*_metric);
@@ -117,16 +113,10 @@ Component::getClock() const
// Helper functions for components wanting to start a single thread.
Thread::UP
-Component::startThread(Runnable& runnable,
- MilliSecTime waitTime,
- MilliSecTime maxProcessTime,
- int ticksBeforeWait)
+Component::startThread(Runnable& runnable, MilliSecTime waitTime, MilliSecTime maxProcessTime, int ticksBeforeWait)
{
- return getThreadPool().startThread(runnable,
- getName(),
- waitTime.getTime(),
- maxProcessTime.getTime(),
- ticksBeforeWait);
+ return getThreadPool().startThread(runnable, getName(), waitTime.getTime(),
+ maxProcessTime.getTime(), ticksBeforeWait);
}
void
diff --git a/storageframework/src/vespa/storageframework/generic/component/component.h b/storageframework/src/vespa/storageframework/generic/component/component.h
index 8a65d186557..b16e31290b8 100644
--- a/storageframework/src/vespa/storageframework/generic/component/component.h
+++ b/storageframework/src/vespa/storageframework/generic/component/component.h
@@ -79,7 +79,7 @@ namespace storage::framework {
class ComponentRegister;
struct ComponentStateListener {
- virtual ~ComponentStateListener() {}
+ virtual ~ComponentStateListener() = default;
virtual void onOpen() {}
virtual void onClose() {}
diff --git a/storageserver/src/vespa/storageserver/app/servicelayerprocess.cpp b/storageserver/src/vespa/storageserver/app/servicelayerprocess.cpp
index 20868e79fce..2ca29223254 100644
--- a/storageserver/src/vespa/storageserver/app/servicelayerprocess.cpp
+++ b/storageserver/src/vespa/storageserver/app/servicelayerprocess.cpp
@@ -17,7 +17,7 @@ void
ServiceLayerProcess::shutdown()
{
Process::shutdown();
- _node.reset(0);
+ _node.reset();
}
void
@@ -25,7 +25,7 @@ ServiceLayerProcess::createNode()
{
_externalVisitors["searchvisitor"].reset(new SearchVisitorFactory(_configUri));
setupProvider();
- _node.reset(new ServiceLayerNode(_configUri, _context, *this, getProvider(), _externalVisitors));
+ _node = std::make_unique<ServiceLayerNode>(_configUri, _context, *this, getProvider(), _externalVisitors);
_node->init();
}
diff --git a/storageserver/src/vespa/storageserver/app/servicelayerprocess.h b/storageserver/src/vespa/storageserver/app/servicelayerprocess.h
index 0a002db114b..af991c00f03 100644
--- a/storageserver/src/vespa/storageserver/app/servicelayerprocess.h
+++ b/storageserver/src/vespa/storageserver/app/servicelayerprocess.h
@@ -19,9 +19,8 @@
#include "process.h"
#include <vespa/storage/storageserver/servicelayernodecontext.h>
#include <vespa/storage/common/visitorfactory.h>
-#include <vespa/config/config.h>
-#include <vespa/config/helper/configfetcher.h>
-#include <vespa/config-persistence.h>
+
+namespace config { class ConfigUri; }
namespace storage {
diff --git a/vespajlib/src/main/java/com/yahoo/tensor/Tensor.java b/vespajlib/src/main/java/com/yahoo/tensor/Tensor.java
index 2cba2e05536..5ad1a8f1e17 100644
--- a/vespajlib/src/main/java/com/yahoo/tensor/Tensor.java
+++ b/vespajlib/src/main/java/com/yahoo/tensor/Tensor.java
@@ -174,11 +174,17 @@ public interface Tensor {
default Tensor equal(Tensor argument) { return join(argument, (a, b) -> ( a == b ? 1.0 : 0.0)); }
default Tensor notEqual(Tensor argument) { return join(argument, (a, b) -> ( a != b ? 1.0 : 0.0)); }
+ default Tensor avg(String dimension) { return avg(Collections.singletonList(dimension)); }
default Tensor avg(List<String> dimensions) { return reduce(Reduce.Aggregator.avg, dimensions); }
+ default Tensor count(String dimension) { return count(Collections.singletonList(dimension)); }
default Tensor count(List<String> dimensions) { return reduce(Reduce.Aggregator.count, dimensions); }
+ default Tensor max(String dimension) { return max(Collections.singletonList(dimension)); }
default Tensor max(List<String> dimensions) { return reduce(Reduce.Aggregator.max, dimensions); }
+ default Tensor min(String dimension) { return min(Collections.singletonList(dimension)); }
default Tensor min(List<String> dimensions) { return reduce(Reduce.Aggregator.min, dimensions); }
+ default Tensor prod(String dimension) { return prod(Collections.singletonList(dimension)); }
default Tensor prod(List<String> dimensions) { return reduce(Reduce.Aggregator.prod, dimensions); }
+ default Tensor sum(String dimension) { return sum(Collections.singletonList(dimension)); }
default Tensor sum(List<String> dimensions) { return reduce(Reduce.Aggregator.sum, dimensions); }
// ----------------- serialization
diff --git a/vespajlib/src/test/java/com/yahoo/tensor/TensorTestCase.java b/vespajlib/src/test/java/com/yahoo/tensor/TensorTestCase.java
index f0b800bea7f..c47bfe84373 100644
--- a/vespajlib/src/test/java/com/yahoo/tensor/TensorTestCase.java
+++ b/vespajlib/src/test/java/com/yahoo/tensor/TensorTestCase.java
@@ -66,6 +66,16 @@ public class TensorTestCase {
assertTrue(dimensions3.contains("d3"));
}
+ @Test
+ public void testExpressions() {
+ Tensor y = Tensor.from("{{y:1}:3}");
+ Tensor x = Tensor.from("{{x:0}:5,{x:1}:7}");
+ Tensor xy = Tensor.from("{{x:0,y:1}:11, {x:1,y:1}:13}");
+ double nest = y.multiply(x.multiply(xy).sum("x")).sum("y").asDouble();
+ double flat = y.multiply(x).multiply(xy).sum(ImmutableList.of("x","y")).asDouble();
+ assertEquals(nest, flat, 0.000000001);
+ }
+
/** All functions are more throughly tested in searchlib EvaluationTestCase */
@Test
public void testTensorComputation() {
diff --git a/vespalog/src/test/bufferedlogtest.cpp b/vespalog/src/test/bufferedlogtest.cpp
index 3e974057361..9b69d9d3a14 100644
--- a/vespalog/src/test/bufferedlogtest.cpp
+++ b/vespalog/src/test/bufferedlogtest.cpp
@@ -71,12 +71,11 @@ void spamLog2(uint64_t& time, int diff) {
time += diff;
std::ostringstream ost;
ost << "Message " << i;
- LOGBT(info, ost.str(), ost.str().c_str());
+ LOGBT(info, ost.str(), "%s", ost.str().c_str());
}
}
-void testThatEntriesWithHighCountIsKept(const std::string& file,
- uint64_t& timer)
+void testThatEntriesWithHighCountIsKept(const std::string& file, uint64_t& timer)
{
std::cerr << "testThatEntriesWithHighCountIsKept ...\n";
timer = 10 * 1000000 + 4;
diff --git a/vespalog/src/test/bufferedlogtest.logger1.cpp b/vespalog/src/test/bufferedlogtest.logger1.cpp
index 24b9237a71d..dde5f2edbb5 100644
--- a/vespalog/src/test/bufferedlogtest.logger1.cpp
+++ b/vespalog/src/test/bufferedlogtest.logger1.cpp
@@ -5,7 +5,7 @@
LOG_SETUP(".logger1");
-void logWithLogger1(const std::string& token, const std::string message)
+void logWithLogger1(const std::string& token, const std::string & message)
{
- LOGBT(info, token, message.c_str());
+ LOGBT(info, token, "%s", message.c_str());
}
diff --git a/vespalog/src/test/bufferedlogtest.logger1.h b/vespalog/src/test/bufferedlogtest.logger1.h
index acbd67e8c3e..1ec8f9acad4 100644
--- a/vespalog/src/test/bufferedlogtest.logger1.h
+++ b/vespalog/src/test/bufferedlogtest.logger1.h
@@ -4,5 +4,5 @@
#include <string>
-void logWithLogger1(const std::string& token, const std::string message);
+void logWithLogger1(const std::string& token, const std::string & message);
diff --git a/vespalog/src/test/bufferedlogtest.logger2.cpp b/vespalog/src/test/bufferedlogtest.logger2.cpp
index 8d6ca97130e..992eeb70481 100644
--- a/vespalog/src/test/bufferedlogtest.logger2.cpp
+++ b/vespalog/src/test/bufferedlogtest.logger2.cpp
@@ -5,7 +5,7 @@
LOG_SETUP(".logger2");
-void logWithLogger2(const std::string& token, const std::string message)
+void logWithLogger2(const std::string& token, const std::string & message)
{
- LOGBT(info, token, message.c_str());
+ LOGBT(info, token, "%s", message.c_str());
}
diff --git a/vespalog/src/test/bufferedlogtest.logger2.h b/vespalog/src/test/bufferedlogtest.logger2.h
index 398d799a2b3..cd88d8ea0be 100644
--- a/vespalog/src/test/bufferedlogtest.logger2.h
+++ b/vespalog/src/test/bufferedlogtest.logger2.h
@@ -4,5 +4,5 @@
#include <string>
-void logWithLogger2(const std::string& token, const std::string message);
+void logWithLogger2(const std::string& token, const std::string & message);
diff --git a/vespalog/src/vespa/log/bufferedlogger.h b/vespalog/src/vespa/log/bufferedlogger.h
index 64419311a17..9081ab8f9cf 100644
--- a/vespalog/src/vespa/log/bufferedlogger.h
+++ b/vespalog/src/vespa/log/bufferedlogger.h
@@ -102,7 +102,7 @@
"", __VA_ARGS__); \
} \
} \
- } while (0)
+ } while (false)
#endif
// Define LOGBM macro for logging buffered, using the message itself as a
@@ -121,7 +121,7 @@
"", __VA_ARGS__); \
} \
} \
- } while (0)
+ } while (false)
// Define LOGBP macro for logging buffered, using the call point as token.
// (File/line of macro caller)
@@ -140,7 +140,7 @@
__FILE__, __LINE__, ost123.str(), ##ARGS); \
} \
} \
- } while (0)
+ } while (false)
// Define LOGT calls for using the buffer specifically stating token
#define LOGBT(level, token, ...) \
@@ -156,7 +156,7 @@
__FILE__, __LINE__, token, __VA_ARGS__); \
} \
} \
- } while (0)
+ } while (false)
#define LOGB_FLUSH() \
ns_log::BufferedLogger::logger.flush()
diff --git a/vespalog/src/vespa/log/log.cpp b/vespalog/src/vespa/log/log.cpp
index 7d98c22957d..193f4230502 100644
--- a/vespalog/src/vespa/log/log.cpp
+++ b/vespalog/src/vespa/log/log.cpp
@@ -23,7 +23,7 @@ namespace ns_log {
uint64_t Timer::getTimestamp() const {
struct timeval tv;
- gettimeofday(&tv, NULL);
+ gettimeofday(&tv, nullptr);
uint64_t timestamp = tv.tv_sec;
timestamp *= 1000000;
timestamp += tv.tv_usec;
@@ -164,16 +164,16 @@ Logger::~Logger()
{
_numInstances--;
if ((_numInstances == 1)) {
- if (logger != NULL) {
+ if (logger != nullptr) {
logger->~Logger();
free(logger);
- logger = NULL;
+ logger = nullptr;
}
} else if (_numInstances == 0) {
delete _controlFile;
logInitialised = false;
delete _target;
- _target = NULL;
+ _target = nullptr;
}
}
@@ -390,13 +390,6 @@ Logger::doEventValue(const char *name, double value)
}
void
-Logger::doEventCollection(uint64_t collectionId, const char* name, const char* params)
-{
- doLog(event, "", 0, "collection/1 collectionId=%lu name=\"%s\" %s",
- collectionId, name, params);
-}
-
-void
Logger::doEventState(const char *name, const char *value)
{
doLog(event, "", 0, "state/1 name=\"%s\" value=\"%s\"", name, value);
diff --git a/vespalog/src/vespa/log/log.h b/vespalog/src/vespa/log/log.h
index 127baf14d55..de0b9809e35 100644
--- a/vespalog/src/vespa/log/log.h
+++ b/vespalog/src/vespa/log/log.h
@@ -39,13 +39,13 @@ do { \
if (logger.wants(ns_log::Logger::level)) { \
logger.doLog(ns_log::Logger::level, __FILE__, __LINE__, __VA_ARGS__); \
} \
-} while (0)
+} while (false)
#define VLOG(level, ...) \
do { \
if (logger.wants(level)) { \
logger.doLog(level, __FILE__, __LINE__, __VA_ARGS__); \
} \
-} while (0)
+} while (false)
#endif
// Must use placement new in the following definition, since the variable
@@ -64,7 +64,7 @@ do {
if (logger->wants(ns_log::Logger::level)) { \
logger->doLog(ns_log::Logger::level, __FILE__, __LINE__, __VA_ARGS__); \
} \
-} while (0)
+} while (false)
#define LOG_WOULD_LOG(level) logger.wants(ns_log::Logger::level)
#define LOG_WOULD_VLOG(level) logger.wants(level)
@@ -74,84 +74,77 @@ do { \
if (logger.wants(ns_log::Logger::event)) { \
logger.doEventStarting(name); \
} \
-} while (0)
+} while (false)
#define EV_STOPPING(name,why) \
do { \
if (logger.wants(ns_log::Logger::event)) { \
logger.doEventStopping(name, why); \
} \
-} while (0)
+} while (false)
#define EV_STARTED(name) \
do { \
if (logger.wants(ns_log::Logger::event)) { \
logger.doEventStarted(name); \
} \
-} while (0)
+} while (false)
#define EV_STOPPED(name,pid,exitcode) \
do { \
if (logger.wants(ns_log::Logger::event)) { \
logger.doEventStopped(name, pid, exitcode); \
} \
-} while (0)
+} while (false)
#define EV_RELOADING(name) \
do { \
if (logger.wants(ns_log::Logger::event)) { \
logger.doEventReloading(name); \
} \
-} while (0)
+} while (false)
#define EV_RELOADED(name) \
do { \
if (logger.wants(ns_log::Logger::event)) { \
logger.doEventReloaded(name); \
} \
-} while (0)
+} while (false)
#define EV_CRASH(name,pid,signal) \
do { \
if (logger.wants(ns_log::Logger::event)) { \
logger.doEventCrash(name, pid, signal); \
} \
-} while (0)
+} while (false)
#define EV_PROGRESS(name, ...) \
do { \
if (logger.wants(ns_log::Logger::event)) { \
logger.doEventProgress(name, __VA_ARGS__); \
} \
-} while (0)
+} while (false)
#define EV_COUNT(name,value) \
do { \
if (logger.wants(ns_log::Logger::event)) { \
logger.doEventCount(name, value); \
} \
-} while (0)
+} while (false)
#define EV_VALUE(name,value) \
do { \
if (logger.wants(ns_log::Logger::event)) { \
logger.doEventValue(name, value); \
} \
-} while (0)
-
-#define EV_COLLECTION(collectionId,name,params) \
-do { \
- if (logger.wants(ns_log::Logger::event)) { \
- logger.doEventCollection(collectionId, name, params); \
- } \
-} while (0)
+} while (false)
#define EV_STATE(name,value) \
do { \
if (logger.wants(ns_log::Logger::event)) { \
logger.doEventState(name, value); \
} \
-} while (0)
+} while (false)
namespace ns_log {
@@ -161,7 +154,7 @@ class ControlFile;
// XXX this is way too complicated, must be some simpler way to do this
/** Timer class used to retrieve timestamp, such that we can override in test */
struct Timer {
- virtual ~Timer() {}
+ virtual ~Timer() = default;
virtual uint64_t getTimestamp() const;
};
@@ -187,7 +180,6 @@ public:
static bool fakePid;
private:
- Logger();
Logger(const Logger &);
Logger& operator =(const Logger &);
@@ -205,7 +197,6 @@ private:
static ControlFile *_controlFile;
static void setTarget();
- void makeLockFile();
char _appendix[256];
@@ -220,8 +211,7 @@ private:
const char *fmt, va_list args);
public:
~Logger();
- explicit Logger(const char *name, const char *rcsId = 0);
- static Logger& getLogger(const char *name);
+ explicit Logger(const char *name, const char *rcsId = nullptr);
int setRcsId(const char *rcsId);
static const char *levelName(LogLevel level);
@@ -247,8 +237,6 @@ public:
void doEventProgress(const char *name, double value, double total = 0);
void doEventCount(const char *name, uint64_t value);
void doEventValue(const char *name, double value);
- void doEventCollection(uint64_t collectionId, const char *name,
- const char *params);
void doEventState(const char *name, const char *value);
// Only for unit testing