diff --git a/.classpath b/.classpath
deleted file mode 100644
index e5b13d8b3..000000000
--- a/.classpath
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.gitignore b/.gitignore
index 23104d7b6..1a0cad18c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,28 +1,9 @@
-/build
-/javadoc
-/out
-/junit_report
-/coverage
-/dist
-/.idea/workspace.xml
-/.idea/uiDesigner.xml
-
-/tmp
-/.idea/dictionaries/xp.xml
+build
+target
+javadoc
+.idea/workspace.xml
+.idea/uiDesigner.xml
+.idea/dictionaries/xp.xml
*.log
-
-password.properties
-copy-dss-jars.sh
-/util
-token
-/bin
-container.bin
-createsECCSignature.bdoc
-extractSignatureThrowsErrorWhenSignatureIsNotFound.zip
-packaging_jar/
-setsSignatureId.bdoc
-setsSignatureId.ddoc
-jacoco.exec
utility-package-lib
zip-package-lib
-contiperf-report
diff --git a/.gitmodules b/.gitmodules
deleted file mode 100644
index e69de29bb..000000000
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index 0c1f8ed1c..5d0602b1b 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -1,8 +1,6 @@
-
-
@@ -16,48 +14,15 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
\ No newline at end of file
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
index f75895965..8ffd759b0 100644
--- a/.idea/encodings.xml
+++ b/.idea/encodings.xml
@@ -1,6 +1,7 @@
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 972864fe4..bd91aa8c4 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -43,6 +43,7 @@
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index cea6e2c50..000000000
--- a/.travis.yml
+++ /dev/null
@@ -1,28 +0,0 @@
-language: java
-sudo: false
-
-env:
- - ENV=$HOME/.ivy2
-
-cache:
- directories:
- - $HOME/.m2
- - $HOME/.ivy2
-
-before_install:
- - git pull --recurse-submodules origin publish
- - cd sd-dss
- - mvn install -q
- - cd ..
- - ant copy.dss.library
-
-branches:
- only:
- - publish
-
-install: ant
-jdk:
- - oraclejdk8
- - oraclejdk7
- - openjdk7
-
diff --git a/AUTHORS b/AUTHORS
index de89cad1d..d0f4976fa 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -2,4 +2,8 @@ Developer:
Martin Beldman
Aho Augasmägi
Risto Alas
- Mihkel Selgal
\ No newline at end of file
+ Mihkel Selgal
+ Rainer Villido
+ Andrei Smirnov
+ Indrek Jentson
+ Margus Kamlat
\ No newline at end of file
diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index 8fc10f265..661c73b4a 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -1,5 +1,11 @@
DigiDoc4J Java library release notes
------------------------------------
+Release 1.0.6 RC.1
+--------------------
+Summary of the major changes since 1.0.6 Beta.2
+----------------------------------------
+* Project building system is now Maven
+
Release 1.0.6 Beta.2
--------------------
Summary of the major changes since 1.0.6 Beta.1
diff --git a/assembly/zip.xml b/assembly/zip.xml
new file mode 100644
index 000000000..8bcb59fba
--- /dev/null
+++ b/assembly/zip.xml
@@ -0,0 +1,15 @@
+
+ library
+ /
+
+ zip
+
+
+
+ zip-package-lib
+ .
+
+
+
\ No newline at end of file
diff --git a/build-ivy.xml b/build-ivy.xml
deleted file mode 100644
index 4cbf7da24..000000000
--- a/build-ivy.xml
+++ /dev/null
@@ -1,106 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/build.properties b/build.properties
deleted file mode 100644
index 1483b6aaf..000000000
--- a/build.properties
+++ /dev/null
@@ -1 +0,0 @@
-publish.version=1.0.6.beta.2
\ No newline at end of file
diff --git a/build.xml b/build.xml
deleted file mode 100644
index 8300ece6f..000000000
--- a/build.xml
+++ /dev/null
@@ -1,286 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Version = ${lib.version}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/digidoc4j.iml b/digidoc4j.iml
index a4baa97f3..e8829e47e 100644
--- a/digidoc4j.iml
+++ b/digidoc4j.iml
@@ -1,24 +1,16 @@
-
-
-
-
-
- runtime
- test
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -34,20 +26,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -61,133 +39,62 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/dss-common.iml b/dss-common.iml
deleted file mode 100644
index 0c920cfb0..000000000
--- a/dss-common.iml
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/dss-core.iml b/dss-core.iml
deleted file mode 100644
index 5e8d20111..000000000
--- a/dss-core.iml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/dss-document.iml b/dss-document.iml
deleted file mode 100644
index b505f7d37..000000000
--- a/dss-document.iml
+++ /dev/null
@@ -1,48 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/dss-service.iml b/dss-service.iml
deleted file mode 100644
index db6ce626c..000000000
--- a/dss-service.iml
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/dss-spi.iml b/dss-spi.iml
deleted file mode 100644
index 8b0fc90d5..000000000
--- a/dss-spi.iml
+++ /dev/null
@@ -1,60 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/ivy-pom-template.pom b/ivy-pom-template.pom
deleted file mode 100644
index 3468b05c3..000000000
--- a/ivy-pom-template.pom
+++ /dev/null
@@ -1,48 +0,0 @@
-
-
-
- 4.0.0
- ${ivy.pom.groupId}
- ${ivy.pom.artifactId}
- ${ivy.pom.packaging}
- ${ivy.pom.version}
- DigiDoc4j
- DigiDoc4j is a Java library for digitally signing documents and creating digital signature containers of signed documents
- https://github.com/open-eid/digidoc4j
-
-
- GNU Lesser General Public License, Version 2.1
- http://www.gnu.org/licenses/lgpl-2.1.html
-
-
-
-
- Rainer Villido
- Rainer.Villido at Nortal.com
- Nortal
- http://www.nortal.com
-
-
- Aho Augasmägi
- aho at codeborne.com
- Codeborne
- http://www.codeborne.com
-
-
- Allan Juhanson
- Allan.Juhanson at Nortal.com
- Nortal
- http://www.nortal.com
-
-
-
- scm:git:git@github.com:open-eid/digidoc4j.git
- scm:git:git@github.com:open-eid/digidoc4j.git
- https://github.com/open-eid/digidoc4j.git
-
-
- Pivotal
- https://www.pivotaltracker.com/n/projects/1110130
-
-
\ No newline at end of file
diff --git a/ivy.xml b/ivy.xml
deleted file mode 100644
index 8c73f1b7e..000000000
--- a/ivy.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/lib/.gitignore b/lib/.gitignore
deleted file mode 100644
index f19c13475..000000000
--- a/lib/.gitignore
+++ /dev/null
@@ -1,8 +0,0 @@
-*
-!*/
-!.gitignore
-!dss-*.jar
-!validation-policy*.jar
-!testcerts.jar
-!esteidtestcerts.jar
-!jacoco*.jar
\ No newline at end of file
diff --git a/lib/dss-common-validation-jaxb-4.7.RC2.d4j.1.jar b/lib/dss-common-validation-jaxb-4.7.RC2.d4j.1.jar
deleted file mode 100644
index 0d1c1d167..000000000
Binary files a/lib/dss-common-validation-jaxb-4.7.RC2.d4j.1.jar and /dev/null differ
diff --git a/lib/dss-detailed-report-jaxb-4.7.RC2.d4j.1.jar b/lib/dss-detailed-report-jaxb-4.7.RC2.d4j.1.jar
deleted file mode 100644
index 9c7dca308..000000000
Binary files a/lib/dss-detailed-report-jaxb-4.7.RC2.d4j.1.jar and /dev/null differ
diff --git a/lib/dss-diagnostic-jaxb-4.7.RC2.d4j.1.jar b/lib/dss-diagnostic-jaxb-4.7.RC2.d4j.1.jar
deleted file mode 100644
index 87a8af9a6..000000000
Binary files a/lib/dss-diagnostic-jaxb-4.7.RC2.d4j.1.jar and /dev/null differ
diff --git a/lib/dss-document-4.7.RC2.d4j.1.jar b/lib/dss-document-4.7.RC2.d4j.1.jar
deleted file mode 100644
index 17f243de3..000000000
Binary files a/lib/dss-document-4.7.RC2.d4j.1.jar and /dev/null differ
diff --git a/lib/dss-model-4.7.RC2.d4j.1.jar b/lib/dss-model-4.7.RC2.d4j.1.jar
deleted file mode 100644
index 9e31985f2..000000000
Binary files a/lib/dss-model-4.7.RC2.d4j.1.jar and /dev/null differ
diff --git a/lib/dss-policy-jaxb-4.7.RC2.d4j.1.jar b/lib/dss-policy-jaxb-4.7.RC2.d4j.1.jar
deleted file mode 100644
index 1b064ad71..000000000
Binary files a/lib/dss-policy-jaxb-4.7.RC2.d4j.1.jar and /dev/null differ
diff --git a/lib/dss-reports-4.7.RC2.d4j.1.jar b/lib/dss-reports-4.7.RC2.d4j.1.jar
deleted file mode 100644
index 5274ebfad..000000000
Binary files a/lib/dss-reports-4.7.RC2.d4j.1.jar and /dev/null differ
diff --git a/lib/dss-service-4.7.RC2.d4j.1.jar b/lib/dss-service-4.7.RC2.d4j.1.jar
deleted file mode 100644
index dc763937f..000000000
Binary files a/lib/dss-service-4.7.RC2.d4j.1.jar and /dev/null differ
diff --git a/lib/dss-simple-report-jaxb-4.7.RC2.d4j.1.jar b/lib/dss-simple-report-jaxb-4.7.RC2.d4j.1.jar
deleted file mode 100644
index 5a297591b..000000000
Binary files a/lib/dss-simple-report-jaxb-4.7.RC2.d4j.1.jar and /dev/null differ
diff --git a/lib/dss-spi-4.7.RC2.d4j.1.jar b/lib/dss-spi-4.7.RC2.d4j.1.jar
deleted file mode 100644
index 80a803169..000000000
Binary files a/lib/dss-spi-4.7.RC2.d4j.1.jar and /dev/null differ
diff --git a/lib/dss-token-4.7.RC2.d4j.1.jar b/lib/dss-token-4.7.RC2.d4j.1.jar
deleted file mode 100644
index 1afeb1c6d..000000000
Binary files a/lib/dss-token-4.7.RC2.d4j.1.jar and /dev/null differ
diff --git a/lib/dss-tsl-jaxb-4.7.RC2.d4j.1.jar b/lib/dss-tsl-jaxb-4.7.RC2.d4j.1.jar
deleted file mode 100644
index 3559f9595..000000000
Binary files a/lib/dss-tsl-jaxb-4.7.RC2.d4j.1.jar and /dev/null differ
diff --git a/lib/dss-tsl-validation-4.7.RC2.d4j.1.jar b/lib/dss-tsl-validation-4.7.RC2.d4j.1.jar
deleted file mode 100644
index ae4179570..000000000
Binary files a/lib/dss-tsl-validation-4.7.RC2.d4j.1.jar and /dev/null differ
diff --git a/lib/dss-xades-4.7.RC2.d4j.1.jar b/lib/dss-xades-4.7.RC2.d4j.1.jar
deleted file mode 100644
index cca50f4e1..000000000
Binary files a/lib/dss-xades-4.7.RC2.d4j.1.jar and /dev/null differ
diff --git a/lib/validation-policy-4.7.RC2.d4j.1.jar b/lib/validation-policy-4.7.RC2.d4j.1.jar
deleted file mode 100644
index 5c8296c80..000000000
Binary files a/lib/validation-policy-4.7.RC2.d4j.1.jar and /dev/null differ
diff --git a/maven-ant/maven-ant-tasks-2.1.3.jar b/maven-ant/maven-ant-tasks-2.1.3.jar
deleted file mode 100644
index bec446fff..000000000
Binary files a/maven-ant/maven-ant-tasks-2.1.3.jar and /dev/null differ
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 000000000..b47aa1a97
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,890 @@
+
+
+
+ 4.0.0
+ org.digidoc4j
+ digidoc4j
+ jar
+ 1.0.6.RC.1
+ DigiDoc4j
+ DigiDoc4j is a Java library for digitally signing documents and creating digital signature containers of signed documents
+ https://github.com/open-eid/digidoc4j
+
+
+ GNU Lesser General Public License, Version 2.1
+ http://www.gnu.org/licenses/lgpl-2.1.html
+
+
+
+ scm:git:git@github.com:open-eid/digidoc4j.git
+ scm:git:git@github.com:open-eid/digidoc4j.git
+ https://github.com/open-eid/digidoc4j.git
+
+
+ Pivotal
+ https://www.pivotaltracker.com/n/projects/1110130
+
+
+ 1.7
+ 1.7
+ 1.7
+ UTF-8
+ 1.7.25
+ 1.2.3
+ 1.54
+ 4.11
+ 4.7.RC2.d4j.1
+ ${project.basedir}/build/
+ ${project.basedir}/utility-package-lib
+ ${project.basedir}/zip-package-lib
+
+
+
+
+ notJava8
+
+ [1.7,1.8)
+
+ ${java.home}/lib/jfxrt.jar
+
+
+
+ 1.7
+ ${java.home}/lib/jfxrt.jar
+
+
+
+
+ java8
+
+ [1.8,)
+
+ ${java.home}/lib/ext/jfxrt.jar
+
+
+
+ 1.7
+ ${java.home}/lib/ext/jfxrt.jar
+
+
+
+
+ delivery
+
+
+
+ maven-surefire-plugin
+
+ true
+
+
+
+ maven-compiler-plugin
+
+
+ default-testCompile
+ test-compile
+
+ testCompile
+
+
+ true
+
+
+
+
+
+
+
+
+ test-coverage
+
+
+
+ org.jacoco
+ jacoco-maven-plugin
+ 0.7.9
+
+
+ prepare-unit-tests
+
+ prepare-agent
+
+
+ ${project.basedir}/target/coverage-reports/jacoco-unit.exec
+
+
+
+ jacoco-site
+ verify
+
+ report
+
+
+ ${project.basedir}/target/coverage-reports/jacoco-unit.exec
+
+
+
+
+
+
+
+
+
+
+
+ lib
+ file:${project.basedir}/lib
+
+
+
+
+
+ ee.sk.digidoc
+ jdigidoc
+ 3.12.1
+ compile
+
+
+ iaik.pkcs
+ iaikPkcs11Wrapper
+
+
+
+
+ commons-cli
+ commons-cli
+ 1.4
+ compile
+
+
+ org.apache.commons
+ commons-compress
+ 1.3
+ compile
+
+
+ commons-io
+ commons-io
+ 2.5
+ compile
+
+
+ commons-codec
+ commons-codec
+ 1.10
+ compile
+
+
+ commons-lang
+ commons-lang
+ 2.6
+ compile
+
+
+ commons-logging
+ commons-logging
+ 1.2
+ compile
+
+
+ commons-collections
+ commons-collections
+ 3.2.2
+ compile
+
+
+ org.apache.httpcomponents
+ httpclient
+ 4.5.3
+ compile
+
+
+ org.apache.httpcomponents
+ httpcore
+ 4.4.6
+ compile
+
+
+ org.apache.santuario
+ xmlsec
+ 2.0.8
+ compile
+
+
+ org.codehaus.woodstox
+ woodstox-core-asl
+
+
+
+
+ org.bouncycastle
+ bcmail-jdk15on
+ ${bouncycastle.version}
+ compile
+
+
+ org.bouncycastle
+ bcpkix-jdk15on
+ ${bouncycastle.version}
+ compile
+
+
+ org.bouncycastle
+ bcprov-jdk15on
+ ${bouncycastle.version}
+ compile
+
+
+ xalan
+ serializer
+ 2.7.2
+ compile
+
+
+ xml-apis
+ xml-apis
+
+
+
+
+ xalan
+ xalan
+ 2.7.2
+ compile
+
+
+ org.yaml
+ snakeyaml
+ 1.18
+ compile
+
+
+ org.slf4j
+ slf4j-api
+ ${slf4j.version}
+ compile
+
+
+
+ ch.qos.logback
+ logback-classic
+ ${logback-classic.version}
+ compile
+
+
+ ch.qos.logback
+ logback-core
+ ${logback-classic.version}
+ compile
+
+
+ org.slf4j
+ log4j-over-slf4j
+ ${slf4j.version}
+ compile
+
+
+
+ org.hamcrest
+ hamcrest-core
+ 1.3
+ test
+
+
+ org.mockito
+ mockito-all
+ 1.10.19
+ test
+
+
+ com.github.stefanbirkner
+ system-rules
+ 1.16.1
+ test
+
+
+ junit
+ junit
+ ${junit.version}
+ test
+
+
+ xmlunit
+ xmlunit
+ 1.6
+ test
+
+
+ org.hamcrest
+ hamcrest-library
+ 1.3
+ test
+
+
+ org.databene
+ contiperf
+ 2.3.4
+ test
+
+
+
+ com.github.tomakehurst
+ wiremock
+ 1.58
+ test
+
+
+ org.mortbay.jetty
+ jetty
+ 6.1.26
+ test
+
+
+ org.mortbay.jetty
+ jetty-util
+ 6.1.26
+ test
+
+
+ org.mortbay.jetty
+ servlet-api
+ 2.5.20110712
+ test
+
+
+ com.google.guava
+ guava
+ 20.0
+ test
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ 2.8.8
+ test
+
+
+ com.fasterxml.jackson.core
+ jackson-core
+ 2.8.8
+ test
+
+
+ com.fasterxml.jackson.core
+ jackson-annotations
+ 2.8.8
+ test
+
+
+ org.skyscreamer
+ jsonassert
+ 1.5.0
+ test
+
+
+ com.vaadin.external.google
+ android-json
+
+
+
+
+ org.json
+ json
+ 20160810
+ test
+
+
+ com.jayway.jsonpath
+ json-path
+
+
+ net.minidev
+ json-smart
+
+
+
+
+ log4j
+ log4j
+ 1.2.17
+ compile
+
+
+
+ org.digidoc4j.dss
+ dss-common-validation-jaxb
+ ${dss.version}
+ compile
+
+
+ org.digidoc4j.dss
+ dss-detailed-report-jaxb
+ ${dss.version}
+ compile
+
+
+ org.digidoc4j.dss
+ dss-diagnostic-jaxb
+ ${dss.version}
+ compile
+
+
+ org.digidoc4j.dss
+ dss-document
+ ${dss.version}
+ compile
+
+
+ org.digidoc4j.dss
+ dss-model
+ ${dss.version}
+ compile
+
+
+ org.digidoc4j.dss
+ dss-policy-jaxb
+ ${dss.version}
+ compile
+
+
+ org.digidoc4j.dss
+ dss-reports
+ ${dss.version}
+ compile
+
+
+ org.digidoc4j.dss
+ dss-service
+ ${dss.version}
+ compile
+
+
+ org.digidoc4j.dss
+ dss-simple-report-jaxb
+ ${dss.version}
+ compile
+
+
+ org.digidoc4j.dss
+ dss-spi
+ ${dss.version}
+ compile
+
+
+ org.digidoc4j.dss
+ dss-token
+ ${dss.version}
+ compile
+
+
+ org.digidoc4j.dss
+ dss-tsl-jaxb
+ ${dss.version}
+ compile
+
+
+ org.digidoc4j.dss
+ dss-tsl-validation
+ ${dss.version}
+ compile
+
+
+ org.digidoc4j.dss
+ dss-xades
+ ${dss.version}
+ compile
+
+
+ org.digidoc4j.dss
+ validation-policy
+ ${dss.version}
+ compile
+
+
+
+
+ src
+ test
+ build
+ target/test-classes
+
+
+
+ resources
+
+
+ conf
+ conf
+
+
+ keystore
+
+ keystore_certs/*.*
+ test_keystore_certs/*.*
+
+ keystore
+
+
+
+
+
+ maven-clean-plugin
+ 3.0.0
+
+
+ clean
+ clean
+
+ clean
+
+
+
+
+ ${project.basedir}/lib
+
+ **/esteidtestcerts.jar
+ **/jacocoagent.jar
+ **/jacocoant.jar
+
+
+
+ ${dss.util.lib}
+
+
+ ${dss.zip.lib}
+
+
+ ${project.basedir}/build
+
+
+ ${project.basedir}/target
+
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-dependency-plugin
+
+
+ copy-dependencies
+ compile
+
+ copy-dependencies
+
+
+ ${project.basedir}/lib
+ true
+ true
+
+
+
+ copy-utils-jars
+ compile
+
+ copy-dependencies
+
+
+ compile
+ ${dss.util.lib}
+ true
+ true
+
+ contiperf, dss-common-validation-jaxb,
+ dss-detailed-report-jaxb, dss-diagnostic-jaxb, dss-document, dss-model, dss-policy-jaxb,
+ dss-reports, dss-service, dss-simple-report-jaxb, dss-spi, dss-token, dss-tsl-jaxb,
+ dss-tsl-validation, dss-xades, validation-policy, log4j
+
+
+
+
+ copy-zip-jars
+ compile
+
+ copy-dependencies
+
+
+ compile
+ ${dss.zip.lib}
+ true
+ true
+
+ contiperf, log4j-over-slf4j, logback-classic,
+ logback-core
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-assembly-plugin
+ 3.0.0
+
+
+ assembly/zip.xml
+
+
+
+
+ zip-archive
+ package
+
+ single
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+
+
+ prototype/**
+
+
+
+
+ DigiDoc4j
+
+ Republic of Estonia Information System Authority
+ Java BDoc/DigiDoc library
+ ${project.version}
+
+
+
+
+
+
+
+
+ org.jacoco
+ jacoco-maven-plugin
+ 0.7.9
+
+
+ prepare-unit-test-agent
+
+ prepare-agent
+
+
+
+ generate-unit-test-report
+
+ merge
+ report
+
+
+
+ prepare-integration-test-agent
+
+ prepare-agent-integration
+
+
+
+ generate-integration-test-report
+
+ merge
+ report-integration
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ 2.20
+
+
+ ${project.basedir}/lib/esteidtestcerts.jar
+
+
+ -Dfile.encoding=UTF-8
+
+
+
+
+ org.apache.maven.plugins
+ maven-antrun-plugin
+ 1.8
+
+
+ ant-util-zip
+ package
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ run
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+ 3.0.1
+
+
+ attach-sources
+ package
+
+ jar
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+
+
+
+ maven-deploy-plugin
+
+
+ deploy
+ deploy
+
+ deploy
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-install-plugin
+ 2.5.2
+
+
+
+
+
+
+ org.jacoco
+ jacoco-maven-plugin
+ 0.7.9
+
+
+ org.apache.maven.plugins
+ maven-install-plugin
+ 2.5.2
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.6.1
+
+ ${project.encoding}
+
+ ${maven.compiler.target}
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+ 3.0.1
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ 2.20
+
+
+ org.apache.maven.plugins
+ maven-resources-plugin
+ 3.0.2
+
+ ${project.encoding}
+
+ jks
+ p12
+
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+ 3.0.2
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+ 3.0.0
+
+
+ org.apache.maven.plugins
+ maven-assembly-plugin
+ 3.0.0
+
+
+ org.apache.maven.plugins
+ maven-release-plugin
+ 2.5.3
+
+ true
+ @{project.version}
+
+
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+ 2.10.4
+
+
+ org.jvnet.jaxb2.maven2
+ maven-jaxb2-plugin
+ 0.13.2
+
+
+ org.apache.maven.plugins
+ maven-deploy-plugin
+ 2.8.2
+
+
+ org.apache.maven.plugins
+ maven-antrun-plugin
+ 1.8
+
+
+
+
+
diff --git a/src/org/digidoc4j/SignatureParameters.java b/src/org/digidoc4j/SignatureParameters.java
index 1cf477422..41ad06649 100644
--- a/src/org/digidoc4j/SignatureParameters.java
+++ b/src/org/digidoc4j/SignatureParameters.java
@@ -30,7 +30,7 @@
*
*/
public class SignatureParameters implements Serializable {
- private final static Logger logger = LoggerFactory.getLogger(SignatureParameters.class);
+ private static final Logger logger = LoggerFactory.getLogger(SignatureParameters.class);
private SignatureProductionPlace productionPlace = new SignatureProductionPlace();
private List roles = new ArrayList<>();
private String signatureId;
diff --git a/src/org/digidoc4j/impl/ddoc/DDocOpener.java b/src/org/digidoc4j/impl/ddoc/DDocOpener.java
index 9db0a9fe0..961fd7e37 100644
--- a/src/org/digidoc4j/impl/ddoc/DDocOpener.java
+++ b/src/org/digidoc4j/impl/ddoc/DDocOpener.java
@@ -106,8 +106,12 @@ private void validateOpenedContainerExceptions(ArrayList openC
private DigiDocException getFatalError(List openContainerExceptions) {
DigiDocException exception = null;
for (DigiDocException openContainerException : openContainerExceptions) {
- if (openContainerException.getCode() == DigiDocException.ERR_PARSE_XML) {
+ if (openContainerException.getCode() == DigiDocException.ERR_PARSE_XML
+ && openContainerException.getMessage() != null
+ && openContainerException.getMessage().contains("Invalid xml file")) {
exception = new DigiDocException(DigiDocException.ERR_PARSE_XML, "Invalid input file format.", openContainerException.getNestedException());
+ }else{
+ exception = openContainerException;
}
}
return exception;
diff --git a/test/org/digidoc4j/ContainerOpenerTest.java b/test/org/digidoc4j/ContainerOpenerTest.java
index 92b198879..9781c8f0b 100644
--- a/test/org/digidoc4j/ContainerOpenerTest.java
+++ b/test/org/digidoc4j/ContainerOpenerTest.java
@@ -82,4 +82,42 @@ public void testErrorTextDDOCInvalidFileFormat(){
assertTrue( e.getMessage().contains("Invalid input file format."));
}
}
-}
+
+ @Test
+ public void testErrorText75NotChanged(){
+ try {
+ Container container = ContainerBuilder.
+ aContainer().
+ fromExistingFile("testFiles/invalid-containers/23181_SignedInfo_topelt_D1_lisatud.ddoc").
+ build();
+
+ } catch (DigiDoc4JException e){
+ assertTrue( e.getMessage().contains("Multiple elements: SignatureValue not allowed under: Signature"));
+ }
+ }
+
+ @Test
+ public void testErrorText75ChangedAndNullPointer(){
+ try {
+ Container container = ContainerBuilder.
+ aContainer().
+ fromExistingFile("testFiles/invalid-containers/23133_ddoc-12.ddoc").
+ build();
+ } catch (DigiDoc4JException e){
+ assertTrue( e.getMessage().contains("Invalid input file format."));
+ }
+ }
+
+ @Test
+ public void testErrorText75NotChangedInvalidXmlElement(){
+ try {
+ Container container = ContainerBuilder.
+ aContainer().
+ fromExistingFile("testFiles/invalid-containers/BOF.ddoc").
+ build();
+
+ } catch (DigiDoc4JException e){
+ assertTrue( e.getMessage().contains("Invalid xml element"));
+ }
+ }
+}
\ No newline at end of file
diff --git a/test/org/digidoc4j/impl/bdoc/ValidationTests.java b/test/org/digidoc4j/impl/bdoc/ValidationTests.java
index 5dc98d6af..49a36012a 100644
--- a/test/org/digidoc4j/impl/bdoc/ValidationTests.java
+++ b/test/org/digidoc4j/impl/bdoc/ValidationTests.java
@@ -536,7 +536,12 @@ public void mixTSLCertAndTSLOnlineSources_SignatureTypeLT_notValid() throws Exce
assertFalse(validationResult.isValid());
assertEquals(1, errors.size());
assertEquals("Signature has an invalid timestamp", errors.get(0).toString());
+ }
+ @Test
+ public void validateAsiceContainer_getNotValid() throws Exception {
+ Configuration configuration = new Configuration(Configuration.Mode.TEST);
+ assertFalse(validateContainer("testFiles/invalid-containers/TM-16_unknown.4.asice", configuration).isValid());
}
private void testSigningWithOCSPCheck(String unknownCert) {
diff --git a/test/org/digidoc4j/impl/ddoc/DDocFacadeTest.java b/test/org/digidoc4j/impl/ddoc/DDocFacadeTest.java
index 869c2c6de..c3b7863c1 100644
--- a/test/org/digidoc4j/impl/ddoc/DDocFacadeTest.java
+++ b/test/org/digidoc4j/impl/ddoc/DDocFacadeTest.java
@@ -88,7 +88,7 @@ public void setUp() throws Exception {
@AfterClass
public static void deleteTemporaryFiles() {
try {
- DirectoryStream directoryStream = Files.newDirectoryStream(Paths.get("."));
+ DirectoryStream directoryStream = Files.newDirectoryStream(Paths.get("testFiles/tmp"));
for (Path item : directoryStream) {
String fileName = item.getFileName().toString();
if (fileName.endsWith("ddoc") && fileName.startsWith("test")) Files.deleteIfExists(item);
@@ -132,8 +132,8 @@ public void testCanAddTwoDataFilesWithSameName() throws Exception {
DDocFacade dDocContainer = new DDocFacade();
dDocContainer.addDataFile("testFiles/helper-files/test.txt", TEXT_MIME_TYPE);
dDocContainer.addDataFile("testFiles/helper-files/test.txt", TEXT_MIME_TYPE);
- dDocContainer.save("test_ddoc_file.ddoc");
- Container container = ContainerOpener.open("test_ddoc_file.ddoc");
+ dDocContainer.save("testFiles/tmp/test_ddoc_file.ddoc");
+ Container container = ContainerOpener.open("testFiles/tmp/test_ddoc_file.ddoc");
List dataFiles = container.getDataFiles();
assertEquals(2, dataFiles.size());
assertEquals("test.txt", dataFiles.get(0).getName());
@@ -159,8 +159,8 @@ public void testAddEmptyFile() throws Exception {
//noinspection ResultOfMethodCallIgnored
new File("test_empty.txt").createNewFile();
dDocContainer.addDataFile("test_empty.txt", TEXT_MIME_TYPE);
- dDocContainer.save("test_empty.ddoc");
- Container container = ContainerOpener.open("test_empty.ddoc");
+ dDocContainer.save("testFiles/tmp/test_empty.ddoc");
+ Container container = ContainerOpener.open("testFiles/tmp/test_empty.ddoc");
List dataFiles = container.getDataFiles();
assertEquals(1, dataFiles.size());
assertEquals(0, dataFiles.get(0).getFileSize());
@@ -267,9 +267,9 @@ public void setsSignatureId() throws Exception {
signatureParameters.setSignatureId("SIGNATURE-2");
container.setSignatureParameters(signatureParameters);
container.sign(PKCS12_SIGNER);
- container.save("setsSignatureId.ddoc");
+ container.save("testFiles/tmp/testSetsSignatureId.ddoc");
- container = openDocFacade("setsSignatureId.ddoc");
+ container = openDocFacade("testFiles/tmp/testSetsSignatureId.ddoc");
assertEquals("SIGNATURE-1", container.getSignature(0).getId());
assertEquals("SIGNATURE-2", container.getSignature(1).getId());
}
@@ -280,9 +280,9 @@ public void setsDefaultSignatureId() throws Exception {
container.addDataFile("testFiles/helper-files/test.txt", "text/plain");
container.sign(PKCS12_SIGNER);
container.sign(PKCS12_SIGNER);
- container.save("testSetsDefaultSignatureId.ddoc");
+ container.save("testFiles/tmp/testSetsDefaultSignatureId.ddoc");
- container = openDocFacade("testSetsDefaultSignatureId.ddoc");
+ container = openDocFacade("testFiles/tmp/testSetsDefaultSignatureId.ddoc");
assertEquals("S0", container.getSignature(0).getId());
assertEquals("S1", container.getSignature(1).getId());
}
@@ -301,9 +301,9 @@ public void setsSignatureIdWithoutOCSP() throws Exception {
signatureParameters.setSignatureId("SIGNATURE-2");
container.setSignatureParameters(signatureParameters);
container.sign(PKCS12_SIGNER);
- container.save("testSetsSignatureId.ddoc");
+ container.save("testFiles/tmp/testSetsSignatureId.ddoc");
- container = openDocFacade("testSetsSignatureId.ddoc");
+ container = openDocFacade("testFiles/tmp/testSetsSignatureId.ddoc");
assertEquals("SIGNATURE-1", container.getSignature(0).getId());
assertEquals("SIGNATURE-2", container.getSignature(1).getId());
}
@@ -315,9 +315,9 @@ public void setsDefaultSignatureIdWithoutOCSP() throws Exception {
container.setSignatureProfile(B_BES);
container.sign(PKCS12_SIGNER);
container.sign(PKCS12_SIGNER);
- container.save("testSetsDefaultSignatureId.ddoc");
+ container.save("testFiles/tmp/testSetsDefaultSignatureId.ddoc");
- container = openDocFacade("testSetsDefaultSignatureId.ddoc");
+ container = openDocFacade("testFiles/tmp/testSetsDefaultSignatureId.ddoc");
assertEquals("S0", container.getSignature(0).getId());
assertEquals("S1", container.getSignature(1).getId());
}
@@ -412,13 +412,13 @@ public void extendToTM() throws Exception {
container.addDataFile("testFiles/helper-files/test.txt", TEXT_MIME_TYPE);
container.setSignatureProfile(B_BES);
container.sign(PKCS12_SIGNER);
- container.save("testAddConfirmation.ddoc");
- container = open("testAddConfirmation.ddoc");
+ container.save("testFiles/tmp/testAddConfirmation.ddoc");
+ container = open("testFiles/tmp/testAddConfirmation.ddoc");
assertNull(container.getSignature(0).getOCSPCertificate());
container.extendTo(LT_TM);
- container.save("testAddedConfirmation.ddoc");
- container = open("testAddedConfirmation.ddoc");
+ container.save("testFiles/tmp/testAddedConfirmation.ddoc");
+ container = open("testFiles/tmp/testAddedConfirmation.ddoc");
assertNotNull(container.getSignature(0).getOCSPCertificate());
}
@@ -457,9 +457,9 @@ public void twoStepSigning() {
SignedInfo signedInfo = container.prepareSigning(signerCert);
byte[] signature = getExternalSignature(signedInfo, SHA256);
container.signRaw(signature);
- container.save("test.ddoc");
+ container.save("testFiles/tmp/test.ddoc");
- container = ContainerOpener.open("test.ddoc");
+ container = ContainerOpener.open("testFiles/tmp/test.ddoc");
assertEquals(1, container.getSignatures().size());
}
@@ -489,14 +489,14 @@ public void signExistingContainer() throws Exception {
@Test
public void signRawWithLT_TMSignatureProfileAddsOCSP() {
- String dDocFileName = "testOCSPAddedWithRawSignature.ddoc";
+ String dDocFileName = "testFiles/tmp/testOCSPAddedWithRawSignature.ddoc";
signRawDDocContainer(LT_TM).saveAsFile(dDocFileName);
assertNotNull(ContainerOpener.open(dDocFileName).getSignatures().get(0).getOCSPCertificate());
}
@Test
public void signRawWithNoSignatureProfileDoesNotAddOCSP() {
- String dDocFileName = "testOCSPNotAddedWithRawSignatureWhenNoProfile.ddoc";
+ String dDocFileName = "testFiles/tmp/testOCSPNotAddedWithRawSignatureWhenNoProfile.ddoc";
signRawDDocContainer(B_BES).saveAsFile(dDocFileName);
assertNull(ContainerOpener.open(dDocFileName).getSignatures().get(0).getOCSPCertificate());
}
diff --git a/test/org/digidoc4j/impl/ddoc/DDocSignatureTest.java b/test/org/digidoc4j/impl/ddoc/DDocSignatureTest.java
index 81dfe3944..1ecb39119 100644
--- a/test/org/digidoc4j/impl/ddoc/DDocSignatureTest.java
+++ b/test/org/digidoc4j/impl/ddoc/DDocSignatureTest.java
@@ -17,6 +17,8 @@
import org.junit.BeforeClass;
import org.junit.Test;
+import java.io.File;
+import java.nio.file.Path;
import java.util.List;
import static java.util.Arrays.asList;
@@ -28,6 +30,8 @@ public class DDocSignatureTest extends DigiDoc4JTestHelper {
@BeforeClass
public static void setUp() {
+ String current = new File(".").getAbsolutePath();
+ System.out.println("CURRENT DIR: "+current);
SignatureParameters signatureParameters = new SignatureParameters();
signatureParameters.setProductionPlace(new SignatureProductionPlace("City", "State", "PostalCode", "Country"));
signatureParameters.setRoles(asList("Role1"));
diff --git a/test/org/digidoc4j/main/DigiDoc4JTest.java b/test/org/digidoc4j/main/DigiDoc4JTest.java
index 36b8cd9cf..81f205a96 100644
--- a/test/org/digidoc4j/main/DigiDoc4JTest.java
+++ b/test/org/digidoc4j/main/DigiDoc4JTest.java
@@ -75,15 +75,17 @@ public void setUp() throws Exception {
@After
public void cleanUp() throws Exception {
- deleteFile("digidoc4j.yaml");
- deleteFile("test1.ddoc");
- deleteFile("test1.bdoc");
- deleteFile("test1.test");
+ deleteFile("testFiles/tmp/digidoc4j.yaml");
+ deleteFile("testFiles/tmp/test1.ddoc");
+ deleteFile("testFiles/tmp/test1.bdoc");
+ deleteFile("testFiles/tmp/test1.test");
+ deleteFile("testFiles/tmp/createsECCSignatureWithInvalidEncryptionType.bdoc");
+ deleteFile("testFiles/tmp/createsECCSignature.bdoc");
}
@Test
public void createsContainerWithTypeSettingDDoc() throws Exception {
- String fileName = "test1.bdoc";
+ String fileName = "testFiles/tmp/test1.bdoc";
Files.deleteIfExists(Paths.get(fileName));
@@ -98,7 +100,7 @@ public void createsContainerWithTypeSettingDDoc() throws Exception {
@Test
public void signDDocContainerTwice() throws Exception {
- String fileName = "test1.bdoc";
+ String fileName = "testFiles/tmp/test1.bdoc";
Files.deleteIfExists(Paths.get(fileName));
String[] signNewContainerParams = new String[]{"-in", fileName, "-type", "DDOC", "-add", "testFiles/helper-files/test.txt", "text/plain",
@@ -114,7 +116,7 @@ public void signDDocContainerTwice() throws Exception {
@Test
public void createsContainerWithSignatureProfileIsTSAForBDoc() throws Exception {
- String fileName = "test1.bdoc";
+ String fileName = "testFiles/tmp/test1.bdoc";
Files.deleteIfExists(Paths.get(fileName));
@@ -129,7 +131,7 @@ public void createsContainerWithSignatureProfileIsTSAForBDoc() throws Exception
@Test
public void createsContainerWithSignatureProfileIsTSForBDoc() throws Exception {
- String fileName = "test1.bdoc";
+ String fileName = "testFiles/tmp/test1.bdoc";
Files.deleteIfExists(Paths.get(fileName));
@@ -148,7 +150,7 @@ public void createsContainerWithSignatureProfileIsTSForBDoc() throws Exception {
@Test
public void createsContainerWithSignatureProfileIsBESForBDoc() throws Exception {
- String fileName = "test1.bdoc";
+ String fileName = "testFiles/tmp/test1.bdoc";
Files.deleteIfExists(Paths.get(fileName));
@@ -163,7 +165,7 @@ public void createsContainerWithSignatureProfileIsBESForBDoc() throws Exception
@Test (expected = IllegalArgumentException.class)
public void createsECCSignatureWithInvalidEncryptionType() throws Exception {
- String fileName = "createsECCSignatureWithInvalidEncryptionType.bdoc";
+ String fileName = "testFiles/tmp/createsECCSignatureWithInvalidEncryptionType.bdoc";
Files.deleteIfExists(Paths.get(fileName));
@@ -175,7 +177,7 @@ public void createsECCSignatureWithInvalidEncryptionType() throws Exception {
@Test
public void createsECCSignature() throws Exception {
- String fileName = "createsECCSignature.bdoc";
+ String fileName = "testFiles/tmp/createsECCSignature.bdoc";
Files.deleteIfExists(Paths.get(fileName));
String[] params = new String[]{"-in", fileName, "-add", "testFiles/helper-files/test.txt", "text/plain",
@@ -190,7 +192,7 @@ public void createsECCSignature() throws Exception {
@Test
public void createsContainerWithUnknownSignatureProfile() throws Exception {
- String fileName = "test1.bdoc";
+ String fileName = "testFiles/tmp/test1.bdoc";
Files.deleteIfExists(Paths.get(fileName));
String[] params = new String[]{"-in", fileName, "-type", "BDOC", "-add", "testFiles/helper-files/test.txt", "text/plain",
@@ -204,7 +206,7 @@ public void createsContainerWithUnknownSignatureProfile() throws Exception {
@Test
public void createsContainerWithSignatureProfileIsTMForDDoc() throws Exception {
- String fileName = "test1.bdoc";
+ String fileName = "testFiles/tmp/test1.bdoc";
Files.deleteIfExists(Paths.get(fileName));
@@ -221,7 +223,7 @@ public void createsContainerWithSignatureProfileIsTMForDDoc() throws Exception {
public void createsContainerWithSignatureProfileTSForDDocReturnsFailureCode() throws Exception {
exit.expectSystemExitWithStatus(1);
- String fileName = "test1.ddoc";
+ String fileName = "testFiles/tmp/test1.ddoc";
Files.deleteIfExists(Paths.get(fileName));
@@ -235,7 +237,7 @@ public void createsContainerWithSignatureProfileTSForDDocReturnsFailureCode() th
public void createsContainerWithSignatureProfileTSAForDDocReturnsFailureCode() throws Exception {
exit.expectSystemExitWithStatus(1);
- String fileName = "test1.ddoc";
+ String fileName = "testFiles/tmp/test1.ddoc";
Files.deleteIfExists(Paths.get(fileName));
@@ -263,7 +265,7 @@ public void createsContainerWithSignatureProfileBESForDDoc() throws Exception {
@Test
public void createsContainerWithTypeSettingBDoc() throws Exception {
- String fileName = "test1.ddoc";
+ String fileName = "testFiles/tmp/test1.ddoc";
Files.deleteIfExists(Paths.get(fileName));
String[] params = new String[]{"-in", fileName, "-type", "BDOC", "-add", "testFiles/helper-files/test.txt", "text/plain",
@@ -303,7 +305,7 @@ public void commandLineDigidoc4jModeOverwritesDefault() throws Exception {
@Test
public void createsContainerWithTypeSettingBasedOnFileExtensionDDoc() throws Exception {
- String fileName = "test1.ddoc";
+ String fileName = "testFiles/tmp/test1.ddoc";
Files.deleteIfExists(Paths.get(fileName));
String[] params = new String[]{"-in", fileName, "-add", "testFiles/helper-files/test.txt", "text/plain", "-pkcs12",
@@ -317,7 +319,7 @@ public void createsContainerWithTypeSettingBasedOnFileExtensionDDoc() throws Exc
@Test
public void createsContainerWithTypeSettingBasedOnFileExtensionBDoc() throws Exception {
- String fileName = "test1.bdoc";
+ String fileName = "testFiles/tmp/test1.bdoc";
Files.deleteIfExists(Paths.get(fileName));
String[] params = new String[]{"-in", fileName, "-add", "testFiles/helper-files/test.txt", "text/plain", "-pkcs12",
@@ -332,7 +334,7 @@ public void createsContainerWithTypeSettingBasedOnFileExtensionBDoc() throws Exc
@Test
public void createsContainerWithTypeSettingBDocIfNoSuitableFileExtensionAndNoType() throws Exception {
System.setProperty("digidoc4j.mode", "TEST");
- String fileName = "test1.test";
+ String fileName = "testFiles/tmp/test1.test";
Files.deleteIfExists(Paths.get(fileName));
String[] params = new String[]{"-in", fileName, "-add", "testFiles/helper-files/test.txt", "text/plain", "-pkcs12",
@@ -348,8 +350,8 @@ public void createsContainerWithTypeSettingBDocIfNoSuitableFileExtensionAndNoTyp
@Test
public void createsContainerAndSignsIt() throws Exception {
exit.expectSystemExitWithStatus(0);
- Files.deleteIfExists(Paths.get("test1.ddoc"));
- String[] params = new String[]{"-in", "test1.ddoc", "-add", "testFiles/helper-files/test.txt", "text/plain", "-pkcs12",
+ Files.deleteIfExists(Paths.get("testFiles/tmp/test1.ddoc"));
+ String[] params = new String[]{"-in", "testFiles/tmp/test1.ddoc", "-add", "testFiles/helper-files/test.txt", "text/plain", "-pkcs12",
"testFiles/p12/signout.p12", "test"};
DigiDoc4J.main(params);
}
@@ -488,15 +490,15 @@ public void commandLineInputCausesDigiDoc4JException() throws Exception {
@Test
public void removeFileFromContainer() throws Exception {
exit.expectSystemExitWithStatus(0);
-
+ String filename = "testFiles/tmp/test1.ddoc";
Container container = ContainerBuilder.
aContainer(DDOC_CONTAINER_TYPE).
build();
container.addDataFile("testFiles/helper-files/test.txt", "text/plain");
- Files.deleteIfExists(Paths.get("test1.ddoc"));
- container.saveAsFile("test1.ddoc");
+ Files.deleteIfExists(Paths.get(filename));
+ container.saveAsFile(filename);
- String[] params = new String[]{"-in", "test1.ddoc", "-remove", "test.txt"};
+ String[] params = new String[]{"-in", filename, "-remove", "test.txt"};
DigiDoc4J.main(params);
}
diff --git a/testFiles/invalid-containers/23133_ddoc-12.ddoc b/testFiles/invalid-containers/23133_ddoc-12.ddoc
new file mode 100644
index 000000000..f0594c978
--- /dev/null
+++ b/testFiles/invalid-containers/23133_ddoc-12.ddoc
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/testFiles/invalid-containers/23181_SignedInfo_topelt_D1_lisatud.ddoc b/testFiles/invalid-containers/23181_SignedInfo_topelt_D1_lisatud.ddoc
new file mode 100644
index 000000000..80244c3df
--- /dev/null
+++ b/testFiles/invalid-containers/23181_SignedInfo_topelt_D1_lisatud.ddoc
@@ -0,0 +1,907 @@
+
+
+/9j/4AAQSkZJRgABAgEASABIAAD/4RPPRXhpZgAATU0AKgAAAAgACAEOAAIAAAAx
+AAAAbgESAAMAAAABAAEAAAEaAAUAAAABAAAAnwEbAAUAAAABAAAApwEoAAMAAAAB
+AAIAAAExAAIAAAAUAAAArwEyAAIAAAAUAAAAw4dpAAQAAAABAAAA2AAAAQRNYWtl
+IGZyaWVuZHMgd2l0aCBhIGxsYW1hIGluIHRoZSBBbmRlcyBvZiBDaGlsZS4AAAAA
+SAAAAAEAAABIAAAAAUFkb2JlIFBob3Rvc2hvcCA3LjAAMjAwMzowMjoyNyAyMzoy
+MToyNgAAAAOgAQADAAAAAf//AACgAgAEAAAAAQAAAWigAwAEAAAAAQAAAP8AAAAA
+AAAABgEDAAMAAAABAAYAAAEaAAUAAAABAAABUgEbAAUAAAABAAABWgEoAAMAAAAB
+AAIAAAIBAAQAAAABAAABYgICAAQAAAABAAASZQAAAAAAAABIAAAAAQAAAEgAAAAB
+/9j/4AAQSkZJRgABAgEASABIAAD/7QAMQWRvYmVfQ00AAv/uAA5BZG9iZQBkgAAA
+AAH/2wCEAAwICAgJCAwJCQwRCwoLERUPDAwPFRgTExUTExgRDAwMDAwMEQwMDAwM
+DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBDQsLDQ4NEA4OEBQODg4UFA4ODg4UEQwM
+DAwMEREMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP/AABEIAFsA
+gAMBIgACEQEDEQH/3QAEAAj/xAE/AAABBQEBAQEBAQAAAAAAAAADAAECBAUGBwgJ
+CgsBAAEFAQEBAQEBAAAAAAAAAAEAAgMEBQYHCAkKCxAAAQQBAwIEAgUHBggFAwwz
+AQACEQMEIRIxBUFRYRMicYEyBhSRobFCIyQVUsFiMzRygtFDByWSU/Dh8WNzNRai
+soMmRJNUZEXCo3Q2F9JV4mXys4TD03Xj80YnlKSFtJXE1OT0pbXF1eX1VmZ2hpam
+tsbW5vY3R1dnd4eXp7fH1+f3EQACAgECBAQDBAUGBwcGBTUBAAIRAyExEgRBUWFx
+IhMFMoGRFKGxQiPBUtHwMyRi4XKCkkNTFWNzNPElBhaisoMHJjXC0kSTVKMXZEVV
+NnRl4vKzhMPTdePzRpSkhbSVxNTk9KW1xdXl9VZmdoaWprbG1ub2JzdHV2d3h5en
+t8f/2gAMAwEAAhEDEQA/AOfyGHHbURWRYD+kDuy18S+v0rrvtFQDQC2oaOMfS3Ba
+AqouADgSDqSY0TnExpcGV7dIFgaJUcZC+hSdkNPUQ9jnVtDWmNg3SCD4/uor7QWA
+vBe4N+iBoqb+mjYLKrnAkiWgDUK5j020kl7w5pA+lyPgmgAEna1xAKz36MhxYTqW
+kdlFljC+TEOES0aq9fRkMoZmNxn3YrjDrwAQANNxb9Pb/LQfQpMvbG08s4KcbrzV
+ohse8g6bqz4jVBLS6IFZ0JLHaEBW2YFdbJr3NDpiddSp2YbGtG4tJ439yUgVNBlP
+qloLhY1h0YAf81yLbh4+U0VvHp7dWhgj73Kz9le4BjXuY4GZbHP8pDqqyK7XAkWe
+XCBTbS/ZFNdnqYr3snRwmQfPVEq6cWtIJ9TefcCIEq845sABlY7fShU8m7MJFe3Z
+ucGusY6duutv9lL1mNa1aDV2rLw210PIIB27drYDgh/bcKqqtmPSLL62xvI0BP75
+VvPxRQ+hu8X1kP2WjlzjwXrKqw7WGyIE+5zQZkeKtY4VDU3r0a+SVy+jWyKuqZOY
+Xn84e4u1+G0Kt1TDtxml9lexxAc1w4cf3lbaGiyXXPDxoR2QOo52NjOx8fKtL63u
+LnF0kkN1Ddo/lJ0qAP7UAa6dH//QanKaNA4FsfS8B4q619Lmbmk7RoJMEk+C58aN
+FRJdURJA4+9RZTe926u1xqP+CAOkfuqLhA1tcJO7azIYdtUCyJDSRqFCq/Mg+rSC
+3aXbg4duVnU9Ix8gBwssD/Hcd4PzVijHe28Cuxz69myHidR+ckY6X0UJatinrD8L
+NrydW1X1VtrqcSGO2OtryK9v+kex3tXRO6K+532hrmsocA6oP+k4Ebh7G/R/tKl0
+vCwa2szupva4473mlh1aXv2b/b+57GbW/vrSzc40NDLHiu52jPUhgc8e9lf/AFPs
+q9RNkQNtV8ImTAdGynVPdQ9lro9rQfpf1Pzfoqk/qbOm2txcIV3ZPqVVZNr9SPWJ
+a6rGa72ub7XVvVzpnUH23kgEMeQGkhrK27ZrO2z97f8AzP8AI9NC670fApyGfWBt
+jWNoB9ert6p9mPbtn2bH7n7Pz7vTSgeLzVOPA1mt2Eu/Rhri5jBbp39v/RRmYD76
+5teKR+a4CQVy3V/rTiNccTGIsvcYsscAWx5KXS/rDYMloyLBbLfSNQ0YWn80fylP
+GBI7V0YJSrZ3z011ziB+lqYYLmGZI8U/2LGN5bU4MeP5xjjwf3kn5GH9ks9Cz0qn
+gGptZ2uDj9NliwrTk4F4daxzgda72gkGP3/3tqMYddj07KMz11Db6jg5LrPUxXWX
+OaNpa4gDX91Zv2XPa4tspdS9hgOncNp8wtzDzvtZFzGsIr+nXO0z5SrssaSHMcN0
+Fo5kFMOScdNRR2XcETq8w79n0OH2p7rHASAGmJ/78sbK6Zf1DM+3sBqaww1vEM7e
+1d6XY4sLL64/dbEEj5/RSc7HfLdga46N01hCeWR02rsoQA2L/9ElOBVUXFvtaDDW
+nUqx9lp0c15a4NO4DkEojcQuymsefReZe90EtHm5SxcfKtdaCGk7zD527mjjaFER
+LtvokUix8Wl9RrO51h4dwpU0uY3aay1sQAdHafSVuqv0HOis2Eg6ToNFFroc1tlZ
+bZr9x4I3JuuxKdGWZgZ9vS6H9Jx/tWY5tjwbf5tjy1wp3bSz6O32b/0fq/ziP9TP
+q5n4dBy+ttY3qFzQ+xzQHPq1/Rs3kWN9R23e/Y79EtHo9zW4YY+11ZaS4gEDg/53
+uj3Lmv8AGN1X0asfEvbc/JrudZVk07mbGHZtr/Rh3q+rUX1b7P8Az4p4wFD81pl2
+dz62P6xh4tl3TunjqtbQ3cxseoGku0ZSxu63b7PfW31FR6jhXXfVTqF1WMMR0U2/
+ZnxLdm1+Rju2j22VP3/y1tfVuxx6Lh/ZCWYrKQwMuk3Bx9zGuc930am+z3f9QjdX
+ya3Y92K07rH0uc4wHbmta73ODdv0Hf56JFHStFA2PN8TuwL3WttbUa7CY3Edpk/y
+VcxqX+qyXAWBw2ta3U68Lostr2PY2kmwsd7bLB7dfpbmLOupzd17KnMr3yA4QWt7
+u2u+l7URlHUarTAnQHTyWsdlUtdcS21of+keIlpHG5jVbyeovrdRU17zXW0O2uOh
+3e6Vk9KBozQ7LyG2475+0gkAOB/fSzOhfWD7SRhPbf0zJJdXdW4OivtW5597Ufd7
+j6oMPFv4+bjY+d61Jba9491NZ+jr790q6frBcCGucWWNO5lb28j93eFl4f1cvZk1
+5FTHUurBFrzq4/mrX6RiW9NynZWSftLR/M1vbvBcf3t30GqI3OQ1peKjHu6OJnZ/
+UWvdkECxkNrAEks8Hn95Qtynts2nHst1LRoBH9pbHTur32U5D7aq8a1jSWUtA7fR
+dKx29W6oy8vzfTsZy5pAaQD+cHN+knnBY1kNFozUdInV/9LYqquxbPs291b7NTSR
+qf630kSp5G9tgh7tGkiGmPzlWquuFm6nQRubw46D94+5FNxeGtgl51nnRQ8d2KP1
+XUyrbYXPLSX1sMSOW/2fzkayim0i59u9oZEwDDv++qlccesetY41vEAP1Bgng7Pp
+K2bHOodtDBIBAHn+dCQIoA71qmtejVz3X1UUZVNhbEuGzRrw10uYf7S53rHUsTqO
+WLNWvaJdW4lrm6/R9Wr8xrnOeui6jUbcP0iS1zPeSRoQfa4iP5S4+/p+R60t03PO
+4wDwP3m/2dyklOgK2WiNl6nC69Vj4FeFjvD7u7/d6bAeXONn846z6T1u9EabnuyH
+uc9lgj3NJY4R6bmtdrs9T+suS6N0iuWWWTYyfTMmYsafT9It/Ne3eurx8o1hzWt1
+AaW+w7LdsS11n+AyGt/RfpnMZZvZ9P8AnEz3CV/BQaGThsBfjvr2WUn2udoTP0Z/
+dWb1DojHFgpuBs2TtMQS4fpAtzLqeMp/scWxLWuIJEgFtbvc/wCiqNm+kw+osruY
+XDc2R5+7+Smkzs0NlORjfV5lFTxb6d+5oDN7RLfPcruNU2ikF2yutogOrMwB+9UF
+E51e6qtjpNxLQWtJ4U2WVCTWWhrwW7mj6Q/dduSBIGo6LSBehSsyA7c6mwOYYgkQ
+iPyWOMbdrYgujQn/AMkqvsYwmsNuc9svZuhzAPj+ckar6qW3PxrK6nwWh7ZLg7vz
+7UjxgX9T4JBCd7g8M9wc6NXgQXt/lfylFwpbMu3Cfonw+arNyC17mh2wwGiRoB/W
++io2Wixksc18u268/EImRO5QKf/TsV59rm1NfjV76+bHSA4H897ZUb8p92M4hlfr
+VmGOD4DoPFjTt2/yVTeMUN3bbbMh35h18m7R/WVqtmHQXMfX6L64BAl8hw5/lP3K
+Pi0/s/aurVLhZdmRQHXE475IdU2Hkx/VGxGsNbq/s+XfbW0S5tmOGjaT/Ksb+k/q
+oX2X0nOyanEt2ta6SRAPHgg2Xn/Cl9lbZDdBE/8AftqF0QVVpRbWAbfVvxyyw1+m
+C224N90OAIr9P873INlVdbvXO6stLWu0nUksZ6vO6t25WujXzY93qPurDNQW7I/q
+KeY60MJxYe8afZ7iatdwOz1X1nZscfour/t/nozNgFdAa0xYXMo9R7ZYW73MZ9Ov
+lrjt93qMZ/4GrFb7gCGF9gBIspa5uy1n+Eqd6xqax+x3r0/pPTssssp/SU3MVGvI
+Frh9ntxfUEuyMG+x1dgg+51drA+zHsp/wvssrs/4P+css4pDrwHVh1M7yX2vbfU+
+GstpFO30Mj9I3/Bv/wCt/wClitlpNaavTrsrrurEBgptb6dlcfvMf8UwLWgG20uI
+OhdOsabR+6p5eRTi477r5e1jg1h3biwWACp1u1pfX6m5rPf+f/g0Cy5jqrXsa4Na
+dxceQCPYdtn0HNd/ON9H/radxV13GyzgJU1opeW0w6Pc5gIkN5d39u5RvFmQ2GtG
+ys+1r4Bh38kfSVcZWZkOc2porqYXS70wDZImy1z/AMyjbZ7HV+rZ69f80iC+xheG
+vssYNobt9Jzpf7WRtbRZb7WPtqZ/59/mEBk02Xez4hjsrr3fqxfod3bU6jVyr5mV
+SK2WZNtrRjiQxsua0Hx2/wA4rozMiD7gK3lrfXeSay4g+5sN9PI+h+ZVivSGUcgt
+trklujXMp3DXV/p2PrdW/wD8L+l66cMoAIrcUtOEnq1aX4+Y1uSH7q3DcGN9sjsP
+d9FCsZUaNzi2podoAJdr+cIR7LMce92K3JcQ720UPLhtP0rqvUY/6f6D1Wf4X/BK
+Qb0tznP9CxlLwSb3b2ek7/uPfU4u+zP2f6VN4r00Qccg/wD/1BPzq8Z7XVB5vrP0
+oI3H86PznK6+3EtuLheXNkOcOHl0btrGO93tcquN9N0T9M/R+nx/KVLG2fbWx6U7
+mzv3ep9L87d7fU/qKCN7aVe/6IXm/wAHZZjttkViwNaNzrX6sJP+D9SxMHdOocQ8
+ENADi0n2hzdCxv3K7Z6fpeyd+5+71N/oxOvrer+i9T/ilUtn7Q76Eb2RMenP/Vep
++7v9ifkEOHSQvwC2PFbcwm02H7XiVvrfsLGVSGlwPu3b3f8AVrNysi5l7buoYOXi
+BrgwZ2NktdWxxIDG5Dsey5j67H+x/wBqp9n+EVzHiMiYn09PWnbwfo7fb6az8b9o
+7m/8pfRd6f7J+w/Z42j+f/8Afn9J9BNoUNe68XZ+jpYuRlWZDKr6LnMqm1l1uO2q
+lrvoMq9Xd6dd3vf+ko/nP9GrD7LC19LaaK7XiN1lj21foz73Os9Kyxvov/N/Qb/5
+pYFkbOoev+1PX2N9P9uz+z93s/nfsf6hu2/Q+1foP5r/AAq1Oren9hf/AE7b6I9O
+PU9Ldvbv9b/Cet/oftX6v/oUCB0Nr7PZVnp59I2VUutaHVjGruDjXDhc7czH2UY1
+nrN+z+p+j9H/AIRRbdabftGV+ibL3bifbWRXU6t+U4ub9otd6f2O7J/01X6LYq+H
+O7qP81tk7fs30Nm7/tV/hNn/AHJ9T9b9f/ri075+0ZUcfZj4c+ufU9Tf/gtu30Pz
+P+4v6b1Uwro7ILKH+uysutcTLbbBDgNh9P1XbXV+k6xlm39BXvss/wCBUG4+OWsq
+YA+wtDKYBc7bO637N6v6TfS30Mira/8AR1/1/UU/bttnZPb9n7t0xX/Mx7P8/wDw
+foI2XP22j1N+71tI/nt2x3Hoez1tv85v/Vvs2z/C+okaXC2owUtc/KYGiwF2y4As
+uNLy5zqry5g9bd+Zlsd/g/p1/wCEM6p1tbnWzfkGwPZY+wgagbd/pGrbuq9v2yhl
+zPs3/F2o+HG6vZO71bt0T6X0f8H6vs/c+2el/wCl1Wqj0Ktv0/sdnE+nxZ/R/U/Q
+/Z9//u3/AIBDTqpVVbi9xqcKXttDKKr2bdrSWsvq9ep1jv0vqerv9Nn6X9Ps2fTA
+9t+52aGPxzY4mxzwHveQHem/9B6jfs+2v0v0Xv8A8FZ6KNjbdo+jshs/Z932adz5
+/wCH+z7v6N/g/wCc/wAGmv2/bnz6u/0aY9Pd6seu3bt2/ofQ3bPsn+E+1fz36L1k
+dFav/9n/7RhuUGhvdG9zaG9wIDMuMAA4QklNBAQAAAAAADwcAgAAAgACHAJ4ADBN
+YWtlIGZyaWVuZHMgd2l0aCBhIGxsYW1hIGluIHRoZSBBbmRlcyBvZiBDaGlsZS44
+QklNBCUAAAAAABDIeVDGXvVvONq12K4oCnqMOEJJTQPtAAAAAAAQAEgAAAABAAEA
+SAAAAAEAAThCSU0EJgAAAAAADgAAAAAAAAAAAAA/gAAAOEJJTQQNAAAAAAAEAAAA
+HjhCSU0EGQAAAAAABAAAAB44QklNA/MAAAAAAAkAAAAAAAAAAAEAOEJJTQQKAAAA
+AAABAAA4QklNJxAAAAAAAAoAAQAAAAAAAAABOEJJTQP1AAAAAABIAC9mZgABAGxm
+ZgAGAAAAAAABAC9mZgABAKGZmgAGAAAAAAABADIAAAABAFoAAAAGAAAAAAABADUA
+AAABAC0AAAAGAAAAAAABOEJJTQP4AAAAAABwAAD/////////////////////////
+////A+gAAAAA/////////////////////////////wPoAAAAAP//////////////
+//////////////8D6AAAAAD/////////////////////////////A+gAADhCSU0E
+CAAAAAAAEAAAAAEAAAJAAAACQAAAAAA4QklNBB4AAAAAAAQAAAAAOEJJTQQaAAAA
+AAM/AAAABgAAAAAAAAAAAAAA/wAAAWgAAAAFAGMAaABpAGwAZQAAAAEAAAAAAAAA
+AAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABaAAAAP8AAAAAAAAAAAAAAAAAAAAAAQAA
+AAAAAAAAAAAAAAAAAAAAAAAQAAAAAQAAAAAAAG51bGwAAAACAAAABmJvdW5kc09i
+amMAAAABAAAAAAAAUmN0MQAAAAQAAAAAVG9wIGxvbmcAAAAAAAAAAExlZnRsb25n
+AAAAAAAAAABCdG9tbG9uZwAAAP8AAAAAUmdodGxvbmcAAAFoAAAABnNsaWNlc1Zs
+THMAAAABT2JqYwAAAAEAAAAAAAVzbGljZQAAABIAAAAHc2xpY2VJRGxvbmcAAAAA
+AAAAB2dyb3VwSURsb25nAAAAAAAAAAZvcmlnaW5lbnVtAAAADEVTbGljZU9yaWdp
+bgAAAA1hdXRvR2VuZXJhdGVkAAAAAFR5cGVlbnVtAAAACkVTbGljZVR5cGUAAAAA
+SW1nIAAAAAZib3VuZHNPYmpjAAAAAQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25n
+AAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRvbWxvbmcAAAD/AAAAAFJnaHRsb25n
+AAABaAAAAAN1cmxURVhUAAAAAQAAAAAAAG51bGxURVhUAAAAAQAAAAAAAE1zZ2VU
+RVhUAAAAAQAAAAAABmFsdFRhZ1RFWFQAAAABAAAAAAAOY2VsbFRleHRJc0hUTUxi
+b29sAQAAAAhjZWxsVGV4dFRFWFQAAAABAAAAAAAJaG9yekFsaWduZW51bQAAAA9F
+U2xpY2VIb3J6QWxpZ24AAAAHZGVmYXVsdAAAAAl2ZXJ0QWxpZ25lbnVtAAAAD0VT
+bGljZVZlcnRBbGlnbgAAAAdkZWZhdWx0AAAAC2JnQ29sb3JUeXBlZW51bQAAABFF
+U2xpY2VCR0NvbG9yVHlwZQAAAABOb25lAAAACXRvcE91dHNldGxvbmcAAAAAAAAA
+CmxlZnRPdXRzZXRsb25nAAAAAAAAAAxib3R0b21PdXRzZXRsb25nAAAAAAAAAAty
+aWdodE91dHNldGxvbmcAAAAAADhCSU0EEQAAAAAAAQEAOEJJTQQUAAAAAAAEAAAA
+AThCSU0EDAAAAAASgQAAAAEAAACAAAAAWwAAAYAAAIiAAAASZQAYAAH/2P/gABBK
+RklGAAECAQBIAEgAAP/tAAxBZG9iZV9DTQAC/+4ADkFkb2JlAGSAAAAAAf/bAIQA
+DAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwM
+DAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwM
+DAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM/8AAEQgAWwCAAwEiAAIR
+AQMRAf/dAAQACP/EAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUB
+AQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQh
+EjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1Rk
+RcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdH
+V2d3h5ent8fX5/cRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEU
+obFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOE
+w9N14/NGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dXZ3eHl6e3x//aAAwD
+AQACEQMRAD8A5/IYcdtRFZFgP6QO7LXxL6/Suu+0VANALaho4x9LcFoCqi4AOBIO
+pJjROcTGlwZXt0gWBolRxkL6FJ2Q09RD2OdW0NaY2DdIIPj+6ivtBYC8F7g36IGi
+pv6aNgsqucCSJaANQrmPTbSSXvDmkD6XI+CaAASdrXEArPfoyHFhOpaR2UWWML5M
+Q4RLRqr19GQyhmY3GfdiuMOvABAA03Fv09v8tB9Cky9sbTyzgpxuvNWiGx7yDpur
+PiNUEtLogVnQksdoQFbZgV1smvc0OmJ11KnZhsa0bi0njf3JSBU0GU+qWguFjWHR
+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
+U37vW0j+e3bHceh7PW2/zm/9W+zbP8L6iRpcLajBS1z8pgaLAXbLgCy40vLnOqvL
+mD1t35mWx3+D+nX/AIQzqnW1udbN+QbA9lj7CBqBt3+katu6r2/bKGXM+zf8Xaj4
+cbq9k7vVu3RPpfR/wfq+z9z7Z6X/AKXVaqPQq2/T+x2cT6fFn9H9T9D9n3/+7f8A
+gENOqlVVuL3Gpwpe20MoqvZt2tJay+r16nWO/S+p6u/02fpf0+zZ9MD237nZoY/H
+NjibHPAe95Ad6b/0HqN+z7a/S/Re/wDwVnoo2Nt2j6OyGz9n3fZp3Pn/AIf7Pu/o
+3+D/AJz/AAaa/b9ufPq7/Rpj093qx67du3b+h9Dds+yf4T7V/PfovWR0Vq//2QA4
+QklNBCEAAAAAAFUAAAABAQAAAA8AQQBkAG8AYgBlACAAUABoAG8AdABvAHMAaABv
+AHAAAAATAEEAZABvAGIAZQAgAFAAaABvAHQAbwBzAGgAbwBwACAANwAuADAAAAAB
+ADhCSU0EBgAAAAAABwABAQEAAQEA/+EVeGh0dHA6Ly9ucy5hZG9iZS5jb20veGFw
+LzEuMC8APD94cGFja2V0IGJlZ2luPSfvu78nIGlkPSdXNU0wTXBDZWhpSHpyZVN6
+TlRjemtjOWQnPz4KPD9hZG9iZS14YXAtZmlsdGVycyBlc2M9IkNSIj8+Cjx4Onhh
+cG1ldGEgeG1sbnM6eD0nYWRvYmU6bnM6bWV0YS8nIHg6eGFwdGs9J1hNUCB0b29s
+a2l0IDIuOC4yLTMzLCBmcmFtZXdvcmsgMS41Jz4KPHJkZjpSREYgeG1sbnM6cmRm
+PSdodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjJyB4
+bWxuczppWD0naHR0cDovL25zLmFkb2JlLmNvbS9pWC8xLjAvJz4KCiA8cmRmOkRl
+c2NyaXB0aW9uIGFib3V0PSd1dWlkOjc0YzdhZGY3LTRhZmQtMTFkNy04MTU1LWMy
+NDY1MmM4Y2I4NicKICB4bWxuczpwZGY9J2h0dHA6Ly9ucy5hZG9iZS5jb20vcGRm
+LzEuMy8nPgogIDwhLS0gcGRmOlN1YmplY3QgaXMgYWxpYXNlZCAtLT4KIDwvcmRm
+OkRlc2NyaXB0aW9uPgoKIDxyZGY6RGVzY3JpcHRpb24gYWJvdXQ9J3V1aWQ6NzRj
+N2FkZjctNGFmZC0xMWQ3LTgxNTUtYzI0NjUyYzhjYjg2JwogIHhtbG5zOnBob3Rv
+c2hvcD0naHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyc+CiAgPCEt
+LSBwaG90b3Nob3A6Q2FwdGlvbiBpcyBhbGlhc2VkIC0tPgogPC9yZGY6RGVzY3Jp
+cHRpb24+CgogPHJkZjpEZXNjcmlwdGlvbiBhYm91dD0ndXVpZDo3NGM3YWRmNy00
+YWZkLTExZDctODE1NS1jMjQ2NTJjOGNiODYnCiAgeG1sbnM6eGFwPSdodHRwOi8v
+bnMuYWRvYmUuY29tL3hhcC8xLjAvJz4KICA8IS0tIHhhcDpEZXNjcmlwdGlvbiBp
+cyBhbGlhc2VkIC0tPgogPC9yZGY6RGVzY3JpcHRpb24+CgogPHJkZjpEZXNjcmlw
+dGlvbiBhYm91dD0ndXVpZDo3NGM3YWRmNy00YWZkLTExZDctODE1NS1jMjQ2NTJj
+OGNiODYnCiAgeG1sbnM6eGFwTU09J2h0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEu
+MC9tbS8nPgogIDx4YXBNTTpEb2N1bWVudElEPmFkb2JlOmRvY2lkOnBob3Rvc2hv
+cDo0ZmNiYjgyNy00YWZkLTExZDctODE1NS1jMjQ2NTJjOGNiODY8L3hhcE1NOkRv
+Y3VtZW50SUQ+CiA8L3JkZjpEZXNjcmlwdGlvbj4KCiA8cmRmOkRlc2NyaXB0aW9u
+IGFib3V0PSd1dWlkOjc0YzdhZGY3LTRhZmQtMTFkNy04MTU1LWMyNDY1MmM4Y2I4
+NicKICB4bWxuczpkYz0naHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8n
+PgogIDxkYzpkZXNjcmlwdGlvbj4KICAgPHJkZjpBbHQ+CiAgICA8cmRmOmxpIHht
+bDpsYW5nPSd4LWRlZmF1bHQnPk1ha2UgZnJpZW5kcyB3aXRoIGEgbGxhbWEgaW4g
+dGhlIEFuZGVzIG9mIENoaWxlLjwvcmRmOmxpPgogICA8L3JkZjpBbHQ+CiAgPC9k
+YzpkZXNjcmlwdGlvbj4KIDwvcmRmOkRlc2NyaXB0aW9uPgoKPC9yZGY6UkRGPgo8
+L3g6eGFwbWV0YT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAog
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAK
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw/eHBhY2tldCBlbmQ9J3cnPz7/
+7gAhQWRvYmUAZIAAAAABAwAQAwIDBgAAAAAAAAAAAAAAAP/bAIQADAgICAkIDAkJ
+DBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwM
+DAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwM
+DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM/8IAEQgA/wFoAwEiAAIRAQMRAf/EAMAA
+AAIDAQEBAAAAAAAAAAAAAAMEAQIFAAYHAQADAQEAAAAAAAAAAAAAAAAAAQIDBBAA
+AwACAwACAgMBAQACAwAAAQIDAAQREgUhExQGEDEiFUEjJDIWBxEAAgIBAgQEAwYC
+BwcEAwAAAQIAEQMhEjFBIgRRYTITcUJSgWJyIxQFkTOhsYKSorLCEMHh0kNTJPDi
+Y5PRoxUSAAICAgEDAwQCAwEAAAAAAAABESEQMVEgQQJhcRKBocEikbEw8DLh/9oA
+DAMBAQIRAxEAAADzfNBzZnsfTb0DwrU6JsdrmtqEm7kc9TQvW4BlH0AeZFLKtSaL
+juALWrya79SoHi+gvL8yP1a1Tmi0ba5hhucNAU0l9Fk7mdp9fKOquagMKWmmlHw2
+s/o7PT0ae73Nr5ZvaImijuI65iOmLLXXvnMUmrHIxOrkyZtnApi46rGBzwqyyOkG
+bmmq8tAjMpOwRJObHWeFayqIayxEejJZV1LqwZKIMWZjKITu5qpysPn+yr0vBLyb
+NBnhxW46VlzSmuQ8sqwvZOEvVLaLPmKwptRgBQwMJEdlmdLaocFvm80jHIWhyqER
+OC1nP0xmFo4Ozjb40XZppHAbDLHZWG3st3yeWm93nOl++Or3Nq8dIyDVIOgQGQgM
+qfI1r567cem8ocPUZ208Lznb/J4gPUZ1yIufiRW+nLNxwiTaGDUcmfPj11m1GTwq
+zSOHtefyvS5szmQRdqbGcsUbELRV8ful5qwO9B0hHUuqoaGmjUpjvNkEzIpZWDNa
+4Ky31tP07XXUrjsSmeLO/RXytDSPB5f07xuuWwvHIWJgo74+1c8R6NzGrwcqpjN4
+e8Pa2A1N61R05dnAODYAOlWVkLbjNPCvs0lY/aPI8qG7esKW0IGrR28XRsJNIhe7
+aYWpnN7QF8/R+hT803ltoLb7bWFvLZYesxM++2Hm/O2xNc2n8bQBvTw27j17vlrB
+s0zdKaxKa4aim35HVz13JobDQZQadGXZtRKs3DnRuFwIya+kjYCRAxsizqXEWmlq
+twOh6EDS+ffTVdj4/wDXGdO8zonOL59me98WV6Oj+rL+HB2A6Z4LTxLlZmGaisOF
+m0Nvz+jcBPm3ludnjy09DXODz7aw891Gg8vr2kQnSTNy/IZWZ5KK6GJRp1kqAaK5
+JOoAw79Wmk+ntRvWa+c1PM1Pkvo3zX6dS9FTMey0OqbPDxQNbNzpGwIqRSvRiBxz
+Neh8/wCqwHCqOdt0l7bdM6uDVWdb/p/OJdXP7B3zGsSst54VL1/YfKtACr/Lsyme
+E2bUCqmVDAwm2tIJil0aDWCl1Z+s+Z+z8kjzv0nxvq0e6Wzs4esDI25rDzfToy/P
+X0FU87iIoUiNVyj6ADLV5IQFWuLNBlm9GUZoOkQ+uo5uqx0tHtDpo1m85UytpgCY
+ATJhIu1qmSJNCutKwy4Xo/N6xGconk9Xe8mwP0dsLXVbO/j6qA4npMEOICMnGc9w
+IGYsCdG19MzHEi6dlBvNkqCRsXUhDdKFubwILZuT6XoDpEpsqt2GGIjOGegymUZC
+AGpQbzHokNJ8sltqZtB0upNj3FdMp2+Y6J7EeXcDrYEsZVpc9wlQbsAwXrWyBt2S
+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
+Vd5E4idVi3L6u0rRG1X7D6cJV/eNLftCXsepR/0o+l/z5XjQNuTmzwm43XYr6P0z
+LP3jJZzp6EYqkrw7b29KSbPq/Y2n6Jhh0n3tXa3n1q/9bXRKbdtmtfO+9POB1NjZ
+3WCR3Xen6/paVwPP86aTGnN3bWmm97OmlB6OnQpNDOaUDdUeh8pTASM9pJbNDObq
+eCjLtdDStneWwBNNgEKWNtekDMiUxvwnOn7f+0GT6Pqvr7ng7kD5un49Nakl612N
+ka4vWdNl9bUD7TpNrq12eG0JpLrTY0KbGL5YVl1AlPIoV1/2X9c2rONPaSulpUkq
+IKT1PLL2p5ysi+Q7PqvDU19r1dsN49XuN9uNbZSj3WNFbT39pRS+r01vOpStqWRf
+qUUhQTFaRbHVCUnMMmutDswWTSohYdQ6bzTP5vdfRtq7Gr+wyl6FNDxrLf8AVf8A
+66PtSMzuSmd3e7y8g0d/R1RPbfVJAkA2xRxIzRJnYmJPsuzps8YvpWkfK9P8iVvN
+8/Yf/nx6/wDORDPSmEfUC4msetdNwZ6aMkqGT121aBE3ToyvU1VugmybllRtpuDT
+7Mn8TsFI+/5CNk7Pzt9g4ioRCit6TV76HobTbXpWZZenHWoZ+Y6Hwvr1kpZFlb1R
+Rr0u19Ok0b3NRPyBrT6V1FVxGlH3dahxiEREor+ckrHa0tZWgkUnLXE1V2BejKy7
+KMkaJTKoihSGErmVdlJURDyGm6hQSEmDk0V24mD9YdO7o6X/AMBVTGlOjrOiZB0Z
+thFZg01RZLR91ODtIIsv7A312rq3rCKUt5tNTTbY9sVfU4C6jq2as5/R6k0Me7o7
+p9i+fBUbb10amz5U8n5aMstGchXULmWjR2nOsSL62UebuJgibCeW2wuJXuP8OG6o
+CoxnSigp1+zqdn0IVT6avRUX8d5xVSGV2oSjO2sYejq7COzgwajJsE4qVnX0qLSe
+7Rc3i6Yn2Tbv1LU5lOgnLRlS9NKc5PKGnrY+zDvtIn2uz4Nmilvts7M8VSpIDEmx
+ZRPYpMwq+0u5qHuqfXiO7I1fidJnGJ5mz96P2xJ8I4ALGik1cm/Wc02rDBuPxNkd
+rsA3+2HXstNWCDTqJoLdjsbCBIs1M2uGjtIQ+3N2yr0nOaUZJaJZdHzVU609dcnV
+aI25sS1rTXb16OCJqOKTSg+xps9+01ooxqKgFqMe80Pbq1Czl5qcmZIjzR8Cqirf
+/bkYaEUpsOR3Kj7aLlLhmINEmlQ1AwIZ1X7XdyzKwpxl9uE1jWVislV9ma8qroq7
+Dmm5KavsatOb6paY1h+Lpym9dbWnr0naiLtm86avr+fuJqS9NK7cbGiTdZpOi02h
+RHWgKvtR77+3OZ09pKJ3jYinVqUIEzriNdQ1ZztxsmpvA7VayYvRkTZCtN1oaWQM
+5DyWY768WYUSsn63dHQ/VSlJiO01h3By0daq60kjiTH1V35q0/R75GjX2t6YOVgK
+B+ayTUWiw0Jr6VGQ60xeaz2U6HY8/wCue5sw2dp2Rp7DnJbU0fa2p7mfUlAdQJV/
+NnsBNLXnLV8uIfb10SnSgz67ONadlTVdpX2PSn9DelPYqkfsWk0Vwg5bWoHpGk5o
+zTPm+u+rl/UlQH1XpKHsa0xv0gYp6oWkNmdsOq9XqGkddbPl/wBY1dtP+D+JmlSe
+vs2ej0+tOy63con46sGskNiOzOiTasNqApSO/pbSy+xNzVPdlTj6W7zVwk5shvAE
+r9k806r3t3m96Lk37FAuRpPtasS/496BfPnNvsaczKjrDVmodph2FaIdajj8ejBJ
+MxUrNJvqu9FgU3PL1755KT1F/MLCLTfNi9CybbSzYTY2lj5mzHbsnYPOs7IlHEbP
+WWoeiFNXdhrNt/eh+1xDWvg8v29d51vSWxAtQN1UuExtkOzMnXvOhfWKApc4NaJQ
+6oyqVXDp1AXU6vStoNtbmxJNT23pZNgEUdXQzBdLznFtwo9N2k1m2x2YXUR0dgZO
+DuaQnNtksjaWw4mNqfNNuKT6fZkticzLalZmRCvf66DrMzlJqdTrt9LtrbNJTtq7
+FPv/APvzeezWUxSLTEKKGZFRCXnVIyY6qWd9XV1l26qIrXTdneM8bYjJ60MyKyvk
+9SdVrqa5SehrvlPD03enj7EWPmegVvqbUR9OzRaS4SMo0y89dUe8loNudKOoA6A5
+savfF+6Kuv2K0kUTZERNJKGWqs3lef1VWNn3Nbbm7fsutDdm+1R9jU9vza+f+wGj
++ps7Xmv537NLbraaJPV2dep2tqcIDbQznb7J3VfxntPXdG2t+stZINtx8ImLeWuU
+WM5yN6Qf0jRuZa5WReuzrTKjWeDM++uUpc67rRln6Sy3bHiYR5lqM587zbmm/Pq6
+7F1lrU2mcv2O6NcJW0+i64bKTfurboOmWBpJ+tIe1Ji22aV1W2E/6N/PXS/ZtS+x
+slfRnrbW1VhsoYpytPy5RP7DbY0N3SffVNWf1029eevTd09jcikqdXnHST8iiIPw
+JebCI10OuvoSuaarV2/ULJL0NnanOs8209bUTbvsS1v/ANfusZ6noeYredLeSm3u
+6cpq9cefRtXboJbLP3fswVNrpIVZfs7N+KtDrq7UGo70Hmkvt67R2Us4ntfa09vz
+/b+zzfZ3Z7EdzSlLZTS22TVRpvpbBDpJtRU1fr9ddr/l7Hl/PnG8/PvZpamurTKX
+nbNZ9p8dtzb1dWe1E6+rr/eVppbUdbztvU1NVfL2H9JNNoX3NhKeZvTuuhSg1Xh6
+E9Z59vRuaxhrrpauvuray1lEV3JtPztsvt7ohOc4dnpZOb7U5iSpsLrkyps2kHXb
+Xj/rT5lOewu7tfjzv+ztF5/vWjNh7MLR6eOl9H0vJ3qXfcKfkXL7e579Em3teQ2p
+Pf2aMuxVZU2fXiiTTx1fX3vLIZLbx82Wxq68b7EdWk/KRvyNDUpJZnzbDcTY2NkS
+2Cs9Naag2m09uktui6ejo+VRdzytpvQv7WpPYtDtK2tQx2ZoXOrXiXnXGU3nDp7B
+oNdHusvNO5gnDSlbYa0qTej0rtI+rqO+RsqKNvWjO3saFjs/rPibo8zwPS8yr/r2
+l9mj+rafnvo+/Df2U1N5460dvVn6HtU66P7PtbUpRb8eoIfpOD7A3/P1L+maar/j
+X9BdeiamxC2u+0K6e3fSidPT1LUFfyK7Jtsae0xpoP8AWdumxuaO48puEU7s9pdc
+X2pW1Uu/mGkLKPs/yF2mr9K60XTXnEZpyf6V0JEQ7a7P+MEeyi0Vl912qT5697bn
+404t7Y147/vftVqH9l/dPr9D0v3HafwfI3Nl9dfIq1q6+nqJo7zanla7f8/VpXb2
+5OpS6RPm+lSZ2/ReoLjUCpPUfWqvpR9L7nrrbqw356a7SyjPX2NyfCbnqnXMtvTq
++j5oWevx5+z59/zZrJEvV/vWs9TQptXG3Pf/AP/aAAgBAgIGPwCURBdocUcZ0SaL
+RWsyiFhJijRPkxrxUoTavEFEdyyJILxWN5shYhKRNlY1ie0kkYWY3JJWYeJxuz5E
+9sXiD4xWiDRaKKJI4Lo2SitCaP8AkjRVlIaP1f0P2RdFNErtmhyiU8OSccvC4Z+p
++ztkreESiEbxPTs5JijcCSfYhL6yWyv/AE+LRHioILxECrZ8otYvOiyaU4iCJE3a
+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
+5Hwnqw5Faf/Z
+
+SGVsbG9Xb3JsZCAyLg==
+
+
+
+
+
+
+
+
+
+
+qo3FsonvQtHneJlBga/CdgJm1AI=
+
+blablablaaaölkjöalskjfölsakjföldskjfölskjflkfdslkdslkjfdskjdslkjlkjdsöpõpko'ölsk'ölmscv'söknd
+
+
+
+
+
+
+Fjv5jKJE4xsB7tt7DgZlAx/JdZo=
+
+
+
+
+XCAdJlvChkfMNZIu/j381ZXZAZY=
+
+
+MJiuLieUPH/l5M3q0i3TAWDL0ScONwGk0pSyRSg2krRTzVWGnHQhAB+sGdfTivQc
+NnXPFZbt3besCUzelEuV7jg0V8sE1PlNR9KX3V4x7A5HA+idxpmECJW3y8Fy8aYq
+Sh36rnpAfGZfvvxjCFPm1VcPAyAFgY2CpEJquAaJipDmJ1HujJt9hyd3tk9GALzy
+QDITQxoNUdSz9xQhhl8c3eeKfRH11Uq9DQ3B9aW0+Lc7KSsxt181PHAScIkooltX
+kXQoD9qM5Fq34A8DFwoWJSIDi+1+7gLFQVEd0bIz5Ei3fNk/Q5DOoxgKRClgRV9T
+QLH5zpDQyv+IsJxjafXFQA
+
+
+
+rzcwimsQgrTkzhLjwdVSo3p+KMbk5NrhSMRpd1vBJ5jQurRkyX3GPwlZ0dJ4gqaK
+Zh4z5i5eB3QU9k2eJwf/0WLnClKMSsx5CpgVeT8EjTRRJIlwYj4reRUXrhNmLiHO
+NyoB8k8nY5kk2/UealeGmH2RgotdwEndtJHPMAzEiZVHgiRMWvqlVykR8OCCmPQT
+C0pFKdx8xrrkJU6iNFvcMx6GOSpCmS6ElA9enTv18fkGw5T3EbcQ+qI1q6y+Dx2R
+LmoVsVPZZOYmtnZrTDkqlbPamA3t/T3VUWQSzUQuS1wS+C5nJJY7D/9hmmeIdRU5
+AM8IIaDISjMXDpvP7VuPbQ==
+af+Ecw==
+
+
+
+MIIFHTCCBAWgAwIBAgIQLpvKAPmyY1xO+w8q2uy8CjANBgkqhkiG9w0BAQUFADBs
+MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1
+czEfMB0GA1UEAwwWVEVTVCBvZiBFU1RFSUQtU0sgMjAxMTEYMBYGCSqGSIb3DQEJ
+ARYJcGtpQHNrLmVlMB4XDTExMTIyODEyNDQyNloXDTE2MDgyMTIwNTk1OVowgZ4x
+CzAJBgNVBAYTAkVFMQ8wDQYDVQQKDAZFU1RFSUQxGjAYBgNVBAsMEWRpZ2l0YWwg
+c2lnbmF0dXJlMSYwJAYDVQQDDB1Nw4ROTklLLE1BUkktTElJUyw0NzEwMTAxMDAz
+MzEQMA4GA1UEBAwHTcOETk5JSzESMBAGA1UEKgwJTUFSSS1MSUlTMRQwEgYDVQQF
+Ews0NzEwMTAxMDAzMzCCASMwDQYJKoZIhvcNAQEBBQADggEQADCCAQsCggEBAK83
+MIprEIK05M4S48HVUqN6fijG5OTa4UjEaXdbwSeY0Lq0ZMl9xj8JWdHSeIKmimYe
+M+YuXgd0FPZNnicH/9Fi5wpSjErMeQqYFXk/BI00USSJcGI+K3kVF64TZi4hzjcq
+AfJPJ2OZJNv1HmpXhph9kYKLXcBJ3bSRzzAMxImVR4IkTFr6pVcpEfDggpj0EwtK
+RSncfMa65CVOojRb3DMehjkqQpkuhJQPXp079fH5BsOU9xG3EPqiNausvg8dkS5q
+FbFT2WTmJrZ2a0w5KpWz2pgN7f091VFkEs1ELktcEvguZySWOw//YZpniHUVOQDP
+CCGgyEozFw6bz+1bj20CBGn/hHOjggGFMIIBgTAJBgNVHRMEAjAAMA4GA1UdDwEB
+/wQEAwIGQDCBmQYDVR0gBIGRMIGOMIGLBgorBgEEAc4fAwEBMH0wWAYIKwYBBQUH
+AgIwTB5KAEEAaQBuAHUAbAB0ACAAdABlAHMAdABpAG0AaQBzAGUAawBzAC4AIABP
+AG4AbAB5ACAAZgBvAHIAIAB0AGUAcwB0AGkAbgBnAC4wIQYIKwYBBQUHAgEWFWh0
+dHA6Ly93d3cuc2suZWUvY3BzLzAnBgNVHREEIDAegRxtYXJpLWxpaXMubWFubmlr
+LjE0QGVlc3RpLmVlMB0GA1UdDgQWBBSCt8pZ5SuxNDL7GfYhrIYOLq+dVjAYBggr
+BgEFBQcBAwQMMAowCAYGBACORgEBMB8GA1UdIwQYMBaAFEG2/sWxsbRTE4z6+mLQ
+NG1tIjQKMEUGA1UdHwQ+MDwwOqA4oDaGNGh0dHA6Ly93d3cuc2suZWUvcmVwb3Np
+dG9yeS9jcmxzL3Rlc3RfZXN0ZWlkMjAxMS5jcmwwDQYJKoZIhvcNAQEFBQADggEB
+AG/Z9xt9YiWSv5OvAMvHABSVmXMMRvpiDCy9ezj+9VEZaawUG92dHkWIUfOCxcs+
+u33IAggz6RTKHiVlWoDJhPfMUfC2bBOhXUVvatcRrqNrnCJtLAt2G/vrBrwgizPu
+MLyyJ0a3sSH1SHdNwwK1Msxk4Dyw0KYaAeEoWrkaGggvaHhu+AkJgb5ANmHw7mTD
+Hnr3nEaU8O0PuLQ8PKVA/k/XFf9F4CqIqGGkL1uX2edJMT/Ts/XPrdU7sqalhXQm
+WkPobqkvWrRoPAVQoKeuz0GMamUqXPgo4VCdBdAGszu7qnVTA+4Ftbk6jH8PTqFb
+Q04iK6PGSDjwEbWl97Qlszk=
+
+
+
+
+
+
+
+
+
+qo3FsonvQtHneJlBga/CdgJm1AI=
+
+
+
+
+XCAdJlvChkfMNZIu/j381ZXZAZY=
+
+
+
+MJiuLieUPH/l5M3q0i3TAWDL0ScONwGk0pSyRSg2krRTzVWGnHQhAB+sGdfTivQc
+NnXPFZbt3besCUzelEuV7jg0V8sE1PlNR9KX3V4x7A5HA+idxpmECJW3y8Fy8aYq
+Sh36rnpAfGZfvvxjCFPm1VcPAyAFgY2CpEJquAaJipDmJ1HujJt9hyd3tk9GALzy
+QDITQxoNUdSz9xQhhl8c3eeKfRH11Uq9DQ3B9aW0+Lc7KSsxt181PHAScIkooltX
+kXQoD9qM5Fq34A8DFwoWJSIDi+1+7gLFQVEd0bIz5Ei3fNk/Q5DOoxgKRClgRV9T
+QLH5zpDQyv+IsJxjafXFQA==
+
+
\ No newline at end of file
diff --git a/testFiles/invalid-containers/BOF.ddoc b/testFiles/invalid-containers/BOF.ddoc
new file mode 100644
index 000000000..595d33eac
--- /dev/null
+++ b/testFiles/invalid-containers/BOF.ddoc
@@ -0,0 +1,155 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+HkK22Q0n40GgKcsg7F66hcCSxv4=
+
+
+
+
+BFJEkB6TFzYUGg9JqIYG5B8kWJk=
+
+
+YnMddhQfdiocTzcX3a4xKRclsdPKG053lIPFguVloTIA0GwNa+yBRmd6aY8zcgHd
+XQ8OLKSBCUEAA2gZrrQBm+gq5vLWlGtnFNXk77aXvFrovCZYbgAxMub6HRA715Zy
+DCg614S34iDZ5UABHTdrgq7asMNeDk3ZV/gTRpJpO84=
+
+
+
+iTz54d671UrFtAakX7SRRZ9KdWm+ONhoCZO54yjq26ul4kc7MQmnUfXsnMlgcSNA
+TleiQtVsB687vM5SzfFBiO/SrA2jW76iSf4nKqq19t9jKCYwOBk6cllfIpaXslk8
+VwV+WqRvZ5aOGL1j91sA/9DUR+KmhTqL2xijVkF53Rc=
++T3t
+
+
+
+MIID9DCCAtygAwIBAgIESBgLwDANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQGEwJF
+RTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEPMA0GA1UECxMG
+RVNURUlEMRcwFQYDVQQDEw5FU1RFSUQtU0sgMjAwNzAeFw0wODA0MzAyMTAwMDBa
+Fw0xMzA0MjgyMTAwMDBaMIGtMQswCQYDVQQGEwJFRTEPMA0GA1UEChMGRVNURUlE
+MRowGAYDVQQLExFkaWdpdGFsIHNpZ25hdHVyZTE3MDUGA1UEAx4uAEsAxADEAFAA
+LABKAEEAQQBOAFUAUwAsADMAOAA4ADAANwAxADMAMAAyADcAOTERMA8GA1UEBB4I
+AEsAxADEAFAxDzANBgNVBCoTBkpBQU5VUzEUMBIGA1UEBRMLMzg4MDcxMzAyNzkw
+gaAwDQYJKoZIhvcNAQEBBQADgY4AMIGKAoGBAIk8+eHeu9VKxbQGpF+0kUWfSnVp
+vjjYaAmTueMo6turpeJHOzEJp1H17JzJYHEjQE5XokLVbAevO7zOUs3xQYjv0qwN
+o1u+okn+JyqqtfbfYygmMDgZOnJZXyKWl7JZPFcFflqkb2eWjhi9Y/dbAP/Q1Efi
+poU6i9sYo1ZBed0XAgQA+T3to4HvMIHsMA4GA1UdDwEB/wQEAwIGQDA8BgNVHR8E
+NTAzMDGgL6AthitodHRwOi8vd3d3LnNrLmVlL2NybHMvZXN0ZWlkL2VzdGVpZDIw
+MDcuY3JsMFEGA1UdIARKMEgwRgYLKwYBBAHOHwEBAQEwNzASBggrBgEFBQcCAjAG
+GgRub25lMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nwcy8wHwYDVR0j
+BBgwFoAUSAbevoyHV5WAeGP6nCMrK6A6GHUwHQYDVR0OBBYEFBbHw4YunSBwwg/l
+9B3BLpKzhW15MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQEFBQADggEBALmBbGMoiH07
+smi77i4SMYOwXzZvqvPViaCQbZhsr+OJnhuXA17xApNmlURUpq9dtlAk7a8ubA0d
+6eRjSIKa9fEe3ywaAoxjBS6TP/KFvAX8wVQs5AzGkimRtsUeayvxsuIXuUAdE2iw
+/9om3RRIDm0Q2k3mXDJnjz2Ds8LcXV7J6uL34bYBj/ROZ6cGX787tJ7/86oK1dQy
+8psfjB9RLfAgQbeo1cR4XUzuQd8ijmQdM7W4W0TPk9V+XCpYXLC2hkmHuWpE4NtY
+m+SHZmzfFDccKmO9jFLCI45BExJ8BPnVRnmbp8DArNMz1CG3J3SvPOhoj1cpcNfm
+drW+BWEuJf8=
+
+
+
\ No newline at end of file
diff --git a/testFiles/invalid-containers/TM-16_unknown.4.asice b/testFiles/invalid-containers/TM-16_unknown.4.asice
new file mode 100644
index 000000000..b9a3f58c2
Binary files /dev/null and b/testFiles/invalid-containers/TM-16_unknown.4.asice differ