diff --git a/.gradle/7.4.2/checksums/checksums.lock b/.gradle/7.4.2/checksums/checksums.lock new file mode 100644 index 0000000..bf70a7b Binary files /dev/null and b/.gradle/7.4.2/checksums/checksums.lock differ diff --git a/.gradle/7.4.2/checksums/md5-checksums.bin b/.gradle/7.4.2/checksums/md5-checksums.bin new file mode 100644 index 0000000..de3696d Binary files /dev/null and b/.gradle/7.4.2/checksums/md5-checksums.bin differ diff --git a/.gradle/7.4.2/checksums/sha1-checksums.bin b/.gradle/7.4.2/checksums/sha1-checksums.bin new file mode 100644 index 0000000..d0c64ba Binary files /dev/null and b/.gradle/7.4.2/checksums/sha1-checksums.bin differ diff --git a/.gradle/7.4.2/dependencies-accessors/dependencies-accessors.lock b/.gradle/7.4.2/dependencies-accessors/dependencies-accessors.lock new file mode 100644 index 0000000..51334d3 Binary files /dev/null and b/.gradle/7.4.2/dependencies-accessors/dependencies-accessors.lock differ diff --git a/.gradle/7.4.2/dependencies-accessors/gc.properties b/.gradle/7.4.2/dependencies-accessors/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/.gradle/7.4.2/executionHistory/executionHistory.bin b/.gradle/7.4.2/executionHistory/executionHistory.bin new file mode 100644 index 0000000..6813477 Binary files /dev/null and b/.gradle/7.4.2/executionHistory/executionHistory.bin differ diff --git a/.gradle/7.4.2/executionHistory/executionHistory.lock b/.gradle/7.4.2/executionHistory/executionHistory.lock new file mode 100644 index 0000000..adc9c71 Binary files /dev/null and b/.gradle/7.4.2/executionHistory/executionHistory.lock differ diff --git a/.gradle/7.4.2/fileChanges/last-build.bin b/.gradle/7.4.2/fileChanges/last-build.bin new file mode 100644 index 0000000..f76dd23 Binary files /dev/null and b/.gradle/7.4.2/fileChanges/last-build.bin differ diff --git a/.gradle/7.4.2/fileHashes/fileHashes.bin b/.gradle/7.4.2/fileHashes/fileHashes.bin new file mode 100644 index 0000000..8625e4b Binary files /dev/null and b/.gradle/7.4.2/fileHashes/fileHashes.bin differ diff --git a/.gradle/7.4.2/fileHashes/fileHashes.lock b/.gradle/7.4.2/fileHashes/fileHashes.lock new file mode 100644 index 0000000..4b5d910 Binary files /dev/null and b/.gradle/7.4.2/fileHashes/fileHashes.lock differ diff --git a/.gradle/7.4.2/fileHashes/resourceHashesCache.bin b/.gradle/7.4.2/fileHashes/resourceHashesCache.bin new file mode 100644 index 0000000..00fc3ee Binary files /dev/null and b/.gradle/7.4.2/fileHashes/resourceHashesCache.bin differ diff --git a/.gradle/7.4.2/gc.properties b/.gradle/7.4.2/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock new file mode 100644 index 0000000..7c02f83 Binary files /dev/null and b/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ diff --git a/.gradle/buildOutputCleanup/cache.properties b/.gradle/buildOutputCleanup/cache.properties new file mode 100644 index 0000000..a9f86ee --- /dev/null +++ b/.gradle/buildOutputCleanup/cache.properties @@ -0,0 +1,2 @@ +#Mon Oct 17 16:38:48 EEST 2022 +gradle.version=7.4.2 diff --git a/.gradle/buildOutputCleanup/outputFiles.bin b/.gradle/buildOutputCleanup/outputFiles.bin new file mode 100644 index 0000000..2b2c86b Binary files /dev/null and b/.gradle/buildOutputCleanup/outputFiles.bin differ diff --git a/.gradle/file-system.probe b/.gradle/file-system.probe new file mode 100644 index 0000000..41ec606 Binary files /dev/null and b/.gradle/file-system.probe differ diff --git a/.gradle/vcs-1/gc.properties b/.gradle/vcs-1/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..cfed4e4 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +SLIP10-Android \ No newline at end of file diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..1bec35e --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,10 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..79ee123 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..b589d56 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..5404067 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,17 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..fdc392f --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml new file mode 100644 index 0000000..e1eea1d --- /dev/null +++ b/.idea/kotlinc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..775445d --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..7657ac7 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,37 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +plugins { + kotlin("jvm") version "1.7.20" + kotlin("plugin.serialization") version "1.7.20" + + application +} + +group = "com.radixdlt" +version = "1.0-SNAPSHOT" + + + +repositories { + mavenCentral() +} + +dependencies { + testImplementation(kotlin("test")) + + implementation("org.bouncycastle:bcprov-jdk15to18:1.70") + + testImplementation("org.assertj:assertj-core:3.23.1") +} + +tasks.test { + useJUnitPlatform() +} + +tasks.withType { + kotlinOptions.jvmTarget = "1.8" +} + +application { + mainClass.set("MainKt") +} diff --git a/build/classes/kotlin/main/META-INF/SLIP10-Android.kotlin_module b/build/classes/kotlin/main/META-INF/SLIP10-Android.kotlin_module new file mode 100644 index 0000000..1d1209e Binary files /dev/null and b/build/classes/kotlin/main/META-INF/SLIP10-Android.kotlin_module differ diff --git a/build/classes/kotlin/main/MainKt.class b/build/classes/kotlin/main/MainKt.class new file mode 100644 index 0000000..4ac2d67 Binary files /dev/null and b/build/classes/kotlin/main/MainKt.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/bip39/MnemonicKt$dirtyPhraseToMnemonicWords$1.class b/build/classes/kotlin/main/com/radixdlt/bip39/MnemonicKt$dirtyPhraseToMnemonicWords$1.class new file mode 100644 index 0000000..5be654d Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/bip39/MnemonicKt$dirtyPhraseToMnemonicWords$1.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/bip39/MnemonicKt$dirtyPhraseToMnemonicWords$2.class b/build/classes/kotlin/main/com/radixdlt/bip39/MnemonicKt$dirtyPhraseToMnemonicWords$2.class new file mode 100644 index 0000000..8a00cc7 Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/bip39/MnemonicKt$dirtyPhraseToMnemonicWords$2.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/bip39/MnemonicKt.class b/build/classes/kotlin/main/com/radixdlt/bip39/MnemonicKt.class new file mode 100644 index 0000000..84b38c3 Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/bip39/MnemonicKt.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/bip39/model/MnemonicWords.class b/build/classes/kotlin/main/com/radixdlt/bip39/model/MnemonicWords.class new file mode 100644 index 0000000..a33d4ed Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/bip39/model/MnemonicWords.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/bip39/wordlists/ChineseSimplifiedKt.class b/build/classes/kotlin/main/com/radixdlt/bip39/wordlists/ChineseSimplifiedKt.class new file mode 100644 index 0000000..341271e Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/bip39/wordlists/ChineseSimplifiedKt.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/bip39/wordlists/ChineseTraditionalKt.class b/build/classes/kotlin/main/com/radixdlt/bip39/wordlists/ChineseTraditionalKt.class new file mode 100644 index 0000000..5682313 Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/bip39/wordlists/ChineseTraditionalKt.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/bip39/wordlists/EnglishKt.class b/build/classes/kotlin/main/com/radixdlt/bip39/wordlists/EnglishKt.class new file mode 100644 index 0000000..e29f1d3 Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/bip39/wordlists/EnglishKt.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/bip39/wordlists/FrenchKt.class b/build/classes/kotlin/main/com/radixdlt/bip39/wordlists/FrenchKt.class new file mode 100644 index 0000000..7267440 Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/bip39/wordlists/FrenchKt.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/bip39/wordlists/ItalianKt.class b/build/classes/kotlin/main/com/radixdlt/bip39/wordlists/ItalianKt.class new file mode 100644 index 0000000..cbf142f Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/bip39/wordlists/ItalianKt.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/bip39/wordlists/JapaneseKt.class b/build/classes/kotlin/main/com/radixdlt/bip39/wordlists/JapaneseKt.class new file mode 100644 index 0000000..e1dd494 Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/bip39/wordlists/JapaneseKt.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/bip39/wordlists/KoreanKt.class b/build/classes/kotlin/main/com/radixdlt/bip39/wordlists/KoreanKt.class new file mode 100644 index 0000000..4458418 Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/bip39/wordlists/KoreanKt.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/bip39/wordlists/SpanishKt.class b/build/classes/kotlin/main/com/radixdlt/bip39/wordlists/SpanishKt.class new file mode 100644 index 0000000..e8af41a Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/bip39/wordlists/SpanishKt.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/bip44/BIP44$1$1.class b/build/classes/kotlin/main/com/radixdlt/bip44/BIP44$1$1.class new file mode 100644 index 0000000..8a50b09 Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/bip44/BIP44$1$1.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/bip44/BIP44$toString$1.class b/build/classes/kotlin/main/com/radixdlt/bip44/BIP44$toString$1.class new file mode 100644 index 0000000..3b8aec0 Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/bip44/BIP44$toString$1.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/bip44/BIP44.class b/build/classes/kotlin/main/com/radixdlt/bip44/BIP44.class new file mode 100644 index 0000000..a1542cb Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/bip44/BIP44.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/bip44/BIP44Element.class b/build/classes/kotlin/main/com/radixdlt/bip44/BIP44Element.class new file mode 100644 index 0000000..259287c Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/bip44/BIP44Element.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/bip44/BIP44Kt.class b/build/classes/kotlin/main/com/radixdlt/bip44/BIP44Kt.class new file mode 100644 index 0000000..876d1ac Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/bip44/BIP44Kt.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/crypto/ConvertersKt.class b/build/classes/kotlin/main/com/radixdlt/crypto/ConvertersKt.class new file mode 100644 index 0000000..87e6c0b Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/crypto/ConvertersKt.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/crypto/KeysKt.class b/build/classes/kotlin/main/com/radixdlt/crypto/KeysKt.class new file mode 100644 index 0000000..8a9c0b3 Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/crypto/KeysKt.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/crypto/base58/Base58Kt$alphabetIndices$2.class b/build/classes/kotlin/main/com/radixdlt/crypto/base58/Base58Kt$alphabetIndices$2.class new file mode 100644 index 0000000..57cf4ca Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/crypto/base58/Base58Kt$alphabetIndices$2.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/crypto/base58/Base58Kt.class b/build/classes/kotlin/main/com/radixdlt/crypto/base58/Base58Kt.class new file mode 100644 index 0000000..4f7c88b Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/crypto/base58/Base58Kt.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/crypto/ec/EllipticCurve.class b/build/classes/kotlin/main/com/radixdlt/crypto/ec/EllipticCurve.class new file mode 100644 index 0000000..249f02a Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/crypto/ec/EllipticCurve.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/crypto/ec/EllipticCurveKt$WhenMappings.class b/build/classes/kotlin/main/com/radixdlt/crypto/ec/EllipticCurveKt$WhenMappings.class new file mode 100644 index 0000000..479c403 Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/crypto/ec/EllipticCurveKt$WhenMappings.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/crypto/ec/EllipticCurveKt.class b/build/classes/kotlin/main/com/radixdlt/crypto/ec/EllipticCurveKt.class new file mode 100644 index 0000000..fd1aaaa Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/crypto/ec/EllipticCurveKt.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/crypto/ec/EllipticCurvePoint.class b/build/classes/kotlin/main/com/radixdlt/crypto/ec/EllipticCurvePoint.class new file mode 100644 index 0000000..ad0a5b1 Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/crypto/ec/EllipticCurvePoint.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/crypto/ec/EllipticCurvePointKt.class b/build/classes/kotlin/main/com/radixdlt/crypto/ec/EllipticCurvePointKt.class new file mode 100644 index 0000000..2ed85b2 Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/crypto/ec/EllipticCurvePointKt.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/crypto/ec/EllipticCurveSignerKt.class b/build/classes/kotlin/main/com/radixdlt/crypto/ec/EllipticCurveSignerKt.class new file mode 100644 index 0000000..66a6dcf Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/crypto/ec/EllipticCurveSignerKt.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/crypto/ec/EllipticCurveType.class b/build/classes/kotlin/main/com/radixdlt/crypto/ec/EllipticCurveType.class new file mode 100644 index 0000000..8286916 Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/crypto/ec/EllipticCurveType.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/crypto/hash/DigestParams$Sha256.class b/build/classes/kotlin/main/com/radixdlt/crypto/hash/DigestParams$Sha256.class new file mode 100644 index 0000000..1682e72 Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/crypto/hash/DigestParams$Sha256.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/crypto/hash/DigestParams$Sha512.class b/build/classes/kotlin/main/com/radixdlt/crypto/hash/DigestParams$Sha512.class new file mode 100644 index 0000000..697f238 Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/crypto/hash/DigestParams$Sha512.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/crypto/hash/DigestParams.class b/build/classes/kotlin/main/com/radixdlt/crypto/hash/DigestParams.class new file mode 100644 index 0000000..fc06f56 Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/crypto/hash/DigestParams.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/crypto/hash/ripemd160/Ripemd160Digest$Companion.class b/build/classes/kotlin/main/com/radixdlt/crypto/hash/ripemd160/Ripemd160Digest$Companion.class new file mode 100644 index 0000000..9e32244 Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/crypto/hash/ripemd160/Ripemd160Digest$Companion.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/crypto/hash/ripemd160/Ripemd160Digest.class b/build/classes/kotlin/main/com/radixdlt/crypto/hash/ripemd160/Ripemd160Digest.class new file mode 100644 index 0000000..c9b67ab Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/crypto/hash/ripemd160/Ripemd160Digest.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/crypto/hash/ripemd160/extensions/PublicExtensionsKt.class b/build/classes/kotlin/main/com/radixdlt/crypto/hash/ripemd160/extensions/PublicExtensionsKt.class new file mode 100644 index 0000000..da93052 Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/crypto/hash/ripemd160/extensions/PublicExtensionsKt.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/crypto/hash/sha256/Sha256.class b/build/classes/kotlin/main/com/radixdlt/crypto/hash/sha256/Sha256.class new file mode 100644 index 0000000..dd669f2 Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/crypto/hash/sha256/Sha256.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/crypto/hash/sha256/extensions/ArrayExtensionsKt.class b/build/classes/kotlin/main/com/radixdlt/crypto/hash/sha256/extensions/ArrayExtensionsKt.class new file mode 100644 index 0000000..2f23ded Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/crypto/hash/sha256/extensions/ArrayExtensionsKt.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/crypto/hash/sha256/extensions/ByteArrayExtensionsKt.class b/build/classes/kotlin/main/com/radixdlt/crypto/hash/sha256/extensions/ByteArrayExtensionsKt.class new file mode 100644 index 0000000..fd91e83 Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/crypto/hash/sha256/extensions/ByteArrayExtensionsKt.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/crypto/hash/sha256/extensions/ByteExtensionsKt.class b/build/classes/kotlin/main/com/radixdlt/crypto/hash/sha256/extensions/ByteExtensionsKt.class new file mode 100644 index 0000000..015f04c Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/crypto/hash/sha256/extensions/ByteExtensionsKt.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/crypto/hash/sha256/extensions/ConstantsKt.class b/build/classes/kotlin/main/com/radixdlt/crypto/hash/sha256/extensions/ConstantsKt.class new file mode 100644 index 0000000..5650c89 Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/crypto/hash/sha256/extensions/ConstantsKt.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/crypto/hash/sha256/extensions/IntArrayExtensionsKt.class b/build/classes/kotlin/main/com/radixdlt/crypto/hash/sha256/extensions/IntArrayExtensionsKt.class new file mode 100644 index 0000000..e905ee4 Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/crypto/hash/sha256/extensions/IntArrayExtensionsKt.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/crypto/hash/sha256/extensions/IntExtensionsKt.class b/build/classes/kotlin/main/com/radixdlt/crypto/hash/sha256/extensions/IntExtensionsKt.class new file mode 100644 index 0000000..9f49b1e Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/crypto/hash/sha256/extensions/IntExtensionsKt.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/crypto/hash/sha256/extensions/PublicExtensionsKt.class b/build/classes/kotlin/main/com/radixdlt/crypto/hash/sha256/extensions/PublicExtensionsKt.class new file mode 100644 index 0000000..836c8bf Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/crypto/hash/sha256/extensions/PublicExtensionsKt.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/crypto/kdf/PBKDF2$Companion.class b/build/classes/kotlin/main/com/radixdlt/crypto/kdf/PBKDF2$Companion.class new file mode 100644 index 0000000..b006767 Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/crypto/kdf/PBKDF2$Companion.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/crypto/kdf/PBKDF2.class b/build/classes/kotlin/main/com/radixdlt/crypto/kdf/PBKDF2.class new file mode 100644 index 0000000..3cac0d1 Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/crypto/kdf/PBKDF2.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/crypto/mac/Hmac$Companion.class b/build/classes/kotlin/main/com/radixdlt/crypto/mac/Hmac$Companion.class new file mode 100644 index 0000000..c7ef623 Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/crypto/mac/Hmac$Companion.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/crypto/mac/Hmac.class b/build/classes/kotlin/main/com/radixdlt/crypto/mac/Hmac.class new file mode 100644 index 0000000..b9d3ad1 Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/crypto/mac/Hmac.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/extensions/BigIntegerKt.class b/build/classes/kotlin/main/com/radixdlt/extensions/BigIntegerKt.class new file mode 100644 index 0000000..02f1b07 Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/extensions/BigIntegerKt.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/extensions/BitArrayKt.class b/build/classes/kotlin/main/com/radixdlt/extensions/BitArrayKt.class new file mode 100644 index 0000000..99832d7 Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/extensions/BitArrayKt.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/extensions/ByteArrayKt.class b/build/classes/kotlin/main/com/radixdlt/extensions/ByteArrayKt.class new file mode 100644 index 0000000..45d408f Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/extensions/ByteArrayKt.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/extensions/ByteListKt.class b/build/classes/kotlin/main/com/radixdlt/extensions/ByteListKt.class new file mode 100644 index 0000000..a11cbb7 Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/extensions/ByteListKt.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/extensions/IntKt.class b/build/classes/kotlin/main/com/radixdlt/extensions/IntKt.class new file mode 100644 index 0000000..5c1c027 Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/extensions/IntKt.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/hex/HexKt$encode$1.class b/build/classes/kotlin/main/com/radixdlt/hex/HexKt$encode$1.class new file mode 100644 index 0000000..f0b4d79 Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/hex/HexKt$encode$1.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/hex/HexKt.class b/build/classes/kotlin/main/com/radixdlt/hex/HexKt.class new file mode 100644 index 0000000..8d7e7aa Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/hex/HexKt.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/hex/extensions/ByteArrayExtensionsKt.class b/build/classes/kotlin/main/com/radixdlt/hex/extensions/ByteArrayExtensionsKt.class new file mode 100644 index 0000000..db6ff77 Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/hex/extensions/ByteArrayExtensionsKt.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/hex/extensions/ByteCollectionExtensionsKt.class b/build/classes/kotlin/main/com/radixdlt/hex/extensions/ByteCollectionExtensionsKt.class new file mode 100644 index 0000000..20ebc8e Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/hex/extensions/ByteCollectionExtensionsKt.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/hex/extensions/HexStringExtensionsKt.class b/build/classes/kotlin/main/com/radixdlt/hex/extensions/HexStringExtensionsKt.class new file mode 100644 index 0000000..7a747e0 Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/hex/extensions/HexStringExtensionsKt.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/hex/model/HexString.class b/build/classes/kotlin/main/com/radixdlt/hex/model/HexString.class new file mode 100644 index 0000000..f79c670 Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/hex/model/HexString.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/model/ConstantsKt.class b/build/classes/kotlin/main/com/radixdlt/model/ConstantsKt.class new file mode 100644 index 0000000..271543d Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/model/ConstantsKt.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/model/ECKeyPair.class b/build/classes/kotlin/main/com/radixdlt/model/ECKeyPair.class new file mode 100644 index 0000000..8fa4b0f Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/model/ECKeyPair.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/model/ECKeyPairKt.class b/build/classes/kotlin/main/com/radixdlt/model/ECKeyPairKt.class new file mode 100644 index 0000000..be6a840 Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/model/ECKeyPairKt.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/model/PrivateKey.class b/build/classes/kotlin/main/com/radixdlt/model/PrivateKey.class new file mode 100644 index 0000000..080d1d1 Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/model/PrivateKey.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/model/PublicKey.class b/build/classes/kotlin/main/com/radixdlt/model/PublicKey.class new file mode 100644 index 0000000..0311f61 Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/model/PublicKey.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/slip10/BIP32.class b/build/classes/kotlin/main/com/radixdlt/slip10/BIP32.class new file mode 100644 index 0000000..f68b9a0 Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/slip10/BIP32.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/slip10/ConverterKt.class b/build/classes/kotlin/main/com/radixdlt/slip10/ConverterKt.class new file mode 100644 index 0000000..f808f60 Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/slip10/ConverterKt.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/slip10/Slip10CurveKt$WhenMappings.class b/build/classes/kotlin/main/com/radixdlt/slip10/Slip10CurveKt$WhenMappings.class new file mode 100644 index 0000000..6f1fe67 Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/slip10/Slip10CurveKt$WhenMappings.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/slip10/Slip10CurveKt.class b/build/classes/kotlin/main/com/radixdlt/slip10/Slip10CurveKt.class new file mode 100644 index 0000000..2feaa4d Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/slip10/Slip10CurveKt.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/slip10/model/ConstantsKt.class b/build/classes/kotlin/main/com/radixdlt/slip10/model/ConstantsKt.class new file mode 100644 index 0000000..2286909 Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/slip10/model/ConstantsKt.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/slip10/model/ExtendedKey.class b/build/classes/kotlin/main/com/radixdlt/slip10/model/ExtendedKey.class new file mode 100644 index 0000000..d5e0615 Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/slip10/model/ExtendedKey.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/slip10/model/Seed.class b/build/classes/kotlin/main/com/radixdlt/slip10/model/Seed.class new file mode 100644 index 0000000..f2609d6 Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/slip10/model/Seed.class differ diff --git a/build/classes/kotlin/main/com/radixdlt/slip10/model/XPriv.class b/build/classes/kotlin/main/com/radixdlt/slip10/model/XPriv.class new file mode 100644 index 0000000..35a656a Binary files /dev/null and b/build/classes/kotlin/main/com/radixdlt/slip10/model/XPriv.class differ diff --git a/build/classes/kotlin/test/META-INF/SLIP10-Android.kotlin_module b/build/classes/kotlin/test/META-INF/SLIP10-Android.kotlin_module new file mode 100644 index 0000000..8c840dd Binary files /dev/null and b/build/classes/kotlin/test/META-INF/SLIP10-Android.kotlin_module differ diff --git a/build/classes/kotlin/test/com/radixdlt/bip39/MnemonicTest$MnemonicTestData.class b/build/classes/kotlin/test/com/radixdlt/bip39/MnemonicTest$MnemonicTestData.class new file mode 100644 index 0000000..f7295c9 Binary files /dev/null and b/build/classes/kotlin/test/com/radixdlt/bip39/MnemonicTest$MnemonicTestData.class differ diff --git a/build/classes/kotlin/test/com/radixdlt/bip39/MnemonicTest.class b/build/classes/kotlin/test/com/radixdlt/bip39/MnemonicTest.class new file mode 100644 index 0000000..4073095 Binary files /dev/null and b/build/classes/kotlin/test/com/radixdlt/bip39/MnemonicTest.class differ diff --git a/build/classes/kotlin/test/com/radixdlt/bip39/PhraseCleanupTest.class b/build/classes/kotlin/test/com/radixdlt/bip39/PhraseCleanupTest.class new file mode 100644 index 0000000..b3eb99b Binary files /dev/null and b/build/classes/kotlin/test/com/radixdlt/bip39/PhraseCleanupTest.class differ diff --git a/build/classes/kotlin/test/com/radixdlt/bip44/BIP44Test.class b/build/classes/kotlin/test/com/radixdlt/bip44/BIP44Test.class new file mode 100644 index 0000000..9a3bbeb Binary files /dev/null and b/build/classes/kotlin/test/com/radixdlt/bip44/BIP44Test.class differ diff --git a/build/classes/kotlin/test/com/radixdlt/crypto/base58/Base58Test.class b/build/classes/kotlin/test/com/radixdlt/crypto/base58/Base58Test.class new file mode 100644 index 0000000..62ed08e Binary files /dev/null and b/build/classes/kotlin/test/com/radixdlt/crypto/base58/Base58Test.class differ diff --git a/build/classes/kotlin/test/com/radixdlt/slip10/DerivationTest$DerivationVector.class b/build/classes/kotlin/test/com/radixdlt/slip10/DerivationTest$DerivationVector.class new file mode 100644 index 0000000..7c50ff3 Binary files /dev/null and b/build/classes/kotlin/test/com/radixdlt/slip10/DerivationTest$DerivationVector.class differ diff --git a/build/classes/kotlin/test/com/radixdlt/slip10/DerivationTest.class b/build/classes/kotlin/test/com/radixdlt/slip10/DerivationTest.class new file mode 100644 index 0000000..8c2a3a8 Binary files /dev/null and b/build/classes/kotlin/test/com/radixdlt/slip10/DerivationTest.class differ diff --git a/build/kotlin/SLIP10Android10SNAPSHOTjar-classes.txt b/build/kotlin/SLIP10Android10SNAPSHOTjar-classes.txt new file mode 100644 index 0000000..c6f2f3f --- /dev/null +++ b/build/kotlin/SLIP10Android10SNAPSHOTjar-classes.txt @@ -0,0 +1 @@ +/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/MainKt.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/bip39/MnemonicKt$dirtyPhraseToMnemonicWords$1.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/bip39/MnemonicKt$dirtyPhraseToMnemonicWords$2.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/bip39/MnemonicKt.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/bip39/model/MnemonicWords.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/bip39/wordlists/ChineseSimplifiedKt.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/bip39/wordlists/ChineseTraditionalKt.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/bip39/wordlists/EnglishKt.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/bip39/wordlists/FrenchKt.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/bip39/wordlists/ItalianKt.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/bip39/wordlists/JapaneseKt.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/bip39/wordlists/KoreanKt.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/bip39/wordlists/SpanishKt.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/bip44/BIP44$1$1.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/bip44/BIP44$toString$1.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/bip44/BIP44.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/bip44/BIP44Element.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/bip44/BIP44Kt.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/crypto/ConvertersKt.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/crypto/KeysKt.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/crypto/base58/Base58Kt$alphabetIndices$2.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/crypto/base58/Base58Kt.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/crypto/ec/EllipticCurve.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/crypto/ec/EllipticCurveKt$WhenMappings.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/crypto/ec/EllipticCurveKt.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/crypto/ec/EllipticCurvePoint.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/crypto/ec/EllipticCurvePointKt.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/crypto/ec/EllipticCurveSignerKt.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/crypto/ec/EllipticCurveType.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/crypto/hash/DigestParams$Sha256.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/crypto/hash/DigestParams$Sha512.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/crypto/hash/DigestParams.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/crypto/hash/ripemd160/Ripemd160Digest$Companion.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/crypto/hash/ripemd160/Ripemd160Digest.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/crypto/hash/ripemd160/extensions/PublicExtensionsKt.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/crypto/hash/sha256/Sha256.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/crypto/hash/sha256/extensions/ArrayExtensionsKt.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/crypto/hash/sha256/extensions/ByteArrayExtensionsKt.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/crypto/hash/sha256/extensions/ByteExtensionsKt.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/crypto/hash/sha256/extensions/ConstantsKt.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/crypto/hash/sha256/extensions/IntArrayExtensionsKt.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/crypto/hash/sha256/extensions/IntExtensionsKt.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/crypto/hash/sha256/extensions/PublicExtensionsKt.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/crypto/kdf/PBKDF2$Companion.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/crypto/kdf/PBKDF2.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/crypto/mac/Hmac$Companion.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/crypto/mac/Hmac.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/extensions/BigIntegerKt.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/extensions/BitArrayKt.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/extensions/ByteArrayKt.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/extensions/ByteListKt.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/extensions/IntKt.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/hex/HexKt$encode$1.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/hex/HexKt.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/hex/extensions/ByteArrayExtensionsKt.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/hex/extensions/ByteCollectionExtensionsKt.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/hex/extensions/HexStringExtensionsKt.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/hex/model/HexString.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/model/ConstantsKt.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/model/ECKeyPair.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/model/ECKeyPairKt.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/model/PrivateKey.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/model/PublicKey.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/slip10/BIP32.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/slip10/ConverterKt.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/slip10/Slip10CurveKt$WhenMappings.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/slip10/Slip10CurveKt.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/slip10/model/ConstantsKt.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/slip10/model/ExtendedKey.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/slip10/model/Seed.class:/Users/alexandrumurtaza/work/SLIP10-Android-old/build/classes/kotlin/main/com/radixdlt/slip10/model/XPriv.class \ No newline at end of file diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab b/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab new file mode 100644 index 0000000..196ab72 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream b/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream new file mode 100644 index 0000000..c157472 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream.len b/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream.len new file mode 100644 index 0000000..1541ba1 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream.len differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.len b/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.len new file mode 100644 index 0000000..2c09e2b Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.len differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.at b/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.at new file mode 100644 index 0000000..82b190e Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.at differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i b/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i new file mode 100644 index 0000000..661d0d3 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i.len b/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i.len new file mode 100644 index 0000000..131e265 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i.len differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab new file mode 100644 index 0000000..b54a824 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream new file mode 100644 index 0000000..4d60a62 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream.len b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream.len new file mode 100644 index 0000000..47add14 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream.len differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.len b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.len new file mode 100644 index 0000000..73e7fcf Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.len differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.values.at b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.values.at new file mode 100644 index 0000000..4006c46 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.values.at differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i new file mode 100644 index 0000000..033a5f6 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i.len b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i.len new file mode 100644 index 0000000..131e265 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i.len differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab new file mode 100644 index 0000000..4b13621 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream new file mode 100644 index 0000000..4d60a62 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len new file mode 100644 index 0000000..47add14 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.len b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.len new file mode 100644 index 0000000..73e7fcf Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.len differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at new file mode 100644 index 0000000..1034dac Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i new file mode 100644 index 0000000..033a5f6 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i.len b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i.len new file mode 100644 index 0000000..131e265 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i.len differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab new file mode 100644 index 0000000..0897cd4 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.keystream b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.keystream new file mode 100644 index 0000000..43002ae Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.keystream differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.keystream.len b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.keystream.len new file mode 100644 index 0000000..e492b55 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.keystream.len differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.len b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.len new file mode 100644 index 0000000..fd5292d Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.len differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.values.at b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.values.at new file mode 100644 index 0000000..0b6e671 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.values.at differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab_i b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab_i new file mode 100644 index 0000000..07ec5b7 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab_i differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab_i.len b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab_i.len new file mode 100644 index 0000000..131e265 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab_i.len differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab new file mode 100644 index 0000000..74cf959 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream new file mode 100644 index 0000000..d6ce1c2 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len new file mode 100644 index 0000000..3b5f92c Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len new file mode 100644 index 0000000..22c1c91 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at new file mode 100644 index 0000000..b235f97 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i new file mode 100644 index 0000000..403a407 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i.len b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i.len new file mode 100644 index 0000000..131e265 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i.len differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab new file mode 100644 index 0000000..3debe6a Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.keystream b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.keystream new file mode 100644 index 0000000..6f73555 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.keystream differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.keystream.len b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.keystream.len new file mode 100644 index 0000000..f4c96b1 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.keystream.len differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.len b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.len new file mode 100644 index 0000000..f6d81fe Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.len differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.values.at b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.values.at new file mode 100644 index 0000000..fb566f6 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.values.at differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab_i b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab_i new file mode 100644 index 0000000..8e9e428 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab_i differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab_i.len b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab_i.len new file mode 100644 index 0000000..131e265 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab_i.len differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab new file mode 100644 index 0000000..268f266 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream new file mode 100644 index 0000000..0e0fbb3 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream.len b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream.len new file mode 100644 index 0000000..9bbb4b7 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream.len differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.len b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.len new file mode 100644 index 0000000..a42d38f Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.len differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values new file mode 100644 index 0000000..d34819c Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.at b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.at new file mode 100644 index 0000000..78ba8fc Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.at differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.s b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.s new file mode 100644 index 0000000..f300682 --- /dev/null +++ b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.s @@ -0,0 +1 @@ +Ô¢ø™ï˜úòÏ‘ë„ü„ÐÔ•ë’ë’ë’ë’ë’ë’ë’ë’ë’ë’ë’ë’ë’Ý“á†Û‡ \ No newline at end of file diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i new file mode 100644 index 0000000..3bdee87 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i.len b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i.len new file mode 100644 index 0000000..131e265 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i.len differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab new file mode 100644 index 0000000..5d60145 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream new file mode 100644 index 0000000..01bce4d Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream.len b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream.len new file mode 100644 index 0000000..1541ba1 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream.len differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.len b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.len new file mode 100644 index 0000000..2c09e2b Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.len differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at new file mode 100644 index 0000000..fe9e8c9 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i new file mode 100644 index 0000000..29e8ddc Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i.len b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i.len new file mode 100644 index 0000000..131e265 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i.len differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab new file mode 100644 index 0000000..8c0a9e2 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream new file mode 100644 index 0000000..8cfc5b9 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream.len b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream.len new file mode 100644 index 0000000..8790089 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream.len differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.len b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.len new file mode 100644 index 0000000..a9f80ae Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.len differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values.at b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values.at new file mode 100644 index 0000000..bf2947f Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values.at differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i new file mode 100644 index 0000000..ee14f7b Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i.len b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i.len new file mode 100644 index 0000000..131e265 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i.len differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab new file mode 100644 index 0000000..84a8e9a Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream new file mode 100644 index 0000000..7f18167 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream.len b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream.len new file mode 100644 index 0000000..0e8b35d Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream.len differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.len b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.len new file mode 100644 index 0000000..ec8f944 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.len differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.values.at b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.values.at new file mode 100644 index 0000000..8b52f6f Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.values.at differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i new file mode 100644 index 0000000..8789787 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i.len b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i.len new file mode 100644 index 0000000..131e265 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i.len differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/counters.tab b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/counters.tab new file mode 100644 index 0000000..ae9046d --- /dev/null +++ b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/counters.tab @@ -0,0 +1,2 @@ +141 +0 \ No newline at end of file diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab new file mode 100644 index 0000000..76da4de Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream new file mode 100644 index 0000000..01bce4d Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream.len b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream.len new file mode 100644 index 0000000..1541ba1 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream.len differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.len b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.len new file mode 100644 index 0000000..2c09e2b Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.len differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.values.at b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.values.at new file mode 100644 index 0000000..c6cfe79 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.values.at differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i new file mode 100644 index 0000000..0389dad Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i.len b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i.len new file mode 100644 index 0000000..131e265 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i.len differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab new file mode 100644 index 0000000..8fafc6e Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream new file mode 100644 index 0000000..e006790 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream.len b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream.len new file mode 100644 index 0000000..905e671 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream.len differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.len b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.len new file mode 100644 index 0000000..c8fcfd5 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.len differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.values.at b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.values.at new file mode 100644 index 0000000..5466862 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.values.at differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i new file mode 100644 index 0000000..6fcc24f Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i.len b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i.len new file mode 100644 index 0000000..131e265 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i.len differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab new file mode 100644 index 0000000..87c8173 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream new file mode 100644 index 0000000..e0e9d3e Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream.len b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream.len new file mode 100644 index 0000000..3fceea4 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream.len differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.len b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.len new file mode 100644 index 0000000..1bc2f87 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.len differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.values b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.values new file mode 100644 index 0000000..7931437 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.values differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.at b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.at new file mode 100644 index 0000000..c2a572c Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.at differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.s b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.s new file mode 100644 index 0000000..951d291 --- /dev/null +++ b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.s @@ -0,0 +1 @@ +è~Ò€ü„Ê‘ó‹ÕÜÈãçêËÿÕÿÂüÀüÀüÌüéýÄûÕûÒûÎûÿúÆûôúäûøýèý \ No newline at end of file diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab_i b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab_i new file mode 100644 index 0000000..63ffdde Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab_i differ diff --git a/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab_i.len b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab_i.len new file mode 100644 index 0000000..4424406 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab_i.len differ diff --git a/build/kotlin/compileKotlin/cacheable/last-build.bin b/build/kotlin/compileKotlin/cacheable/last-build.bin new file mode 100644 index 0000000..aebbb62 Binary files /dev/null and b/build/kotlin/compileKotlin/cacheable/last-build.bin differ diff --git a/build/kotlin/compileKotlin/local-state/build-history.bin b/build/kotlin/compileKotlin/local-state/build-history.bin new file mode 100644 index 0000000..f23df99 Binary files /dev/null and b/build/kotlin/compileKotlin/local-state/build-history.bin differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/inputs/source-to-output.tab b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/inputs/source-to-output.tab new file mode 100644 index 0000000..b47e57d Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/inputs/source-to-output.tab differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream new file mode 100644 index 0000000..171b444 Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream.len b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream.len new file mode 100644 index 0000000..be9fd94 Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream.len differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.len b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.len new file mode 100644 index 0000000..ec8f944 Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.len differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.at b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.at new file mode 100644 index 0000000..4ee597f Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.at differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i new file mode 100644 index 0000000..25dfd0b Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i.len b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i.len new file mode 100644 index 0000000..131e265 Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i.len differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab new file mode 100644 index 0000000..cad66c6 Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream new file mode 100644 index 0000000..4eceecb Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream.len b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream.len new file mode 100644 index 0000000..09407ef Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream.len differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.len b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.len new file mode 100644 index 0000000..817b326 Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.len differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.values.at b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.values.at new file mode 100644 index 0000000..85c1eba Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.values.at differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i new file mode 100644 index 0000000..c967e03 Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i.len b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i.len new file mode 100644 index 0000000..131e265 Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i.len differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab new file mode 100644 index 0000000..4c54582 Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream new file mode 100644 index 0000000..4eceecb Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len new file mode 100644 index 0000000..09407ef Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.len b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.len new file mode 100644 index 0000000..817b326 Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.len differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at new file mode 100644 index 0000000..250b1b3 Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i new file mode 100644 index 0000000..c967e03 Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i.len b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i.len new file mode 100644 index 0000000..131e265 Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i.len differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab new file mode 100644 index 0000000..94db076 Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream new file mode 100644 index 0000000..7f6f85e Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len new file mode 100644 index 0000000..09407ef Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len new file mode 100644 index 0000000..817b326 Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at new file mode 100644 index 0000000..250b1b3 Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i new file mode 100644 index 0000000..cb7bfed Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i.len b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i.len new file mode 100644 index 0000000..131e265 Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i.len differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab new file mode 100644 index 0000000..5ce76ad Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream new file mode 100644 index 0000000..e1d4343 Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream.len b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream.len new file mode 100644 index 0000000..1275139 Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream.len differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.len b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.len new file mode 100644 index 0000000..fa606b6 Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.len differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.at b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.at new file mode 100644 index 0000000..22191dc Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.at differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i new file mode 100644 index 0000000..0424095 Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i.len b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i.len new file mode 100644 index 0000000..131e265 Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i.len differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab new file mode 100644 index 0000000..a669962 Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream new file mode 100644 index 0000000..20b3609 Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream.len b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream.len new file mode 100644 index 0000000..be9fd94 Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream.len differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.len b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.len new file mode 100644 index 0000000..ec8f944 Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.len differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at new file mode 100644 index 0000000..3d09a44 Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i new file mode 100644 index 0000000..a26e9d6 Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i.len b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i.len new file mode 100644 index 0000000..131e265 Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i.len differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/counters.tab b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/counters.tab new file mode 100644 index 0000000..3d952e7 --- /dev/null +++ b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/counters.tab @@ -0,0 +1,2 @@ +7 +0 \ No newline at end of file diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/file-to-id.tab b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/file-to-id.tab new file mode 100644 index 0000000..74a4a4d Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/file-to-id.tab differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream new file mode 100644 index 0000000..20b3609 Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream.len b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream.len new file mode 100644 index 0000000..be9fd94 Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream.len differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.len b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.len new file mode 100644 index 0000000..ec8f944 Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.len differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.values.at b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.values.at new file mode 100644 index 0000000..25454f3 Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.values.at differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i new file mode 100644 index 0000000..12c2cf8 Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i.len b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i.len new file mode 100644 index 0000000..131e265 Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i.len differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/id-to-file.tab b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/id-to-file.tab new file mode 100644 index 0000000..892faf8 Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/id-to-file.tab differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream new file mode 100644 index 0000000..2459ed6 Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream.len b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream.len new file mode 100644 index 0000000..379d85c Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream.len differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.len b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.len new file mode 100644 index 0000000..817b326 Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.len differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.values.at b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.values.at new file mode 100644 index 0000000..1bb6851 Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.values.at differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i new file mode 100644 index 0000000..0667ccd Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i.len b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i.len new file mode 100644 index 0000000..131e265 Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i.len differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/lookups.tab b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/lookups.tab new file mode 100644 index 0000000..e7cb8e5 Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/lookups.tab differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream new file mode 100644 index 0000000..f8455fe Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream.len b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream.len new file mode 100644 index 0000000..faffef7 Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream.len differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/lookups.tab.len b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/lookups.tab.len new file mode 100644 index 0000000..6a08eee Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/lookups.tab.len differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.at b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.at new file mode 100644 index 0000000..8ddf79f Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.at differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/lookups.tab_i b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/lookups.tab_i new file mode 100644 index 0000000..9139696 Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/lookups.tab_i differ diff --git a/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/lookups.tab_i.len b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/lookups.tab_i.len new file mode 100644 index 0000000..131e265 Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/caches-jvm/lookups/lookups.tab_i.len differ diff --git a/build/kotlin/compileTestKotlin/cacheable/last-build.bin b/build/kotlin/compileTestKotlin/cacheable/last-build.bin new file mode 100644 index 0000000..8e33f28 Binary files /dev/null and b/build/kotlin/compileTestKotlin/cacheable/last-build.bin differ diff --git a/build/kotlin/compileTestKotlin/local-state/build-history.bin b/build/kotlin/compileTestKotlin/local-state/build-history.bin new file mode 100644 index 0000000..0b0b2bd Binary files /dev/null and b/build/kotlin/compileTestKotlin/local-state/build-history.bin differ diff --git a/build/libs/SLIP10-Android-1.0-SNAPSHOT.jar b/build/libs/SLIP10-Android-1.0-SNAPSHOT.jar new file mode 100644 index 0000000..0f9e707 Binary files /dev/null and b/build/libs/SLIP10-Android-1.0-SNAPSHOT.jar differ diff --git a/build/reports/tests/test/classes/com.radixdlt.bip39.MnemonicTest.html b/build/reports/tests/test/classes/com.radixdlt.bip39.MnemonicTest.html new file mode 100644 index 0000000..c5be790 --- /dev/null +++ b/build/reports/tests/test/classes/com.radixdlt.bip39.MnemonicTest.html @@ -0,0 +1,141 @@ + + + + + +Test results - MnemonicTest + + + + + +
+

MnemonicTest

+ +
+ + + + + +
+
+ + + + + + + +
+
+
10
+

tests

+
+
+
+
0
+

failures

+
+
+
+
0
+

ignored

+
+
+
+
0.375s
+

duration

+
+
+
+
+
+
100%
+

successful

+
+
+
+
+ +
+

Tests

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TestDurationResult
entropyToMnemonic()0.001spassed
generatesValidPhrases()0.064spassed
mnemonicToEntropy()0.026spassed
mnemonicToMasterKey()0.214spassed
mnemonicToSeed()0.051spassed
mnemonicVerify()0spassed
throwsOnEmptyString()0.004spassed
throwsOnWrongChecksum()0spassed
throwsOnWrongEntropySize()0.015spassed
throwsOnWrongNumberOfWords()0spassed
+
+
+ +
+ + diff --git a/build/reports/tests/test/classes/com.radixdlt.bip39.PhraseCleanupTest.html b/build/reports/tests/test/classes/com.radixdlt.bip39.PhraseCleanupTest.html new file mode 100644 index 0000000..12a9afa --- /dev/null +++ b/build/reports/tests/test/classes/com.radixdlt.bip39.PhraseCleanupTest.html @@ -0,0 +1,116 @@ + + + + + +Test results - PhraseCleanupTest + + + + + +
+

PhraseCleanupTest

+ +
+ + + + + +
+
+ + + + + + + +
+
+
5
+

tests

+
+
+
+
0
+

failures

+
+
+
+
0
+

ignored

+
+
+
+
0.004s
+

duration

+
+
+
+
+
+
100%
+

successful

+
+
+
+
+ +
+

Tests

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TestDurationResult
allInCombination()0spassed
fixesCase()0.001spassed
negativeTest()0spassed
removesSpaceInBetween()0spassed
trims()0.003spassed
+
+
+ +
+ + diff --git a/build/reports/tests/test/classes/com.radixdlt.bip44.BIP44Test.html b/build/reports/tests/test/classes/com.radixdlt.bip44.BIP44Test.html new file mode 100644 index 0000000..4101720 --- /dev/null +++ b/build/reports/tests/test/classes/com.radixdlt.bip44.BIP44Test.html @@ -0,0 +1,126 @@ + + + + + +Test results - BIP44Test + + + + + +
+

BIP44Test

+ +
+ + + + + +
+
+ + + + + + + +
+
+
7
+

tests

+
+
+
+
0
+

failures

+
+
+
+
0
+

ignored

+
+
+
+
0.007s
+

duration

+
+
+
+
+
+
100%
+

successful

+
+
+
+
+ +
+

Tests

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TestDurationResult
fromPathWork()0.001spassed
incrementWorks()0spassed
parsingFailsForBadInput()0spassed
parsingFailsForEmptyInput()0.001spassed
parsingFailsForMissingNumber()0spassed
toStringFromIntoWorks()0.005spassed
toStringWorks()0spassed
+
+
+ +
+ + diff --git a/build/reports/tests/test/classes/com.radixdlt.crypto.base58.Base58Test.html b/build/reports/tests/test/classes/com.radixdlt.crypto.base58.Base58Test.html new file mode 100644 index 0000000..7165720 --- /dev/null +++ b/build/reports/tests/test/classes/com.radixdlt.crypto.base58.Base58Test.html @@ -0,0 +1,101 @@ + + + + + +Test results - Base58Test + + + + + +
+

Base58Test

+ +
+ + + + + +
+
+ + + + + + + +
+
+
2
+

tests

+
+
+
+
0
+

failures

+
+
+
+
0
+

ignored

+
+
+
+
0s
+

duration

+
+
+
+
+
+
100%
+

successful

+
+
+
+
+ +
+

Tests

+ + + + + + + + + + + + + + + + + + +
TestDurationResult
decodingFromBase58Works()0spassed
encodingToBase58Works()0spassed
+
+
+ +
+ + diff --git a/build/reports/tests/test/classes/com.radixdlt.slip10.DerivationTest.html b/build/reports/tests/test/classes/com.radixdlt.slip10.DerivationTest.html new file mode 100644 index 0000000..1e35c14 --- /dev/null +++ b/build/reports/tests/test/classes/com.radixdlt.slip10.DerivationTest.html @@ -0,0 +1,101 @@ + + + + + +Test results - DerivationTest + + + + + +
+

DerivationTest

+ +
+ + + + + +
+
+ + + + + + + +
+
+
2
+

tests

+
+
+
+
0
+

failures

+
+
+
+
0
+

ignored

+
+
+
+
0.027s
+

duration

+
+
+
+
+
+
100%
+

successful

+
+
+
+
+ +
+

Tests

+ + + + + + + + + + + + + + + + + + +
TestDurationResult
createdKeyHasKeypair()0.002spassed
generateKeysFromSeed()0.025spassed
+
+
+ +
+ + diff --git a/build/reports/tests/test/css/base-style.css b/build/reports/tests/test/css/base-style.css new file mode 100644 index 0000000..4afa73e --- /dev/null +++ b/build/reports/tests/test/css/base-style.css @@ -0,0 +1,179 @@ + +body { + margin: 0; + padding: 0; + font-family: sans-serif; + font-size: 12pt; +} + +body, a, a:visited { + color: #303030; +} + +#content { + padding-left: 50px; + padding-right: 50px; + padding-top: 30px; + padding-bottom: 30px; +} + +#content h1 { + font-size: 160%; + margin-bottom: 10px; +} + +#footer { + margin-top: 100px; + font-size: 80%; + white-space: nowrap; +} + +#footer, #footer a { + color: #a0a0a0; +} + +#line-wrapping-toggle { + vertical-align: middle; +} + +#label-for-line-wrapping-toggle { + vertical-align: middle; +} + +ul { + margin-left: 0; +} + +h1, h2, h3 { + white-space: nowrap; +} + +h2 { + font-size: 120%; +} + +ul.tabLinks { + padding-left: 0; + padding-top: 10px; + padding-bottom: 10px; + overflow: auto; + min-width: 800px; + width: auto !important; + width: 800px; +} + +ul.tabLinks li { + float: left; + height: 100%; + list-style: none; + padding-left: 10px; + padding-right: 10px; + padding-top: 5px; + padding-bottom: 5px; + margin-bottom: 0; + -moz-border-radius: 7px; + border-radius: 7px; + margin-right: 25px; + border: solid 1px #d4d4d4; + background-color: #f0f0f0; +} + +ul.tabLinks li:hover { + background-color: #fafafa; +} + +ul.tabLinks li.selected { + background-color: #c5f0f5; + border-color: #c5f0f5; +} + +ul.tabLinks a { + font-size: 120%; + display: block; + outline: none; + text-decoration: none; + margin: 0; + padding: 0; +} + +ul.tabLinks li h2 { + margin: 0; + padding: 0; +} + +div.tab { +} + +div.selected { + display: block; +} + +div.deselected { + display: none; +} + +div.tab table { + min-width: 350px; + width: auto !important; + width: 350px; + border-collapse: collapse; +} + +div.tab th, div.tab table { + border-bottom: solid #d0d0d0 1px; +} + +div.tab th { + text-align: left; + white-space: nowrap; + padding-left: 6em; +} + +div.tab th:first-child { + padding-left: 0; +} + +div.tab td { + white-space: nowrap; + padding-left: 6em; + padding-top: 5px; + padding-bottom: 5px; +} + +div.tab td:first-child { + padding-left: 0; +} + +div.tab td.numeric, div.tab th.numeric { + text-align: right; +} + +span.code { + display: inline-block; + margin-top: 0em; + margin-bottom: 1em; +} + +span.code pre { + font-size: 11pt; + padding-top: 10px; + padding-bottom: 10px; + padding-left: 10px; + padding-right: 10px; + margin: 0; + background-color: #f7f7f7; + border: solid 1px #d0d0d0; + min-width: 700px; + width: auto !important; + width: 700px; +} + +span.wrapped pre { + word-wrap: break-word; + white-space: pre-wrap; + word-break: break-all; +} + +label.hidden { + display: none; +} \ No newline at end of file diff --git a/build/reports/tests/test/css/style.css b/build/reports/tests/test/css/style.css new file mode 100644 index 0000000..3dc4913 --- /dev/null +++ b/build/reports/tests/test/css/style.css @@ -0,0 +1,84 @@ + +#summary { + margin-top: 30px; + margin-bottom: 40px; +} + +#summary table { + border-collapse: collapse; +} + +#summary td { + vertical-align: top; +} + +.breadcrumbs, .breadcrumbs a { + color: #606060; +} + +.infoBox { + width: 110px; + padding-top: 15px; + padding-bottom: 15px; + text-align: center; +} + +.infoBox p { + margin: 0; +} + +.counter, .percent { + font-size: 120%; + font-weight: bold; + margin-bottom: 8px; +} + +#duration { + width: 125px; +} + +#successRate, .summaryGroup { + border: solid 2px #d0d0d0; + -moz-border-radius: 10px; + border-radius: 10px; +} + +#successRate { + width: 140px; + margin-left: 35px; +} + +#successRate .percent { + font-size: 180%; +} + +.success, .success a { + color: #008000; +} + +div.success, #successRate.success { + background-color: #bbd9bb; + border-color: #008000; +} + +.failures, .failures a { + color: #b60808; +} + +.skipped, .skipped a { + color: #c09853; +} + +div.failures, #successRate.failures { + background-color: #ecdada; + border-color: #b60808; +} + +ul.linkList { + padding-left: 0; +} + +ul.linkList li { + list-style: none; + margin-bottom: 5px; +} diff --git a/build/reports/tests/test/index.html b/build/reports/tests/test/index.html new file mode 100644 index 0000000..aed00d0 --- /dev/null +++ b/build/reports/tests/test/index.html @@ -0,0 +1,203 @@ + + + + + +Test results - Test Summary + + + + + +
+

Test Summary

+
+ + + + + +
+
+ + + + + + + +
+
+
26
+

tests

+
+
+
+
0
+

failures

+
+
+
+
0
+

ignored

+
+
+
+
0.413s
+

duration

+
+
+
+
+
+
100%
+

successful

+
+
+
+
+ +
+

Packages

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PackageTestsFailuresIgnoredDurationSuccess rate
+com.radixdlt.bip39 +15000.379s100%
+com.radixdlt.bip44 +7000.007s100%
+com.radixdlt.crypto.base58 +2000s100%
+com.radixdlt.slip10 +2000.027s100%
+
+
+

Classes

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ClassTestsFailuresIgnoredDurationSuccess rate
+com.radixdlt.bip39.MnemonicTest +10000.375s100%
+com.radixdlt.bip39.PhraseCleanupTest +5000.004s100%
+com.radixdlt.bip44.BIP44Test +7000.007s100%
+com.radixdlt.crypto.base58.Base58Test +2000s100%
+com.radixdlt.slip10.DerivationTest +2000.027s100%
+
+
+ +
+ + diff --git a/build/reports/tests/test/js/report.js b/build/reports/tests/test/js/report.js new file mode 100644 index 0000000..83bab4a --- /dev/null +++ b/build/reports/tests/test/js/report.js @@ -0,0 +1,194 @@ +(function (window, document) { + "use strict"; + + var tabs = {}; + + function changeElementClass(element, classValue) { + if (element.getAttribute("className")) { + element.setAttribute("className", classValue); + } else { + element.setAttribute("class", classValue); + } + } + + function getClassAttribute(element) { + if (element.getAttribute("className")) { + return element.getAttribute("className"); + } else { + return element.getAttribute("class"); + } + } + + function addClass(element, classValue) { + changeElementClass(element, getClassAttribute(element) + " " + classValue); + } + + function removeClass(element, classValue) { + changeElementClass(element, getClassAttribute(element).replace(classValue, "")); + } + + function initTabs() { + var container = document.getElementById("tabs"); + + tabs.tabs = findTabs(container); + tabs.titles = findTitles(tabs.tabs); + tabs.headers = findHeaders(container); + tabs.select = select; + tabs.deselectAll = deselectAll; + tabs.select(0); + + return true; + } + + function getCheckBox() { + return document.getElementById("line-wrapping-toggle"); + } + + function getLabelForCheckBox() { + return document.getElementById("label-for-line-wrapping-toggle"); + } + + function findCodeBlocks() { + var spans = document.getElementById("tabs").getElementsByTagName("span"); + var codeBlocks = []; + for (var i = 0; i < spans.length; ++i) { + if (spans[i].className.indexOf("code") >= 0) { + codeBlocks.push(spans[i]); + } + } + return codeBlocks; + } + + function forAllCodeBlocks(operation) { + var codeBlocks = findCodeBlocks(); + + for (var i = 0; i < codeBlocks.length; ++i) { + operation(codeBlocks[i], "wrapped"); + } + } + + function toggleLineWrapping() { + var checkBox = getCheckBox(); + + if (checkBox.checked) { + forAllCodeBlocks(addClass); + } else { + forAllCodeBlocks(removeClass); + } + } + + function initControls() { + if (findCodeBlocks().length > 0) { + var checkBox = getCheckBox(); + var label = getLabelForCheckBox(); + + checkBox.onclick = toggleLineWrapping; + checkBox.checked = false; + + removeClass(label, "hidden"); + } + } + + function switchTab() { + var id = this.id.substr(1); + + for (var i = 0; i < tabs.tabs.length; i++) { + if (tabs.tabs[i].id === id) { + tabs.select(i); + break; + } + } + + return false; + } + + function select(i) { + this.deselectAll(); + + changeElementClass(this.tabs[i], "tab selected"); + changeElementClass(this.headers[i], "selected"); + + while (this.headers[i].firstChild) { + this.headers[i].removeChild(this.headers[i].firstChild); + } + + var h2 = document.createElement("H2"); + + h2.appendChild(document.createTextNode(this.titles[i])); + this.headers[i].appendChild(h2); + } + + function deselectAll() { + for (var i = 0; i < this.tabs.length; i++) { + changeElementClass(this.tabs[i], "tab deselected"); + changeElementClass(this.headers[i], "deselected"); + + while (this.headers[i].firstChild) { + this.headers[i].removeChild(this.headers[i].firstChild); + } + + var a = document.createElement("A"); + + a.setAttribute("id", "ltab" + i); + a.setAttribute("href", "#tab" + i); + a.onclick = switchTab; + a.appendChild(document.createTextNode(this.titles[i])); + + this.headers[i].appendChild(a); + } + } + + function findTabs(container) { + return findChildElements(container, "DIV", "tab"); + } + + function findHeaders(container) { + var owner = findChildElements(container, "UL", "tabLinks"); + return findChildElements(owner[0], "LI", null); + } + + function findTitles(tabs) { + var titles = []; + + for (var i = 0; i < tabs.length; i++) { + var tab = tabs[i]; + var header = findChildElements(tab, "H2", null)[0]; + + header.parentNode.removeChild(header); + + if (header.innerText) { + titles.push(header.innerText); + } else { + titles.push(header.textContent); + } + } + + return titles; + } + + function findChildElements(container, name, targetClass) { + var elements = []; + var children = container.childNodes; + + for (var i = 0; i < children.length; i++) { + var child = children.item(i); + + if (child.nodeType === 1 && child.nodeName === name) { + if (targetClass && child.className.indexOf(targetClass) < 0) { + continue; + } + + elements.push(child); + } + } + + return elements; + } + + // Entry point. + + window.onload = function() { + initTabs(); + initControls(); + }; +} (window, window.document)); \ No newline at end of file diff --git a/build/reports/tests/test/packages/com.radixdlt.bip39.html b/build/reports/tests/test/packages/com.radixdlt.bip39.html new file mode 100644 index 0000000..32a1359 --- /dev/null +++ b/build/reports/tests/test/packages/com.radixdlt.bip39.html @@ -0,0 +1,113 @@ + + + + + +Test results - Package com.radixdlt.bip39 + + + + + +
+

Package com.radixdlt.bip39

+ +
+ + + + + +
+
+ + + + + + + +
+
+
15
+

tests

+
+
+
+
0
+

failures

+
+
+
+
0
+

ignored

+
+
+
+
0.379s
+

duration

+
+
+
+
+
+
100%
+

successful

+
+
+
+
+ +
+

Classes

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
ClassTestsFailuresIgnoredDurationSuccess rate
+MnemonicTest +10000.375s100%
+PhraseCleanupTest +5000.004s100%
+
+
+ +
+ + diff --git a/build/reports/tests/test/packages/com.radixdlt.bip44.html b/build/reports/tests/test/packages/com.radixdlt.bip44.html new file mode 100644 index 0000000..97af83a --- /dev/null +++ b/build/reports/tests/test/packages/com.radixdlt.bip44.html @@ -0,0 +1,103 @@ + + + + + +Test results - Package com.radixdlt.bip44 + + + + + +
+

Package com.radixdlt.bip44

+ +
+ + + + + +
+
+ + + + + + + +
+
+
7
+

tests

+
+
+
+
0
+

failures

+
+
+
+
0
+

ignored

+
+
+
+
0.007s
+

duration

+
+
+
+
+
+
100%
+

successful

+
+
+
+
+ +
+

Classes

+ + + + + + + + + + + + + + + + + + + +
ClassTestsFailuresIgnoredDurationSuccess rate
+BIP44Test +7000.007s100%
+
+
+ +
+ + diff --git a/build/reports/tests/test/packages/com.radixdlt.crypto.base58.html b/build/reports/tests/test/packages/com.radixdlt.crypto.base58.html new file mode 100644 index 0000000..1bbab18 --- /dev/null +++ b/build/reports/tests/test/packages/com.radixdlt.crypto.base58.html @@ -0,0 +1,103 @@ + + + + + +Test results - Package com.radixdlt.crypto.base58 + + + + + +
+

Package com.radixdlt.crypto.base58

+ +
+ + + + + +
+
+ + + + + + + +
+
+
2
+

tests

+
+
+
+
0
+

failures

+
+
+
+
0
+

ignored

+
+
+
+
0s
+

duration

+
+
+
+
+
+
100%
+

successful

+
+
+
+
+ +
+

Classes

+ + + + + + + + + + + + + + + + + + + +
ClassTestsFailuresIgnoredDurationSuccess rate
+Base58Test +2000s100%
+
+
+ +
+ + diff --git a/build/reports/tests/test/packages/com.radixdlt.slip10.html b/build/reports/tests/test/packages/com.radixdlt.slip10.html new file mode 100644 index 0000000..36447f6 --- /dev/null +++ b/build/reports/tests/test/packages/com.radixdlt.slip10.html @@ -0,0 +1,103 @@ + + + + + +Test results - Package com.radixdlt.slip10 + + + + + +
+

Package com.radixdlt.slip10

+ +
+ + + + + +
+
+ + + + + + + +
+
+
2
+

tests

+
+
+
+
0
+

failures

+
+
+
+
0
+

ignored

+
+
+
+
0.027s
+

duration

+
+
+
+
+
+
100%
+

successful

+
+
+
+
+ +
+

Classes

+ + + + + + + + + + + + + + + + + + + +
ClassTestsFailuresIgnoredDurationSuccess rate
+DerivationTest +2000.027s100%
+
+
+ +
+ + diff --git a/build/test-results/test/TEST-com.radixdlt.bip39.MnemonicTest.xml b/build/test-results/test/TEST-com.radixdlt.bip39.MnemonicTest.xml new file mode 100644 index 0000000..4f38fc6 --- /dev/null +++ b/build/test-results/test/TEST-com.radixdlt.bip39.MnemonicTest.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/build/test-results/test/TEST-com.radixdlt.bip39.PhraseCleanupTest.xml b/build/test-results/test/TEST-com.radixdlt.bip39.PhraseCleanupTest.xml new file mode 100644 index 0000000..3b212ec --- /dev/null +++ b/build/test-results/test/TEST-com.radixdlt.bip39.PhraseCleanupTest.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/build/test-results/test/TEST-com.radixdlt.bip44.BIP44Test.xml b/build/test-results/test/TEST-com.radixdlt.bip44.BIP44Test.xml new file mode 100644 index 0000000..098c12c --- /dev/null +++ b/build/test-results/test/TEST-com.radixdlt.bip44.BIP44Test.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/build/test-results/test/TEST-com.radixdlt.crypto.base58.Base58Test.xml b/build/test-results/test/TEST-com.radixdlt.crypto.base58.Base58Test.xml new file mode 100644 index 0000000..cd12dfd --- /dev/null +++ b/build/test-results/test/TEST-com.radixdlt.crypto.base58.Base58Test.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/build/test-results/test/TEST-com.radixdlt.slip10.DerivationTest.xml b/build/test-results/test/TEST-com.radixdlt.slip10.DerivationTest.xml new file mode 100644 index 0000000..4610de9 --- /dev/null +++ b/build/test-results/test/TEST-com.radixdlt.slip10.DerivationTest.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/build/test-results/test/binary/output.bin b/build/test-results/test/binary/output.bin new file mode 100644 index 0000000..e69de29 diff --git a/build/test-results/test/binary/output.bin.idx b/build/test-results/test/binary/output.bin.idx new file mode 100644 index 0000000..f76dd23 Binary files /dev/null and b/build/test-results/test/binary/output.bin.idx differ diff --git a/build/test-results/test/binary/results.bin b/build/test-results/test/binary/results.bin new file mode 100644 index 0000000..8fd42ca Binary files /dev/null and b/build/test-results/test/binary/results.bin differ diff --git a/build/tmp/jar/MANIFEST.MF b/build/tmp/jar/MANIFEST.MF new file mode 100644 index 0000000..58630c0 --- /dev/null +++ b/build/tmp/jar/MANIFEST.MF @@ -0,0 +1,2 @@ +Manifest-Version: 1.0 + diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..7fc6f1f --- /dev/null +++ b/gradle.properties @@ -0,0 +1 @@ +kotlin.code.style=official diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..249e583 Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..60c76b3 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists \ No newline at end of file diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..1b6c787 --- /dev/null +++ b/gradlew @@ -0,0 +1,234 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..ac1b06f --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..3d7e802 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,3 @@ + +rootProject.name = "SLIP10-Android" + diff --git a/src/main/kotlin/Main.kt b/src/main/kotlin/Main.kt new file mode 100644 index 0000000..2667288 --- /dev/null +++ b/src/main/kotlin/Main.kt @@ -0,0 +1,36 @@ +import com.radixdlt.slip10.toNoPrefixHexString +import com.radixdlt.slip10.toKey +import com.radixdlt.bip39.mnemonicToEntropy +import com.radixdlt.bip39.model.MnemonicWords +import com.radixdlt.bip39.toSeed +import com.radixdlt.bip39.wordlists.WORDLIST_ENGLISH +import com.radixdlt.crypto.ec.EllipticCurveType +import com.radixdlt.crypto.getCompressedPublicKey +import com.radixdlt.crypto.hash.sha256.extensions.toBytes +import com.radixdlt.extensions.toHexStringNoPrefix +import com.radixdlt.hex.extensions.toNoPrefixHexString + +fun main(args: Array) { + val mnemonic = MnemonicWords("noodle question hungry sail type offer grocery clay nation hello mixture forum") + val passphrase = "What" + + val entropy = mnemonic.mnemonicToEntropy(WORDLIST_ENGLISH) // use mnemonic.validate(WORDLIST_ENGLISH) + println("Entropy: ${entropy.toNoPrefixHexString()}") + + val seed = mnemonic.toSeed(passphrase) + println("Seed: ${seed.toNoPrefixHexString()}") + + val derivedKey = seed.toKey("m", EllipticCurveType.Secp256k1) + + println("PrivateKey: ${derivedKey.keyPair.privateKey.key.toHexStringNoPrefix()}") + println("PublicKey: ${derivedKey.keyPair.getCompressedPublicKey().toNoPrefixHexString()}") + + println("Chaincode: ${derivedKey.chainCode.toNoPrefixHexString()}") + println("Fingerprint: ${derivedKey.parentFingerprint.toBytes().toByteArray().toNoPrefixHexString()}") + + val obtainedPub = derivedKey.serialize(true) + println("xPub: $obtainedPub") + + val obtainedPrv = derivedKey.serialize() + println("xPriv: $obtainedPrv") +} diff --git a/src/main/kotlin/com/radixdlt/bip39/Mnemonic.kt b/src/main/kotlin/com/radixdlt/bip39/Mnemonic.kt new file mode 100644 index 0000000..1161b32 --- /dev/null +++ b/src/main/kotlin/com/radixdlt/bip39/Mnemonic.kt @@ -0,0 +1,140 @@ +package com.radixdlt.bip39 + +import com.radixdlt.slip10.model.Seed +import com.radixdlt.slip10.toKey +import com.radixdlt.bip39.model.MnemonicWords +import com.radixdlt.crypto.ec.EllipticCurveType +import com.radixdlt.crypto.kdf.PBKDF2 +import com.radixdlt.extensions.toBitArray +import com.radixdlt.extensions.toByteArray +import com.radixdlt.crypto.hash.sha256.extensions.sha256 +import java.security.SecureRandom +import kotlin.collections.ArrayList + + +fun dirtyPhraseToMnemonicWords(string: String) = MnemonicWords( + string.trim().lowercase().split(" ") + .asSequence() + .map { it.trim() } + .filter { it.isNotEmpty() } + .toList() +) + +/** + * Generates a seed buffer from a mnemonic phrase according to the BIP39 spec. + * The mnemonic phrase is given as a list of words and the seed can be salted using a password + */ +fun MnemonicWords.toSeed(passphrase: String = ""): Seed { + val pass = words.joinToString(" ") + val salt = "mnemonic$passphrase" + + return Seed(PBKDF2.derive(pass.toCharArray(), salt.toByteArray())) +} + +/** + * Converts a phrase (list of words) into a [ByteArray] entropy buffer according to the BIP39 spec + */ +fun mnemonicToEntropy(phrase: String, wordList: List) = + MnemonicWords(phrase).mnemonicToEntropy(wordList) + + +/** + * Converts a list of words into a [ByteArray] entropy buffer according to the BIP39 spec + */ +fun MnemonicWords.mnemonicToEntropy(wordList: List): ByteArray { + require(words.size % 3 <= 0) { "Word list size must be multiple of three words." } + + require(words.isNotEmpty()) { "Word list is empty." } + + val numTotalBits = words.size * 11 + val bitArray = BooleanArray(numTotalBits) + + for ((phraseIndex, word) in words.withIndex()) { + + val dictIndex = wordList.binarySearch(word) + require(dictIndex >= 0) { "word($word) not in known word list" } + + // Set the next 11 bits to the value of the index. + for (bit in 0..10) + bitArray[phraseIndex * 11 + bit] = dictIndex and (1 shl (10 - bit)) != 0 + } + + val numChecksumBits = numTotalBits / 33 + val numEntropyBits = numTotalBits - numChecksumBits + + val entropy = bitArray.toByteArray(numEntropyBits / 8) + + // Take the digest of the entropy. + val hash = entropy.sha256() + val hashBits = hash.toBitArray() + + // Check all the checksum bits. + for (i in 0 until numChecksumBits) + require(bitArray[numEntropyBits + i] == hashBits[i]) { "mnemonic checksum does not match" } + + return entropy +} + +fun MnemonicWords.toKey(path: String, passphrase: String = "", curveType: EllipticCurveType = EllipticCurveType.Secp256k1) = + toSeed(passphrase).toKey(path) + +/** + * Converts an entropy buffer to a list of words according to the BIP39 spec + */ +fun entropyToMnemonic(entropy: ByteArray, wordList: List): String { + if (entropy.size % 4 > 0) + throw RuntimeException("Entropy not multiple of 32 bits.") + + if (entropy.isEmpty()) + throw RuntimeException("Entropy is empty.") + + val hash = entropy.sha256() + val hashBits = hash.toBitArray() + + val entropyBits = entropy.toBitArray() + val checksumLengthBits = entropyBits.size / 32 + + val concatBits = BooleanArray(entropyBits.size + checksumLengthBits) + entropyBits.copyInto(concatBits) + hashBits.copyInto(concatBits, destinationOffset = entropyBits.size, endIndex = checksumLengthBits) + + val words = ArrayList().toMutableList() + val numWords = concatBits.size / 11 + for (i in 0 until numWords) { + var index = 0 + for (j in 0..10) { + index = index shl 1 + if (concatBits[i * 11 + j]) + index = index or 0x01 + } + words.add(wordList[index]) + } + + return words.joinToString(" ") +} + +/** + * Generates a mnemonic phrase, given a desired [strength] + * The [strength] represents the number of entropy bits this phrase encodes and needs to be a multiple of 32 + */ +fun generateMnemonic(strength: Int = 128, wordList: List): String { + + require(strength % 32 == 0) { "The entropy strength needs to be a multiple of 32" } + + val entropyBuffer = ByteArray(strength / 8) + SecureRandom().nextBytes(entropyBuffer) + + return entropyToMnemonic(entropyBuffer, wordList) +} + +/** + * Checks if MnemonicWords is a valid encoding according to the BIP39 spec + */ +fun MnemonicWords.validate(wordList: List) = try { + mnemonicToEntropy(wordList) + true +} catch (e: IllegalArgumentException) { +// e.printStackTrace() + false +} + diff --git a/src/main/kotlin/com/radixdlt/bip39/model/MnemonicWords.kt b/src/main/kotlin/com/radixdlt/bip39/model/MnemonicWords.kt new file mode 100644 index 0000000..485e8cd --- /dev/null +++ b/src/main/kotlin/com/radixdlt/bip39/model/MnemonicWords.kt @@ -0,0 +1,9 @@ +package com.radixdlt.bip39.model + +@JvmInline +value class MnemonicWords(val words: List) { + constructor(phrase: String) : this(phrase.split(" ")) + constructor(phrase: Array) : this(phrase.toList()) + + override fun toString() = words.joinToString(" ") +} diff --git a/src/main/kotlin/com/radixdlt/bip39/wordlists/ChineseSimplified.kt b/src/main/kotlin/com/radixdlt/bip39/wordlists/ChineseSimplified.kt new file mode 100644 index 0000000..2fb1a3a --- /dev/null +++ b/src/main/kotlin/com/radixdlt/bip39/wordlists/ChineseSimplified.kt @@ -0,0 +1,3 @@ +package com.radixdlt.bip39.wordlists + +val WORDLIST_CHINESE_SIMPLIFIED = listOf("çš„", "一", "是", "在", "ä¸", "了", "有", "å’Œ", "人", "è¿™", "中", "大", "为", "上", "个", "国", "我", "以", "è¦", "ä»–", "æ—¶", "æ¥", "用", "们", "生", "到", "作", "地", "于", "出", "å°±", "分", "对", "æˆ", "会", "å¯", "主", "å‘", "å¹´", "动", "åŒ", "å·¥", "也", "能", "下", "过", "å­", "说", "产", "ç§", "é¢", "而", "æ–¹", "åŽ", "多", "定", "è¡Œ", "å­¦", "法", "所", "æ°‘", "å¾—", "ç»", "å", "三", "之", "è¿›", "ç€", "ç­‰", "部", "度", "家", "电", "力", "里", "如", "æ°´", "化", "高", "自", "二", "ç†", "èµ·", "å°", "物", "现", "实", "加", "é‡", "都", "两", "体", "制", "机", "当", "使", "点", "从", "业", "本", "去", "把", "性", "好", "应", "å¼€", "它", "åˆ", "还", "å› ", "ç”±", "å…¶", "些", "然", "å‰", "外", "天", "政", "å››", "æ—¥", "é‚£", "社", "义", "事", "å¹³", "å½¢", "相", "å…¨", "表", "é—´", "æ ·", "与", "å…³", "å„", "é‡", "æ–°", "线", "内", "æ•°", "æ­£", "心", "å", "ä½ ", "明", "看", "原", "åˆ", "么", "利", "比", "或", "但", "è´¨", "æ°”", "第", "å‘", "é“", "命", "æ­¤", "å˜", "æ¡", "åª", "没", "结", "解", "é—®", "æ„", "建", "月", "å…¬", "æ— ", "ç³»", "军", "很", "情", "者", "最", "ç«‹", "代", "想", "å·²", "通", "并", "æ", "ç›´", "题", "å…š", "程", "展", "五", "æžœ", "æ–™", "象", "员", "é©", "ä½", "å…¥", "常", "æ–‡", "总", "次", "å“", "å¼", "æ´»", "设", "åŠ", "管", "特", "件", "é•¿", "求", "è€", "头", "基", "资", "è¾¹", "æµ", "è·¯", "级", "å°‘", "图", "å±±", "统", "接", "知", "较", "å°†", "组", "è§", "计", "别", "她", "手", "角", "期", "æ ¹", "论", "è¿", "农", "指", "几", "ä¹", "区", "强", "放", "决", "西", "被", "å¹²", "åš", "å¿…", "战", "å…ˆ", "回", "则", "ä»»", "å–", "æ®", "处", "队", "å—", "ç»™", "色", "å…‰", "é—¨", "å³", "ä¿", "æ²»", "北", "造", "百", "规", "热", "领", "七", "æµ·", "å£", "东", "导", "器", "压", "å¿—", "世", "金", "增", "争", "济", "阶", "æ²¹", "æ€", "术", "æž", "交", "å—", "è”", "什", "认", "å…­", "å…±", "æƒ", "收", "è¯", "改", "清", "美", "å†", "采", "转", "æ›´", "å•", "风", "切", "打", "白", "æ•™", "速", "花", "带", "安", "场", "身", "车", "例", "真", "务", "å…·", "万", "æ¯", "ç›®", "至", "è¾¾", "èµ°", "积", "示", "è®®", "声", "报", "æ–—", "完", "ç±»", "å…«", "离", "åŽ", "å", "ç¡®", "æ‰", "科", "å¼ ", "ä¿¡", "马", "节", "è¯", "ç±³", "æ•´", "空", "å…ƒ", "况", "今", "集", "温", "ä¼ ", "土", "许", "æ­¥", "群", "广", "石", "è®°", "需", "段", "ç ”", "ç•Œ", "拉", "æž—", "律", "å«", "且", "究", "观", "越", "织", "装", "å½±", "ç®—", "低", "æŒ", "音", "ä¼—", "书", "布", "å¤", "容", "å„¿", "é¡»", "é™…", "商", "éž", "验", "è¿ž", "æ–­", "æ·±", "éš¾", "è¿‘", "矿", "åƒ", "周", "委", "ç´ ", "技", "备", "åŠ", "办", "é’", "çœ", "列", "ä¹ ", "å“", "约", "支", "般", "å²", "æ„Ÿ", "劳", "便", "团", "å¾€", "é…¸", "历", "市", "å…‹", "何", "除", "消", "æž„", "府", "称", "太", "准", "ç²¾", "值", "å·", "率", "æ—", "ç»´", "划", "选", "æ ‡", "写", "å­˜", "候", "毛", "亲", "å¿«", "效", "æ–¯", "院", "查", "江", "åž‹", "眼", "王", "按", "æ ¼", "å…»", "易", "ç½®", "æ´¾", "层", "片", "始", "å´", "专", "状", "育", "厂", "京", "识", "适", "属", "圆", "包", "ç«", "ä½", "è°ƒ", "满", "县", "å±€", "ç…§", "å‚", "红", "细", "引", "å¬", "该", "é“", "ä»·", "严", "首", "底", "液", "官", "å¾·", "éš", "ç—…", "è‹", "失", "å°”", "æ­»", "讲", "é…", "女", "黄", "推", "显", "è°ˆ", "罪", "神", "艺", "å‘¢", "席", "å«", "ä¼", "望", "密", "批", "è¥", "项", "防", "举", "çƒ", "英", "æ°§", "势", "å‘Š", "æŽ", "å°", "è½", "木", "帮", "è½®", "ç ´", "亚", "师", "å›´", "注", "è¿œ", "å­—", "æ", "排", "ä¾›", "æ²³", "æ€", "å°", "å¦", "æ–½", "å‡", "æ ‘", "溶", "怎", "æ­¢", "案", "言", "士", "å‡", "æ­¦", "固", "å¶", "é±¼", "æ³¢", "视", "ä»…", "è´¹", "ç´§", "爱", "å·¦", "ç« ", "æ—©", "æœ", "害", "ç»­", "è½»", "æœ", "试", "食", "å……", "å…µ", "æº", "判", "护", "å¸", "足", "æŸ", "练", "å·®", "致", "æ¿", "ç”°", "é™", "黑", "犯", "è´Ÿ", "击", "范", "继", "å…´", "ä¼¼", "ä½™", "åš", "曲", "输", "ä¿®", "æ•…", "城", "夫", "够", "é€", "笔", "船", "å ", "å³", "è´¢", "åƒ", "富", "春", "èŒ", "觉", "汉", "ç”»", "功", "å·´", "è·Ÿ", "虽", "æ‚", "飞", "检", "å¸", "助", "å‡", "阳", "互", "åˆ", "创", "抗", "考", "投", "å", "ç­–", "å¤", "径", "æ¢", "未", "è·‘", "ç•™", "é’¢", "曾", "端", "è´£", "ç«™", "简", "è¿°", "é’±", "副", "å°½", "å¸", "å°„", "è‰", "冲", "承", "独", "令", "é™", "阿", "宣", "环", "åŒ", "请", "超", "å¾®", "让", "控", "å·ž", "良", "è½´", "找", "å¦", "纪", "益", "ä¾", "优", "顶", "ç¡€", "è½½", "倒", "房", "çª", "å", "粉", "æ•Œ", "ç•¥", "客", "è¢", "冷", "胜", "ç»", "æž", "å—", "剂", "测", "ä¸", "å", "诉", "念", "陈", "ä»", "ç½—", "ç›", "å‹", "æ´‹", "é”™", "苦", "夜", "刑", "移", "频", "é€", "é ", "æ··", "æ¯", "短", "çš®", "终", "èš", "æ±½", "æ‘", "云", "哪", "æ—¢", "è·", "å«", "åœ", "烈", "央", "察", "烧", "è¿…", "境", "è‹¥", "å°", "æ´²", "刻", "括", "æ¿€", "å­”", "æž", "甚", "室", "å¾…", "æ ¸", "æ ¡", "æ•£", "ä¾µ", "å§", "甲", "游", "ä¹…", "èœ", "味", "æ—§", "模", "æ¹–", "è´§", "æŸ", "预", "阻", "毫", "æ™®", "稳", "ä¹™", "妈", "æ¤", "æ¯", "扩", "银", "语", "挥", "é…’", "守", "æ‹¿", "åº", "纸", "医", "缺", "雨", "å—", "é’ˆ", "刘", "å•Š", "急", "å”±", "误", "è®­", "æ„¿", "审", "附", "获", "茶", "鲜", "ç²®", "æ–¤", "å­©", "脱", "ç¡«", "è‚¥", "å–„", "é¾™", "æ¼”", "父", "æ¸", "è¡€", "欢", "械", "掌", "æ­Œ", "æ²™", "刚", "æ”»", "è°“", "盾", "讨", "晚", "ç²’", "ä¹±", "燃", "矛", "乎", "æ€", "è¯", "å®", "é²", "è´µ", "é’Ÿ", "ç…¤", "读", "ç­", "伯", "香", "介", "è¿«", "å¥", "丰", "培", "æ¡", "å…°", "æ‹…", "弦", "蛋", "沉", "å‡", "ç©¿", "执", "ç­”", "ä¹", "è°", "顺", "烟", "缩", "å¾", "脸", "å–œ", "æ¾", "è„š", "å›°", "异", "å…", "背", "星", "ç¦", "ä¹°", "染", "井", "概", "æ…¢", "怕", "ç£", "å€", "祖", "皇", "促", "é™", "è¡¥", "评", "ç¿»", "肉", "è·µ", "å°¼", "è¡£", "宽", "扬", "棉", "希", "伤", "æ“", "åž‚", "秋", "宜", "æ°¢", "套", "ç£", "振", "架", "亮", "末", "宪", "庆", "ç¼–", "牛", "触", "映", "é›·", "销", "诗", "座", "å±…", "抓", "裂", "胞", "呼", "娘", "景", "å¨", "绿", "晶", "厚", "盟", "è¡¡", "鸡", "å­™", "延", "å±", "胶", "屋", "乡", "临", "陆", "顾", "掉", "å‘€", "ç¯", "å²", "措", "æŸ", "è€", "剧", "玉", "èµµ", "è·³", "å“¥", "å­£", "课", "凯", "胡", "é¢", "款", "ç»", "å·", "é½", "伟", "è’¸", "æ®–", "æ°¸", "å®—", "è‹—", "å·", "炉", "岩", "å¼±", "零", "æ¨", "å¥", "沿", "露", "æ†", "探", "滑", "镇", "饭", "浓", "航", "怀", "赶", "库", "夺", "伊", "çµ", "税", "途", "ç­", "èµ›", "å½’", "å¬", "鼓", "æ’­", "盘", "è£", "险", "康", "唯", "录", "èŒ", "纯", "借", "ç³–", "ç›–", "横", "符", "ç§", "努", "å ‚", "域", "枪", "润", "å¹…", "哈", "ç«Ÿ", "熟", "虫", "æ³½", "è„‘", "壤", "碳", "欧", "é", "侧", "寨", "æ•¢", "å½»", "虑", "æ–œ", "è–„", "庭", "纳", "å¼¹", "饲", "伸", "折", "麦", "湿", "æš—", "è·", "瓦", "å¡ž", "床", "ç­‘", "æ¶", "户", "访", "å¡”", "奇", "é€", "æ¢", "刀", "æ—‹", "迹", "å¡", "æ°¯", "é‡", "份", "毒", "æ³¥", "退", "æ´—", "摆", "ç°", "彩", "å–", "耗", "å¤", "æ‹©", "å¿™", "é“œ", "献", "硬", "予", "ç¹", "圈", "雪", "函", "亦", "抽", "篇", "阵", "阴", "ä¸", "å°º", "追", "å †", "雄", "è¿Ž", "æ³›", "爸", "楼", "é¿", "è°‹", "å¨", "野", "猪", "æ——", "ç´¯", "å", "å…¸", "馆", "ç´¢", "秦", "è„‚", "æ½®", "爷", "豆", "忽", "托", "惊", "å¡‘", "é—", "愈", "朱", "替", "纤", "ç²—", "倾", "å°š", "ç—›", "楚", "è°¢", "奋", "è´­", "磨", "å›", "æ± ", "æ—", "碎", "骨", "监", "æ•", "弟", "æš´", "割", "è´¯", "殊", "释", "è¯", "亡", "å£", "é¡¿", "å®", "åˆ", "å°˜", "é—»", "æ­", "ç‚®", "残", "冬", "æ¡¥", "妇", "è­¦", "综", "æ‹›", "å´", "付", "æµ®", "é­", "å¾", "您", "摇", "è°·", "赞", "ç®±", "éš”", "订", "ç”·", "å¹", "å›­", "纷", "å”", "è´¥", "宋", "玻", "å·¨", "耕", "å¦", "è£", "é—­", "æ¹¾", "é”®", "凡", "é©»", "é”…", "æ•‘", "æ©", "剥", "å‡", "碱", "齿", "截", "炼", "麻", "纺", "ç¦", "废", "ç››", "版", "缓", "净", "ç›", "昌", "å©š", "涉", "ç­’", "嘴", "æ’", "岸", "朗", "庄", "è¡—", "è—", "姑", "è´¸", "è…", "奴", "啦", "惯", "乘", "ä¼™", "æ¢", "匀", "纱", "扎", "辩", "耳", "彪", "臣", "亿", "ç’ƒ", "抵", "脉", "秀", "è¨", "ä¿„", "网", "舞", "店", "å–·", "纵", "寸", "æ±—", "挂", "æ´ª", "è´º", "é—ª", "柬", "爆", "烯", "æ´¥", "稻", "墙", "软", "勇", "åƒ", "滚", "厘", "è’™", "芳", "肯", "å¡", "柱", "è¡", "è…¿", "仪", "æ—…", "å°¾", "轧", "冰", "è´¡", "ç™»", "黎", "削", "é’»", "å‹’", "逃", "éšœ", "æ°¨", "郭", "å³°", "å¸", "港", "ä¼", "轨", "亩", "毕", "擦", "莫", "刺", "浪", "秘", "æ´", "æ ª", "å¥", "å”®", "è‚¡", "å²›", "甘", "泡", "ç¡", "ç«¥", "铸", "汤", "阀", "休", "汇", "èˆ", "牧", "绕", "炸", "哲", "磷", "绩", "朋", "æ·¡", "å°–", "å¯", "é™·", "柴", "呈", "å¾’", "颜", "泪", "ç¨", "忘", "æ³µ", "è“", "æ‹–", "æ´ž", "授", "é•œ", "è¾›", "壮", "锋", "è´«", "虚", "弯", "æ‘©", "æ³°", "å¹¼", "å»·", "å°Š", "窗", "纲", "弄", "隶", "ç–‘", "æ°", "宫", "å§", "震", "ç‘ž", "怪", "å°¤", "ç´", "循", "æ", "膜", "è¿", "夹", "è…°", "缘", "ç ", "ç©·", "森", "æž", "竹", "沟", "催", "绳", "忆", "邦", "剩", "幸", "浆", "æ ", "æ‹¥", "牙", "è´®", "礼", "滤", "é’ ", "纹", "ç½¢", "æ‹", "å’±", "å–Š", "袖", "埃", "勤", "罚", "焦", "潜", "ä¼", "墨", "欲", "ç¼", "姓", "刊", "饱", "仿", "奖", "é“", "鬼", "丽", "è·¨", "默", "挖", "链", "扫", "å–", "袋", "ç‚­", "污", "幕", "诸", "弧", "励", "梅", "奶", "æ´", "ç¾", "舟", "鉴", "苯", "讼", "抱", "æ¯", "懂", "寒", "智", "埔", "寄", "届", "è·ƒ", "渡", "挑", "丹", "艰", "è´", "碰", "æ‹”", "爹", "戴", "ç ", "梦", "芽", "熔", "赤", "渔", "å“­", "敬", "颗", "奔", "é“…", "仲", "虎", "稀", "妹", "ä¹", "ç", "申", "æ¡Œ", "éµ", "å…", "隆", "螺", "仓", "é­", "é”", "晓", "æ°®", "å…¼", "éš", "ç¢", "赫", "拨", "å¿ ", "肃", "缸", "牵", "抢", "åš", "å·§", "壳", "å…„", "æœ", "讯", "诚", "碧", "祥", "柯", "页", "å·¡", "矩", "悲", "çŒ", "龄", "伦", "票", "寻", "æ¡‚", "铺", "圣", "æ", "æ°", "郑", "趣", "抬", "è’", "è…¾", "è´´", "柔", "æ»´", "猛", "阔", "辆", "妻", "å¡«", "æ’¤", "储", "ç­¾", "é—¹", "扰", "ç´«", "ç ‚", "递", "æˆ", "åŠ", "陶", "ä¼", "å–‚", "ç–—", "瓶", "婆", "抚", "臂", "摸", "å¿", "虾", "蜡", "é‚»", "胸", "å·©", "挤", "å¶", "弃", "槽", "劲", "ä¹³", "é‚“", "å‰", "ä»", "烂", "ç –", "租", "乌", "舰", "ä¼´", "ç“œ", "æµ…", "丙", "æš‚", "燥", "æ©¡", "柳", "è¿·", "æš–", "牌", "秧", "胆", "详", "ç°§", "è¸", "ç“·", "è°±", "呆", "宾", "糊", "æ´›", "辉", "愤", "ç«ž", "éš™", "怒", "粘", "乃", "绪", "è‚©", "ç±", "æ•", "涂", "熙", "皆", "侦", "悬", "掘", "享", "纠", "醒", "ç‹‚", "é”", "æ·€", "æ¨", "牲", "霸", "爬", "èµ", "逆", "玩", "陵", "ç¥", "秒", "æµ™", "貌", "å½¹", "å½¼", "悉", "鸭", "趋", "凤", "晨", "ç•œ", "辈", "秩", "åµ", "ç½²", "梯", "ç‚Ž", "滩", "棋", "驱", "ç­›", "峡", "冒", "å•¥", "寿", "译", "浸", "泉", "帽", "è¿Ÿ", "ç¡…", "ç–†", "è´·", "æ¼", "稿", "冠", "å«©", "èƒ", "芯", "牢", "å›", "蚀", "奥", "鸣", "å²­", "羊", "凭", "串", "塘", "绘", "é…µ", "èž", "盆", "锡", "庙", "ç­¹", "冻", "è¾…", "æ‘„", "袭", "ç­‹", "æ‹’", "僚", "æ—±", "é’¾", "鸟", "漆", "沈", "眉", "ç–", "æ·»", "棒", "ç©—", "ç¡", "韩", "逼", "扭", "侨", "凉", "挺", "碗", "æ ½", "ç‚’", "æ¯", "æ‚£", "é¦", "åŠ", "豪", "è¾½", "勃", "鸿", "æ—¦", "å", "æ‹œ", "ç‹—", "埋", "辊", "掩", "饮", "æ¬", "骂", "辞", "勾", "扣", "ä¼°", "è’‹", "ç»’", "雾", "丈", "朵", "姆", "æ‹Ÿ", "宇", "辑", "陕", "雕", "å¿", "è“„", "å´‡", "剪", "倡", "厅", "å’¬", "驶", "è–¯", "刷", "æ–¥", "番", "赋", "奉", "ä½›", "浇", "漫", "曼", "扇", "é’™", "桃", "扶", "ä»”", "è¿”", "ä¿—", "äº", "è…”", "éž‹", "棱", "覆", "框", "æ‚„", "å”", "æ’ž", "骗", "勘", "æ—º", "沸", "å­¤", "å", "å­Ÿ", "渠", "屈", "ç–¾", "妙", "惜", "ä»°", "ç‹ ", "胀", "è°", "抛", "霉", "æ¡‘", "å²—", "嘛", "è¡°", "ç›—", "渗", "è„", "èµ–", "涌", "甜", "曹", "阅", "è‚Œ", "å“©", "厉", "烃", "纬", "毅", "昨", "伪", "ç—‡", "ç…®", "å¹", "é’‰", "æ­", "茎", "笼", "é…·", "å·", "弓", "锥", "æ’", "æ°", "å‘", "é¼»", "翼", "纶", "å™", "狱", "逮", "ç½", "络", "棚", "抑", "膨", "蔬", "寺", "骤", "穆", "冶", "枯", "册", "å°¸", "凸", "ç»…", "å¯", "牺", "ç„°", "è½°", "欣", "晋", "瘦", "御", "é”­", "锦", "丧", "æ—¬", "é”»", "åž„", "æœ", "扑", "é‚€", "亭", "é…¯", "迈", "舒", "脆", "é…¶", "é—²", "忧", "é…š", "顽", "ç¾½", "涨", "å¸", "ä»—", "陪", "辟", "惩", "æ­", "姚", "è‚š", "æ‰", "飘", "漂", "昆", "欺", "å¾", "郎", "烷", "æ±", "呵", "饰", "è§", "é›…", "é‚®", "è¿", "燕", "æ’’", "姻", "èµ´", "å®´", "烦", "债", "å¸", "æ–‘", "铃", "æ—¨", "醇", "è‘£", "饼", "é›", "姿", "æ‹Œ", "å‚…", "è…¹", "妥", "æ‰", "è´¤", "拆", "æ­ª", "è‘¡", "胺", "丢", "浩", "å¾½", "昂", "åž«", "挡", "览", "è´ª", "æ…°", "ç¼´", "汪", "æ…Œ", "冯", "诺", "姜", "è°Š", "凶", "劣", "诬", "耀", "æ˜", "躺", "盈", "骑", "ä¹”", "溪", "丛", "å¢", "抹", "é—·", "å’¨", "刮", "驾", "缆", "æ‚Ÿ", "摘", "é“’", "掷", "颇", "å¹»", "柄", "惠", "惨", "ä½³", "仇", "è…Š", "çª", "涤", "剑", "瞧", "å ¡", "æ³¼", "葱", "罩", "éœ", "æž", "胎", "è‹", "滨", "ä¿©", "æ…", "湘", "ç ", "霞", "邵", "è„", "ç–¯", "æ·®", "é‚", "熊", "粪", "烘", "宿", "æ¡£", "戈", "驳", "å«‚", "裕", "å¾™", "ç®­", "æ", "è‚ ", "æ’‘", "æ™’", "辨", "殿", "莲", "æ‘Š", "æ…", "é…±", "å±", "ç–«", "å“€", "蔡", "å µ", "沫", "çš±", "ç•…", "å ", "é˜", "莱", "敲", "è¾–", "é’©", "ç—•", "å", "å··", "饿", "祸", "丘", "玄", "溜", "æ›°", "逻", "å½­", "å°", "å¿", "妨", "艇", "åž", "韦", "怨", "矮", "æ­‡") diff --git a/src/main/kotlin/com/radixdlt/bip39/wordlists/ChineseTraditional.kt b/src/main/kotlin/com/radixdlt/bip39/wordlists/ChineseTraditional.kt new file mode 100644 index 0000000..cca66cb --- /dev/null +++ b/src/main/kotlin/com/radixdlt/bip39/wordlists/ChineseTraditional.kt @@ -0,0 +1,3 @@ +package com.radixdlt.bip39.wordlists + +val WORDLIST_CHINESE_TRADITIONAL = listOf("çš„", "一", "是", "在", "ä¸", "了", "有", "å’Œ", "人", "這", "中", "大", "為", "上", "個", "國", "我", "以", "è¦", "ä»–", "時", "來", "用", "們", "生", "到", "作", "地", "æ–¼", "出", "å°±", "分", "å°", "æˆ", "會", "å¯", "主", "發", "å¹´", "å‹•", "åŒ", "å·¥", "也", "能", "下", "éŽ", "å­", "說", "產", "種", "é¢", "而", "æ–¹", "後", "多", "定", "è¡Œ", "å­¸", "法", "所", "æ°‘", "å¾—", "經", "å", "三", "之", "進", "è‘—", "ç­‰", "部", "度", "家", "é›»", "力", "裡", "如", "æ°´", "化", "高", "自", "二", "ç†", "èµ·", "å°", "物", "ç¾", "實", "加", "é‡", "都", "å…©", "é«”", "制", "æ©Ÿ", "當", "使", "點", "從", "業", "本", "去", "把", "性", "好", "應", "é–‹", "它", "åˆ", "é‚„", "å› ", "ç”±", "å…¶", "些", "然", "å‰", "外", "天", "政", "å››", "æ—¥", "é‚£", "社", "義", "事", "å¹³", "å½¢", "相", "å…¨", "表", "é–“", "樣", "與", "é—œ", "å„", "é‡", "æ–°", "ç·š", "å…§", "數", "æ­£", "心", "å", "ä½ ", "明", "看", "原", "åˆ", "麼", "利", "比", "或", "但", "質", "æ°£", "第", "å‘", "é“", "命", "æ­¤", "變", "æ¢", "åª", "æ²’", "çµ", "解", "å•", "æ„", "建", "月", "å…¬", "ç„¡", "ç³»", "è»", "很", "情", "者", "最", "ç«‹", "代", "想", "å·²", "通", "並", "æ", "ç›´", "é¡Œ", "黨", "程", "展", "五", "æžœ", "æ–™", "象", "å“¡", "é©", "ä½", "å…¥", "常", "æ–‡", "總", "次", "å“", "å¼", "æ´»", "設", "åŠ", "管", "特", "件", "é•·", "求", "è€", "é ­", "基", "資", "é‚Š", "æµ", "è·¯", "ç´š", "å°‘", "圖", "å±±", "çµ±", "接", "知", "較", "å°‡", "組", "見", "計", "別", "她", "手", "角", "期", "æ ¹", "è«–", "é‹", "è¾²", "指", "å¹¾", "ä¹", "å€", "å¼·", "放", "決", "西", "被", "å¹¹", "åš", "å¿…", "戰", "å…ˆ", "回", "則", "ä»»", "å–", "æ“š", "處", "隊", "å—", "給", "色", "å…‰", "é–€", "å³", "ä¿", "æ²»", "北", "造", "百", "è¦", "熱", "é ˜", "七", "æµ·", "å£", "æ±", "å°Ž", "器", "壓", "å¿—", "世", "金", "增", "爭", "æ¿Ÿ", "階", "æ²¹", "æ€", "è¡“", "極", "交", "å—", "è¯", "什", "èª", "å…­", "å…±", "權", "收", "è­‰", "改", "清", "美", "å†", "採", "轉", "æ›´", "å–®", "風", "切", "打", "白", "æ•™", "速", "花", "帶", "安", "å ´", "身", "車", "例", "真", "å‹™", "å…·", "è¬", "æ¯", "ç›®", "至", "é”", "èµ°", "ç©", "示", "è­°", "è²", "å ±", "鬥", "完", "é¡ž", "å…«", "離", "è¯", "å", "確", "æ‰", "科", "å¼µ", "ä¿¡", "馬", "節", "話", "ç±³", "æ•´", "空", "å…ƒ", "æ³", "今", "集", "溫", "傳", "土", "許", "æ­¥", "群", "廣", "石", "記", "需", "段", "ç ”", "ç•Œ", "拉", "æž—", "律", "å«", "且", "究", "觀", "越", "ç¹”", "è£", "å½±", "ç®—", "低", "æŒ", "音", "眾", "書", "布", "å¤", "容", "å…’", "é ˆ", "éš›", "商", "éž", "é©—", "連", "æ–·", "æ·±", "難", "è¿‘", "礦", "åƒ", "週", "委", "ç´ ", "技", "å‚™", "åŠ", "辦", "é’", "çœ", "列", "ç¿’", "響", "ç´„", "支", "般", "å²", "æ„Ÿ", "å‹ž", "便", "團", "å¾€", "é…¸", "æ­·", "市", "å…‹", "何", "除", "消", "構", "府", "稱", "太", "準", "ç²¾", "值", "號", "率", "æ—", "維", "劃", "é¸", "標", "寫", "å­˜", "候", "毛", "親", "å¿«", "效", "æ–¯", "院", "查", "江", "åž‹", "眼", "王", "按", "æ ¼", "養", "易", "ç½®", "æ´¾", "層", "片", "始", "å»", "å°ˆ", "ç‹€", "育", "å» ", "京", "è­˜", "é©", "屬", "圓", "包", "ç«", "ä½", "調", "滿", "縣", "å±€", "ç…§", "åƒ", "ç´…", "ç´°", "引", "è½", "該", "éµ", "價", "åš´", "首", "底", "液", "官", "å¾·", "隨", "ç—…", "蘇", "失", "爾", "æ­»", "講", "é…", "女", "黃", "推", "顯", "談", "罪", "神", "è—", "å‘¢", "席", "å«", "ä¼", "望", "密", "批", "營", "é …", "防", "舉", "çƒ", "英", "æ°§", "å‹¢", "å‘Š", "æŽ", "å°", "è½", "木", "幫", "輪", "ç ´", "亞", "師", "åœ", "注", "é ", "å­—", "æ", "排", "ä¾›", "æ²³", "æ…‹", "å°", "å¦", "æ–½", "減", "樹", "溶", "怎", "æ­¢", "案", "言", "士", "å‡", "æ­¦", "固", "葉", "é­š", "æ³¢", "視", "僅", "è²»", "ç·Š", "æ„›", "å·¦", "ç« ", "æ—©", "æœ", "害", "續", "輕", "æœ", "試", "食", "å……", "å…µ", "æº", "判", "è­·", "å¸", "足", "æŸ", "ç·´", "å·®", "致", "æ¿", "ç”°", "é™", "黑", "犯", "è² ", "æ“Š", "范", "ç¹¼", "興", "ä¼¼", "餘", "å …", "曲", "輸", "ä¿®", "æ•…", "城", "夫", "夠", "é€", "ç­†", "船", "ä½”", "å³", "財", "åƒ", "富", "春", "è·", "覺", "æ¼¢", "ç•«", "功", "å·´", "è·Ÿ", "é›–", "雜", "飛", "檢", "å¸", "助", "昇", "陽", "互", "åˆ", "創", "抗", "考", "投", "壞", "ç­–", "å¤", "徑", "æ›", "未", "è·‘", "ç•™", "鋼", "曾", "端", "責", "ç«™", "ç°¡", "è¿°", "錢", "副", "盡", "å¸", "å°„", "è‰", "è¡", "承", "ç¨", "令", "é™", "阿", "宣", "ç’°", "é›™", "è«‹", "超", "å¾®", "讓", "控", "å·ž", "良", "軸", "找", "å¦", "ç´€", "益", "ä¾", "優", "é ‚", "礎", "載", "倒", "房", "çª", "å", "粉", "敵", "ç•¥", "客", "è¢", "冷", "å‹", "絕", "æž", "å¡Š", "劑", "測", "çµ²", "å”", "訴", "念", "陳", "ä»", "ç¾…", "é¹½", "å‹", "æ´‹", "錯", "苦", "夜", "刑", "移", "é »", "é€", "é ", "æ··", "æ¯", "短", "çš®", "終", "èš", "æ±½", "æ‘", "雲", "哪", "æ—¢", "è·", "è¡›", "åœ", "烈", "央", "察", "燒", "è¿…", "境", "è‹¥", "å°", "æ´²", "刻", "括", "æ¿€", "å­”", "æž", "甚", "室", "å¾…", "æ ¸", "æ ¡", "æ•£", "ä¾µ", "å§", "甲", "éŠ", "ä¹…", "èœ", "味", "舊", "模", "æ¹–", "貨", "æ", "é ", "阻", "毫", "æ™®", "ç©©", "ä¹™", "媽", "æ¤", "æ¯", "æ“´", "銀", "語", "æ®", "é…’", "守", "æ‹¿", "åº", "ç´™", "醫", "缺", "雨", "å—Ž", "é‡", "劉", "å•Š", "急", "å”±", "誤", "訓", "願", "審", "附", "ç²", "茶", "é®®", "糧", "æ–¤", "å­©", "è„«", "ç¡«", "è‚¥", "å–„", "é¾", "æ¼”", "父", "漸", "è¡€", "æ­¡", "械", "掌", "æ­Œ", "æ²™", "剛", "æ”»", "謂", "盾", "討", "晚", "ç²’", "亂", "燃", "矛", "乎", "殺", "è—¥", "寧", "é­¯", "è²´", "é˜", "ç…¤", "讀", "ç­", "伯", "香", "介", "è¿«", "å¥", "è±", "培", "æ¡", "蘭", "æ“”", "弦", "蛋", "沉", "å‡", "ç©¿", "執", "ç­”", "樂", "誰", "é †", "ç…™", "縮", "å¾µ", "臉", "å–œ", "æ¾", "è…³", "å›°", "ç•°", "å…", "背", "星", "ç¦", "è²·", "染", "井", "概", "æ…¢", "怕", "ç£", "å€", "祖", "皇", "促", "éœ", "補", "è©•", "ç¿»", "肉", "è¸", "å°¼", "è¡£", "寬", "æš", "棉", "希", "å‚·", "æ“", "åž‚", "秋", "宜", "æ°«", "套", "ç£", "振", "架", "亮", "末", "憲", "æ…¶", "ç·¨", "牛", "觸", "映", "é›·", "銷", "è©©", "座", "å±…", "抓", "裂", "胞", "呼", "娘", "景", "å¨", "綠", "晶", "厚", "盟", "è¡¡", "雞", "å­«", "延", "å±", "膠", "屋", "鄉", "臨", "陸", "顧", "掉", "å‘€", "燈", "æ­²", "措", "æŸ", "è€", "劇", "玉", "趙", "è·³", "å“¥", "å­£", "課", "凱", "胡", "é¡", "款", "ç´¹", "å·", "齊", "å‰", "è’¸", "æ®–", "æ°¸", "å®—", "è‹—", "å·", "çˆ", "岩", "å¼±", "零", "楊", "å¥", "沿", "露", "æ¡¿", "探", "滑", "鎮", "飯", "濃", "航", "懷", "趕", "庫", "奪", "伊", "éˆ", "稅", "途", "æ»…", "è³½", "æ­¸", "å¬", "鼓", "æ’­", "盤", "è£", "險", "康", "唯", "錄", "èŒ", "ç´”", "借", "ç³–", "è“‹", "æ©«", "符", "ç§", "努", "å ‚", "域", "æ§", "潤", "å¹…", "哈", "ç«Ÿ", "熟", "蟲", "澤", "è…¦", "壤", "碳", "æ­", "é", "å´", "寨", "æ•¢", "å¾¹", "æ…®", "æ–œ", "è–„", "庭", "ç´", "彈", "飼", "伸", "折", "麥", "æ¿•", "æš—", "è·", "瓦", "å¡ž", "床", "築", "惡", "戶", "訪", "å¡”", "奇", "é€", "æ¢", "刀", "æ—‹", "è·¡", "å¡", "æ°¯", "é‡", "份", "毒", "æ³¥", "退", "æ´—", "擺", "ç°", "彩", "è³£", "耗", "å¤", "擇", "å¿™", "銅", "ç»", "硬", "予", "ç¹", "圈", "雪", "函", "亦", "抽", "篇", "陣", "é™°", "ä¸", "å°º", "追", "å †", "雄", "è¿Ž", "æ³›", "爸", "樓", "é¿", "謀", "噸", "野", "豬", "æ——", "ç´¯", "å", "å…¸", "館", "ç´¢", "秦", "è„‚", "æ½®", "爺", "豆", "忽", "托", "é©š", "å¡‘", "éº", "愈", "朱", "替", "纖", "ç²—", "傾", "å°š", "ç—›", "楚", "è¬", "奮", "è³¼", "磨", "å›", "æ± ", "æ—", "碎", "骨", "監", "æ•", "弟", "æš´", "割", "貫", "殊", "釋", "è©ž", "亡", "å£", "é “", "寶", "åˆ", "塵", "èž", "æ­", "ç‚®", "殘", "冬", "æ©‹", "婦", "è­¦", "綜", "æ‹›", "å³", "付", "æµ®", "é­", "å¾", "您", "æ–", "è°·", "è´Š", "ç®±", "éš”", "訂", "ç”·", "å¹", "園", "ç´›", "å”", "æ•—", "宋", "玻", "å·¨", "耕", "å¦", "榮", "é–‰", "ç£", "éµ", "凡", "é§", "é‹", "æ•‘", "æ©", "å‰", "å‡", "é¹¼", "é½’", "截", "ç…‰", "麻", "ç´¡", "ç¦", "廢", "ç››", "版", "ç·©", "æ·¨", "ç›", "昌", "å©š", "涉", "ç­’", "嘴", "æ’", "岸", "朗", "莊", "è¡—", "è—", "姑", "貿", "è…", "奴", "啦", "æ…£", "乘", "夥", "æ¢", "å‹»", "ç´—", "扎", "辯", "耳", "彪", "臣", "å„„", "ç’ƒ", "抵", "脈", "秀", "è–©", "ä¿„", "網", "舞", "店", "å™´", "縱", "寸", "æ±—", "掛", "æ´ª", "è³€", "é–ƒ", "柬", "爆", "烯", "æ´¥", "稻", "牆", "軟", "勇", "åƒ", "滾", "厘", "è’™", "芳", "肯", "å¡", "柱", "盪", "è…¿", "å„€", "æ—…", "å°¾", "軋", "冰", "è²¢", "ç™»", "黎", "削", "鑽", "å‹’", "逃", "éšœ", "æ°¨", "郭", "å³°", "å¹£", "港", "ä¼", "軌", "ç•", "ç•¢", "擦", "莫", "刺", "浪", "秘", "æ´", "æ ª", "å¥", "å”®", "è‚¡", "島", "甘", "泡", "ç¡", "ç«¥", "é‘„", "湯", "é–¥", "休", "匯", "èˆ", "牧", "繞", "炸", "哲", "磷", "績", "朋", "æ·¡", "å°–", "å•Ÿ", "é™·", "柴", "呈", "å¾’", "é¡", "æ·š", "ç¨", "忘", "æ³µ", "è—", "æ‹–", "æ´ž", "授", "é¡", "è¾›", "壯", "é‹’", "貧", "è™›", "彎", "æ‘©", "æ³°", "å¹¼", "å»·", "å°Š", "窗", "綱", "弄", "隸", "ç–‘", "æ°", "å®®", "å§", "震", "ç‘ž", "怪", "å°¤", "ç´", "循", "æ", "膜", "é•", "夾", "è…°", "ç·£", "ç ", "窮", "森", "æž", "竹", "æº", "催", "繩", "憶", "邦", "剩", "幸", "漿", "欄", "æ“", "牙", "貯", "禮", "濾", "鈉", "ç´‹", "ç½·", "æ‹", "å’±", "å–Š", "袖", "埃", "勤", "ç½°", "焦", "æ½›", "ä¼", "墨", "欲", "縫", "姓", "刊", "飽", "仿", "çŽ", "é‹", "鬼", "麗", "è·¨", "默", "挖", "éˆ", "掃", "å–", "袋", "ç‚­", "污", "幕", "諸", "弧", "勵", "梅", "奶", "æ½”", "ç½", "舟", "é‘‘", "苯", "訟", "抱", "毀", "懂", "寒", "智", "埔", "寄", "屆", "èº", "渡", "挑", "丹", "艱", "è²", "碰", "æ‹”", "爹", "戴", "碼", "夢", "芽", "熔", "赤", "æ¼", "å“­", "敬", "顆", "奔", "鉛", "仲", "虎", "稀", "妹", "ä¹", "ç", "申", "æ¡Œ", "éµ", "å…", "隆", "螺", "倉", "é­", "銳", "曉", "æ°®", "å…¼", "éš±", "礙", "赫", "æ’¥", "å¿ ", "è‚…", "缸", "牽", "æ¶", "åš", "å·§", "殼", "å…„", "æœ", "訊", "誠", "碧", "祥", "柯", "é ", "å·¡", "矩", "悲", "çŒ", "齡", "倫", "票", "å°‹", "æ¡‚", "鋪", "è–", "æ", "æ°", "é„­", "趣", "抬", "è’", "騰", "è²¼", "柔", "æ»´", "猛", "é—Š", "è¼›", "妻", "å¡«", "æ’¤", "儲", "ç°½", "鬧", "擾", "ç´«", "ç ‚", "éž", "戲", "åŠ", "陶", "ä¼", "餵", "療", "瓶", "婆", "æ’«", "臂", "摸", "å¿", "è¦", "è Ÿ", "é„°", "胸", "éž", "æ“ ", "å¶", "棄", "槽", "å‹", "ä¹³", "鄧", "å‰", "ä»", "爛", "磚", "租", "çƒ", "艦", "ä¼´", "ç“œ", "æ·º", "丙", "æš«", "燥", "æ©¡", "柳", "è¿·", "æš–", "牌", "秧", "膽", "詳", "ç°§", "è¸", "ç“·", "è­œ", "呆", "賓", "糊", "æ´›", "è¼", "憤", "競", "éš™", "怒", "粘", "乃", "ç·’", "è‚©", "ç±", "æ•", "å¡—", "熙", "皆", "åµ", "懸", "掘", "享", "ç³¾", "醒", "ç‹‚", "鎖", "æ·€", "æ¨", "牲", "霸", "爬", "賞", "逆", "玩", "陵", "ç¥", "秒", "æµ™", "貌", "å½¹", "å½¼", "悉", "é´¨", "趨", "é³³", "晨", "ç•œ", "輩", "秩", "åµ", "ç½²", "梯", "ç‚Ž", "ç˜", "棋", "é©…", "篩", "å³½", "冒", "å•¥", "壽", "è­¯", "浸", "泉", "帽", "é²", "矽", "ç–†", "貸", "æ¼", "稿", "冠", "å«©", "è„…", "芯", "牢", "å›", "è•", "奧", "é³´", "嶺", "羊", "憑", "串", "塘", "繪", "é…µ", "èž", "盆", "錫", "廟", "籌", "å‡", "è¼”", "æ”", "襲", "ç­‹", "æ‹’", "僚", "æ—±", "鉀", "é³¥", "漆", "沈", "眉", "ç–", "æ·»", "棒", "ç©—", "ç¡", "韓", "逼", "扭", "僑", "涼", "挺", "碗", "æ ½", "ç‚’", "æ¯", "æ‚£", "餾", "勸", "豪", "é¼", "勃", "é´»", "æ—¦", "å", "æ‹œ", "ç‹—", "埋", "è¼¥", "掩", "飲", "æ¬", "ç½µ", "è¾­", "勾", "扣", "ä¼°", "蔣", "絨", "霧", "丈", "朵", "姆", "擬", "宇", "輯", "é™", "雕", "å„Ÿ", "è“„", "å´‡", "剪", "倡", "廳", "å’¬", "駛", "è–¯", "刷", "æ–¥", "番", "賦", "奉", "ä½›", "澆", "漫", "曼", "扇", "鈣", "桃", "扶", "ä»”", "è¿”", "ä¿—", "虧", "è…”", "éž‹", "棱", "覆", "框", "æ‚„", "å”", "æ’ž", "騙", "勘", "æ—º", "沸", "å­¤", "å", "å­Ÿ", "渠", "屈", "ç–¾", "妙", "惜", "ä»°", "ç‹ ", "脹", "諧", "æ‹‹", "é»´", "æ¡‘", "å´—", "嘛", "è¡°", "盜", "滲", "臟", "è³´", "湧", "甜", "曹", "é–±", "è‚Œ", "å“©", "厲", "烴", "ç·¯", "毅", "昨", "å½", "ç—‡", "ç…®", "嘆", "釘", "æ­", "莖", "ç± ", "é…·", "å·", "弓", "éŒ", "æ†", "å‚‘", "å‘", "é¼»", "翼", "綸", "敘", "ç„", "逮", "ç½", "絡", "棚", "抑", "膨", "蔬", "寺", "é©Ÿ", "穆", "冶", "枯", "冊", "å±", "凸", "ç´³", "å¯", "犧", "ç„°", "轟", "欣", "晉", "瘦", "禦", "錠", "錦", "å–ª", "æ—¬", "é›", "壟", "æœ", "æ’²", "é‚€", "亭", "é…¯", "é‚", "舒", "脆", "é…¶", "é–’", "憂", "é…š", "é ‘", "ç¾½", "æ¼²", "å¸", "ä»—", "陪", "é—¢", "懲", "æ­", "姚", "è‚š", "æ‰", "飄", "漂", "昆", "欺", "å¾", "郎", "烷", "æ±", "呵", "飾", "è•­", "é›…", "郵", "é·", "燕", "æ’’", "姻", "èµ´", "å®´", "ç…©", "債", "帳", "æ–‘", "鈴", "æ—¨", "醇", "è‘£", "餅", "é››", "姿", "æ‹Œ", "å‚…", "è…¹", "妥", "æ‰", "è³¢", "拆", "æ­ª", "è‘¡", "胺", "丟", "浩", "å¾½", "昂", "墊", "æ“‹", "覽", "貪", "æ…°", "ç¹³", "汪", "æ…Œ", "馮", "諾", "姜", "誼", "å…‡", "劣", "誣", "耀", "æ˜", "躺", "盈", "騎", "å–¬", "溪", "å¢", "盧", "抹", "悶", "è«®", "刮", "駕", "纜", "æ‚Ÿ", "摘", "鉺", "擲", "é —", "å¹»", "柄", "惠", "æ…˜", "ä½³", "仇", "臘", "窩", "滌", "åŠ", "瞧", "å ¡", "潑", "蔥", "罩", "éœ", "æ’ˆ", "胎", "è’¼", "濱", "倆", "æ…", "湘", "ç ", "霞", "邵", "è„", "瘋", "æ·®", "é‚", "熊", "糞", "烘", "宿", "檔", "戈", "é§", "å«‚", "裕", "å¾™", "ç®­", "æ", "è…¸", "æ’", "曬", "辨", "殿", "è“®", "攤", "攪", "醬", "å±", "ç–«", "å“€", "蔡", "å µ", "沫", "皺", "暢", "ç–Š", "é–£", "èŠ", "敲", "轄", "鉤", "ç—•", "壩", "å··", "餓", "ç¦", "丘", "玄", "溜", "æ›°", "é‚", "å½­", "嘗", "å¿", "妨", "艇", "åž", "韋", "怨", "矮", "æ­‡") diff --git a/src/main/kotlin/com/radixdlt/bip39/wordlists/English.kt b/src/main/kotlin/com/radixdlt/bip39/wordlists/English.kt new file mode 100644 index 0000000..8a7f58a --- /dev/null +++ b/src/main/kotlin/com/radixdlt/bip39/wordlists/English.kt @@ -0,0 +1,4 @@ +package com.radixdlt.bip39.wordlists + +val WORDLIST_ENGLISH = listOf("abandon", "ability", "able", "about", "above", "absent", "absorb", "abstract", "absurd", "abuse", "access", "accident", "account", "accuse", "achieve", "acid", "acoustic", "acquire", "across", "act", "action", "actor", "actress", "actual", "adapt", "add", "addict", "address", "adjust", "admit", "adult", "advance", "advice", "aerobic", "affair", "afford", "afraid", "again", "age", "agent", "agree", "ahead", "aim", "air", "airport", "aisle", "alarm", "album", "alcohol", "alert", "alien", "all", "alley", "allow", "almost", "alone", "alpha", "already", "also", "alter", "always", "amateur", "amazing", "among", "amount", "amused", "analyst", "anchor", "ancient", "anger", "angle", "angry", "animal", "ankle", "announce", "annual", "another", "answer", "antenna", "antique", "anxiety", "any", "apart", "apology", "appear", "apple", "approve", "april", "arch", "arctic", "area", "arena", "argue", "arm", "armed", "armor", "army", "around", "arrange", "arrest", "arrive", "arrow", "art", "artefact", "artist", "artwork", "ask", "aspect", "assault", "asset", "assist", "assume", "asthma", "athlete", "atom", "attack", "attend", "attitude", "attract", "auction", "audit", "august", "aunt", "author", "auto", "autumn", "average", "avocado", "avoid", "awake", "aware", "away", "awesome", "awful", "awkward", "axis", "baby", "bachelor", "bacon", "badge", "bag", "balance", "balcony", "ball", "bamboo", "banana", "banner", "bar", "barely", "bargain", "barrel", "base", "basic", "basket", "battle", "beach", "bean", "beauty", "because", "become", "beef", "before", "begin", "behave", "behind", "believe", "below", "belt", "bench", "benefit", "best", "betray", "better", "between", "beyond", "bicycle", "bid", "bike", "bind", "biology", "bird", "birth", "bitter", "black", "blade", "blame", "blanket", "blast", "bleak", "bless", "blind", "blood", "blossom", "blouse", "blue", "blur", "blush", "board", "boat", "body", "boil", "bomb", "bone", "bonus", "book", "boost", "border", "boring", "borrow", "boss", "bottom", "bounce", "box", "boy", "bracket", "brain", "brand", "brass", "brave", "bread", "breeze", "brick", "bridge", "brief", "bright", "bring", "brisk", "broccoli", "broken", "bronze", "broom", "brother", "brown", "brush", "bubble", "buddy", "budget", "buffalo", "build", "bulb", "bulk", "bullet", "bundle", "bunker", "burden", "burger", "burst", "bus", "business", "busy", "butter", "buyer", "buzz", "cabbage", "cabin", "cable", "cactus", "cage", "cake", "call", "calm", "camera", "camp", "can", "canal", "cancel", "candy", "cannon", "canoe", "canvas", "canyon", "capable", "capital", "captain", "car", "carbon", "card", "cargo", "carpet", "carry", "cart", "case", "cash", "casino", "castle", "casual", "cat", "catalog", "catch", "category", "cattle", "caught", "cause", "caution", "cave", "ceiling", "celery", "cement", "census", "century", "cereal", "certain", "chair", "chalk", "champion", "change", "chaos", "chapter", "charge", "chase", "chat", "cheap", "check", "cheese", "chef", "cherry", "chest", "chicken", "chief", "child", "chimney", "choice", "choose", "chronic", "chuckle", "chunk", "churn", "cigar", "cinnamon", "circle", "citizen", "city", "civil", "claim", "clap", "clarify", "claw", "clay", "clean", "clerk", "clever", "click", "client", "cliff", "climb", "clinic", "clip", "clock", "clog", "close", "cloth", "cloud", "clown", "club", "clump", "cluster", "clutch", "coach", "coast", "coconut", "code", "coffee", "coil", "coin", "collect", "color", "column", "combine", "come", "comfort", "comic", "common", "company", "concert", "conduct", "confirm", "congress", "connect", "consider", "control", "convince", "cook", "cool", "copper", "copy", "coral", "core", "corn", "correct", "cost", "cotton", "couch", "country", "couple", "course", "cousin", "cover", "coyote", "crack", "cradle", "craft", "cram", "crane", "crash", "crater", "crawl", "crazy", "cream", "credit", "creek", "crew", "cricket", "crime", "crisp", "critic", "crop", "cross", "crouch", "crowd", "crucial", "cruel", "cruise", "crumble", "crunch", "crush", "cry", "crystal", "cube", "culture", "cup", "cupboard", "curious", "current", "curtain", "curve", "cushion", "custom", "cute", "cycle", "dad", "damage", "damp", "dance", "danger", "daring", "dash", "daughter", "dawn", "day", "deal", "debate", "debris", "decade", "december", "decide", "decline", "decorate", "decrease", "deer", "defense", "define", "defy", "degree", "delay", "deliver", "demand", "demise", "denial", "dentist", "deny", "depart", "depend", "deposit", "depth", "deputy", "derive", "describe", "desert", "design", "desk", "despair", "destroy", "detail", "detect", "develop", "device", "devote", "diagram", "dial", "diamond", "diary", "dice", "diesel", "diet", "differ", "digital", "dignity", "dilemma", "dinner", "dinosaur", "direct", "dirt", "disagree", "discover", "disease", "dish", "dismiss", "disorder", "display", "distance", "divert", "divide", "divorce", "dizzy", "doctor", "document", "dog", "doll", "dolphin", "domain", "donate", "donkey", "donor", "door", "dose", "double", "dove", "draft", "dragon", "drama", "drastic", "draw", "dream", "dress", "drift", "drill", "drink", "drip", "drive", "drop", "drum", "dry", "duck", "dumb", "dune", "during", "dust", "dutch", "duty", "dwarf", "dynamic", "eager", "eagle", "early", "earn", "earth", "easily", "east", "easy", "echo", "ecology", "economy", "edge", "edit", "educate", "effort", "egg", "eight", "either", "elbow", "elder", "electric", "elegant", "element", "elephant", "elevator", "elite", "else", "embark", "embody", "embrace", "emerge", "emotion", "employ", "empower", "empty", "enable", "enact", "end", "endless", "endorse", "enemy", "energy", "enforce", "engage", "engine", "enhance", "enjoy", "enlist", "enough", "enrich", "enroll", "ensure", "enter", "entire", "entry", "envelope", "episode", "equal", "equip", "era", "erase", "erode", "erosion", "error", "erupt", "escape", "essay", "essence", "estate", "eternal", "ethics", "evidence", "evil", "evoke", "evolve", "exact", "example", "excess", "exchange", "excite", "exclude", "excuse", "execute", "exercise", "exhaust", "exhibit", "exile", "exist", "exit", "exotic", "expand", "expect", "expire", "explain", "expose", "express", "extend", "extra", "eye", "eyebrow", "fabric", "face", "faculty", "fade", "faint", "faith", "fall", "false", "fame", "family", "famous", "fan", "fancy", "fantasy", "farm", "fashion", "fat", "fatal", "father", "fatigue", "fault", "favorite", "feature", "february", "federal", "fee", "feed", "feel", "female", "fence", "festival", "fetch", "fever", "few", "fiber", "fiction", "field", "figure", "file", "film", "filter", "final", "find", "fine", "finger", "finish", "fire", "firm", "first", "fiscal", "fish", "fit", "fitness", "fix", "flag", "flame", "flash", "flat", "flavor", "flee", "flight", "flip", "float", "flock", "floor", "flower", "fluid", "flush", "fly", "foam", "focus", "fog", "foil", "fold", "follow", "food", "foot", "force", "forest", "forget", "fork", "fortune", "forum", "forward", "fossil", "foster", "found", "fox", "fragile", "frame", "frequent", "fresh", "friend", "fringe", "frog", "front", "frost", "frown", "frozen", "fruit", "fuel", "fun", "funny", "furnace", "fury", "future", "gadget", "gain", "galaxy", "gallery", "game", "gap", "garage", "garbage", "garden", "garlic", "garment", "gas", "gasp", "gate", "gather", "gauge", "gaze", "general", "genius", "genre", "gentle", "genuine", "gesture", "ghost", "giant", "gift", "giggle", "ginger", "giraffe", "girl", "give", "glad", "glance", "glare", "glass", "glide", "glimpse", "globe", "gloom", "glory", "glove", "glow", "glue", "goat", "goddess", "gold", "good", "goose", "gorilla", "gospel", "gossip", "govern", "gown", "grab", "grace", "grain", "grant", "grape", "grass", "gravity", "great", "green", "grid", "grief", "grit", "grocery", "group", "grow", "grunt", "guard", "guess", "guide", "guilt", "guitar", "gun", "gym", "habit", "hair", "half", "hammer", "hamster", "hand", "happy", "harbor", "hard", "harsh", "harvest", "hat", "have", "hawk", "hazard", "head", "health", "heart", "heavy", "hedgehog", "height", "hello", "helmet", "help", "hen", "hero", "hidden", "high", "hill", "hint", "hip", "hire", "history", "hobby", "hockey", "hold", "hole", "holiday", "hollow", "home", "honey", "hood", "hope", "horn", "horror", "horse", "hospital", "host", "hotel", "hour", "hover", "hub", "huge", "human", "humble", "humor", "hundred", "hungry", "hunt", "hurdle", "hurry", "hurt", "husband", "hybrid", "ice", "icon", "idea", "identify", "idle", "ignore", "ill", "illegal", "illness", "image", "imitate", "immense", "immune", "impact", "impose", "improve", "impulse", "inch", "include", "income", "increase", "index", "indicate", "indoor", "industry", "infant", "inflict", "inform", "inhale", "inherit", "initial", "inject", "injury", "inmate", "inner", "innocent", "input", "inquiry", "insane", "insect", "inside", "inspire", "install", "intact", "interest", "into", "invest", "invite", "involve", "iron", "island", "isolate", "issue", "item", "ivory", "jacket", "jaguar", "jar", "jazz", "jealous", "jeans", "jelly", "jewel", "job", "join", "joke", "journey", "joy", "judge", "juice", "jump", "jungle", "junior", "junk", "just", "kangaroo", "keen", "keep", "ketchup", "key", "kick", "kid", "kidney", "kind", "kingdom", "kiss", "kit", "kitchen", "kite", "kitten", "kiwi", "knee", "knife", "knock", "know", "lab", "label", "labor", "ladder", "lady", "lake", "lamp", "language", "laptop", "large", "later", "latin", "laugh", "laundry", "lava", "law", "lawn", "lawsuit", "layer", "lazy", "leader", "leaf", "learn", "leave", "lecture", "left", "leg", "legal", "legend", "leisure", "lemon", "lend", "length", "lens", "leopard", "lesson", "letter", "level", "liar", "liberty", "library", "license", "life", "lift", "light", "like", "limb", "limit", "link", "lion", "liquid", "list", "little", "live", "lizard", "load", "loan", "lobster", "local", "lock", "logic", "lonely", "long", "loop", "lottery", "loud", "lounge", "love", "loyal", "lucky", "luggage", "lumber", "lunar", "lunch", "luxury", "lyrics", "machine", "mad", "magic", "magnet", "maid", "mail", "main", "major", "make", "mammal", "man", "manage", "mandate", "mango", "mansion", "manual", "maple", "marble", "march", "margin", "marine", "market", "marriage", "mask", "mass", "master", "match", "material", "math", "matrix", "matter", "maximum", "maze", "meadow", "mean", "measure", "meat", "mechanic", "medal", "media", "melody", "melt", "member", "memory", "mention", "menu", "mercy", "merge", "merit", "merry", "mesh", "message", "metal", "method", "middle", "midnight", "milk", "million", "mimic", "mind", "minimum", "minor", "minute", "miracle", "mirror", "misery", "miss", "mistake", "mix", "mixed", "mixture", "mobile", "model", "modify", "mom", "moment", "monitor", "monkey", "monster", "month", "moon", "moral", "more", "morning", "mosquito", "mother", "motion", "motor", "mountain", "mouse", "move", "movie", "much", "muffin", "mule", "multiply", "muscle", "museum", "mushroom", "music", "must", "mutual", "myself", "mystery", "myth", "naive", "name", "napkin", "narrow", "nasty", "nation", "nature", "near", "neck", "need", "negative", "neglect", "neither", "nephew", "nerve", "nest", "net", "network", "neutral", "never", "news", "next", "nice", "night", "noble", "noise", "nominee", "noodle", "normal", "north", "nose", "notable", "note", "nothing", "notice", "novel", "now", "nuclear", "number", "nurse", "nut", "oak", "obey", "object", "oblige", "obscure", "observe", "obtain", "obvious", "occur", "ocean", "october", "odor", "off", "offer", "office", "often", "oil", "okay", "old", "olive", "olympic", "omit", "once", "one", "onion", "online", "only", "open", "opera", "opinion", "oppose", "option", "orange", "orbit", "orchard", "order", "ordinary", "organ", "orient", "original", "orphan", "ostrich", "other", "outdoor", "outer", "output", "outside", "oval", "oven", "over", "own", "owner", "oxygen", "oyster", "ozone", "pact", "paddle", "page", "pair", "palace", "palm", "panda", "panel", "panic", "panther", "paper", "parade", "parent", "park", "parrot", "party", "pass", "patch", "path", "patient", "patrol", "pattern", "pause", "pave", "payment", "peace", "peanut", "pear", "peasant", "pelican", "pen", "penalty", "pencil", "people", "pepper", "perfect", "permit", "person", "pet", "phone", "photo", "phrase", "physical", "piano", "picnic", "picture", "piece", "pig", "pigeon", "pill", "pilot", "pink", "pioneer", "pipe", "pistol", "pitch", "pizza", "place", "planet", "plastic", "plate", "play", "please", "pledge", "pluck", "plug", "plunge", "poem", "poet", "point", "polar", "pole", "police", "pond", "pony", "pool", "popular", "portion", "position", "possible", "post", "potato", "pottery", "poverty", "powder", "power", "practice", "praise", "predict", "prefer", "prepare", "present", "pretty", "prevent", "price", "pride", "primary", "print", "priority", "prison", "private", "prize", "problem", "process", "produce", "profit", "program", "project", "promote", "proof", "property", "prosper", "protect", "proud", "provide", "public", "pudding", "pull", "pulp", "pulse", "pumpkin", "punch", "pupil", "puppy", "purchase", "purity", "purpose", "purse", "push", "put", "puzzle", "pyramid", "quality", "quantum", "quarter", "question", "quick", "quit", "quiz", "quote", "rabbit", "raccoon", "race", "rack", "radar", "radio", "rail", "rain", "raise", "rally", "ramp", "ranch", "random", "range", "rapid", "rare", "rate", "rather", "raven", "raw", "razor", "ready", "real", "reason", "rebel", "rebuild", "recall", "receive", "recipe", "record", "recycle", "reduce", "reflect", "reform", "refuse", "region", "regret", "regular", "reject", "relax", "release", "relief", "rely", "remain", "remember", "remind", "remove", "render", "renew", "rent", "reopen", "repair", "repeat", "replace", "report", "require", "rescue", "resemble", "resist", "resource", "response", "result", "retire", "retreat", "return", "reunion", "reveal", "review", "reward", "rhythm", "rib", "ribbon", "rice", "rich", "ride", "ridge", "rifle", "right", "rigid", "ring", "riot", "ripple", "risk", "ritual", "rival", "river", "road", "roast", "robot", "robust", "rocket", "romance", "roof", "rookie", "room", "rose", "rotate", "rough", "round", "route", "royal", "rubber", "rude", "rug", "rule", "run", "runway", "rural", "sad", "saddle", "sadness", "safe", "sail", "salad", "salmon", "salon", "salt", "salute", "same", "sample", "sand", "satisfy", "satoshi", "sauce", "sausage", "save", "say", "scale", "scan", "scare", "scatter", "scene", "scheme", "school", "science", "scissors", "scorpion", "scout", "scrap", "screen", "script", "scrub", "sea", "search", "season", "seat", "second", "secret", "section", "security", "seed", "seek", "segment", "select", "sell", "seminar", "senior", "sense", "sentence", "series", "service", "session", "settle", "setup", "seven", "shadow", "shaft", "shallow", "share", "shed", "shell", "sheriff", "shield", "shift", "shine", "ship", "shiver", "shock", "shoe", "shoot", "shop", "short", "shoulder", "shove", "shrimp", "shrug", "shuffle", "shy", "sibling", "sick", "side", "siege", "sight", "sign", "silent", "silk", "silly", "silver", "similar", "simple", "since", "sing", "siren", "sister", "situate", "six", "size", "skate", "sketch", "ski", "skill", "skin", "skirt", "skull", "slab", "slam", "sleep", "slender", "slice", "slide", "slight", "slim", "slogan", "slot", "slow", "slush", "small", "smart", "smile", "smoke", "smooth", "snack", "snake", "snap", "sniff", "snow", "soap", "soccer", "social", "sock", "soda", "soft", "solar", "soldier", "solid", "solution", "solve", "someone", "song", "soon", "sorry", "sort", "soul", "sound", "soup", "source", "south", "space", "spare", "spatial", "spawn", "speak", "special", "speed", "spell", "spend", "sphere", "spice", "spider", "spike", "spin", "spirit", "split", "spoil", "sponsor", "spoon", "sport", "spot", "spray", "spread", "spring", "spy", "square", "squeeze", "squirrel", "stable", "stadium", "staff", "stage", "stairs", "stamp", "stand", "start", "state", "stay", "steak", "steel", "stem", "step", "stereo", "stick", "still", "sting", "stock", "stomach", "stone", "stool", "story", "stove", "strategy", "street", "strike", "strong", "struggle", "student", "stuff", "stumble", "style", "subject", "submit", "subway", "success", "such", "sudden", "suffer", "sugar", "suggest", "suit", "summer", "sun", "sunny", "sunset", "super", "supply", "supreme", "sure", "surface", "surge", "surprise", "surround", "survey", "suspect", "sustain", "swallow", "swamp", "swap", "swarm", "swear", "sweet", "swift", "swim", "swing", "switch", "sword", "symbol", "symptom", "syrup", "system", "table", "tackle", "tag", "tail", "talent", "talk", "tank", "tape", "target", "task", "taste", "tattoo", "taxi", "teach", "team", "tell", "ten", "tenant", "tennis", "tent", "term", "test", "text", "thank", "that", "theme", "then", "theory", "there", "they", "thing", "this", "thought", "three", "thrive", "throw", "thumb", "thunder", "ticket", "tide", "tiger", "tilt", "timber", "time", "tiny", "tip", "tired", "tissue", "title", "toast", "tobacco", "today", "toddler", "toe", "together", "toilet", "token", "tomato", "tomorrow", "tone", "tongue", "tonight", "tool", "tooth", "top", "topic", "topple", "torch", "tornado", "tortoise", "toss", "total", "tourist", "toward", "tower", "town", "toy", "track", "trade", "traffic", "tragic", "train", "transfer", "trap", "trash", "travel", "tray", "treat", "tree", "trend", "trial", "tribe", "trick", "trigger", "trim", "trip", "trophy", "trouble", "truck", "true", "truly", "trumpet", "trust", "truth", "try", "tube", "tuition", "tumble", "tuna", "tunnel", "turkey", "turn", "turtle", "twelve", "twenty", "twice", "twin", "twist", "two", "type", "typical", "ugly", "umbrella", "unable", "unaware", "uncle", "uncover", "under", "undo", "unfair", "unfold", "unhappy", "uniform", "unique", "unit", "universe", "unknown", "unlock", "until", "unusual", "unveil", "update", "upgrade", "uphold", "upon", "upper", "upset", "urban", "urge", "usage", "use", "used", "useful", "useless", "usual", "utility", "vacant", "vacuum", "vague", "valid", "valley", "valve", "van", "vanish", "vapor", "various", "vast", "vault", "vehicle", "velvet", "vendor", "venture", "venue", "verb", "verify", "version", "very", "vessel", "veteran", "viable", "vibrant", "vicious", "victory", "video", "view", "village", "vintage", "violin", "virtual", "virus", "visa", "visit", "visual", "vital", "vivid", "vocal", "voice", "void", "volcano", "volume", "vote", "voyage", "wage", "wagon", "wait", "walk", "wall", "walnut", "want", "warfare", "warm", "warrior", "wash", "wasp", "waste", "water", "wave", "way", "wealth", "weapon", "wear", "weasel", "weather", "web", "wedding", "weekend", "weird", "welcome", "west", "wet", "whale", "what", "wheat", "wheel", "when", "where", "whip", "whisper", "wide", "width", "wife", "wild", "will", "win", "window", "wine", "wing", "wink", "winner", "winter", "wire", "wisdom", "wise", "wish", "witness", "wolf", "woman", "wonder", "wood", "wool", "word", "work", "world", "worry", "worth", "wrap", "wreck", "wrestle", "wrist", "write", "wrong", "yard", "year", "yellow", "you", "young", "youth", "zebra", "zero", "zone", "zoo" +) diff --git a/src/main/kotlin/com/radixdlt/bip39/wordlists/French.kt b/src/main/kotlin/com/radixdlt/bip39/wordlists/French.kt new file mode 100644 index 0000000..4ee3ff9 --- /dev/null +++ b/src/main/kotlin/com/radixdlt/bip39/wordlists/French.kt @@ -0,0 +1,3 @@ +package com.radixdlt.bip39.wordlists + +val WORDLIST_FRENCH = listOf("abaisser", "abandon", "abdiquer", "abeille", "abolir", "aborder", "aboutir", "aboyer", "abrasif", "abreuver", "abriter", "abroger", "abrupt", "absence", "absolu", "absurde", "abusif", "abyssal", "acadeÌmie", "acajou", "acarien", "accabler", "accepter", "acclamer", "accolade", "accroche", "accuser", "acerbe", "achat", "acheter", "aciduler", "acier", "acompte", "acqueÌrir", "acronyme", "acteur", "actif", "actuel", "adepte", "adeÌquat", "adheÌsif", "adjectif", "adjuger", "admettre", "admirer", "adopter", "adorer", "adoucir", "adresse", "adroit", "adulte", "adverbe", "aeÌrer", "aeÌronef", "affaire", "affecter", "affiche", "affreux", "affubler", "agacer", "agencer", "agile", "agiter", "agrafer", "agreÌable", "agrume", "aider", "aiguille", "ailier", "aimable", "aisance", "ajouter", "ajuster", "alarmer", "alchimie", "alerte", "algeÌ€bre", "algue", "alieÌner", "aliment", "alleÌger", "alliage", "allouer", "allumer", "alourdir", "alpaga", "altesse", "alveÌole", "amateur", "ambigu", "ambre", "ameÌnager", "amertume", "amidon", "amiral", "amorcer", "amour", "amovible", "amphibie", "ampleur", "amusant", "analyse", "anaphore", "anarchie", "anatomie", "ancien", "aneÌantir", "angle", "angoisse", "anguleux", "animal", "annexer", "annonce", "annuel", "anodin", "anomalie", "anonyme", "anormal", "antenne", "antidote", "anxieux", "apaiser", "apeÌritif", "aplanir", "apologie", "appareil", "appeler", "apporter", "appuyer", "aquarium", "aqueduc", "arbitre", "arbuste", "ardeur", "ardoise", "argent", "arlequin", "armature", "armement", "armoire", "armure", "arpenter", "arracher", "arriver", "arroser", "arsenic", "arteÌriel", "article", "aspect", "asphalte", "aspirer", "assaut", "asservir", "assiette", "associer", "assurer", "asticot", "astre", "astuce", "atelier", "atome", "atrium", "atroce", "attaque", "attentif", "attirer", "attraper", "aubaine", "auberge", "audace", "audible", "augurer", "aurore", "automne", "autruche", "avaler", "avancer", "avarice", "avenir", "averse", "aveugle", "aviateur", "avide", "avion", "aviser", "avoine", "avouer", "avril", "axial", "axiome", "badge", "bafouer", "bagage", "baguette", "baignade", "balancer", "balcon", "baleine", "balisage", "bambin", "bancaire", "bandage", "banlieue", "bannieÌ€re", "banquier", "barbier", "baril", "baron", "barque", "barrage", "bassin", "bastion", "bataille", "bateau", "batterie", "baudrier", "bavarder", "belette", "beÌlier", "belote", "beÌneÌfice", "berceau", "berger", "berline", "bermuda", "besace", "besogne", "beÌtail", "beurre", "biberon", "bicycle", "bidule", "bijou", "bilan", "bilingue", "billard", "binaire", "biologie", "biopsie", "biotype", "biscuit", "bison", "bistouri", "bitume", "bizarre", "blafard", "blague", "blanchir", "blessant", "blinder", "blond", "bloquer", "blouson", "bobard", "bobine", "boire", "boiser", "bolide", "bonbon", "bondir", "bonheur", "bonifier", "bonus", "bordure", "borne", "botte", "boucle", "boueux", "bougie", "boulon", "bouquin", "bourse", "boussole", "boutique", "boxeur", "branche", "brasier", "brave", "brebis", "breÌ€che", "breuvage", "bricoler", "brigade", "brillant", "brioche", "brique", "brochure", "broder", "bronzer", "brousse", "broyeur", "brume", "brusque", "brutal", "bruyant", "buffle", "buisson", "bulletin", "bureau", "burin", "bustier", "butiner", "butoir", "buvable", "buvette", "cabanon", "cabine", "cachette", "cadeau", "cadre", "cafeÌine", "caillou", "caisson", "calculer", "calepin", "calibre", "calmer", "calomnie", "calvaire", "camarade", "cameÌra", "camion", "campagne", "canal", "caneton", "canon", "cantine", "canular", "capable", "caporal", "caprice", "capsule", "capter", "capuche", "carabine", "carbone", "caresser", "caribou", "carnage", "carotte", "carreau", "carton", "cascade", "casier", "casque", "cassure", "causer", "caution", "cavalier", "caverne", "caviar", "ceÌdille", "ceinture", "ceÌleste", "cellule", "cendrier", "censurer", "central", "cercle", "ceÌreÌbral", "cerise", "cerner", "cerveau", "cesser", "chagrin", "chaise", "chaleur", "chambre", "chance", "chapitre", "charbon", "chasseur", "chaton", "chausson", "chavirer", "chemise", "chenille", "cheÌquier", "chercher", "cheval", "chien", "chiffre", "chignon", "chimeÌ€re", "chiot", "chlorure", "chocolat", "choisir", "chose", "chouette", "chrome", "chute", "cigare", "cigogne", "cimenter", "cineÌma", "cintrer", "circuler", "cirer", "cirque", "citerne", "citoyen", "citron", "civil", "clairon", "clameur", "claquer", "classe", "clavier", "client", "cligner", "climat", "clivage", "cloche", "clonage", "cloporte", "cobalt", "cobra", "cocasse", "cocotier", "coder", "codifier", "coffre", "cogner", "coheÌsion", "coiffer", "coincer", "coleÌ€re", "colibri", "colline", "colmater", "colonel", "combat", "comeÌdie", "commande", "compact", "concert", "conduire", "confier", "congeler", "connoter", "consonne", "contact", "convexe", "copain", "copie", "corail", "corbeau", "cordage", "corniche", "corpus", "correct", "corteÌ€ge", "cosmique", "costume", "coton", "coude", "coupure", "courage", "couteau", "couvrir", "coyote", "crabe", "crainte", "cravate", "crayon", "creÌature", "creÌditer", "creÌmeux", "creuser", "crevette", "cribler", "crier", "cristal", "criteÌ€re", "croire", "croquer", "crotale", "crucial", "cruel", "crypter", "cubique", "cueillir", "cuilleÌ€re", "cuisine", "cuivre", "culminer", "cultiver", "cumuler", "cupide", "curatif", "curseur", "cyanure", "cycle", "cylindre", "cynique", "daigner", "damier", "danger", "danseur", "dauphin", "deÌbattre", "deÌbiter", "deÌborder", "deÌbrider", "deÌbutant", "deÌcaler", "deÌcembre", "deÌchirer", "deÌcider", "deÌclarer", "deÌcorer", "deÌcrire", "deÌcupler", "deÌdale", "deÌductif", "deÌesse", "deÌfensif", "deÌfiler", "deÌfrayer", "deÌgager", "deÌgivrer", "deÌglutir", "deÌgrafer", "deÌjeuner", "deÌlice", "deÌloger", "demander", "demeurer", "deÌmolir", "deÌnicher", "deÌnouer", "dentelle", "deÌnuder", "deÌpart", "deÌpenser", "deÌphaser", "deÌplacer", "deÌposer", "deÌranger", "deÌrober", "deÌsastre", "descente", "deÌsert", "deÌsigner", "deÌsobeÌir", "dessiner", "destrier", "deÌtacher", "deÌtester", "deÌtourer", "deÌtresse", "devancer", "devenir", "deviner", "devoir", "diable", "dialogue", "diamant", "dicter", "diffeÌrer", "digeÌrer", "digital", "digne", "diluer", "dimanche", "diminuer", "dioxyde", "directif", "diriger", "discuter", "disposer", "dissiper", "distance", "divertir", "diviser", "docile", "docteur", "dogme", "doigt", "domaine", "domicile", "dompter", "donateur", "donjon", "donner", "dopamine", "dortoir", "dorure", "dosage", "doseur", "dossier", "dotation", "douanier", "double", "douceur", "douter", "doyen", "dragon", "draper", "dresser", "dribbler", "droiture", "duperie", "duplexe", "durable", "durcir", "dynastie", "eÌblouir", "eÌcarter", "eÌcharpe", "eÌchelle", "eÌclairer", "eÌclipse", "eÌclore", "eÌcluse", "eÌcole", "eÌconomie", "eÌcorce", "eÌcouter", "eÌcraser", "eÌcreÌmer", "eÌcrivain", "eÌcrou", "eÌcume", "eÌcureuil", "eÌdifier", "eÌduquer", "effacer", "effectif", "effigie", "effort", "effrayer", "effusion", "eÌgaliser", "eÌgarer", "eÌjecter", "eÌlaborer", "eÌlargir", "eÌlectron", "eÌleÌgant", "eÌleÌphant", "eÌleÌ€ve", "eÌligible", "eÌlitisme", "eÌloge", "eÌlucider", "eÌluder", "emballer", "embellir", "embryon", "eÌmeraude", "eÌmission", "emmener", "eÌmotion", "eÌmouvoir", "empereur", "employer", "emporter", "emprise", "eÌmulsion", "encadrer", "encheÌ€re", "enclave", "encoche", "endiguer", "endosser", "endroit", "enduire", "eÌnergie", "enfance", "enfermer", "enfouir", "engager", "engin", "englober", "eÌnigme", "enjamber", "enjeu", "enlever", "ennemi", "ennuyeux", "enrichir", "enrobage", "enseigne", "entasser", "entendre", "entier", "entourer", "entraver", "eÌnumeÌrer", "envahir", "enviable", "envoyer", "enzyme", "eÌolien", "eÌpaissir", "eÌpargne", "eÌpatant", "eÌpaule", "eÌpicerie", "eÌpideÌmie", "eÌpier", "eÌpilogue", "eÌpine", "eÌpisode", "eÌpitaphe", "eÌpoque", "eÌpreuve", "eÌprouver", "eÌpuisant", "eÌquerre", "eÌquipe", "eÌriger", "eÌrosion", "erreur", "eÌruption", "escalier", "espadon", "espeÌ€ce", "espieÌ€gle", "espoir", "esprit", "esquiver", "essayer", "essence", "essieu", "essorer", "estime", "estomac", "estrade", "eÌtageÌ€re", "eÌtaler", "eÌtanche", "eÌtatique", "eÌteindre", "eÌtendoir", "eÌternel", "eÌthanol", "eÌthique", "ethnie", "eÌtirer", "eÌtoffer", "eÌtoile", "eÌtonnant", "eÌtourdir", "eÌtrange", "eÌtroit", "eÌtude", "euphorie", "eÌvaluer", "eÌvasion", "eÌventail", "eÌvidence", "eÌviter", "eÌvolutif", "eÌvoquer", "exact", "exageÌrer", "exaucer", "exceller", "excitant", "exclusif", "excuse", "exeÌcuter", "exemple", "exercer", "exhaler", "exhorter", "exigence", "exiler", "exister", "exotique", "expeÌdier", "explorer", "exposer", "exprimer", "exquis", "extensif", "extraire", "exulter", "fable", "fabuleux", "facette", "facile", "facture", "faiblir", "falaise", "fameux", "famille", "farceur", "farfelu", "farine", "farouche", "fasciner", "fatal", "fatigue", "faucon", "fautif", "faveur", "favori", "feÌbrile", "feÌconder", "feÌdeÌrer", "feÌlin", "femme", "feÌmur", "fendoir", "feÌodal", "fermer", "feÌroce", "ferveur", "festival", "feuille", "feutre", "feÌvrier", "fiasco", "ficeler", "fictif", "fideÌ€le", "figure", "filature", "filetage", "filieÌ€re", "filleul", "filmer", "filou", "filtrer", "financer", "finir", "fiole", "firme", "fissure", "fixer", "flairer", "flamme", "flasque", "flatteur", "fleÌau", "fleÌ€che", "fleur", "flexion", "flocon", "flore", "fluctuer", "fluide", "fluvial", "folie", "fonderie", "fongible", "fontaine", "forcer", "forgeron", "formuler", "fortune", "fossile", "foudre", "fougeÌ€re", "fouiller", "foulure", "fourmi", "fragile", "fraise", "franchir", "frapper", "frayeur", "freÌgate", "freiner", "frelon", "freÌmir", "freÌneÌsie", "freÌ€re", "friable", "friction", "frisson", "frivole", "froid", "fromage", "frontal", "frotter", "fruit", "fugitif", "fuite", "fureur", "furieux", "furtif", "fusion", "futur", "gagner", "galaxie", "galerie", "gambader", "garantir", "gardien", "garnir", "garrigue", "gazelle", "gazon", "geÌant", "geÌlatine", "geÌlule", "gendarme", "geÌneÌral", "geÌnie", "genou", "gentil", "geÌologie", "geÌomeÌ€tre", "geÌranium", "germe", "gestuel", "geyser", "gibier", "gicler", "girafe", "givre", "glace", "glaive", "glisser", "globe", "gloire", "glorieux", "golfeur", "gomme", "gonfler", "gorge", "gorille", "goudron", "gouffre", "goulot", "goupille", "gourmand", "goutte", "graduel", "graffiti", "graine", "grand", "grappin", "gratuit", "gravir", "grenat", "griffure", "griller", "grimper", "grogner", "gronder", "grotte", "groupe", "gruger", "grutier", "gruyeÌ€re", "gueÌpard", "guerrier", "guide", "guimauve", "guitare", "gustatif", "gymnaste", "gyrostat", "habitude", "hachoir", "halte", "hameau", "hangar", "hanneton", "haricot", "harmonie", "harpon", "hasard", "heÌlium", "heÌmatome", "herbe", "heÌrisson", "hermine", "heÌron", "heÌsiter", "heureux", "hiberner", "hibou", "hilarant", "histoire", "hiver", "homard", "hommage", "homogeÌ€ne", "honneur", "honorer", "honteux", "horde", "horizon", "horloge", "hormone", "horrible", "houleux", "housse", "hublot", "huileux", "humain", "humble", "humide", "humour", "hurler", "hydromel", "hygieÌ€ne", "hymne", "hypnose", "idylle", "ignorer", "iguane", "illicite", "illusion", "image", "imbiber", "imiter", "immense", "immobile", "immuable", "impact", "impeÌrial", "implorer", "imposer", "imprimer", "imputer", "incarner", "incendie", "incident", "incliner", "incolore", "indexer", "indice", "inductif", "ineÌdit", "ineptie", "inexact", "infini", "infliger", "informer", "infusion", "ingeÌrer", "inhaler", "inhiber", "injecter", "injure", "innocent", "inoculer", "inonder", "inscrire", "insecte", "insigne", "insolite", "inspirer", "instinct", "insulter", "intact", "intense", "intime", "intrigue", "intuitif", "inutile", "invasion", "inventer", "inviter", "invoquer", "ironique", "irradier", "irreÌel", "irriter", "isoler", "ivoire", "ivresse", "jaguar", "jaillir", "jambe", "janvier", "jardin", "jauger", "jaune", "javelot", "jetable", "jeton", "jeudi", "jeunesse", "joindre", "joncher", "jongler", "joueur", "jouissif", "journal", "jovial", "joyau", "joyeux", "jubiler", "jugement", "junior", "jupon", "juriste", "justice", "juteux", "juveÌnile", "kayak", "kimono", "kiosque", "label", "labial", "labourer", "laceÌrer", "lactose", "lagune", "laine", "laisser", "laitier", "lambeau", "lamelle", "lampe", "lanceur", "langage", "lanterne", "lapin", "largeur", "larme", "laurier", "lavabo", "lavoir", "lecture", "leÌgal", "leÌger", "leÌgume", "lessive", "lettre", "levier", "lexique", "leÌzard", "liasse", "libeÌrer", "libre", "licence", "licorne", "lieÌ€ge", "lieÌ€vre", "ligature", "ligoter", "ligue", "limer", "limite", "limonade", "limpide", "lineÌaire", "lingot", "lionceau", "liquide", "lisieÌ€re", "lister", "lithium", "litige", "littoral", "livreur", "logique", "lointain", "loisir", "lombric", "loterie", "louer", "lourd", "loutre", "louve", "loyal", "lubie", "lucide", "lucratif", "lueur", "lugubre", "luisant", "lumieÌ€re", "lunaire", "lundi", "luron", "lutter", "luxueux", "machine", "magasin", "magenta", "magique", "maigre", "maillon", "maintien", "mairie", "maison", "majorer", "malaxer", "maleÌfice", "malheur", "malice", "mallette", "mammouth", "mandater", "maniable", "manquant", "manteau", "manuel", "marathon", "marbre", "marchand", "mardi", "maritime", "marqueur", "marron", "marteler", "mascotte", "massif", "mateÌriel", "matieÌ€re", "matraque", "maudire", "maussade", "mauve", "maximal", "meÌchant", "meÌconnu", "meÌdaille", "meÌdecin", "meÌditer", "meÌduse", "meilleur", "meÌlange", "meÌlodie", "membre", "meÌmoire", "menacer", "mener", "menhir", "mensonge", "mentor", "mercredi", "meÌrite", "merle", "messager", "mesure", "meÌtal", "meÌteÌore", "meÌthode", "meÌtier", "meuble", "miauler", "microbe", "miette", "mignon", "migrer", "milieu", "million", "mimique", "mince", "mineÌral", "minimal", "minorer", "minute", "miracle", "miroiter", "missile", "mixte", "mobile", "moderne", "moelleux", "mondial", "moniteur", "monnaie", "monotone", "monstre", "montagne", "monument", "moqueur", "morceau", "morsure", "mortier", "moteur", "motif", "mouche", "moufle", "moulin", "mousson", "mouton", "mouvant", "multiple", "munition", "muraille", "mureÌ€ne", "murmure", "muscle", "museÌum", "musicien", "mutation", "muter", "mutuel", "myriade", "myrtille", "mysteÌ€re", "mythique", "nageur", "nappe", "narquois", "narrer", "natation", "nation", "nature", "naufrage", "nautique", "navire", "neÌbuleux", "nectar", "neÌfaste", "neÌgation", "neÌgliger", "neÌgocier", "neige", "nerveux", "nettoyer", "neurone", "neutron", "neveu", "niche", "nickel", "nitrate", "niveau", "noble", "nocif", "nocturne", "noirceur", "noisette", "nomade", "nombreux", "nommer", "normatif", "notable", "notifier", "notoire", "nourrir", "nouveau", "novateur", "novembre", "novice", "nuage", "nuancer", "nuire", "nuisible", "numeÌro", "nuptial", "nuque", "nutritif", "obeÌir", "objectif", "obliger", "obscur", "observer", "obstacle", "obtenir", "obturer", "occasion", "occuper", "oceÌan", "octobre", "octroyer", "octupler", "oculaire", "odeur", "odorant", "offenser", "officier", "offrir", "ogive", "oiseau", "oisillon", "olfactif", "olivier", "ombrage", "omettre", "onctueux", "onduler", "oneÌreux", "onirique", "opale", "opaque", "opeÌrer", "opinion", "opportun", "opprimer", "opter", "optique", "orageux", "orange", "orbite", "ordonner", "oreille", "organe", "orgueil", "orifice", "ornement", "orque", "ortie", "osciller", "osmose", "ossature", "otarie", "ouragan", "ourson", "outil", "outrager", "ouvrage", "ovation", "oxyde", "oxygeÌ€ne", "ozone", "paisible", "palace", "palmareÌ€s", "palourde", "palper", "panache", "panda", "pangolin", "paniquer", "panneau", "panorama", "pantalon", "papaye", "papier", "papoter", "papyrus", "paradoxe", "parcelle", "paresse", "parfumer", "parler", "parole", "parrain", "parsemer", "partager", "parure", "parvenir", "passion", "pasteÌ€que", "paternel", "patience", "patron", "pavillon", "pavoiser", "payer", "paysage", "peigne", "peintre", "pelage", "peÌlican", "pelle", "pelouse", "peluche", "pendule", "peÌneÌtrer", "peÌnible", "pensif", "peÌnurie", "peÌpite", "peÌplum", "perdrix", "perforer", "peÌriode", "permuter", "perplexe", "persil", "perte", "peser", "peÌtale", "petit", "peÌtrir", "peuple", "pharaon", "phobie", "phoque", "photon", "phrase", "physique", "piano", "pictural", "pieÌ€ce", "pierre", "pieuvre", "pilote", "pinceau", "pipette", "piquer", "pirogue", "piscine", "piston", "pivoter", "pixel", "pizza", "placard", "plafond", "plaisir", "planer", "plaque", "plastron", "plateau", "pleurer", "plexus", "pliage", "plomb", "plonger", "pluie", "plumage", "pochette", "poeÌsie", "poeÌ€te", "pointe", "poirier", "poisson", "poivre", "polaire", "policier", "pollen", "polygone", "pommade", "pompier", "ponctuel", "pondeÌrer", "poney", "portique", "position", "posseÌder", "posture", "potager", "poteau", "potion", "pouce", "poulain", "poumon", "pourpre", "poussin", "pouvoir", "prairie", "pratique", "preÌcieux", "preÌdire", "preÌfixe", "preÌlude", "preÌnom", "preÌsence", "preÌtexte", "preÌvoir", "primitif", "prince", "prison", "priver", "probleÌ€me", "proceÌder", "prodige", "profond", "progreÌ€s", "proie", "projeter", "prologue", "promener", "propre", "prospeÌ€re", "proteÌger", "prouesse", "proverbe", "prudence", "pruneau", "psychose", "public", "puceron", "puiser", "pulpe", "pulsar", "punaise", "punitif", "pupitre", "purifier", "puzzle", "pyramide", "quasar", "querelle", "question", "quieÌtude", "quitter", "quotient", "racine", "raconter", "radieux", "ragondin", "raideur", "raisin", "ralentir", "rallonge", "ramasser", "rapide", "rasage", "ratisser", "ravager", "ravin", "rayonner", "reÌactif", "reÌagir", "reÌaliser", "reÌanimer", "recevoir", "reÌciter", "reÌclamer", "reÌcolter", "recruter", "reculer", "recycler", "reÌdiger", "redouter", "refaire", "reÌflexe", "reÌformer", "refrain", "refuge", "reÌgalien", "reÌgion", "reÌglage", "reÌgulier", "reÌiteÌrer", "rejeter", "rejouer", "relatif", "relever", "relief", "remarque", "remeÌ€de", "remise", "remonter", "remplir", "remuer", "renard", "renfort", "renifler", "renoncer", "rentrer", "renvoi", "replier", "reporter", "reprise", "reptile", "requin", "reÌserve", "reÌsineux", "reÌsoudre", "respect", "rester", "reÌsultat", "reÌtablir", "retenir", "reÌticule", "retomber", "retracer", "reÌunion", "reÌussir", "revanche", "revivre", "reÌvolte", "reÌvulsif", "richesse", "rideau", "rieur", "rigide", "rigoler", "rincer", "riposter", "risible", "risque", "rituel", "rival", "rivieÌ€re", "rocheux", "romance", "rompre", "ronce", "rondin", "roseau", "rosier", "rotatif", "rotor", "rotule", "rouge", "rouille", "rouleau", "routine", "royaume", "ruban", "rubis", "ruche", "ruelle", "rugueux", "ruiner", "ruisseau", "ruser", "rustique", "rythme", "sabler", "saboter", "sabre", "sacoche", "safari", "sagesse", "saisir", "salade", "salive", "salon", "saluer", "samedi", "sanction", "sanglier", "sarcasme", "sardine", "saturer", "saugrenu", "saumon", "sauter", "sauvage", "savant", "savonner", "scalpel", "scandale", "sceÌleÌrat", "sceÌnario", "sceptre", "scheÌma", "science", "scinder", "score", "scrutin", "sculpter", "seÌance", "seÌcable", "seÌcher", "secouer", "seÌcreÌter", "seÌdatif", "seÌduire", "seigneur", "seÌjour", "seÌlectif", "semaine", "sembler", "semence", "seÌminal", "seÌnateur", "sensible", "sentence", "seÌparer", "seÌquence", "serein", "sergent", "seÌrieux", "serrure", "seÌrum", "service", "seÌsame", "seÌvir", "sevrage", "sextuple", "sideÌral", "sieÌ€cle", "sieÌger", "siffler", "sigle", "signal", "silence", "silicium", "simple", "sinceÌ€re", "sinistre", "siphon", "sirop", "sismique", "situer", "skier", "social", "socle", "sodium", "soigneux", "soldat", "soleil", "solitude", "soluble", "sombre", "sommeil", "somnoler", "sonde", "songeur", "sonnette", "sonore", "sorcier", "sortir", "sosie", "sottise", "soucieux", "soudure", "souffle", "soulever", "soupape", "source", "soutirer", "souvenir", "spacieux", "spatial", "speÌcial", "spheÌ€re", "spiral", "stable", "station", "sternum", "stimulus", "stipuler", "strict", "studieux", "stupeur", "styliste", "sublime", "substrat", "subtil", "subvenir", "succeÌ€s", "sucre", "suffixe", "suggeÌrer", "suiveur", "sulfate", "superbe", "supplier", "surface", "suricate", "surmener", "surprise", "sursaut", "survie", "suspect", "syllabe", "symbole", "symeÌtrie", "synapse", "syntaxe", "systeÌ€me", "tabac", "tablier", "tactile", "tailler", "talent", "talisman", "talonner", "tambour", "tamiser", "tangible", "tapis", "taquiner", "tarder", "tarif", "tartine", "tasse", "tatami", "tatouage", "taupe", "taureau", "taxer", "teÌmoin", "temporel", "tenaille", "tendre", "teneur", "tenir", "tension", "terminer", "terne", "terrible", "teÌtine", "texte", "theÌ€me", "theÌorie", "theÌrapie", "thorax", "tibia", "tieÌ€de", "timide", "tirelire", "tiroir", "tissu", "titane", "titre", "tituber", "toboggan", "toleÌrant", "tomate", "tonique", "tonneau", "toponyme", "torche", "tordre", "tornade", "torpille", "torrent", "torse", "tortue", "totem", "toucher", "tournage", "tousser", "toxine", "traction", "trafic", "tragique", "trahir", "train", "trancher", "travail", "treÌ€fle", "tremper", "treÌsor", "treuil", "triage", "tribunal", "tricoter", "trilogie", "triomphe", "tripler", "triturer", "trivial", "trombone", "tronc", "tropical", "troupeau", "tuile", "tulipe", "tumulte", "tunnel", "turbine", "tuteur", "tutoyer", "tuyau", "tympan", "typhon", "typique", "tyran", "ubuesque", "ultime", "ultrason", "unanime", "unifier", "union", "unique", "unitaire", "univers", "uranium", "urbain", "urticant", "usage", "usine", "usuel", "usure", "utile", "utopie", "vacarme", "vaccin", "vagabond", "vague", "vaillant", "vaincre", "vaisseau", "valable", "valise", "vallon", "valve", "vampire", "vanille", "vapeur", "varier", "vaseux", "vassal", "vaste", "vecteur", "vedette", "veÌgeÌtal", "veÌhicule", "veinard", "veÌloce", "vendredi", "veÌneÌrer", "venger", "venimeux", "ventouse", "verdure", "veÌrin", "vernir", "verrou", "verser", "vertu", "veston", "veÌteÌran", "veÌtuste", "vexant", "vexer", "viaduc", "viande", "victoire", "vidange", "videÌo", "vignette", "vigueur", "vilain", "village", "vinaigre", "violon", "vipeÌ€re", "virement", "virtuose", "virus", "visage", "viseur", "vision", "visqueux", "visuel", "vital", "vitesse", "viticole", "vitrine", "vivace", "vivipare", "vocation", "voguer", "voile", "voisin", "voiture", "volaille", "volcan", "voltiger", "volume", "vorace", "vortex", "voter", "vouloir", "voyage", "voyelle", "wagon", "xeÌnon", "yacht", "zeÌ€bre", "zeÌnith", "zeste", "zoologie") diff --git a/src/main/kotlin/com/radixdlt/bip39/wordlists/Italian.kt b/src/main/kotlin/com/radixdlt/bip39/wordlists/Italian.kt new file mode 100644 index 0000000..dad7cb4 --- /dev/null +++ b/src/main/kotlin/com/radixdlt/bip39/wordlists/Italian.kt @@ -0,0 +1,3 @@ +package com.radixdlt.bip39.wordlists + +val WORDLIST_ITALIAN = listOf("abaco", "abbaglio", "abbinato", "abete", "abisso", "abolire", "abrasivo", "abrogato", "accadere", "accenno", "accusato", "acetone", "achille", "acido", "acqua", "acre", "acrilico", "acrobata", "acuto", "adagio", "addebito", "addome", "adeguato", "aderire", "adipe", "adottare", "adulare", "affabile", "affetto", "affisso", "affranto", "aforisma", "afoso", "africano", "agave", "agente", "agevole", "aggancio", "agire", "agitare", "agonismo", "agricolo", "agrumeto", "aguzzo", "alabarda", "alato", "albatro", "alberato", "albo", "albume", "alce", "alcolico", "alettone", "alfa", "algebra", "aliante", "alibi", "alimento", "allagato", "allegro", "allievo", "allodola", "allusivo", "almeno", "alogeno", "alpaca", "alpestre", "altalena", "alterno", "alticcio", "altrove", "alunno", "alveolo", "alzare", "amalgama", "amanita", "amarena", "ambito", "ambrato", "ameba", "america", "ametista", "amico", "ammasso", "ammenda", "ammirare", "ammonito", "amore", "ampio", "ampliare", "amuleto", "anacardo", "anagrafe", "analista", "anarchia", "anatra", "anca", "ancella", "ancora", "andare", "andrea", "anello", "angelo", "angolare", "angusto", "anima", "annegare", "annidato", "anno", "annuncio", "anonimo", "anticipo", "anzi", "apatico", "apertura", "apode", "apparire", "appetito", "appoggio", "approdo", "appunto", "aprile", "arabica", "arachide", "aragosta", "araldica", "arancio", "aratura", "arazzo", "arbitro", "archivio", "ardito", "arenile", "argento", "argine", "arguto", "aria", "armonia", "arnese", "arredato", "arringa", "arrosto", "arsenico", "arso", "artefice", "arzillo", "asciutto", "ascolto", "asepsi", "asettico", "asfalto", "asino", "asola", "aspirato", "aspro", "assaggio", "asse", "assoluto", "assurdo", "asta", "astenuto", "astice", "astratto", "atavico", "ateismo", "atomico", "atono", "attesa", "attivare", "attorno", "attrito", "attuale", "ausilio", "austria", "autista", "autonomo", "autunno", "avanzato", "avere", "avvenire", "avviso", "avvolgere", "azione", "azoto", "azzimo", "azzurro", "babele", "baccano", "bacino", "baco", "badessa", "badilata", "bagnato", "baita", "balcone", "baldo", "balena", "ballata", "balzano", "bambino", "bandire", "baraonda", "barbaro", "barca", "baritono", "barlume", "barocco", "basilico", "basso", "batosta", "battuto", "baule", "bava", "bavosa", "becco", "beffa", "belgio", "belva", "benda", "benevole", "benigno", "benzina", "bere", "berlina", "beta", "bibita", "bici", "bidone", "bifido", "biga", "bilancia", "bimbo", "binocolo", "biologo", "bipede", "bipolare", "birbante", "birra", "biscotto", "bisesto", "bisnonno", "bisonte", "bisturi", "bizzarro", "blando", "blatta", "bollito", "bonifico", "bordo", "bosco", "botanico", "bottino", "bozzolo", "braccio", "bradipo", "brama", "branca", "bravura", "bretella", "brevetto", "brezza", "briglia", "brillante", "brindare", "broccolo", "brodo", "bronzina", "brullo", "bruno", "bubbone", "buca", "budino", "buffone", "buio", "bulbo", "buono", "burlone", "burrasca", "bussola", "busta", "cadetto", "caduco", "calamaro", "calcolo", "calesse", "calibro", "calmo", "caloria", "cambusa", "camerata", "camicia", "cammino", "camola", "campale", "canapa", "candela", "cane", "canino", "canotto", "cantina", "capace", "capello", "capitolo", "capogiro", "cappero", "capra", "capsula", "carapace", "carcassa", "cardo", "carisma", "carovana", "carretto", "cartolina", "casaccio", "cascata", "caserma", "caso", "cassone", "castello", "casuale", "catasta", "catena", "catrame", "cauto", "cavillo", "cedibile", "cedrata", "cefalo", "celebre", "cellulare", "cena", "cenone", "centesimo", "ceramica", "cercare", "certo", "cerume", "cervello", "cesoia", "cespo", "ceto", "chela", "chiaro", "chicca", "chiedere", "chimera", "china", "chirurgo", "chitarra", "ciao", "ciclismo", "cifrare", "cigno", "cilindro", "ciottolo", "circa", "cirrosi", "citrico", "cittadino", "ciuffo", "civetta", "civile", "classico", "clinica", "cloro", "cocco", "codardo", "codice", "coerente", "cognome", "collare", "colmato", "colore", "colposo", "coltivato", "colza", "coma", "cometa", "commando", "comodo", "computer", "comune", "conciso", "condurre", "conferma", "congelare", "coniuge", "connesso", "conoscere", "consumo", "continuo", "convegno", "coperto", "copione", "coppia", "copricapo", "corazza", "cordata", "coricato", "cornice", "corolla", "corpo", "corredo", "corsia", "cortese", "cosmico", "costante", "cottura", "covato", "cratere", "cravatta", "creato", "credere", "cremoso", "crescita", "creta", "criceto", "crinale", "crisi", "critico", "croce", "cronaca", "crostata", "cruciale", "crusca", "cucire", "cuculo", "cugino", "cullato", "cupola", "curatore", "cursore", "curvo", "cuscino", "custode", "dado", "daino", "dalmata", "damerino", "daniela", "dannoso", "danzare", "datato", "davanti", "davvero", "debutto", "decennio", "deciso", "declino", "decollo", "decreto", "dedicato", "definito", "deforme", "degno", "delegare", "delfino", "delirio", "delta", "demenza", "denotato", "dentro", "deposito", "derapata", "derivare", "deroga", "descritto", "deserto", "desiderio", "desumere", "detersivo", "devoto", "diametro", "dicembre", "diedro", "difeso", "diffuso", "digerire", "digitale", "diluvio", "dinamico", "dinnanzi", "dipinto", "diploma", "dipolo", "diradare", "dire", "dirotto", "dirupo", "disagio", "discreto", "disfare", "disgelo", "disposto", "distanza", "disumano", "dito", "divano", "divelto", "dividere", "divorato", "doblone", "docente", "doganale", "dogma", "dolce", "domato", "domenica", "dominare", "dondolo", "dono", "dormire", "dote", "dottore", "dovuto", "dozzina", "drago", "druido", "dubbio", "dubitare", "ducale", "duna", "duomo", "duplice", "duraturo", "ebano", "eccesso", "ecco", "eclissi", "economia", "edera", "edicola", "edile", "editoria", "educare", "egemonia", "egli", "egoismo", "egregio", "elaborato", "elargire", "elegante", "elencato", "eletto", "elevare", "elfico", "elica", "elmo", "elsa", "eluso", "emanato", "emblema", "emesso", "emiro", "emotivo", "emozione", "empirico", "emulo", "endemico", "enduro", "energia", "enfasi", "enoteca", "entrare", "enzima", "epatite", "epilogo", "episodio", "epocale", "eppure", "equatore", "erario", "erba", "erboso", "erede", "eremita", "erigere", "ermetico", "eroe", "erosivo", "errante", "esagono", "esame", "esanime", "esaudire", "esca", "esempio", "esercito", "esibito", "esigente", "esistere", "esito", "esofago", "esortato", "esoso", "espanso", "espresso", "essenza", "esso", "esteso", "estimare", "estonia", "estroso", "esultare", "etilico", "etnico", "etrusco", "etto", "euclideo", "europa", "evaso", "evidenza", "evitato", "evoluto", "evviva", "fabbrica", "faccenda", "fachiro", "falco", "famiglia", "fanale", "fanfara", "fango", "fantasma", "fare", "farfalla", "farinoso", "farmaco", "fascia", "fastoso", "fasullo", "faticare", "fato", "favoloso", "febbre", "fecola", "fede", "fegato", "felpa", "feltro", "femmina", "fendere", "fenomeno", "fermento", "ferro", "fertile", "fessura", "festivo", "fetta", "feudo", "fiaba", "fiducia", "fifa", "figurato", "filo", "finanza", "finestra", "finire", "fiore", "fiscale", "fisico", "fiume", "flacone", "flamenco", "flebo", "flemma", "florido", "fluente", "fluoro", "fobico", "focaccia", "focoso", "foderato", "foglio", "folata", "folclore", "folgore", "fondente", "fonetico", "fonia", "fontana", "forbito", "forchetta", "foresta", "formica", "fornaio", "foro", "fortezza", "forzare", "fosfato", "fosso", "fracasso", "frana", "frassino", "fratello", "freccetta", "frenata", "fresco", "frigo", "frollino", "fronde", "frugale", "frutta", "fucilata", "fucsia", "fuggente", "fulmine", "fulvo", "fumante", "fumetto", "fumoso", "fune", "funzione", "fuoco", "furbo", "furgone", "furore", "fuso", "futile", "gabbiano", "gaffe", "galateo", "gallina", "galoppo", "gambero", "gamma", "garanzia", "garbo", "garofano", "garzone", "gasdotto", "gasolio", "gastrico", "gatto", "gaudio", "gazebo", "gazzella", "geco", "gelatina", "gelso", "gemello", "gemmato", "gene", "genitore", "gennaio", "genotipo", "gergo", "ghepardo", "ghiaccio", "ghisa", "giallo", "gilda", "ginepro", "giocare", "gioiello", "giorno", "giove", "girato", "girone", "gittata", "giudizio", "giurato", "giusto", "globulo", "glutine", "gnomo", "gobba", "golf", "gomito", "gommone", "gonfio", "gonna", "governo", "gracile", "grado", "grafico", "grammo", "grande", "grattare", "gravoso", "grazia", "greca", "gregge", "grifone", "grigio", "grinza", "grotta", "gruppo", "guadagno", "guaio", "guanto", "guardare", "gufo", "guidare", "ibernato", "icona", "identico", "idillio", "idolo", "idra", "idrico", "idrogeno", "igiene", "ignaro", "ignorato", "ilare", "illeso", "illogico", "illudere", "imballo", "imbevuto", "imbocco", "imbuto", "immane", "immerso", "immolato", "impacco", "impeto", "impiego", "importo", "impronta", "inalare", "inarcare", "inattivo", "incanto", "incendio", "inchino", "incisivo", "incluso", "incontro", "incrocio", "incubo", "indagine", "india", "indole", "inedito", "infatti", "infilare", "inflitto", "ingaggio", "ingegno", "inglese", "ingordo", "ingrosso", "innesco", "inodore", "inoltrare", "inondato", "insano", "insetto", "insieme", "insonnia", "insulina", "intasato", "intero", "intonaco", "intuito", "inumidire", "invalido", "invece", "invito", "iperbole", "ipnotico", "ipotesi", "ippica", "iride", "irlanda", "ironico", "irrigato", "irrorare", "isolato", "isotopo", "isterico", "istituto", "istrice", "italia", "iterare", "labbro", "labirinto", "lacca", "lacerato", "lacrima", "lacuna", "laddove", "lago", "lampo", "lancetta", "lanterna", "lardoso", "larga", "laringe", "lastra", "latenza", "latino", "lattuga", "lavagna", "lavoro", "legale", "leggero", "lembo", "lentezza", "lenza", "leone", "lepre", "lesivo", "lessato", "lesto", "letterale", "leva", "levigato", "libero", "lido", "lievito", "lilla", "limatura", "limitare", "limpido", "lineare", "lingua", "liquido", "lira", "lirica", "lisca", "lite", "litigio", "livrea", "locanda", "lode", "logica", "lombare", "londra", "longevo", "loquace", "lorenzo", "loto", "lotteria", "luce", "lucidato", "lumaca", "luminoso", "lungo", "lupo", "luppolo", "lusinga", "lusso", "lutto", "macabro", "macchina", "macero", "macinato", "madama", "magico", "maglia", "magnete", "magro", "maiolica", "malafede", "malgrado", "malinteso", "malsano", "malto", "malumore", "mana", "mancia", "mandorla", "mangiare", "manifesto", "mannaro", "manovra", "mansarda", "mantide", "manubrio", "mappa", "maratona", "marcire", "maretta", "marmo", "marsupio", "maschera", "massaia", "mastino", "materasso", "matricola", "mattone", "maturo", "mazurca", "meandro", "meccanico", "mecenate", "medesimo", "meditare", "mega", "melassa", "melis", "melodia", "meninge", "meno", "mensola", "mercurio", "merenda", "merlo", "meschino", "mese", "messere", "mestolo", "metallo", "metodo", "mettere", "miagolare", "mica", "micelio", "michele", "microbo", "midollo", "miele", "migliore", "milano", "milite", "mimosa", "minerale", "mini", "minore", "mirino", "mirtillo", "miscela", "missiva", "misto", "misurare", "mitezza", "mitigare", "mitra", "mittente", "mnemonico", "modello", "modifica", "modulo", "mogano", "mogio", "mole", "molosso", "monastero", "monco", "mondina", "monetario", "monile", "monotono", "monsone", "montato", "monviso", "mora", "mordere", "morsicato", "mostro", "motivato", "motosega", "motto", "movenza", "movimento", "mozzo", "mucca", "mucosa", "muffa", "mughetto", "mugnaio", "mulatto", "mulinello", "multiplo", "mummia", "munto", "muovere", "murale", "musa", "muscolo", "musica", "mutevole", "muto", "nababbo", "nafta", "nanometro", "narciso", "narice", "narrato", "nascere", "nastrare", "naturale", "nautica", "naviglio", "nebulosa", "necrosi", "negativo", "negozio", "nemmeno", "neofita", "neretto", "nervo", "nessuno", "nettuno", "neutrale", "neve", "nevrotico", "nicchia", "ninfa", "nitido", "nobile", "nocivo", "nodo", "nome", "nomina", "nordico", "normale", "norvegese", "nostrano", "notare", "notizia", "notturno", "novella", "nucleo", "nulla", "numero", "nuovo", "nutrire", "nuvola", "nuziale", "oasi", "obbedire", "obbligo", "obelisco", "oblio", "obolo", "obsoleto", "occasione", "occhio", "occidente", "occorrere", "occultare", "ocra", "oculato", "odierno", "odorare", "offerta", "offrire", "offuscato", "oggetto", "oggi", "ognuno", "olandese", "olfatto", "oliato", "oliva", "ologramma", "oltre", "omaggio", "ombelico", "ombra", "omega", "omissione", "ondoso", "onere", "onice", "onnivoro", "onorevole", "onta", "operato", "opinione", "opposto", "oracolo", "orafo", "ordine", "orecchino", "orefice", "orfano", "organico", "origine", "orizzonte", "orma", "ormeggio", "ornativo", "orologio", "orrendo", "orribile", "ortensia", "ortica", "orzata", "orzo", "osare", "oscurare", "osmosi", "ospedale", "ospite", "ossa", "ossidare", "ostacolo", "oste", "otite", "otre", "ottagono", "ottimo", "ottobre", "ovale", "ovest", "ovino", "oviparo", "ovocito", "ovunque", "ovviare", "ozio", "pacchetto", "pace", "pacifico", "padella", "padrone", "paese", "paga", "pagina", "palazzina", "palesare", "pallido", "palo", "palude", "pandoro", "pannello", "paolo", "paonazzo", "paprica", "parabola", "parcella", "parere", "pargolo", "pari", "parlato", "parola", "partire", "parvenza", "parziale", "passivo", "pasticca", "patacca", "patologia", "pattume", "pavone", "peccato", "pedalare", "pedonale", "peggio", "peloso", "penare", "pendice", "penisola", "pennuto", "penombra", "pensare", "pentola", "pepe", "pepita", "perbene", "percorso", "perdonato", "perforare", "pergamena", "periodo", "permesso", "perno", "perplesso", "persuaso", "pertugio", "pervaso", "pesatore", "pesista", "peso", "pestifero", "petalo", "pettine", "petulante", "pezzo", "piacere", "pianta", "piattino", "piccino", "picozza", "piega", "pietra", "piffero", "pigiama", "pigolio", "pigro", "pila", "pilifero", "pillola", "pilota", "pimpante", "pineta", "pinna", "pinolo", "pioggia", "piombo", "piramide", "piretico", "pirite", "pirolisi", "pitone", "pizzico", "placebo", "planare", "plasma", "platano", "plenario", "pochezza", "poderoso", "podismo", "poesia", "poggiare", "polenta", "poligono", "pollice", "polmonite", "polpetta", "polso", "poltrona", "polvere", "pomice", "pomodoro", "ponte", "popoloso", "porfido", "poroso", "porpora", "porre", "portata", "posa", "positivo", "possesso", "postulato", "potassio", "potere", "pranzo", "prassi", "pratica", "precluso", "predica", "prefisso", "pregiato", "prelievo", "premere", "prenotare", "preparato", "presenza", "pretesto", "prevalso", "prima", "principe", "privato", "problema", "procura", "produrre", "profumo", "progetto", "prolunga", "promessa", "pronome", "proposta", "proroga", "proteso", "prova", "prudente", "prugna", "prurito", "psiche", "pubblico", "pudica", "pugilato", "pugno", "pulce", "pulito", "pulsante", "puntare", "pupazzo", "pupilla", "puro", "quadro", "qualcosa", "quasi", "querela", "quota", "raccolto", "raddoppio", "radicale", "radunato", "raffica", "ragazzo", "ragione", "ragno", "ramarro", "ramingo", "ramo", "randagio", "rantolare", "rapato", "rapina", "rappreso", "rasatura", "raschiato", "rasente", "rassegna", "rastrello", "rata", "ravveduto", "reale", "recepire", "recinto", "recluta", "recondito", "recupero", "reddito", "redimere", "regalato", "registro", "regola", "regresso", "relazione", "remare", "remoto", "renna", "replica", "reprimere", "reputare", "resa", "residente", "responso", "restauro", "rete", "retina", "retorica", "rettifica", "revocato", "riassunto", "ribadire", "ribelle", "ribrezzo", "ricarica", "ricco", "ricevere", "riciclato", "ricordo", "ricreduto", "ridicolo", "ridurre", "rifasare", "riflesso", "riforma", "rifugio", "rigare", "rigettato", "righello", "rilassato", "rilevato", "rimanere", "rimbalzo", "rimedio", "rimorchio", "rinascita", "rincaro", "rinforzo", "rinnovo", "rinomato", "rinsavito", "rintocco", "rinuncia", "rinvenire", "riparato", "ripetuto", "ripieno", "riportare", "ripresa", "ripulire", "risata", "rischio", "riserva", "risibile", "riso", "rispetto", "ristoro", "risultato", "risvolto", "ritardo", "ritegno", "ritmico", "ritrovo", "riunione", "riva", "riverso", "rivincita", "rivolto", "rizoma", "roba", "robotico", "robusto", "roccia", "roco", "rodaggio", "rodere", "roditore", "rogito", "rollio", "romantico", "rompere", "ronzio", "rosolare", "rospo", "rotante", "rotondo", "rotula", "rovescio", "rubizzo", "rubrica", "ruga", "rullino", "rumine", "rumoroso", "ruolo", "rupe", "russare", "rustico", "sabato", "sabbiare", "sabotato", "sagoma", "salasso", "saldatura", "salgemma", "salivare", "salmone", "salone", "saltare", "saluto", "salvo", "sapere", "sapido", "saporito", "saraceno", "sarcasmo", "sarto", "sassoso", "satellite", "satira", "satollo", "saturno", "savana", "savio", "saziato", "sbadiglio", "sbalzo", "sbancato", "sbarra", "sbattere", "sbavare", "sbendare", "sbirciare", "sbloccato", "sbocciato", "sbrinare", "sbruffone", "sbuffare", "scabroso", "scadenza", "scala", "scambiare", "scandalo", "scapola", "scarso", "scatenare", "scavato", "scelto", "scenico", "scettro", "scheda", "schiena", "sciarpa", "scienza", "scindere", "scippo", "sciroppo", "scivolo", "sclerare", "scodella", "scolpito", "scomparto", "sconforto", "scoprire", "scorta", "scossone", "scozzese", "scriba", "scrollare", "scrutinio", "scuderia", "scultore", "scuola", "scuro", "scusare", "sdebitare", "sdoganare", "seccatura", "secondo", "sedano", "seggiola", "segnalato", "segregato", "seguito", "selciato", "selettivo", "sella", "selvaggio", "semaforo", "sembrare", "seme", "seminato", "sempre", "senso", "sentire", "sepolto", "sequenza", "serata", "serbato", "sereno", "serio", "serpente", "serraglio", "servire", "sestina", "setola", "settimana", "sfacelo", "sfaldare", "sfamato", "sfarzoso", "sfaticato", "sfera", "sfida", "sfilato", "sfinge", "sfocato", "sfoderare", "sfogo", "sfoltire", "sforzato", "sfratto", "sfruttato", "sfuggito", "sfumare", "sfuso", "sgabello", "sgarbato", "sgonfiare", "sgorbio", "sgrassato", "sguardo", "sibilo", "siccome", "sierra", "sigla", "signore", "silenzio", "sillaba", "simbolo", "simpatico", "simulato", "sinfonia", "singolo", "sinistro", "sino", "sintesi", "sinusoide", "sipario", "sisma", "sistole", "situato", "slitta", "slogatura", "sloveno", "smarrito", "smemorato", "smentito", "smeraldo", "smilzo", "smontare", "smottato", "smussato", "snellire", "snervato", "snodo", "sobbalzo", "sobrio", "soccorso", "sociale", "sodale", "soffitto", "sogno", "soldato", "solenne", "solido", "sollazzo", "solo", "solubile", "solvente", "somatico", "somma", "sonda", "sonetto", "sonnifero", "sopire", "soppeso", "sopra", "sorgere", "sorpasso", "sorriso", "sorso", "sorteggio", "sorvolato", "sospiro", "sosta", "sottile", "spada", "spalla", "spargere", "spatola", "spavento", "spazzola", "specie", "spedire", "spegnere", "spelatura", "speranza", "spessore", "spettrale", "spezzato", "spia", "spigoloso", "spillato", "spinoso", "spirale", "splendido", "sportivo", "sposo", "spranga", "sprecare", "spronato", "spruzzo", "spuntino", "squillo", "sradicare", "srotolato", "stabile", "stacco", "staffa", "stagnare", "stampato", "stantio", "starnuto", "stasera", "statuto", "stelo", "steppa", "sterzo", "stiletto", "stima", "stirpe", "stivale", "stizzoso", "stonato", "storico", "strappo", "stregato", "stridulo", "strozzare", "strutto", "stuccare", "stufo", "stupendo", "subentro", "succoso", "sudore", "suggerito", "sugo", "sultano", "suonare", "superbo", "supporto", "surgelato", "surrogato", "sussurro", "sutura", "svagare", "svedese", "sveglio", "svelare", "svenuto", "svezia", "sviluppo", "svista", "svizzera", "svolta", "svuotare", "tabacco", "tabulato", "tacciare", "taciturno", "tale", "talismano", "tampone", "tannino", "tara", "tardivo", "targato", "tariffa", "tarpare", "tartaruga", "tasto", "tattico", "taverna", "tavolata", "tazza", "teca", "tecnico", "telefono", "temerario", "tempo", "temuto", "tendone", "tenero", "tensione", "tentacolo", "teorema", "terme", "terrazzo", "terzetto", "tesi", "tesserato", "testato", "tetro", "tettoia", "tifare", "tigella", "timbro", "tinto", "tipico", "tipografo", "tiraggio", "tiro", "titanio", "titolo", "titubante", "tizio", "tizzone", "toccare", "tollerare", "tolto", "tombola", "tomo", "tonfo", "tonsilla", "topazio", "topologia", "toppa", "torba", "tornare", "torrone", "tortora", "toscano", "tossire", "tostatura", "totano", "trabocco", "trachea", "trafila", "tragedia", "tralcio", "tramonto", "transito", "trapano", "trarre", "trasloco", "trattato", "trave", "treccia", "tremolio", "trespolo", "tributo", "tricheco", "trifoglio", "trillo", "trincea", "trio", "tristezza", "triturato", "trivella", "tromba", "trono", "troppo", "trottola", "trovare", "truccato", "tubatura", "tuffato", "tulipano", "tumulto", "tunisia", "turbare", "turchino", "tuta", "tutela", "ubicato", "uccello", "uccisore", "udire", "uditivo", "uffa", "ufficio", "uguale", "ulisse", "ultimato", "umano", "umile", "umorismo", "uncinetto", "ungere", "ungherese", "unicorno", "unificato", "unisono", "unitario", "unte", "uovo", "upupa", "uragano", "urgenza", "urlo", "usanza", "usato", "uscito", "usignolo", "usuraio", "utensile", "utilizzo", "utopia", "vacante", "vaccinato", "vagabondo", "vagliato", "valanga", "valgo", "valico", "valletta", "valoroso", "valutare", "valvola", "vampata", "vangare", "vanitoso", "vano", "vantaggio", "vanvera", "vapore", "varano", "varcato", "variante", "vasca", "vedetta", "vedova", "veduto", "vegetale", "veicolo", "velcro", "velina", "velluto", "veloce", "venato", "vendemmia", "vento", "verace", "verbale", "vergogna", "verifica", "vero", "verruca", "verticale", "vescica", "vessillo", "vestale", "veterano", "vetrina", "vetusto", "viandante", "vibrante", "vicenda", "vichingo", "vicinanza", "vidimare", "vigilia", "vigneto", "vigore", "vile", "villano", "vimini", "vincitore", "viola", "vipera", "virgola", "virologo", "virulento", "viscoso", "visione", "vispo", "vissuto", "visura", "vita", "vitello", "vittima", "vivanda", "vivido", "viziare", "voce", "voga", "volatile", "volere", "volpe", "voragine", "vulcano", "zampogna", "zanna", "zappato", "zattera", "zavorra", "zefiro", "zelante", "zelo", "zenzero", "zerbino", "zibetto", "zinco", "zircone", "zitto", "zolla", "zotico", "zucchero", "zufolo", "zulu", "zuppa") diff --git a/src/main/kotlin/com/radixdlt/bip39/wordlists/Japanese.kt b/src/main/kotlin/com/radixdlt/bip39/wordlists/Japanese.kt new file mode 100644 index 0000000..3f4e423 --- /dev/null +++ b/src/main/kotlin/com/radixdlt/bip39/wordlists/Japanese.kt @@ -0,0 +1,3 @@ +package com.radixdlt.bip39.wordlists + +val WORDLIST_JAPANESE = listOf("ã‚ã„ã“ãã—ã‚“", "ã‚ã„ã•ã¤", "ã‚ã„ãŸã‚™", "ã‚ãŠã゙ら", "ã‚ã‹ã¡ã‚ƒã‚“", "ã‚ãã‚‹", "ã‚ã‘ã‹ã‚™ãŸ", "ã‚ã‘ã‚‹", "ã‚ã“ã‹ã‚™ã‚Œã‚‹", "ã‚ã•ã„", "ã‚ã•ã²", "ã‚ã—ã‚ã¨", "ã‚ã—ã‚™ã‚ã†", "ã‚ã™ã‚™ã‹ã‚‹", "ã‚ã™ã‚™ã", "ã‚ããµã‚™", "ã‚ãŸãˆã‚‹", "ã‚ãŸãŸã‚ã‚‹", "ã‚ãŸã‚Šã¾ãˆ", "ã‚ãŸã‚‹", "ã‚ã¤ã„", "ã‚ã¤ã‹ã†", "ã‚ã£ã—ã‚…ã", "ã‚ã¤ã¾ã‚Š", "ã‚ã¤ã‚ã‚‹", "ã‚ã¦ãª", "ã‚ã¦ã¯ã¾ã‚‹", "ã‚ã²ã‚‹", "ã‚ãµã‚™ã‚‰", "ã‚ãµã‚™ã‚‹", "ã‚ãµã‚Œã‚‹", "ã‚ã¾ã„", "ã‚ã¾ã¨ã‚™", "ã‚ã¾ã‚„ã‹ã™", "ã‚ã¾ã‚Š", "ã‚ã¿ã‚‚ã®", "ã‚ã‚ã‚Šã‹", "ã‚ã‚„ã¾ã‚‹", "ã‚ゆむ", "ã‚らã„ãã‚™ã¾", "ã‚らã—", "ã‚らã™ã—ã‚™", "ã‚らãŸã‚ã‚‹", "ã‚らゆる", "ã‚らã‚ã™", "ã‚ã‚Šã‹ã‚™ã¨ã†", "ã‚ã‚ã›ã‚‹", "ã‚ã‚ã¦ã‚‹", "ã‚ã‚“ã„", "ã‚ã‚“ã‹ã‚™ã„", "ã‚ã‚“ã“", "ã‚ã‚“ã›ã‚™ã‚“", "ã‚ã‚“ã¦ã„", "ã‚ã‚“ãªã„", "ã‚ã‚“ã¾ã‚Š", "ã„ã„ãŸã‚™ã™", "ã„ãŠã‚“", "ã„ã‹ã‚™ã„", "ã„ã‹ã‚™ã", "ã„ããŠã„", "ã„ããªã‚Š", "ã„ãã‚‚ã®", "ã„ãã‚‹", "ã„ãã—ã‚™", "ã„ããµã‚™ã‚“", "ã„ã‘ã¯ã‚™ãª", "ã„ã‘ã‚“", "ã„ã“ã†", "ã„ã“ã", "ã„ã“ã¤", "ã„ã•ã¾ã—ã„", "ã„ã•ã‚“", "ã„ã—ã", "ã„ã—゙ゅã†", "ã„ã—゙ょã†", "ã„ã—ã‚™ã‚ã‚‹", "ã„ã™ã‚™ã¿", "ã„ã™ã‚™ã‚Œ", "ã„ã›ã„", "ã„ã›ãˆã²ã‚™", "ã„ã›ã‹ã„", "ã„ã›ã", "ã„ã›ã‚™ã‚“", "ã„ãã†ã‚ã†", "ã„ãã‹ã‚™ã—ã„", "ã„ãŸã‚™ã„", "ã„ãŸã‚™ã", "ã„ãŸã™ã‚™ã‚‰", "ã„ãŸã¿", "ã„ãŸã‚Šã‚", "ã„ã¡ãŠã†", "ã„ã¡ã—ã‚™", "ã„ã¡ã¨ã‚™", "ã„ã¡ã¯ã‚™", "ã„ã¡ãµã‚™", "ã„ã¡ã‚Šã‚…ã†", "ã„ã¤ã‹", "ã„ã£ã—ã‚…ã‚“", "ã„ã£ã›ã„", "ã„ã£ãã†", "ã„ã£ãŸã‚“", "ã„ã£ã¡", "ã„ã£ã¦ã„", "ã„ã£ã»ã‚šã†", "ã„ã¦ã•ã‚™", "ã„ã¦ã‚“", "ã„ã¨ã‚™ã†", "ã„ã¨ã“", "ã„ãªã„", "ã„ãªã‹", "ã„ã­ã‚€ã‚Š", "ã„ã®ã¡", "ã„ã®ã‚‹", "ã„ã¯ã¤", "ã„ã¯ã‚™ã‚‹", "ã„ã¯ã‚“", "ã„ã²ã‚™ã", "ã„ã²ã‚“", "ã„ãµã", "ã„ã¸ã‚“", "ã„ã»ã†", "ã„ã¿ã‚“", "ã„ã‚‚ã†ã¨", "ã„ã‚‚ãŸã‚Œ", "ã„ã‚‚ã‚Š", "ã„ã‚„ã‹ã‚™ã‚‹", "ã„ã‚„ã™", "ã„よã‹ã‚“", "ã„よã", "ã„らã„", "ã„らã™ã¨", "ã„ã‚Šãã‚™ã¡", "ã„りょã†", "ã„ã‚Œã„", "ã„れもã®", "ã„れる", "ã„ã‚ãˆã‚“ã²ã‚šã¤", "ã„ã‚ã„", "ã„ã‚ã†", "ã„ã‚ã‹ã‚“", "ã„ã‚ã¯ã‚™", "ã„ã‚ゆる", "ã„ã‚“ã‘゙んã¾ã‚", "ã„ã‚“ã•ã¤", "ã„ã‚“ã—ょã†", "ã„んよã†", "ã†ãˆã", "ã†ãˆã‚‹", "ã†ãŠã•ã‚™", "ã†ã‹ã‚™ã„", "ã†ã‹ãµã‚™", "ã†ã‹ã¸ã‚™ã‚‹", "ã†ãã‚", "ã†ãらã„ãª", "ã†ãれれ", "ã†ã‘ãŸã¾ã‚ã‚‹", "ã†ã‘ã¤ã‘", "ã†ã‘ã¨ã‚‹", "ã†ã‘ã‚‚ã¤", "ã†ã‘ã‚‹", "ã†ã“ã‚™ã‹ã™", "ã†ã“ã‚™ã", "ã†ã“ã‚“", "ã†ã•ãã‚™", "ã†ã—ãªã†", "ã†ã—ã‚ã‹ã‚™ã¿", "ã†ã™ã„", "ã†ã™ãã‚™", "ã†ã™ã゙らã„", "ã†ã™ã‚ã‚‹", "ã†ã›ã¤", "ã†ã¡ã‚ã‚ã›", "ã†ã¡ã‹ã‚™ã‚", "ã†ã¡ã", "ã†ã¡ã‚…ã†", "ã†ã£ã‹ã‚Š", "ã†ã¤ãã—ã„", "ã†ã£ãŸãˆã‚‹", "ã†ã¤ã‚‹", "ã†ã¨ã‚™ã‚“", "ã†ãªãã‚™", "ã†ãªã—ã‚™", "ã†ãªã™ã‚™ã", "ã†ãªã‚‹", "ã†ã­ã‚‹", "ã†ã®ã†", "ã†ãµã‚™ã‘ã‚™", "ã†ãµã‚™ã“ã‚™ãˆ", "ã†ã¾ã‚Œã‚‹", "ã†ã‚ã‚‹", "ã†ã‚‚ã†", "ã†ã‚„ã¾ã†", "ã†ã‚ˆã", "ã†ã‚‰ã‹ã‚™ãˆã™", "ã†ã‚‰ãã‚™ã¡", "ã†ã‚‰ãªã„", "ã†ã‚Šã‚ã‘ã‚™", "ã†ã‚Šãã‚Œ", "ã†ã‚‹ã•ã„", "ã†ã‚Œã—ã„", "ã†ã‚Œã‚†ã", "ã†ã‚Œã‚‹", "ã†ã‚ã“", "ã†ã‚ã", "ã†ã‚ã•", "ã†ã‚“ã“ã†", "ã†ã‚“ã¡ã‚“", "ã†ã‚“ã¦ã‚“", "ã†ã‚“ã¨ã‚™ã†", "ãˆã„ãˆã‚“", "ãˆã„ã‹ã‚™", "ãˆã„ãょã†", "ãˆã„ã“ã‚™", "ãˆã„ã›ã„", "ãˆã„ãµã‚™ã‚“", "ãˆã„よã†", "ãˆã„ã‚", "ãˆãŠã‚Š", "ãˆã‹ã‚™ãŠ", "ãˆã‹ã‚™ã", "ãˆããŸã„", "ãˆãã›ã‚‹", "ãˆã—ゃã", "ãˆã™ã¦", "ãˆã¤ã‚‰ã‚“", "ãˆã®ãã‚™", "ãˆã»ã†ã¾ã", "ãˆã»ã‚“", "ãˆã¾ã", "ãˆã‚‚ã—ã‚™", "ãˆã‚‚ã®", "ãˆã‚‰ã„", "ãˆã‚‰ãµã‚™", "ãˆã‚Šã‚", "ãˆã‚“ãˆã‚“", "ãˆã‚“ã‹ã„", "ãˆã‚“ãã‚™", "ãˆã‚“ã‘ã‚™ã", "ãˆã‚“ã—ã‚…ã†", "ãˆã‚“ã›ã‚™ã¤", "ãˆã‚“ãã", "ãˆã‚“ã¡ã‚‡ã†", "ãˆã‚“ã¨ã¤", "ãŠã„ã‹ã‘ã‚‹", "ãŠã„ã“ã™", "ãŠã„ã—ã„", "ãŠã„ã¤ã", "ãŠã†ãˆã‚“", "ãŠã†ã•ã¾", "ãŠã†ã—ã‚™", "ãŠã†ã›ã¤", "ãŠã†ãŸã„", "ãŠã†ãµã", "ãŠã†ã¸ã‚™ã„", "ãŠã†ã‚ˆã†", "ãŠãˆã‚‹", "ãŠãŠã„", "ãŠãŠã†", "ãŠãŠã¨ã‚™ãŠã‚Š", "ãŠãŠã‚„", "ãŠãŠã‚ˆã", "ãŠã‹ãˆã‚Š", "ãŠã‹ã™ã‚™", "ãŠã‹ã‚™ã‚€", "ãŠã‹ã‚ã‚Š", "ãŠãã‚™ãªã†", "ãŠãã‚‹", "ãŠãã•ã¾", "ãŠãã—゙ょã†", "ãŠãã‚Šã‹ã‚™ãª", "ãŠãã‚‹", "ãŠãれる", "ãŠã“ã™", "ãŠã“ãªã†", "ãŠã“ã‚‹", "ãŠã•ãˆã‚‹", "ãŠã•ãªã„", "ãŠã•ã‚ã‚‹", "ãŠã—ã„ã‚Œ", "ãŠã—ãˆã‚‹", "ãŠã—ã‚™ãã‚™", "ãŠã—ã‚™ã•ã‚“", "ãŠã—ゃれ", "ãŠãらã", "ãŠãã‚ã‚‹", "ãŠãŸã‹ã‚™ã„", "ãŠãŸã", "ãŠãŸã‚™ã‚„ã‹", "ãŠã¡ã¤ã", "ãŠã£ã¨", "ãŠã¤ã‚Š", "ãŠã¦ã‚™ã‹ã‘", "ãŠã¨ã—ã‚‚ã®", "ãŠã¨ãªã—ã„", "ãŠã¨ã‚™ã‚Š", "ãŠã¨ã‚™ã‚ã‹ã™", "ãŠã¯ã‚™ã•ã‚“", "ãŠã¾ã„ã‚Š", "ãŠã‚ã¦ã‚™ã¨ã†", "ãŠã‚‚ã„ã¦ã‚™", "ãŠã‚‚ã†", "ãŠã‚‚ãŸã„", "ãŠã‚‚ã¡ã‚ƒ", "ãŠã‚„ã¤", "ãŠã‚„ゆã²ã‚™", "ãŠã‚ˆã»ã‚™ã™", "ãŠã‚‰ã‚“ãŸã‚™", "ãŠã‚ã™", "ãŠã‚“ã‹ã‚™ã", "ãŠã‚“ã‘ã„", "ãŠã‚“ã—ゃ", "ãŠã‚“ã›ã‚“", "ãŠã‚“ãŸã‚™ã‚“", "ãŠã‚“ã¡ã‚…ã†", "ãŠã‚“ã¨ã‚™ã‘ã„", "ã‹ã‚ã¤", "ã‹ã„ã‹ã‚™", "ã‹ã‚™ã„ã", "ã‹ã‚™ã„ã‘ã‚“", "ã‹ã‚™ã„ã“ã†", "ã‹ã„ã•ã¤", "ã‹ã„ã—ゃ", "ã‹ã„ã™ã„よã", "ã‹ã„ã›ã‚™ã‚“", "ã‹ã„ãã‚™ã†ã¨ã‚™", "ã‹ã„ã¤ã†", "ã‹ã„ã¦ã‚“", "ã‹ã„ã¨ã†", "ã‹ã„ãµã", "ã‹ã‚™ã„ã¸ã", "ã‹ã„ã»ã†", "ã‹ã„よã†", "ã‹ã‚™ã„らã„", "ã‹ã„ã‚", "ã‹ãˆã‚‹", "ã‹ãŠã‚Š", "ã‹ã‹ãˆã‚‹", "ã‹ã‹ã‚™ã", "ã‹ã‹ã‚™ã—", "ã‹ã‹ã‚™ã¿", "ã‹ãã“ã‚™", "ã‹ãã¨ã", "ã‹ã•ã‚™ã‚‹", "ã‹ã‚™ãã‚™ã†", "ã‹ãŸã„", "ã‹ãŸã¡", "ã‹ã‚™ã¡ã‚‡ã†", "ã‹ã‚™ã£ãã‚…ã†", "ã‹ã‚™ã£ã“ã†", "ã‹ã‚™ã£ã•ã‚“", "ã‹ã‚™ã£ã—ょã†", "ã‹ãªã•ã‚™ã‚ã—", "ã‹ã®ã†", "ã‹ã‚™ã¯ã", "ã‹ãµã‚™ã‹", "ã‹ã»ã†", "ã‹ã»ã“ã‚™", "ã‹ã¾ã†", "ã‹ã¾ã»ã‚™ã“", "ã‹ã‚ã‚ŒãŠã‚“", "ã‹ã‚†ã„", "ã‹ã‚ˆã†ã²ã‚™", "ã‹ã‚‰ã„", "ã‹ã‚‹ã„", "ã‹ã‚ã†", "ã‹ã‚ã", "ã‹ã‚ら", "ã‹ã‚™ã‚“ã‹", "ã‹ã‚“ã‘ã„", "ã‹ã‚“ã“ã†", "ã‹ã‚“ã—ゃ", "ã‹ã‚“ãã†", "ã‹ã‚“ãŸã‚“", "ã‹ã‚“ã¡", "ã‹ã‚™ã‚“ã¯ã‚™ã‚‹", "ãã‚ã„", "ãã‚ã¤", "ãã„ã‚", "ãã‚™ã„ã‚“", "ãã†ã„", "ãã†ã‚“", "ããˆã‚‹", "ããŠã†", "ããŠã", "ããŠã¡", "ããŠã‚“", "ãã‹ã„", "ãã‹ã", "ãã‹ã‚“ã—ゃ", "ããã¦", "ããã¯ã‚™ã‚Š", "ããらã‘ã‚™", "ãã‘ã‚“ã›ã„", "ãã“ã†", "ãã“ãˆã‚‹", "ãã“ã", "ãã•ã„", "ãã•ã", "ãã•ã¾", "ãã•ã‚‰ãã‚™", "ãã‚™ã—ã‚™ã‹ã‹ã‚™ã", "ãã‚™ã—ã", "ãã‚™ã—ã‚™ãŸã„ã‘ã‚“", "ãã‚™ã—ã‚™ã«ã£ã¦ã„", "ãã‚™ã—゙ゅã¤ã—ゃ", "ãã™ã†", "ãã›ã„", "ãã›ã", "ãã›ã¤", "ããã†", "ããã‚™ã", "ãã゙ん", "ããŸãˆã‚‹", "ãã¡ã‚‡ã†", "ãã¤ãˆã‚“", "ãã‚™ã£ã¡ã‚Š", "ãã¤ã¤ã", "ãã¤ã­", "ãã¦ã„", "ãã¨ã‚™ã†", "ãã¨ã‚™ã", "ããªã„", "ããªã‹ã‚™", "ããªã“", "ãã¬ã“ã‚™ã—", "ãã­ã‚“", "ãã®ã†", "ãã®ã—ãŸ", "ãã¯ã", "ãã²ã‚™ã—ã„", "ãã²ã‚“", "ããµã", "ããµã‚™ã‚“", "ãã»ã‚™ã†", "ãã»ã‚“", "ãã¾ã‚‹", "ãã¿ã¤", "ãã‚€ã™ã‚™ã‹ã—ã„", "ãã‚ã‚‹", "ãã‚‚ãŸã‚™ã‚ã—", "ãã‚‚ã¡", "ãã‚‚ã®", "ãゃã", "ãã‚„ã", "ã゙ゅã†ã«ã", "ãよã†", "ãょã†ã‚Šã‚…ã†", "ãらã„", "ãらã", "ãã‚Šã‚“", "ãã‚Œã„", "ãã‚Œã¤", "ãã‚ã", "ãã‚™ã‚ã‚“", "ãã‚ã‚ã‚‹", "ã゙んã„ã‚", "ãã‚“ã‹ãã—ã‚™", "ãã‚“ã—゙ょ", "ãんよã†ã²ã‚™", "ãã‚™ã‚ã„", "ãã„ã™ã‚™", "ãã†ã‹ã‚“", "ãã†ã", "ãã†ã゙ん", "ãã†ã“ã†", "ãã‚™ã†ã›ã„", "ãã†ãã†", "ãã‚™ã†ãŸã‚‰", "ãã†ãµã", "ãã†ã»ã‚™", "ãã‹ã‚“", "ããょã†", "ãã‘゙ん", "ãã‚™ã“ã†", "ãã•ã„", "ãã•ã", "ãã•ã¯ã‚™ãª", "ãã•ã‚‹", "ãã—ゃã¿", "ãã—ょã†", "ãã™ã®ã", "ãã™ã‚Šã‚†ã²ã‚™", "ãã›ã‘ã‚™", "ãã›ã‚“", "ãã‚™ãŸã„ã¦ã", "ããŸã‚™ã•ã‚‹", "ããŸã²ã‚™ã‚Œã‚‹", "ãã¡ã“ã¿", "ãã¡ã•ã", "ãã¤ã—ãŸ", "ãã‚™ã£ã™ã‚Š", "ãã¤ã‚ãã‚™", "ãã¨ã†ã¦ã‚“", "ãã¨ã‚™ã", "ããªã‚“", "ãã­ãã­", "ãã®ã†", "ããµã†", "ãã¿ã‚ã‚ã›", "ãã¿ãŸã¦ã‚‹", "ãã‚ã‚‹", "ãã‚„ãã—ょ", "ãらã™", "ãらã¸ã‚™ã‚‹", "ãã‚‹ã¾", "ãれる", "ãã‚ã†", "ãã‚ã—ã„", "ã゙んã‹ã‚“", "ã゙んã—ょã", "ã゙んãŸã„", "ã゙んã¦", "ã‘ã‚ãª", "ã‘ã„ã‹ã", "ã‘ã„ã‘ã‚“", "ã‘ã„ã“", "ã‘ã„ã•ã¤", "ã‘ã‚™ã„ã—゙ゅã¤", "ã‘ã„ãŸã„", "ã‘ã‚™ã„ã®ã†ã—゙ん", "ã‘ã„ã‚Œã", "ã‘ã„ã‚", "ã‘ãŠã¨ã™", "ã‘ãŠã‚Šã‚‚ã®", "ã‘ã‚™ãã‹", "ã‘ã‚™ãã‘゙ん", "ã‘ã‚™ããŸã‚™ã‚“", "ã‘ã‚™ãã¡ã‚“", "ã‘ã‚™ãã¨ã¤", "ã‘ã‚™ãã¯", "ã‘ã‚™ãã‚„ã", "ã‘ã‚™ã“ã†", "ã‘ã‚™ã“ãã—゙ょã†", "ã‘ã‚™ã•ã‚™ã„", "ã‘ã•ã", "ã‘ã‚™ã•ã‚™ã‚“", "ã‘ã—ã", "ã‘ã—ã“゙む", "ã‘ã—ょã†", "ã‘ã‚™ã™ã¨", "ã‘ãŸã¯ã‚™", "ã‘ã¡ã‚ƒã£ãµã‚š", "ã‘ã¡ã‚‰ã™", "ã‘ã¤ã‚ã¤", "ã‘ã¤ã„", "ã‘ã¤ãˆã", "ã‘ã£ã“ã‚“", "ã‘ã¤ã—゙ょ", "ã‘ã£ã›ã", "ã‘ã£ã¦ã„", "ã‘ã¤ã¾ã¤", "ã‘ã‚™ã¤ã‚ˆã†ã²ã‚™", "ã‘ã‚™ã¤ã‚Œã„", "ã‘ã¤ã‚ã‚“", "ã‘ã‚™ã¨ã‚™ã", "ã‘ã¨ã¯ã‚™ã™", "ã‘ã¨ã‚‹", "ã‘ãªã‘ã‚™", "ã‘ãªã™", "ã‘ãªã¿", "ã‘ã¬ã", "ã‘ã‚™ã­ã¤", "ã‘ã­ã‚“", "ã‘ã¯ã„", "ã‘ã‚™ã²ã‚“", "ã‘ãµã‚™ã‹ã„", "ã‘ã‚™ã»ã‚™ã", "ã‘ã¾ã‚Š", "ã‘ã¿ã‹ã‚‹", "ã‘ã‚€ã—", "ã‘むり", "ã‘ã‚‚ã®", "ã‘らã„", "ã‘ã‚ã‘ã‚", "ã‘ã‚ã—ã„", "ã‘ã‚“ã„", "ã‘ã‚“ãˆã¤", "ã‘ã‚“ãŠ", "ã‘ã‚“ã‹", "ã‘゙んã", "ã‘ã‚“ã‘゙ん", "ã‘ã‚“ã“ã†", "ã‘ã‚“ã•ã", "ã‘ã‚“ã—ã‚…ã†", "ã‘ã‚“ã™ã†", "ã‘゙んãã†", "ã‘ã‚“ã¡ã", "ã‘ã‚“ã¦ã„", "ã‘ã‚“ã¨ã†", "ã‘ã‚“ãªã„", "ã‘ã‚“ã«ã‚“", "ã‘゙んãµã‚™ã¤", "ã‘ã‚“ã¾", "ã‘ã‚“ã¿ã‚“", "ã‘ã‚“ã‚ã„", "ã‘んらん", "ã‘ã‚“ã‚Š", "ã“ã‚ãã¾", "ã“ã„ã¬", "ã“ã„ã²ã‚™ã¨", "ã“ã‚™ã†ã„", "ã“ã†ãˆã‚“", "ã“ã†ãŠã‚“", "ã“ã†ã‹ã‚“", "ã“ã‚™ã†ãã‚…ã†", "ã“ã‚™ã†ã‘ã„", "ã“ã†ã“ã†", "ã“ã†ã•ã„", "ã“ã†ã—ã‚™", "ã“ã†ã™ã„", "ã“ã‚™ã†ã›ã„", "ã“ã†ãã", "ã“ã†ãŸã„", "ã“ã†ã¡ã‚ƒ", "ã“ã†ã¤ã†", "ã“ã†ã¦ã„", "ã“ã†ã¨ã‚™ã†", "ã“ã†ãªã„", "ã“ã†ã¯ã„", "ã“ã‚™ã†ã»ã†", "ã“ã‚™ã†ã¾ã‚“", "ã“ã†ã‚‚ã", "ã“ã†ã‚Šã¤", "ã“ãˆã‚‹", "ã“ãŠã‚Š", "ã“ã‚™ã‹ã„", "ã“ã‚™ã‹ã‚™ã¤", "ã“ã‚™ã‹ã‚“", "ã“ãã“ã‚™", "ã“ãã•ã„", "ã“ãã¨ã†", "ã“ããªã„", "ã“ãã¯ã", "ã“ãã‚™ã¾", "ã“ã‘ã„", "ã“ã‘ã‚‹", "ã“ã“ã®ã‹", "ã“ã“ã‚", "ã“ã•ã‚", "ã“ã—ã¤", "ã“ã™ã†", "ã“ã›ã„", "ã“ã›ã", "ã“ã›ã‚™ã‚“", "ã“ããŸã‚™ã¦", "ã“ãŸã„", "ã“ãŸãˆã‚‹", "ã“ãŸã¤", "ã“ã¡ã‚‡ã†", "ã“ã£ã‹", "ã“ã¤ã“ã¤", "ã“ã¤ã¯ã‚™ã‚“", "ã“ã¤ãµã‚™", "ã“ã¦ã„", "ã“ã¦ã‚“", "ã“ã¨ã‹ã‚™ã‚‰", "ã“ã¨ã—", "ã“ã¨ã¯ã‚™", "ã“ã¨ã‚Š", "ã“ãªã“ã‚™ãª", "ã“ã­ã“ã­", "ã“ã®ã¾ã¾", "ã“ã®ã¿", "ã“ã®ã‚ˆ", "ã“ã‚™ã¯ã‚“", "ã“ã²ã¤ã—ã‚™", "ã“ãµã†", "ã“ãµã‚“", "ã“ã»ã‚™ã‚Œã‚‹", "ã“ã‚™ã¾ã‚ãµã‚™ã‚‰", "ã“ã¾ã‹ã„", "ã“ã‚™ã¾ã™ã‚Š", "ã“ã¾ã¤ãª", "ã“ã¾ã‚‹", "ã“ã‚€ãã‚™ã“", "ã“ã‚‚ã—ã‚™", "ã“ã‚‚ã¡", "ã“ã‚‚ã®", "ã“ã‚‚ã‚“", "ã“ã‚„ã", "ã“ã‚„ã¾", "ã“ゆã†", "ã“ゆã²ã‚™", "ã“よã„", "ã“よã†", "ã“ã‚Šã‚‹", "ã“ã‚Œãã—ょん", "ã“ã‚ã£ã‘", "ã“ã‚ã‚‚ã¦", "ã“ã‚れる", "ã“ã‚“ã„ã‚“", "ã“ã‚“ã‹ã„", "ã“ã‚“ã", "ã“ã‚“ã—ã‚…ã†", "ã“ã‚“ã™ã„", "ã“ã‚“ãŸã‚™ã¦", "ã“ã‚“ã¨ã‚“", "ã“ã‚“ãªã‚“", "ã“ã‚“ã²ã‚™ã«", "ã“ã‚“ã»ã‚šã‚“", "ã“ã‚“ã¾ã‘", "ã“ã‚“ã‚„", "ã“ã‚“ã‚Œã„", "ã“ã‚“ã‚ã", "ã•ã‚™ã„ãˆã", "ã•ã„ã‹ã„", "ã•ã„ãã‚“", "ã•ã‚™ã„ã‘゙ん", "ã•ã‚™ã„ã“", "ã•ã„ã—ょ", "ã•ã„ã›ã„", "ã•ã‚™ã„ãŸã", "ã•ã‚™ã„ã¡ã‚…ã†", "ã•ã„ã¦ã", "ã•ã‚™ã„りょã†", "ã•ã†ãª", "ã•ã‹ã„ã—", "ã•ã‹ã‚™ã™", "ã•ã‹ãª", "ã•ã‹ã¿ã¡", "ã•ã‹ã‚™ã‚‹", "ã•ã゙ょã†", "ã•ãã—", "ã•ãã²ã‚“", "ã•ãら", "ã•ã“ã", "ã•ã“ã¤", "ã•ã™ã‚™ã‹ã‚‹", "ã•ã‚™ã›ã", "ã•ãŸã‚“", "ã•ã¤ãˆã„", "ã•ã‚™ã¤ãŠã‚“", "ã•ã‚™ã£ã‹", "ã•ã‚™ã¤ã‹ã‚™ã", "ã•ã£ãょã", "ã•ã‚™ã£ã—", "ã•ã¤ã—゙ん", "ã•ã‚™ã£ãã†", "ã•ã¤ãŸã¯ã‚™", "ã•ã¤ã¾ã„ã‚‚", "ã•ã¦ã„", "ã•ã¨ã„ã‚‚", "ã•ã¨ã†", "ã•ã¨ãŠã‚„", "ã•ã¨ã—", "ã•ã¨ã‚‹", "ã•ã®ã†", "ã•ã¯ã‚™ã", "ã•ã²ã‚™ã—ã„", "ã•ã¸ã‚™ã¤", "ã•ã»ã†", "ã•ã»ã¨ã‚™", "ã•ã¾ã™", "ã•ã¿ã—ã„", "ã•ã¿ãŸã‚™ã‚Œ", "ã•ã‚€ã‘", "ã•ã‚ã‚‹", "ã•ã‚„ãˆã‚“ã¨ã‚™ã†", "ã•ã‚†ã†", "ã•ã‚ˆã†", "ã•ã‚ˆã", "ã•ã‚‰ãŸã‚™", "ã•ã‚™ã‚‹ãã¯ã‚™", "ã•ã‚ã‚„ã‹", "ã•ã‚ã‚‹", "ã•ã‚“ã„ã‚“", "ã•ã‚“ã‹", "ã•ã‚“ãゃã", "ã•ã‚“ã“ã†", "ã•ã‚“ã•ã„", "ã•ã‚™ã‚“ã—ょ", "ã•ã‚“ã™ã†", "ã•ã‚“ã›ã„", "ã•ã‚“ã", "ã•ã‚“ã¡", "ã•ã‚“ã¾", "ã•ã‚“ã¿", "ã•ã‚“らん", "ã—ã‚ã„", "ã—ã‚ã‘ã‚™", "ã—ã‚ã•ã£ã¦", "ã—ã‚ã‚ã›", "ã—ã„ã", "ã—ã„ã‚“", "ã—ã†ã¡", "ã—ãˆã„", "ã—ãŠã‘", "ã—ã‹ã„", "ã—ã‹ã", "ã—ã‚™ã‹ã‚“", "ã—ã“ã‚™ã¨", "ã—ã™ã†", "ã—ã‚™ãŸã‚™ã„", "ã—ãŸã†ã‘", "ã—ãŸãã‚™", "ã—ãŸã¦", "ã—ãŸã¿", "ã—ã¡ã‚‡ã†", "ã—ã¡ã‚Šã‚“", "ã—ã£ã‹ã‚Š", "ã—ã¤ã—ã‚™", "ã—ã¤ã‚‚ã‚“", "ã—ã¦ã„", "ã—ã¦ã", "ã—ã¦ã¤", "ã—ã‚™ã¦ã‚“", "ã—ã‚™ã¨ã‚™ã†", "ã—ãªã゙れ", "ã—ãªã‚‚ã®", "ã—ãªã‚“", "ã—ã­ã¾", "ã—ã­ã‚“", "ã—ã®ãã‚™", "ã—ã®ãµã‚™", "ã—ã¯ã„", "ã—ã¯ã‚™ã‹ã‚Š", "ã—ã¯ã¤", "ã—ã¯ã‚‰ã„", "ã—ã¯ã‚“", "ã—ã²ã‚‡ã†", "ã—ãµã", "ã—ã‚™ãµã‚™ã‚“", "ã—ã¸ã„", "ã—ã»ã†", "ã—ã»ã‚“", "ã—ã¾ã†", "ã—ã¾ã‚‹", "ã—ã¿ã‚“", "ã—ã‚€ã‘ã‚‹", "ã—゙むã—ょ", "ã—ã‚ã„", "ã—ã‚ã‚‹", "ã—ã‚‚ã‚“", "ã—ゃã„ã‚“", "ã—ゃã†ã‚“", "ã—ゃãŠã‚“", "ã—゙ゃã‹ã‚™ã„ã‚‚", "ã—ã‚„ãã—ょ", "ã—ゃãã»ã†", "ã—ゃã‘ã‚“", "ã—ゃã“", "ã—ゃã•ã‚™ã„", "ã—ゃã—ã‚“", "ã—ゃã›ã‚“", "ã—ゃãã†", "ã—ゃãŸã„", "ã—ゃã¡ã‚‡ã†", "ã—ゃã£ãã‚“", "ã—゙ゃã¾", "ã—ゃりん", "ã—ゃれã„", "ã—゙ゆã†", "ã—゙ゅã†ã—ょ", "ã—ã‚…ãã¯ã", "ã—゙ゅã—ã‚“", "ã—ã‚…ã£ã›ã", "ã—ã‚…ã¿", "ã—ゅらã¯ã‚™", "ã—゙ゅんã¯ã‚™ã‚“", "ã—ょã†ã‹ã„", "ã—ょããŸã", "ã—ょã£ã‘ã‚“", "ã—ょã¨ã‚™ã†", "ã—ょもã¤", "ã—らã›ã‚‹", "ã—らã¸ã‚™ã‚‹", "ã—ã‚“ã‹", "ã—ã‚“ã“ã†", "ã—゙んã—゙ゃ", "ã—ã‚“ã›ã„ã—ã‚™", "ã—ã‚“ã¡ã", "ã—ã‚“ã‚Šã‚“", "ã™ã‚ã‘ã‚™", "ã™ã‚ã—", "ã™ã‚ãª", "ã™ã‚™ã‚ã‚“", "ã™ã„ãˆã„", "ã™ã„ã‹", "ã™ã„ã¨ã†", "ã™ã‚™ã„ãµã‚™ã‚“", "ã™ã„よã†ã²ã‚™", "ã™ã†ã‹ã‚™ã", "ã™ã†ã—ã‚™ã¤", "ã™ã†ã›ã‚“", "ã™ãŠã¨ã‚™ã‚Š", "ã™ãã¾", "ã™ãã†", "ã™ããªã„", "ã™ã‘ã‚‹", "ã™ã“ã‚™ã„", "ã™ã“ã—", "ã™ã‚™ã•ã‚“", "ã™ã™ã‚™ã—ã„", "ã™ã™ã‚€", "ã™ã™ã‚ã‚‹", "ã™ã£ã‹ã‚Š", "ã™ã‚™ã£ã—ã‚Š", "ã™ã‚™ã£ã¨", "ã™ã¦ã", "ã™ã¦ã‚‹", "ã™ã­ã‚‹", "ã™ã®ã“", "ã™ã¯ãŸã‚™", "ã™ã¯ã‚™ã‚‰ã—ã„", "ã™ã‚™ã²ã‚‡ã†", "ã™ã‚™ãµã‚™ã¬ã‚Œ", "ã™ãµã‚™ã‚Š", "ã™ãµã‚Œ", "ã™ã¸ã‚™ã¦", "ã™ã¸ã‚™ã‚‹", "ã™ã‚™ã»ã†", "ã™ã»ã‚™ã‚“", "ã™ã¾ã„", "ã™ã‚ã—", "ã™ã‚‚ã†", "ã™ã‚„ã", "ã™ã‚‰ã™ã‚‰", "ã™ã‚‹ã‚", "ã™ã‚Œã¡ã‹ã‚™ã†", "ã™ã‚ã£ã¨", "ã™ã‚ã‚‹", "ã™ã‚“ã›ã‚™ã‚“", "ã™ã‚“ã»ã‚šã†", "ã›ã‚ãµã‚™ã‚‰", "ã›ã„ã‹ã¤", "ã›ã„ã‘゙ん", "ã›ã„ã—ã‚™", "ã›ã„よã†", "ã›ãŠã†", "ã›ã‹ã„ã‹ã‚“", "ã›ãã«ã‚“", "ã›ãã‚€", "ã›ãゆ", "ã›ãらんã†ã‚“", "ã›ã‘ã‚“", "ã›ã“ã†", "ã›ã™ã—ã‚™", "ã›ãŸã„", "ã›ãŸã‘", "ã›ã£ã‹ã", "ã›ã£ãゃã", "ã›ã‚™ã£ã", "ã›ã£ã‘ã‚“", "ã›ã£ã“ã¤", "ã›ã£ã•ãŸãã¾", "ã›ã¤ãã‚™ã", "ã›ã¤ãŸã‚™ã‚“", "ã›ã¤ã¦ã‚™ã‚“", "ã›ã£ã¯ã‚šã‚“", "ã›ã¤ã²ã‚™", "ã›ã¤ãµã‚™ã‚“", "ã›ã¤ã‚ã„", "ã›ã¤ã‚Šã¤", "ã›ãªã‹", "ã›ã®ã²ã‚™", "ã›ã¯ã¯ã‚™", "ã›ã²ã‚™ã‚", "ã›ã»ã‚™ã­", "ã›ã¾ã„", "ã›ã¾ã‚‹", "ã›ã‚ã‚‹", "ã›ã‚‚ãŸã‚Œ", "ã›ã‚Šãµ", "ã›ã‚™ã‚“ã‚ã", "ã›ã‚“ã„", "ã›ã‚“ãˆã„", "ã›ã‚“ã‹", "ã›ã‚“ãょ", "ã›ã‚“ã", "ã›ã‚“ã‘゙ん", "ã›ã‚™ã‚“ã“ã‚™", "ã›ã‚“ã•ã„", "ã›ã‚“ã—ã‚…", "ã›ã‚“ã™ã„", "ã›ã‚“ã›ã„", "ã›ã‚“ãã‚™", "ã›ã‚“ãŸã", "ã›ã‚“ã¡ã‚‡ã†", "ã›ã‚“ã¦ã„", "ã›ã‚“ã¨ã†", "ã›ã‚“ã¬ã", "ã›ã‚“ã­ã‚“", "ã›ã‚“ã¯ã‚šã„", "ã›ã‚™ã‚“ãµã‚™", "ã›ã‚™ã‚“ã»ã‚šã†", "ã›ã‚“ã‚€", "ã›ã‚“ã‚ã‚“ã—゙ょ", "ã›ã‚“ã‚‚ã‚“", "ã›ã‚“ã‚„ã", "ã›ã‚“ゆã†", "ã›ã‚“よã†", "ã›ã‚™ã‚“ら", "ã›ã‚™ã‚“りゃã", "ã›ã‚“ã‚Œã„", "ã›ã‚“ã‚", "ãã‚ã", "ãã„ã¨ã‘゙る", "ãã„ã­", "ãã†ã‹ã‚™ã‚“ãょã†", "ãã†ã", "ãã†ã“ã‚™", "ãã†ã—ã‚“", "ãã†ãŸã‚™ã‚“", "ãã†ãªã‚“", "ãã†ã²ã‚™", "ãã†ã‚ã‚“", "ãã†ã‚Š", "ããˆã‚‚ã®", "ããˆã‚“", "ãã‹ã‚™ã„", "ãã‘ã‚™ã", "ãã“ã†", "ãã“ãã“", "ãã•ã‚™ã„", "ãã—ãª", "ãã›ã„", "ãã›ã‚“", "ãããã‚™", "ããŸã‚™ã¦ã‚‹", "ãã¤ã†", "ãã¤ãˆã‚“", "ãã£ã‹ã‚“", "ãã¤ã゙ょã†", "ãã£ã‘ã¤", "ãã£ã“ã†", "ãã£ã›ã‚“", "ãã£ã¨", "ãã¨ã‹ã‚™ã‚", "ãã¨ã¤ã‚™ã‚‰", "ããªãˆã‚‹", "ããªãŸ", "ããµã»ã‚™", "ãã»ã‚™ã", "ãã»ã‚™ã‚", "ãã¾ã¤", "ãã¾ã‚‹", "ãã‚€ã", "ãむりãˆ", "ãã‚ã‚‹", "ãã‚‚ãã‚‚", "ãよã‹ã›ã‚™", "ãらã¾ã‚", "ãã‚ã†", "ãã‚“ã‹ã„", "ãã‚“ã‘ã„", "ãã‚“ã•ã‚™ã„", "ãã‚“ã—ã¤", "ãã‚“ãã‚™ã", "ãã‚“ã¡ã‚‡ã†", "ã゙んã²ã‚™", "ã゙んãµã‚™ã‚“", "ãã‚“ã¿ã‚“", "ãŸã‚ã„", "ãŸã„ã„ã‚“", "ãŸã„ã†ã‚“", "ãŸã„ãˆã", "ãŸã„ãŠã†", "ãŸã‚™ã„ã‹ã‚™ã", "ãŸã„ã", "ãŸã„ãã‚™ã†", "ãŸã„ã‘ã‚“", "ãŸã„ã“", "ãŸã„ã•ã‚™ã„", "ãŸã‚™ã„ã—゙ょã†ãµã‚™", "ãŸã‚™ã„ã™ã", "ãŸã„ã›ã¤", "ãŸã„ãã†", "ãŸã‚™ã„ãŸã„", "ãŸã„ã¡ã‚‡ã†", "ãŸã„ã¦ã„", "ãŸã‚™ã„ã¨ã‚™ã“ã‚", "ãŸã„ãªã„", "ãŸã„ã­ã¤", "ãŸã„ã®ã†", "ãŸã„ã¯ã‚“", "ãŸã‚™ã„ã²ã‚‡ã†", "ãŸã„ãµã†", "ãŸã„ã¸ã‚“", "ãŸã„ã»", "ãŸã„ã¾ã¤ã¯ã‚™ãª", "ãŸã„ã¿ã‚“ãã‚™", "ãŸã„ã‚€", "ãŸã„ã‚ã‚“", "ãŸã„ã‚„ã", "ãŸã„よã†", "ãŸã„ら", "ãŸã„りょã", "ãŸã„ã‚‹", "ãŸã„ã‚ã‚“", "ãŸã†ãˆ", "ãŸãˆã‚‹", "ãŸãŠã™", "ãŸãŠã‚‹", "ãŸãŠã‚Œã‚‹", "ãŸã‹ã„", "ãŸã‹ã­", "ãŸãã²ã‚™", "ãŸãã•ã‚“", "ãŸã“ã", "ãŸã“ã‚„ã", "ãŸã•ã„", "ãŸã—ã•ã‚™ã‚“", "ãŸã‚™ã—゙ゃれ", "ãŸã™ã‘ã‚‹", "ãŸã™ã‚™ã•ã‚ã‚‹", "ãŸãã‹ã‚™ã‚Œ", "ãŸãŸã‹ã†", "ãŸãŸã", "ãŸãŸã‚™ã—ã„", "ãŸãŸã¿", "ãŸã¡ã¯ã‚™ãª", "ãŸã‚™ã£ã‹ã„", "ãŸã‚™ã£ãゃã", "ãŸã‚™ã£ã“", "ãŸã‚™ã£ã—ã‚…ã¤", "ãŸã‚™ã£ãŸã„", "ãŸã¦ã‚‹", "ãŸã¨ãˆã‚‹", "ãŸãªã¯ã‚™ãŸ", "ãŸã«ã‚“", "ãŸã¬ã", "ãŸã®ã—ã¿", "ãŸã¯ã¤", "ãŸãµã‚™ã‚“", "ãŸã¸ã‚™ã‚‹", "ãŸã»ã‚™ã†", "ãŸã¾ã“ã‚™", "ãŸã¾ã‚‹", "ãŸã‚™ã‚€ã‚‹", "ãŸã‚ã„ã", "ãŸã‚ã™", "ãŸã‚ã‚‹", "ãŸã‚‚ã¤", "ãŸã‚„ã™ã„", "ãŸã‚ˆã‚‹", "ãŸã‚‰ã™", "ãŸã‚Šãã»ã‚“ã‹ã‚™ã‚“", "ãŸã‚Šã‚‡ã†", "ãŸã‚Šã‚‹", "ãŸã‚‹ã¨", "ãŸã‚Œã‚‹", "ãŸã‚Œã‚“ã¨", "ãŸã‚ã£ã¨", "ãŸã‚むれる", "ãŸã‚™ã‚“ã‚ã¤", "ãŸã‚“ã„", "ãŸã‚“ãŠã‚“", "ãŸã‚“ã‹", "ãŸã‚“ã", "ãŸã‚“ã‘ã‚“", "ãŸã‚“ã“ã‚™", "ãŸã‚“ã•ã‚“", "ãŸã‚“ã—゙ょã†ã²ã‚™", "ãŸã‚™ã‚“ã›ã„", "ãŸã‚“ãã", "ãŸã‚“ãŸã„", "ãŸã‚™ã‚“ã¡", "ãŸã‚“ã¦ã„", "ãŸã‚“ã¨ã†", "ãŸã‚™ã‚“ãª", "ãŸã‚“ã«ã‚“", "ãŸã‚™ã‚“ã­ã¤", "ãŸã‚“ã®ã†", "ãŸã‚“ã²ã‚šã‚“", "ãŸã‚™ã‚“ã»ã‚™ã†", "ãŸã‚“ã¾ã¤", "ãŸã‚“ã‚ã„", "ãŸã‚™ã‚“ã‚Œã¤", "ãŸã‚™ã‚“ã‚", "ãŸã‚™ã‚“ã‚", "ã¡ã‚ã„", "ã¡ã‚ã‚“", "ã¡ã„ã", "ã¡ã„ã•ã„", "ã¡ãˆã‚“", "ã¡ã‹ã„", "ã¡ã‹ã‚‰", "ã¡ãã‚…ã†", "ã¡ãã‚“", "ã¡ã‘ã„ã™ã‚™", "ã¡ã‘ã‚“", "ã¡ã“ã", "ã¡ã•ã„", "ã¡ã—ã", "ã¡ã—りょã†", "ã¡ã›ã„", "ã¡ãã†", "ã¡ãŸã„", "ã¡ãŸã‚“", "ã¡ã¡ãŠã‚„", "ã¡ã¤ã—゙ょ", "ã¡ã¦ã", "ã¡ã¦ã‚“", "ã¡ã¬ã", "ã¡ã¬ã‚Š", "ã¡ã®ã†", "ã¡ã²ã‚‡ã†", "ã¡ã¸ã„ã›ã‚“", "ã¡ã»ã†", "ã¡ã¾ãŸ", "ã¡ã¿ã¤", "ã¡ã¿ã¨ã‚™ã‚", "ã¡ã‚ã„ã¨ã‚™", "ã¡ã‚ƒã‚“ã“ãªã¸ã‚™", "ã¡ã‚…ã†ã„", "ã¡ã‚†ã‚Šã‚‡ã", "ã¡ã‚‡ã†ã—", "ã¡ã‚‡ã•ãã‘ã‚“", "ã¡ã‚‰ã—", "ã¡ã‚‰ã¿", "ã¡ã‚Šã‹ã‚™ã¿", "ã¡ã‚Šã‚‡ã†", "ã¡ã‚‹ã¨ã‚™", "ã¡ã‚ã‚", "ã¡ã‚“ãŸã„", "ã¡ã‚“ã‚‚ã", "ã¤ã„ã‹", "ã¤ã„ãŸã¡", "ã¤ã†ã‹", "ã¤ã†ã—゙ょã†", "ã¤ã†ã¯ã‚“", "ã¤ã†ã‚", "ã¤ã‹ã†", "ã¤ã‹ã‚Œã‚‹", "ã¤ãã­", "ã¤ãã‚‹", "ã¤ã‘ã­", "ã¤ã‘ã‚‹", "ã¤ã“ã‚™ã†", "ã¤ãŸãˆã‚‹", "ã¤ã¤ã‚™ã", "ã¤ã¤ã—ã‚™", "ã¤ã¤ã‚€", "ã¤ã¨ã‚ã‚‹", "ã¤ãªã‹ã‚™ã‚‹", "ã¤ãªã¿", "ã¤ã­ã¤ã‚™ã­", "ã¤ã®ã‚‹", "ã¤ãµã‚™ã™", "ã¤ã¾ã‚‰ãªã„", "ã¤ã¾ã‚‹", "ã¤ã¿ã", "ã¤ã‚ãŸã„", "ã¤ã‚‚ã‚Š", "ã¤ã‚‚ã‚‹", "ã¤ã‚ˆã„", "ã¤ã‚‹ã»ã‚™", "ã¤ã‚‹ã¿ã", "ã¤ã‚ã‚‚ã®", "ã¤ã‚ã‚Š", "ã¦ã‚ã—", "ã¦ã‚ã¦", "ã¦ã‚ã¿", "ã¦ã„ãŠã‚“", "ã¦ã„ã‹", "ã¦ã„ã", "ã¦ã„ã‘ã„", "ã¦ã„ã“ã", "ã¦ã„ã•ã¤", "ã¦ã„ã—", "ã¦ã„ã›ã„", "ã¦ã„ãŸã„", "ã¦ã„ã¨ã‚™", "ã¦ã„ã­ã„", "ã¦ã„ã²ã‚‡ã†", "ã¦ã„ã¸ã‚“", "ã¦ã„ã»ã‚™ã†", "ã¦ã†ã¡", "ã¦ãŠãã‚Œ", "ã¦ãã¨ã†", "ã¦ãã²ã‚™", "ã¦ã‚™ã“ã»ã‚™ã“", "ã¦ã•ã゙ょã†", "ã¦ã•ã‘ã‚™", "ã¦ã™ã‚Š", "ã¦ãã†", "ã¦ã¡ã‹ã‚™ã„", "ã¦ã¡ã‚‡ã†", "ã¦ã¤ã‹ã‚™ã", "ã¦ã¤ã¤ã‚™ã", "ã¦ã‚™ã£ã¯ã‚š", "ã¦ã¤ã»ã‚™ã†", "ã¦ã¤ã‚„", "ã¦ã‚™ã¬ã‹ãˆ", "ã¦ã¬ã", "ã¦ã¬ãã‚™ã„", "ã¦ã®ã²ã‚‰", "ã¦ã¯ã„", "ã¦ãµã‚™ãã‚", "ã¦ãµãŸã‚™", "ã¦ã»ã¨ã‚™ã", "ã¦ã»ã‚“", "ã¦ã¾ãˆ", "ã¦ã¾ãã™ã‚™ã—", "ã¦ã¿ã—ã‚™ã‹", "ã¦ã¿ã‚„ã‘ã‚™", "ã¦ã‚‰ã™", "ã¦ã‚Œã²ã‚™", "ã¦ã‚ã‘", "ã¦ã‚ãŸã—", "ã¦ã‚™ã‚“ã‚ã¤", "ã¦ã‚“ã„ã‚“", "ã¦ã‚“ã‹ã„", "ã¦ã‚“ã", "ã¦ã‚“ãã‚™", "ã¦ã‚“ã‘ã‚“", "ã¦ã‚“ã“ã‚™ã", "ã¦ã‚“ã•ã„", "ã¦ã‚“ã—", "ã¦ã‚“ã™ã†", "ã¦ã‚™ã‚“ã¡", "ã¦ã‚“ã¦ã", "ã¦ã‚“ã¨ã†", "ã¦ã‚“ãªã„", "ã¦ã‚“ãµã‚šã‚‰", "ã¦ã‚“ã»ã‚™ã†ãŸã‚™ã„", "ã¦ã‚“ã‚ã¤", "ã¦ã‚“らんã‹ã„", "ã¦ã‚™ã‚“りょã", "ã¦ã‚™ã‚“ã‚", "ã¨ã‚™ã‚ã„", "ã¨ã„ã‚Œ", "ã¨ã‚™ã†ã‹ã‚“", "ã¨ã†ãã‚…ã†", "ã¨ã‚™ã†ãã‚™", "ã¨ã†ã—", "ã¨ã†ã‚€ãã‚™", "ã¨ãŠã„", "ã¨ãŠã‹", "ã¨ãŠã", "ã¨ãŠã™", "ã¨ãŠã‚‹", "ã¨ã‹ã„", "ã¨ã‹ã™", "ã¨ããŠã‚Š", "ã¨ãã¨ã‚™ã", "ã¨ãã„", "ã¨ãã—ã‚…ã†", "ã¨ãã¦ã‚“", "ã¨ãã«", "ã¨ãã¸ã‚™ã¤", "ã¨ã‘ã„", "ã¨ã‘ã‚‹", "ã¨ã“ã‚„", "ã¨ã•ã‹", "ã¨ã—ょã‹ã‚“", "ã¨ãã†", "ã¨ãŸã‚“", "ã¨ã¡ã‚…ã†", "ã¨ã£ãã‚…ã†", "ã¨ã£ãã‚“", "ã¨ã¤ã›ã‚™ã‚“", "ã¨ã¤ã«ã‚…ã†", "ã¨ã¨ã‚™ã‘ã‚‹", "ã¨ã¨ã®ãˆã‚‹", "ã¨ãªã„", "ã¨ãªãˆã‚‹", "ã¨ãªã‚Š", "ã¨ã®ã•ã¾", "ã¨ã¯ã‚™ã™", "ã¨ã‚™ãµã‚™ã‹ã‚™ã‚", "ã¨ã»ã†", "ã¨ã¾ã‚‹", "ã¨ã‚ã‚‹", "ã¨ã‚‚ãŸã‚™ã¡", "ã¨ã‚‚ã‚‹", "ã¨ã‚™ã‚ˆã†ã²ã‚™", "ã¨ã‚‰ãˆã‚‹", "ã¨ã‚“ã‹ã¤", "ã¨ã‚™ã‚“ãµã‚™ã‚Š", "ãªã„ã‹ã", "ãªã„ã“ã†", "ãªã„ã—ょ", "ãªã„ã™", "ãªã„ã›ã‚“", "ãªã„ãã†", "ãªãŠã™", "ãªã‹ã‚™ã„", "ãªãã™", "ãªã‘゙る", "ãªã“ã†ã¨ã‚™", "ãªã•ã‘", "ãªãŸã¦ã‚™ã“ã“", "ãªã£ã¨ã†", "ãªã¤ã‚„ã™ã¿", "ãªãªãŠã—", "ãªã«ã“ã‚™ã¨", "ãªã«ã‚‚ã®", "ãªã«ã‚", "ãªã®ã‹", "ãªãµãŸã‚™", "ãªã¾ã„ã", "ãªã¾ãˆ", "ãªã¾ã¿", "ãªã¿ãŸã‚™", "ãªã‚らã‹", "ãªã‚ã‚‹", "ãªã‚„ã‚€", "ãªã‚‰ã†", "ãªã‚‰ã²ã‚™", "ãªã‚‰ãµã‚™", "ãªã‚Œã‚‹", "ãªã‚ã¨ã²ã‚™", "ãªã‚ã¯ã‚™ã‚Š", "ã«ã‚ã†", "ã«ã„ã‹ã‚™ãŸ", "ã«ã†ã‘", "ã«ãŠã„", "ã«ã‹ã„", "ã«ã‹ã‚™ã¦", "ã«ãã²ã‚™", "ã«ãã—ã¿", "ã«ãã¾ã‚“", "ã«ã‘゙る", "ã«ã•ã‚“ã‹ãŸã‚“ã", "ã«ã—ã", "ã«ã›ã‚‚ã®", "ã«ã¡ã—゙ょã†", "ã«ã¡ã‚ˆã†ã²ã‚™", "ã«ã£ã‹", "ã«ã£ã", "ã«ã£ã‘ã„", "ã«ã£ã“ã†", "ã«ã£ã•ã‚“", "ã«ã£ã—ょã", "ã«ã£ã™ã†", "ã«ã£ã›ã", "ã«ã£ã¦ã„", "ã«ãªã†", "ã«ã»ã‚“", "ã«ã¾ã‚", "ã«ã‚‚ã¤", "ã«ã‚„ã‚Š", "ã«ã‚…ã†ã„ã‚“", "ã«ã‚Šã‚“ã—ゃ", "ã«ã‚ã¨ã‚Š", "ã«ã‚“ã„", "ã«ã‚“ã‹", "ã«ã‚“ã", "ã«ã‚“ã‘゙ん", "ã«ã‚“ã—ã", "ã«ã‚“ã™ã‚™ã†", "ã«ã‚“ãã†", "ã«ã‚“ãŸã„", "ã«ã‚“ã¡", "ã«ã‚“ã¦ã„", "ã«ã‚“ã«ã", "ã«ã‚“ãµã‚š", "ã«ã‚“ã¾ã‚Š", "ã«ã‚“ã‚€", "ã«ã‚“ã‚ã„", "ã«ã‚“よã†", "ã¬ã„ããã‚™", "ã¬ã‹ã™", "ã¬ãã‚™ã„ã¨ã‚‹", "ã¬ãã‚™ã†", "ã¬ãã‚‚ã‚Š", "ã¬ã™ã‚€", "ã¬ã¾ãˆã²ã‚™", "ã¬ã‚ã‚Š", "ã¬ã‚‰ã™", "ã¬ã‚“ã¡ã‚ƒã", "ã­ã‚ã‘ã‚™", "ã­ã„ã", "ã­ã„ã‚‹", "ã­ã„ã‚", "ã­ãã‚™ã›", "ã­ããŸã„", "ã­ãら", "ã­ã“ã›ã‚™", "ã­ã“ã‚€", "ã­ã•ã‘ã‚™", "ã­ã™ã“ã‚™ã™", "ã­ãã¸ã‚™ã‚‹", "ã­ãŸã‚™ã‚“", "ã­ã¤ã„", "ã­ã£ã—ã‚“", "ã­ã¤ãã‚™ã†", "ã­ã£ãŸã„ã゙ょ", "ã­ãµã‚™ãã", "ã­ãµãŸã‚™", "ã­ã»ã‚™ã†", "ã­ã»ã‚Šã¯ã»ã‚Š", "ã­ã¾ã", "ã­ã¾ã‚ã—", "ã­ã¿ã¿", "ã­ã‚€ã„", "ã­ã‚€ãŸã„", "ã­ã‚‚ã¨", "ã­ã‚‰ã†", "ã­ã‚ã•ã‚™", "ã­ã‚“ã„ã‚Š", "ã­ã‚“ãŠã—", "ã­ã‚“ã‹ã‚“", "ã­ã‚“ãã‚“", "ã­ã‚“ãã‚™", "ã­ã‚“ã•ã‚™", "ã­ã‚“ã—", "ã­ã‚“ã¡ã‚ƒã", "ã­ã‚“ã¨ã‚™", "ã­ã‚“ã²ã‚š", "ã­ã‚“ãµã‚™ã¤", "ã­ã‚“ã¾ã¤", "ã­ã‚“りょã†", "ã­ã‚“ã‚Œã„", "ã®ã„ã™ã‚™", "ã®ãŠã¤ã‚™ã¾", "ã®ã‹ã‚™ã™", "ã®ããªã¿", "ã®ã“ã゙り", "ã®ã“ã™", "ã®ã“ã‚‹", "ã®ã›ã‚‹", "ã®ãã‚™ã", "ã®ã゙む", "ã®ãŸã¾ã†", "ã®ã¡ã»ã¨ã‚™", "ã®ã£ã", "ã®ã¯ã‚™ã™", "ã®ã¯ã‚‰", "ã®ã¸ã‚™ã‚‹", "ã®ã»ã‚™ã‚‹", "ã®ã¿ã‚‚ã®", "ã®ã‚„ã¾", "ã®ã‚‰ã„ã¬", "ã®ã‚‰ã­ã“", "ã®ã‚Šã‚‚ã®", "ã®ã‚Šã‚†ã", "ã®ã‚Œã‚“", "ã®ã‚“ã", "ã¯ã‚™ã‚ã„", "ã¯ã‚ã", "ã¯ã‚™ã‚ã•ã‚“", "ã¯ã‚™ã„ã‹", "ã¯ã‚™ã„ã", "ã¯ã„ã‘ã‚“", "ã¯ã„ã“ã‚™", "ã¯ã„ã—ã‚“", "ã¯ã„ã™ã„", "ã¯ã„ã›ã‚“", "ã¯ã„ãã†", "ã¯ã„ã¡", "ã¯ã‚™ã„ã¯ã‚™ã„", "ã¯ã„ã‚Œã¤", "ã¯ãˆã‚‹", "ã¯ãŠã‚‹", "ã¯ã‹ã„", "ã¯ã‚™ã‹ã‚Š", "ã¯ã‹ã‚‹", "ã¯ãã—ã‚…", "ã¯ã‘ã‚“", "ã¯ã“ãµã‚™", "ã¯ã•ã¿", "ã¯ã•ã‚“", "ã¯ã—ã“ã‚™", "ã¯ã‚™ã—ょ", "ã¯ã—ã‚‹", "ã¯ã›ã‚‹", "ã¯ã‚šãã“ã‚“", "ã¯ãã‚“", "ã¯ãŸã‚“", "ã¯ã¡ã¿ã¤", "ã¯ã¤ãŠã‚“", "ã¯ã£ã‹ã", "ã¯ã¤ã‚™ã", "ã¯ã£ãã‚Š", "ã¯ã£ãã¤", "ã¯ã£ã‘ã‚“", "ã¯ã£ã“ã†", "ã¯ã£ã•ã‚“", "ã¯ã£ã—ã‚“", "ã¯ã£ãŸã¤", "ã¯ã£ã¡ã‚…ã†", "ã¯ã£ã¦ã‚“", "ã¯ã£ã²ã‚šã‚‡ã†", "ã¯ã£ã»ã‚šã†", "ã¯ãªã™", "ã¯ãªã²ã‚™", "ã¯ã«ã‹ã‚€", "ã¯ãµã‚™ã‚‰ã—", "ã¯ã¿ã‹ã‚™ã", "ã¯ã‚€ã‹ã†", "ã¯ã‚ã¤", "ã¯ã‚„ã„", "ã¯ã‚„ã—", "ã¯ã‚‰ã†", "ã¯ã‚ã†ãƒã‚“", "ã¯ã‚ã„", "ã¯ã‚“ã„", "ã¯ã‚“ãˆã„", "ã¯ã‚“ãŠã‚“", "ã¯ã‚“ã‹ã", "ã¯ã‚“ãょã†", "ã¯ã‚™ã‚“ãã‚™ã¿", "ã¯ã‚“ã“", "ã¯ã‚“ã—ゃ", "ã¯ã‚“ã™ã†", "ã¯ã‚“ãŸã‚™ã‚“", "ã¯ã‚šã‚“ã¡", "ã¯ã‚šã‚“ã¤", "ã¯ã‚“ã¦ã„", "ã¯ã‚“ã¨ã—", "ã¯ã‚“ã®ã†", "ã¯ã‚“ã¯ã‚š", "ã¯ã‚“ãµã‚™ã‚“", "ã¯ã‚“ã¸ã‚šã‚“", "ã¯ã‚“ã»ã‚™ã†ã", "ã¯ã‚“ã‚ã„", "ã¯ã‚“らん", "ã¯ã‚“ã‚ã‚“", "ã²ã„ã", "ã²ã†ã‚“", "ã²ãˆã‚‹", "ã²ã‹ã", "ã²ã‹ã‚Š", "ã²ã‹ã‚‹", "ã²ã‹ã‚“", "ã²ãã„", "ã²ã‘ã¤", "ã²ã“ã†ã", "ã²ã“ã", "ã²ã•ã„", "ã²ã•ã—ãµã‚™ã‚Š", "ã²ã•ã‚“", "ã²ã‚™ã—゙ゅã¤ã‹ã‚“", "ã²ã—ょ", "ã²ãã‹", "ã²ãã‚€", "ã²ãŸã‚€ã", "ã²ãŸã‚™ã‚Š", "ã²ãŸã‚‹", "ã²ã¤ãã‚™", "ã²ã£ã“ã—", "ã²ã£ã—", "ã²ã¤ã—゙ゅã²ã‚“", "ã²ã£ã™", "ã²ã¤ã›ã‚™ã‚“", "ã²ã‚šã£ãŸã‚Š", "ã²ã‚šã£ã¡ã‚Š", "ã²ã¤ã‚ˆã†", "ã²ã¦ã„", "ã²ã¨ã“ã‚™ã¿", "ã²ãªã¾ã¤ã‚Š", "ã²ãªã‚“", "ã²ã­ã‚‹", "ã²ã¯ã‚“", "ã²ã²ã‚™ã", "ã²ã²ã‚‡ã†", "ã²ã»ã†", "ã²ã¾ã‚ã‚Š", "ã²ã¾ã‚“", "ã²ã¿ã¤", "ã²ã‚ã„", "ã²ã‚ã—ã‚™ã—", "ã²ã‚„ã‘", "ã²ã‚„ã™", "ã²ã‚ˆã†", "ã²ã‚™ã‚‡ã†ã", "ã²ã‚‰ã‹ã‚™ãª", "ã²ã‚‰ã", "ã²ã‚Šã¤", "ã²ã‚Šã‚‡ã†", "ã²ã‚‹ã¾", "ã²ã‚‹ã‚„ã™ã¿", "ã²ã‚Œã„", "ã²ã‚ã„", "ã²ã‚ã†", "ã²ã‚ã", "ã²ã‚ゆã", "ã²ã‚“ã‹ã", "ã²ã‚“ã‘ã¤", "ã²ã‚“ã“ã‚“", "ã²ã‚“ã—ã‚…", "ã²ã‚“ãã†", "ã²ã‚šã‚“ã¡", "ã²ã‚“ã¯ã‚šã‚“", "ã²ã‚™ã‚“ã»ã‚™ã†", "ãµã‚ã‚“", "ãµã„ã†ã¡", "ãµã†ã‘ã„", "ãµã†ã›ã‚“", "ãµã‚šã†ãŸã‚ã†", "ãµã†ã¨ã†", "ãµã†ãµ", "ãµãˆã‚‹", "ãµãŠã‚“", "ãµã‹ã„", "ãµãã‚“", "ãµãã•ã‚™ã¤", "ãµããµã‚™ãã‚", "ãµã“ã†", "ãµã•ã„", "ãµã—ãã‚™", "ãµã—ã‚™ã¿", "ãµã™ã¾", "ãµã›ã„", "ãµã›ãã‚™", "ãµãã", "ãµã‚™ãŸã«ã", "ãµãŸã‚“", "ãµã¡ã‚‡ã†", "ãµã¤ã†", "ãµã¤ã‹", "ãµã£ã‹ã¤", "ãµã£ã", "ãµã£ã“ã", "ãµã‚™ã¨ã‚™ã†", "ãµã¨ã‚‹", "ãµã¨ã‚“", "ãµã®ã†", "ãµã¯ã„", "ãµã²ã‚‡ã†", "ãµã¸ã‚“", "ãµã¾ã‚“", "ãµã¿ã‚“", "ãµã‚ã¤", "ãµã‚ã‚“", "ãµã‚ˆã†", "ãµã‚Šã“", "ãµã‚Šã‚‹", "ãµã‚‹ã„", "ãµã‚“ã„ã", "ãµã‚™ã‚“ã‹ã‚™ã", "ãµã‚™ã‚“ãã‚™", "ãµã‚“ã—ã¤", "ãµã‚™ã‚“ã›ã", "ãµã‚“ãã†", "ãµã‚™ã‚“ã»ã‚šã†", "ã¸ã„ã‚ã‚“", "ã¸ã„ãŠã‚“", "ã¸ã„ã‹ã‚™ã„", "ã¸ã„ã", "ã¸ã„ã‘゙ん", "ã¸ã„ã“ã†", "ã¸ã„ã•", "ã¸ã„ã—ゃ", "ã¸ã„ã›ã¤", "ã¸ã„ã", "ã¸ã„ãŸã", "ã¸ã„ã¦ã‚“", "ã¸ã„ã­ã¤", "ã¸ã„ã‚", "ã¸ãã‹ã‚™", "ã¸ã“ã‚€", "ã¸ã‚™ã«ã„ã‚", "ã¸ã‚™ã«ã—ょã†ã‹ã‚™", "ã¸ã‚‰ã™", "ã¸ã‚“ã‹ã‚“", "ã¸ã‚™ã‚“ãょã†", "ã¸ã‚™ã‚“ã“ã‚™ã—", "ã¸ã‚“ã•ã„", "ã¸ã‚“ãŸã„", "ã¸ã‚™ã‚“ã‚Š", "ã»ã‚ã‚“", "ã»ã„ã", "ã»ã‚™ã†ã゙ょ", "ã»ã†ã“ã", "ã»ã†ãã†", "ã»ã†ã»ã†", "ã»ã†ã‚‚ã‚“", "ã»ã†ã‚Šã¤", "ã»ãˆã‚‹", "ã»ãŠã‚“", "ã»ã‹ã‚“", "ã»ãょã†", "ã»ã‚™ãã‚“", "ã»ãã‚", "ã»ã‘ã¤", "ã»ã‘ã‚“", "ã»ã“ã†", "ã»ã“ã‚‹", "ã»ã—ã„", "ã»ã—ã¤", "ã»ã—ã‚…", "ã»ã—ょã†", "ã»ã›ã„", "ã»ãã„", "ã»ãã", "ã»ãŸã¦", "ã»ãŸã‚‹", "ã»ã‚šã¡ãµã‚™ãã‚", "ã»ã£ãょã", "ã»ã£ã•", "ã»ã£ãŸã‚“", "ã»ã¨ã‚“ã¨ã‚™", "ã»ã‚ã‚‹", "ã»ã‚“ã„", "ã»ã‚“ã", "ã»ã‚“ã‘", "ã»ã‚“ã—ã¤", "ã»ã‚“ã‚„ã", "ã¾ã„ã«ã¡", "ã¾ã‹ã„", "ã¾ã‹ã›ã‚‹", "ã¾ã‹ã‚™ã‚‹", "ã¾ã‘ã‚‹", "ã¾ã“ã¨", "ã¾ã•ã¤", "ã¾ã—ã‚™ã‚", "ã¾ã™ã", "ã¾ã›ã‚™ã‚‹", "ã¾ã¤ã‚Š", "ã¾ã¨ã‚", "ã¾ãªãµã‚™", "ã¾ã¬ã‘", "ã¾ã­ã", "ã¾ã»ã†", "ã¾ã‚‚ã‚‹", "ã¾ã‚†ã‘ã‚™", "ã¾ã‚ˆã†", "ã¾ã‚ã‚„ã‹", "ã¾ã‚ã™", "ã¾ã‚ã‚Š", "ã¾ã‚ã‚‹", "ã¾ã‚“ã‹ã‚™", "ã¾ã‚“ãã¤", "ã¾ã‚“ãã‚™ã", "ã¾ã‚“ãªã‹", "ã¿ã„ら", "ã¿ã†ã¡", "ã¿ãˆã‚‹", "ã¿ã‹ã‚™ã", "ã¿ã‹ãŸ", "ã¿ã‹ã‚“", "ã¿ã‘ã‚“", "ã¿ã“ã‚“", "ã¿ã—ã‚™ã‹ã„", "ã¿ã™ã„", "ã¿ã™ãˆã‚‹", "ã¿ã›ã‚‹", "ã¿ã£ã‹", "ã¿ã¤ã‹ã‚‹", "ã¿ã¤ã‘ã‚‹", "ã¿ã¦ã„", "ã¿ã¨ã‚ã‚‹", "ã¿ãªã¨", "ã¿ãªã¿ã‹ã•ã„", "ã¿ã­ã‚‰ã‚‹", "ã¿ã®ã†", "ã¿ã®ã‹ã‚™ã™", "ã¿ã»ã‚“", "ã¿ã‚‚ã¨", "ã¿ã‚„ã‘ã‚™", "ã¿ã‚‰ã„", "ã¿ã‚Šã‚‡ã", "ã¿ã‚ã", "ã¿ã‚“ã‹", "ã¿ã‚“ãã‚™ã", "ã‚€ã„ã‹", "ã‚€ãˆã", "ã‚€ãˆã‚“", "ã‚€ã‹ã„", "ã‚€ã‹ã†", "ã‚€ã‹ãˆ", "ã‚€ã‹ã—", "ã‚€ãã‚™ã¡ã‚ƒ", "ã‚€ã‘ã‚‹", "ã‚€ã‘゙ん", "ã‚€ã•ã»ã‚™ã‚‹", "ã‚€ã—ã‚ã¤ã„", "ã‚€ã—ã¯ã‚™", "ã‚€ã—゙ゅん", "ã‚€ã—ã‚", "ã‚€ã™ã†", "ã‚€ã™ã“", "ã‚€ã™ãµã‚™", "ã‚€ã™ã‚", "ã‚€ã›ã‚‹", "ã‚€ã›ã‚“", "ã‚€ã¡ã‚…ã†", "ã‚€ãªã—ã„", "ã‚€ã®ã†", "むやã¿", "むよã†", "むらã•ã", "むりょã†", "ã‚€ã‚ã‚“", "ã‚ã„ã‚ã‚“", "ã‚ã„ã†ã‚“", "ã‚ã„ãˆã‚“", "ã‚ã„ã‹ã", "ã‚ã„ãょã", "ã‚ã„ã•ã„", "ã‚ã„ã—", "ã‚ã„ãã†", "ã‚ã„ãµã‚™ã¤", "ã‚ã„ã‚Œã„", "ã‚ã„ã‚ã", "ã‚ãã‚™ã¾ã‚Œã‚‹", "ã‚ã•ã‚™ã™", "ã‚ã—ãŸ", "ã‚ã™ã‚™ã‚‰ã—ã„", "ã‚ãŸã‚™ã¤", "ã‚ã¾ã„", "ã‚ã‚„ã™", "ã‚ã‚“ãょ", "ã‚ã‚“ã›ã", "ã‚ã‚“ã¨ã‚™ã†", "ã‚‚ã†ã—ã‚ã‘゙る", "ã‚‚ã†ã¨ã‚™ã†ã‘ã‚“", "ã‚‚ãˆã‚‹", "ã‚‚ãã—", "ã‚‚ãã¦ã", "ã‚‚ãよã†ã²ã‚™", "ã‚‚ã¡ã‚ã‚“", "ã‚‚ã¨ã‚™ã‚‹", "もらã†", "ã‚‚ã‚“ã", "ã‚‚ã‚“ãŸã‚™ã„", "ã‚„ãŠã‚„", "ã‚„ã‘ã‚‹", "ã‚„ã•ã„", "ã‚„ã•ã—ã„", "ã‚„ã™ã„", "ã‚„ã™ãŸã‚ã†", "ã‚„ã™ã¿", "ã‚„ã›ã‚‹", "ã‚„ãã†", "ã‚„ãŸã„", "ã‚„ã¡ã‚“", "ã‚„ã£ã¨", "ã‚„ã£ã¯ã‚šã‚Š", "ã‚„ãµã‚™ã‚‹", "ã‚„ã‚ã‚‹", "ã‚„ã‚„ã“ã—ã„", "やよã„", "ã‚„ã‚らã‹ã„", "ゆã†ã", "ゆã†ã²ã‚™ã‚“ãょã", "ゆã†ã¸ã‚™", "ゆã†ã‚ã„", "ゆã‘ã¤", "ゆã—ã‚…ã¤", "ゆã›ã‚“", "ゆãã†", "ゆãŸã‹", "ゆã¡ã‚ƒã", "ゆã¦ã‚™ã‚‹", "ゆã«ã‚…ã†", "ゆã²ã‚™ã‚", "ゆらã„", "ゆれる", "よã†ã„", "よã†ã‹", "よã†ãã‚…ã†", "よã†ã—ã‚™", "よã†ã™", "よã†ã¡ãˆã‚“", "よã‹ã›ã‚™", "よã‹ã‚“", "よãã‚“", "よãã›ã„", "よãã»ã‚™ã†", "よã‘ã„", "よã“゙れる", "よã•ã‚“", "よã—ã‚…ã†", "よãã†", "よãã", "よã£ã‹", "よã¦ã„", "よã¨ã‚™ã‹ã‚™ã‚ã", "よã­ã¤", "よやã", "よゆã†", "よã‚ã“ãµã‚™", "よã‚ã—ã„", "らã„ã†", "らãã‹ã‚™ã", "らãã“ã‚™", "らãã•ã¤", "らããŸã‚™", "らã—ã‚“ã¯ã‚™ã‚“", "らã›ã‚“", "らãã‚™ã", "らãŸã„", "らã£ã‹", "られã¤", "ã‚Šãˆã", "ã‚Šã‹ã„", "ã‚Šãã•ã", "ã‚Šãã›ã¤", "ã‚Šãã゙ん", "ã‚Šãã¤", "ã‚Šã‘ã‚“", "ã‚Šã“ã†", "ã‚Šã›ã„", "ã‚Šãã†", "ã‚Šãã", "ã‚Šã¦ã‚“", "ã‚Šã­ã‚“", "りゆã†", "ã‚Šã‚…ã†ã‹ã‚™ã", "りよã†", "りょã†ã‚Š", "りょã‹ã‚“", "りょãã¡ã‚ƒ", "りょã“ã†", "ã‚Šã‚Šã", "ã‚Šã‚Œã", "ã‚Šã‚ã‚“", "ã‚Šã‚“ã“ã‚™", "ã‚‹ã„ã‘ã„", "ã‚‹ã„ã•ã„", "ã‚‹ã„ã—ã‚™", "ã‚‹ã„ã›ã", "ã‚‹ã™ã¯ã‚™ã‚“", "ã‚‹ã‚Šã‹ã‚™ã‚ら", "ã‚Œã„ã‹ã‚“", "ã‚Œã„ãã‚™", "ã‚Œã„ã›ã„", "ã‚Œã„ãã‚™ã†ã“", "ã‚Œã„ã¨ã†", "ã‚Œã„ã»ã‚™ã†", "ã‚Œãã—", "ã‚ŒããŸã‚™ã„", "れんã‚ã„", "れんã‘ã„", "れんã“ã‚“", "れんã•ã„", "れんã—ã‚…ã†", "れんãã‚™ã", "れんらã", "ã‚ã†ã‹", "ã‚ã†ã“ã‚™", "ã‚ã†ã—゙ん", "ã‚ã†ãã", "ã‚ãã‹ã‚™", "ã‚ã“ã¤", "ã‚ã—ã‚™ã†ã‚‰", "ã‚ã—ã‚…ã¤", "ã‚ã›ã‚“", "ã‚ã¦ã‚“", "ã‚ã‚ã‚“", "ã‚ã‚Œã¤", "ã‚ã‚“ãã‚™", "ã‚ã‚“ã¯ã‚š", "ã‚ã‚“ãµã‚™ã‚“", "ã‚ã‚“ã‚Š", "ã‚ã‹ã™", "ã‚ã‹ã‚", "ã‚ã‹ã‚„ã¾", "ã‚ã‹ã‚Œã‚‹", "ã‚ã—ã¤", "ã‚ã—ã‚™ã¾ã—", "ã‚ã™ã‚Œã‚‚ã®", "ã‚らã†", "ã‚れる") diff --git a/src/main/kotlin/com/radixdlt/bip39/wordlists/Korean.kt b/src/main/kotlin/com/radixdlt/bip39/wordlists/Korean.kt new file mode 100644 index 0000000..256282c --- /dev/null +++ b/src/main/kotlin/com/radixdlt/bip39/wordlists/Korean.kt @@ -0,0 +1,3 @@ +package com.radixdlt.bip39.wordlists + +val WORDLIST_KOREAN = listOf("가격", "가á„ᅳᆷ", "가난", "가능", "가득", "가르침", "가뭄", "가방", "가상", "가슴", "가운데", "가을", "가이드", "가입", "가장", "가정", "가족", "가죽", "각오", "각자", "간격", "간부", "간섭", "간장", "간접", "간판", "갈등", "갈비", "갈색", "갈증", "감각", "감기", "감소", "감수성", "감자", "감정", "갑자기", "강남", "강당", "강도", "강력히", "강변", "강북", "강사", "강수량", "강아지", "강원도", "강의", "강제", "강조", "같이", "개구리", "개나리", "개방", "개별", "개선", "개성", "개인", "객관적", "거실", "거액", "거울", "거짓", "거품", "걱정", "건강", "건물", "건설", "건조", "건축", "걸음", "검사", "검á„á…©", "게시판", "게임", "겨울", "견해", "결과", "결국", "결론", "결석", "결승", "결심", "결정", "결혼", "경계", "경고", "경기", "경력", "경복궁", "경비", "경상도", "경영", "경우", "경쟁", "경제", "경주", "경찰", "경치", "경향", "경험", "계곡", "계단", "계란", "계산", "계속", "계약", "계절", "계층", "계획", "고객", "고구려", "고궁", "고급", "고등학생", "고무신", "고민", "고양이", "고장", "고전", "고집", "고춧가루", "고á„ᅩᆼ", "고향", "곡식", "골목", "골á„ᅡ기", "골프", "공간", "공개", "공격", "공군", "공급", "공기", "공동", "공무원", "공부", "공사", "공식", "공업", "공연", "공원", "공장", "공á„á…¡", "공책", "공á„ᅩᆼ", "공포", "공항", "공휴일", "과목", "과일", "과장", "과정", "과학", "관객", "관계", "관광", "관념", "관람", "관련", "관리", "관습", "관심", "관점", "관찰", "광경", "광고", "광장", "광주", "괴로움", "굉장히", "교과서", "교문", "교복", "교실", "교양", "교육", "교장", "교직", "교á„ᅩᆼ", "교환", "교훈", "구경", "구름", "구멍", "구별", "구분", "구석", "구성", "구속", "구역", "구입", "구청", "구체적", "국가", "국기", "국내", "국립", "국물", "국민", "국수", "국어", "국왕", "국적", "국제", "국회", "군대", "군사", "군인", "궁극적", "권리", "권위", "권á„á…®", "귀국", "귀신", "규정", "규칙", "균형", "그날", "그냥", "그늘", "그러나", "그룹", "그릇", "그림", "그제서야", "그á„ᅩ록", "극복", "극히", "근거", "근교", "근래", "근로", "근무", "근본", "근원", "근육", "근처", "글씨", "글자", "금강산", "금고", "금년", "금메달", "금액", "금연", "금요일", "금지", "긍정적", "기간", "기관", "기념", "기능", "기독교", "기둥", "기록", "기름", "기법", "기본", "기분", "기쁨", "기숙사", "기술", "기억", "기업", "기온", "기운", "기원", "기적", "기준", "기침", "기혼", "기획", "긴급", "긴장", "길이", "김밥", "김치", "김포공항", "á„ᅡᆨ두기", "á„ᅡᆷ빡", "á„ᅢ달음", "á„ᅢ소금", "á„ᅥᆸ질", "á„ᅩᆨ대기", "á„ᅩᆾ이á‡", "나들이", "나란히", "나머지", "나물", "나침반", "나흘", "낙엽", "난방", "날개", "날씨", "날á„á…¡", "남녀", "남대문", "남매", "남산", "남자", "남편", "남학생", "낭비", "낱말", "내년", "내용", "내일", "냄비", "냄새", "냇물", "냉동", "냉면", "냉방", "냉장고", "넥á„á…¡á„‹á…µ", "넷á„á…¢", "노동", "노란색", "노력", "노인", "녹음", "녹차", "녹화", "논리", "논문", "논쟁", "놀이", "농구", "농담", "농민", "농부", "농업", "농장", "농촌", "á„‚á…©á‡á„‹á…µ", "눈동자", "눈물", "눈썹", "뉴욕", "á„‚á…³á„ᅵᆷ", "늑대", "능동적", "능력", "다방", "다양성", "다음", "다이어á„á…³", "다행", "단계", "단골", "단독", "단맛", "단순", "단어", "단위", "단점", "단체", "단추", "단편", "단풍", "달걀", "달러", "달력", "달리", "닭고기", "담당", "담배", "담요", "담임", "답변", "답장", "당근", "당분간", "당연히", "당장", "대규모", "대낮", "대단히", "대답", "대도시", "대략", "대량", "대륙", "대문", "대부분", "대신", "대응", "대장", "대전", "대접", "대중", "대책", "대출", "대충", "대á„ᅩᆼ령", "대학", "대한민국", "대합실", "대형", "덩어리", "데이á„á…³", "도대체", "도덕", "도둑", "도망", "도서관", "도심", "도움", "도입", "도자기", "도저히", "도전", "도중", "도착", "독감", "독립", "독서", "독일", "독창적", "동화책", "뒷모습", "뒷산", "딸아이", "마누라", "마늘", "마당", "마라á„ᅩᆫ", "마련", "마무리", "마사지", "마약", "마요네즈", "마을", "마음", "마이á„á…³", "마중", "마지막", "마찬가지", "마찰", "마흔", "막걸리", "막내", "막상", "만남", "만두", "만세", "만약", "만일", "만점", "만족", "만화", "많이", "말기", "말씀", "말á„á…®", "맘대로", "망원경", "매년", "매달", "매력", "매번", "매스á„ᅥᆷ", "매일", "매장", "맥주", "먹이", "먼저", "먼지", "멀리", "메일", "며느리", "며칠", "면담", "멸치", "명단", "명령", "명예", "명의", "명절", "명칭", "명함", "모금", "모니á„á…¥", "모델", "모든", "모범", "모습", "모양", "모임", "모조리", "모집", "모á„ᅮᆼ이", "목걸이", "목록", "목사", "목소리", "목숨", "목적", "목표", "몰래", "몸매", "몸무게", "몸살", "몸속", "몸짓", "몸á„ᅩᆼ", "몹시", "무관심", "무궁화", "무더위", "무덤", "무르á‡", "무슨", "무엇", "무역", "무용", "무조건", "무지개", "무척", "문구", "문득", "문법", "문서", "문제", "문학", "문화", "물가", "물건", "물결", "물고기", "물론", "물리학", "물음", "물질", "물체", "미국", "미디어", "미사일", "미술", "미역", "미용실", "미움", "미인", "미á„ᅵᆼ", "미혼", "민간", "민족", "민주", "믿음", "밀가루", "밀리미á„á…¥", "밑바닥", "바가지", "바구니", "바나나", "바늘", "바닥", "바닷가", "바람", "바이러스", "바á„ᅡᆼ", "박물관", "박사", "박수", "반대", "반드시", "반말", "반발", "반성", "반응", "반장", "반죽", "반지", "반찬", "받침", "발가락", "발걸음", "발견", "발달", "발레", "발목", "발바닥", "발생", "발음", "발자국", "발전", "발á„ᅩᆸ", "발표", "밤하늘", "밥그릇", "밥맛", "밥상", "밥솥", "방금", "방면", "방문", "방바닥", "방법", "방송", "방식", "방안", "방울", "방지", "방학", "방해", "방향", "배경", "배á„ᅩᆸ", "배달", "배드민á„ᅥᆫ", "백두산", "백색", "백성", "백인", "백제", "백화점", "버릇", "버섯", "버á„ᅳᆫ", "번개", "번역", "번지", "번호", "벌금", "벌레", "벌써", "범위", "범인", "범죄", "법률", "법원", "법적", "법칙", "베이징", "벨á„á…³", "변경", "변동", "변명", "변신", "변호사", "변화", "별도", "별명", "별일", "병실", "병아리", "병원", "보관", "보너스", "보라색", "보람", "보름", "보상", "보안", "보자기", "보장", "보전", "보존", "보á„ᅩᆼ", "보편적", "보험", "복도", "복사", "복숭아", "복습", "볶음", "본격적", "본래", "본부", "본사", "본성", "본인", "본질", "볼펜", "봉사", "봉지", "봉á„á…®", "부근", "부á„ᅳ러움", "부담", "부동산", "부문", "부분", "부산", "부상", "부엌", "부인", "부작용", "부장", "부정", "부족", "부지런히", "부친", "부á„ᅡᆨ", "부품", "부회장", "북부", "북한", "분노", "분량", "분리", "분명", "분석", "분야", "분위기", "분필", "분홍색", "불고기", "불과", "불교", "불á„ᅩᆾ", "불만", "불법", "불빛", "불안", "불이익", "불행", "브랜드", "비극", "비난", "비닐", "비둘기", "비디오", "비로소", "비만", "비명", "비밀", "비바람", "비빔밥", "비상", "비용", "비율", "비중", "비á„ᅡ민", "비판", "빌딩", "빗물", "빗방울", "빗줄기", "빛á„ᅡᆯ", "빨간색", "빨래", "빨리", "사건", "사계절", "사나이", "사냥", "사람", "사랑", "사립", "사모님", "사물", "사방", "사상", "사생활", "사설", "사슴", "사실", "사업", "사용", "사월", "사장", "사전", "사진", "사촌", "사춘기", "사á„ᅡᆼ", "사á„ᅮ리", "사흘", "산길", "산부인과", "산업", "산책", "살림", "살인", "살á„ᅡᆨ", "삼계á„ᅡᆼ", "삼국", "삼십", "삼월", "삼촌", "상관", "상금", "상대", "상류", "상반기", "상상", "상식", "상업", "상인", "상자", "상점", "상처", "상추", "상á„á…¢", "상표", "상품", "상황", "새벽", "색á„ᅡᆯ", "색연필", "생각", "생명", "생물", "생방송", "생산", "생선", "생신", "생일", "생활", "서랍", "서른", "서명", "서민", "서비스", "서양", "서울", "서적", "서점", "서á„ᅩᆨ", "서á„ᅳᆯ", "석사", "석유", "선거", "선물", "선배", "선생", "선수", "선원", "선장", "선전", "선á„ᅢᆨ", "선풍기", "설거지", "설날", "설렁á„ᅡᆼ", "설명", "설문", "설사", "설악산", "설치", "설á„ᅡᆼ", "섭씨", "성공", "성당", "성명", "성별", "성인", "성장", "성적", "성질", "성함", "세금", "세미나", "세상", "세월", "세종대왕", "세á„ᅡᆨ", "센á„á…¥", "센á„ᅵ미á„á…¥", "셋á„á…¢", "소규모", "소극적", "소금", "소나기", "소년", "소득", "소망", "소문", "소설", "소속", "소아과", "소용", "소원", "소음", "소중히", "소지품", "소질", "소풍", "소형", "속담", "속도", "속옷", "손가락", "손길", "손녀", "손님", "손등", "손목", "손뼉", "손실", "손질", "손á„ᅩᆸ", "손해", "솔직히", "솜씨", "송아지", "송이", "송편", "쇠고기", "쇼핑", "수건", "수년", "수단", "수돗물", "수동적", "수면", "수명", "수박", "수상", "수석", "수술", "수시로", "수업", "수염", "수영", "수입", "수준", "수집", "수출", "수á„ᅥᆺ", "수필", "수학", "수험생", "수화기", "숙녀", "숙소", "숙제", "순간", "순서", "순수", "순식간", "순위", "숟가락", "술병", "술집", "숫자", "스님", "스물", "스스로", "스승", "스웨á„á…¥", "스위치", "스á„ᅦ이á„á…³", "스á„ᅲ디오", "스á„ᅳ레스", "스포츠", "슬á„ᅥᆨ", "슬픔", "습관", "습기", "승객", "승리", "승부", "승용차", "승진", "시각", "시간", "시골", "시금치", "시나리오", "시댁", "시리즈", "시멘á„á…³", "시민", "시부모", "시선", "시설", "시스á„ᅦᆷ", "시아버지", "시어머니", "시월", "시인", "시일", "시작", "시장", "시절", "시점", "시중", "시즌", "시집", "시청", "시합", "시험", "식구", "식기", "식당", "식량", "식료품", "식물", "식빵", "식사", "식생활", "식초", "식á„ᅡᆨ", "식품", "신고", "신규", "신념", "신문", "신발", "신비", "신사", "신세", "신용", "신제품", "신청", "신체", "신화", "실감", "실내", "실력", "실례", "실망", "실수", "실습", "실시", "실장", "실정", "실질적", "실천", "실체", "실á„ᅥᆺ", "실á„á…¢", "실패", "실험", "실현", "심리", "심부름", "심사", "심장", "심정", "심판", "쌍둥이", "씨름", "씨앗", "아가씨", "아나운서", "아드님", "아들", "아쉬움", "아스팔á„á…³", "아시아", "아울러", "아저씨", "아줌마", "아직", "아침", "á„‹á…¡á„‘á…¡á„á…³", "아프리á„á…¡", "아픔", "아홉", "아흔", "악기", "악몽", "악수", "안개", "안경", "안과", "안내", "안녕", "안동", "안방", "안부", "안주", "알루미늄", "알á„ᅩ올", "암시", "암á„ᅥᆺ", "압력", "á„‹á…¡á‡á„‚ᅡᆯ", "á„‹á…¡á‡á„†á…®á†«", "애인", "애정", "액수", "앨범", "야간", "야단", "야옹", "약간", "약국", "약속", "약수", "약점", "약품", "약혼녀", "양념", "양력", "양말", "양배추", "양주", "양파", "어둠", "어려움", "어른", "어젯밤", "á„‹á…¥á„ᅢᆻ든", "á„‹á…¥á„ᅥ다가", "á„‹á…¥á„ᅥᆫ지", "언니", "언덕", "언론", "언어", "얼굴", "얼른", "얼음", "얼핏", "엄마", "업무", "업종", "업체", "엉덩이", "엉망", "엉á„ᅥ리", "엊그제", "에너지", "에어á„ᅥᆫ", "엔진", "여건", "여고생", "여관", "여군", "여권", "여대생", "여덟", "여동생", "여든", "여론", "여름", "여섯", "여성", "여왕", "여인", "여전히", "여직원", "여학생", "여행", "역사", "역시", "역할", "연결", "연구", "연극", "연기", "연락", "연설", "연세", "연속", "연습", "연애", "연예인", "연인", "연장", "연주", "연출", "연필", "연합", "연휴", "열기", "열매", "열쇠", "열심히", "열정", "열차", "열흘", "염려", "엽서", "영국", "영남", "영상", "영양", "영역", "영웅", "영원히", "영하", "영향", "영혼", "영화", "á„‹á…§á‡á„€á…®á„…á…µ", "á„‹á…§á‡á„‡á…¡á†¼", "á„‹á…§á‡á„Œá…µá†¸", "예감", "예금", "예방", "예산", "예상", "예선", "예술", "예습", "예식장", "예약", "예전", "예절", "예정", "á„‹á…¨á„ᅥᆫ대", "옛날", "오늘", "오락", "오랫동안", "오렌지", "오로지", "오른발", "오븐", "오십", "오염", "오월", "오전", "오직", "오징어", "오페라", "오피스á„ᅦᆯ", "오히려", "옥상", "옥수수", "온갖", "온라인", "온몸", "온종일", "온á„ᅩᆼ", "올가을", "올림픽", "올해", "옷차림", "와이셔츠", "와인", "완성", "완전", "왕비", "왕자", "왜냐하면", "왠지", "외갓집", "외국", "외로움", "외삼촌", "외출", "외침", "외할머니", "왼발", "왼손", "왼á„ᅩᆨ", "요금", "요일", "요즘", "요청", "용기", "용서", "용어", "우산", "우선", "우승", "우연히", "우정", "우체국", "우편", "운동", "운명", "운반", "운전", "운행", "울산", "울음", "움직임", "웃어른", "웃음", "워낙", "원고", "원래", "원서", "원숭이", "원인", "원장", "원피스", "월급", "월드á„ᅥᆸ", "월세", "월요일", "á„‹á…°á„‹á…µá„á…¥", "위반", "위법", "위성", "위원", "위험", "위협", "윗사람", "유난히", "유럽", "유명", "유물", "유산", "유적", "유치원", "유학", "유행", "유형", "육군", "육상", "육십", "육체", "은행", "음력", "음료", "음반", "음성", "음식", "음악", "음주", "의견", "의논", "의문", "의복", "의식", "의심", "의외로", "의욕", "의원", "의학", "이것", "이곳", "이념", "이놈", "이달", "이대로", "이동", "이렇게", "이력서", "이론적", "이름", "이민", "이발소", "이별", "이불", "이빨", "이상", "이성", "이슬", "이야기", "이용", "이웃", "이월", "이윽고", "이익", "이전", "이중", "á„‹á…µá„ᅳᆮ날", "á„‹á…µá„ᅳᆯ", "이혼", "인간", "인격", "인공", "인구", "인근", "인기", "인도", "인류", "인물", "인생", "인쇄", "인연", "인원", "인재", "인종", "인천", "인체", "인á„ᅥ넷", "인하", "인형", "일곱", "일기", "일단", "일대", "일등", "일반", "일본", "일부", "일상", "일생", "일손", "일요일", "일월", "일정", "일종", "일주일", "일á„ᅵᆨ", "일체", "일치", "일행", "일회용", "임금", "임무", "입대", "입력", "입맛", "입사", "입술", "입시", "입원", "입장", "입학", "자가용", "자격", "자극", "자동", "자랑", "자부심", "자식", "자신", "자연", "자원", "자율", "자전거", "자정", "자존심", "자판", "작가", "작년", "작성", "작업", "작용", "작은딸", "작품", "잔디", "잔뜩", "잔치", "잘못", "잠á„ᅡᆫ", "잠수함", "잠시", "잠옷", "잠자리", "잡지", "장관", "장군", "장기간", "장래", "장례", "장르", "장마", "장면", "장모", "장미", "장비", "장사", "장소", "장식", "장애인", "장인", "장점", "장차", "장학금", "재능", "재빨리", "재산", "재생", "재작년", "재정", "재채기", "재판", "재학", "재활용", "저것", "저고리", "저곳", "저녁", "저런", "저렇게", "저번", "저울", "저절로", "저축", "적극", "적당히", "적성", "적용", "적응", "전개", "전공", "전기", "전달", "전라도", "전망", "전문", "전반", "전부", "전세", "전시", "전용", "전자", "전쟁", "전주", "전철", "전체", "전á„ᅩᆼ", "전혀", "전후", "절대", "절망", "절반", "절약", "절차", "점검", "점수", "점심", "점원", "점점", "점차", "접근", "접시", "접촉", "젓가락", "정거장", "정도", "정류장", "정리", "정말", "정면", "정문", "정반대", "정보", "정부", "정비", "정상", "정성", "정오", "정원", "정장", "정지", "정치", "정확히", "제공", "제과점", "제대로", "제목", "제발", "제법", "제삿날", "제안", "제일", "제작", "제주도", "제출", "제품", "제한", "조각", "조건", "조금", "조깅", "조명", "조미료", "조상", "조선", "조용히", "조절", "조정", "조직", "존댓말", "존재", "졸업", "졸음", "종교", "종로", "종류", "종소리", "종업원", "종종", "종합", "좌석", "죄인", "주관적", "주름", "주말", "주머니", "주먹", "주문", "주민", "주방", "주변", "주식", "주인", "주일", "주장", "주전자", "주á„ᅢᆨ", "준비", "줄거리", "줄기", "줄무늬", "중간", "중계방송", "중국", "중년", "중단", "중독", "중반", "중부", "중세", "중소기업", "중순", "중앙", "중요", "중학교", "즉석", "즉시", "즐거움", "증가", "증거", "증권", "증상", "증세", "지각", "지갑", "지경", "지극히", "지금", "지급", "지능", "지름길", "지리산", "지방", "지붕", "지식", "지역", "지우개", "지원", "지적", "지점", "지진", "지출", "직선", "직업", "직원", "직장", "진급", "진동", "진로", "진료", "진리", "진á„á…¡", "진찰", "진출", "진á„ᅩᆼ", "진행", "질문", "질병", "질서", "짐작", "집단", "집안", "집중", "á„ᅡ증", "á„á…µá„ᅥ기", "차남", "á„Žá…¡á„…á…¡á„…á…µ", "차량", "차림", "차별", "차선", "차츰", "착각", "찬물", "찬성", "참가", "참기름", "참새", "참석", "참여", "참외", "참조", "찻잔", "창가", "창고", "창구", "창문", "창밖", "창작", "창조", "채널", "채점", "책가방", "책방", "책상", "책임", "챔피언", "처벌", "처음", "천국", "천둥", "천장", "천재", "천천히", "철도", "철저히", "철학", "첫날", "첫á„á…¢", "청년", "청바지", "청소", "청춘", "체계", "체력", "체온", "체육", "체중", "체험", "초등학생", "초반", "초밥", "초상화", "초순", "초여름", "초원", "초저녁", "초점", "초청", "á„Žá…©á„ᅩᆯ릿", "촛불", "총각", "총리", "총장", "촬영", "최근", "최상", "최선", "최신", "최악", "최종", "추석", "추억", "추진", "추천", "추측", "축구", "축소", "축제", "축하", "출근", "출발", "출산", "출신", "출연", "출입", "출장", "출판", "충격", "충고", "충돌", "충분히", "충청도", "취업", "취직", "취향", "치약", "친구", "친척", "칠십", "칠월", "칠판", "침대", "침묵", "침실", "칫솔", "칭찬", "á„ᅡ메라", "á„ᅡ운á„á…¥", "á„ᅡᆯ국수", "á„ᅢ릭á„á…¥", "á„ᅢᆷ퍼스", "á„ᅢᆷ페인", "á„á…¥á„ᅳᆫ", "á„ᅥᆫ디션", "á„ᅥᆯ러", "á„ᅥᆷ퓨á„á…¥", "á„á…©á„ᅵ리", "á„ᅩ미디", "á„ᅩᆫ서á„á…³", "á„ᅩᆯ라", "á„ᅩᆷ플렉스", "á„ᅩᆼ나물", "á„ᅫ감", "á„ᅮ데á„á…¡", "á„ᅳ림", "á„ᅳᆫ길", "á„ᅳᆫ딸", "á„ᅳᆫ소리", "á„ᅳᆫ아들", "á„ᅳᆫ어머니", "á„ᅳᆫ일", "á„ᅳᆫ절", "á„ᅳᆯ래식", "á„ᅳᆯ럽", "á„ᅵᆯ로", "á„ᅡ입", "á„ᅡ자기", "á„ᅡᆨ구", "á„ᅡᆨ자", "á„ᅡᆫ생", "á„ᅢ권도", "á„ᅢ양", "á„ᅢ풍", "á„ᅢᆨ시", "á„ᅢᆯ런á„á…³", "á„ᅥ널", "á„ᅥ미널", "á„ᅦ니스", "á„ᅦ스á„á…³", "á„ᅦ이블", "á„ᅦᆯ레비전", "á„ᅩ론", "á„ᅩ마á„á…©", "á„ᅩ요일", "á„ᅩᆼ계", "á„ᅩᆼ과", "á„ᅩᆼ로", "á„ᅩᆼ신", "á„ᅩᆼ역", "á„ᅩᆼ일", "á„ᅩᆼ장", "á„ᅩᆼ제", "á„ᅩᆼ증", "á„ᅩᆼ합", "á„ᅩᆼ화", "á„ᅬ근", "á„ᅬ원", "á„ᅬ직금", "á„ᅱ김", "á„ᅳ럭", "á„ᅳᆨ급", "á„ᅳᆨ별", "á„ᅳᆨ성", "á„ᅳᆨ수", "á„ᅳᆨ징", "á„ᅳᆨ히", "á„ᅳᆫá„ᅳᆫ히", "á„ᅵ셔츠", "파란색", "파일", "파출소", "판결", "판단", "판매", "판사", "팔십", "팔월", "팝송", "패션", "팩스", "팩시밀리", "팬á„á…µ", "퍼센á„á…³", "페인á„á…³", "편견", "편의", "편지", "편히", "평가", "평균", "평생", "평소", "평양", "평일", "평화", "포스á„á…¥", "포인á„á…³", "포장", "포함", "표면", "표정", "표준", "표현", "품목", "품질", "풍경", "풍속", "풍습", "프랑스", "프린á„á…¥", "플라스á„ᅵᆨ", "피곤", "피망", "피아노", "필름", "필수", "필요", "필자", "필á„ᅩᆼ", "핑계", "하느님", "하늘", "하드웨어", "하룻밤", "하반기", "하숙집", "하순", "á„’á…¡á„‹á…§á„ᅳᆫ", "하지만", "하천", "하품", "하필", "학과", "학교", "학급", "학기", "학년", "학력", "학번", "학부모", "학비", "학생", "학술", "학습", "학용품", "학원", "학위", "학자", "학점", "한계", "한글", "한á„ᅥ번에", "한낮", "한눈", "한동안", "한때", "한라산", "한마디", "한문", "한번", "한복", "한식", "한여름", "한á„ᅩᆨ", "할머니", "할아버지", "할인", "함á„á…¦", "함부로", "합격", "합리적", "항공", "항구", "항상", "항의", "해결", "해군", "해답", "해당", "해물", "해석", "해설", "해수욕장", "해안", "핵심", "핸드백", "햄버거", "햇볕", "햇살", "행동", "행복", "행사", "행운", "행위", "향기", "향상", "향수", "허락", "허용", "헬기", "현관", "현금", "현대", "현상", "현실", "현장", "현재", "현지", "혈액", "협력", "형부", "형사", "형수", "형식", "형제", "형á„á…¢", "형편", "á„’á…¨á„ᅢᆨ", "호기심", "호남", "호랑이", "호박", "á„’á…©á„ᅦᆯ", "호흡", "혹시", "홀로", "홈페이지", "홍보", "홍수", "홍차", "화면", "화분", "화살", "화요일", "화장", "화학", "확보", "확인", "확장", "확정", "환갑", "환경", "환영", "환율", "환자", "활기", "활동", "활발히", "활용", "활á„ᅡᆨ", "회견", "회관", "회복", "회색", "회원", "회장", "회전", "횟수", "횡단보도", "효율적", "후반", "후춧가루", "훈련", "훨씬", "휴식", "휴일", "흉내", "흐름", "흑백", "흑인", "흔적", "흔히", "흥미", "흥분", "희곡", "희망", "희생", "흰색", "힘á„ᅥᆺ") diff --git a/src/main/kotlin/com/radixdlt/bip39/wordlists/Spanish.kt b/src/main/kotlin/com/radixdlt/bip39/wordlists/Spanish.kt new file mode 100644 index 0000000..4b4af67 --- /dev/null +++ b/src/main/kotlin/com/radixdlt/bip39/wordlists/Spanish.kt @@ -0,0 +1,3 @@ +package com.radixdlt.bip39.wordlists + +val WORDLIST_SPANISH = listOf("aÌbaco", "abdomen", "abeja", "abierto", "abogado", "abono", "aborto", "abrazo", "abrir", "abuelo", "abuso", "acabar", "academia", "acceso", "accioÌn", "aceite", "acelga", "acento", "aceptar", "aÌcido", "aclarar", "acneÌ", "acoger", "acoso", "activo", "acto", "actriz", "actuar", "acudir", "acuerdo", "acusar", "adicto", "admitir", "adoptar", "adorno", "aduana", "adulto", "aeÌreo", "afectar", "aficioÌn", "afinar", "afirmar", "aÌgil", "agitar", "agoniÌa", "agosto", "agotar", "agregar", "agrio", "agua", "agudo", "aÌguila", "aguja", "ahogo", "ahorro", "aire", "aislar", "ajedrez", "ajeno", "ajuste", "alacraÌn", "alambre", "alarma", "alba", "aÌlbum", "alcalde", "aldea", "alegre", "alejar", "alerta", "aleta", "alfiler", "alga", "algodoÌn", "aliado", "aliento", "alivio", "alma", "almeja", "almiÌbar", "altar", "alteza", "altivo", "alto", "altura", "alumno", "alzar", "amable", "amante", "amapola", "amargo", "amasar", "aÌmbar", "aÌmbito", "ameno", "amigo", "amistad", "amor", "amparo", "amplio", "ancho", "anciano", "ancla", "andar", "andeÌn", "anemia", "aÌngulo", "anillo", "aÌnimo", "aniÌs", "anotar", "antena", "antiguo", "antojo", "anual", "anular", "anuncio", "añadir", "añejo", "año", "apagar", "aparato", "apetito", "apio", "aplicar", "apodo", "aporte", "apoyo", "aprender", "aprobar", "apuesta", "apuro", "arado", "araña", "arar", "aÌrbitro", "aÌrbol", "arbusto", "archivo", "arco", "arder", "ardilla", "arduo", "aÌrea", "aÌrido", "aries", "armoniÌa", "arneÌs", "aroma", "arpa", "arpoÌn", "arreglo", "arroz", "arruga", "arte", "artista", "asa", "asado", "asalto", "ascenso", "asegurar", "aseo", "asesor", "asiento", "asilo", "asistir", "asno", "asombro", "aÌspero", "astilla", "astro", "astuto", "asumir", "asunto", "atajo", "ataque", "atar", "atento", "ateo", "aÌtico", "atleta", "aÌtomo", "atraer", "atroz", "atuÌn", "audaz", "audio", "auge", "aula", "aumento", "ausente", "autor", "aval", "avance", "avaro", "ave", "avellana", "avena", "avestruz", "avioÌn", "aviso", "ayer", "ayuda", "ayuno", "azafraÌn", "azar", "azote", "azuÌcar", "azufre", "azul", "baba", "babor", "bache", "bahiÌa", "baile", "bajar", "balanza", "balcoÌn", "balde", "bambuÌ", "banco", "banda", "baño", "barba", "barco", "barniz", "barro", "baÌscula", "bastoÌn", "basura", "batalla", "bateriÌa", "batir", "batuta", "bauÌl", "bazar", "bebeÌ", "bebida", "bello", "besar", "beso", "bestia", "bicho", "bien", "bingo", "blanco", "bloque", "blusa", "boa", "bobina", "bobo", "boca", "bocina", "boda", "bodega", "boina", "bola", "bolero", "bolsa", "bomba", "bondad", "bonito", "bono", "bonsaÌi", "borde", "borrar", "bosque", "bote", "botiÌn", "boÌveda", "bozal", "bravo", "brazo", "brecha", "breve", "brillo", "brinco", "brisa", "broca", "broma", "bronce", "brote", "bruja", "brusco", "bruto", "buceo", "bucle", "bueno", "buey", "bufanda", "bufoÌn", "buÌho", "buitre", "bulto", "burbuja", "burla", "burro", "buscar", "butaca", "buzoÌn", "caballo", "cabeza", "cabina", "cabra", "cacao", "cadaÌver", "cadena", "caer", "cafeÌ", "caiÌda", "caimaÌn", "caja", "cajoÌn", "cal", "calamar", "calcio", "caldo", "calidad", "calle", "calma", "calor", "calvo", "cama", "cambio", "camello", "camino", "campo", "caÌncer", "candil", "canela", "canguro", "canica", "canto", "caña", "cañoÌn", "caoba", "caos", "capaz", "capitaÌn", "capote", "captar", "capucha", "cara", "carboÌn", "caÌrcel", "careta", "carga", "cariño", "carne", "carpeta", "carro", "carta", "casa", "casco", "casero", "caspa", "castor", "catorce", "catre", "caudal", "causa", "cazo", "cebolla", "ceder", "cedro", "celda", "ceÌlebre", "celoso", "ceÌlula", "cemento", "ceniza", "centro", "cerca", "cerdo", "cereza", "cero", "cerrar", "certeza", "ceÌsped", "cetro", "chacal", "chaleco", "champuÌ", "chancla", "chapa", "charla", "chico", "chiste", "chivo", "choque", "choza", "chuleta", "chupar", "cicloÌn", "ciego", "cielo", "cien", "cierto", "cifra", "cigarro", "cima", "cinco", "cine", "cinta", "cipreÌs", "circo", "ciruela", "cisne", "cita", "ciudad", "clamor", "clan", "claro", "clase", "clave", "cliente", "clima", "cliÌnica", "cobre", "coccioÌn", "cochino", "cocina", "coco", "coÌdigo", "codo", "cofre", "coger", "cohete", "cojiÌn", "cojo", "cola", "colcha", "colegio", "colgar", "colina", "collar", "colmo", "columna", "combate", "comer", "comida", "coÌmodo", "compra", "conde", "conejo", "conga", "conocer", "consejo", "contar", "copa", "copia", "corazoÌn", "corbata", "corcho", "cordoÌn", "corona", "correr", "coser", "cosmos", "costa", "craÌneo", "craÌter", "crear", "crecer", "creiÌdo", "crema", "criÌa", "crimen", "cripta", "crisis", "cromo", "croÌnica", "croqueta", "crudo", "cruz", "cuadro", "cuarto", "cuatro", "cubo", "cubrir", "cuchara", "cuello", "cuento", "cuerda", "cuesta", "cueva", "cuidar", "culebra", "culpa", "culto", "cumbre", "cumplir", "cuna", "cuneta", "cuota", "cupoÌn", "cuÌpula", "curar", "curioso", "curso", "curva", "cutis", "dama", "danza", "dar", "dardo", "daÌtil", "deber", "deÌbil", "deÌcada", "decir", "dedo", "defensa", "definir", "dejar", "delfiÌn", "delgado", "delito", "demora", "denso", "dental", "deporte", "derecho", "derrota", "desayuno", "deseo", "desfile", "desnudo", "destino", "desviÌo", "detalle", "detener", "deuda", "diÌa", "diablo", "diadema", "diamante", "diana", "diario", "dibujo", "dictar", "diente", "dieta", "diez", "difiÌcil", "digno", "dilema", "diluir", "dinero", "directo", "dirigir", "disco", "diseño", "disfraz", "diva", "divino", "doble", "doce", "dolor", "domingo", "don", "donar", "dorado", "dormir", "dorso", "dos", "dosis", "dragoÌn", "droga", "ducha", "duda", "duelo", "dueño", "dulce", "duÌo", "duque", "durar", "dureza", "duro", "eÌbano", "ebrio", "echar", "eco", "ecuador", "edad", "edicioÌn", "edificio", "editor", "educar", "efecto", "eficaz", "eje", "ejemplo", "elefante", "elegir", "elemento", "elevar", "elipse", "eÌlite", "elixir", "elogio", "eludir", "embudo", "emitir", "emocioÌn", "empate", "empeño", "empleo", "empresa", "enano", "encargo", "enchufe", "enciÌa", "enemigo", "enero", "enfado", "enfermo", "engaño", "enigma", "enlace", "enorme", "enredo", "ensayo", "enseñar", "entero", "entrar", "envase", "enviÌo", "eÌpoca", "equipo", "erizo", "escala", "escena", "escolar", "escribir", "escudo", "esencia", "esfera", "esfuerzo", "espada", "espejo", "espiÌa", "esposa", "espuma", "esquiÌ", "estar", "este", "estilo", "estufa", "etapa", "eterno", "eÌtica", "etnia", "evadir", "evaluar", "evento", "evitar", "exacto", "examen", "exceso", "excusa", "exento", "exigir", "exilio", "existir", "eÌxito", "experto", "explicar", "exponer", "extremo", "faÌbrica", "faÌbula", "fachada", "faÌcil", "factor", "faena", "faja", "falda", "fallo", "falso", "faltar", "fama", "familia", "famoso", "faraoÌn", "farmacia", "farol", "farsa", "fase", "fatiga", "fauna", "favor", "fax", "febrero", "fecha", "feliz", "feo", "feria", "feroz", "feÌrtil", "fervor", "festiÌn", "fiable", "fianza", "fiar", "fibra", "ficcioÌn", "ficha", "fideo", "fiebre", "fiel", "fiera", "fiesta", "figura", "fijar", "fijo", "fila", "filete", "filial", "filtro", "fin", "finca", "fingir", "finito", "firma", "flaco", "flauta", "flecha", "flor", "flota", "fluir", "flujo", "fluÌor", "fobia", "foca", "fogata", "fogoÌn", "folio", "folleto", "fondo", "forma", "forro", "fortuna", "forzar", "fosa", "foto", "fracaso", "fraÌgil", "franja", "frase", "fraude", "freiÌr", "freno", "fresa", "friÌo", "frito", "fruta", "fuego", "fuente", "fuerza", "fuga", "fumar", "funcioÌn", "funda", "furgoÌn", "furia", "fusil", "fuÌtbol", "futuro", "gacela", "gafas", "gaita", "gajo", "gala", "galeriÌa", "gallo", "gamba", "ganar", "gancho", "ganga", "ganso", "garaje", "garza", "gasolina", "gastar", "gato", "gavilaÌn", "gemelo", "gemir", "gen", "geÌnero", "genio", "gente", "geranio", "gerente", "germen", "gesto", "gigante", "gimnasio", "girar", "giro", "glaciar", "globo", "gloria", "gol", "golfo", "goloso", "golpe", "goma", "gordo", "gorila", "gorra", "gota", "goteo", "gozar", "grada", "graÌfico", "grano", "grasa", "gratis", "grave", "grieta", "grillo", "gripe", "gris", "grito", "grosor", "gruÌa", "grueso", "grumo", "grupo", "guante", "guapo", "guardia", "guerra", "guiÌa", "guiño", "guion", "guiso", "guitarra", "gusano", "gustar", "haber", "haÌbil", "hablar", "hacer", "hacha", "hada", "hallar", "hamaca", "harina", "haz", "hazaña", "hebilla", "hebra", "hecho", "helado", "helio", "hembra", "herir", "hermano", "heÌroe", "hervir", "hielo", "hierro", "hiÌgado", "higiene", "hijo", "himno", "historia", "hocico", "hogar", "hoguera", "hoja", "hombre", "hongo", "honor", "honra", "hora", "hormiga", "horno", "hostil", "hoyo", "hueco", "huelga", "huerta", "hueso", "huevo", "huida", "huir", "humano", "huÌmedo", "humilde", "humo", "hundir", "huracaÌn", "hurto", "icono", "ideal", "idioma", "iÌdolo", "iglesia", "igluÌ", "igual", "ilegal", "ilusioÌn", "imagen", "imaÌn", "imitar", "impar", "imperio", "imponer", "impulso", "incapaz", "iÌndice", "inerte", "infiel", "informe", "ingenio", "inicio", "inmenso", "inmune", "innato", "insecto", "instante", "intereÌs", "iÌntimo", "intuir", "inuÌtil", "invierno", "ira", "iris", "ironiÌa", "isla", "islote", "jabaliÌ", "jaboÌn", "jamoÌn", "jarabe", "jardiÌn", "jarra", "jaula", "jazmiÌn", "jefe", "jeringa", "jinete", "jornada", "joroba", "joven", "joya", "juerga", "jueves", "juez", "jugador", "jugo", "juguete", "juicio", "junco", "jungla", "junio", "juntar", "juÌpiter", "jurar", "justo", "juvenil", "juzgar", "kilo", "koala", "labio", "lacio", "lacra", "lado", "ladroÌn", "lagarto", "laÌgrima", "laguna", "laico", "lamer", "laÌmina", "laÌmpara", "lana", "lancha", "langosta", "lanza", "laÌpiz", "largo", "larva", "laÌstima", "lata", "laÌtex", "latir", "laurel", "lavar", "lazo", "leal", "leccioÌn", "leche", "lector", "leer", "legioÌn", "legumbre", "lejano", "lengua", "lento", "leña", "leoÌn", "leopardo", "lesioÌn", "letal", "letra", "leve", "leyenda", "libertad", "libro", "licor", "liÌder", "lidiar", "lienzo", "liga", "ligero", "lima", "liÌmite", "limoÌn", "limpio", "lince", "lindo", "liÌnea", "lingote", "lino", "linterna", "liÌquido", "liso", "lista", "litera", "litio", "litro", "llaga", "llama", "llanto", "llave", "llegar", "llenar", "llevar", "llorar", "llover", "lluvia", "lobo", "locioÌn", "loco", "locura", "loÌgica", "logro", "lombriz", "lomo", "lonja", "lote", "lucha", "lucir", "lugar", "lujo", "luna", "lunes", "lupa", "lustro", "luto", "luz", "maceta", "macho", "madera", "madre", "maduro", "maestro", "mafia", "magia", "mago", "maiÌz", "maldad", "maleta", "malla", "malo", "mamaÌ", "mambo", "mamut", "manco", "mando", "manejar", "manga", "maniquiÌ", "manjar", "mano", "manso", "manta", "mañana", "mapa", "maÌquina", "mar", "marco", "marea", "marfil", "margen", "marido", "maÌrmol", "marroÌn", "martes", "marzo", "masa", "maÌscara", "masivo", "matar", "materia", "matiz", "matriz", "maÌximo", "mayor", "mazorca", "mecha", "medalla", "medio", "meÌdula", "mejilla", "mejor", "melena", "meloÌn", "memoria", "menor", "mensaje", "mente", "menuÌ", "mercado", "merengue", "meÌrito", "mes", "mesoÌn", "meta", "meter", "meÌtodo", "metro", "mezcla", "miedo", "miel", "miembro", "miga", "mil", "milagro", "militar", "milloÌn", "mimo", "mina", "minero", "miÌnimo", "minuto", "miope", "mirar", "misa", "miseria", "misil", "mismo", "mitad", "mito", "mochila", "mocioÌn", "moda", "modelo", "moho", "mojar", "molde", "moler", "molino", "momento", "momia", "monarca", "moneda", "monja", "monto", "moño", "morada", "morder", "moreno", "morir", "morro", "morsa", "mortal", "mosca", "mostrar", "motivo", "mover", "moÌvil", "mozo", "mucho", "mudar", "mueble", "muela", "muerte", "muestra", "mugre", "mujer", "mula", "muleta", "multa", "mundo", "muñeca", "mural", "muro", "muÌsculo", "museo", "musgo", "muÌsica", "muslo", "naÌcar", "nacioÌn", "nadar", "naipe", "naranja", "nariz", "narrar", "nasal", "natal", "nativo", "natural", "naÌusea", "naval", "nave", "navidad", "necio", "neÌctar", "negar", "negocio", "negro", "neoÌn", "nervio", "neto", "neutro", "nevar", "nevera", "nicho", "nido", "niebla", "nieto", "niñez", "niño", "niÌtido", "nivel", "nobleza", "noche", "noÌmina", "noria", "norma", "norte", "nota", "noticia", "novato", "novela", "novio", "nube", "nuca", "nuÌcleo", "nudillo", "nudo", "nuera", "nueve", "nuez", "nulo", "nuÌmero", "nutria", "oasis", "obeso", "obispo", "objeto", "obra", "obrero", "observar", "obtener", "obvio", "oca", "ocaso", "oceÌano", "ochenta", "ocho", "ocio", "ocre", "octavo", "octubre", "oculto", "ocupar", "ocurrir", "odiar", "odio", "odisea", "oeste", "ofensa", "oferta", "oficio", "ofrecer", "ogro", "oiÌdo", "oiÌr", "ojo", "ola", "oleada", "olfato", "olivo", "olla", "olmo", "olor", "olvido", "ombligo", "onda", "onza", "opaco", "opcioÌn", "oÌpera", "opinar", "oponer", "optar", "oÌptica", "opuesto", "oracioÌn", "orador", "oral", "oÌrbita", "orca", "orden", "oreja", "oÌrgano", "orgiÌa", "orgullo", "oriente", "origen", "orilla", "oro", "orquesta", "oruga", "osadiÌa", "oscuro", "osezno", "oso", "ostra", "otoño", "otro", "oveja", "oÌvulo", "oÌxido", "oxiÌgeno", "oyente", "ozono", "pacto", "padre", "paella", "paÌgina", "pago", "paiÌs", "paÌjaro", "palabra", "palco", "paleta", "paÌlido", "palma", "paloma", "palpar", "pan", "panal", "paÌnico", "pantera", "pañuelo", "papaÌ", "papel", "papilla", "paquete", "parar", "parcela", "pared", "parir", "paro", "paÌrpado", "parque", "paÌrrafo", "parte", "pasar", "paseo", "pasioÌn", "paso", "pasta", "pata", "patio", "patria", "pausa", "pauta", "pavo", "payaso", "peatoÌn", "pecado", "pecera", "pecho", "pedal", "pedir", "pegar", "peine", "pelar", "peldaño", "pelea", "peligro", "pellejo", "pelo", "peluca", "pena", "pensar", "peñoÌn", "peoÌn", "peor", "pepino", "pequeño", "pera", "percha", "perder", "pereza", "perfil", "perico", "perla", "permiso", "perro", "persona", "pesa", "pesca", "peÌsimo", "pestaña", "peÌtalo", "petroÌleo", "pez", "pezuña", "picar", "pichoÌn", "pie", "piedra", "pierna", "pieza", "pijama", "pilar", "piloto", "pimienta", "pino", "pintor", "pinza", "piña", "piojo", "pipa", "pirata", "pisar", "piscina", "piso", "pista", "pitoÌn", "pizca", "placa", "plan", "plata", "playa", "plaza", "pleito", "pleno", "plomo", "pluma", "plural", "pobre", "poco", "poder", "podio", "poema", "poesiÌa", "poeta", "polen", "policiÌa", "pollo", "polvo", "pomada", "pomelo", "pomo", "pompa", "poner", "porcioÌn", "portal", "posada", "poseer", "posible", "poste", "potencia", "potro", "pozo", "prado", "precoz", "pregunta", "premio", "prensa", "preso", "previo", "primo", "priÌncipe", "prisioÌn", "privar", "proa", "probar", "proceso", "producto", "proeza", "profesor", "programa", "prole", "promesa", "pronto", "propio", "proÌximo", "prueba", "puÌblico", "puchero", "pudor", "pueblo", "puerta", "puesto", "pulga", "pulir", "pulmoÌn", "pulpo", "pulso", "puma", "punto", "puñal", "puño", "pupa", "pupila", "pureÌ", "quedar", "queja", "quemar", "querer", "queso", "quieto", "quiÌmica", "quince", "quitar", "raÌbano", "rabia", "rabo", "racioÌn", "radical", "raiÌz", "rama", "rampa", "rancho", "rango", "rapaz", "raÌpido", "rapto", "rasgo", "raspa", "rato", "rayo", "raza", "razoÌn", "reaccioÌn", "realidad", "rebaño", "rebote", "recaer", "receta", "rechazo", "recoger", "recreo", "recto", "recurso", "red", "redondo", "reducir", "reflejo", "reforma", "refraÌn", "refugio", "regalo", "regir", "regla", "regreso", "reheÌn", "reino", "reiÌr", "reja", "relato", "relevo", "relieve", "relleno", "reloj", "remar", "remedio", "remo", "rencor", "rendir", "renta", "reparto", "repetir", "reposo", "reptil", "res", "rescate", "resina", "respeto", "resto", "resumen", "retiro", "retorno", "retrato", "reunir", "reveÌs", "revista", "rey", "rezar", "rico", "riego", "rienda", "riesgo", "rifa", "riÌgido", "rigor", "rincoÌn", "riñoÌn", "riÌo", "riqueza", "risa", "ritmo", "rito", "rizo", "roble", "roce", "rociar", "rodar", "rodeo", "rodilla", "roer", "rojizo", "rojo", "romero", "romper", "ron", "ronco", "ronda", "ropa", "ropero", "rosa", "rosca", "rostro", "rotar", "rubiÌ", "rubor", "rudo", "rueda", "rugir", "ruido", "ruina", "ruleta", "rulo", "rumbo", "rumor", "ruptura", "ruta", "rutina", "saÌbado", "saber", "sabio", "sable", "sacar", "sagaz", "sagrado", "sala", "saldo", "salero", "salir", "salmoÌn", "saloÌn", "salsa", "salto", "salud", "salvar", "samba", "sancioÌn", "sandiÌa", "sanear", "sangre", "sanidad", "sano", "santo", "sapo", "saque", "sardina", "sarteÌn", "sastre", "sataÌn", "sauna", "saxofoÌn", "seccioÌn", "seco", "secreto", "secta", "sed", "seguir", "seis", "sello", "selva", "semana", "semilla", "senda", "sensor", "señal", "señor", "separar", "sepia", "sequiÌa", "ser", "serie", "sermoÌn", "servir", "sesenta", "sesioÌn", "seta", "setenta", "severo", "sexo", "sexto", "sidra", "siesta", "siete", "siglo", "signo", "siÌlaba", "silbar", "silencio", "silla", "siÌmbolo", "simio", "sirena", "sistema", "sitio", "situar", "sobre", "socio", "sodio", "sol", "solapa", "soldado", "soledad", "soÌlido", "soltar", "solucioÌn", "sombra", "sondeo", "sonido", "sonoro", "sonrisa", "sopa", "soplar", "soporte", "sordo", "sorpresa", "sorteo", "sosteÌn", "soÌtano", "suave", "subir", "suceso", "sudor", "suegra", "suelo", "sueño", "suerte", "sufrir", "sujeto", "sultaÌn", "sumar", "superar", "suplir", "suponer", "supremo", "sur", "surco", "sureño", "surgir", "susto", "sutil", "tabaco", "tabique", "tabla", "tabuÌ", "taco", "tacto", "tajo", "talar", "talco", "talento", "talla", "taloÌn", "tamaño", "tambor", "tango", "tanque", "tapa", "tapete", "tapia", "tapoÌn", "taquilla", "tarde", "tarea", "tarifa", "tarjeta", "tarot", "tarro", "tarta", "tatuaje", "tauro", "taza", "tazoÌn", "teatro", "techo", "tecla", "teÌcnica", "tejado", "tejer", "tejido", "tela", "teleÌfono", "tema", "temor", "templo", "tenaz", "tender", "tener", "tenis", "tenso", "teoriÌa", "terapia", "terco", "teÌrmino", "ternura", "terror", "tesis", "tesoro", "testigo", "tetera", "texto", "tez", "tibio", "tiburoÌn", "tiempo", "tienda", "tierra", "tieso", "tigre", "tijera", "tilde", "timbre", "tiÌmido", "timo", "tinta", "tiÌo", "tiÌpico", "tipo", "tira", "tiroÌn", "titaÌn", "tiÌtere", "tiÌtulo", "tiza", "toalla", "tobillo", "tocar", "tocino", "todo", "toga", "toldo", "tomar", "tono", "tonto", "topar", "tope", "toque", "toÌrax", "torero", "tormenta", "torneo", "toro", "torpedo", "torre", "torso", "tortuga", "tos", "tosco", "toser", "toÌxico", "trabajo", "tractor", "traer", "traÌfico", "trago", "traje", "tramo", "trance", "trato", "trauma", "trazar", "treÌbol", "tregua", "treinta", "tren", "trepar", "tres", "tribu", "trigo", "tripa", "triste", "triunfo", "trofeo", "trompa", "tronco", "tropa", "trote", "trozo", "truco", "trueno", "trufa", "tuberiÌa", "tubo", "tuerto", "tumba", "tumor", "tuÌnel", "tuÌnica", "turbina", "turismo", "turno", "tutor", "ubicar", "uÌlcera", "umbral", "unidad", "unir", "universo", "uno", "untar", "uña", "urbano", "urbe", "urgente", "urna", "usar", "usuario", "uÌtil", "utopiÌa", "uva", "vaca", "vaciÌo", "vacuna", "vagar", "vago", "vaina", "vajilla", "vale", "vaÌlido", "valle", "valor", "vaÌlvula", "vampiro", "vara", "variar", "varoÌn", "vaso", "vecino", "vector", "vehiÌculo", "veinte", "vejez", "vela", "velero", "veloz", "vena", "vencer", "venda", "veneno", "vengar", "venir", "venta", "venus", "ver", "verano", "verbo", "verde", "vereda", "verja", "verso", "verter", "viÌa", "viaje", "vibrar", "vicio", "viÌctima", "vida", "viÌdeo", "vidrio", "viejo", "viernes", "vigor", "vil", "villa", "vinagre", "vino", "viñedo", "violiÌn", "viral", "virgo", "virtud", "visor", "viÌspera", "vista", "vitamina", "viudo", "vivaz", "vivero", "vivir", "vivo", "volcaÌn", "volumen", "volver", "voraz", "votar", "voto", "voz", "vuelo", "vulgar", "yacer", "yate", "yegua", "yema", "yerno", "yeso", "yodo", "yoga", "yogur", "zafiro", "zanja", "zapato", "zarza", "zona", "zorro", "zumo", "zurdo") diff --git a/src/main/kotlin/com/radixdlt/bip44/BIP44.kt b/src/main/kotlin/com/radixdlt/bip44/BIP44.kt new file mode 100644 index 0000000..39cbc65 --- /dev/null +++ b/src/main/kotlin/com/radixdlt/bip44/BIP44.kt @@ -0,0 +1,47 @@ +package com.radixdlt.bip44 + +/* +BIP44 as in https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki + */ + +const val BIP44_HARDENING_FLAG = 0x80000000.toInt() +const val BIP44_PREFIX = "m" + +private fun getEnsuredCleanPath(path: String): String { + if (!path.trim().startsWith(BIP44_PREFIX)) { + throw (IllegalArgumentException("Must start with $BIP44_PREFIX")) + } + return path.removePrefix(BIP44_PREFIX).removePrefix("/").replace(" ", "") +} + +data class BIP44Element(val hardened: Boolean, val number: Int) { + val numberWithHardeningFlag = if (hardened) number or BIP44_HARDENING_FLAG else number +} + +data class BIP44(val path: List) { + constructor(path: String) : this(getEnsuredCleanPath(path).let { cleanPath -> + if (cleanPath.isEmpty()) { + emptyList() + } else { + cleanPath.replace("H", "'").split("/") + .asSequence() + .map { + BIP44Element( + hardened = it.endsWith("'"), + number = it.removeSuffix("'").toIntOrNull() + ?: throw IllegalArgumentException("not a number '$it' in path $path") + ) + } + .toList() + } + }) + + override fun equals(other: Any?) = (other as? BIP44)?.path == path + override fun hashCode() = path.hashCode() + override fun toString() = ("$BIP44_PREFIX/" + path.joinToString("/") { + if (it.hardened) "${it.number}'" else "${it.number}" + }).removeSuffix("/") + + fun increment() = BIP44(path.subList(0, path.size - 1) + + path.last().let { BIP44Element(it.hardened, it.number + 1) }) +} diff --git a/src/main/kotlin/com/radixdlt/crypto/Converters.kt b/src/main/kotlin/com/radixdlt/crypto/Converters.kt new file mode 100644 index 0000000..51009d4 --- /dev/null +++ b/src/main/kotlin/com/radixdlt/crypto/Converters.kt @@ -0,0 +1,30 @@ +package com.radixdlt.crypto + +import com.radixdlt.crypto.ec.EllipticCurvePoint +import com.radixdlt.crypto.ec.EllipticCurveType +import com.radixdlt.crypto.ec.publicFromPrivate +import com.radixdlt.crypto.ec.toEllipticCurve +import com.radixdlt.model.* +import java.math.BigInteger + + +fun PrivateKey.toECKeyPair() = ECKeyPair(this, publicKeyFromPrivate(this)) + +/** + * Returns public key from the given private key. + * + * @param privateKey the private key to derive the public key from + * @return BigInteger encoded public key + */ +fun publicKeyFromPrivate(privateKey: PrivateKey): PublicKey { + return PublicKey(privateKey.curveType.toEllipticCurve().publicFromPrivate(privateKey.key), privateKey.curveType) +} + + +/** + * Decodes an uncompressed public key (without 0x04 prefix) given an ECPoint + */ +fun EllipticCurvePoint.toPublicKey(curveType: EllipticCurveType): PublicKey { + val encodedKey = encoded() + return PublicKey(BigInteger(1, encodedKey.copyOfRange(1, encodedKey.size)), curveType) +} diff --git a/src/main/kotlin/com/radixdlt/crypto/Keys.kt b/src/main/kotlin/com/radixdlt/crypto/Keys.kt new file mode 100644 index 0000000..4bc28a0 --- /dev/null +++ b/src/main/kotlin/com/radixdlt/crypto/Keys.kt @@ -0,0 +1,16 @@ +package com.radixdlt.crypto + +import com.radixdlt.extensions.toBytesPadded +import com.radixdlt.model.ECKeyPair +import com.radixdlt.model.PUBLIC_KEY_SIZE +import com.radixdlt.crypto.ec.toEllipticCurve + + +fun ECKeyPair.getCompressedPublicKey(): ByteArray { + //add the uncompressed prefix + val ret = publicKey.key.toBytesPadded(PUBLIC_KEY_SIZE + 1) + ret[0] = 4 + val point = publicKey.curveType.toEllipticCurve().decodePoint(ret) + return point.encoded(true) +} + diff --git a/src/main/kotlin/com/radixdlt/crypto/base58/Base58.kt b/src/main/kotlin/com/radixdlt/crypto/base58/Base58.kt new file mode 100644 index 0000000..583a5a6 --- /dev/null +++ b/src/main/kotlin/com/radixdlt/crypto/base58/Base58.kt @@ -0,0 +1,162 @@ +package com.radixdlt.crypto.base58 + +import com.radixdlt.crypto.hash.sha256.extensions.sha256 + +/** + * Base58 is a way to encode addresses (or arbitrary data) as alphanumeric strings. + * Compared to base64, this encoding eliminates ambiguities created by O0Il and potential splits from punctuation + * + * The basic idea of the encoding is to treat the data bytes as a large number represented using + * base-256 digits, convert the number to be represented using base-58 digits, preserve the exact + * number of leading zeros (which are otherwise lost during the mathematical operations on the + * numbers), and finally represent the resulting base-58 digits as alphanumeric ASCII characters. + * + * This is the Kotlin implementation of base58 - it is based implementation of base58 in java + * in bitcoinj (https://bitcoinj.github.io) - thanks to Google Inc. and Andreas Schildbach + * + */ + + +private const val ENCODED_ZERO = '1' +private const val CHECKSUM_SIZE = 4 + +private const val alphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" +private val alphabetIndices by lazy { + IntArray(128) { alphabet.indexOf(it.toChar()) } +} + +/** + * Encodes the bytes as a base58 string (no checksum is appended). + * + * @return the base58-encoded string + */ +fun ByteArray.encodeToBase58String(): String { + + val input = copyOf(size) // since we modify it in-place + if (input.isEmpty()) { + return "" + } + // Count leading zeros. + var zeros = 0 + while (zeros < input.size && input[zeros].toInt() == 0) { + ++zeros + } + // Convert base-256 digits to base-58 digits (plus conversion to ASCII characters) + val encoded = CharArray(input.size * 2) // upper bound + var outputStart = encoded.size + var inputStart = zeros + while (inputStart < input.size) { + encoded[--outputStart] = alphabet[divmod(input, inputStart.toUInt(), 256.toUInt(), 58.toUInt()).toInt()] + if (input[inputStart].toInt() == 0) { + ++inputStart // optimization - skip leading zeros + } + } + // Preserve exactly as many leading encoded zeros in output as there were leading zeros in data. + while (outputStart < encoded.size && encoded[outputStart] == ENCODED_ZERO) { + ++outputStart + } + while (--zeros >= 0) { + encoded[--outputStart] = ENCODED_ZERO + } + // Return encoded string (including encoded leading zeros). + return String(encoded, outputStart, encoded.size - outputStart) +} + +/** + * Decodes the base58 string into a [ByteArray] + * + * @return the decoded data bytes + * @throws NumberFormatException if the string is not a valid base58 string + */ +@Throws(NumberFormatException::class) +fun String.decodeBase58(): ByteArray { + if (isEmpty()) { + return ByteArray(0) + } + // Convert the base58-encoded ASCII chars to a base58 byte sequence (base58 digits). + val input58 = ByteArray(length) + for (i in 0 until length) { + val c = this[i] + val digit = if (c.toInt() < 128) alphabetIndices[c.toInt()] else -1 + if (digit < 0) { + throw NumberFormatException("Illegal character $c at position $i") + } + input58[i] = digit.toByte() + } + // Count leading zeros. + var zeros = 0 + while (zeros < input58.size && input58[zeros].toInt() == 0) { + ++zeros + } + // Convert base-58 digits to base-256 digits. + val decoded = ByteArray(length) + var outputStart = decoded.size + var inputStart = zeros + while (inputStart < input58.size) { + decoded[--outputStart] = divmod(input58, inputStart.toUInt(), 58.toUInt(), 256.toUInt()).toByte() + if (input58[inputStart].toInt() == 0) { + ++inputStart // optimization - skip leading zeros + } + } + // Ignore extra leading zeroes that were added during the calculation. + while (outputStart < decoded.size && decoded[outputStart].toInt() == 0) { + ++outputStart + } + // Return decoded data (including original number of leading zeros). + return decoded.copyOfRange(outputStart - zeros, decoded.size) +} + +/** + * Divides a number, represented as an array of bytes each containing a single digit + * in the specified base, by the given divisor. The given number is modified in-place + * to contain the quotient, and the return value is the remainder. + * + * @param number the number to divide + * @param firstDigit the index within the array of the first non-zero digit + * (this is used for optimization by skipping the leading zeros) + * @param base the base in which the number's digits are represented (up to 256) + * @param divisor the number to divide by (up to 256) + * @return the remainder of the division operation + */ +private fun divmod(number: ByteArray, firstDigit: UInt, base: UInt, divisor: UInt): UInt { + // this is just long division which accounts for the base of the input digits + var remainder = 0.toUInt() + for (i in firstDigit until number.size.toUInt()) { + val digit = number[i.toInt()].toUByte() + val temp = remainder * base + digit + number[i.toInt()] = (temp / divisor).toByte() + remainder = temp % divisor + } + return remainder +} + +/** + * Encodes the given bytes as a base58 string, a checksum is appended + * + * @return the base58-encoded string + */ +fun ByteArray.encodeToBase58WithChecksum() = ByteArray(size + CHECKSUM_SIZE).apply { + System.arraycopy(this@encodeToBase58WithChecksum, 0, this, 0, this@encodeToBase58WithChecksum.size) + val checksum = this@encodeToBase58WithChecksum.sha256().sha256() + System.arraycopy(checksum, 0, this, this@encodeToBase58WithChecksum.size, CHECKSUM_SIZE) + +}.encodeToBase58String() + +fun String.decodeBase58WithChecksum(): ByteArray { + val rawBytes = decodeBase58() + if (rawBytes.size < CHECKSUM_SIZE) { + throw Exception("Too short for checksum: $this l: ${rawBytes.size}") + } + val checksum = rawBytes.copyOfRange(rawBytes.size - CHECKSUM_SIZE, rawBytes.size) + + val payload = rawBytes.copyOfRange(0, rawBytes.size - CHECKSUM_SIZE) + + val hash = payload.sha256().sha256() + val computedChecksum = hash.copyOfRange(0, CHECKSUM_SIZE) + + if (checksum.contentEquals(computedChecksum)) { + return payload + } else { + throw IllegalArgumentException("Checksum mismatch: $checksum is not computed checksum $computedChecksum") + } +} diff --git a/src/main/kotlin/com/radixdlt/crypto/ec/EllipticCurve.kt b/src/main/kotlin/com/radixdlt/crypto/ec/EllipticCurve.kt new file mode 100644 index 0000000..fc8ec5b --- /dev/null +++ b/src/main/kotlin/com/radixdlt/crypto/ec/EllipticCurve.kt @@ -0,0 +1,59 @@ +package com.radixdlt.crypto.ec + +import org.bouncycastle.crypto.ec.CustomNamedCurves +import org.bouncycastle.crypto.params.ECDomainParameters +import java.math.BigInteger + +enum class EllipticCurveType { + Secp256k1, + P256, + Ed25519, +} + +fun EllipticCurveType.toName(): String { + return when (this) { + EllipticCurveType.Secp256k1 -> "secp256k1" + EllipticCurveType.P256 -> "secp256r1" + EllipticCurveType.Ed25519 -> "curve25519" + } +} + +class EllipticCurve(val type: EllipticCurveType) { + val curveParams = CustomNamedCurves.getByName(type.toName())!! + + val n: BigInteger + get() = curveParams.n + + val g: EllipticCurvePoint + get() = curveParams.g.toCurvePoint() + + fun decodePoint(data: ByteArray): EllipticCurvePoint = + curveParams.curve.decodePoint(data).toCurvePoint() + + fun createPoint(x: BigInteger, y: BigInteger): EllipticCurvePoint = + curveParams.curve.createPoint(x, y).toCurvePoint() + + val domainParams = curveParams.run { ECDomainParameters(curve, g, n, h) } + + /** + * Takes a public key in compressed encoding (including prefix) + * and returns the key in uncompressed encoding (without prefix) + */ + fun decompressKey(publicBytes: ByteArray): ByteArray { + val point = decodePoint(publicBytes) + val encoded = point.encoded() + return encoded.copyOfRange(1, encoded.size) + } +} + +val Secp256k1 = EllipticCurve(EllipticCurveType.Secp256k1) +val P256 = EllipticCurve(EllipticCurveType.P256) +val Ed25519 = EllipticCurve(EllipticCurveType.Ed25519) + +fun EllipticCurveType.toEllipticCurve(): EllipticCurve { + return when (this) { + EllipticCurveType.Secp256k1 -> Secp256k1 + EllipticCurveType.P256 -> P256 + EllipticCurveType.Ed25519 -> Ed25519 + } +} diff --git a/src/main/kotlin/com/radixdlt/crypto/ec/EllipticCurvePoint.kt b/src/main/kotlin/com/radixdlt/crypto/ec/EllipticCurvePoint.kt new file mode 100644 index 0000000..5370d87 --- /dev/null +++ b/src/main/kotlin/com/radixdlt/crypto/ec/EllipticCurvePoint.kt @@ -0,0 +1,28 @@ +package com.radixdlt.crypto.ec + +import org.bouncycastle.math.ec.ECPoint +import java.math.BigInteger + +class EllipticCurvePoint(private val ecPoint: ECPoint) { + val x: BigInteger + get() = ecPoint.xCoord.toBigInteger() + val y: BigInteger + get() = ecPoint.yCoord.toBigInteger() + + fun mul(n: BigInteger): EllipticCurvePoint = + ecPoint.multiply(n).toCurvePoint() + + fun add(p: EllipticCurvePoint): EllipticCurvePoint = + ecPoint.add(p.ecPoint).toCurvePoint() + + fun normalize(): EllipticCurvePoint = + ecPoint.normalize().toCurvePoint() + + fun isInfinity(): Boolean = + ecPoint.isInfinity + + fun encoded(compressed: Boolean = false): ByteArray = + ecPoint.getEncoded(compressed) +} + +internal fun ECPoint.toCurvePoint(): EllipticCurvePoint = EllipticCurvePoint(this) diff --git a/src/main/kotlin/com/radixdlt/crypto/ec/EllipticCurveSigner.kt b/src/main/kotlin/com/radixdlt/crypto/ec/EllipticCurveSigner.kt new file mode 100644 index 0000000..d6ba544 --- /dev/null +++ b/src/main/kotlin/com/radixdlt/crypto/ec/EllipticCurveSigner.kt @@ -0,0 +1,32 @@ +package com.radixdlt.crypto.ec + +import org.bouncycastle.math.ec.ECPoint +import org.bouncycastle.math.ec.FixedPointCombMultiplier +import java.math.BigInteger +import java.util.* + + +fun EllipticCurve.publicFromPrivate(privateKey: BigInteger): BigInteger { + + val point = publicPointFromPrivate(privateKey) + + val encoded = point.getEncoded(false) + return BigInteger(1, Arrays.copyOfRange(encoded, 1, encoded.size)) +} + +/** + * Returns public key point from the given private key. + */ +private fun EllipticCurve.publicPointFromPrivate(privateKey: BigInteger): ECPoint { + /* + * TODO: FixedPointCombMultiplier currently doesn't support scalars longer than the group + * order, but that could change in future versions. + */ + val postProcessedPrivateKey = if (privateKey.bitLength() > curveParams.n.bitLength()) { + privateKey.mod(domainParams.n) + } else { + privateKey + } + return FixedPointCombMultiplier().multiply(domainParams.g, postProcessedPrivateKey) +} + diff --git a/src/main/kotlin/com/radixdlt/crypto/hash/DigestParams.kt b/src/main/kotlin/com/radixdlt/crypto/hash/DigestParams.kt new file mode 100644 index 0000000..f73b16c --- /dev/null +++ b/src/main/kotlin/com/radixdlt/crypto/hash/DigestParams.kt @@ -0,0 +1,6 @@ +package com.radixdlt.crypto.hash + +sealed class DigestParams(val keySize: Int) { + object Sha256 : DigestParams(256) + object Sha512 : DigestParams(512) +} diff --git a/src/main/kotlin/com/radixdlt/crypto/hash/ripemd160/Ripemd160Digest.kt b/src/main/kotlin/com/radixdlt/crypto/hash/ripemd160/Ripemd160Digest.kt new file mode 100644 index 0000000..b0dd4af --- /dev/null +++ b/src/main/kotlin/com/radixdlt/crypto/hash/ripemd160/Ripemd160Digest.kt @@ -0,0 +1,573 @@ +package com.radixdlt.crypto.hash.ripemd160 + +/** + * implementation of RIPEMD see, + * http://www.esat.kuleuven.ac.be/~bosselae/ripemd160.html + */ +public class Ripemd160Digest { + + private var h0: Int = 0 + private var h1: Int = 0 + private var h2: Int = 0 + private var h3: Int = 0 + private var h4: Int = 0 // IV's + + private val x = IntArray(16) + private var xOff: Int = 0 + + private val xBuf = ByteArray(4) + private var xBufOff: Int = 0 + + private var byteCount: Long = 0 + + init { + reset() + } + + public fun update(input: Byte) { + xBuf[xBufOff++] = input + + if (xBufOff == xBuf.size) { + processWord(xBuf, 0) + xBufOff = 0 + } + + byteCount++ + } + + public fun update(input: ByteArray, inputOffset: Int, len: Int) { + var pos = inputOffset + var toProcess = len + // + // fill the current word + // + while (xBufOff != 0 && toProcess > 0) { + update(input[pos]) + + pos++ + toProcess-- + } + + // + // process whole words. + // + while (toProcess > xBuf.size) { + processWord(input, pos) + + pos += xBuf.size + toProcess -= xBuf.size + byteCount += xBuf.size.toLong() + } + + // + // load in the remainder. + // + while (toProcess > 0) { + update(input[pos]) + + pos++ + toProcess-- + } + } + + private fun finish() { + val bitLength = byteCount shl 3 + + // + // add the pad bytes. + // + update(128.toByte()) + + while (xBufOff != 0) { + update(0.toByte()) + } + + processLength(bitLength) + + processBlock() + } + + /** + * reset the chaining variables to the IV values. + */ + private fun reset() { + byteCount = 0 + + xBufOff = 0 + for (i in xBuf.indices) { + xBuf[i] = 0 + } + + h0 = 0x67452301 + h1 = -0x10325477 + h2 = -0x67452302 + h3 = 0x10325476 + h4 = -0x3c2d1e10 + + xOff = 0 + + for (i in x.indices) { + x[i] = 0 + } + } + + private fun processWord(inputWord: ByteArray, inputOffset: Int) { + x[xOff++] = (inputWord[inputOffset].toInt() and 0xff or (inputWord[inputOffset + 1].toInt() and 0xff shl 8) + or (inputWord[inputOffset + 2].toInt() and 0xff shl 16) or (inputWord[inputOffset + 3].toInt() and 0xff shl 24)) + + if (xOff == 16) { + processBlock() + } + } + + private fun processLength(bitLength: Long) { + if (xOff > 14) { + processBlock() + } + + x[14] = (bitLength and -0x1).toInt() + x[15] = bitLength.ushr(32).toInt() + } + + private fun unpackWord(word: Int, out: ByteArray, outOffset: Int) { + out[outOffset] = word.toByte() + out[outOffset + 1] = word.ushr(8).toByte() + out[outOffset + 2] = word.ushr(16).toByte() + out[outOffset + 3] = word.ushr(24).toByte() + } + + public fun doFinal(out: ByteArray, outOffset: Int): Int { + finish() + + unpackWord(h0, out, outOffset) + unpackWord(h1, out, outOffset + 4) + unpackWord(h2, out, outOffset + 8) + unpackWord(h3, out, outOffset + 12) + unpackWord(h4, out, outOffset + 16) + + reset() + + return DIGEST_LENGTH + } + + /* + * rotate int x left n bits. + */ + private fun rotateLeft(x: Int, n: Int) = x shl n or x.ushr(32 - n) + + /* + * f1,f2,f3,f4,f5 are the basic RIPEMD160 functions. + */ + + /* + * rounds 0-15 + */ + private fun f1(x: Int, y: Int, z: Int) = x xor y xor z + + /* + * rounds 16-31 + */ + private fun f2(x: Int, y: Int, z: Int) = x and y or (x.inv() and z) + + /* + * rounds 32-47 + */ + private fun f3(x: Int, y: Int, z: Int) = x or y.inv() xor z + + /* + * rounds 48-63 + */ + private fun f4(x: Int, y: Int, z: Int) = x and z or (y and z.inv()) + + /* + * rounds 64-79 + */ + private fun f5(x: Int, y: Int, z: Int) = x xor (y or z.inv()) + + private fun processBlock() { + var aa = h0 + var a = aa + var bb = h1 + var b = bb + var cc = h2 + var c = cc + var dd = h3 + var d = dd + var ee = h4 + var e = ee + + // + // Rounds 1 - 16 + // + // left + a = rotateLeft(a + f1(b, c, d) + x[0], 11) + e + c = rotateLeft(c, 10) + e = rotateLeft(e + f1(a, b, c) + x[1], 14) + d + b = rotateLeft(b, 10) + d = rotateLeft(d + f1(e, a, b) + x[2], 15) + c + a = rotateLeft(a, 10) + c = rotateLeft(c + f1(d, e, a) + x[3], 12) + b + e = rotateLeft(e, 10) + b = rotateLeft(b + f1(c, d, e) + x[4], 5) + a + d = rotateLeft(d, 10) + a = rotateLeft(a + f1(b, c, d) + x[5], 8) + e + c = rotateLeft(c, 10) + e = rotateLeft(e + f1(a, b, c) + x[6], 7) + d + b = rotateLeft(b, 10) + d = rotateLeft(d + f1(e, a, b) + x[7], 9) + c + a = rotateLeft(a, 10) + c = rotateLeft(c + f1(d, e, a) + x[8], 11) + b + e = rotateLeft(e, 10) + b = rotateLeft(b + f1(c, d, e) + x[9], 13) + a + d = rotateLeft(d, 10) + a = rotateLeft(a + f1(b, c, d) + x[10], 14) + e + c = rotateLeft(c, 10) + e = rotateLeft(e + f1(a, b, c) + x[11], 15) + d + b = rotateLeft(b, 10) + d = rotateLeft(d + f1(e, a, b) + x[12], 6) + c + a = rotateLeft(a, 10) + c = rotateLeft(c + f1(d, e, a) + x[13], 7) + b + e = rotateLeft(e, 10) + b = rotateLeft(b + f1(c, d, e) + x[14], 9) + a + d = rotateLeft(d, 10) + a = rotateLeft(a + f1(b, c, d) + x[15], 8) + e + c = rotateLeft(c, 10) + + // right + aa = rotateLeft(aa + f5(bb, cc, dd) + x[5] + 0x50a28be6, 8) + ee + cc = rotateLeft(cc, 10) + ee = rotateLeft(ee + f5(aa, bb, cc) + x[14] + 0x50a28be6, 9) + dd + bb = rotateLeft(bb, 10) + dd = rotateLeft(dd + f5(ee, aa, bb) + x[7] + 0x50a28be6, 9) + cc + aa = rotateLeft(aa, 10) + cc = rotateLeft(cc + f5(dd, ee, aa) + x[0] + 0x50a28be6, 11) + bb + ee = rotateLeft(ee, 10) + bb = rotateLeft(bb + f5(cc, dd, ee) + x[9] + 0x50a28be6, 13) + aa + dd = rotateLeft(dd, 10) + aa = rotateLeft(aa + f5(bb, cc, dd) + x[2] + 0x50a28be6, 15) + ee + cc = rotateLeft(cc, 10) + ee = rotateLeft(ee + f5(aa, bb, cc) + x[11] + 0x50a28be6, 15) + dd + bb = rotateLeft(bb, 10) + dd = rotateLeft(dd + f5(ee, aa, bb) + x[4] + 0x50a28be6, 5) + cc + aa = rotateLeft(aa, 10) + cc = rotateLeft(cc + f5(dd, ee, aa) + x[13] + 0x50a28be6, 7) + bb + ee = rotateLeft(ee, 10) + bb = rotateLeft(bb + f5(cc, dd, ee) + x[6] + 0x50a28be6, 7) + aa + dd = rotateLeft(dd, 10) + aa = rotateLeft(aa + f5(bb, cc, dd) + x[15] + 0x50a28be6, 8) + ee + cc = rotateLeft(cc, 10) + ee = rotateLeft(ee + f5(aa, bb, cc) + x[8] + 0x50a28be6, 11) + dd + bb = rotateLeft(bb, 10) + dd = rotateLeft(dd + f5(ee, aa, bb) + x[1] + 0x50a28be6, 14) + cc + aa = rotateLeft(aa, 10) + cc = rotateLeft(cc + f5(dd, ee, aa) + x[10] + 0x50a28be6, 14) + bb + ee = rotateLeft(ee, 10) + bb = rotateLeft(bb + f5(cc, dd, ee) + x[3] + 0x50a28be6, 12) + aa + dd = rotateLeft(dd, 10) + aa = rotateLeft(aa + f5(bb, cc, dd) + x[12] + 0x50a28be6, 6) + ee + cc = rotateLeft(cc, 10) + + // + // Rounds 16-31 + // + // left + e = rotateLeft(e + f2(a, b, c) + x[7] + 0x5a827999, 7) + d + b = rotateLeft(b, 10) + d = rotateLeft(d + f2(e, a, b) + x[4] + 0x5a827999, 6) + c + a = rotateLeft(a, 10) + c = rotateLeft(c + f2(d, e, a) + x[13] + 0x5a827999, 8) + b + e = rotateLeft(e, 10) + b = rotateLeft(b + f2(c, d, e) + x[1] + 0x5a827999, 13) + a + d = rotateLeft(d, 10) + a = rotateLeft(a + f2(b, c, d) + x[10] + 0x5a827999, 11) + e + c = rotateLeft(c, 10) + e = rotateLeft(e + f2(a, b, c) + x[6] + 0x5a827999, 9) + d + b = rotateLeft(b, 10) + d = rotateLeft(d + f2(e, a, b) + x[15] + 0x5a827999, 7) + c + a = rotateLeft(a, 10) + c = rotateLeft(c + f2(d, e, a) + x[3] + 0x5a827999, 15) + b + e = rotateLeft(e, 10) + b = rotateLeft(b + f2(c, d, e) + x[12] + 0x5a827999, 7) + a + d = rotateLeft(d, 10) + a = rotateLeft(a + f2(b, c, d) + x[0] + 0x5a827999, 12) + e + c = rotateLeft(c, 10) + e = rotateLeft(e + f2(a, b, c) + x[9] + 0x5a827999, 15) + d + b = rotateLeft(b, 10) + d = rotateLeft(d + f2(e, a, b) + x[5] + 0x5a827999, 9) + c + a = rotateLeft(a, 10) + c = rotateLeft(c + f2(d, e, a) + x[2] + 0x5a827999, 11) + b + e = rotateLeft(e, 10) + b = rotateLeft(b + f2(c, d, e) + x[14] + 0x5a827999, 7) + a + d = rotateLeft(d, 10) + a = rotateLeft(a + f2(b, c, d) + x[11] + 0x5a827999, 13) + e + c = rotateLeft(c, 10) + e = rotateLeft(e + f2(a, b, c) + x[8] + 0x5a827999, 12) + d + b = rotateLeft(b, 10) + + // right + ee = rotateLeft(ee + f4(aa, bb, cc) + x[6] + 0x5c4dd124, 9) + dd + bb = rotateLeft(bb, 10) + dd = rotateLeft(dd + f4(ee, aa, bb) + x[11] + 0x5c4dd124, 13) + cc + aa = rotateLeft(aa, 10) + cc = rotateLeft(cc + f4(dd, ee, aa) + x[3] + 0x5c4dd124, 15) + bb + ee = rotateLeft(ee, 10) + bb = rotateLeft(bb + f4(cc, dd, ee) + x[7] + 0x5c4dd124, 7) + aa + dd = rotateLeft(dd, 10) + aa = rotateLeft(aa + f4(bb, cc, dd) + x[0] + 0x5c4dd124, 12) + ee + cc = rotateLeft(cc, 10) + ee = rotateLeft(ee + f4(aa, bb, cc) + x[13] + 0x5c4dd124, 8) + dd + bb = rotateLeft(bb, 10) + dd = rotateLeft(dd + f4(ee, aa, bb) + x[5] + 0x5c4dd124, 9) + cc + aa = rotateLeft(aa, 10) + cc = rotateLeft(cc + f4(dd, ee, aa) + x[10] + 0x5c4dd124, 11) + bb + ee = rotateLeft(ee, 10) + bb = rotateLeft(bb + f4(cc, dd, ee) + x[14] + 0x5c4dd124, 7) + aa + dd = rotateLeft(dd, 10) + aa = rotateLeft(aa + f4(bb, cc, dd) + x[15] + 0x5c4dd124, 7) + ee + cc = rotateLeft(cc, 10) + ee = rotateLeft(ee + f4(aa, bb, cc) + x[8] + 0x5c4dd124, 12) + dd + bb = rotateLeft(bb, 10) + dd = rotateLeft(dd + f4(ee, aa, bb) + x[12] + 0x5c4dd124, 7) + cc + aa = rotateLeft(aa, 10) + cc = rotateLeft(cc + f4(dd, ee, aa) + x[4] + 0x5c4dd124, 6) + bb + ee = rotateLeft(ee, 10) + bb = rotateLeft(bb + f4(cc, dd, ee) + x[9] + 0x5c4dd124, 15) + aa + dd = rotateLeft(dd, 10) + aa = rotateLeft(aa + f4(bb, cc, dd) + x[1] + 0x5c4dd124, 13) + ee + cc = rotateLeft(cc, 10) + ee = rotateLeft(ee + f4(aa, bb, cc) + x[2] + 0x5c4dd124, 11) + dd + bb = rotateLeft(bb, 10) + + // + // Rounds 32-47 + // + // left + d = rotateLeft(d + f3(e, a, b) + x[3] + 0x6ed9eba1, 11) + c + a = rotateLeft(a, 10) + c = rotateLeft(c + f3(d, e, a) + x[10] + 0x6ed9eba1, 13) + b + e = rotateLeft(e, 10) + b = rotateLeft(b + f3(c, d, e) + x[14] + 0x6ed9eba1, 6) + a + d = rotateLeft(d, 10) + a = rotateLeft(a + f3(b, c, d) + x[4] + 0x6ed9eba1, 7) + e + c = rotateLeft(c, 10) + e = rotateLeft(e + f3(a, b, c) + x[9] + 0x6ed9eba1, 14) + d + b = rotateLeft(b, 10) + d = rotateLeft(d + f3(e, a, b) + x[15] + 0x6ed9eba1, 9) + c + a = rotateLeft(a, 10) + c = rotateLeft(c + f3(d, e, a) + x[8] + 0x6ed9eba1, 13) + b + e = rotateLeft(e, 10) + b = rotateLeft(b + f3(c, d, e) + x[1] + 0x6ed9eba1, 15) + a + d = rotateLeft(d, 10) + a = rotateLeft(a + f3(b, c, d) + x[2] + 0x6ed9eba1, 14) + e + c = rotateLeft(c, 10) + e = rotateLeft(e + f3(a, b, c) + x[7] + 0x6ed9eba1, 8) + d + b = rotateLeft(b, 10) + d = rotateLeft(d + f3(e, a, b) + x[0] + 0x6ed9eba1, 13) + c + a = rotateLeft(a, 10) + c = rotateLeft(c + f3(d, e, a) + x[6] + 0x6ed9eba1, 6) + b + e = rotateLeft(e, 10) + b = rotateLeft(b + f3(c, d, e) + x[13] + 0x6ed9eba1, 5) + a + d = rotateLeft(d, 10) + a = rotateLeft(a + f3(b, c, d) + x[11] + 0x6ed9eba1, 12) + e + c = rotateLeft(c, 10) + e = rotateLeft(e + f3(a, b, c) + x[5] + 0x6ed9eba1, 7) + d + b = rotateLeft(b, 10) + d = rotateLeft(d + f3(e, a, b) + x[12] + 0x6ed9eba1, 5) + c + a = rotateLeft(a, 10) + + // right + dd = rotateLeft(dd + f3(ee, aa, bb) + x[15] + 0x6d703ef3, 9) + cc + aa = rotateLeft(aa, 10) + cc = rotateLeft(cc + f3(dd, ee, aa) + x[5] + 0x6d703ef3, 7) + bb + ee = rotateLeft(ee, 10) + bb = rotateLeft(bb + f3(cc, dd, ee) + x[1] + 0x6d703ef3, 15) + aa + dd = rotateLeft(dd, 10) + aa = rotateLeft(aa + f3(bb, cc, dd) + x[3] + 0x6d703ef3, 11) + ee + cc = rotateLeft(cc, 10) + ee = rotateLeft(ee + f3(aa, bb, cc) + x[7] + 0x6d703ef3, 8) + dd + bb = rotateLeft(bb, 10) + dd = rotateLeft(dd + f3(ee, aa, bb) + x[14] + 0x6d703ef3, 6) + cc + aa = rotateLeft(aa, 10) + cc = rotateLeft(cc + f3(dd, ee, aa) + x[6] + 0x6d703ef3, 6) + bb + ee = rotateLeft(ee, 10) + bb = rotateLeft(bb + f3(cc, dd, ee) + x[9] + 0x6d703ef3, 14) + aa + dd = rotateLeft(dd, 10) + aa = rotateLeft(aa + f3(bb, cc, dd) + x[11] + 0x6d703ef3, 12) + ee + cc = rotateLeft(cc, 10) + ee = rotateLeft(ee + f3(aa, bb, cc) + x[8] + 0x6d703ef3, 13) + dd + bb = rotateLeft(bb, 10) + dd = rotateLeft(dd + f3(ee, aa, bb) + x[12] + 0x6d703ef3, 5) + cc + aa = rotateLeft(aa, 10) + cc = rotateLeft(cc + f3(dd, ee, aa) + x[2] + 0x6d703ef3, 14) + bb + ee = rotateLeft(ee, 10) + bb = rotateLeft(bb + f3(cc, dd, ee) + x[10] + 0x6d703ef3, 13) + aa + dd = rotateLeft(dd, 10) + aa = rotateLeft(aa + f3(bb, cc, dd) + x[0] + 0x6d703ef3, 13) + ee + cc = rotateLeft(cc, 10) + ee = rotateLeft(ee + f3(aa, bb, cc) + x[4] + 0x6d703ef3, 7) + dd + bb = rotateLeft(bb, 10) + dd = rotateLeft(dd + f3(ee, aa, bb) + x[13] + 0x6d703ef3, 5) + cc + aa = rotateLeft(aa, 10) + + // + // Rounds 48-63 + // + // left + c = rotateLeft(c + f4(d, e, a) + x[1] + -0x70e44324, 11) + b + e = rotateLeft(e, 10) + b = rotateLeft(b + f4(c, d, e) + x[9] + -0x70e44324, 12) + a + d = rotateLeft(d, 10) + a = rotateLeft(a + f4(b, c, d) + x[11] + -0x70e44324, 14) + e + c = rotateLeft(c, 10) + e = rotateLeft(e + f4(a, b, c) + x[10] + -0x70e44324, 15) + d + b = rotateLeft(b, 10) + d = rotateLeft(d + f4(e, a, b) + x[0] + -0x70e44324, 14) + c + a = rotateLeft(a, 10) + c = rotateLeft(c + f4(d, e, a) + x[8] + -0x70e44324, 15) + b + e = rotateLeft(e, 10) + b = rotateLeft(b + f4(c, d, e) + x[12] + -0x70e44324, 9) + a + d = rotateLeft(d, 10) + a = rotateLeft(a + f4(b, c, d) + x[4] + -0x70e44324, 8) + e + c = rotateLeft(c, 10) + e = rotateLeft(e + f4(a, b, c) + x[13] + -0x70e44324, 9) + d + b = rotateLeft(b, 10) + d = rotateLeft(d + f4(e, a, b) + x[3] + -0x70e44324, 14) + c + a = rotateLeft(a, 10) + c = rotateLeft(c + f4(d, e, a) + x[7] + -0x70e44324, 5) + b + e = rotateLeft(e, 10) + b = rotateLeft(b + f4(c, d, e) + x[15] + -0x70e44324, 6) + a + d = rotateLeft(d, 10) + a = rotateLeft(a + f4(b, c, d) + x[14] + -0x70e44324, 8) + e + c = rotateLeft(c, 10) + e = rotateLeft(e + f4(a, b, c) + x[5] + -0x70e44324, 6) + d + b = rotateLeft(b, 10) + d = rotateLeft(d + f4(e, a, b) + x[6] + -0x70e44324, 5) + c + a = rotateLeft(a, 10) + c = rotateLeft(c + f4(d, e, a) + x[2] + -0x70e44324, 12) + b + e = rotateLeft(e, 10) + + // right + cc = rotateLeft(cc + f2(dd, ee, aa) + x[8] + 0x7a6d76e9, 15) + bb + ee = rotateLeft(ee, 10) + bb = rotateLeft(bb + f2(cc, dd, ee) + x[6] + 0x7a6d76e9, 5) + aa + dd = rotateLeft(dd, 10) + aa = rotateLeft(aa + f2(bb, cc, dd) + x[4] + 0x7a6d76e9, 8) + ee + cc = rotateLeft(cc, 10) + ee = rotateLeft(ee + f2(aa, bb, cc) + x[1] + 0x7a6d76e9, 11) + dd + bb = rotateLeft(bb, 10) + dd = rotateLeft(dd + f2(ee, aa, bb) + x[3] + 0x7a6d76e9, 14) + cc + aa = rotateLeft(aa, 10) + cc = rotateLeft(cc + f2(dd, ee, aa) + x[11] + 0x7a6d76e9, 14) + bb + ee = rotateLeft(ee, 10) + bb = rotateLeft(bb + f2(cc, dd, ee) + x[15] + 0x7a6d76e9, 6) + aa + dd = rotateLeft(dd, 10) + aa = rotateLeft(aa + f2(bb, cc, dd) + x[0] + 0x7a6d76e9, 14) + ee + cc = rotateLeft(cc, 10) + ee = rotateLeft(ee + f2(aa, bb, cc) + x[5] + 0x7a6d76e9, 6) + dd + bb = rotateLeft(bb, 10) + dd = rotateLeft(dd + f2(ee, aa, bb) + x[12] + 0x7a6d76e9, 9) + cc + aa = rotateLeft(aa, 10) + cc = rotateLeft(cc + f2(dd, ee, aa) + x[2] + 0x7a6d76e9, 12) + bb + ee = rotateLeft(ee, 10) + bb = rotateLeft(bb + f2(cc, dd, ee) + x[13] + 0x7a6d76e9, 9) + aa + dd = rotateLeft(dd, 10) + aa = rotateLeft(aa + f2(bb, cc, dd) + x[9] + 0x7a6d76e9, 12) + ee + cc = rotateLeft(cc, 10) + ee = rotateLeft(ee + f2(aa, bb, cc) + x[7] + 0x7a6d76e9, 5) + dd + bb = rotateLeft(bb, 10) + dd = rotateLeft(dd + f2(ee, aa, bb) + x[10] + 0x7a6d76e9, 15) + cc + aa = rotateLeft(aa, 10) + cc = rotateLeft(cc + f2(dd, ee, aa) + x[14] + 0x7a6d76e9, 8) + bb + ee = rotateLeft(ee, 10) + + // + // Rounds 64-79 + // + // left + b = rotateLeft(b + f5(c, d, e) + x[4] + -0x56ac02b2, 9) + a + d = rotateLeft(d, 10) + a = rotateLeft(a + f5(b, c, d) + x[0] + -0x56ac02b2, 15) + e + c = rotateLeft(c, 10) + e = rotateLeft(e + f5(a, b, c) + x[5] + -0x56ac02b2, 5) + d + b = rotateLeft(b, 10) + d = rotateLeft(d + f5(e, a, b) + x[9] + -0x56ac02b2, 11) + c + a = rotateLeft(a, 10) + c = rotateLeft(c + f5(d, e, a) + x[7] + -0x56ac02b2, 6) + b + e = rotateLeft(e, 10) + b = rotateLeft(b + f5(c, d, e) + x[12] + -0x56ac02b2, 8) + a + d = rotateLeft(d, 10) + a = rotateLeft(a + f5(b, c, d) + x[2] + -0x56ac02b2, 13) + e + c = rotateLeft(c, 10) + e = rotateLeft(e + f5(a, b, c) + x[10] + -0x56ac02b2, 12) + d + b = rotateLeft(b, 10) + d = rotateLeft(d + f5(e, a, b) + x[14] + -0x56ac02b2, 5) + c + a = rotateLeft(a, 10) + c = rotateLeft(c + f5(d, e, a) + x[1] + -0x56ac02b2, 12) + b + e = rotateLeft(e, 10) + b = rotateLeft(b + f5(c, d, e) + x[3] + -0x56ac02b2, 13) + a + d = rotateLeft(d, 10) + a = rotateLeft(a + f5(b, c, d) + x[8] + -0x56ac02b2, 14) + e + c = rotateLeft(c, 10) + e = rotateLeft(e + f5(a, b, c) + x[11] + -0x56ac02b2, 11) + d + b = rotateLeft(b, 10) + d = rotateLeft(d + f5(e, a, b) + x[6] + -0x56ac02b2, 8) + c + a = rotateLeft(a, 10) + c = rotateLeft(c + f5(d, e, a) + x[15] + -0x56ac02b2, 5) + b + e = rotateLeft(e, 10) + b = rotateLeft(b + f5(c, d, e) + x[13] + -0x56ac02b2, 6) + a + d = rotateLeft(d, 10) + + // right + bb = rotateLeft(bb + f1(cc, dd, ee) + x[12], 8) + aa + dd = rotateLeft(dd, 10) + aa = rotateLeft(aa + f1(bb, cc, dd) + x[15], 5) + ee + cc = rotateLeft(cc, 10) + ee = rotateLeft(ee + f1(aa, bb, cc) + x[10], 12) + dd + bb = rotateLeft(bb, 10) + dd = rotateLeft(dd + f1(ee, aa, bb) + x[4], 9) + cc + aa = rotateLeft(aa, 10) + cc = rotateLeft(cc + f1(dd, ee, aa) + x[1], 12) + bb + ee = rotateLeft(ee, 10) + bb = rotateLeft(bb + f1(cc, dd, ee) + x[5], 5) + aa + dd = rotateLeft(dd, 10) + aa = rotateLeft(aa + f1(bb, cc, dd) + x[8], 14) + ee + cc = rotateLeft(cc, 10) + ee = rotateLeft(ee + f1(aa, bb, cc) + x[7], 6) + dd + bb = rotateLeft(bb, 10) + dd = rotateLeft(dd + f1(ee, aa, bb) + x[6], 8) + cc + aa = rotateLeft(aa, 10) + cc = rotateLeft(cc + f1(dd, ee, aa) + x[2], 13) + bb + ee = rotateLeft(ee, 10) + bb = rotateLeft(bb + f1(cc, dd, ee) + x[13], 6) + aa + dd = rotateLeft(dd, 10) + aa = rotateLeft(aa + f1(bb, cc, dd) + x[14], 5) + ee + cc = rotateLeft(cc, 10) + ee = rotateLeft(ee + f1(aa, bb, cc) + x[0], 15) + dd + bb = rotateLeft(bb, 10) + dd = rotateLeft(dd + f1(ee, aa, bb) + x[3], 13) + cc + aa = rotateLeft(aa, 10) + cc = rotateLeft(cc + f1(dd, ee, aa) + x[9], 11) + bb + ee = rotateLeft(ee, 10) + bb = rotateLeft(bb + f1(cc, dd, ee) + x[11], 11) + aa + dd = rotateLeft(dd, 10) + + dd += c + h1 + h1 = h2 + d + ee + h2 = h3 + e + aa + h3 = h4 + a + bb + h4 = h0 + b + cc + h0 = dd + + // + // reset the offset and clean out the word buffer. + // + xOff = 0 + for (i in x.indices) { + x[i] = 0 + } + } + + public companion object { + public const val DIGEST_LENGTH: Int = 20 + } +} diff --git a/src/main/kotlin/com/radixdlt/crypto/hash/ripemd160/extensions/PublicExtensions.kt b/src/main/kotlin/com/radixdlt/crypto/hash/ripemd160/extensions/PublicExtensions.kt new file mode 100644 index 0000000..5be20f5 --- /dev/null +++ b/src/main/kotlin/com/radixdlt/crypto/hash/ripemd160/extensions/PublicExtensions.kt @@ -0,0 +1,19 @@ +package com.radixdlt.crypto.hash.ripemd160.extensions + +import com.radixdlt.crypto.hash.ripemd160.Ripemd160Digest + +/** + * Computes the RIPEMD160 from [this] [ByteArray]. + */ +public fun ByteArray.digestRipemd160(): ByteArray { + return ByteArray(Ripemd160Digest.DIGEST_LENGTH).apply { + val digest = Ripemd160Digest() + digest.update(this@digestRipemd160, 0, this@digestRipemd160.size) + digest.doFinal(this, 0) + } +} + +/** + * Computes the RIPEMD160 for [this] string. + */ +public fun String.digestRipemd160(): ByteArray = encodeToByteArray().digestRipemd160() diff --git a/src/main/kotlin/com/radixdlt/crypto/hash/sha256/Sha256.kt b/src/main/kotlin/com/radixdlt/crypto/hash/sha256/Sha256.kt new file mode 100644 index 0000000..7ba198e --- /dev/null +++ b/src/main/kotlin/com/radixdlt/crypto/hash/sha256/Sha256.kt @@ -0,0 +1,153 @@ +package com.radixdlt.crypto.hash.sha256 + +import com.radixdlt.crypto.hash.sha256.extensions.copy +import com.radixdlt.crypto.hash.sha256.extensions.putLong +import com.radixdlt.crypto.hash.sha256.extensions.rotateRight +import com.radixdlt.crypto.hash.sha256.extensions.toByteArray +import com.radixdlt.crypto.hash.sha256.extensions.toIntArray + +/** + * Digest Class for SHA-256. + * Original Java version at https://github.com/meyfa/java-sha256/blob/master/src/main/java/net/meyfa/sha256/Sha256.java + */ +public object Sha256 { + + private val K = intArrayOf( + 0x428a2f98, 0x71374491, -0x4a3f0431, -0x164a245b, 0x3956c25b, 0x59f111f1, -0x6dc07d5c, -0x54e3a12b, + -0x27f85568, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, -0x7f214e02, -0x6423f959, -0x3e640e8c, + -0x1b64963f, -0x1041b87a, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + -0x67c1aeae, -0x57ce3993, -0x4ffcd838, -0x40a68039, -0x391ff40d, -0x2a586eb9, 0x06ca6351, 0x14292967, + 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, -0x7e3d36d2, -0x6d8dd37b, + -0x5d40175f, -0x57e599b5, -0x3db47490, -0x3893ae5d, -0x2e6d17e7, -0x2966f9dc, -0xbf1ca7b, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, -0x7b3787ec, -0x7338fdf8, -0x6f410006, -0x5baf9315, -0x41065c09, -0x398e870e + ) + + private val H0 = intArrayOf( + 0x6a09e667, -0x4498517b, 0x3c6ef372, -0x5ab00ac6, + 0x510e527f, -0x64fa9774, 0x1f83d9ab, 0x5be0cd19 + ) + + // Working arrays + private val W = IntArray(64) + private val H = IntArray(8) + private val TEMP = IntArray(8) + + /** + * Hashes the given message with SHA-256 and returns the digest. + * + * @param message The bytes to digest. + * @return The digest's bytes. + */ + public fun digest(message: ByteArray): ByteArray { + // Let H = H0 + H0.copy(0, + H, 0, H0.size) + + // Initialize all words + val words = padMessage(message).toIntArray() + + // Enumerate all blocks (each containing 16 words) + var i = 0 + val n = words.size / 16 + while (i < n) { + + // initialize W from the block's words + words.copy(i * 16, W, 0, 16) + for (t in 16 until W.size) { + W[t] = (smallSig1(W[t - 2]) + W[t - 7] + smallSig0( + W[t - 15] + ) + W[t - 16]) + } + + // Let TEMP = H + H.copy(0, + TEMP, 0, H.size) + + // Operate on TEMP + for (t in W.indices) { + val t1 = (TEMP[7] + bigSig1(TEMP[4]) + ch( + TEMP[4], + TEMP[5], + TEMP[6] + ) + K[t] + W[t]) + val t2 = bigSig0(TEMP[0]) + maj( + TEMP[0], + TEMP[1], + TEMP[2] + ) + TEMP.copy(0, + TEMP, 1, TEMP.size - 1) + TEMP[4] += t1 + TEMP[0] = t1 + t2 + } + + // Add values in TEMP to values in H + for (t in H.indices) { + H[t] += TEMP[t] + } + + ++i + } + + return H.toByteArray() + } + + /** + * Internal method, no need to call. Pads the given message to have a length + * that is a multiple of 512 bits (64 bytes), including the addition of a + * 1-bit, k 0-bits, and the message length as a 64-bit integer. + * + * @param message The message to padMessage. + * @return A new array with the padded message bytes. + */ + internal fun padMessage(message: ByteArray): ByteArray { + val blockBits = 512 + val blockBytes = blockBits / 8 + + // new message length: original + 1-bit and padding + 8-byte length + var newMessageLength = message.size + 1 + 8 + val padBytes = blockBytes - newMessageLength % blockBytes + newMessageLength += padBytes + + // copy message to extended array + val paddedMessage = ByteArray(newMessageLength) + message.copy(0, paddedMessage, 0, message.size) + + // write 1-bit + paddedMessage[message.size] = 128.toByte() + + // skip padBytes many bytes (they are already 0) + + // write 8-byte integer describing the original message length + val lenPos = message.size + 1 + padBytes + + paddedMessage.putLong(lenPos, message.size * 8.toLong()) + + return paddedMessage + } + + private fun ch(x: Int, y: Int, z: Int): Int { + return x and y or (x.inv() and z) + } + + private fun maj(x: Int, y: Int, z: Int): Int { + return x and y or (x and z) or (y and z) + } + + private fun bigSig0(x: Int): Int { + return (x.rotateRight(2) xor x.rotateRight(13) xor x.rotateRight(22)) + } + + private fun bigSig1(x: Int): Int { + return (x.rotateRight(6) xor x.rotateRight(11) xor x.rotateRight(25)) + } + + private fun smallSig0(x: Int): Int { + return (x.rotateRight(7) xor x.rotateRight(18) xor x.ushr(3)) + } + + private fun smallSig1(x: Int): Int { + return (x.rotateRight(17) xor x.rotateRight(19) xor x.ushr(10)) + } +} diff --git a/src/main/kotlin/com/radixdlt/crypto/hash/sha256/extensions/ArrayExtensions.kt b/src/main/kotlin/com/radixdlt/crypto/hash/sha256/extensions/ArrayExtensions.kt new file mode 100644 index 0000000..1b27c88 --- /dev/null +++ b/src/main/kotlin/com/radixdlt/crypto/hash/sha256/extensions/ArrayExtensions.kt @@ -0,0 +1,10 @@ +package com.radixdlt.crypto.hash.sha256.extensions + +/** + * Converts the first 4 bytes into their integer representation following the big-endian conversion. + * @throws NumberFormatException if the array size is less than 4 + */ +internal fun Array.toInt(): Int { + if (this.size < 4) throw NumberFormatException("The array size is less than 4") + return (this[0].toUInt() shl 24) + (this[1].toUInt() shl 16) + (this[2].toUInt() shl 8) + (this[3].toUInt() shl 0) +} diff --git a/src/main/kotlin/com/radixdlt/crypto/hash/sha256/extensions/ByteArrayExtensions.kt b/src/main/kotlin/com/radixdlt/crypto/hash/sha256/extensions/ByteArrayExtensions.kt new file mode 100644 index 0000000..8fd078a --- /dev/null +++ b/src/main/kotlin/com/radixdlt/crypto/hash/sha256/extensions/ByteArrayExtensions.kt @@ -0,0 +1,39 @@ +package com.radixdlt.crypto.hash.sha256.extensions + +/** + * Writes a long split into 8 bytes. + * @param [offset] start index + * @param [value] the value to insert + * Thanks to manu0466 + */ +internal fun ByteArray.putLong(offset: Int, value: Long) { + for (i in 7 downTo 0) { + val temp = (value ushr (i * 8)).toUByte() + this[offset + 7 - i] = temp.toByte() + } +} + +/** + * Converts the given byte array into an int array via big-endian conversion (4 bytes become 1 int). + * @throws IllegalArgumentException if the byte array size is not a multiple of 4. + */ +internal fun ByteArray.toIntArray(): IntArray { + if (this.size % INT_BYTES != 0) { + throw IllegalArgumentException("Byte array length must be a multiple of $INT_BYTES") + } + + val array = IntArray(this.size / INT_BYTES) + for (i in array.indices) { + val integer = arrayOf(this[i* INT_BYTES], this[i* INT_BYTES + 1], this[i* INT_BYTES + 2], this[i* INT_BYTES + 3]) + array[i] = integer.toInt() + } + return array +} + +/** + * Copies an array from the specified source array, beginning at the + * specified position, to the specified position of the destination array. + */ +internal fun ByteArray.copy(srcPos: Int, dest: ByteArray, destPos: Int, length: Int) { + this.copyInto(dest, destPos, srcPos, srcPos + length) +} diff --git a/src/main/kotlin/com/radixdlt/crypto/hash/sha256/extensions/ByteExtensions.kt b/src/main/kotlin/com/radixdlt/crypto/hash/sha256/extensions/ByteExtensions.kt new file mode 100644 index 0000000..f14b489 --- /dev/null +++ b/src/main/kotlin/com/radixdlt/crypto/hash/sha256/extensions/ByteExtensions.kt @@ -0,0 +1,12 @@ +package com.radixdlt.crypto.hash.sha256.extensions + +/** + * Converts a Byte into an unsigned Int. + * Source: https://stackoverflow.com/questions/38651192/how-to-correctly-handle-byte-values-greater-than-127-in-kotlin + * + * TODO: Remove this once Kotlin 1.3 is released as it brings support for UInt + */ +internal fun Byte.toUInt() = when { + (toInt() < 0) -> 255 + toInt() + 1 + else -> toInt() +} diff --git a/src/main/kotlin/com/radixdlt/crypto/hash/sha256/extensions/Constants.kt b/src/main/kotlin/com/radixdlt/crypto/hash/sha256/extensions/Constants.kt new file mode 100644 index 0000000..af867df --- /dev/null +++ b/src/main/kotlin/com/radixdlt/crypto/hash/sha256/extensions/Constants.kt @@ -0,0 +1,3 @@ +package com.radixdlt.crypto.hash.sha256.extensions + +internal const val INT_BYTES = 4 diff --git a/src/main/kotlin/com/radixdlt/crypto/hash/sha256/extensions/IntArrayExtensions.kt b/src/main/kotlin/com/radixdlt/crypto/hash/sha256/extensions/IntArrayExtensions.kt new file mode 100644 index 0000000..1967a26 --- /dev/null +++ b/src/main/kotlin/com/radixdlt/crypto/hash/sha256/extensions/IntArrayExtensions.kt @@ -0,0 +1,26 @@ +package com.radixdlt.crypto.hash.sha256.extensions + +/** + * Converts the given int array into a byte array via big-endian conversion + * (1 int becomes 4 bytes). + * @return The converted array. + */ +internal fun IntArray.toByteArray(): ByteArray { + val array = ByteArray(this.size * 4) + for (i in this.indices) { + val bytes = this[i].toBytes() + array[i * 4] = bytes[0] + array[i * 4 + 1] = bytes[1] + array[i * 4 + 2] = bytes[2] + array[i * 4 + 3] = bytes[3] + } + return array +} + +/** + * Copies an array from the specified source array, beginning at the + * specified position, to the specified position of the destination array. + */ +internal fun IntArray.copy(srcPos: Int, dest: IntArray, destPos: Int, length: Int) { + this.copyInto(dest, destPos, srcPos, srcPos + length) +} diff --git a/src/main/kotlin/com/radixdlt/crypto/hash/sha256/extensions/IntExtensions.kt b/src/main/kotlin/com/radixdlt/crypto/hash/sha256/extensions/IntExtensions.kt new file mode 100644 index 0000000..6173074 --- /dev/null +++ b/src/main/kotlin/com/radixdlt/crypto/hash/sha256/extensions/IntExtensions.kt @@ -0,0 +1,23 @@ +package com.radixdlt.crypto.hash.sha256.extensions + +/** + * Returns the value obtained by rotating the two's complement binary representation of the specified [Int] value + * right by the specified number of bits. + * (Bits shifted out of the right hand, or low-order, side reenter on the left, or high-order.) + */ +internal fun Int.rotateRight(distance: Int): Int { + return this.ushr(distance) or (this shl -distance) +} + +/** + * Converts an [Int] to an array of [Byte] using the big-endian conversion. + * (The [Int] will be converted into 4 bytes) + */ +internal fun Int.toBytes(): Array { + val result = ByteArray(4) + result[0] = (this shr 24).toByte() + result[1] = (this shr 16).toByte() + result[2] = (this shr 8).toByte() + result[3] = this.toByte() + return result.toTypedArray() +} diff --git a/src/main/kotlin/com/radixdlt/crypto/hash/sha256/extensions/PublicExtensions.kt b/src/main/kotlin/com/radixdlt/crypto/hash/sha256/extensions/PublicExtensions.kt new file mode 100644 index 0000000..8b35b60 --- /dev/null +++ b/src/main/kotlin/com/radixdlt/crypto/hash/sha256/extensions/PublicExtensions.kt @@ -0,0 +1,13 @@ +package com.radixdlt.crypto.hash.sha256.extensions + +import com.radixdlt.crypto.hash.sha256.Sha256 + +/** + * Returns the SHA256 digest of this byte array. + */ +fun ByteArray.sha256(): ByteArray = Sha256.digest(this) + +/** + * Returns the SHA256 digest of this string. + */ +fun String.sha256(): ByteArray = this.encodeToByteArray().sha256() diff --git a/src/main/kotlin/com/radixdlt/crypto/kdf/PBKDF2.kt b/src/main/kotlin/com/radixdlt/crypto/kdf/PBKDF2.kt new file mode 100644 index 0000000..3f40a96 --- /dev/null +++ b/src/main/kotlin/com/radixdlt/crypto/kdf/PBKDF2.kt @@ -0,0 +1,28 @@ +package com.radixdlt.crypto.kdf + +import org.bouncycastle.crypto.Digest +import org.bouncycastle.crypto.PBEParametersGenerator.PKCS5PasswordToUTF8Bytes +import org.bouncycastle.crypto.digests.SHA256Digest +import org.bouncycastle.crypto.digests.SHA512Digest +import org.bouncycastle.crypto.generators.PKCS5S2ParametersGenerator +import org.bouncycastle.crypto.params.KeyParameter +import com.radixdlt.crypto.hash.DigestParams + +class PBKDF2 { + companion object { + fun derive(entropy: ByteArray, salt: ByteArray?, iterations: Int = 2048, digestParams: DigestParams = DigestParams.Sha512): ByteArray { + val gen = PKCS5S2ParametersGenerator(digestParams.toDigest()) + gen.init(entropy, salt, iterations) + return (gen.generateDerivedParameters(digestParams.keySize) as KeyParameter).key + } + + fun derive(entropy: CharArray, salt: ByteArray?, iterations: Int = 2048, digestParams: DigestParams = DigestParams.Sha512): ByteArray = + derive(PKCS5PasswordToUTF8Bytes(entropy), salt, iterations, digestParams) + + fun DigestParams.toDigest(): Digest = + when (this) { + DigestParams.Sha256 -> SHA256Digest() + DigestParams.Sha512 -> SHA512Digest() + } + } +} diff --git a/src/main/kotlin/com/radixdlt/crypto/mac/Hmac.kt b/src/main/kotlin/com/radixdlt/crypto/mac/Hmac.kt new file mode 100644 index 0000000..2603cf1 --- /dev/null +++ b/src/main/kotlin/com/radixdlt/crypto/mac/Hmac.kt @@ -0,0 +1,27 @@ +package com.radixdlt.crypto.mac + +import com.radixdlt.crypto.hash.DigestParams +import javax.crypto.Mac +import javax.crypto.spec.SecretKeySpec + +class Hmac { + companion object { + private lateinit var mac: Mac + + fun init(key: ByteArray, digestParams: DigestParams = DigestParams.Sha512): Companion { + val version = digestParams.toHmacVersion() + mac = Mac.getInstance(version) + val keySpec = SecretKeySpec(key, version) + mac.init(keySpec) + return this + } + + fun generate(data: ByteArray): ByteArray = + mac.doFinal(data) + + private fun DigestParams.toHmacVersion() = when(this) { + DigestParams.Sha512 -> "HmacSHA512" + DigestParams.Sha256 -> "HmacSHA256" + } + } +} diff --git a/src/main/kotlin/com/radixdlt/extensions/BigInteger.kt b/src/main/kotlin/com/radixdlt/extensions/BigInteger.kt new file mode 100644 index 0000000..9031a31 --- /dev/null +++ b/src/main/kotlin/com/radixdlt/extensions/BigInteger.kt @@ -0,0 +1,55 @@ +package com.radixdlt.extensions + +import com.radixdlt.hex.extensions.clean0xPrefix +import com.radixdlt.hex.extensions.has0xPrefix +import com.radixdlt.hex.model.HexString +import java.math.BigInteger + +fun BigInteger.toBytesPadded(length: Int): ByteArray { + val result = ByteArray(length) + val bytes = toByteArray() + + val offset = if (bytes[0].toInt() == 0) 1 else 0 + + if (bytes.size - offset > length) { + throw RuntimeException("Input is too large to put in byte array of size $length") + } + + val destOffset = length - bytes.size + offset + return bytes.copyInto(result, destinationOffset = destOffset, startIndex = offset) +} + +fun BigInteger.toHexStringNoPrefix(): String = toString(16) +fun BigInteger.toHexString(): String = "0x" + toString(16) + +fun BigInteger.toHexStringZeroPadded(size: Int, withPrefix: Boolean = true): String { + var result = toHexStringNoPrefix() + + val length = result.length + if (length > size) { + throw UnsupportedOperationException("Value $result is larger then length $size") + } else if (signum() < 0) { + throw UnsupportedOperationException("Value cannot be negative") + } + + if (length < size) { + result = "0".repeat(size - length) + result + } + + return if (withPrefix) { + "0x$result" + } else { + result + } +} + +fun HexString.hexToBigInteger() = BigInteger(clean0xPrefix().string, 16) + +fun HexString.maybeHexToBigInteger() = if (has0xPrefix()) { + BigInteger(clean0xPrefix().string, 16) +} else { + BigInteger(string) +} + +fun ByteArray.toBigInteger(offset: Int, length: Int) = BigInteger(1, copyOfRange(offset, offset + length)) +fun ByteArray.toBigInteger() = BigInteger(1, this) diff --git a/src/main/kotlin/com/radixdlt/extensions/BitArray.kt b/src/main/kotlin/com/radixdlt/extensions/BitArray.kt new file mode 100644 index 0000000..a2ca17a --- /dev/null +++ b/src/main/kotlin/com/radixdlt/extensions/BitArray.kt @@ -0,0 +1,22 @@ +package com.radixdlt.extensions + +import kotlin.experimental.or + +fun ByteArray.toBitArray(): BooleanArray { + val bits = BooleanArray(this.size * 8) + for (byteIndex in this.indices) + for (bitIndex in 0..7) { + bits[byteIndex * 8 + bitIndex] = (1 shl (7 - bitIndex)) and this[byteIndex].toInt() != 0 + } + return bits +} + +fun BooleanArray.toByteArray(len : Int = this.size / 8): ByteArray { + val result = ByteArray(len) + for (byteIndex in result.indices) + for (bitIndex in 0..7) + if (this[byteIndex * 8 + bitIndex]) { + result[byteIndex] = result[byteIndex] or (1 shl (7 - bitIndex)).toByte() + } + return result +} \ No newline at end of file diff --git a/src/main/kotlin/com/radixdlt/extensions/ByteArray.kt b/src/main/kotlin/com/radixdlt/extensions/ByteArray.kt new file mode 100644 index 0000000..1113b24 --- /dev/null +++ b/src/main/kotlin/com/radixdlt/extensions/ByteArray.kt @@ -0,0 +1,8 @@ +package com.radixdlt.extensions + +fun ByteArray.toFixedLengthByteArray(fixedSize: Int, fillByte: Byte = 0) = if (size == fixedSize) { + this +} else { + require(size < fixedSize) { "ByteArray too big - max size is $fixedSize but got $size" } + ByteArray(fixedSize) { getOrNull(size - fixedSize + it) ?: fillByte } +} diff --git a/src/main/kotlin/com/radixdlt/extensions/ByteList.kt b/src/main/kotlin/com/radixdlt/extensions/ByteList.kt new file mode 100644 index 0000000..017d955 --- /dev/null +++ b/src/main/kotlin/com/radixdlt/extensions/ByteList.kt @@ -0,0 +1,5 @@ +package com.radixdlt.extensions + +fun List.startsWith(prefix: List) + = size >= prefix.size && + prefix.indices.all { this[it] == prefix[it] } \ No newline at end of file diff --git a/src/main/kotlin/com/radixdlt/extensions/Int.kt b/src/main/kotlin/com/radixdlt/extensions/Int.kt new file mode 100644 index 0000000..ab3b92f --- /dev/null +++ b/src/main/kotlin/com/radixdlt/extensions/Int.kt @@ -0,0 +1,12 @@ +package com.radixdlt.extensions + +fun Int.toByteArray() = ByteArray(4) { i -> + shr(8 * (3 - i)).toByte() +} + +fun Int.toMinimalByteArray() = toByteArray().let { + it.copyOfRange(it.minimalStart(), 4) +} + +private fun ByteArray.minimalStart() = indexOfFirst { it != 0.toByte() }.let { if (it == -1) 4 else it } +fun ByteArray.removeLeadingZero() = if (first() == 0.toByte()) copyOfRange(1, size) else this \ No newline at end of file diff --git a/src/main/kotlin/com/radixdlt/hex/Hex.kt b/src/main/kotlin/com/radixdlt/hex/Hex.kt new file mode 100644 index 0000000..4660b15 --- /dev/null +++ b/src/main/kotlin/com/radixdlt/hex/Hex.kt @@ -0,0 +1,61 @@ +package com.radixdlt.hex + + +/** + * Represents all the chars used for nibble + */ +private const val CHARS = "0123456789abcdef" + +/** + * Encodes the given byte value as an hexadecimal character. + */ +fun encode(value: Byte): String { + return CHARS[value.toInt().shr(4) and 0x0f].toString() + CHARS[value.toInt().and(0x0f)].toString() +} + +/** + * Encodes the given byte array value to its hexadecimal representations, and prepends the given prefix to it. + * + * Note that by default the 0x prefix is prepended to the result of the conversion. + * If you want to have the representation without the 0x prefix, pass to this method an empty prefix. + */ +fun encode(value: ByteArray, prefix: String = "0x"): String { + return prefix + value.joinToString("") { encode(it) } +} + +/** + * Converts the given ch into its integer representation considering it as an hexadecimal character. + */ +private fun hexToBin(ch: Char): Int = when (ch) { + in '0'..'9' -> ch - '0' + in 'A'..'F' -> ch - 'A' + 10 + in 'a'..'f' -> ch - 'a' + 10 + else -> throw(IllegalArgumentException("'$ch' is not a valid hex character")) +} + +/** + * Parses the given value reading it as an hexadecimal string, and returns its byte array representation. + * + * Note that either 0x-prefixed string and no-prefixed hex strings are supported. + * + * @throws IllegalArgumentException if the value is not an hexadecimal string. + */ +fun decode(value: String): ByteArray { + // An hex string must always have length multiple of 2 + if (value.length % 2 != 0) { + throw IllegalArgumentException("hex-string must have an even number of digits (nibbles)") + } + + // Remove the 0x prefix if it is set + val cleanInput = if (value.startsWith("0x")) value.substring(2) else value + + return ByteArray(cleanInput.length / 2).apply { + var i = 0 + while (i < cleanInput.length) { + this[i / 2] = ((hexToBin(cleanInput[i]) shl 4) + hexToBin( + cleanInput[i + 1] + )).toByte() + i += 2 + } + } +} diff --git a/src/main/kotlin/com/radixdlt/hex/extensions/ByteArrayExtensions.kt b/src/main/kotlin/com/radixdlt/hex/extensions/ByteArrayExtensions.kt new file mode 100644 index 0000000..12b487a --- /dev/null +++ b/src/main/kotlin/com/radixdlt/hex/extensions/ByteArrayExtensions.kt @@ -0,0 +1,18 @@ +package com.radixdlt.hex.extensions + +import com.radixdlt.hex.encode + +/** + * Converts [this] [ByteArray] into its hexadecimal string representation prepending to it the given [prefix]. + * + * Note that by default the 0x prefix is prepended to the result of the conversion. + * If you want to have the representation without the 0x prefix, use the [toNoPrefixHexString] method or + * pass to this method an empty [prefix]. + */ +fun ByteArray.toHexString(prefix: String = "0x"): String = encode(this, prefix) + +/** + * Converts [this] [ByteArray] into its hexadecimal representation without prepending any prefix to it. + */ +fun ByteArray.toNoPrefixHexString(): String = toHexString(prefix = "") + diff --git a/src/main/kotlin/com/radixdlt/hex/extensions/ByteCollectionExtensions.kt b/src/main/kotlin/com/radixdlt/hex/extensions/ByteCollectionExtensions.kt new file mode 100644 index 0000000..c14cc61 --- /dev/null +++ b/src/main/kotlin/com/radixdlt/hex/extensions/ByteCollectionExtensions.kt @@ -0,0 +1,17 @@ +package com.radixdlt.hex.extensions + +import com.radixdlt.hex.encode + +/** + * Converts [this] [Collection] of bytes into its hexadecimal string representation prepending to it the given [prefix]. + * + * Note that by default the 0x prefix is prepended to the result of the conversion. + * If you want to have the representation without the 0x prefix, use the [toNoPrefixHexString] method or + * pass to this method an empty [prefix]. + */ +fun Collection.toHexString(prefix: String = "0x"): String = encode(this.toByteArray(), prefix) + +/** + * Converts [this] [Collection] of bytes into its hexadecimal representation without prepending any prefix to it. + */ +fun Collection.toNoPrefixHexString(): String = toHexString("") \ No newline at end of file diff --git a/src/main/kotlin/com/radixdlt/hex/extensions/HexStringExtensions.kt b/src/main/kotlin/com/radixdlt/hex/extensions/HexStringExtensions.kt new file mode 100644 index 0000000..9399bab --- /dev/null +++ b/src/main/kotlin/com/radixdlt/hex/extensions/HexStringExtensions.kt @@ -0,0 +1,50 @@ +package com.radixdlt.hex.extensions + +import com.radixdlt.hex.decode +import com.radixdlt.hex.model.HexString + +internal val HEX_REGEX = Regex("(0[xX])?[0-9a-fA-F]*") + +/** + * Parses [this] [String] as an hexadecimal value and returns its [ByteArray] representation. + * + * Note that either 0x-prefixed string and no-prefixed hex strings are supported. + * + * @throws IllegalArgumentException if [this] is not an hexadecimal string. + */ +fun HexString.hexToByteArray(): ByteArray = decode(string) + +/** + * Returns `true` if and only if [this] value starts with the `0x` prefix. + */ +fun HexString.has0xPrefix(): Boolean = string.startsWith("0x") + +/** + * Returns a new [String] obtained by prepends the `0x` prefix to [this] value, + * without looking if it already is prefixed by it. + * + * Examples: + * ```kotlin + * val myString = HexString("123") + * assertEquals("0x123", myString.prepend0xPrefix().string) + * assertEquals("0x0x123", myString.prepend0xPrefix().prepend0xPrefix().string) + * ``` + */ +fun HexString.prepend0xPrefix(): HexString = HexString(if (has0xPrefix()) string else "0x$string") + +/** + * Returns a new [String] obtained by removing the first occurrence of the `0x` prefix from [this] string, if it has it. + * + * Examples: + * ```kotlin + * assertEquals("123", HexString("123").clean0xPrefix().string) + * assertEquals("123", HexString("0x123").clean0xPrefix().string) + * assertEquals("0x123", HexString("0x0x123").clean0xPrefix().string) + * ``` + */ +fun HexString.clean0xPrefix(): HexString = HexString(if (has0xPrefix()) string.substring(2) else string) + +/** + * Returns if a given string is a valid hex-string - either with or without 0x prefix + */ +fun HexString.isValidHex(): Boolean = HEX_REGEX.matches(string) \ No newline at end of file diff --git a/src/main/kotlin/com/radixdlt/hex/model/HexString.kt b/src/main/kotlin/com/radixdlt/hex/model/HexString.kt new file mode 100644 index 0000000..c0f38cd --- /dev/null +++ b/src/main/kotlin/com/radixdlt/hex/model/HexString.kt @@ -0,0 +1,6 @@ +package com.radixdlt.hex.model + +import kotlin.jvm.JvmInline + +@JvmInline +value class HexString(val string: String) diff --git a/src/main/kotlin/com/radixdlt/model/Constants.kt b/src/main/kotlin/com/radixdlt/model/Constants.kt new file mode 100644 index 0000000..b80c5ef --- /dev/null +++ b/src/main/kotlin/com/radixdlt/model/Constants.kt @@ -0,0 +1,4 @@ +package com.radixdlt.model + +const val PRIVATE_KEY_SIZE = 32 +const val PUBLIC_KEY_SIZE = 64 diff --git a/src/main/kotlin/com/radixdlt/model/ECKeyPair.kt b/src/main/kotlin/com/radixdlt/model/ECKeyPair.kt new file mode 100644 index 0000000..28479fb --- /dev/null +++ b/src/main/kotlin/com/radixdlt/model/ECKeyPair.kt @@ -0,0 +1,52 @@ +package com.radixdlt.model + +import com.radixdlt.crypto.ec.EllipticCurveType +import com.radixdlt.extensions.hexToBigInteger +import com.radixdlt.extensions.toBigInteger +import com.radixdlt.hex.model.HexString +import com.radixdlt.slip10.model.ExtendedKey +import java.math.BigInteger + +class PrivateKey(val key: BigInteger, val curveType: EllipticCurveType) { + constructor(privateKey: ByteArray, curveType: EllipticCurveType) : this(privateKey.toBigInteger(), curveType) + constructor(hex: HexString, curveType: EllipticCurveType) : this(hex.hexToBigInteger(), curveType) + + override fun toString() = key.toString() + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + + other as PrivateKey + + if (key != other.key) return false + if (curveType != other.curveType) return false + + return true + } +} + +class PublicKey(val key: BigInteger, val curveType: EllipticCurveType) { + constructor(publicKey: ByteArray, curveType: EllipticCurveType) : this(publicKey.toBigInteger(), curveType) + constructor(publicKey: HexString, curveType: EllipticCurveType) : this(publicKey.hexToBigInteger(), curveType) + + override fun toString() = key.toString() + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + + other as PublicKey + + if (key != other.key) return false + if (curveType != other.curveType) return false + + return true + } +} + +data class ECKeyPair(val privateKey: PrivateKey, val publicKey: PublicKey) + +fun ECKeyPair.curveType(): EllipticCurveType { + return privateKey.curveType +} diff --git a/src/main/kotlin/com/radixdlt/slip10/BIP32.kt b/src/main/kotlin/com/radixdlt/slip10/BIP32.kt new file mode 100644 index 0000000..3e432c0 --- /dev/null +++ b/src/main/kotlin/com/radixdlt/slip10/BIP32.kt @@ -0,0 +1,116 @@ +@file:JvmName("BIP32") + +package com.radixdlt.slip10 + +import com.radixdlt.slip10.model.CHAINCODE_SIZE +import com.radixdlt.slip10.model.ExtendedKey +import com.radixdlt.slip10.model.Seed +import com.radixdlt.crypto.getCompressedPublicKey +import com.radixdlt.crypto.mac.Hmac +import com.radixdlt.crypto.* +import com.radixdlt.extensions.toBytesPadded +import com.radixdlt.model.ECKeyPair +import com.radixdlt.model.PRIVATE_KEY_SIZE +import com.radixdlt.model.PrivateKey +import com.radixdlt.bip44.BIP44 +import com.radixdlt.bip44.BIP44Element +import com.radixdlt.crypto.ec.EllipticCurveType +import com.radixdlt.crypto.ec.toEllipticCurve +import com.radixdlt.crypto.hash.ripemd160.extensions.digestRipemd160 +import com.radixdlt.crypto.hash.sha256.extensions.sha256 +import com.radixdlt.model.curveType +import java.math.BigInteger +import java.nio.ByteBuffer +import java.nio.ByteOrder +import java.security.InvalidKeyException +import java.security.KeyException +import java.security.NoSuchAlgorithmException +import java.security.NoSuchProviderException + +fun Seed.toKey(pathString: String, curveType: EllipticCurveType = EllipticCurveType.Secp256k1, testnet: Boolean = false) = BIP44(pathString).path + .fold(toExtendedKey(curveType = curveType, testnet = testnet)) { current, bip44Element -> + current.generateChildKey(bip44Element) + } + + +/** + * Gets an [Int] representation of public key hash + * @return an Int built from the first 4 bytes of the result of hash160 over the compressed public key + */ +fun ECKeyPair.computeFingerPrint(): Int { + val pubKeyHash = getCompressedPublicKey() + .sha256() + .digestRipemd160() + var fingerprint = 0 + for (i in 0..3) { + fingerprint = fingerprint shl 8 + fingerprint = fingerprint or (pubKeyHash[i].toInt() and 0xff) + } + return fingerprint +} + +fun ExtendedKey.generateChildKey(element: BIP44Element): ExtendedKey { + try { + require(!(element.hardened && keyPair.privateKey.key == BigInteger.ZERO)) { + "need private key for private generation using hardened paths" + } + val mac = Hmac.init(chainCode) + + val extended: ByteArray + val pub = keyPair.getCompressedPublicKey() + if (element.hardened) { + val privateKeyPaddedBytes = keyPair.privateKey.key.toBytesPadded(PRIVATE_KEY_SIZE) + + extended = ByteBuffer + .allocate(privateKeyPaddedBytes.size + 5) + .order(ByteOrder.BIG_ENDIAN) + .put(0) + .put(privateKeyPaddedBytes) + .putInt(element.numberWithHardeningFlag) + .array() + } else { + //non-hardened + extended = ByteBuffer + .allocate(pub.size + 4) + .order(ByteOrder.BIG_ENDIAN) + .put(pub) + .putInt(element.numberWithHardeningFlag) + .array() + } + val lr = mac.generate(extended) + val l = lr.copyOfRange(0, PRIVATE_KEY_SIZE) + val r = lr.copyOfRange(PRIVATE_KEY_SIZE, PRIVATE_KEY_SIZE + CHAINCODE_SIZE) + + val curveType = keyPair.curveType() + val curve = keyPair.curveType().toEllipticCurve() + + val m = BigInteger(1, l) + if (m >= curve.n) { + throw KeyException("Child key derivation resulted in a key with higher modulus. Suggest deriving the next increment.") + } + + return if (keyPair.privateKey.key != BigInteger.ZERO) { + val k = m.add(keyPair.privateKey.key).mod(curve.n) + if (k == BigInteger.ZERO) { + throw KeyException("Child key derivation resulted in zeros. Suggest deriving the next increment.") + } + ExtendedKey(PrivateKey(k, curveType).toECKeyPair(), r, (depth + 1).toByte(), keyPair.computeFingerPrint(), element.numberWithHardeningFlag, versionBytes) + } else { + val q = curve.g.mul(m).add(curve.decodePoint(pub)).normalize() + if (q.isInfinity()) { + throw KeyException("Child key derivation resulted in zeros. Suggest deriving the next increment.") + } + val point = curve.createPoint(q.x, q.y) + + ExtendedKey(ECKeyPair(PrivateKey(BigInteger.ZERO, curveType), point.toPublicKey(curveType)), r, (depth + 1).toByte(), keyPair.computeFingerPrint(), element.numberWithHardeningFlag, versionBytes) + } + } catch (e: NoSuchAlgorithmException) { + throw KeyException(e) + } catch (e: NoSuchProviderException) { + throw KeyException(e) + } catch (e: InvalidKeyException) { + throw KeyException(e) + } + +} + diff --git a/src/main/kotlin/com/radixdlt/slip10/Converter.kt b/src/main/kotlin/com/radixdlt/slip10/Converter.kt new file mode 100644 index 0000000..65eeb53 --- /dev/null +++ b/src/main/kotlin/com/radixdlt/slip10/Converter.kt @@ -0,0 +1,95 @@ +package com.radixdlt.slip10 + +import com.radixdlt.slip10.model.* +import com.radixdlt.crypto.mac.Hmac +import com.radixdlt.crypto.toECKeyPair +import com.radixdlt.model.ECKeyPair +import com.radixdlt.model.PRIVATE_KEY_SIZE +import com.radixdlt.model.PrivateKey +import com.radixdlt.model.PublicKey +import com.radixdlt.crypto.base58.decodeBase58WithChecksum +import com.radixdlt.crypto.ec.EllipticCurveType +import com.radixdlt.crypto.ec.toEllipticCurve +import com.radixdlt.hex.extensions.toNoPrefixHexString +import java.math.BigInteger +import java.nio.ByteBuffer +import java.nio.ByteOrder +import java.security.InvalidKeyException +import java.security.KeyException +import java.security.NoSuchAlgorithmException +import java.security.NoSuchProviderException + +fun Seed.toNoPrefixHexString(): String { + return seed.toNoPrefixHexString() +} + +fun Seed.toExtendedKey(publicKeyOnly: Boolean = false, curveType: EllipticCurveType = EllipticCurveType.Secp256k1, testnet: Boolean = false): ExtendedKey { + try { + val lr = Hmac.init(curveType.toHMacKey()).generate(seed) + val l = lr.copyOfRange(0, PRIVATE_KEY_SIZE) + val r = lr.copyOfRange(PRIVATE_KEY_SIZE, PRIVATE_KEY_SIZE + CHAINCODE_SIZE) + val m = BigInteger(1, l) + if (m >= curveType.toEllipticCurve().n) { + throw KeyException("Master key creation resulted in a key with higher modulus. Suggest deriving the next increment.") + } + val keyPair = PrivateKey(l, curveType).toECKeyPair() + return if (publicKeyOnly) { + val pubKeyPair = ECKeyPair(PrivateKey(BigInteger.ZERO, curveType), keyPair.publicKey) + ExtendedKey(pubKeyPair, r, 0, 0, 0, if (testnet) tpub else xpub) + } else { + ExtendedKey(keyPair, r, 0, 0, 0, if (testnet) tprv else xprv) + } + } catch (e: NoSuchAlgorithmException) { + throw KeyException(e) + } catch (e: NoSuchProviderException) { + throw KeyException(e) + } catch (e: InvalidKeyException) { + throw KeyException(e) + } + +} + + +fun XPriv.toExtendedKey(curveType: EllipticCurveType): ExtendedKey { + val data = xPriv.decodeBase58WithChecksum() + if (data.size != EXTENDED_KEY_SIZE) { + throw KeyException("invalid extended key") + } + + val buff = ByteBuffer + .wrap(data) + .order(ByteOrder.BIG_ENDIAN) + + val versionBytes = ByteArray(4) + + buff.get(versionBytes) + + val hasPrivate = when { + versionBytes.contentEquals(xprv) || versionBytes.contentEquals(tprv) -> true + versionBytes.contentEquals(xpub) || versionBytes.contentEquals(tpub) -> false + else -> throw KeyException("invalid version bytes for an extended key") + } + + val depth = buff.get() + val parent = buff.int + val sequence = buff.int + + val chainCode = ByteArray(PRIVATE_KEY_SIZE) + buff.get(chainCode) + + val keyPair = if (hasPrivate) { + buff.get() // ignore the leading 0 + val privateBytes = ByteArray(PRIVATE_KEY_SIZE) + buff.get(privateBytes) + PrivateKey(privateBytes, curveType).toECKeyPair() + } else { + val compressedPublicBytes = ByteArray(COMPRESSED_PUBLIC_KEY_SIZE) + buff.get(compressedPublicBytes) + val uncompressedPublicBytes = curveType.toEllipticCurve().decompressKey(compressedPublicBytes) + ECKeyPair( + PrivateKey(BigInteger.ZERO, curveType), + PublicKey(BigInteger(1, uncompressedPublicBytes), curveType) + ) + } + return ExtendedKey(keyPair, chainCode, depth, parent, sequence, versionBytes) +} diff --git a/src/main/kotlin/com/radixdlt/slip10/Slip10Curve.kt b/src/main/kotlin/com/radixdlt/slip10/Slip10Curve.kt new file mode 100644 index 0000000..796eb62 --- /dev/null +++ b/src/main/kotlin/com/radixdlt/slip10/Slip10Curve.kt @@ -0,0 +1,11 @@ +package com.radixdlt.slip10 + +import com.radixdlt.crypto.ec.EllipticCurveType + +fun EllipticCurveType.toHMacKey(): ByteArray { + return when (this) { + EllipticCurveType.Secp256k1 -> "Bitcoin seed".toByteArray() + EllipticCurveType.P256 -> "Nist256p1 seed".toByteArray() + EllipticCurveType.Ed25519 -> "ed25519 seed".toByteArray() + } +} diff --git a/src/main/kotlin/com/radixdlt/slip10/model/Constants.kt b/src/main/kotlin/com/radixdlt/slip10/model/Constants.kt new file mode 100644 index 0000000..ee944e0 --- /dev/null +++ b/src/main/kotlin/com/radixdlt/slip10/model/Constants.kt @@ -0,0 +1,12 @@ +package com.radixdlt.slip10.model + +import com.radixdlt.model.PRIVATE_KEY_SIZE + + +internal const val CHAINCODE_SIZE = PRIVATE_KEY_SIZE +internal const val COMPRESSED_PUBLIC_KEY_SIZE = PRIVATE_KEY_SIZE + 1 +internal const val EXTENDED_KEY_SIZE: Int = 78 +internal val xprv = byteArrayOf(0x04, 0x88.toByte(), 0xAD.toByte(), 0xE4.toByte()) +internal val xpub = byteArrayOf(0x04, 0x88.toByte(), 0xB2.toByte(), 0x1E.toByte()) +internal val tprv = byteArrayOf(0x04, 0x35.toByte(), 0x83.toByte(), 0x94.toByte()) +internal val tpub = byteArrayOf(0x04, 0x35.toByte(), 0x87.toByte(), 0xCF.toByte()) diff --git a/src/main/kotlin/com/radixdlt/slip10/model/ExtendedKey.kt b/src/main/kotlin/com/radixdlt/slip10/model/ExtendedKey.kt new file mode 100644 index 0000000..9e303d3 --- /dev/null +++ b/src/main/kotlin/com/radixdlt/slip10/model/ExtendedKey.kt @@ -0,0 +1,74 @@ +package com.radixdlt.slip10.model + +import com.radixdlt.crypto.getCompressedPublicKey +import com.radixdlt.extensions.toBytesPadded +import com.radixdlt.model.ECKeyPair +import com.radixdlt.model.PRIVATE_KEY_SIZE +import com.radixdlt.crypto.base58.encodeToBase58WithChecksum +import java.io.IOException +import java.math.BigInteger +import java.nio.ByteBuffer +import java.security.KeyException + + +data class ExtendedKey(val keyPair: ECKeyPair, + internal val chainCode: ByteArray, + internal val depth: Byte, + internal val parentFingerprint: Int, + internal val sequence: Int, + internal val versionBytes: ByteArray) { + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + + other as ExtendedKey + + if (keyPair != other.keyPair) return false + if (!versionBytes.contentEquals(other.versionBytes)) return false + if (!chainCode.contentEquals(other.chainCode)) return false + if (depth != other.depth) return false + if (parentFingerprint != other.parentFingerprint) return false + if (sequence != other.sequence) return false + + return true + } + + override fun hashCode(): Int { + var result = keyPair.hashCode() + result = 31 * result + versionBytes.contentHashCode() + result = 31 * result + chainCode.contentHashCode() + result = 31 * result + depth + result = 31 * result + parentFingerprint + result = 31 * result + sequence + return result + } + + fun serialize(publicKeyOnly: Boolean = false): String { + val out = ByteBuffer.allocate(EXTENDED_KEY_SIZE) + try { + + if (!publicKeyOnly && !(versionBytes contentEquals xprv) && !(versionBytes contentEquals tprv)) + throw KeyException("The extended version bytes dedicated to public keys. Suggest using publicKeyOnly mode") + + if (!publicKeyOnly && keyPair.privateKey.key == BigInteger.ZERO) + throw KeyException("The extended key doesn't provide any private key. Suggest using publicKeyOnly mode") + + out.put(if (publicKeyOnly && versionBytes contentEquals xprv) xpub else if (publicKeyOnly && versionBytes contentEquals tprv) tpub else versionBytes) + out.put(depth) + out.putInt(parentFingerprint) + out.putInt(sequence) + out.put(chainCode) + if (publicKeyOnly) { + out.put(keyPair.getCompressedPublicKey()) + } else { + out.put(0x00) + out.put(keyPair.privateKey.key.toBytesPadded(PRIVATE_KEY_SIZE)) + } + } catch (e: IOException) { + } + + return out.array().encodeToBase58WithChecksum() + } + +} diff --git a/src/main/kotlin/com/radixdlt/slip10/model/Seed.kt b/src/main/kotlin/com/radixdlt/slip10/model/Seed.kt new file mode 100644 index 0000000..cd1ec16 --- /dev/null +++ b/src/main/kotlin/com/radixdlt/slip10/model/Seed.kt @@ -0,0 +1,4 @@ +package com.radixdlt.slip10.model + +@JvmInline +value class Seed(val seed: ByteArray) diff --git a/src/main/kotlin/com/radixdlt/slip10/model/XPriv.kt b/src/main/kotlin/com/radixdlt/slip10/model/XPriv.kt new file mode 100644 index 0000000..a782e3b --- /dev/null +++ b/src/main/kotlin/com/radixdlt/slip10/model/XPriv.kt @@ -0,0 +1,4 @@ +package com.radixdlt.slip10.model + +@JvmInline +value class XPriv(val xPriv: String) \ No newline at end of file diff --git a/src/test/kotlin/com/radixdlt/bip39/MnemonicTest.kt b/src/test/kotlin/com/radixdlt/bip39/MnemonicTest.kt new file mode 100644 index 0000000..3fc0e69 --- /dev/null +++ b/src/test/kotlin/com/radixdlt/bip39/MnemonicTest.kt @@ -0,0 +1,263 @@ +package com.radixdlt.bip39 + +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Assertions.assertThrows +import org.junit.jupiter.api.Test +import com.radixdlt.slip10.model.Seed +import com.radixdlt.bip39.model.MnemonicWords +import com.radixdlt.bip39.wordlists.WORDLIST_ENGLISH +import com.radixdlt.hex.extensions.hexToByteArray +import com.radixdlt.hex.model.HexString + +/** + * Test batch for mnemonic phrases and the keys they generate. + * + * The test vectors used are the ones described in [bip39](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki) + */ +class MnemonicTest { + + @Test + fun throwsOnWrongEntropySize() { + assertThrows(IllegalArgumentException::class.java) { + generateMnemonic(123, WORDLIST_ENGLISH) + } + } + + @Test + fun generatesValidPhrases() { + + (1..100).forEach { + (1..16).map { generateMnemonic(it * 32, WORDLIST_ENGLISH) } + .forEach { + val isValid = MnemonicWords(it).validate(WORDLIST_ENGLISH) + if (!isValid) { + throw RuntimeException("failed to validate $it") + } + } + } + } + + @Test + fun throwsOnWrongNumberOfWords() { + assertThrows(IllegalArgumentException::class.java) { + mnemonicToEntropy("legal winner thank year", WORDLIST_ENGLISH) + } + } + + @Test + fun throwsOnEmptyString() { + assertThrows(IllegalArgumentException::class.java) { + mnemonicToEntropy("", WORDLIST_ENGLISH) + } + } + + @Test + fun throwsOnWrongChecksum() { + assertThrows(IllegalArgumentException::class.java) { + mnemonicToEntropy("legal winner thank year wave sausage worth useful legal winner thank thank", WORDLIST_ENGLISH) + } + } + + @Test + fun mnemonicToSeed() { + testData.forEach { + + val expectedSeed = Seed(HexString(it.seed).hexToByteArray()) + val actualSeed = MnemonicWords(it.phrase).toSeed("TREZOR") + + assertThat(expectedSeed.seed).isEqualTo(actualSeed.seed) + } + + } + + @Test + fun mnemonicToEntropy() { + testData.forEach { + + val expectedEntropy = HexString(it.entropy).hexToByteArray() + val actualEntropy = mnemonicToEntropy(it.phrase, WORDLIST_ENGLISH) + + assertThat(expectedEntropy).isEqualTo(actualEntropy) + } + } + + @Test + fun entropyToMnemonic() { + testData.forEach { + val entropy = HexString(it.entropy).hexToByteArray() + val actualPhrase = entropyToMnemonic(entropy, WORDLIST_ENGLISH) + + assertThat(it.phrase).isEqualTo(actualPhrase) + } + } + + @Test + fun mnemonicToMasterKey() { + testData.forEach { + val gen = MnemonicWords(it.phrase).toKey("m/", "TREZOR") + assertThat(it.masterKey).isEqualTo(gen.serialize()) + } + + } + + @Test + fun mnemonicVerify() { + val phraseGood = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about" + val badChecksum = "about about about about about about about about about about about about" + val missingWords = "hello world" + + assertThat(MnemonicWords(phraseGood).validate(WORDLIST_ENGLISH)).isTrue() + assertThat(MnemonicWords(badChecksum).validate(WORDLIST_ENGLISH)).isFalse() + assertThat(MnemonicWords(missingWords).validate(WORDLIST_ENGLISH)).isFalse() + } + + data class MnemonicTestData(val entropy: String, val phrase: String, val seed: String, val masterKey: String) + + private val testData = arrayOf( + MnemonicTestData( + "00000000000000000000000000000000", + "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about", + "c55257c360c07c72029aebc1b53c05ed0362ada38ead3e3e9efa3708e53495531f09a6987599d18264c1e1c92f2cf141630c7a3c4ab7c81b2f001698e7463b04", + "xprv9s21ZrQH143K3h3fDYiay8mocZ3afhfULfb5GX8kCBdno77K4HiA15Tg23wpbeF1pLfs1c5SPmYHrEpTuuRhxMwvKDwqdKiGJS9XFKzUsAF" + ), + MnemonicTestData( + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f", + "legal winner thank year wave sausage worth useful legal winner thank yellow", + "2e8905819b8723fe2c1d161860e5ee1830318dbf49a83bd451cfb8440c28bd6fa457fe1296106559a3c80937a1c1069be3a3a5bd381ee6260e8d9739fce1f607", + "xprv9s21ZrQH143K2gA81bYFHqU68xz1cX2APaSq5tt6MFSLeXnCKV1RVUJt9FWNTbrrryem4ZckN8k4Ls1H6nwdvDTvnV7zEXs2HgPezuVccsq" + ), + MnemonicTestData( + "80808080808080808080808080808080", + "letter advice cage absurd amount doctor acoustic avoid letter advice cage above", + "d71de856f81a8acc65e6fc851a38d4d7ec216fd0796d0a6827a3ad6ed5511a30fa280f12eb2e47ed2ac03b5c462a0358d18d69fe4f985ec81778c1b370b652a8", + "xprv9s21ZrQH143K2shfP28KM3nr5Ap1SXjz8gc2rAqqMEynmjt6o1qboCDpxckqXavCwdnYds6yBHZGKHv7ef2eTXy461PXUjBFQg6PrwY4Gzq" + ), + MnemonicTestData( + "ffffffffffffffffffffffffffffffff", + "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo wrong", + "ac27495480225222079d7be181583751e86f571027b0497b5b5d11218e0a8a13332572917f0f8e5a589620c6f15b11c61dee327651a14c34e18231052e48c069", + "xprv9s21ZrQH143K2V4oox4M8Zmhi2Fjx5XK4Lf7GKRvPSgydU3mjZuKGCTg7UPiBUD7ydVPvSLtg9hjp7MQTYsW67rZHAXeccqYqrsx8LcXnyd" + ), + MnemonicTestData( + "000000000000000000000000000000000000000000000000", + "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon agent", + "035895f2f481b1b0f01fcf8c289c794660b289981a78f8106447707fdd9666ca06da5a9a565181599b79f53b844d8a71dd9f439c52a3d7b3e8a79c906ac845fa", + "xprv9s21ZrQH143K3mEDrypcZ2usWqFgzKB6jBBx9B6GfC7fu26X6hPRzVjzkqkPvDqp6g5eypdk6cyhGnBngbjeHTe4LsuLG1cCmKJka5SMkmU" + ), + MnemonicTestData( + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f", + "legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal will", + "f2b94508732bcbacbcc020faefecfc89feafa6649a5491b8c952cede496c214a0c7b3c392d168748f2d4a612bada0753b52a1c7ac53c1e93abd5c6320b9e95dd", + "xprv9s21ZrQH143K3Lv9MZLj16np5GzLe7tDKQfVusBni7toqJGcnKRtHSxUwbKUyUWiwpK55g1DUSsw76TF1T93VT4gz4wt5RM23pkaQLnvBh7" + ), + MnemonicTestData( + "808080808080808080808080808080808080808080808080", + "letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter always", + "107d7c02a5aa6f38c58083ff74f04c607c2d2c0ecc55501dadd72d025b751bc27fe913ffb796f841c49b1d33b610cf0e91d3aa239027f5e99fe4ce9e5088cd65", + "xprv9s21ZrQH143K3VPCbxbUtpkh9pRG371UCLDz3BjceqP1jz7XZsQ5EnNkYAEkfeZp62cDNj13ZTEVG1TEro9sZ9grfRmcYWLBhCocViKEJae" + ), + MnemonicTestData( + "ffffffffffffffffffffffffffffffffffffffffffffffff", + "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo when", + "0cd6e5d827bb62eb8fc1e262254223817fd068a74b5b449cc2f667c3f1f985a76379b43348d952e2265b4cd129090758b3e3c2c49103b5051aac2eaeb890a528", + "xprv9s21ZrQH143K36Ao5jHRVhFGDbLP6FCx8BEEmpru77ef3bmA928BxsqvVM27WnvvyfWywiFN8K6yToqMaGYfzS6Db1EHAXT5TuyCLBXUfdm" + ), + MnemonicTestData( + "0000000000000000000000000000000000000000000000000000000000000000", + "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon art", + "bda85446c68413707090a52022edd26a1c9462295029f2e60cd7c4f2bbd3097170af7a4d73245cafa9c3cca8d561a7c3de6f5d4a10be8ed2a5e608d68f92fcc8", + "xprv9s21ZrQH143K32qBagUJAMU2LsHg3ka7jqMcV98Y7gVeVyNStwYS3U7yVVoDZ4btbRNf4h6ibWpY22iRmXq35qgLs79f312g2kj5539ebPM" + ), + MnemonicTestData( + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f", + "legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth title", + "bc09fca1804f7e69da93c2f2028eb238c227f2e9dda30cd63699232578480a4021b146ad717fbb7e451ce9eb835f43620bf5c514db0f8add49f5d121449d3e87", + "xprv9s21ZrQH143K3Y1sd2XVu9wtqxJRvybCfAetjUrMMco6r3v9qZTBeXiBZkS8JxWbcGJZyio8TrZtm6pkbzG8SYt1sxwNLh3Wx7to5pgiVFU" + ), + MnemonicTestData( + "8080808080808080808080808080808080808080808080808080808080808080", + "letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic bless", + "c0c519bd0e91a2ed54357d9d1ebef6f5af218a153624cf4f2da911a0ed8f7a09e2ef61af0aca007096df430022f7a2b6fb91661a9589097069720d015e4e982f", + "xprv9s21ZrQH143K3CSnQNYC3MqAAqHwxeTLhDbhF43A4ss4ciWNmCY9zQGvAKUSqVUf2vPHBTSE1rB2pg4avopqSiLVzXEU8KziNnVPauTqLRo" + ), + MnemonicTestData( + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo vote", + "dd48c104698c30cfe2b6142103248622fb7bb0ff692eebb00089b32d22484e1613912f0a5b694407be899ffd31ed3992c456cdf60f5d4564b8ba3f05a69890ad", + "xprv9s21ZrQH143K2WFF16X85T2QCpndrGwx6GueB72Zf3AHwHJaknRXNF37ZmDrtHrrLSHvbuRejXcnYxoZKvRquTPyp2JiNG3XcjQyzSEgqCB" + ), + MnemonicTestData( + "9e885d952ad362caeb4efe34a8e91bd2", + "ozone drill grab fiber curtain grace pudding thank cruise elder eight picnic", + "274ddc525802f7c828d8ef7ddbcdc5304e87ac3535913611fbbfa986d0c9e5476c91689f9c8a54fd55bd38606aa6a8595ad213d4c9c9f9aca3fb217069a41028", + "xprv9s21ZrQH143K2oZ9stBYpoaZ2ktHj7jLz7iMqpgg1En8kKFTXJHsjxry1JbKH19YrDTicVwKPehFKTbmaxgVEc5TpHdS1aYhB2s9aFJBeJH" + ), + MnemonicTestData( + "6610b25967cdcca9d59875f5cb50b0ea75433311869e930b", + "gravity machine north sort system female filter attitude volume fold club stay feature office ecology stable narrow fog", + "628c3827a8823298ee685db84f55caa34b5cc195a778e52d45f59bcf75aba68e4d7590e101dc414bc1bbd5737666fbbef35d1f1903953b66624f910feef245ac", + "xprv9s21ZrQH143K3uT8eQowUjsxrmsA9YUuQQK1RLqFufzybxD6DH6gPY7NjJ5G3EPHjsWDrs9iivSbmvjc9DQJbJGatfa9pv4MZ3wjr8qWPAK" + ), + MnemonicTestData( + "68a79eaca2324873eacc50cb9c6eca8cc68ea5d936f98787c60c7ebc74e6ce7c", + "hamster diagram private dutch cause delay private meat slide toddler razor book happy fancy gospel tennis maple dilemma loan word shrug inflict delay length", + "64c87cde7e12ecf6704ab95bb1408bef047c22db4cc7491c4271d170a1b213d20b385bc1588d9c7b38f1b39d415665b8a9030c9ec653d75e65f847d8fc1fc440", + "xprv9s21ZrQH143K2XTAhys3pMNcGn261Fi5Ta2Pw8PwaVPhg3D8DWkzWQwjTJfskj8ofb81i9NP2cUNKxwjueJHHMQAnxtivTA75uUFqPFeWzk" + ), + MnemonicTestData( + "c0ba5a8e914111210f2bd131f3d5e08d", + "scheme spot photo card baby mountain device kick cradle pact join borrow", + "ea725895aaae8d4c1cf682c1bfd2d358d52ed9f0f0591131b559e2724bb234fca05aa9c02c57407e04ee9dc3b454aa63fbff483a8b11de949624b9f1831a9612", + "xprv9s21ZrQH143K3FperxDp8vFsFycKCRcJGAFmcV7umQmcnMZaLtZRt13QJDsoS5F6oYT6BB4sS6zmTmyQAEkJKxJ7yByDNtRe5asP2jFGhT6" + ), + MnemonicTestData( + "6d9be1ee6ebd27a258115aad99b7317b9c8d28b6d76431c3", + "horn tenant knee talent sponsor spell gate clip pulse soap slush warm silver nephew swap uncle crack brave", + "fd579828af3da1d32544ce4db5c73d53fc8acc4ddb1e3b251a31179cdb71e853c56d2fcb11aed39898ce6c34b10b5382772db8796e52837b54468aeb312cfc3d", + "xprv9s21ZrQH143K3R1SfVZZLtVbXEB9ryVxmVtVMsMwmEyEvgXN6Q84LKkLRmf4ST6QrLeBm3jQsb9gx1uo23TS7vo3vAkZGZz71uuLCcywUkt" + ), + MnemonicTestData( + "9f6a2878b2520799a44ef18bc7df394e7061a224d2c33cd015b157d746869863", + "panda eyebrow bullet gorilla call smoke muffin taste mesh discover soft ostrich alcohol speed nation flash devote level hobby quick inner drive ghost inside", + "72be8e052fc4919d2adf28d5306b5474b0069df35b02303de8c1729c9538dbb6fc2d731d5f832193cd9fb6aeecbc469594a70e3dd50811b5067f3b88b28c3e8d", + "xprv9s21ZrQH143K2WNnKmssvZYM96VAr47iHUQUTUyUXH3sAGNjhJANddnhw3i3y3pBbRAVk5M5qUGFr4rHbEWwXgX4qrvrceifCYQJbbFDems" + ), + MnemonicTestData( + "23db8160a31d3e0dca3688ed941adbf3", + "cat swing flag economy stadium alone churn speed unique patch report train", + "deb5f45449e615feff5640f2e49f933ff51895de3b4381832b3139941c57b59205a42480c52175b6efcffaa58a2503887c1e8b363a707256bdd2b587b46541f5", + "xprv9s21ZrQH143K4G28omGMogEoYgDQuigBo8AFHAGDaJdqQ99QKMQ5J6fYTMfANTJy6xBmhvsNZ1CJzRZ64PWbnTFUn6CDV2FxoMDLXdk95DQ" + ), + MnemonicTestData( + "8197a4a47f0425faeaa69deebc05ca29c0a5b5cc76ceacc0", + "light rule cinnamon wrap drastic word pride squirrel upgrade then income fatal apart sustain crack supply proud access", + "4cbdff1ca2db800fd61cae72a57475fdc6bab03e441fd63f96dabd1f183ef5b782925f00105f318309a7e9c3ea6967c7801e46c8a58082674c860a37b93eda02", + "xprv9s21ZrQH143K3wtsvY8L2aZyxkiWULZH4vyQE5XkHTXkmx8gHo6RUEfH3Jyr6NwkJhvano7Xb2o6UqFKWHVo5scE31SGDCAUsgVhiUuUDyh" + ), + MnemonicTestData( + "066dca1a2bb7e8a1db2832148ce9933eea0f3ac9548d793112d9a95c9407efad", + "all hour make first leader extend hole alien behind guard gospel lava path output census museum junior mass reopen famous sing advance salt reform", + "26e975ec644423f4a4c4f4215ef09b4bd7ef924e85d1d17c4cf3f136c2863cf6df0a475045652c57eb5fb41513ca2a2d67722b77e954b4b3fc11f7590449191d", + "xprv9s21ZrQH143K3rEfqSM4QZRVmiMuSWY9wugscmaCjYja3SbUD3KPEB1a7QXJoajyR2T1SiXU7rFVRXMV9XdYVSZe7JoUXdP4SRHTxsT1nzm" + ), + MnemonicTestData( + "f30f8c1da665478f49b001d94c5fc452", + "vessel ladder alter error federal sibling chat ability sun glass valve picture", + "2aaa9242daafcee6aa9d7269f17d4efe271e1b9a529178d7dc139cd18747090bf9d60295d0ce74309a78852a9caadf0af48aae1c6253839624076224374bc63f", + "xprv9s21ZrQH143K2QWV9Wn8Vvs6jbqfF1YbTCdURQW9dLFKDovpKaKrqS3SEWsXCu6ZNky9PSAENg6c9AQYHcg4PjopRGGKmdD313ZHszymnps" + ), + MnemonicTestData( + "c10ec20dc3cd9f652c7fac2f1230f7a3c828389a14392f05", + "scissors invite lock maple supreme raw rapid void congress muscle digital elegant little brisk hair mango congress clump", + "7b4a10be9d98e6cba265566db7f136718e1398c71cb581e1b2f464cac1ceedf4f3e274dc270003c670ad8d02c4558b2f8e39edea2775c9e232c7cb798b069e88", + "xprv9s21ZrQH143K4aERa2bq7559eMCCEs2QmmqVjUuzfy5eAeDX4mqZffkYwpzGQRE2YEEeLVRoH4CSHxianrFaVnMN2RYaPUZJhJx8S5j6puX" + ), + MnemonicTestData( + "f585c11aec520db57dd353c69554b21a89b20fb0650966fa0a9d6f74fd989d8f", + "void come effort suffer camp survey warrior heavy shoot primary clutch crush open amazing screen patrol group space point ten exist slush involve unfold", + "01f5bced59dec48e362f2c45b5de68b9fd6c92c6634f44d6d40aab69056506f0e35524a518034ddc1192e1dacd32c1ed3eaa3c3b131c88ed8e7e54c49a5d0998", + "xprv9s21ZrQH143K39rnQJknpH1WEPFJrzmAqqasiDcVrNuk926oizzJDDQkdiTvNPr2FYDYzWgiMiC63YmfPAa2oPyNB23r2g7d1yiK6WpqaQS" + ) + ) + +} diff --git a/src/test/kotlin/com/radixdlt/bip39/PhraseCleanupTest.kt b/src/test/kotlin/com/radixdlt/bip39/PhraseCleanupTest.kt new file mode 100644 index 0000000..c490298 --- /dev/null +++ b/src/test/kotlin/com/radixdlt/bip39/PhraseCleanupTest.kt @@ -0,0 +1,40 @@ +package com.radixdlt.bip39 + +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test +import com.radixdlt.bip39.model.MnemonicWords + +class PhraseCleanupTest { + + @Test + fun fixesCase() { + assertThat(dirtyPhraseToMnemonicWords("Foo Bar")) + .isEqualTo(MnemonicWords("foo bar")) + } + + + @Test + fun trims() { + assertThat(dirtyPhraseToMnemonicWords(" jo no ")) + .isEqualTo(MnemonicWords("jo no")) + } + + @Test + fun removesSpaceInBetween() { + assertThat(dirtyPhraseToMnemonicWords(" jo no ")) + .isEqualTo(MnemonicWords("jo no")) + } + + @Test + fun allInCombination() { + assertThat(dirtyPhraseToMnemonicWords(" Tu Wat ")) + .isEqualTo(MnemonicWords("tu wat")) + } + + @Test + fun negativeTest() { + assertThat(dirtyPhraseToMnemonicWords(" lo ko")) + .isNotEqualTo(MnemonicWords("jo no")) + } + +} \ No newline at end of file diff --git a/src/test/kotlin/com/radixdlt/bip44/BIP44Test.kt b/src/test/kotlin/com/radixdlt/bip44/BIP44Test.kt new file mode 100644 index 0000000..f0f625b --- /dev/null +++ b/src/test/kotlin/com/radixdlt/bip44/BIP44Test.kt @@ -0,0 +1,82 @@ +package com.radixdlt.bip44 + +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Assertions.assertThrows +import org.junit.jupiter.api.Test + +class BIP44Test { + + @Test + fun parsingFailsForBadInput() { + assertThrows(IllegalArgumentException::class.java){ + BIP44("abc") + } + } + + @Test + fun parsingFailsForEmptyInput() { + assertThrows(IllegalArgumentException::class.java){ + BIP44("") + } + } + + @Test + fun parsingFailsForMissingNumber() { + assertThrows(IllegalArgumentException::class.java){ + BIP44("m/0/") + } + } + + val stringProbes = mapOf( + "m" to listOf(), + "m/0" to listOf(BIP44Element(false, 0)), + "m/0/1" to listOf(BIP44Element(false, 0), BIP44Element(false, 1)), + + "m/44'" to listOf(BIP44Element(true, 44)), + "m/44'/1" to listOf(BIP44Element(true, 44), BIP44Element(false, 1)) + ) + + + val intProbes = mapOf( + "m" to listOf(), + "m/0" to listOf(0), + "m/0/1" to listOf(0, 1), + + "m/0'" to listOf(0x80000000.toInt()), + "m/1'/1" to listOf(0x80000001.toInt(), 1) + ) + + + val dirtyStringProbes = mapOf( + "m/44 ' " to listOf(BIP44Element(true, 44)), + "m/0 /1 ' " to listOf(BIP44Element(false, 0), BIP44Element(true, 1)) + ) + + @Test + fun fromPathWork() { + for ((key, value) in (stringProbes + dirtyStringProbes)) { + assertThat(BIP44(key).path).isEqualTo(value) + } + } + + @Test + fun toStringFromIntoWorks() { + for ((path, ints) in (intProbes)) { + assertThat(BIP44(path).path.map { it.numberWithHardeningFlag }).isEqualTo(ints) + } + } + + + @Test + fun toStringWorks() { + for ((key, value) in (stringProbes)) { + assertThat(key).isEqualTo(BIP44(value).toString()) + } + } + + @Test + fun incrementWorks() { + assertThat(BIP44("m/0/1/2").increment()) + .isEqualTo(BIP44("m/0/1/3")) + } +} \ No newline at end of file diff --git a/src/test/kotlin/com/radixdlt/crypto/base58/Base58Test.kt b/src/test/kotlin/com/radixdlt/crypto/base58/Base58Test.kt new file mode 100644 index 0000000..f8b9bc1 --- /dev/null +++ b/src/test/kotlin/com/radixdlt/crypto/base58/Base58Test.kt @@ -0,0 +1,39 @@ +package com.radixdlt.crypto.base58 + +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test +import com.radixdlt.hex.extensions.hexToByteArray +import com.radixdlt.hex.model.HexString + +class Base58Test { + + // Tests from https://github.com/bitcoin/bitcoin/blob/master/src/test/data/base58_encode_decode.json + val TEST_VECTORS = mapOf( + "" to "", + "61" to "2g", + "626262" to "a3gV", + "636363" to "aPEr", + "73696d706c792061206c6f6e6720737472696e67" to "2cFupjhnEsSn59qHXstmK2ffpLv2", + "00eb15231dfceb60925886b67d065299925915aeb172c06647" to "1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L", + "516b6fcd0f" to "ABnLTmg", + "bf4f89001e670274dd" to "3SEo3LWLoPntC", + "572e4794" to "3EFU7m", + "ecac89cad93923c02321" to "EJDM8drfXA6uyA", + "10c8511e" to "Rt5zm", + "00000000000000000000" to "1111111111" + ) + + @Test + fun encodingToBase58Works() { + TEST_VECTORS.forEach { + assertThat(HexString(it.key).hexToByteArray().encodeToBase58String()).isEqualTo(it.value) + } + } + + @Test + fun decodingFromBase58Works() { + TEST_VECTORS.forEach { + assertThat(it.value.decodeBase58()).isEqualTo(HexString(it.key).hexToByteArray()) + } + } +} \ No newline at end of file diff --git a/src/test/kotlin/com/radixdlt/slip10/DerivationTest.kt b/src/test/kotlin/com/radixdlt/slip10/DerivationTest.kt new file mode 100644 index 0000000..31000e3 --- /dev/null +++ b/src/test/kotlin/com/radixdlt/slip10/DerivationTest.kt @@ -0,0 +1,187 @@ +package com.radixdlt.slip10 + +import com.radixdlt.crypto.ec.EllipticCurveType +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test +import com.radixdlt.slip10.model.Seed +import com.radixdlt.slip10.model.XPriv +import com.radixdlt.hex.extensions.hexToByteArray +import com.radixdlt.hex.model.HexString + +/** + * Test batch for key derivation from seed given a path. + * + * The test vectors used are the ones described in [bip32](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki) + */ +class DerivationTest { + + @Test + fun createdKeyHasKeypair() { + val simpleKey = Seed(ByteArray(0)).toKey("m/0") + assertThat(simpleKey.keyPair).isNotNull + } + + @Test + fun generateKeysFromSeed() { + testData.forEach { + val derivedKey = Seed(HexString(it.seed).hexToByteArray()).toKey(it.path) + val testnetDerivedKey = Seed(HexString(it.seed).hexToByteArray()).toKey(it.path, testnet = true) + + val obtainedPub = derivedKey.serialize(true) + assertThat(it.expectedPublicKey).isEqualTo(obtainedPub) + + val obtainedTestnetPub = testnetDerivedKey.serialize(true) + assertThat(it.expectedTestnetPublicKey).isEqualTo(obtainedTestnetPub) + + val obtainedPrv = derivedKey.serialize() + assertThat(it.expectedPrivateKey).isEqualTo(obtainedPrv) + + val obtainedTestnetPrv = testnetDerivedKey.serialize() + assertThat(it.expectedTestnetPrivateKey).isEqualTo(obtainedTestnetPrv) + + val parsedPrv = XPriv(it.expectedPrivateKey).toExtendedKey(EllipticCurveType.Secp256k1) + assertThat(derivedKey).isEqualTo(parsedPrv) + + val parsedTestnetPrv = XPriv(it.expectedTestnetPrivateKey).toExtendedKey(EllipticCurveType.Secp256k1) + assertThat(testnetDerivedKey).isEqualTo(parsedTestnetPrv) + } + } + + data class DerivationVector( + val seed: String, + val path: String, + val expectedPublicKey: String, + val expectedPrivateKey: String, + val expectedTestnetPublicKey: String, + val expectedTestnetPrivateKey: String + ) + + private val testData = arrayOf( + DerivationVector( + "000102030405060708090a0b0c0d0e0f", + "m", + "xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8", + "xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi", + "tpubD6NzVbkrYhZ4XgiXtGrdW5XDAPFCL9h7we1vwNCpn8tGbBcgfVYjXyhWo4E1xkh56hjod1RhGjxbaTLV3X4FyWuejifB9jusQ46QzG87VKp", + "tprv8ZgxMBicQKsPeDgjzdC36fs6bMjGApWDNLR9erAXMs5skhMv36j9MV5ecvfavji5khqjWaWSFhN3YcCUUdiKH6isR4Pwy3U5y5egddBr16m" + ), + + DerivationVector( + "000102030405060708090a0b0c0d0e0f", + "m/0'", + "xpub68Gmy5EdvgibQVfPdqkBBCHxA5htiqg55crXYuXoQRKfDBFA1WEjWgP6LHhwBZeNK1VTsfTFUHCdrfp1bgwQ9xv5ski8PX9rL2dZXvgGDnw", + "xprv9uHRZZhk6KAJC1avXpDAp4MDc3sQKNxDiPvvkX8Br5ngLNv1TxvUxt4cV1rGL5hj6KCesnDYUhd7oWgT11eZG7XnxHrnYeSvkzY7d2bhkJ7", + "tpubD8eQVK4Kdxg3gHrF62jGP7dKVCoYiEB8dFSpuTawkL5YxTus5j5pf83vaKnii4bc6v2NVEy81P2gYrJczYne3QNNwMTS53p5uzDyHvnw2jm", + "tprv8bxNLu25VazNnppTCP4fyhyCvBHcYtzE3wr3cwYeL4HA7yf6TLGEUdS4QC1vLT63TkjRssqJe4CvGNEC8DzW5AoPUw56D1Ayg6HY4oy8QZ9" + ), + + DerivationVector( + "000102030405060708090a0b0c0d0e0f", + "m/0'/1", + "xpub6ASuArnXKPbfEwhqN6e3mwBcDTgzisQN1wXN9BJcM47sSikHjJf3UFHKkNAWbWMiGj7Wf5uMash7SyYq527Hqck2AxYysAA7xmALppuCkwQ", + "xprv9wTYmMFdV23N2TdNG573QoEsfRrWKQgWeibmLntzniatZvR9BmLnvSxqu53Kw1UmYPxLgboyZQaXwTCg8MSY3H2EU4pWcQDnRnrVA1xe8fs", + "tpubDApXh6cD2fZ7WjtgpHd8yrWyYaneiFuRZa7fVjMkgxsmC1QzoXW8cgx9zQFJ81Jx4deRGfRE7yXA9A3STsxXj4CKEZJHYgpMYikkas9DBTP", + "tprv8e8VYgZxtHsSdGrtvdxYaSrryZGiYviWzGWtDDKTGh5NMXAEB8gYSCLHpFCywNs5uqV7ghRjimALQJkRFZnUrLHpzi2pGkwqLtbubgWuQ8q" + ), + + DerivationVector( + "000102030405060708090a0b0c0d0e0f", + "m/0'/1/2'", + "xpub6D4BDPcP2GT577Vvch3R8wDkScZWzQzMMUm3PWbmWvVJrZwQY4VUNgqFJPMM3No2dFDFGTsxxpG5uJh7n7epu4trkrX7x7DogT5Uv6fcLW5", + "xprv9z4pot5VBttmtdRTWfWQmoH1taj2axGVzFqSb8C9xaxKymcFzXBDptWmT7FwuEzG3ryjH4ktypQSAewRiNMjANTtpgP4mLTj34bhnZX7UiM", + "tpubDDRojdS4jYQXNugn4t2WLrZ7mjfAyoVQu7MLk4eurqFCbrc7cHLZX8W5YRS8ZskGR9k9t3PqVv68bVBjAyW4nWM9pTGRddt3GQftg6MVQsm", + "tprv8gjmbDPpbAirVSezBEMuwSu1Ci9EpUJWKokZTYccSZSomNMLytWyLdtDNHRbucNaRJWWHANf9AzEdWVAqahfyRjVMKbNRhBmxAM8EJr7R15" + ), + + DerivationVector( + "000102030405060708090a0b0c0d0e0f", + "m/0'/1/2'/2", + "xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV", + "xprvA2JDeKCSNNZky6uBCviVfJSKyQ1mDYahRjijr5idH2WwLsEd4Hsb2Tyh8RfQMuPh7f7RtyzTtdrbdqqsunu5Mm3wDvUAKRHSC34sJ7in334", + "tpubDFfCa4Z1v25WTPAVm9EbEMiRrYwucPocLbEe12BPBGooxxEUg42vihy1DkRWyftztTsL23snYezF9uXjGGwGW6pQjEpcTpmsH6ajpf4CVPn", + "tprv8iyAReWmmePqZv8hsVZzpx4KHXRyT4chmHdriW95m11R8Tyi3fDLYDM93bq4NGn1V6eCu5cE3zSQ6hPd31F2ApKXkZgTyn1V78pHjkq1V2v" + ), + + DerivationVector( + "000102030405060708090a0b0c0d0e0f", + "m/0'/1/2'/2/1000000000", + "xpub6H1LXWLaKsWFhvm6RVpEL9P4KfRZSW7abD2ttkWP3SSQvnyA8FSVqNTEcYFgJS2UaFcxupHiYkro49S8yGasTvXEYBVPamhGW6cFJodrTHy", + "xprvA41z7zogVVwxVSgdKUHDy1SKmdb533PjDz7J6N6mV6uS3ze1ai8FHa8kmHScGpWmj4WggLyQjgPie1rFSruoUihUZREPSL39UNdE3BBDu76", + "tpubDHNy3kAG39ThyiwwsgoKY4iRenXDRtce8qdCFJZXPMCJg5dsCUHayp84raLTpvyiNA9sXPob5rgqkKvkN8S7MMyXbnEhGJMW64Cf4vFAoaF", + "tprv8kgvuL81tmn36Fv9z38j8f4K5m1HGZRjZY2QxnXDy5PuqbP6a5TzoKWCgTcGHBu66W3TgSbAu2yX6sPza5FkHmy564Sh6gmCPUNeUt4yj2x" + ), + + DerivationVector( + "fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542", + "m", + "xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB", + "xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U", + "tpubD6NzVbkrYhZ4XJDrzRvuxHEyQaPd1mwwdDofEJwekX18tAdsqeKfxss79AJzg1431FybXg5rfpTrJF4iAhyR7RubberdzEQXiRmXGADH2eA", + "tprv8ZgxMBicQKsPdqC56nGKYsarqYsgrSm33vCswnuMLFCk3gP7DFW5nPFExzSe7FGAzkbAFrxtXoQEe8vaX471tU3dsUUC7PNpYLGuzb2agmj" + ), + + DerivationVector( + "fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542", + "m/0", + "xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH", + "xprv9vHkqa6EV4sPZHYqZznhT2NPtPCjKuDKGY38FBWLvgaDx45zo9WQRUT3dKYnjwih2yJD9mkrocEZXo1ex8G81dwSM1fwqWpWkeS3v86pgKt", + "tpubD9ejmKSp2iP93ZpA8DJo25eVmY8sikSEBPZ2Q7y6pvs6a95rQufk7iSMidGtU64UDaTmPu5c4uJpTQVQ3rfqT2ZsshbJtaYuqutBhMEvKgw", + "tprv8cxhcuQZtLhUA6nNEZeCcfzPCWcwZRFKc5xF7bvoQf4hjeq5nWr9wDpVYViSkK71QQpz9sNcxxpMzeZQ5Lc4phD2setFVsYZfkBUMsgR3x8" + ), + + DerivationVector( + "fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542", + "m/0/2147483647'", + "xpub6ASAVgeehLbnwdqV6UKMHVzgqAG8Gr6riv3Fxxpj8ksbH9ebxaEyBLZ85ySDhKiLDBrQSARLq1uNRts8RuJiHjaDMBU4Zn9h8LZNnBC5y4a", + "xprv9wSp6B7kry3Vj9m1zSnLvN3xH8RdsPP1Mh7fAaR7aRLcQMKTR2vidYEeEg2mUCTAwCd6vnxVrcjfy2kRgVsFawNzmjuHc2YmYRmagcEPdU9", + "tpubDAoo1vULQcZFDS2LYfJSVRL4AHMnGEbvGYdZKWssUfdV2SKK2o64KnDxL1X1Dpfa16PK3jwDN7jR85Mjpm9xBB2WQnDNFJoviJ9nYAGqm3T", + "tprv8e7ksWS6GEsaKxzYf1dr61fwbFqr6uR1hF2n2zqa4Pq6Bx4YQQGU9Hc69rCRUZqVJe9svtaG1yKURtJAoiDCPzebJP7bGPGpTXX18KaUzow" + ), + + DerivationVector( + "fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542", + "m/0/2147483647'/1", + "xpub6DF8uhdarytz3FWdA8TvFSvvAh8dP3283MY7p2V4SeE2wyWmG5mg5EwVvmdMVCQcoNJxGoWaU9DCWh89LojfZ537wTfunKau47EL2dhHKon", + "xprv9zFnWC6h2cLgpmSA46vutJzBcfJ8yaJGg8cX1e5StJh45BBciYTRXSd25UEPVuesF9yog62tGAQtHjXajPPdbRCHuWS6T8XA2ECKADdw4Ef", + "tpubDDcmRwTGaFrSK3hUcKT1TNGHVpEHNRXBaz8RAaYCnYyvhGBULJcmDgcLAoi91hMrbGqrtP2T1F3FCsckjfauSWVR14RDTrF8e4pjnhENZ4d", + "tprv8gvjHXR2RtAmRafgifnR3xcAvniMD6LH1gXdt4VuNHBXrmvhhuoB3BzTzeQ3WH3BcbWagBeeRWzgkb5KrbjaQUTtS9eQ7VFCwKwjbvD1VbH" + ), + + DerivationVector( + "fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542", + "m/0/2147483647'/1/2147483646'", + "xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL", + "xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc", + "tpubDEnoLuPdBep9bzw5LoGYpsxUQYheRQ9gcgrJhJEcdKFB9cWQRyYmkCyRoTqeD4tJYiVVgt6A3rN6rWn9RYhR9sBsGxji29LYWHuKKbdb1ev", + "tprv8i6mCVMP3H8UiXuHT9bxRUJMqXBiG4xn3PFXQnCKD3SnK8FdoajBZiMZdM8S8hRUAAoGz1RdotaGZiAhNYe56K94G6BiFhGqGuxFfgKQPiw" + ), + + DerivationVector( + "fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542", + "m/0/2147483647'/1/2147483646'/2", + "xpub6FnCn6nSzZAw5Tw7cgR9bi15UV96gLZhjDstkXXxvCLsUXBGXPdSnLFbdpq8p9HmGsApME5hQTZ3emM2rnY5agb9rXpVGyy3bdW6EEgAtqt", + "xprvA2nrNbFZABcdryreWet9Ea4LvTJcGsqrMzxHx98MMrotbir7yrKCEXw7nadnHM8Dq38EGfSh6dqA9QWTyefMLEcBYJUuekgW4BYPJcr9E7j", + "tpubDG9qJLc8hq8PMG7y4sQEodLSocEkfj4mGrUC75b7G76mDoqybcUXvmvRsruvLeF14mhixobZwZP6LwqeFePKU83Sv8ZnxWdHBb6VzE6zbvC", + "tprv8jTo9vZtZTSiTo6BBDjeQDgLEaipWPsrhYsQpZYoqqJNPKbCyDewkHJZhkoSHiWYCUf1Gm4TFzQxcG4D6s1J9Hsn4whDK7QYyHHokJeUuac" + ), + + DerivationVector( + "4b381541583be4423346c643850da4b320e46a87ae3d2a4e6da11eba819cd4acba45d239319ac14f863b8d5ab5a0d0c64d2e8a1e7d1457df2e5a3c51c73235be", + "m", + "xpub661MyMwAqRbcEZVB4dScxMAdx6d4nFc9nvyvH3v4gJL378CSRZiYmhRoP7mBy6gSPSCYk6SzXPTf3ND1cZAceL7SfJ1Z3GC8vBgp2epUt13", + "xprv9s21ZrQH143K25QhxbucbDDuQ4naNntJRi4KUfWT7xo4EKsHt2QJDu7KXp1A3u7Bi1j8ph3EGsZ9Xvz9dGuVrtHHs7pXeTzjuxBrCmmhgC6", + "tpubD6NzVbkrYhZ4WMg2WpRiAGW1HDiime7DLZaDdbyD2D5vrQs9VnZdv96dd9qyVbdgBLjTMfxs4VHhjYhd1R1rXmZjitkrinrNW9HDndbLQPW", + "tprv8ZgxMBicQKsPcteEdAm7krqtiCCncJvJmFySM5vubwHY1vcNsPk3jeUmSzAp4GVW5TFupnezSE8wznXtkVFSfwYtPm2qJpinq3wGeUFH2nU" + ), + + DerivationVector( + "4b381541583be4423346c643850da4b320e46a87ae3d2a4e6da11eba819cd4acba45d239319ac14f863b8d5ab5a0d0c64d2e8a1e7d1457df2e5a3c51c73235be", + "m/0'", + "xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y", + "xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L", + "tpubD8kCEZazE4vQhtmRjxmDDXFfyaL6vVX7k3pASqf3xX1J7Rzc5HLVzbtLvsgVDxERNiEJ8dibuSVCN1dxwex371qgPzhkGeMAzKe8T7ivSof", + "tprv8c4A69Yk5hEjpRjdrK6cp7bZQYpAmALDAkDPAKckYFCuGwjqStWup7GUkkXAQDpRXbuKqjSs5xmQeLB3KhqCRhkWptwt3yzbx4tvbt53nTu" + ) + ) + +} \ No newline at end of file