diff --git a/ODP/Code/Agents/DemoTestRunner.lsa b/ODP/Code/Agents/DemoTestRunner.lsa
new file mode 100644
index 0000000..401b196
--- /dev/null
+++ b/ODP/Code/Agents/DemoTestRunner.lsa
@@ -0,0 +1,171 @@
+
+
+
+20171113T092958,84+03
+20171114T115058,58+03
+20171114T115058,57+03
+20171114T115058,58+03
+20171113T093000,12+03
+CN=Artem A Areshko/O=LiveScripts/C=RU
+CN=Artem A Areshko/O=LiveScripts/C=RU
+- DemoTestRunner
+- 65413
+-
+
+AAAAAAAAAAA=
+
+- 0
+
+- Es
+- 4
+-
+
+AQAEAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+
+-
+
+gQYAAAAA
+
+- 2
+- fL3
+- 8.5.3
+-
+
+BgABAAAACACqAQAAAAAAAAUAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAwspXANeBJUMjmXMA1IElQwAAAAAAAAAAAAAAAAAAAAAAAAAAqqqqqqqq
+qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
+qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
+qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
+qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
+qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
+qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
+qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
+qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
+qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
+qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
+qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
+qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
+qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
+qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
+qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
+qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
+qqqqqqqqqqqqqqqqqqqqqqqq
+
+-
+
+gQKF/z0FAAAAADEFAAAnKytMb3R1c1NjcmlwdCBEZXZlbG9wbWVudCBFbnZpcm9ubWVudDoyOjU6
+KE9wdGlvbnMpOjA6NzQKJVJFTQoJVGVzdFJ1bm5lcgoJCglDcmVhdGVkOiBPY3QgNiwgMjAxNwoJ
+QXV0aG9yOiBBcnRlbSBBIEFyZXNoa28vTGl2ZVNjcmlwdHMvUlUgKExpdmUtU2NyaXB0cykKCQoJ
+RGVzY3JpcHRpb246IAolRU5EIFJFTQoKT3B0aW9uIFB1YmxpYwpPcHRpb24gRGVjbGFyZQoKVXNl
+ICJydS5saXZlc2NyaXB0cy5kdW5pdC5kZW1vIgoKJVJFTQoJLS0tPT09IENoYW5nZSBMb2cgPT09
+LS0tCgktLS0gVmVyc2lvbjogWC5YLlg7IERELk1NLllZWVk7IE5hbWUKCTEuIAoJCiVFTkQgUkVN
+CgonKytMb3R1c1NjcmlwdCBEZXZlbG9wbWVudCBFbnZpcm9ubWVudDoyOjU6KEZvcndhcmQpOjA6
+MQpEZWNsYXJlIENsYXNzIFRlc3RSdW5uZXIgQXMgQWJzdHJhY3RUZXN0UnVubmVyCkRlY2xhcmUg
+U3ViIEluaXRpYWxpemUKCicrK0xvdHVzU2NyaXB0IERldmVsb3BtZW50IEVudmlyb25tZW50OjI6
+NTooRGVjbGFyYXRpb25zKTowOjEwClByaXZhdGUgQ29uc3QgREVTSUdOID0gIlRlc3RSdW5uZXIi
+CicqKiogVGVzdFJ1bm5lciAqKioKJVJFTQoJRGVzY3JpcHRpb246IAolRU5EIFJFTQpDbGFzcyBU
+ZXN0UnVubmVyIEFzIEFic3RyYWN0VGVzdFJ1bm5lcgoJCgknRG9SdW5UZXN0cwoJJVJFTQoJCURl
+c2NyaXB0aW9uOiAKCSVFTkQgUkVNCglQcml2YXRlIFN1YiBEb1J1blRlc3RzKCkKCQlPbiBFcnJv
+ciBHb1RvIEVycm9ySGFuZGxlcgoJCUNvbnN0IEZ1bmNOYW1lID0gIlRlc3RSdW5uZXIuRG9SdW5U
+ZXN0cyAoKSIKCQkKCQlEaW0gZGVtb1Rlc3QgQXMgTmV3IERlbW9UZXN0KCkKCQkKCQlDYWxsIGRl
+bW9UZXN0LlRlc3RBc3NlcnRFeGFtcGxlKCkKCQlDYWxsIGRlbW9UZXN0LlRlc3RBc3NlcnRFcnJv
+ckV4YW1wbGUoKQoJCQoJCUdvVG8gZW5kaApFcnJvckhhbmRsZXI6CgkJQ2FsbCBNZS5UZXN0RmFp
+bGVkKEVycm9yJCkKCQlSZXN1bWUgTmV4dAplbmRoOgoJRW5kIFN1YgoKRW5kIENsYXNzCicrK0xv
+dHVzU2NyaXB0IERldmVsb3BtZW50IEVudmlyb25tZW50OjI6MjpJbml0aWFsaXplOjE6MTAKU3Vi
+IEluaXRpYWxpemUKCU9uIEVycm9yIEdvVG8gRXJyb3JIYW5kbGVyCglDb25zdCBGdW5jTmFtZSA9
+ICJJbml0aWFsaXplICgpIgoJCglEaW0gdGVzdFJ1bm5lciBBcyBOZXcgVGVzdFJ1bm5lcigpCgkK
+CUNhbGwgdGVzdFJ1bm5lci5SdW4oKQoJCglHb1RvIGVuZGgKRXJyb3JIYW5kbGVyOgoJRXJyb3Ig
+RXJyLCAiKCIgJiBERVNJR04gJiAiKSAiICYgRnVuY05hbWUgJiAiLCBsaW5lICIgJiBFcmwgJiBD
+aHIoMTApICYgRXJyb3IkCmVuZGg6CkVuZCBTdWIKCgAi
+
+-
+
+gQKF/4QSAAAAAHgSAAABAAACTFNPQgMAFAhlbgAABAAlAKMAAAAAAAQLlAQABgAApAcAAAAAAAAA
+ACwAAAEgAEAAAADMAVwAAAAAAAAAAgAAABgAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAYABhgAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAGQBZAFkAWQBAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAFQAJAgAAAAAAAAAAAAAAADkAuQCVABU
+ACQIJAgAAAAAwAfABwAAAAAAAAAAAAAAAIACgAIAAAAAAQAFAExvdHVzIFByb2R1Y3QAAABWMC4w
+AAAAAAAAAAAAAAAAAAAAAAAAAACjAAAAAAAAAAQLAACUBAAAAAAAAAAAAAABAAAAAAAAAAAAAAAA
+AAAAAQAAAAAAAAAAAAAABAAAAFczMkklAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAADAJgEAAAAAFADDQAkAEEAUwBTAEkAUwBUAEEAQwBUAEkATwBOAAAA
+dAADAE4ARQBXAAAAiAAGAEQARQBMAEUAVABFAAAAAAAUAQoASQBOAEkAVABJAEEATABJAFoARQAA
+AAAAkAAJAFQARQBSAE0ASQBOAEEAVABFAAAAyAAGAE8AQgBKAEUAQwBUAAAAAACwAQAAAAAAAEwB
+GQByAHUALgBsAGkAdgBlAHMAYwByAGkAcAB0AHMALgBkAHUAbgBpAHQALgBkAGUAbQBvAAAAMAEZ
+AFIAVQAuAEwASQBWAEUAUwBDAFIASQBQAFQAUwAuAEQAVQBOAEkAVAAuAEQARQBNAE8AAAB4AQYA
+RABFAFMASQBHAE4AAAAAANACCgBUAGUAcwB0AFIAdQBuAG4AZQByAAAAAAAEAgoAVABFAFMAVABS
+AFUATgBOAEUAUgAAAAAA7AESAEEAQgBTAFQAUgBBAEMAVABUAEUAUwBUAFIAVQBOAE4ARQBSAAAA
+AAA8AhkAUgBVAC4ATABJAFYARQBTAEMAUgBJAFAAVABTAC4ARABVAE4ASQBUAC4AQwBPAFIARQAA
+ANQDCgBEAE8AUgBVAE4AVABFAFMAVABTAAAAAACcAgwARQBSAFIATwBSAEgAQQBOAEQATABFAFIA
+AAAAAFQCCABGAFUATgBDAE4AQQBNAEUAAAAAADADGABUAGUAcwB0AFIAdQBuAG4AZQByAC4ARABv
+AFIAdQBuAFQAZQBzAHQAcwAgACgAKQAAAAAAdAIIAEQARQBNAE8AVABFAFMAVAAAAAAA//8MAEEA
+QgBTAFQAUgBBAEMAVABUAEUAUwBUAAAAAAAcAxEAVABFAFMAVABBAFMAUwBFAFIAVABFAFgAQQBN
+AFAATABFAAAA4AIWAFQARQBTAFQAQQBTAFMARQBSAFQARQBSAFIATwBSAEUAWABBAE0AUABMAEUA
+AAAAADwDBABFAE4ARABIAAAAAAD8AgoAVABFAFMAVABGAEEASQBMAEUARAAAAAAAKAMNAEkAbgBp
+AHQAaQBhAGwAaQB6AGUAIAAoACkAAADwAwMAUgBVAE4AAAC8AwEAKAAAAP//AgApACAAAAAAAP//
+BwAsACAAbABpAG4AZQAgAAAAfAMSAFMASQBNAFAATABFAFYAQQBMAFUARQBNAEEAVABDAEgARQBS
+AAAAAAAQBB0AUgBVAC4ATABJAFYARQBTAEMAUgBJAFAAVABTAC4ARABVAE4ASQBUAC4ATQBBAFQA
+QwBIAEUAUgBTAAAATAQIAEkATQBBAFQAQwBIAEUAUgAAAAAA//8LACgAVABlAHMAdABSAHUAbgBu
+AGUAcgAAAP//DQAoAFQAZQBzAHQAUgB1AG4AbgBlAHIAKQAgAAAA//8aACgAVABlAHMAdABSAHUA
+bgBuAGUAcgApACAASQBuAGkAdABpAGEAbABpAHoAZQAgACgAKQAAAAAA//8hACgAVABlAHMAdABS
+AHUAbgBuAGUAcgApACAASQBuAGkAdABpAGEAbABpAHoAZQAgACgAKQAsACAAbABpAG4AZQAgAAAA
+BQAICwAAAACvnUCPGAAAAAAAzACwjjsLAAAAAAAAAAAEAAAAAAYAAAQBBgAAAAAAGAEAAAAAAAAA
+AAAAAAAAABgAAAAEAHwByJU8C8B+NgsEAAAAJgA4ALAWAAALAEAAgAIAAFABAAAAAAAABQAAALgA
+sAoUARQBAAAAAAAAAADwBvAGuAC4AEwKTAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwCrAKAAAA
+AAAAAAC4ABQBAAAZACEAVAAMFwAACABTABQBAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAGABkAIQBUAHgdAAAI
+AFMA8AYAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAEAAAAAAANAEAAAAAAAADAAAAwAFoBWgFaAUAAAAAAAAA
+AMABwAHQBNAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUANAEaAUAABkA
+CAADANAEAAC0AQAAZAEAAAIAAABYAqAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAABYAqAEAAAAAAAAAAAJAAAADAAAABQAAAACAAAAsATABAAAAACwBMAEAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAIAoASgBPABBgAAAAAACAIA
+AAAAAAAAAAAAAAAAACYABABoDQAACwBAAOQCAABAAgAAAAAAAAQAAAD4A/AJUARQBAAAAAAAAAAA
+TAdMB/gD+AMAAAAAAAAAAAAAAAAAAAAA8AnwCQAAAAAAAAAAAAAAAAAAAAAAAOQC+ANQBAAAGQAm
+ADgAUBEAAAsAQADABwAAWAIAAAAAAAACAAAASAOgA6ADoAMAAAAAAAAAAAAAAABIA0gDAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgDoAMAABkAIQDkAoATAAAIAFMAoAMA
+ACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAACEA5AIYFAAACABTAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhAIAC6BEAAAgA
+UwBQBAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAIQCAAoASAAAIAFMATAcAADAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAgAA
+AAAAQAIJBBAAgAINAAgAwATABNABAAA9ABkADQAIAAAAAADUAgAATAAZAAgAEwBoBQAAJAAAAGQB
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAACQAAAFMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAATAAAAAAAwAAAAZAEAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAWAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAIAAAAAAAAAEQAAAAAAAAAAgAAAJgGuAa4BrgGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAJgGmAYAAAAAAAAAAAkAAABdAAAAFAAAAAIAAADIBtgGAAAAAMgG2AYA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAgC4BgAA8AEGAAAA
+AAAAAwAAAAAAAAAAAAAAAAAAAwACAAAAAAA0AQkEEABkAQ0ACADYBtgG0AEAAIUAGQANAAgAAAAA
+ANQCAACcABkAIQBUAKgZAAAIAEMATAoAALQBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAYAGQAhAIACxA0AAAgAUwDw
+CQAAeAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAMABgAJBMAHGQAYAAAAOACAA8B+NguwjjsLCAwAACYApAdMAQAACwBA
+ACQIAABUAwAAAAAAAAIAAAA4CZgJmAmYCQAAAAAAAAAAAAAAADgJOAkAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAACAAAAAAACQIOAmYCQIAGQAmADgAYAYAAAsAQAAAAAAAwAMAAAAAAAAC
+AAAAiAjgCOAI4AgAAAAAAAAAAAAAAACICIgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAIgI4AgAABkAIQAkCGQHAAAIAFMA4AgAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEAJAj8BwAA
+CABTAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhAMAHyAEAAAgAUwCYCQAAJAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAMAAAAA
+AAYAGQAhAMAHqAMAAAgAUwAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQCAAuAQAAAIAFMAAAAAAKACAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAACAAYAAQAhAFQAgBoAAAgAQwCwCgAA5AIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAUABgAGAAYAAAAAABkA
+IQBUAMAYAAAHAFMAAAAAACADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABgAEAKcAAAAAADoAABoOANKUAB0AABoo
+AAsAAAAACTolABorAF6gBCqAAiOmGi0AS6AELEwHIxouAEugBCzwCSMaMAA6DwAaMQAaMgAvTAoW
+IxozAA0aNAAaNQAdMLgAIx0wFAEjHRo6AAsAAAAACTocABo9AF64BipkASOmGj8AS7gGLLAKIzEa
+QQA6FwAaQgAaQwAUfVAEFb+PCgMGQpO/Fr+bERpEABpFAB0CAAAAEQAUAAAAAAD//wEAAwAXAAAA
+GwBEADgACgAAAEE=
+
+- 20171114T115058,57+03
+
diff --git a/ODP/Code/Agents/TestRunner.lsa b/ODP/Code/Agents/TestRunner.lsa
index 31ffe22..52a5402 100644
--- a/ODP/Code/Agents/TestRunner.lsa
+++ b/ODP/Code/Agents/TestRunner.lsa
@@ -1,11 +1,11 @@
-
+
20171013T123825,82+03
-20171111T000748,15+03
-20171111T000748,14+03
-20171111T000748,15+03
+20171114T115058,60+03
+20171114T115058,59+03
+20171114T115058,60+03
20171111T000240,62+03
CN=Artem A Areshko/O=LiveScripts/C=RU
CN=Artem A Areshko/O=LiveScripts/C=RU
@@ -33,8 +33,8 @@ gQYAAAAA
- 8.5.3
-
-BgABAAAACAB2AQAAAAAAAAUAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-AAAAAAAAAAAAAAAAAAAARuZzANSBJUMjmXMA1IElQwAAAAAAAAAAAAAAAAAAAAAAAAAAqqqqqqqq
+BgABAAAACACWAQAAAAAAAAUAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAA4s8jANeBJUMjmXMA1IElQwAAAAAAAAAAAAAAAAAAAAAAAAAAqqqqqqqq
qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
@@ -55,175 +55,85 @@ qqqqqqqqqqqqqqqqqqqqqqqq
-
-gQKF/xkMAAAAAA0MAAAnKytMb3R1c1NjcmlwdCBEZXZlbG9wbWVudCBFbnZpcm9ubWVudDoyOjU6
+gQKF/9oEAAAAAM4EAAAnKytMb3R1c1NjcmlwdCBEZXZlbG9wbWVudCBFbnZpcm9ubWVudDoyOjU6
KE9wdGlvbnMpOjA6NzQKJVJFTQoJVGVzdFJ1bm5lcgoJCglDcmVhdGVkOiBPY3QgNiwgMjAxNwoJ
QXV0aG9yOiBBcnRlbSBBIEFyZXNoa28vTGl2ZVNjcmlwdHMvUlUgKExpdmUtU2NyaXB0cykKCQoJ
RGVzY3JpcHRpb246IAolRU5EIFJFTQoKT3B0aW9uIFB1YmxpYwpPcHRpb24gRGVjbGFyZQoKVXNl
ICJydS5saXZlc2NyaXB0cy5kdW5pdC5jb3JlIgoKJVJFTQoJLS0tPT09IENoYW5nZSBMb2cgPT09
LS0tCgktLS0gVmVyc2lvbjogWC5YLlg7IERELk1NLllZWVk7IE5hbWUKCTEuIAoJCiVFTkQgUkVN
CgonKytMb3R1c1NjcmlwdCBEZXZlbG9wbWVudCBFbnZpcm9ubWVudDoyOjU6KEZvcndhcmQpOjA6
-MQpEZWNsYXJlIENsYXNzIFRlc3RSdW5uZXIKRGVjbGFyZSBTdWIgSW5pdGlhbGl6ZQoKJysrTG90
-dXNTY3JpcHQgRGV2ZWxvcG1lbnQgRW52aXJvbm1lbnQ6Mjo1OihEZWNsYXJhdGlvbnMpOjA6MTAK
-UHJpdmF0ZSBDb25zdCBERVNJR04gPSAiVGVzdFJ1bm5lciIKCicqKiogVGVzdFJ1bm5lciAqKioK
-JVJFTQoJRGVzY3JpcHRpb246IAolRU5EIFJFTQpDbGFzcyBUZXN0UnVubmVyCgkKCSdSdW4KCSVS
-RU0KCQlEZXNjcmlwdGlvbjogCgklRU5EIFJFTQoJUHVibGljIEZ1bmN0aW9uIFJ1bigpCgkJT24g
-RXJyb3IgR29UbyBFcnJvckhhbmRsZXIKCQlDb25zdCBGdW5jTmFtZSA9ICJUZXN0UnVubmVyLlJ1
-biAoKSIKCQkKCQlQcmludCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKCQlQ
-cmludCAiUnVubmluZyB0ZXN0cy4uLiIKCQlQcmludCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
-LS0tLS0tLS0tLSIKCQkKCQlDYWxsIE1lLkRvUnVuVGVzdHMoKQoJCQoJCVByaW50ICItLS0tLS0t
-LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgoJCVByaW50ICJGaW5pc2hlZCB0ZXN0cyIKCQlQ
-cmludCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKCQkKCQlDYWxsIE1lLlBy
-aW50UmVzdWx0KCkKCQlQcmludCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIK
-CQkKCQlHb1RvIGVuZGgKRXJyb3JIYW5kbGVyOgoJCUVycm9yIEVyciwgIigiICYgREVTSUdOICYg
-IikgIiAmIEZ1bmNOYW1lICYgIiwgbGluZSAiICYgRXJsICYgQ2hyKDEwKSAmIEVycm9yJAplbmRo
-OgoJRW5kIEZ1bmN0aW9uCgkKCSdSdW5UZXN0cwoJJVJFTQoJCURlc2NyaXB0aW9uOiAKCSVFTkQg
-UkVNCglQcml2YXRlIFN1YiBEb1J1blRlc3RzKCkKCQlPbiBFcnJvciBHb1RvIEVycm9ySGFuZGxl
-cgoJCUNvbnN0IEZ1bmNOYW1lID0gIlRlc3RSdW5uZXIuUnVuVGVzdHMgKCkiCgkJCgkJJ092ZXJy
-aWRlCgkJCgkJR29UbyBlbmRoCkVycm9ySGFuZGxlcjoKCQlDYWxsIE1lLlRlc3RGYWlsZWQoRXJy
-b3IkKQoJCVJlc3VtZSBOZXh0CmVuZGg6CglFbmQgU3ViCgkKCSdUZXN0RmFpbGVkCgklUkVNCgkJ
-RGVzY3JpcHRpb246IAoJJUVORCBSRU0KCVByaXZhdGUgU3ViIFRlc3RGYWlsZWQoZXJyb3JTdHJp
-bmcgQXMgU3RyaW5nKQoJCU9uIEVycm9yIEdvVG8gRXJyb3JIYW5kbGVyCgkJQ29uc3QgRnVuY05h
-bWUgPSAiVGVzdFJ1bm5lci5UZXN0RmFpbGVkICgpIgoJCQoJCURpbSB0ZXN0TmFtZSBBcyBTdHJp
-bmcKCQkKCQl0ZXN0TmFtZSA9IE1lLkdldFRlc3ROYW1lKEVycm9yJCkKCQlDYWxsIFRlc3RDb250
-ZXh0KCkuU2V0VGVzdFN0YXR1cyh0ZXN0TmFtZSwgTFNfVEVTVF9TVEFUVVNfRkFJTEVEKQoJCVBy
-aW50IHRlc3ROYW1lICYgIjogIiAmIExTX1RFU1RfU1RBVFVTX0ZBSUxFRAoJCQoJCUdvVG8gZW5k
-aApFcnJvckhhbmRsZXI6CgkJRXJyb3IgRXJyLCAiKCIgJiBERVNJR04gJiAiKSAiICYgRnVuY05h
-bWUgJiAiLCBsaW5lICIgJiBFcmwgJiBDaHIoMTApICYgRXJyb3IkCmVuZGg6CglFbmQgU3ViCgkK
-CSdHZXRUZXN0TmFtZQoJJVJFTQoJCURlc2NyaXB0aW9uOiAKCSVFTkQgUkVNCglQcml2YXRlIEZ1
-bmN0aW9uIEdldFRlc3ROYW1lKGVycm9yU3RyaW5nIEFzIFN0cmluZykKCQlPbiBFcnJvciBHb1Rv
-IEVycm9ySGFuZGxlcgoJCUNvbnN0IEZ1bmNOYW1lID0gIlRlc3RSdW5uZXIuR2V0VGVzdE5hbWUg
-KCkiCgkJCgkJR2V0VGVzdE5hbWUgPSBTdHJSaWdodChTdHJMZWZ0KGVycm9yU3RyaW5nJCwgIiwi
-KSwgIikgIikKCQkKCQlHb1RvIGVuZGgKRXJyb3JIYW5kbGVyOgoJCUVycm9yIEVyciwgIigiICYg
-REVTSUdOICYgIikgIiAmIEZ1bmNOYW1lICYgIiwgbGluZSAiICYgRXJsICYgQ2hyKDEwKSAmIEVy
-cm9yJAplbmRoOgoJRW5kIEZ1bmN0aW9uCgkKCSdQcmludFJlc3VsdAoJJVJFTQoJCURlc2NyaXB0
-aW9uOiAKCSVFTkQgUkVNCglQcml2YXRlIFN1YiBQcmludFJlc3VsdCgpCgkJT24gRXJyb3IgR29U
-byBFcnJvckhhbmRsZXIKCQlDb25zdCBGdW5jTmFtZSA9ICJUZXN0UnVubmVyLlByaW50UmVzdWx0
-ICgpIgoJCQoJCURpbSByZXN1bHQgQXMgVGVzdFJlc3VsdAoJCQoJCVNldCByZXN1bHQgPSBUZXN0
-Q29udGV4dC5HZXRSZXN1bHQoKQoJCVByaW50ICJUZXN0cyBzdW1tYXJ5LiBUb3RhbDogIiAmIHJl
-c3VsdC5Ub3RhbCAmICI7IFN1Y2Nlc3M6ICIgJiBfCgkJcmVzdWx0LlN1Y2Nlc3MgJiAiOyBGYWls
-ZWQ6ICIgJiByZXN1bHQuRmFpbGVkCgkJCgkJR29UbyBlbmRoCkVycm9ySGFuZGxlcjoKCQlFcnJv
-ciBFcnIsICIoIiAmIERFU0lHTiAmICIpICIgJiBGdW5jTmFtZSAmICIsIGxpbmUgIiAmIEVybCAm
-IENocigxMCkgJiBFcnJvciQKZW5kaDoKCUVuZCBTdWIKCkVuZCBDbGFzcwonKytMb3R1c1Njcmlw
-dCBEZXZlbG9wbWVudCBFbnZpcm9ubWVudDoyOjI6SW5pdGlhbGl6ZToxOjEwClN1YiBJbml0aWFs
-aXplCglPbiBFcnJvciBHb1RvIEVycm9ySGFuZGxlcgoJQ29uc3QgRnVuY05hbWUgPSAiSW5pdGlh
-bGl6ZSAoKSIKCQoJRGltIHRlc3RSdW5uZXIgQXMgTmV3IFRlc3RSdW5uZXIKCQoJQ2FsbCB0ZXN0
-UnVubmVyLlJ1bigpCgkKCUdvVG8gZW5kaApFcnJvckhhbmRsZXI6CglFcnJvciBFcnIsICIoIiAm
-IERFU0lHTiAmICIpICIgJiBGdW5jTmFtZSAmICIsIGxpbmUgIiAmIEVybCAmIENocigxMCkgJiBF
-cnJvciQKZW5kaDoKRW5kIFN1YgoAIg==
+MQpEZWNsYXJlIENsYXNzIFRlc3RSdW5uZXIgQXMgQWJzdHJhY3RUZXN0UnVubmVyCkRlY2xhcmUg
+U3ViIEluaXRpYWxpemUKCicrK0xvdHVzU2NyaXB0IERldmVsb3BtZW50IEVudmlyb25tZW50OjI6
+NTooRGVjbGFyYXRpb25zKTowOjEwClByaXZhdGUgQ29uc3QgREVTSUdOID0gIlRlc3RSdW5uZXIi
+CicqKiogVGVzdFJ1bm5lciAqKioKJVJFTQoJRGVzY3JpcHRpb246IAolRU5EIFJFTQpDbGFzcyBU
+ZXN0UnVubmVyIEFzIEFic3RyYWN0VGVzdFJ1bm5lcgoJCgknRG9SdW5UZXN0cwoJJVJFTQoJCURl
+c2NyaXB0aW9uOiAKCSVFTkQgUkVNCglQcml2YXRlIFN1YiBEb1J1blRlc3RzKCkKCQlPbiBFcnJv
+ciBHb1RvIEVycm9ySGFuZGxlcgoJCUNvbnN0IEZ1bmNOYW1lID0gIlRlc3RSdW5uZXIuRG9SdW5U
+ZXN0cyAoKSIKCQkKCQknSW1wbGVtZW50CgkJCgkJR29UbyBlbmRoCkVycm9ySGFuZGxlcjoKCQlD
+YWxsIE1lLlRlc3RGYWlsZWQoRXJyb3IkKQoJCVJlc3VtZSBOZXh0CmVuZGg6CglFbmQgU3ViCgpF
+bmQgQ2xhc3MKJysrTG90dXNTY3JpcHQgRGV2ZWxvcG1lbnQgRW52aXJvbm1lbnQ6MjoyOkluaXRp
+YWxpemU6MToxMApTdWIgSW5pdGlhbGl6ZQoJT24gRXJyb3IgR29UbyBFcnJvckhhbmRsZXIKCUNv
+bnN0IEZ1bmNOYW1lID0gIkluaXRpYWxpemUgKCkiCgkKCURpbSB0ZXN0UnVubmVyIEFzIE5ldyBU
+ZXN0UnVubmVyKCkKCQoJQ2FsbCB0ZXN0UnVubmVyLlJ1bigpCgkKCUdvVG8gZW5kaApFcnJvckhh
+bmRsZXI6CglFcnJvciBFcnIsICIoIiAmIERFU0lHTiAmICIpICIgJiBGdW5jTmFtZSAmICIsIGxp
+bmUgIiAmIEVybCAmIENocigxMCkgJiBFcnJvciQKZW5kaDoKRW5kIFN1YgoKCgA=
-
-gQKF/6QYAAAAAJgYAAABAAACTFNPQgQAFAhlbgAABAAxAAACAAAAAPgKTAl4BwAABAAAAAAAAAAA
-ACwAyAAgAEAAAABYAVwAAAAAAAAAAwAAABgAOAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-eAd4BxgAGAA4CjgKAAAAAAAAAAAAAAAAAQAAAGgIaAhoCGgIAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAADgAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAA
-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgFzAjMCMwIAAAAAAAAAAAAAAAAAAAA
-AAgFCAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAFAExvdHVzIFByb2R1Y3QAAABWMC4w
-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAPgKAABMCQAAAAAAAAAAAAABAAAAAAAAAAAAAAAA
+gQKF/8wLAAAAAMALAAABAAACTFNPQgMAFAhlbgAABAAUAIQAAAAAALwFRAO4AwAABAAAAAAAAAAA
+ACwAyAAgAEAAAACUAVwAAAAAAAAAAgAAABgAuAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+uAO4AxgAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAFABUAFQAVABAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAQABA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAFAExvdHVzIFByb2R1Y3QAAABWMC4w
+AAAAAAAAAAAAAAAAAAAAAAAAAACEAAAAAAAAALwFAABEAwAAAAAAAAAAAAABAAAAAAAAAAAAAAAA
AAAAAQAAAAAAAAAAAAAABAAAAFczMkklAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-AAAAAAAAAAAAAAAAAAAAAAAIAAgAAAAAAEwJAAADAFAJAAAAAFwEDQAkAEEAUwBTAEkAUwBUAEEA
-QwBUAEkATwBOAAAAdAADAE4ARQBXAAAAiAAGAEQARQBMAEUAVABFAAAAAAAUAQoASQBOAEkAVABJ
-AEEATABJAFoARQAAAAAAkAAJAFQARQBSAE0ASQBOAEEAVABFAAAAMAEGAE8AQgBKAEUAQwBUAAAA
-AACQAQAAAAAAAHgBGQByAHUALgBsAGkAdgBlAHMAYwByAGkAcAB0AHMALgBkAHUAbgBpAHQALgBj
-AG8AcgBlAAAAAAEZAFIAVQAuAEwASQBWAEUAUwBDAFIASQBQAFQAUwAuAEQAVQBOAEkAVAAuAEMA
-TwBSAEUAAABMAQYARABFAFMASQBHAE4AAAAAANQCCgBUAGUAcwB0AFIAdQBuAG4AZQByAAAAAADs
-AgoAVABFAFMAVABSAFUATgBOAEUAUgAAAAAAuAEDAFIAVQBOAAAA5AIMAEUAUgBSAE8AUgBIAEEA
-TgBEAEwARQBSAAAAAAAEAggARgBVAE4AQwBOAEEATQBFAAAAAAAsAhEAVABlAHMAdABSAHUAbgBu
-AGUAcgAuAFIAdQBuACAAKAApAAAAAAQiAD0APQA9AD0APQA9AD0APQA9AD0APQA9AD0APQA9AD0A
-PQA9AD0APQA9AD0APQA9AD0APQA9AD0APQA9AD0APQA9AD0AAAAAAJQCEABSAHUAbgBuAGkAbgBn
-ACAAdABlAHMAdABzAC4ALgAuAAAAAAB4AiIALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0A
-LQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAAAAAAUAQKAEQATwBSAFUATgBU
-AEUAUwBUAFMAAAAAALgCDgBGAGkAbgBpAHMAaABlAGQAIAB0AGUAcwB0AHMAAAAAAHgDCwBQAFIA
-SQBOAFQAUgBFAFMAVQBMAFQAAAD4AgQARQBOAEQASAAAAAAAQAMBACgAAAAMAwIAKQAgAAAAAABc
-AwcALAAgAGwAaQBuAGUAIAAAAJQEFgBUAGUAcwB0AFIAdQBuAG4AZQByAC4AUgB1AG4AVABlAHMA
-dABzACAAKAApAAAAAADkAwoAVABFAFMAVABGAEEASQBMAEUARAAAAAAAsAMLAEUAUgBSAE8AUgBT
-AFQAUgBJAE4ARwAAAMgDGABUAGUAcwB0AFIAdQBuAG4AZQByAC4AVABlAHMAdABGAGEAaQBsAGUA
-ZAAgACgAKQAAAAAAfAUIAFQARQBTAFQATgBBAE0ARQAAAAAAYAYLAEcARQBUAFQARQBTAFQATgBB
-AE0ARQAAACAECwBUAEUAUwBUAEMATwBOAFQARQBYAFQAAABQBQ0AUwBFAFQAVABFAFMAVABTAFQA
-QQBUAFUAUwAAANQEFQBMAFMAXwBUAEUAUwBUAF8AUwBUAEEAVABVAFMAXwBGAEEASQBMAEUARAAA
-AAQFAgA6ACAAAAAAAMgIGQBUAGUAcwB0AFIAdQBuAG4AZQByAC4ARwBlAHQAVABlAHMAdABOAGEA
-bQBlACAAKAApAAAAnAQBACwAAADoBBkAVABlAHMAdABSAHUAbgBuAGUAcgAuAFAAcgBpAG4AdABS
-AGUAcwB1AGwAdAAgACgAKQAAAGAFBgBSAEUAUwBVAEwAVAAAAAAAsAYKAFQARQBTAFQAUgBFAFMA
-VQBMAFQAAAAAABwFCQBHAEUAVABSAEUAUwBVAEwAVAAAAJAFFgBUAGUAcwB0AHMAIABzAHUAbQBt
-AGEAcgB5AC4AIABUAG8AdABhAGwAOgAgAAAAAACsBQUAVABPAFQAQQBMAAAAwAULADsAIABTAHUA
-YwBjAGUAcwBzADoAIAAAAP//BwBTAFUAQwBDAEUAUwBTAAAA4AUKADsAIABGAGEAaQBsAGUAZAA6
-ACAAAAAAAPwFBgBGAEEASQBMAEUARAAAAAAAHAYNAEkAbgBpAHQAaQBhAGwAaQB6AGUAIAAoACkA
-AAAABwsAKABUAGUAcwB0AFIAdQBuAG4AZQByAAAA//8NACgAVABlAHMAdABSAHUAbgBuAGUAcgAp
-ACAAAABgBx4AKABUAGUAcwB0AFIAdQBuAG4AZQByACkAIABUAGUAcwB0AFIAdQBuAG4AZQByAC4A
-UgB1AG4AIAAoACkAAAAAALQHJQAoAFQAZQBzAHQAUgB1AG4AbgBlAHIAKQAgAFQAZQBzAHQAUgB1
-AG4AbgBlAHIALgBSAHUAbgAgACgAKQAsACAAbABpAG4AZQAgAAAA//8lACgAVABlAHMAdABSAHUA
-bgBuAGUAcgApACAAVABlAHMAdABSAHUAbgBuAGUAcgAuAFQAZQBzAHQARgBhAGkAbABlAGQAIAAo
-ACkAAAD//ywAKABUAGUAcwB0AFIAdQBuAG4AZQByACkAIABUAGUAcwB0AFIAdQBuAG4AZQByAC4A
-VABlAHMAdABGAGEAaQBsAGUAZAAgACgAKQAsACAAbABpAG4AZQAgAAAAAAAUCCYAKABUAGUAcwB0
-AFIAdQBuAG4AZQByACkAIABUAGUAcwB0AFIAdQBuAG4AZQByAC4ARwBlAHQAVABlAHMAdABOAGEA
-bQBlACAAKAApAAAAAABoCC0AKABUAGUAcwB0AFIAdQBuAG4AZQByACkAIABUAGUAcwB0AFIAdQBu
-AG4AZQByAC4ARwBlAHQAVABlAHMAdABOAGEAbQBlACAAKAApACwAIABsAGkAbgBlACAAAAAECSYA
-KABUAGUAcwB0AFIAdQBuAG4AZQByACkAIABUAGUAcwB0AFIAdQBuAG4AZQByAC4AUAByAGkAbgB0
-AFIAZQBzAHUAbAB0ACAAKAApAAAAAAD//y0AKABUAGUAcwB0AFIAdQBuAG4AZQByACkAIABUAGUA
-cwB0AFIAdQBuAG4AZQByAC4AUAByAGkAbgB0AFIAZQBzAHUAbAB0ACAAKAApACwAIABsAGkAbgBl
-ACAAAAD//xoAKABUAGUAcwB0AFIAdQBuAG4AZQByACkAIABJAG4AaQB0AGkAYQBsAGkAegBlACAA
-KAApAAAAAAD//yEAKABUAGUAcwB0AFIAdQBuAG4AZQByACkAIABJAG4AaQB0AGkAYQBsAGkAegBl
-ACAAKAApACwAIABsAGkAbgBlACAAAAANAAgAAAAAAPgKAAAFAPwKAAAAAKcM4rQYAAAAAADMADjI
-eAgAAAAAAAAAAAQAAAB4BwAABAEGAAAAAAAYAQAAAAAAAAAAAAAAAAAACwAQAAAAAAA0AQAAAAAA
-AAcAAACUAOAG4AbgBgAAAABQA1ADgAGAAUgGSAZYAkgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-lACUAAAAAAAAAAAASAbgBgAAGQAHABMAgAEAAFABAAA4AAAAAgAAACwBQAEAAAAAAAAAAAAAAAAA
-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEABQAEsASwBAAAAAAcAAAAMAAAAEAAAAAIA
-AABgAXABAAAAAGABcAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-AAMAAQBAAQAAUAEAAAAAAAAZABkABAACAAAAAAB8AQYAAAAAAJQBAAAAAAAAAAAAAAAAAAANAAgA
-cAFwAVwBAABkABkADQAIAAAAAADYAgAAewAZAAgAAwBYAgAAfAIAADgAAAABAAAAGAIYAgAAAAAA
-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAIYAgAAAAAAAAAACAAAAIIA
-AAAQAAAAAgAAADgCSAIAAAAAOAJIAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-AAAAAAAAAAAABAACAAAAAAB8AQYAAAAAABADAAAAAAAAAAAAAAAAAAANAAgASAJIAlwBAACUABkA
-DQAIAAAAAADYAgAAowAZAAgAAwBQA0gERAMAADgAAAADAAAA8AIgA/AC8AIAAAAAAAAAAAAAAAAA
-AAAAAAAAAAAAAAAAAAAAAAAAACADIAMAAAAAAAMAAwAAAAABAAAACgAAAKoAAAAUAAAAAgAAADAD
-QAMAAAAAMANAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAB
-AAADAABgAwYAAAAAAAQAAgAgAwAAfAEGAAAAAAB8AwAAAAAAAAAAAAAAAAAAAwACAAAAAAC0AwYA
-EAAAAA0ACABAA0ADXAEAAOoAGQANAAgAAAAAANgCAAABARkABwADAEgEAADMAwAAOAAAAAMAAADo
-AwgE+AP4AwAAAADoA+gDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIBAgEAAAAAAEA
-AAAFAAAACAEAABAAAAACAAAAKAQ4BAAAAAAoBDgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-AAAAAAAAAAAAAAAAAAAAAAADAAEA+AMAAMwDAAAAAAAAAwABAAgEAABgAwYAAQAAAAQAAgAAAAAA
-fAEGAAAAAABgBAAAAAAAAAAAAAAAAAAADQAIADgEOARcAQAANgEZAA0ACAAAAAAA2AIAAE0BGQAI
-AAMASAYAALwCAAA4AAAAAgAAAOAEGAYAAAAAAAAAAAAAAAAYBhgGAAAAAAAAAAAAAAAAAAAAAAAA
-AAAAAAAAAAAAAOAE4AQAAAAAAAAAAAkAAABUAQAAFAAAAAIAAAAoBjgGAAAAACgGOAYAAAAAAAAA
-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAgAYBgAAfAEGAAAAAACgBAAA
-AAAAAAAAAAAAAAAAJgAEAPgPAAALAEAAzAgAAOwEAAAAAAAABQAAAGwF7ArIBcgFAAAAAAAAAADs
-CuwKbAXYCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADECsQKCAAAAAAAAABsBcgFAAAZACEA
-CAWEEAAACABTAMgF2AokAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAGABkAIQAIBWARAAAIAFMAxAoAADAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAADAEgDAAAAAMACDQAkAEEAUwBTAEkAUwBUAEEAQwBUAEkATwBOAAAA
+dAADAE4ARQBXAAAAiAAGAEQARQBMAEUAVABFAAAAAAAUAQoASQBOAEkAVABJAEEATABJAFoARQAA
+AAAAkAAJAFQARQBSAE0ASQBOAEEAVABFAAAAMAEGAE8AQgBKAEUAQwBUAAAAAAB4AQAAAAAAAEwB
+GQByAHUALgBsAGkAdgBlAHMAYwByAGkAcAB0AHMALgBkAHUAbgBpAHQALgBjAG8AcgBlAAAAAAEZ
+AFIAVQAuAEwASQBWAEUAUwBDAFIASQBQAFQAUwAuAEQAVQBOAEkAVAAuAEMATwBSAEUAAABQAgYA
+RABFAFMASQBHAE4AAAAAAAQCCgBUAGUAcwB0AFIAdQBuAG4AZQByAAAAAADMAQoAVABFAFMAVABS
+AFUATgBOAEUAUgAAAAAAtAESAEEAQgBTAFQAUgBBAEMAVABUAEUAUwBUAFIAVQBOAE4ARQBSAAAA
+AACEAgoARABPAFIAVQBOAFQARQBTAFQAUwAAAAAAFAIMAEUAUgBSAE8AUgBIAEEATgBEAEwARQBS
+AAAAAAD//wgARgBVAE4AQwBOAEEATQBFAAAAAABkAhgAVABlAHMAdABSAHUAbgBuAGUAcgAuAEQA
+bwBSAHUAbgBUAGUAcwB0AHMAIAAoACkAAAAAAHACBABFAE4ARABIAAAAAAAwAgoAVABFAFMAVABG
+AEEASQBMAEUARAAAAAAAXAINAEkAbgBpAHQAaQBhAGwAaQB6AGUAIAAoACkAAACgAgMAUgBVAE4A
+AAD8AgEAKAAAAP//AgApACAAAAAAAP//BwAsACAAbABpAG4AZQAgAAAA//8LACgAVABlAHMAdABS
+AHUAbgBuAGUAcgAAAP//DQAoAFQAZQBzAHQAUgB1AG4AbgBlAHIAKQAgAAAA//8aACgAVABlAHMA
+dABSAHUAbgBuAGUAcgApACAASQBuAGkAdABpAGEAbABpAHoAZQAgACgAKQAAAAAA//8hACgAVABl
+AHMAdABSAHUAbgBuAGUAcgApACAASQBuAGkAdABpAGEAbABpAHoAZQAgACgAKQAsACAAbABpAG4A
+ZQAgAAAABQDABQAAAAClAg0/GAAAAAAAzADoC7AKAAAAAAAAAAAEAAAAuAMAAAQBBgAAAAAAGAEA
+AAAAAAAAAAAAAAAAACYABACwFgAACwBAAAAAAABQAQAAAAAAAAUAAACkAGgFAAEAAQAAAAAAAAAA
+qASoBKQApAAEBQQFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaAVoBQAAAAAAAAAApAAAAQAAGQAh
+AEAADBcAAAgAUwAAAQAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEABgAZACEAQAB4HQAACABTAKgEAAAwAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-AAAAAAAAAAMAAgAAAAAA2AQJBBAACAUNAAgAOAY4BlwBAACaARkADQAIAAAAAADYAgAAsQEZAAgA
-EwDgBgAAJAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALgBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAATAAAAAAAwAAAAOAAAAAAAAAAA
+AAAAAAAAAAALABAAAAAAADQBAAAAAAAAAwAAAKwBIAMgAyADAAAAAAAAAACsAawBiAKIAgAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQACIAiADAAAZAAgAAwCIAgAAfAEAAFAB
+AAABAAAASAJIAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAJI
+AgAAAAAAAAAACAAAAAwAAAAQAAAAAgAAAGgCeAIAAAAAaAJ4AgAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAZAAQAAgAAAAAAuAEGAAAAAADQAQAAAAAAAAAAAAAA
+AAAADQAIAHgCeAKYAQAAHgAZAA0ACAAAAAAACAIAAC0AGQAIABMAIAMAACQAAABQAQAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-AAAAAAAAuQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-AAAAAAAAAAAAAAAAAAAAAAAIAAAAOAoAAEQAAAAAAAAAAgAAABAIMAgwCDAIAAAAAAAAAAAAAAAA
-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAIEAgAAAAAAAAAAAkAAAC6AQAAFAAAAAIAAABA
-CFAIAAAAAEAIUAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQA
-AgAwCAAAfAEGAAAAAADEBQAAAAAAAAAAAAAAAAAAAwACAAAAAAA0AQkEEAA4AA0ACABQCFAIXAEA
-AOIBGQANAAgAAAAAANgCAAD5ARkAIQAEAPASAAAHAGAAAAAAAOgDCQQAAAAAAAAAAAAAAAAAAAAA
-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAkEzAgG
-AAkEzAgZACYABAAkCAAACwBAAAAAAADoAwAAAAAAAAQAAAAwCWAKiAmICQAAAAAAAAAAAAAAADAJ
-MAkAAAAAAAAAAAAAAABgCmAK4AngCQAAAAAAAAAAAAAAAAQAAAAAAAAAMAmICQAAGQAhAMwIaAsA
-AAgAUwCICQAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQDMCAAMAAAIAFMA4AkAADAAAAAAAAAAAAAAAAAAAAAA
-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEA
-zAh4CQAACABTAGAKAAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAwAGAAYABgAZAAQAAAAAAAAAJAQGAAAAAACwBQAA
-AAAAAAAAAAAAAAAAIQDMCHAKAAAHAFMAAAAAAAgFCQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAkECAUGAAkECAUGABwA
-CAVUEAAAAwBTANgKAABUBQEAHAAIBWQQAAADAFMA7AoAAIAFAQAcAAgFdBAAAAMAUwAAAAAAsAUB
-AAQABAIAAAAAOgAAGg4A0pQAHQAAGikACwAAAAAJOkwAGiwAfbwBPwEaLQB9CAI/ARouAH0wAj8B
-GjAAL4ABIxoyAH0wAj8BGjMAfZgCPwEaNAB9MAI/ARo2AC9IBCMaNwB9vAE/ARo5ADoXABo6ABo7
-ABR9ZAYVv48KAwZCk78Wv5sRGjwAGj0AHRpEAAsAAAAACToGABpJADoPABpKABpLAC9YAhYjGkwA
-DRpNABpOAB0aVQALAAAAAAk6NAAaWgBeIAMvUAMWI5ulGlsAKWgIIyzgCV4gA32wBSMaXABKIAN9
-VAS/fbAFvz8BGl4AOhcAGl8AGmAAFH0EBxW/jwoDBkKTvxa/mxEaYQAaYgAdGmkACwAAAAAJOiIA
-GmwAXegDSfgDfZgEkAAAgAamffACkAAAgAanpRpuADoXABpvABpwABR9uAcVv48KAwZCk78Wv5sR
-GnEAGnIAHRp5AAsAAAAACTo6ABp+AF4YBiloCCMsYAojphqAAH0gBUsYBk3ECr99ZAW/SxgGTdgK
-v32UBb9LGAZN7Aq/PwEaggA6FwAagwAahAAUfWwIFb+PCgMGQpO/Fr+bERqFABqGAB0dHRqLAAsA
-AAAACTocABqOAF4wCCo4ACOmGpAASzAILJQAIzEakgA6FwAakwAalAAUfQgJFb+PCgMGQpO/Fr+b
-ERqVABqWAB0CAAAAEQAUAAAAAAD//wEAAwAXAAAAGwBEAIkACgAAAA==
+AAgAAAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAgAEwAAAAAAMAAAAFABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAADkAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAA
+AAAAAABEAAAAAAAAAAIAAABQBHAEcARwBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAABQBFAEAAAAAAAAAAAJAAAAPgAAABQAAAACAAAAgASQBAAAAACABJAEAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAIAcAQAALgBBgAAAAAANAIAAAAA
+AAAAAAAAAAAAAAMAAgAAAAAANAEJBBAAUAENAAgAkASQBJgBAABmABkADQAIAAAAAAAIAgAAfQAZ
+ACEAQACoGQAACABDAAQFAAB8AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAGABkAIQBAAIAaAAAIAEMAaAUAABgCAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAQAFAAYABgAGAAAAAAAZACEAQADAGAAABwBTAAAAAABUAgAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAYA
+BACIAAAAAAA6AAAaDgDSlAAdAAAaKAALAAAAAAk6BgAaLQA6DwAaLgAaLwAvBAUWIxowAA0aMQAa
+MgAdMKQAIx0wAAEjHRo3AAsAAAAACTocABo6AF5wBCpQASOmGjwAS3AELGgFIzEaPgA6FwAaPwAa
+QAAUfQADFb+PCgMGQpO/Fr+bERpBABpCAB0CAAAAEQAUAAAAAAD//wEAAwAXAAAAGwBEADUACgAA
+AA==
-- 20171111T000748,13+03
+- 20171114T115058,58+03
diff --git a/ODP/Code/ScriptLibraries/ru.livescripts.dunit.core.lss b/ODP/Code/ScriptLibraries/ru.livescripts.dunit.core.lss
index 6207490..0f788c1 100644
--- a/ODP/Code/ScriptLibraries/ru.livescripts.dunit.core.lss
+++ b/ODP/Code/ScriptLibraries/ru.livescripts.dunit.core.lss
@@ -13,8 +13,25 @@ Option Declare
%REM
---=== Change Log ===---
- --- Version: X.X.X; DD.MM.YYYY; Name
- 1.
+ --- Version: 1.1.0; 12.11.2017; Artem Areshko
+ 1. Added consts
+ LS_TEST_ERROR_MATCHER_PARAM
+ LS_TEST_ERROR_OTHER
+
+ 2. Renamed methods for Assert class
+ AssertTrue -> True
+ AssertFalse -> False
+ AssertEquals -> Equals
+
+ 3. Added methods
+ Assert.NotNothing()
+ TestContext.InitLog()
+ TextContext.Log()
+ TextContext.CloseLog()
+
+ 4. Deleted method Assert.AssertError()
+
+ 5. Added class AbstractTestRunner
%END REM
@@ -24,6 +41,7 @@ Declare Class IMatcher
Declare Public Class TestContext
Declare Class AbstractTest
Declare Class TestResult
+Declare Class AbstractTestRunner
Declare Static Function Assert() As Assert
Declare Static Function TestContext() As TestContext
@@ -31,6 +49,8 @@ Declare Static Function TestContext() As TestContext
Private Const DESIGN = "ru.livescripts.dunit.core"
Public Const LS_TEST_ERROR_ASSERT_FAIL = 3999
+Public Const LS_TEST_ERROR_MATCHER_PARAM = 3998
+Public Const LS_TEST_ERROR_OTHER = 3997
Public Const LS_TEST_STATUS_NOT_RUNNED = "Not runned"
Public Const LS_TEST_STATUS_OK = "OK"
@@ -38,35 +58,36 @@ Public Const LS_TEST_STATUS_FAILED = "FAILED"
Private Const LS_TEST_ERRORMSG_ASSERT_FAIL = "Assert failed: "
+
'*** Assert ***
%REM
Description:
%END REM
Class Assert
- 'AssertTrue
+ 'True
%REM
Description:
%END REM
- Public Sub AssertTrue(actual As Boolean)
- If Not actual Then Call Me.Throwerror("AssertTrue")
+ Public Sub True(actual As Boolean)
+ If Not actual Then Call Me.Throwerror("True")
End Sub
- 'AssertFalse
+ 'False
%REM
Description:
%END REM
- Public Sub AssertFalse(actual As Boolean)
- If actual Then Call Me.Throwerror("AssertFalse")
+ Public Sub False(actual As Boolean)
+ If actual Then Call Me.Throwerror("False")
End Sub
- 'AssertEquals
+ 'Equals
%REM
Description:
%END REM
- Public Sub AssertEquals(matcher As IMatcher)
+ Public Sub Equals(matcher As IMatcher)
On Error GoTo ErrorHandler
- Const FuncName = "Assert.AssertEquals ()"
+ Const FuncName = "Assert.Equals ()"
If Not Matcher.Matches() Then Call Me.Throwerror(funcName)
@@ -76,12 +97,23 @@ ErrorHandler:
endh:
End Sub
- 'AssertError
+ 'NotNothing
%REM
Description:
%END REM
- Public Sub AssertError(expected As Integer, actual As Variant)
- If expected <> actual Then Call Me.Throwerror("AssertError")
+ Public Sub NotNothing(actual As Variant)
+ On Error GoTo ErrorHandler
+ Const FuncName = "Assert.NotNothing ()"
+
+ If Not IsObject(actual) Then
+ Error LS_TEST_ERROR_OTHER, {actual is not an object}
+ End If
+ If actual Is Nothing Then Call Me.Throwerror("NotNothing")
+
+ GoTo endh
+ErrorHandler:
+ Error Err, "(" & DESIGN & ") " & FuncName & ", line " & Erl & Chr(10) & Error$
+endh:
End Sub
'ThrowError
@@ -115,6 +147,10 @@ Public Class TestContext
Private tests List As String
+ Private stream As NotesStream
+ Private logFolder As String
+ Private logFileName As String
+
'Add
%REM
Description:
@@ -153,7 +189,7 @@ endh:
%END REM
Public Function GetResult() As TestResult
On Error GoTo ErrorHandler
- Const FuncName = "SetTestStatus.GetResult ()"
+ Const FuncName = "TestContext.GetResult ()"
Dim result As New TestResult()
@@ -174,6 +210,63 @@ ErrorHandler:
Error Err, "(" & DESIGN & ") " & FuncName & ", line " & Erl & Chr(10) & Error$
endh:
End Function
+
+ 'InitLog
+ %REM
+ Description:
+ %END REM
+ Public Sub InitLog(logFolder As String)
+ On Error GoTo ErrorHandler
+ Const FuncName = "TestContext.InitLog ()"
+
+ Dim session As New NotesSession
+ Set stream = session.Createstream()
+
+ Me.logFolder = logFolder
+ If Me.logFolder = "" Then
+ Me.logFolder = Environ("TEMP")
+ End If
+ logFileName = Me.logFolder & "\" & Format(Now, "yyyy_mm_dd hh_mm_ss") & ".txt"
+ Call stream.Open(logFileName, "UTF-8")
+
+ GoTo endh
+ErrorHandler:
+ Error Err, "(" & DESIGN & ") " & FuncName & ", line " & Erl & Chr(10) & Error$
+endh:
+ End Sub
+
+ 'CloseLog
+ %REM
+ Description:
+ %END REM
+ Public Sub CloseLog()
+ On Error GoTo ErrorHandler
+ Const FuncName = "TestContext.CloseLog ()"
+
+ Call stream.Close()
+ Print "Test detials saved to: " & logFileName
+
+ GoTo endh
+ErrorHandler:
+ Error Err, "(" & DESIGN & ") " & FuncName & ", line " & Erl & Chr(10) & Error$
+endh:
+ End Sub
+
+ 'Log
+ %REM
+ Description:
+ %END REM
+ Public Sub Log(message As String)
+ On Error GoTo ErrorHandler
+ Const FuncName = "TestContext.Log ()"
+
+ Call stream.Writetext(message, EOL_PLATFORM)
+
+ GoTo endh
+ErrorHandler:
+ Error Err, "(" & DESIGN & ") " & FuncName & ", line " & Erl & Chr(10) & Error$
+endh:
+ End Sub
End Class
'*** AbstractTest ***
@@ -206,8 +299,8 @@ endh:
On Error GoTo ErrorHandler
Const FuncName = "AbstractTest.EndTest ()"
- Call TestContext().SetTestStatus(Testname, LS_TEST_STATUS_OK)
- Print testName & ": " & LS_TEST_STATUS_OK
+ Call TestContext.SetTestStatus(Testname, LS_TEST_STATUS_OK)
+ Call TestContext.Log(testName & ": " & LS_TEST_STATUS_OK)
GoTo endh
ErrorHandler:
@@ -244,6 +337,154 @@ ErrorHandler:
endh:
End Sub
+End Class
+'*** AbstractTestRunner ***
+%REM
+ Description:
+%END REM
+Class AbstractTestRunner
+
+ 'New
+ %REM
+ Description:
+ %END REM
+ Public Sub New()
+ On Error GoTo ErrorHandler
+ Const FuncName = "AbstractTestRunner.New ()"
+
+ Call Me.Initialize()
+
+ GoTo endh
+ErrorHandler:
+ Error Err, "(" & DESIGN & ") " & FuncName & ", line " & Erl & Chr(10) & Error$
+endh:
+ End Sub
+
+ 'Initialize
+ %REM
+ Description:
+ %END REM
+ Private Sub Initialize()
+ On Error GoTo ErrorHandler
+ Const FuncName = "AbstractTestRunner.Initialize ()"
+
+ Call TestContext.Initlog("")
+
+ GoTo endh
+ErrorHandler:
+ Error Err, "(" & DESIGN & ") " & FuncName & ", line " & Erl & Chr(10) & Error$
+endh:
+ End Sub
+
+ 'Run
+ %REM
+ Description:
+ %END REM
+ Public Function Run()
+ On Error GoTo ErrorHandler
+ Const FuncName = "AbstractTestRunner.Run ()"
+
+ Call TestContext.Log("Started running tests at " & Now)
+ Call TestContext.Log("----------------------------------")
+
+ Call Me.DoRunTests()
+
+ Call TestContext.Log("----------------------------------")
+ Call TestContext.Log("Finished tests at " & Now)
+ Call TestContext.Log("----------------------------------")
+
+ Call Me.PrintResult()
+
+ GoTo endh
+ErrorHandler:
+ Error Err, "(" & DESIGN & ") " & FuncName & ", line " & Erl & Chr(10) & Error$
+endh:
+ End Function
+
+ 'RunTests
+ %REM
+ Description:
+ %END REM
+ Private Sub DoRunTests()
+ On Error GoTo ErrorHandler
+ Const FuncName = "AbstractTestRunner.RunTests ()"
+
+ 'Override
+
+ GoTo endh
+ErrorHandler:
+ Call Me.TestFailed(Error$)
+ Resume Next
+endh:
+ End Sub
+
+ 'TestFailed
+ %REM
+ Description:
+ %END REM
+ Private Sub TestFailed(stackTraceString As String)
+ On Error GoTo ErrorHandler
+ Const FuncName = "AbstractTestRunner.TestFailed ()"
+
+ Dim testName As String
+
+ testName = Me.GetTestName(Error$)
+ Call TestContext.SetTestStatus(testName, LS_TEST_STATUS_FAILED)
+ Call TestContext.Log(testName & ": " & LS_TEST_STATUS_FAILED)
+
+ Dim stackTrace As Variant
+ stackTrace = Split(stackTraceString, Chr(10))
+ ForAll elem In stackTrace
+ Print elem
+ End ForAll
+
+ GoTo endh
+ErrorHandler:
+ Error Err, "(" & DESIGN & ") " & FuncName & ", line " & Erl & Chr(10) & Error$
+endh:
+ End Sub
+
+ 'GetTestName
+ %REM
+ Description:
+ %END REM
+ Private Function GetTestName(errorString As String)
+ On Error GoTo ErrorHandler
+ Const FuncName = "AbstractTestRunner.GetTestName ()"
+
+ GetTestName = StrRight(StrLeft(errorString$, ","), ") ")
+
+ GoTo endh
+ErrorHandler:
+ Error Err, "(" & DESIGN & ") " & FuncName & ", line " & Erl & Chr(10) & Error$
+endh:
+ End Function
+
+ 'PrintResult
+ %REM
+ Description:
+ %END REM
+ Private Sub PrintResult()
+ On Error GoTo ErrorHandler
+ Const FuncName = "AbstractTestRunner.PrintResult ()"
+
+ Dim result As TestResult
+
+ Set result = TestContext.GetResult()
+
+ Dim summary As String
+ summary = "Tests summary. Total: " & result.Total & "; Success: " & _
+ result.Success & "; Failed: " & result.Failed
+
+ Call TestContext.Log(summary)
+ Print summary
+
+ GoTo endh
+ErrorHandler:
+ Error Err, "(" & DESIGN & ") " & FuncName & ", line " & Erl & Chr(10) & Error$
+endh:
+ End Sub
+
End Class
'++LotusScript Development Environment:2:1:Assert:5:8
'Assert
@@ -291,3 +532,10 @@ ErrorHandler:
endh:
End Function
+
+
+
+
+
+
+
diff --git a/ODP/Code/ScriptLibraries/ru.livescripts.dunit.core.lss.metadata b/ODP/Code/ScriptLibraries/ru.livescripts.dunit.core.lss.metadata
index c9fc237..980b832 100644
--- a/ODP/Code/ScriptLibraries/ru.livescripts.dunit.core.lss.metadata
+++ b/ODP/Code/ScriptLibraries/ru.livescripts.dunit.core.lss.metadata
@@ -1,16 +1,16 @@
-
-20171013T123811,76+03
-20171111T000748,11+03
-20171111T000748,10+03
-20171111T000748,11+03
-20171111T000240,60+03
+
+20171112T145059,52+03
+20171114T115058,42+03
+20171114T115058,41+03
+20171114T115058,42+03
+20171112T145059,58+03
CN=Artem A Areshko/O=LiveScripts/C=RU
CN=Artem A Areshko/O=LiveScripts/C=RU
-- s34Q
- 1
- ru.livescripts.dunit.core
- 8.5.3
-- 1.0.0
+- s34Q
+- 1.1.0
\ No newline at end of file
diff --git a/ODP/Code/ScriptLibraries/ru.livescripts.dunit.demo.lss b/ODP/Code/ScriptLibraries/ru.livescripts.dunit.demo.lss
new file mode 100644
index 0000000..5937c9e
--- /dev/null
+++ b/ODP/Code/ScriptLibraries/ru.livescripts.dunit.demo.lss
@@ -0,0 +1,84 @@
+'++LotusScript Development Environment:2:5:(Options):0:74
+%REM
+ ru.livescripts.dunit.demo
+
+ Created: Nov 13, 2017
+ Author Artem A Areshko/LiveScripts/RU (Live-Scripts)
+
+ Description:
+%END REM
+
+Option Public
+Option Declare
+
+%Include "lsconst.lss"
+
+Use "ru.livescripts.dunit.matchers"
+
+%REM
+ ---=== Change Log ===---
+ --- Version: X.X.X; DD.MM.YYYY; Name
+ 1.
+
+%END REM
+
+'++LotusScript Development Environment:2:5:(Forward):0:1
+Declare Class DemoTest As AbstractTest
+
+'++LotusScript Development Environment:2:5:(Declarations):0:10
+Private Const DESIGN = "ru.livescripts.dunit.demo"
+
+'*** DemoTest ***
+%REM
+ Description:
+%END REM
+Class DemoTest As AbstractTest
+
+ 'AssertTest
+ %REM
+ Description:
+ %END REM
+ Public Sub TestAssertExample()
+ On Error GoTo ErrorHandler
+ Const FuncName = "DemoTest.TestAssertExample ()"
+
+ Call Me.BeginTest(funcName)
+
+ Call Assert.True(1 = 1)
+
+ Dim simpleValueMatcher As New SimpleValueMatcher(1, 1)
+ Call Assert.Equals(simpleValueMatcher)
+
+ Call Me.EndTest(funcName)
+
+ GoTo endh
+ErrorHandler:
+ Error Err, "(" & DESIGN & ") " & FuncName & ", line " & Erl & Chr(10) & Error$
+endh:
+ End Sub
+
+ 'TestAssertErrorExample
+ %REM
+ Description:
+ %END REM
+ Public Sub TestAssertErrorExample()
+ On Error GoTo ErrorHandler
+ Const FuncName = "DemoTest.TestAssertErrorExample ()"
+
+ Call Me.BeginTest(funcName)
+
+ Const TEST_ERROR_CODE = 5000
+
+ On Error TEST_ERROR_CODE GoTo AssertErrorHandler
+ Error TEST_ERROR_CODE, "Test assert error"
+
+ GoTo endh
+AssertErrorHandler:
+ Call Me.EndTest(funcName)
+ Resume endh
+ErrorHandler:
+ Error Err, "(" & DESIGN & ") " & FuncName & ", line " & Erl & Chr(10) & Error$
+endh:
+ End Sub
+
+End Class
\ No newline at end of file
diff --git a/ODP/Code/ScriptLibraries/ru.livescripts.dunit.demo.lss.metadata b/ODP/Code/ScriptLibraries/ru.livescripts.dunit.demo.lss.metadata
new file mode 100644
index 0000000..aeddd83
--- /dev/null
+++ b/ODP/Code/ScriptLibraries/ru.livescripts.dunit.demo.lss.metadata
@@ -0,0 +1,15 @@
+
+
+20171113T091624,22+03
+20171114T115058,56+03
+20171114T115058,55+03
+20171114T115058,56+03
+20171113T091624,37+03
+CN=Artem A Areshko/O=LiveScripts/C=RU
+CN=Artem A Areshko/O=LiveScripts/C=RU
+- ru.livescripts.dunit.demo
+- s34Q
+- 1
+- 8.5.3
+
+
\ No newline at end of file
diff --git a/ODP/Code/ScriptLibraries/ru.livescripts.dunit.matchers.lss b/ODP/Code/ScriptLibraries/ru.livescripts.dunit.matchers.lss
index 1aa45be..bed96a8 100644
--- a/ODP/Code/ScriptLibraries/ru.livescripts.dunit.matchers.lss
+++ b/ODP/Code/ScriptLibraries/ru.livescripts.dunit.matchers.lss
@@ -15,18 +15,26 @@ Use "ru.livescripts.dunit.core"
%REM
---=== Change Log ===---
- --- Version: X.X.X; DD.MM.YYYY; Name
- 1.
+ --- Version: 1.1.0; 12.11.2017; Artem Areshko
+ 1. Added classes
+ DatabaseMatcher
+ DocumentMatcher
+
+ 2. Modified DocumentItemsMatcher.New()
+ Added params validation
%END REM
'++LotusScript Development Environment:2:5:(Forward):0:1
Declare Class SimpleValueMatcher As IMatcher
Declare Class DocumentItemsMatcher As IMatcher
+Declare Class DatabaseMatcher As IMatcher
+Declare Class DocumentMatcher As IMatcher
'++LotusScript Development Environment:2:5:(Declarations):0:10
Private Const DESIGN = "ru.livescripts.dunit.matchers"
+
'*** SimpleValueMatcher ***
%REM
Description:
@@ -89,6 +97,10 @@ Class DocumentItemsMatcher As IMatcher
On Error GoTo ErrorHandler
Const FuncName = "DocumentItemsMatcher.New ()"
+ If doc1 Is Nothing Then Error LS_TEST_ERROR_MATCHER_PARAM, {doc1 is Nothing}
+ If doc2 Is Nothing Then Error LS_TEST_ERROR_MATCHER_PARAM, {doc2 is Nothing}
+ If Not IsArray(itemNames) Then Error LS_TEST_ERROR_MATCHER_PARAM, {itemNames must be an array}
+
Set Me.doc1 = doc1
Set Me.doc2 = doc2
Me.itemNames = itemNames
@@ -145,4 +157,133 @@ ErrorHandler:
endh:
End Function
+End Class
+'*** DatabaseMatcher ***
+%REM
+ Description:
+%END REM
+Class DatabaseMatcher As IMatcher
+
+ Private db1 As NotesDatabase
+ Private db2 As NotesDatabase
+
+ 'New
+ %REM
+ Description:
+ %END REM
+ Public Sub New(db1 As NotesDatabase, db2 As NotesDatabase)
+ On Error GoTo ErrorHandler
+ Const FuncName = "DatabaseMatcher.New ()"
+
+ If db1 Is Nothing Then Error LS_TEST_ERROR_MATCHER_PARAM, {db1 is Nothing}
+ If db2 Is Nothing Then Error LS_TEST_ERROR_MATCHER_PARAM, {db2 is Nothing}
+
+ Set Me.db1 = db1
+ Set Me.db2 = db2
+
+ GoTo endh
+ErrorHandler:
+ Error Err, "(" & DESIGN & ") " & FuncName & ", line " & Erl & Chr(10) & Error$
+endh:
+ End Sub
+
+ 'Matches
+ %REM
+ Description:
+ %END REM
+ Public Function Matches() As Boolean
+ On Error GoTo ErrorHandler
+ Const FuncName = "DatabaseMatcher.Matches ()"
+
+ If db1.Replicaid <> db2.Replicaid Or _
+ db1.Filepath <> db2.Filepath Or _
+ db1.Title <> db2.Title Then GoTo endh
+
+ Matches = True
+
+ GoTo endh
+ErrorHandler:
+ Error Err, "(" & DESIGN & ") " & FuncName & ", line " & Erl & Chr(10) & Error$
+endh:
+ End Function
+
+End Class
+'*** DocumentMatcher ***
+%REM
+ Description:
+%END REM
+Class DocumentMatcher As IMatcher
+
+ Private doc1 As NotesDocument
+ Private doc2 As NotesDocument
+
+ 'New
+ %REM
+ Description:
+ %END REM
+ Public Sub New(doc1 As NotesDocument, doc2 As NotesDocument)
+ On Error GoTo ErrorHandler
+ Const FuncName = "DocumentMatcher.New ()"
+
+ If doc1 Is Nothing Then Error LS_TEST_ERROR_MATCHER_PARAM, {doc1 is Nothing}
+ If doc2 Is Nothing Then Error LS_TEST_ERROR_MATCHER_PARAM, {doc2 is Nothing}
+
+ Set Me.doc1 = doc1
+ Set Me.doc2 = doc2
+
+ GoTo endh
+ErrorHandler:
+ Error Err, "(" & DESIGN & ") " & FuncName & ", line " & Erl & Chr(10) & Error$
+endh:
+ End Sub
+
+ 'Matches
+ %REM
+ Description:
+ %END REM
+ Public Function Matches() As Boolean
+ On Error GoTo ErrorHandler
+ Const FuncName = "DocumentMatcher.Matches ()"
+
+ If doc1.Universalid <> doc2.Universalid Then GoTo endh
+
+ Dim dbMatcher As New DatabaseMatcher(doc1.Parentdatabase, doc2.Parentdatabase)
+ If Not dbMatcher.Matches() Then GoTo endh
+
+ Dim items1 As Variant
+ Dim items2 As Variant
+
+ items1 = doc1.Items
+ items2 = doc2.Items
+
+ If (IsArray(items1) And Not IsArray(items2)) Or _
+ (Not IsArray(items2) And IsArray(items2)) Then GoTo endh
+
+ If IsArray(items1) And IsArray(items2) Then
+ If UBound(items1) <> UBound(items2) Then GoTo endh
+
+ Dim i%
+ Dim itemsList1 List As Boolean
+ For i = 0 To UBound(items1)
+ itemsList1(items1(i).Name) = False
+ Next
+
+ Dim itemNames2() As String
+ ReDim itemNames2 (0 To UBound(items2))
+ For i = 0 To UBound(items2)
+ If Not IsElement(itemsList1(items2(i).Name)) Then GoTo endh
+ itemNames2(i) = items2(i).Name
+ Next
+ Dim docItemsMatcher As New DocumentItemsMatcher(doc1, doc2, itemNames2)
+ If Not docItemsMatcher.Matches() Then GoTo endh
+ End If
+
+ Matches = True
+
+ GoTo endh
+ErrorHandler:
+ Error Err, "(" & DESIGN & ") " & FuncName & ", line " & Erl & Chr(10) & Error$
+endh:
+ End Function
+
End Class
\ No newline at end of file
diff --git a/ODP/Code/ScriptLibraries/ru.livescripts.dunit.matchers.lss.metadata b/ODP/Code/ScriptLibraries/ru.livescripts.dunit.matchers.lss.metadata
index cce7ba8..90fb3b4 100644
--- a/ODP/Code/ScriptLibraries/ru.livescripts.dunit.matchers.lss.metadata
+++ b/ODP/Code/ScriptLibraries/ru.livescripts.dunit.matchers.lss.metadata
@@ -1,9 +1,9 @@
-
+
20171013T124409,08+03
-20171111T000748,13+03
-20171111T000748,12+03
-20171111T000748,13+03
+20171114T115058,53+03
+20171114T115058,52+03
+20171114T115058,53+03
20171111T000240,64+03
CN=Artem A Areshko/O=LiveScripts/C=RU
CN=Artem A Areshko/O=LiveScripts/C=RU
@@ -11,6 +11,6 @@
- 1
- ru.livescripts.dunit.matchers
- 8.5.3
-- 1.0.0
+- 1.1.0
\ No newline at end of file
diff --git a/ODP/Views/(untitled).view b/ODP/Views/(untitled).view
index 9bf3f17..8485bb7 100644
--- a/ODP/Views/(untitled).view
+++ b/ODP/Views/(untitled).view
@@ -1,11 +1,11 @@
-
+
20171013T123657,10+03
-20171111T000748,17+03
-20171111T000748,16+03
-20171111T000748,17+03
+20171114T115058,62+03
+20171114T115058,61+03
+20171114T115058,62+03
20171111T000240,19+03
CN=Artem A Areshko/O=LiveScripts/C=RU
CN=Artem A Areshko/O=LiveScripts/C=RU