From 96facdae9419bf4e29d68e39453d3c4f92e48c22 Mon Sep 17 00:00:00 2001 From: Girish Date: Thu, 15 Aug 2024 00:10:48 -0400 Subject: [PATCH] SITE-4191 --- common-config/pom.xml | 7 +- webapp/pom.xml | 94 +- .../healthcare/ttt/webapp/Application.java | 5 +- .../resources/static/assets/Criteria.json | 1088 +++---- .../resources/static/assets/release_notes.txt | 67 + .../resources/static/assets/ttt-0.0.1.css | 22 +- .../main/resources/static/assets/ttt-0.0.1.js | 54 +- .../resources/static/assets/xdrtestCases.json | 2748 ++++++++--------- webapp/src/main/resources/static/index.html | 94 +- .../ttt/webapp/TestSamlValidate.groovy | 19 - .../healthcare/ttt/webapp/TestUtils.groovy | 144 - .../ttt/webapp/XDRSpecification.groovy | 74 - .../ttt/webapp/api/package-info.groovy | 12 - .../edge/receiving/XdrTestCase3Test.groovy | 48 - .../edge/receiving/XdrTestCase4dTest.groovy | 48 - .../receiving/tls/XdrTestCase8Test.groovy | 45 - .../receiving/tls/XdrTestCase9Test.groovy | 44 - .../xdr/edge/sending/XdrTestCase1Test.groovy | 67 - .../sending/mu2/XdrTestCase19mu2Test.groovy | 120 - .../sending/mu2/XdrTestCase20amu2Test.groovy | 70 - .../sending/mu2/XdrTestCase20bmu2Test.groovy | 74 - .../edge/sending/tls/XdrTestCase7Test.groovy | 77 - .../api/xdr/hisp/XdrTestCase10Test.groovy | 76 - .../api/xdr/hisp/XdrTestCase13Test.groovy | 50 - .../production/TestProdUsingClient.groovy | 367 --- .../TLSReceiverImplWithGoodCert.groovy | 141 - .../webapp/testFramework/TestApplication.java | 100 - .../testFramework/time/FakeClock.groovy | 29 - .../webapp/unit/xdr/XdrTestCase1Test.groovy | 99 - .../ttt/webapp/api/CCDAValidationTest.java | 46 - .../ttt/webapp/api/GetCCDAFolderTest.java | 224 -- .../ttt/webapp/api/RestTemplateTest.java | 55 - .../ttt/webapp/misc/SslReverseEchoer.java | 122 - .../ttt/webapp/misc/SslSocketClient.java | 66 - .../misc/SslSocketClientWithTruststore.java | 93 - .../SslSocketClientWithTruststore2ndImpl.java | 129 - .../ttt/webapp/misc/package-info.java | 7 - .../testFramework/TestApplication.java | 17 - .../helpers/testFramework/package-info.java | 7 - .../FakeTkRestAPIWithBadContent.groovy | 42 - .../integration/RealTkClientSpecTest.groovy | 122 - .../ttt/xdr/other/PayloadDownloadTest.groovy | 32 - .../ttt/xdr/other/ReportParsingTest.groovy | 146 - .../ttt/xdr/other/RequestParsingTest.groovy | 134 - .../healthcare/ttt/xdr/other/SamlTest.java | 35 - .../ttt/xdr/unit/TkClientSpecTest.groovy | 150 - .../ttt/xdr/unit/TkListenerSpecTest.groovy | 157 - 47 files changed, 2166 insertions(+), 5301 deletions(-) delete mode 100644 webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/TestSamlValidate.groovy delete mode 100644 webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/TestUtils.groovy delete mode 100644 webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/XDRSpecification.groovy delete mode 100644 webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/package-info.groovy delete mode 100644 webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/xdr/edge/receiving/XdrTestCase3Test.groovy delete mode 100644 webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/xdr/edge/receiving/XdrTestCase4dTest.groovy delete mode 100644 webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/xdr/edge/receiving/tls/XdrTestCase8Test.groovy delete mode 100644 webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/xdr/edge/receiving/tls/XdrTestCase9Test.groovy delete mode 100644 webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/xdr/edge/sending/XdrTestCase1Test.groovy delete mode 100644 webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/xdr/edge/sending/mu2/XdrTestCase19mu2Test.groovy delete mode 100644 webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/xdr/edge/sending/mu2/XdrTestCase20amu2Test.groovy delete mode 100644 webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/xdr/edge/sending/mu2/XdrTestCase20bmu2Test.groovy delete mode 100644 webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/xdr/edge/sending/tls/XdrTestCase7Test.groovy delete mode 100644 webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/xdr/hisp/XdrTestCase10Test.groovy delete mode 100644 webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/xdr/hisp/XdrTestCase13Test.groovy delete mode 100644 webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/production/TestProdUsingClient.groovy delete mode 100644 webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/testFramework/TLSReceiverImplWithGoodCert.groovy delete mode 100644 webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/testFramework/TestApplication.java delete mode 100644 webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/testFramework/time/FakeClock.groovy delete mode 100644 webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/unit/xdr/XdrTestCase1Test.groovy delete mode 100644 webapp/src/test/java/gov/nist/healthcare/ttt/webapp/api/CCDAValidationTest.java delete mode 100644 webapp/src/test/java/gov/nist/healthcare/ttt/webapp/api/GetCCDAFolderTest.java delete mode 100644 webapp/src/test/java/gov/nist/healthcare/ttt/webapp/api/RestTemplateTest.java delete mode 100644 webapp/src/test/java/gov/nist/healthcare/ttt/webapp/misc/SslReverseEchoer.java delete mode 100644 webapp/src/test/java/gov/nist/healthcare/ttt/webapp/misc/SslSocketClient.java delete mode 100644 webapp/src/test/java/gov/nist/healthcare/ttt/webapp/misc/SslSocketClientWithTruststore.java delete mode 100644 webapp/src/test/java/gov/nist/healthcare/ttt/webapp/misc/SslSocketClientWithTruststore2ndImpl.java delete mode 100644 webapp/src/test/java/gov/nist/healthcare/ttt/webapp/misc/package-info.java delete mode 100644 xdr/src/test/groovy/gov/nist/healthcare/ttt/xdr/helpers/testFramework/TestApplication.java delete mode 100644 xdr/src/test/groovy/gov/nist/healthcare/ttt/xdr/helpers/testFramework/package-info.java delete mode 100644 xdr/src/test/groovy/gov/nist/healthcare/ttt/xdr/helpers/testFramework/web/controller/FakeTkRestAPIWithBadContent.groovy delete mode 100644 xdr/src/test/groovy/gov/nist/healthcare/ttt/xdr/integration/RealTkClientSpecTest.groovy delete mode 100644 xdr/src/test/groovy/gov/nist/healthcare/ttt/xdr/other/PayloadDownloadTest.groovy delete mode 100644 xdr/src/test/groovy/gov/nist/healthcare/ttt/xdr/other/ReportParsingTest.groovy delete mode 100644 xdr/src/test/groovy/gov/nist/healthcare/ttt/xdr/other/RequestParsingTest.groovy delete mode 100644 xdr/src/test/groovy/gov/nist/healthcare/ttt/xdr/other/SamlTest.java delete mode 100644 xdr/src/test/groovy/gov/nist/healthcare/ttt/xdr/unit/TkClientSpecTest.groovy delete mode 100644 xdr/src/test/groovy/gov/nist/healthcare/ttt/xdr/unit/TkListenerSpecTest.groovy diff --git a/common-config/pom.xml b/common-config/pom.xml index 341463a0f..16a19e678 100644 --- a/common-config/pom.xml +++ b/common-config/pom.xml @@ -39,7 +39,7 @@ org.springframework.boot spring-boot-starter-parent - 1.3.5.RELEASE + 1.5.22.RELEASE @@ -118,11 +118,6 @@ test - - log4j - log4j - - diff --git a/webapp/pom.xml b/webapp/pom.xml index bdada722f..043bdf227 100755 --- a/webapp/pom.xml +++ b/webapp/pom.xml @@ -68,15 +68,39 @@ 8.0.30 + + org.apache.logging.log4j + log4j-core + 2.17.2 + + + + org.slf4j + slf4j-simple + 2.1.0-alpha1 + + gov.nist.healthcare.ttt mailprotocols 3.0.0 + + + org.apache.logging.log4j + log4j-core + + gov.nist.healthcare.ttt direct 0.0.1-SNAPSHOT + + + org.apache.logging.log4j + log4j-core + + gov.nist.healthcare.ttt @@ -148,7 +172,29 @@ commons-lang3 3.12.0 + + org.slf4j + slf4j-api + 1.7.5 + + + org.apache.logging.log4j + log4j-core + 2.17.1 + + + org.apache.logging.log4j + log4j-api + + + + + + org.apache.logging.log4j + log4j-api + 2.17.1 + @@ -157,6 +203,52 @@ + + org.apache.maven.plugins + maven-install-plugin + + + + saxon-ee + clean + + ${basedir}/ett/mail protocols/target/mailprotocols-3.0.0.jar + gov.nist.healthcare.ttt + mailprotocols + 3.0.0 + jar + true + + + install-file + + + + + + + org.apache.maven.plugins + maven-install-plugin + + + + saxon-ee + clean + + ${basedir}/ett/direct/target/direct-0.0.1-SNAPSHOT.jar + gov.nist.healthcare.ttt + direct + 0.0.1-SNAPSHOT + jar + true + + + install-file + + + + + org.springframework.boot spring-boot-maven-plugin @@ -177,8 +269,6 @@ - - diff --git a/webapp/src/main/java/gov/nist/healthcare/ttt/webapp/Application.java b/webapp/src/main/java/gov/nist/healthcare/ttt/webapp/Application.java index 9a4be8014..4a5ffd7fe 100644 --- a/webapp/src/main/java/gov/nist/healthcare/ttt/webapp/Application.java +++ b/webapp/src/main/java/gov/nist/healthcare/ttt/webapp/Application.java @@ -11,8 +11,8 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory; -import org.springframework.boot.context.embedded.FilterRegistrationBean; -import org.springframework.boot.context.embedded.ServletRegistrationBean; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Import; @@ -81,6 +81,7 @@ public FilterRegistrationBean portFilter(@Value("${server.port}") int serverPort public static void main(String[] args) { System.setProperty("java.net.preferIPv4Stack", "true"); + System.setProperty("LOG_EXCEPTION_CONVERSION_WORD", "%throwable"); SpringApplication.run(Application.class, args); } diff --git a/webapp/src/main/resources/static/assets/Criteria.json b/webapp/src/main/resources/static/assets/Criteria.json index bf1608a5a..4a82763a0 100644 --- a/webapp/src/main/resources/static/assets/Criteria.json +++ b/webapp/src/main/resources/static/assets/Criteria.json @@ -1,545 +1,545 @@ -[ - { - "name":"Please select", - "xdrTest":false, - "testList":"['h1','h2','b1','su1','sa1','sc2']", - "criteria":"''", - "selectOption":"['A','B','2','3','4','5','6','7','8','9','10']" - }, - { - "name":"Criteria (i) Direct Home - Certificates", - "testList":"['h1']", - "redirect":{ - "hrefvalue":"direct.home", - "hreflabel":"170.315(h)(1)", - "hrefback":"certification.certh1.main" - } - }, - { - "name":"Criteria (i) Certificate Discovery / Hosting - 2015 DCDT", - "testList":"['h1']", - "redirect":{ - "hrefvalue":"direct.dcdt2", - "hreflabel":"170.315(h)(1)", - "hrefback":"certification.certh1.main" - } - }, - { - "name":"Criteria (i) Register Direct", - "testList":"['h1']", - "redirect":{ - "hrefvalue":"direct.register", - "hreflabel":"170.315(h)(1)", - "hrefback":"certification.certh1.main" - } - }, - { - "name":"Criteria (i) Send Direct Message", - "testList":"['h1']", - "redirect":{ - "hrefvalue":"direct.send", - "hreflabel":"170.315(h)(1)", - "hrefback":"certification.certh1.main" - } - }, - { - "name":"Criteria (i) Receive - Message Status", - "testList":"['h1']", - "redirect":{ - "hrefvalue":"direct.status", - "hreflabel":"170.315(h)(1)", - "hrefback":"certification.certh1.main" - } - }, - { - "name":"Criteria (ii) Delivery Notifications", - "xdrTest":false, - "protocol": "MT", - "testList":"['h1']", - "criteria":"'h1-1'", - "uploadOption":true - }, - { - "name":"Criteria (i) Certificate Discovery / Hosting - 2015 DCDT", - "testList":"['h2']", - "redirect":{ - "hrefvalue":"direct.dcdt2", - "hreflabel":"170.315(h)(2)", - "hrefback":"certification.certh2.main" - }, - "selectOption":"['A','B','2','9','5','6','10']" - }, - { - "name":"Criteria (i) Register Direct", - "testList":"['h2']", - "redirect":{ - "hrefvalue":"direct.register", - "hreflabel":"170.315(h)(2)", - "hrefback":"certification.certh2.main" - }, - "selectOption":"['A','B','2','9']" - }, - { - "name":"Criteria (i) Direct Home - Certificates", - "testList":"['h2']", - "redirect":{ - "hrefvalue":"direct.home", - "hreflabel":"170.315(h)(2)", - "hrefback":"certification.certh2.main" - }, - "selectOption":"['A','B','6','5']" - }, - { - "name":"Criteria (i) Send Direct Message", - "testList":"['h2']", - "redirect":{ - "hrefvalue":"direct.send", - "hreflabel":"170.315(h)(2)", - "hrefback":"certification.certh2.main" - }, - "selectOption":"['A','B','5','6']" - }, - { - "name":"Criteria (i) Message Status", - "testList":"['h2']", - "redirect":{ - "hrefvalue":"direct.status", - "hreflabel":"170.315(h)(2)", - "hrefback":"certification.certh2.main" - }, - "selectOption":"['A','B','5','6']" - }, - { - "name":"Criteria (i) C-CDA R2.1 Validator", - "testList":"['h2']", - "redirect":{ - "hrefvalue":"direct.ccdar2", - "hreflabel":"170.315(h)(2)", - "hrefback":"certification.certh2.main" - }, - "selectOption":"['B']" - }, - { - "name":"Criteria (i) XDR Validator", - "testList":"['h2']", - "redirect":{ - "hrefvalue":"validators.xdr", - "hreflabel":"170.315(h)(2)", - "hrefback":"certification.certh2.main" - } - }, - { - "name":"Criteria (i) XDM Validator", - "testList":"['h2']", - "redirect":{ - "hrefvalue":"validators.xdm", - "hreflabel":"170.315(h)(2)", - "hrefback":"certification.certh2.main" - }, - "selectOption":"['2','6','4','B','5']" - }, - { - "name":"Criteria (i)(B) Send conversion XDR", - "xdrTest":true, - "testList":"['h2']", - "criteria":"'h2-1'", - "selectOption":"['3','B']" - }, - { - "name":"Criteria (i)(B) Receive conversion XDR", - "xdrTest":true, - "testList":"['h2']", - "criteria":"'h2-2'", - "selectOption":"['5','7']" - }, - { - "name":"Criteria (i)(C) Send using Edge Protocol - XDR", - "xdrTest":true, - "testList":"['h2']", - "criteria":"'h2-3'", - "selectOption":"['B','3','4']" - }, - { - "name":"Criteria (i)(C) Send using Edge Protocol - SMTP", - "xdrTest":false, - "protocol": "SMTP", - "testList":"['h2']", - "criteria":"'h2-13'", - "selectOption":"['B','4']" - }, - { - "name":"Criteria (i)(C) Send using Edge Protocol - Delivery Notification", - "xdrTest":false, - "protocol": "MT", - "testList":"['h2']", - "criteria":"'h2-4'", - "selectOption":"['B','4']" - }, - { - "name":"Criteria (i)(C) Send using Edge Protocol - IMAP", - "xdrTest":false, - "protocol": "IMAP", - "testList":"['h2']", - "criteria":"'h2-5'", - "selectOption":"['B','4']" - }, - { - "name":"Criteria (i)(C) Send using Edge Protocol - POP", - "xdrTest":false, - "protocol": "POP", - "testList":"['h2']", - "criteria":"'h2-6'", - "selectOption":"['B','4']" - }, - { - "name":"Criteria (i)(C) Receive using Edge Protocol - XDR", - "xdrTest":true, - "testList":"['h2']", - "criteria":"'h2-7'", - "selectOption":"['5','8']" - }, - { - "name":"Criteria (i)(C) Receive using Edge Protocol - SMTP", - "xdrTest":false, - "protocol": "SMTP", - "testList":"['h2']", - "criteria":"'h2-8'", - "selectOption":"['5','8']" - }, - { - "name":"Criteria (ii) Delivery Notification in Direct - SMTP", - "xdrTest":false, - "protocol": "MT", - "testList":"['h2']", - "criteria":"'h2-9'", - "selectOption":"['9','B']" - }, - { - "name":"Criteria (ii) Receive SMTP: Disposition-Notification", - "xdrTest":false, - "uploadOption":true, - "protocol": "MT", - "testList":"['h2']", - "criteria":"'h2-10'", - "selectOption":"['5','10']" - }, - { - "name":"Criteria (ii)(C) Delivery Notification in Direct - XDR", - "xdrTest":true, - "testList":"['h2']", - "criteria":"'h2-11'", - "selectOption":"['9','B']" - }, - { - "name":"Criteria (ii)(C) Receive XDR: Disposition-Notification", - "xdrTest":true, - "testList":"['h2']", - "criteria":"'h2-12'", - "selectOption":"['5','10']" - }, - { - "name":"Criteria (i)(A) Send using Edge Protocol - XDR", - "xdrTest":true, - "testList":"['b1']", - "criteria":"'b1-1'" - }, - { - "name":"Criteria (i)(A) Send using Edge Protocol - SMTP", - "xdrTest":false, - "protocol": "SMTP", - "testList":"['b1']", - "criteria":"'b1-8'" - }, - { - "name":"Criteria (i)(A) Send using Edge Protocol - Delivery Notification", - "xdrTest":false, - "protocol": "MT", - "testList":"['b1']", - "criteria":"'b1-2'" - }, - { - "name":"Criteria (i)(B) Receive using Edge Protocol - XDR", - "xdrTest":true, - "testList":"['b1']", - "criteria":"'b1-3'" - }, - { - "name":"Criteria (i)(B) Receive using Edge Protocol - SMTP", - "xdrTest":false, - "protocol": "SMTP", - "testList":"['b1']", - "criteria":"'b1-4'" - }, - { - "name":"Criteria (i)(B) Receive using Edge Protocol - IMAP", - "xdrTest":false, - "protocol": "IMAP", - "testList":"['b1']", - "criteria":"'b1-5'" - }, - { - "name":"Criteria (i)(B) Receive using Edge Protocol - POP3", - "xdrTest":false, - "protocol": "POP", - "testList":"['b1']", - "criteria":"'b1-6'" - }, - { - "name":"Criteria (i)(C) XDM Processing(Received via Edge Protocol)", - "xdrTest":false, - "protocol": "SMTP", - "testList":"['b1']", - "criteria":"'b1-7'" - }, - - - - - { - "name":"Criteria (i)(A) Send using Edge Protocol - XDR", - "xdrTest":true, - "testList":"['su1']", - "criteria":"'su1-1'" - }, - { - "name":"Criteria (i)(A) Send using Edge Protocol - Delivery Notification", - "xdrTest":false, - "protocol": "MT", - "testList":"['su1']", - "criteria":"'su1-2'" - }, - { - "name":"Criteria (i)(B) Receive using Edge Protocol - XDR", - "xdrTest":true, - "testList":"['su1']", - "criteria":"'su1-3'" - }, - { - "name":"Criteria (i)(B) Receive using Edge Protocol - SMTP", - "xdrTest":false, - "protocol": "SMTP", - "testList":"['su1']", - "criteria":"'su1-4'" - }, - { - "name":"Criteria (i)(B) Receive using Edge Protocol - IMAP", - "xdrTest":false, - "protocol": "IMAP", - "testList":"['su1']", - "criteria":"'su1-5'" - }, - { - "name":"Criteria (i)(B) Receive using Edge Protocol - POP3", - "xdrTest":false, - "protocol": "POP", - "testList":"['su1']", - "criteria":"'su1-6'" - }, - { - "name":"Criteria (i)(C) XDM Processing(Received via Edge Protocol)", - "xdrTest":false, - "protocol": "SMTP", - "testList":"['su1']", - "criteria":"'su1-7'" - }, - { - "name":"Criteria (i) Direct Home - Certificates", - "testList":"['sa1']", - "redirect":{ - "hrefvalue":"direct.home", - "hreflabel":"170.315(h)(1)", - "hrefback":"surveillance.surveilh1.main" - } - }, - { - "name":"Criteria (i) Certificate Discovery / Hosting - 2015 DCDT", - "testList":"['sa1']", - "redirect":{ - "hrefvalue":"direct.dcdt2", - "hreflabel":"170.315(h)(1)", - "hrefback":"surveillance.surveilh1.main" - } - }, - { - "name":"Criteria (i) Register Direct", - "testList":"['sa1']", - "redirect":{ - "hrefvalue":"direct.register", - "hreflabel":"170.315(h)(1)", - "hrefback":"surveillance.surveilh1.main" - } - }, - { - "name":"Criteria (i) Send Direct Message", - "testList":"['sa1']", - "redirect":{ - "hrefvalue":"direct.send", - "hreflabel":"170.315(h)(1)", - "hrefback":"surveillance.surveilh1.main" - } - }, - { - "name":"Criteria (i) Receive - Message Status", - "testList":"['sa1']", - "redirect":{ - "hrefvalue":"direct.status", - "hreflabel":"170.315(h)(1)", - "hrefback":"surveillance.surveilh1.main" - } - }, - { - "name":"Criteria (ii) Delivery Notifications", - "xdrTest":false, - "protocol": "MT", - "testList":"['sa1']", - "criteria":"'sa1-1'", - "uploadOption":true - }, - { - "name":"Criteria (i) Certificate Discovery / Hosting - 2015 DCDT", - "testList":"['sc2']", - "redirect":{ - "hrefvalue":"direct.dcdt2", - "hreflabel":"170.315(h)(2)", - "hrefback":"surveillance.surveilh2.main" - }, - "selectOption":"['A','B','2','9','5','6','10']" - }, - { - "name":"Criteria (i) Register Direct", - "testList":"['sc2']", - "redirect":{ - "hrefvalue":"direct.register", - "hreflabel":"170.315(h)(2)", - "hrefback":"surveillance.surveilh2.main" - }, - "selectOption":"['A','B','2','9']" - }, - { - "name":"Criteria (i) Direct Home - Certificates", - "testList":"['sc2']", - "redirect":{ - "hrefvalue":"direct.home", - "hreflabel":"170.315(h)(2)", - "hrefback":"surveillance.surveilh2.main" - }, - "selectOption":"['A','B','6','5']" - }, - { - "name":"Criteria (i) Send Direct Message", - "testList":"['sc2']", - "redirect":{ - "hrefvalue":"direct.send", - "hreflabel":"170.315(h)(2)", - "hrefback":"surveillance.surveilh2.main" - }, - "selectOption":"['A','B','5','6']" - }, - { - "name":"Criteria (i) Message Status", - "testList":"['sc2']", - "redirect":{ - "hrefvalue":"direct.status", - "hreflabel":"170.315(h)(2)", - "hrefback":"surveillance.surveilh2.main" - }, - "selectOption":"['A','B','5','6']" - }, - { - "name":"Criteria (i) C-CDA R2.1 Validator", - "testList":"['sc2']", - "redirect":{ - "hrefvalue":"direct.ccdar2", - "hreflabel":"170.315(h)(2)", - "hrefback":"surveillance.surveilh2.main" - }, - "selectOption":"['B']" - }, - { - "name":"Criteria (i) XDR Validator", - "testList":"['sc2']", - "redirect":{ - "hrefvalue":"validators.xdr", - "hreflabel":"170.315(h)(2)", - "hrefback":"surveillance.surveilh2.main" - } - }, - { - "name":"Criteria (i) XDM Validator", - "testList":"['sc2']", - "redirect":{ - "hrefvalue":"validators.xdm", - "hreflabel":"170.315(h)(2)", - "hrefback":"surveillance.surveilh2.main" - }, - "selectOption":"['2','6','4','B','5']" - }, - { - "name":"Criteria (i)(B) Send conversion XDR", - "xdrTest":true, - "testList":"['sc2']", - "criteria":"'sc2-1'", - "selectOption":"['3','B']" - }, - { - "name":"Criteria (i)(B) Receive conversion XDR", - "xdrTest":true, - "testList":"['sc2']", - "criteria":"'sc2-2'", - "selectOption":"['5','7']" - }, - { - "name":"Criteria (i)(C) Send using Edge Protocol - XDR", - "xdrTest":true, - "testList":"['sc2']", - "criteria":"'sc2-3'", - "selectOption":"['B','3','4']" - }, - { - "name":"Criteria (i)(C) Send using Edge Protocol - SMTP", - "xdrTest":false, - "protocol": "MT", - "testList":"['sc2']", - "criteria":"'sc2-4'", - "selectOption":"['B','4']" - }, - { - "name":"Criteria (i)(C) Receive using Edge Protocol - XDR", - "xdrTest":true, - "testList":"['sc2']", - "criteria":"'sc2-7'", - "selectOption":"['5','8']" - }, - { - "name":"Criteria (i)(C) Receive using Edge Protocol - SMTP", - "xdrTest":false, - "protocol": "SMTP", - "testList":"['sc2']", - "criteria":"'sc2-8'", - "selectOption":"['5','8']" - }, - { - "name":"Criteria (ii) Delivery Notification in Direct - SMTP", - "xdrTest":false, - "protocol": "MT", - "testList":"['sc2']", - "criteria":"'sc2-9'", - "selectOption":"['9','B']" - }, - { - "name":"Criteria (ii) Receive SMTP: Disposition-Notification", - "xdrTest":false, - "uploadOption":true, - "protocol": "MT", - "testList":"['sc2']", - "criteria":"'sc2-10'", - "selectOption":"['5','10']" - }, - { - "name":"Criteria (ii)(C) Delivery Notification in Direct - XDR", - "xdrTest":true, - "testList":"['sc2']", - "criteria":"'sc2-11'", - "selectOption":"['9','B']" - } +[ + { + "name":"Please select", + "xdrTest":false, + "testList":"['h1','h2','b1','su1','sa1','sc2']", + "criteria":"''", + "selectOption":"['A','B','2','3','4','5','6','7','8','9','10']" + }, + { + "name":"Criteria (i) Direct Home - Certificates", + "testList":"['h1']", + "redirect":{ + "hrefvalue":"direct.home", + "hreflabel":"170.315(h)(1)", + "hrefback":"certification.certh1.main" + } + }, + { + "name":"Criteria (i) Certificate Discovery / Hosting - 2015 DCDT", + "testList":"['h1']", + "redirect":{ + "hrefvalue":"direct.dcdt2", + "hreflabel":"170.315(h)(1)", + "hrefback":"certification.certh1.main" + } + }, + { + "name":"Criteria (i) Register Direct", + "testList":"['h1']", + "redirect":{ + "hrefvalue":"direct.register", + "hreflabel":"170.315(h)(1)", + "hrefback":"certification.certh1.main" + } + }, + { + "name":"Criteria (i) Send Direct Message", + "testList":"['h1']", + "redirect":{ + "hrefvalue":"direct.send", + "hreflabel":"170.315(h)(1)", + "hrefback":"certification.certh1.main" + } + }, + { + "name":"Criteria (i) Receive - Message Status", + "testList":"['h1']", + "redirect":{ + "hrefvalue":"direct.status", + "hreflabel":"170.315(h)(1)", + "hrefback":"certification.certh1.main" + } + }, + { + "name":"Criteria (ii) Delivery Notifications", + "xdrTest":false, + "protocol": "MT", + "testList":"['h1']", + "criteria":"'h1-1'", + "uploadOption":true + }, + { + "name":"Criteria (i) Certificate Discovery / Hosting - 2015 DCDT", + "testList":"['h2']", + "redirect":{ + "hrefvalue":"direct.dcdt2", + "hreflabel":"170.315(h)(2)", + "hrefback":"certification.certh2.main" + }, + "selectOption":"['A','B','2','9','5','6','10']" + }, + { + "name":"Criteria (i) Register Direct", + "testList":"['h2']", + "redirect":{ + "hrefvalue":"direct.register", + "hreflabel":"170.315(h)(2)", + "hrefback":"certification.certh2.main" + }, + "selectOption":"['A','B','2','9']" + }, + { + "name":"Criteria (i) Direct Home - Certificates", + "testList":"['h2']", + "redirect":{ + "hrefvalue":"direct.home", + "hreflabel":"170.315(h)(2)", + "hrefback":"certification.certh2.main" + }, + "selectOption":"['A','B','6','5']" + }, + { + "name":"Criteria (i) Send Direct Message", + "testList":"['h2']", + "redirect":{ + "hrefvalue":"direct.send", + "hreflabel":"170.315(h)(2)", + "hrefback":"certification.certh2.main" + }, + "selectOption":"['A','B','5','6']" + }, + { + "name":"Criteria (i) Message Status", + "testList":"['h2']", + "redirect":{ + "hrefvalue":"direct.status", + "hreflabel":"170.315(h)(2)", + "hrefback":"certification.certh2.main" + }, + "selectOption":"['A','B','5','6']" + }, + { + "name":"Criteria (i) C-CDA R2.1 Validator", + "testList":"['h2']", + "redirect":{ + "hrefvalue":"direct.ccdar2", + "hreflabel":"170.315(h)(2)", + "hrefback":"certification.certh2.main" + }, + "selectOption":"['B']" + }, + { + "name":"Criteria (i) XDR Validator", + "testList":"['h2']", + "redirect":{ + "hrefvalue":"validators.xdr", + "hreflabel":"170.315(h)(2)", + "hrefback":"certification.certh2.main" + } + }, + { + "name":"Criteria (i) XDM Validator", + "testList":"['h2']", + "redirect":{ + "hrefvalue":"validators.xdm", + "hreflabel":"170.315(h)(2)", + "hrefback":"certification.certh2.main" + }, + "selectOption":"['2','6','4','B','5']" + }, + { + "name":"Criteria (i)(B) Send conversion XDR", + "xdrTest":true, + "testList":"['h2']", + "criteria":"'h2-1'", + "selectOption":"['3','B']" + }, + { + "name":"Criteria (i)(B) Receive conversion XDR", + "xdrTest":true, + "testList":"['h2']", + "criteria":"'h2-2'", + "selectOption":"['5','7']" + }, + { + "name":"Criteria (i)(C) Send using Edge Protocol - XDR", + "xdrTest":true, + "testList":"['h2']", + "criteria":"'h2-3'", + "selectOption":"['B','3','4']" + }, + { + "name":"Criteria (i)(C) Send using Edge Protocol - SMTP", + "xdrTest":false, + "protocol": "SMTP", + "testList":"['h2']", + "criteria":"'h2-13'", + "selectOption":"['B','4']" + }, + { + "name":"Criteria (i)(C) Send using Edge Protocol - Delivery Notification", + "xdrTest":false, + "protocol": "MT", + "testList":"['h2']", + "criteria":"'h2-4'", + "selectOption":"['B','4']" + }, + { + "name":"Criteria (i)(C) Send using Edge Protocol - IMAP", + "xdrTest":false, + "protocol": "IMAP", + "testList":"['h2']", + "criteria":"'h2-5'", + "selectOption":"['B','4']" + }, + { + "name":"Criteria (i)(C) Send using Edge Protocol - POP", + "xdrTest":false, + "protocol": "POP", + "testList":"['h2']", + "criteria":"'h2-6'", + "selectOption":"['B','4']" + }, + { + "name":"Criteria (i)(C) Receive using Edge Protocol - XDR", + "xdrTest":true, + "testList":"['h2']", + "criteria":"'h2-7'", + "selectOption":"['5','8']" + }, + { + "name":"Criteria (i)(C) Receive using Edge Protocol - SMTP", + "xdrTest":false, + "protocol": "SMTP", + "testList":"['h2']", + "criteria":"'h2-8'", + "selectOption":"['5','8']" + }, + { + "name":"Criteria (ii) Delivery Notification in Direct - SMTP", + "xdrTest":false, + "protocol": "MT", + "testList":"['h2']", + "criteria":"'h2-9'", + "selectOption":"['9','B']" + }, + { + "name":"Criteria (ii) Receive SMTP: Disposition-Notification", + "xdrTest":false, + "uploadOption":true, + "protocol": "MT", + "testList":"['h2']", + "criteria":"'h2-10'", + "selectOption":"['5','10']" + }, + { + "name":"Criteria (ii)(C) Delivery Notification in Direct - XDR", + "xdrTest":true, + "testList":"['h2']", + "criteria":"'h2-11'", + "selectOption":"['9','B']" + }, + { + "name":"Criteria (ii)(C) Receive XDR: Disposition-Notification", + "xdrTest":true, + "testList":"['h2']", + "criteria":"'h2-12'", + "selectOption":"['5','10']" + }, + { + "name":"Criteria (i)(A) Send using Edge Protocol - XDR", + "xdrTest":true, + "testList":"['b1']", + "criteria":"'b1-1'" + }, + { + "name":"Criteria (i)(A) Send using Edge Protocol - SMTP", + "xdrTest":false, + "protocol": "SMTP", + "testList":"['b1']", + "criteria":"'b1-8'" + }, + { + "name":"Criteria (i)(A) Send using Edge Protocol - Delivery Notification", + "xdrTest":false, + "protocol": "MT", + "testList":"['b1']", + "criteria":"'b1-2'" + }, + { + "name":"Criteria (i)(B) Receive using Edge Protocol - XDR", + "xdrTest":true, + "testList":"['b1']", + "criteria":"'b1-3'" + }, + { + "name":"Criteria (i)(B) Receive using Edge Protocol - SMTP", + "xdrTest":false, + "protocol": "SMTP", + "testList":"['b1']", + "criteria":"'b1-4'" + }, + { + "name":"Criteria (i)(B) Receive using Edge Protocol - IMAP", + "xdrTest":false, + "protocol": "IMAP", + "testList":"['b1']", + "criteria":"'b1-5'" + }, + { + "name":"Criteria (i)(B) Receive using Edge Protocol - POP3", + "xdrTest":false, + "protocol": "POP", + "testList":"['b1']", + "criteria":"'b1-6'" + }, + { + "name":"Criteria (i)(C) XDM Processing(Received via Edge Protocol)", + "xdrTest":false, + "protocol": "SMTP", + "testList":"['b1']", + "criteria":"'b1-7'" + }, + + + + + { + "name":"Criteria (i)(A) Send using Edge Protocol - XDR", + "xdrTest":true, + "testList":"['su1']", + "criteria":"'su1-1'" + }, + { + "name":"Criteria (i)(A) Send using Edge Protocol - Delivery Notification", + "xdrTest":false, + "protocol": "MT", + "testList":"['su1']", + "criteria":"'su1-2'" + }, + { + "name":"Criteria (i)(B) Receive using Edge Protocol - XDR", + "xdrTest":true, + "testList":"['su1']", + "criteria":"'su1-3'" + }, + { + "name":"Criteria (i)(B) Receive using Edge Protocol - SMTP", + "xdrTest":false, + "protocol": "SMTP", + "testList":"['su1']", + "criteria":"'su1-4'" + }, + { + "name":"Criteria (i)(B) Receive using Edge Protocol - IMAP", + "xdrTest":false, + "protocol": "IMAP", + "testList":"['su1']", + "criteria":"'su1-5'" + }, + { + "name":"Criteria (i)(B) Receive using Edge Protocol - POP3", + "xdrTest":false, + "protocol": "POP", + "testList":"['su1']", + "criteria":"'su1-6'" + }, + { + "name":"Criteria (i)(C) XDM Processing(Received via Edge Protocol)", + "xdrTest":false, + "protocol": "SMTP", + "testList":"['su1']", + "criteria":"'su1-7'" + }, + { + "name":"Criteria (i) Direct Home - Certificates", + "testList":"['sa1']", + "redirect":{ + "hrefvalue":"direct.home", + "hreflabel":"170.315(h)(1)", + "hrefback":"surveillance.surveilh1.main" + } + }, + { + "name":"Criteria (i) Certificate Discovery / Hosting - 2015 DCDT", + "testList":"['sa1']", + "redirect":{ + "hrefvalue":"direct.dcdt2", + "hreflabel":"170.315(h)(1)", + "hrefback":"surveillance.surveilh1.main" + } + }, + { + "name":"Criteria (i) Register Direct", + "testList":"['sa1']", + "redirect":{ + "hrefvalue":"direct.register", + "hreflabel":"170.315(h)(1)", + "hrefback":"surveillance.surveilh1.main" + } + }, + { + "name":"Criteria (i) Send Direct Message", + "testList":"['sa1']", + "redirect":{ + "hrefvalue":"direct.send", + "hreflabel":"170.315(h)(1)", + "hrefback":"surveillance.surveilh1.main" + } + }, + { + "name":"Criteria (i) Receive - Message Status", + "testList":"['sa1']", + "redirect":{ + "hrefvalue":"direct.status", + "hreflabel":"170.315(h)(1)", + "hrefback":"surveillance.surveilh1.main" + } + }, + { + "name":"Criteria (ii) Delivery Notifications", + "xdrTest":false, + "protocol": "MT", + "testList":"['sa1']", + "criteria":"'sa1-1'", + "uploadOption":true + }, + { + "name":"Criteria (i) Certificate Discovery / Hosting - 2015 DCDT", + "testList":"['sc2']", + "redirect":{ + "hrefvalue":"direct.dcdt2", + "hreflabel":"170.315(h)(2)", + "hrefback":"surveillance.surveilh2.main" + }, + "selectOption":"['A','B','2','9','5','6','10']" + }, + { + "name":"Criteria (i) Register Direct", + "testList":"['sc2']", + "redirect":{ + "hrefvalue":"direct.register", + "hreflabel":"170.315(h)(2)", + "hrefback":"surveillance.surveilh2.main" + }, + "selectOption":"['A','B','2','9']" + }, + { + "name":"Criteria (i) Direct Home - Certificates", + "testList":"['sc2']", + "redirect":{ + "hrefvalue":"direct.home", + "hreflabel":"170.315(h)(2)", + "hrefback":"surveillance.surveilh2.main" + }, + "selectOption":"['A','B','6','5']" + }, + { + "name":"Criteria (i) Send Direct Message", + "testList":"['sc2']", + "redirect":{ + "hrefvalue":"direct.send", + "hreflabel":"170.315(h)(2)", + "hrefback":"surveillance.surveilh2.main" + }, + "selectOption":"['A','B','5','6']" + }, + { + "name":"Criteria (i) Message Status", + "testList":"['sc2']", + "redirect":{ + "hrefvalue":"direct.status", + "hreflabel":"170.315(h)(2)", + "hrefback":"surveillance.surveilh2.main" + }, + "selectOption":"['A','B','5','6']" + }, + { + "name":"Criteria (i) C-CDA R2.1 Validator", + "testList":"['sc2']", + "redirect":{ + "hrefvalue":"direct.ccdar2", + "hreflabel":"170.315(h)(2)", + "hrefback":"surveillance.surveilh2.main" + }, + "selectOption":"['B']" + }, + { + "name":"Criteria (i) XDR Validator", + "testList":"['sc2']", + "redirect":{ + "hrefvalue":"validators.xdr", + "hreflabel":"170.315(h)(2)", + "hrefback":"surveillance.surveilh2.main" + } + }, + { + "name":"Criteria (i) XDM Validator", + "testList":"['sc2']", + "redirect":{ + "hrefvalue":"validators.xdm", + "hreflabel":"170.315(h)(2)", + "hrefback":"surveillance.surveilh2.main" + }, + "selectOption":"['2','6','4','B','5']" + }, + { + "name":"Criteria (i)(B) Send conversion XDR", + "xdrTest":true, + "testList":"['sc2']", + "criteria":"'sc2-1'", + "selectOption":"['3','B']" + }, + { + "name":"Criteria (i)(B) Receive conversion XDR", + "xdrTest":true, + "testList":"['sc2']", + "criteria":"'sc2-2'", + "selectOption":"['5','7']" + }, + { + "name":"Criteria (i)(C) Send using Edge Protocol - XDR", + "xdrTest":true, + "testList":"['sc2']", + "criteria":"'sc2-3'", + "selectOption":"['B','3','4']" + }, + { + "name":"Criteria (i)(C) Send using Edge Protocol - SMTP", + "xdrTest":false, + "protocol": "MT", + "testList":"['sc2']", + "criteria":"'sc2-4'", + "selectOption":"['B','4']" + }, + { + "name":"Criteria (i)(C) Receive using Edge Protocol - XDR", + "xdrTest":true, + "testList":"['sc2']", + "criteria":"'sc2-7'", + "selectOption":"['5','8']" + }, + { + "name":"Criteria (i)(C) Receive using Edge Protocol - SMTP", + "xdrTest":false, + "protocol": "SMTP", + "testList":"['sc2']", + "criteria":"'sc2-8'", + "selectOption":"['5','8']" + }, + { + "name":"Criteria (ii) Delivery Notification in Direct - SMTP", + "xdrTest":false, + "protocol": "MT", + "testList":"['sc2']", + "criteria":"'sc2-9'", + "selectOption":"['9','B']" + }, + { + "name":"Criteria (ii) Receive SMTP: Disposition-Notification", + "xdrTest":false, + "uploadOption":true, + "protocol": "MT", + "testList":"['sc2']", + "criteria":"'sc2-10'", + "selectOption":"['5','10']" + }, + { + "name":"Criteria (ii)(C) Delivery Notification in Direct - XDR", + "xdrTest":true, + "testList":"['sc2']", + "criteria":"'sc2-11'", + "selectOption":"['9','B']" + } ] \ No newline at end of file diff --git a/webapp/src/main/resources/static/assets/release_notes.txt b/webapp/src/main/resources/static/assets/release_notes.txt index e2d87883b..41e1cfb04 100644 --- a/webapp/src/main/resources/static/assets/release_notes.txt +++ b/webapp/src/main/resources/static/assets/release_notes.txt @@ -1,3 +1,70 @@ +==Version 2.3.69#07/29/2024 + *1. SITE release notes are now being tracked in a single location. Go [here](https://github.com/onc-healthit/site-content/blob/master/ReleaseNotes.md) to see release notes. + + *2. Update MT 39, 40, 41 to support TLS v1.2 + +==Version 2.3.67#06/03/2024 + *1. ETT: Fix reference validator API call that broke scenario testing + + *2. ETT: Fix download button in USCDIv3 validator + + *3. ETT: Remove reference to "2015 Edition Cures Update" + + *4. C-CDA Validator: Update MDHT per 2018 and later errata + + *5. C-CDA Validator: Update ReadMe to remove public API references and add keycloak properties + + *6. C-CDA Validator: Fix USCDIv3 referral error + + *7. C-CDA Validator: Fix USCDIv3 goals and health concerns error + + *8. C-CDA Validator: Fix health concern observation code in MDHT + +==Version 2.3.66#04/29/2024 + *1. ETT: Remove Cures Update references from USCDI v2 and v3 scenario files + + *2. ETT: C-CDA Validators - Removed need to use c-cda objectves text file + + *3. ETT: Updated b1 Negative testing files to reference USCDI instead of CCDS + + *4. SITE: Update Test Data File titles and introduction to remove 2015/Cures Update + + *5. SITE: Removed USCDIv2 + + *6. C-CDA Validator: Correct a typo in Hunger Vital Assessment Code in Newman and Larson Data sets + +==Version 2.3.65#03/25/2024 + *1. Reference C-CDA: USCDIv3 vocabulary added validation for Gender Identity, Sexual Orientation and Specimen Type. + +==Version 2.3.64#03/15/2024 + *1. ETT: Update SVAP buttons b1, h1 and h2 to point to USCDIv3 instead of v2. (SITE-3968) + +==Version 2.3.63#02/26/2024 + *1. ETT: UI language updates to Validator Home page + + *2. ETT: Removed USCDI v2 option from Direct Testing Home C-CDA Validator dropdown + + *3. DIRECT: UI Updates for send/receive messages with various ECDSA signatures + + *4. SITE: Enable Keycloak + + *5. Reference C-CDA: Update 170.315_b1_toc_amb_svap_uscdiv2_sample1.xml to fix SDOH error + +==Version 2.3.62#01/29/2024 + *1. ETT: Fix for GG issue granular race checking in b.1 - Alice Newman + + *2. ETT: Remove reference of 2015 Edition/Cures Update from tools + + *3. ETT: UI Table update for USCDIv3 + + *4. SITE: Remove reference of 2015 Edition/Cures Update from tools + + *5. Reference C-CDA: Fix defects for RelatedPerson + + *6. Reference C-CDA: Updates to USCDI v3 RelatedPerson, Specimen, SocialHistory Observations + + *7. Reference C-CDA: Updated USCDIv3 content validation for RelatedPerson, Specimen and Socialhistory observations + ==Version 2.3.61#12/18/2023 *1. Reference C-CDA: Improve C-CDA R1.1/MU2 Validator uptime diff --git a/webapp/src/main/resources/static/assets/ttt-0.0.1.css b/webapp/src/main/resources/static/assets/ttt-0.0.1.css index 0054741d7..18bca1562 100644 --- a/webapp/src/main/resources/static/assets/ttt-0.0.1.css +++ b/webapp/src/main/resources/static/assets/ttt-0.0.1.css @@ -585,7 +585,7 @@ fieldset[disabled] .btn-danger.active { box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); } /*# sourceMappingURL=bootstrap-theme.css.map */ - + /** * angular-growl-v2 - v0.7.8 - 2015-10-25 * http://janstevens.github.io/angular-growl-2 @@ -721,7 +721,7 @@ fieldset[disabled] .btn-danger.active { */ background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAA7DAAAOwwHHb6hkAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAAdhJREFUeNrUlr9LI0EUxz9RixRXWObQwsKAdhJksAjYWlpaeBgYAyciKCh3BzrCgMRf4Fml8Abs9OD+geu0k1GInQcpziLCFXtgkWKLQCx8QtjLHqtG0AfDsu/tzJvv9/vezKaazSYvaV28JjNajRqtJl8SwR6wY7RKdzyB0WoKyAODwGLSeamEi6eBKlCTMQFkrfN/OoXgM5ABisAC0ABKSSZ2J9j9AHAEbFvnv59Wburjub6/gBnP9f08rdzUnougBFwDGw8O6/w34EREfzpFRqs8MAXMWefDSHgOGDFaTT9JZKNVD3AOXFjni/J+IOEV63xgtFoF5kXw+mMRFETYFaGlIb4C8E6+2QQC4NOjKDJa9Qr3S9b525ZQvfUpSYvAshRDYgQl4Jd1/jjiD2ThoEXwM+AHUE6UwGg1BsxKvUetISNqX4C8dHt8ghYhD63zl20WugDOok7rfA3YAvaE3lgEy0A/sBZD3RLwISa2C4TRDu+KdOw6sNHujJGdVYHfRqvBNihCoeqj0PwPgrIcZF9jdhgCt1JBYbsPpChOgAOh+z6BiDMhZdmImRwCWeC9cM5/aBwSukkJ9CsgDex36PKbkSYd7hFRMhJY7/AtW069+b+KuwEAfk2f1A5JePkAAAAASUVORK5CYII="); } - + /*! * angular-loading-bar v0.8.0 * https://chieffancypants.github.io/angular-loading-bar @@ -832,7 +832,7 @@ fieldset[disabled] .btn-danger.active { 0% { transform: rotate(0deg); transform: rotate(0deg); } 100% { transform: rotate(360deg); transform: rotate(360deg); } } - + /*! * ui-select * http://github.com/angular-ui/ui-select @@ -1100,7 +1100,7 @@ body > .ui-select-bootstrap.open { .ui-select-container[theme="bootstrap"].direction-up .ui-select-dropdown { box-shadow: 0 -4px 8px rgba(0, 0, 0, 0.25); } - + /*! * Ladda * http://lab.hakim.se/ladda @@ -1108,7 +1108,7 @@ body > .ui-select-bootstrap.open { * * Copyright (C) 2015 Hakim El Hattab, http://hakim.se */.ladda-button{position:relative}.ladda-button .ladda-spinner{position:absolute;z-index:2;display:inline-block;width:32px;height:32px;top:50%;margin-top:0;opacity:0;pointer-events:none}.ladda-button .ladda-label{position:relative;z-index:3}.ladda-button .ladda-progress{position:absolute;width:0;height:100%;left:0;top:0;background:rgba(0,0,0,0.2);visibility:hidden;opacity:0;-webkit-transition:0.1s linear all !important;-moz-transition:0.1s linear all !important;-ms-transition:0.1s linear all !important;-o-transition:0.1s linear all !important;transition:0.1s linear all !important}.ladda-button[data-loading] .ladda-progress{opacity:1;visibility:visible}.ladda-button,.ladda-button .ladda-spinner,.ladda-button .ladda-label{-webkit-transition:0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275) all !important;-moz-transition:0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275) all !important;-ms-transition:0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275) all !important;-o-transition:0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275) all !important;transition:0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275) all !important}.ladda-button[data-style=zoom-in],.ladda-button[data-style=zoom-in] .ladda-spinner,.ladda-button[data-style=zoom-in] .ladda-label,.ladda-button[data-style=zoom-out],.ladda-button[data-style=zoom-out] .ladda-spinner,.ladda-button[data-style=zoom-out] .ladda-label{-webkit-transition:0.3s ease all !important;-moz-transition:0.3s ease all !important;-ms-transition:0.3s ease all !important;-o-transition:0.3s ease all !important;transition:0.3s ease all !important}.ladda-button[data-style=expand-right] .ladda-spinner{right:-6px}.ladda-button[data-style=expand-right][data-size="s"] .ladda-spinner,.ladda-button[data-style=expand-right][data-size="xs"] .ladda-spinner{right:-12px}.ladda-button[data-style=expand-right][data-loading]{padding-right:56px}.ladda-button[data-style=expand-right][data-loading] .ladda-spinner{opacity:1}.ladda-button[data-style=expand-right][data-loading][data-size="s"],.ladda-button[data-style=expand-right][data-loading][data-size="xs"]{padding-right:40px}.ladda-button[data-style=expand-left] .ladda-spinner{left:26px}.ladda-button[data-style=expand-left][data-size="s"] .ladda-spinner,.ladda-button[data-style=expand-left][data-size="xs"] .ladda-spinner{left:4px}.ladda-button[data-style=expand-left][data-loading]{padding-left:56px}.ladda-button[data-style=expand-left][data-loading] .ladda-spinner{opacity:1}.ladda-button[data-style=expand-left][data-loading][data-size="s"],.ladda-button[data-style=expand-left][data-loading][data-size="xs"]{padding-left:40px}.ladda-button[data-style=expand-up]{overflow:hidden}.ladda-button[data-style=expand-up] .ladda-spinner{top:-32px;left:50%;margin-left:0}.ladda-button[data-style=expand-up][data-loading]{padding-top:54px}.ladda-button[data-style=expand-up][data-loading] .ladda-spinner{opacity:1;top:26px;margin-top:0}.ladda-button[data-style=expand-up][data-loading][data-size="s"],.ladda-button[data-style=expand-up][data-loading][data-size="xs"]{padding-top:32px}.ladda-button[data-style=expand-up][data-loading][data-size="s"] .ladda-spinner,.ladda-button[data-style=expand-up][data-loading][data-size="xs"] .ladda-spinner{top:4px}.ladda-button[data-style=expand-down]{overflow:hidden}.ladda-button[data-style=expand-down] .ladda-spinner{top:62px;left:50%;margin-left:0}.ladda-button[data-style=expand-down][data-size="s"] .ladda-spinner,.ladda-button[data-style=expand-down][data-size="xs"] .ladda-spinner{top:40px}.ladda-button[data-style=expand-down][data-loading]{padding-bottom:54px}.ladda-button[data-style=expand-down][data-loading] .ladda-spinner{opacity:1}.ladda-button[data-style=expand-down][data-loading][data-size="s"],.ladda-button[data-style=expand-down][data-loading][data-size="xs"]{padding-bottom:32px}.ladda-button[data-style=slide-left]{overflow:hidden}.ladda-button[data-style=slide-left] .ladda-label{position:relative}.ladda-button[data-style=slide-left] .ladda-spinner{left:100%;margin-left:0}.ladda-button[data-style=slide-left][data-loading] .ladda-label{opacity:0;left:-100%}.ladda-button[data-style=slide-left][data-loading] .ladda-spinner{opacity:1;left:50%}.ladda-button[data-style=slide-right]{overflow:hidden}.ladda-button[data-style=slide-right] .ladda-label{position:relative}.ladda-button[data-style=slide-right] .ladda-spinner{right:100%;margin-left:0;left:16px}.ladda-button[data-style=slide-right][data-loading] .ladda-label{opacity:0;left:100%}.ladda-button[data-style=slide-right][data-loading] .ladda-spinner{opacity:1;left:50%}.ladda-button[data-style=slide-up]{overflow:hidden}.ladda-button[data-style=slide-up] .ladda-label{position:relative}.ladda-button[data-style=slide-up] .ladda-spinner{left:50%;margin-left:0;margin-top:1em}.ladda-button[data-style=slide-up][data-loading] .ladda-label{opacity:0;top:-1em}.ladda-button[data-style=slide-up][data-loading] .ladda-spinner{opacity:1;margin-top:0}.ladda-button[data-style=slide-down]{overflow:hidden}.ladda-button[data-style=slide-down] .ladda-label{position:relative}.ladda-button[data-style=slide-down] .ladda-spinner{left:50%;margin-left:0;margin-top:-2em}.ladda-button[data-style=slide-down][data-loading] .ladda-label{opacity:0;top:1em}.ladda-button[data-style=slide-down][data-loading] .ladda-spinner{opacity:1;margin-top:0}.ladda-button[data-style=zoom-out]{overflow:hidden}.ladda-button[data-style=zoom-out] .ladda-spinner{left:50%;margin-left:32px;-webkit-transform:scale(2.5);-moz-transform:scale(2.5);-ms-transform:scale(2.5);-o-transform:scale(2.5);transform:scale(2.5)}.ladda-button[data-style=zoom-out] .ladda-label{position:relative;display:inline-block}.ladda-button[data-style=zoom-out][data-loading] .ladda-label{opacity:0;-webkit-transform:scale(0.5);-moz-transform:scale(0.5);-ms-transform:scale(0.5);-o-transform:scale(0.5);transform:scale(0.5)}.ladda-button[data-style=zoom-out][data-loading] .ladda-spinner{opacity:1;margin-left:0;-webkit-transform:none;-moz-transform:none;-ms-transform:none;-o-transform:none;transform:none}.ladda-button[data-style=zoom-in]{overflow:hidden}.ladda-button[data-style=zoom-in] .ladda-spinner{left:50%;margin-left:-16px;-webkit-transform:scale(0.2);-moz-transform:scale(0.2);-ms-transform:scale(0.2);-o-transform:scale(0.2);transform:scale(0.2)}.ladda-button[data-style=zoom-in] .ladda-label{position:relative;display:inline-block}.ladda-button[data-style=zoom-in][data-loading] .ladda-label{opacity:0;-webkit-transform:scale(2.2);-moz-transform:scale(2.2);-ms-transform:scale(2.2);-o-transform:scale(2.2);transform:scale(2.2)}.ladda-button[data-style=zoom-in][data-loading] .ladda-spinner{opacity:1;margin-left:0;-webkit-transform:none;-moz-transform:none;-ms-transform:none;-o-transform:none;transform:none}.ladda-button[data-style=contract]{overflow:hidden;width:100px}.ladda-button[data-style=contract] .ladda-spinner{left:50%;margin-left:0}.ladda-button[data-style=contract][data-loading]{border-radius:50%;width:52px}.ladda-button[data-style=contract][data-loading] .ladda-label{opacity:0}.ladda-button[data-style=contract][data-loading] .ladda-spinner{opacity:1}.ladda-button[data-style=contract-overlay]{overflow:hidden;width:100px;box-shadow:0px 0px 0px 2000px transparent}.ladda-button[data-style=contract-overlay] .ladda-spinner{left:50%;margin-left:0}.ladda-button[data-style=contract-overlay][data-loading]{border-radius:50%;width:52px;box-shadow:0px 0px 0px 2000px rgba(0,0,0,0.8)}.ladda-button[data-style=contract-overlay][data-loading] .ladda-label{opacity:0}.ladda-button[data-style=contract-overlay][data-loading] .ladda-spinner{opacity:1} - + .toggle-switch { border: 1px solid; cursor: pointer; @@ -1182,13 +1182,13 @@ body > .ui-select-bootstrap.open { -moz-transition: left 0.5s; -webkit-transition: left 0.5s; } - + @charset "UTF-8";/*! Animate.css - http://daneden.me/animate Licensed under the MIT license - http://opensource.org/licenses/MIT Copyright (c) 2015 Daniel Eden -*/.animated{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.animated.infinite{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.animated.hinge{-webkit-animation-duration:2s;animation-duration:2s}.animated.bounceIn,.animated.bounceOut,.animated.flipOutX,.animated.flipOutY{-webkit-animation-duration:.75s;animation-duration:.75s}@-webkit-keyframes bounce{100%,20%,53%,80%,from{-webkit-animation-timing-function:cubic-bezier(0.215,.61,.355,1);animation-timing-function:cubic-bezier(0.215,.61,.355,1);-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}40%,43%{-webkit-animation-timing-function:cubic-bezier(0.755,.050,.855,.060);animation-timing-function:cubic-bezier(0.755,.050,.855,.060);-webkit-transform:translate3d(0,-30px,0);transform:translate3d(0,-30px,0)}70%{-webkit-animation-timing-function:cubic-bezier(0.755,.050,.855,.060);animation-timing-function:cubic-bezier(0.755,.050,.855,.060);-webkit-transform:translate3d(0,-15px,0);transform:translate3d(0,-15px,0)}90%{-webkit-transform:translate3d(0,-4px,0);transform:translate3d(0,-4px,0)}}@keyframes bounce{100%,20%,53%,80%,from{-webkit-animation-timing-function:cubic-bezier(0.215,.61,.355,1);animation-timing-function:cubic-bezier(0.215,.61,.355,1);-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}40%,43%{-webkit-animation-timing-function:cubic-bezier(0.755,.050,.855,.060);animation-timing-function:cubic-bezier(0.755,.050,.855,.060);-webkit-transform:translate3d(0,-30px,0);transform:translate3d(0,-30px,0)}70%{-webkit-animation-timing-function:cubic-bezier(0.755,.050,.855,.060);animation-timing-function:cubic-bezier(0.755,.050,.855,.060);-webkit-transform:translate3d(0,-15px,0);transform:translate3d(0,-15px,0)}90%{-webkit-transform:translate3d(0,-4px,0);transform:translate3d(0,-4px,0)}}.bounce{-webkit-animation-name:bounce;animation-name:bounce;-webkit-transform-origin:center bottom;transform-origin:center bottom}@-webkit-keyframes flash{100%,50%,from{opacity:1}25%,75%{opacity:0}}@keyframes flash{100%,50%,from{opacity:1}25%,75%{opacity:0}}.flash{-webkit-animation-name:flash;animation-name:flash}@-webkit-keyframes pulse{from{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}50%{-webkit-transform:scale3d(1.05,1.05,1.05);transform:scale3d(1.05,1.05,1.05)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes pulse{from{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}50%{-webkit-transform:scale3d(1.05,1.05,1.05);transform:scale3d(1.05,1.05,1.05)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.pulse{-webkit-animation-name:pulse;animation-name:pulse}@-webkit-keyframes rubberBand{from{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}30%{-webkit-transform:scale3d(1.25,.75,1);transform:scale3d(1.25,.75,1)}40%{-webkit-transform:scale3d(0.75,1.25,1);transform:scale3d(0.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,.85,1);transform:scale3d(1.15,.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes rubberBand{from{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}30%{-webkit-transform:scale3d(1.25,.75,1);transform:scale3d(1.25,.75,1)}40%{-webkit-transform:scale3d(0.75,1.25,1);transform:scale3d(0.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,.85,1);transform:scale3d(1.15,.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.rubberBand{-webkit-animation-name:rubberBand;animation-name:rubberBand}@-webkit-keyframes shake{100%,from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}@keyframes shake{100%,from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}.shake{-webkit-animation-name:shake;animation-name:shake}@-webkit-keyframes swing{20%{-webkit-transform:rotate3d(0,0,1,15deg);transform:rotate3d(0,0,1,15deg)}40%{-webkit-transform:rotate3d(0,0,1,-10deg);transform:rotate3d(0,0,1,-10deg)}60%{-webkit-transform:rotate3d(0,0,1,5deg);transform:rotate3d(0,0,1,5deg)}80%{-webkit-transform:rotate3d(0,0,1,-5deg);transform:rotate3d(0,0,1,-5deg)}100%{-webkit-transform:rotate3d(0,0,1,0deg);transform:rotate3d(0,0,1,0deg)}}@keyframes swing{20%{-webkit-transform:rotate3d(0,0,1,15deg);transform:rotate3d(0,0,1,15deg)}40%{-webkit-transform:rotate3d(0,0,1,-10deg);transform:rotate3d(0,0,1,-10deg)}60%{-webkit-transform:rotate3d(0,0,1,5deg);transform:rotate3d(0,0,1,5deg)}80%{-webkit-transform:rotate3d(0,0,1,-5deg);transform:rotate3d(0,0,1,-5deg)}100%{-webkit-transform:rotate3d(0,0,1,0deg);transform:rotate3d(0,0,1,0deg)}}.swing{-webkit-transform-origin:top center;transform-origin:top center;-webkit-animation-name:swing;animation-name:swing}@-webkit-keyframes tada{from{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}10%,20%{-webkit-transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg);transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg)}30%,50%,70%,90%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg)}40%,60%,80%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes tada{from{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}10%,20%{-webkit-transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg);transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg)}30%,50%,70%,90%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg)}40%,60%,80%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.tada{-webkit-animation-name:tada;animation-name:tada}@-webkit-keyframes wobble{from{-webkit-transform:none;transform:none}15%{-webkit-transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg);transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg)}30%{-webkit-transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg);transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg)}45%{-webkit-transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg);transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg)}60%{-webkit-transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg);transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg)}75%{-webkit-transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg);transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg)}100%{-webkit-transform:none;transform:none}}@keyframes wobble{from{-webkit-transform:none;transform:none}15%{-webkit-transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg);transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg)}30%{-webkit-transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg);transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg)}45%{-webkit-transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg);transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg)}60%{-webkit-transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg);transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg)}75%{-webkit-transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg);transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg)}100%{-webkit-transform:none;transform:none}}.wobble{-webkit-animation-name:wobble;animation-name:wobble}@-webkit-keyframes jello{100%,11.1%,from{-webkit-transform:none;transform:none}22.2%{-webkit-transform:skewX(-12.5deg) skewY(-12.5deg);transform:skewX(-12.5deg) skewY(-12.5deg)}33.3%{-webkit-transform:skewX(6.25deg) skewY(6.25deg);transform:skewX(6.25deg) skewY(6.25deg)}44.4%{-webkit-transform:skewX(-3.125deg) skewY(-3.125deg);transform:skewX(-3.125deg) skewY(-3.125deg)}55.5%{-webkit-transform:skewX(1.5625deg) skewY(1.5625deg);transform:skewX(1.5625deg) skewY(1.5625deg)}66.6%{-webkit-transform:skewX(-.78125deg) skewY(-.78125deg);transform:skewX(-.78125deg) skewY(-.78125deg)}77.7%{-webkit-transform:skewX(0.390625deg) skewY(0.390625deg);transform:skewX(0.390625deg) skewY(0.390625deg)}88.8%{-webkit-transform:skewX(-.1953125deg) skewY(-.1953125deg);transform:skewX(-.1953125deg) skewY(-.1953125deg)}}@keyframes jello{100%,11.1%,from{-webkit-transform:none;transform:none}22.2%{-webkit-transform:skewX(-12.5deg) skewY(-12.5deg);transform:skewX(-12.5deg) skewY(-12.5deg)}33.3%{-webkit-transform:skewX(6.25deg) skewY(6.25deg);transform:skewX(6.25deg) skewY(6.25deg)}44.4%{-webkit-transform:skewX(-3.125deg) skewY(-3.125deg);transform:skewX(-3.125deg) skewY(-3.125deg)}55.5%{-webkit-transform:skewX(1.5625deg) skewY(1.5625deg);transform:skewX(1.5625deg) skewY(1.5625deg)}66.6%{-webkit-transform:skewX(-.78125deg) skewY(-.78125deg);transform:skewX(-.78125deg) skewY(-.78125deg)}77.7%{-webkit-transform:skewX(0.390625deg) skewY(0.390625deg);transform:skewX(0.390625deg) skewY(0.390625deg)}88.8%{-webkit-transform:skewX(-.1953125deg) skewY(-.1953125deg);transform:skewX(-.1953125deg) skewY(-.1953125deg)}}.jello{-webkit-animation-name:jello;animation-name:jello;-webkit-transform-origin:center;transform-origin:center}@-webkit-keyframes bounceIn{100%,20%,40%,60%,80%,from{-webkit-animation-timing-function:cubic-bezier(0.215,.61,.355,1);animation-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes bounceIn{100%,20%,40%,60%,80%,from{-webkit-animation-timing-function:cubic-bezier(0.215,.61,.355,1);animation-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.bounceIn{-webkit-animation-name:bounceIn;animation-name:bounceIn}@-webkit-keyframes bounceInDown{100%,60%,75%,90%,from{-webkit-animation-timing-function:cubic-bezier(0.215,.61,.355,1);animation-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,-3000px,0);transform:translate3d(0,-3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}100%{-webkit-transform:none;transform:none}}@keyframes bounceInDown{100%,60%,75%,90%,from{-webkit-animation-timing-function:cubic-bezier(0.215,.61,.355,1);animation-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,-3000px,0);transform:translate3d(0,-3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}100%{-webkit-transform:none;transform:none}}.bounceInDown{-webkit-animation-name:bounceInDown;animation-name:bounceInDown}@-webkit-keyframes bounceInLeft{100%,60%,75%,90%,from{-webkit-animation-timing-function:cubic-bezier(0.215,.61,.355,1);animation-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(-3000px,0,0);transform:translate3d(-3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}100%{-webkit-transform:none;transform:none}}@keyframes bounceInLeft{100%,60%,75%,90%,from{-webkit-animation-timing-function:cubic-bezier(0.215,.61,.355,1);animation-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(-3000px,0,0);transform:translate3d(-3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}100%{-webkit-transform:none;transform:none}}.bounceInLeft{-webkit-animation-name:bounceInLeft;animation-name:bounceInLeft}@-webkit-keyframes bounceInRight{100%,60%,75%,90%,from{-webkit-animation-timing-function:cubic-bezier(0.215,.61,.355,1);animation-timing-function:cubic-bezier(0.215,.61,.355,1)}from{opacity:0;-webkit-transform:translate3d(3000px,0,0);transform:translate3d(3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}100%{-webkit-transform:none;transform:none}}@keyframes bounceInRight{100%,60%,75%,90%,from{-webkit-animation-timing-function:cubic-bezier(0.215,.61,.355,1);animation-timing-function:cubic-bezier(0.215,.61,.355,1)}from{opacity:0;-webkit-transform:translate3d(3000px,0,0);transform:translate3d(3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}100%{-webkit-transform:none;transform:none}}.bounceInRight{-webkit-animation-name:bounceInRight;animation-name:bounceInRight}@-webkit-keyframes bounceInUp{100%,60%,75%,90%,from{-webkit-animation-timing-function:cubic-bezier(0.215,.61,.355,1);animation-timing-function:cubic-bezier(0.215,.61,.355,1)}from{opacity:0;-webkit-transform:translate3d(0,3000px,0);transform:translate3d(0,3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes bounceInUp{100%,60%,75%,90%,from{-webkit-animation-timing-function:cubic-bezier(0.215,.61,.355,1);animation-timing-function:cubic-bezier(0.215,.61,.355,1)}from{opacity:0;-webkit-transform:translate3d(0,3000px,0);transform:translate3d(0,3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.bounceInUp{-webkit-animation-name:bounceInUp;animation-name:bounceInUp}@-webkit-keyframes bounceOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@keyframes bounceOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}.bounceOut{-webkit-animation-name:bounceOut;animation-name:bounceOut}@-webkit-keyframes bounceOutDown{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}@keyframes bounceOutDown{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}.bounceOutDown{-webkit-animation-name:bounceOutDown;animation-name:bounceOutDown}@-webkit-keyframes bounceOutLeft{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@keyframes bounceOutLeft{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}.bounceOutLeft{-webkit-animation-name:bounceOutLeft;animation-name:bounceOutLeft}@-webkit-keyframes bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}@keyframes bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}.bounceOutRight{-webkit-animation-name:bounceOutRight;animation-name:bounceOutRight}@-webkit-keyframes bounceOutUp{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@keyframes bounceOutUp{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}.bounceOutUp{-webkit-animation-name:bounceOutUp;animation-name:bounceOutUp}@-webkit-keyframes fadeIn{from{opacity:0}100%{opacity:1}}@keyframes fadeIn{from{opacity:0}100%{opacity:1}}.fadeIn{-webkit-animation-name:fadeIn;animation-name:fadeIn}@-webkit-keyframes fadeInDown{from{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInDown{from{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInDown{-webkit-animation-name:fadeInDown;animation-name:fadeInDown}@-webkit-keyframes fadeInDownBig{from{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInDownBig{from{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInDownBig{-webkit-animation-name:fadeInDownBig;animation-name:fadeInDownBig}@-webkit-keyframes fadeInLeft{from{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInLeft{from{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInLeft{-webkit-animation-name:fadeInLeft;animation-name:fadeInLeft}@-webkit-keyframes fadeInLeftBig{from{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInLeftBig{from{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInLeftBig{-webkit-animation-name:fadeInLeftBig;animation-name:fadeInLeftBig}@-webkit-keyframes fadeInRight{from{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInRight{from{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInRight{-webkit-animation-name:fadeInRight;animation-name:fadeInRight}@-webkit-keyframes fadeInRightBig{from{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInRightBig{from{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInRightBig{-webkit-animation-name:fadeInRightBig;animation-name:fadeInRightBig}@-webkit-keyframes fadeInUp{from{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInUp{from{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInUp{-webkit-animation-name:fadeInUp;animation-name:fadeInUp}@-webkit-keyframes fadeInUpBig{from{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInUpBig{from{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInUpBig{-webkit-animation-name:fadeInUpBig;animation-name:fadeInUpBig}@-webkit-keyframes fadeOut{from{opacity:1}100%{opacity:0}}@keyframes fadeOut{from{opacity:1}100%{opacity:0}}.fadeOut{-webkit-animation-name:fadeOut;animation-name:fadeOut}@-webkit-keyframes fadeOutDown{from{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}@keyframes fadeOutDown{from{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}.fadeOutDown{-webkit-animation-name:fadeOutDown;animation-name:fadeOutDown}@-webkit-keyframes fadeOutDownBig{from{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}@keyframes fadeOutDownBig{from{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}.fadeOutDownBig{-webkit-animation-name:fadeOutDownBig;animation-name:fadeOutDownBig}@-webkit-keyframes fadeOutLeft{from{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}@keyframes fadeOutLeft{from{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.fadeOutLeft{-webkit-animation-name:fadeOutLeft;animation-name:fadeOutLeft}@-webkit-keyframes fadeOutLeftBig{from{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@keyframes fadeOutLeftBig{from{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}.fadeOutLeftBig{-webkit-animation-name:fadeOutLeftBig;animation-name:fadeOutLeftBig}@-webkit-keyframes fadeOutRight{from{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}@keyframes fadeOutRight{from{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.fadeOutRight{-webkit-animation-name:fadeOutRight;animation-name:fadeOutRight}@-webkit-keyframes fadeOutRightBig{from{opacity:1}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}@keyframes fadeOutRightBig{from{opacity:1}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}.fadeOutRightBig{-webkit-animation-name:fadeOutRightBig;animation-name:fadeOutRightBig}@-webkit-keyframes fadeOutUp{from{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}@keyframes fadeOutUp{from{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}.fadeOutUp{-webkit-animation-name:fadeOutUp;animation-name:fadeOutUp}@-webkit-keyframes fadeOutUpBig{from{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@keyframes fadeOutUpBig{from{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}.fadeOutUpBig{-webkit-animation-name:fadeOutUpBig;animation-name:fadeOutUpBig}@-webkit-keyframes flip{from{-webkit-transform:perspective(400px) rotate3d(0,1,0,-360deg);transform:perspective(400px) rotate3d(0,1,0,-360deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}50%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}80%{-webkit-transform:perspective(400px) scale3d(.95,.95,.95);transform:perspective(400px) scale3d(.95,.95,.95);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}100%{-webkit-transform:perspective(400px);transform:perspective(400px);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}}@keyframes flip{from{-webkit-transform:perspective(400px) rotate3d(0,1,0,-360deg);transform:perspective(400px) rotate3d(0,1,0,-360deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}50%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}80%{-webkit-transform:perspective(400px) scale3d(.95,.95,.95);transform:perspective(400px) scale3d(.95,.95,.95);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}100%{-webkit-transform:perspective(400px);transform:perspective(400px);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}}.animated.flip{-webkit-backface-visibility:visible;backface-visibility:visible;-webkit-animation-name:flip;animation-name:flip}@-webkit-keyframes flipInX{from{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg);transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes flipInX{from{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg);transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}.flipInX{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipInX;animation-name:flipInX}@-webkit-keyframes flipInY{from{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-20deg);transform:perspective(400px) rotate3d(0,1,0,-20deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0,1,0,10deg);transform:perspective(400px) rotate3d(0,1,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-5deg);transform:perspective(400px) rotate3d(0,1,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes flipInY{from{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-20deg);transform:perspective(400px) rotate3d(0,1,0,-20deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0,1,0,10deg);transform:perspective(400px) rotate3d(0,1,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-5deg);transform:perspective(400px) rotate3d(0,1,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}.flipInY{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipInY;animation-name:flipInY}@-webkit-keyframes flipOutX{from{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);opacity:0}}@keyframes flipOutX{from{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);opacity:0}}.flipOutX{-webkit-animation-name:flipOutX;animation-name:flipOutX;-webkit-backface-visibility:visible!important;backface-visibility:visible!important}@-webkit-keyframes flipOutY{from{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-15deg);transform:perspective(400px) rotate3d(0,1,0,-15deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);opacity:0}}@keyframes flipOutY{from{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-15deg);transform:perspective(400px) rotate3d(0,1,0,-15deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);opacity:0}}.flipOutY{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipOutY;animation-name:flipOutY}@-webkit-keyframes lightSpeedIn{from{-webkit-transform:translate3d(100%,0,0) skewX(-30deg);transform:translate3d(100%,0,0) skewX(-30deg);opacity:0}60%{-webkit-transform:skewX(20deg);transform:skewX(20deg);opacity:1}80%{-webkit-transform:skewX(-5deg);transform:skewX(-5deg);opacity:1}100%{-webkit-transform:none;transform:none;opacity:1}}@keyframes lightSpeedIn{from{-webkit-transform:translate3d(100%,0,0) skewX(-30deg);transform:translate3d(100%,0,0) skewX(-30deg);opacity:0}60%{-webkit-transform:skewX(20deg);transform:skewX(20deg);opacity:1}80%{-webkit-transform:skewX(-5deg);transform:skewX(-5deg);opacity:1}100%{-webkit-transform:none;transform:none;opacity:1}}.lightSpeedIn{-webkit-animation-name:lightSpeedIn;animation-name:lightSpeedIn;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}@-webkit-keyframes lightSpeedOut{from{opacity:1}100%{-webkit-transform:translate3d(100%,0,0) skewX(30deg);transform:translate3d(100%,0,0) skewX(30deg);opacity:0}}@keyframes lightSpeedOut{from{opacity:1}100%{-webkit-transform:translate3d(100%,0,0) skewX(30deg);transform:translate3d(100%,0,0) skewX(30deg);opacity:0}}.lightSpeedOut{-webkit-animation-name:lightSpeedOut;animation-name:lightSpeedOut;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}@-webkit-keyframes rotateIn{from{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,-200deg);transform:rotate3d(0,0,1,-200deg);opacity:0}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateIn{from{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,-200deg);transform:rotate3d(0,0,1,-200deg);opacity:0}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:none;transform:none;opacity:1}}.rotateIn{-webkit-animation-name:rotateIn;animation-name:rotateIn}@-webkit-keyframes rotateInDownLeft{from{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInDownLeft{from{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInDownLeft{-webkit-animation-name:rotateInDownLeft;animation-name:rotateInDownLeft}@-webkit-keyframes rotateInDownRight{from{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInDownRight{from{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInDownRight{-webkit-animation-name:rotateInDownRight;animation-name:rotateInDownRight}@-webkit-keyframes rotateInUpLeft{from{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInUpLeft{from{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInUpLeft{-webkit-animation-name:rotateInUpLeft;animation-name:rotateInUpLeft}@-webkit-keyframes rotateInUpRight{from{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-90deg);transform:rotate3d(0,0,1,-90deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInUpRight{from{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-90deg);transform:rotate3d(0,0,1,-90deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInUpRight{-webkit-animation-name:rotateInUpRight;animation-name:rotateInUpRight}@-webkit-keyframes rotateOut{from{-webkit-transform-origin:center;transform-origin:center;opacity:1}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,200deg);transform:rotate3d(0,0,1,200deg);opacity:0}}@keyframes rotateOut{from{-webkit-transform-origin:center;transform-origin:center;opacity:1}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,200deg);transform:rotate3d(0,0,1,200deg);opacity:0}}.rotateOut{-webkit-animation-name:rotateOut;animation-name:rotateOut}@-webkit-keyframes rotateOutDownLeft{from{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}}@keyframes rotateOutDownLeft{from{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}}.rotateOutDownLeft{-webkit-animation-name:rotateOutDownLeft;animation-name:rotateOutDownLeft}@-webkit-keyframes rotateOutDownRight{from{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}@keyframes rotateOutDownRight{from{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}.rotateOutDownRight{-webkit-animation-name:rotateOutDownRight;animation-name:rotateOutDownRight}@-webkit-keyframes rotateOutUpLeft{from{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}@keyframes rotateOutUpLeft{from{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}.rotateOutUpLeft{-webkit-animation-name:rotateOutUpLeft;animation-name:rotateOutUpLeft}@-webkit-keyframes rotateOutUpRight{from{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,90deg);transform:rotate3d(0,0,1,90deg);opacity:0}}@keyframes rotateOutUpRight{from{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,90deg);transform:rotate3d(0,0,1,90deg);opacity:0}}.rotateOutUpRight{-webkit-animation-name:rotateOutUpRight;animation-name:rotateOutUpRight}@-webkit-keyframes hinge{0%{-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}20%,60%{-webkit-transform:rotate3d(0,0,1,80deg);transform:rotate3d(0,0,1,80deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}40%,80%{-webkit-transform:rotate3d(0,0,1,60deg);transform:rotate3d(0,0,1,60deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;opacity:1}100%{-webkit-transform:translate3d(0,700px,0);transform:translate3d(0,700px,0);opacity:0}}@keyframes hinge{0%{-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}20%,60%{-webkit-transform:rotate3d(0,0,1,80deg);transform:rotate3d(0,0,1,80deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}40%,80%{-webkit-transform:rotate3d(0,0,1,60deg);transform:rotate3d(0,0,1,60deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;opacity:1}100%{-webkit-transform:translate3d(0,700px,0);transform:translate3d(0,700px,0);opacity:0}}.hinge{-webkit-animation-name:hinge;animation-name:hinge}@-webkit-keyframes rollIn{from{opacity:0;-webkit-transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg);transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes rollIn{from{opacity:0;-webkit-transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg);transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg)}100%{opacity:1;-webkit-transform:none;transform:none}}.rollIn{-webkit-animation-name:rollIn;animation-name:rollIn}@-webkit-keyframes rollOut{from{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg);transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg)}}@keyframes rollOut{from{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg);transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg)}}.rollOut{-webkit-animation-name:rollOut;animation-name:rollOut}@-webkit-keyframes zoomIn{from{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}@keyframes zoomIn{from{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}.zoomIn{-webkit-animation-name:zoomIn;animation-name:zoomIn}@-webkit-keyframes zoomInDown{from{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomInDown{from{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomInDown{-webkit-animation-name:zoomInDown;animation-name:zoomInDown}@-webkit-keyframes zoomInLeft{from{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(10px,0,0);transform:scale3d(.475,.475,.475) translate3d(10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomInLeft{from{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(10px,0,0);transform:scale3d(.475,.475,.475) translate3d(10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomInLeft{-webkit-animation-name:zoomInLeft;animation-name:zoomInLeft}@-webkit-keyframes zoomInRight{from{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomInRight{from{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomInRight{-webkit-animation-name:zoomInRight;animation-name:zoomInRight}@-webkit-keyframes zoomInUp{from{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomInUp{from{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomInUp{-webkit-animation-name:zoomInUp;animation-name:zoomInUp}@-webkit-keyframes zoomOut{from{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}100%{opacity:0}}@keyframes zoomOut{from{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}100%{opacity:0}}.zoomOut{-webkit-animation-name:zoomOut;animation-name:zoomOut}@-webkit-keyframes zoomOutDown{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomOutDown{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomOutDown{-webkit-animation-name:zoomOutDown;animation-name:zoomOutDown}@-webkit-keyframes zoomOutLeft{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(42px,0,0);transform:scale3d(.475,.475,.475) translate3d(42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(-2000px,0,0);transform:scale(.1) translate3d(-2000px,0,0);-webkit-transform-origin:left center;transform-origin:left center}}@keyframes zoomOutLeft{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(42px,0,0);transform:scale3d(.475,.475,.475) translate3d(42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(-2000px,0,0);transform:scale(.1) translate3d(-2000px,0,0);-webkit-transform-origin:left center;transform-origin:left center}}.zoomOutLeft{-webkit-animation-name:zoomOutLeft;animation-name:zoomOutLeft}@-webkit-keyframes zoomOutRight{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-42px,0,0);transform:scale3d(.475,.475,.475) translate3d(-42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(2000px,0,0);transform:scale(.1) translate3d(2000px,0,0);-webkit-transform-origin:right center;transform-origin:right center}}@keyframes zoomOutRight{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-42px,0,0);transform:scale3d(.475,.475,.475) translate3d(-42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(2000px,0,0);transform:scale(.1) translate3d(2000px,0,0);-webkit-transform-origin:right center;transform-origin:right center}}.zoomOutRight{-webkit-animation-name:zoomOutRight;animation-name:zoomOutRight}@-webkit-keyframes zoomOutUp{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomOutUp{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomOutUp{-webkit-animation-name:zoomOutUp;animation-name:zoomOutUp}@-webkit-keyframes slideInDown{from{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0);visibility:visible}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes slideInDown{from{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0);visibility:visible}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.slideInDown{-webkit-animation-name:slideInDown;animation-name:slideInDown}@-webkit-keyframes slideInLeft{from{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);visibility:visible}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes slideInLeft{from{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);visibility:visible}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.slideInLeft{-webkit-animation-name:slideInLeft;animation-name:slideInLeft}@-webkit-keyframes slideInRight{from{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);visibility:visible}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes slideInRight{from{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);visibility:visible}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.slideInRight{-webkit-animation-name:slideInRight;animation-name:slideInRight}@-webkit-keyframes slideInUp{from{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);visibility:visible}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes slideInUp{from{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);visibility:visible}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.slideInUp{-webkit-animation-name:slideInUp;animation-name:slideInUp}@-webkit-keyframes slideOutDown{from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}100%{visibility:hidden;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}@keyframes slideOutDown{from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}100%{visibility:hidden;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}.slideOutDown{-webkit-animation-name:slideOutDown;animation-name:slideOutDown}@-webkit-keyframes slideOutLeft{from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}100%{visibility:hidden;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}@keyframes slideOutLeft{from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}100%{visibility:hidden;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.slideOutLeft{-webkit-animation-name:slideOutLeft;animation-name:slideOutLeft}@-webkit-keyframes slideOutRight{from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}100%{visibility:hidden;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}@keyframes slideOutRight{from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}100%{visibility:hidden;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.slideOutRight{-webkit-animation-name:slideOutRight;animation-name:slideOutRight}@-webkit-keyframes slideOutUp{from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}100%{visibility:hidden;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}@keyframes slideOutUp{from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}100%{visibility:hidden;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}.slideOutUp{-webkit-animation-name:slideOutUp;animation-name:slideOutUp} +*/.animated{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.animated.infinite{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.animated.hinge{-webkit-animation-duration:2s;animation-duration:2s}.animated.bounceIn,.animated.bounceOut,.animated.flipOutX,.animated.flipOutY{-webkit-animation-duration:.75s;animation-duration:.75s}@-webkit-keyframes bounce{100%,20%,53%,80%,from{-webkit-animation-timing-function:cubic-bezier(0.215,.61,.355,1);animation-timing-function:cubic-bezier(0.215,.61,.355,1);-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}40%,43%{-webkit-animation-timing-function:cubic-bezier(0.755,.050,.855,.060);animation-timing-function:cubic-bezier(0.755,.050,.855,.060);-webkit-transform:translate3d(0,-30px,0);transform:translate3d(0,-30px,0)}70%{-webkit-animation-timing-function:cubic-bezier(0.755,.050,.855,.060);animation-timing-function:cubic-bezier(0.755,.050,.855,.060);-webkit-transform:translate3d(0,-15px,0);transform:translate3d(0,-15px,0)}90%{-webkit-transform:translate3d(0,-4px,0);transform:translate3d(0,-4px,0)}}@keyframes bounce{100%,20%,53%,80%,from{-webkit-animation-timing-function:cubic-bezier(0.215,.61,.355,1);animation-timing-function:cubic-bezier(0.215,.61,.355,1);-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}40%,43%{-webkit-animation-timing-function:cubic-bezier(0.755,.050,.855,.060);animation-timing-function:cubic-bezier(0.755,.050,.855,.060);-webkit-transform:translate3d(0,-30px,0);transform:translate3d(0,-30px,0)}70%{-webkit-animation-timing-function:cubic-bezier(0.755,.050,.855,.060);animation-timing-function:cubic-bezier(0.755,.050,.855,.060);-webkit-transform:translate3d(0,-15px,0);transform:translate3d(0,-15px,0)}90%{-webkit-transform:translate3d(0,-4px,0);transform:translate3d(0,-4px,0)}}.bounce{-webkit-animation-name:bounce;animation-name:bounce;-webkit-transform-origin:center bottom;transform-origin:center bottom}@-webkit-keyframes flash{100%,50%,from{opacity:1}25%,75%{opacity:0}}@keyframes flash{100%,50%,from{opacity:1}25%,75%{opacity:0}}.flash{-webkit-animation-name:flash;animation-name:flash}@-webkit-keyframes pulse{from{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}50%{-webkit-transform:scale3d(1.05,1.05,1.05);transform:scale3d(1.05,1.05,1.05)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes pulse{from{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}50%{-webkit-transform:scale3d(1.05,1.05,1.05);transform:scale3d(1.05,1.05,1.05)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.pulse{-webkit-animation-name:pulse;animation-name:pulse}@-webkit-keyframes rubberBand{from{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}30%{-webkit-transform:scale3d(1.25,.75,1);transform:scale3d(1.25,.75,1)}40%{-webkit-transform:scale3d(0.75,1.25,1);transform:scale3d(0.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,.85,1);transform:scale3d(1.15,.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes rubberBand{from{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}30%{-webkit-transform:scale3d(1.25,.75,1);transform:scale3d(1.25,.75,1)}40%{-webkit-transform:scale3d(0.75,1.25,1);transform:scale3d(0.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,.85,1);transform:scale3d(1.15,.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.rubberBand{-webkit-animation-name:rubberBand;animation-name:rubberBand}@-webkit-keyframes shake{100%,from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}@keyframes shake{100%,from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}.shake{-webkit-animation-name:shake;animation-name:shake}@-webkit-keyframes swing{20%{-webkit-transform:rotate3d(0,0,1,15deg);transform:rotate3d(0,0,1,15deg)}40%{-webkit-transform:rotate3d(0,0,1,-10deg);transform:rotate3d(0,0,1,-10deg)}60%{-webkit-transform:rotate3d(0,0,1,5deg);transform:rotate3d(0,0,1,5deg)}80%{-webkit-transform:rotate3d(0,0,1,-5deg);transform:rotate3d(0,0,1,-5deg)}100%{-webkit-transform:rotate3d(0,0,1,0deg);transform:rotate3d(0,0,1,0deg)}}@keyframes swing{20%{-webkit-transform:rotate3d(0,0,1,15deg);transform:rotate3d(0,0,1,15deg)}40%{-webkit-transform:rotate3d(0,0,1,-10deg);transform:rotate3d(0,0,1,-10deg)}60%{-webkit-transform:rotate3d(0,0,1,5deg);transform:rotate3d(0,0,1,5deg)}80%{-webkit-transform:rotate3d(0,0,1,-5deg);transform:rotate3d(0,0,1,-5deg)}100%{-webkit-transform:rotate3d(0,0,1,0deg);transform:rotate3d(0,0,1,0deg)}}.swing{-webkit-transform-origin:top center;transform-origin:top center;-webkit-animation-name:swing;animation-name:swing}@-webkit-keyframes tada{from{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}10%,20%{-webkit-transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg);transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg)}30%,50%,70%,90%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg)}40%,60%,80%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes tada{from{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}10%,20%{-webkit-transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg);transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg)}30%,50%,70%,90%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg)}40%,60%,80%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.tada{-webkit-animation-name:tada;animation-name:tada}@-webkit-keyframes wobble{from{-webkit-transform:none;transform:none}15%{-webkit-transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg);transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg)}30%{-webkit-transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg);transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg)}45%{-webkit-transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg);transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg)}60%{-webkit-transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg);transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg)}75%{-webkit-transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg);transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg)}100%{-webkit-transform:none;transform:none}}@keyframes wobble{from{-webkit-transform:none;transform:none}15%{-webkit-transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg);transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg)}30%{-webkit-transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg);transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg)}45%{-webkit-transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg);transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg)}60%{-webkit-transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg);transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg)}75%{-webkit-transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg);transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg)}100%{-webkit-transform:none;transform:none}}.wobble{-webkit-animation-name:wobble;animation-name:wobble}@-webkit-keyframes jello{100%,11.1%,from{-webkit-transform:none;transform:none}22.2%{-webkit-transform:skewX(-12.5deg) skewY(-12.5deg);transform:skewX(-12.5deg) skewY(-12.5deg)}33.3%{-webkit-transform:skewX(6.25deg) skewY(6.25deg);transform:skewX(6.25deg) skewY(6.25deg)}44.4%{-webkit-transform:skewX(-3.125deg) skewY(-3.125deg);transform:skewX(-3.125deg) skewY(-3.125deg)}55.5%{-webkit-transform:skewX(1.5625deg) skewY(1.5625deg);transform:skewX(1.5625deg) skewY(1.5625deg)}66.6%{-webkit-transform:skewX(-.78125deg) skewY(-.78125deg);transform:skewX(-.78125deg) skewY(-.78125deg)}77.7%{-webkit-transform:skewX(0.390625deg) skewY(0.390625deg);transform:skewX(0.390625deg) skewY(0.390625deg)}88.8%{-webkit-transform:skewX(-.1953125deg) skewY(-.1953125deg);transform:skewX(-.1953125deg) skewY(-.1953125deg)}}@keyframes jello{100%,11.1%,from{-webkit-transform:none;transform:none}22.2%{-webkit-transform:skewX(-12.5deg) skewY(-12.5deg);transform:skewX(-12.5deg) skewY(-12.5deg)}33.3%{-webkit-transform:skewX(6.25deg) skewY(6.25deg);transform:skewX(6.25deg) skewY(6.25deg)}44.4%{-webkit-transform:skewX(-3.125deg) skewY(-3.125deg);transform:skewX(-3.125deg) skewY(-3.125deg)}55.5%{-webkit-transform:skewX(1.5625deg) skewY(1.5625deg);transform:skewX(1.5625deg) skewY(1.5625deg)}66.6%{-webkit-transform:skewX(-.78125deg) skewY(-.78125deg);transform:skewX(-.78125deg) skewY(-.78125deg)}77.7%{-webkit-transform:skewX(0.390625deg) skewY(0.390625deg);transform:skewX(0.390625deg) skewY(0.390625deg)}88.8%{-webkit-transform:skewX(-.1953125deg) skewY(-.1953125deg);transform:skewX(-.1953125deg) skewY(-.1953125deg)}}.jello{-webkit-animation-name:jello;animation-name:jello;-webkit-transform-origin:center;transform-origin:center}@-webkit-keyframes bounceIn{100%,20%,40%,60%,80%,from{-webkit-animation-timing-function:cubic-bezier(0.215,.61,.355,1);animation-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes bounceIn{100%,20%,40%,60%,80%,from{-webkit-animation-timing-function:cubic-bezier(0.215,.61,.355,1);animation-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.bounceIn{-webkit-animation-name:bounceIn;animation-name:bounceIn}@-webkit-keyframes bounceInDown{100%,60%,75%,90%,from{-webkit-animation-timing-function:cubic-bezier(0.215,.61,.355,1);animation-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,-3000px,0);transform:translate3d(0,-3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}100%{-webkit-transform:none;transform:none}}@keyframes bounceInDown{100%,60%,75%,90%,from{-webkit-animation-timing-function:cubic-bezier(0.215,.61,.355,1);animation-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,-3000px,0);transform:translate3d(0,-3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}100%{-webkit-transform:none;transform:none}}.bounceInDown{-webkit-animation-name:bounceInDown;animation-name:bounceInDown}@-webkit-keyframes bounceInLeft{100%,60%,75%,90%,from{-webkit-animation-timing-function:cubic-bezier(0.215,.61,.355,1);animation-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(-3000px,0,0);transform:translate3d(-3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}100%{-webkit-transform:none;transform:none}}@keyframes bounceInLeft{100%,60%,75%,90%,from{-webkit-animation-timing-function:cubic-bezier(0.215,.61,.355,1);animation-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(-3000px,0,0);transform:translate3d(-3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}100%{-webkit-transform:none;transform:none}}.bounceInLeft{-webkit-animation-name:bounceInLeft;animation-name:bounceInLeft}@-webkit-keyframes bounceInRight{100%,60%,75%,90%,from{-webkit-animation-timing-function:cubic-bezier(0.215,.61,.355,1);animation-timing-function:cubic-bezier(0.215,.61,.355,1)}from{opacity:0;-webkit-transform:translate3d(3000px,0,0);transform:translate3d(3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}100%{-webkit-transform:none;transform:none}}@keyframes bounceInRight{100%,60%,75%,90%,from{-webkit-animation-timing-function:cubic-bezier(0.215,.61,.355,1);animation-timing-function:cubic-bezier(0.215,.61,.355,1)}from{opacity:0;-webkit-transform:translate3d(3000px,0,0);transform:translate3d(3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}100%{-webkit-transform:none;transform:none}}.bounceInRight{-webkit-animation-name:bounceInRight;animation-name:bounceInRight}@-webkit-keyframes bounceInUp{100%,60%,75%,90%,from{-webkit-animation-timing-function:cubic-bezier(0.215,.61,.355,1);animation-timing-function:cubic-bezier(0.215,.61,.355,1)}from{opacity:0;-webkit-transform:translate3d(0,3000px,0);transform:translate3d(0,3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes bounceInUp{100%,60%,75%,90%,from{-webkit-animation-timing-function:cubic-bezier(0.215,.61,.355,1);animation-timing-function:cubic-bezier(0.215,.61,.355,1)}from{opacity:0;-webkit-transform:translate3d(0,3000px,0);transform:translate3d(0,3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.bounceInUp{-webkit-animation-name:bounceInUp;animation-name:bounceInUp}@-webkit-keyframes bounceOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@keyframes bounceOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}.bounceOut{-webkit-animation-name:bounceOut;animation-name:bounceOut}@-webkit-keyframes bounceOutDown{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}@keyframes bounceOutDown{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}.bounceOutDown{-webkit-animation-name:bounceOutDown;animation-name:bounceOutDown}@-webkit-keyframes bounceOutLeft{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@keyframes bounceOutLeft{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}.bounceOutLeft{-webkit-animation-name:bounceOutLeft;animation-name:bounceOutLeft}@-webkit-keyframes bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}@keyframes bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}.bounceOutRight{-webkit-animation-name:bounceOutRight;animation-name:bounceOutRight}@-webkit-keyframes bounceOutUp{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@keyframes bounceOutUp{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}.bounceOutUp{-webkit-animation-name:bounceOutUp;animation-name:bounceOutUp}@-webkit-keyframes fadeIn{from{opacity:0}100%{opacity:1}}@keyframes fadeIn{from{opacity:0}100%{opacity:1}}.fadeIn{-webkit-animation-name:fadeIn;animation-name:fadeIn}@-webkit-keyframes fadeInDown{from{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInDown{from{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInDown{-webkit-animation-name:fadeInDown;animation-name:fadeInDown}@-webkit-keyframes fadeInDownBig{from{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInDownBig{from{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInDownBig{-webkit-animation-name:fadeInDownBig;animation-name:fadeInDownBig}@-webkit-keyframes fadeInLeft{from{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInLeft{from{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInLeft{-webkit-animation-name:fadeInLeft;animation-name:fadeInLeft}@-webkit-keyframes fadeInLeftBig{from{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInLeftBig{from{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInLeftBig{-webkit-animation-name:fadeInLeftBig;animation-name:fadeInLeftBig}@-webkit-keyframes fadeInRight{from{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInRight{from{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInRight{-webkit-animation-name:fadeInRight;animation-name:fadeInRight}@-webkit-keyframes fadeInRightBig{from{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInRightBig{from{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInRightBig{-webkit-animation-name:fadeInRightBig;animation-name:fadeInRightBig}@-webkit-keyframes fadeInUp{from{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInUp{from{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInUp{-webkit-animation-name:fadeInUp;animation-name:fadeInUp}@-webkit-keyframes fadeInUpBig{from{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInUpBig{from{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInUpBig{-webkit-animation-name:fadeInUpBig;animation-name:fadeInUpBig}@-webkit-keyframes fadeOut{from{opacity:1}100%{opacity:0}}@keyframes fadeOut{from{opacity:1}100%{opacity:0}}.fadeOut{-webkit-animation-name:fadeOut;animation-name:fadeOut}@-webkit-keyframes fadeOutDown{from{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}@keyframes fadeOutDown{from{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}.fadeOutDown{-webkit-animation-name:fadeOutDown;animation-name:fadeOutDown}@-webkit-keyframes fadeOutDownBig{from{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}@keyframes fadeOutDownBig{from{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}.fadeOutDownBig{-webkit-animation-name:fadeOutDownBig;animation-name:fadeOutDownBig}@-webkit-keyframes fadeOutLeft{from{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}@keyframes fadeOutLeft{from{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.fadeOutLeft{-webkit-animation-name:fadeOutLeft;animation-name:fadeOutLeft}@-webkit-keyframes fadeOutLeftBig{from{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@keyframes fadeOutLeftBig{from{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}.fadeOutLeftBig{-webkit-animation-name:fadeOutLeftBig;animation-name:fadeOutLeftBig}@-webkit-keyframes fadeOutRight{from{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}@keyframes fadeOutRight{from{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.fadeOutRight{-webkit-animation-name:fadeOutRight;animation-name:fadeOutRight}@-webkit-keyframes fadeOutRightBig{from{opacity:1}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}@keyframes fadeOutRightBig{from{opacity:1}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}.fadeOutRightBig{-webkit-animation-name:fadeOutRightBig;animation-name:fadeOutRightBig}@-webkit-keyframes fadeOutUp{from{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}@keyframes fadeOutUp{from{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}.fadeOutUp{-webkit-animation-name:fadeOutUp;animation-name:fadeOutUp}@-webkit-keyframes fadeOutUpBig{from{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@keyframes fadeOutUpBig{from{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}.fadeOutUpBig{-webkit-animation-name:fadeOutUpBig;animation-name:fadeOutUpBig}@-webkit-keyframes flip{from{-webkit-transform:perspective(400px) rotate3d(0,1,0,-360deg);transform:perspective(400px) rotate3d(0,1,0,-360deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}50%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}80%{-webkit-transform:perspective(400px) scale3d(.95,.95,.95);transform:perspective(400px) scale3d(.95,.95,.95);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}100%{-webkit-transform:perspective(400px);transform:perspective(400px);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}}@keyframes flip{from{-webkit-transform:perspective(400px) rotate3d(0,1,0,-360deg);transform:perspective(400px) rotate3d(0,1,0,-360deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}50%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}80%{-webkit-transform:perspective(400px) scale3d(.95,.95,.95);transform:perspective(400px) scale3d(.95,.95,.95);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}100%{-webkit-transform:perspective(400px);transform:perspective(400px);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}}.animated.flip{-webkit-backface-visibility:visible;backface-visibility:visible;-webkit-animation-name:flip;animation-name:flip}@-webkit-keyframes flipInX{from{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg);transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes flipInX{from{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg);transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}.flipInX{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipInX;animation-name:flipInX}@-webkit-keyframes flipInY{from{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-20deg);transform:perspective(400px) rotate3d(0,1,0,-20deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0,1,0,10deg);transform:perspective(400px) rotate3d(0,1,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-5deg);transform:perspective(400px) rotate3d(0,1,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes flipInY{from{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-20deg);transform:perspective(400px) rotate3d(0,1,0,-20deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0,1,0,10deg);transform:perspective(400px) rotate3d(0,1,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-5deg);transform:perspective(400px) rotate3d(0,1,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}.flipInY{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipInY;animation-name:flipInY}@-webkit-keyframes flipOutX{from{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);opacity:0}}@keyframes flipOutX{from{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);opacity:0}}.flipOutX{-webkit-animation-name:flipOutX;animation-name:flipOutX;-webkit-backface-visibility:visible!important;backface-visibility:visible!important}@-webkit-keyframes flipOutY{from{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-15deg);transform:perspective(400px) rotate3d(0,1,0,-15deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);opacity:0}}@keyframes flipOutY{from{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-15deg);transform:perspective(400px) rotate3d(0,1,0,-15deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);opacity:0}}.flipOutY{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipOutY;animation-name:flipOutY}@-webkit-keyframes lightSpeedIn{from{-webkit-transform:translate3d(100%,0,0) skewX(-30deg);transform:translate3d(100%,0,0) skewX(-30deg);opacity:0}60%{-webkit-transform:skewX(20deg);transform:skewX(20deg);opacity:1}80%{-webkit-transform:skewX(-5deg);transform:skewX(-5deg);opacity:1}100%{-webkit-transform:none;transform:none;opacity:1}}@keyframes lightSpeedIn{from{-webkit-transform:translate3d(100%,0,0) skewX(-30deg);transform:translate3d(100%,0,0) skewX(-30deg);opacity:0}60%{-webkit-transform:skewX(20deg);transform:skewX(20deg);opacity:1}80%{-webkit-transform:skewX(-5deg);transform:skewX(-5deg);opacity:1}100%{-webkit-transform:none;transform:none;opacity:1}}.lightSpeedIn{-webkit-animation-name:lightSpeedIn;animation-name:lightSpeedIn;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}@-webkit-keyframes lightSpeedOut{from{opacity:1}100%{-webkit-transform:translate3d(100%,0,0) skewX(30deg);transform:translate3d(100%,0,0) skewX(30deg);opacity:0}}@keyframes lightSpeedOut{from{opacity:1}100%{-webkit-transform:translate3d(100%,0,0) skewX(30deg);transform:translate3d(100%,0,0) skewX(30deg);opacity:0}}.lightSpeedOut{-webkit-animation-name:lightSpeedOut;animation-name:lightSpeedOut;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}@-webkit-keyframes rotateIn{from{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,-200deg);transform:rotate3d(0,0,1,-200deg);opacity:0}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateIn{from{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,-200deg);transform:rotate3d(0,0,1,-200deg);opacity:0}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:none;transform:none;opacity:1}}.rotateIn{-webkit-animation-name:rotateIn;animation-name:rotateIn}@-webkit-keyframes rotateInDownLeft{from{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInDownLeft{from{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInDownLeft{-webkit-animation-name:rotateInDownLeft;animation-name:rotateInDownLeft}@-webkit-keyframes rotateInDownRight{from{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInDownRight{from{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInDownRight{-webkit-animation-name:rotateInDownRight;animation-name:rotateInDownRight}@-webkit-keyframes rotateInUpLeft{from{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInUpLeft{from{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInUpLeft{-webkit-animation-name:rotateInUpLeft;animation-name:rotateInUpLeft}@-webkit-keyframes rotateInUpRight{from{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-90deg);transform:rotate3d(0,0,1,-90deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInUpRight{from{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-90deg);transform:rotate3d(0,0,1,-90deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInUpRight{-webkit-animation-name:rotateInUpRight;animation-name:rotateInUpRight}@-webkit-keyframes rotateOut{from{-webkit-transform-origin:center;transform-origin:center;opacity:1}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,200deg);transform:rotate3d(0,0,1,200deg);opacity:0}}@keyframes rotateOut{from{-webkit-transform-origin:center;transform-origin:center;opacity:1}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,200deg);transform:rotate3d(0,0,1,200deg);opacity:0}}.rotateOut{-webkit-animation-name:rotateOut;animation-name:rotateOut}@-webkit-keyframes rotateOutDownLeft{from{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}}@keyframes rotateOutDownLeft{from{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}}.rotateOutDownLeft{-webkit-animation-name:rotateOutDownLeft;animation-name:rotateOutDownLeft}@-webkit-keyframes rotateOutDownRight{from{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}@keyframes rotateOutDownRight{from{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}.rotateOutDownRight{-webkit-animation-name:rotateOutDownRight;animation-name:rotateOutDownRight}@-webkit-keyframes rotateOutUpLeft{from{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}@keyframes rotateOutUpLeft{from{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}.rotateOutUpLeft{-webkit-animation-name:rotateOutUpLeft;animation-name:rotateOutUpLeft}@-webkit-keyframes rotateOutUpRight{from{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,90deg);transform:rotate3d(0,0,1,90deg);opacity:0}}@keyframes rotateOutUpRight{from{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,90deg);transform:rotate3d(0,0,1,90deg);opacity:0}}.rotateOutUpRight{-webkit-animation-name:rotateOutUpRight;animation-name:rotateOutUpRight}@-webkit-keyframes hinge{0%{-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}20%,60%{-webkit-transform:rotate3d(0,0,1,80deg);transform:rotate3d(0,0,1,80deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}40%,80%{-webkit-transform:rotate3d(0,0,1,60deg);transform:rotate3d(0,0,1,60deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;opacity:1}100%{-webkit-transform:translate3d(0,700px,0);transform:translate3d(0,700px,0);opacity:0}}@keyframes hinge{0%{-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}20%,60%{-webkit-transform:rotate3d(0,0,1,80deg);transform:rotate3d(0,0,1,80deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}40%,80%{-webkit-transform:rotate3d(0,0,1,60deg);transform:rotate3d(0,0,1,60deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;opacity:1}100%{-webkit-transform:translate3d(0,700px,0);transform:translate3d(0,700px,0);opacity:0}}.hinge{-webkit-animation-name:hinge;animation-name:hinge}@-webkit-keyframes rollIn{from{opacity:0;-webkit-transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg);transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes rollIn{from{opacity:0;-webkit-transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg);transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg)}100%{opacity:1;-webkit-transform:none;transform:none}}.rollIn{-webkit-animation-name:rollIn;animation-name:rollIn}@-webkit-keyframes rollOut{from{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg);transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg)}}@keyframes rollOut{from{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg);transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg)}}.rollOut{-webkit-animation-name:rollOut;animation-name:rollOut}@-webkit-keyframes zoomIn{from{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}@keyframes zoomIn{from{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}.zoomIn{-webkit-animation-name:zoomIn;animation-name:zoomIn}@-webkit-keyframes zoomInDown{from{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomInDown{from{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomInDown{-webkit-animation-name:zoomInDown;animation-name:zoomInDown}@-webkit-keyframes zoomInLeft{from{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(10px,0,0);transform:scale3d(.475,.475,.475) translate3d(10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomInLeft{from{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(10px,0,0);transform:scale3d(.475,.475,.475) translate3d(10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomInLeft{-webkit-animation-name:zoomInLeft;animation-name:zoomInLeft}@-webkit-keyframes zoomInRight{from{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomInRight{from{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomInRight{-webkit-animation-name:zoomInRight;animation-name:zoomInRight}@-webkit-keyframes zoomInUp{from{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomInUp{from{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomInUp{-webkit-animation-name:zoomInUp;animation-name:zoomInUp}@-webkit-keyframes zoomOut{from{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}100%{opacity:0}}@keyframes zoomOut{from{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}100%{opacity:0}}.zoomOut{-webkit-animation-name:zoomOut;animation-name:zoomOut}@-webkit-keyframes zoomOutDown{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomOutDown{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomOutDown{-webkit-animation-name:zoomOutDown;animation-name:zoomOutDown}@-webkit-keyframes zoomOutLeft{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(42px,0,0);transform:scale3d(.475,.475,.475) translate3d(42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(-2000px,0,0);transform:scale(.1) translate3d(-2000px,0,0);-webkit-transform-origin:left center;transform-origin:left center}}@keyframes zoomOutLeft{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(42px,0,0);transform:scale3d(.475,.475,.475) translate3d(42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(-2000px,0,0);transform:scale(.1) translate3d(-2000px,0,0);-webkit-transform-origin:left center;transform-origin:left center}}.zoomOutLeft{-webkit-animation-name:zoomOutLeft;animation-name:zoomOutLeft}@-webkit-keyframes zoomOutRight{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-42px,0,0);transform:scale3d(.475,.475,.475) translate3d(-42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(2000px,0,0);transform:scale(.1) translate3d(2000px,0,0);-webkit-transform-origin:right center;transform-origin:right center}}@keyframes zoomOutRight{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-42px,0,0);transform:scale3d(.475,.475,.475) translate3d(-42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(2000px,0,0);transform:scale(.1) translate3d(2000px,0,0);-webkit-transform-origin:right center;transform-origin:right center}}.zoomOutRight{-webkit-animation-name:zoomOutRight;animation-name:zoomOutRight}@-webkit-keyframes zoomOutUp{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomOutUp{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomOutUp{-webkit-animation-name:zoomOutUp;animation-name:zoomOutUp}@-webkit-keyframes slideInDown{from{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0);visibility:visible}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes slideInDown{from{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0);visibility:visible}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.slideInDown{-webkit-animation-name:slideInDown;animation-name:slideInDown}@-webkit-keyframes slideInLeft{from{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);visibility:visible}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes slideInLeft{from{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);visibility:visible}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.slideInLeft{-webkit-animation-name:slideInLeft;animation-name:slideInLeft}@-webkit-keyframes slideInRight{from{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);visibility:visible}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes slideInRight{from{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);visibility:visible}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.slideInRight{-webkit-animation-name:slideInRight;animation-name:slideInRight}@-webkit-keyframes slideInUp{from{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);visibility:visible}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes slideInUp{from{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);visibility:visible}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.slideInUp{-webkit-animation-name:slideInUp;animation-name:slideInUp}@-webkit-keyframes slideOutDown{from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}100%{visibility:hidden;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}@keyframes slideOutDown{from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}100%{visibility:hidden;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}.slideOutDown{-webkit-animation-name:slideOutDown;animation-name:slideOutDown}@-webkit-keyframes slideOutLeft{from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}100%{visibility:hidden;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}@keyframes slideOutLeft{from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}100%{visibility:hidden;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.slideOutLeft{-webkit-animation-name:slideOutLeft;animation-name:slideOutLeft}@-webkit-keyframes slideOutRight{from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}100%{visibility:hidden;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}@keyframes slideOutRight{from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}100%{visibility:hidden;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.slideOutRight{-webkit-animation-name:slideOutRight;animation-name:slideOutRight}@-webkit-keyframes slideOutUp{from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}100%{visibility:hidden;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}@keyframes slideOutUp{from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}100%{visibility:hidden;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}.slideOutUp{-webkit-animation-name:slideOutUp;animation-name:slideOutUp} /** * prism.js default theme for JavaScript, CSS and HTML * Based on dabblet (http://dabblet.com) @@ -1325,7 +1325,7 @@ pre[class*="language-"] { .token.entity { cursor: help; } - + $popover-z-index: 100 !default; $popover-bg-color: #fff !default; $popover-border-color: #d2d2d2 !default; @@ -1534,8 +1534,8 @@ $popover-triangle-border-color: $popover-border-color !default; margin-bottom: 0; } } -} -._720kb-tooltip{background:rgba(0,0,0,.8);color:#fff;position:absolute;z-index:9;padding:.4% 1%;opacity:0;visibility:hidden;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;left:-200%;top:0;pointer-events:none}._720kb-tooltip-title{color:rgba(255,255,255,.95);font-weight:500;width:100%;clear:both}._720kb-tooltip-caret:after,._720kb-tooltip-caret:before{content:'';position:absolute;width:0;height:0}._720kb-tooltip._720kb-tooltip-small{padding:4.5px 10px;font-size:12px}._720kb-tooltip._720kb-tooltip-medium{padding:7px 15px;font-size:13.5px}._720kb-tooltip._720kb-tooltip-large{padding:10px 20px;font-size:14px}._720kb-tooltip._720kb-tooltip-open{visiblity:'';opacity:1}._720kb-tooltip-caret:before{border:6px solid rgba(0,0,0,.8)}._720kb-tooltip-caret:after{border:5px solid transparent}._720kb-tooltip-left ._720kb-tooltip-caret:after,._720kb-tooltip-left ._720kb-tooltip-caret:before,._720kb-tooltip-right ._720kb-tooltip-caret:after,._720kb-tooltip-right ._720kb-tooltip-caret:before{top:50%;border-top-color:transparent;border-bottom-color:transparent}._720kb-tooltip-left ._720kb-tooltip-caret:before{left:100%;margin-left:0;margin-top:-6px;border-right-width:0}._720kb-tooltip-left ._720kb-tooltip-caret:after{left:100%;margin-left:0;margin-top:-5px;border-right-width:0}._720kb-tooltip-right ._720kb-tooltip-caret:before{left:0;margin-left:-6px;margin-top:-6px;border-left-width:0}._720kb-tooltip-right ._720kb-tooltip-caret:after{left:0;margin-left:-5px;margin-top:-5px;border-left-width:0}._720kb-tooltip-bottom ._720kb-tooltip-caret:after,._720kb-tooltip-bottom ._720kb-tooltip-caret:before,._720kb-tooltip-top ._720kb-tooltip-caret:after,._720kb-tooltip-top ._720kb-tooltip-caret:before{left:50%;border-right-color:transparent;border-left-color:transparent}._720kb-tooltip-top ._720kb-tooltip-caret:before{top:100%;margin-left:-6px;margin-bottom:-6px;border-bottom-width:0}._720kb-tooltip-top ._720kb-tooltip-caret:after{top:100%;margin-left:-5px;margin-bottom:-5px;border-bottom-width:0}._720kb-tooltip-bottom ._720kb-tooltip-caret:before{bottom:100%;margin-left:-6px;border-top-width:0}._720kb-tooltip-bottom ._720kb-tooltip-caret:after{bottom:100%;margin-left:-5px;border-top-width:0}._720kb-tooltip-close-button{float:right} +} +._720kb-tooltip{background:rgba(0,0,0,.8);color:#fff;position:absolute;z-index:9;padding:.4% 1%;opacity:0;visibility:hidden;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;left:-200%;top:0;pointer-events:none}._720kb-tooltip-title{color:rgba(255,255,255,.95);font-weight:500;width:100%;clear:both}._720kb-tooltip-caret:after,._720kb-tooltip-caret:before{content:'';position:absolute;width:0;height:0}._720kb-tooltip._720kb-tooltip-small{padding:4.5px 10px;font-size:12px}._720kb-tooltip._720kb-tooltip-medium{padding:7px 15px;font-size:13.5px}._720kb-tooltip._720kb-tooltip-large{padding:10px 20px;font-size:14px}._720kb-tooltip._720kb-tooltip-open{visiblity:'';opacity:1}._720kb-tooltip-caret:before{border:6px solid rgba(0,0,0,.8)}._720kb-tooltip-caret:after{border:5px solid transparent}._720kb-tooltip-left ._720kb-tooltip-caret:after,._720kb-tooltip-left ._720kb-tooltip-caret:before,._720kb-tooltip-right ._720kb-tooltip-caret:after,._720kb-tooltip-right ._720kb-tooltip-caret:before{top:50%;border-top-color:transparent;border-bottom-color:transparent}._720kb-tooltip-left ._720kb-tooltip-caret:before{left:100%;margin-left:0;margin-top:-6px;border-right-width:0}._720kb-tooltip-left ._720kb-tooltip-caret:after{left:100%;margin-left:0;margin-top:-5px;border-right-width:0}._720kb-tooltip-right ._720kb-tooltip-caret:before{left:0;margin-left:-6px;margin-top:-6px;border-left-width:0}._720kb-tooltip-right ._720kb-tooltip-caret:after{left:0;margin-left:-5px;margin-top:-5px;border-left-width:0}._720kb-tooltip-bottom ._720kb-tooltip-caret:after,._720kb-tooltip-bottom ._720kb-tooltip-caret:before,._720kb-tooltip-top ._720kb-tooltip-caret:after,._720kb-tooltip-top ._720kb-tooltip-caret:before{left:50%;border-right-color:transparent;border-left-color:transparent}._720kb-tooltip-top ._720kb-tooltip-caret:before{top:100%;margin-left:-6px;margin-bottom:-6px;border-bottom-width:0}._720kb-tooltip-top ._720kb-tooltip-caret:after{top:100%;margin-left:-5px;margin-bottom:-5px;border-bottom-width:0}._720kb-tooltip-bottom ._720kb-tooltip-caret:before{bottom:100%;margin-left:-6px;border-top-width:0}._720kb-tooltip-bottom ._720kb-tooltip-caret:after{bottom:100%;margin-left:-5px;border-top-width:0}._720kb-tooltip-close-button{float:right} .resizable { position: relative; } @@ -1700,7 +1700,7 @@ $popover-triangle-border-color: $popover-border-color !default; right: 0; bottom: 0; margin: auto; } - + @import url("http://fonts.googleapis.com/css?family=Lato:100,300,400,700,900,400italic"); /** * This is the main application stylesheet. It should include or import all diff --git a/webapp/src/main/resources/static/assets/ttt-0.0.1.js b/webapp/src/main/resources/static/assets/ttt-0.0.1.js index 77e991f66..bd3290212 100644 --- a/webapp/src/main/resources/static/assets/ttt-0.0.1.js +++ b/webapp/src/main/resources/static/assets/ttt-0.0.1.js @@ -1,37 +1,37 @@ -/** - * ttt - v0.0.1 - 2024-01-22 - * https://edge.nist.gov - */ +/** + * ttt - v0.0.1 - 2024-08-15 + * https://edge.nist.gov + */ !function(a,b,c){"use strict";function d(a,b){return b=b||Error,function(){var c,d,e=2,f=arguments,g=f[0],h="["+(a?a+":":"")+g+"] ",i=f[1];for(h+=i.replace(/\{\d+\}/g,function(a){var b=+a.slice(1,-1),c=b+e;return c=0&&(b-1 in a||a instanceof Array)||"function"==typeof a.item)}function f(a,b,c){var d,g;if(a)if(A(a))for(d in a)"prototype"==d||"length"==d||"name"==d||a.hasOwnProperty&&!a.hasOwnProperty(d)||b.call(c,a[d],d,a);else if(Rd(a)||e(a)){var h="object"!=typeof a;for(d=0,g=a.length;g>d;d++)(h||d in a)&&b.call(c,a[d],d,a)}else if(a.forEach&&a.forEach!==f)a.forEach(b,c,a);else if(w(a))for(d in a)b.call(c,a[d],d,a);else if("function"==typeof a.hasOwnProperty)for(d in a)a.hasOwnProperty(d)&&b.call(c,a[d],d,a);else for(d in a)Ad.call(a,d)&&b.call(c,a[d],d,a);return a}function g(a,b,c){for(var d=Object.keys(a).sort(),e=0;ee;++e){var g=b[e];if(v(g)||A(g))for(var h=Object.keys(g),i=0,l=h.length;l>i;i++){var m=h[i],n=g[m];c&&v(n)?z(n)?a[m]=new Date(n.valueOf()):B(n)?a[m]=new RegExp(n):n.nodeName?a[m]=n.cloneNode(!0):K(n)?a[m]=n.clone():(v(a[m])||(a[m]=Rd(n)?[]:{}),k(a[m],[n],!0)):a[m]=n}}return j(a,d),a}function l(a){return k(a,Id.call(arguments,1),!1)}function m(a){return k(a,Id.call(arguments,1),!0)}function n(a){return parseInt(a,10)}function o(a,b){return l(Object.create(a),b)}function p(){}function q(a){return a}function r(a){return function(){return a}}function s(a){return A(a.toString)&&a.toString!==Ld}function t(a){return"undefined"==typeof a}function u(a){return"undefined"!=typeof a}function v(a){return null!==a&&"object"==typeof a}function w(a){return null!==a&&"object"==typeof a&&!Md(a)}function x(a){return"string"==typeof a}function y(a){return"number"==typeof a}function z(a){return"[object Date]"===Ld.call(a)}function A(a){return"function"==typeof a}function B(a){return"[object RegExp]"===Ld.call(a)}function C(a){return a&&a.window===a}function D(a){return a&&a.$evalAsync&&a.$watch}function E(a){return"[object File]"===Ld.call(a)}function F(a){return"[object FormData]"===Ld.call(a)}function G(a){return"[object Blob]"===Ld.call(a)}function H(a){return"boolean"==typeof a}function I(a){return a&&A(a.then)}function J(a){return a&&y(a.length)&&Sd.test(Ld.call(a))}function K(a){return!(!a||!(a.nodeName||a.prop&&a.attr&&a.find))}function L(a){var b,c={},d=a.split(",");for(b=0;b=0&&a.splice(c,1),c}function O(a,b){function c(a,b){var c,e=b.$$hashKey;if(Rd(a))for(var f=0,g=a.length;g>f;f++)b.push(d(a[f]));else if(w(a))for(c in a)b[c]=d(a[c]);else if(a&&"function"==typeof a.hasOwnProperty)for(c in a)a.hasOwnProperty(c)&&(b[c]=d(a[c]));else for(c in a)Ad.call(a,c)&&(b[c]=d(a[c]));return j(b,e),b}function d(a){if(!v(a))return a;var b=e.indexOf(a);if(-1!==b)return g[b];if(C(a)||D(a))throw Nd("cpws","Can't copy! Making copies of Window or Scope instances is not supported.");var d,f=!1;return Rd(a)?(d=[],f=!0):J(a)?d=new a.constructor(a):z(a)?d=new Date(a.getTime()):B(a)?(d=new RegExp(a.source,a.toString().match(/[^\/]*$/)[0]),d.lastIndex=a.lastIndex):G(a)?d=new a.constructor([a],{type:a.type}):A(a.cloneNode)?d=a.cloneNode(!0):(d=Object.create(Md(a)),f=!0),e.push(a),g.push(d),f?c(a,d):d}var e=[],g=[];if(b){if(J(b))throw Nd("cpta","Can't copy! TypedArray destination cannot be mutated.");if(a===b)throw Nd("cpi","Can't copy! Source and destination are identical.");return Rd(b)?b.length=0:f(b,function(a,c){"$$hashKey"!==c&&delete b[c]}),e.push(a),g.push(b),c(a,b)}return d(a)}function P(a,b){if(Rd(a)){b=b||[];for(var c=0,d=a.length;d>c;c++)b[c]=a[c]}else if(v(a)){b=b||{};for(var e in a)("$"!==e.charAt(0)||"$"!==e.charAt(1))&&(b[e]=a[e])}return b||a}function Q(a,b){if(a===b)return!0;if(null===a||null===b)return!1;if(a!==a&&b!==b)return!0;var c,d,e,f=typeof a,g=typeof b;if(f==g&&"object"==f){if(!Rd(a)){if(z(a))return z(b)?Q(a.getTime(),b.getTime()):!1;if(B(a))return B(b)?a.toString()==b.toString():!1;if(D(a)||D(b)||C(a)||C(b)||Rd(b)||z(b)||B(b))return!1;e=qa();for(d in a)if("$"!==d.charAt(0)&&!A(a[d])){if(!Q(a[d],b[d]))return!1;e[d]=!0}for(d in b)if(!(d in e)&&"$"!==d.charAt(0)&&u(b[d])&&!A(b[d]))return!1;return!0}if(!Rd(b))return!1;if((c=a.length)==b.length){for(d=0;c>d;d++)if(!Q(a[d],b[d]))return!1;return!0}}return!1}function R(a,b,c){return a.concat(Id.call(b,c))}function S(a,b){return Id.call(a,b||0)}function T(a,b){var c=arguments.length>2?S(arguments,2):[];return!A(b)||b instanceof RegExp?b:c.length?function(){return arguments.length?b.apply(a,R(c,arguments,0)):b.apply(a,c)}:function(){return arguments.length?b.apply(a,arguments):b.call(a)}}function U(a,d){var e=d;return"string"==typeof a&&"$"===a.charAt(0)&&"$"===a.charAt(1)?e=c:C(d)?e="$WINDOW":d&&b===d?e="$DOCUMENT":D(d)&&(e="$SCOPE"),e}function V(a,b){return t(a)?c:(y(b)||(b=b?2:null),JSON.stringify(a,U,b))}function W(a){return x(a)?JSON.parse(a):a}function X(a,b){a=a.replace(Xd,"");var c=Date.parse("Jan 01, 1970 00:00:00 "+a)/6e4;return isNaN(c)?b:c}function Y(a,b){return a=new Date(a.getTime()),a.setMinutes(a.getMinutes()+b),a}function Z(a,b,c){c=c?-1:1;var d=a.getTimezoneOffset(),e=X(b,d);return Y(a,c*(e-d))}function $(a){a=Fd(a).clone();try{a.empty()}catch(b){}var c=Fd("
").append(a).html();try{return a[0].nodeType===be?zd(c):c.match(/^(<[^>]+>)/)[1].replace(/^<([\w\-]+)/,function(a,b){return"<"+zd(b)})}catch(b){return zd(c)}}function _(a){try{return decodeURIComponent(a)}catch(b){}}function aa(a){var b={};return f((a||"").split("&"),function(a){var c,d,e;a&&(d=a=a.replace(/\+/g,"%20"),c=a.indexOf("="),-1!==c&&(d=a.substring(0,c),e=a.substring(c+1)),d=_(d),u(d)&&(e=u(e)?_(e):!0,Ad.call(b,d)?Rd(b[d])?b[d].push(e):b[d]=[b[d],e]:b[d]=e))}),b}function ba(a){var b=[];return f(a,function(a,c){Rd(a)?f(a,function(a){b.push(da(c,!0)+(a===!0?"":"="+da(a,!0)))}):b.push(da(c,!0)+(a===!0?"":"="+da(a,!0)))}),b.length?b.join("&"):""}function ca(a){return da(a,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function da(a,b){return encodeURIComponent(a).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%20/g,b?"%20":"+")}function ea(a,b){var c,d,e=Yd.length;for(d=0;e>d;++d)if(c=Yd[d]+b,x(c=a.getAttribute(c)))return c;return null}function fa(a,b){var c,d,e={};f(Yd,function(b){var e=b+"app";!c&&a.hasAttribute&&a.hasAttribute(e)&&(c=a,d=a.getAttribute(e))}),f(Yd,function(b){var e,f=b+"app";!c&&(e=a.querySelector("["+f.replace(":","\\:")+"]"))&&(c=e,d=e.getAttribute(f))}),c&&(e.strictDi=null!==ea(c,"strict-di"),b(c,d?[d]:[],e))}function ga(c,d,e){v(e)||(e={});var g={strictDi:!1};e=l(g,e);var h=function(){if(c=Fd(c),c.injector()){var a=c[0]===b?"document":$(c);throw Nd("btstrpd","App already bootstrapped with this element '{0}'",a.replace(//,">"))}d=d||[],d.unshift(["$provide",function(a){a.value("$rootElement",c)}]),e.debugInfoEnabled&&d.push(["$compileProvider",function(a){a.debugInfoEnabled(!0)}]),d.unshift("ng");var f=bb(d,e.strictDi);return f.invoke(["$rootScope","$rootElement","$compile","$injector",function(a,b,c,d){a.$apply(function(){b.data("$injector",d),c(b)(a)})}]),f},i=/^NG_ENABLE_DEBUG_INFO!/,j=/^NG_DEFER_BOOTSTRAP!/;return a&&i.test(a.name)&&(e.debugInfoEnabled=!0,a.name=a.name.replace(i,"")),a&&!j.test(a.name)?h():(a.name=a.name.replace(j,""),Od.resumeBootstrap=function(a){return f(a,function(a){d.push(a)}),h()},void(A(Od.resumeDeferredBootstrap)&&Od.resumeDeferredBootstrap()))}function ha(){a.name="NG_ENABLE_DEBUG_INFO!"+a.name,a.location.reload()}function ia(a){var b=Od.element(a).injector();if(!b)throw Nd("test","no injector found for element argument to getTestability");return b.get("$$testability")}function ja(a,b){return b=b||"_",a.replace(Zd,function(a,c){return(c?b:"")+a.toLowerCase()})}function ka(){var b;if(!$d){var d=Wd();Gd=t(d)?a.jQuery:d?a[d]:c,Gd&&Gd.fn.on?(Fd=Gd,l(Gd.fn,{scope:ue.scope,isolateScope:ue.isolateScope,controller:ue.controller,injector:ue.injector,inheritedData:ue.inheritedData}),b=Gd.cleanData,Gd.cleanData=function(a){var c;if(Qd)Qd=!1;else for(var d,e=0;null!=(d=a[e]);e++)c=Gd._data(d,"events"),c&&c.$destroy&&Gd(d).triggerHandler("$destroy");b(a)}):Fd=Da,Od.element=Fd,$d=!0}}function la(a,b,c){if(!a)throw Nd("areq","Argument '{0}' is {1}",b||"?",c||"required");return a}function ma(a,b,c){return c&&Rd(a)&&(a=a[a.length-1]),la(A(a),b,"not a function, got "+(a&&"object"==typeof a?a.constructor.name||"Object":typeof a)),a}function na(a,b){if("hasOwnProperty"===a)throw Nd("badname","hasOwnProperty is not a valid {0} name",b)}function oa(a,b,c){if(!b)return a;for(var d,e=b.split("."),f=a,g=e.length,h=0;g>h;h++)d=e[h],a&&(a=(f=a)[d]);return!c&&A(a)?T(f,a):a}function pa(a){for(var b,c=a[0],d=a[a.length-1],e=1;c!==d&&(c=c.nextSibling);e++)(b||a[e]!==c)&&(b||(b=Fd(Id.call(a,0,e))),b.push(c));return b||a}function qa(){return Object.create(null)}function ra(a){function b(a,b,c){return a[b]||(a[b]=c())}var c=d("$injector"),e=d("ng"),f=b(a,"angular",Object);return f.$$minErr=f.$$minErr||d,b(f,"module",function(){var a={};return function(d,f,g){var h=function(a,b){if("hasOwnProperty"===a)throw e("badname","hasOwnProperty is not a valid {0} name",b)};return h(d,"module"),f&&a.hasOwnProperty(d)&&(a[d]=null),b(a,d,function(){function a(a,b,c,d){return d||(d=e),function(){return d[c||"push"]([a,b,arguments]),k}}function b(a,b){return function(c,f){return f&&A(f)&&(f.$$moduleName=d),e.push([a,b,arguments]),k}}if(!f)throw c("nomod","Module '{0}' is not available! You either misspelled the module name or forgot to load it. If registering a module ensure that you specify the dependencies as the second argument.",d);var e=[],h=[],i=[],j=a("$injector","invoke","push",h),k={_invokeQueue:e,_configBlocks:h,_runBlocks:i,requires:f,name:d,provider:b("$provide","provider"),factory:b("$provide","factory"),service:b("$provide","service"),value:a("$provide","value"),constant:a("$provide","constant","unshift"),decorator:b("$provide","decorator"),animation:b("$animateProvider","register"),filter:b("$filterProvider","register"),controller:b("$controllerProvider","register"),directive:b("$compileProvider","directive"),config:j,run:function(a){return i.push(a),this}};return g&&j(g),k})}})}function sa(a){var b=[];return JSON.stringify(a,function(a,c){if(c=U(a,c),v(c)){if(b.indexOf(c)>=0)return"...";b.push(c)}return c})}function ta(a){return"function"==typeof a?a.toString().replace(/ \{[\s\S]*$/,""):t(a)?"undefined":"string"!=typeof a?sa(a):a}function ua(b){l(b,{bootstrap:ga,copy:O,extend:l,merge:m,equals:Q,element:Fd,forEach:f,injector:bb,noop:p,bind:T,toJson:V,fromJson:W,identity:q,isUndefined:t,isDefined:u,isString:x,isFunction:A,isObject:v,isNumber:y,isElement:K,isArray:Rd,version:fe,isDate:z,lowercase:zd,uppercase:Bd,callbacks:{counter:0},getTestability:ia,$$minErr:d,$$csp:Vd,reloadWithDebugInfo:ha}),(Hd=ra(a))("ng",["ngLocale"],["$provide",function(a){a.provider({$$sanitizeUri:tc}),a.provider("$compile",lb).directive({a:zf,input:Sf,textarea:Sf,form:Ef,script:Kg,select:Ng,style:Pg,option:Og,ngBind:Vf,ngBindHtml:Xf,ngBindTemplate:Wf,ngClass:Zf,ngClassEven:_f,ngClassOdd:$f,ngCloak:ag,ngController:bg,ngForm:Ff,ngHide:Eg,ngIf:eg,ngInclude:fg,ngInit:hg,ngNonBindable:vg,ngPluralize:zg,ngRepeat:Ag,ngShow:Dg,ngStyle:Fg,ngSwitch:Gg,ngSwitchWhen:Hg,ngSwitchDefault:Ig,ngOptions:yg,ngTransclude:Jg,ngModel:sg,ngList:ig,ngChange:Yf,pattern:Rg,ngPattern:Rg,required:Qg,ngRequired:Qg,minlength:Tg,ngMinlength:Tg,maxlength:Sg,ngMaxlength:Sg,ngValue:Uf,ngModelOptions:ug}).directive({ngInclude:gg}).directive(Af).directive(cg),a.provider({$anchorScroll:cb,$animate:Je,$animateCss:Me,$$animateJs:He,$$animateQueue:Ie,$$AnimateRunner:Le,$$animateAsyncRun:Ke,$browser:ib,$cacheFactory:jb,$controller:qb,$document:rb,$exceptionHandler:sb,$filter:Hc,$$forceReflow:Re,$interpolate:Gb,$interval:Hb,$http:Cb,$httpParamSerializer:ub,$httpParamSerializerJQLike:vb,$httpBackend:Eb,$xhrFactory:Db,$location:Vb,$log:Wb,$parse:nc,$rootScope:sc,$q:oc,$$q:pc,$sce:xc,$sceDelegate:wc,$sniffer:yc,$templateCache:kb,$templateRequest:zc,$$testability:Ac,$timeout:Bc,$window:Ec,$$rAF:rc,$$jqLite:Ya,$$HashMap:ye,$$cookieReader:Gc})}])}function va(){return++he}function wa(a){return a.replace(ke,function(a,b,c,d){return d?c.toUpperCase():c}).replace(le,"Moz$1")}function xa(a){return!pe.test(a)}function ya(a){var b=a.nodeType;return b===_d||!b||b===de}function za(a){for(var b in ge[a.ng339])return!0;return!1}function Aa(a,b){var c,d,e,g,h=b.createDocumentFragment(),i=[];if(xa(a))i.push(b.createTextNode(a));else{for(c=c||h.appendChild(b.createElement("div")),d=(qe.exec(a)||["",""])[1].toLowerCase(),e=se[d]||se._default,c.innerHTML=e[1]+a.replace(re,"<$1>")+e[2],g=e[0];g--;)c=c.lastChild;i=R(i,c.childNodes),c=h.firstChild,c.textContent=""}return h.textContent="",h.innerHTML="",f(i,function(a){h.appendChild(a)}),h}function Ba(a,c){c=c||b;var d;return(d=oe.exec(a))?[c.createElement(d[1])]:(d=Aa(a,c))?d.childNodes:[]}function Ca(a,b){var c=a.parentNode;c&&c.replaceChild(b,a),b.appendChild(a)}function Da(a){if(a instanceof Da)return a;var b;if(x(a)&&(a=Td(a),b=!0),!(this instanceof Da)){if(b&&"<"!=a.charAt(0))throw ne("nosel","Looking up elements via selectors is not supported by jqLite! See: http://docs.angularjs.org/api/angular.element");return new Da(a)}b?Na(this,Ba(a)):Na(this,a)}function Ea(a){return a.cloneNode(!0)}function Fa(a,b){if(b||Ha(a),a.querySelectorAll)for(var c=a.querySelectorAll("*"),d=0,e=c.length;e>d;d++)Ha(c[d])}function Ga(a,b,c,d){if(u(d))throw ne("offargs","jqLite#off() does not support the `selector` argument");var e=Ia(a),g=e&&e.events,h=e&&e.handle;if(h)if(b){var i=function(b){var d=g[b];u(c)&&N(d||[],c),u(c)&&d&&d.length>0||(je(a,b,h),delete g[b])};f(b.split(" "),function(a){i(a),me[a]&&i(me[a])})}else for(b in g)"$destroy"!==b&&je(a,b,h),delete g[b]}function Ha(a,b){var d=a.ng339,e=d&&ge[d];if(e){if(b)return void delete e.data[b];e.handle&&(e.events.$destroy&&e.handle({},"$destroy"),Ga(a)),delete ge[d],a.ng339=c}}function Ia(a,b){var d=a.ng339,e=d&&ge[d];return b&&!e&&(a.ng339=d=va(),e=ge[d]={events:{},data:{},handle:c}),e}function Ja(a,b,c){if(ya(a)){var d=u(c),e=!d&&b&&!v(b),f=!b,g=Ia(a,!e),h=g&&g.data;if(d)h[b]=c;else{if(f)return h;if(e)return h&&h[b];l(h,b)}}}function Ka(a,b){return a.getAttribute?(" "+(a.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").indexOf(" "+b+" ")>-1:!1}function La(a,b){b&&a.setAttribute&&f(b.split(" "),function(b){a.setAttribute("class",Td((" "+(a.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").replace(" "+Td(b)+" "," ")))})}function Ma(a,b){if(b&&a.setAttribute){var c=(" "+(a.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ");f(b.split(" "),function(a){a=Td(a),-1===c.indexOf(" "+a+" ")&&(c+=a+" ")}),a.setAttribute("class",Td(c))}}function Na(a,b){if(b)if(b.nodeType)a[a.length++]=b;else{var c=b.length;if("number"==typeof c&&b.window!==b){if(c)for(var d=0;c>d;d++)a[a.length++]=b[d]}else a[a.length++]=b}}function Oa(a,b){return Pa(a,"$"+(b||"ngController")+"Controller")}function Pa(a,b,c){a.nodeType==de&&(a=a.documentElement);for(var d=Rd(b)?b:[b];a;){for(var e=0,f=d.length;f>e;e++)if(u(c=Fd.data(a,d[e])))return c;a=a.parentNode||a.nodeType===ee&&a.host}}function Qa(a){for(Fa(a,!0);a.firstChild;)a.removeChild(a.firstChild)}function Ra(a,b){b||Fa(a);var c=a.parentNode;c&&c.removeChild(a)}function Sa(b,c){c=c||a,"complete"===c.document.readyState?c.setTimeout(b):Fd(c).on("load",b)}function Ta(a,b){var c=ve[b.toLowerCase()];return c&&we[M(a)]&&c}function Ua(a){return xe[a]}function Va(a,b){var c=function(c,d){c.isDefaultPrevented=function(){return c.defaultPrevented};var e=b[d||c.type],f=e?e.length:0;if(f){if(t(c.immediatePropagationStopped)){var g=c.stopImmediatePropagation;c.stopImmediatePropagation=function(){c.immediatePropagationStopped=!0,c.stopPropagation&&c.stopPropagation(),g&&g.call(c)}}c.isImmediatePropagationStopped=function(){return c.immediatePropagationStopped===!0};var h=e.specialHandlerWrapper||Wa;f>1&&(e=P(e));for(var i=0;f>i;i++)c.isImmediatePropagationStopped()||h(a,c,e[i])}};return c.elem=a,c}function Wa(a,b,c){c.call(a,b)}function Xa(a,b,c){var d=b.relatedTarget;(!d||d!==a&&!te.call(a,d))&&c.call(a,b)}function Ya(){this.$get=function(){return l(Da,{hasClass:function(a,b){return a.attr&&(a=a[0]),Ka(a,b)},addClass:function(a,b){return a.attr&&(a=a[0]),Ma(a,b)},removeClass:function(a,b){return a.attr&&(a=a[0]),La(a,b)}})}}function Za(a,b){var c=a&&a.$$hashKey;if(c)return"function"==typeof c&&(c=a.$$hashKey()),c;var d=typeof a;return c="function"==d||"object"==d&&null!==a?a.$$hashKey=d+":"+(b||i)():d+":"+a}function $a(a,b){if(b){var c=0;this.nextUid=function(){return++c}}f(a,this.put,this)}function _a(a){var b=a.toString().replace(Ce,""),c=b.match(ze);return c?"function("+(c[1]||"").replace(/[\s\r\n]+/," ")+")":"fn"}function ab(a,b,c){var d,e,g,h;if("function"==typeof a){if(!(d=a.$inject)){if(d=[],a.length){if(b)throw x(c)&&c||(c=a.name||_a(a)),De("strictdi","{0} is not using explicit annotation and cannot be invoked in strict mode",c);e=a.toString().replace(Ce,""),g=e.match(ze),f(g[1].split(Ae),function(a){a.replace(Be,function(a,b,c){d.push(c)})})}a.$inject=d}}else Rd(a)?(h=a.length-1,ma(a[h],"fn"),d=a.slice(0,h)):ma(a,"fn",!0);return d}function bb(a,b){function d(a){return function(b,c){return v(b)?void f(b,h(a)):a(b,c)}}function e(a,b){if(na(a,"service"),(A(b)||Rd(b))&&(b=y.instantiate(b)),!b.$get)throw De("pget","Provider '{0}' must define $get factory method.",a);return w[a+q]=b}function g(a,b){return function(){var c=B.invoke(b,this);if(t(c))throw De("undef","Provider '{0}' must return a value from $get factory method.",a);return c}}function i(a,b,c){return e(a,{$get:c!==!1?g(a,b):b})}function j(a,b){return i(a,["$injector",function(a){return a.instantiate(b)}])}function k(a,b){return i(a,r(b),!1)}function l(a,b){na(a,"constant"),w[a]=b,z[a]=b}function m(a,b){var c=y.get(a+q),d=c.$get;c.$get=function(){var a=B.invoke(d,c);return B.invoke(b,null,{$delegate:a})}}function n(a){la(t(a)||Rd(a),"modulesToLoad","not an array");var b,c=[];return f(a,function(a){function d(a){var b,c;for(b=0,c=a.length;c>b;b++){var d=a[b],e=y.get(d[0]);e[d[1]].apply(e,d[2])}}if(!u.get(a)){u.put(a,!0);try{x(a)?(b=Hd(a),c=c.concat(n(b.requires)).concat(b._runBlocks),d(b._invokeQueue),d(b._configBlocks)):A(a)?c.push(y.invoke(a)):Rd(a)?c.push(y.invoke(a)):ma(a,"module")}catch(e){throw Rd(a)&&(a=a[a.length-1]),e.message&&e.stack&&-1==e.stack.indexOf(e.message)&&(e=e.message+"\n"+e.stack),De("modulerr","Failed to instantiate module {0} due to:\n{1}",a,e.stack||e.message||e)}}}),c}function o(a,c){function d(b,d){if(a.hasOwnProperty(b)){if(a[b]===p)throw De("cdep","Circular dependency found: {0}",b+" <- "+s.join(" <- "));return a[b]}try{return s.unshift(b),a[b]=p,a[b]=c(b,d)}catch(e){throw a[b]===p&&delete a[b],e}finally{s.shift()}}function e(a,c,e,f){"string"==typeof e&&(f=e,e=null);var g,h,i,j=[],k=bb.$$annotate(a,b,f);for(h=0,g=k.length;g>h;h++){if(i=k[h],"string"!=typeof i)throw De("itkn","Incorrect injection token! Expected service name as string, got {0}",i);j.push(e&&e.hasOwnProperty(i)?e[i]:d(i,f))}return Rd(a)&&(a=a[g]),a.apply(c,j)}function f(a,b,c){var d=Object.create((Rd(a)?a[a.length-1]:a).prototype||null),f=e(a,d,b,c);return v(f)||A(f)?f:d}return{invoke:e,instantiate:f,get:d,annotate:bb.$$annotate,has:function(b){return w.hasOwnProperty(b+q)||a.hasOwnProperty(b)}}}b=b===!0;var p={},q="Provider",s=[],u=new $a([],!0),w={$provide:{provider:d(e),factory:d(i),service:d(j),value:d(k),constant:d(l),decorator:m}},y=w.$injector=o(w,function(a,b){throw Od.isString(b)&&s.push(b),De("unpr","Unknown provider: {0}",s.join(" <- "))}),z={},B=z.$injector=o(z,function(a,b){var d=y.get(a+q,b);return B.invoke(d.$get,d,c,a)});return f(n(a),function(a){a&&B.invoke(a)}),B}function cb(){var a=!0;this.disableAutoScrolling=function(){a=!1},this.$get=["$window","$location","$rootScope",function(b,c,d){function e(a){var b=null;return Array.prototype.some.call(a,function(a){return"a"===M(a)?(b=a,!0):void 0}),b}function f(){var a=h.yOffset;if(A(a))a=a();else if(K(a)){var c=a[0],d=b.getComputedStyle(c);a="fixed"!==d.position?0:c.getBoundingClientRect().bottom}else y(a)||(a=0);return a}function g(a){if(a){a.scrollIntoView();var c=f();if(c){var d=a.getBoundingClientRect().top;b.scrollBy(0,d-c)}}else b.scrollTo(0,0)}function h(a){a=x(a)?a:c.hash();var b;a?(b=i.getElementById(a))?g(b):(b=e(i.getElementsByName(a)))?g(b):"top"===a&&g(null):g(null)}var i=b.document;return a&&d.$watch(function(){return c.hash()},function(a,b){(a!==b||""!==a)&&Sa(function(){d.$evalAsync(h)})}),h}]}function db(a,b){return a||b?a?b?(Rd(a)&&(a=a.join(" ")),Rd(b)&&(b=b.join(" ")),a+" "+b):a:b:""}function eb(a){for(var b=0;bj&&this.remove(n.key),b}},get:function(a){if(jh;h++){var j=a[h];j.nodeType===be&&j.nodeValue.match(g)&&Ca(j,a[h]=b.createElement("span"))}var k=K(a,c,a,d,e,f);I.$$addScopeClass(a);var l=null;return function(b,c,d){la(b,"scope"),f&&f.needsNewScope&&(b=b.$parent.$new()),d=d||{};var e=d.parentBoundTranscludeFn,g=d.transcludeControllers,h=d.futureParentElement;e&&e.$$boundTransclude&&(e=e.$$boundTransclude),l||(l=J(h));var i;if(i="html"!==l?Fd(ba(l,Fd("
").append(a).html())):c?ue.clone.call(a):a,g)for(var j in g)i.data("$"+j+"Controller",g[j].instance);return I.$$addScopeInfo(i,b),c&&c(i,b),k&&k(b,i,i,e),i}}function J(a){var b=a&&a[0];return b&&"foreignobject"!==M(b)&&b.toString().match(/SVG/)?"svg":"html"}function K(a,b,d,e,f,g){function h(a,d,e,f){var g,h,i,j,k,l,m,n,q;if(o){var r=d.length;for(q=new Array(r),k=0;kk;)i=q[p[k++]],g=p[k++],h=p[k++],g?(g.scope?(j=a.$new(),I.$$addScopeInfo(Fd(i),j)):j=a,n=g.transcludeOnThisElement?L(a,g.transclude,f):!g.templateOnThisElement&&f?f:!f&&b?L(a,b):null,g(h,j,i,e,n)):h&&h(a,i.childNodes,c,f)}for(var i,j,k,l,m,n,o,p=[],q=0;qt;t++){var w=!1,y=!1;k=s[t],l=k.name,q=Td(k.value),p=mb(l),(r=oa.test(p))&&(l=l.replace(Oe,"").substr(8).replace(/_(.)/g,function(a,b){return b.toUpperCase()}));var z=p.match(pa);z&&W(z[1])&&(w=l,y=l.substr(0,l.length-5)+"end",l=l.substr(0,l.length-6)),o=mb(l.toLowerCase()),j[o]=l,(r||!c.hasOwnProperty(o))&&(c[o]=q,Ta(a,o)&&(c[o]=!0)),da(a,b,q,o,r),V(b,o,"A",d,e,w,y)}if("input"===g&&"hidden"===a.getAttribute("type")&&a.setAttribute("autocomplete","off"),h=a.className,v(h)&&(h=h.animVal),x(h)&&""!==h)for(;f=n.exec(h);)o=mb(f[2]),V(b,o,"C",d,e)&&(c[o]=Td(f[3])),h=h.substr(f.index+f[0].length);break;case be:if(11===Ed)for(;a.parentNode&&a.nextSibling&&a.nextSibling.nodeType===be;)a.nodeValue=a.nodeValue+a.nextSibling.nodeValue,a.parentNode.removeChild(a.nextSibling);aa(b,a.nodeValue);break;case ce:try{f=m.exec(a.nodeValue),f&&(o=mb(f[1]),V(b,o,"M",d,e)&&(c[o]=Td(f[2])))}catch(A){}}return b.sort(Z),b}function P(a,b,c){var d=[],e=0;if(b&&a.hasAttribute&&a.hasAttribute(b)){do{if(!a)throw Ne("uterdir","Unterminated attribute, found '{0}' but no matching '{1}' found.",b,c);a.nodeType==_d&&(a.hasAttribute(b)&&e++,a.hasAttribute(c)&&e--),d.push(a),a=a.nextSibling}while(e>0)}else d.push(a);return Fd(d)}function R(a,b,c){return function(d,e,f,g,h){return e=P(e[0],b,c),a(d,e,f,g,h)}}function T(a,d,f,g,h,i,j,k,l){function m(a,b,c,d){a&&(c&&(a=R(a,c,d)),a.require=q.require,a.directiveName=s,(E===q||q.$$isolateScope)&&(a=fa(a,{isolateScope:!0})),j.push(a)),b&&(c&&(b=R(b,c,d)),b.require=q.require,b.directiveName=s,(E===q||q.$$isolateScope)&&(b=fa(b,{isolateScope:!0})),k.push(b))}function n(a,b,c,d){var e;if(x(b)){var f=b.match(w),g=b.substring(f[0].length),h=f[1]||f[3],i="?"===f[2];if("^^"===h?c=c.parent():(e=d&&d[g],e=e&&e.instance),!e){var j="$"+g+"Controller";e=h?c.inheritedData(j):c.data(j)}if(!e&&!i)throw Ne("ctreq","Controller '{0}', required by directive '{1}', can't be found!",g,a)}else if(Rd(b)){e=[];for(var k=0,l=b.length;l>k;k++)e[k]=n(a,b[k],c,d)}return e||null}function o(a,b,c,d,e,f){var g=qa();for(var h in d){var i=d[h],j={$scope:i===E||i.$$isolateScope?e:f,$element:a,$attrs:b,$transclude:c},k=i.controller;"@"==k&&(k=b[i.name]);var l=r(k,j,!0,i.controllerAs);g[i.name]=l,a.data("$"+i.name+"Controller",l.instance)}return g}function p(a,b,e,g,h){function i(a,b,d){var e;return D(a)||(d=b,b=a,a=c),K&&(e=q),d||(d=K?s.parent():s),h(a,b,e,d,G)}var l,m,p,q,r,s,t,u,v;d===e?(t=f,s=f.$$element):(s=Fd(e),t=new ia(s,f)),p=b,E?m=b.$new(!0):B&&(p=b.$parent),h&&(r=i,r.$$boundTransclude=h),C&&(q=o(s,t,r,C,m,b)),E&&(I.$$addScopeInfo(s,m,!0,!(F&&(F===E||F===E.$$originalDirective))),I.$$addScopeClass(s,!0),m.$$isolateBindings=E.$$isolateBindings,u=ha(b,t,m,m.$$isolateBindings,E),u&&m.$on("$destroy",u));for(var w in q){var x=C[w],y=q[w],z=x.$$bindings.bindToController;y.identifier&&z&&(v=ha(p,t,y.instance,z,x));var A=y();A!==y.instance&&(y.instance=A,s.data("$"+x.name+"Controller",A),v&&v(),v=ha(p,t,y.instance,z,x))}for(Q=0,T=j.length;T>Q;Q++)l=j[Q],ga(l,l.isolateScope?m:b,s,t,l.require&&n(l.directiveName,l.require,s,q),r);var G=b;for(E&&(E.template||null===E.templateUrl)&&(G=m),a&&a(G,e.childNodes,c,h),Q=k.length-1;Q>=0;Q--)l=k[Q],ga(l,l.isolateScope?m:b,s,t,l.require&&n(l.directiveName,l.require,s,q),r)}l=l||{};for(var q,s,t,u,y,z=-Number.MAX_VALUE,B=l.newScopeDirective,C=l.controllerDirectives,E=l.newIsolateScopeDirective,F=l.templateDirective,G=l.nonTlbTranscludeDirective,H=!1,J=!1,K=l.hasElementTranscludeDirective,L=f.$$element=Fd(d),M=i,N=g,Q=0,T=a.length;T>Q;Q++){ q=a[Q];var V=q.$$start,W=q.$$end;if(V&&(L=P(d,V,W)),t=c,z>q.priority)break;if((y=q.scope)&&(q.templateUrl||(v(y)?(_("new/isolated scope",E||B,q,L),E=q):_("new/isolated scope",E,q,L)),B=B||q),s=q.name,!q.templateUrl&&q.controller&&(y=q.controller,C=C||qa(),_("'"+s+"' controller",C[s],q,L),C[s]=q),(y=q.transclude)&&(H=!0,q.$$tlb||(_("transclusion",G,q,L),G=q),"element"==y?(K=!0,z=q.priority,t=L,L=f.$$element=Fd(b.createComment(" "+s+": "+f[s]+" ")),d=L[0],ea(h,S(t),d),N=I(t,g,z,M&&M.name,{nonTlbTranscludeDirective:G})):(t=Fd(Ea(d)).contents(),L.empty(),N=I(t,g,c,c,{needsNewScope:q.$$isolateScope||q.$$newScope}))),q.template)if(J=!0,_("template",F,q,L),F=q,y=A(q.template)?q.template(L,f):q.template,y=na(y),q.replace){if(M=q,t=xa(y)?[]:ob(ba(q.templateNamespace,Td(y))),d=t[0],1!=t.length||d.nodeType!==_d)throw Ne("tplrt","Template for directive '{0}' must have exactly one root element. {1}",s,"");ea(h,L,d);var Z={$attr:{}},aa=O(d,[],Z),ca=a.splice(Q+1,a.length-(Q+1));(E||B)&&U(aa,E,B),a=a.concat(aa).concat(ca),X(f,Z),T=a.length}else L.html(y);if(q.templateUrl)J=!0,_("template",F,q,L),F=q,q.replace&&(M=q),p=Y(a.splice(Q,a.length-Q),L,f,h,H&&N,j,k,{controllerDirectives:C,newScopeDirective:B!==q&&B,newIsolateScopeDirective:E,templateDirective:F,nonTlbTranscludeDirective:G}),T=a.length;else if(q.compile)try{u=q.compile(L,f,N),A(u)?m(null,u,V,W):u&&m(u.pre,u.post,V,W)}catch(da){e(da,$(L))}q.terminal&&(p.terminal=!0,z=Math.max(z,q.priority))}return p.scope=B&&B.scope===!0,p.transcludeOnThisElement=H,p.templateOnThisElement=J,p.transclude=N,l.hasElementTranscludeDirective=K,p}function U(a,b,c){for(var d=0,e=a.length;e>d;d++)a[d]=o(a[d],{$$isolateScope:b,$$newScope:c})}function V(b,c,d,f,h,i,l){if(c===h)return null;var m=null;if(j.hasOwnProperty(c))for(var n,p=a.get(c+k),q=0,r=p.length;r>q;q++)try{if(n=p[q],(t(f)||f>n.priority)&&-1!=n.restrict.indexOf(d)){if(i&&(n=o(n,{$$start:i,$$end:l})),!n.$$bindings){var s=n.$$bindings=g(n,n.name);v(s.isolateScope)&&(n.$$isolateBindings=s.isolateScope)}b.push(n),m=n}}catch(u){e(u)}return m}function W(b){if(j.hasOwnProperty(b))for(var c,d=a.get(b+k),e=0,f=d.length;f>e;e++)if(c=d[e],c.multiElement)return!0;return!1}function X(a,b){var c=b.$attr,d=a.$attr,e=a.$$element;f(a,function(d,e){"$"!=e.charAt(0)&&(b[e]&&b[e]!==d&&(d+=("style"===e?";":" ")+b[e]),a.$set(e,d,!0,c[e]))}),f(b,function(b,f){"class"==f?(G(e,b),a["class"]=(a["class"]?a["class"]+" ":"")+b):"style"==f?(e.attr("style",e.attr("style")+";"+b),a.style=(a.style?a.style+";":"")+b):"$"==f.charAt(0)||a.hasOwnProperty(f)||(a[f]=b,d[f]=c[f])})}function Y(a,b,c,d,e,g,i,j){var k,l,m=[],n=b[0],p=a.shift(),q=o(p,{templateUrl:null,transclude:null,replace:null,$$originalDirective:p}),r=A(p.templateUrl)?p.templateUrl(b,c):p.templateUrl,s=p.templateNamespace;return b.empty(),h(r).then(function(h){var o,t,u,w;if(h=na(h),p.replace){if(u=xa(h)?[]:ob(ba(s,Td(h))),o=u[0],1!=u.length||o.nodeType!==_d)throw Ne("tplrt","Template for directive '{0}' must have exactly one root element. {1}",p.name,r);t={$attr:{}},ea(d,b,o);var x=O(o,[],t);v(p.scope)&&U(x,!0),a=x.concat(a),X(c,t)}else o=n,b.html(h);for(a.unshift(q),k=T(a,o,c,e,b,p,g,i,j),f(d,function(a,c){a==o&&(d[c]=b[0])}),l=K(b[0].childNodes,e);m.length;){var y=m.shift(),z=m.shift(),A=m.shift(),B=m.shift(),C=b[0];if(!y.$$destroyed){if(z!==n){var D=z.className;j.hasElementTranscludeDirective&&p.replace||(C=Ea(o)),ea(A,Fd(z),C),G(Fd(C),D)}w=k.transcludeOnThisElement?L(y,k.transclude,B):B,k(l,y,C,d,w)}}m=null}),function(a,b,c,d,e){var f=e;b.$$destroyed||(m?m.push(b,c,d,f):(k.transcludeOnThisElement&&(f=L(b,k.transclude,e)),k(l,b,c,d,f)))}}function Z(a,b){var c=b.priority-a.priority;return 0!==c?c:a.name!==b.name?a.name"+c+"",d.childNodes[0].childNodes;default:return c}}function ca(a,b){if("srcdoc"==b)return C.HTML;var c=M(a);return"xlinkHref"==b||"form"==c&&"action"==b||"img"!=c&&("src"==b||"ngSrc"==b)?C.RESOURCE_URL:void 0}function da(a,b,c,e,f){var g=ca(a,e);f=s[e]||f;var h=d(c,!0,g,f);if(h){if("multiple"===e&&"select"===M(a))throw Ne("selmulti","Binding to the 'multiple' attribute is not supported. Element: {0}",$(a));b.push({priority:100,compile:function(){return{pre:function(a,b,i){var j=i.$$observers||(i.$$observers=qa());if(y.test(e))throw Ne("nodomevents","Interpolations for HTML DOM event attributes are disallowed. Please use the ng- versions (such as ng-click instead of onclick) instead.");var k=i[e];k!==c&&(h=k&&d(k,!0,g,f),c=k),h&&(i[e]=h(a),(j[e]||(j[e]=[])).$$inter=!0,(i.$$observers&&i.$$observers[e].$$scope||a).$watch(h,function(a,b){"class"===e&&a!=b?i.$updateClass(a,b):i.$set(e,a)}))}}}})}}function ea(a,c,d){var e,f,g=c[0],h=c.length,i=g.parentNode;if(a)for(e=0,f=a.length;f>e;e++)if(a[e]==g){a[e++]=d;for(var j=e,k=j+h-1,l=a.length;l>j;j++,k++)l>k?a[j]=a[k]:delete a[j];a.length-=h-1,a.context===g&&(a.context=d);break}i&&i.replaceChild(d,g);var m=b.createDocumentFragment();m.appendChild(g),Fd.hasData(g)&&(Fd.data(d,Fd.data(g)),Gd?(Qd=!0,Gd.cleanData([g])):delete Fd.cache[g[Fd.expando]]);for(var n=1,o=c.length;o>n;n++){var p=c[n];Fd(p).remove(),m.appendChild(p),delete c[n]}c[0]=d,c.length=1}function fa(a,b){return l(function(){return a.apply(null,arguments)},a,b)}function ga(a,b,c,d,f,g){try{a(b,c,d,f,g)}catch(h){e(h,$(c))}}function ha(a,b,c,e,g){var h=[];return f(e,function(e,f){var j,k,l,m,n=e.attrName,o=e.optional,q=e.mode;switch(q){case"@":o||Ad.call(b,n)||(c[f]=b[n]=void 0),b.$observe(n,function(a){x(a)&&(c[f]=a)}),b.$$observers[n].$$scope=a,j=b[n],x(j)?c[f]=d(j)(a):H(j)&&(c[f]=j);break;case"=":if(!Ad.call(b,n)){if(o)break;b[n]=void 0}if(o&&!b[n])break;k=i(b[n]),m=k.literal?Q:function(a,b){return a===b||a!==a&&b!==b},l=k.assign||function(){throw j=c[f]=k(a),Ne("nonassign","Expression '{0}' in attribute '{1}' used with directive '{2}' is non-assignable!",b[n],n,g.name)},j=c[f]=k(a);var r=function(b){return m(b,c[f])||(m(b,j)?l(a,b=c[f]):c[f]=b),j=b};r.$stateful=!0;var s;s=e.collection?a.$watchCollection(b[n],r):a.$watch(i(b[n],r),null,k.literal),h.push(s);break;case"&":if(k=b.hasOwnProperty(n)?i(b[n]):p,k===p&&o)break;c[f]=function(b){return k(a,b)}}}),h.length&&function(){for(var a=0,b=h.length;b>a;++a)h[a]()}}var ia=function(a,b){if(b){var c,d,e,f=Object.keys(b);for(c=0,d=f.length;d>c;c++)e=f[c],this[e]=b[e]}else this.$attr={};this.$$element=a};ia.prototype={$normalize:mb,$addClass:function(a){a&&a.length>0&&E.addClass(this.$$element,a)},$removeClass:function(a){a&&a.length>0&&E.removeClass(this.$$element,a)},$updateClass:function(a,b){var c=nb(a,b);c&&c.length&&E.addClass(this.$$element,c);var d=nb(b,a);d&&d.length&&E.removeClass(this.$$element,d)},$set:function(a,b,c,d){var g,h=this.$$element[0],i=Ta(h,a),j=Ua(a),k=a;if(i?(this.$$element.prop(a,b),d=i):j&&(this[j]=b,k=j),this[a]=b,d?this.$attr[a]=d:(d=this.$attr[a],d||(this.$attr[a]=d=ja(a,"-"))),g=M(this.$$element),"a"===g&&"href"===a||"img"===g&&"src"===a)this[a]=b=F(b,"src"===a);else if("img"===g&&"srcset"===a&&u(b)){for(var l="",m=Td(b),n=/(\s+\d+x\s*,|\s+\d+w\s*,|\s+,|,\s+)/,o=/\s/.test(m)?n:/(,)/,p=m.split(o),q=Math.floor(p.length/2),r=0;q>r;r++){var s=2*r;l+=F(Td(p[s]),!0),l+=" "+Td(p[s+1])}var v=Td(p[2*r]).split(/\s/);l+=F(Td(v[0]),!0),2===v.length&&(l+=" "+Td(v[1])),this[a]=b=l}c!==!1&&(null===b||t(b)?this.$$element.removeAttr(d):this.$$element.attr(d,b));var w=this.$$observers;w&&f(w[k],function(a){try{a(b)}catch(c){e(c)}})},$observe:function(a,b){var c=this,d=c.$$observers||(c.$$observers=qa()),e=d[a]||(d[a]=[]);return e.push(b),z.$evalAsync(function(){e.$$inter||!c.hasOwnProperty(a)||t(c[a])||b(c[a])}),function(){N(e,b)}}};var ka=d.startSymbol(),ma=d.endSymbol(),na="{{"==ka&&"}}"==ma?q:function(a){return a.replace(/\{\{/g,ka).replace(/}}/g,ma)},oa=/^ngAttr[A-Z]/,pa=/^(.+)Start$/;return I.$$addBindingInfo=B?function(a,b){var c=a.data("$binding")||[];Rd(b)?c=c.concat(b):c.push(b),a.data("$binding",c)}:p,I.$$addBindingClass=B?function(a){G(a,"ng-binding")}:p,I.$$addScopeInfo=B?function(a,b,c,d){var e=c?d?"$isolateScopeNoTemplate":"$isolateScope":"$scope";a.data(e,b)}:p,I.$$addScopeClass=B?function(a,b){G(a,b?"ng-isolate-scope":"ng-scope")}:p,I}]}function mb(a){return wa(a.replace(Oe,""))}function nb(a,b){var c="",d=a.split(/\s+/),e=b.split(/\s+/);a:for(var f=0;f0?" ":"")+g}return c}function ob(a){a=Fd(a);var b=a.length;if(1>=b)return a;for(;b--;){var c=a[b];c.nodeType===ce&&Jd.call(a,b,1)}return a}function pb(a,b){if(b&&x(b))return b;if(x(a)){var c=Qe.exec(a);if(c)return c[3]}}function qb(){var a={},b=!1;this.register=function(b,c){na(b,"controller"),v(b)?l(a,b):a[b]=c},this.allowGlobals=function(){b=!0},this.$get=["$injector","$window",function(e,f){function g(a,b,c,e){if(!a||!v(a.$scope))throw d("$controller")("noscp","Cannot export controller '{0}' as '{1}'! No $scope object provided via `locals`.",e,b);a.$scope[b]=c}return function(d,h,i,j){var k,m,n,o;if(i=i===!0,j&&x(j)&&(o=j),x(d)){if(m=d.match(Qe),!m)throw Pe("ctrlfmt","Badly formed controller string '{0}'. Must match `__name__ as __id__` or `__name__`.",d);n=m[1],o=o||m[3],d=a.hasOwnProperty(n)?a[n]:oa(h.$scope,n,!0)||(b?oa(f,n,!0):c),ma(d,n,!0)}if(i){var p=(Rd(d)?d[d.length-1]:d).prototype;k=Object.create(p||null),o&&g(h,o,k,n||d.name);var q;return q=l(function(){var a=e.invoke(d,k,h,n);return a!==k&&(v(a)||A(a))&&(k=a,o&&g(h,o,k,n||d.name)),k},{instance:k,identifier:o})}return k=e.instantiate(d,h,n),o&&g(h,o,k,n||d.name),k}}]}function rb(){this.$get=["$window",function(a){return Fd(a.document)}]}function sb(){this.$get=["$log",function(a){return function(b,c){a.error.apply(a,arguments)}}]}function tb(a){return v(a)?z(a)?a.toISOString():V(a):a}function ub(){this.$get=function(){return function(a){if(!a)return"";var b=[];return g(a,function(a,c){null===a||t(a)||(Rd(a)?f(a,function(a,d){b.push(da(c)+"="+da(tb(a)))}):b.push(da(c)+"="+da(tb(a))))}),b.join("&")}}}function vb(){this.$get=function(){return function(a){function b(a,d,e){null===a||t(a)||(Rd(a)?f(a,function(a,c){b(a,d+"["+(v(a)?c:"")+"]")}):v(a)&&!z(a)?g(a,function(a,c){b(a,d+(e?"":"[")+c+(e?"":"]"))}):c.push(da(d)+"="+da(tb(a))))}if(!a)return"";var c=[];return b(a,"",!0),c.join("&")}}}function wb(a,b){if(x(a)){var c=a.replace(We,"").trim();if(c){var d=b("Content-Type");(d&&0===d.indexOf(Se)||xb(c))&&(a=W(c))}}return a}function xb(a){var b=a.match(Ue);return b&&Ve[b[0]].test(a)}function yb(a){function b(a,b){a&&(d[a]=d[a]?d[a]+", "+b:b)}var c,d=qa();return x(a)?f(a.split("\n"),function(a){c=a.indexOf(":"),b(zd(Td(a.substr(0,c))),Td(a.substr(c+1)))}):v(a)&&f(a,function(a,c){b(zd(c),Td(a))}),d}function zb(a){var b;return function(c){if(b||(b=yb(a)),c){var d=b[zd(c)];return void 0===d&&(d=null),d}return b}}function Ab(a,b,c,d){return A(d)?d(a,b,c):(f(d,function(d){a=d(a,b,c)}),a)}function Bb(a){return a>=200&&300>a}function Cb(){var a=this.defaults={transformResponse:[wb],transformRequest:[function(a){return!v(a)||E(a)||G(a)||F(a)?a:V(a)}],headers:{common:{Accept:"application/json, text/plain, */*"},post:P(Te),put:P(Te),patch:P(Te)},xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",paramSerializer:"$httpParamSerializer"},b=!1;this.useApplyAsync=function(a){return u(a)?(b=!!a,this):b};var e=!0;this.useLegacyPromiseExtensions=function(a){return u(a)?(e=!!a,this):e};var g=this.interceptors=[];this.$get=["$httpBackend","$$cookieReader","$cacheFactory","$rootScope","$q","$injector",function(h,i,j,k,m,n){function o(b){function g(a){var b=l({},a);return b.data=Ab(a.data,a.headers,a.status,j.transformResponse),Bb(a.status)?b:m.reject(b)}function h(a,b){var c,d={};return f(a,function(a,e){A(a)?(c=a(b),null!=c&&(d[e]=c)):d[e]=a}),d}function i(b){var c,d,e,f=a.headers,g=l({},b.headers);f=l({},f.common,f[zd(b.method)]);a:for(c in f){d=zd(c);for(e in g)if(zd(e)===d)continue a;g[c]=f[c]}return h(g,P(b))}if(!Od.isObject(b))throw d("$http")("badreq","Http request configuration must be an object. Received: {0}",b);if(!x(b.url))throw d("$http")("badreq","Http request configuration url must be a string. Received: {0}",b.url);var j=l({method:"get",transformRequest:a.transformRequest,transformResponse:a.transformResponse,paramSerializer:a.paramSerializer},b);j.headers=i(b),j.method=Bd(j.method),j.paramSerializer=x(j.paramSerializer)?n.get(j.paramSerializer):j.paramSerializer;var k=function(b){var d=b.headers,e=Ab(b.data,zb(d),c,b.transformRequest);return t(e)&&f(d,function(a,b){"content-type"===zd(b)&&delete d[b]}),t(b.withCredentials)&&!t(a.withCredentials)&&(b.withCredentials=a.withCredentials),r(b,e).then(g,g)},o=[k,c],p=m.when(j);for(f(y,function(a){(a.request||a.requestError)&&o.unshift(a.request,a.requestError),(a.response||a.responseError)&&o.push(a.response,a.responseError)});o.length;){var q=o.shift(),s=o.shift();p=p.then(q,s)}return e?(p.success=function(a){return ma(a,"fn"),p.then(function(b){a(b.data,b.status,b.headers,j)}),p},p.error=function(a){return ma(a,"fn"),p.then(null,function(b){a(b.data,b.status,b.headers,j)}),p}):(p.success=Ye("success"),p.error=Ye("error")),p}function p(a){f(arguments,function(a){o[a]=function(b,c){return o(l({},c||{},{method:a,url:b}))}})}function q(a){f(arguments,function(a){o[a]=function(b,c,d){return o(l({},d||{},{method:a,url:b,data:c}))}})}function r(d,e){function f(a,c,d,e){function f(){g(c,a,d,e)}n&&(Bb(a)?n.put(y,[a,c,yb(d),e]):n.remove(y)),b?k.$applyAsync(f):(f(),k.$$phase||k.$apply())}function g(a,b,c,e){b=b>=-1?b:0,(Bb(b)?q.resolve:q.reject)({data:a,status:b,headers:zb(c),config:d,statusText:e})}function j(a){g(a.data,a.status,P(a.headers()),a.statusText)}function l(){var a=o.pendingRequests.indexOf(d);-1!==a&&o.pendingRequests.splice(a,1)}var n,p,q=m.defer(),r=q.promise,x=d.headers,y=s(d.url,d.paramSerializer(d.params));if(o.pendingRequests.push(d),r.then(l,l),!d.cache&&!a.cache||d.cache===!1||"GET"!==d.method&&"JSONP"!==d.method||(n=v(d.cache)?d.cache:v(a.cache)?a.cache:w),n&&(p=n.get(y),u(p)?I(p)?p.then(j,j):Rd(p)?g(p[1],p[0],P(p[2]),p[3]):g(p,200,{},"OK"):n.put(y,r)),t(p)){var z=Dc(d.url)?i()[d.xsrfCookieName||a.xsrfCookieName]:c;z&&(x[d.xsrfHeaderName||a.xsrfHeaderName]=z),h(d.method,y,e,f,x,d.timeout,d.withCredentials,d.responseType)}return r}function s(a,b){return b.length>0&&(a+=(-1==a.indexOf("?")?"?":"&")+b),a}var w=j("$http");a.paramSerializer=x(a.paramSerializer)?n.get(a.paramSerializer):a.paramSerializer;var y=[];return f(g,function(a){y.unshift(x(a)?n.get(a):n.invoke(a))}),o.pendingRequests=[],p("get","delete","head","jsonp"),q("post","put","patch"),o.defaults=a,o}]}function Db(){this.$get=function(){return function(){return new a.XMLHttpRequest}}}function Eb(){this.$get=["$browser","$window","$document","$xhrFactory",function(a,b,c,d){return Fb(a,d,a.defer,b.angular.callbacks,c[0])}]}function Fb(a,b,c,d,e){function g(a,b,c){var f=e.createElement("script"),g=null;return f.type="text/javascript",f.src=a,f.async=!0,g=function(a){je(f,"load",g),je(f,"error",g),e.body.removeChild(f),f=null;var h=-1,i="unknown";a&&("load"!==a.type||d[b].called||(a={type:"error"}),i=a.type,h="error"===a.type?404:200),c&&c(h,i)},ie(f,"load",g),ie(f,"error",g),e.body.appendChild(f),g}return function(e,h,i,j,k,l,m,n){function o(){s&&s(),v&&v.abort()}function q(b,d,e,f,g){u(y)&&c.cancel(y),s=v=null,b(d,e,f,g),a.$$completeOutstandingRequest(p)}if(a.$$incOutstandingRequestCount(),h=h||a.url(),"jsonp"==zd(e)){var r="_"+(d.counter++).toString(36);d[r]=function(a){d[r].data=a,d[r].called=!0};var s=g(h.replace("JSON_CALLBACK","angular.callbacks."+r),r,function(a,b){q(j,a,d[r].data,"",b),d[r]=p})}else{var v=b(e,h);v.open(e,h,!0),f(k,function(a,b){u(a)&&v.setRequestHeader(b,a)}),v.onload=function(){var a=v.statusText||"",b="response"in v?v.response:v.responseText,c=1223===v.status?204:v.status;0===c&&(c=b?200:"file"==Cc(h).protocol?404:0),q(j,c,b,v.getAllResponseHeaders(),a)};var w=function(){q(j,-1,null,null,"")};if(v.onerror=w,v.onabort=w,m&&(v.withCredentials=!0),n)try{v.responseType=n}catch(x){if("json"!==n)throw x}v.send(t(i)?null:i)}if(l>0)var y=c(o,l);else I(l)&&l.then(o)}}function Gb(){var a="{{",b="}}";this.startSymbol=function(b){return b?(a=b,this):a},this.endSymbol=function(a){return a?(b=a,this):b},this.$get=["$parse","$exceptionHandler","$sce",function(c,d,e){function f(a){return"\\\\\\"+a}function g(c){return c.replace(m,a).replace(n,b)}function h(a){if(null==a)return"";switch(typeof a){case"string":break;case"number":a=""+a;break;default:a=V(a)}return a}function i(f,i,m,n){function o(a){try{return a=C(a),n&&!u(a)?a:h(a)}catch(b){d(Ze.interr(f,b))}}n=!!n;for(var p,q,r,s=0,v=[],w=[],x=f.length,y=[],z=[];x>s;){if(-1==(p=f.indexOf(a,s))||-1==(q=f.indexOf(b,p+j))){s!==x&&y.push(g(f.substring(s)));break}s!==p&&y.push(g(f.substring(s,p))),r=f.substring(p+j,q),v.push(r),w.push(c(r,o)),s=q+k,z.push(y.length),y.push("")}if(m&&y.length>1&&Ze.throwNoconcat(f),!i||v.length){var B=function(a){for(var b=0,c=v.length;c>b;b++){if(n&&t(a[b]))return;y[z[b]]=a[b]}return y.join("")},C=function(a){return m?e.getTrusted(m,a):e.valueOf(a)};return l(function(a){var b=0,c=v.length,e=new Array(c);try{for(;c>b;b++)e[b]=w[b](a);return B(e)}catch(g){d(Ze.interr(f,g))}},{exp:f,expressions:v,$$watchDelegate:function(a,b){var c;return a.$watchGroup(w,function(d,e){var f=B(d);A(b)&&b.call(this,f,d!==e?c:f,a),c=f})}})}}var j=a.length,k=b.length,m=new RegExp(a.replace(/./g,f),"g"),n=new RegExp(b.replace(/./g,f),"g");return i.startSymbol=function(){return a},i.endSymbol=function(){return b},i}]}function Hb(){this.$get=["$rootScope","$window","$q","$$q",function(a,b,c,d){function e(e,g,h,i){var j=arguments.length>4,k=j?S(arguments,4):[],l=b.setInterval,m=b.clearInterval,n=0,o=u(i)&&!i,p=(o?d:c).defer(),q=p.promise;return h=u(h)?h:0,q.then(null,null,j?function(){e.apply(null,k)}:e),q.$$intervalId=l(function(){p.notify(n++),h>0&&n>=h&&(p.resolve(n),m(q.$$intervalId),delete f[q.$$intervalId]),o||a.$apply()},g),f[q.$$intervalId]=p,q}var f={};return e.cancel=function(a){return a&&a.$$intervalId in f?(f[a.$$intervalId].reject("canceled"),b.clearInterval(a.$$intervalId),delete f[a.$$intervalId],!0):!1},e}]}function Ib(a){for(var b=a.split("/"),c=b.length;c--;)b[c]=ca(b[c]);return b.join("/")}function Jb(a,b){var c=Cc(a);b.$$protocol=c.protocol,b.$$host=c.hostname,b.$$port=n(c.port)||_e[c.protocol]||null}function Kb(a,b){var c="/"!==a.charAt(0);c&&(a="/"+a);var d=Cc(a);b.$$path=decodeURIComponent(c&&"/"===d.pathname.charAt(0)?d.pathname.substring(1):d.pathname),b.$$search=aa(d.search),b.$$hash=decodeURIComponent(d.hash),b.$$path&&"/"!=b.$$path.charAt(0)&&(b.$$path="/"+b.$$path)}function Lb(a,b){return 0===b.indexOf(a)?b.substr(a.length):void 0}function Mb(a){var b=a.indexOf("#");return-1==b?a:a.substr(0,b)}function Nb(a){return a.replace(/(#.+)|#$/,"$1")}function Ob(a){return a.substr(0,Mb(a).lastIndexOf("/")+1)}function Pb(a){return a.substring(0,a.indexOf("/",a.indexOf("//")+2))}function Qb(a,b,c){this.$$html5=!0,c=c||"",Jb(a,this),this.$$parse=function(a){var c=Lb(b,a);if(!x(c))throw af("ipthprfx",'Invalid url "{0}", missing path prefix "{1}".',a,b);Kb(c,this),this.$$path||(this.$$path="/"),this.$$compose()},this.$$compose=function(){var a=ba(this.$$search),c=this.$$hash?"#"+ca(this.$$hash):"";this.$$url=Ib(this.$$path)+(a?"?"+a:"")+c,this.$$absUrl=b+this.$$url.substr(1)},this.$$parseLinkUrl=function(d,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,g,h;return u(f=Lb(a,d))?(g=f,h=u(f=Lb(c,f))?b+(Lb("/",f)||f):a+g):u(f=Lb(b,d))?h=b+f:b==d+"/"&&(h=b),h&&this.$$parse(h),!!h}}function Rb(a,b,c){Jb(a,this),this.$$parse=function(d){function e(a,b,c){var d,e=/^\/[A-Z]:(\/.*)/;return 0===b.indexOf(c)&&(b=b.replace(c,"")),e.exec(b)?a:(d=e.exec(a),d?d[1]:a)}var f,g=Lb(a,d)||Lb(b,d);t(g)||"#"!==g.charAt(0)?this.$$html5?f=g:(f="",t(g)&&(a=d,this.replace())):(f=Lb(c,g),t(f)&&(f=g)),Kb(f,this),this.$$path=e(this.$$path,f,a),this.$$compose()},this.$$compose=function(){var b=ba(this.$$search),d=this.$$hash?"#"+ca(this.$$hash):"";this.$$url=Ib(this.$$path)+(b?"?"+b:"")+d,this.$$absUrl=a+(this.$$url?c+this.$$url:"")},this.$$parseLinkUrl=function(b,c){return Mb(a)==Mb(b)?(this.$$parse(b),!0):!1}}function Sb(a,b,c){this.$$html5=!0,Rb.apply(this,arguments),this.$$parseLinkUrl=function(d,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,g;return a==Mb(d)?f=d:(g=Lb(b,d))?f=a+c+g:b===d+"/"&&(f=b),f&&this.$$parse(f),!!f},this.$$compose=function(){var b=ba(this.$$search),d=this.$$hash?"#"+ca(this.$$hash):"";this.$$url=Ib(this.$$path)+(b?"?"+b:"")+d,this.$$absUrl=a+c+this.$$url}}function Tb(a){return function(){return this[a]}}function Ub(a,b){return function(c){return t(c)?this[a]:(this[a]=b(c),this.$$compose(),this)}}function Vb(){var a="",b={enabled:!1,requireBase:!0,rewriteLinks:!0};this.hashPrefix=function(b){return u(b)?(a=b,this):a},this.html5Mode=function(a){return H(a)?(b.enabled=a,this):v(a)?(H(a.enabled)&&(b.enabled=a.enabled),H(a.requireBase)&&(b.requireBase=a.requireBase),H(a.rewriteLinks)&&(b.rewriteLinks=a.rewriteLinks),this):b},this.$get=["$rootScope","$browser","$sniffer","$rootElement","$window",function(c,d,e,f,g){function h(a,b,c){var e=j.url(),f=j.$$state;try{d.url(a,b,c),j.$$state=d.state()}catch(g){throw j.url(e),j.$$state=f,g}}function i(a,b){c.$broadcast("$locationChangeSuccess",j.absUrl(),a,j.$$state,b)}var j,k,l,m=d.baseHref(),n=d.url();if(b.enabled){if(!m&&b.requireBase)throw af("nobase","$location in HTML5 mode requires a tag to be present!");l=Pb(n)+(m||"/"),k=e.history?Qb:Sb}else l=Mb(n),k=Rb;var o=Ob(l);j=new k(l,o,"#"+a),j.$$parseLinkUrl(n,n),j.$$state=d.state();var p=/^\s*(javascript|mailto):/i;f.on("click",function(a){if(b.rewriteLinks&&!a.ctrlKey&&!a.metaKey&&!a.shiftKey&&2!=a.which&&2!=a.button){for(var e=Fd(a.target);"a"!==M(e[0]);)if(e[0]===f[0]||!(e=e.parent())[0])return;var h=e.prop("href"),i=e.attr("href")||e.attr("xlink:href");v(h)&&"[object SVGAnimatedString]"===h.toString()&&(h=Cc(h.animVal).href),p.test(h)||!h||e.attr("target")||a.isDefaultPrevented()||j.$$parseLinkUrl(h,i)&&(a.preventDefault(),j.absUrl()!=d.url()&&(c.$apply(),g.angular["ff-684208-preventDefault"]=!0))}}),Nb(j.absUrl())!=Nb(n)&&d.url(j.absUrl(),!0);var q=!0;return d.onUrlChange(function(a,b){return t(Lb(o,a))?void(g.location.href=a):(c.$evalAsync(function(){var d,e=j.absUrl(),f=j.$$state;a=Nb(a),j.$$parse(a),j.$$state=b,d=c.$broadcast("$locationChangeStart",a,e,b,f).defaultPrevented,j.absUrl()===a&&(d?(j.$$parse(e),j.$$state=f,h(e,!1,f)):(q=!1,i(e,f)))}),void(c.$$phase||c.$digest()))}),c.$watch(function(){var a=Nb(d.url()),b=Nb(j.absUrl()),f=d.state(),g=j.$$replace,k=a!==b||j.$$html5&&e.history&&f!==j.$$state;(q||k)&&(q=!1,c.$evalAsync(function(){var b=j.absUrl(),d=c.$broadcast("$locationChangeStart",b,a,j.$$state,f).defaultPrevented;j.absUrl()===b&&(d?(j.$$parse(a),j.$$state=f):(k&&h(b,g,f===j.$$state?null:j.$$state),i(a,f)))})),j.$$replace=!1}),j}]}function Wb(){var a=!0,b=this;this.debugEnabled=function(b){return u(b)?(a=b,this):a},this.$get=["$window",function(c){function d(a){return a instanceof Error&&(a.stack?a=a.message&&-1===a.stack.indexOf(a.message)?"Error: "+a.message+"\n"+a.stack:a.stack:a.sourceURL&&(a=a.message+"\n"+a.sourceURL+":"+a.line)),a}function e(a){var b=c.console||{},e=b[a]||b.log||p,g=!1;try{g=!!e.apply}catch(h){}return g?function(){var a=[];return f(arguments,function(b){a.push(d(b))}),e.apply(b,a)}:function(a,b){e(a,null==b?"":b)}}return{log:e("log"),info:e("info"),warn:e("warn"),error:e("error"),debug:function(){var c=e("debug");return function(){a&&c.apply(b,arguments)}}()}}]}function Xb(a,b){if("__defineGetter__"===a||"__defineSetter__"===a||"__lookupGetter__"===a||"__lookupSetter__"===a||"__proto__"===a)throw cf("isecfld","Attempting to access a disallowed field in Angular expressions! Expression: {0}",b);return a}function Yb(a,b){if(a+="",!x(a))throw cf("iseccst","Cannot convert object to primitive value! Expression: {0}",b);return a}function Zb(a,b){if(a){if(a.constructor===a)throw cf("isecfn","Referencing Function in Angular expressions is disallowed! Expression: {0}",b);if(a.window===a)throw cf("isecwindow","Referencing the Window in Angular expressions is disallowed! Expression: {0}",b);if(a.children&&(a.nodeName||a.prop&&a.attr&&a.find))throw cf("isecdom","Referencing DOM nodes in Angular expressions is disallowed! Expression: {0}",b);if(a===Object)throw cf("isecobj","Referencing Object in Angular expressions is disallowed! Expression: {0}",b)}return a}function $b(a,b){if(a){if(a.constructor===a)throw cf("isecfn","Referencing Function in Angular expressions is disallowed! Expression: {0}",b);if(a===df||a===ef||a===ff)throw cf("isecff","Referencing call, apply or bind in Angular expressions is disallowed! Expression: {0}",b)}}function _b(a,b){if(a&&(a===0..constructor||a===(!1).constructor||a==="".constructor||a==={}.constructor||a===[].constructor||a===Function.constructor))throw cf("isecaf","Assigning to a constructor is disallowed! Expression: {0}",b)}function ac(a,b){return"undefined"!=typeof a?a:b}function bc(a,b){return"undefined"==typeof a?b:"undefined"==typeof b?a:a+b}function cc(a,b){var c=a(b);return!c.$stateful}function dc(a,b){var c,d;switch(a.type){case kf.Program:c=!0,f(a.body,function(a){dc(a.expression,b),c=c&&a.expression.constant}),a.constant=c;break;case kf.Literal:a.constant=!0,a.toWatch=[];break;case kf.UnaryExpression:dc(a.argument,b),a.constant=a.argument.constant,a.toWatch=a.argument.toWatch;break;case kf.BinaryExpression:dc(a.left,b),dc(a.right,b),a.constant=a.left.constant&&a.right.constant,a.toWatch=a.left.toWatch.concat(a.right.toWatch);break;case kf.LogicalExpression:dc(a.left,b),dc(a.right,b),a.constant=a.left.constant&&a.right.constant,a.toWatch=a.constant?[]:[a];break;case kf.ConditionalExpression:dc(a.test,b),dc(a.alternate,b),dc(a.consequent,b),a.constant=a.test.constant&&a.alternate.constant&&a.consequent.constant,a.toWatch=a.constant?[]:[a];break;case kf.Identifier:a.constant=!1,a.toWatch=[a];break;case kf.MemberExpression:dc(a.object,b),a.computed&&dc(a.property,b),a.constant=a.object.constant&&(!a.computed||a.property.constant),a.toWatch=[a];break;case kf.CallExpression:c=a.filter?cc(b,a.callee.name):!1,d=[],f(a.arguments,function(a){dc(a,b),c=c&&a.constant,a.constant||d.push.apply(d,a.toWatch)}),a.constant=c,a.toWatch=a.filter&&cc(b,a.callee.name)?d:[a];break;case kf.AssignmentExpression:dc(a.left,b),dc(a.right,b),a.constant=a.left.constant&&a.right.constant,a.toWatch=[a];break;case kf.ArrayExpression:c=!0,d=[],f(a.elements,function(a){dc(a,b),c=c&&a.constant,a.constant||d.push.apply(d,a.toWatch)}),a.constant=c,a.toWatch=d;break;case kf.ObjectExpression:c=!0,d=[],f(a.properties,function(a){dc(a.value,b),c=c&&a.value.constant,a.value.constant||d.push.apply(d,a.value.toWatch)}),a.constant=c,a.toWatch=d;break;case kf.ThisExpression:a.constant=!1,a.toWatch=[]}}function ec(a){if(1==a.length){var b=a[0].expression,d=b.toWatch;return 1!==d.length?d:d[0]!==b?d:c}}function fc(a){return a.type===kf.Identifier||a.type===kf.MemberExpression}function gc(a){return 1===a.body.length&&fc(a.body[0].expression)?{type:kf.AssignmentExpression,left:a.body[0].expression,right:{type:kf.NGValueParameter},operator:"="}:void 0}function hc(a){return 0===a.body.length||1===a.body.length&&(a.body[0].expression.type===kf.Literal||a.body[0].expression.type===kf.ArrayExpression||a.body[0].expression.type===kf.ObjectExpression)}function ic(a){return a.constant}function jc(a,b){this.astBuilder=a,this.$filter=b}function kc(a,b){this.astBuilder=a,this.$filter=b}function lc(a){return"constructor"==a}function mc(a){return A(a.valueOf)?a.valueOf():mf.call(a)}function nc(){var a=qa(),b=qa();this.$get=["$filter",function(d){function e(c,e,f){var h,n,s;switch(f=f||r,typeof c){case"string":c=c.trim(),s=c;var t=f?b:a;if(h=t[s],!h){":"===c.charAt(0)&&":"===c.charAt(1)&&(n=!0,c=c.substring(2));var u=f?q:o,v=new jf(u),w=new lf(v,d,u);h=w.parse(c),h.constant?h.$$watchDelegate=l:n?h.$$watchDelegate=h.literal?k:j:h.inputs&&(h.$$watchDelegate=i),f&&(h=g(h)),t[s]=h}return m(h,e);case"function":return m(c,e);default:return m(p,e)}}function g(a){function b(b,c,d,e){var f=r;r=!0;try{return a(b,c,d,e)}finally{r=f}}if(!a)return a;b.$$watchDelegate=a.$$watchDelegate,b.assign=g(a.assign),b.constant=a.constant,b.literal=a.literal;for(var c=0;a.inputs&&cm;m++)k[m]=h,l[m]=null;return a.$watch(function(a){for(var b=!1,d=0,f=i.length;f>d;d++){var j=i[d](a);(b||(b=!h(j,k[d])))&&(l[d]=j,k[d]=j&&mc(j))}return b&&(g=e(a,c,c,l)),g},b,d,f)}function j(a,b,c,d){var e,f;return e=a.$watch(function(a){return d(a)},function(a,c,d){f=a,A(b)&&b.apply(this,arguments),u(a)&&d.$$postDigest(function(){u(f)&&e()})},c)}function k(a,b,c,d){function e(a){var b=!0;return f(a,function(a){u(a)||(b=!1)}),b}var g,h;return g=a.$watch(function(a){return d(a)},function(a,c,d){h=a,A(b)&&b.call(this,a,c,d),e(a)&&d.$$postDigest(function(){e(h)&&g()})},c)}function l(a,b,c,d){var e;return e=a.$watch(function(a){return d(a)},function(a,c,d){A(b)&&b.apply(this,arguments),e()},c)}function m(a,b){if(!b)return a;var c=a.$$watchDelegate,d=!1,e=c!==k&&c!==j,f=e?function(c,e,f,g){var h=d&&g?g[0]:a(c,e,f,g);return b(h,c,e)}:function(c,d,e,f){var g=a(c,d,e,f),h=b(g,c,d);return u(g)?h:g};return a.$$watchDelegate&&a.$$watchDelegate!==i?f.$$watchDelegate=a.$$watchDelegate:b.$stateful||(f.$$watchDelegate=i,d=!a.inputs,f.inputs=a.inputs?a.inputs:[a]),f}var n=Vd().noUnsafeEval,o={csp:n,expensiveChecks:!1},q={csp:n,expensiveChecks:!0},r=!1;return e.$$runningExpensiveChecks=function(){return r},e}]}function oc(){this.$get=["$rootScope","$exceptionHandler",function(a,b){return qc(function(b){a.$evalAsync(b)},b)}]}function pc(){this.$get=["$browser","$exceptionHandler",function(a,b){return qc(function(b){a.defer(b)},b)}]}function qc(a,b){function e(a,b,c){function d(b){return function(c){e||(e=!0,b.call(a,c))}}var e=!1;return[d(b),d(c)]}function g(){this.$$state={status:0}}function h(a,b){return function(c){b.call(a,c)}}function i(a){var d,e,f;f=a.pending,a.processScheduled=!1,a.pending=c;for(var g=0,h=f.length;h>g;++g){e=f[g][0],d=f[g][a.status];try{A(d)?e.resolve(d(a.value)):1===a.status?e.resolve(a.value):e.reject(a.value)}catch(i){e.reject(i),b(i)}}}function j(b){!b.processScheduled&&b.pending&&(b.processScheduled=!0,a(function(){i(b)}))}function k(){this.promise=new g,this.resolve=h(this,this.resolve),this.reject=h(this,this.reject),this.notify=h(this,this.notify)}function m(a){var b=new k,c=0,d=Rd(a)?[]:{};return f(a,function(a,e){c++,s(a).then(function(a){d.hasOwnProperty(e)||(d[e]=a,--c||b.resolve(d))},function(a){d.hasOwnProperty(e)||b.reject(a)})}),0===c&&b.resolve(d),b.promise}var n=d("$q",TypeError),o=function(){return new k};l(g.prototype,{then:function(a,b,c){if(t(a)&&t(b)&&t(c))return this;var d=new k;return this.$$state.pending=this.$$state.pending||[],this.$$state.pending.push([d,a,b,c]),this.$$state.status>0&&j(this.$$state),d.promise},"catch":function(a){return this.then(null,a)},"finally":function(a,b){return this.then(function(b){return r(b,!0,a)},function(b){return r(b,!1,a)},b)}}),l(k.prototype,{resolve:function(a){ this.promise.$$state.status||(a===this.promise?this.$$reject(n("qcycle","Expected promise to be resolved with value other than itself '{0}'",a)):this.$$resolve(a))},$$resolve:function(a){var c,d;d=e(this,this.$$resolve,this.$$reject);try{(v(a)||A(a))&&(c=a&&a.then),A(c)?(this.promise.$$state.status=-1,c.call(a,d[0],d[1],this.notify)):(this.promise.$$state.value=a,this.promise.$$state.status=1,j(this.promise.$$state))}catch(f){d[1](f),b(f)}},reject:function(a){this.promise.$$state.status||this.$$reject(a)},$$reject:function(a){this.promise.$$state.value=a,this.promise.$$state.status=2,j(this.promise.$$state)},notify:function(c){var d=this.promise.$$state.pending;this.promise.$$state.status<=0&&d&&d.length&&a(function(){for(var a,e,f=0,g=d.length;g>f;f++){e=d[f][0],a=d[f][3];try{e.notify(A(a)?a(c):c)}catch(h){b(h)}}})}});var p=function(a){var b=new k;return b.reject(a),b.promise},q=function(a,b){var c=new k;return b?c.resolve(a):c.reject(a),c.promise},r=function(a,b,c){var d=null;try{A(c)&&(d=c())}catch(e){return q(e,!1)}return I(d)?d.then(function(){return q(a,b)},function(a){return q(a,!1)}):q(a,b)},s=function(a,b,c,d){var e=new k;return e.resolve(a),e.promise.then(b,c,d)},u=s,w=function x(a){function b(a){d.resolve(a)}function c(a){d.reject(a)}if(!A(a))throw n("norslvr","Expected resolverFn, got '{0}'",a);if(!(this instanceof x))return new x(a);var d=new k;return a(b,c),d.promise};return w.defer=o,w.reject=p,w.when=s,w.resolve=u,w.all=m,w}function rc(){this.$get=["$window","$timeout",function(a,b){var c=a.requestAnimationFrame||a.webkitRequestAnimationFrame,d=a.cancelAnimationFrame||a.webkitCancelAnimationFrame||a.webkitCancelRequestAnimationFrame,e=!!c,f=e?function(a){var b=c(a);return function(){d(b)}}:function(a){var c=b(a,16.66,!1);return function(){b.cancel(c)}};return f.supported=e,f}]}function sc(){function a(a){function b(){this.$$watchers=this.$$nextSibling=this.$$childHead=this.$$childTail=null,this.$$listeners={},this.$$listenerCount={},this.$$watchersCount=0,this.$id=i(),this.$$ChildScope=null}return b.prototype=a,b}var b=10,c=d("$rootScope"),g=null,h=null;this.digestTtl=function(a){return arguments.length&&(b=a),b},this.$get=["$injector","$exceptionHandler","$parse","$browser",function(d,j,k,l){function m(a){a.currentScope.$$destroyed=!0}function n(a){9===Ed&&(a.$$childHead&&n(a.$$childHead),a.$$nextSibling&&n(a.$$nextSibling)),a.$parent=a.$$nextSibling=a.$$prevSibling=a.$$childHead=a.$$childTail=a.$root=a.$$watchers=null}function o(){this.$id=i(),this.$$phase=this.$parent=this.$$watchers=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=null,this.$root=this,this.$$destroyed=!1,this.$$listeners={},this.$$listenerCount={},this.$$watchersCount=0,this.$$isolateBindings=null}function q(a){if(z.$$phase)throw c("inprog","{0} already in progress",z.$$phase);z.$$phase=a}function r(){z.$$phase=null}function s(a,b){do a.$$watchersCount+=b;while(a=a.$parent)}function u(a,b,c){do a.$$listenerCount[c]-=b,0===a.$$listenerCount[c]&&delete a.$$listenerCount[c];while(a=a.$parent)}function w(){}function x(){for(;D.length;)try{D.shift()()}catch(a){j(a)}h=null}function y(){null===h&&(h=l.defer(function(){z.$apply(x)}))}o.prototype={constructor:o,$new:function(b,c){var d;return c=c||this,b?(d=new o,d.$root=this.$root):(this.$$ChildScope||(this.$$ChildScope=a(this)),d=new this.$$ChildScope),d.$parent=c,d.$$prevSibling=c.$$childTail,c.$$childHead?(c.$$childTail.$$nextSibling=d,c.$$childTail=d):c.$$childHead=c.$$childTail=d,(b||c!=this)&&d.$on("$destroy",m),d},$watch:function(a,b,c,d){var e=k(a);if(e.$$watchDelegate)return e.$$watchDelegate(this,b,c,e,a);var f=this,h=f.$$watchers,i={fn:b,last:w,get:e,exp:d||a,eq:!!c};return g=null,A(b)||(i.fn=p),h||(h=f.$$watchers=[]),h.unshift(i),s(this,1),function(){N(h,i)>=0&&s(f,-1),g=null}},$watchGroup:function(a,b){function c(){i=!1,j?(j=!1,b(e,e,h)):b(e,d,h)}var d=new Array(a.length),e=new Array(a.length),g=[],h=this,i=!1,j=!0;if(!a.length){var k=!0;return h.$evalAsync(function(){k&&b(e,e,h)}),function(){k=!1}}return 1===a.length?this.$watch(a[0],function(a,c,f){e[0]=a,d[0]=c,b(e,a===c?e:d,f)}):(f(a,function(a,b){var f=h.$watch(a,function(a,f){e[b]=a,d[b]=f,i||(i=!0,h.$evalAsync(c))});g.push(f)}),function(){for(;g.length;)g.shift()()})},$watchCollection:function(a,b){function c(a){f=a;var b,c,d,h,i;if(!t(f)){if(v(f))if(e(f)){g!==n&&(g=n,q=g.length=0,l++),b=f.length,q!==b&&(l++,g.length=q=b);for(var j=0;b>j;j++)i=g[j],h=f[j],d=i!==i&&h!==h,d||i===h||(l++,g[j]=h)}else{g!==o&&(g=o={},q=0,l++),b=0;for(c in f)Ad.call(f,c)&&(b++,h=f[c],i=g[c],c in g?(d=i!==i&&h!==h,d||i===h||(l++,g[c]=h)):(q++,g[c]=h,l++));if(q>b){l++;for(c in g)Ad.call(f,c)||(q--,delete g[c])}}else g!==f&&(g=f,l++);return l}}function d(){if(p?(p=!1,b(f,f,i)):b(f,h,i),j)if(v(f))if(e(f)){h=new Array(f.length);for(var a=0;a1,l=0,m=k(a,c),n=[],o={},p=!0,q=0;return this.$watch(m,d)},$digest:function(){var a,d,e,f,i,k,m,n,o,p,s,t,u=b,v=this,y=[];q("$digest"),l.$$checkUrlChange(),this===z&&null!==h&&(l.defer.cancel(h),x()),g=null;do{for(n=!1,p=v;B.length;){try{t=B.shift(),t.scope.$eval(t.expression,t.locals)}catch(D){j(D)}g=null}a:do{if(k=p.$$watchers)for(m=k.length;m--;)try{if(a=k[m])if(i=a.get,(d=i(p))===(e=a.last)||(a.eq?Q(d,e):"number"==typeof d&&"number"==typeof e&&isNaN(d)&&isNaN(e))){if(a===g){n=!1;break a}}else n=!0,g=a,a.last=a.eq?O(d,null):d,f=a.fn,f(d,e===w?d:e,p),5>u&&(s=4-u,y[s]||(y[s]=[]),y[s].push({msg:A(a.exp)?"fn: "+(a.exp.name||a.exp.toString()):a.exp,newVal:d,oldVal:e}))}catch(D){j(D)}if(!(o=p.$$watchersCount&&p.$$childHead||p!==v&&p.$$nextSibling))for(;p!==v&&!(o=p.$$nextSibling);)p=p.$parent}while(p=o);if((n||B.length)&&!u--)throw r(),c("infdig","{0} $digest() iterations reached. Aborting!\nWatchers fired in the last 5 iterations: {1}",b,y)}while(n||B.length);for(r();C.length;)try{C.shift()()}catch(D){j(D)}},$destroy:function(){if(!this.$$destroyed){var a=this.$parent;this.$broadcast("$destroy"),this.$$destroyed=!0,this===z&&l.$$applicationDestroyed(),s(this,-this.$$watchersCount);for(var b in this.$$listenerCount)u(this,this.$$listenerCount[b],b);a&&a.$$childHead==this&&(a.$$childHead=this.$$nextSibling),a&&a.$$childTail==this&&(a.$$childTail=this.$$prevSibling),this.$$prevSibling&&(this.$$prevSibling.$$nextSibling=this.$$nextSibling),this.$$nextSibling&&(this.$$nextSibling.$$prevSibling=this.$$prevSibling),this.$destroy=this.$digest=this.$apply=this.$evalAsync=this.$applyAsync=p,this.$on=this.$watch=this.$watchGroup=function(){return p},this.$$listeners={},this.$$nextSibling=null,n(this)}},$eval:function(a,b){return k(a)(this,b)},$evalAsync:function(a,b){z.$$phase||B.length||l.defer(function(){B.length&&z.$digest()}),B.push({scope:this,expression:k(a),locals:b})},$$postDigest:function(a){C.push(a)},$apply:function(a){try{q("$apply");try{return this.$eval(a)}finally{r()}}catch(b){j(b)}finally{try{z.$digest()}catch(b){throw j(b),b}}},$applyAsync:function(a){function b(){c.$eval(a)}var c=this;a&&D.push(b),a=k(a),y()},$on:function(a,b){var c=this.$$listeners[a];c||(this.$$listeners[a]=c=[]),c.push(b);var d=this;do d.$$listenerCount[a]||(d.$$listenerCount[a]=0),d.$$listenerCount[a]++;while(d=d.$parent);var e=this;return function(){var d=c.indexOf(b);-1!==d&&(c[d]=null,u(e,1,a))}},$emit:function(a,b){var c,d,e,f=[],g=this,h=!1,i={name:a,targetScope:g,stopPropagation:function(){h=!0},preventDefault:function(){i.defaultPrevented=!0},defaultPrevented:!1},k=R([i],arguments,1);do{for(c=g.$$listeners[a]||f,i.currentScope=g,d=0,e=c.length;e>d;d++)if(c[d])try{c[d].apply(null,k)}catch(l){j(l)}else c.splice(d,1),d--,e--;if(h)return i.currentScope=null,i;g=g.$parent}while(g);return i.currentScope=null,i},$broadcast:function(a,b){var c=this,d=c,e=c,f={name:a,targetScope:c,preventDefault:function(){f.defaultPrevented=!0},defaultPrevented:!1};if(!c.$$listenerCount[a])return f;for(var g,h,i,k=R([f],arguments,1);d=e;){for(f.currentScope=d,g=d.$$listeners[a]||[],h=0,i=g.length;i>h;h++)if(g[h])try{g[h].apply(null,k)}catch(l){j(l)}else g.splice(h,1),h--,i--;if(!(e=d.$$listenerCount[a]&&d.$$childHead||d!==c&&d.$$nextSibling))for(;d!==c&&!(e=d.$$nextSibling);)d=d.$parent}return f.currentScope=null,f}};var z=new o,B=z.$$asyncQueue=[],C=z.$$postDigestQueue=[],D=z.$$applyAsyncQueue=[];return z}]}function tc(){var a=/^\s*(https?|ftp|mailto|tel|file):/,b=/^\s*((https?|ftp|file|blob):|data:image\/)/;this.aHrefSanitizationWhitelist=function(b){return u(b)?(a=b,this):a},this.imgSrcSanitizationWhitelist=function(a){return u(a)?(b=a,this):b},this.$get=function(){return function(c,d){var e,f=d?b:a;return e=Cc(c).href,""===e||e.match(f)?c:"unsafe:"+e}}}function uc(a){if("self"===a)return a;if(x(a)){if(a.indexOf("***")>-1)throw nf("iwcard","Illegal sequence *** in string matcher. String: {0}",a);return a=Ud(a).replace("\\*\\*",".*").replace("\\*","[^:/.?&;]*"),new RegExp("^"+a+"$")}if(B(a))return new RegExp("^"+a.source+"$");throw nf("imatcher",'Matchers may only be "self", string patterns or RegExp objects')}function vc(a){var b=[];return u(a)&&f(a,function(a){b.push(uc(a))}),b}function wc(){this.SCE_CONTEXTS=of;var a=["self"],b=[];this.resourceUrlWhitelist=function(b){return arguments.length&&(a=vc(b)),a},this.resourceUrlBlacklist=function(a){return arguments.length&&(b=vc(a)),b},this.$get=["$injector",function(c){function d(a,b){return"self"===a?Dc(b):!!a.exec(b.href)}function e(c){var e,f,g=Cc(c.toString()),h=!1;for(e=0,f=a.length;f>e;e++)if(d(a[e],g)){h=!0;break}if(h)for(e=0,f=b.length;f>e;e++)if(d(b[e],g)){h=!1;break}return h}function f(a){var b=function(a){this.$$unwrapTrustedValue=function(){return a}};return a&&(b.prototype=new a),b.prototype.valueOf=function(){return this.$$unwrapTrustedValue()},b.prototype.toString=function(){return this.$$unwrapTrustedValue().toString()},b}function g(a,b){var c=l.hasOwnProperty(a)?l[a]:null;if(!c)throw nf("icontext","Attempted to trust a value in invalid context. Context: {0}; Value: {1}",a,b);if(null===b||t(b)||""===b)return b;if("string"!=typeof b)throw nf("itype","Attempted to trust a non-string value in a content requiring a string: Context: {0}",a);return new c(b)}function h(a){return a instanceof k?a.$$unwrapTrustedValue():a}function i(a,b){if(null===b||t(b)||""===b)return b;var c=l.hasOwnProperty(a)?l[a]:null;if(c&&b instanceof c)return b.$$unwrapTrustedValue();if(a===of.RESOURCE_URL){if(e(b))return b;throw nf("insecurl","Blocked loading resource from url not allowed by $sceDelegate policy. URL: {0}",b.toString())}if(a===of.HTML)return j(b);throw nf("unsafe","Attempting to use an unsafe value in a safe context.")}var j=function(a){throw nf("unsafe","Attempting to use an unsafe value in a safe context.")};c.has("$sanitize")&&(j=c.get("$sanitize"));var k=f(),l={};return l[of.HTML]=f(k),l[of.CSS]=f(k),l[of.URL]=f(k),l[of.JS]=f(k),l[of.RESOURCE_URL]=f(l[of.URL]),{trustAs:g,getTrusted:i,valueOf:h}}]}function xc(){var a=!0;this.enabled=function(b){return arguments.length&&(a=!!b),a},this.$get=["$parse","$sceDelegate",function(b,c){if(a&&8>Ed)throw nf("iequirks","Strict Contextual Escaping does not support Internet Explorer version < 11 in quirks mode. You can fix this by adding the text to the top of your HTML document. See http://docs.angularjs.org/api/ng.$sce for more information.");var d=P(of);d.isEnabled=function(){return a},d.trustAs=c.trustAs,d.getTrusted=c.getTrusted,d.valueOf=c.valueOf,a||(d.trustAs=d.getTrusted=function(a,b){return b},d.valueOf=q),d.parseAs=function(a,c){var e=b(c);return e.literal&&e.constant?e:b(c,function(b){return d.getTrusted(a,b)})};var e=d.parseAs,g=d.getTrusted,h=d.trustAs;return f(of,function(a,b){var c=zd(b);d[wa("parse_as_"+c)]=function(b){return e(a,b)},d[wa("get_trusted_"+c)]=function(b){return g(a,b)},d[wa("trust_as_"+c)]=function(b){return h(a,b)}}),d}]}function yc(){this.$get=["$window","$document",function(a,b){var c,d,e={},f=n((/android (\d+)/.exec(zd((a.navigator||{}).userAgent))||[])[1]),g=/Boxee/i.test((a.navigator||{}).userAgent),h=b[0]||{},i=/^(Moz|webkit|ms)(?=[A-Z])/,j=h.body&&h.body.style,k=!1,l=!1;if(j){for(var m in j)if(d=i.exec(m)){c=d[0],c=c.substr(0,1).toUpperCase()+c.substr(1);break}c||(c="WebkitOpacity"in j&&"webkit"),k=!!("transition"in j||c+"Transition"in j),l=!!("animation"in j||c+"Animation"in j),!f||k&&l||(k=x(j.webkitTransition),l=x(j.webkitAnimation))}return{history:!(!a.history||!a.history.pushState||4>f||g),hasEvent:function(a){if("input"===a&&11>=Ed)return!1;if(t(e[a])){var b=h.createElement("div");e[a]="on"+a in b}return e[a]},csp:Vd(),vendorPrefix:c,transitions:k,animations:l,android:f}}]}function zc(){this.$get=["$templateCache","$http","$q","$sce",function(a,b,c,d){function e(f,g){function h(a){if(!g)throw Ne("tpload","Failed to load template: {0} (HTTP status: {1} {2})",f,a.status,a.statusText);return c.reject(a)}e.totalPendingRequests++,(!x(f)||t(a.get(f)))&&(f=d.getTrustedResourceUrl(f));var i=b.defaults&&b.defaults.transformResponse;Rd(i)?i=i.filter(function(a){return a!==wb}):i===wb&&(i=null);var j={cache:a,transformResponse:i};return b.get(f,j)["finally"](function(){e.totalPendingRequests--}).then(function(b){return a.put(f,b.data),b.data},h)}return e.totalPendingRequests=0,e}]}function Ac(){this.$get=["$rootScope","$browser","$location",function(a,b,c){var d={};return d.findBindings=function(a,b,c){var d=a.getElementsByClassName("ng-binding"),e=[];return f(d,function(a){var d=Od.element(a).data("$binding");d&&f(d,function(d){if(c){var f=new RegExp("(^|\\s)"+Ud(b)+"(\\s|\\||$)");f.test(d)&&e.push(a)}else-1!=d.indexOf(b)&&e.push(a)})}),e},d.findModels=function(a,b,c){for(var d=["ng-","data-ng-","ng\\:"],e=0;e0&&(i=b(f.substring(0,h)),t(d[i])&&(d[i]=b(f.substring(h+1))));return d}}function Gc(){this.$get=Fc}function Hc(a){function b(d,e){if(v(d)){var g={};return f(d,function(a,c){g[c]=b(c,a)}),g}return a.factory(d+c,e)}var c="Filter";this.register=b,this.$get=["$injector",function(a){return function(b){return a.get(b+c)}}],b("currency",Mc),b("date",_c),b("filter",Ic),b("json",ad),b("limitTo",bd),b("lowercase",xf),b("number",Nc),b("orderBy",cd),b("uppercase",yf)}function Ic(){return function(a,b,c){if(!e(a)){if(null==a)return a;throw d("filter")("notarray","Expected array but received: {0}",a)}var f,g,h=Lc(b);switch(h){case"function":f=b;break;case"boolean":case"null":case"number":case"string":g=!0;case"object":f=Jc(b,c,g);break;default:return a}return Array.prototype.filter.call(a,f)}}function Jc(a,b,c){var d,e=v(a)&&"$"in a;return b===!0?b=Q:A(b)||(b=function(a,b){return t(a)?!1:null===a||null===b?a===b:v(b)||v(a)&&!s(a)?!1:(a=zd(""+a),b=zd(""+b),-1!==a.indexOf(b))}),d=function(d){return e&&!v(d)?Kc(d,a.$,b,!1):Kc(d,a,b,c)}}function Kc(a,b,c,d,e){var f=Lc(a),g=Lc(b);if("string"===g&&"!"===b.charAt(0))return!Kc(a,b.substring(1),c,d);if(Rd(a))return a.some(function(a){return Kc(a,b,c,d)});switch(f){case"object":var h;if(d){for(h in a)if("$"!==h.charAt(0)&&Kc(a[h],b,c,!0))return!0;return e?!1:Kc(a,b,c,!1)}if("object"===g){for(h in b){var i=b[h];if(!A(i)&&!t(i)){var j="$"===h,k=j?a:a[h];if(!Kc(k,i,c,j,j))return!1}}return!0}return c(a,b);case"function":return!1;default:return c(a,b)}}function Lc(a){return null===a?"null":typeof a}function Mc(a){var b=a.NUMBER_FORMATS;return function(a,c,d){return t(c)&&(c=b.CURRENCY_SYM),t(d)&&(d=b.PATTERNS[1].maxFrac),null==a?a:Qc(a,b.PATTERNS[1],b.GROUP_SEP,b.DECIMAL_SEP,d).replace(/\u00A4/g,c)}}function Nc(a){var b=a.NUMBER_FORMATS;return function(a,c){return null==a?a:Qc(a,b.PATTERNS[0],b.GROUP_SEP,b.DECIMAL_SEP,c)}}function Oc(a){var b,c,d,e,f,g=0;for((c=a.indexOf(sf))>-1&&(a=a.replace(sf,"")),(d=a.search(/e/i))>0?(0>c&&(c=d),c+=+a.slice(d+1),a=a.substring(0,d)):0>c&&(c=a.length),d=0;a.charAt(d)==tf;d++);if(d==(f=a.length))b=[0],c=1;else{for(f--;a.charAt(f)==tf;)f--;for(c-=d,b=[],e=0;f>=d;d++,e++)b[e]=+a.charAt(d)}return c>rf&&(b=b.splice(0,rf-1),g=c-1,c=1),{d:b,e:g,i:c}}function Pc(a,b,c,d){var e=a.d,f=e.length-a.i;b=t(b)?Math.min(Math.max(c,f),d):+b;var g=b+a.i,h=e[g];if(g>0)e.splice(g);else{a.i=1,e.length=g=b+1;for(var i=0;g>i;i++)e[i]=0}for(h>=5&&e[g-1]++;b>f;f++)e.push(0);var j=e.reduceRight(function(a,b,c,d){return b+=a,d[c]=b%10,Math.floor(b/10)},0);j&&(e.unshift(j),a.i++)}function Qc(a,b,c,d,e){if(!x(a)&&!y(a)||isNaN(a))return"";var f,g=!isFinite(a),h=!1,i=Math.abs(a)+"",j="";if(g)j="∞";else{f=Oc(i),Pc(f,e,b.minFrac,b.maxFrac);var k=f.d,l=f.i,m=f.e,n=[];for(h=k.reduce(function(a,b){return a&&!b},!0);0>l;)k.unshift(0),l++;l>0?n=k.splice(l,k.length):(n=k,k=[0]);var o=[];for(k.length>=b.lgSize&&o.unshift(k.splice(-b.lgSize,k.length).join(""));k.length>b.gSize;)o.unshift(k.splice(-b.gSize,k.length).join(""));k.length&&o.unshift(k.join("")),j=o.join(c),n.length&&(j+=d+n.join("")),m&&(j+="e+"+m)}return 0>a&&!h?b.negPre+j+b.negSuf:b.posPre+j+b.posSuf}function Rc(a,b,c){var d="";for(0>a&&(d="-",a=-a),a=""+a;a.length0||f>-c)&&(f+=c),0===f&&-12==c&&(f=12),Rc(f,b,d)}}function Tc(a,b){return function(c,d){var e=c["get"+a](),f=Bd(b?"SHORT"+a:a);return d[f][e]}}function Uc(a,b,c){var d=-1*c,e=d>=0?"+":"";return e+=Rc(Math[d>0?"floor":"ceil"](d/60),2)+Rc(Math.abs(d%60),2)}function Vc(a){var b=new Date(a,0,1).getDay();return new Date(a,0,(4>=b?5:12)-b)}function Wc(a){return new Date(a.getFullYear(),a.getMonth(),a.getDate()+(4-a.getDay()))}function Xc(a){return function(b){var c=Vc(b.getFullYear()),d=Wc(b),e=+d-+c,f=1+Math.round(e/6048e5);return Rc(f,a)}}function Yc(a,b){return a.getHours()<12?b.AMPMS[0]:b.AMPMS[1]}function Zc(a,b){return a.getFullYear()<=0?b.ERAS[0]:b.ERAS[1]}function $c(a,b){return a.getFullYear()<=0?b.ERANAMES[0]:b.ERANAMES[1]}function _c(a){function b(a){var b;if(b=a.match(c)){var d=new Date(0),e=0,f=0,g=b[8]?d.setUTCFullYear:d.setFullYear,h=b[8]?d.setUTCHours:d.setHours;b[9]&&(e=n(b[9]+b[10]),f=n(b[9]+b[11])),g.call(d,n(b[1]),n(b[2])-1,n(b[3]));var i=n(b[4]||0)-e,j=n(b[5]||0)-f,k=n(b[6]||0),l=Math.round(1e3*parseFloat("0."+(b[7]||0)));return h.call(d,i,j,k,l),d}return a}var c=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;return function(c,d,e){var g,h,i="",j=[];if(d=d||"mediumDate",d=a.DATETIME_FORMATS[d]||d,x(c)&&(c=wf.test(c)?n(c):b(c)),y(c)&&(c=new Date(c)),!z(c)||!isFinite(c.getTime()))return c;for(;d;)h=vf.exec(d),h?(j=R(j,h,1),d=j.pop()):(j.push(d),d=null);var k=c.getTimezoneOffset();return e&&(k=X(e,k),c=Z(c,e,!0)),f(j,function(b){g=uf[b],i+=g?g(c,a.DATETIME_FORMATS,k):"''"===b?"'":b.replace(/(^'|'$)/g,"").replace(/''/g,"'")}),i}}function ad(){return function(a,b){return t(b)&&(b=2),V(a,b)}}function bd(){return function(a,b,c){return b=Math.abs(Number(b))===1/0?Number(b):n(b),isNaN(b)?a:(y(a)&&(a=a.toString()),Rd(a)||x(a)?(c=!c||isNaN(c)?0:n(c),c=0>c?Math.max(0,a.length+c):c,b>=0?a.slice(c,c+b):0===c?a.slice(b,a.length):a.slice(Math.max(0,c+b),c)):a)}}function cd(a){function b(b,c){return c=c?-1:1,b.map(function(b){var d=1,e=q;if(A(b))e=b;else if(x(b)&&(("+"==b.charAt(0)||"-"==b.charAt(0))&&(d="-"==b.charAt(0)?-1:1,b=b.substring(1)),""!==b&&(e=a(b),e.constant))){var f=e();e=function(a){return a[f]}}return{get:e,descending:d*c}})}function c(a){switch(typeof a){case"number":case"boolean":case"string":return!0;default:return!1}}function d(a,b){return"function"==typeof a.valueOf&&(a=a.valueOf(),c(a))?a:s(a)&&(a=a.toString(),c(a))?a:b}function f(a,b){var c=typeof a;return null===a?(c="string",a="null"):"string"===c?a=a.toLowerCase():"object"===c&&(a=d(a,b)),{value:a,type:c}}function g(a,b){var c=0;return a.type===b.type?a.value!==b.value&&(c=a.valued&&!(c=g(a.predicateValues[d],b.predicateValues[d])*j[d].descending);++d);return c}if(!e(a))return a;Rd(c)||(c=[c]),0===c.length&&(c=["+"]);var j=b(c,d);j.push({get:function(){return{}},descending:d?-1:1});var k=Array.prototype.map.call(a,h);return k.sort(i),a=k.map(function(a){return a.value})}}function dd(a){return A(a)&&(a={link:a}),a.restrict=a.restrict||"AC",r(a)}function ed(a,b){a.$name=b}function fd(a,b,d,e,g){var h=this,i=[];h.$error={},h.$$success={},h.$pending=c,h.$name=g(b.name||b.ngForm||"")(d),h.$dirty=!1,h.$pristine=!0,h.$valid=!0,h.$invalid=!1,h.$submitted=!1,h.$$parentForm=Bf,h.$rollbackViewValue=function(){f(i,function(a){a.$rollbackViewValue()})},h.$commitViewValue=function(){f(i,function(a){a.$commitViewValue()})},h.$addControl=function(a){na(a.$name,"input"),i.push(a),a.$name&&(h[a.$name]=a),a.$$parentForm=h},h.$$renameControl=function(a,b){var c=a.$name;h[c]===a&&delete h[c],h[b]=a,a.$name=b},h.$removeControl=function(a){a.$name&&h[a.$name]===a&&delete h[a.$name],f(h.$pending,function(b,c){h.$setValidity(c,null,a)}),f(h.$error,function(b,c){h.$setValidity(c,null,a)}),f(h.$$success,function(b,c){h.$setValidity(c,null,a)}),N(i,a),a.$$parentForm=Bf},ud({ctrl:this,$element:a,set:function(a,b,c){var d=a[b];if(d){var e=d.indexOf(c);-1===e&&d.push(c)}else a[b]=[c]},unset:function(a,b,c){var d=a[b];d&&(N(d,c),0===d.length&&delete a[b])},$animate:e}),h.$setDirty=function(){e.removeClass(a,lg),e.addClass(a,mg),h.$dirty=!0,h.$pristine=!1,h.$$parentForm.$setDirty()},h.$setPristine=function(){e.setClass(a,lg,mg+" "+Cf),h.$dirty=!1,h.$pristine=!0,h.$submitted=!1,f(i,function(a){a.$setPristine()})},h.$setUntouched=function(){f(i,function(a){a.$setUntouched()})},h.$setSubmitted=function(){e.addClass(a,Cf),h.$submitted=!0,h.$$parentForm.$setSubmitted()}}function gd(a){a.$formatters.push(function(b){return a.$isEmpty(b)?b:b.toString()})}function hd(a,b,c,d,e,f){id(a,b,c,d,e,f),gd(d)}function id(a,b,c,d,e,f){var g=zd(b[0].type);if(!e.android){var h=!1;b.on("compositionstart",function(a){h=!0}),b.on("compositionend",function(){h=!1,j()})}var i,j=function(a){if(i&&(f.defer.cancel(i),i=null),!h){var e=b.val(),j=a&&a.type;"password"===g||c.ngTrim&&"false"===c.ngTrim||(e=Td(e)),(d.$viewValue!==e||""===e&&d.$$hasNativeValidators)&&d.$setViewValue(e,j)}};if(e.hasEvent("input"))b.on("input",j);else{var k=function(a,b,c){i||(i=f.defer(function(){i=null,b&&b.value===c||j(a)}))};b.on("keydown",function(a){var b=a.keyCode;91===b||b>15&&19>b||b>=37&&40>=b||k(a,this,this.value)}),e.hasEvent("paste")&&b.on("paste cut",k)}b.on("change",j),Qf[g]&&d.$$hasNativeValidators&&g===c.type&&b.on(Pf,function(a){if(!i){var b=this[yd],c=b.badInput,d=b.typeMismatch;i=f.defer(function(){i=null,(b.badInput!==c||b.typeMismatch!==d)&&j(a)})}}),d.$render=function(){var a=d.$isEmpty(d.$viewValue)?"":d.$viewValue;b.val()!==a&&b.val(a)}}function jd(a,b){if(z(a))return a;if(x(a)){Mf.lastIndex=0;var c=Mf.exec(a);if(c){var d=+c[1],e=+c[2],f=0,g=0,h=0,i=0,j=Vc(d),k=7*(e-1);return b&&(f=b.getHours(),g=b.getMinutes(),h=b.getSeconds(),i=b.getMilliseconds()),new Date(d,0,j.getDate()+k,f,g,h,i)}}return NaN}function kd(a,b){return function(c,d){var e,g;if(z(c))return c;if(x(c)){if('"'==c.charAt(0)&&'"'==c.charAt(c.length-1)&&(c=c.substring(1,c.length-1)),Gf.test(c))return new Date(c);if(a.lastIndex=0,e=a.exec(c))return e.shift(),g=d?{yyyy:d.getFullYear(),MM:d.getMonth()+1,dd:d.getDate(),HH:d.getHours(),mm:d.getMinutes(),ss:d.getSeconds(),sss:d.getMilliseconds()/1e3}:{yyyy:1970,MM:1,dd:1,HH:0,mm:0,ss:0,sss:0},f(e,function(a,c){c=q},h.$observe("min",function(a){q=n(a),i.$validate()})}if(u(h.max)||h.ngMax){var r;i.$validators.max=function(a){return!m(a)||t(r)||d(a)<=r},h.$observe("max",function(a){r=n(a),i.$validate()})}}}function md(a,b,d,e){var f=b[0],g=e.$$hasNativeValidators=v(f.validity);g&&e.$parsers.push(function(a){var d=b.prop(yd)||{};return d.badInput&&!d.typeMismatch?c:a})}function nd(a,b,d,e,f,g){if(md(a,b,d,e),id(a,b,d,e,f,g),e.$$parserName="number",e.$parsers.push(function(a){return e.$isEmpty(a)?null:Jf.test(a)?parseFloat(a):c}),e.$formatters.push(function(a){if(!e.$isEmpty(a)){if(!y(a))throw qg("numfmt","Expected `{0}` to be a number",a);a=a.toString()}return a}),u(d.min)||d.ngMin){var h;e.$validators.min=function(a){return e.$isEmpty(a)||t(h)||a>=h},d.$observe("min",function(a){u(a)&&!y(a)&&(a=parseFloat(a,10)),h=y(a)&&!isNaN(a)?a:c,e.$validate()})}if(u(d.max)||d.ngMax){var i;e.$validators.max=function(a){return e.$isEmpty(a)||t(i)||i>=a},d.$observe("max",function(a){u(a)&&!y(a)&&(a=parseFloat(a,10)),i=y(a)&&!isNaN(a)?a:c,e.$validate()})}}function od(a,b,c,d,e,f){id(a,b,c,d,e,f),gd(d),d.$$parserName="url",d.$validators.url=function(a,b){var c=a||b;return d.$isEmpty(c)||Hf.test(c)}}function pd(a,b,c,d,e,f){id(a,b,c,d,e,f),gd(d),d.$$parserName="email",d.$validators.email=function(a,b){var c=a||b;return d.$isEmpty(c)||If.test(c)}}function qd(a,b,c,d){t(c.name)&&b.attr("name",i());var e=function(a){b[0].checked&&d.$setViewValue(c.value,a&&a.type)};b.on("click",e),d.$render=function(){var a=c.value;b[0].checked=a==d.$viewValue},c.$observe("value",d.$render)}function rd(a,b,c,d,e){var f;if(u(d)){if(f=a(d),!f.constant)throw qg("constexpr","Expected constant expression for `{0}`, but saw `{1}`.",c,d);return f(b)}return e}function sd(a,b,c,d,e,f,g,h){var i=rd(h,a,"ngTrueValue",c.ngTrueValue,!0),j=rd(h,a,"ngFalseValue",c.ngFalseValue,!1),k=function(a){d.$setViewValue(b[0].checked,a&&a.type)};b.on("click",k),d.$render=function(){b[0].checked=d.$viewValue},d.$isEmpty=function(a){return a===!1},d.$formatters.push(function(a){return Q(a,i)}),d.$parsers.push(function(a){return a?i:j})}function td(a,b){return a="ngClass"+a,["$animate",function(c){function d(a,b){var c=[];a:for(var d=0;d0||c[a])&&(c[a]=(c[a]||0)+b,c[a]===+(b>0)&&d.push(a))}),h.data("$classCounts",c),d.join(" ")}function m(a,b){var e=d(b,a),f=d(a,b);e=l(e,1),f=l(f,-1),e&&e.length&&c.addClass(h,e),f&&f.length&&c.removeClass(h,f)}function n(a){if(b===!0||g.$index%2===b){var c=e(a||[]);if(o){if(!Q(a,o)){var d=e(o);m(d,c)}}else j(c)}o=Rd(a)?a.map(function(a){return P(a)}):P(a)}var o;g.$watch(i[a],n,!0),i.$observe("class",function(b){n(g.$eval(i[a]))}),"ngClass"!==a&&g.$watch("$index",function(c,d){var f=1&c;if(f!==(1&d)){var h=e(g.$eval(i[a]));f===b?j(h):k(h)}})}}}]}function ud(a){function b(a,b,i){t(b)?d("$pending",a,i):e("$pending",a,i),H(b)?b?(l(h.$error,a,i),k(h.$$success,a,i)):(k(h.$error,a,i),l(h.$$success,a,i)):(l(h.$error,a,i),l(h.$$success,a,i)),h.$pending?(f(pg,!0),h.$valid=h.$invalid=c,g("",null)):(f(pg,!1),h.$valid=vd(h.$error),h.$invalid=!h.$valid,g("",h.$valid));var j;j=h.$pending&&h.$pending[a]?c:h.$error[a]?!1:h.$$success[a]?!0:null,g(a,j),h.$$parentForm.$setValidity(a,j,h)}function d(a,b,c){h[a]||(h[a]={}),k(h[a],b,c)}function e(a,b,d){h[a]&&l(h[a],b,d),vd(h[a])&&(h[a]=c)}function f(a,b){b&&!j[a]?(m.addClass(i,a),j[a]=!0):!b&&j[a]&&(m.removeClass(i,a),j[a]=!1)}function g(a,b){a=a?"-"+ja(a,"-"):"",f(jg+a,b===!0),f(kg+a,b===!1)}var h=a.ctrl,i=a.$element,j={},k=a.set,l=a.unset,m=a.$animate;j[kg]=!(j[jg]=i.hasClass(jg)),h.$setValidity=b}function vd(a){if(a)for(var b in a)if(a.hasOwnProperty(b))return!1;return!0}function wd(a){a[0].hasAttribute("selected")&&(a[0].selected=!0)}var xd=/^\/(.+)\/([a-z]*)$/,yd="validity",zd=function(a){return x(a)?a.toLowerCase():a},Ad=Object.prototype.hasOwnProperty,Bd=function(a){return x(a)?a.toUpperCase():a},Cd=function(a){return x(a)?a.replace(/[A-Z]/g,function(a){return String.fromCharCode(32|a.charCodeAt(0))}):a},Dd=function(a){return x(a)?a.replace(/[a-z]/g,function(a){return String.fromCharCode(-33&a.charCodeAt(0))}):a};"i"!=="I".toLowerCase()&&(zd=Cd,Bd=Dd);var Ed,Fd,Gd,Hd,Id=[].slice,Jd=[].splice,Kd=[].push,Ld=Object.prototype.toString,Md=Object.getPrototypeOf,Nd=d("ng"),Od=a.angular||(a.angular={}),Pd=0;Ed=b.documentMode,p.$inject=[],q.$inject=[];var Qd,Rd=Array.isArray,Sd=/^\[object (?:Uint8|Uint8Clamped|Uint16|Uint32|Int8|Int16|Int32|Float32|Float64)Array\]$/,Td=function(a){return x(a)?a.trim():a},Ud=function(a){return a.replace(/([-()\[\]{}+?*.$\^|,:#c;++c)if(d=Yd[c],a=b.querySelector("["+d.replace(":","\\:")+"jq]")){e=a.getAttribute(d+"jq");break}return Wd.name_=e},Xd=/:/g,Yd=["ng-","data-ng-","ng:","x-ng-"],Zd=/[A-Z]/g,$d=!1,_d=1,ae=2,be=3,ce=8,de=9,ee=11,fe={full:"1.4.14",major:1,minor:4,dot:14,codeName:"material-distinction"};Da.expando="ng339";var ge=Da.cache={},he=1,ie=function(a,b,c){a.addEventListener(b,c,!1)},je=function(a,b,c){a.removeEventListener(b,c,!1)};Da._data=function(a){return this.cache[a[this.expando]]||{}};var ke=/([\:\-\_]+(.))/g,le=/^moz([A-Z])/,me={mouseleave:"mouseout",mouseenter:"mouseover"},ne=d("jqLite"),oe=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,pe=/<|&#?\w+;/,qe=/<([\w:-]+)/,re=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,se={option:[1,'"], thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};se.optgroup=se.option,se.tbody=se.tfoot=se.colgroup=se.caption=se.thead,se.th=se.td;var te=Node.prototype.contains||function(a){return!!(16&this.compareDocumentPosition(a))},ue=Da.prototype={ready:function(c){function d(){e||(e=!0,c())}var e=!1;"complete"===b.readyState?setTimeout(d):(this.on("DOMContentLoaded",d),Da(a).on("load",d))},toString:function(){var a=[];return f(this,function(b){a.push(""+b)}),"["+a.join(", ")+"]"},eq:function(a){return Fd(a>=0?this[a]:this[this.length+a])},length:0,push:Kd,sort:[].sort,splice:[].splice},ve={};f("multiple,selected,checked,disabled,readOnly,required,open".split(","),function(a){ve[zd(a)]=a});var we={};f("input,select,option,textarea,button,form,details".split(","),function(a){we[a]=!0});var xe={ngMinlength:"minlength",ngMaxlength:"maxlength",ngMin:"min",ngMax:"max",ngPattern:"pattern"};f({data:Ja,removeData:Ha,hasData:za},function(a,b){Da[b]=a}),f({data:Ja,inheritedData:Pa,scope:function(a){return Fd.data(a,"$scope")||Pa(a.parentNode||a,["$isolateScope","$scope"])},isolateScope:function(a){return Fd.data(a,"$isolateScope")||Fd.data(a,"$isolateScopeNoTemplate")},controller:Oa,injector:function(a){return Pa(a,"$injector")},removeAttr:function(a,b){a.removeAttribute(b)},hasClass:Ka,css:function(a,b,c){return b=wa(b),u(c)?void(a.style[b]=c):a.style[b]},attr:function(a,b,d){var e=a.nodeType;if(e!==be&&e!==ae&&e!==ce){var f=zd(b);if(ve[f]){if(!u(d))return a[b]||(a.attributes.getNamedItem(b)||p).specified?f:c;d?(a[b]=!0,a.setAttribute(b,f)):(a[b]=!1,a.removeAttribute(f))}else if(u(d))a.setAttribute(b,d);else if(a.getAttribute){var g=a.getAttribute(b,2);return null===g?c:g}}},prop:function(a,b,c){return u(c)?void(a[b]=c):a[b]},text:function(){function a(a,b){if(t(b)){var c=a.nodeType;return c===_d||c===be?a.textContent:""}a.textContent=b}return a.$dv="",a}(),val:function(a,b){if(t(b)){if(a.multiple&&"select"===M(a)){var c=[];return f(a.options,function(a){a.selected&&c.push(a.value||a.text)}),0===c.length?null:c}return a.value}a.value=b},html:function(a,b){return t(b)?a.innerHTML:(Fa(a,!0),void(a.innerHTML=b))},empty:Qa},function(a,b){Da.prototype[b]=function(b,c){var d,e,f=this.length;if(a!==Qa&&t(2==a.length&&a!==Ka&&a!==Oa?b:c)){if(v(b)){for(d=0;f>d;d++)if(a===Ja)a(this[d],b);else for(e in b)a(this[d],e,b[e]);return this}for(var g=a.$dv,h=t(g)?Math.min(f,1):f,i=0;h>i;i++){var j=a(this[i],b,c);g=g?g+j:j}return g}for(d=0;f>d;d++)a(this[d],b,c);return this}}),f({removeData:Ha,on:function(a,b,d,e){if(u(e))throw ne("onargs","jqLite#on() does not support the `selector` or `eventData` parameters");if(ya(a)){var f=Ia(a,!0),g=f.events,h=f.handle;h||(h=f.handle=Va(a,g));for(var i=b.indexOf(" ")>=0?b.split(" "):[b],j=i.length,k=function(b,c,e){var f=g[b];f||(f=g[b]=[],f.specialHandlerWrapper=c,"$destroy"===b||e||ie(a,b,h)),f.push(d)};j--;)b=i[j],me[b]?(k(me[b],Xa),k(b,c,!0)):k(b)}},off:Ga,one:function(a,b,c){a=Fd(a),a.on(b,function d(){a.off(b,c),a.off(b,d)}),a.on(b,c)},replaceWith:function(a,b){var c,d=a.parentNode;Fa(a),f(new Da(b),function(b){c?d.insertBefore(b,c.nextSibling):d.replaceChild(b,a),c=b})},children:function(a){var b=[];return f(a.childNodes,function(a){a.nodeType===_d&&b.push(a)}),b},contents:function(a){return a.contentDocument||a.childNodes||[]},append:function(a,b){var c=a.nodeType;if(c===_d||c===ee){b=new Da(b);for(var d=0,e=b.length;e>d;d++){var f=b[d];a.appendChild(f)}}},prepend:function(a,b){if(a.nodeType===_d){var c=a.firstChild;f(new Da(b),function(b){a.insertBefore(b,c)})}},wrap:function(a,b){Ca(a,Fd(b).eq(0).clone()[0])},remove:Ra,detach:function(a){Ra(a,!0)},after:function(a,b){var c=a,d=a.parentNode;b=new Da(b);for(var e=0,f=b.length;f>e;e++){var g=b[e];d.insertBefore(g,c.nextSibling),c=g}},addClass:Ma,removeClass:La,toggleClass:function(a,b,c){b&&f(b.split(" "),function(b){var d=c;t(d)&&(d=!Ka(a,b)),(d?Ma:La)(a,b)})},parent:function(a){var b=a.parentNode;return b&&b.nodeType!==ee?b:null},next:function(a){return a.nextElementSibling},find:function(a,b){return a.getElementsByTagName?a.getElementsByTagName(b):[]},clone:Ea,triggerHandler:function(a,b,c){var d,e,g,h=b.type||b,i=Ia(a),j=i&&i.events,k=j&&j[h];k&&(d={preventDefault:function(){this.defaultPrevented=!0},isDefaultPrevented:function(){return this.defaultPrevented===!0},stopImmediatePropagation:function(){this.immediatePropagationStopped=!0},isImmediatePropagationStopped:function(){return this.immediatePropagationStopped===!0},stopPropagation:p,type:h,target:a},b.type&&(d=l(d,b)),e=P(k),g=c?[d].concat(c):[d],f(e,function(b){d.isImmediatePropagationStopped()||b.apply(a,g)}))}},function(a,b){Da.prototype[b]=function(b,c,d){for(var e,f=0,g=this.length;g>f;f++)t(e)?(e=a(this[f],b,c,d),u(e)&&(e=Fd(e))):Na(e,a(this[f],b,c,d));return u(e)?e:this},Da.prototype.bind=Da.prototype.on,Da.prototype.unbind=Da.prototype.off}),$a.prototype={put:function(a,b){this[Za(a,this.nextUid)]=b},get:function(a){return this[Za(a,this.nextUid)]},remove:function(a){var b=this[a=Za(a,this.nextUid)];return delete this[a],b}};var ye=[function(){this.$get=[function(){return $a}]}],ze=/^[^\(]*\(\s*([^\)]*)\)/m,Ae=/,/,Be=/^\s*(_?)(\S+?)\1\s*$/,Ce=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm,De=d("$injector");bb.$$annotate=ab;var Ee=d("$animate"),Fe=1,Ge="ng-animate",He=function(){this.$get=function(){}},Ie=function(){var a=new $a,b=[];this.$get=["$$AnimateRunner","$rootScope",function(c,d){function e(a,b,c){var d=!1;return b&&(b=x(b)?b.split(" "):Rd(b)?b:[],f(b,function(b){b&&(d=!0,a[b]=c)})),d}function g(){f(b,function(b){var c=a.get(b);if(c){var d=fb(b.attr("class")),e="",g="";f(c,function(a,b){var c=!!d[b];a!==c&&(a?e+=(e.length?" ":"")+b:g+=(g.length?" ":"")+b)}),f(b,function(a){e&&Ma(a,e),g&&La(a,g)}),a.remove(b)}}),b.length=0}function h(c,f,h){var i=a.get(c)||{},j=e(i,f,!0),k=e(i,h,!1);(j||k)&&(a.put(c,i),b.push(c),1===b.length&&d.$$postDigest(g))}return{enabled:p,on:p,off:p,pin:p,push:function(a,b,d,e){e&&e(),d=d||{},d.from&&a.css(d.from),d.to&&a.css(d.to),(d.addClass||d.removeClass)&&h(a,d.addClass,d.removeClass);var f=new c;return f.complete(),f}}}]},Je=["$provide",function(a){var b=this;this.$$registeredAnimations=Object.create(null),this.register=function(c,d){if(c&&"."!==c.charAt(0))throw Ee("notcsel","Expecting class selector starting with '.' got '{0}'.",c);var e=c+"-animation";b.$$registeredAnimations[c.substr(1)]=e,a.factory(e,d)},this.classNameFilter=function(a){if(1===arguments.length&&(this.$$classNameFilter=a instanceof RegExp?a:null,this.$$classNameFilter)){var b=new RegExp("(\\s+|\\/)"+Ge+"(\\s+|\\/)");if(b.test(this.$$classNameFilter.toString()))throw Ee("nongcls",'$animateProvider.classNameFilter(regex) prohibits accepting a regex value which matches/contains the "{0}" CSS class.',Ge)}return this.$$classNameFilter},this.$get=["$$animateQueue",function(a){function b(a,b,c){if(c){var d=eb(c);!d||d.parentNode||d.previousElementSibling||(c=null)}c?c.after(a):b.prepend(a)}return{on:a.on,off:a.off,pin:a.pin,enabled:a.enabled,cancel:function(a){a.end&&a.end()},enter:function(c,d,e,f){return d=d&&Fd(d),e=e&&Fd(e),d=d||e.parent(),b(c,d,e),a.push(c,"enter",gb(f))},move:function(c,d,e,f){return d=d&&Fd(d),e=e&&Fd(e),d=d||e.parent(),b(c,d,e),a.push(c,"move",gb(f))},leave:function(b,c){return a.push(b,"leave",gb(c),function(){b.remove()})},addClass:function(b,c,d){return d=gb(d),d.addClass=db(d.addclass,c),a.push(b,"addClass",d)},removeClass:function(b,c,d){return d=gb(d),d.removeClass=db(d.removeClass,c),a.push(b,"removeClass",d)},setClass:function(b,c,d,e){return e=gb(e),e.addClass=db(e.addClass,c),e.removeClass=db(e.removeClass,d),a.push(b,"setClass",e)},animate:function(b,c,d,e,f){return f=gb(f),f.from=f.from?l(f.from,c):c,f.to=f.to?l(f.to,d):d,e=e||"ng-inline-animate",f.tempClasses=db(f.tempClasses,e),a.push(b,"animate",f)}}}]}],Ke=function(){this.$get=["$$rAF",function(a){function b(b){c.push(b),c.length>1||a(function(){for(var a=0;a <= >= && || ! = |".split(" "),function(a){gf[a]=!0});var hf={n:"\n",f:"\f",r:"\r",t:" ",v:" ","'":"'",'"':'"'},jf=function(a){this.options=a};jf.prototype={constructor:jf,lex:function(a){for(this.text=a,this.index=0,this.tokens=[];this.index="0"&&"9">=a&&"string"==typeof a},isWhitespace:function(a){return" "===a||"\r"===a||" "===a||"\n"===a||" "===a||" "===a},isIdent:function(a){return a>="a"&&"z">=a||a>="A"&&"Z">=a||"_"===a||"$"===a},isExpOperator:function(a){return"-"===a||"+"===a||this.isNumber(a)},throwError:function(a,b,c){c=c||this.index;var d=u(b)?"s "+b+"-"+this.index+" ["+this.text.substring(b,c)+"]":" "+c;throw cf("lexerr","Lexer Error: {0} at column{1} in expression [{2}].",a,d,this.text)},readNumber:function(){for(var a="",b=this.index;this.index0&&!this.peek("}",")",";","]")&&a.push(this.expressionStatement()),!this.expect(";"))return{type:kf.Program,body:a}},expressionStatement:function(){return{type:kf.ExpressionStatement,expression:this.filterChain()}},filterChain:function(){for(var a,b=this.expression();a=this.expect("|");)b=this.filter(b);return b},expression:function(){return this.assignment()},assignment:function(){var a=this.ternary();return this.expect("=")&&(a={type:kf.AssignmentExpression,left:a,right:this.assignment(),operator:"="}),a},ternary:function(){var a,b,c=this.logicalOR();return this.expect("?")&&(a=this.expression(),this.consume(":"))?(b=this.expression(),{type:kf.ConditionalExpression,test:c,alternate:a,consequent:b}):c},logicalOR:function(){for(var a=this.logicalAND();this.expect("||");)a={type:kf.LogicalExpression,operator:"||",left:a,right:this.logicalAND()};return a},logicalAND:function(){for(var a=this.equality();this.expect("&&");)a={type:kf.LogicalExpression,operator:"&&",left:a,right:this.equality()};return a},equality:function(){for(var a,b=this.relational();a=this.expect("==","!=","===","!==");)b={type:kf.BinaryExpression,operator:a.text,left:b,right:this.relational()};return b},relational:function(){for(var a,b=this.additive();a=this.expect("<",">","<=",">=");)b={type:kf.BinaryExpression,operator:a.text,left:b,right:this.additive()};return b},additive:function(){for(var a,b=this.multiplicative();a=this.expect("+","-");)b={type:kf.BinaryExpression,operator:a.text,left:b,right:this.multiplicative()};return b},multiplicative:function(){for(var a,b=this.unary();a=this.expect("*","/","%");)b={type:kf.BinaryExpression,operator:a.text,left:b,right:this.unary()};return b},unary:function(){var a;return(a=this.expect("+","-","!"))?{type:kf.UnaryExpression,operator:a.text,prefix:!0,argument:this.unary()}:this.primary()},primary:function(){var a;this.expect("(")?(a=this.filterChain(),this.consume(")")):this.expect("[")?a=this.arrayDeclaration():this.expect("{")?a=this.object():this.constants.hasOwnProperty(this.peek().text)?a=O(this.constants[this.consume().text]):this.peek().identifier?a=this.identifier():this.peek().constant?a=this.constant():this.throwError("not a primary expression",this.peek());for(var b;b=this.expect("(","[",".");)"("===b.text?(a={type:kf.CallExpression,callee:a,arguments:this.parseArguments()},this.consume(")")):"["===b.text?(a={type:kf.MemberExpression,object:a,property:this.expression(),computed:!0},this.consume("]")):"."===b.text?a={type:kf.MemberExpression,object:a,property:this.identifier(),computed:!1}:this.throwError("IMPOSSIBLE");return a},filter:function(a){for(var b=[a],c={type:kf.CallExpression,callee:this.identifier(),arguments:b,filter:!0};this.expect(":");)b.push(this.expression());return c},parseArguments:function(){var a=[];if(")"!==this.peekToken().text)do a.push(this.expression());while(this.expect(","));return a},identifier:function(){var a=this.consume();return a.identifier||this.throwError("is not a valid identifier",a),{type:kf.Identifier,name:a.text}},constant:function(){return{type:kf.Literal,value:this.consume().value}},arrayDeclaration:function(){var a=[];if("]"!==this.peekToken().text)do{if(this.peek("]"))break;a.push(this.expression())}while(this.expect(","));return this.consume("]"),{type:kf.ArrayExpression,elements:a}},object:function(){var a,b=[];if("}"!==this.peekToken().text)do{if(this.peek("}"))break;a={type:kf.Property,kind:"init"},this.peek().constant?a.key=this.constant():this.peek().identifier?a.key=this.identifier():this.throwError("invalid key",this.peek()),this.consume(":"),a.value=this.expression(),b.push(a)}while(this.expect(","));return this.consume("}"),{type:kf.ObjectExpression,properties:b}},throwError:function(a,b){throw cf("syntax","Syntax Error: Token '{0}' {1} at column {2} of the expression [{3}] starting at [{4}].",b.text,a,b.index+1,this.text,this.text.substring(b.index))},consume:function(a){if(0===this.tokens.length)throw cf("ueoe","Unexpected end of expression: {0}",this.text);var b=this.expect(a);return b||this.throwError("is unexpected, expecting ["+a+"]",this.peek()),b},peekToken:function(){if(0===this.tokens.length)throw cf("ueoe","Unexpected end of expression: {0}",this.text);return this.tokens[0]},peek:function(a,b,c,d){return this.peekAhead(0,a,b,c,d)},peekAhead:function(a,b,c,d,e){if(this.tokens.length>a){var f=this.tokens[a],g=f.text;if(g===b||g===c||g===d||g===e||!b&&!c&&!d&&!e)return f}return!1},expect:function(a,b,c,d){var e=this.peek(a,b,c,d);return e?(this.tokens.shift(),e):!1},constants:{"true":{type:kf.Literal,value:!0},"false":{type:kf.Literal,value:!1},"null":{type:kf.Literal,value:null},undefined:{type:kf.Literal,value:c},"this":{type:kf.ThisExpression}}},jc.prototype={compile:function(a,b){var d=this,e=this.astBuilder.ast(a);this.state={nextId:0,filters:{},expensiveChecks:b,fn:{vars:[],body:[],own:{}},assign:{vars:[],body:[],own:{}},inputs:[]},dc(e,d.$filter);var g,h="";if(this.stage="assign",g=gc(e)){this.state.computing="assign";var i=this.nextId();this.recurse(g,i),this.return_(i),h="fn.assign="+this.generateFunction("assign","s,v,l")}var j=ec(e.body);d.stage="inputs",f(j,function(a,b){var c="fn"+b;d.state[c]={vars:[],body:[],own:{}},d.state.computing=c;var e=d.nextId();d.recurse(a,e),d.return_(e),d.state.inputs.push(c),a.watchId=b}),this.state.computing="fn",this.stage="main",this.recurse(e);var k='"'+this.USE+" "+this.STRICT+'";\n'+this.filterPrefix()+"var fn="+this.generateFunction("fn","s,l,a,i")+h+this.watchFns()+"return fn;",l=new Function("$filter","ensureSafeMemberName","ensureSafeObject","ensureSafeFunction","getStringValue","ensureSafeAssignContext","ifDefined","plus","text",k)(this.$filter,Xb,Zb,$b,Yb,_b,ac,bc,a);return this.state=this.stage=c,l.literal=hc(e),l.constant=ic(e),l},USE:"use",STRICT:"strict",watchFns:function(){var a=[],b=this.state.inputs,c=this;return f(b,function(b){a.push("var "+b+"="+c.generateFunction(b,"s"))}),b.length&&a.push("fn.inputs=["+b.join(",")+"];"),a.join("")},generateFunction:function(a,b){return"function("+b+"){"+this.varsPrefix(a)+this.body(a)+"};"},filterPrefix:function(){var a=[],b=this;return f(this.state.filters,function(c,d){a.push(c+"=$filter("+b.escape(d)+")")}),a.length?"var "+a.join(",")+";":""},varsPrefix:function(a){return this.state[a].vars.length?"var "+this.state[a].vars.join(",")+";":""},body:function(a){return this.state[a].body.join("")},recurse:function(a,b,d,e,g,h){var i,j,k,l,m=this;if(e=e||p,!h&&u(a.watchId))return b=b||this.nextId(),void this.if_("i",this.lazyAssign(b,this.computedMember("i",a.watchId)),this.lazyRecurse(a,b,d,e,g,!0));switch(a.type){case kf.Program:f(a.body,function(b,d){m.recurse(b.expression,c,c,function(a){j=a}),d!==a.body.length-1?m.current().body.push(j,";"):m.return_(j)});break;case kf.Literal:l=this.escape(a.value),this.assign(b,l),e(l);break;case kf.UnaryExpression:this.recurse(a.argument,c,c,function(a){j=a}),l=a.operator+"("+this.ifDefined(j,0)+")",this.assign(b,l),e(l);break;case kf.BinaryExpression:this.recurse(a.left,c,c,function(a){i=a}),this.recurse(a.right,c,c,function(a){j=a}),l="+"===a.operator?this.plus(i,j):"-"===a.operator?this.ifDefined(i,0)+a.operator+this.ifDefined(j,0):"("+i+")"+a.operator+"("+j+")",this.assign(b,l),e(l);break;case kf.LogicalExpression:b=b||this.nextId(),m.recurse(a.left,b),m.if_("&&"===a.operator?b:m.not(b),m.lazyRecurse(a.right,b)),e(b);break;case kf.ConditionalExpression:b=b||this.nextId(),m.recurse(a.test,b),m.if_(b,m.lazyRecurse(a.alternate,b),m.lazyRecurse(a.consequent,b)),e(b);break;case kf.Identifier:b=b||this.nextId(),d&&(d.context="inputs"===m.stage?"s":this.assign(this.nextId(),this.getHasOwnProperty("l",a.name)+"?l:s"),d.computed=!1,d.name=a.name),Xb(a.name),m.if_("inputs"===m.stage||m.not(m.getHasOwnProperty("l",a.name)),function(){m.if_("inputs"===m.stage||"s",function(){g&&1!==g&&m.if_(m.not(m.nonComputedMember("s",a.name)),m.lazyAssign(m.nonComputedMember("s",a.name),"{}")),m.assign(b,m.nonComputedMember("s",a.name))})},b&&m.lazyAssign(b,m.nonComputedMember("l",a.name))),(m.state.expensiveChecks||lc(a.name))&&m.addEnsureSafeObject(b),e(b);break;case kf.MemberExpression:i=d&&(d.context=this.nextId())||this.nextId(),b=b||this.nextId(),m.recurse(a.object,i,c,function(){m.if_(m.notNull(i),function(){g&&1!==g&&m.addEnsureSafeAssignContext(i),a.computed?(j=m.nextId(),m.recurse(a.property,j),m.getStringValue(j),m.addEnsureSafeMemberName(j),g&&1!==g&&m.if_(m.not(m.computedMember(i,j)),m.lazyAssign(m.computedMember(i,j),"{}")),l=m.ensureSafeObject(m.computedMember(i,j)),m.assign(b,l),d&&(d.computed=!0,d.name=j)):(Xb(a.property.name),g&&1!==g&&m.if_(m.not(m.nonComputedMember(i,a.property.name)),m.lazyAssign(m.nonComputedMember(i,a.property.name),"{}")),l=m.nonComputedMember(i,a.property.name),(m.state.expensiveChecks||lc(a.property.name))&&(l=m.ensureSafeObject(l)),m.assign(b,l),d&&(d.computed=!1,d.name=a.property.name))},function(){m.assign(b,"undefined")}),e(b)},!!g);break;case kf.CallExpression:b=b||this.nextId(),a.filter?(j=m.filter(a.callee.name),k=[],f(a.arguments,function(a){var b=m.nextId();m.recurse(a,b),k.push(b)}),l=j+"("+k.join(",")+")",m.assign(b,l),e(b)):(j=m.nextId(),i={},k=[],m.recurse(a.callee,j,i,function(){m.if_(m.notNull(j),function(){m.addEnsureSafeFunction(j),f(a.arguments,function(a){m.recurse(a,m.nextId(),c,function(a){k.push(m.ensureSafeObject(a))})}),i.name?(m.state.expensiveChecks||m.addEnsureSafeObject(i.context),l=m.member(i.context,i.name,i.computed)+"("+k.join(",")+")"):l=j+"("+k.join(",")+")",l=m.ensureSafeObject(l),m.assign(b,l)},function(){m.assign(b,"undefined")}),e(b)}));break;case kf.AssignmentExpression:if(j=this.nextId(),i={},!fc(a.left))throw cf("lval","Trying to assign a value to a non l-value");this.recurse(a.left,c,i,function(){m.if_(m.notNull(i.context),function(){m.recurse(a.right,j),m.addEnsureSafeObject(m.member(i.context,i.name,i.computed)),m.addEnsureSafeAssignContext(i.context),l=m.member(i.context,i.name,i.computed)+a.operator+j,m.assign(b,l),e(b||l)})},1);break;case kf.ArrayExpression:k=[],f(a.elements,function(a){m.recurse(a,m.nextId(),c,function(a){k.push(a)})}),l="["+k.join(",")+"]",this.assign(b,l),e(l);break;case kf.ObjectExpression:k=[],f(a.properties,function(a){m.recurse(a.value,m.nextId(),c,function(b){k.push(m.escape(a.key.type===kf.Identifier?a.key.name:""+a.key.value)+":"+b)})}),l="{"+k.join(",")+"}",this.assign(b,l),e(l);break;case kf.ThisExpression:this.assign(b,"s"),e("s");break;case kf.NGValueParameter:this.assign(b,"v"),e("v")}},getHasOwnProperty:function(a,b){var c=a+"."+b,d=this.current().own;return d.hasOwnProperty(c)||(d[c]=this.nextId(!1,a+"&&("+this.escape(b)+" in "+a+")")),d[c]},assign:function(a,b){return a?(this.current().body.push(a,"=",b,";"),a):void 0},filter:function(a){return this.state.filters.hasOwnProperty(a)||(this.state.filters[a]=this.nextId(!0)),this.state.filters[a]},ifDefined:function(a,b){return"ifDefined("+a+","+this.escape(b)+")"},plus:function(a,b){return"plus("+a+","+b+")"},return_:function(a){this.current().body.push("return ",a,";")},if_:function(a,b,c){if(a===!0)b();else{var d=this.current().body;d.push("if(",a,"){"),b(),d.push("}"),c&&(d.push("else{"),c(),d.push("}"))}},not:function(a){return"!("+a+")"},notNull:function(a){return a+"!=null"},nonComputedMember:function(a,b){return a+"."+b},computedMember:function(a,b){return a+"["+b+"]"},member:function(a,b,c){return c?this.computedMember(a,b):this.nonComputedMember(a,b)},addEnsureSafeObject:function(a){this.current().body.push(this.ensureSafeObject(a),";")},addEnsureSafeMemberName:function(a){this.current().body.push(this.ensureSafeMemberName(a),";")},addEnsureSafeFunction:function(a){this.current().body.push(this.ensureSafeFunction(a),";")},addEnsureSafeAssignContext:function(a){this.current().body.push(this.ensureSafeAssignContext(a),";")},ensureSafeObject:function(a){return"ensureSafeObject("+a+",text)"},ensureSafeMemberName:function(a){return"ensureSafeMemberName("+a+",text)"},ensureSafeFunction:function(a){return"ensureSafeFunction("+a+",text)"},getStringValue:function(a){this.assign(a,"getStringValue("+a+",text)")},ensureSafeAssignContext:function(a){return"ensureSafeAssignContext("+a+",text)"},lazyRecurse:function(a,b,c,d,e,f){var g=this;return function(){g.recurse(a,b,c,d,e,f)}},lazyAssign:function(a,b){var c=this;return function(){c.assign(a,b)}},stringEscapeRegex:/[^ a-zA-Z0-9]/g,stringEscapeFn:function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)},escape:function(a){if(x(a))return"'"+a.replace(this.stringEscapeRegex,this.stringEscapeFn)+"'";if(y(a))return a.toString();if(a===!0)return"true";if(a===!1)return"false";if(null===a)return"null";if("undefined"==typeof a)return"undefined";throw cf("esc","IMPOSSIBLE")},nextId:function(a,b){var c="v"+this.state.nextId++;return a||this.current().vars.push(c+(b?"="+b:"")),c},current:function(){return this.state[this.state.computing]}},kc.prototype={compile:function(a,b){var c=this,d=this.astBuilder.ast(a);this.expression=a,this.expensiveChecks=b,dc(d,c.$filter);var e,g;(e=gc(d))&&(g=this.recurse(e));var h,i=ec(d.body);i&&(h=[],f(i,function(a,b){var d=c.recurse(a);a.input=d,h.push(d),a.watchId=b}));var j=[];f(d.body,function(a){j.push(c.recurse(a.expression))});var k=0===d.body.length?function(){}:1===d.body.length?j[0]:function(a,b){var c;return f(j,function(d){c=d(a,b)}),c};return g&&(k.assign=function(a,b,c){return g(a,c,b)}),h&&(k.inputs=h),k.literal=hc(d),k.constant=ic(d),k},recurse:function(a,b,d){var e,g,h,i=this;if(a.input)return this.inputs(a.input,a.watchId);switch(a.type){case kf.Literal:return this.value(a.value,b);case kf.UnaryExpression:return g=this.recurse(a.argument),this["unary"+a.operator](g,b);case kf.BinaryExpression:return e=this.recurse(a.left),g=this.recurse(a.right),this["binary"+a.operator](e,g,b);case kf.LogicalExpression:return e=this.recurse(a.left),g=this.recurse(a.right),this["binary"+a.operator](e,g,b);case kf.ConditionalExpression:return this["ternary?:"](this.recurse(a.test),this.recurse(a.alternate),this.recurse(a.consequent),b);case kf.Identifier:return Xb(a.name,i.expression),i.identifier(a.name,i.expensiveChecks||lc(a.name),b,d,i.expression);case kf.MemberExpression:return e=this.recurse(a.object,!1,!!d),a.computed||(Xb(a.property.name,i.expression),g=a.property.name),a.computed&&(g=this.recurse(a.property)),a.computed?this.computedMember(e,g,b,d,i.expression):this.nonComputedMember(e,g,i.expensiveChecks,b,d,i.expression);case kf.CallExpression:return h=[],f(a.arguments,function(a){h.push(i.recurse(a))}),a.filter&&(g=this.$filter(a.callee.name)),a.filter||(g=this.recurse(a.callee,!0)),a.filter?function(a,d,e,f){for(var i=[],j=0;j":function(a,b,c){return function(d,e,f,g){var h=a(d,e,f,g)>b(d,e,f,g);return c?{value:h}:h}},"binary<=":function(a,b,c){return function(d,e,f,g){var h=a(d,e,f,g)<=b(d,e,f,g);return c?{value:h}:h}},"binary>=":function(a,b,c){return function(d,e,f,g){var h=a(d,e,f,g)>=b(d,e,f,g);return c?{value:h}:h}},"binary&&":function(a,b,c){return function(d,e,f,g){var h=a(d,e,f,g)&&b(d,e,f,g);return c?{value:h}:h}},"binary||":function(a,b,c){return function(d,e,f,g){var h=a(d,e,f,g)||b(d,e,f,g);return c?{value:h}:h}},"ternary?:":function(a,b,c,d){return function(e,f,g,h){var i=a(e,f,g,h)?b(e,f,g,h):c(e,f,g,h);return d?{value:i}:i}},value:function(a,b){return function(){return b?{context:c,name:c,value:a}:a}},identifier:function(a,b,d,e,f){return function(g,h,i,j){var k=h&&a in h?h:g;e&&1!==e&&k&&!k[a]&&(k[a]={});var l=k?k[a]:c;return b&&Zb(l,f),d?{context:k,name:a,value:l}:l}},computedMember:function(a,b,c,d,e){return function(f,g,h,i){var j,k,l=a(f,g,h,i);return null!=l&&(j=b(f,g,h,i),j=Yb(j),Xb(j,e),d&&1!==d&&(_b(l),l&&!l[j]&&(l[j]={})),k=l[j],Zb(k,e)),c?{context:l,name:j,value:k}:k}},nonComputedMember:function(a,b,d,e,f,g){return function(h,i,j,k){var l=a(h,i,j,k);f&&1!==f&&(_b(l),l&&!l[b]&&(l[b]={}));var m=null!=l?l[b]:c;return(d||lc(b))&&Zb(m,g),e?{context:l,name:b,value:m}:m}},inputs:function(a,b){return function(c,d,e,f){return f?f[b]:a(c,d,e)}}};var lf=function(a,b,c){this.lexer=a,this.$filter=b,this.options=c,this.ast=new kf(this.lexer),this.astCompiler=c.csp?new kc(this.ast,b):new jc(this.ast,b)};lf.prototype={constructor:lf,parse:function(a){return this.astCompiler.compile(a,this.options.expensiveChecks)}};var mf=Object.prototype.valueOf,nf=d("$sce"),of={HTML:"html",CSS:"css",URL:"url",RESOURCE_URL:"resourceUrl",JS:"js"},Ne=d("$compile"),pf=b.createElement("a"),qf=Cc(a.location.href);Fc.$inject=["$document"],Hc.$inject=["$provide"];var rf=22,sf=".",tf="0";Mc.$inject=["$locale"],Nc.$inject=["$locale"];var uf={yyyy:Sc("FullYear",4),yy:Sc("FullYear",2,0,!0),y:Sc("FullYear",1),MMMM:Tc("Month"),MMM:Tc("Month",!0),MM:Sc("Month",2,1),M:Sc("Month",1,1),dd:Sc("Date",2),d:Sc("Date",1),HH:Sc("Hours",2),H:Sc("Hours",1),hh:Sc("Hours",2,-12),h:Sc("Hours",1,-12),mm:Sc("Minutes",2),m:Sc("Minutes",1),ss:Sc("Seconds",2),s:Sc("Seconds",1),sss:Sc("Milliseconds",3),EEEE:Tc("Day"),EEE:Tc("Day",!0),a:Yc,Z:Uc,ww:Xc(2),w:Xc(1),G:Zc,GG:Zc,GGG:Zc,GGGG:$c},vf=/((?:[^yMdHhmsaZEwG']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z|G+|w+))(.*)/,wf=/^\-?\d+$/;_c.$inject=["$locale"];var xf=r(zd),yf=r(Bd);cd.$inject=["$parse"];var zf=r({restrict:"E",compile:function(a,b){return b.href||b.xlinkHref?void 0:function(a,b){if("a"===b[0].nodeName.toLowerCase()){var c="[object SVGAnimatedString]"===Ld.call(b.prop("href"))?"xlink:href":"href";b.on("click",function(a){b.attr(c)||a.preventDefault()})}}}}),Af={};f(ve,function(a,b){function c(a,c,e){a.$watch(e[d],function(a){e.$set(b,!!a)})}if("multiple"!=a){var d=mb("ng-"+b),e=c;"checked"===a&&(e=function(a,b,e){e.ngModel!==e[d]&&c(a,b,e)}),Af[d]=function(){return{restrict:"A",priority:100,link:e}}}}),f(xe,function(a,b){Af[b]=function(){return{priority:100,link:function(a,c,d){if("ngPattern"===b&&"/"==d.ngPattern.charAt(0)){var e=d.ngPattern.match(xd);if(e)return void d.$set("ngPattern",new RegExp(e[1],e[2]))}a.$watch(d[b],function(a){d.$set(b,a)})}}}}),f(["src","srcset","href"],function(a){var b=mb("ng-"+a);Af[b]=function(){return{priority:99,link:function(c,d,e){var f=a,g=a;"href"===a&&"[object SVGAnimatedString]"===Ld.call(d.prop("href"))&&(g="xlinkHref",e.$attr[g]="xlink:href",f=null),e.$observe(b,function(b){return b?(e.$set(g,b),void(Ed&&f&&d.prop(f,e[g]))):void("href"===a&&e.$set(g,null))})}}}});var Bf={$addControl:p,$$renameControl:ed,$removeControl:p,$setValidity:p,$setDirty:p,$setPristine:p,$setSubmitted:p},Cf="ng-submitted";fd.$inject=["$element","$attrs","$scope","$animate","$interpolate"];var Df=function(a){return["$timeout","$parse",function(b,d){function e(a){return""===a?d('this[""]').assign:d(a).assign||p}var f={name:"form",restrict:a?"EAC":"E",require:["form","^^?form"],controller:fd,compile:function(d,f){d.addClass(lg).addClass(jg);var g=f.name?"name":a&&f.ngForm?"ngForm":!1;return{pre:function(a,d,f,h){var i=h[0];if(!("action"in f)){var j=function(b){a.$apply(function(){i.$commitViewValue(),i.$setSubmitted()}),b.preventDefault()};ie(d[0],"submit",j),d.on("$destroy",function(){b(function(){je(d[0],"submit",j)},0,!1)})}var k=h[1]||i.$$parentForm;k.$addControl(i);var m=g?e(i.$name):p;g&&(m(a,i),f.$observe(g,function(b){i.$name!==b&&(m(a,c),i.$$parentForm.$$renameControl(i,b),(m=e(i.$name))(a,i))})),d.on("$destroy",function(){i.$$parentForm.$removeControl(i),m(a,c),l(i,Bf)})}}}};return f}]},Ef=Df(),Ff=Df(!0),Gf=/\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/,Hf=/^[a-z][a-z\d.+-]*:\/*(?:[^:@]+(?::[^@]+)?@)?(?:[^\s:/?#]+|\[[a-f\d:]+\])(?::\d+)?(?:\/[^?#]*)?(?:\?[^#]*)?(?:#.*)?$/i,If=/^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i,Jf=/^\s*(\-|\+)?(\d+|(\d*(\.\d*)))([eE][+-]?\d+)?\s*$/,Kf=/^(\d{4})-(\d{2})-(\d{2})$/,Lf=/^(\d{4})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,Mf=/^(\d{4})-W(\d\d)$/,Nf=/^(\d{4})-(\d\d)$/,Of=/^(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,Pf="keydown wheel mousedown",Qf=qa();f("date,datetime-local,month,time,week".split(","),function(a){Qf[a]=!0});var Rf={text:hd,date:ld("date",Kf,kd(Kf,["yyyy","MM","dd"]),"yyyy-MM-dd"),"datetime-local":ld("datetimelocal",Lf,kd(Lf,["yyyy","MM","dd","HH","mm","ss","sss"]),"yyyy-MM-ddTHH:mm:ss.sss"),time:ld("time",Of,kd(Of,["HH","mm","ss","sss"]),"HH:mm:ss.sss"),week:ld("week",Mf,jd,"yyyy-Www"),month:ld("month",Nf,kd(Nf,["yyyy","MM"]),"yyyy-MM"),number:nd,url:od,email:pd,radio:qd,checkbox:sd,hidden:p,button:p,submit:p,reset:p,file:p},Sf=["$browser","$sniffer","$filter","$parse",function(a,b,c,d){return{restrict:"E",require:["?ngModel"],link:{pre:function(e,f,g,h){h[0]&&(Rf[zd(g.type)]||Rf.text)(e,f,g,h[0],b,a,c,d)}}}}],Tf=/^(true|false|\d+)$/,Uf=function(){return{restrict:"A",priority:100,compile:function(a,b){return Tf.test(b.ngValue)?function(a,b,c){c.$set("value",a.$eval(c.ngValue))}:function(a,b,c){a.$watch(c.ngValue,function(a){c.$set("value",a)})}}}},Vf=["$compile",function(a){return{restrict:"AC",compile:function(b){return a.$$addBindingClass(b),function(b,c,d){a.$$addBindingInfo(c,d.ngBind),c=c[0],b.$watch(d.ngBind,function(a){c.textContent=t(a)?"":a})}}}}],Wf=["$interpolate","$compile",function(a,b){return{compile:function(c){return b.$$addBindingClass(c),function(c,d,e){var f=a(d.attr(e.$attr.ngBindTemplate));b.$$addBindingInfo(d,f.expressions),d=d[0],e.$observe("ngBindTemplate",function(a){d.textContent=t(a)?"":a})}}}}],Xf=["$sce","$parse","$compile",function(a,b,c){return{restrict:"A",compile:function(d,e){var f=b(e.ngBindHtml),g=b(e.ngBindHtml,function(b){return a.valueOf(b)});return c.$$addBindingClass(d),function(b,d,e){c.$$addBindingInfo(d,e.ngBindHtml),b.$watch(g,function(){var c=f(b);d.html(a.getTrustedHtml(c)||"")})}}}}],Yf=r({restrict:"A",require:"ngModel",link:function(a,b,c,d){d.$viewChangeListeners.push(function(){a.$eval(c.ngChange)})}}),Zf=td("",!0),$f=td("Odd",0),_f=td("Even",1),ag=dd({compile:function(a,b){b.$set("ngCloak",c),a.removeClass("ng-cloak")}}),bg=[function(){return{restrict:"A",scope:!0,controller:"@",priority:500}}],cg={},dg={blur:!0,focus:!0};f("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "),function(a){var b=mb("ng-"+a);cg[b]=["$parse","$rootScope",function(c,d){return{restrict:"A",compile:function(e,f){var g=c(f[b],null,!0);return function(b,c){c.on(a,function(c){var e=function(){g(b,{$event:c})};dg[a]&&d.$$phase?b.$evalAsync(e):b.$apply(e)})}}}}]});var eg=["$animate",function(a){return{multiElement:!0,transclude:"element",priority:600,terminal:!0,restrict:"A",$$tlb:!0,link:function(c,d,e,f,g){var h,i,j;c.$watch(e.ngIf,function(c){c?i||g(function(c,f){i=f,c[c.length++]=b.createComment(" end ngIf: "+e.ngIf+" "),h={clone:c},a.enter(c,d.parent(),d)}):(j&&(j.remove(),j=null),i&&(i.$destroy(),i=null),h&&(j=pa(h.clone),a.leave(j).then(function(){j=null}),h=null))})}}}],fg=["$templateRequest","$anchorScroll","$animate",function(a,b,c){return{restrict:"ECA",priority:400,terminal:!0,transclude:"element",controller:Od.noop,compile:function(d,e){var f=e.ngInclude||e.src,g=e.onload||"",h=e.autoscroll;return function(d,e,i,j,k){var l,m,n,o=0,p=function(){m&&(m.remove(),m=null),l&&(l.$destroy(),l=null),n&&(c.leave(n).then(function(){m=null}),m=n,n=null)};d.$watch(f,function(f){var i=function(){!u(h)||h&&!d.$eval(h)||b()},m=++o;f?(a(f,!0).then(function(a){if(!d.$$destroyed&&m===o){var b=d.$new();j.template=a;var h=k(b,function(a){p(),c.enter(a,null,e).then(i)});l=b,n=h,l.$emit("$includeContentLoaded",f),d.$eval(g)}},function(){d.$$destroyed||m===o&&(p(),d.$emit("$includeContentError",f))}),d.$emit("$includeContentRequested",f)):(p(),j.template=null)})}}}}],gg=["$compile",function(a){return{restrict:"ECA",priority:-400,require:"ngInclude",link:function(c,d,e,f){return/SVG/.test(d[0].toString())?(d.empty(),void a(Aa(f.template,b).childNodes)(c,function(a){d.append(a)},{futureParentElement:d})):(d.html(f.template),void a(d.contents())(c))}}}],hg=dd({priority:450,compile:function(){return{pre:function(a,b,c){a.$eval(c.ngInit)}}}}),ig=function(){return{restrict:"A",priority:100,require:"ngModel",link:function(a,b,d,e){var g=b.attr(d.$attr.ngList)||", ",h="false"!==d.ngTrim,i=h?Td(g):g,j=function(a){if(!t(a)){var b=[];return a&&f(a.split(i),function(a){a&&b.push(h?Td(a):a)}),b}};e.$parsers.push(j),e.$formatters.push(function(a){return Rd(a)?a.join(g):c}),e.$isEmpty=function(a){return!a||!a.length}}}},jg="ng-valid",kg="ng-invalid",lg="ng-pristine",mg="ng-dirty",ng="ng-untouched",og="ng-touched",pg="ng-pending",qg=d("ngModel"),rg=["$scope","$exceptionHandler","$attrs","$element","$parse","$animate","$timeout","$rootScope","$q","$interpolate",function(a,b,d,e,g,h,i,j,k,l){this.$viewValue=Number.NaN,this.$modelValue=Number.NaN,this.$$rawModelValue=c,this.$validators={},this.$asyncValidators={},this.$parsers=[],this.$formatters=[],this.$viewChangeListeners=[],this.$untouched=!0,this.$touched=!1,this.$pristine=!0,this.$dirty=!1,this.$valid=!0,this.$invalid=!1,this.$error={},this.$$success={},this.$pending=c,this.$name=l(d.name||"",!1)(a),this.$$parentForm=Bf;var m,n=g(d.ngModel),o=n.assign,q=n,r=o,s=null,v=this;this.$$setOptions=function(a){if(v.$options=a,a&&a.getterSetter){var b=g(d.ngModel+"()"),c=g(d.ngModel+"($$$p)");q=function(a){var c=n(a);return A(c)&&(c=b(a)),c},r=function(a,b){A(n(a))?c(a,{$$$p:v.$modelValue}):o(a,v.$modelValue)}}else if(!n.assign)throw qg("nonassign","Expression '{0}' is non-assignable. Element: {1}",d.ngModel,$(e))},this.$render=p,this.$isEmpty=function(a){return t(a)||""===a||null===a||a!==a};var w=0;ud({ctrl:this,$element:e,set:function(a,b){a[b]=!0},unset:function(a,b){delete a[b]},$animate:h}),this.$setPristine=function(){v.$dirty=!1,v.$pristine=!0,h.removeClass(e,mg),h.addClass(e,lg)},this.$setDirty=function(){v.$dirty=!0,v.$pristine=!1,h.removeClass(e,lg),h.addClass(e,mg),v.$$parentForm.$setDirty()},this.$setUntouched=function(){v.$touched=!1,v.$untouched=!0,h.setClass(e,ng,og)},this.$setTouched=function(){v.$touched=!0,v.$untouched=!1,h.setClass(e,og,ng)},this.$rollbackViewValue=function(){i.cancel(s),v.$viewValue=v.$$lastCommittedViewValue,v.$render()},this.$validate=function(){if(!y(v.$modelValue)||!isNaN(v.$modelValue)){var a=v.$$lastCommittedViewValue,b=v.$$rawModelValue,d=v.$valid,e=v.$modelValue,f=v.$options&&v.$options.allowInvalid;v.$$runValidators(b,a,function(a){f||d===a||(v.$modelValue=a?b:c,v.$modelValue!==e&&v.$$writeModelToScope())})}},this.$$runValidators=function(a,b,d){function e(){var a=v.$$parserName||"parse";return t(m)?(i(a,null),!0):(m||(f(v.$validators,function(a,b){i(b,null)}),f(v.$asyncValidators,function(a,b){i(b,null)})),i(a,m),m)}function g(){var c=!0;return f(v.$validators,function(d,e){var f=d(a,b);c=c&&f,i(e,f)}),c?!0:(f(v.$asyncValidators,function(a,b){i(b,null)}),!1)}function h(){var d=[],e=!0;f(v.$asyncValidators,function(f,g){var h=f(a,b);if(!I(h))throw qg("nopromise","Expected asynchronous validator to return a promise but got '{0}' instead.",h);i(g,c),d.push(h.then(function(){i(g,!0)},function(a){e=!1,i(g,!1)}))}),d.length?k.all(d).then(function(){j(e)},p):j(!0)}function i(a,b){l===w&&v.$setValidity(a,b)}function j(a){l===w&&d(a)}w++;var l=w;return e()&&g()?void h():void j(!1)},this.$commitViewValue=function(){var a=v.$viewValue;i.cancel(s),(v.$$lastCommittedViewValue!==a||""===a&&v.$$hasNativeValidators)&&(v.$$lastCommittedViewValue=a,v.$pristine&&this.$setDirty(),this.$$parseAndValidate())},this.$$parseAndValidate=function(){function b(){v.$modelValue!==g&&v.$$writeModelToScope()}var d=v.$$lastCommittedViewValue,e=d;if(m=t(e)?c:!0)for(var f=0;ff;f++){var i=a===c?f:c[f],j=(a[i],x(a[i],i)),k=q(a[i],j);if(b.push(k),h[2]||h[1]){var l=s(d,j);b.push(l)}if(h[4]){var m=u(d,j);b.push(m)}}return b}),getOptions:function(){for(var a=[],b={},c=v(d)||[],e=g(c),h=e.length,i=0;h>i;i++){var j=c===e?i:e[i],k=c[j],m=x(k,j),n=o(d,m),p=q(n,m),w=s(d,m),y=t(d,m),z=u(d,m),A=new f(p,n,w,y,z);a.push(A),b[p]=A}return{items:a,selectValueMap:b,getOptionFromViewValue:function(a){return b[r(a)]},getViewValueFromOption:function(a){return l?Od.copy(a.viewValue):a.viewValue}}}}}function g(b,c,e,g){function j(a,b){a.element=b,b.disabled=a.disabled,a.label!==b.label&&(b.label=a.label,b.textContent=a.label),a.value!==b.value&&(b.value=a.selectValue)}function k(a,b,c,d){var e;return b&&zd(b.nodeName)===c?e=b:(e=d.cloneNode(!1),b?a.insertBefore(e,b):a.appendChild(e)),e}function l(a){for(var b;a;)b=a.nextSibling,Ra(a),a=b}function m(a){var b=p&&p[0],c=w&&w[0];if(b||c)for(;a&&(a===b||a===c||a.nodeType===ce||"option"===M(a)&&""===a.value);)a=a.nextSibling;return a}function n(){var a=x&&q.readValue();x=y.getOptions();var b={},d=c[0].firstChild;if(v&&c.prepend(p),d=m(d),x.items.forEach(function(a){var e,f,g;a.group?(e=b[a.group],e||(f=k(c[0],d,"optgroup",i),d=f.nextSibling,f.label=a.group,e=b[a.group]={groupElement:f,currentOptionElement:f.firstChild}),g=k(e.groupElement,e.currentOptionElement,"option",h),j(a,g),e.currentOptionElement=g.nextSibling):(g=k(c[0],d,"option",h),j(a,g),d=g.nextSibling)}),Object.keys(b).forEach(function(a){l(b[a].currentOptionElement)}),l(d),o.$render(),!o.$isEmpty(a)){var e=q.readValue(),f=y.trackBy||r;(f?Q(a,e):a===e)||(o.$setViewValue(e),o.$render())}}var o=g[1];if(o){for(var p,q=g[0],r=e.multiple,s=0,t=c.children(),u=t.length;u>s;s++)if(""===t[s].value){p=t.eq(s);break}var v=!!p,w=Fd(h.cloneNode(!1));w.val("?");var x,y=d(e.ngOptions,c,b),z=function(){v||c.prepend(p),c.val(""),p.prop("selected",!0),p.attr("selected",!0)},A=function(){v||p.remove()},B=function(){c.prepend(w),c.val("?"),w.prop("selected",!0),w.attr("selected",!0)},C=function(){w.remove()};r?(o.$isEmpty=function(a){return!a||0===a.length},q.writeValue=function(a){x.items.forEach(function(a){a.element.selected=!1}),a&&a.forEach(function(a){var b=x.getOptionFromViewValue(a);b&&!b.disabled&&(b.element.selected=!0)})},q.readValue=function(){var a=c.val()||[],b=[];return f(a,function(a){var c=x.selectValueMap[a];c&&!c.disabled&&b.push(x.getViewValueFromOption(c))}),b},y.trackBy&&b.$watchCollection(function(){return Rd(o.$viewValue)?o.$viewValue.map(function(a){return y.getTrackByValue(a)}):void 0},function(){o.$render()})):(q.writeValue=function(a){var b=x.getOptionFromViewValue(a);b&&!b.disabled?(c[0].value!==b.selectValue&&(C(),A(),c[0].value=b.selectValue,b.element.selected=!0),b.element.setAttribute("selected","selected")):null===a||v?(C(),z()):(A(),B())},q.readValue=function(){var a=x.selectValueMap[c.val()];return a&&!a.disabled?(A(),C(),x.getViewValueFromOption(a)):null},y.trackBy&&b.$watch(function(){return y.getTrackByValue(o.$viewValue)},function(){o.$render()})),v?(p.remove(),a(p)(b),p.removeClass("ng-scope")):p=Fd(h.cloneNode(!1)),n(),b.$watchCollection(y.getWatchables,n)}}var h=b.createElement("option"),i=b.createElement("optgroup");return{restrict:"A",terminal:!0,require:["select","?ngModel"],link:{pre:function(a,b,c,d){d[0].registerOption=p},post:g}}}],zg=["$locale","$interpolate","$log",function(a,b,c){var d=/{}/g,e=/^when(Minus)?(.+)$/;return{link:function(g,h,i){function j(a){h.text(a||"")}var k,l=i.count,m=i.$attr.when&&h.attr(i.$attr.when),n=i.offset||0,o=g.$eval(m)||{},q={},r=b.startSymbol(),s=b.endSymbol(),u=r+l+"-"+n+s,v=Od.noop;f(i,function(a,b){var c=e.exec(b);if(c){var d=(c[1]?"-":"")+zd(c[2]);o[d]=h.attr(i.$attr[b])}}),f(o,function(a,c){q[c]=b(a.replace(d,u))}),g.$watch(l,function(b){var d=parseFloat(b),e=isNaN(d);if(e||d in o||(d=a.pluralCat(d-n)),d!==k&&!(e&&y(k)&&isNaN(k))){v();var f=q[d];t(f)?(null!=b&&c.debug("ngPluralize: no rule defined for '"+d+"' in "+m),v=p,j()):v=g.$watch(f,j),k=d}})}}}],Ag=["$parse","$animate",function(a,g){var h="$$NG_REMOVED",i=d("ngRepeat"),j=function(a,b,c,d,e,f,g){a[c]=d,e&&(a[e]=f),a.$index=b,a.$first=0===b,a.$last=b===g-1,a.$middle=!(a.$first||a.$last),a.$odd=!(a.$even=0===(1&b))},k=function(a){return a.clone[0]},l=function(a){return a.clone[a.clone.length-1]};return{restrict:"A",multiElement:!0,transclude:"element",priority:1e3,terminal:!0,$$tlb:!0,compile:function(d,m){var n=m.ngRepeat,o=b.createComment(" end ngRepeat: "+n+" "),p=n.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+track\s+by\s+([\s\S]+?))?\s*$/);if(!p)throw i("iexp","Expected expression in form of '_item_ in _collection_[ track by _id_]' but got '{0}'.",n);var q=p[1],r=p[2],s=p[3],t=p[4];if(p=q.match(/^(?:(\s*[\$\w]+)|\(\s*([\$\w]+)\s*,\s*([\$\w]+)\s*\))$/),!p)throw i("iidexp","'_item_' in '_item_ in _collection_' should be an identifier or '(_key_, _value_)' expression, but got '{0}'.",q);var u=p[3]||p[1],v=p[2];if(s&&(!/^[$a-zA-Z_][$a-zA-Z0-9_]*$/.test(s)||/^(null|undefined|this|\$index|\$first|\$middle|\$last|\$even|\$odd|\$parent|\$root|\$id)$/.test(s)))throw i("badident","alias '{0}' is invalid --- must be a valid JS identifier which is not a reserved name.",s);var w,x,y,z,A={$id:Za};return t?w=a(t):(y=function(a,b){return Za(b)},z=function(a){return a}),function(a,b,d,m,p){w&&(x=function(b,c,d){return v&&(A[v]=b),A[u]=c,A.$index=d,w(a,A)});var q=qa();a.$watchCollection(r,function(d){var m,r,t,w,A,B,C,D,E,F,G,H,I=b[0],J=qa();if(s&&(a[s]=d),e(d))E=d,D=x||y;else{D=x||z,E=[];for(var K in d)Ad.call(d,K)&&"$"!==K.charAt(0)&&E.push(K)}for(w=E.length,G=new Array(w),m=0;w>m;m++)if(A=d===E?m:E[m],B=d[A],C=D(A,B,m),q[C])F=q[C],delete q[C],J[C]=F,G[m]=F;else{if(J[C])throw f(G,function(a){a&&a.scope&&(q[a.id]=a)}),i("dupes","Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys. Repeater: {0}, Duplicate key: {1}, Duplicate value: {2}",n,C,B);G[m]={id:C,scope:c,clone:c},J[C]=!0}for(var L in q){if(F=q[L],H=pa(F.clone),g.leave(H),H[0].parentNode)for(m=0,r=H.length;r>m;m++)H[m][h]=!0;F.scope.$destroy()}for(m=0;w>m;m++)if(A=d===E?m:E[m],B=d[A],F=G[m],F.scope){t=I;do t=t.nextSibling;while(t&&t[h]);k(F)!=t&&g.move(pa(F.clone),null,I),I=l(F),j(F.scope,m,u,B,v,A,w)}else p(function(a,b){F.scope=b;var c=o.cloneNode(!1);a[a.length++]=c,g.enter(a,null,I),I=c,F.clone=a,J[F.id]=F,j(F.scope,m,u,B,v,A,w)});q=J})}}}}],Bg="ng-hide",Cg="ng-hide-animate",Dg=["$animate",function(a){return{restrict:"A",multiElement:!0,link:function(b,c,d){b.$watch(d.ngShow,function(b){a[b?"removeClass":"addClass"](c,Bg,{tempClasses:Cg})})}}}],Eg=["$animate",function(a){return{restrict:"A",multiElement:!0,link:function(b,c,d){b.$watch(d.ngHide,function(b){a[b?"addClass":"removeClass"](c,Bg,{tempClasses:Cg})})}}}],Fg=dd(function(a,b,c){a.$watch(c.ngStyle,function(a,c){c&&a!==c&&f(c,function(a,c){b.css(c,"")}),a&&b.css(a)},!0)}),Gg=["$animate",function(a){return{require:"ngSwitch",controller:["$scope",function(){this.cases={}}],link:function(c,d,e,g){var h=e.ngSwitch||e.on,i=[],j=[],k=[],l=[],m=function(a,b){return function(){a.splice(b,1)}};c.$watch(h,function(c){var d,e;for(d=0,e=k.length;e>d;++d)a.cancel(k[d]);for(k.length=0,d=0,e=l.length;e>d;++d){var h=pa(j[d].clone);l[d].$destroy();var n=k[d]=a.leave(h);n.then(m(k,d))}j.length=0,l.length=0,(i=g.cases["!"+c]||g.cases["?"])&&f(i,function(c){c.transclude(function(d,e){l.push(e);var f=c.element;d[d.length++]=b.createComment(" end ngSwitchWhen: ");var g={clone:d};j.push(g),a.enter(d,f.parent(),f)})})})}}}],Hg=dd({transclude:"element",priority:1200,require:"^ngSwitch",multiElement:!0,link:function(a,b,c,d,e){d.cases["!"+c.ngSwitchWhen]=d.cases["!"+c.ngSwitchWhen]||[],d.cases["!"+c.ngSwitchWhen].push({transclude:e,element:b})}}),Ig=dd({transclude:"element",priority:1200,require:"^ngSwitch",multiElement:!0,link:function(a,b,c,d,e){d.cases["?"]=d.cases["?"]||[],d.cases["?"].push({transclude:e,element:b})}}),Jg=dd({restrict:"EAC",link:function(a,b,c,e,f){if(!f)throw d("ngTransclude")("orphan","Illegal use of ngTransclude directive in the template! No parent directive that requires a transclusion found. Element: {0}",$(b));f(function(a){b.empty(),b.append(a)})}}),Kg=["$templateCache",function(a){return{restrict:"E",terminal:!0,compile:function(b,c){if("text/ng-template"==c.type){var d=c.id,e=b[0].text;a.put(d,e)}}}}],Lg={$setViewValue:p,$render:p},Mg=["$element","$scope","$attrs",function(a,d,e){var f=this,g=new $a;f.ngModelCtrl=Lg,f.unknownOption=Fd(b.createElement("option")),f.renderUnknownOption=function(b){var c="? "+Za(b)+" ?";f.unknownOption.val(c),a.prepend(f.unknownOption),a.val(c)},d.$on("$destroy",function(){f.renderUnknownOption=p}),f.removeUnknownOption=function(){f.unknownOption.parent()&&f.unknownOption.remove()},f.readValue=function(){return f.removeUnknownOption(),a.val()},f.writeValue=function(b){f.hasOption(b)?(f.removeUnknownOption(),a.val(b),""===b&&f.emptyOption.prop("selected",!0)):null==b&&f.emptyOption?(f.removeUnknownOption(),a.val("")):f.renderUnknownOption(b)},f.addOption=function(a,b){if(b[0].nodeType!==ce){na(a,'"option value"'),""===a&&(f.emptyOption=b);var c=g.get(a)||0;g.put(a,c+1),f.ngModelCtrl.$render(),wd(b)}},f.removeOption=function(a){var b=g.get(a);b&&(1===b?(g.remove(a),""===a&&(f.emptyOption=c)):g.put(a,b-1))},f.hasOption=function(a){return!!g.get(a)},f.registerOption=function(a,b,c,d,e){if(d){var g;c.$observe("value",function(a){u(g)&&f.removeOption(g),g=a,f.addOption(a,b)})}else e?a.$watch(e,function(a,d){c.$set("value",a),d!==a&&f.removeOption(d),f.addOption(a,b)}):f.addOption(c.value,b);b.on("$destroy",function(){f.removeOption(c.value),f.ngModelCtrl.$render()})}}],Ng=function(){function a(a,b,c,d){var e=d[1];if(e){var g=d[0];if(g.ngModelCtrl=e,b.on("change",function(){a.$apply(function(){e.$setViewValue(g.readValue())})}),c.multiple){g.readValue=function(){var a=[];return f(b.find("option"),function(b){b.selected&&a.push(b.value)}),a},g.writeValue=function(a){var c=new $a(a);f(b.find("option"),function(a){a.selected=u(c.get(a.value))})};var h,i=NaN;a.$watch(function(){i!==e.$viewValue||Q(h,e.$viewValue)||(h=P(e.$viewValue),e.$render()),i=e.$viewValue}),e.$isEmpty=function(a){return!a||0===a.length}}}}function b(a,b,c,d){var e=d[1];if(e){var f=d[0];e.$render=function(){f.writeValue(e.$viewValue)}}}return{restrict:"E",require:["select","?ngModel"],controller:Mg,priority:1,link:{pre:a,post:b}}},Og=["$interpolate",function(a){return{restrict:"E",priority:100,compile:function(b,c){if(u(c.value))var d=a(c.value,!0);else{var e=a(b.text(),!0);e||c.$set("value",b.text())}return function(a,b,c){var f="$selectController",g=b.parent(),h=g.data(f)||g.parent().data(f);h&&h.registerOption(a,b,c,d,e)}}}}],Pg=r({restrict:"E",terminal:!1}),Qg=function(){return{restrict:"A",require:"?ngModel",link:function(a,b,c,d){d&&(c.required=!0,d.$validators.required=function(a,b){return!c.required||!d.$isEmpty(b)},c.$observe("required",function(){d.$validate()}))}}},Rg=function(){return{restrict:"A",require:"?ngModel",link:function(a,b,e,f){if(f){var g,h=e.ngPattern||e.pattern;e.$observe("pattern",function(a){if(x(a)&&a.length>0&&(a=new RegExp("^"+a+"$")),a&&!a.test)throw d("ngPattern")("noregexp","Expected {0} to be a RegExp but was {1}. Element: {2}",h,a,$(b));g=a||c,f.$validate()}),f.$validators.pattern=function(a,b){return f.$isEmpty(b)||t(g)||g.test(b)}}}}},Sg=function(){return{restrict:"A",require:"?ngModel",link:function(a,b,c,d){if(d){var e=-1;c.$observe("maxlength",function(a){var b=n(a);e=isNaN(b)?-1:b,d.$validate()}),d.$validators.maxlength=function(a,b){return 0>e||d.$isEmpty(b)||b.length<=e}}}}},Tg=function(){return{restrict:"A",require:"?ngModel",link:function(a,b,c,d){if(d){var e=0;c.$observe("minlength",function(a){e=n(a)||0,d.$validate()}),d.$validators.minlength=function(a,b){return d.$isEmpty(b)||b.length>=e}}}}};return a.angular.bootstrap?void(a.console&&console.log("WARNING: Tried to load angular more than once.")):(ka(),ua(Od),Od.module("ngLocale",[],["$provide",function(a){function b(a){a+="";var b=a.indexOf(".");return-1==b?0:a.length-b-1}function d(a,d){var e=d;c===e&&(e=Math.min(b(a),3));var f=Math.pow(10,e),g=(a*f|0)%f;return{v:e,f:g}}var e={ZERO:"zero",ONE:"one",TWO:"two",FEW:"few",MANY:"many",OTHER:"other"};a.value("$locale",{DATETIME_FORMATS:{AMPMS:["AM","PM"],DAY:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],ERANAMES:["Before Christ","Anno Domini"],ERAS:["BC","AD"],FIRSTDAYOFWEEK:6,MONTH:["January","February","March","April","May","June","July","August","September","October","November","December"],SHORTDAY:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],SHORTMONTH:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],STANDALONEMONTH:["January","February","March","April","May","June","July","August","September","October","November","December"],WEEKENDRANGE:[5,6],fullDate:"EEEE, MMMM d, y",longDate:"MMMM d, y",medium:"MMM d, y h:mm:ss a",mediumDate:"MMM d, y",mediumTime:"h:mm:ss a","short":"M/d/yy h:mm a",shortDate:"M/d/yy",shortTime:"h:mm a"},NUMBER_FORMATS:{CURRENCY_SYM:"$",DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{gSize:3,lgSize:3,maxFrac:3,minFrac:0,minInt:1,negPre:"-",negSuf:"",posPre:"",posSuf:""},{gSize:3,lgSize:3,maxFrac:2,minFrac:2,minInt:1,negPre:"-¤",negSuf:"",posPre:"¤",posSuf:""}]},id:"en-us",localeID:"en_US",pluralCat:function(a,b){var c=0|a,f=d(a,b);return 1==c&&0==f.v?e.ONE:e.OTHER}})}]),void Fd(b).ready(function(){fa(b,ga)}))}(window,document),!window.angular.$$csp().noInlineStyle&&window.angular.element(document.head).prepend(''),function(a,b,c){"use strict";function d(a){return null!=a&&""!==a&&"hasOwnProperty"!==a&&h.test("."+a)}function e(a,e){if(!d(e))throw g("badmember",'Dotted member path "@{0}" is invalid.',e);for(var f=e.split("."),h=0,i=f.length;i>h&&b.isDefined(a);h++){var j=f[h];a=null!==a?a[j]:c}return a}function f(a,c){c=c||{},b.forEach(c,function(a,b){delete c[b]});for(var d in a)!a.hasOwnProperty(d)||"$"===d.charAt(0)&&"$"===d.charAt(1)||(c[d]=a[d]);return c}var g=b.$$minErr("$resource"),h=/^(\.[a-zA-Z_$@][0-9a-zA-Z_$@]*)+$/; b.module("ngResource",["ng"]).provider("$resource",function(){var a=/^https?:\/\/[^\/]*/,d=this;this.defaults={stripTrailingSlashes:!0,actions:{get:{method:"GET"},save:{method:"POST"},query:{method:"GET",isArray:!0},remove:{method:"DELETE"},"delete":{method:"DELETE"}}},this.$get=["$http","$log","$q",function(h,i,j){function k(a){return l(a,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function l(a,b){return encodeURIComponent(a).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,b?"%20":"+")}function m(a,b){this.template=a,this.defaults=q({},d.defaults,b),this.urlParams={}}function n(a,k,l,t){function u(a,b){var c={};return b=q({},k,b),p(b,function(b,d){s(b)&&(b=b()),c[d]=b&&b.charAt&&"@"==b.charAt(0)?e(a,b.substr(1)):b}),c}function v(a){return a.resource}function w(a){f(a||{},this)}var x=new m(a,t);return l=q({},d.defaults.actions,l),w.prototype.toJSON=function(){var a=q({},this);return delete a.$promise,delete a.$resolved,a},p(l,function(a,d){var e=/^(POST|PUT|PATCH)$/i.test(a.method);w[d]=function(k,l,m,n){var t,y,z,A={};switch(arguments.length){case 4:z=n,y=m;case 3:case 2:if(!s(l)){A=k,t=l,y=m;break}if(s(k)){y=k,z=l;break}y=l,z=m;case 1:s(k)?y=k:e?t=k:A=k;break;case 0:break;default:throw g("badargs","Expected up to 4 arguments [params, data, success, error], got {0} arguments",arguments.length)}var B=this instanceof w,C=B?t:a.isArray?[]:new w(t),D={},E=a.interceptor&&a.interceptor.response||v,F=a.interceptor&&a.interceptor.responseError||c;p(a,function(a,c){switch(c){default:D[c]=r(a);break;case"params":case"isArray":case"interceptor":break;case"timeout":a&&!b.isNumber(a)&&i.debug("ngResource:\n Only numeric values are allowed as `timeout`.\n Promises are not supported in $resource, because the same value would be used for multiple requests.\n If you need support for cancellable $resource actions, you should upgrade to version 1.5 or higher.")}}),e&&(D.data=t),x.setUrlParams(D,q({},u(t,a.params||{}),A),a.url);var G=h(D).then(function(c){var e=c.data,h=C.$promise;if(e){if(b.isArray(e)!==!!a.isArray)throw g("badcfg","Error in resource configuration for action `{0}`. Expected response to contain an {1} but got an {2} (Request: {3} {4})",d,a.isArray?"array":"object",b.isArray(e)?"array":"object",D.method,D.url);a.isArray?(C.length=0,p(e,function(a){"object"==typeof a?C.push(new w(a)):C.push(a)})):(f(e,C),C.$promise=h)}return C.$resolved=!0,c.resource=C,c},function(a){return C.$resolved=!0,(z||o)(a),j.reject(a)});return G=G.then(function(a){var b=E(a);return(y||o)(b,a.headers),b},F),B?G:(C.$promise=G,C.$resolved=!1,C)},w.prototype["$"+d]=function(a,b,c){s(a)&&(c=b,b=a,a={});var e=w[d].call(this,a,this,b,c);return e.$promise||e}}),w.bind=function(b){return n(a,q({},k,b),l)},w}var o=b.noop,p=b.forEach,q=b.extend,r=b.copy,s=b.isFunction;return m.prototype={setUrlParams:function(c,d,e){var f,h,i=this,j=e||i.template,l="",m=i.urlParams={};p(j.split(/\W/),function(a){if("hasOwnProperty"===a)throw g("badname","hasOwnProperty is not a valid parameter name.");!new RegExp("^\\d+$").test(a)&&a&&new RegExp("(^|[^\\\\]):"+a+"(\\W|$)").test(j)&&(m[a]=!0)}),j=j.replace(/\\:/g,":"),j=j.replace(a,function(a){return l=a,""}),d=d||{},p(i.urlParams,function(a,c){f=d.hasOwnProperty(c)?d[c]:i.defaults[c],b.isDefined(f)&&null!==f?(h=k(f),j=j.replace(new RegExp(":"+c+"(\\W|$)","g"),function(a,b){return h+b})):j=j.replace(new RegExp("(/?):"+c+"(\\W|$)","g"),function(a,b,c){return"/"==c.charAt(0)?c:b+c})}),i.defaults.stripTrailingSlashes&&(j=j.replace(/\/+$/,"")||"/"),j=j.replace(/\/\.(?=\w+($|\?))/,"."),c.url=l+j.replace(/\/\\\./,"/."),p(d,function(a,b){i.urlParams[b]||(c.params=c.params||{},c.params[b]=a)})}},n}]})}(window,window.angular),function(a,b,c){"use strict";function d(){this.$get=["$$sanitizeUri",function(a){return function(b){var c=[];return g(b,j(c,function(b,c){return!/^unsafe/.test(a(b,c))})),c.join("")}}]}function e(a){var c=[],d=j(c,b.noop);return d.chars(a),c.join("")}function f(a,c){var d,e={},f=a.split(",");for(d=0;d=0&&t[f]!=d;f--);if(f>=0){for(e=t.length-1;e>=f;e--)c.end&&c.end(t[e]);t.length=f}}"string"!=typeof a&&(a=null===a||"undefined"==typeof a?"":""+a);var f,g,i,j,t=[],u=a;for(t.last=function(){return t[t.length-1]};a;){if(j="",g=!0,t.last()&&C[t.last()]?(a=a.replace(new RegExp("([\\W\\w]*)<\\s*\\/\\s*"+t.last()+"[^>]*>","i"),function(a,b){return b=b.replace(q,"$1").replace(s,"$1"),c.chars&&c.chars(h(b)),""}),e("",t.last())):(0===a.indexOf("",f)===f&&(c.comment&&c.comment(a.substring(4,f)),a=a.substring(f+3),g=!1)):r.test(a)?(i=a.match(r),i&&(a=a.replace(i[0],""),g=!1)):p.test(a)?(i=a.match(m),i&&(a=a.substring(i[0].length),i[0].replace(m,e),g=!1)):o.test(a)&&(i=a.match(l),i?(i[4]&&(a=a.substring(i[0].length),i[0].replace(l,d)),g=!1):(j+="<",a=a.substring(1))),g&&(f=a.indexOf("<"),j+=0>f?a:a.substring(0,f),a=0>f?"":a.substring(f),c.chars&&c.chars(h(j)))),a==u)throw k("badparse","The sanitizer was unable to parse the following block of html: {0}",a);u=a}e()}function h(a){return a?(I.innerHTML=a.replace(//g,">")}function j(a,c){var d=!1,e=b.bind(a,a.push);return{start:function(a,f,g){a=b.lowercase(a),!d&&C[a]&&(d=a),d||D[a]!==!0||(e("<"),e(a),b.forEach(f,function(d,f){var g=b.lowercase(f),h="img"===a&&"src"===g||"background"===g;H[g]!==!0||E[g]===!0&&!c(d,h)||(e(" "),e(f),e('="'),e(i(d)),e('"'))}),e(g?"/>":">"))},end:function(a){a=b.lowercase(a),d||D[a]!==!0||(e("")),a==d&&(d=!1)},chars:function(a){d||e(i(a))}}}var k=b.$$minErr("$sanitize"),l=/^<((?:[a-zA-Z])[\w:-]*)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*(>?)/,m=/^<\/\s*([\w:-]+)[^>]*>/,n=/([\w:-]+)(?:\s*=\s*(?:(?:"((?:[^"])*)")|(?:'((?:[^'])*)')|([^>\s]+)))?/g,o=/^/g,r=/]*?)>/i,s=//g,t=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,u=/([^\#-~| |!])/g,v=f("area,br,col,hr,img,wbr"),w=f("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr"),x=f("rp,rt"),y=b.extend({},x,w),z=b.extend({},w,f("address,article,aside,blockquote,caption,center,del,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,h6,header,hgroup,hr,ins,map,menu,nav,ol,pre,script,section,table,ul")),A=b.extend({},x,f("a,abbr,acronym,b,bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,q,ruby,rp,rt,s,samp,small,span,strike,strong,sub,sup,time,tt,u,var")),B=f("circle,defs,desc,ellipse,font-face,font-face-name,font-face-src,g,glyph,hkern,image,linearGradient,line,marker,metadata,missing-glyph,mpath,path,polygon,polyline,radialGradient,rect,stop,svg,switch,text,title,tspan,use"),C=f("script,style"),D=b.extend({},v,z,A,y,B),E=f("background,cite,href,longdesc,src,usemap,xlink:href"),F=f("abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,scope,scrolling,shape,size,span,start,summary,tabindex,target,title,type,valign,value,vspace,width"),G=f("accent-height,accumulate,additive,alphabetic,arabic-form,ascent,baseProfile,bbox,begin,by,calcMode,cap-height,class,color,color-rendering,content,cx,cy,d,dx,dy,descent,display,dur,end,fill,fill-rule,font-family,font-size,font-stretch,font-style,font-variant,font-weight,from,fx,fy,g1,g2,glyph-name,gradientUnits,hanging,height,horiz-adv-x,horiz-origin-x,ideographic,k,keyPoints,keySplines,keyTimes,lang,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mathematical,max,min,offset,opacity,orient,origin,overline-position,overline-thickness,panose-1,path,pathLength,points,preserveAspectRatio,r,refX,refY,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,rotate,rx,ry,slope,stemh,stemv,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,systemLanguage,target,text-anchor,to,transform,type,u1,u2,underline-position,underline-thickness,unicode,unicode-range,units-per-em,values,version,viewBox,visibility,width,widths,x,x-height,x1,x2,xlink:actuate,xlink:arcrole,xlink:role,xlink:show,xlink:title,xlink:type,xml:base,xml:lang,xml:space,xmlns,xmlns:xlink,y,y1,y2,zoomAndPan",!0),H=b.extend({},E,G,F),I=document.createElement("pre");b.module("ngSanitize",[]).provider("$sanitize",d),b.module("ngSanitize").filter("linky",["$sanitize",function(a){var c=/((ftp|https?):\/\/|(www\.)|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>"\u201d\u2019]/i,d=/^mailto:/i;return function(f,g){function h(a){a&&n.push(e(a))}function i(a,c){n.push("'),h(c),n.push("")}if(!f)return f;for(var j,k,l,m=f,n=[];j=m.match(c);)k=j[0],j[2]||j[4]||(k=(j[3]?"http://":"mailto:")+k),l=j.index,h(m.substr(0,l)),i(k,j[0].replace(d,"")),m=m.substring(l+j[0].length);return h(m),a(n.join(""))}}])}(window,window.angular),function(a,b,c){"use strict";function d(a,b,c){if(!a)throw qa("areq","Argument '{0}' is {1}",b||"?",c||"required");return a}function e(a,b){return a||b?a?b?(R(a)&&(a=a.join(" ")),R(b)&&(b=b.join(" ")),a+" "+b):a:b:""}function f(a){var b={};return a&&(a.to||a.from)&&(b.to=a.to,b.from=a.from),b}function g(a,b,c){var d="";return a=R(a)?a:a&&S(a)&&a.length?a.split(/\s+/):[],Q(a,function(a,e){a&&a.length>0&&(d+=e>0?" ":"",d+=c?b+a:a+b)}),d}function h(a,b){var c=a.indexOf(b);b>=0&&a.splice(c,1)}function i(a){if(a instanceof P)switch(a.length){case 0:return a;case 1:if(a[0].nodeType===Y)return a;break;default:return P(j(a))}return a.nodeType===Y?P(a):void 0}function j(a){if(!a[0])return a;for(var b=0;b=0)&&(c=D(c)),0===c&&(c=null),d[b]=c}}),d}function D(a){var b=0,c=a.split(/\s*,\s*/);return Q(c,function(a){"s"==a.charAt(a.length-1)&&(a=a.substring(0,a.length-1)),a=parseFloat(a)||0,b=b?Math.max(a,b):a}),b}function E(a){return 0===a||null!=a}function F(a,b){var c=I,d=a+"s";return b?c+=fa:d+=" linear all",[c,d]}function G(){var a=Object.create(null);return{flush:function(){a=Object.create(null)},count:function(b){var c=a[b];return c?c.total:0},get:function(b){var c=a[b];return c&&c.value},put:function(b,c){a[b]?a[b].total++:a[b]={total:1,value:c}}}}function H(a,b,c){Q(c,function(c){a[c]=V(a[c])?a[c]:b.style.getPropertyValue(c)})}var I,J,K,L,M=b.noop,N=b.copy,O=b.extend,P=b.element,Q=b.forEach,R=b.isArray,S=b.isString,T=b.isObject,U=b.isUndefined,V=b.isDefined,W=b.isFunction,X=b.isElement,Y=1,Z="-add",$="-remove",_="ng-",aa="-active",ba="-prepare",ca="ng-animate",da="$$ngAnimateChildren",ea="";U(a.ontransitionend)&&V(a.onwebkittransitionend)?(ea="-webkit-",I="WebkitTransition",J="webkitTransitionEnd transitionend"):(I="transition",J="transitionend"),U(a.onanimationend)&&V(a.onwebkitanimationend)?(ea="-webkit-",K="WebkitAnimation",L="webkitAnimationEnd animationend"):(K="animation",L="animationend");var fa="Duration",ga="Property",ha="Delay",ia="TimingFunction",ja="IterationCount",ka="PlayState",la=9999,ma=K+ha,na=K+fa,oa=I+ha,pa=I+fa,qa=b.$$minErr("ng"),ra=["$$rAF",function(a){function b(a){d=d.concat(a),c()}function c(){if(d.length){for(var b=d.shift(),f=0;f0&&(j=c.get(h),!j)){var k=g(f,"-stagger");d.addClass(e,k),j=C(a,e,i),j.animationDuration=Math.max(j.animationDuration,0),j.transitionDuration=Math.max(j.transitionDuration,0),d.removeClass(e,k),c.put(h,j)}return j||{}}function z(a){P.push(a),l.waitUntilQuiet(function(){b.flush(),c.flush();for(var a=j(),d=0;d=da&&d>=ea&&(X=!0,m())}function P(){function b(){if(!V){if(u(!1),Q(ja,function(a){var b=a[0],c=a[1];U.style[b]=c}),G(a,S),d.addClass(a,za),Na.recalculateTimingStyles){if(xa=U.className+" "+sa,Ca=s(U,xa),La=D(U,xa,Ca),Ma=La.maxDelay,ca=Math.max(Ma,0),ea=La.maxDuration,0===ea)return void m();Na.hasTransitions=La.transitionDuration>0,Na.hasAnimations=La.animationDuration>0}if(Na.applyAnimationDelay&&(Ma="boolean"!=typeof S.delay&&E(S.delay)?parseFloat(S.delay):Ma,ca=Math.max(Ma,0),La.animationDelay=Ma,Oa=B(Ma,!0),ja.push(Oa),U.style[Oa[0]]=Oa[1]),da=ca*ua,fa=ea*ua,S.easing){var b,e=S.easing;Na.hasTransitions&&(b=I+ia,ja.push([b,e]),U.style[b]=e),Na.hasAnimations&&(b=K+ia,ja.push([b,e]),U.style[b]=e)}La.transitionDuration&&na.push(J),La.animationDuration&&na.push(L),ha=Date.now();var f=da+wa*fa,g=ha+f,h=a.data(ta)||[],j=!0;if(h.length){var k=h[0];j=g>k.expectedEndTime,j?i.cancel(k.timer):h.push(m)}if(j){var l=i(c,f,!1);h[0]={timer:l,expectedEndTime:g},h.push(m),a.data(ta,h)}na.length&&a.on(na.join(" "),O),S.to&&(S.cleanupStyles&&H(T,U,Object.keys(S.to)),q(a,S))}}function c(){var b=a.data(ta);if(b){for(var c=1;c0&&(La.transitionDuration&&0===Da.transitionDuration||La.animationDuration&&0===Da.animationDuration)&&Math.max(Da.animationDelay,Da.transitionDelay);f?i(b,Math.floor(f*Ja*ua),!1):b(),ba.resume=function(){e(!0)},ba.pause=function(){e(!1)}}}var S=c||{};S.$$prepared||(S=n(N(S)));var T={},U=t(a);if(!U||!U.parentNode||!r.enabled())return C();var V,W,X,Y,ba,ca,da,ea,fa,ha,ja=[],ka=a.attr("class"),ma=f(S),na=[];if(0===S.duration||!k.animations&&!k.transitions)return C();var oa=S.event&&R(S.event)?S.event.join(" "):S.event,pa=oa&&S.structural,qa="",ra="";pa?qa=g(oa,_,!0):oa&&(qa=oa),S.addClass&&(ra+=g(S.addClass,Z)),S.removeClass&&(ra.length&&(ra+=" "),ra+=g(S.removeClass,$)),S.applyClassesEarly&&ra.length&&G(a,S);var sa=[qa,ra].join(" ").trim(),xa=ka+" "+sa,za=g(sa,aa),Aa=ma.to&&Object.keys(ma.to).length>0,Ba=(S.keyframeStyle||"").length>0;if(!Ba&&!Aa&&!sa)return C();var Ca,Da;if(S.stagger>0){var Ea=parseFloat(S.stagger);Da={transitionDelay:Ea,animationDelay:Ea,transitionDuration:0,animationDuration:0}}else Ca=s(U,xa),Da=v(U,sa,Ca,ya);S.$$skipPreparationClasses||d.addClass(a,sa);var Fa;if(S.transitionStyle){var Ga=[I,S.transitionStyle];y(U,Ga),ja.push(Ga)}if(S.duration>=0){Fa=U.style[I].length>0;var Ha=F(S.duration,Fa);y(U,Ha),ja.push(Ha)}if(S.keyframeStyle){var Ia=[K,S.keyframeStyle];y(U,Ia),ja.push(Ia)}var Ja=Da?S.staggerIndex>=0?S.staggerIndex:b.count(Ca):0,Ka=0===Ja;Ka&&!S.skipBlocking&&w(U,la);var La=D(U,xa,Ca),Ma=La.maxDelay;ca=Math.max(Ma,0),ea=La.maxDuration;var Na={};if(Na.hasTransitions=La.transitionDuration>0,Na.hasAnimations=La.animationDuration>0,Na.hasTransitionAll=Na.hasTransitions&&"all"==La.transitionProperty,Na.applyTransitionDuration=Aa&&(Na.hasTransitions&&!Na.hasTransitionAll||Na.hasAnimations&&!Na.hasTransitions),Na.applyAnimationDuration=S.duration&&Na.hasAnimations,Na.applyTransitionDelay=E(S.delay)&&(Na.applyTransitionDuration||Na.hasTransitions),Na.applyAnimationDelay=E(S.delay)&&Na.hasAnimations,Na.recalculateTimingStyles=ra.length>0,(Na.applyTransitionDuration||Na.applyAnimationDuration)&&(ea=S.duration?parseFloat(S.duration):ea,Na.applyTransitionDuration&&(Na.hasTransitions=!0,La.transitionDuration=ea,Fa=U.style[I+ga].length>0,ja.push(F(ea,Fa))),Na.applyAnimationDuration&&(Na.hasAnimations=!0,La.animationDuration=ea,ja.push(A(ea)))),0===ea&&!Na.recalculateTimingStyles)return C();if(null!=S.delay){var Oa;"boolean"!=typeof S.delay&&(Oa=parseFloat(S.delay),ca=Math.max(Oa,0)),Na.applyTransitionDelay&&ja.push(B(Oa)),Na.applyAnimationDelay&&ja.push(B(Oa,!0))}return null==S.duration&&La.transitionDuration>0&&(Na.recalculateTimingStyles=Na.recalculateTimingStyles||Ka),da=ca*ua,fa=ea*ua,S.skipBlocking||(Na.blockTransition=La.transitionDuration>0,Na.blockKeyframeAnimation=La.animationDuration>0&&Da.animationDelay>0&&0===Da.animationDuration),S.from&&(S.cleanupStyles&&H(T,U,Object.keys(S.from)),p(a,S)),Na.blockTransition||Na.blockKeyframeAnimation?u(ea):S.skipBlocking||w(U,!1),{$$willAnimate:!0,end:j,start:function(){return V?void 0:(ba={end:j,cancel:l,resume:null,pause:null},Y=new e(ba),z(P),Y)}}}}]}],Aa=["$$animationProvider",function(a){function b(a){return a.parentNode&&11===a.parentNode.nodeType}a.drivers.push("$$animateCssDriver");var c="ng-animate-shim",d="ng-anchor",e="ng-anchor-out",f="ng-anchor-in";this.$get=["$animateCss","$rootScope","$$AnimateRunner","$rootElement","$sniffer","$$jqLite","$document",function(a,g,h,i,j,k,l){function n(a){return a.replace(/\bng-\S+\b/g,"")}function o(a,b){return S(a)&&(a=a.split(" ")),S(b)&&(b=b.split(" ")),a.filter(function(a){return-1===b.indexOf(a)}).join(" ")}function p(b,g,i){function j(a){var b={},c=t(a).getBoundingClientRect();return Q(["width","height","top","left"],function(a){var d=c[a];switch(a){case"top":d+=s.scrollTop;break;case"left":d+=s.scrollLeft}b[a]=Math.floor(d)+"px"}),b}function k(){var b=a(q,{addClass:e,delay:!0,from:j(g)});return b.$$willAnimate?b:null}function l(a){return a.attr("class")||""}function m(){var b=n(l(i)),c=o(b,r),d=o(r,b),g=a(q,{to:j(i),addClass:f+" "+c,removeClass:e+" "+d,delay:!0});return g.$$willAnimate?g:null}function p(){q.remove(),g.removeClass(c),i.removeClass(c)}var q=P(t(g).cloneNode(!0)),r=n(l(q));g.addClass(c),i.addClass(c),q.addClass(d),v.append(q);var u,w=k();if(!w&&(u=m(),!u))return p();var x=w||u;return{start:function(){function a(){c&&c.end()}var b,c=x.start();return c.done(function(){return c=null,!u&&(u=m())?(c=u.start(),c.done(function(){c=null,p(),b.complete()}),c):(p(),void b.complete())}),b=new h({end:a,cancel:a})}}}function q(a,b,c,d){var e=r(a,M),f=r(b,M),g=[];return Q(d,function(a){var b=a.out,d=a["in"],e=p(c,b,d);e&&g.push(e)}),e||f||0!==g.length?{start:function(){function a(){Q(b,function(a){a.end()})}var b=[];e&&b.push(e.start()),f&&b.push(f.start()),Q(g,function(a){b.push(a.start())});var c=new h({end:a,cancel:a});return h.all(b,function(a){c.complete(a)}),c}}:void 0}function r(b){var c=b.element,d=b.options||{};b.structural&&(d.event=b.event,d.structural=!0,d.applyClassesEarly=!0,"leave"===b.event&&(d.onDone=d.domOperation)),d.preparationClasses&&(d.event=z(d.event,d.preparationClasses));var e=a(c,d);return e.$$willAnimate?e:null}if(!j.animations&&!j.transitions)return M;var s=l[0].body,u=t(i),v=P(b(u)||s.contains(u)?u:s);m(k);return function(a){return a.from&&a.to?q(a.from,a.to,a.classes,a.anchors):r(a)}}]}],Ba=["$animateProvider",function(a){this.$get=["$injector","$$AnimateRunner","$$jqLite",function(b,c,d){function e(c){c=R(c)?c:c.split(" ");for(var d=[],e={},f=0;f0,d=(a.removeClass||"").length>0;return b?c&&d:c||d}var g=1,h=2,k=" ",l=this.rules={skip:[],cancel:[],join:[]};l.join.push(function(a,b,c){return!b.structural&&f(b)}),l.skip.push(function(a,b,c){return!b.structural&&!f(b)}),l.skip.push(function(a,b,c){return"leave"==c.event&&b.structural}),l.skip.push(function(a,b,c){return c.structural&&c.state===h&&!b.structural}),l.cancel.push(function(a,b,c){return c.structural&&b.structural}),l.cancel.push(function(a,b,c){return c.state===h&&b.structural}),l.cancel.push(function(a,b,d){var e=b.addClass,f=b.removeClass,g=d.addClass,h=d.removeClass;return U(e)&&U(f)||U(g)&&U(h)?!1:c(e,h)||c(f,g)}),this.$get=["$$rAF","$rootScope","$rootElement","$document","$$HashMap","$$animation","$$AnimateRunner","$templateRequest","$$jqLite","$$forceReflow",function(b,c,k,l,p,q,s,w,x,y){function z(){var a=!1;return function(b){a?b():c.$$postDigest(function(){a=!0,b()})}}function A(a,b){return r(a,b,{})}function B(a,b,c){var d=t(b),e=t(a),f=[],g=W[c];return g&&Q(g,function(a){aa.call(a.node,d)?f.push(a.callback):"leave"===c&&aa.call(a.node,e)&&f.push(a.callback)}),f}function C(a,d,j){function k(c,d,e,f){y(function(){var c=B(p,a,d);c.length&&b(function(){Q(c,function(b){b(a,e,f)})})}),c.progress(d,e,f)}function l(b){v(a,w),_(a,w),o(a,w),w.domOperation(),x.complete(!b)}var m,p,w=N(j);a=i(a),a&&(m=t(a),p=a.parent()),w=n(w);var x=new s,y=z();if(R(w.addClass)&&(w.addClass=w.addClass.join(" ")),w.addClass&&!S(w.addClass)&&(w.addClass=null),R(w.removeClass)&&(w.removeClass=w.removeClass.join(" ")),w.removeClass&&!S(w.removeClass)&&(w.removeClass=null),w.from&&!T(w.from)&&(w.from=null),w.to&&!T(w.to)&&(w.to=null),!m)return l(),x;var C=[m.className,w.addClass,w.removeClass].join(" ");if(!$(C))return l(),x;var F=["enter","move","leave"].indexOf(d)>=0,M=L.hidden,O=!K||M||J.get(m),P=!O&&I.get(m)||{},U=!!P.state;if(O||U&&P.state==g||(O=!G(a,p,d)),O)return M&&k(x,d,"start"),l(),M&&k(x,d,"close"),x;F&&D(a);var V={structural:F,element:a,event:d,addClass:w.addClass,removeClass:w.removeClass,close:l,options:w,runner:x};if(U){var W=e("skip",a,V,P);if(W)return P.state===h?(l(),x):(r(a,P,V),P.runner);var X=e("cancel",a,V,P);if(X)if(P.state===h)P.runner.end();else{if(!P.structural)return r(a,P,V),P.runner;P.close()}else{var Y=e("join",a,V,P);if(Y){if(P.state!==h)return u(a,F?d:null,w),d=V.event=P.event,w=r(a,P,V),P.runner;A(a,V)}}}else A(a,V);var Z=V.structural;if(Z||(Z="animate"===V.event&&Object.keys(V.options.to||{}).length>0||f(V)),!Z)return l(),E(a),x;var aa=(P.counter||0)+1;return V.counter=aa,H(a,g,V),c.$$postDigest(function(){var b=I.get(m),c=!b;b=b||{};var e=a.parent()||[],g=e.length>0&&("animate"===b.event||b.structural||f(b));if(c||b.counter!==aa||!g)return c&&(_(a,w),o(a,w)),(c||F&&b.event!==d)&&(w.domOperation(),x.end()),void(g||E(a));d=!b.structural&&f(b,!0)?"setClass":b.event,H(a,h);var i=q(a,d,b.options);x.setHost(i),k(x,d,"start",{}),i.done(function(b){l(!b);var c=I.get(m);c&&c.counter===aa&&E(t(a)),k(x,d,"close",{})})}),x}function D(a){var b=t(a),c=b.querySelectorAll("["+Da+"]");Q(c,function(a){var b=parseInt(a.getAttribute(Da)),c=I.get(a);if(c)switch(b){case h:c.runner.end();case g:I.remove(a)}})}function E(a){var b=t(a);b.removeAttribute(Da),I.remove(b)}function F(a,b){return t(a)===t(b)}function G(a,b,c){var d,e=P(L.body),f=F(a,e)||"HTML"===a[0].nodeName,g=F(a,k),h=!1,i=J.get(t(a)),j=P.data(a[0],Ea);for(j&&(b=j),b=t(b);b&&(g||(g=F(b,k)),b.nodeType===Y);){var l=I.get(b)||{};if(!h){var m=J.get(b);if(m===!0&&i!==!1){i=!0;break}m===!1&&(i=!1),h=l.structural}if(U(d)||d===!0){var n=P.data(b,da);V(n)&&(d=n)}if(h&&d===!1)break;if(f||(f=F(b,e)),f&&g)break;b=g||!(j=P.data(b,Ea))?b.parentNode:t(j)}var o=(!h||d)&&i!==!0;return o&&g&&f}function H(a,b,c){c=c||{},c.state=b;var d=t(a);d.setAttribute(Da,b);var e=I.get(d),f=e?O(e,c):c;I.put(d,f)}var I=new p,J=new p,K=null,L=l[0]||{hidden:!0},M=c.$watch(function(){return 0===w.totalPendingRequests},function(a){a&&(M(),c.$$postDigest(function(){c.$$postDigest(function(){null===K&&(K=!0)})}))}),W={},Z=a.classNameFilter(),$=Z?function(a){return Z.test(a)}:function(){return!0},_=m(x),aa=Node.prototype.contains||function(a){return this===a||!!(16&this.compareDocumentPosition(a))};return{on:function(a,b,c){var d=j(b);W[a]=W[a]||[],W[a].push({node:d,callback:c})},off:function(a,b,c){function d(a,b,c){var d=j(b);return a.filter(function(a){var b=a.node===d&&(!c||a.callback===c);return!b})}var e=W[a];e&&(W[a]=1===arguments.length?null:d(e,b,c))},pin:function(a,b){d(X(a),"element","not an element"),d(X(b),"parentElement","not an element"),a.data(Ea,b)},push:function(a,b,c,d){return c=c||{},c.domOperation=d,C(a,b,c)},enabled:function(a,b){var c=arguments.length;if(0===c)b=!!K;else{var d=X(a);if(d){var e=t(a),f=J.get(e);1===c?b=!f:J.put(e,!b)}else b=K=!!a}return b}}}]}],Ga=["$animateProvider",function(a){function b(a,b){a.data(h,b)}function c(a){a.removeData(h)}function d(a){return a.data(h)}var f="ng-animate-ref",g=this.drivers=[],h="$$animationRunner";this.$get=["$$jqLite","$rootScope","$injector","$$AnimateRunner","$$HashMap","$$rAFScheduler",function(a,h,i,j,k,l){function p(a){function b(a){if(a.processed)return a;a.processed=!0;var c=a.domNode,d=c.parentNode;f.put(c,a);for(var g;d;){if(g=f.get(d)){g.processed||(g=b(g));break}d=d.parentNode}return(g||e).children.push(a),a}function c(a){var b,c=[],d=[];for(b=0;b=e&&(e=f,f=0,c.push(g),g=[]),g.push(h.fn),h.children.forEach(function(a){f++,d.push(a)}),e--}return g.length&&c.push(g), -c}var d,e={children:[]},f=new k;for(d=0;d=0,j=a.structural?u(g):[];if(j.length){var k=i?"to":"from";Q(j,function(a){var b=a.getAttribute(f);c[b]=c[b]||{},c[b][k]={animationID:d,element:P(a)}})}else b.push(a)});var d={},e={};return Q(c,function(c,f){var g=c.from,h=c.to;if(!g||!h){var i=g?g.animationID:h.animationID,j=i.toString();return void(d[j]||(d[j]=!0,b.push(a[i])))}var k=a[g.animationID],l=a[h.animationID],m=g.animationID.toString();if(!e[m]){var n=e[m]={structural:!0,beforeStart:function(){k.beforeStart(),l.beforeStart()},close:function(){k.close(),l.close()},classes:w(k.classes,l.classes),from:k,to:l,anchors:[]};n.classes.length?b.push(n):(b.push(k),b.push(l))}e[m].anchors.push({out:g.element,"in":h.element})}),b}function w(a,b){a=a.split(" "),b=b.split(" ");for(var c=[],d=0;d=0;b--){var c=g[b];if(i.has(c)){var d=i.get(c),e=d(a);if(e)return e}}}function y(){k.addClass(ca),F&&a.addClass(k,F),G&&(a.removeClass(k,G),G=null)}function z(a,b){function c(a){d(a).setHost(b)}a.from&&a.to?(c(a.from.element),c(a.to.element)):c(a.element)}function A(){var a=d(k);!a||"leave"===m&&s.$$domOperationFired||a.end()}function B(b){k.off("$destroy",A),c(k),r(k,s),o(k,s),s.domOperation(),F&&a.removeClass(k,F),k.removeClass(ca),D.complete(!b)}s=n(s);var C=["enter","move","leave"].indexOf(m)>=0,D=new j({end:function(){B()},cancel:function(){B(!0)}});if(!g.length)return B(),D;b(k,D);var E=e(k.attr("class"),e(s.addClass,s.removeClass)),F=s.tempClasses;F&&(E+=" "+F,s.tempClasses=null);var G;return C&&(G="ng-"+m+ba,a.addClass(k,G)),q.push({element:k,classes:E,event:m,structural:C,options:s,beforeStart:y,close:B}),k.on("$destroy",A),q.length>1?D:(h.$$postDigest(function(){var a=[];Q(q,function(b){d(b.element)?a.push(b):b.close()}),q.length=0;var b=v(a),c=[];Q(b,function(a){c.push({domNode:t(a.from?a.from.element:a.element),fn:function(){a.beforeStart();var b,c=a.close,e=a.anchors?a.from.element||a.to.element:a.element;if(d(e)){var f=x(a);f&&(b=f.start)}if(b){var g=b();g.done(function(a){c(!a)}),z(a,g)}else c()}})}),l(p(c))}),D)}}]}];b.module("ngAnimate",[]).directive("ngAnimateChildren",sa).factory("$$rAFScheduler",ra).provider("$$animateQueue",Fa).provider("$$animation",Ga).provider("$animateCss",za).provider("$$animateCssDriver",Aa).provider("$$animateJs",Ba).provider("$$animateJsDriver",Ca)}(window,window.angular),function(a,b,c){"use strict";function d(a,c,d){function e(a,d,e){var g,h;e=e||{},h=e.expires,g=b.isDefined(e.path)?e.path:f,b.isUndefined(d)&&(h="Thu, 01 Jan 1970 00:00:00 GMT",d=""),b.isString(h)&&(h=new Date(h));var i=encodeURIComponent(a)+"="+encodeURIComponent(d);i+=g?";path="+g:"",i+=e.domain?";domain="+e.domain:"",i+=h?";expires="+h.toUTCString():"",i+=e.secure?";secure":"";var j=i.length+1;return j>4096&&c.warn("Cookie '"+a+"' possibly not set or overflowed because it was too large ("+j+" > 4096 bytes)!"),i}var f=d.baseHref(),g=a[0];return function(a,b,c){g.cookie=e(a,b,c)}}b.module("ngCookies",["ng"]).provider("$cookies",[function(){function a(a){return a?b.extend({},d,a):d}var d=this.defaults={};this.$get=["$$cookieReader","$$cookieWriter",function(d,e){return{get:function(a){return d()[a]},getObject:function(a){var c=this.get(a);return c?b.fromJson(c):c},getAll:function(){return d()},put:function(b,c,d){e(b,c,a(d))},putObject:function(a,c,d){this.put(a,b.toJson(c),d)},remove:function(b,d){e(b,c,a(d))}}}]}]),b.module("ngCookies").factory("$cookieStore",["$cookies",function(a){return{get:function(b){return a.getObject(b)},put:function(b,c){a.putObject(b,c)},remove:function(b){a.remove(b)}}}]),d.$inject=["$document","$log","$browser"],b.module("ngCookies").provider("$$cookieWriter",function(){this.$get=d})}(window,window.angular),function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";function c(a,b,c){c=c||va;var d,e,f=c.createElement("script");if(f.text=a,b)for(d in wa)e=b[d]||b.getAttribute&&b.getAttribute(d),e&&f.setAttribute(d,e);c.head.appendChild(f).parentNode.removeChild(f)}function d(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?na[oa.call(a)]||"object":typeof a}function e(a){var b=!!a&&"length"in a&&a.length,c=d(a);return ta(a)||ua(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}function f(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()}function g(a,b,c){return ta(b)?ya.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?ya.grep(a,function(a){return a===b!==c}):"string"!=typeof b?ya.grep(a,function(a){return ma.call(b,a)>-1!==c}):ya.filter(b,a,c)}function h(a,b){for(;(a=a[b])&&1!==a.nodeType;);return a}function i(a){var b={};return ya.each(a.match(Ja)||[],function(a,c){b[c]=!0}),b}function j(a){return a}function k(a){throw a}function l(a,b,c,d){var e;try{a&&ta(e=a.promise)?e.call(a).done(b).fail(c):a&&ta(e=a.then)?e.call(a,b,c):b.apply(void 0,[a].slice(d))}catch(a){c.apply(void 0,[a])}}function m(){va.removeEventListener("DOMContentLoaded",m),a.removeEventListener("load",m),ya.ready()}function n(a,b){return b.toUpperCase()}function o(a){return a.replace(Na,"ms-").replace(Oa,n)}function p(){this.expando=ya.expando+p.uid++}function q(a){return"true"===a?!0:"false"===a?!1:"null"===a?null:a===+a+""?+a:Sa.test(a)?JSON.parse(a):a}function r(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Ta,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c=q(c)}catch(e){}Ra.set(a,b,c)}else c=void 0;return c}function s(a,b,c,d){var e,f,g=20,h=d?function(){return d.cur()}:function(){return ya.css(a,b,"")},i=h(),j=c&&c[3]||(ya.cssNumber[b]?"":"px"),k=a.nodeType&&(ya.cssNumber[b]||"px"!==j&&+i)&&Va.exec(ya.css(a,b));if(k&&k[3]!==j){for(i/=2,j=j||k[3],k=+i||1;g--;)ya.style(a,b,k+j),(1-f)*(1-(f=h()/i||.5))<=0&&(g=0),k/=f;k=2*k,ya.style(a,b,k+j),c=c||[]}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}function t(a){var b,c=a.ownerDocument,d=a.nodeName,e=_a[d];return e?e:(b=c.body.appendChild(c.createElement(d)),e=ya.css(b,"display"),b.parentNode.removeChild(b),"none"===e&&(e="block"),_a[d]=e,e)}function u(a,b){for(var c,d,e=[],f=0,g=a.length;g>f;f++)d=a[f],d.style&&(c=d.style.display,b?("none"===c&&(e[f]=Qa.get(d,"display")||null,e[f]||(d.style.display="")),""===d.style.display&&$a(d)&&(e[f]=t(d))):"none"!==c&&(e[f]="none",Qa.set(d,"display",c)));for(f=0;g>f;f++)null!=e[f]&&(a[f].style.display=e[f]);return a}function v(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&f(a,b)?ya.merge([a],c):c}function w(a,b){for(var c=0,d=a.length;d>c;c++)Qa.set(a[c],"globalEval",!b||Qa.get(b[c],"globalEval"))}function x(a,b,c,e,f){for(var g,h,i,j,k,l,m=b.createDocumentFragment(),n=[],o=0,p=a.length;p>o;o++)if(g=a[o],g||0===g)if("object"===d(g))ya.merge(n,g.nodeType?[g]:g);else if(eb.test(g)){for(h=h||m.appendChild(b.createElement("div")),i=(bb.exec(g)||["",""])[1].toLowerCase(),j=db[i]||db._default,h.innerHTML=j[1]+ya.htmlPrefilter(g)+j[2],l=j[0];l--;)h=h.lastChild;ya.merge(n,h.childNodes),h=m.firstChild,h.textContent=""}else n.push(b.createTextNode(g));for(m.textContent="",o=0;g=n[o++];)if(e&&ya.inArray(g,e)>-1)f&&f.push(g);else if(k=Ya(g),h=v(m.appendChild(g),"script"),k&&w(h),c)for(l=0;g=h[l++];)cb.test(g.type||"")&&c.push(g);return m}function y(){return!0}function z(){return!1}function A(a,b){return a===B()==("focus"===b)}function B(){try{return va.activeElement}catch(a){}}function C(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)C(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=z;else if(!e)return a;return 1===f&&(g=e,e=function(a){return ya().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=ya.guid++)),a.each(function(){ya.event.add(this,b,e,d,c)})}function D(a,b,c){return c?(Qa.set(a,b,!1),void ya.event.add(a,b,{namespace:!1,handler:function(a){var d,e,f=Qa.get(this,b);if(1&a.isTrigger&&this[b]){if(f.length)(ya.event.special[b]||{}).delegateType&&a.stopPropagation();else if(f=ja.call(arguments),Qa.set(this,b,f),d=c(this,b),this[b](),e=Qa.get(this,b),f!==e||d?Qa.set(this,b,!1):e={},f!==e)return a.stopImmediatePropagation(),a.preventDefault(),e&&e.value}else f.length&&(Qa.set(this,b,{value:ya.event.trigger(ya.extend(f[0],ya.Event.prototype),f.slice(1),this)}),a.stopImmediatePropagation())}})):void(void 0===Qa.get(a,b)&&ya.event.add(a,b,y))}function E(a,b){return f(a,"table")&&f(11!==b.nodeType?b:b.firstChild,"tr")?ya(a).children("tbody")[0]||a:a}function F(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function G(a){return"true/"===(a.type||"").slice(0,5)?a.type=a.type.slice(5):a.removeAttribute("type"),a}function H(a,b){var c,d,e,f,g,h,i;if(1===b.nodeType){if(Qa.hasData(a)&&(f=Qa.get(a),i=f.events)){Qa.remove(b,"handle events");for(e in i)for(c=0,d=i[e].length;d>c;c++)ya.event.add(b,e,i[e][c])}Ra.hasData(a)&&(g=Ra.access(a),h=ya.extend({},g),Ra.set(b,h))}}function I(a,b){var c=b.nodeName.toLowerCase();"input"===c&&ab.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}function J(a,b,d,e){b=ka(b);var f,g,h,i,j,k,l=0,m=a.length,n=m-1,o=b[0],p=ta(o);if(p||m>1&&"string"==typeof o&&!sa.checkClone&&hb.test(o))return a.each(function(c){var f=a.eq(c);p&&(b[0]=o.call(this,c,f.html())),J(f,b,d,e)});if(m&&(f=x(b,a[0].ownerDocument,!1,a,e),g=f.firstChild,1===f.childNodes.length&&(f=g),g||e)){for(h=ya.map(v(f,"script"),F),i=h.length;m>l;l++)j=f,l!==n&&(j=ya.clone(j,!0,!0),i&&ya.merge(h,v(j,"script"))),d.call(a[l],j,l);if(i)for(k=h[h.length-1].ownerDocument,ya.map(h,G),l=0;i>l;l++)j=h[l],cb.test(j.type||"")&&!Qa.access(j,"globalEval")&&ya.contains(k,j)&&(j.src&&"module"!==(j.type||"").toLowerCase()?ya._evalUrl&&!j.noModule&&ya._evalUrl(j.src,{nonce:j.nonce||j.getAttribute("nonce")},k):c(j.textContent.replace(ib,""),j,k))}return a}function K(a,b,c){for(var d,e=b?ya.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||ya.cleanData(v(d)),d.parentNode&&(c&&Ya(d)&&w(v(d,"script")),d.parentNode.removeChild(d));return a}function L(a,b,c){var d,e,f,g,h=kb.test(b),i=a.style;return c=c||lb(a),c&&(g=c.getPropertyValue(b)||c[b],h&&g&&(g=g.replace(pb,"$1")||void 0),""!==g||Ya(a)||(g=ya.style(a,b)),!sa.pixelBoxStyles()&&jb.test(g)&&nb.test(b)&&(d=i.width,e=i.minWidth,f=i.maxWidth,i.minWidth=i.maxWidth=i.width=g,g=c.width,i.width=d,i.minWidth=e,i.maxWidth=f)),void 0!==g?g+"":g}function M(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}function N(a){for(var b=a[0].toUpperCase()+a.slice(1),c=qb.length;c--;)if(a=qb[c]+b,a in rb)return a}function O(a){var b=ya.cssProps[a]||sb[a];return b?b:a in rb?a:sb[a]=N(a)||a}function P(a,b,c){var d=Va.exec(b);return d?Math.max(0,d[2]-(c||0))+(d[3]||"px"):b}function Q(a,b,c,d,e,f){var g="width"===b?1:0,h=0,i=0;if(c===(d?"border":"content"))return 0;for(;4>g;g+=2)"margin"===c&&(i+=ya.css(a,c+Wa[g],!0,e)),d?("content"===c&&(i-=ya.css(a,"padding"+Wa[g],!0,e)),"margin"!==c&&(i-=ya.css(a,"border"+Wa[g]+"Width",!0,e))):(i+=ya.css(a,"padding"+Wa[g],!0,e),"padding"!==c?i+=ya.css(a,"border"+Wa[g]+"Width",!0,e):h+=ya.css(a,"border"+Wa[g]+"Width",!0,e));return!d&&f>=0&&(i+=Math.max(0,Math.ceil(a["offset"+b[0].toUpperCase()+b.slice(1)]-f-i-h-.5))||0),i}function R(a,b,c){var d=lb(a),e=!sa.boxSizingReliable()||c,g=e&&"border-box"===ya.css(a,"boxSizing",!1,d),h=g,i=L(a,b,d),j="offset"+b[0].toUpperCase()+b.slice(1);if(jb.test(i)){if(!c)return i;i="auto"}return(!sa.boxSizingReliable()&&g||!sa.reliableTrDimensions()&&f(a,"tr")||"auto"===i||!parseFloat(i)&&"inline"===ya.css(a,"display",!1,d))&&a.getClientRects().length&&(g="border-box"===ya.css(a,"boxSizing",!1,d),h=j in a,h&&(i=a[j])),i=parseFloat(i)||0,i+Q(a,b,c||(g?"border":"content"),h,d,i)+"px"}function S(a,b,c,d,e){return new S.prototype.init(a,b,c,d,e)}function T(){xb&&(va.hidden===!1&&a.requestAnimationFrame?a.requestAnimationFrame(T):a.setTimeout(T,ya.fx.interval),ya.fx.tick())}function U(){return a.setTimeout(function(){wb=void 0}),wb=Date.now()}function V(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=Wa[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function W(a,b,c){for(var d,e=(Z.tweeners[b]||[]).concat(Z.tweeners["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function X(a,b,c){var d,e,f,g,h,i,j,k,l="width"in b||"height"in b,m=this,n={},o=a.style,p=a.nodeType&&$a(a),q=Qa.get(a,"fxshow");c.queue||(g=ya._queueHooks(a,"fx"),null==g.unqueued&&(g.unqueued=0,h=g.empty.fire,g.empty.fire=function(){g.unqueued||h()}),g.unqueued++,m.always(function(){m.always(function(){g.unqueued--,ya.queue(a,"fx").length||g.empty.fire()})}));for(d in b)if(e=b[d],yb.test(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}n[d]=q&&q[d]||ya.style(a,d)}if(i=!ya.isEmptyObject(b),i||!ya.isEmptyObject(n)){l&&1===a.nodeType&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=q&&q.display,null==j&&(j=Qa.get(a,"display")),k=ya.css(a,"display"),"none"===k&&(j?k=j:(u([a],!0),j=a.style.display||j,k=ya.css(a,"display"),u([a]))),("inline"===k||"inline-block"===k&&null!=j)&&"none"===ya.css(a,"float")&&(i||(m.done(function(){o.display=j}),null==j&&(k=o.display,j="none"===k?"":k)),o.display="inline-block")),c.overflow&&(o.overflow="hidden",m.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]})),i=!1;for(d in n)i||(q?"hidden"in q&&(p=q.hidden):q=Qa.access(a,"fxshow",{display:j}),f&&(q.hidden=!p),p&&u([a],!0),m.done(function(){p||u([a]),Qa.remove(a,"fxshow");for(d in n)ya.style(a,d,n[d])})),i=W(p?q[d]:0,d,m),d in q||(q[d]=i.start,p&&(i.end=i.start,i.start=0))}}function Y(a,b){var c,d,e,f,g;for(c in a)if(d=o(c),e=b[d],f=a[c],Array.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=ya.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function Z(a,b,c){var d,e,f=0,g=Z.prefilters.length,h=ya.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=wb||U(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(i||h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:ya.extend({},b),opts:ya.extend(!0,{specialEasing:{},easing:ya.easing._default},c),originalProperties:b,originalOptions:c,startTime:wb||U(),duration:c.duration,tweens:[],createTween:function(b,c){var d=ya.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for(Y(k,j.opts.specialEasing);g>f;f++)if(d=Z.prefilters[f].call(j,a,k,j.opts))return ta(d.stop)&&(ya._queueHooks(j.elem,j.opts.queue).stop=d.stop.bind(d)),d;return ya.map(k,W,j),ta(j.opts.start)&&j.opts.start.call(a,j),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always),ya.fx.timer(ya.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j}function $(a){var b=a.match(Ja)||[];return b.join(" ")}function _(a){return a.getAttribute&&a.getAttribute("class")||""}function aa(a){return Array.isArray(a)?a:"string"==typeof a?a.match(Ja)||[]:[]}function ba(a,b,c,e){var f;if(Array.isArray(b))ya.each(b,function(b,d){c||Kb.test(a)?e(a,d):ba(a+"["+("object"==typeof d&&null!=d?b:"")+"]",d,c,e)});else if(c||"object"!==d(b))e(a,b);else for(f in b)ba(a+"["+f+"]",b[f],c,e)}function ca(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(Ja)||[];if(ta(c))for(;d=f[e++];)"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function da(a,b,c,d){function e(h){var i;return f[h]=!0,ya.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||g||f[j]?g?!(i=j):void 0:(b.dataTypes.unshift(j),e(j),!1)}),i}var f={},g=a===Wb;return e(b.dataTypes[0])||!f["*"]&&e("*")}function ea(a,b){var c,d,e=ya.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&ya.extend(!0,a,d),a}function fa(a,b,c){for(var d,e,f,g,h=a.contents,i=a.dataTypes;"*"===i[0];)i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function ga(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];for(f=k.shift();f;)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}var ha=[],ia=Object.getPrototypeOf,ja=ha.slice,ka=ha.flat?function(a){return ha.flat.call(a)}:function(a){return ha.concat.apply([],a)},la=ha.push,ma=ha.indexOf,na={},oa=na.toString,pa=na.hasOwnProperty,qa=pa.toString,ra=qa.call(Object),sa={},ta=function(a){return"function"==typeof a&&"number"!=typeof a.nodeType&&"function"!=typeof a.item},ua=function(a){return null!=a&&a===a.window},va=a.document,wa={type:!0,src:!0,nonce:!0,noModule:!0},xa="3.6.4",ya=function(a,b){return new ya.fn.init(a,b)};ya.fn=ya.prototype={jquery:xa,constructor:ya,length:0,toArray:function(){return ja.call(this)},get:function(a){return null==a?ja.call(this):0>a?this[a+this.length]:this[a]},pushStack:function(a){var b=ya.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return ya.each(this,a)},map:function(a){return this.pushStack(ya.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(ja.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(ya.grep(this,function(a,b){return(b+1)%2}))},odd:function(){return this.pushStack(ya.grep(this,function(a,b){return b%2}))},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:la,sort:ha.sort,splice:ha.splice},ya.extend=ya.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||ta(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)d=a[b],"__proto__"!==b&&g!==d&&(j&&d&&(ya.isPlainObject(d)||(e=Array.isArray(d)))?(c=g[b],f=e&&!Array.isArray(c)?[]:e||ya.isPlainObject(c)?c:{},e=!1,g[b]=ya.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},ya.extend({expando:"jQuery"+(xa+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isPlainObject:function(a){var b,c;return a&&"[object Object]"===oa.call(a)?(b=ia(a))?(c=pa.call(b,"constructor")&&b.constructor,"function"==typeof c&&qa.call(c)===ra):!0:!1},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},globalEval:function(a,b,d){c(a,{nonce:b&&b.nonce},d)},each:function(a,b){var c,d=0;if(e(a))for(c=a.length;c>d&&b.call(a[d],d,a[d])!==!1;d++);else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},makeArray:function(a,b){var c=b||[];return null!=a&&(e(Object(a))?ya.merge(c,"string"==typeof a?[a]:a):la.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:ma.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f,g=0,h=[];if(e(a))for(d=a.length;d>g;g++)f=b(a[g],g,c),null!=f&&h.push(f);else for(g in a)f=b(a[g],g,c),null!=f&&h.push(f);return ka(h)},guid:1,support:sa}),"function"==typeof Symbol&&(ya.fn[Symbol.iterator]=ha[Symbol.iterator]),ya.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){na["[object "+b+"]"]=b.toLowerCase()});var za=function(a){function b(a,b,c,d){var e,f,g,h,i,j,k,m=b&&b.ownerDocument,o=b?b.nodeType:9;if(c=c||[],"string"!=typeof a||!a||1!==o&&9!==o&&11!==o)return c;if(!d&&(G(b),b=b||H,J)){if(11!==o&&(i=ta.exec(a)))if(e=i[1]){if(9===o){if(!(g=b.getElementById(e)))return c;if(g.id===e)return c.push(g),c}else if(m&&(g=m.getElementById(e))&&N(b,g)&&g.id===e)return c.push(g),c}else{if(i[2])return _.apply(c,b.getElementsByTagName(a)),c;if((e=i[3])&&w.getElementsByClassName&&b.getElementsByClassName)return _.apply(c,b.getElementsByClassName(e)),c}if(w.qsa&&!V[a+" "]&&(!K||!K.test(a))&&(1!==o||"object"!==b.nodeName.toLowerCase())){if(k=a,m=b,1===o&&(la.test(a)||ka.test(a))){for(m=ua.test(a)&&l(b.parentNode)||b,m===b&&w.scope||((h=b.getAttribute("id"))?h=h.replace(xa,ya):b.setAttribute("id",h=O)),j=A(a),f=j.length;f--;)j[f]=(h?"#"+h:":scope")+" "+n(j[f]);k=j.join(",")}try{return _.apply(c,m.querySelectorAll(k)),c}catch(p){V(a,!0)}finally{h===O&&b.removeAttribute("id")}}}return C(a.replace(ia,"$1"),b,c,d)}function c(){function a(c,d){return b.push(c+" ")>x.cacheLength&&delete a[b.shift()],a[c+" "]=d}var b=[];return a}function d(a){return a[O]=!0,a}function e(a){var b=H.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function f(a,b){for(var c=a.split("|"),d=c.length;d--;)x.attrHandle[c[d]]=b}function g(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)for(;c=c.nextSibling;)if(c===b)return-1;return a?1:-1}function h(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function i(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function j(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&Aa(b)===a:b.disabled===a:"label"in b?b.disabled===a:!1}}function k(a){return d(function(b){return b=+b,d(function(c,d){for(var e,f=a([],c.length,b),g=f.length;g--;)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function l(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}function m(){}function n(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function o(a,b,c){var d=b.dir,e=b.next,f=e||d,g=c&&"parentNode"===f,h=R++;return b.first?function(b,c,e){for(;b=b[d];)if(1===b.nodeType||g)return a(b,c,e);return!1}:function(b,c,i){var j,k,l,m=[Q,h];if(i){for(;b=b[d];)if((1===b.nodeType||g)&&a(b,c,i))return!0}else for(;b=b[d];)if(1===b.nodeType||g)if(l=b[O]||(b[O]={}),k=l[b.uniqueID]||(l[b.uniqueID]={}),e&&e===b.nodeName.toLowerCase())b=b[d]||b;else{if((j=k[f])&&j[0]===Q&&j[1]===h)return m[2]=j[2];if(k[f]=m,m[2]=a(b,c,i))return!0}return!1}}function p(a){return a.length>1?function(b,c,d){for(var e=a.length;e--;)if(!a[e](b,c,d))return!1;return!0}:a[0]}function q(a,c,d){for(var e=0,f=c.length;f>e;e++)b(a,c[e],d);return d}function r(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function s(a,b,c,e,f,g){return e&&!e[O]&&(e=s(e)),f&&!f[O]&&(f=s(f,g)),d(function(d,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=d||q(b||"*",h.nodeType?[h]:h,[]),s=!a||!d&&b?p:r(p,m,a,h,i),t=c?f||(d?a:o||e)?[]:g:s;if(c&&c(s,t,h,i),e)for(j=r(t,n),e(j,[],h,i),k=j.length;k--;)(l=j[k])&&(t[n[k]]=!(s[n[k]]=l));if(d){if(f||a){if(f){for(j=[],k=t.length;k--;)(l=t[k])&&j.push(s[k]=l);f(null,t=[],j,i)}for(k=t.length;k--;)(l=t[k])&&(j=f?ba(d,l):m[k])>-1&&(d[j]=!(g[j]=l))}}else t=r(t===g?t.splice(o,t.length):t),f?f(null,g,t,i):_.apply(g,t)})}function t(a){for(var b,c,d,e=a.length,f=x.relative[a[0].type],g=f||x.relative[" "],h=f?1:0,i=o(function(a){return a===b},g,!0),j=o(function(a){return ba(b,a)>-1},g,!0),k=[function(a,c,d){var e=!f&&(d||c!==D)||((b=c).nodeType?i(a,c,d):j(a,c,d));return b=null,e}];e>h;h++)if(c=x.relative[a[h].type])k=[o(p(k),c)];else{if(c=x.filter[a[h].type].apply(null,a[h].matches),c[O]){for(d=++h;e>d&&!x.relative[a[d].type];d++);return s(h>1&&p(k),h>1&&n(a.slice(0,h-1).concat({value:" "===a[h-2].type?"*":""})).replace(ia,"$1"),c,d>h&&t(a.slice(h,d)),e>d&&t(a=a.slice(d)),e>d&&n(a))}k.push(c)}return p(k)}function u(a,c){var e=c.length>0,f=a.length>0,g=function(d,g,h,i,j){var k,l,m,n=0,o="0",p=d&&[],q=[],s=D,t=d||f&&x.find.TAG("*",j),u=Q+=null==s?1:Math.random()||.1,v=t.length;for(j&&(D=g==H||g||j);o!==v&&null!=(k=t[o]);o++){if(f&&k){for(l=0,g||k.ownerDocument==H||(G(k),h=!J);m=a[l++];)if(m(k,g||H,h)){i.push(k);break}j&&(Q=u)}e&&((k=!m&&k)&&n--,d&&p.push(k))}if(n+=o,e&&o!==n){for(l=0;m=c[l++];)m(p,q,g,h);if(d){if(n>0)for(;o--;)p[o]||q[o]||(q[o]=Z.call(i));q=r(q)}_.apply(i,q),j&&!d&&q.length>0&&n+c.length>1&&b.uniqueSort(i)}return j&&(Q=u,D=s),p};return e?d(g):g}var v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O="sizzle"+1*new Date,P=a.document,Q=0,R=0,S=c(),T=c(),U=c(),V=c(),W=function(a,b){return a===b&&(F=!0),0},X={}.hasOwnProperty,Y=[],Z=Y.pop,$=Y.push,_=Y.push,aa=Y.slice,ba=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},ca="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",da="[\\x20\\t\\r\\n\\f]",ea="(?:\\\\[\\da-fA-F]{1,6}"+da+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\x00-\\x7f])+",fa="\\["+da+"*("+ea+")(?:"+da+"*([*^$|!~]?=)"+da+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+ea+"))|)"+da+"*\\]",ga=":("+ea+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+fa+")*)|.*)\\)|)",ha=new RegExp(da+"+","g"),ia=new RegExp("^"+da+"+|((?:^|[^\\\\])(?:\\\\.)*)"+da+"+$","g"),ja=new RegExp("^"+da+"*,"+da+"*"),ka=new RegExp("^"+da+"*([>+~]|"+da+")"+da+"*"),la=new RegExp(da+"|>"),ma=new RegExp(ga),na=new RegExp("^"+ea+"$"),oa={ID:new RegExp("^#("+ea+")"),CLASS:new RegExp("^\\.("+ea+")"),TAG:new RegExp("^("+ea+"|[*])"),ATTR:new RegExp("^"+fa),PSEUDO:new RegExp("^"+ga),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+da+"*(even|odd|(([+-]|)(\\d*)n|)"+da+"*(?:([+-]|)"+da+"*(\\d+)|))"+da+"*\\)|)","i"),bool:new RegExp("^(?:"+ca+")$","i"),needsContext:new RegExp("^"+da+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+da+"*((?:-\\d)?\\d*)"+da+"*\\)|)(?=[^-]|$)","i")},pa=/HTML$/i,qa=/^(?:input|select|textarea|button)$/i,ra=/^h\d$/i,sa=/^[^{]+\{\s*\[native \w/,ta=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ua=/[+~]/,va=new RegExp("\\\\[\\da-fA-F]{1,6}"+da+"?|\\\\([^\\r\\n\\f])","g"),wa=function(a,b){var c="0x"+a.slice(1)-65536;return b?b:0>c?String.fromCharCode(c+65536):String.fromCharCode(c>>10|55296,1023&c|56320)},xa=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ya=function(a,b){return b?"\x00"===a?"�":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},za=function(){G()},Aa=o(function(a){return a.disabled===!0&&"fieldset"===a.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{_.apply(Y=aa.call(P.childNodes),P.childNodes),Y[P.childNodes.length].nodeType}catch(Ba){_={apply:Y.length?function(a,b){$.apply(a,aa.call(b))}:function(a,b){for(var c=a.length,d=0;a[c++]=b[d++];);a.length=c-1}}}w=b.support={},z=b.isXML=function(a){var b=a&&a.namespaceURI,c=a&&(a.ownerDocument||a).documentElement;return!pa.test(b||c&&c.nodeName||"HTML")},G=b.setDocument=function(a){var b,c,d=a?a.ownerDocument||a:P;return d!=H&&9===d.nodeType&&d.documentElement?(H=d,I=H.documentElement,J=!z(H),P!=H&&(c=H.defaultView)&&c.top!==c&&(c.addEventListener?c.addEventListener("unload",za,!1):c.attachEvent&&c.attachEvent("onunload",za)),w.scope=e(function(a){return I.appendChild(a).appendChild(H.createElement("div")),"undefined"!=typeof a.querySelectorAll&&!a.querySelectorAll(":scope fieldset div").length}),w.cssHas=e(function(){try{return H.querySelector(":has(*,:jqfake)"),!1}catch(a){return!0}}),w.attributes=e(function(a){return a.className="i",!a.getAttribute("className")}),w.getElementsByTagName=e(function(a){return a.appendChild(H.createComment("")),!a.getElementsByTagName("*").length}),w.getElementsByClassName=sa.test(H.getElementsByClassName),w.getById=e(function(a){return I.appendChild(a).id=O,!H.getElementsByName||!H.getElementsByName(O).length}),w.getById?(x.filter.ID=function(a){var b=a.replace(va,wa);return function(a){return a.getAttribute("id")===b}},x.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&J){var c=b.getElementById(a);return c?[c]:[]}}):(x.filter.ID=function(a){var b=a.replace(va,wa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},x.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&J){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];for(e=b.getElementsByName(a),d=0;f=e[d++];)if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),x.find.TAG=w.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):w.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){for(;c=f[e++];)1===c.nodeType&&d.push(c);return d}return f},x.find.CLASS=w.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&J?b.getElementsByClassName(a):void 0},L=[],K=[],(w.qsa=sa.test(H.querySelectorAll))&&(e(function(a){var b;I.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&K.push("[*^$]="+da+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||K.push("\\["+da+"*(?:value|"+ca+")"),a.querySelectorAll("[id~="+O+"-]").length||K.push("~="),b=H.createElement("input"),b.setAttribute("name",""),a.appendChild(b),a.querySelectorAll("[name='']").length||K.push("\\["+da+"*name"+da+"*="+da+"*(?:''|\"\")"),a.querySelectorAll(":checked").length||K.push(":checked"),a.querySelectorAll("a#"+O+"+*").length||K.push(".#.+[+~]"),a.querySelectorAll("\\\f"),K.push("[\\r\\n\\f]")}),e(function(a){a.innerHTML="";var b=H.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&K.push("name"+da+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&K.push(":enabled",":disabled"),I.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&K.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),K.push(",.*:")})),(w.matchesSelector=sa.test(M=I.matches||I.webkitMatchesSelector||I.mozMatchesSelector||I.oMatchesSelector||I.msMatchesSelector))&&e(function(a){w.disconnectedMatch=M.call(a,"*"),M.call(a,"[s!='']:x"),L.push("!=",ga)}),w.cssHas||K.push(":has"), -K=K.length&&new RegExp(K.join("|")),L=L.length&&new RegExp(L.join("|")),b=sa.test(I.compareDocumentPosition),N=b||sa.test(I.contains)?function(a,b){var c=9===a.nodeType&&a.documentElement||a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)for(;b=b.parentNode;)if(b===a)return!0;return!1},W=b?function(a,b){if(a===b)return F=!0,0;var c=!a.compareDocumentPosition-!b.compareDocumentPosition;return c?c:(c=(a.ownerDocument||a)==(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&c||!w.sortDetached&&b.compareDocumentPosition(a)===c?a==H||a.ownerDocument==P&&N(P,a)?-1:b==H||b.ownerDocument==P&&N(P,b)?1:E?ba(E,a)-ba(E,b):0:4&c?-1:1)}:function(a,b){if(a===b)return F=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a==H?-1:b==H?1:e?-1:f?1:E?ba(E,a)-ba(E,b):0;if(e===f)return g(a,b);for(c=a;c=c.parentNode;)h.unshift(c);for(c=b;c=c.parentNode;)i.unshift(c);for(;h[d]===i[d];)d++;return d?g(h[d],i[d]):h[d]==P?-1:i[d]==P?1:0},H):H},b.matches=function(a,c){return b(a,null,null,c)},b.matchesSelector=function(a,c){if(G(a),w.matchesSelector&&J&&!V[c+" "]&&(!L||!L.test(c))&&(!K||!K.test(c)))try{var d=M.call(a,c);if(d||w.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){V(c,!0)}return b(c,H,null,[a]).length>0},b.contains=function(a,b){return(a.ownerDocument||a)!=H&&G(a),N(a,b)},b.attr=function(a,b){(a.ownerDocument||a)!=H&&G(a);var c=x.attrHandle[b.toLowerCase()],d=c&&X.call(x.attrHandle,b.toLowerCase())?c(a,b,!J):void 0;return void 0!==d?d:w.attributes||!J?a.getAttribute(b):(d=a.getAttributeNode(b))&&d.specified?d.value:null},b.escape=function(a){return(a+"").replace(xa,ya)},b.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},b.uniqueSort=function(a){var b,c=[],d=0,e=0;if(F=!w.detectDuplicates,E=!w.sortStable&&a.slice(0),a.sort(W),F){for(;b=a[e++];)b===a[e]&&(d=c.push(e));for(;d--;)a.splice(c[d],1)}return E=null,a},y=b.getText=function(a){var b,c="",d=0,e=a.nodeType;if(e){if(1===e||9===e||11===e){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=y(a)}else if(3===e||4===e)return a.nodeValue}else for(;b=a[d++];)c+=y(b);return c},x=b.selectors={cacheLength:50,createPseudo:d,match:oa,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(va,wa),a[3]=(a[3]||a[4]||a[5]||"").replace(va,wa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||b.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&b.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return oa.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&ma.test(c)&&(b=A(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(va,wa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=S[a+" "];return b||(b=new RegExp("(^|"+da+")"+a+"("+da+"|$)"))&&S(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,c,d){return function(e){var f=b.attr(e,a);return null==f?"!="===c:c?(f+="","="===c?f===d:"!="===c?f!==d:"^="===c?d&&0===f.indexOf(d):"*="===c?d&&f.indexOf(d)>-1:"$="===c?d&&f.slice(-d.length)===d:"~="===c?(" "+f.replace(ha," ")+" ").indexOf(d)>-1:"|="===c?f===d||f.slice(0,d.length+1)===d+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){for(;p;){for(m=b;m=m[p];)if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){for(m=q,l=m[O]||(m[O]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===Q&&j[1],t=n&&j[2],m=n&&q.childNodes[n];m=++n&&m&&m[p]||(t=n=0)||o.pop();)if(1===m.nodeType&&++t&&m===b){k[a]=[Q,n,t];break}}else if(s&&(m=b,l=m[O]||(m[O]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===Q&&j[1],t=n),t===!1)for(;(m=++n&&m&&m[p]||(t=n=0)||o.pop())&&((h?m.nodeName.toLowerCase()!==r:1!==m.nodeType)||!++t||(s&&(l=m[O]||(m[O]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[Q,t]),m!==b)););return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,c){var e,f=x.pseudos[a]||x.setFilters[a.toLowerCase()]||b.error("unsupported pseudo: "+a);return f[O]?f(c):f.length>1?(e=[a,a,"",c],x.setFilters.hasOwnProperty(a.toLowerCase())?d(function(a,b){for(var d,e=f(a,c),g=e.length;g--;)d=ba(a,e[g]),a[d]=!(b[d]=e[g])}):function(a){return f(a,0,e)}):f}},pseudos:{not:d(function(a){var b=[],c=[],e=B(a.replace(ia,"$1"));return e[O]?d(function(a,b,c,d){for(var f,g=e(a,null,d,[]),h=a.length;h--;)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,d,f){return b[0]=a,e(b,null,f,c),b[0]=null,!c.pop()}}),has:d(function(a){return function(c){return b(a,c).length>0}}),contains:d(function(a){return a=a.replace(va,wa),function(b){return(b.textContent||y(b)).indexOf(a)>-1}}),lang:d(function(a){return na.test(a||"")||b.error("unsupported lang: "+a),a=a.replace(va,wa).toLowerCase(),function(b){var c;do if(c=J?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===I},focus:function(a){return a===H.activeElement&&(!H.hasFocus||H.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:j(!1),disabled:j(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!x.pseudos.empty(a)},header:function(a){return ra.test(a.nodeName)},input:function(a){return qa.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:k(function(){return[0]}),last:k(function(a,b){return[b-1]}),eq:k(function(a,b,c){return[0>c?c+b:c]}),even:k(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:k(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:k(function(a,b,c){for(var d=0>c?c+b:c>b?b:c;--d>=0;)a.push(d);return a}),gt:k(function(a,b,c){for(var d=0>c?c+b:c;++d2&&"ID"===(g=f[0]).type&&9===b.nodeType&&J&&x.relative[f[1].type]){if(b=(x.find.ID(g.matches[0].replace(va,wa),b)||[])[0],!b)return c;j&&(b=b.parentNode),a=a.slice(f.shift().value.length)}for(e=oa.needsContext.test(a)?0:f.length;e--&&(g=f[e],!x.relative[h=g.type]);)if((i=x.find[h])&&(d=i(g.matches[0].replace(va,wa),ua.test(f[0].type)&&l(b.parentNode)||b))){if(f.splice(e,1),a=d.length&&n(f),!a)return _.apply(c,d),c;break}}return(j||B(a,k))(d,b,!J,c,!b||ua.test(a)&&l(b.parentNode)||b),c},w.sortStable=O.split("").sort(W).join("")===O,w.detectDuplicates=!!F,G(),w.sortDetached=e(function(a){return 1&a.compareDocumentPosition(H.createElement("fieldset"))}),e(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||f("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),w.attributes&&e(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||f("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),e(function(a){return null==a.getAttribute("disabled")})||f(ca,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),b}(a);ya.find=za,ya.expr=za.selectors,ya.expr[":"]=ya.expr.pseudos,ya.uniqueSort=ya.unique=za.uniqueSort,ya.text=za.getText,ya.isXMLDoc=za.isXML,ya.contains=za.contains,ya.escapeSelector=za.escape;var Aa=function(a,b,c){for(var d=[],e=void 0!==c;(a=a[b])&&9!==a.nodeType;)if(1===a.nodeType){if(e&&ya(a).is(c))break;d.push(a)}return d},Ba=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},Ca=ya.expr.match.needsContext,Da=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;ya.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?ya.find.matchesSelector(d,a)?[d]:[]:ya.find.matches(a,ya.grep(b,function(a){return 1===a.nodeType}))},ya.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(ya(a).filter(function(){for(b=0;d>b;b++)if(ya.contains(e[b],this))return!0}));for(c=this.pushStack([]),b=0;d>b;b++)ya.find(a,e[b],c);return d>1?ya.uniqueSort(c):c},filter:function(a){return this.pushStack(g(this,a||[],!1))},not:function(a){return this.pushStack(g(this,a||[],!0))},is:function(a){return!!g(this,"string"==typeof a&&Ca.test(a)?ya(a):a||[],!1).length}});var Ea,Fa=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,Ga=ya.fn.init=function(a,b,c){var d,e;if(!a)return this;if(c=c||Ea,"string"==typeof a){if(d="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:Fa.exec(a),!d||!d[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(d[1]){if(b=b instanceof ya?b[0]:b,ya.merge(this,ya.parseHTML(d[1],b&&b.nodeType?b.ownerDocument||b:va,!0)),Da.test(d[1])&&ya.isPlainObject(b))for(d in b)ta(this[d])?this[d](b[d]):this.attr(d,b[d]);return this}return e=va.getElementById(d[2]),e&&(this[0]=e,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):ta(a)?void 0!==c.ready?c.ready(a):a(ya):ya.makeArray(a,this)};Ga.prototype=ya.fn,Ea=ya(va);var Ha=/^(?:parents|prev(?:Until|All))/,Ia={children:!0,contents:!0,next:!0,prev:!0};ya.fn.extend({has:function(a){var b=ya(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(ya.contains(this,b[a]))return!0})},closest:function(a,b){var c,d=0,e=this.length,f=[],g="string"!=typeof a&&ya(a);if(!Ca.test(a))for(;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&ya.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?ya.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?ma.call(ya(a),this[0]):ma.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(ya.uniqueSort(ya.merge(this.get(),ya(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}}),ya.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return Aa(a,"parentNode")},parentsUntil:function(a,b,c){return Aa(a,"parentNode",c)},next:function(a){return h(a,"nextSibling")},prev:function(a){return h(a,"previousSibling")},nextAll:function(a){return Aa(a,"nextSibling")},prevAll:function(a){return Aa(a,"previousSibling")},nextUntil:function(a,b,c){return Aa(a,"nextSibling",c)},prevUntil:function(a,b,c){return Aa(a,"previousSibling",c)},siblings:function(a){return Ba((a.parentNode||{}).firstChild,a)},children:function(a){return Ba(a.firstChild)},contents:function(a){return null!=a.contentDocument&&ia(a.contentDocument)?a.contentDocument:(f(a,"template")&&(a=a.content||a),ya.merge([],a.childNodes))}},function(a,b){ya.fn[a]=function(c,d){var e=ya.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=ya.filter(d,e)),this.length>1&&(Ia[a]||ya.uniqueSort(e),Ha.test(a)&&e.reverse()),this.pushStack(e)}});var Ja=/[^\x20\t\r\n\f]+/g;ya.Callbacks=function(a){a="string"==typeof a?i(a):ya.extend({},a);var b,c,e,f,g=[],h=[],j=-1,k=function(){for(f=f||a.once,e=b=!0;h.length;j=-1)for(c=h.shift();++j-1;)g.splice(c,1),j>=c&&j--}),this},has:function(a){return a?ya.inArray(a,g)>-1:g.length>0},empty:function(){return g&&(g=[]),this},disable:function(){return f=h=[],g=c="",this},disabled:function(){return!g},lock:function(){return f=h=[],c||b||(g=c=""),this},locked:function(){return!!f},fireWith:function(a,c){return f||(c=c||[],c=[a,c.slice?c.slice():c],h.push(c),b||k()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!e}};return l},ya.extend({Deferred:function(b){var c=[["notify","progress",ya.Callbacks("memory"),ya.Callbacks("memory"),2],["resolve","done",ya.Callbacks("once memory"),ya.Callbacks("once memory"),0,"resolved"],["reject","fail",ya.Callbacks("once memory"),ya.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return ya.Deferred(function(b){ya.each(c,function(c,d){var e=ta(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&ta(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){function f(b,c,d,e){return function(){var h=this,i=arguments,l=function(){var a,l;if(!(g>b)){if(a=d.apply(h,i),a===c.promise())throw new TypeError("Thenable self-resolution");l=a&&("object"==typeof a||"function"==typeof a)&&a.then,ta(l)?e?l.call(a,f(g,c,j,e),f(g,c,k,e)):(g++,l.call(a,f(g,c,j,e),f(g,c,k,e),f(g,c,j,c.notifyWith))):(d!==j&&(h=void 0,i=[a]),(e||c.resolveWith)(h,i))}},m=e?l:function(){try{l()}catch(a){ya.Deferred.exceptionHook&&ya.Deferred.exceptionHook(a,m.stackTrace),b+1>=g&&(d!==k&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?m():(ya.Deferred.getStackHook&&(m.stackTrace=ya.Deferred.getStackHook()),a.setTimeout(m))}}var g=0;return ya.Deferred(function(a){c[0][3].add(f(0,a,ta(e)?e:j,a.notifyWith)),c[1][3].add(f(0,a,ta(b)?b:j)),c[2][3].add(f(0,a,ta(d)?d:k))}).promise()},promise:function(a){return null!=a?ya.extend(a,e):e}},f={};return ya.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[3-a][3].disable,c[0][2].lock,c[0][3].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=ja.call(arguments),f=ya.Deferred(),g=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?ja.call(arguments):c,--b||f.resolveWith(d,e)}};if(1>=b&&(l(a,f.done(g(c)).resolve,f.reject,!b),"pending"===f.state()||ta(e[c]&&e[c].then)))return f.then();for(;c--;)l(e[c],g(c),f.reject);return f.promise()}});var Ka=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;ya.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&Ka.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},ya.readyException=function(b){a.setTimeout(function(){throw b})};var La=ya.Deferred();ya.fn.ready=function(a){return La.then(a)["catch"](function(a){ya.readyException(a)}),this},ya.extend({isReady:!1,readyWait:1,ready:function(a){(a===!0?--ya.readyWait:ya.isReady)||(ya.isReady=!0,a!==!0&&--ya.readyWait>0||La.resolveWith(va,[ya]))}}),ya.ready.then=La.then,"complete"===va.readyState||"loading"!==va.readyState&&!va.documentElement.doScroll?a.setTimeout(ya.ready):(va.addEventListener("DOMContentLoaded",m),a.addEventListener("load",m));var Ma=function(a,b,c,e,f,g,h){var i=0,j=a.length,k=null==c;if("object"===d(c)){f=!0;for(i in c)Ma(a,b,i,c[i],!0,g,h)}else if(void 0!==e&&(f=!0,ta(e)||(h=!0),k&&(h?(b.call(a,e),b=null):(k=b,b=function(a,b,c){return k.call(ya(a),c)})),b))for(;j>i;i++)b(a[i],c,h?e:e.call(a[i],i,b(a[i],c)));return f?a:k?b.call(a):j?b(a[0],c):g},Na=/^-ms-/,Oa=/-([a-z])/g,Pa=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};p.uid=1,p.prototype={cache:function(a){var b=a[this.expando];return b||(b={},Pa(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[o(b)]=c;else for(d in b)e[o(d)]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][o(b)]},access:function(a,b,c){return void 0===b||b&&"string"==typeof b&&void 0===c?this.get(a,b):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d=a[this.expando];if(void 0!==d){if(void 0!==b){Array.isArray(b)?b=b.map(o):(b=o(b),b=b in d?[b]:b.match(Ja)||[]),c=b.length;for(;c--;)delete d[b[c]]}(void 0===b||ya.isEmptyObject(d))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!ya.isEmptyObject(b)}};var Qa=new p,Ra=new p,Sa=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Ta=/[A-Z]/g;ya.extend({hasData:function(a){return Ra.hasData(a)||Qa.hasData(a)},data:function(a,b,c){return Ra.access(a,b,c)},removeData:function(a,b){Ra.remove(a,b)},_data:function(a,b,c){return Qa.access(a,b,c)},_removeData:function(a,b){Qa.remove(a,b)}}),ya.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=Ra.get(f),1===f.nodeType&&!Qa.get(f,"hasDataAttrs"))){for(c=g.length;c--;)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=o(d.slice(5)),r(f,d,e[d])));Qa.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){Ra.set(this,a)}):Ma(this,function(b){var c;if(f&&void 0===b){if(c=Ra.get(f,a),void 0!==c)return c;if(c=r(f,a),void 0!==c)return c}else this.each(function(){Ra.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){Ra.remove(this,a)})}}),ya.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=Qa.get(a,b),c&&(!d||Array.isArray(c)?d=Qa.access(a,b,ya.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=ya.queue(a,b),d=c.length,e=c.shift(),f=ya._queueHooks(a,b),g=function(){ya.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return Qa.get(a,c)||Qa.access(a,c,{empty:ya.Callbacks("once memory").add(function(){Qa.remove(a,[b+"queue",c])})})}}),ya.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length\x20\t\r\n\f]*)/i,cb=/^$|^module$|\/(?:java|ecma)script/i;!function(){var a=va.createDocumentFragment(),b=a.appendChild(va.createElement("div")),c=va.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),sa.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",sa.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,b.innerHTML="",sa.option=!!b.lastChild}();var db={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};db.tbody=db.tfoot=db.colgroup=db.caption=db.thead,db.th=db.td,sa.option||(db.optgroup=db.option=[1,""]);var eb=/<|&#?\w+;/,fb=/^([^.]*)(?:\.(.+)|)/;ya.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=Qa.get(a);if(Pa(a))for(c.handler&&(f=c,c=f.handler,e=f.selector),e&&ya.find.matchesSelector(Xa,e),c.guid||(c.guid=ya.guid++),(i=q.events)||(i=q.events=Object.create(null)),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof ya&&ya.event.triggered!==b.type?ya.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(Ja)||[""],j=b.length;j--;)h=fb.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=ya.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=ya.event.special[n]||{},k=ya.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&ya.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),ya.event.global[n]=!0)},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=Qa.hasData(a)&&Qa.get(a);if(q&&(i=q.events)){for(b=(b||"").match(Ja)||[""],j=b.length;j--;)if(h=fb.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){for(l=ya.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;f--;)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||ya.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)ya.event.remove(a,n+b[j],c,d,!0);ya.isEmptyObject(i)&&Qa.remove(a,"handle events")}},dispatch:function(a){var b,c,d,e,f,g,h=new Array(arguments.length),i=ya.event.fix(a),j=(Qa.get(this,"events")||Object.create(null))[i.type]||[],k=ya.event.special[i.type]||{};for(h[0]=i,b=1;b=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;i>c;c++)d=b[c],e=d.selector+" ",void 0===g[e]&&(g[e]=d.needsContext?ya(e,this).index(j)>-1:ya.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i\s*$/g;ya.extend({htmlPrefilter:function(a){return a},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=Ya(a);if(!(sa.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||ya.isXMLDoc(a)))for(g=v(h),f=v(a),d=0,e=f.length;e>d;d++)I(f[d],g[d]);if(b)if(c)for(f=f||v(a),g=g||v(h),d=0,e=f.length;e>d;d++)H(f[d],g[d]);else H(a,h);return g=v(h,"script"),g.length>0&&w(g,!i&&v(a,"script")),h},cleanData:function(a){for(var b,c,d,e=ya.event.special,f=0;void 0!==(c=a[f]);f++)if(Pa(c)){if(b=c[Qa.expando]){if(b.events)for(d in b.events)e[d]?ya.event.remove(c,d):ya.removeEvent(c,d,b.handle);c[Qa.expando]=void 0}c[Ra.expando]&&(c[Ra.expando]=void 0)}}}),ya.fn.extend({detach:function(a){return K(this,a,!0)},remove:function(a){return K(this,a)},text:function(a){return Ma(this,function(a){return void 0===a?ya.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return J(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=E(this,a);b.appendChild(a)}})},prepend:function(){return J(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=E(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return J(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return J(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(ya.cleanData(v(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return ya.clone(this,a,b)})},html:function(a){return Ma(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!gb.test(a)&&!db[(bb.exec(a)||["",""])[1].toLowerCase()]){a=ya.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(ya.cleanData(v(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return J(this,arguments,function(b){var c=this.parentNode;ya.inArray(this,a)<0&&(ya.cleanData(v(this)),c&&c.replaceChild(b,this))},a)}}),ya.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){ya.fn[a]=function(a){for(var c,d=[],e=ya(a),f=e.length-1,g=0;f>=g;g++)c=g===f?this:this.clone(!0),ya(e[g])[b](c),la.apply(d,c.get());return this.pushStack(d)}});var jb=new RegExp("^("+Ua+")(?!px)[a-z%]+$","i"),kb=/^--/,lb=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)},mb=function(a,b,c){var d,e,f={};for(e in b)f[e]=a.style[e],a.style[e]=b[e];d=c.call(a);for(e in b)a.style[e]=f[e];return d},nb=new RegExp(Wa.join("|"),"i"),ob="[\\x20\\t\\r\\n\\f]",pb=new RegExp("^"+ob+"+|((?:^|[^\\\\])(?:\\\\.)*)"+ob+"+$","g");!function(){function b(){if(k){j.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",k.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",Xa.appendChild(j).appendChild(k); -var b=a.getComputedStyle(k);d="1%"!==b.top,i=12===c(b.marginLeft),k.style.right="60%",g=36===c(b.right),e=36===c(b.width),k.style.position="absolute",f=12===c(k.offsetWidth/3),Xa.removeChild(j),k=null}}function c(a){return Math.round(parseFloat(a))}var d,e,f,g,h,i,j=va.createElement("div"),k=va.createElement("div");k.style&&(k.style.backgroundClip="content-box",k.cloneNode(!0).style.backgroundClip="",sa.clearCloneStyle="content-box"===k.style.backgroundClip,ya.extend(sa,{boxSizingReliable:function(){return b(),e},pixelBoxStyles:function(){return b(),g},pixelPosition:function(){return b(),d},reliableMarginLeft:function(){return b(),i},scrollboxSize:function(){return b(),f},reliableTrDimensions:function(){var b,c,d,e;return null==h&&(b=va.createElement("table"),c=va.createElement("tr"),d=va.createElement("div"),b.style.cssText="position:absolute;left:-11111px;border-collapse:separate",c.style.cssText="border:1px solid",c.style.height="1px",d.style.height="9px",d.style.display="block",Xa.appendChild(b).appendChild(c).appendChild(d),e=a.getComputedStyle(c),h=parseInt(e.height,10)+parseInt(e.borderTopWidth,10)+parseInt(e.borderBottomWidth,10)===c.offsetHeight,Xa.removeChild(b)),h}}))}();var qb=["Webkit","Moz","ms"],rb=va.createElement("div").style,sb={},tb=/^(none|table(?!-c[ea]).+)/,ub={position:"absolute",visibility:"hidden",display:"block"},vb={letterSpacing:"0",fontWeight:"400"};ya.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=L(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=o(b),i=kb.test(b),j=a.style;return i||(b=O(h)),g=ya.cssHooks[b]||ya.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:j[b]:(f=typeof c,"string"===f&&(e=Va.exec(c))&&e[1]&&(c=s(a,b,e),f="number"),null!=c&&c===c&&("number"!==f||i||(c+=e&&e[3]||(ya.cssNumber[h]?"":"px")),sa.clearCloneStyle||""!==c||0!==b.indexOf("background")||(j[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i?j.setProperty(b,c):j[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=o(b),i=kb.test(b);return i||(b=O(h)),g=ya.cssHooks[b]||ya.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=L(a,b,d)),"normal"===e&&b in vb&&(e=vb[b]),""===c||c?(f=parseFloat(e),c===!0||isFinite(f)?f||0:e):e}}),ya.each(["height","width"],function(a,b){ya.cssHooks[b]={get:function(a,c,d){return c?!tb.test(ya.css(a,"display"))||a.getClientRects().length&&a.getBoundingClientRect().width?R(a,b,d):mb(a,ub,function(){return R(a,b,d)}):void 0},set:function(a,c,d){var e,f=lb(a),g=!sa.scrollboxSize()&&"absolute"===f.position,h=g||d,i=h&&"border-box"===ya.css(a,"boxSizing",!1,f),j=d?Q(a,b,d,i,f):0;return i&&g&&(j-=Math.ceil(a["offset"+b[0].toUpperCase()+b.slice(1)]-parseFloat(f[b])-Q(a,b,"border",!1,f)-.5)),j&&(e=Va.exec(c))&&"px"!==(e[3]||"px")&&(a.style[b]=c,c=ya.css(a,b)),P(a,c,j)}}}),ya.cssHooks.marginLeft=M(sa.reliableMarginLeft,function(a,b){return b?(parseFloat(L(a,"marginLeft"))||a.getBoundingClientRect().left-mb(a,{marginLeft:0},function(){return a.getBoundingClientRect().left}))+"px":void 0}),ya.each({margin:"",padding:"",border:"Width"},function(a,b){ya.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+Wa[d]+b]=f[d]||f[d-2]||f[0];return e}},"margin"!==a&&(ya.cssHooks[a+b].set=P)}),ya.fn.extend({css:function(a,b){return Ma(this,function(a,b,c){var d,e,f={},g=0;if(Array.isArray(b)){for(d=lb(a),e=b.length;e>g;g++)f[b[g]]=ya.css(a,b[g],!1,d);return f}return void 0!==c?ya.style(a,b,c):ya.css(a,b)},a,b,arguments.length>1)}}),ya.Tween=S,S.prototype={constructor:S,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||ya.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(ya.cssNumber[c]?"":"px")},cur:function(){var a=S.propHooks[this.prop];return a&&a.get?a.get(this):S.propHooks._default.get(this)},run:function(a){var b,c=S.propHooks[this.prop];return this.options.duration?this.pos=b=ya.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):S.propHooks._default.set(this),this}},S.prototype.init.prototype=S.prototype,S.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=ya.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){ya.fx.step[a.prop]?ya.fx.step[a.prop](a):1!==a.elem.nodeType||!ya.cssHooks[a.prop]&&null==a.elem.style[O(a.prop)]?a.elem[a.prop]=a.now:ya.style(a.elem,a.prop,a.now+a.unit)}}},S.propHooks.scrollTop=S.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},ya.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},ya.fx=S.prototype.init,ya.fx.step={};var wb,xb,yb=/^(?:toggle|show|hide)$/,zb=/queueHooks$/;ya.Animation=ya.extend(Z,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return s(c.elem,a,Va.exec(b),c),c}]},tweener:function(a,b){ta(a)?(b=a,a=["*"]):a=a.match(Ja);for(var c,d=0,e=a.length;e>d;d++)c=a[d],Z.tweeners[c]=Z.tweeners[c]||[],Z.tweeners[c].unshift(b)},prefilters:[X],prefilter:function(a,b){b?Z.prefilters.unshift(a):Z.prefilters.push(a)}}),ya.speed=function(a,b,c){var d=a&&"object"==typeof a?ya.extend({},a):{complete:c||!c&&b||ta(a)&&a,duration:a,easing:c&&b||b&&!ta(b)&&b};return ya.fx.off?d.duration=0:"number"!=typeof d.duration&&(d.duration in ya.fx.speeds?d.duration=ya.fx.speeds[d.duration]:d.duration=ya.fx.speeds._default),(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){ta(d.old)&&d.old.call(this),d.queue&&ya.dequeue(this,d.queue)},d},ya.fn.extend({fadeTo:function(a,b,c,d){return this.filter($a).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=ya.isEmptyObject(a),f=ya.speed(b,c,d),g=function(){var b=Z(this,ya.extend({},a),f);(e||Qa.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=ya.timers,g=Qa.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&zb.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&ya.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=Qa.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=ya.timers,g=d?d.length:0;for(c.finish=!0,ya.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),ya.each(["toggle","show","hide"],function(a,b){var c=ya.fn[b];ya.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(V(b,!0),a,d,e)}}),ya.each({slideDown:V("show"),slideUp:V("hide"),slideToggle:V("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){ya.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),ya.timers=[],ya.fx.tick=function(){var a,b=0,c=ya.timers;for(wb=Date.now();b1)},removeAttr:function(a){return this.each(function(){ya.removeAttr(this,a)})}}),ya.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?ya.prop(a,b,c):(1===f&&ya.isXMLDoc(a)||(e=ya.attrHooks[b.toLowerCase()]||(ya.expr.match.bool.test(b)?Ab:void 0)),void 0!==c?null===c?void ya.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=ya.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!sa.radioValue&&"radio"===b&&f(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(Ja);if(e&&1===a.nodeType)for(;c=e[d++];)a.removeAttribute(c)}}),Ab={set:function(a,b,c){return b===!1?ya.removeAttr(a,c):a.setAttribute(c,c),c}},ya.each(ya.expr.match.bool.source.match(/\w+/g),function(a,b){var c=Bb[b]||ya.find.attr;Bb[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=Bb[g],Bb[g]=e,e=null!=c(a,b,d)?g:null,Bb[g]=f),e}});var Cb=/^(?:input|select|textarea|button)$/i,Db=/^(?:a|area)$/i;ya.fn.extend({prop:function(a,b){return Ma(this,ya.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[ya.propFix[a]||a]})}}),ya.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&ya.isXMLDoc(a)||(b=ya.propFix[b]||b,e=ya.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=ya.find.attr(a,"tabindex");return b?parseInt(b,10):Cb.test(a.nodeName)||Db.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),sa.optSelected||(ya.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),ya.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){ya.propFix[this.toLowerCase()]=this}),ya.fn.extend({addClass:function(a){var b,c,d,e,f,g;return ta(a)?this.each(function(b){ya(this).addClass(a.call(this,b,_(this)))}):(b=aa(a),b.length?this.each(function(){if(d=_(this),c=1===this.nodeType&&" "+$(d)+" "){for(f=0;f-1;)c=c.replace(" "+e+" "," ");g=$(c),d!==g&&this.setAttribute("class",g)}}):this):this.attr("class","")},toggleClass:function(a,b){var c,d,e,f,g=typeof a,h="string"===g||Array.isArray(a);return ta(a)?this.each(function(c){ya(this).toggleClass(a.call(this,c,_(this),b),b)}):"boolean"==typeof b&&h?b?this.addClass(a):this.removeClass(a):(c=aa(a),this.each(function(){if(h)for(f=ya(this),e=0;e-1)return!0;return!1}});var Eb=/\r/g;ya.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=ta(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,ya(this).val()):a,null==e?e="":"number"==typeof e?e+="":Array.isArray(e)&&(e=ya.map(e,function(a){return null==a?"":a+""})),b=ya.valHooks[this.type]||ya.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=ya.valHooks[e.type]||ya.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(Eb,""):null==c?"":c)}}}),ya.extend({valHooks:{option:{get:function(a){var b=ya.find.attr(a,"value");return null!=b?b:$(ya.text(a))}},select:{get:function(a){var b,c,d,e=a.options,g=a.selectedIndex,h="select-one"===a.type,i=h?null:[],j=h?g+1:e.length;for(d=0>g?j:h?g:0;j>d;d++)if(c=e[d],(c.selected||d===g)&&!c.disabled&&(!c.parentNode.disabled||!f(c.parentNode,"optgroup"))){if(b=ya(c).val(),h)return b;i.push(b)}return i},set:function(a,b){for(var c,d,e=a.options,f=ya.makeArray(b),g=e.length;g--;)d=e[g],(d.selected=ya.inArray(ya.valHooks.option.get(d),f)>-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),ya.each(["radio","checkbox"],function(){ya.valHooks[this]={set:function(a,b){return Array.isArray(b)?a.checked=ya.inArray(ya(a).val(),b)>-1:void 0}},sa.checkOn||(ya.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})}),sa.focusin="onfocusin"in a;var Fb=/^(?:focusinfocus|focusoutblur)$/,Gb=function(a){a.stopPropagation()};ya.extend(ya.event,{trigger:function(b,c,d,e){var f,g,h,i,j,k,l,m,n=[d||va],o=pa.call(b,"type")?b.type:b,p=pa.call(b,"namespace")?b.namespace.split("."):[];if(g=m=h=d=d||va,3!==d.nodeType&&8!==d.nodeType&&!Fb.test(o+ya.event.triggered)&&(o.indexOf(".")>-1&&(p=o.split("."),o=p.shift(),p.sort()),j=o.indexOf(":")<0&&"on"+o,b=b[ya.expando]?b:new ya.Event(o,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=p.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:ya.makeArray(c,[b]),l=ya.event.special[o]||{},e||!l.trigger||l.trigger.apply(d,c)!==!1)){if(!e&&!l.noBubble&&!ua(d)){for(i=l.delegateType||o,Fb.test(i+o)||(g=g.parentNode);g;g=g.parentNode)n.push(g),h=g;h===(d.ownerDocument||va)&&n.push(h.defaultView||h.parentWindow||a)}for(f=0;(g=n[f++])&&!b.isPropagationStopped();)m=g,b.type=f>1?i:l.bindType||o,k=(Qa.get(g,"events")||Object.create(null))[b.type]&&Qa.get(g,"handle"),k&&k.apply(g,c),k=j&&g[j],k&&k.apply&&Pa(g)&&(b.result=k.apply(g,c),b.result===!1&&b.preventDefault());return b.type=o,e||b.isDefaultPrevented()||l._default&&l._default.apply(n.pop(),c)!==!1||!Pa(d)||j&&ta(d[o])&&!ua(d)&&(h=d[j],h&&(d[j]=null),ya.event.triggered=o,b.isPropagationStopped()&&m.addEventListener(o,Gb),d[o](),b.isPropagationStopped()&&m.removeEventListener(o,Gb),ya.event.triggered=void 0,h&&(d[j]=h)),b.result}},simulate:function(a,b,c){var d=ya.extend(new ya.Event,c,{type:a,isSimulated:!0});ya.event.trigger(d,null,b)}}),ya.fn.extend({trigger:function(a,b){return this.each(function(){ya.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?ya.event.trigger(a,b,c,!0):void 0}}),sa.focusin||ya.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){ya.event.simulate(b,a.target,ya.event.fix(a))};ya.event.special[b]={setup:function(){var d=this.ownerDocument||this.document||this,e=Qa.access(d,b);e||d.addEventListener(a,c,!0),Qa.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this.document||this,e=Qa.access(d,b)-1;e?Qa.access(d,b,e):(d.removeEventListener(a,c,!0),Qa.remove(d,b))}}});var Hb=a.location,Ib={guid:Date.now()},Jb=/\?/;ya.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(e){}return d=c&&c.getElementsByTagName("parsererror")[0],(!c||d)&&ya.error("Invalid XML: "+(d?ya.map(d.childNodes,function(a){return a.textContent}).join("\n"):b)),c};var Kb=/\[\]$/,Lb=/\r?\n/g,Mb=/^(?:submit|button|image|reset|file)$/i,Nb=/^(?:input|select|textarea|keygen)/i;ya.param=function(a,b){var c,d=[],e=function(a,b){var c=ta(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(null==a)return"";if(Array.isArray(a)||a.jquery&&!ya.isPlainObject(a))ya.each(a,function(){e(this.name,this.value)});else for(c in a)ba(c,a[c],b,e);return d.join("&")},ya.fn.extend({serialize:function(){return ya.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=ya.prop(this,"elements");return a?ya.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!ya(this).is(":disabled")&&Nb.test(this.nodeName)&&!Mb.test(a)&&(this.checked||!ab.test(a))}).map(function(a,b){var c=ya(this).val();return null==c?null:Array.isArray(c)?ya.map(c,function(a){return{name:b.name,value:a.replace(Lb,"\r\n")}}):{name:b.name,value:c.replace(Lb,"\r\n")}}).get()}});var Ob=/%20/g,Pb=/#.*$/,Qb=/([?&])_=[^&]*/,Rb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Sb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Tb=/^(?:GET|HEAD)$/,Ub=/^\/\//,Vb={},Wb={},Xb="*/".concat("*"),Yb=va.createElement("a");Yb.href=Hb.href,ya.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Hb.href,type:"GET",isLocal:Sb.test(Hb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Xb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":ya.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?ea(ea(a,ya.ajaxSettings),b):ea(ya.ajaxSettings,a)},ajaxPrefilter:ca(Vb),ajaxTransport:ca(Wb),ajax:function(b,c){function d(b,c,d,h){var j,m,n,u,v,w=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",x.readyState=b>0?4:0,j=b>=200&&300>b||304===b,d&&(u=fa(o,x,d)),!j&&ya.inArray("script",o.dataTypes)>-1&&ya.inArray("json",o.dataTypes)<0&&(o.converters["text script"]=function(){}),u=ga(o,u,x,j),j?(o.ifModified&&(v=x.getResponseHeader("Last-Modified"),v&&(ya.lastModified[f]=v),v=x.getResponseHeader("etag"),v&&(ya.etag[f]=v)),204===b||"HEAD"===o.type?w="nocontent":304===b?w="notmodified":(w=u.state,m=u.data,n=u.error,j=!n)):(n=w,(b||!w)&&(w="error",0>b&&(b=0))),x.status=b,x.statusText=(c||w)+"",j?r.resolveWith(p,[m,w,x]):r.rejectWith(p,[x,w,n]),x.statusCode(t),t=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[x,o,j?m:n]),s.fireWith(p,[x,w]),l&&(q.trigger("ajaxComplete",[x,o]),--ya.active||ya.event.trigger("ajaxStop")))}"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=ya.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?ya(p):ya.event,r=ya.Deferred(),s=ya.Callbacks("once memory"),t=o.statusCode||{},u={},v={},w="canceled",x={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h)for(h={};b=Rb.exec(g);)h[b[1].toLowerCase()+" "]=(h[b[1].toLowerCase()+" "]||[]).concat(b[2]);b=h[a.toLowerCase()+" "]}return null==b?null:b.join(", ")},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=v[a.toLowerCase()]=v[a.toLowerCase()]||a,u[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)x.always(a[x.status]);else for(b in a)t[b]=[t[b],a[b]];return this},abort:function(a){var b=a||w;return e&&e.abort(b),d(0,b),this}};if(r.promise(x),o.url=((b||o.url||Hb.href)+"").replace(Ub,Hb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(Ja)||[""],null==o.crossDomain){j=va.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Yb.protocol+"//"+Yb.host!=j.protocol+"//"+j.host}catch(y){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=ya.param(o.data,o.traditional)),da(Vb,o,c,x),k)return x;l=ya.event&&o.global,l&&0===ya.active++&&ya.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Tb.test(o.type),f=o.url.replace(Pb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(Ob,"+")):(n=o.url.slice(f.length),o.data&&(o.processData||"string"==typeof o.data)&&(f+=(Jb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Qb,"$1"),n=(Jb.test(f)?"&":"?")+"_="+Ib.guid++ +n),o.url=f+n),o.ifModified&&(ya.lastModified[f]&&x.setRequestHeader("If-Modified-Since",ya.lastModified[f]),ya.etag[f]&&x.setRequestHeader("If-None-Match",ya.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&x.setRequestHeader("Content-Type",o.contentType),x.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Xb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)x.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,x,o)===!1||k))return x.abort();if(w="abort",s.add(o.complete),x.done(o.success),x.fail(o.error),e=da(Wb,o,c,x)){if(x.readyState=1,l&&q.trigger("ajaxSend",[x,o]),k)return x;o.async&&o.timeout>0&&(i=a.setTimeout(function(){x.abort("timeout")},o.timeout));try{k=!1,e.send(u,d)}catch(y){if(k)throw y;d(-1,y)}}else d(-1,"No Transport");return x},getJSON:function(a,b,c){return ya.get(a,b,c,"json")},getScript:function(a,b){return ya.get(a,void 0,b,"script")}}),ya.each(["get","post"],function(a,b){ya[b]=function(a,c,d,e){return ta(c)&&(e=e||d,d=c,c=void 0),ya.ajax(ya.extend({url:a,type:b,dataType:e,data:c,success:d},ya.isPlainObject(a)&&a))}}),ya.ajaxPrefilter(function(a){var b;for(b in a.headers)"content-type"===b.toLowerCase()&&(a.contentType=a.headers[b]||"")}),ya._evalUrl=function(a,b,c){return ya.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(a){ya.globalEval(a,b,c)}})},ya.fn.extend({wrapAll:function(a){var b;return this[0]&&(ta(a)&&(a=a.call(this[0])),b=ya(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){for(var a=this;a.firstElementChild;)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return ta(a)?this.each(function(b){ya(this).wrapInner(a.call(this,b))}):this.each(function(){var b=ya(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=ta(a);return this.each(function(c){ya(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){ya(this).replaceWith(this.childNodes)}),this}}),ya.expr.pseudos.hidden=function(a){return!ya.expr.pseudos.visible(a)},ya.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},ya.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Zb={0:200,1223:204},$b=ya.ajaxSettings.xhr();sa.cors=!!$b&&"withCredentials"in $b,sa.ajax=$b=!!$b,ya.ajaxTransport(function(b){var c,d;return sa.cors||$b&&!b.crossDomain?{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.ontimeout=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Zb[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=h.ontimeout=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}:void 0}),ya.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),ya.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return ya.globalEval(a),a}}}),ya.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),ya.ajaxTransport("script",function(a){if(a.crossDomain||a.scriptAttrs){var b,c;return{send:function(d,e){b=ya("\n'); }]),b.module("direct/validation-report/validation-report.tpl.html",[]).run(["$templateCache",function(a){a.put("direct/validation-report/validation-report.tpl.html",'\n

Validation report of message {{message_id}}

\n\n
\n \n \n
\n
\n
\n

Validation report summary

\n \n
\n
\n
\n
\n

Selected part

\n

\n Content-Type: {{selectedPart.contentType}}\n

\n

\n Content-Disposition: {{selectedPart.contentDisposition}}\n

\n

\n Content-Transfer-Encoding: {{selectedPart.contentTransferEncoding}}\n

\n
\n
\n
\n\n \n
\n \n {{globalError.found}}\n
\n\n
\n
\n

Detailed report {{selectedPart.contentType | contentTypeFilter}}

\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
{{th}}
{{detail.name}}{{detail.status}}{{detail.dts}}{{detail.found}}{{detail.expected}}\n

{{rfc.name}}\n

\n
\n
\n
\n
\n \n \n
\n
\n
\n

Validation report USCDI v2 summary

\n \n
\n
\n
\n
\n

Selected part

\n

\n Content-Type: {{selectedPart.contentType}}\n

\n

\n Content-Disposition: {{selectedPart.contentDisposition}}\n

\n

\n Content-Transfer-Encoding: {{selectedPart.contentTransferEncoding}}\n

\n
\n
\n
\n\n \n
\n \n {{globalError.found}}\n
\n\n
\n
\n

Detailed report USCDI v2 {{selectedPart.contentType | contentTypeFilter}}

\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
{{th}}
{{svapdetail.name}}{{svapdetail.status}}{{svapdetail.dts}}{{svapdetail.found}}{{svapdetail.expected}}\n

{{rfc.name}}\n

\n
\n
\n
\n
\n \n
\n \n
\n
\n \n
\n
\n \n
\n
\n

Validation of {{ccdaResult.filename.substring(4)}}

\n
{{ccdaResult.ccdaReport.report}}
\n
\n
\n \n \n Download\n \n
{{content.rawContent}}
\n
\n
\n
\n')}]),b.module("edge/edge-home/edge-home.tpl.html",[]).run(["$templateCache",function(a){a.put("edge/edge-home/edge-home.tpl.html",'

Edge Testing Home

\n

\n\n

This area provides various network "Edge" testing capabilities. The term "Edge" is derived from the health IT data exchange paradigm of network "Edge" nodes and health information service providers: Edge -> HISP -> HISP -> Edge.\n

\nThe SMTP, IMAP and POP3 test cases accessed from the menu above validate the system under test\'s ability to send and receive in accordance with various standards, specifications and RFC\'s. These tests can assist system developers and implementers to ensure their transport protocols adhere to basic industry standards.\n

\nFor those principally interested in testing for the ONC Health IT Certification Program-please visit the "Testing by ONC Certification Criteria for Health IT" to see what Edge tests are applicable for the respective criteria.\n

\n')}]),b.module("edge/edge.tpl.html",[]).run(["$templateCache",function(a){a.put("edge/edge.tpl.html",'
\n\n
\n\n
\n\n \n \n\n \n\n
\n\n
\n\n
\n')}]),b.module("edge/edgeHeader.tpl.html",[]).run(["$templateCache",function(a){a.put("edge/edgeHeader.tpl.html",'\n')}]),b.module("edge/help/help.tpl.html",[]).run(["$templateCache",function(a){a.put("edge/help/help.tpl.html",'

Edge Help

\n

\n If you are looking for help about this tool https://groups.google.com/forum/#!forum/edge-test-tool\n

\n

Certification Help

\n

\n Questions about the applicability of the initial set of standards, implementation specifications, and certification criteria should be directed to ONC at ONC.Certification@hhs.gov. Questions about functions and activities of the ATCBs should be directed to ONC at ONC.Certification@hhs.gov.\n

\n

Frequently Asked Questions

\n

\n Find answers for Frequently Asked Questions here\n

\n

Release Notes - View full release notes

\n\n\n\n')}]),b.module("edge/reports/validation-reports.tpl.html",[]).run(["$templateCache",function(a){a.put("edge/reports/validation-reports.tpl.html",'\n
\n
\n
\n

You must be logged and have smtp/xdr profiles

\n
\n \n
\n
\n\n\n\n
\n
\n
\n
\n \n \n \n
\n
\n

Validation report for profile: {{selectedProfile.profileName}}

\n
\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Test CaseTimestampResult
{{report.testCaseNumber}}{{report.timestamp | date:\'medium\'}}
\n
\n\n
\n
\n

\n No report yet\n

\n
\n
\n
\n
\n')}]),b.module("edge/smtp/description/testDescription.tpl.html",[]).run(["$templateCache",function(a){a.put("edge/smtp/description/testDescription.tpl.html",'
\n
\n
\n \n \n \n
\n
\n

{{specificTest.name}}

\n
\n
\n
\n
\n Description:\n

\n {{specificTest.longDesc}}\n

\n

\n {{specificTest.desc}}\n

\n
\n
\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Vendor RoleVendor EdgeVendor HISP
{{specificTest.sutRole}}
\n
\n
\n
\n
\n\n
\n \n\n
\n \n
\n
\n
\n
\n\n\n
\n\n
\n

\n \n Success\n Fail\n

\n
\n \n
\n')}]),b.module("edge/smtp/logs/testLog.tpl.html",[]).run(["$templateCache",function(a){a.put("edge/smtp/logs/testLog.tpl.html",'
\n
\n
\n \n \n \n
\n
\n

Log {{logToDisplay.name}}

\n
\n
\n
\n
\n
\n

\n Test result #{{$index + 1}}:\n Pass\n Fail\n No result yet\n

\n
\n
\n\n
\n\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n
Request responses
\n
{{key}}: {{value}}
\n
\n
\n
\n\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n
CCDA Validation Report link
\n Validation report of {{key}}\n
\n
\n
\n\n
\n \n \n \n

\n
{{value}}
\n
\n
\n
\n\n
\n \n \n
\n
\n Test passed\n
\n
\n Test failed\n
\n\n
\n
\n
\n\n\n')}]),b.module("edge/smtp/smtp.tpl.html",[]).run(["$templateCache",function(a){a.put("edge/smtp/smtp.tpl.html",'
\n \n
\n \n
\n
\n

\n Your system as\n

\n
\n \n \n
\n
\n
\n
\n
\n
\n
\n
\n \n \n
\n \n \n
\n
\n
\n
\n
\n
\n
\n \n \n \n
\n
\n
\n
\n
\n
\n
\n
\n \n \n \n
\n
\n
\n
\n
\n
\n
\n
\n \n \n \n
\n
\n
\n
\n
\n
\n
\n
\n \n \n \n
\n
\n
\n
\n \n
\n
\n
\n
\n \n \n \n
\n
\n
\n
\n
\n
\n \n \n \n
\n
\n
\n
\n
\n
\n \n \n \n
\n
\n
\n
\n
\n
\n \n \n \n
\n
\n
\n
\n
\n TLS Required\n \n \n
\n
\n
\n \n
\n
\n
\n
\n Testing mode enabled\n
\n
\n
\n
\n
\n \n \n
\n
\n
\n
\n \n \n
\n
\n
\n
\n
\n
\n \n \n
\n
\n
\n
\n
\n \n
\n
\n\n
\n \n\n
\n
\n Upload File\n OR Drag And Drop your file here\n
\n\n
\n\n
\n
\n {{file.relativePath}} ({{file.size}}bytes)\n
\n
\n {{file.progress()}}% Complete\n
\n
\n
\n \n \n
\n
\n
\n
\n
\n\n
\n \n
\n
\n
\n
\n'); }]),b.module("edge/smtp/smtpMain.tpl.html",[]).run(["$templateCache",function(a){a.put("edge/smtp/smtpMain.tpl.html","\n\n\n\n
\n \n
")}]),b.module("edge/xdr/description/xdrTestDescription.tpl.html",[]).run(["$templateCache",function(a){a.put("edge/xdr/description/xdrTestDescription.tpl.html",'
\n
\n
\n \n \n \n
\n
\n

{{testObj.name}}

\n
\n
\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
Purpose/Description:Expected Test Results:
{{testObj[\'Expected Test Results\']}}
\n
\n
\n\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
Vendor RoleMetadata Included
{{testObj[\'SUT: Sender/ Receiver\']}}{{testObj[\'Metadata Included\']}}
\n
\n
\n\n
\n')}]),b.module("edge/xdr/logs/xdrTestLog.tpl.html",[]).run(["$templateCache",function(a){a.put("edge/xdr/logs/xdrTestLog.tpl.html",'
\n
\n
\n \n \n \n
\n
\n

Log for {{logToDisplay.name}}

\n
\n
\n
\n
\n \n \n
{{logToDisplay.results.content.value.request}}
\n
\n \n
{{logToDisplay.results.content.value.response}}
\n
\n \n \n \n
\n\n
\n
\n Check your SUT logs and accept or reject\n
\n
\n

\n No result yet\n

\n
\n
\n
\n \n \n
\n
\n Validation passed\n
\n
\n Validation failed\n
\n
\n')}]),b.module("edge/xdr/xdr.tpl.html",[]).run(["$templateCache",function(a){a.put("edge/xdr/xdr.tpl.html",'Click to download XDR TLS certificates\n
\n
\n \n
\n
\n \n
\n
\n\n
\n')}]),b.module("edge/xdr/xdrMain.tpl.html",[]).run(["$templateCache",function(a){a.put("edge/xdr/xdrMain.tpl.html",'\n\n\n
\n
\n
')}]),b.module("hisp/help/help.tpl.html",[]).run(["$templateCache",function(a){a.put("hisp/help/help.tpl.html",'

Edge Help

')}]),b.module("hisp/hisp-home/hisp-home.tpl.html",[]).run(["$templateCache",function(a){a.put("hisp/hisp-home/hisp-home.tpl.html",'

Health Information Service Provider Home

\n
\n\n

This area provides tests where ETT simulates the role of the Health Information Service Provider (HISP). For those principally interested in testing for the ONC Health IT Certification Program-please visit the "Testing by ONC Certification Criteria for Health IT" to see what HISP tests are applicable for the respective criteria.\n\n

')}]),b.module("hisp/hisp.tpl.html",[]).run(["$templateCache",function(a){a.put("hisp/hisp.tpl.html",'
\n\n
\n\n
\n\n \n \n\n \n\n
\n\n
\n\n
\n')}]),b.module("hisp/hispHeader.tpl.html",[]).run(["$templateCache",function(a){a.put("hisp/hispHeader.tpl.html",'\n')}]),b.module("hisp/reports/validation-reports.tpl.html",[]).run(["$templateCache",function(a){a.put("hisp/reports/validation-reports.tpl.html",'\n
\n
\n
\n

You must be logged and have smtp/xdr profiles

\n
\n \n
\n
\n\n\n\n
\n
\n
\n
\n \n \n \n
\n
\n

Validation report for profile: {{selectedProfile.profileName}}

\n
\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Test CaseTimestampResult
{{report.testCaseNumber}}{{report.timestamp | date:\'medium\'}}
\n
\n\n
\n
\n

\n No report yet\n

\n
\n
\n
\n
\n')}]),b.module("hisp/smtp/description/testDescription.tpl.html",[]).run(["$templateCache",function(a){a.put("hisp/smtp/description/testDescription.tpl.html",'
\n
\n
\n \n \n \n
\n
\n

{{specificTest.name}}

\n
\n
\n
\n
\n Description:\n

\n {{specificTest.longDesc}}\n

\n

\n {{specificTest.desc}}\n

\n
\n
\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Vendor RoleVendor EdgeVendor HISP
{{specificTest.sutRole}}
\n
\n
\n
\n
\n\n
\n \n\n
\n \n
\n
\n
\n
\n\n\n
\n\n
\n

\n \n Success\n Fail\n

\n
\n \n
\n')}]),b.module("hisp/smtp/logs/testLog.tpl.html",[]).run(["$templateCache",function(a){a.put("hisp/smtp/logs/testLog.tpl.html",'
\n
\n
\n \n \n \n
\n
\n

Log {{logToDisplay.name}}

\n
\n
\n
\n
\n
\n

\n Test result #{{$index + 1}}:\n Pass\n Fail\n No result yet\n

\n
\n
\n\n
\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Criteria MetRequest Time outProctoredTime elapsed (seconds)
{{result.timeElapsedInSeconds}}
\n
\n
\n\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n
Request responses
{{key}}: {{value}}
\n
\n
\n
\n\n
\n
\n Attachements: \n
\n					{{result.attachments}}\n					
\n
\n
\n\n
\n
\n
\n')}]),b.module("hisp/smtp/smtp.tpl.html",[]).run(["$templateCache",function(a){a.put("hisp/smtp/smtp.tpl.html",'
\n \n
\n \n
\n\n
\n
\n
\n
\n \n
\n \n \n
\n
\n
\n
\n
\n

\n Your system as\n

\n
\n \n \n
\n
\n
\n
\n
\n
\n \n \n
\n
\n
\n
\n
\n
\n \n \n
\n
\n
\n \n
\n
\n
\n \n \n
\n
\n
\n
\n \n \n
\n
\n
\n\n \n
\n
\n
\n
\n Testing mode enabled\n
\n
\n\n
\n
\n
\n \n \n
\n
\n
\n
\n \n \n
\n
\n
\n\n
\n
\n
\n \n \n
\n
\n
\n
\n
\n \n\n
\n
\n
\n\n \n
\n
\n
\n
\n')}]),b.module("hisp/smtp/smtpMain.tpl.html",[]).run(["$templateCache",function(a){a.put("hisp/smtp/smtpMain.tpl.html","\n\n\n
\n \n
")}]),b.module("hisp/xdr/xdr.tpl.html",[]).run(["$templateCache",function(a){a.put("hisp/xdr/xdr.tpl.html",'

XDR Test Cases

\n
\n\n
\n
\n \n
\n
\n \n
\n
\n\n
\n')}]),b.module("hisp/xdr/xdrMain.tpl.html",[]).run(["$templateCache",function(a){a.put("hisp/xdr/xdrMain.tpl.html",'\n\n\n\n
\n
\n
')}]),b.module("home/home.tpl.html",[]).run(["$templateCache",function(a){a.put("home/home.tpl.html",'
\n
\n
\n \n
\n
\n
\n
 \n
\n
\n
\n
\n

Edge Testing Tool

\n
\n
\n

The Edge Testing Tool is a collection of testing utilities created to validate the requirements of the ONC Health IT Certification Program. The Edge Testing Tool was originally designed to test only network "Edge" capabilities, but over time assumed HISP and other transport testing abilities, along with C-CDA and content validation utilities. The Edge Testing Tool software is open source and available for download. \n

\n
\n
\n
\n\n
 \n
\n
\n\n \n\n\n
\n
\n
\n
'); -}]),b.module("message-validators/messageValidators.tpl.html",[]).run(["$templateCache",function(a){a.put("message-validators/messageValidators.tpl.html",'
\n\n
\n\n \n \n\n \n
\n
\n \n

\n \n Error 0x0002: Couldn\'t find settings.json\n

\n
\n
\n
\n\n \n\n
\n\n
\n\n
\n')}]),b.module("message-validators/messageValidatorsHeader.tpl.html",[]).run(["$templateCache",function(a){a.put("message-validators/messageValidatorsHeader.tpl.html",'\n')}]),b.module("message-validators/validator-home/validator-home.tpl.html",[]).run(["$templateCache",function(a){a.put("message-validators/validator-home/validator-home.tpl.html",'

Validator Home

\n
\n\n

This area provides tools for testing conformance of artifacts to industry standards and specific criteria. There are both context-free validators for general testing and validators for the criteria of the 2015 Edition.\n

\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Certification Criteria VersionC-CDAUSCDI Version
USCDI v1\n HL7® CDA R2 Implementation Guide: C-CDA Templates for Clinical Notes R2.1 Companion Guide, Release 2-US Realm, Oct 2021 (with errata) USCDI v1
\n\n')}]),b.module("message-validators/xdm-validator/xdm-validator.tpl.html",[]).run(["$templateCache",function(a){a.put("message-validators/xdm-validator/xdm-validator.tpl.html",'\n
\n\n

XDM Validator

\n\n
\n
\n
\n \n\n
\n
\n Upload File\n OR Drag And Drop your file here\n
\n\n
\n\n
\n\n
\n {{file.relativePath}} ({{file.size}}bytes)\n
\n
\n {{file.progress()}}% Complete\n
\n
\n
\n \n \n
\n
\n
\n
\n
\n
\n
\n\n \n\n
\n
\n
{{xdmResult.report}}
\n\n
\n
\n
Validation failed.
\n
\n \n
\n\n
\n')}]),b.module("message-validators/xdr-validator/xdr-validator.tpl.html",[]).run(["$templateCache",function(a){a.put("message-validators/xdr-validator/xdr-validator.tpl.html",'\n

XDR Validator

\n\n\n \n
\n
\n
\n \n \n
\n\n
\n \n
\n \n {{$select.selected.name}}\n \n \n \n \n \n\n \n \n \n\n
\n
\n
\n \n \n
\n\n
\n \n \n
\n\n
\n
\n\n \n \n\n\n \n\n
\n
\n Success\n
\n
\n Error\n
\n
\n \n \n
{{send.results.content.value.request}}
\n
\n \n
{{send.results.content.value.response}}
\n
\n \n \n \n
\n\n
\n
\n\n
\n\n \n\n
\n
\n \n\n
\n

\n \n Endpoint: {{receive.endpoint}}\n

\n

\n \n Endpoint TLS: {{receive.endpointTLS}}\n

\n
\n
\n
\n\n \n \n\n \n\n
\n {{statusMessage}}\n
\n\n \n
\n Success\n {{receive.results.timestamp | date:\'medium\'}}\n
\n
\n Error\n {{receive.results.timestamp | date:\'medium\'}}\n
\n \n
{{receive.results.request}}
\n
\n \n
{{receive.results.response}}
\n
\n \n
{{receive.results.samlReport}}
\n
\n
\n\n
\n
')}]),b.module("surveillance/surveil-home.tpl.html",[]).run(["$templateCache",function(a){a.put("surveillance/surveil-home.tpl.html",'

Surveillance: Context-free Transport Testing

\n\n

\n The transport tests in this surveillance area support in-the-field, real-world verification of your system to three specified ONC certification criteria for health IT that include transport standards conformance. These tests can be executed on an ad-hoc basis and do not require any specific data.\n

\n\n

Context-free C-CDA Conformance Testing Options

\n\n

\nThis surveillance does not test "content." Therefore, any C-CDA content included as part of these tests will not be reviewed. The C-CDA Scorecard found at www.healthit.gov/scorecard can be used for context-free/non-certification based testing. The C-CDA Scorecard uses best practices and quantitative scoring criteria developed by HL7 to improve the C-CDA\'s implementation consistency.\n

\n

\nTesting both C-CDA content and Direct protocol transport can be done via production settings using the ONC One Click Scorecard benchmarking utility by sending a C-CDA to scorecard@direct.hhs.gov\n

\n

More information and how to use the One Click Score can be found here:\nhttps://oncprojectracking.healthit.gov/wiki/display/TechLabTU/ONC+One+Click+Scorecard\n

')}]),b.module("surveillance/surveillance.tpl.html",[]).run(["$templateCache",function(a){a.put("surveillance/surveillance.tpl.html","

Surveillance Page

\n")}]),b.module("surveillance/surveillanceCriteria.tpl.html",[]).run(["$templateCache",function(a){a.put("surveillance/surveillanceCriteria.tpl.html",'
\n\n
\n\n \n \n\n \n
\n
\n \n

\n \n Error 0x0002: Couldn\'t find settings.json\n

\n
\n
\n
\n\n \n\n
\n\n
\n\n
\n')}]),b.module("surveillance/surveillanceCriteriaHeader.tpl.html",[]).run(["$templateCache",function(a){a.put("surveillance/surveillanceCriteriaHeader.tpl.html",'\n')}]),b.module("templates-common",["templates/accountInfo.tpl.html","templates/announcement.tpl.html","templates/ccdaTemplates/ccdaR1ReportTemplate.tpl.html","templates/ccdaTemplates/ccdaR2ReportTemplate.tpl.html","templates/ccdaTemplates/ccdaWidgetTemplate.tpl.html","templates/changePassword.tpl.html","templates/dcdtTemplates/dcdtReportTemplate.tpl.html","templates/dcdtTemplates/hostingReportTemplate.tpl.html","templates/documents.tpl.html","templates/exception.tpl.html","templates/faq.tpl.html","templates/footer-home.tpl.html","templates/footer.tpl.html","templates/localinstall.tpl.html","templates/login.tpl.html","templates/loginModalTemplate.tpl.html","templates/pdfViewer.tpl.html","templates/releaseNotes.tpl.html","templates/session-timed-out.tpl.html","templates/smtpTemplates/SingleTestCaseTemplate.tpl.html","templates/warning.tpl.html","templates/xdrTemplates/xdrReceiverTestCaseTemplate.tpl.html","templates/xdrTemplates/xdrSenderTestCaseTemplate.tpl.html"]),b.module("templates/accountInfo.tpl.html",[]).run(["$templateCache",function(a){a.put("templates/accountInfo.tpl.html",'
\n

Account Info

\n
\n

\n Username: {{userInfo.username}}\n

\n

\n Direct Address List:\n

\n
    \n
  • {{direct}}
  • \n
\n

\n SMTP Profiles List:\n

\n
    \n
  • {{smtp.profileName}} - {{smtp.sutSMTPAddress}}
  • \n
\n
\n')}]),b.module("templates/announcement.tpl.html",[]).run(["$templateCache",function(a){a.put("templates/announcement.tpl.html",'
\n

Announcements

\n
\n
\n')}]),b.module("templates/ccdaTemplates/ccdaR1ReportTemplate.tpl.html",[]).run(["$templateCache",function(a){a.put("templates/ccdaTemplates/ccdaR1ReportTemplate.tpl.html",'
\n\n
\n\n \n \n \n \n \n \n
\n \n \n \n C-CDA Document Type: {{data.ccdafilenaame}}\n
\n Service Error Message: {{data.resultsMetaData.serviceErrorMessage}}\n
\n \n
\n
\n\n\n
\n\n
\n
\n
\n
\n {{item.count}}\n {{item.type}}\n
\n
\n
\n
\n\n
\n\n \n \n
\n
\n
\n Error -

{{item.description}}

\n
\n
\n
\n Warning -

{{item.description}}

\n
\n
\n
\n Info -

{{item.description}}

\n
\n
\n
\n
\n
\n\n\n
\n
\n\n \n\n \n\n
\n')}]),b.module("templates/ccdaTemplates/ccdaR2ReportTemplate.tpl.html",[]).run(["$templateCache",function(a){a.put("templates/ccdaTemplates/ccdaR2ReportTemplate.tpl.html",'
\n\n
\n\n \n \n \n \n \n \n
\n \n \n \n C-CDA Document Details: {{data.resultsMetaData.objectiveProvided}} / {{data.ccdafilenaame}} - {{data.resultsMetaData.ccdaDocumentType}}\n
\n Service Error Message: {{data.resultsMetaData.serviceErrorMessage}}\n
\n \n
\n
\n\n\n
\n\n
\n
\n
\n
\n {{item.count}}\n {{item.type}}\n
\n
\n
\n
\n\n
\n\n \n \n
\n
\n
\n Error -

{{item.description}}

\n
\n
\n
\n Warning -

{{item.description}}

\n
\n
\n
\n Info -

{{item.description}}

\n
\n
\n
\n
\n
\n\n \n
\n
\n
\n Error -

{{item.description}}

\n
\n
\n
\n
\n
\n Warning -

{{item.description}}

\n
\n
\n
\n
\n
\n Info -

{{item.description}}

\n
\n
\n
\n
\n
\n\n \n
\n
\n
\n Error -

{{item.description}}

\n
\n
\n
\n Warning -

{{item.description}}

\n
\n
\n
\n Info -

{{item.description}}

\n
\n
\n
\n
\n
\n
\n
\n\n \n\n \n\n
'); -}]),b.module("templates/ccdaTemplates/ccdaWidgetTemplate.tpl.html",[]).run(["$templateCache",function(a){a.put("templates/ccdaTemplates/ccdaWidgetTemplate.tpl.html",'\n\n
\n\n')}]),b.module("templates/changePassword.tpl.html",[]).run(["$templateCache",function(a){a.put("templates/changePassword.tpl.html",'
\n

Change your password

\n
\n\n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n \n \n
\n\n
\n
\n\n
\n
\n\n \n
\n')}]),b.module("templates/dcdtTemplates/dcdtReportTemplate.tpl.html",[]).run(["$templateCache",function(a){a.put("templates/dcdtTemplates/dcdtReportTemplate.tpl.html",'\n\n
\n
\n
\n
\n
  Direct Address:{{data.Direct_address_2014}}
\n
\n
\n
\n
\n
  Direct Address:{{data.Direct_address_2015}}\n

\n \n

\n
\n
\n
\n
\n
\n\n
\n
Binding Type: {{data.Binding_Type}}\n
\n
Location Type: {{data.Location_Type}}\n
\n
\n
Negative: {{data.Negative}}\n
\n
Optional: {{data.Optional}}\n
\n
Description: {{data.Description}}\n
\n
RTM Sections:{{data.RTM_Sections}}\n
\n
Underlying Specification References: \n
    \n
  • RFC 4398: {{data.RFC_4398}}
  • \n
  • RFC 4298: {{data.RFC_4298}}
  • \n
  • RFC 5280: {{data.RFC_5280}}
  • \n
  • Direct Applicability Statement for Secure Health Transport:{{data.Direct_SHT}}
  • \n
  • RFC 2798: {{data.RFC_2798}}
  • \n
  • RFC 2782: {{data.RFC_2782}}
  • \n
  • RFC 1035: {{data.RFC_1035}}
  • \n
\n
\n

\n

Instructions: {{data.Instructions}}\n
\n
\n
Target Certificate(s):
\n
\n
\n
    \n
  • {{fieldTarget.name}}:
  • \n
      \n
    • Valid:{{fieldTarget.Valid}}
    • \n
    • Binding Type:{{fieldTarget.Binding_Type}}
    • \n
      \n
    • Location:
    • \n
        \n
      • Type:{{fieldlocTarget.Type}}
      • \n
      • Mail Address:{{fieldlocTarget.Mail_Address}}
      • \n
        \n
      • Host:{{fieldlocTarget.Host}}
      • \n
        \n
        \n
      • Port:{{fieldlocTarget.Port}}
      • \n
        \n
      \n
      \n
    • Description:{{fieldTarget.Description}}
    • \n
    \n
\n
\n
Background Certificate(s):
\n
\n
    \n
  • {{field.name}}:
  • \n
      \n
    • Valid:{{field.Valid}}
    • \n
    • Binding Type:{{field.Binding_Type}}
    • \n
      \n
    • Location:
    • \n
        \n
      • Type:{{fieldloc.Type}}
      • \n
      • Mail Address:{{fieldloc.Mail_Address}}
      • \n
        \n
      • Host:{{fieldloc.Host}}
      • \n
        \n
        \n
      • Port:{{fieldloc.Port}}
      • \n
        \n
      \n
      \n
    • Description:{{field.Description}}
    • \n
    \n
\n
\n\n
\n\n
')}]),b.module("templates/dcdtTemplates/hostingReportTemplate.tpl.html",[]).run(["$templateCache",function(a){a.put("templates/dcdtTemplates/hostingReportTemplate.tpl.html",'
\n
\n
\n Results\n \n
\n
\n
\n
\n
\n\n
\n\n \n
\n\n

\n
\n \n
\n Testcase: {{itemtObj.testcase.testcase}}\n
\n
\n Direct Address: {{itemtObj.testcase.directAddr}}\n
\n
\n
\n
\n \n
\n Testcase: {{itemtObj.testcase.testcase}}\n
\n
\n Direct Address: {{itemtObj.testcase.directAddr}}\n
\n
\n
\n

\n
\n
\n
\n Success: {{item.success}}\n
\n \n
\n \n
\n
Processing Message(s): None
\n
\n
\n Processed Step(s):\n
\n
{{$index+1}}. {{procStep.desc.text}}
\n
  • Success:{{procStep.success}}
  • \n
    \n
    \n
  • Message(s):
  • \n
    • \n {{msg.text}}\n

    • \n
    \n
    \n
    \n
    \n
    \n
  • Message(s):
  • \n
    • \n {{item.msgs[0].toString()}}\n

    • \n
    \n
    \n
    \n \n
  • Binding Type:{{procStep.bindingType}}
  • \n
  • Location Type:{{procStep.locType}}
  • \n
\n
\n
\n Discovered Valid Certificate:\n
\n
\n
\n
\n
\n Discovered Invalid Certificate(s):\n
\n
\n
\n
\n
\n
\n\n
\n
\n
\n\n
\n
\n')}]),b.module("templates/documents.tpl.html",[]).run(["$templateCache",function(a){a.put("templates/documents.tpl.html",'
\n

Frequently Asked Questions

\n
    \n
  • \n Find answers for Frequently Asked Questions here\n
  • \n
\n

Guides

\n \n

Samples

\n \n

Documents

\n \n

ETT Instruction/Demonstration Videos

\n
    \n
  • \n Demonstration Videos\n \n External Link\n \n
  • \n Note: The infrastructure references from the videos have changed. More details can be found here. External Link\n
\n
\n\n\n')}]),b.module("templates/exception.tpl.html",[]).run(["$templateCache",function(a){a.put("templates/exception.tpl.html",'\n\n\n')}]),b.module("templates/faq.tpl.html",[]).run(["$templateCache",function(a){a.put("templates/faq.tpl.html",'
\n

FAQ

\n
\n
\n')}]),b.module("templates/footer-home.tpl.html",[]).run(["$templateCache",function(a){a.put("templates/footer-home.tpl.html",'')}]),b.module("templates/footer.tpl.html",[]).run(["$templateCache",function(a){a.put("templates/footer.tpl.html",'')}]),b.module("templates/localinstall.tpl.html",[]).run(["$templateCache",function(a){a.put("templates/localinstall.tpl.html",'
\n

Local Installation Guide

\n
\n
\n')}]),b.module("templates/login.tpl.html",[]).run(["$templateCache",function(a){a.put("templates/login.tpl.html",'\n\n\n')}]),b.module("templates/loginModalTemplate.tpl.html",[]).run(["$templateCache",function(a){a.put("templates/loginModalTemplate.tpl.html",'\n\n\n')}]),b.module("templates/pdfViewer.tpl.html",[]).run(["$templateCache",function(a){a.put("templates/pdfViewer.tpl.html",'\n\n
\n\n\n')}]),b.module("templates/releaseNotes.tpl.html",[]).run(["$templateCache",function(a){a.put("templates/releaseNotes.tpl.html",'

Release Notes

\n
\n
\n
\n
\n

{{key}}

\n
\n
\n
\n
\n
\n
\n

{{key}} - {{value.date | date}}

\n
    \n
  • {{note.title}}
  • \n
      \n
    • {{line}}
    • \n
    \n
\n
\n
\n
\n
\n')}]),b.module("templates/session-timed-out.tpl.html",[]).run(["$templateCache",function(a){a.put("templates/session-timed-out.tpl.html",'\n\n\n')}]),b.module("templates/smtpTemplates/SingleTestCaseTemplate.tpl.html",[]).run(["$templateCache",function(a){a.put("templates/smtpTemplates/SingleTestCaseTemplate.tpl.html",'
  • \n
    \n \n\n \n\n \n\n \n\n \n\n \n\n\n \n\n
    \n
    \n \n Cancel\n Clear\n
    \n
    \n
    \n
    \n

    {{test.name}}

    \n

    {{test.desc}}

    \n \n
    \n\n
    \n \n\n
    \n\n \n
    \n \n
    \n
    \n \n
    \n\n \n
    \n \n
    \n\n \n
    \n \n
    \n\n \n
    \n \n
    \n \n
    \n \n
    \n\n \n
    \n \n
    \n \n
    \n \n
    \n\n
    \n
    \n
    \n\n
    \n \n
  • '); +}]),b.module("message-validators/messageValidators.tpl.html",[]).run(["$templateCache",function(a){a.put("message-validators/messageValidators.tpl.html",'
    \n\n
    \n\n \n \n\n \n
    \n
    \n \n

    \n \n Error 0x0002: Couldn\'t find settings.json\n

    \n
    \n
    \n
    \n\n \n\n
    \n\n
    \n\n
    \n')}]),b.module("message-validators/messageValidatorsHeader.tpl.html",[]).run(["$templateCache",function(a){a.put("message-validators/messageValidatorsHeader.tpl.html",'\n')}]),b.module("message-validators/validator-home/validator-home.tpl.html",[]).run(["$templateCache",function(a){a.put("message-validators/validator-home/validator-home.tpl.html",'

    Validator Home

    \n
    \n\n

    This area provides tools for testing conformance of artifacts to industry standards and specific criteria. There are both context-free validators for general testing and validators for the ONC Health IT Certification Program\'s certification criteria.

    \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Certification Criteria VersionC-CDAUSCDI VersionRequirement Deadline
    USCDI v1\n HL7 CDA® R2 Implementation Guide: C-CDA Templates for Clinical Notes R2.1 Companion Guide, Release 2-US Realm, Oct 2021 (with errata) USCDI v1December 31, 2022
    USCDI v3\n HL7 CDA® R2 Implementation Guide: C-CDA Templates for Clinical Notes R2.1 Companion Guide, Release 4.1-US Realm, June 2023\n
    \n
    \n Visit the \n \n Standards Version Advancement Process (SVAP) ONC webpage\n for more details on current approved SVAP standards versions.\n
    USCDI v3December 31, 2025
    \n\n')}]),b.module("message-validators/xdm-validator/xdm-validator.tpl.html",[]).run(["$templateCache",function(a){a.put("message-validators/xdm-validator/xdm-validator.tpl.html",'
    \n\n
    \n
    \n\n

    XDM Validator

    \n\n
    \n
    \n
    \n \n\n
    \n
    \n Upload File\n OR Drag And Drop your file here\n
    \n\n
    \n\n
    \n\n
    \n {{file.relativePath}} ({{file.size}}bytes)\n
    \n
    \n {{file.progress()}}% Complete\n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n\n \n\n
    \n
    \n
    {{xdmResult.report}}
    \n\n
    \n
    \n
    Validation failed.
    \n
    \n \n
    \n\n
    \n')}]),b.module("message-validators/xdr-validator/xdr-validator.tpl.html",[]).run(["$templateCache",function(a){a.put("message-validators/xdr-validator/xdr-validator.tpl.html",'
    \n\n
    \n

    XDR Validator

    \n\n\n \n
    \n
    \n
    \n \n \n
    \n\n
    \n \n
    \n \n {{$select.selected.name}}\n \n \n \n \n \n\n \n \n \n\n
    \n
    \n
    \n \n \n
    \n\n
    \n \n \n
    \n\n
    \n
    \n\n \n \n\n\n \n\n
    \n
    \n Success\n
    \n
    \n Error\n
    \n
    \n \n \n
    {{send.results.content.value.request}}
    \n
    \n \n
    {{send.results.content.value.response}}
    \n
    \n \n \n \n
    \n\n
    \n
    \n\n
    \n\n \n\n
    \n
    \n \n\n
    \n

    \n \n Endpoint: {{receive.endpoint}}\n

    \n

    \n \n Endpoint TLS: {{receive.endpointTLS}}\n

    \n
    \n
    \n
    \n\n \n \n\n \n\n
    \n {{statusMessage}}\n
    \n\n \n
    \n Success\n {{receive.results.timestamp | date:\'medium\'}}\n
    \n
    \n Error\n {{receive.results.timestamp | date:\'medium\'}}\n
    \n \n
    {{receive.results.request}}
    \n
    \n \n
    {{receive.results.response}}
    \n
    \n \n
    {{receive.results.samlReport}}
    \n
    \n
    \n\n
    \n
    ')}]),b.module("surveillance/surveil-home.tpl.html",[]).run(["$templateCache",function(a){a.put("surveillance/surveil-home.tpl.html",'

    Surveillance: Context-free Transport Testing

    \n\n

    \n The transport tests in this surveillance area support in-the-field, real-world verification of your system to three specified ONC certification criteria for health IT that include transport standards conformance. These tests can be executed on an ad-hoc basis and do not require any specific data.\n

    \n\n

    Context-free C-CDA Conformance Testing Options

    \n\n

    \nThis surveillance does not test "content." Therefore, any C-CDA content included as part of these tests will not be reviewed. The C-CDA Scorecard found at www.healthit.gov/scorecard can be used for context-free/non-certification based testing. The C-CDA Scorecard uses best practices and quantitative scoring criteria developed by HL7 to improve the C-CDA\'s implementation consistency.\n

    \n

    \nTesting both C-CDA content and Direct protocol transport can be done via production settings using the ONC One Click Scorecard benchmarking utility by sending a C-CDA to scorecard@direct.hhs.gov\n

    \n

    More information and how to use the One Click Score can be found here:\nhttps://oncprojectracking.healthit.gov/wiki/display/TechLabTU/ONC+One+Click+Scorecard\n

    ')}]),b.module("surveillance/surveillance.tpl.html",[]).run(["$templateCache",function(a){a.put("surveillance/surveillance.tpl.html","

    Surveillance Page

    \n")}]),b.module("surveillance/surveillanceCriteria.tpl.html",[]).run(["$templateCache",function(a){a.put("surveillance/surveillanceCriteria.tpl.html",'
    \n\n
    \n\n \n \n\n \n
    \n
    \n \n

    \n \n Error 0x0002: Couldn\'t find settings.json\n

    \n
    \n
    \n
    \n\n \n\n
    \n\n
    \n\n
    \n')}]),b.module("surveillance/surveillanceCriteriaHeader.tpl.html",[]).run(["$templateCache",function(a){a.put("surveillance/surveillanceCriteriaHeader.tpl.html",'\n')}]),b.module("templates-common",["templates/accountInfo.tpl.html","templates/announcement.tpl.html","templates/ccdaTemplates/ccdaR1ReportTemplate.tpl.html","templates/ccdaTemplates/ccdaR2ReportTemplate.tpl.html","templates/ccdaTemplates/ccdaWidgetTemplate.tpl.html","templates/changePassword.tpl.html","templates/dcdtTemplates/dcdtReportTemplate.tpl.html","templates/dcdtTemplates/hostingReportTemplate.tpl.html","templates/documents.tpl.html","templates/exception.tpl.html","templates/faq.tpl.html","templates/footer-home.tpl.html","templates/footer.tpl.html","templates/localinstall.tpl.html","templates/login.tpl.html","templates/loginModalTemplate.tpl.html","templates/pdfViewer.tpl.html","templates/releaseNotes.tpl.html","templates/session-timed-out.tpl.html","templates/smtpTemplates/SingleTestCaseTemplate.tpl.html","templates/warning.tpl.html","templates/xdrTemplates/xdrReceiverTestCaseTemplate.tpl.html","templates/xdrTemplates/xdrSenderTestCaseTemplate.tpl.html"]),b.module("templates/accountInfo.tpl.html",[]).run(["$templateCache",function(a){a.put("templates/accountInfo.tpl.html",'
    \n

    Account Info

    \n
    \n

    \n Username: {{userInfo.username}}\n

    \n

    \n Direct Address List:\n

    \n
      \n
    • {{direct}}
    • \n
    \n

    \n SMTP Profiles List:\n

    \n
      \n
    • {{smtp.profileName}} - {{smtp.sutSMTPAddress}}
    • \n
    \n
    \n')}]),b.module("templates/announcement.tpl.html",[]).run(["$templateCache",function(a){a.put("templates/announcement.tpl.html",'
    \n

    Announcements

    \n
    \n
    \n')}]),b.module("templates/ccdaTemplates/ccdaR1ReportTemplate.tpl.html",[]).run(["$templateCache",function(a){a.put("templates/ccdaTemplates/ccdaR1ReportTemplate.tpl.html",'
    \n\n
    \n\n \n \n \n \n \n \n
    \n \n \n \n C-CDA Document Type: {{data.ccdafilenaame}}\n
    \n Service Error Message: {{data.resultsMetaData.serviceErrorMessage}}\n
    \n \n
    \n
    \n\n\n
    \n\n
    \n
    \n
    \n
    \n {{item.count}}\n {{item.type}}\n
    \n
    \n
    \n
    \n\n
    \n\n \n \n
    \n
    \n
    \n Error -

    {{item.description}}

    \n
    \n
    \n
    \n Warning -

    {{item.description}}

    \n
    \n
    \n
    \n Info -

    {{item.description}}

    \n
    \n
    \n
    \n
    \n
    \n\n\n
    \n
    \n\n \n\n \n\n
    \n')}]),b.module("templates/ccdaTemplates/ccdaR2ReportTemplate.tpl.html",[]).run(["$templateCache",function(a){a.put("templates/ccdaTemplates/ccdaR2ReportTemplate.tpl.html",'
    \n\n
    \n\n \n \n \n \n \n \n
    \n \n \n \n C-CDA Document Details: {{data.resultsMetaData.objectiveProvided}} / {{data.ccdafilenaame}} - {{data.resultsMetaData.ccdaDocumentType}}\n
    \n Service Error Message: {{data.resultsMetaData.serviceErrorMessage}}\n
    \n \n
    \n
    \n\n\n
    \n\n
    \n
    \n
    \n
    \n {{item.count}}\n {{item.type}}\n
    \n
    \n
    \n
    \n\n
    \n\n \n \n
    \n
    \n
    \n Error -

    {{item.description}}

    \n
    \n
    \n
    \n Warning -

    {{item.description}}

    \n
    \n
    \n
    \n Info -

    {{item.description}}

    \n
    \n
    \n
    \n
    \n
    \n\n \n
    \n
    \n
    \n Error -

    {{item.description}}

    \n
    \n
    \n
    \n
    \n
    \n Warning -

    {{item.description}}

    \n
    \n
    \n
    \n
    \n
    \n Info -

    {{item.description}}

    \n
    \n
    \n
    \n
    \n
    \n\n \n
    \n
    \n
    \n Error -

    {{item.description}}

    \n
    \n
    \n
    \n Warning -

    {{item.description}}

    \n
    \n
    \n
    \n Info -

    {{item.description}}

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n\n \n\n \n\n
    '); +}]),b.module("templates/ccdaTemplates/ccdaWidgetTemplate.tpl.html",[]).run(["$templateCache",function(a){a.put("templates/ccdaTemplates/ccdaWidgetTemplate.tpl.html",'\n\n\n\n')}]),b.module("templates/changePassword.tpl.html",[]).run(["$templateCache",function(a){a.put("templates/changePassword.tpl.html",'
    \n

    Change your password

    \n
    \n\n
    \n\n
    \n \n \n
    \n\n
    \n \n \n
    \n\n
    \n \n \n
    \n\n
    \n
    \n\n
    \n
    \n\n \n
    \n')}]),b.module("templates/dcdtTemplates/dcdtReportTemplate.tpl.html",[]).run(["$templateCache",function(a){a.put("templates/dcdtTemplates/dcdtReportTemplate.tpl.html",'\n\n
    \n
    \n
    \n
    \n
      Direct Address:{{data.Direct_address_2014}}
    \n
    \n
    \n
    \n
    \n
      Direct Address:{{data.Direct_address_2015}}\n

    \n \n

    \n
    \n
    \n
    \n
    \n
    \n\n
    \n
    Binding Type: {{data.Binding_Type}}\n
    \n
    Location Type: {{data.Location_Type}}\n
    \n
    \n
    Negative: {{data.Negative}}\n
    \n
    Optional: {{data.Optional}}\n
    \n
    Description: {{data.Description}}\n
    \n
    RTM Sections:{{data.RTM_Sections}}\n
    \n
    Underlying Specification References: \n
      \n
    • RFC 4398: {{data.RFC_4398}}
    • \n
    • RFC 4298: {{data.RFC_4298}}
    • \n
    • RFC 5280: {{data.RFC_5280}}
    • \n
    • Direct Applicability Statement for Secure Health Transport:{{data.Direct_SHT}}
    • \n
    • RFC 2798: {{data.RFC_2798}}
    • \n
    • RFC 2782: {{data.RFC_2782}}
    • \n
    • RFC 1035: {{data.RFC_1035}}
    • \n
    \n
    \n

    \n

    Instructions: {{data.Instructions}}\n
    \n
    \n
    Target Certificate(s):
    \n
    \n
    \n
      \n
    • {{fieldTarget.name}}:
    • \n
        \n
      • Valid:{{fieldTarget.Valid}}
      • \n
      • Binding Type:{{fieldTarget.Binding_Type}}
      • \n
        \n
      • Location:
      • \n
          \n
        • Type:{{fieldlocTarget.Type}}
        • \n
        • Mail Address:{{fieldlocTarget.Mail_Address}}
        • \n
          \n
        • Host:{{fieldlocTarget.Host}}
        • \n
          \n
          \n
        • Port:{{fieldlocTarget.Port}}
        • \n
          \n
        \n
        \n
      • Description:{{fieldTarget.Description}}
      • \n
      \n
    \n
    \n
    Background Certificate(s):
    \n
    \n
      \n
    • {{field.name}}:
    • \n
        \n
      • Valid:{{field.Valid}}
      • \n
      • Binding Type:{{field.Binding_Type}}
      • \n
        \n
      • Location:
      • \n
          \n
        • Type:{{fieldloc.Type}}
        • \n
        • Mail Address:{{fieldloc.Mail_Address}}
        • \n
          \n
        • Host:{{fieldloc.Host}}
        • \n
          \n
          \n
        • Port:{{fieldloc.Port}}
        • \n
          \n
        \n
        \n
      • Description:{{field.Description}}
      • \n
      \n
    \n
    \n\n
    \n\n
    ')}]),b.module("templates/dcdtTemplates/hostingReportTemplate.tpl.html",[]).run(["$templateCache",function(a){a.put("templates/dcdtTemplates/hostingReportTemplate.tpl.html",'
    \n
    \n
    \n Results\n \n
    \n
    \n
    \n
    \n
    \n\n
    \n\n \n
    \n\n

    \n
    \n \n
    \n Testcase: {{itemtObj.testcase.testcase}}\n
    \n
    \n Direct Address: {{itemtObj.testcase.directAddr}}\n
    \n
    \n
    \n
    \n \n
    \n Testcase: {{itemtObj.testcase.testcase}}\n
    \n
    \n Direct Address: {{itemtObj.testcase.directAddr}}\n
    \n
    \n
    \n

    \n
    \n
    \n
    \n Success: {{item.success}}\n
    \n \n
    \n \n
    \n
    Processing Message(s): None
    \n
    \n
    \n Processed Step(s):\n
    \n
    {{$index+1}}. {{procStep.desc.text}}
    \n
    • Success:{{procStep.success}}
    • \n
      \n
      \n
    • Message(s):
    • \n
      • \n {{msg.text}}\n

      • \n
      \n
      \n
      \n
      \n
      \n
    • Message(s):
    • \n
      • \n {{item.msgs[0].toString()}}\n

      • \n
      \n
      \n
      \n \n
    • Binding Type:{{procStep.bindingType}}
    • \n
    • Location Type:{{procStep.locType}}
    • \n
    \n
    \n
    \n Discovered Valid Certificate:\n
    \n
    \n
    \n
    \n
    \n Discovered Invalid Certificate(s):\n
    \n
    \n
    \n
    \n
    \n
    \n\n
    \n
    \n
    \n\n
    \n
    \n')}]),b.module("templates/documents.tpl.html",[]).run(["$templateCache",function(a){a.put("templates/documents.tpl.html",'
    \n

    Frequently Asked Questions

    \n
      \n
    • \n Find answers for Frequently Asked Questions here\n
    • \n
    \n

    Guides

    \n \n

    Samples

    \n \n

    Documents

    \n \n

    ETT Instruction/Demonstration Videos

    \n
      \n
    • \n Demonstration Videos\n \n External Link\n \n
    • \n Note: The infrastructure references from the videos have changed. More details can be found here. External Link\n
    \n
    \n\n\n')}]),b.module("templates/exception.tpl.html",[]).run(["$templateCache",function(a){a.put("templates/exception.tpl.html",'\n\n\n')}]),b.module("templates/faq.tpl.html",[]).run(["$templateCache",function(a){a.put("templates/faq.tpl.html",'
    \n

    FAQ

    \n
    \n
    \n')}]),b.module("templates/footer-home.tpl.html",[]).run(["$templateCache",function(a){a.put("templates/footer-home.tpl.html",'')}]),b.module("templates/footer.tpl.html",[]).run(["$templateCache",function(a){a.put("templates/footer.tpl.html",'')}]),b.module("templates/localinstall.tpl.html",[]).run(["$templateCache",function(a){a.put("templates/localinstall.tpl.html",'
    \n

    Local Installation Guide

    \n
    \n
    \n')}]),b.module("templates/login.tpl.html",[]).run(["$templateCache",function(a){a.put("templates/login.tpl.html",'\n\n\n')}]),b.module("templates/loginModalTemplate.tpl.html",[]).run(["$templateCache",function(a){a.put("templates/loginModalTemplate.tpl.html",'\n\n\n')}]),b.module("templates/pdfViewer.tpl.html",[]).run(["$templateCache",function(a){a.put("templates/pdfViewer.tpl.html",'\n\n
    \n\n\n')}]),b.module("templates/releaseNotes.tpl.html",[]).run(["$templateCache",function(a){a.put("templates/releaseNotes.tpl.html",'

    Release Notes

    \n
    \n
    \n
    \n
    \n

    {{key}}

    \n
    \n
    \n
    \n
    \n
    \n
    \n

    {{key}} - {{value.date | date}}

    \n
      \n
    • {{note.title}}
    • \n
        \n
      • {{line}}
      • \n
      \n
    \n
    \n
    \n
    \n
    \n')}]),b.module("templates/session-timed-out.tpl.html",[]).run(["$templateCache",function(a){a.put("templates/session-timed-out.tpl.html",'\n\n\n')}]),b.module("templates/smtpTemplates/SingleTestCaseTemplate.tpl.html",[]).run(["$templateCache",function(a){a.put("templates/smtpTemplates/SingleTestCaseTemplate.tpl.html",'
  • \n
    \n \n\n \n\n \n\n \n\n \n\n \n\n\n \n\n
    \n
    \n \n Cancel\n Clear\n
    \n
    \n
    \n
    \n

    {{test.name}}

    \n

    {{test.desc}}

    \n \n
    \n\n
    \n \n\n
    \n\n \n
    \n \n
    \n
    \n \n
    \n\n \n
    \n \n
    \n\n \n
    \n \n
    \n\n \n
    \n \n
    \n \n
    \n \n
    \n\n \n
    \n \n
    \n \n
    \n \n
    \n\n
    \n
    \n
    \n\n
    \n \n
  • '); }]),b.module("templates/warning.tpl.html",[]).run(["$templateCache",function(a){a.put("templates/warning.tpl.html",'
    \n
    \n ×\n

    PHI Note: The SITE tools do not retain your submitted files. However, we strongly suggest that you do not include any Protected Health Information (PHI) or Personally Identifiable Information (PII) in your file submissions within our tools. Click here for more information on how to de-identify PHI.

    \n
    \n
    ')}]),b.module("templates/xdrTemplates/xdrReceiverTestCaseTemplate.tpl.html",[]).run(["$templateCache",function(a){a.put("templates/xdrTemplates/xdrReceiverTestCaseTemplate.tpl.html",'
  • \n \n\n \n\n \n\n \n \n
    \n

    Test ID #{{test.ID}}

    \n

    {{test[\'Purpose/Description\']}}

    \n\n
    \n
    \n

    Step 1: Provide your endpoint and hit Run to send XDR

    \n
    \n \n\n
    \n \n
    \n
    \n\n
    \n
    \n

    Step 2: Check the logs to accept/reject the response

    \n
    \n
    \n
    \n \n
  • \n')}]),b.module("templates/xdrTemplates/xdrSenderTestCaseTemplate.tpl.html",[]).run(["$templateCache",function(a){a.put("templates/xdrTemplates/xdrSenderTestCaseTemplate.tpl.html",'
  • \n
    \n \n\n \n\n \n\n \n\n \n\n \n \n \n \n \n
    \n
    \n \n Cancel\n Clear\n
    \n
    \n
    \n
    \n

    {{test.name}}

    \n

    {{test.desc}}

    \n\n
    \n
    \n

    Step 1: {{runText}}

    \n
    \n
    \n

    \n \n Endpoint: {{test.endpoint}}\n

    \n

    \n \n Endpoint TLS: {{test.endpointTLS}}\n

    \n
    \n
    \n
    \n

    Step 1: Provide your {{input.name}}{{$last ? \'. \':($index==test.inputs.length-2) ? \', and \':\', a \'}}{{runText}}

    \n
    \n
    \n
    \n \n
    \n
    \n \n
    \n\n
    \n\n
    \n\n
    \n \n
    \n
    \n\n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n\n \n
    \n
    \n \n
    \n
    \n\n \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n\n
    \n
    \n

    Step 2: Send XDR message to endpoint and refresh to check status

    \n
    \n
    \n

    \n \n Endpoint: {{test.endpoint}}\n

    \n

    \n \n Endpoint TLS: {{test.endpointTLS}}\n

    \n
    \n
    \n\n
    \n
    \n

    Step 3: Check the logs to accept/reject the response

    \n
    \n
    \n
    \n \n
  • \n')}])}(window,window.angular); \ No newline at end of file diff --git a/webapp/src/main/resources/static/assets/xdrtestCases.json b/webapp/src/main/resources/static/assets/xdrtestCases.json index cfea9b2de..6b7cb3ff3 100644 --- a/webapp/src/main/resources/static/assets/xdrtestCases.json +++ b/webapp/src/main/resources/static/assets/xdrtestCases.json @@ -1,1375 +1,1375 @@ -[{ - "name": "XDR Test 1", - "id": 1, - "ID": "1", - "desc": "Verifies the ability of the sending system to initiate a SOAP-based communication with an XDR-based payload. This test uses Limited XDR metadata.", - "sutEdge": true, - "sutHisp": false, - "sutRole": "sender", - "criteria":"['b1-1']", - "inputs": [{ - "name": "Direct From Address", - "hoverlabel":"Direct From Address: SUT (HISP) outgoing SMTP address (or) MDN.", - "key": "direct_from", - "type": "string" - }, { - "name": "C-CDA Document Type", - "key": "payload", - "type": "CCDAWidgetXdr" - }], - "Test Focus": "XDR Send ", - "Data Flow in Direct": "Edge Sends an XDR message to HISP along with Direct Address block", - "Metadata Included": "Limited Metadata", - "Direct Address Block": "Included", - "SUT: Sender/ Receiver": "Sender (Edge - SUT)", - "Test Tool: Sender / Receiver": "Receiver (Test Tool)", - "Purpose/Description": "Verify that the Edge system can create an XDR message per the specification. Per the Test Procedure, the user is to select a payload for transmission that meets the test scenario with regard to 170_b1_ToC_Amb or 170.315_b1_ToC_Inp. The user should select the C-CDA document type that matches the architecture for the document they are sending.", - "Conformance Test Details": "XDR Message Checklist + XDS Metadata Checklist for Limited Metadata Document Source + Direct Address Block", - "Expected Test Results": "Edge System produces the right message and conforms to the specification.", - "Required / Conditional per Direct Edge Protocol Guide": "R", - "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, - "Test Data IDs": null -}, { - "name": "XDR Test 2", - "id": 2, - "ID": "2", - "desc": "Verifies the ability of the sending system to initiate a SOAP-based communication with an XDR-based payload. This test uses Full XDR metadata.", - "sutEdge": true, - "sutHisp": false, - "sutRole": "sender", - "criteria":"['b1-1']", - "inputs": [{ - "name": "Direct From Address", - "hoverlabel":"Direct From Address: SUT (HISP) outgoing SMTP address (or) MDN.", - "key": "direct_from", - "type": "string" - }, { - "name": "C-CDA Document Type", - "key": "payload", - "type": "CCDAWidgetXdr" - }], - "Test Focus": "XDR Send", - "Data Flow in Direct": "Edge Sends an XDR message to HISP along with Full Metadata", - "Metadata Included": "Full Metadata", - "Direct Address Block": "Included", - "SUT: Sender/ Receiver": "Sender (Edge - SUT)", - "Test Tool: Sender / Receiver": "Receiver (Test Tool)", - "Purpose/Description": "Verify that the Edge system can create an XDR message per the specification", - "Conformance Test Details": "XDR Message Checklist + XDS Metadata Checklist for Full Metadata Document Source + Direct XDR Checklist", - "Expected Test Results": "Edge System produces the right message and conforms to the specification.", - "Required / Conditional per Direct Edge Protocol Guide": "O", - "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, - "Test Data IDs": null -}, { - "name": "XDR Test 3", - "id": "3add", - "ID": "3add", - "desc": "Verify the ability of the receiving system to correctly receive a properly formatted XDR message with Limited metadata.", - "sutEdge": true, - "sutHisp": false, - "sutRole": "receiver", - "criteria":"['b1-3','su1-3']", - "inputs": [{ - "name": "Endpoint", - "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages", - "key": "targetEndpointTLS", - "type": "string" - }, { - "name": "C-CDA Document Type", - "key": "payload", - "type": "CCDAWidgetReceiverXdr" - }], - "Test Focus": "XDR Receive", - "Data Flow in Direct": "Edge receives an XDR message from the HISP", - "Metadata Included": "Limited Metadata", - "Direct Address Block": "Included", - "SUT: Sender/ Receiver": "Receiver (Edge - SUT)", - "Test Tool: Sender / Receiver": "Sender (Test Tool)", - "Purpose/Description": "Verify that an Edge system can receive a properly formatted XDR message. The SUT will receive the XDR message with a 'direct:from' and 'direct:to' address of testcase3add@ttpedge.sitenv.org. This was designed to require the SUT's endpoint as the only input parameter.", - "Conformance Test Details": "", - "Expected Test Results": "Edge system is capable of receiving and processing a valid message, test procedure may include other details for verification. Test Tool is satisfied with a good response.", - "Required / Conditional per Direct Edge Protocol Guide": "R", - "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, - "Test Data IDs": null -}, { - "name": "XDR Test 4a", - "id": "4a", - "ID": "4a", - "desc": "Verify the ability of the receiving system to appropriately respond to a malformed message. This test is for an invalid SOAP header.", - "sutEdge": true, - "sutHisp": false, - "sutRole": "receiver", - "criteria":"['b1-3']", - "inputs": [{ - "name": "Endpoint", - "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages", - "key": "targetEndpointTLS", - "type": "string" - }], - "Test Focus": "XDR Receive", - "Data Flow in Direct": "Edge receives an incorrect XDR message from the HISP", - "Metadata Included": "N/A", - "Direct Address Block": "N/A", - "SUT: Sender/ Receiver": "Receiver (Edge - SUT)", - "Test Tool: Sender / Receiver": "Sender (Test Tool)", - "Purpose/Description": "Verify that the Edge system throws an error when an incorrect message is received. The SUT will receive the XDR message with a 'direct:from' and 'direct:to' address of testcase4a@ttpedge.sitenv.org. This was designed to require the SUT's endpoint as the only input parameter.", - "Conformance Test Details": "Create incorrect messages which include Bad SOAP Envelope Details", - "Expected Test Results": "Edge system is rejecting the various bad messages sent from the test tool.", - "Required / Conditional per Direct Edge Protocol Guide ": "R", - "Direct Edge Protocol Guide 1.1 RTM Reference ": 1.1, - "Test Data IDs ": null -}, { - "name": "XDR Test 4b", - "id": "4b", - "ID": "4b", - "desc": "Verify the ability of the receiving system to appropriately respond to a malformed message. This test is for an invalid SOAP body.", - "sutEdge": true, - "sutHisp": false, - "sutRole": "receiver", - "criteria":"['b1-3']", - "inputs": [{ - "name": "Endpoint", - "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages", - "key": "targetEndpointTLS", - "type": "string" - }], - "Test Focus": "XDR Receive", - "Data Flow in Direct": "Edge receives an incorrect XDR message from the HISP", - "Metadata Included": "N/A", - "Direct Address Block": "N/A", - "SUT: Sender/ Receiver": "Receiver (Edge - SUT)", - "Test Tool: Sender / Receiver": "Sender (Test Tool)", - "Purpose/Description": "Verify that the Edge system throws an error when an incorrect message is received. The SUT will receive the XDR message with a 'direct:from' and 'direct:to' address of testcase4b@ttpedge.sitenv.org. This was designed to require the SUT's endpoint as the only input parameter.", - "Conformance Test Details": "Create incorrect messages which include Bad SOAP Body Details", - "Expected Test Results": "Edge system is rejecting the various bad messages sent from the test tool.", - "Required / Conditional per Direct Edge Protocol Guide ": "R", - "Direct Edge Protocol Guide 1.1 RTM Reference ": 1.1, - "Test Data IDs ": null -}, { - "name": "XDR Test 5", - "id": 5, - "ID": "5", - "desc": "Verify the ability of the receiving system to correctly receive a properly formatted XDR message with Full (XDS) metadata.", - "sutEdge": true, - "sutHisp": false, - "sutRole": "receiver", - "criteria":"['b1-3','su1-3']", - "inputs": [{ - "name": "Endpoint", - "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages", - "key": "targetEndpointTLS", - "type": "string" - }], - "Test Focus": "XDR Receive", - "Data Flow in Direct": "Edge receives an XDR message from the HISP", - "Metadata Included": "Full Metadata", - "Direct Address Block": "Included", - "SUT: Sender/ Receiver": "Receiver (Edge - SUT)", - "Test Tool: Sender / Receiver": "Sender (Test Tool)", - "Purpose/Description": "Verify that an Edge system can receive a properly formatted XDR message. The SUT will receive the XDR message with a 'direct:from' and 'direct:to' address of testcase5@ttpedge.sitenv.org. This was designed to require the SUT's endpoint as the only input parameter.", - "Conformance Test Details": "", - "Expected Test Results": "Edge system is capable of receiving and processing a valid message with Full Metadata, test procedure may include other details for verification. Test Tool is satisfied with a good response.", - "Required / Conditional per Direct Edge Protocol Guide": "R", - "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, - "Test Data IDs": null -}, { - "name": "XDR Test 6", - "id": 6, - "ID": "6", - "desc": "Verifies the ability of the sending system to complete a mutual TLS handshake before data is sent across.\nNote that an unsuccessful TLS attempt may result in the Pending Refresh button being displayed instead of a Fail. A disconnection happening at the server level would cause the communication not to be forwarded to the application level.", - "sutEdge": true, - "sutHisp": false, - "sutRole": "sender", - "criteria":"['b1-1']", - "inputs": [{ - "name": "Direct From Address", - "hoverlabel":"Direct From Address: SUT (HISP) outgoing SMTP address (or) MDN.", - "key": "direct_from", - "type": "string" - }], - "Test Focus": "Authentication", - "Data Flow in Direct": "Edge uses Mutual TLS to authenticate to the HISP", - "Metadata Included": "N/A", - "Direct Address Block": "N/A", - "SUT: Sender/ Receiver": "Sender (Edge - SUT)", - "Test Tool: Sender / Receiver": "Server (Test Tool)", - "Purpose/Description": "Verify that Mutual TLS session is established between the Sender and the Receiver before transimitting data. The Tester (i.e., Vendor) assures that the appropriate XDR Certificates have been downloaded from the ETT and imported into the SUT trust store before executing the test.", - "Conformance Test Details": "Require Mutual TLS in the configuration", - "Expected Test Results": "Edge Sysem is capable of establishing the Mutual TLS connection prior to transmitting the data.", - "Required / Conditional per Direct Edge Protocol Guide": "R", - "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, - "Test Data IDs": null -}, { - "name": "XDR Test 7", - "id": 7, - "ID": "7", - "desc": "Verifies the ability of the sending system to reject a mutual TLS connection where the certificate provided by the ETT is invalid. If you experience Pending Refresh or a Fail that you think is incorrect, please run this test again but wait 15 seconds after the connection has been dropped for the ETT to fully test the socket connection.", - "sutEdge": true, - "sutHisp": false, - "sutRole": "sender", - "criteria":"['b1-1']", - "inputs": [{ - "name": "IP Address", - "key": "ip_address", - "hoverlabel":"IP Address (eg: 202.255.24.62)", - "type": "string" - }], - "Test Focus": "Authentication", - "Data Flow in Direct": "Edge uses Mutual TLS to authenticate to the HISP exception case", - "Metadata Included": "N/A", - "Direct Address Block": "N/A", - "SUT: Sender/ Receiver": "Sender (Edge - SUT)", - "Test Tool: Sender / Receiver": "Server (Test Tool)", - "Purpose/Description": "Verify that Edge disconnects when the Server provided certificate is invalid.", - "Conformance Test Details": "Incorrect Mutual TLS configuration should not proceed.", - "Expected Test Results": "Edge Sysem rejects the connection from the Server due to bad certificate.", - "Required / Conditional per Direct Edge Protocol Guide": "R", - "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, - "Test Data IDs": "Column J is not necessary." -}, { - "name": "XDR Test 8", - "id": 8, - "ID": "8", - "desc": "Verifies the ability of the receiving system to complete a mutual TLS handshake before data is sent across. Certificates for this test can be downloaded from the link at the top of this page. This is a socket-level test, the full endpoint is not necessary. Enter only IP Address and port below.", - "sutEdge": true, - "sutHisp": false, - "sutRole": "receiver", - "criteria":"['b1-3']", - "inputs": [{ - "name": "IP Address", - "key": "ip_address", - "hoverlabel":"IP Address (eg: 202.255.24.62)", - "type": "string" - }, { - "name": "Port", - "key": "port", - "type": "string" - }], - "Test Focus": "Authentication", - "Data Flow in Direct": "HISP authenticates to the Edge using Mutual TLS", - "Metadata Included": "N/A", - "Direct Address Block": "N/A", - "SUT: Sender/ Receiver": "Receiver (Edge - SUT)", - "Test Tool: Sender / Receiver": "Client (Test Tool)", - "Purpose/Description": "Test Tool authenticates with the Edge using Mutual TLS correctly", - "Conformance Test Details": "Require Mutual TLS in the configuration in the Edge system", - "Expected Test Results": "Edge System is capable of accepting and validating a Mutual TLS connection.", - "Required / Conditional per Direct Edge Protocol Guide": "R", - "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, - "Test Data IDs": null -}, { - "name": "XDR Test 9", - "id": 9, - "ID": "9", - "desc": "Verifies the ability of the receiving system to reject a mutual TLS connection where the certificate provided by the ETT is invalid. Certificates for this test can be downloaded from the link at the top of this page. As this is a socket-level test, the full endpoint is not necessary and only IP Address and port are to be entered below. The SUT MUST attempt an HTTPS connection.", - "sutEdge": true, - "sutHisp": false, - "sutRole": "receiver", - "criteria":"['b1-3']", - "inputs": [{ - "name": "IP Address", - "key": "ip_address", - "hoverlabel":"IP Address (eg: 202.255.24.62)", - "type": "string" - }, { - "name": "Port", - "key": "port", - "type": "string" - }], - "Test Focus": "Authentication", - "Data Flow in Direct": "HISP authenticates to the Edge using Mutual TLS exception case", - "Metadata Included": "N/A", - "Direct Address Block": "N/A", - "SUT: Sender/ Receiver": "Receiver (Edge - SUT)", - "Test Tool: Sender / Receiver": "Client (Test Tool)", - "Purpose/Description": "Test Tool authenticates with the Edge using bad certificates", - "Conformance Test Details": "Incorrect Mutual TLS configuration should not proceed.", - "Expected Test Results": "Edge System rejects the connection due to the bad certificate published by the Test Tool.", - "Required / Conditional per Direct Edge Protocol Guide": "R", - "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, - "Test Data IDs": null -}, { - "name": "XDR Test 10", - "id": 10, - "ID": "10", - "desc": "Test Tool sends a Direct Message to the SUT. The SUT must translate this to an XDR message and send it back to the Edge.\nVerify that the HISP system can create an XDR message per the specification and forward to Edge. The return endpoint is provided below. The validation report will be sent to the email address registered with the Direct address enter during setup.", - "sutEdge": false, - "sutHisp": true, - "sutRole": "sender", - "criteria":"['h2-1','h2-3','sc2-1','sc2-3']", - "status": "configure", - "inputs": [{ - "name": "Direct To Address", - "hoverlabel":"Direct To Address: SUT's receiving email endpoint for Direct/XDR translation, ETT to SUT workflow.", - "key": "direct_to", - "type": "string" - }], - "Test Focus": "XDR Send ", - "Data Flow in Direct": "HISP Sends an XDR message to Edge", - "Metadata Included": "Limited Metadata", - "Direct Address Block": "Included", - "SUT: Sender/ Receiver": "Sender (HISP - SUT)", - "Test Tool: Sender / Receiver": "Receiver (Test Tool)", - "Purpose/Description": "Test Tool sends a Direct Message, which is translated to an XDR message and sent to the Edge.\nVerify that the HISP system can create an XDR message per the specification and forward to Edge. The validation report will be sent to the email address registered with the Direct address enter during setup. Direct To Address: SUT's receiving email endpoint for Direct/XDR translation, ETT to SUT workflow. The SUT will receive a message from testcase10@ttpedge.sitenv.org", - "Conformance Test Details": "XDR Message Checklist + XDS Metadata Checklist for Limited Metadata Document Source + Direct XDR Checklist", - "Expected Test Results": "HISP generates an XDR message with Limited Metadata from a Direct Message and forwards to Edge.", - "Required / Conditional per Direct Edge Protocol Guide": "R", - "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, - "Test Data IDs": null -}, { - "name": "XDR Test 11", - "id": 11, - "ID": "11", - "desc": "Test Tool sends a Direct Message + XDM to the SUT. The SUT must translate this to an XDR message with Limited Metadata and send it back to the Edge.\nVerify that the HISP system can create an XDR message per the specification and forward to Edge. The return endpoint is provided below. The validation report will be sent to the email address registered with the Direct address enter during setup.", - "sutEdge": false, - "sutHisp": true, - "sutRole": "sender", - "criteria":"['h2-1','h2-3','sc2-1','sc2-3']", - "status": "configure", - "inputs": [{ - "name": "Direct To Address", - "hoverlabel":"Direct To Address: SUT's receiving email endpoint for Direct/XDR translation, ETT to SUT workflow.", - "key": "direct_to", - "type": "string" - }], - "Test Focus": "XDR Send", - "Data Flow in Direct": "HISP Sends an XDR message to Edge with Limited Metadata", - "Metadata Included": "Limited Metadata", - "Direct Address Block": "Included", - "SUT: Sender/ Receiver": "Sender (HISP - SUT)", - "Test Tool: Sender / Receiver": "Receiver (Test Tool)", - "Purpose/Description": "Test Tool sends a Direct Message + XDM, which is translated to an XDR message with Limited Metadata and sent to the Edge.\nVerify that the HISP system can create an XDR message per the specification and forward to Edge. The validation report will be sent to the email address registered with the Direct address enter during setup. Direct To Address: SUT's receiving email endpoint for Direct/XDR translation, ETT to SUT workflow. The SUT will receive a message from testcase11@ttpedge.sitenv.org.", - "Conformance Test Details": "XDR Message Checklist + XDS Metadata Checklist for Limited Metadata Document Source + Direct XDR Checklist", - "Expected Test Results": "HISP generates an XDR message with Limited Metadata from a Direct Message and forwards to Edge.", - "Required / Conditional per Direct Edge Protocol Guide": "R", - "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, - "Test Data IDs": null -}, { - "name": "XDR Test 12", - "id": 12, - "ID": "12", - "desc": "Test Tool sends a Direct Message + XDM to the SUT. The SUT must translate this to an XDR message with Full Metadata and send it back to the Edge.\nVerify that the HISP system can create an XDR message per the specification and forward to Edge. The return endpoint is provided below.The validation report will be sent to the email address registered with the Direct address enter during setup.", - "sutEdge": false, - "sutHisp": true, - "sutRole": "sender", - "criteria":"['h2-1','h2-3','sc2-1','sc2-3']", - "status": "configure", - "inputs": [{ - "name": "Direct To Address", - "hoverlabel":"Direct To Address: SUT's receiving email endpoint for Direct/XDR translation, ETT to SUT workflow.", - "key": "direct_to", - "type": "string" - }], - "Test Focus": "XDR Send", - "Data Flow in Direct": "HISP Sends an XDR message to Edge along with Full Metadata", - "Metadata Included": "Full Metadata", - "Direct Address Block": "Included", - "SUT: Sender/ Receiver": "Sender (HISP - SUT)", - "Test Tool: Sender / Receiver": "Receiver (Test Tool)", - "Purpose/Description": "Test Tool sends a Direct Message + XDM, which is translated to an XDR message with Full Metadata and sent to the Edge.\nVerify that the HISP system can create an XDR message per the specification and forward to Edge. The validation report will be sent to the email address registered with the Direct address enter during setup. Direct To Address: SUT's receiving email endpoint for Direct/XDR translation, ETT to SUT workflow. The SUT will receive a message from testcase12@ttpedge.sitenv.org.", - "Conformance Test Details": "XDR Message Checklist + XDS Metadata Checklist for Full Metadata Document Source + Direct XDR Checklist", - "Expected Test Results": "HISP generates an XDR message with Full Metadata from a Direct Message and forwards to Edge.", - "Required / Conditional per Direct Edge Protocol Guide": "O", - "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, - "Test Data IDs": null -}, { - "name": "XDR Test 13", - "id": 13, - "ID": "13", - "desc": "Before this test is run, the vendor must register a Direct Address / Contact address pairing using the Direct portion of the ETT tool.\nTest Tool sends an XDR Message with Limited metadata to the SUT (HISP). The SUT must then translate the message into Direct and send it back to the ETT which is acting as the Destination HISP. The Direct Address it passes the message along to must match the Direct Address that has been pre-registered. A validation report will be sent to the Contact address.\nVerify that an HISP system can receive a properly formatted XDR message and translate to Direct Message.", - "sutEdge": false, - "sutHisp": true, - "sutRole": "receiver", - "criteria":"['h2-2','h2-7','sc2-2','sc2-7']", - "inputs": [{ - "name": "Endpoint", - "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages.", - "key": "targetEndpointTLS", - "type": "string" - }, { - "name": "Outgoing (ETT --> SUT) Direct From Address", - "hoverlabel":"SUT (HISP) outgoing SMTP address.", - "key": "outgoing_from", - "type": "string" - }], - "Test Focus": "XDR Receive", - "Data Flow in Direct": "HISP receives an XDR message from the Edge", - "Metadata Included": "Limited Metadata", - "Direct Address Block": "Included", - "SUT: Sender/ Receiver": "Receiver (HISP - SUT)", - "Test Tool: Sender / Receiver": "Sender (Test Tool)", - "Purpose/Description": "Test Tool sends an XDR Message to the HSIP which then translates the message to Direct and sends to the other HISP.\nVerify that an HISP system can receive a properly formatted XDR message and translate to Direct Message.\nNote: When the SUT (HISP) receives the MDN (from the 'direct:to' and hence RCPT TO from the Direct communication), the MAIL FROM of the MDN will be 'direct:to' - since the 'direct:to' endpoint is sending the MAIL FROM. The ETT hardcodes 'direct:to' based on the test case, normally is not needed.", - "Conformance Test Details": "XDR Message Checklist + XDS Metadata Checklist for Limited Metadata Document Source + Direct XDR Checklist", - "Expected Test Results": "HISP receives an XDR message and converts to a Direct + XDM Message.", - "Required / Conditional per Direct Edge Protocol Guide": "R", - "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, - "Test Data IDs": null -}, { - "name": "XDR MT Test 13", - "id": "32mu2", - "ID": "32mu2", - "desc": "Verify the ability of the SUT to appropriately respond to a delivery to a non-existent address. ETT will send a message via XDR to the SUT. If the SUT's final response is delivered synchronously, that message will be saved in the logs (click 'Logs'). If the SUT's final response is delivered asynchronously: 1) wait until the SUT's message has been sent and the ETT's response has been received, 2) click the Pending Refresh button to continue, 3) the logs for the asynchronous communication will then be available. The proctor will read the logs for the synchronous communication or the asynchronous communication for an appropriate response. This test is part of the Message Tracking Using Processed MDN test suite.", - "sutEdge": false, - "sutHisp": true, - "sutRole": "receiver", - "criteria":"['h2-3','sc2-3']", - "status": "configure", - "inputs": [{ - "name": "Endpoint", - "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages.", - "key": "targetEndpointTLS", - "type": "string" - }, { - "name": "Direct From Address", - "hoverlabel":"SUT (HISP) outgoing SMTP address.", - "key": "direct_from", - "type": "string" - }, { - "name": "Outgoing (ETT --> SUT) Direct From Address", - "key": "outgoing_from", - "type": "string" - }], - "Test Focus": "XDR Receive", - "Data Flow in Direct": "HISP receives an XDR message from the Edge", - "Metadata Included": "N/A", - "Direct Address Block": "Included", - "SUT: Sender/ Receiver": "Receiver (HISP - SUT)", - "Test Tool: Sender / Receiver": "Sender (Test Tool)", - "Purpose/Description": "The ETT (as Edge) sends a message to the Health IT Module using a bad address, such that the Health IT Module is unable to deliver the message. The Health IT Module delivers a failure message to the ETT (as Edge) using the XDR profile due to a bad address. \n Note: When the SUT (HISP) receives the MDN (from the 'direct:to' and hence RCPT TO from the Direct communication), the MAIL FROM of the MDN will be 'direct:to' - since the 'direct:to' endpoint is sending the MAIL FROM. The ETT hardcodes 'direct:to' based on the test case, normally is not needed. \n Outgoing (ETT --> SUT) Direct From Address:Note: MDN Direct from address in the 'direct:from' address the XDR MDN. ETT will use in creating the SOAP XDR transaction for this test. In turn this is destined to become the SMTP MAIL FROM for the ensuing Direct Communication between the SUT HISP to the ETT HISP (the 'direct:to' becomes the RCPT TO).", - "Conformance Test Details": "Conforms to section 1.5.2.1.1 of the Direct Edge Protocol Implementation Guide 1.1, including an appropriately filled 'direct:disposition' element in the XML payload", - "Expected Test Results": "The message disposition must indicate a failure.", - "Required / Conditional per Direct Edge Protocol Guide": "R", - "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, - "Test Data IDs": null -}, { - "name": "XDR Test 14", - "id": 14, - "ID": "14", - "desc": "Before this test is run, the vendor must register a Direct Address / Contact address pairing using the Direct portion of the ETT tool.\nTest Tool sends an XDR Message with Full (XDS) metadata to the SUT (HISP). The SUT must then translate the message into Direct and send it back to the ETT which is acting as the Destination HISP. The Direct Address it passes the message along to must match the Direct Address that has been pre-registered. A validation report will be sent to the Contact address.\nVerify that an HISP system can receive a properly formatted XDR message and translate to Direct Message.", - "sutEdge": false, - "sutHisp": true, - "sutRole": "receiver", - "criteria":"['h2-2','h2-7','sc2-2','sc2-7']", - "inputs": [{ - "name": "Endpoint", - "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages.", - "key": "targetEndpointTLS", - "type": "string" - }, { - "name": "Outgoing (ETT --> SUT) Direct From Address", - "hoverlabel":"SUT (HISP) outgoing SMTP address.", - "key": "outgoing_from", - "type": "string" - }], - "Test Focus": "XDR Receive", - "Data Flow in Direct": "HISP receives an XDR message from the Edge along with Full Metadata", - "Metadata Included": "Full Metadata", - "Direct Address Block": "Included", - "SUT: Sender/ Receiver": "Receiver (HISP - SUT)", - "Test Tool: Sender / Receiver": "Sender (Test Tool)", - "Purpose/Description": "Test Tool sends an XDR Message with Full Metadata to the HSIP which then translates the message to Direct and sends to the other HISP.\nVerify that an HISP system can receive a properly formatted XDR message and translate to Direct Message.\nNote: When the SUT (HISP) receives the MDN (from the 'direct:to' and hence RCPT TO from the Direct communication), the MAIL FROM of the MDN will be 'direct:to' - since the 'direct:to' endpoint is sending the MAIL FROM. The ETT hardcodes 'direct:to' based on the test case, normally is not needed.", - "Conformance Test Details": "XDR Message Checklist + XDS Metadata Checklist for Full Metadata Document Source + Direct XDR Checklist", - "Expected Test Results": "HISP receives an XDR message and converts to a Direct Message.", - "Required / Conditional per Direct Edge Protocol Guide": "O", - "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, - "Test Data IDs": null -}, { - "name": "XDR MT Test 14", - "id": "33mu2", - "ID": "33mu2", - "desc": "Verify the ability of the SUT to appropriately respond to a delivery to an untrusted HISP. ETT will send a message via XDR to the SUT. If the SUT's final response is delivered synchronously, that message will be saved in the logs (click 'Logs'). If the SUT's final response is delivered asynchronously: 1) wait until the SUT's message has been sent and the ETT's response has been received, 2) click the Pending Refresh button to continue, 3) the logs for the asynchronous communication will then be available. The proctor will read the logs for the synchronous communication or the asynchronous communication for an appropriate response. This test is part of the Message Tracking Using Processed MDN test suite.", - "sutEdge": false, - "sutHisp": true, - "sutRole": "receiver", - "criteria":"['h2-3','sc2-3']", - "status": "configure", - "inputs": [{ - "name": "Endpoint", - "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages.", - "key": "targetEndpointTLS", - "type": "string" - }, { - "name": "Direct From Address", - "hoverlabel":"SUT (HISP) outgoing SMTP address.", - "key": "direct_from", - "type": "string" - }, { - "name": "Outgoing (ETT --> SUT) Direct From Address", - "key": "outgoing_from", - "type": "string" - }], - "Test Focus": "XDR Receive", - "Data Flow in Direct": "The ETT (as Edge) sends a message to the Health IT Module using a valid address, but the ETT (as Destination HISP) is not trusted.", - "Metadata Included": "N/A", - "Direct Address Block": "Included", - "SUT: Sender/ Receiver": "Receiver (HISP - SUT)", - "Test Tool: Sender / Receiver": "Sender (Test Tool)", - "Purpose/Description": "The ETT (as Edge) sends a message to the Health IT Module using a valid address, but the ETT (as Destination HISP) is not trusted. \n Note: When the SUT (HISP) receives the MDN (from the 'direct:to' and hence RCPT TO from the Direct communication), the MAIL FROM of the MDN will be 'direct:to' - since the 'direct:to' endpoint is sending the MAIL FROM. The ETT hardcodes 'direct:to' based on the test case, normally is not needed. \n Outgoing (ETT --> SUT) Direct From Address:Note: MDN Direct from address in the 'direct:from' address the XDR MDN. ETT will use in creating the SOAP XDR transaction for this test. In turn this is destined to become the SMTP MAIL FROM for the ensuing Direct Communication between the SUT HISP to the ETT HISP (the 'direct:to' becomes the RCPT TO).", - "Conformance Test Details": "Conforms to section 1.5.2.1.1 of the Direct Edge Protocol Implementation Guide 1.1", - "Expected Test Results": "The Health IT Module delivers a failure message to the ETT (as Edge) using the XDR profile due to an untrusted HISP (ETT as Destination HISP)", - "Required / Conditional per Direct Edge Protocol Guide": "R", - "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, - "Test Data IDs": null -}, { - "name": "XDR Test 15a", - "id": "15a", - "ID": "15a", - "desc": "Verify the ability of the receiving system to appropriately respond to a malformed message. This test is for an invalid SOAP header.", - "sutEdge": false, - "criteria":"['h2-7']", - "sutHisp": true, - "sutRole": "receiver", - "inputs": [{ - "name": "Endpoint", - "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages", - "key": "targetEndpointTLS", - "type": "string" - }], - "Test Focus": "XDR Receive", - "Data Flow in Direct": "HISP receives an incorrect XDR message from the Edge", - "Metadata Included": "Limited Metadata", - "Direct Address Block": "Included", - "SUT: Sender/ Receiver": "Receiver (HISP - SUT)", - "Test Tool: Sender / Receiver": "Sender (Test Tool)", - "Purpose/Description": "Verify that the HISP system throws an error when an incorrect message is received.", - "Conformance Test Details": "Create an incorrect message with invalid SOAP envelope details", - "Expected Test Results": "HISP should validate the messages per the specification and reject the bad messages", - "Required / Conditional per Direct Edge Protocol Guide ": "R", - "Direct Edge Protocol Guide 1.1 RTM Reference ": 1.1, - "Test Data IDs ": null -}, { - "name": "XDR Test 15b", - "id": "15b", - "ID": "15b", - "desc": "Verify the ability of the receiving system to appropriately respond to a malformed message. This test is for an invalid SOAP body.", - "sutEdge": false, - "criteria":"['h2-7']", - "sutHisp": true, - "sutRole": "receiver", - "inputs": [{ - "name": "Endpoint", - "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages", - "key": "targetEndpointTLS", - "type": "string" - }], - "Test Focus": "XDR Receive", - "Data Flow in Direct": "HISP receives an incorrect XDR message from the Edge", - "Metadata Included": "Limited Metadata", - "Direct Address Block": "Included", - "SUT: Sender/ Receiver": "Receiver (HISP - SUT)", - "Test Tool: Sender / Receiver": "Sender (Test Tool)", - "Purpose/Description": "Verify that the HISP system throws an error when an incorrect message is received.", - "Conformance Test Details": "Create an incorrect message with invalid SOAP body details", - "Expected Test Results": "HISP should validate the messages per the specification and reject the bad messages", - "Required / Conditional per Direct Edge Protocol Guide ": "R", - "Direct Edge Protocol Guide 1.1 RTM Reference ": 1.1, - "Test Data IDs ": null -}, { - "name": "XDR MT Test 15", - "id": "34mu2", - "ID": "34mu2", - "desc": "Verify the ability of the SUT to appropriately respond to a delivery to a HISP which does not have a published certificate. ETT will send a message via XDR to the SUT. If the SUT's final response is delivered synchronously, that message will be saved in the logs (click 'Logs'). If the SUT's final response is delivered asynchronously: 1) wait until the SUT's message has been sent and the ETT's response has been received, 2) click the Pending Refresh button to continue, 3) the logs for the asynchronous communication will then be available. The proctor will read the logs for the synchronous communication or the asynchronous communication for an appropriate response. This test is part of the Message Tracking Using Processed MDN test suite.", - "sutEdge": false, - "sutHisp": true, - "sutRole": "receiver", - "criteria":"['h2-3','sc2-3']", - "status": "configure", - "inputs": [{ - "name": "Endpoint", - "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages.", - "key": "targetEndpointTLS", - "type": "string" - }, { - "name": "Direct From Address", - "hoverlabel":"SUT (HISP) outgoing SMTP address.", - "key": "direct_from", - "type": "string" - }, { - "name": "Outgoing (ETT --> SUT) Direct From Address", - "key": "outgoing_from", - "type": "string" - }], - "Test Focus": "XDR Receive", - "Data Flow in Direct": "HISP receives an XDR message from the Edge", - "Metadata Included": "N/A", - "Direct Address Block": "Included", - "SUT: Sender/ Receiver": "Receiver (HISP - SUT)", - "Test Tool: Sender / Receiver": "Sender (Test Tool)", - "Purpose/Description": "Verify the ability of the SUT to appropriately respond to a delivery to a HISP which does not have a published certificate. \n Note: When the SUT (HISP) receives the MDN (from the 'direct:to' and hence RCPT TO from the Direct communication), the MAIL FROM of the MDN will be 'direct:to' - since the 'direct:to' endpoint is sending the MAIL FROM. The ETT hardcodes 'direct:to' based on the test case, normally is not needed. \n Outgoing (ETT --> SUT) Direct From Address:Note: MDN Direct from address in the 'direct:from' address the XDR MDN. ETT will use in creating the SOAP XDR transaction for this test. In turn this is destined to become the SMTP MAIL FROM for the ensuing Direct Communication between the SUT HISP to the ETT HISP (the 'direct:to' becomes the RCPT TO).", - "Conformance Test Details": "Create and send a valid XDR message, with a valid destination with an unpublished certificate", - "Expected Test Results": "The SUT will respond with a message that conforms to section 1.5.2.1.1 of the Direct Edge Protocol Implementation Guide 1.1", - "Required / Conditional per Direct Edge Protocol Guide": "R", - "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, - "Test Data IDs": null -}, { - "name": "XDR Test 16", - "id": 16, - "ID": "16", - "desc": "Verify that Mutual TLS session is established between the Sender and the Receiver before transimitting data.", - "sutEdge": false, - "criteria":"['h2-3','sc2-3']", - "sutHisp": true, - "sutRole": "sender", - "inputs": [{ - "name": "Direct From Address", - "hoverlabel":"Direct From Address: SUT (HISP) outgoing SMTP address (or) MDN.", - "key": "direct_from", - "type": "string" - }], - "Test Focus": "Authentication", - "Data Flow in Direct": "HISP uses Mutual TLS to authenticate to the Edge", - "Metadata Included": "N/A", - "Direct Address Block": "N/A", - "SUT: Sender/ Receiver": "Client (HISP - SUT)", - "Test Tool: Sender / Receiver": "Server (Test Tool)", - "Purpose/Description": "Verify that Mutual TLS session is established between the Sender and the Receiver before transimitting data.", - "Conformance Test Details": "Require Mutual TLS in the configuration", - "Expected Test Results": "HISP should initiate a connection to the Edge using Mutual TLS correctly.", - "Required / Conditional per Direct Edge Protocol Guide": "R", - "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, - "Test Data IDs": null -}, { - "name": "XDR MT Test 16", - "id": "35mu2", - "ID": "35mu2", - "desc": "Verify the ability of the SUT to appropriately respond in the event of a lack of a Processed MDN. ETT will send a message via XDR to the SUT. If the SUT's final response is delivered synchronously, that message will be saved in the logs (click 'Logs'). If the SUT's final response is delivered asynchronously: 1) wait until the SUT's message has been sent and the ETT's response has been received, 2) click the Pending Refresh button to continue, 3) the logs for the asynchronous communication will then be available. The proctor will read the logs for the synchronous communication or the asynchronous communication for an appropriate response. This test is part of the Message Tracking Using Processed MDN test suite.", - "sutEdge": false, - "sutHisp": true, - "sutRole": "receiver", - "criteria":"['h2-3']", - "status": "configure", - "inputs": [{ - "name": "Endpoint", - "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages.", - "key": "targetEndpointTLS", - "type": "string" - }, { - "name": "Direct From Address", - "hoverlabel":"SUT (HISP) outgoing SMTP address.", - "key": "direct_from", - "type": "string" - }, { - "name": "Outgoing (ETT --> SUT) Direct From Address", - "key": "outgoing_from", - "type": "string" - }], - "Test Focus": "XDR Receive", - "Data Flow in Direct": "HISP receives an XDR message from the Edge", - "Metadata Included": "N/A", - "Direct Address Block": "Included", - "SUT: Sender/ Receiver": "Receiver (HISP - SUT)", - "Test Tool: Sender / Receiver": "Sender (Test Tool)", - "Purpose/Description": "Verify the ability of the SUT to appropriately respond to a delivery to a HISP due to an extended wait period using an XDR profile. \n Note: When the SUT (HISP) receives the MDN (from the 'direct:to' and hence RCPT TO from the Direct communication), the MAIL FROM of the MDN will be 'direct:to' - since the 'direct:to' endpoint is sending the MAIL FROM. The ETT hardcodes 'direct:to' based on the test case, normally is not needed. \n Outgoing (ETT --> SUT) Direct From Address:Note: MDN Direct from address in the 'direct:from' address the XDR MDN. ETT will use in creating the SOAP XDR transaction for this test. In turn this is destined to become the SMTP MAIL FROM for the ensuing Direct Communication between the SUT HISP to the ETT HISP (the 'direct:to' becomes the RCPT TO).", - "Conformance Test Details": "Create and send a valid XDR message, with a valid destination with an extended wait period, time-out scenario, failure message.", - "Expected Test Results": "The SUT will respond with a message that conforms to section 1.5.2.1.1 of the Direct Edge Protocol Implementation Guide 1.1", - "Required / Conditional per Direct Edge Protocol Guide": "R", - "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, - "Test Data IDs": null -}, { - "name": "XDR Test 17", - "id": 17, - "ID": "17", - "desc": "Verify that HISP disconnects when the Server provided certificate is invalid. Only the IP address of the SUT shall be entered below. As this is a socket based test, the full endpoint is not required. Only the IP Address and port are needed and provided.", - "sutEdge": false, - "sutHisp": true, - "sutRole": "sender", - "criteria":"['h2-3']", - "inputs": [{ - "name": "IP Address", - "hoverlabel":"IP Address (eg: 202.255.24.62)", - "key": "ip_address", - "type": "string" - }], - "Test Focus": "Authentication", - "Data Flow in Direct": "HISP uses Mutual TLS to authenticate to the Edge exception case", - "Metadata Included": "N/A", - "Direct Address Block": "N/A", - "SUT: Sender/ Receiver": "Client (HISP - SUT)", - "Test Tool: Sender / Receiver": "Server (Test Tool)", - "Purpose/Description": "Verify that HISP disconnects when the Server provided certificate is invalid.", - "Conformance Test Details": "Incorrect Mutual TLS configuration should not proceed.", - "Expected Test Results": "HISP should disconnect when the certificate from the edge is bad.", - "Required / Conditional per Direct Edge Protocol Guide": "R", - "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, - "Test Data IDs": null -}, { - "name": "XDR Test 18", - "id": 18, - "ID": "18", - "desc": "Test Tool authenticates with the HISP using Mutual TLS correctly. Certificates for this testing tool can be downloaded from the top of this page. This is a socket-level test, the full endpoint is not required. Enter only the IP Address and port below.", - "sutEdge": false, - "criteria":"['h2-7']", - "sutHisp": true, - "sutRole": "receiver", - "inputs": [{ - "name": "IP Address", - "hoverlabel":"IP Address (eg: 202.255.24.62)", - "key": "ip_address", - "type": "string" - }, { - "name": "Port", - "key": "port", - "type": "string" - }], - "Test Focus": "Authentication", - "Data Flow in Direct": "Edge authenticates to the HISP using Mutual TLS", - "Metadata Included": "N/A", - "Direct Address Block": "N/A", - "SUT: Sender/ Receiver": "Server (HISP - SUT)", - "Test Tool: Sender / Receiver": "Client (Test Tool)", - "Purpose/Description": "Test Tool authenticates with the HISP using Mutual TLS correctly", - "Conformance Test Details": "Require Mutual TLS in the configuration in the Edge system", - "Expected Test Results": "HISP should accept a connection from the Edge for Mutual TLS correctly.", - "Required / Conditional per Direct Edge Protocol Guide": "R", - "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, - "Test Data IDs": null -}, { - "name": "XDR Test 19", - "id": 19, - "ID": "19", - "desc": "Test Tool authenticates with the HISP using bad certificates. The SUT is expected to disconnect before any meaningful data is sent. Certificates for this testing tool can be downloaded from the top of this page. This is a socket-level test, the full endpoint is not required. Enter only the IP Address and port below.", - "sutEdge": false, - "sutHisp": true, - "criteria":"['h2-7']", - "sutRole": "receiver", - "inputs": [{ - "name": "IP Address", - "hoverlabel":"IP Address (eg: 202.255.24.62)", - "key": "ip_address", - "type": "string" - }, { - "name": "Port", - "key": "port", - "type": "string" - }], - "Test Focus": "Authentication", - "Data Flow in Direct": "Edge authenticates to the HISP using Mutual TLS exception case", - "Metadata Included": "N/A", - "Direct Address Block": "N/A", - "SUT: Sender/ Receiver": "Server (HISP - SUT)", - "Test Tool: Sender / Receiver": "Client (Test Tool)", - "Purpose/Description": "Test Tool authenticates with the HISP using bad certificates", - "Conformance Test Details": "Incorrect Mutual TLS configuration should not proceed.", - "Expected Test Results": "HISP should disconnect when the certificate from the edge is bad.", - "Required / Conditional per Direct Edge Protocol Guide": "R", - "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, - "Test Data IDs": null -}, { - "name": "XDR MT Test 19", - "id": "19mu2", - "ID": "19mu2", - "desc": "Verifies the ability of the sending system to send messages with unique message-IDs. Hit 'RUN' and then the sending system will send three messages with unique identifiers to the endpoint provided. When all three messages have been completely sent, press the 'Pending Refresh' button.", - "sutEdge": true, - "sutHisp": false, - "sutRole": "sender", - "inputs": [{ - "name": "Direct From Address", - "hoverlabel":"Direct From Address: SUT (HISP) outgoing SMTP address (or) MDN.", - "key": "direct_from", - "type": "string" - }], - "Test Focus": "", - "Data Flow in Direct": "", - "Metadata Included": "N/A", - "Direct Address Block": "N/A", - "SUT: Sender/ Receiver": "Sender (Edge - SUT)", - "Test Tool: Sender / Receiver": "", - "Purpose/Description": "Test to validate that the Edge system is able to create messages with unique message id for XDR profile.", - "Conformance Test Details": "", - "Expected Test Results": "Edge system creates each message with a unique message id with no duplicates.", - "Required / Conditional per Direct Edge Protocol Guide": "R", - "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, - "Test Data IDs": null -}, { - "name": "XDR MT Test 20a", - "id": "20amu2", - "ID": "20mu2", - "desc": "Verifies the ability of the sending system to initiate an XDR transaction to ETT and to receive a positive (success) delivery status notification. The test lab will inspect the SUT logs and system to verify that the response was handled appropriately.", - "sutEdge": true, - "sutHisp": false, - "sutRole": "sender", - "criteria":"['b1-1','su1-1']", - "status": "configure", - "inputs": [{ - "name": "Direct From Address", - "hoverlabel":"Direct From Address: SUT (HISP) outgoing SMTP address (or) MDN.", - "key": "direct_from", - "type": "string" - }, { - "name": "Endpoint", - "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages", - "key": "targetEndpointTLS", - "type": "string" - }], - "expectedMDN": true, - "Test Focus": "", - "Data Flow in Direct": "", - "Metadata Included": "N/A", - "Direct Address Block": "N/A", - "SUT: Sender/ Receiver": "Sender (Edge - SUT)", - "Test Tool: Sender / Receiver": "", - "Purpose/Description": "The SUT should send the test message to Testcase20a@ttpedge.sitenv.org. This is a preconfigured address and designed to accommodate the variety of Systems that are testing with minimal user input. The users will see a message from the ETT to allow easy recognition.", - "Conformance Test Details": "", - "Expected Test Results": "Edge system receives and processes a positive (success) delivery status notification.", - "Required / Conditional per Direct Edge Protocol Guide": "R", - "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, - "Test Data IDs": null -}, { - "name": "XDR MT Test 20b", - "id": "20bmu2", - "ID": "20bmu2", - "desc": "Verifies the ability of the sending system to initiate an XDR transaction to ETT and to receive negative (failure) delivery status notification. The test lab will inspect the SUT logs and system to verify that the response was handled appropriately.", - "sutEdge": true, - "sutHisp": false, - "sutRole": "sender", - "criteria":"['b1-1','su1-1']", - "status": "configure", - "inputs": [{ - "name": "Direct From Address", - "hoverlabel":"Direct From Address: SUT (HISP) outgoing SMTP address (or) MDN.", - "key": "direct_from", - "type": "string" - }, { - "name": "Endpoint", - "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages", - "key": "targetEndpointTLS", - "type": "string" - }], - "expectedMDN": true, - "Test Focus": "", - "Data Flow in Direct": "", - "Metadata Included": "N/A", - "Direct Address Block": "N/A", - "SUT: Sender/ Receiver": "Sender (Edge - SUT)", - "Test Tool: Sender / Receiver": "", - "Purpose/Description": "The SUT should send the test message to Testcase20b@ttpedge.sitenv.org. This is a preconfigured address and designed to accommodate the variety of Systems that are testing with minimal user input. The users will see a message from the ETT to allow easy recognition.", - "Conformance Test Details": "", - "Expected Test Results": "Edge system receives and processes a negative (failure) delivery status notification..", - "Required / Conditional per Direct Edge Protocol Guide": "R", - "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, - "Test Data IDs": null -}, { - "name": "XDR MT Test 30", - "id": "30mu2", - "ID": "30mu2", - "desc": "Verify the ability of the receiving system to appropriately handle a VALID delivery notifications request, including X-DIRECT-FINAL-DESTINATION-DELIVERY data. ETT will create the Direct address block Header following section 4.1 of the XDR and XDM for Direct Messaging v1.0 and include the X-DIRECT-FINAL-DESTINATION-DELIVERY data following section 1.3 of Implementation Guide for Delivery Notification in Direct v1.0 and send it to the SUT.", - "sutEdge": false, - "criteria":"['h2-11','sc2-11']", - "sutHisp": true, - "sutRole": "receiver", - "inputs": [{ - "name": "Endpoint", - "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages.", - "key": "targetEndpointTLS", - "type": "string" - }, { - "name": "Direct To Address", - "hoverlabel":"SUT (HISP) outgoing SMTP address.", - "key": "direct_to", - "type": "string" - }, { - "name": "Outgoing (ETT --> SUT) Direct From Address", - "key": "outgoing_from", - "type": "string" - }], - "Test Focus": "XDR Receive", - "Data Flow in Direct": "HISP receives an XDR message from the Edge", - "Metadata Included": "N/A", - "Direct Address Block": "Included", - "SUT: Sender/ Receiver": "Receiver (HISP - SUT)", - "Test Tool: Sender / Receiver": "Sender (Test Tool)", - "Purpose/Description": "The Health IT Module is able to successfully process a valid message from the ETT. \n Note: When the SUT (HISP) receives the MDN (from the 'direct:to' and hence RCPT TO from the Direct communication), the MAIL FROM of the MDN will be 'direct:to' - since the 'direct:to' endpoint is sending the MAIL FROM. The ETT hardcodes 'direct:to' based on the test case, normally is not needed. \n Outgoing (ETT --> SUT) Direct From Address:Note: MDN Direct from address in the 'direct:from' address the XDR MDN. ETT will use in creating the SOAP XDR transaction for this test. In turn this is destined to become the SMTP MAIL FROM for the ensuing Direct Communication between the SUT HISP to the ETT HISP (the 'direct:to' becomes the RCPT TO).", - "Conformance Test Details": "HISP should appropriately handle a VALID delivery notification request, including X-DIRECT-FINAL-DESTINATION-DELIVERY data.", - "Expected Test Results": "The Health IT Module is able to successfully process a message from the ETT (as Sending Edge)", - "Required / Conditional per Direct Edge Protocol Guide": "R", - "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, - "Test Data IDs": null -}, { - "name": "XDR MT Test 31", - "id": "31mu2", - "ID": "31mu2", - "desc": "Verify the ability of the receiving system to appropriately handle an INVALID delivery notifications request, including X-DIRECT-FINAL-DESTINATION-DELIVERY data. ETT will create the Direct address block Header following section 4.1 of the XDR and XDM for Direct Messaging v1.0 and include INVALID X-DIRECT-FINAL-DESTINATION-DELIVERY data following section 1.3 of Implementation Guide for Delivery Notification in Direct v1.0 and send it to the SUT.", - "sutEdge": false, - "criteria":"['h2-11','sc2-11']", - "sutHisp": true, - "sutRole": "receiver", - "inputs": [{ - "name": "Endpoint", - "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages.", - "key": "targetEndpointTLS", - "type": "string" - }, { - "name": "Outgoing (ETT --> SUT) Direct From Address", - "hoverlabel":"SUT (HISP) outgoing SMTP address.", - "key": "outgoing_from", - "type": "string" - }], - "Test Focus": "XDR Receive", - "Data Flow in Direct": "HISP receives an XDR message from the Edge", - "Metadata Included": "N/A", - "Direct Address Block": "Included", - "SUT: Sender/ Receiver": "Receiver (HISP - SUT)", - "Test Tool: Sender / Receiver": "Sender (Test Tool)", - "Purpose/Description": "The Health IT Module is able to successfully process an invalid message from the ETT, message contains a valid address block and invalid destination.\nNote: When the SUT (HISP) receives the MDN (from the 'direct:to' and hence RCPT TO from the Direct communication), the MAIL FROM of the MDN will be 'direct:to' - since the 'direct:to' endpoint is sending the MAIL FROM. The ETT hardcodes 'direct:to' based on the test case, normally is not needed.", - "Conformance Test Details": "HISP should appropriately handle an INVALID delivery notification request, including X-DIRECT-FINAL-DESTINATION-DELIVERY data.", - "Expected Test Results": "The Health IT Module is able to process the header handle an invalid delivery notification request", - "Required / Conditional per Direct Edge Protocol Guide": "R", - "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, - "Test Data IDs": null -}, { - "name": "XDR MT Test 32", - "id": "32mu2", - "ID": "32mu2", - "desc": "Verify the ability of the SUT to appropriately respond to a delivery to a non-existent address. ETT will send a message via XDR to the SUT. If the SUT's final response is delivered synchronously, that message will be saved in the logs (click 'Logs'). If the SUT's final response is delivered asynchronously: 1) wait until the SUT's message has been sent and the ETT's response has been received, 2) click the Pending Refresh button to continue, 3) the logs for the asynchronous communication will then be available. The proctor will read the logs for the synchronous communication or the asynchronous communication for an appropriate response. This test is part of the Implementation Guide for Delivery Notification test suite.", - "sutEdge": false, - "criteria":"['h2-11']", - "sutHisp": true, - "sutRole": "receiver", - "status": "configure", - "inputs": [{ - "name": "Endpoint", - "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages.", - "key": "targetEndpointTLS", - "type": "string" - }, { - "name": "Direct From Address", - "hoverlabel":"SUT (HISP) outgoing SMTP address.", - "key": "direct_from", - "type": "string" - }, { - "name": "Outgoing (ETT --> SUT) Direct From Address", - "key": "outgoing_from", - "type": "string" - }], - "Test Focus": "XDR Receive", - "Data Flow in Direct": "HISP receives an XDR message from the Edge", - "Metadata Included": "N/A", - "Direct Address Block": "Included", - "SUT: Sender/ Receiver": "Receiver (HISP - SUT)", - "Test Tool: Sender / Receiver": "Sender (Test Tool)", - "Purpose/Description": "The Health IT Module is able to successfully process a message from the ETT (as Sending Edge) that includes an invalid (non-existent) address. \n Note: When the SUT (HISP) receives the MDN (from the 'direct:to' and hence RCPT TO from the Direct communication), the MAIL FROM of the MDN will be 'direct:to' - since the 'direct:to' endpoint is sending the MAIL FROM. The ETT hardcodes 'direct:to' based on the test case, normally is not needed. \n Outgoing (ETT --> SUT) Direct From Address:Note: MDN Direct from address in the 'direct:from' address the XDR MDN. ETT will use in creating the SOAP XDR transaction for this test. In turn this is destined to become the SMTP MAIL FROM for the ensuing Direct Communication between the SUT HISP to the ETT HISP (the 'direct:to' becomes the RCPT TO).", - "Conformance Test Details": "HISP should appropriately handle an INVALID address and send the negative delivery notification back to the EDGE.", - "Expected Test Results": "The Health IT Module sends a negative delivery status notification message to the ETT (as Sending Edge) using XDR profile", - "Required / Conditional per Direct Edge Protocol Guide": "R", - "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, - "Test Data IDs": null -}, { - "name": "XDR MT Test 33", - "id": "33mu2", - "ID": "33mu2", - "desc": "Verify the ability of the SUT to appropriately respond to a delivery to an untrusted HISP. ETT will send a message via XDR to the SUT. If the SUT's final response is delivered synchronously, that message will be saved in the logs (click 'Logs'). If the SUT's final response is delivered asynchronously: 1) wait until the SUT's message has been sent and the ETT's response has been received, 2) click the Pending Refresh button to continue, 3) the logs for the asynchronous communication will then be available. The proctor will read the logs for the synchronous communication or the asynchronous communication for an appropriate response. This test is part of the Implementation Guide for Delivery Notification test suite.", - "sutEdge": false, - "criteria":"['h2-11']", - "sutHisp": true, - "sutRole": "receiver", - "status": "configure", - "inputs": [{ - "name": "Endpoint", - "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages.", - "key": "targetEndpointTLS", - "type": "string" - }, { - "name": "Direct From Address", - "hoverlabel":"SUT (HISP) outgoing SMTP address.", - "key": "direct_from", - "type": "string" - }, { - "name": "Outgoing (ETT --> SUT) Direct From Address", - "key": "outgoing_from", - "type": "string" - }], - "Test Focus": "XDR Receive", - "Data Flow in Direct": "HISP receives an XDR message from the Edge", - "Metadata Included": "N/A", - "Direct Address Block": "Included", - "SUT: Sender/ Receiver": "Receiver (HISP - SUT)", - "Test Tool: Sender / Receiver": "Sender (Test Tool)", - "Purpose/Description": "The Health IT Module is able to successfully process a message from the ETT (as Sending Edge) to a valid address. The ETT (as Destination HISP) is not trusted. \n Note: When the SUT (HISP) receives the MDN (from the 'direct:to' and hence RCPT TO from the Direct communication), the MAIL FROM of the MDN will be 'direct:to' - since the 'direct:to' endpoint is sending the MAIL FROM. The ETT hardcodes 'direct:to' based on the test case, normally is not needed. \n Outgoing (ETT --> SUT) Direct From Address:Note: MDN Direct from address in the 'direct:from' address the XDR MDN. ETT will use in creating the SOAP XDR transaction for this test. In turn this is destined to become the SMTP MAIL FROM for the ensuing Direct Communication between the SUT HISP to the ETT HISP (the 'direct:to' becomes the RCPT TO).", - "Conformance Test Details": "XDR Message Checklist + XDS Metadata Checklist for Limited Metadata Document Source + Direct XDR Checklist", - "Expected Test Results": "The Health IT Module sends a negative delivery status notification message to the ETT (as Sending Edge) using XDR profile", - "Required / Conditional per Direct Edge Protocol Guide": "R", - "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, - "Test Data IDs": null -}, { - "name": "XDR MT Test 34", - "id": "34mu2", - "ID": "34mu2", - "desc": "Verify the ability of the SUT to appropriately respond to a delivery to a HISP which does not have a published certificate. ETT will send a message via XDR to the SUT. If the SUT's final response is delivered synchronously, that message will be saved in the logs (click 'Logs'). If the SUT's final response is delivered asynchronously: 1) wait until the SUT's message has been sent and the ETT's response has been received, 2) click the Pending Refresh button to continue, 3) the logs for the asynchronous communication will then be available. The proctor will read the logs for the synchronous communication or the asynchronous communication for an appropriate response. This test is part of the Implementation Guide for Delivery Notification test suite.", - "sutEdge": false, - "criteria":"['h2-11']", - "sutHisp": true, - "sutRole": "receiver", - "status": "configure", - "inputs": [{ - "name": "Endpoint", - "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages.", - "key": "targetEndpointTLS", - "type": "string" - }, { - "name": "Direct From Address", - "hoverlabel":"SUT (HISP) outgoing SMTP address.", - "key": "direct_from", - "type": "string" - }, { - "name": "Outgoing (ETT --> SUT) Direct From Address", - "key": "outgoing_from", - "type": "string" - }], - "Test Focus": "XDR Receive", - "Data Flow in Direct": "HISP receives an XDR message from the Edge", - "Metadata Included": "N/A", - "Direct Address Block": "Included", - "SUT: Sender/ Receiver": "Receiver (HISP - SUT)", - "Test Tool: Sender / Receiver": "Sender (Test Tool)", - "Purpose/Description": "The Health IT Module is able to successfully process a message from the ETT (as Sending Edge) to a valid address. The ETT (as Destination HISP) does not have published certificates, and security and trust processing fails. \n Note: When the SUT (HISP) receives the MDN (from the 'direct:to' and hence RCPT TO from the Direct communication), the MAIL FROM of the MDN will be 'direct:to' - since the 'direct:to' endpoint is sending the MAIL FROM. The ETT hardcodes 'direct:to' based on the test case, normally is not needed. \n Outgoing (ETT --> SUT) Direct From Address:Note: MDN Direct from address in the 'direct:from' address the XDR MDN. ETT will use in creating the SOAP XDR transaction for this test. In turn this is destined to become the SMTP MAIL FROM for the ensuing Direct Communication between the SUT HISP to the ETT HISP (the 'direct:to' becomes the RCPT TO).", - "Conformance Test Details": "The HISP sends a negative delivery status notification message back to the EDGE.", - "Expected Test Results": "The Health IT Module sends a negative delivery status notification message to the ETT (as Sending Edge) using XDR profile", - "Required / Conditional per Direct Edge Protocol Guide": "R", - "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, - "Test Data IDs": null -}, { - "name": "XDR MT Test 35", - "id": "35mu2", - "ID": "35mu2", - "desc": "Verify the ability of the SUT to appropriately respond in the event of a lack of a Processed MDN. ETT will send a message via XDR to the SUT. If the SUT's final response is delivered synchronously, that message will be saved in the logs (click 'Logs'). If the SUT's final response is delivered asynchronously: 1) wait until the SUT's message has been sent and the ETT's response has been received, 2) click the Pending Refresh button to continue, 3) the logs for the asynchronous communication will then be available. The proctor will read the logs for the synchronous communication or the asynchronous communication for an appropriate response. This test is part of the Implementation Guide for Delivery Notification test suite.", - "sutEdge": false, - "criteria":"['h2-11']", - "sutHisp": true, - "sutRole": "receiver", - "status": "configure", - "inputs": [{ - "name": "Endpoint", - "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages.", - "key": "targetEndpointTLS", - "type": "string" - }, { - "name": "Direct From Address", - "hoverlabel":"SUT (HISP) outgoing SMTP address.", - "key": "direct_from", - "type": "string" - }, { - "name": "Outgoing (ETT --> SUT) Direct From Address", - "key": "outgoing_from", - "type": "string" - }], - "Test Focus": "XDR Receive", - "Data Flow in Direct": "HISP receives an XDR message from the Edge", - "Metadata Included": "N/A", - "Direct Address Block": "Included", - "SUT: Sender/ Receiver": "Receiver (HISP - SUT)", - "Test Tool: Sender / Receiver": "Sender (Test Tool)", - "Purpose/Description": "The Health IT Module is able to successfully process a message from the ETT (as Sending Edge) to a valid address. The ETT (as Destination HISP) does not respond with a Processed MDN. \n Note: When the SUT (HISP) receives the MDN (from the 'direct:to' and hence RCPT TO from the Direct communication), the MAIL FROM of the MDN will be 'direct:to' - since the 'direct:to' endpoint is sending the MAIL FROM. The ETT hardcodes 'direct:to' based on the test case, normally is not needed. \n Outgoing (ETT --> SUT) Direct From Address:Note: MDN Direct from address in the 'direct:from' address the XDR MDN. ETT will use in creating the SOAP XDR transaction for this test. In turn this is destined to become the SMTP MAIL FROM for the ensuing Direct Communication between the SUT HISP to the ETT HISP (the 'direct:to' becomes the RCPT TO).", - "Conformance Test Details": "The HISP sends a negative delivery status notification message back to the EDGE.", - "Expected Test Results": "The Health IT Module sends a negative delivery status notification message to the ETT (as Sending Edge) using XDR profile", - "Required / Conditional per Direct Edge Protocol Guide": "R", - "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, - "Test Data IDs": null -}, { - "name": "XDR MT Test 36", - "id": "36mu2", - "ID": "36mu2", - "desc": "Verify the ability of the SUT to appropriately respond in the event of a lack of a Dispatched MDN. ETT will send a message via XDR to the SUT. If the SUT's final response is delivered synchronously, that message will be saved in the logs (click 'Logs'). If the SUT's final response is delivered asynchronously: 1) wait until the SUT's message has been sent and the ETT's response has been received, 2) click the Pending Refresh button to continue, 3) the logs for the asynchronous communication will then be available. The proctor will read the logs for the synchronous communication or the asynchronous communication for an appropriate response. This test is part of the Implementation Guide for Delivery Notification test suite.", - "sutEdge": false, - "criteria":"['h2-11']", - "sutHisp": true, - "sutRole": "receiver", - "status": "configure", - "inputs": [{ - "name": "Endpoint", - "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages.", - "key": "targetEndpointTLS", - "type": "string" - }, { - "name": "Direct From Address", - "hoverlabel":"SUT (HISP) outgoing SMTP address.", - "key": "direct_from", - "type": "string" - }, { - "name": "Outgoing (ETT --> SUT) Direct From Address", - "key": "outgoing_from", - "type": "string" - }], - "Test Focus": "XDR Receive", - "Data Flow in Direct": "HISP receives an XDR message from the Edge", - "Metadata Included": "N/A", - "Direct Address Block": "Included", - "SUT: Sender/ Receiver": "Receiver (HISP - SUT)", - "Test Tool: Sender / Receiver": "Sender (Test Tool)", - "Purpose/Description": "The Health IT Module is able to successfully process a message from the ETT (as Sending Edge) to a valid address. The ETT (as Destination HISP) responds with a Processed MDN, but no Dispatched MDN. \n Note: When the SUT (HISP) receives the MDN (from the 'direct:to' and hence RCPT TO from the Direct communication), the MAIL FROM of the MDN will be 'direct:to' - since the 'direct:to' endpoint is sending the MAIL FROM. The ETT hardcodes 'direct:to' based on the test case, normally is not needed. \n Outgoing (ETT --> SUT) Direct From Address:Note: MDN Direct from address in the 'direct:from' address the XDR MDN. ETT will use in creating the SOAP XDR transaction for this test. In turn this is destined to become the SMTP MAIL FROM for the ensuing Direct Communication between the SUT HISP to the ETT HISP (the 'direct:to' becomes the RCPT TO).", - "Conformance Test Details": "The HISP sends a negative delivery status notification message back to the EDGE.", - "Expected Test Results": "The Health IT Module sends a negative delivery status notification message to the ETT (as Sending Edge) using XDR profile", - "Required / Conditional per Direct Edge Protocol Guide": "R", - "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, - "Test Data IDs": null -}, { - "name": "XDR MT Test 37", - "id": "37mu2", - "ID": "37mu2", - "desc": "Verify the ability of the SUT to appropriately respond in the event of a message timeout failure. ETT will send a message via XDR to the SUT. If the SUT's final response is delivered synchronously, that message will be saved in the logs (click 'Logs'). If the SUT's final response is delivered asynchronously: 1) wait until the SUT's message has been sent and the ETT's response has been received, 2) click the Pending Refresh button to continue, 3) the logs for the asynchronous communication will then be available. The proctor will read the logs for the synchronous communication or the asynchronous communication for an appropriate response. This test is part of the Implementation Guide for Delivery Notification test suite.", - "sutEdge": false, - "criteria":"['h2-11']", - "sutHisp": true, - "status": "configure", - "sutRole": "receiver", - "inputs": [{ - "name": "Endpoint", - "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages.", - "key": "targetEndpointTLS", - "type": "string" - }, { - "name": "Direct From Address", - "hoverlabel":"SUT (HISP) outgoing SMTP address.", - "key": "direct_from", - "type": "string" - }, { - "name": "Outgoing (ETT --> SUT) Direct From Address", - "key": "outgoing_from", - "type": "string" - }], - "Test Focus": "XDR Receive", - "Data Flow in Direct": "HISP receives an XDR message from the Edge", - "Metadata Included": "N/A", - "Direct Address Block": "Included", - "SUT: Sender/ Receiver": "Receiver (HISP - SUT)", - "Test Tool: Sender / Receiver": "Sender (Test Tool)", - "Purpose/Description": "The Health IT Module is able to successfully process a message from the ETT (as Sending Edge) to a valid address. The ETT (as Destination HISP) responds with a Processed MDN, but the Dispatched MDN is received after the expected wait time has exceeded. \n Note: When the SUT (HISP) receives the MDN (from the 'direct:to' and hence RCPT TO from the Direct communication), the MAIL FROM of the MDN will be 'direct:to' - since the 'direct:to' endpoint is sending the MAIL FROM. The ETT hardcodes 'direct:to' based on the test case, normally is not needed. \n Outgoing (ETT --> SUT) Direct From Address:Note: MDN Direct from address in the 'direct:from' address the XDR MDN. ETT will use in creating the SOAP XDR transaction for this test. In turn this is destined to become the SMTP MAIL FROM for the ensuing Direct Communication between the SUT HISP to the ETT HISP (the 'direct:to' becomes the RCPT TO).", - "Conformance Test Details": "The HISP sends a negative delivery status notification message back to the EDGE.", - "Expected Test Results": "The Health IT Module sends a negative delivery status notification message to the ETT (as Sending Edge) using XDR profile", - "Required / Conditional per Direct Edge Protocol Guide": "R", - "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, - "Test Data IDs": null -}, { - "name": "XDR MT Test 38", - "id": "38mu2", - "ID": "38mu2", - "desc": "Verify the ability of the SUT to appropriately respond in the event of positive delivery notification. ETT will send a message via XDR to the SUT. If the SUT's final response is delivered synchronously, that message will be saved in the logs (click 'Logs'). If the SUT's final response is delivered asynchronously: 1) wait until the SUT's message has been sent and the ETT's response has been received, 2) click the Pending Refresh button to continue, 3) the logs for the asynchronous communication will then be available. The proctor will read the logs for the synchronous communication or the asynchronous communication for an appropriate response. This test is part of the Implementation Guide for Delivery Notification test suite.", - "sutEdge": false, - "criteria":"['h2-11']", - "sutHisp": true, - "sutRole": "receiver", - "status": "configure", - "inputs": [{ - "name": "Endpoint", - "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages.", - "key": "targetEndpointTLS", - "type": "string" - }, { - "name": "Direct From Address", - "hoverlabel":"SUT (HISP) outgoing SMTP address.", - "key": "direct_from", - "type": "string" - }, { - "name": "Outgoing (ETT --> SUT) Direct From Address", - "key": "outgoing_from", - "type": "string" - }], - "Test Focus": "XDR Receive", - "Data Flow in Direct": "HISP receives an XDR message from the Edge", - "Metadata Included": "N/A", - "Direct Address Block": "Included", - "SUT: Sender/ Receiver": "Receiver (HISP - SUT)", - "Test Tool: Sender / Receiver": "Sender (Test Tool)", - "Purpose/Description": "The Health IT Module is able to successfully process a message from the ETT (as Sending Edge) to a valid address. The ETT (as Destination HISP) responds with a Processed MDN and Dispatched MDN within the expected time period. \n Note: When the SUT (HISP) receives the MDN (from the 'direct:to' and hence RCPT TO from the Direct communication), the MAIL FROM of the MDN will be 'direct:to' - since the 'direct:to' endpoint is sending the MAIL FROM. The ETT hardcodes 'direct:to' based on the test case, normally is not needed. \n Outgoing (ETT --> SUT) Direct From Address:Note: MDN Direct from address in the 'direct:from' address the XDR MDN. ETT will use in creating the SOAP XDR transaction for this test. In turn this is destined to become the SMTP MAIL FROM for the ensuing Direct Communication between the SUT HISP to the ETT HISP (the 'direct:to' becomes the RCPT TO).", - "Conformance Test Details": "The HISP sends only one positive delivery status notification message back to the EDGE.", - "Expected Test Results": "The Health IT Module sends a positive delivery status notification message to the ETT (as Sending Edge) using XDR profile", - "Required / Conditional per Direct Edge Protocol Guide": "R", - "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, - "Test Data IDs": null -}, { - "name": "XDR MT Test 43", - "id": "43mu2", - "ID": "43mu2", - "desc": "Verify the ability of the SUT to appropriately provide a delivery failure message if it is unable to deliver the message to the destination. ETT will send a message via XDR to the SUT. If the SUT's final response is delivered synchronously, that message will be saved in the logs (click 'Logs'). If the SUT's final response is delivered asynchronously: 1) wait until the SUT's message has been sent and the ETT's response has been received, 2) click the Pending Refresh button to continue, 3) the logs for the asynchronous communication will then be available. The proctor will read the logs for the synchronous communication or the asynchronous communication for an appropriate response.", - "sutEdge": false, - "criteria":"['h2-12']", - "sutHisp": true, - "sutRole": "receiver", - "status": "configure", - "inputs": [{ - "name": "Endpoint", - "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages.", - "key": "targetEndpointTLS", - "type": "string" - }, { - "name": "Direct From Address", - "hoverlabel":"SUT (HISP) outgoing SMTP address.", - "key": "direct_from", - "type": "string" - }, { - "name": "Outgoing (ETT --> SUT) Direct From Address", - "key": "outgoing_from", - "type": "string" - }], - "Test Focus": "XDR Receive", - "Data Flow in Direct": "HISP receives an XDR message from the Edge", - "Metadata Included": "N/A", - "Direct Address Block": "Included", - "SUT: Sender/ Receiver": "Receiver (HISP - SUT)", - "Test Tool: Sender / Receiver": "Sender (Test Tool)", - "Purpose/Description": "The Health IT Module receives a message from the ETT (as Sending HISP) and is unable to deliver the message to its final destination (ETT as Destination Edge). \n Note: When the SUT (HISP) receives the MDN (from the 'direct:to' and hence RCPT TO from the Direct communication), the MAIL FROM of the MDN will be 'direct:to' - since the 'direct:to' endpoint is sending the MAIL FROM. The ETT hardcodes 'direct:to' based on the test case, normally is not needed. \n Outgoing (ETT --> SUT) Direct From Address:Note: MDN Direct from address in the 'direct:from' address the XDR MDN. ETT will use in creating the SOAP XDR transaction for this test. In turn this is destined to become the SMTP MAIL FROM for the ensuing Direct Communication between the SUT HISP to the ETT HISP (the 'direct:to' becomes the RCPT TO).\n Expected outcome: '...Final-Recipient: rfc822; processedfailure@ttpedge.sitenv.org, Original-Recipient: rfc822; processedfailure@ttpedge.sitenv.org, Original-Message-ID: <681247680.299.1498573532567.JavaMail.root@ip-172-31-46-193>, Disposition: automatic-action/MDN-sent-automatically;failure, Failure: Failure MDN'", - "Conformance Test Details": "The Health IT Module delivers a Processed MDN to the ETT (as Sending HISP) followed by a delivery failure message to the ETT (as Sending HISP) after the wait time has exceeded", - "Expected Test Results": "The Health IT Module sends a negative delivery status notification message to the ETT (as Sending Edge) using XDR profile", - "Required / Conditional per Direct Edge Protocol Guide": "R", - "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, - "Test Data IDs": null -}, { - "name": "XDR MT Test 44", - "id": "44mu2", - "ID": "44mu2", - "desc": "Verify the ability of the receiving system to appropriately respond in the event of a message timeout failure. ETT will send a message via XDR to the SUT. If the SUT's final response is delivered synchronously, that message will be saved in the logs (click 'Logs'). If the SUT's final response is delivered asynchronously: 1) wait until the SUT's message has been sent and the ETT's response has been received, 2) click the Pending Refresh button to continue, 3) the logs for the asynchronous communication will then be available. The proctor will read the logs for the synchronous communication or the asynchronous communication for an appropriate response.", - "sutEdge": false, - "criteria":"['h2-12']", - "sutHisp": true, - "sutRole": "receiver", - "status": "configure", - "inputs": [{ - "name": "Endpoint", - "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages.", - "key": "targetEndpointTLS", - "type": "string" - }, {"name": "Timeout", - "hoverlabel":"Timeout", - "key": "timeout", - "type": "string" - }, { - "name": "Direct From Address", - "hoverlabel":"SUT (HISP) outgoing SMTP address.", - "key": "direct_from", - "type": "string" - }, { - "name": "Outgoing (ETT --> SUT) Direct From Address", - "key": "outgoing_from", - "type": "string" - }], - "Test Focus": "XDR Receive", - "Data Flow in Direct": "HISP receives an XDR message from the Edge", - "Metadata Included": "N/A", - "Direct Address Block": "Included", - "SUT: Sender/ Receiver": "Receiver (HISP - SUT)", - "Test Tool: Sender / Receiver": "Sender (Test Tool)", - "Purpose/Description": "The Health IT Module receives a message from the ETT (as Sending HISP) and is unable to deliver the message to its final destination (ETT as Destination Edge). \n Note: When the SUT (HISP) receives the MDN (from the 'direct:to' and hence RCPT TO from the Direct communication), the MAIL FROM of the MDN will be 'direct:to' - since the 'direct:to' endpoint is sending the MAIL FROM. The ETT hardcodes 'direct:to' based on the test case, normally is not needed. \n Outgoing (ETT --> SUT) Direct From Address:Note: MDN Direct from address in the 'direct:from' address the XDR MDN. ETT will use in creating the SOAP XDR transaction for this test. In turn this is destined to become the SMTP MAIL FROM for the ensuing Direct Communication between the SUT HISP to the ETT HISP (the 'direct:to' becomes the RCPT TO).\n The Timeout parameter is amount of time the SUT will wait before sending a Failed MDN, this parameter should be the SUT default plus 5 minutes (N + 5 minutes). If a value is not defined, the test default is 65 minutes \n Expected outcome: \n--uuid:184c5b14-5eb3-4192-b5a4-3ca7e0758305 Content-Type: message/delivery-status; name=status.dat Content-Transfer-Encoding: binary Content-ID: <67bf0371-bf9a-4d39-b2b1-2a0d94ac3b41-24@urn:ihe:iti:xds-b:2007> \n Reporting-MTA: dns;Security Agent X-Original-Message-ID: <985848505.23.1500407627229.JavaMail.root@ip-172-31-46-193> \n Action: failed Final-Recipient: rfc822;delaydispatched5@ttpedgetest.sitenv.org Status: 5.0.0", - "Conformance Test Details": "The Health IT Module delivers a Processed MDN to the ETT (as Sending HISP) followed by a delivery failure message to the ETT (as Sending HISP) due to the bad address", - "Expected Test Results": "The Health IT Module sends a negative delivery status notification message to the ETT (as Sending Edge) using XDR profile", - "Required / Conditional per Direct Edge Protocol Guide": "R", - "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, - "Test Data IDs": null -}, { - "name": "XDR MT Test 48", - "id": "48mu2", - "ID": "48mu2", - "desc": "Verifies the ability of the sending system to send messages with unique message-IDs. Hit 'RUN' and then the sending system will send three messages with unique identifiers to the endpoint provided. When all three messages have been completely sent, press the 'Pending Refresh' button. (Message Tracking Using \"Implementation Guide for Delivery Notification\")", - "sutEdge": true, - "sutHisp": false, - "sutRole": "sender", - "inputs": [{ - "name": "Direct From Address", - "hoverlabel":"Direct From Address: SUT (HISP) outgoing SMTP address (or) MDN.", - "key": "direct_from", - "type": "string" - }], - "Test Focus": "", - "Data Flow in Direct": "", - "Metadata Included": "N/A", - "Direct Address Block": "N/A", - "SUT: Sender/ Receiver": "Sender (Edge - SUT)", - "Test Tool: Sender / Receiver": "", - "Purpose/Description": "Test to validate that the Edge system is able to create messages with unique message id.", - "Conformance Test Details": "", - "Expected Test Results": "Edge system creates each message with a unique message id with no duplicates.", - "Required / Conditional per Direct Edge Protocol Guide": "R", - "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, - "Test Data IDs": null -}, { - "name": "XDR MT Test 49", - "id": "49mu2", - "ID": "49mu2", - "desc": "Verify the ability of the sending system to correctly use a direct address block per the section 4.0 XDR and XDM Messaging for Direct v1.0 and per section 1.3 of the \"Implementation Guide for Delivery Notification for Direct v1.0\". The SOAP header will be inspected for the appropriate content.", - "sutEdge": true, - "sutHisp": false, - "sutRole": "sender", - "criteria":"['b1-1']", - "inputs": [{ - "name": "Direct From Address", - "hoverlabel":"Direct From Address: SUT (HISP) outgoing SMTP address (or) MDN.", - "key": "direct_from", - "type": "string" - }], - "Test Focus": "", - "Data Flow in Direct": "", - "Metadata Included": "N/A", - "Direct Address Block": "N/A", - "SUT: Sender/ Receiver": "Sender (Edge - SUT)", - "Test Tool: Sender / Receiver": "", - "Purpose/Description": "Test to validate that the Edge system is able to generate the direct address block header including delivery notifications element.", - "Conformance Test Details": "", - "Expected Test Results": "Edge system creates the direct address block including the disposition notifications header.", - "Required / Conditional per Direct Edge Protocol Guide": "R", - "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, - "Test Data IDs": null -}, { - "name": "XDR MT Test 50a", - "id": "50amu2", - "ID": "50amu2", - "desc": " Verify the ability of the sending system to correctly handle the case of sending XDR messages to valid recipients. The SUT is expected to appropriately track success messages.", - "sutEdge": true, - "sutHisp": false, - "sutRole": "sender", - "status": "configure", - "inputs": [{ - "name": "Direct From Address", - "hoverlabel":"Direct From Address: SUT (HISP) outgoing SMTP address (or) MDN.", - "key": "direct_from", - "type": "string" - }, { - "name": "Endpoint", - "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages", - "key": "targetEndpointTLS", - "type": "string" - }], - "expectedMDN": true, - "Test Focus": "", - "Data Flow in Direct": "", - "Metadata Included": "N/A", - "Direct Address Block": "N/A", - "SUT: Sender/ Receiver": "Sender (Edge - SUT)", - "Test Tool: Sender / Receiver": "", - "Purpose/Description": "The SUT should send the test message to Testcase50a@ttpedge.sitenv.org. Verify the ability of the sending system to correctly handle the case of sending XDR messages to valid recipients.", - "Conformance Test Details": "", - "Expected Test Results": "Edge system receives and processes a positive (success) delivery status notification.", - "Required / Conditional per Direct Edge Protocol Guide": "R", - "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, - "Test Data IDs": null -}, { - "name": "XDR MT Test 50b", - "id": "50bmu2", - "ID": "50bmu2", - "desc": " Verify the ability of the sending system to correctly handle the case of sending XDR messages to invalid recipients. The SUT is expected to appropriately track failure messages. Failure messages to invalid recipients have to be processed/tracked appropriately by the edge system and has to be made available for testing purposes.", - "sutEdge": true, - "sutHisp": false, - "sutRole": "sender", - "status": "configure", - "inputs": [{ - "name": "Direct From Address", - "hoverlabel":"Direct From Address: SUT (HISP) outgoing SMTP address (or) MDN.", - "key": "direct_from", - "type": "string" - }, { - "name": "Endpoint", - "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages", - "key": "targetEndpointTLS", - "type": "string" - }], - "expectedMDN": true, - "Test Focus": "", - "Data Flow in Direct": "", - "Metadata Included": "N/A", - "Direct Address Block": "N/A", - "SUT: Sender/ Receiver": "Sender (Edge - SUT)", - "Test Tool: Sender / Receiver": "", - "Purpose/Description": "The SUT should send the test message to Testcase50b@ttpedge.sitenv.org. Verify the ability of the sending system to correctly handle the case of sending XDR messages to invalid recipients.", - "Conformance Test Details": "", - "Expected Test Results": "Edge system successfully processes the invalid MDN received for tracking. The Edge SUT should display the event in the log for tracking.", - "Required / Conditional per Direct Edge Protocol Guide": "R", - "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, - "Test Data IDs": null +[{ + "name": "XDR Test 1", + "id": 1, + "ID": "1", + "desc": "Verifies the ability of the sending system to initiate a SOAP-based communication with an XDR-based payload. This test uses Limited XDR metadata.", + "sutEdge": true, + "sutHisp": false, + "sutRole": "sender", + "criteria":"['b1-1']", + "inputs": [{ + "name": "Direct From Address", + "hoverlabel":"Direct From Address: SUT (HISP) outgoing SMTP address (or) MDN.", + "key": "direct_from", + "type": "string" + }, { + "name": "C-CDA Document Type", + "key": "payload", + "type": "CCDAWidgetXdr" + }], + "Test Focus": "XDR Send ", + "Data Flow in Direct": "Edge Sends an XDR message to HISP along with Direct Address block", + "Metadata Included": "Limited Metadata", + "Direct Address Block": "Included", + "SUT: Sender/ Receiver": "Sender (Edge - SUT)", + "Test Tool: Sender / Receiver": "Receiver (Test Tool)", + "Purpose/Description": "Verify that the Edge system can create an XDR message per the specification. Per the Test Procedure, the user is to select a payload for transmission that meets the test scenario with regard to 170_b1_ToC_Amb or 170.315_b1_ToC_Inp. The user should select the C-CDA document type that matches the architecture for the document they are sending.", + "Conformance Test Details": "XDR Message Checklist + XDS Metadata Checklist for Limited Metadata Document Source + Direct Address Block", + "Expected Test Results": "Edge System produces the right message and conforms to the specification.", + "Required / Conditional per Direct Edge Protocol Guide": "R", + "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, + "Test Data IDs": null +}, { + "name": "XDR Test 2", + "id": 2, + "ID": "2", + "desc": "Verifies the ability of the sending system to initiate a SOAP-based communication with an XDR-based payload. This test uses Full XDR metadata.", + "sutEdge": true, + "sutHisp": false, + "sutRole": "sender", + "criteria":"['b1-1']", + "inputs": [{ + "name": "Direct From Address", + "hoverlabel":"Direct From Address: SUT (HISP) outgoing SMTP address (or) MDN.", + "key": "direct_from", + "type": "string" + }, { + "name": "C-CDA Document Type", + "key": "payload", + "type": "CCDAWidgetXdr" + }], + "Test Focus": "XDR Send", + "Data Flow in Direct": "Edge Sends an XDR message to HISP along with Full Metadata", + "Metadata Included": "Full Metadata", + "Direct Address Block": "Included", + "SUT: Sender/ Receiver": "Sender (Edge - SUT)", + "Test Tool: Sender / Receiver": "Receiver (Test Tool)", + "Purpose/Description": "Verify that the Edge system can create an XDR message per the specification", + "Conformance Test Details": "XDR Message Checklist + XDS Metadata Checklist for Full Metadata Document Source + Direct XDR Checklist", + "Expected Test Results": "Edge System produces the right message and conforms to the specification.", + "Required / Conditional per Direct Edge Protocol Guide": "O", + "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, + "Test Data IDs": null +}, { + "name": "XDR Test 3", + "id": "3add", + "ID": "3add", + "desc": "Verify the ability of the receiving system to correctly receive a properly formatted XDR message with Limited metadata.", + "sutEdge": true, + "sutHisp": false, + "sutRole": "receiver", + "criteria":"['b1-3','su1-3']", + "inputs": [{ + "name": "Endpoint", + "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages", + "key": "targetEndpointTLS", + "type": "string" + }, { + "name": "C-CDA Document Type", + "key": "payload", + "type": "CCDAWidgetReceiverXdr" + }], + "Test Focus": "XDR Receive", + "Data Flow in Direct": "Edge receives an XDR message from the HISP", + "Metadata Included": "Limited Metadata", + "Direct Address Block": "Included", + "SUT: Sender/ Receiver": "Receiver (Edge - SUT)", + "Test Tool: Sender / Receiver": "Sender (Test Tool)", + "Purpose/Description": "Verify that an Edge system can receive a properly formatted XDR message. The SUT will receive the XDR message with a 'direct:from' and 'direct:to' address of testcase3add@ttpedge.sitenv.org. This was designed to require the SUT's endpoint as the only input parameter.", + "Conformance Test Details": "", + "Expected Test Results": "Edge system is capable of receiving and processing a valid message, test procedure may include other details for verification. Test Tool is satisfied with a good response.", + "Required / Conditional per Direct Edge Protocol Guide": "R", + "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, + "Test Data IDs": null +}, { + "name": "XDR Test 4a", + "id": "4a", + "ID": "4a", + "desc": "Verify the ability of the receiving system to appropriately respond to a malformed message. This test is for an invalid SOAP header.", + "sutEdge": true, + "sutHisp": false, + "sutRole": "receiver", + "criteria":"['b1-3']", + "inputs": [{ + "name": "Endpoint", + "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages", + "key": "targetEndpointTLS", + "type": "string" + }], + "Test Focus": "XDR Receive", + "Data Flow in Direct": "Edge receives an incorrect XDR message from the HISP", + "Metadata Included": "N/A", + "Direct Address Block": "N/A", + "SUT: Sender/ Receiver": "Receiver (Edge - SUT)", + "Test Tool: Sender / Receiver": "Sender (Test Tool)", + "Purpose/Description": "Verify that the Edge system throws an error when an incorrect message is received. The SUT will receive the XDR message with a 'direct:from' and 'direct:to' address of testcase4a@ttpedge.sitenv.org. This was designed to require the SUT's endpoint as the only input parameter.", + "Conformance Test Details": "Create incorrect messages which include Bad SOAP Envelope Details", + "Expected Test Results": "Edge system is rejecting the various bad messages sent from the test tool.", + "Required / Conditional per Direct Edge Protocol Guide ": "R", + "Direct Edge Protocol Guide 1.1 RTM Reference ": 1.1, + "Test Data IDs ": null +}, { + "name": "XDR Test 4b", + "id": "4b", + "ID": "4b", + "desc": "Verify the ability of the receiving system to appropriately respond to a malformed message. This test is for an invalid SOAP body.", + "sutEdge": true, + "sutHisp": false, + "sutRole": "receiver", + "criteria":"['b1-3']", + "inputs": [{ + "name": "Endpoint", + "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages", + "key": "targetEndpointTLS", + "type": "string" + }], + "Test Focus": "XDR Receive", + "Data Flow in Direct": "Edge receives an incorrect XDR message from the HISP", + "Metadata Included": "N/A", + "Direct Address Block": "N/A", + "SUT: Sender/ Receiver": "Receiver (Edge - SUT)", + "Test Tool: Sender / Receiver": "Sender (Test Tool)", + "Purpose/Description": "Verify that the Edge system throws an error when an incorrect message is received. The SUT will receive the XDR message with a 'direct:from' and 'direct:to' address of testcase4b@ttpedge.sitenv.org. This was designed to require the SUT's endpoint as the only input parameter.", + "Conformance Test Details": "Create incorrect messages which include Bad SOAP Body Details", + "Expected Test Results": "Edge system is rejecting the various bad messages sent from the test tool.", + "Required / Conditional per Direct Edge Protocol Guide ": "R", + "Direct Edge Protocol Guide 1.1 RTM Reference ": 1.1, + "Test Data IDs ": null +}, { + "name": "XDR Test 5", + "id": 5, + "ID": "5", + "desc": "Verify the ability of the receiving system to correctly receive a properly formatted XDR message with Full (XDS) metadata.", + "sutEdge": true, + "sutHisp": false, + "sutRole": "receiver", + "criteria":"['b1-3','su1-3']", + "inputs": [{ + "name": "Endpoint", + "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages", + "key": "targetEndpointTLS", + "type": "string" + }], + "Test Focus": "XDR Receive", + "Data Flow in Direct": "Edge receives an XDR message from the HISP", + "Metadata Included": "Full Metadata", + "Direct Address Block": "Included", + "SUT: Sender/ Receiver": "Receiver (Edge - SUT)", + "Test Tool: Sender / Receiver": "Sender (Test Tool)", + "Purpose/Description": "Verify that an Edge system can receive a properly formatted XDR message. The SUT will receive the XDR message with a 'direct:from' and 'direct:to' address of testcase5@ttpedge.sitenv.org. This was designed to require the SUT's endpoint as the only input parameter.", + "Conformance Test Details": "", + "Expected Test Results": "Edge system is capable of receiving and processing a valid message with Full Metadata, test procedure may include other details for verification. Test Tool is satisfied with a good response.", + "Required / Conditional per Direct Edge Protocol Guide": "R", + "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, + "Test Data IDs": null +}, { + "name": "XDR Test 6", + "id": 6, + "ID": "6", + "desc": "Verifies the ability of the sending system to complete a mutual TLS handshake before data is sent across.\nNote that an unsuccessful TLS attempt may result in the Pending Refresh button being displayed instead of a Fail. A disconnection happening at the server level would cause the communication not to be forwarded to the application level.", + "sutEdge": true, + "sutHisp": false, + "sutRole": "sender", + "criteria":"['b1-1']", + "inputs": [{ + "name": "Direct From Address", + "hoverlabel":"Direct From Address: SUT (HISP) outgoing SMTP address (or) MDN.", + "key": "direct_from", + "type": "string" + }], + "Test Focus": "Authentication", + "Data Flow in Direct": "Edge uses Mutual TLS to authenticate to the HISP", + "Metadata Included": "N/A", + "Direct Address Block": "N/A", + "SUT: Sender/ Receiver": "Sender (Edge - SUT)", + "Test Tool: Sender / Receiver": "Server (Test Tool)", + "Purpose/Description": "Verify that Mutual TLS session is established between the Sender and the Receiver before transimitting data. The Tester (i.e., Vendor) assures that the appropriate XDR Certificates have been downloaded from the ETT and imported into the SUT trust store before executing the test.", + "Conformance Test Details": "Require Mutual TLS in the configuration", + "Expected Test Results": "Edge Sysem is capable of establishing the Mutual TLS connection prior to transmitting the data.", + "Required / Conditional per Direct Edge Protocol Guide": "R", + "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, + "Test Data IDs": null +}, { + "name": "XDR Test 7", + "id": 7, + "ID": "7", + "desc": "Verifies the ability of the sending system to reject a mutual TLS connection where the certificate provided by the ETT is invalid. If you experience Pending Refresh or a Fail that you think is incorrect, please run this test again but wait 15 seconds after the connection has been dropped for the ETT to fully test the socket connection.", + "sutEdge": true, + "sutHisp": false, + "sutRole": "sender", + "criteria":"['b1-1']", + "inputs": [{ + "name": "IP Address", + "key": "ip_address", + "hoverlabel":"IP Address (eg: 202.255.24.62)", + "type": "string" + }], + "Test Focus": "Authentication", + "Data Flow in Direct": "Edge uses Mutual TLS to authenticate to the HISP exception case", + "Metadata Included": "N/A", + "Direct Address Block": "N/A", + "SUT: Sender/ Receiver": "Sender (Edge - SUT)", + "Test Tool: Sender / Receiver": "Server (Test Tool)", + "Purpose/Description": "Verify that Edge disconnects when the Server provided certificate is invalid.", + "Conformance Test Details": "Incorrect Mutual TLS configuration should not proceed.", + "Expected Test Results": "Edge Sysem rejects the connection from the Server due to bad certificate.", + "Required / Conditional per Direct Edge Protocol Guide": "R", + "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, + "Test Data IDs": "Column J is not necessary." +}, { + "name": "XDR Test 8", + "id": 8, + "ID": "8", + "desc": "Verifies the ability of the receiving system to complete a mutual TLS handshake before data is sent across. Certificates for this test can be downloaded from the link at the top of this page. This is a socket-level test, the full endpoint is not necessary. Enter only IP Address and port below.", + "sutEdge": true, + "sutHisp": false, + "sutRole": "receiver", + "criteria":"['b1-3']", + "inputs": [{ + "name": "IP Address", + "key": "ip_address", + "hoverlabel":"IP Address (eg: 202.255.24.62)", + "type": "string" + }, { + "name": "Port", + "key": "port", + "type": "string" + }], + "Test Focus": "Authentication", + "Data Flow in Direct": "HISP authenticates to the Edge using Mutual TLS", + "Metadata Included": "N/A", + "Direct Address Block": "N/A", + "SUT: Sender/ Receiver": "Receiver (Edge - SUT)", + "Test Tool: Sender / Receiver": "Client (Test Tool)", + "Purpose/Description": "Test Tool authenticates with the Edge using Mutual TLS correctly", + "Conformance Test Details": "Require Mutual TLS in the configuration in the Edge system", + "Expected Test Results": "Edge System is capable of accepting and validating a Mutual TLS connection.", + "Required / Conditional per Direct Edge Protocol Guide": "R", + "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, + "Test Data IDs": null +}, { + "name": "XDR Test 9", + "id": 9, + "ID": "9", + "desc": "Verifies the ability of the receiving system to reject a mutual TLS connection where the certificate provided by the ETT is invalid. Certificates for this test can be downloaded from the link at the top of this page. As this is a socket-level test, the full endpoint is not necessary and only IP Address and port are to be entered below. The SUT MUST attempt an HTTPS connection.", + "sutEdge": true, + "sutHisp": false, + "sutRole": "receiver", + "criteria":"['b1-3']", + "inputs": [{ + "name": "IP Address", + "key": "ip_address", + "hoverlabel":"IP Address (eg: 202.255.24.62)", + "type": "string" + }, { + "name": "Port", + "key": "port", + "type": "string" + }], + "Test Focus": "Authentication", + "Data Flow in Direct": "HISP authenticates to the Edge using Mutual TLS exception case", + "Metadata Included": "N/A", + "Direct Address Block": "N/A", + "SUT: Sender/ Receiver": "Receiver (Edge - SUT)", + "Test Tool: Sender / Receiver": "Client (Test Tool)", + "Purpose/Description": "Test Tool authenticates with the Edge using bad certificates", + "Conformance Test Details": "Incorrect Mutual TLS configuration should not proceed.", + "Expected Test Results": "Edge System rejects the connection due to the bad certificate published by the Test Tool.", + "Required / Conditional per Direct Edge Protocol Guide": "R", + "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, + "Test Data IDs": null +}, { + "name": "XDR Test 10", + "id": 10, + "ID": "10", + "desc": "Test Tool sends a Direct Message to the SUT. The SUT must translate this to an XDR message and send it back to the Edge.\nVerify that the HISP system can create an XDR message per the specification and forward to Edge. The return endpoint is provided below. The validation report will be sent to the email address registered with the Direct address enter during setup.", + "sutEdge": false, + "sutHisp": true, + "sutRole": "sender", + "criteria":"['h2-1','h2-3','sc2-1','sc2-3']", + "status": "configure", + "inputs": [{ + "name": "Direct To Address", + "hoverlabel":"Direct To Address: SUT's receiving email endpoint for Direct/XDR translation, ETT to SUT workflow.", + "key": "direct_to", + "type": "string" + }], + "Test Focus": "XDR Send ", + "Data Flow in Direct": "HISP Sends an XDR message to Edge", + "Metadata Included": "Limited Metadata", + "Direct Address Block": "Included", + "SUT: Sender/ Receiver": "Sender (HISP - SUT)", + "Test Tool: Sender / Receiver": "Receiver (Test Tool)", + "Purpose/Description": "Test Tool sends a Direct Message, which is translated to an XDR message and sent to the Edge.\nVerify that the HISP system can create an XDR message per the specification and forward to Edge. The validation report will be sent to the email address registered with the Direct address enter during setup. Direct To Address: SUT's receiving email endpoint for Direct/XDR translation, ETT to SUT workflow. The SUT will receive a message from testcase10@ttpedge.sitenv.org", + "Conformance Test Details": "XDR Message Checklist + XDS Metadata Checklist for Limited Metadata Document Source + Direct XDR Checklist", + "Expected Test Results": "HISP generates an XDR message with Limited Metadata from a Direct Message and forwards to Edge.", + "Required / Conditional per Direct Edge Protocol Guide": "R", + "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, + "Test Data IDs": null +}, { + "name": "XDR Test 11", + "id": 11, + "ID": "11", + "desc": "Test Tool sends a Direct Message + XDM to the SUT. The SUT must translate this to an XDR message with Limited Metadata and send it back to the Edge.\nVerify that the HISP system can create an XDR message per the specification and forward to Edge. The return endpoint is provided below. The validation report will be sent to the email address registered with the Direct address enter during setup.", + "sutEdge": false, + "sutHisp": true, + "sutRole": "sender", + "criteria":"['h2-1','h2-3','sc2-1','sc2-3']", + "status": "configure", + "inputs": [{ + "name": "Direct To Address", + "hoverlabel":"Direct To Address: SUT's receiving email endpoint for Direct/XDR translation, ETT to SUT workflow.", + "key": "direct_to", + "type": "string" + }], + "Test Focus": "XDR Send", + "Data Flow in Direct": "HISP Sends an XDR message to Edge with Limited Metadata", + "Metadata Included": "Limited Metadata", + "Direct Address Block": "Included", + "SUT: Sender/ Receiver": "Sender (HISP - SUT)", + "Test Tool: Sender / Receiver": "Receiver (Test Tool)", + "Purpose/Description": "Test Tool sends a Direct Message + XDM, which is translated to an XDR message with Limited Metadata and sent to the Edge.\nVerify that the HISP system can create an XDR message per the specification and forward to Edge. The validation report will be sent to the email address registered with the Direct address enter during setup. Direct To Address: SUT's receiving email endpoint for Direct/XDR translation, ETT to SUT workflow. The SUT will receive a message from testcase11@ttpedge.sitenv.org.", + "Conformance Test Details": "XDR Message Checklist + XDS Metadata Checklist for Limited Metadata Document Source + Direct XDR Checklist", + "Expected Test Results": "HISP generates an XDR message with Limited Metadata from a Direct Message and forwards to Edge.", + "Required / Conditional per Direct Edge Protocol Guide": "R", + "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, + "Test Data IDs": null +}, { + "name": "XDR Test 12", + "id": 12, + "ID": "12", + "desc": "Test Tool sends a Direct Message + XDM to the SUT. The SUT must translate this to an XDR message with Full Metadata and send it back to the Edge.\nVerify that the HISP system can create an XDR message per the specification and forward to Edge. The return endpoint is provided below.The validation report will be sent to the email address registered with the Direct address enter during setup.", + "sutEdge": false, + "sutHisp": true, + "sutRole": "sender", + "criteria":"['h2-1','h2-3','sc2-1','sc2-3']", + "status": "configure", + "inputs": [{ + "name": "Direct To Address", + "hoverlabel":"Direct To Address: SUT's receiving email endpoint for Direct/XDR translation, ETT to SUT workflow.", + "key": "direct_to", + "type": "string" + }], + "Test Focus": "XDR Send", + "Data Flow in Direct": "HISP Sends an XDR message to Edge along with Full Metadata", + "Metadata Included": "Full Metadata", + "Direct Address Block": "Included", + "SUT: Sender/ Receiver": "Sender (HISP - SUT)", + "Test Tool: Sender / Receiver": "Receiver (Test Tool)", + "Purpose/Description": "Test Tool sends a Direct Message + XDM, which is translated to an XDR message with Full Metadata and sent to the Edge.\nVerify that the HISP system can create an XDR message per the specification and forward to Edge. The validation report will be sent to the email address registered with the Direct address enter during setup. Direct To Address: SUT's receiving email endpoint for Direct/XDR translation, ETT to SUT workflow. The SUT will receive a message from testcase12@ttpedge.sitenv.org.", + "Conformance Test Details": "XDR Message Checklist + XDS Metadata Checklist for Full Metadata Document Source + Direct XDR Checklist", + "Expected Test Results": "HISP generates an XDR message with Full Metadata from a Direct Message and forwards to Edge.", + "Required / Conditional per Direct Edge Protocol Guide": "O", + "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, + "Test Data IDs": null +}, { + "name": "XDR Test 13", + "id": 13, + "ID": "13", + "desc": "Before this test is run, the vendor must register a Direct Address / Contact address pairing using the Direct portion of the ETT tool.\nTest Tool sends an XDR Message with Limited metadata to the SUT (HISP). The SUT must then translate the message into Direct and send it back to the ETT which is acting as the Destination HISP. The Direct Address it passes the message along to must match the Direct Address that has been pre-registered. A validation report will be sent to the Contact address.\nVerify that an HISP system can receive a properly formatted XDR message and translate to Direct Message.", + "sutEdge": false, + "sutHisp": true, + "sutRole": "receiver", + "criteria":"['h2-2','h2-7','sc2-2','sc2-7']", + "inputs": [{ + "name": "Endpoint", + "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages.", + "key": "targetEndpointTLS", + "type": "string" + }, { + "name": "Outgoing (ETT --> SUT) Direct From Address", + "hoverlabel":"SUT (HISP) outgoing SMTP address.", + "key": "outgoing_from", + "type": "string" + }], + "Test Focus": "XDR Receive", + "Data Flow in Direct": "HISP receives an XDR message from the Edge", + "Metadata Included": "Limited Metadata", + "Direct Address Block": "Included", + "SUT: Sender/ Receiver": "Receiver (HISP - SUT)", + "Test Tool: Sender / Receiver": "Sender (Test Tool)", + "Purpose/Description": "Test Tool sends an XDR Message to the HSIP which then translates the message to Direct and sends to the other HISP.\nVerify that an HISP system can receive a properly formatted XDR message and translate to Direct Message.\nNote: When the SUT (HISP) receives the MDN (from the 'direct:to' and hence RCPT TO from the Direct communication), the MAIL FROM of the MDN will be 'direct:to' - since the 'direct:to' endpoint is sending the MAIL FROM. The ETT hardcodes 'direct:to' based on the test case, normally is not needed.", + "Conformance Test Details": "XDR Message Checklist + XDS Metadata Checklist for Limited Metadata Document Source + Direct XDR Checklist", + "Expected Test Results": "HISP receives an XDR message and converts to a Direct + XDM Message.", + "Required / Conditional per Direct Edge Protocol Guide": "R", + "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, + "Test Data IDs": null +}, { + "name": "XDR MT Test 13", + "id": "32mu2", + "ID": "32mu2", + "desc": "Verify the ability of the SUT to appropriately respond to a delivery to a non-existent address. ETT will send a message via XDR to the SUT. If the SUT's final response is delivered synchronously, that message will be saved in the logs (click 'Logs'). If the SUT's final response is delivered asynchronously: 1) wait until the SUT's message has been sent and the ETT's response has been received, 2) click the Pending Refresh button to continue, 3) the logs for the asynchronous communication will then be available. The proctor will read the logs for the synchronous communication or the asynchronous communication for an appropriate response. This test is part of the Message Tracking Using Processed MDN test suite.", + "sutEdge": false, + "sutHisp": true, + "sutRole": "receiver", + "criteria":"['h2-3','sc2-3']", + "status": "configure", + "inputs": [{ + "name": "Endpoint", + "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages.", + "key": "targetEndpointTLS", + "type": "string" + }, { + "name": "Direct From Address", + "hoverlabel":"SUT (HISP) outgoing SMTP address.", + "key": "direct_from", + "type": "string" + }, { + "name": "Outgoing (ETT --> SUT) Direct From Address", + "key": "outgoing_from", + "type": "string" + }], + "Test Focus": "XDR Receive", + "Data Flow in Direct": "HISP receives an XDR message from the Edge", + "Metadata Included": "N/A", + "Direct Address Block": "Included", + "SUT: Sender/ Receiver": "Receiver (HISP - SUT)", + "Test Tool: Sender / Receiver": "Sender (Test Tool)", + "Purpose/Description": "The ETT (as Edge) sends a message to the Health IT Module using a bad address, such that the Health IT Module is unable to deliver the message. The Health IT Module delivers a failure message to the ETT (as Edge) using the XDR profile due to a bad address. \n Note: When the SUT (HISP) receives the MDN (from the 'direct:to' and hence RCPT TO from the Direct communication), the MAIL FROM of the MDN will be 'direct:to' - since the 'direct:to' endpoint is sending the MAIL FROM. The ETT hardcodes 'direct:to' based on the test case, normally is not needed. \n Outgoing (ETT --> SUT) Direct From Address:Note: MDN Direct from address in the 'direct:from' address the XDR MDN. ETT will use in creating the SOAP XDR transaction for this test. In turn this is destined to become the SMTP MAIL FROM for the ensuing Direct Communication between the SUT HISP to the ETT HISP (the 'direct:to' becomes the RCPT TO).", + "Conformance Test Details": "Conforms to section 1.5.2.1.1 of the Direct Edge Protocol Implementation Guide 1.1, including an appropriately filled 'direct:disposition' element in the XML payload", + "Expected Test Results": "The message disposition must indicate a failure.", + "Required / Conditional per Direct Edge Protocol Guide": "R", + "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, + "Test Data IDs": null +}, { + "name": "XDR Test 14", + "id": 14, + "ID": "14", + "desc": "Before this test is run, the vendor must register a Direct Address / Contact address pairing using the Direct portion of the ETT tool.\nTest Tool sends an XDR Message with Full (XDS) metadata to the SUT (HISP). The SUT must then translate the message into Direct and send it back to the ETT which is acting as the Destination HISP. The Direct Address it passes the message along to must match the Direct Address that has been pre-registered. A validation report will be sent to the Contact address.\nVerify that an HISP system can receive a properly formatted XDR message and translate to Direct Message.", + "sutEdge": false, + "sutHisp": true, + "sutRole": "receiver", + "criteria":"['h2-2','h2-7','sc2-2','sc2-7']", + "inputs": [{ + "name": "Endpoint", + "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages.", + "key": "targetEndpointTLS", + "type": "string" + }, { + "name": "Outgoing (ETT --> SUT) Direct From Address", + "hoverlabel":"SUT (HISP) outgoing SMTP address.", + "key": "outgoing_from", + "type": "string" + }], + "Test Focus": "XDR Receive", + "Data Flow in Direct": "HISP receives an XDR message from the Edge along with Full Metadata", + "Metadata Included": "Full Metadata", + "Direct Address Block": "Included", + "SUT: Sender/ Receiver": "Receiver (HISP - SUT)", + "Test Tool: Sender / Receiver": "Sender (Test Tool)", + "Purpose/Description": "Test Tool sends an XDR Message with Full Metadata to the HSIP which then translates the message to Direct and sends to the other HISP.\nVerify that an HISP system can receive a properly formatted XDR message and translate to Direct Message.\nNote: When the SUT (HISP) receives the MDN (from the 'direct:to' and hence RCPT TO from the Direct communication), the MAIL FROM of the MDN will be 'direct:to' - since the 'direct:to' endpoint is sending the MAIL FROM. The ETT hardcodes 'direct:to' based on the test case, normally is not needed.", + "Conformance Test Details": "XDR Message Checklist + XDS Metadata Checklist for Full Metadata Document Source + Direct XDR Checklist", + "Expected Test Results": "HISP receives an XDR message and converts to a Direct Message.", + "Required / Conditional per Direct Edge Protocol Guide": "O", + "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, + "Test Data IDs": null +}, { + "name": "XDR MT Test 14", + "id": "33mu2", + "ID": "33mu2", + "desc": "Verify the ability of the SUT to appropriately respond to a delivery to an untrusted HISP. ETT will send a message via XDR to the SUT. If the SUT's final response is delivered synchronously, that message will be saved in the logs (click 'Logs'). If the SUT's final response is delivered asynchronously: 1) wait until the SUT's message has been sent and the ETT's response has been received, 2) click the Pending Refresh button to continue, 3) the logs for the asynchronous communication will then be available. The proctor will read the logs for the synchronous communication or the asynchronous communication for an appropriate response. This test is part of the Message Tracking Using Processed MDN test suite.", + "sutEdge": false, + "sutHisp": true, + "sutRole": "receiver", + "criteria":"['h2-3','sc2-3']", + "status": "configure", + "inputs": [{ + "name": "Endpoint", + "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages.", + "key": "targetEndpointTLS", + "type": "string" + }, { + "name": "Direct From Address", + "hoverlabel":"SUT (HISP) outgoing SMTP address.", + "key": "direct_from", + "type": "string" + }, { + "name": "Outgoing (ETT --> SUT) Direct From Address", + "key": "outgoing_from", + "type": "string" + }], + "Test Focus": "XDR Receive", + "Data Flow in Direct": "The ETT (as Edge) sends a message to the Health IT Module using a valid address, but the ETT (as Destination HISP) is not trusted.", + "Metadata Included": "N/A", + "Direct Address Block": "Included", + "SUT: Sender/ Receiver": "Receiver (HISP - SUT)", + "Test Tool: Sender / Receiver": "Sender (Test Tool)", + "Purpose/Description": "The ETT (as Edge) sends a message to the Health IT Module using a valid address, but the ETT (as Destination HISP) is not trusted. \n Note: When the SUT (HISP) receives the MDN (from the 'direct:to' and hence RCPT TO from the Direct communication), the MAIL FROM of the MDN will be 'direct:to' - since the 'direct:to' endpoint is sending the MAIL FROM. The ETT hardcodes 'direct:to' based on the test case, normally is not needed. \n Outgoing (ETT --> SUT) Direct From Address:Note: MDN Direct from address in the 'direct:from' address the XDR MDN. ETT will use in creating the SOAP XDR transaction for this test. In turn this is destined to become the SMTP MAIL FROM for the ensuing Direct Communication between the SUT HISP to the ETT HISP (the 'direct:to' becomes the RCPT TO).", + "Conformance Test Details": "Conforms to section 1.5.2.1.1 of the Direct Edge Protocol Implementation Guide 1.1", + "Expected Test Results": "The Health IT Module delivers a failure message to the ETT (as Edge) using the XDR profile due to an untrusted HISP (ETT as Destination HISP)", + "Required / Conditional per Direct Edge Protocol Guide": "R", + "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, + "Test Data IDs": null +}, { + "name": "XDR Test 15a", + "id": "15a", + "ID": "15a", + "desc": "Verify the ability of the receiving system to appropriately respond to a malformed message. This test is for an invalid SOAP header.", + "sutEdge": false, + "criteria":"['h2-7']", + "sutHisp": true, + "sutRole": "receiver", + "inputs": [{ + "name": "Endpoint", + "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages", + "key": "targetEndpointTLS", + "type": "string" + }], + "Test Focus": "XDR Receive", + "Data Flow in Direct": "HISP receives an incorrect XDR message from the Edge", + "Metadata Included": "Limited Metadata", + "Direct Address Block": "Included", + "SUT: Sender/ Receiver": "Receiver (HISP - SUT)", + "Test Tool: Sender / Receiver": "Sender (Test Tool)", + "Purpose/Description": "Verify that the HISP system throws an error when an incorrect message is received.", + "Conformance Test Details": "Create an incorrect message with invalid SOAP envelope details", + "Expected Test Results": "HISP should validate the messages per the specification and reject the bad messages", + "Required / Conditional per Direct Edge Protocol Guide ": "R", + "Direct Edge Protocol Guide 1.1 RTM Reference ": 1.1, + "Test Data IDs ": null +}, { + "name": "XDR Test 15b", + "id": "15b", + "ID": "15b", + "desc": "Verify the ability of the receiving system to appropriately respond to a malformed message. This test is for an invalid SOAP body.", + "sutEdge": false, + "criteria":"['h2-7']", + "sutHisp": true, + "sutRole": "receiver", + "inputs": [{ + "name": "Endpoint", + "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages", + "key": "targetEndpointTLS", + "type": "string" + }], + "Test Focus": "XDR Receive", + "Data Flow in Direct": "HISP receives an incorrect XDR message from the Edge", + "Metadata Included": "Limited Metadata", + "Direct Address Block": "Included", + "SUT: Sender/ Receiver": "Receiver (HISP - SUT)", + "Test Tool: Sender / Receiver": "Sender (Test Tool)", + "Purpose/Description": "Verify that the HISP system throws an error when an incorrect message is received.", + "Conformance Test Details": "Create an incorrect message with invalid SOAP body details", + "Expected Test Results": "HISP should validate the messages per the specification and reject the bad messages", + "Required / Conditional per Direct Edge Protocol Guide ": "R", + "Direct Edge Protocol Guide 1.1 RTM Reference ": 1.1, + "Test Data IDs ": null +}, { + "name": "XDR MT Test 15", + "id": "34mu2", + "ID": "34mu2", + "desc": "Verify the ability of the SUT to appropriately respond to a delivery to a HISP which does not have a published certificate. ETT will send a message via XDR to the SUT. If the SUT's final response is delivered synchronously, that message will be saved in the logs (click 'Logs'). If the SUT's final response is delivered asynchronously: 1) wait until the SUT's message has been sent and the ETT's response has been received, 2) click the Pending Refresh button to continue, 3) the logs for the asynchronous communication will then be available. The proctor will read the logs for the synchronous communication or the asynchronous communication for an appropriate response. This test is part of the Message Tracking Using Processed MDN test suite.", + "sutEdge": false, + "sutHisp": true, + "sutRole": "receiver", + "criteria":"['h2-3','sc2-3']", + "status": "configure", + "inputs": [{ + "name": "Endpoint", + "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages.", + "key": "targetEndpointTLS", + "type": "string" + }, { + "name": "Direct From Address", + "hoverlabel":"SUT (HISP) outgoing SMTP address.", + "key": "direct_from", + "type": "string" + }, { + "name": "Outgoing (ETT --> SUT) Direct From Address", + "key": "outgoing_from", + "type": "string" + }], + "Test Focus": "XDR Receive", + "Data Flow in Direct": "HISP receives an XDR message from the Edge", + "Metadata Included": "N/A", + "Direct Address Block": "Included", + "SUT: Sender/ Receiver": "Receiver (HISP - SUT)", + "Test Tool: Sender / Receiver": "Sender (Test Tool)", + "Purpose/Description": "Verify the ability of the SUT to appropriately respond to a delivery to a HISP which does not have a published certificate. \n Note: When the SUT (HISP) receives the MDN (from the 'direct:to' and hence RCPT TO from the Direct communication), the MAIL FROM of the MDN will be 'direct:to' - since the 'direct:to' endpoint is sending the MAIL FROM. The ETT hardcodes 'direct:to' based on the test case, normally is not needed. \n Outgoing (ETT --> SUT) Direct From Address:Note: MDN Direct from address in the 'direct:from' address the XDR MDN. ETT will use in creating the SOAP XDR transaction for this test. In turn this is destined to become the SMTP MAIL FROM for the ensuing Direct Communication between the SUT HISP to the ETT HISP (the 'direct:to' becomes the RCPT TO).", + "Conformance Test Details": "Create and send a valid XDR message, with a valid destination with an unpublished certificate", + "Expected Test Results": "The SUT will respond with a message that conforms to section 1.5.2.1.1 of the Direct Edge Protocol Implementation Guide 1.1", + "Required / Conditional per Direct Edge Protocol Guide": "R", + "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, + "Test Data IDs": null +}, { + "name": "XDR Test 16", + "id": 16, + "ID": "16", + "desc": "Verify that Mutual TLS session is established between the Sender and the Receiver before transimitting data.", + "sutEdge": false, + "criteria":"['h2-3','sc2-3']", + "sutHisp": true, + "sutRole": "sender", + "inputs": [{ + "name": "Direct From Address", + "hoverlabel":"Direct From Address: SUT (HISP) outgoing SMTP address (or) MDN.", + "key": "direct_from", + "type": "string" + }], + "Test Focus": "Authentication", + "Data Flow in Direct": "HISP uses Mutual TLS to authenticate to the Edge", + "Metadata Included": "N/A", + "Direct Address Block": "N/A", + "SUT: Sender/ Receiver": "Client (HISP - SUT)", + "Test Tool: Sender / Receiver": "Server (Test Tool)", + "Purpose/Description": "Verify that Mutual TLS session is established between the Sender and the Receiver before transimitting data.", + "Conformance Test Details": "Require Mutual TLS in the configuration", + "Expected Test Results": "HISP should initiate a connection to the Edge using Mutual TLS correctly.", + "Required / Conditional per Direct Edge Protocol Guide": "R", + "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, + "Test Data IDs": null +}, { + "name": "XDR MT Test 16", + "id": "35mu2", + "ID": "35mu2", + "desc": "Verify the ability of the SUT to appropriately respond in the event of a lack of a Processed MDN. ETT will send a message via XDR to the SUT. If the SUT's final response is delivered synchronously, that message will be saved in the logs (click 'Logs'). If the SUT's final response is delivered asynchronously: 1) wait until the SUT's message has been sent and the ETT's response has been received, 2) click the Pending Refresh button to continue, 3) the logs for the asynchronous communication will then be available. The proctor will read the logs for the synchronous communication or the asynchronous communication for an appropriate response. This test is part of the Message Tracking Using Processed MDN test suite.", + "sutEdge": false, + "sutHisp": true, + "sutRole": "receiver", + "criteria":"['h2-3']", + "status": "configure", + "inputs": [{ + "name": "Endpoint", + "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages.", + "key": "targetEndpointTLS", + "type": "string" + }, { + "name": "Direct From Address", + "hoverlabel":"SUT (HISP) outgoing SMTP address.", + "key": "direct_from", + "type": "string" + }, { + "name": "Outgoing (ETT --> SUT) Direct From Address", + "key": "outgoing_from", + "type": "string" + }], + "Test Focus": "XDR Receive", + "Data Flow in Direct": "HISP receives an XDR message from the Edge", + "Metadata Included": "N/A", + "Direct Address Block": "Included", + "SUT: Sender/ Receiver": "Receiver (HISP - SUT)", + "Test Tool: Sender / Receiver": "Sender (Test Tool)", + "Purpose/Description": "Verify the ability of the SUT to appropriately respond to a delivery to a HISP due to an extended wait period using an XDR profile. \n Note: When the SUT (HISP) receives the MDN (from the 'direct:to' and hence RCPT TO from the Direct communication), the MAIL FROM of the MDN will be 'direct:to' - since the 'direct:to' endpoint is sending the MAIL FROM. The ETT hardcodes 'direct:to' based on the test case, normally is not needed. \n Outgoing (ETT --> SUT) Direct From Address:Note: MDN Direct from address in the 'direct:from' address the XDR MDN. ETT will use in creating the SOAP XDR transaction for this test. In turn this is destined to become the SMTP MAIL FROM for the ensuing Direct Communication between the SUT HISP to the ETT HISP (the 'direct:to' becomes the RCPT TO).", + "Conformance Test Details": "Create and send a valid XDR message, with a valid destination with an extended wait period, time-out scenario, failure message.", + "Expected Test Results": "The SUT will respond with a message that conforms to section 1.5.2.1.1 of the Direct Edge Protocol Implementation Guide 1.1", + "Required / Conditional per Direct Edge Protocol Guide": "R", + "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, + "Test Data IDs": null +}, { + "name": "XDR Test 17", + "id": 17, + "ID": "17", + "desc": "Verify that HISP disconnects when the Server provided certificate is invalid. Only the IP address of the SUT shall be entered below. As this is a socket based test, the full endpoint is not required. Only the IP Address and port are needed and provided.", + "sutEdge": false, + "sutHisp": true, + "sutRole": "sender", + "criteria":"['h2-3']", + "inputs": [{ + "name": "IP Address", + "hoverlabel":"IP Address (eg: 202.255.24.62)", + "key": "ip_address", + "type": "string" + }], + "Test Focus": "Authentication", + "Data Flow in Direct": "HISP uses Mutual TLS to authenticate to the Edge exception case", + "Metadata Included": "N/A", + "Direct Address Block": "N/A", + "SUT: Sender/ Receiver": "Client (HISP - SUT)", + "Test Tool: Sender / Receiver": "Server (Test Tool)", + "Purpose/Description": "Verify that HISP disconnects when the Server provided certificate is invalid.", + "Conformance Test Details": "Incorrect Mutual TLS configuration should not proceed.", + "Expected Test Results": "HISP should disconnect when the certificate from the edge is bad.", + "Required / Conditional per Direct Edge Protocol Guide": "R", + "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, + "Test Data IDs": null +}, { + "name": "XDR Test 18", + "id": 18, + "ID": "18", + "desc": "Test Tool authenticates with the HISP using Mutual TLS correctly. Certificates for this testing tool can be downloaded from the top of this page. This is a socket-level test, the full endpoint is not required. Enter only the IP Address and port below.", + "sutEdge": false, + "criteria":"['h2-7']", + "sutHisp": true, + "sutRole": "receiver", + "inputs": [{ + "name": "IP Address", + "hoverlabel":"IP Address (eg: 202.255.24.62)", + "key": "ip_address", + "type": "string" + }, { + "name": "Port", + "key": "port", + "type": "string" + }], + "Test Focus": "Authentication", + "Data Flow in Direct": "Edge authenticates to the HISP using Mutual TLS", + "Metadata Included": "N/A", + "Direct Address Block": "N/A", + "SUT: Sender/ Receiver": "Server (HISP - SUT)", + "Test Tool: Sender / Receiver": "Client (Test Tool)", + "Purpose/Description": "Test Tool authenticates with the HISP using Mutual TLS correctly", + "Conformance Test Details": "Require Mutual TLS in the configuration in the Edge system", + "Expected Test Results": "HISP should accept a connection from the Edge for Mutual TLS correctly.", + "Required / Conditional per Direct Edge Protocol Guide": "R", + "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, + "Test Data IDs": null +}, { + "name": "XDR Test 19", + "id": 19, + "ID": "19", + "desc": "Test Tool authenticates with the HISP using bad certificates. The SUT is expected to disconnect before any meaningful data is sent. Certificates for this testing tool can be downloaded from the top of this page. This is a socket-level test, the full endpoint is not required. Enter only the IP Address and port below.", + "sutEdge": false, + "sutHisp": true, + "criteria":"['h2-7']", + "sutRole": "receiver", + "inputs": [{ + "name": "IP Address", + "hoverlabel":"IP Address (eg: 202.255.24.62)", + "key": "ip_address", + "type": "string" + }, { + "name": "Port", + "key": "port", + "type": "string" + }], + "Test Focus": "Authentication", + "Data Flow in Direct": "Edge authenticates to the HISP using Mutual TLS exception case", + "Metadata Included": "N/A", + "Direct Address Block": "N/A", + "SUT: Sender/ Receiver": "Server (HISP - SUT)", + "Test Tool: Sender / Receiver": "Client (Test Tool)", + "Purpose/Description": "Test Tool authenticates with the HISP using bad certificates", + "Conformance Test Details": "Incorrect Mutual TLS configuration should not proceed.", + "Expected Test Results": "HISP should disconnect when the certificate from the edge is bad.", + "Required / Conditional per Direct Edge Protocol Guide": "R", + "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, + "Test Data IDs": null +}, { + "name": "XDR MT Test 19", + "id": "19mu2", + "ID": "19mu2", + "desc": "Verifies the ability of the sending system to send messages with unique message-IDs. Hit 'RUN' and then the sending system will send three messages with unique identifiers to the endpoint provided. When all three messages have been completely sent, press the 'Pending Refresh' button.", + "sutEdge": true, + "sutHisp": false, + "sutRole": "sender", + "inputs": [{ + "name": "Direct From Address", + "hoverlabel":"Direct From Address: SUT (HISP) outgoing SMTP address (or) MDN.", + "key": "direct_from", + "type": "string" + }], + "Test Focus": "", + "Data Flow in Direct": "", + "Metadata Included": "N/A", + "Direct Address Block": "N/A", + "SUT: Sender/ Receiver": "Sender (Edge - SUT)", + "Test Tool: Sender / Receiver": "", + "Purpose/Description": "Test to validate that the Edge system is able to create messages with unique message id for XDR profile.", + "Conformance Test Details": "", + "Expected Test Results": "Edge system creates each message with a unique message id with no duplicates.", + "Required / Conditional per Direct Edge Protocol Guide": "R", + "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, + "Test Data IDs": null +}, { + "name": "XDR MT Test 20a", + "id": "20amu2", + "ID": "20mu2", + "desc": "Verifies the ability of the sending system to initiate an XDR transaction to ETT and to receive a positive (success) delivery status notification. The test lab will inspect the SUT logs and system to verify that the response was handled appropriately.", + "sutEdge": true, + "sutHisp": false, + "sutRole": "sender", + "criteria":"['b1-1','su1-1']", + "status": "configure", + "inputs": [{ + "name": "Direct From Address", + "hoverlabel":"Direct From Address: SUT (HISP) outgoing SMTP address (or) MDN.", + "key": "direct_from", + "type": "string" + }, { + "name": "Endpoint", + "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages", + "key": "targetEndpointTLS", + "type": "string" + }], + "expectedMDN": true, + "Test Focus": "", + "Data Flow in Direct": "", + "Metadata Included": "N/A", + "Direct Address Block": "N/A", + "SUT: Sender/ Receiver": "Sender (Edge - SUT)", + "Test Tool: Sender / Receiver": "", + "Purpose/Description": "The SUT should send the test message to Testcase20a@ttpedge.sitenv.org. This is a preconfigured address and designed to accommodate the variety of Systems that are testing with minimal user input. The users will see a message from the ETT to allow easy recognition.", + "Conformance Test Details": "", + "Expected Test Results": "Edge system receives and processes a positive (success) delivery status notification.", + "Required / Conditional per Direct Edge Protocol Guide": "R", + "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, + "Test Data IDs": null +}, { + "name": "XDR MT Test 20b", + "id": "20bmu2", + "ID": "20bmu2", + "desc": "Verifies the ability of the sending system to initiate an XDR transaction to ETT and to receive negative (failure) delivery status notification. The test lab will inspect the SUT logs and system to verify that the response was handled appropriately.", + "sutEdge": true, + "sutHisp": false, + "sutRole": "sender", + "criteria":"['b1-1','su1-1']", + "status": "configure", + "inputs": [{ + "name": "Direct From Address", + "hoverlabel":"Direct From Address: SUT (HISP) outgoing SMTP address (or) MDN.", + "key": "direct_from", + "type": "string" + }, { + "name": "Endpoint", + "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages", + "key": "targetEndpointTLS", + "type": "string" + }], + "expectedMDN": true, + "Test Focus": "", + "Data Flow in Direct": "", + "Metadata Included": "N/A", + "Direct Address Block": "N/A", + "SUT: Sender/ Receiver": "Sender (Edge - SUT)", + "Test Tool: Sender / Receiver": "", + "Purpose/Description": "The SUT should send the test message to Testcase20b@ttpedge.sitenv.org. This is a preconfigured address and designed to accommodate the variety of Systems that are testing with minimal user input. The users will see a message from the ETT to allow easy recognition.", + "Conformance Test Details": "", + "Expected Test Results": "Edge system receives and processes a negative (failure) delivery status notification..", + "Required / Conditional per Direct Edge Protocol Guide": "R", + "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, + "Test Data IDs": null +}, { + "name": "XDR MT Test 30", + "id": "30mu2", + "ID": "30mu2", + "desc": "Verify the ability of the receiving system to appropriately handle a VALID delivery notifications request, including X-DIRECT-FINAL-DESTINATION-DELIVERY data. ETT will create the Direct address block Header following section 4.1 of the XDR and XDM for Direct Messaging v1.0 and include the X-DIRECT-FINAL-DESTINATION-DELIVERY data following section 1.3 of Implementation Guide for Delivery Notification in Direct v1.0 and send it to the SUT.", + "sutEdge": false, + "criteria":"['h2-11','sc2-11']", + "sutHisp": true, + "sutRole": "receiver", + "inputs": [{ + "name": "Endpoint", + "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages.", + "key": "targetEndpointTLS", + "type": "string" + }, { + "name": "Direct To Address", + "hoverlabel":"SUT (HISP) outgoing SMTP address.", + "key": "direct_to", + "type": "string" + }, { + "name": "Outgoing (ETT --> SUT) Direct From Address", + "key": "outgoing_from", + "type": "string" + }], + "Test Focus": "XDR Receive", + "Data Flow in Direct": "HISP receives an XDR message from the Edge", + "Metadata Included": "N/A", + "Direct Address Block": "Included", + "SUT: Sender/ Receiver": "Receiver (HISP - SUT)", + "Test Tool: Sender / Receiver": "Sender (Test Tool)", + "Purpose/Description": "The Health IT Module is able to successfully process a valid message from the ETT. \n Note: When the SUT (HISP) receives the MDN (from the 'direct:to' and hence RCPT TO from the Direct communication), the MAIL FROM of the MDN will be 'direct:to' - since the 'direct:to' endpoint is sending the MAIL FROM. The ETT hardcodes 'direct:to' based on the test case, normally is not needed. \n Outgoing (ETT --> SUT) Direct From Address:Note: MDN Direct from address in the 'direct:from' address the XDR MDN. ETT will use in creating the SOAP XDR transaction for this test. In turn this is destined to become the SMTP MAIL FROM for the ensuing Direct Communication between the SUT HISP to the ETT HISP (the 'direct:to' becomes the RCPT TO).", + "Conformance Test Details": "HISP should appropriately handle a VALID delivery notification request, including X-DIRECT-FINAL-DESTINATION-DELIVERY data.", + "Expected Test Results": "The Health IT Module is able to successfully process a message from the ETT (as Sending Edge)", + "Required / Conditional per Direct Edge Protocol Guide": "R", + "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, + "Test Data IDs": null +}, { + "name": "XDR MT Test 31", + "id": "31mu2", + "ID": "31mu2", + "desc": "Verify the ability of the receiving system to appropriately handle an INVALID delivery notifications request, including X-DIRECT-FINAL-DESTINATION-DELIVERY data. ETT will create the Direct address block Header following section 4.1 of the XDR and XDM for Direct Messaging v1.0 and include INVALID X-DIRECT-FINAL-DESTINATION-DELIVERY data following section 1.3 of Implementation Guide for Delivery Notification in Direct v1.0 and send it to the SUT.", + "sutEdge": false, + "criteria":"['h2-11','sc2-11']", + "sutHisp": true, + "sutRole": "receiver", + "inputs": [{ + "name": "Endpoint", + "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages.", + "key": "targetEndpointTLS", + "type": "string" + }, { + "name": "Outgoing (ETT --> SUT) Direct From Address", + "hoverlabel":"SUT (HISP) outgoing SMTP address.", + "key": "outgoing_from", + "type": "string" + }], + "Test Focus": "XDR Receive", + "Data Flow in Direct": "HISP receives an XDR message from the Edge", + "Metadata Included": "N/A", + "Direct Address Block": "Included", + "SUT: Sender/ Receiver": "Receiver (HISP - SUT)", + "Test Tool: Sender / Receiver": "Sender (Test Tool)", + "Purpose/Description": "The Health IT Module is able to successfully process an invalid message from the ETT, message contains a valid address block and invalid destination.\nNote: When the SUT (HISP) receives the MDN (from the 'direct:to' and hence RCPT TO from the Direct communication), the MAIL FROM of the MDN will be 'direct:to' - since the 'direct:to' endpoint is sending the MAIL FROM. The ETT hardcodes 'direct:to' based on the test case, normally is not needed.", + "Conformance Test Details": "HISP should appropriately handle an INVALID delivery notification request, including X-DIRECT-FINAL-DESTINATION-DELIVERY data.", + "Expected Test Results": "The Health IT Module is able to process the header handle an invalid delivery notification request", + "Required / Conditional per Direct Edge Protocol Guide": "R", + "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, + "Test Data IDs": null +}, { + "name": "XDR MT Test 32", + "id": "32mu2", + "ID": "32mu2", + "desc": "Verify the ability of the SUT to appropriately respond to a delivery to a non-existent address. ETT will send a message via XDR to the SUT. If the SUT's final response is delivered synchronously, that message will be saved in the logs (click 'Logs'). If the SUT's final response is delivered asynchronously: 1) wait until the SUT's message has been sent and the ETT's response has been received, 2) click the Pending Refresh button to continue, 3) the logs for the asynchronous communication will then be available. The proctor will read the logs for the synchronous communication or the asynchronous communication for an appropriate response. This test is part of the Implementation Guide for Delivery Notification test suite.", + "sutEdge": false, + "criteria":"['h2-11']", + "sutHisp": true, + "sutRole": "receiver", + "status": "configure", + "inputs": [{ + "name": "Endpoint", + "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages.", + "key": "targetEndpointTLS", + "type": "string" + }, { + "name": "Direct From Address", + "hoverlabel":"SUT (HISP) outgoing SMTP address.", + "key": "direct_from", + "type": "string" + }, { + "name": "Outgoing (ETT --> SUT) Direct From Address", + "key": "outgoing_from", + "type": "string" + }], + "Test Focus": "XDR Receive", + "Data Flow in Direct": "HISP receives an XDR message from the Edge", + "Metadata Included": "N/A", + "Direct Address Block": "Included", + "SUT: Sender/ Receiver": "Receiver (HISP - SUT)", + "Test Tool: Sender / Receiver": "Sender (Test Tool)", + "Purpose/Description": "The Health IT Module is able to successfully process a message from the ETT (as Sending Edge) that includes an invalid (non-existent) address. \n Note: When the SUT (HISP) receives the MDN (from the 'direct:to' and hence RCPT TO from the Direct communication), the MAIL FROM of the MDN will be 'direct:to' - since the 'direct:to' endpoint is sending the MAIL FROM. The ETT hardcodes 'direct:to' based on the test case, normally is not needed. \n Outgoing (ETT --> SUT) Direct From Address:Note: MDN Direct from address in the 'direct:from' address the XDR MDN. ETT will use in creating the SOAP XDR transaction for this test. In turn this is destined to become the SMTP MAIL FROM for the ensuing Direct Communication between the SUT HISP to the ETT HISP (the 'direct:to' becomes the RCPT TO).", + "Conformance Test Details": "HISP should appropriately handle an INVALID address and send the negative delivery notification back to the EDGE.", + "Expected Test Results": "The Health IT Module sends a negative delivery status notification message to the ETT (as Sending Edge) using XDR profile", + "Required / Conditional per Direct Edge Protocol Guide": "R", + "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, + "Test Data IDs": null +}, { + "name": "XDR MT Test 33", + "id": "33mu2", + "ID": "33mu2", + "desc": "Verify the ability of the SUT to appropriately respond to a delivery to an untrusted HISP. ETT will send a message via XDR to the SUT. If the SUT's final response is delivered synchronously, that message will be saved in the logs (click 'Logs'). If the SUT's final response is delivered asynchronously: 1) wait until the SUT's message has been sent and the ETT's response has been received, 2) click the Pending Refresh button to continue, 3) the logs for the asynchronous communication will then be available. The proctor will read the logs for the synchronous communication or the asynchronous communication for an appropriate response. This test is part of the Implementation Guide for Delivery Notification test suite.", + "sutEdge": false, + "criteria":"['h2-11']", + "sutHisp": true, + "sutRole": "receiver", + "status": "configure", + "inputs": [{ + "name": "Endpoint", + "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages.", + "key": "targetEndpointTLS", + "type": "string" + }, { + "name": "Direct From Address", + "hoverlabel":"SUT (HISP) outgoing SMTP address.", + "key": "direct_from", + "type": "string" + }, { + "name": "Outgoing (ETT --> SUT) Direct From Address", + "key": "outgoing_from", + "type": "string" + }], + "Test Focus": "XDR Receive", + "Data Flow in Direct": "HISP receives an XDR message from the Edge", + "Metadata Included": "N/A", + "Direct Address Block": "Included", + "SUT: Sender/ Receiver": "Receiver (HISP - SUT)", + "Test Tool: Sender / Receiver": "Sender (Test Tool)", + "Purpose/Description": "The Health IT Module is able to successfully process a message from the ETT (as Sending Edge) to a valid address. The ETT (as Destination HISP) is not trusted. \n Note: When the SUT (HISP) receives the MDN (from the 'direct:to' and hence RCPT TO from the Direct communication), the MAIL FROM of the MDN will be 'direct:to' - since the 'direct:to' endpoint is sending the MAIL FROM. The ETT hardcodes 'direct:to' based on the test case, normally is not needed. \n Outgoing (ETT --> SUT) Direct From Address:Note: MDN Direct from address in the 'direct:from' address the XDR MDN. ETT will use in creating the SOAP XDR transaction for this test. In turn this is destined to become the SMTP MAIL FROM for the ensuing Direct Communication between the SUT HISP to the ETT HISP (the 'direct:to' becomes the RCPT TO).", + "Conformance Test Details": "XDR Message Checklist + XDS Metadata Checklist for Limited Metadata Document Source + Direct XDR Checklist", + "Expected Test Results": "The Health IT Module sends a negative delivery status notification message to the ETT (as Sending Edge) using XDR profile", + "Required / Conditional per Direct Edge Protocol Guide": "R", + "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, + "Test Data IDs": null +}, { + "name": "XDR MT Test 34", + "id": "34mu2", + "ID": "34mu2", + "desc": "Verify the ability of the SUT to appropriately respond to a delivery to a HISP which does not have a published certificate. ETT will send a message via XDR to the SUT. If the SUT's final response is delivered synchronously, that message will be saved in the logs (click 'Logs'). If the SUT's final response is delivered asynchronously: 1) wait until the SUT's message has been sent and the ETT's response has been received, 2) click the Pending Refresh button to continue, 3) the logs for the asynchronous communication will then be available. The proctor will read the logs for the synchronous communication or the asynchronous communication for an appropriate response. This test is part of the Implementation Guide for Delivery Notification test suite.", + "sutEdge": false, + "criteria":"['h2-11']", + "sutHisp": true, + "sutRole": "receiver", + "status": "configure", + "inputs": [{ + "name": "Endpoint", + "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages.", + "key": "targetEndpointTLS", + "type": "string" + }, { + "name": "Direct From Address", + "hoverlabel":"SUT (HISP) outgoing SMTP address.", + "key": "direct_from", + "type": "string" + }, { + "name": "Outgoing (ETT --> SUT) Direct From Address", + "key": "outgoing_from", + "type": "string" + }], + "Test Focus": "XDR Receive", + "Data Flow in Direct": "HISP receives an XDR message from the Edge", + "Metadata Included": "N/A", + "Direct Address Block": "Included", + "SUT: Sender/ Receiver": "Receiver (HISP - SUT)", + "Test Tool: Sender / Receiver": "Sender (Test Tool)", + "Purpose/Description": "The Health IT Module is able to successfully process a message from the ETT (as Sending Edge) to a valid address. The ETT (as Destination HISP) does not have published certificates, and security and trust processing fails. \n Note: When the SUT (HISP) receives the MDN (from the 'direct:to' and hence RCPT TO from the Direct communication), the MAIL FROM of the MDN will be 'direct:to' - since the 'direct:to' endpoint is sending the MAIL FROM. The ETT hardcodes 'direct:to' based on the test case, normally is not needed. \n Outgoing (ETT --> SUT) Direct From Address:Note: MDN Direct from address in the 'direct:from' address the XDR MDN. ETT will use in creating the SOAP XDR transaction for this test. In turn this is destined to become the SMTP MAIL FROM for the ensuing Direct Communication between the SUT HISP to the ETT HISP (the 'direct:to' becomes the RCPT TO).", + "Conformance Test Details": "The HISP sends a negative delivery status notification message back to the EDGE.", + "Expected Test Results": "The Health IT Module sends a negative delivery status notification message to the ETT (as Sending Edge) using XDR profile", + "Required / Conditional per Direct Edge Protocol Guide": "R", + "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, + "Test Data IDs": null +}, { + "name": "XDR MT Test 35", + "id": "35mu2", + "ID": "35mu2", + "desc": "Verify the ability of the SUT to appropriately respond in the event of a lack of a Processed MDN. ETT will send a message via XDR to the SUT. If the SUT's final response is delivered synchronously, that message will be saved in the logs (click 'Logs'). If the SUT's final response is delivered asynchronously: 1) wait until the SUT's message has been sent and the ETT's response has been received, 2) click the Pending Refresh button to continue, 3) the logs for the asynchronous communication will then be available. The proctor will read the logs for the synchronous communication or the asynchronous communication for an appropriate response. This test is part of the Implementation Guide for Delivery Notification test suite.", + "sutEdge": false, + "criteria":"['h2-11']", + "sutHisp": true, + "sutRole": "receiver", + "status": "configure", + "inputs": [{ + "name": "Endpoint", + "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages.", + "key": "targetEndpointTLS", + "type": "string" + }, { + "name": "Direct From Address", + "hoverlabel":"SUT (HISP) outgoing SMTP address.", + "key": "direct_from", + "type": "string" + }, { + "name": "Outgoing (ETT --> SUT) Direct From Address", + "key": "outgoing_from", + "type": "string" + }], + "Test Focus": "XDR Receive", + "Data Flow in Direct": "HISP receives an XDR message from the Edge", + "Metadata Included": "N/A", + "Direct Address Block": "Included", + "SUT: Sender/ Receiver": "Receiver (HISP - SUT)", + "Test Tool: Sender / Receiver": "Sender (Test Tool)", + "Purpose/Description": "The Health IT Module is able to successfully process a message from the ETT (as Sending Edge) to a valid address. The ETT (as Destination HISP) does not respond with a Processed MDN. \n Note: When the SUT (HISP) receives the MDN (from the 'direct:to' and hence RCPT TO from the Direct communication), the MAIL FROM of the MDN will be 'direct:to' - since the 'direct:to' endpoint is sending the MAIL FROM. The ETT hardcodes 'direct:to' based on the test case, normally is not needed. \n Outgoing (ETT --> SUT) Direct From Address:Note: MDN Direct from address in the 'direct:from' address the XDR MDN. ETT will use in creating the SOAP XDR transaction for this test. In turn this is destined to become the SMTP MAIL FROM for the ensuing Direct Communication between the SUT HISP to the ETT HISP (the 'direct:to' becomes the RCPT TO).", + "Conformance Test Details": "The HISP sends a negative delivery status notification message back to the EDGE.", + "Expected Test Results": "The Health IT Module sends a negative delivery status notification message to the ETT (as Sending Edge) using XDR profile", + "Required / Conditional per Direct Edge Protocol Guide": "R", + "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, + "Test Data IDs": null +}, { + "name": "XDR MT Test 36", + "id": "36mu2", + "ID": "36mu2", + "desc": "Verify the ability of the SUT to appropriately respond in the event of a lack of a Dispatched MDN. ETT will send a message via XDR to the SUT. If the SUT's final response is delivered synchronously, that message will be saved in the logs (click 'Logs'). If the SUT's final response is delivered asynchronously: 1) wait until the SUT's message has been sent and the ETT's response has been received, 2) click the Pending Refresh button to continue, 3) the logs for the asynchronous communication will then be available. The proctor will read the logs for the synchronous communication or the asynchronous communication for an appropriate response. This test is part of the Implementation Guide for Delivery Notification test suite.", + "sutEdge": false, + "criteria":"['h2-11']", + "sutHisp": true, + "sutRole": "receiver", + "status": "configure", + "inputs": [{ + "name": "Endpoint", + "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages.", + "key": "targetEndpointTLS", + "type": "string" + }, { + "name": "Direct From Address", + "hoverlabel":"SUT (HISP) outgoing SMTP address.", + "key": "direct_from", + "type": "string" + }, { + "name": "Outgoing (ETT --> SUT) Direct From Address", + "key": "outgoing_from", + "type": "string" + }], + "Test Focus": "XDR Receive", + "Data Flow in Direct": "HISP receives an XDR message from the Edge", + "Metadata Included": "N/A", + "Direct Address Block": "Included", + "SUT: Sender/ Receiver": "Receiver (HISP - SUT)", + "Test Tool: Sender / Receiver": "Sender (Test Tool)", + "Purpose/Description": "The Health IT Module is able to successfully process a message from the ETT (as Sending Edge) to a valid address. The ETT (as Destination HISP) responds with a Processed MDN, but no Dispatched MDN. \n Note: When the SUT (HISP) receives the MDN (from the 'direct:to' and hence RCPT TO from the Direct communication), the MAIL FROM of the MDN will be 'direct:to' - since the 'direct:to' endpoint is sending the MAIL FROM. The ETT hardcodes 'direct:to' based on the test case, normally is not needed. \n Outgoing (ETT --> SUT) Direct From Address:Note: MDN Direct from address in the 'direct:from' address the XDR MDN. ETT will use in creating the SOAP XDR transaction for this test. In turn this is destined to become the SMTP MAIL FROM for the ensuing Direct Communication between the SUT HISP to the ETT HISP (the 'direct:to' becomes the RCPT TO).", + "Conformance Test Details": "The HISP sends a negative delivery status notification message back to the EDGE.", + "Expected Test Results": "The Health IT Module sends a negative delivery status notification message to the ETT (as Sending Edge) using XDR profile", + "Required / Conditional per Direct Edge Protocol Guide": "R", + "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, + "Test Data IDs": null +}, { + "name": "XDR MT Test 37", + "id": "37mu2", + "ID": "37mu2", + "desc": "Verify the ability of the SUT to appropriately respond in the event of a message timeout failure. ETT will send a message via XDR to the SUT. If the SUT's final response is delivered synchronously, that message will be saved in the logs (click 'Logs'). If the SUT's final response is delivered asynchronously: 1) wait until the SUT's message has been sent and the ETT's response has been received, 2) click the Pending Refresh button to continue, 3) the logs for the asynchronous communication will then be available. The proctor will read the logs for the synchronous communication or the asynchronous communication for an appropriate response. This test is part of the Implementation Guide for Delivery Notification test suite.", + "sutEdge": false, + "criteria":"['h2-11']", + "sutHisp": true, + "status": "configure", + "sutRole": "receiver", + "inputs": [{ + "name": "Endpoint", + "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages.", + "key": "targetEndpointTLS", + "type": "string" + }, { + "name": "Direct From Address", + "hoverlabel":"SUT (HISP) outgoing SMTP address.", + "key": "direct_from", + "type": "string" + }, { + "name": "Outgoing (ETT --> SUT) Direct From Address", + "key": "outgoing_from", + "type": "string" + }], + "Test Focus": "XDR Receive", + "Data Flow in Direct": "HISP receives an XDR message from the Edge", + "Metadata Included": "N/A", + "Direct Address Block": "Included", + "SUT: Sender/ Receiver": "Receiver (HISP - SUT)", + "Test Tool: Sender / Receiver": "Sender (Test Tool)", + "Purpose/Description": "The Health IT Module is able to successfully process a message from the ETT (as Sending Edge) to a valid address. The ETT (as Destination HISP) responds with a Processed MDN, but the Dispatched MDN is received after the expected wait time has exceeded. \n Note: When the SUT (HISP) receives the MDN (from the 'direct:to' and hence RCPT TO from the Direct communication), the MAIL FROM of the MDN will be 'direct:to' - since the 'direct:to' endpoint is sending the MAIL FROM. The ETT hardcodes 'direct:to' based on the test case, normally is not needed. \n Outgoing (ETT --> SUT) Direct From Address:Note: MDN Direct from address in the 'direct:from' address the XDR MDN. ETT will use in creating the SOAP XDR transaction for this test. In turn this is destined to become the SMTP MAIL FROM for the ensuing Direct Communication between the SUT HISP to the ETT HISP (the 'direct:to' becomes the RCPT TO).", + "Conformance Test Details": "The HISP sends a negative delivery status notification message back to the EDGE.", + "Expected Test Results": "The Health IT Module sends a negative delivery status notification message to the ETT (as Sending Edge) using XDR profile", + "Required / Conditional per Direct Edge Protocol Guide": "R", + "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, + "Test Data IDs": null +}, { + "name": "XDR MT Test 38", + "id": "38mu2", + "ID": "38mu2", + "desc": "Verify the ability of the SUT to appropriately respond in the event of positive delivery notification. ETT will send a message via XDR to the SUT. If the SUT's final response is delivered synchronously, that message will be saved in the logs (click 'Logs'). If the SUT's final response is delivered asynchronously: 1) wait until the SUT's message has been sent and the ETT's response has been received, 2) click the Pending Refresh button to continue, 3) the logs for the asynchronous communication will then be available. The proctor will read the logs for the synchronous communication or the asynchronous communication for an appropriate response. This test is part of the Implementation Guide for Delivery Notification test suite.", + "sutEdge": false, + "criteria":"['h2-11']", + "sutHisp": true, + "sutRole": "receiver", + "status": "configure", + "inputs": [{ + "name": "Endpoint", + "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages.", + "key": "targetEndpointTLS", + "type": "string" + }, { + "name": "Direct From Address", + "hoverlabel":"SUT (HISP) outgoing SMTP address.", + "key": "direct_from", + "type": "string" + }, { + "name": "Outgoing (ETT --> SUT) Direct From Address", + "key": "outgoing_from", + "type": "string" + }], + "Test Focus": "XDR Receive", + "Data Flow in Direct": "HISP receives an XDR message from the Edge", + "Metadata Included": "N/A", + "Direct Address Block": "Included", + "SUT: Sender/ Receiver": "Receiver (HISP - SUT)", + "Test Tool: Sender / Receiver": "Sender (Test Tool)", + "Purpose/Description": "The Health IT Module is able to successfully process a message from the ETT (as Sending Edge) to a valid address. The ETT (as Destination HISP) responds with a Processed MDN and Dispatched MDN within the expected time period. \n Note: When the SUT (HISP) receives the MDN (from the 'direct:to' and hence RCPT TO from the Direct communication), the MAIL FROM of the MDN will be 'direct:to' - since the 'direct:to' endpoint is sending the MAIL FROM. The ETT hardcodes 'direct:to' based on the test case, normally is not needed. \n Outgoing (ETT --> SUT) Direct From Address:Note: MDN Direct from address in the 'direct:from' address the XDR MDN. ETT will use in creating the SOAP XDR transaction for this test. In turn this is destined to become the SMTP MAIL FROM for the ensuing Direct Communication between the SUT HISP to the ETT HISP (the 'direct:to' becomes the RCPT TO).", + "Conformance Test Details": "The HISP sends only one positive delivery status notification message back to the EDGE.", + "Expected Test Results": "The Health IT Module sends a positive delivery status notification message to the ETT (as Sending Edge) using XDR profile", + "Required / Conditional per Direct Edge Protocol Guide": "R", + "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, + "Test Data IDs": null +}, { + "name": "XDR MT Test 43", + "id": "43mu2", + "ID": "43mu2", + "desc": "Verify the ability of the SUT to appropriately provide a delivery failure message if it is unable to deliver the message to the destination. ETT will send a message via XDR to the SUT. If the SUT's final response is delivered synchronously, that message will be saved in the logs (click 'Logs'). If the SUT's final response is delivered asynchronously: 1) wait until the SUT's message has been sent and the ETT's response has been received, 2) click the Pending Refresh button to continue, 3) the logs for the asynchronous communication will then be available. The proctor will read the logs for the synchronous communication or the asynchronous communication for an appropriate response.", + "sutEdge": false, + "criteria":"['h2-12']", + "sutHisp": true, + "sutRole": "receiver", + "status": "configure", + "inputs": [{ + "name": "Endpoint", + "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages.", + "key": "targetEndpointTLS", + "type": "string" + }, { + "name": "Direct From Address", + "hoverlabel":"SUT (HISP) outgoing SMTP address.", + "key": "direct_from", + "type": "string" + }, { + "name": "Outgoing (ETT --> SUT) Direct From Address", + "key": "outgoing_from", + "type": "string" + }], + "Test Focus": "XDR Receive", + "Data Flow in Direct": "HISP receives an XDR message from the Edge", + "Metadata Included": "N/A", + "Direct Address Block": "Included", + "SUT: Sender/ Receiver": "Receiver (HISP - SUT)", + "Test Tool: Sender / Receiver": "Sender (Test Tool)", + "Purpose/Description": "The Health IT Module receives a message from the ETT (as Sending HISP) and is unable to deliver the message to its final destination (ETT as Destination Edge). \n Note: When the SUT (HISP) receives the MDN (from the 'direct:to' and hence RCPT TO from the Direct communication), the MAIL FROM of the MDN will be 'direct:to' - since the 'direct:to' endpoint is sending the MAIL FROM. The ETT hardcodes 'direct:to' based on the test case, normally is not needed. \n Outgoing (ETT --> SUT) Direct From Address:Note: MDN Direct from address in the 'direct:from' address the XDR MDN. ETT will use in creating the SOAP XDR transaction for this test. In turn this is destined to become the SMTP MAIL FROM for the ensuing Direct Communication between the SUT HISP to the ETT HISP (the 'direct:to' becomes the RCPT TO).\n Expected outcome: '...Final-Recipient: rfc822; processedfailure@ttpedge.sitenv.org, Original-Recipient: rfc822; processedfailure@ttpedge.sitenv.org, Original-Message-ID: <681247680.299.1498573532567.JavaMail.root@ip-172-31-46-193>, Disposition: automatic-action/MDN-sent-automatically;failure, Failure: Failure MDN'", + "Conformance Test Details": "The Health IT Module delivers a Processed MDN to the ETT (as Sending HISP) followed by a delivery failure message to the ETT (as Sending HISP) after the wait time has exceeded", + "Expected Test Results": "The Health IT Module sends a negative delivery status notification message to the ETT (as Sending Edge) using XDR profile", + "Required / Conditional per Direct Edge Protocol Guide": "R", + "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, + "Test Data IDs": null +}, { + "name": "XDR MT Test 44", + "id": "44mu2", + "ID": "44mu2", + "desc": "Verify the ability of the receiving system to appropriately respond in the event of a message timeout failure. ETT will send a message via XDR to the SUT. If the SUT's final response is delivered synchronously, that message will be saved in the logs (click 'Logs'). If the SUT's final response is delivered asynchronously: 1) wait until the SUT's message has been sent and the ETT's response has been received, 2) click the Pending Refresh button to continue, 3) the logs for the asynchronous communication will then be available. The proctor will read the logs for the synchronous communication or the asynchronous communication for an appropriate response.", + "sutEdge": false, + "criteria":"['h2-12']", + "sutHisp": true, + "sutRole": "receiver", + "status": "configure", + "inputs": [{ + "name": "Endpoint", + "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages.", + "key": "targetEndpointTLS", + "type": "string" + }, {"name": "Timeout", + "hoverlabel":"Timeout", + "key": "timeout", + "type": "string" + }, { + "name": "Direct From Address", + "hoverlabel":"SUT (HISP) outgoing SMTP address.", + "key": "direct_from", + "type": "string" + }, { + "name": "Outgoing (ETT --> SUT) Direct From Address", + "key": "outgoing_from", + "type": "string" + }], + "Test Focus": "XDR Receive", + "Data Flow in Direct": "HISP receives an XDR message from the Edge", + "Metadata Included": "N/A", + "Direct Address Block": "Included", + "SUT: Sender/ Receiver": "Receiver (HISP - SUT)", + "Test Tool: Sender / Receiver": "Sender (Test Tool)", + "Purpose/Description": "The Health IT Module receives a message from the ETT (as Sending HISP) and is unable to deliver the message to its final destination (ETT as Destination Edge). \n Note: When the SUT (HISP) receives the MDN (from the 'direct:to' and hence RCPT TO from the Direct communication), the MAIL FROM of the MDN will be 'direct:to' - since the 'direct:to' endpoint is sending the MAIL FROM. The ETT hardcodes 'direct:to' based on the test case, normally is not needed. \n Outgoing (ETT --> SUT) Direct From Address:Note: MDN Direct from address in the 'direct:from' address the XDR MDN. ETT will use in creating the SOAP XDR transaction for this test. In turn this is destined to become the SMTP MAIL FROM for the ensuing Direct Communication between the SUT HISP to the ETT HISP (the 'direct:to' becomes the RCPT TO).\n The Timeout parameter is amount of time the SUT will wait before sending a Failed MDN, this parameter should be the SUT default plus 5 minutes (N + 5 minutes). If a value is not defined, the test default is 65 minutes \n Expected outcome: \n--uuid:184c5b14-5eb3-4192-b5a4-3ca7e0758305 Content-Type: message/delivery-status; name=status.dat Content-Transfer-Encoding: binary Content-ID: <67bf0371-bf9a-4d39-b2b1-2a0d94ac3b41-24@urn:ihe:iti:xds-b:2007> \n Reporting-MTA: dns;Security Agent X-Original-Message-ID: <985848505.23.1500407627229.JavaMail.root@ip-172-31-46-193> \n Action: failed Final-Recipient: rfc822;delaydispatched5@ttpedgetest.sitenv.org Status: 5.0.0", + "Conformance Test Details": "The Health IT Module delivers a Processed MDN to the ETT (as Sending HISP) followed by a delivery failure message to the ETT (as Sending HISP) due to the bad address", + "Expected Test Results": "The Health IT Module sends a negative delivery status notification message to the ETT (as Sending Edge) using XDR profile", + "Required / Conditional per Direct Edge Protocol Guide": "R", + "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, + "Test Data IDs": null +}, { + "name": "XDR MT Test 48", + "id": "48mu2", + "ID": "48mu2", + "desc": "Verifies the ability of the sending system to send messages with unique message-IDs. Hit 'RUN' and then the sending system will send three messages with unique identifiers to the endpoint provided. When all three messages have been completely sent, press the 'Pending Refresh' button. (Message Tracking Using \"Implementation Guide for Delivery Notification\")", + "sutEdge": true, + "sutHisp": false, + "sutRole": "sender", + "inputs": [{ + "name": "Direct From Address", + "hoverlabel":"Direct From Address: SUT (HISP) outgoing SMTP address (or) MDN.", + "key": "direct_from", + "type": "string" + }], + "Test Focus": "", + "Data Flow in Direct": "", + "Metadata Included": "N/A", + "Direct Address Block": "N/A", + "SUT: Sender/ Receiver": "Sender (Edge - SUT)", + "Test Tool: Sender / Receiver": "", + "Purpose/Description": "Test to validate that the Edge system is able to create messages with unique message id.", + "Conformance Test Details": "", + "Expected Test Results": "Edge system creates each message with a unique message id with no duplicates.", + "Required / Conditional per Direct Edge Protocol Guide": "R", + "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, + "Test Data IDs": null +}, { + "name": "XDR MT Test 49", + "id": "49mu2", + "ID": "49mu2", + "desc": "Verify the ability of the sending system to correctly use a direct address block per the section 4.0 XDR and XDM Messaging for Direct v1.0 and per section 1.3 of the \"Implementation Guide for Delivery Notification for Direct v1.0\". The SOAP header will be inspected for the appropriate content.", + "sutEdge": true, + "sutHisp": false, + "sutRole": "sender", + "criteria":"['b1-1']", + "inputs": [{ + "name": "Direct From Address", + "hoverlabel":"Direct From Address: SUT (HISP) outgoing SMTP address (or) MDN.", + "key": "direct_from", + "type": "string" + }], + "Test Focus": "", + "Data Flow in Direct": "", + "Metadata Included": "N/A", + "Direct Address Block": "N/A", + "SUT: Sender/ Receiver": "Sender (Edge - SUT)", + "Test Tool: Sender / Receiver": "", + "Purpose/Description": "Test to validate that the Edge system is able to generate the direct address block header including delivery notifications element.", + "Conformance Test Details": "", + "Expected Test Results": "Edge system creates the direct address block including the disposition notifications header.", + "Required / Conditional per Direct Edge Protocol Guide": "R", + "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, + "Test Data IDs": null +}, { + "name": "XDR MT Test 50a", + "id": "50amu2", + "ID": "50amu2", + "desc": " Verify the ability of the sending system to correctly handle the case of sending XDR messages to valid recipients. The SUT is expected to appropriately track success messages.", + "sutEdge": true, + "sutHisp": false, + "sutRole": "sender", + "status": "configure", + "inputs": [{ + "name": "Direct From Address", + "hoverlabel":"Direct From Address: SUT (HISP) outgoing SMTP address (or) MDN.", + "key": "direct_from", + "type": "string" + }, { + "name": "Endpoint", + "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages", + "key": "targetEndpointTLS", + "type": "string" + }], + "expectedMDN": true, + "Test Focus": "", + "Data Flow in Direct": "", + "Metadata Included": "N/A", + "Direct Address Block": "N/A", + "SUT: Sender/ Receiver": "Sender (Edge - SUT)", + "Test Tool: Sender / Receiver": "", + "Purpose/Description": "The SUT should send the test message to Testcase50a@ttpedge.sitenv.org. Verify the ability of the sending system to correctly handle the case of sending XDR messages to valid recipients.", + "Conformance Test Details": "", + "Expected Test Results": "Edge system receives and processes a positive (success) delivery status notification.", + "Required / Conditional per Direct Edge Protocol Guide": "R", + "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, + "Test Data IDs": null +}, { + "name": "XDR MT Test 50b", + "id": "50bmu2", + "ID": "50bmu2", + "desc": " Verify the ability of the sending system to correctly handle the case of sending XDR messages to invalid recipients. The SUT is expected to appropriately track failure messages. Failure messages to invalid recipients have to be processed/tracked appropriately by the edge system and has to be made available for testing purposes.", + "sutEdge": true, + "sutHisp": false, + "sutRole": "sender", + "status": "configure", + "inputs": [{ + "name": "Direct From Address", + "hoverlabel":"Direct From Address: SUT (HISP) outgoing SMTP address (or) MDN.", + "key": "direct_from", + "type": "string" + }, { + "name": "Endpoint", + "hoverlabel":"Receiving endpoint of the SUT for XDR SOAP messages", + "key": "targetEndpointTLS", + "type": "string" + }], + "expectedMDN": true, + "Test Focus": "", + "Data Flow in Direct": "", + "Metadata Included": "N/A", + "Direct Address Block": "N/A", + "SUT: Sender/ Receiver": "Sender (Edge - SUT)", + "Test Tool: Sender / Receiver": "", + "Purpose/Description": "The SUT should send the test message to Testcase50b@ttpedge.sitenv.org. Verify the ability of the sending system to correctly handle the case of sending XDR messages to invalid recipients.", + "Conformance Test Details": "", + "Expected Test Results": "Edge system successfully processes the invalid MDN received for tracking. The Edge SUT should display the event in the log for tracking.", + "Required / Conditional per Direct Edge Protocol Guide": "R", + "Direct Edge Protocol Guide 1.1 RTM Reference": 1.1, + "Test Data IDs": null }] \ No newline at end of file diff --git a/webapp/src/main/resources/static/index.html b/webapp/src/main/resources/static/index.html index afa92b1e7..1c2d48535 100644 --- a/webapp/src/main/resources/static/index.html +++ b/webapp/src/main/resources/static/index.html @@ -1,47 +1,47 @@ - - - - - - - - Edge Testing Tool - - - - - - - - - - - - - - - - - - - - - - -
    -
    - - - - - - - - + + + + + + + + Edge Testing Tool + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + diff --git a/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/TestSamlValidate.groovy b/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/TestSamlValidate.groovy deleted file mode 100644 index 13bbfd631..000000000 --- a/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/TestSamlValidate.groovy +++ /dev/null @@ -1,19 +0,0 @@ -package gov.nist.healthcare.ttt.webapp; - -import gov.nist.hit.xdrsamlhelper.SamlHeaderApi.SamlHeaderException; -import gov.nist.hit.xdrsamlhelper.SamlHeaderApiImpl; - -public class TestSamlValidate { - - public static void main(String[] args) { - try { - SamlHeaderApiImpl.main(null); - // test1(); - } catch (SamlHeaderException e) { - // TODO Auto-generated catch block; - e.printStackTrace(); - } - - } - -} diff --git a/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/TestUtils.groovy b/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/TestUtils.groovy deleted file mode 100644 index b66ecb13b..000000000 --- a/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/TestUtils.groovy +++ /dev/null @@ -1,144 +0,0 @@ -package gov.nist.healthcare.ttt.webapp - -import org.springframework.http.MediaType -import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders -import sun.security.acl.PrincipalImpl - -/** - * - * Templates for rest call and associated data - * - * Created by gerardin on 2/5/15. - */ -class TestUtils { - - /* - GUI Mock calls - */ - - static MockHttpServletRequestBuilder run(String tcId, String userId, String testCaseConfig) { - MockMvcRequestBuilders.post("/api/xdr/tc/$tcId/run") - .accept(MediaType.ALL) - .content(testCaseConfig) - .contentType(MediaType.APPLICATION_JSON) - .principal(new PrincipalImpl(userId)) - } - - static MockHttpServletRequestBuilder status(tcId, userId) { - MockMvcRequestBuilders.get("/api/xdr/tc/$tcId/status") - .accept(MediaType.ALL) - .contentType(MediaType.APPLICATION_JSON) - .principal(new PrincipalImpl(userId)) - } - - static MockHttpServletRequestBuilder configure(String tcId) { - MockMvcRequestBuilders.get("/api/xdr/tc/$tcId/configure") - .accept(MediaType.ALL) - .contentType(MediaType.APPLICATION_JSON) - } - - /* - Toolkit mock calls - */ - static MockHttpServletRequestBuilder reportNotification(String toolkitReport) { - MockMvcRequestBuilders.post("/api/xdrNotification") - .accept(MediaType.ALL) - .content(toolkitReport) - .contentType(MediaType.APPLICATION_XML) - } - - /* - Template for toolkit data - */ - static def buildReportTemplate(String simId,String messageID, String fromAddress, String toAddress) { - """ - - -
    content-type: multipart/related; boundary="MIMEBoundary_1293f28762856bdafcf446f2a6f4a61d95a95d0ad1177f20"; type="application/xop+xml"; start="<0.0293f28762856bdafcf446f2a6f4a61d95a95d0ad1177f20@apache.org>"; start-info="application/soap+xml"; action="urn:ihe:iti:2007:ProvideAndRegisterDocumentSet-b" - user-agent: TempXDRSender - host: edge.nist.gov:8080 - Content-Length: 123393 - -
    - - --MIMEBoundary_1293f28762856bdafcf446f2a6f4a61d95a95d0ad1177f20 - Content-Type: application/xop+xml; charset=UTF-8; type="application/soap+xml" - Content-Transfer-Encoding: binary - Content-ID: <0.0293f28762856bdafcf446f2a6f4a61d95a95d0ad1177f20@apache.org> - - <s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" - xmlns:a="http://www.w3.org/2005/08/addressing"> - <soapenv:Header xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"> - <direct:metadata-level xmlns:direct="urn:direct:addressing">XDS</direct:metadata-level> - <direct:addressBlock xmlns:direct="urn:direct:addressing" - soapenv:role="urn:direct:addressing:destination" - soapenv:relay="true"> - <direct:from>$fromAddress</direct:from> - <direct:to>$toAddress</direct:to> - </direct:addressBlock> - <wsa:To soapenv:mustUnderstand="true" xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope" - xmlns:wsa="http://www.w3.org/2005/08/addressing" - >http://transport-testing.nist.gov:12080/ttt/sim/f8488a75-fc7d-4d70-992b-e5b2c852b412/rep/prb</wsa:To> - <wsa:MessageID soapenv:mustUnderstand="true" - xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope" - xmlns:wsa="http://www.w3.org/2005/08/addressing" - >$messageID</wsa:MessageID> - <wsa:Action soapenv:mustUnderstand="true" - xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope" - xmlns:wsa="http://www.w3.org/2005/08/addressing" - >urn:ihe:iti:2007:ProvideAndRegisterDocumentSet-b</wsa:Action> - </soapenv:Header> - <soapenv:Body xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"> - </soapenv:Body> - </s:Envelope> - - --MIMEBoundary_1293f28762856bdafcf446f2a6f4a61d95a95d0ad1177f20 - Content-Type: application/octet-stream - Content-Transfer-Encoding: binary - Content-ID: <1.3293f28762856bdafcf446f2a6f4a61d95a95d0ad1177f20@apache.org> - - content - - --MIMEBoundary_1293f28762856bdafcf446f2a6f4a61d95a95d0ad1177f20-- - -
    - -
    - content-type: multipart/related; boundary=MIMEBoundary112233445566778899; type="application/xop+xml"; start="<doc0@ihexds.nist.gov>"; start-info="application/soap+xml" -
    - - --MIMEBoundary112233445566778899 - Content-Type: application/xop+xml; charset=UTF-8; type="application/soap+xml" - Content-Transfer-Encoding: binary - Content-ID: <doc0@ihexds.nist.gov> - - - <S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope"> - <S:Header> - <wsa:Action s:mustUnderstand="1" xmlns:s="http://www.w3.org/2003/05/soap-envelope" - xmlns:wsa="http://www.w3.org/2005/08/addressing">urn:ihe:iti:2007:ProvideAndRegisterDocumentSet-bResponse</wsa:Action> - <wsa:RelatesTo xmlns:wsa="http://www.w3.org/2005/08/addressing">urn:uuid:2E3E584BB87837BC3B1417028462849</wsa:RelatesTo> - </S:Header> - <S:Body> - <rs:RegistryResponse status="urn:oasis:names:tc:ebxml-regrep:ResponseStatusType:Failure" - xmlns:rs="urn:oasis:names:tc:ebxml-regrep:xsd:rs:3.0"> - <rs:RegistryErrorList> - <rs:RegistryError errorCode="" codeContext="EXPECTED: XML starts with; FOUND: &lt;soapenv:Body xmlns:soape : MSG Schema: cvc-elt.1: Cannot find the declaration of element 'soapenv:Body'." - location=""/> - </rs:RegistryErrorList> - </rs:RegistryResponse> - </S:Body> - </S:Envelope> - - --MIMEBoundary112233445566778899-- - -
    -
    - """ - } - - static String simEndpoint(String simId, String system) { - "http://hit-dev.nist.gov:11080/xdstools3/sim/$system/$simId/docrec/prb" - } -} diff --git a/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/XDRSpecification.groovy b/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/XDRSpecification.groovy deleted file mode 100644 index d863beef4..000000000 --- a/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/XDRSpecification.groovy +++ /dev/null @@ -1,74 +0,0 @@ -package gov.nist.healthcare.ttt.webapp - -import gov.nist.healthcare.ttt.webapp.common.db.DatabaseInstance -import gov.nist.healthcare.ttt.webapp.xdr.controller.XdrTestCaseController -import gov.nist.healthcare.ttt.xdr.web.TkListener -import org.junit.Before -import org.slf4j.Logger -import org.slf4j.LoggerFactory -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter -import org.springframework.test.web.servlet.MockMvc -import org.springframework.test.web.servlet.setup.MockMvcBuilders -import spock.lang.Specification - -/** - * Created by gerardin on 2/5/15. - */ -class XDRSpecification extends Specification{ - - Logger log = LoggerFactory.getLogger(this.class) - - @Autowired - XdrTestCaseController controller - - @Autowired - DatabaseInstance db - - @Autowired - TkListener listener - - MockMvc gui - MockMvc toolkit - - /* - Default values - */ - String userId = "user1" - String userPass = "pass" - String messageID = "1" - String toAddress = "to@edge.nist.gov" - String fromAddress = "from@edge.nist.gov" - - String system = "ett" - - @Before - public setup() { - - setupDb() - //Set up mockmvc with the necessary converter (json or xml) - - gui = MockMvcBuilders.standaloneSetup(controller) - .setMessageConverters(new MappingJackson2HttpMessageConverter()) - .build() - - toolkit = MockMvcBuilders.standaloneSetup(listener) - .build() - } - - def setupDb() { - createUserInDB() - db.xdrFacade.removeAllByUsername(userId) - log.info("db data fixture set up.") - } - - def createUserInDB() throws Exception { - if (!db.getDf().doesUsernameExist(userId)) { - db.getDf().addUsernamePassword(userId, userPass) - } - assert db.getDf().doesUsernameExist(userId) - } - - - -} diff --git a/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/package-info.groovy b/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/package-info.groovy deleted file mode 100644 index 18d2a0813..000000000 --- a/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/package-info.groovy +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Tests against a mock environment. This aims at testing all interactions in a controlled environment, - * both alleviating burden of external setup of resources and allowing concurrent development. - * - * The drawback is that the behavior of mock components is only guessed so those tests cannot replace proper integration tests. - * - * Created by gerardin on 12/1/14. - */ -package gov.nist.healthcare.ttt.webapp.api - - - diff --git a/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/xdr/edge/receiving/XdrTestCase3Test.groovy b/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/xdr/edge/receiving/XdrTestCase3Test.groovy deleted file mode 100644 index bda60664e..000000000 --- a/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/xdr/edge/receiving/XdrTestCase3Test.groovy +++ /dev/null @@ -1,48 +0,0 @@ -package gov.nist.healthcare.ttt.webapp.api.xdr.edge.receiving -import gov.nist.healthcare.ttt.webapp.TestUtils -import gov.nist.healthcare.ttt.webapp.XDRSpecification -import gov.nist.healthcare.ttt.webapp.testFramework.TestApplication -import org.springframework.boot.test.IntegrationTest -import org.springframework.boot.test.SpringApplicationContextLoader -import org.springframework.test.context.ContextConfiguration -import org.springframework.test.context.web.WebAppConfiguration -import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder - -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status - - -/* -Positive test uses the toolkit v3 as a XDR client - */ -@WebAppConfiguration -@IntegrationTest -@ContextConfiguration(loader = SpringApplicationContextLoader.class, classes = TestApplication.class) -class XdrTestCase3Test extends XDRSpecification { - - String simId = "3" - String tcId = "3" - String simEndpoint = TestUtils.simEndpoint(simId, system) - - public String testCaseConfigTLS = - """{ - "targetEndpointTLS": "https://transport-testing.nist.gov:12081/ttt/sim/ce45c84c-fc5f-430e-b1cd-aadf592a67ca/rec/xdrpr" -}""" - - def "user succeeds in running test case with a tls endpoint"() throws Exception { - - when: "receiving a request to run test case" - MockHttpServletRequestBuilder getRequest = TestUtils.run(tcId,userId,testCaseConfigTLS) - - then: "we receive back a message with status and report of the transaction" - - //TODO we cannot validate the body because for now we always get error messages! - gui.perform(getRequest) - .andDo(print()) - .andExpect(status().isOk()) - .andExpect(jsonPath("status").value("SUCCESS")) - .andExpect(jsonPath("content.criteriaMet").value("MANUAL")) - } -} - diff --git a/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/xdr/edge/receiving/XdrTestCase4dTest.groovy b/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/xdr/edge/receiving/XdrTestCase4dTest.groovy deleted file mode 100644 index c0f145ac0..000000000 --- a/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/xdr/edge/receiving/XdrTestCase4dTest.groovy +++ /dev/null @@ -1,48 +0,0 @@ -package gov.nist.healthcare.ttt.webapp.api.xdr.edge.receiving -import gov.nist.healthcare.ttt.webapp.TestUtils -import gov.nist.healthcare.ttt.webapp.XDRSpecification -import gov.nist.healthcare.ttt.webapp.testFramework.TestApplication -import org.springframework.boot.test.IntegrationTest -import org.springframework.boot.test.SpringApplicationContextLoader -import org.springframework.test.context.ContextConfiguration -import org.springframework.test.context.web.WebAppConfiguration -import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder - -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status - -/* -Negative test cases use canned XDR message to send bad XDR - */ -@WebAppConfiguration -@IntegrationTest -@ContextConfiguration(loader = SpringApplicationContextLoader.class, classes = TestApplication.class) -class XdrTestCase4dTest extends XDRSpecification { - - String simId = "4d" - String tcId = "4d" - String simEndpoint = TestUtils.simEndpoint(simId, system) - - public String testCaseConfigTLS = - """{ - "targetEndpointTLS": "https://transport-testing.nist.gov:12081/ttt/sim/ce45c84c-fc5f-430e-b1cd-aadf592a67ca/rec/xdrpr" -}""" - - def "user succeeds in running test case 4d using TLS"() throws Exception { - - when: "receiving a request to run test case" - MockHttpServletRequestBuilder getRequest = TestUtils.run(tcId,userId,testCaseConfigTLS) - - then: "we receive back a message with status and report of the transaction" - - gui.perform(getRequest) - .andDo(print()) - .andExpect(status().isOk()) - .andExpect(jsonPath("status").value("SUCCESS")) - .andExpect(jsonPath("content.criteriaMet").value("MANUAL")) - } - - -} - diff --git a/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/xdr/edge/receiving/tls/XdrTestCase8Test.groovy b/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/xdr/edge/receiving/tls/XdrTestCase8Test.groovy deleted file mode 100644 index 68c6a7ccf..000000000 --- a/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/xdr/edge/receiving/tls/XdrTestCase8Test.groovy +++ /dev/null @@ -1,45 +0,0 @@ -package gov.nist.healthcare.ttt.webapp.api.xdr.edge.receiving.tls - -import gov.nist.healthcare.ttt.webapp.TestUtils -import gov.nist.healthcare.ttt.webapp.XDRSpecification -import gov.nist.healthcare.ttt.webapp.testFramework.TestApplication -import org.springframework.boot.test.IntegrationTest -import org.springframework.boot.test.SpringApplicationContextLoader -import org.springframework.test.context.ContextConfiguration -import org.springframework.test.context.web.WebAppConfiguration -import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder - -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status - -@WebAppConfiguration -@IntegrationTest -@ContextConfiguration(loader = SpringApplicationContextLoader.class, classes = TestApplication.class) -class XdrTestCase8Test extends XDRSpecification { - - String simId = "8" - String tcId = "8" - String simEndpoint = TestUtils.simEndpoint(simId, system) - public String testCaseConfig = - """{ - "ip_address": "127.0.0.1", - "port": "12085" -}""" - - def "user succeeds in running test case"() throws Exception { - - when: "receiving a request to run test case" - MockHttpServletRequestBuilder getRequest = TestUtils.run(tcId, userId, testCaseConfig) - - then: "we receive back a message with status and report of the transaction" - - gui.perform(getRequest) - .andDo(print()) - .andExpect(status().isOk()) - .andExpect(jsonPath("status").value("SUCCESS")) - .andExpect(jsonPath("content.criteriaMet").value("PASSED")) - } - -} - diff --git a/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/xdr/edge/receiving/tls/XdrTestCase9Test.groovy b/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/xdr/edge/receiving/tls/XdrTestCase9Test.groovy deleted file mode 100644 index b2b78206e..000000000 --- a/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/xdr/edge/receiving/tls/XdrTestCase9Test.groovy +++ /dev/null @@ -1,44 +0,0 @@ -package gov.nist.healthcare.ttt.webapp.api.xdr.edge.receiving.tls - -import gov.nist.healthcare.ttt.webapp.TestUtils -import gov.nist.healthcare.ttt.webapp.XDRSpecification -import gov.nist.healthcare.ttt.webapp.testFramework.TestApplication -import org.springframework.boot.test.IntegrationTest -import org.springframework.boot.test.SpringApplicationContextLoader -import org.springframework.test.context.ContextConfiguration -import org.springframework.test.context.web.WebAppConfiguration -import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder - -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status - -@WebAppConfiguration -@IntegrationTest -@ContextConfiguration(loader = SpringApplicationContextLoader.class, classes = TestApplication.class) -class XdrTestCase9Test extends XDRSpecification { - - String simId = "9" - String tcId = "9" - String simEndpoint = TestUtils.simEndpoint(simId, system) - public String testCaseConfig = - """{ - "ip_address": "localhost", - "port": "12085" -}""" - - def "user succeeds in running test case"() throws Exception { - - when: "receiving a request to run test case" - MockHttpServletRequestBuilder getRequest = TestUtils.run(tcId, userId, testCaseConfig) - - then: "we receive back a message with status and report of the transaction" - - gui.perform(getRequest) - .andDo(print()) - .andExpect(status().isOk()) - .andExpect(jsonPath("status").value("SUCCESS")) - .andExpect(jsonPath("content.criteriaMet").value("PASSED")) - } -} - diff --git a/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/xdr/edge/sending/XdrTestCase1Test.groovy b/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/xdr/edge/sending/XdrTestCase1Test.groovy deleted file mode 100644 index 101cf74fd..000000000 --- a/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/xdr/edge/sending/XdrTestCase1Test.groovy +++ /dev/null @@ -1,67 +0,0 @@ -package gov.nist.healthcare.ttt.webapp.api.xdr.edge.sending -import gov.nist.healthcare.ttt.database.xdr.XDRRecordInterface -import gov.nist.healthcare.ttt.webapp.TestUtils -import gov.nist.healthcare.ttt.webapp.XDRSpecification -import gov.nist.healthcare.ttt.webapp.testFramework.TestApplication -import org.springframework.boot.test.IntegrationTest -import org.springframework.boot.test.SpringApplicationContextLoader -import org.springframework.test.context.ContextConfiguration -import org.springframework.test.context.web.WebAppConfiguration -import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder - -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath - -@WebAppConfiguration -@IntegrationTest -@ContextConfiguration(loader = SpringApplicationContextLoader.class, classes = TestApplication.class) -class XdrTestCase1Test extends XDRSpecification { - - String simId = "1" - String tcId = "1" - String simEndpoint = TestUtils.simEndpoint(simId, system) - String testCaseConfig = - """{ - "direct_from": "$fromAddress" -}""" - - - def "user succeeds in running test case"() throws Exception { - - when: "receiving a request to run test case" - MockHttpServletRequestBuilder configure = TestUtils.run(tcId,userId,testCaseConfig) - - then: "we receive back a success message with the endpoints info" - gui.perform(configure) - .andDo(print()) - .andExpect(jsonPath("status").value("SUCCESS")) - .andExpect(jsonPath("content.criteriaMet").value("PENDING")) - - - when: "receiving a validation report from toolkit. We mock the actual interaction!" - MockHttpServletRequestBuilder toolkitNotification = TestUtils.reportNotification(TestUtils.buildReportTemplate(simId,messageID,fromAddress,toAddress)) - toolkit.perform(toolkitNotification) - .andDo(print()) - .andReturn() - - then: "we store the validation in the database" - XDRRecordInterface rec = db.xdrFacade.getLatestXDRRecordBySimulatorId(simId) - def step = rec.testSteps.find{ - it.name == "XDR_RECEIVE" - } - - assert !step.xdrReportItems.get(0).report.empty - - - when: "we check the status of testcase" - MockHttpServletRequestBuilder status = TestUtils.status(tcId,userId) - - then: "we receive back a success message asking for manual validation" - gui.perform(status) - .andDo(print()) - .andExpect(jsonPath("status").value("SUCCESS")) - .andExpect(jsonPath("content.criteriaMet").value("MANUAL")) - .andExpect(jsonPath("content.value").exists()) - } -} - diff --git a/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/xdr/edge/sending/mu2/XdrTestCase19mu2Test.groovy b/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/xdr/edge/sending/mu2/XdrTestCase19mu2Test.groovy deleted file mode 100644 index 4e331e918..000000000 --- a/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/xdr/edge/sending/mu2/XdrTestCase19mu2Test.groovy +++ /dev/null @@ -1,120 +0,0 @@ -package gov.nist.healthcare.ttt.webapp.api.xdr.edge.sending.mu2 -import gov.nist.healthcare.ttt.database.xdr.XDRRecordInterface -import gov.nist.healthcare.ttt.webapp.TestUtils -import gov.nist.healthcare.ttt.webapp.XDRSpecification -import gov.nist.healthcare.ttt.webapp.testFramework.TestApplication -import org.springframework.boot.test.IntegrationTest -import org.springframework.boot.test.SpringApplicationContextLoader -import org.springframework.test.context.ContextConfiguration -import org.springframework.test.context.web.WebAppConfiguration -import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder - -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status - -@WebAppConfiguration -@IntegrationTest -@ContextConfiguration(loader = SpringApplicationContextLoader.class, classes = TestApplication.class) -class XdrTestCase19mu2Test extends XDRSpecification { - - String simId = "19mu2" - String tcId = "19mu2" - String simEndpoint = TestUtils.simEndpoint(simId, system) - String testCaseConfig = - """{ - "direct_from": "$fromAddress" -}""" - - def "user succeeds in running test case - positive test : message ids are all distinct"() throws Exception { - - when: "receiving a request to run test case" - MockHttpServletRequestBuilder configure = TestUtils.run(tcId,userId,testCaseConfig) - - then: "we receive back a success message" - gui.perform(configure) - .andDo(print()) - .andExpect(status().isOk()) - .andExpect(jsonPath("status").value("SUCCESS")) - .andExpect(jsonPath("content.criteriaMet").value("PENDING")) - - when: "receiving xdr report from toolkit." - MockHttpServletRequestBuilder toolkitNotification = TestUtils.reportNotification(TestUtils.buildReportTemplate(simId,"1",fromAddress,toAddress)) - toolkit.perform(toolkitNotification) - .andDo(print()) - .andReturn() - - MockHttpServletRequestBuilder toolkitNotification2 = TestUtils.reportNotification(TestUtils.buildReportTemplate(simId,"2",fromAddress,toAddress)) - toolkit.perform(toolkitNotification2) - .andDo(print()) - .andReturn() - - MockHttpServletRequestBuilder toolkitNotification3 = TestUtils.reportNotification(TestUtils.buildReportTemplate(simId,"3",fromAddress,toAddress)) - toolkit.perform(toolkitNotification3) - .andDo(print()) - .andReturn() - - then: "we store the validation in the database" - XDRRecordInterface rec = db.xdrFacade.getLatestXDRRecordByDirectFrom(fromAddress) - assert rec.testSteps.size() == 4 - - when: "we check the status of testcase" - MockHttpServletRequestBuilder status = TestUtils.status(tcId,userId) - - then: "we receive back a success message asking for manual validation" - gui.perform(status) - .andDo(print()) - .andExpect(jsonPath("status").value("SUCCESS")) - .andExpect(jsonPath("content.criteriaMet").value("PASSED")) - .andExpect(jsonPath("content.value").exists()) - } - - - - - //@Ignore - def "user in running test case - negative test : message ids are not unique"() throws Exception { - - when: "receiving a request to run test case" - MockHttpServletRequestBuilder configure = TestUtils.run(tcId,userId,testCaseConfig) - - then: "we receive back a success message" - gui.perform(configure) - .andDo(print()) - .andExpect(status().isOk()) - .andExpect(jsonPath("status").value("SUCCESS")) - .andExpect(jsonPath("content.criteriaMet").value("PENDING")) - - when: "receiving xdr report from toolkit." - MockHttpServletRequestBuilder toolkitNotification = TestUtils.reportNotification(TestUtils.buildReportTemplate(simId,"1",fromAddress,toAddress)) - toolkit.perform(toolkitNotification) - .andDo(print()) - .andReturn() - - MockHttpServletRequestBuilder toolkitNotification2 = TestUtils.reportNotification(TestUtils.buildReportTemplate(simId,"1",fromAddress,toAddress)) - toolkit.perform(toolkitNotification2) - .andDo(print()) - .andReturn() - - MockHttpServletRequestBuilder toolkitNotification3 = TestUtils.reportNotification(TestUtils.buildReportTemplate(simId,"3",fromAddress,toAddress)) - toolkit.perform(toolkitNotification3) - .andDo(print()) - .andReturn() - - then: "we store the validation in the database" - XDRRecordInterface rec = db.xdrFacade.getLatestXDRRecordByDirectFrom(fromAddress) - assert rec.testSteps.size() == 3 - - when: "we check the status of testcase" - MockHttpServletRequestBuilder status = TestUtils.status(tcId,userId) - - then: "we receive back a success message asking for manual validation" - gui.perform(status) - .andDo(print()) - .andExpect(jsonPath("status").value("SUCCESS")) - .andExpect(jsonPath("content.criteriaMet").value("FAILED")) - .andExpect(jsonPath("content.value").exists()) - } - -} - diff --git a/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/xdr/edge/sending/mu2/XdrTestCase20amu2Test.groovy b/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/xdr/edge/sending/mu2/XdrTestCase20amu2Test.groovy deleted file mode 100644 index 8807096c8..000000000 --- a/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/xdr/edge/sending/mu2/XdrTestCase20amu2Test.groovy +++ /dev/null @@ -1,70 +0,0 @@ -package gov.nist.healthcare.ttt.webapp.api.xdr.edge.sending.mu2 -import gov.nist.healthcare.ttt.database.xdr.XDRRecordInterface -import gov.nist.healthcare.ttt.webapp.TestUtils -import gov.nist.healthcare.ttt.webapp.XDRSpecification -import gov.nist.healthcare.ttt.webapp.testFramework.TestApplication -import org.springframework.boot.test.IntegrationTest -import org.springframework.boot.test.SpringApplicationContextLoader -import org.springframework.test.context.ContextConfiguration -import org.springframework.test.context.web.WebAppConfiguration -import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder - -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status - -@WebAppConfiguration -@IntegrationTest -@ContextConfiguration(loader = SpringApplicationContextLoader.class, classes = TestApplication.class) -class XdrTestCase20amu2Test extends XDRSpecification { - - String simId = "20amu2" - String tcId = "20amu2" - String simEndpoint = TestUtils.simEndpoint(simId, system) - - String fromAddress = "from@hit-dev.nist.gov" - String toAddress = "to@hit-dev.nist.gov" - - String testCaseConfig = - """{ - "direct_from": "$fromAddress" -}""" - - - def "user succeeds in running test case"() throws Exception { - - when: "receiving a request to run test case" - MockHttpServletRequestBuilder configure = TestUtils.run(tcId,userId,testCaseConfig) - - then: "we receive back a success message with manual validation" - gui.perform(configure) - .andDo(print()) - .andExpect(status().isOk()) - .andExpect(jsonPath("status").value("SUCCESS")) - .andExpect(jsonPath("content.criteriaMet").value("PENDING")) - - - when: "receiving xdr report from toolkit." - MockHttpServletRequestBuilder toolkitNotification = TestUtils.reportNotification(TestUtils.buildReportTemplate(simId,messageID,fromAddress,toAddress)) - toolkit.perform(toolkitNotification) - .andDo(print()) - .andReturn() - - then: "we store the validation in the database" - XDRRecordInterface rec = db.xdrFacade.getLatestXDRRecordByDirectFrom("$fromAddress") - assert rec != null - assert rec.testSteps.size() == 2 - - - when: "we check the status of testcase" - MockHttpServletRequestBuilder status = TestUtils.status(tcId,userId) - - then: "we receive back a success message asking for manual validation" - gui.perform(status) - .andDo(print()) - .andExpect(jsonPath("status").value("SUCCESS")) - .andExpect(jsonPath("content.criteriaMet").value("MANUAL")) - .andExpect(jsonPath("content.value").exists()) - } -} - diff --git a/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/xdr/edge/sending/mu2/XdrTestCase20bmu2Test.groovy b/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/xdr/edge/sending/mu2/XdrTestCase20bmu2Test.groovy deleted file mode 100644 index 90b8c892d..000000000 --- a/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/xdr/edge/sending/mu2/XdrTestCase20bmu2Test.groovy +++ /dev/null @@ -1,74 +0,0 @@ -package gov.nist.healthcare.ttt.webapp.api.xdr.edge.sending.mu2 - -import gov.nist.healthcare.ttt.database.xdr.XDRRecordInterface -import gov.nist.healthcare.ttt.webapp.TestUtils -import gov.nist.healthcare.ttt.webapp.XDRSpecification -import gov.nist.healthcare.ttt.webapp.testFramework.TestApplication -import org.springframework.boot.test.IntegrationTest -import org.springframework.boot.test.SpringApplicationContextLoader -import org.springframework.test.context.ContextConfiguration -import org.springframework.test.context.web.WebAppConfiguration -import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder - -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status - -@WebAppConfiguration -@IntegrationTest -@ContextConfiguration(loader = SpringApplicationContextLoader.class, classes = TestApplication.class) - -class XdrTestCase20bmu2Test extends XDRSpecification { - - - String simId = "20bmu2" - String tcId = "20bmu2" - String simEndpoint = TestUtils.simEndpoint(simId, system) - - String fromAddress = "from@hit-dev.nist.gov" - String toAddress = "to@hit-dev.nist.gov" - - - String testCaseConfig = - """{ - "direct_from": "$fromAddress" -}""" - - - def "user succeeds in running test case"() throws Exception { - - when: "receiving a request to run test case" - MockHttpServletRequestBuilder configure = TestUtils.run(tcId,userId,testCaseConfig) - - then: "we receive back a success message with manual validation" - gui.perform(configure) - .andDo(print()) - .andExpect(status().isOk()) - .andExpect(jsonPath("status").value("SUCCESS")) - .andExpect(jsonPath("content.criteriaMet").value("PENDING")) - - - when: "receiving xdr report from toolkit." - MockHttpServletRequestBuilder toolkitNotification = TestUtils.reportNotification(TestUtils.buildReportTemplate(simId,messageID,fromAddress,toAddress)) - toolkit.perform(toolkitNotification) - .andDo(print()) - .andReturn() - - then: "we store the validation in the database" - XDRRecordInterface rec = db.xdrFacade.getLatestXDRRecordByDirectFrom("$fromAddress") - assert rec != null - assert rec.testSteps.size() == 2 - - - when: "we check the status of testcase" - MockHttpServletRequestBuilder status = TestUtils.status(tcId,userId) - - then: "we receive back a success message asking for manual validation" - gui.perform(status) - .andDo(print()) - .andExpect(jsonPath("status").value("SUCCESS")) - .andExpect(jsonPath("content.criteriaMet").value("MANUAL")) - .andExpect(jsonPath("content.value").exists()) - } -} - diff --git a/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/xdr/edge/sending/tls/XdrTestCase7Test.groovy b/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/xdr/edge/sending/tls/XdrTestCase7Test.groovy deleted file mode 100644 index 955be8a17..000000000 --- a/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/xdr/edge/sending/tls/XdrTestCase7Test.groovy +++ /dev/null @@ -1,77 +0,0 @@ -package gov.nist.healthcare.ttt.webapp.api.xdr.edge.sending.tls -import gov.nist.healthcare.ttt.webapp.TestUtils -import gov.nist.healthcare.ttt.webapp.XDRSpecification -import gov.nist.healthcare.ttt.webapp.testFramework.TestApplication -import gov.nist.healthcare.ttt.xdr.api.TLSClient -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.beans.factory.annotation.Value -import org.springframework.boot.test.IntegrationTest -import org.springframework.boot.test.SpringApplicationContextLoader -import org.springframework.test.context.ContextConfiguration -import org.springframework.test.context.web.WebAppConfiguration -import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder - -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status - -@WebAppConfiguration -@IntegrationTest -@ContextConfiguration(loader = SpringApplicationContextLoader.class, classes = TestApplication.class) -class XdrTestCase7Test extends XDRSpecification { - - @Autowired - TLSClient client - - //TODO change that : either find a better way or rename property - @Value('${direct.listener.domainName}') - private String hostname - - @Value('${xdr.tls.test.port}') - Integer tlsPort - - String simId = "7" - String tcId = "7" - String simEndpoint = TestUtils.simEndpoint(simId, system) - - public String testCaseConfig = - """{ - "ip_address": "127.0.0.1" -}""" - - - def "user succeeds in running test case"() throws Exception { - - when: "receiving a request to run test case" - MockHttpServletRequestBuilder configure = TestUtils.run(tcId,userId,testCaseConfig) - - then: "we receive back a success message, correlation parameters have been accepted" - gui.perform(configure) - .andDo(print()) - .andExpect(status().isOk()) - .andExpect(jsonPath("status").value("SUCCESS")) - - - //setup is completed - - when: "we try to connect to TTT with what we consider a good cert" - try { - client.connectOverGoodTLS([ip_address: hostname, port: tlsPort.toString()]) - } - catch(Exception e){ - //TODO improve that - println(e.getCause()) - println("Success. We should throw an exception because TTT give us a bad cert") - } - MockHttpServletRequestBuilder status = TestUtils.status(tcId,userId) - Thread.sleep(4000) - - then: "we receive back a success message if we have disconnect" - gui.perform(status) - .andDo(print()) - .andExpect(jsonPath("status").value("SUCCESS")) - .andExpect(jsonPath("content.criteriaMet").value("PASSED")) - } - -} - diff --git a/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/xdr/hisp/XdrTestCase10Test.groovy b/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/xdr/hisp/XdrTestCase10Test.groovy deleted file mode 100644 index e61131ccb..000000000 --- a/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/xdr/hisp/XdrTestCase10Test.groovy +++ /dev/null @@ -1,76 +0,0 @@ -package gov.nist.healthcare.ttt.webapp.api.xdr.hisp -import gov.nist.healthcare.ttt.database.xdr.XDRRecordInterface -import gov.nist.healthcare.ttt.webapp.TestUtils -import gov.nist.healthcare.ttt.webapp.XDRSpecification -import gov.nist.healthcare.ttt.webapp.testFramework.TestApplication -import org.springframework.boot.test.IntegrationTest -import org.springframework.boot.test.SpringApplicationContextLoader -import org.springframework.test.context.ContextConfiguration -import org.springframework.test.context.web.WebAppConfiguration -import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder - -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath - -@WebAppConfiguration -@IntegrationTest -@ContextConfiguration(loader = SpringApplicationContextLoader.class, classes = TestApplication.class) -class XdrTestCase10Test extends XDRSpecification { - - String simId = "10" - String tcId = "10" - String simEndpoint = TestUtils.simEndpoint(simId, system) - String testCaseConfig = - """{ - "direct_to" : "$fromAddress" -}""" - - - def "user succeeds in running test case"() throws Exception { - - when: "receiving a request to configure test case" - MockHttpServletRequestBuilder configure = TestUtils.configure(tcId) - - then: "we receive back a success message" - gui.perform(configure) - .andDo(print()) - .andExpect(jsonPath("status").value("SUCCESS")) - .andExpect(jsonPath("content.criteriaMet").value("PENDING")) - - when: "receiving a request to run test case" - MockHttpServletRequestBuilder run = TestUtils.run(tcId,userId,testCaseConfig) - - then: "we receive back a success message" - gui.perform(run) - .andDo(print()) - .andExpect(jsonPath("status").value("SUCCESS")) - .andExpect(jsonPath("content.criteriaMet").value("PENDING")) - - - when: "receiving a validation report from toolkit. We mock the actual interaction!" - MockHttpServletRequestBuilder toolkitNotification = TestUtils.reportNotification(TestUtils.buildReportTemplate(simId,messageID,fromAddress,toAddress)) - toolkit.perform(toolkitNotification) - .andDo(print()) - .andReturn() - - then: "we store the validation in the database" - XDRRecordInterface rec = db.xdrFacade.getLatestXDRRecordBySimulatorId(simId) - def step = rec.testSteps.find{ - it.name == "XDR_RECEIVE" - } - - assert !step.xdrReportItems.get(0).report.empty - - - when: "we check the status of testcase" - MockHttpServletRequestBuilder status = TestUtils.status(tcId,userId) - - then: "we receive back a success message asking for manual validation" - gui.perform(status) - .andDo(print()) - .andExpect(jsonPath("status").value("SUCCESS")) - .andExpect(jsonPath("content.criteriaMet").value("MANUAL")) - .andExpect(jsonPath("content.value").exists()) - } -} - diff --git a/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/xdr/hisp/XdrTestCase13Test.groovy b/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/xdr/hisp/XdrTestCase13Test.groovy deleted file mode 100644 index e9e70af5d..000000000 --- a/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/api/xdr/hisp/XdrTestCase13Test.groovy +++ /dev/null @@ -1,50 +0,0 @@ -package gov.nist.healthcare.ttt.webapp.api.xdr.hisp - -import gov.nist.healthcare.ttt.webapp.TestUtils -import gov.nist.healthcare.ttt.webapp.XDRSpecification -import gov.nist.healthcare.ttt.webapp.testFramework.TestApplication -import org.springframework.boot.test.IntegrationTest -import org.springframework.boot.test.SpringApplicationContextLoader -import org.springframework.test.context.ContextConfiguration -import org.springframework.test.context.web.WebAppConfiguration -import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder - -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status - - -/* -Positive test uses the toolkit v3 as a XDR client - */ - -@WebAppConfiguration -@IntegrationTest -@ContextConfiguration(loader = SpringApplicationContextLoader.class, classes = TestApplication.class) -class XdrTestCase13Test extends XDRSpecification { - - String simId = "13" - String tcId = "13" - String simEndpoint = TestUtils.simEndpoint(simId, system) - - public String testCaseConfigTLS = - """{ - "targetEndpointTLS": "https://transport-testing.nist.gov:12081/ttt/sim/ce45c84c-fc5f-430e-b1cd-aadf592a67ca/rec/xdrpr" -}""" - - def "user succeeds in running test case with a tls endpoint"() throws Exception { - - when: "receiving a request to run test case" - MockHttpServletRequestBuilder getRequest = TestUtils.run(tcId, userId, testCaseConfigTLS) - - then: "we receive back a message with status and report of the transaction" - - //TODO we cannot validate the body because for now we always get error messages! - gui.perform(getRequest) - .andDo(print()) - .andExpect(status().isOk()) - .andExpect(jsonPath("status").value("SUCCESS")) - .andExpect(jsonPath("content.criteriaMet").value("MANUAL")) - } -} - diff --git a/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/production/TestProdUsingClient.groovy b/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/production/TestProdUsingClient.groovy deleted file mode 100644 index 7bc5cbb2c..000000000 --- a/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/production/TestProdUsingClient.groovy +++ /dev/null @@ -1,367 +0,0 @@ -package gov.nist.healthcare.ttt.webapp.production - -import gov.nist.healthcare.ttt.tempxdrcommunication.artifact.ArtifactManagement -import gov.nist.healthcare.ttt.xdr.api.CannedXdrSenderImpl -import gov.nist.healthcare.ttt.xdr.api.TLSClientImpl -import gov.nist.healthcare.ttt.xdr.ssl.SSLContextManager -import org.junit.Before -import org.junit.Test -import spock.lang.Specification - -/** - * Created by gerardin on 2/11/15. - */ -class TestProdUsingClient extends Specification{ - - - @Test - def test1(){ - - when : - def manager = new SSLContextManager() - def TLSclient = new TLSClientImpl(manager) - def context = [:] - context.directTo = "mailto:test@test.com" - context.directFrom = "mailto:test@test.com" - context.wsaTo = "http://localhost:8080/xdstools4/sim/local-ett__1/rep/xdrpr" - context.targetEndpointTLS = "http://localhost:8080/xdstools4/sim/local-ett__1/rep/xdrpr" - context.messageType = ArtifactManagement.Type.XDR_MINIMAL_METADATA - def response = new CannedXdrSenderImpl(manager).sendXdr(context) - - then : - - println response - assert true - } - - @Test - def test2(){ - - when : - def manager = new SSLContextManager() - def context = [:] - context.directTo = "test@test.com" - context.directFrom = "test@test.com" - context.wsaTo = "http://localhost:8080/xdstools2/sim/local-ett__2/rep/xdrpr" - context.targetEndpointTLS = "http://localhost:8080/xdstools2/sim/local-ett__2/rep/xdrpr" - context.messageType = ArtifactManagement.Type.XDR_FULL_METADATA - def response = new CannedXdrSenderImpl(manager).sendXdr(context) - - then : - - assert true - } - - - @Test - def test6(){ - - when : - def manager = new SSLContextManager() - def context = [:] - context.directTo = "test@test.com" - context.directFrom = "test@test.com" - context.wsaTo = "http://hit-dev.nist.gov:11080/xdstools3/sim/ett/6/docrec/prb" - context.targetEndpointTLS = "http://hit-dev.nist.gov:11080/xdstools3/sim/ett/6/docrec/prb" - context.messageType = ArtifactManagement.Type.XDR_MINIMAL_METADATA - def response = new CannedXdrSenderImpl(manager).sendXdr(context) - - then : - - assert true - } - - - @Test - def test7(){ - - when : - def manager = new SSLContextManager() - def TLSclient = new TLSClientImpl(manager) - TLSclient.connectOverGoodTLS([ip_address: "hit-dev.nist.gov", port: "12084"]) - - then : - - assert true - } - - @Test - def test19mu2success(){ - - when : - def manager = new SSLContextManager() - def TLSclient = new TLSClientImpl(manager) - def context = [:] - context.directTo = "test@test.com" - context.directFrom = "test@test.com" - context.wsaTo = "http://hit-dev.nist.gov:11080/xdstools3/sim/ett/19mu2/docrec/prb" - context.targetEndpointTLS = "http://hit-dev.nist.gov:11080/xdstools3/sim/ett/19mu2/docrec/prb" - context.messageType = ArtifactManagement.Type.XDR_MINIMAL_METADATA - println "first message..." - def response = new CannedXdrSenderImpl(manager).sendXdr(context) - println "second message..." - def response2 = new CannedXdrSenderImpl(manager).sendXdr(context) - println "third message..." - def response3 = new CannedXdrSenderImpl(manager).sendXdr(context) - - then : - - println response3 - assert true - } - - @Test - def test19mu2failure(){ - - when : - def manager = new SSLContextManager() - def TLSclient = new TLSClientImpl(manager) - def context = [:] - context.directTo = "test@test.com" - context.directFrom = "test@test.com" - context.wsaTo = "http://hit-dev.nist.gov:11080/xdstools3/sim/ett/19mu2/docrec/prb" - context.targetEndpointTLS = "http://hit-dev.nist.gov:11080/xdstools3/sim/ett/19mu2/docrec/prb" - context.messageType = ArtifactManagement.Type.XDR_MINIMAL_METADATA - context.messageId = "1" - println "first message..." - def response = new CannedXdrSenderImpl(manager).sendXdr(context) - println "second message..." - def response2 = new CannedXdrSenderImpl(manager).sendXdr(context) - println "third message..." - def response3 = new CannedXdrSenderImpl(manager).sendXdr(context) - - then : - - println response3 - assert true - } - - @Test - def test20amu2(){ - - when : - def manager = new SSLContextManager() - def TLSclient = new TLSClientImpl(manager) - def context = [:] - context.directTo = "julien@hit-dev.nist.gov" - - //Careful : this address should exists in the tool for the MDN to be sent back properly - context.directFrom = "test@test.com" - context.wsaTo = "http://localhost:8080/xdstools2/sim/local-ett__20amu2/rep/xdrpr" - context.targetEndpointTLS = "http://localhost:8080/xdstools2/sim/local-ett__20amu2/rep/xdrpr" - context.messageType = ArtifactManagement.Type.XDR_MINIMAL_METADATA - def response = new CannedXdrSenderImpl(manager).sendXdr(context) - - then : - - println response - assert true - } - - - @Test - def test20bmu2(){ - - when : - def manager = new SSLContextManager() - def TLSclient = new TLSClientImpl(manager) - def context = [:] - context.directTo = "julien@hit-dev.nist.gov" - context.directFrom = "test@test.com" - context.directFrom = "test@test.com" - context.wsaTo = "http://localhost:8080/xdstools2/sim/local-ett__20bmu2/rep/xdrpr" - context.targetEndpointTLS = "http://localhost:8080/xdstools2/sim/local-ett__20bmu2/rep/xdrpr" - context.messageType = ArtifactManagement.Type.XDR_MINIMAL_METADATA - def response = new CannedXdrSenderImpl(manager).sendXdr(context) - - then : - - println response - assert true - } - - @Test - def test48(){ - when : - def manager = new SSLContextManager() - def TLSclient = new TLSClientImpl(manager) - def context = [:] - context.directTo = "test@test.com" - context.directFrom = "test@test.com" - context.wsaTo = "http://hit-dev.nist.gov:11080/xdstools3/sim/ett/48/docrec/prb" - context.targetEndpointTLS = "http://hit-dev.nist.gov:11080/xdstools3/sim/ett/48/docrec/prb" - context.messageType = ArtifactManagement.Type.XDR_MINIMAL_METADATA - println "first message..." - def response = new CannedXdrSenderImpl(manager).sendXdr(context) - println "second message..." - def response2 = new CannedXdrSenderImpl(manager).sendXdr(context) - println "third message..." - def response3 = new CannedXdrSenderImpl(manager).sendXdr(context) - - then : - - println response3 - assert true - } - - @Test - def test49mu2(){ - - when : - def manager = new SSLContextManager() - def TLSclient = new TLSClientImpl(manager) - def context = [:] - context.directTo = "test@test.com" - context.directFrom = "test@test.com" - context.wsaTo = "http://localhost:8080/xdstools2/sim/local-ett__49mu2/rep/xdrpr" - context.targetEndpointTLS = "http://localhost:8080/xdstools2/sim/local-ett__49mu2/rep/xdrpr" - context.messageType = ArtifactManagement.Type.XDR_MINIMAL_METADATA - def response = new CannedXdrSenderImpl(manager).sendXdr(context) - - then : - - println response - assert true - } - - @Test - def test50amu2(){ - - when : - def manager = new SSLContextManager() - def TLSclient = new TLSClientImpl(manager) - def context = [:] - context.directTo = "julien@hit-dev.nist.gov" - context.directFrom = "test@test.com" - context.wsaTo = "http://localhost:8080/xdstools2/sim/local-ett__50amu2/rep/xdrpr" - context.targetEndpointTLS = "http://localhost:8080/xdstools2/sim/local-ett__50amu2/rep/xdrpr" - context.messageType = ArtifactManagement.Type.XDR_MINIMAL_METADATA - def response = new CannedXdrSenderImpl(manager).sendXdr(context) - - then : - - println response - assert true - } - - - @Test - def test50bmu2(){ - - when : - def manager = new SSLContextManager() - def TLSclient = new TLSClientImpl(manager) - def context = [:] - context.directTo = "julien@hit-dev.nist.gov" - context.directFrom = "test@test.com" - context.wsaTo = "http://localhost:8080/xdstools2/sim/local-ett__50bmu2/rep/xdrpr" - context.targetEndpointTLS = "http://localhost:8080/xdstools2/sim/local-ett__50bmu2/rep/xdrpr" - context.messageType = ArtifactManagement.Type.XDR_MINIMAL_METADATA - def response = new CannedXdrSenderImpl(manager).sendXdr(context) - - then : - - println response - assert true - } - - - - def test10(){ - - when : - def manager = new SSLContextManager() - def TLSclient = new TLSClientImpl(manager) - def context = [:] - context.directTo = "testTo@edge.nist.gov" - context.directFrom = "testFrom@edge.nist.gov" - context.wsaTo = "http://localhost:8080/xdstools2/sim/local-ett__10/rep/xdrpr" - context.targetEndpointTLS = "http://localhost:8080/xdstools2/sim/local-ett__10/rep/xdrpr" - context.messageType = ArtifactManagement.Type.XDR_MINIMAL_METADATA - def response = new CannedXdrSenderImpl(manager).sendXdr(context) - - then : - - println response - assert true - } - - def test11(){ - - when : - def manager = new SSLContextManager() - def TLSclient = new TLSClientImpl(manager) - def context = [:] - context.directTo = "antoine@edge.nist.gov" - context.directFrom = "antoine@edge.nist.gov" - context.wsaTo = "http://hit-dev.nist.gov:11080/xdstools3/sim/ett/11/docrec/prb" - context.targetEndpointTLS = "http://hit-dev.nist.gov:11080/xdstools3/sim/ett/11/docrec/prb" - context.messageType = ArtifactManagement.Type.XDR_MINIMAL_METADATA - def response = new CannedXdrSenderImpl(manager).sendXdr(context) - - then : - - println response - assert true - } - - @Test - def test16(){ - - when : - def manager = new SSLContextManager() - def context = [:] - context.directTo = "test@test.com" - context.directFrom = "test@test.com" - context.wsaTo = "http://hit-dev.nist.gov:11080/xdstools3/sim/ett/16/docrec/prb" - context.targetEndpointTLS = "http://hit-dev.nist.gov:11080/xdstools3/sim/ett/16/docrec/prb" - context.messageType = ArtifactManagement.Type.XDR_MINIMAL_METADATA - def response = new CannedXdrSenderImpl(manager).sendXdr(context) - - then : - - assert true - } - - @Test - def test37mu2(){ - - when : - def manager = new SSLContextManager() - def TLSclient = new TLSClientImpl(manager) - def context = [:] - context.directTo = "test@test.com" - context.directFrom = "test@test.com" - context.wsaTo = "http://localhost:8080/xdstools2/sim/local-ett__37mu2/rep/xdrpr" - context.targetEndpointTLS = "http://localhost:8080/xdstools2/sim/local-ett__37mu2/rep/xdrpr" - context.messageType = ArtifactManagement.Type.NEGATIVE_BAD_SOAP_HEADER - def response = new CannedXdrSenderImpl(manager).sendXdr(context) - - then : - - println response - assert true - } - - @Test - def testSaml(){ - - when : - def manager = new SSLContextManager() - def TLSclient = new TLSClientImpl(manager) - def context = [:] - context.directTo = "mailto:test@test.com" - context.directFrom = "mailto:test@test.com" - context.wsaTo = "http://localhost:8080/xdstools4/sim/local-ett__xdrval_nist/rep/xdrpr" - context.targetEndpointTLS = "http://localhost:8080/xdstools4/sim/local-ett__xdrval_nist/rep/xdrpr" - context.messageType = ArtifactManagement.Type.XDR_SAML_METADATA - def response = new CannedXdrSenderImpl(manager).sendXdr(context) - - then : - - println response - assert true - } - - -} diff --git a/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/testFramework/TLSReceiverImplWithGoodCert.groovy b/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/testFramework/TLSReceiverImplWithGoodCert.groovy deleted file mode 100644 index 555d5ada8..000000000 --- a/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/testFramework/TLSReceiverImplWithGoodCert.groovy +++ /dev/null @@ -1,141 +0,0 @@ -package gov.nist.healthcare.ttt.webapp.testFramework -import gov.nist.healthcare.ttt.xdr.ssl.SSLContextManager -import org.slf4j.Logger -import org.slf4j.LoggerFactory -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.beans.factory.annotation.Value -import org.springframework.stereotype.Component - -import javax.annotation.PostConstruct -import javax.annotation.PreDestroy -import javax.net.ssl.* -import java.util.concurrent.ExecutorService -import java.util.concurrent.Executors -/** - * Used as a fixture for test 8 and 9. - * We need to mock the SUT that accept the connection from TTT in test case 8 and rejects it in test case 9. - * - * Created by gerardin on 12/8/14. - */ - -@Component -public class MockSUTThatAcceptsTLSWithGoodCert extends Thread { - - SSLServerSocket server - int maxConnections = 10 - ExecutorService executorService = Executors.newFixedThreadPool(maxConnections) - Logger log = LoggerFactory.getLogger(MockSUTThatAcceptsTLSWithGoodCert.class) - - private String port = '12085' - - //TODO change that : either find a better way or rename property - @Value('${direct.listener.domainName}') - private String hostname - - @Autowired - SSLContextManager manager - - - @PostConstruct - def bootstrap() { - setupServerSocketKeystore() - this.start() - } - - @PreDestroy - def cleanup() { - executorService.shutdownNow() - } - - @Override - void run() { - - while (true) { - SSLSocket connection = (SSLSocket) server.accept(); - - Runnable task = new Runnable() { - @Override - void run() { - handleRequest(connection) - } - } - - executorService.execute(task) - } - } - - void handleRequest(SSLSocket connection) { - - def w - - printServerSocketInfo(server) - - try { - log.info("SUT is receiver. Responding to incoming request...") - w = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream())); - String m = "TLS test : try to send stuff across" - w.write(m, 0, m.length()); - w.flush(); - } catch (Exception e) { - log.error(e.toString()); - log.error("client has dropped the connection."); - } finally { - connection.close(); - - } - } - - def setupServerSocketKeystore() { - - def socketPort = Integer.parseInt(port); - server = null; - - try { - - SSLContext sc = manager.goodSSLContext - - SSLServerSocketFactory ssf = sc.getServerSocketFactory(); - server = (SSLServerSocket) ssf.createServerSocket(socketPort); - printServerSocketInfo(server); - } catch (Exception e) { - e.printStackTrace(); - log.error("unable to set ssl server"); - - } - - //That is forcing clients authenticate - server.setNeedClientAuth(true) - } - - - private static def socketInfo(SSLSocket socket) { - StringBuffer info = new StringBuffer("\n") - info << " Socket class: " + socket.getClass() + "\n" - info << " Remote address = " + socket.getInetAddress().toString() + "\n" - info << " Remote port = " + socket.getPort() + "\n" - info << " Local socket address = " + socket.getLocalSocketAddress().toString() + "\n" - info << " Local address = " + socket.getLocalAddress().toString() + "\n" - info << " Local port = " + socket.getLocalPort() + "\n" - info << " Need client authentication = " + socket.getNeedClientAuth() + "\n" - - SSLSession ss = socket.getSession() - info << " Cipher suite = " + ss.getCipherSuite() + "\n" - info << " Protocol = " + ss.getProtocol() - - return info.toString() - } - - private static void printServerSocketInfo(SSLServerSocket server) { - System.out.println("Server socket class: " + server.getClass()); - System.out.println(" Socker address = " - + server.getInetAddress().toString()); - System.out.println(" Socker port = " - + server.getLocalPort()); - System.out.println(" Need client authentication = " - + server.getNeedClientAuth()); - System.out.println(" Want client authentication = " - + server.getWantClientAuth()); - System.out.println(" Use client mode = " - + server.getUseClientMode()); - } -} diff --git a/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/testFramework/TestApplication.java b/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/testFramework/TestApplication.java deleted file mode 100644 index 46a9289ef..000000000 --- a/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/testFramework/TestApplication.java +++ /dev/null @@ -1,100 +0,0 @@ -package gov.nist.healthcare.ttt.webapp.testFramework; - -//import com.mangofactory.swagger.plugin.EnableSwagger; -import gov.nist.healthcare.ttt.webapp.common.config.ComponentConfig; -import gov.nist.healthcare.ttt.webapp.common.config.ToolkitClientConfig; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.context.embedded.ServletRegistrationBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Import; -import org.springframework.context.annotation.ImportResource; -import org.springframework.security.config.annotation.web.servlet.configuration.EnableWebMvcSecurity; -import org.springframework.web.servlet.DispatcherServlet; - - -/** - * Same as the real application but here we have a additional @ComponentScan - * in gov.nist.healthcare.ttt.webapp.testFramework, which : - * - replace the clock by a mock clock returning always the same time. - */ - -@ComponentScan({"gov.nist.healthcare.ttt.webapp.testFramework"}) -@EnableAutoConfiguration -//@EnableSwagger -@Import({ComponentConfig.class, - ToolkitClientConfig.class -}) -@ImportResource("classpath:/spring/resources.xml") -public class TestApplication { - - private static Logger log = LoggerFactory.getLogger(TestApplication.class); - -// @Bean -// public EmbeddedServletContainerFactory servletContainer() { -// TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory(); -// tomcat.addAdditionalTomcatConnectors(createSslConnector()); -// log.info("created a SSL connector for Tomcat"); -// return tomcat; -// } -// -// private Connector createSslConnector() { -// Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol"); -// Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler(); -// try { -// File keystore = new ClassPathResource("keystore/keystore").getFile(); -// File truststore = new ClassPathResource("keystore/keystore").getFile(); -// connector.setScheme("https"); -// connector.setSecure(true); -// connector.setPort(9443); -// protocol.setSSLEnabled(true); -// protocol.setKeystoreFile(keystore.getAbsolutePath()); -// protocol.setKeystorePass("changeit"); -// protocol.setTruststoreFile(truststore.getAbsolutePath()); -// protocol.setTruststorePass("changeit"); -// protocol.setKeyAlias("1"); -// return connector; -// } -// catch (IOException ex) { -// throw new IllegalStateException("can't access keystore: [" + "keystore" -// + "] or truststore: [" + "keystore" + "]", ex); -// } -// } - - - /* - Not really necessary since it is equivalent to springboot default - */ - @Bean - public ServletRegistrationBean dispatcherRegistration(DispatcherServlet dispatcherServlet) { - ServletRegistrationBean registration = new ServletRegistrationBean(dispatcherServlet); - registration.addUrlMappings("/"); - registration.setLoadOnStartup(1); - return registration; - } - - /* - Important to integrate swagger-ui code - */ -// @Bean -// public WebMvcConfigurerAdapter customWebMvcConfigurerAdapter() { -// return new WebMvcConfigurerAdapter() { -// @Override -// public void addViewControllers(ViewControllerRegistry registry) { -// super.addViewControllers(registry); -// // Use forward: prefix so that no view resolution is done -// registry.addViewController("/swagger/").setViewName("forward:/index.html"); -// return; -// } -// }; -// } - - public static void main(String[] args) { - SpringApplication.run(TestApplication.class, args); - } - - -} \ No newline at end of file diff --git a/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/testFramework/time/FakeClock.groovy b/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/testFramework/time/FakeClock.groovy deleted file mode 100644 index 0c00a50e1..000000000 --- a/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/testFramework/time/FakeClock.groovy +++ /dev/null @@ -1,29 +0,0 @@ -package gov.nist.healthcare.ttt.webapp.testFramework.time -import gov.nist.healthcare.ttt.webapp.xdr.time.Clock -import org.springframework.context.annotation.Primary -import org.springframework.stereotype.Component -/** - * Created by gerardin on 10/23/14. - */ - -/** - * Mock clock that we can use for injecting always the same timestamp. - * Useful for integration tests. - */ - -@Primary -@Component -class FakeClock extends Clock{ - - Long timestamp - - public Long getTimestamp(){ -// if(timestamp == null) { -// DateTime dateTime = new DateTime(); -// Long timestamp = dateTime.getMillis() -// this.timestamp = timestamp -// } -// return timestamp - return 2014 - } -} diff --git a/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/unit/xdr/XdrTestCase1Test.groovy b/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/unit/xdr/XdrTestCase1Test.groovy deleted file mode 100644 index 76b17f38f..000000000 --- a/webapp/src/test/groovy/gov/nist/healthcare/ttt/webapp/unit/xdr/XdrTestCase1Test.groovy +++ /dev/null @@ -1,99 +0,0 @@ -package gov.nist.healthcare.ttt.webapp.unit.xdr -import gov.nist.healthcare.ttt.database.jdbc.XDRFacade -import gov.nist.healthcare.ttt.database.xdr.XDRSimulatorInterface -import gov.nist.healthcare.ttt.webapp.common.db.DatabaseInstance -import gov.nist.healthcare.ttt.webapp.testFramework.time.FakeClock -import gov.nist.healthcare.ttt.webapp.xdr.controller.XdrTestCaseController -import gov.nist.healthcare.ttt.webapp.xdr.core.ResponseHandler -import gov.nist.healthcare.ttt.webapp.xdr.core.TestCaseManager -import gov.nist.healthcare.ttt.webapp.xdr.time.Clock -import gov.nist.healthcare.ttt.xdr.api.XdrReceiver -import gov.nist.healthcare.ttt.xdr.api.XdrSender -import org.springframework.http.MediaType -import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter -import org.springframework.test.web.servlet.MockMvc -import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders -import org.springframework.test.web.servlet.setup.MockMvcBuilders -import spock.lang.Ignore -import spock.lang.Specification -import sun.security.acl.PrincipalImpl - -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status - -class XdrTestCase1Test extends Specification{ - - - XdrReceiver receiver = Mock(XdrReceiver) - ResponseHandler handler = Mock(ResponseHandler) - DatabaseInstance db = Mock(DatabaseInstance) - XdrSender sender = Mock(XdrSender) - Clock clock = new FakeClock() - - TestCaseManager manager = new TestCaseManager(db, receiver, sender, clock) - - XdrTestCaseController tcController = new XdrTestCaseController(manager) - - MockMvc mockMvc = MockMvcBuilders.standaloneSetup(tcController) - .setMessageConverters(new MappingJackson2HttpMessageConverter()) - .build() - - /* - Test with the old code logic. It is kept there for archive for now - It is much harder to test since we cannot mock the testcase themselves and anything - behind them once we rely on reflection - */ - @org.junit.Ignore - @Ignore - def "user succeeds in starting test case 1"() throws Exception { - - given: "a mock tk receiver that create a sim for this test case run" - 1 * receiver.createEndpoints(_) >> { - XDRSimulatorInterface sim = Mock(XDRSimulatorInterface) - sim.endpoint >> { "http://..." } - sim.endpointTLS >> {"https://..."} - sim.simulatorId >> {"user1.1.2014"} - - return sim - } - - db.getXdrFacade() >> { - def facade = Mock(XDRFacade) - facade.addNewXdrRecord() >> { - "record1" - } - return facade - } - - when : "receiving a postXml to create an endpoint" - MockHttpServletRequestBuilder getRequest = createEndpointRequest() - - then : "send back a success message" - - mockMvc.perform(getRequest) - .andDo(print()) - .andExpect(status().isOk()) - .andExpect(jsonPath("status").value("SUCCESS")) - - } - - - MockHttpServletRequestBuilder createEndpointRequest() { - MockMvcRequestBuilders.post("/api/xdr/tc/1/run") - .accept(MediaType.ALL) - .content(testCaseConfig) - .contentType(MediaType.APPLICATION_JSON) - .principal(new PrincipalImpl("user1")) - } - - - public String testCaseConfig = - """{ - "tc_config": { - "endpoint_url": "sut1.testlab1" - } -}""" -} - diff --git a/webapp/src/test/java/gov/nist/healthcare/ttt/webapp/api/CCDAValidationTest.java b/webapp/src/test/java/gov/nist/healthcare/ttt/webapp/api/CCDAValidationTest.java deleted file mode 100644 index 07a54b53b..000000000 --- a/webapp/src/test/java/gov/nist/healthcare/ttt/webapp/api/CCDAValidationTest.java +++ /dev/null @@ -1,46 +0,0 @@ -package gov.nist.healthcare.ttt.webapp.api; - -import java.io.File; -import java.io.IOException; - -import org.apache.http.HttpEntity; -import org.apache.http.HttpResponse; -import org.apache.http.client.ClientProtocolException; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.entity.mime.HttpMultipartMode; -import org.apache.http.entity.mime.MultipartEntityBuilder; -import org.apache.http.entity.mime.content.FileBody; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.util.EntityUtils; - -public class CCDAValidationTest { - - public static void main(String[] args) { - CloseableHttpClient client = HttpClients.createDefault(); - File file = new File("src/main/resources/cda-samples/CCDA_Ambulatory.xml"); - HttpPost post = new HttpPost("http://devccda.sitenv.org/CCDAValidatorServices/r2.0/"); - FileBody fileBody = new FileBody(file); - // - MultipartEntityBuilder builder = MultipartEntityBuilder.create(); - builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); - builder.addPart("file", fileBody); - HttpEntity entity = builder.build(); - // - post.setEntity(entity); - try { - HttpResponse response = client.execute(post); - // CONVERT RESPONSE TO STRING - String result = EntityUtils.toString(response.getEntity()); - System.out.println(result); - } catch (ClientProtocolException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - } - -} diff --git a/webapp/src/test/java/gov/nist/healthcare/ttt/webapp/api/GetCCDAFolderTest.java b/webapp/src/test/java/gov/nist/healthcare/ttt/webapp/api/GetCCDAFolderTest.java deleted file mode 100644 index 07b5209d4..000000000 --- a/webapp/src/test/java/gov/nist/healthcare/ttt/webapp/api/GetCCDAFolderTest.java +++ /dev/null @@ -1,224 +0,0 @@ -package gov.nist.healthcare.ttt.webapp.api; - -import java.io.BufferedReader; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.PrintWriter; -import java.net.HttpURLConnection; -import java.net.URL; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.regex.Pattern; - -import org.apache.commons.io.IOUtils; -import org.json.JSONArray; -import org.json.JSONObject; - -public class GetCCDAFolderTest { - - public static List files2ignore = Arrays.asList("LICENSE", "README.md"); - public static String extensionRegex = ".*\\.[a-zA-Z0-9]{3}$"; - - public static void main(String[] args) throws Exception { - long startTime = System.currentTimeMillis(); - JSONObject res = new JSONObject(); - HashMap json = new HashMap<>(); - String sha = getHTML("https://api.github.com/repos/onc-healthit/2015-certification-ccda-testdata/branches/master") - .getJSONObject("commit").get("sha").toString(); - JSONArray filesArray = getHTML("https://api.github.com/repos/onc-healthit/2015-certification-ccda-testdata/git/trees/" - + sha + "?recursive=1").getJSONArray("tree"); - - HashMap resultMap = new HashMap<>(); - for(int i=0; i < filesArray.length(); i++) { - JSONObject file = filesArray.getJSONObject(i); - if(!files2ignore.contains(file.get("path"))) { - // Get path array - String[] path = file.get("path").toString().split("/"); -// System.out.println(String.join("/", path)); - // for(String dir : path) { - // if(Pattern.matches(extensionRegex, dir)) { - // System.out.println("File!! " + dir); - // } - // } -// json = buildJson2(new HashMap<>(), path, false, true); -// resultMap = deepMerge(resultMap, json); -// System.out.println(new JSONObject(json).toString(2)); - buildJson3(resultMap, path); - } - - } -// String[] test = {"test", "retest", "file.txt"}; -// json = buildJson2(json, test, false, true); - System.out.println(new JSONObject(resultMap).toString(2)); - PrintWriter out = new PrintWriter("filename.txt"); - out.println(new JSONObject(resultMap).toString(2)); - - long endTime = System.currentTimeMillis(); - long totalTime = endTime - startTime; - System.out.println("Running time: " + totalTime/1000.0 + "s"); - - // Try download - // URL website = new URL("https://raw.githubusercontent.com/onc-healthit/2015-certification-ccda-testdata/master/Receiver%20SUT%20Test%20Data/170.315_b1_ToC_Amb/170.315_b1_toc_amb_ccd_r11_sample1_v1.xml"); - // InputStream strm = website.openStream(); - // System.out.println(IOUtils.toString(strm)); - } - - public static HashMap buildJson(HashMap parent, String[] path) { - if(path.length == 1) { - if(Pattern.matches(extensionRegex, path[0])) { - return createFile(path[0]); - } else { - return createDir(path[0]); - } - } else { - HashMap nextParent = createDir(path[0]); - parent.putAll(buildJson(nextParent, Arrays.copyOfRange(path, 1, path.length))); - return parent; - } - } - - public static void buildJson3(HashMap json, String[] path) { - if(path.length == 1) { - HashMap newObj = new HashMap<>(); - newObj.put("dirs", new ArrayList>()); - newObj.put("files", new ArrayList>()); - json.put(path[0], newObj); - - } else { - HashMap current = (HashMap) json.get(path[0]); - for(int i = 1 ; i < path.length ; i++) { - String currentName = path[i]; - if(Pattern.matches(extensionRegex, currentName)) { - HashMap newFile = new HashMap<>(); - newFile.put("name", currentName); - newFile.put("link", getLink(path)); - List filesList = (List) current.get("files"); - filesList.add(newFile); - } else { - if(containsName((List) current.get("dirs"), currentName)) { - List directories = (List) current.get("dirs"); - current = (HashMap) directories.get(getObjByName(directories, currentName)); - } else { - HashMap newObj = new HashMap<>(); - newObj.put("name", currentName); - newObj.put("dirs", new ArrayList>()); - newObj.put("files", new ArrayList>()); - List dirsList = (List) current.get("dirs"); - dirsList.add(newObj); - } - } - } - } - } - - public static String getLink(String[] path) { - String link = String.join("/", path).replace(" ", "%20"); - link = "https://raw.githubusercontent.com/onc-healthit/2015-certification-ccda-testdata/master/" + link; - return link; - } - - public static boolean containsName(List json, String value) { - for(Map obj : json) { - if(obj.containsValue(value)) { - return true; - } - } - return false; - } - - public static int getObjByName(List json, String value) { - for(int i = 0 ; i < json.size() ; i++) { - if(json.get(i).containsValue(value)) { - return i; - } - } - return -1; - } - - public static HashMap buildJson2(HashMap child, String[] path, boolean isFile, boolean isFirst) { - if(path.length > 0) { - String current = path[path.length - 1]; - HashMap res = new HashMap<>(); - res.put("name", current); - if(Pattern.matches(extensionRegex, current)) { - return buildJson2(res, Arrays.copyOf(path, path.length-1), true, false); - } else { - List childs = new ArrayList<>(); - if(!child.isEmpty()) { - childs.add(child); - } - if(isFile) { - res.put("files", childs); - } else { - res.put("dirs", childs); - } - return buildJson2(res, Arrays.copyOf(path, path.length-1), false, false); - } - } else { - return child; - } - } - - public static HashMap createFile(String filename) { - HashMap res = new HashMap<>(); - HashMap fileHash = new HashMap<>(); - fileHash.put("name", filename); - List filesList = new ArrayList<>(); - filesList.add(fileHash); - res.put("files", filesList); - return res; - } - - public static HashMap createDir(String dirname) { - HashMap res = new HashMap<>(); - HashMap fileHash = new HashMap<>(); - fileHash.put("name", dirname); - List dirsList = new ArrayList<>(); - dirsList.add(fileHash); - res.put("dirs", dirsList); - return res; - } - - private static Map deepMerge(Map original, Map newMap) { - for (Object key : newMap.keySet()) { - if (newMap.get(key) instanceof Map && original.get(key) instanceof Map) { - Map originalChild = (Map) original.get(key); - Map newChild = (Map) newMap.get(key); - original.put(key, deepMerge(originalChild, newChild)); - } else if (newMap.get(key) instanceof List && original.get(key) instanceof List) { - List originalChild = (List) original.get(key); - List newChild = (List) newMap.get(key); - for (Object each : newChild) { - if(originalChild.contains(each)) { - System.out.println("test"); - } else { - originalChild.add(each); - } - } - } else { - original.put(key, newMap.get(key)); - } - } - return original; - } - - public static JSONObject getHTML(String urlToRead) throws Exception { - StringBuilder result = new StringBuilder(); - URL url = new URL(urlToRead); - HttpURLConnection conn = (HttpURLConnection) url.openConnection(); - conn.setRequestMethod("GET"); - BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream())); - String line; - while ((line = rd.readLine()) != null) { - result.append(line); - } - rd.close(); - return new JSONObject(result.toString()); - } - -} diff --git a/webapp/src/test/java/gov/nist/healthcare/ttt/webapp/api/RestTemplateTest.java b/webapp/src/test/java/gov/nist/healthcare/ttt/webapp/api/RestTemplateTest.java deleted file mode 100644 index 46e74f9fc..000000000 --- a/webapp/src/test/java/gov/nist/healthcare/ttt/webapp/api/RestTemplateTest.java +++ /dev/null @@ -1,55 +0,0 @@ -package gov.nist.healthcare.ttt.webapp.api; - -import gov.nist.healthcare.ttt.webapp.Application; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.test.IntegrationTest; -import org.springframework.boot.test.SpringApplicationContextLoader; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; -import org.springframework.web.client.RestTemplate; - -import java.util.Arrays; - -import static org.hamcrest.CoreMatchers.containsString; -import static org.hamcrest.MatcherAssert.assertThat; - -/** - * Created by gerardin on 9/30/14. - */ -@WebAppConfiguration -@IntegrationTest -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(loader = SpringApplicationContextLoader.class, classes = Application.class) -public class RestTemplateTest { - - @Value("${local.server.port}") - private int port; - - - - //There for documentation of rest template - @Ignore - @Test - public void hello() throws Exception { - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON)); - - System.out.print(port); - - RestTemplate template = new RestTemplate(); - - HttpEntity requestEntity = new HttpEntity(null,headers); - ResponseEntity entity = template.getForEntity( "http://localhost:8080/ttt/hello",String.class); - - assertThat( entity.getBody() , containsString("World") ); - } -} \ No newline at end of file diff --git a/webapp/src/test/java/gov/nist/healthcare/ttt/webapp/misc/SslReverseEchoer.java b/webapp/src/test/java/gov/nist/healthcare/ttt/webapp/misc/SslReverseEchoer.java deleted file mode 100644 index dd07f45ff..000000000 --- a/webapp/src/test/java/gov/nist/healthcare/ttt/webapp/misc/SslReverseEchoer.java +++ /dev/null @@ -1,122 +0,0 @@ -package gov.nist.healthcare.ttt.webapp.misc; - -/** - * Created by gerardin on 12/4/14. - */ - -import javax.net.ssl.*; -import java.io.*; -import java.net.URI; -import java.security.KeyStore; - -public class SslReverseEchoer { - public static void main(String[] args) throws IOException { - - InputStream is = SslReverseEchoer.class.getClassLoader().getResourceAsStream("keystore/keystore"); - char ksPass[] = "changeit".toCharArray(); - char ctPass[] = "changeit".toCharArray(); - - boolean run = true; - SSLServerSocket s = null; - - try { - URI uri = SslReverseEchoer.class.getClassLoader().getResource("keystore/keystore").toURI(); - File file = new File(uri); - - System.out.println(file.getAbsolutePath()); - - KeyStore ks = KeyStore.getInstance("JKS"); - ks.load(is, ksPass); - KeyManagerFactory kmf = - KeyManagerFactory.getInstance("SunX509"); - kmf.init(ks, ctPass); - - SSLContext sc = SSLContext.getInstance("TLS"); - sc.init(kmf.getKeyManagers(), null, null); - SSLServerSocketFactory ssf = sc.getServerSocketFactory(); - s = (SSLServerSocket) ssf.createServerSocket(8888); - printServerSocketInfo(s); - } catch (Exception e) { - e.printStackTrace(); - System.out.println("unable to set ssl server"); - - } - - while(run) { - - SSLSocket c = null; - BufferedWriter w = null; - BufferedReader r = null; - - try { - c = (SSLSocket) s.accept(); - printSocketInfo(c); - w = new BufferedWriter(new OutputStreamWriter( - c.getOutputStream())); - r = new BufferedReader(new InputStreamReader( - c.getInputStream())); - String m = "Welcome to SSL Reverse Echo Server." + - " Please type in some words."; - w.write(m, 0, m.length()); - w.newLine(); - w.flush(); - - while ((m = r.readLine()) != null) { - if (m.equals(".")) break; - char[] a = m.toCharArray(); - int n = a.length; - for (int i = 0; i < n / 2; i++) { - char t = a[i]; - a[i] = a[n - 1 - i]; - a[n - i - 1] = t; - } - w.write(a, 0, n); - w.newLine(); - w.flush(); - } - } catch (Exception e) { - System.err.println(e.toString()); - System.out.println("client has dropped the connection"); - } finally { - w.close(); - r.close(); - c.close(); - } - - } - - s.close(); - } - - - private static void printSocketInfo(SSLSocket s) { - System.out.println("Socket class: " + s.getClass()); - System.out.println(" Remote address = " - + s.getInetAddress().toString()); - System.out.println(" Remote port = " + s.getPort()); - System.out.println(" Local socket address = " - + s.getLocalSocketAddress().toString()); - System.out.println(" Local address = " - + s.getLocalAddress().toString()); - System.out.println(" Local port = " + s.getLocalPort()); - System.out.println(" Need client authentication = " - + s.getNeedClientAuth()); - SSLSession ss = s.getSession(); - System.out.println(" Cipher suite = " + ss.getCipherSuite()); - System.out.println(" Protocol = " + ss.getProtocol()); - } - - private static void printServerSocketInfo(SSLServerSocket s) { - System.out.println("Server socket class: " + s.getClass()); - System.out.println(" Socker address = " - + s.getInetAddress().toString()); - System.out.println(" Socker port = " - + s.getLocalPort()); - System.out.println(" Need client authentication = " - + s.getNeedClientAuth()); - System.out.println(" Want client authentication = " - + s.getWantClientAuth()); - System.out.println(" Use client mode = " - + s.getUseClientMode()); - } -} \ No newline at end of file diff --git a/webapp/src/test/java/gov/nist/healthcare/ttt/webapp/misc/SslSocketClient.java b/webapp/src/test/java/gov/nist/healthcare/ttt/webapp/misc/SslSocketClient.java deleted file mode 100644 index 913d0e62d..000000000 --- a/webapp/src/test/java/gov/nist/healthcare/ttt/webapp/misc/SslSocketClient.java +++ /dev/null @@ -1,66 +0,0 @@ -package gov.nist.healthcare.ttt.webapp.misc; - -/* SslSocketClient.java - - Copyright (c) 2014, HerongYang.com, All Rights Reserved. - */ - -import javax.net.ssl.SSLSession; -import javax.net.ssl.SSLSocket; -import javax.net.ssl.SSLSocketFactory; -import java.io.*; - -/** - * To run a successful SSL connection : - * java -cp . -Djavax.net.ssl.trustStore=clientKeystore/keystore.jks gov.nist.healthcare.ttt.webapp.misc.SslSocketClient - * - * The client truststore contains the cert of the server. - */ - -public class SslSocketClient { - public static void main(String[] args) { - BufferedReader in = new BufferedReader( - new InputStreamReader(System.in)); - PrintStream out = System.out; - SSLSocketFactory f = - (SSLSocketFactory) SSLSocketFactory.getDefault(); - try { - SSLSocket c = - (SSLSocket) f.createSocket("hit-dev.nist.gov", 12084); - printSocketInfo(c); - c.startHandshake(); - BufferedWriter w = new BufferedWriter( - new OutputStreamWriter(c.getOutputStream())); - BufferedReader r = new BufferedReader( - new InputStreamReader(c.getInputStream())); - String m = null; - while ((m=r.readLine())!= null) { - out.println(m); - m = in.readLine(); - w.write(m,0,m.length()); - w.newLine(); - w.flush(); - } - w.close(); - r.close(); - c.close(); - } catch (IOException e) { - System.err.println(e.toString()); - } - } - private static void printSocketInfo(SSLSocket s) { - System.out.println("Socket class: "+s.getClass()); - System.out.println(" Remote address = " - +s.getInetAddress().toString()); - System.out.println(" Remote port = "+s.getPort()); - System.out.println(" Local socket address = " - +s.getLocalSocketAddress().toString()); - System.out.println(" Local address = " - +s.getLocalAddress().toString()); - System.out.println(" Local port = "+s.getLocalPort()); - System.out.println(" Need client authentication = " - +s.getNeedClientAuth()); - SSLSession ss = s.getSession(); - System.out.println(" Cipher suite = "+ss.getCipherSuite()); - System.out.println(" Protocol = "+ss.getProtocol()); - } -} diff --git a/webapp/src/test/java/gov/nist/healthcare/ttt/webapp/misc/SslSocketClientWithTruststore.java b/webapp/src/test/java/gov/nist/healthcare/ttt/webapp/misc/SslSocketClientWithTruststore.java deleted file mode 100644 index 84c1f1219..000000000 --- a/webapp/src/test/java/gov/nist/healthcare/ttt/webapp/misc/SslSocketClientWithTruststore.java +++ /dev/null @@ -1,93 +0,0 @@ -package gov.nist.healthcare.ttt.webapp.misc; - -/* SslSocketClient.java - - Copyright (c) 2014, HerongYang.com, All Rights Reserved. - */ - -import javax.net.ssl.SSLSession; -import javax.net.ssl.SSLSocket; -import javax.net.ssl.SSLSocketFactory; -import java.io.*; -import java.net.URI; - -/** - * This Socket is not working for now. - */ - -public class SslSocketClientWithTruststore { - public static void main(String[] args) { - - String relativePath = "badKeystore" +File.separator+"keystore.jks"; - - InputStream is = SslSocketClientWithTruststore.class.getClassLoader().getResourceAsStream(relativePath); - char ksPass[] = "changeit".toCharArray(); - char ctPass[] = "changeit".toCharArray(); - - SSLSocketFactory f = null; - - try { - - URI uri = SslSocketClientWithTruststore.class.getClassLoader().getResource(relativePath).toURI(); - File file = new File(uri); - System.out.println("use keystore at : " + file.getAbsolutePath()); - - System.setProperty("javax.net.ssl.trustStore", file.getAbsolutePath()); - f = (SSLSocketFactory) SSLSocketFactory.getDefault(); - - - - } - catch (Exception e){ - e.printStackTrace(); - System.out.println("unable to set s " + - "" + - " " + - "N BV sl factory"); - - } - - BufferedReader in = new BufferedReader( - new InputStreamReader(System.in)); - PrintStream out = System.out; - - try { - SSLSocket c = - (SSLSocket) f.createSocket("hit-dev.nist.gov", 12084); - printSocketInfo(c); - c.startHandshake(); - BufferedWriter w = new BufferedWriter( - new OutputStreamWriter(c.getOutputStream())); - BufferedReader r = new BufferedReader( - new InputStreamReader(c.getInputStream())); - String m = null; - while ((m=r.readLine())!= null) { - out.println(m); - m = in.readLine(); - w.write(m,0,m.length()); - w.newLine(); - w.flush(); - } - w.close(); - r.close(); - c.close(); - } catch (IOException e) { - System.err.println(e.toString()); - } - } - private static void printSocketInfo(SSLSocket s) { - System.out.println("Socket class: "+s.getClass()); - System.out.println(" Remote address = " - +s.getInetAddress().toString()); - System.out.println(" Remote port = "+s.getPort()); - System.out.println(" Local socket address = " - +s.getLocalSocketAddress().toString()); - System.out.println(" Local address = " - +s.getLocalAddress().toString()); - System.out.println(" Local port = "+s.getLocalPort()); - System.out.println(" Need client authentication = " - +s.getNeedClientAuth()); - SSLSession ss = s.getSession(); - System.out.println(" Cipher suite = "+ss.getCipherSuite()); - System.out.println(" Protocol = "+ss.getProtocol()); - } -} diff --git a/webapp/src/test/java/gov/nist/healthcare/ttt/webapp/misc/SslSocketClientWithTruststore2ndImpl.java b/webapp/src/test/java/gov/nist/healthcare/ttt/webapp/misc/SslSocketClientWithTruststore2ndImpl.java deleted file mode 100644 index 304e6e66c..000000000 --- a/webapp/src/test/java/gov/nist/healthcare/ttt/webapp/misc/SslSocketClientWithTruststore2ndImpl.java +++ /dev/null @@ -1,129 +0,0 @@ -package gov.nist.healthcare.ttt.webapp.misc; - -/* SslSocketClient.java - - Copyright (c) 2014, HerongYang.com, All Rights Reserved. - */ - -import javax.net.ssl.*; -import java.io.*; -import java.security.KeyStore; - -/** - * This Socket is not working for now. - */ - -public class SslSocketClientWithTruststore2ndImpl { - public static void main(String[] args) { - - String relativePath = "badKeystore" + File.separator + "keystore.jks"; - InputStream keystoreInput = Thread.currentThread().getContextClassLoader().getResourceAsStream(relativePath); - InputStream truststoreInput = Thread.currentThread().getContextClassLoader().getResourceAsStream(relativePath); - - SSLContext sc = null; - try { - sc = setSSLFactories(keystoreInput, "changeit", "changeit", truststoreInput); - keystoreInput.close(); - truststoreInput.close(); - } catch (Exception e) { - e.printStackTrace(); - } - - SSLSocketFactory f = null; - - try { - f = (SSLSocketFactory) sc.getSocketFactory(); - } catch (Exception e) { - e.printStackTrace(); - System.out.println("unable to set ssl factory"); - - } - - BufferedReader in = new BufferedReader( - new InputStreamReader(System.in)); - PrintStream out = System.out; - - try { - SSLSocket c = - (SSLSocket) f.createSocket("localhost", 8888); - printSocketInfo(c); - c.startHandshake(); - BufferedWriter w = new BufferedWriter( - new OutputStreamWriter(c.getOutputStream())); - BufferedReader r = new BufferedReader( - new InputStreamReader(c.getInputStream())); - String m = null; - while ((m = r.readLine()) != null) { - out.println(m); - m = in.readLine(); - w.write(m, 0, m.length()); - w.newLine(); - w.flush(); - } - w.close(); - r.close(); - c.close(); - } catch (IOException e) { - System.err.println(e.toString()); - } - } - - private static void printSocketInfo(SSLSocket s) { - System.out.println("Socket class: " + s.getClass()); - System.out.println(" Remote address = " - + s.getInetAddress().toString()); - System.out.println(" Remote port = " + s.getPort()); - System.out.println(" Local socket address = " - + s.getLocalSocketAddress().toString()); - System.out.println(" Local address = " - + s.getLocalAddress().toString()); - System.out.println(" Local port = " + s.getLocalPort()); - System.out.println(" Need client authentication = " - + s.getNeedClientAuth()); - SSLSession ss = s.getSession(); - System.out.println(" Cipher suite = " + ss.getCipherSuite()); - System.out.println(" Protocol = " + ss.getProtocol()); - } - - - private static SSLContext setSSLFactories(InputStream keyStream, String keyStorePassword, String trustStorePassword, InputStream trustStream) throws Exception { - // Get keyStore - KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); - - // if your store is password protected then declare it (it can be null however) - char[] keyPassword = keyStorePassword.toCharArray(); - - // load the stream to your store - keyStore.load(keyStream, keyPassword); - - // initialize a trust manager factory with the trusted store - KeyManagerFactory keyFactory = - KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); - keyFactory.init(keyStore, keyPassword); - - // get the trust managers from the factory - KeyManager[] keyManagers = keyFactory.getKeyManagers(); - - // Now get trustStore - KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); - - // if your store is password protected then declare it (it can be null however) - char[] trustPassword = trustStorePassword.toCharArray(); - - // load the stream to your store - trustStore.load(trustStream, trustPassword); - - // initialize a trust manager factory with the trusted store - TrustManagerFactory trustFactory = - TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); - trustFactory.init(trustStore); - - // get the trust managers from the factory - TrustManager[] trustManagers = trustFactory.getTrustManagers(); - - // initialize an ssl context to use these managers and set as default - SSLContext sslContext = SSLContext.getInstance("SSL"); - sslContext.init(keyManagers, trustManagers, null); - - return sslContext; - } -} diff --git a/webapp/src/test/java/gov/nist/healthcare/ttt/webapp/misc/package-info.java b/webapp/src/test/java/gov/nist/healthcare/ttt/webapp/misc/package-info.java deleted file mode 100644 index c682b4699..000000000 --- a/webapp/src/test/java/gov/nist/healthcare/ttt/webapp/misc/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Created by gerardin on 1/15/15. - * - * Contain all classes used to prototype and debug SSL communication over HTTP. - * - */ -package gov.nist.healthcare.ttt.webapp.misc; \ No newline at end of file diff --git a/xdr/src/test/groovy/gov/nist/healthcare/ttt/xdr/helpers/testFramework/TestApplication.java b/xdr/src/test/groovy/gov/nist/healthcare/ttt/xdr/helpers/testFramework/TestApplication.java deleted file mode 100644 index 0dd5d6b7b..000000000 --- a/xdr/src/test/groovy/gov/nist/healthcare/ttt/xdr/helpers/testFramework/TestApplication.java +++ /dev/null @@ -1,17 +0,0 @@ -package gov.nist.healthcare.ttt.xdr.helpers.testFramework; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.context.annotation.ComponentScan; - -/* -We spin up a fake toolkit as well. - */ - -@ComponentScan({"gov.nist.healthcare.ttt.xdr.helpers.testFramework","gov.nist.healthcare.ttt.xdr"}) -@EnableAutoConfiguration -public class TestApplication { - public static void main(String[] args) { - SpringApplication.run(TestApplication.class, args); - } -} \ No newline at end of file diff --git a/xdr/src/test/groovy/gov/nist/healthcare/ttt/xdr/helpers/testFramework/package-info.java b/xdr/src/test/groovy/gov/nist/healthcare/ttt/xdr/helpers/testFramework/package-info.java deleted file mode 100644 index f44e15769..000000000 --- a/xdr/src/test/groovy/gov/nist/healthcare/ttt/xdr/helpers/testFramework/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Created by gerardin on 1/15/15. - * - * Infrastructure used for test only. - * - */ -package gov.nist.healthcare.ttt.xdr.helpers.testFramework; \ No newline at end of file diff --git a/xdr/src/test/groovy/gov/nist/healthcare/ttt/xdr/helpers/testFramework/web/controller/FakeTkRestAPIWithBadContent.groovy b/xdr/src/test/groovy/gov/nist/healthcare/ttt/xdr/helpers/testFramework/web/controller/FakeTkRestAPIWithBadContent.groovy deleted file mode 100644 index 2c986d223..000000000 --- a/xdr/src/test/groovy/gov/nist/healthcare/ttt/xdr/helpers/testFramework/web/controller/FakeTkRestAPIWithBadContent.groovy +++ /dev/null @@ -1,42 +0,0 @@ -package gov.nist.healthcare.ttt.xdr.helpers.testFramework.web.controller - -import groovy.util.slurpersupport.GPathResult -import org.springframework.web.bind.annotation.* - -@RestController -public class FakeTkRestAPIWithBadContent { - - -// """ -// createSim { -// SimType("XDR Document Recipient") -// SimulatorId("config.name") -// MetadataValidationLevel("Full") -// CodeValidation("false") -// PostNotification("notificationUrl") -// } -// """ - - - @RequestMapping(value = "/createSim", method = RequestMethod.POST, headers = "Accept=*") - @ResponseBody - def receive(@RequestBody String body) { - GPathResult xml = new XmlSlurper().parseText(body) - println "toolkit receive postXml at endpoint /createSim : $body" - String id = xml.SimulatorId.text() - return body - } - - @RequestMapping(value = "/createSimWithBadContent", method = RequestMethod.POST, headers = "Accept=*") - @ResponseBody - def receiveAndGenerateBadContent(@RequestBody String body) { - GPathResult xml = new XmlSlurper().parseText(body) - println "toolkit receive postXml at endpoint /createSim : $body" - String id = xml.SimulatorId.text() - return "<>" - } - - - - -} \ No newline at end of file diff --git a/xdr/src/test/groovy/gov/nist/healthcare/ttt/xdr/integration/RealTkClientSpecTest.groovy b/xdr/src/test/groovy/gov/nist/healthcare/ttt/xdr/integration/RealTkClientSpecTest.groovy deleted file mode 100644 index ec5ca7cb6..000000000 --- a/xdr/src/test/groovy/gov/nist/healthcare/ttt/xdr/integration/RealTkClientSpecTest.groovy +++ /dev/null @@ -1,122 +0,0 @@ -package gov.nist.healthcare.ttt.xdr.integration - -import gov.nist.healthcare.ttt.xdr.helpers.testFramework.TestApplication -import gov.nist.healthcare.ttt.xdr.web.GroovyRestClient -import groovy.util.slurpersupport.GPathResult -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.beans.factory.annotation.Value -import org.springframework.boot.test.IntegrationTest -import org.springframework.boot.test.SpringApplicationContextLoader -import org.springframework.test.context.ContextConfiguration -import org.springframework.test.context.web.WebAppConfiguration -import spock.lang.Specification - -import javax.annotation.PostConstruct - -/** - * Created by gerardin on 10/9/14. - */ -@WebAppConfiguration -@IntegrationTest -@ContextConfiguration(loader = SpringApplicationContextLoader.class, classes = TestApplication.class) -class RealTkClientSpecTest extends Specification { - - @Value('${xdr.notification') - private String notificationUrl - - @Value('${toolkit.createSim.url}') - private String createSimUrl - - @Value('${server.contextPath}') - private String contextPath - - @Value('${server.port}') - private String port - - //TODO change that : either find a better way or rename property - @Value('${direct.listener.domainName}') - private String hostname - - private String fullNotificationUrl - - @Value('${toolkit.getSimConfig.url}') - private String getSimConfigUrl - - @Value('${toolkit.request.timeout}') - private int timeout - - private String username = "ett" - - @Autowired - GroovyRestClient client - - @PostConstruct - def buildUrls(){ - fullNotificationUrl = "http://"+hostname+":"+port+contextPath+notificationUrl - } - - def "test successful endpoint creation"() { - given: - - def id = "SimpleTest1" - - /* - - - - - - - - - - - - - - */ - - - def config = { - actor(type: 'docrec') { - - transaction(name: 'prb') { - endpoint(value: 'NOT_USED') - settings { - "boolean"(name: 'schemaCheck', value: 'true') - "boolean"(name: 'modelCheck', value: 'false') - "boolean"(name: 'codingCheck', value: 'false') - "boolean"(name: 'soapCheck', value: 'true') - text(msgCallBack: "$fullNotificationUrl") - webservices(value: 'prb') - } - } - } - } - - def url = "$createSimUrl/$username/$id" - - when: - //we post an endpoint creation request - def resp = client.postXml(config, url, timeout) - - and : - //we get the config result through a get request - //TODO : ask if Bill now returns it in the response. This would simplify the workflow. - def getConfigUrl = "$getSimConfigUrl/$username/$id" - GPathResult resp2 = client.getXml(getConfigUrl, timeout) - - then: - //We check we have created 2 endpoints containing the ids we provided. - def transactions = resp2.depthFirst().findAll{it.name() == "endpoint"} - assert transactions.size() == 2 - transactions.each { - println it.@value - assert ((String)it.@value).contains(id) - } - - - } - - -} diff --git a/xdr/src/test/groovy/gov/nist/healthcare/ttt/xdr/other/PayloadDownloadTest.groovy b/xdr/src/test/groovy/gov/nist/healthcare/ttt/xdr/other/PayloadDownloadTest.groovy deleted file mode 100644 index 04359f9e6..000000000 --- a/xdr/src/test/groovy/gov/nist/healthcare/ttt/xdr/other/PayloadDownloadTest.groovy +++ /dev/null @@ -1,32 +0,0 @@ -package gov.nist.healthcare.ttt.xdr.other - -import org.apache.commons.io.IOUtils -import org.apache.commons.lang.StringEscapeUtils -import spock.lang.Specification - -import javax.mail.Multipart -import javax.mail.Session -import javax.mail.internet.MimeBodyPart -import javax.mail.internet.MimeMessage -import java.util.regex.Matcher -/** - * Created by gerardin on 12/1/14. - */ -class PayloadDownloadTest extends Specification { - - - def test() { - - given: - def link = "https://raw.githubusercontent.com/siteadmin/2015-Certification-C-CDA-Test-Data/master/Receiver%20SUT%20Test%20Data/NegativeTesting_CarePlan/NT_Missing_PatientSuffix_r21_v1.xml" - - when: - StringWriter writer = new StringWriter(); - InputStream ccdaAttachment = new URL(link).openStream(); - IOUtils.copy(ccdaAttachment, writer, "UTF-8"); - String payload = writer.toString(); - then: - println payload - assert payload != null - } -} diff --git a/xdr/src/test/groovy/gov/nist/healthcare/ttt/xdr/other/ReportParsingTest.groovy b/xdr/src/test/groovy/gov/nist/healthcare/ttt/xdr/other/ReportParsingTest.groovy deleted file mode 100644 index 65791c60e..000000000 --- a/xdr/src/test/groovy/gov/nist/healthcare/ttt/xdr/other/ReportParsingTest.groovy +++ /dev/null @@ -1,146 +0,0 @@ -package gov.nist.healthcare.ttt.xdr.other - -import org.apache.commons.lang.StringEscapeUtils -import spock.lang.Specification - -import javax.mail.Multipart -import javax.mail.Session -import javax.mail.internet.MimeBodyPart -import javax.mail.internet.MimeMessage -import java.util.regex.Matcher -/** - * Created by gerardin on 12/1/14. - */ -class ReportParsingTest extends Specification { - - - def testReportResponseParsing() { - - given: - - def file = this.getClass().getClassLoader().getResourceAsStream("xdr_full_metadata_report.txt") - XmlSlurper s = new XmlSlurper() - s.setKeepIgnorableWhitespace(false) - def report = s.parse(file) - - when: - - when: - //we parse it - def request = report.request.text() - def response = report.response.text() - String content = report.response.body.text() - def registryResponse = content.split("<.?S:Body>") - def registryResponseXml = new XmlSlurper().parseText(registryResponse[1]) - def status = registryResponseXml.@status.text() - then: - //we can extract the status from the report - assert status == "urn:oasis:names:tc:ebxml-regrep:ResponseStatusType:Failure" - } - - //TODO fix - /* - xmlSlurper handles the text in some fashion that changes the text (mess w spaces/end of lines) - */ - def testReportRequestParsing() { - - given: - - def file = this.getClass().getClassLoader().getResourceAsStream("xdr_full_metadata_report.txt") - XmlSlurper s = new XmlSlurper() - s.setKeepIgnorableWhitespace(true) - def report = s.parse(file) - - assert s.isKeepIgnorableWhitespace() - - when: - //we parse it - String header = report.request.header.text() - String body = report.request.body.text() - - String unescapedHeader = StringEscapeUtils.unescapeXml(header) - String unescapedBody = StringEscapeUtils.unescapeXml(body) - - - def fullRequest = unescapedHeader + unescapedBody - - println fullRequest - - InputStream req = new ByteArrayInputStream(fullRequest.getBytes()); - - MimeMessage msg = new MimeMessage(Session.getDefaultInstance(new Properties()), req) - Multipart content = msg.getContent() - MimeBodyPart part1 = content.getBodyPart(0) - - ByteArrayOutputStream out = new ByteArrayOutputStream() - part1.writeTo(out) - println out.toString() - - String xml = org.apache.commons.io.IOUtils.toString(part1.getInputStream(), "UTF-8"); - - xml = xml.replaceAll("&","&") - - println "========\n" + xml - - def envelope = new XmlSlurper().parseText(xml) - def directFrom = envelope.Header.addressBlock.from.text() - - println directFrom - - then: - - assert directFrom == "from@edge.nist.gov" - - - } - - - - def testReportRequestScrubbing() { - - given: - - def file = this.getClass().getClassLoader().getResourceAsStream("xdr_full_metadata_report.txt") - XmlSlurper s = new XmlSlurper() - s.setKeepIgnorableWhitespace(true) - def report = s.parse(file) - - assert s.isKeepIgnorableWhitespace() - - when: - //we parse it - String header = report.request.header.text() - String body = report.request.body.text() - - - Matcher matcher2 = body =~ /from>([^<]+)]+>([^<]+)]+>)([^<]+)(?:<)/ - - //we expect only one match (thus the 0) and we want to get back the first group match - - println matcher[0][1] - - - assert matcher.size() == 1 - - def updated = body.replaceAll(/(MessageID[^>]+>)([^<]+)(<)/){ - String it , pre, id , post -> - return pre + "1" + post - } - - - then: - println updated - } -} diff --git a/xdr/src/test/groovy/gov/nist/healthcare/ttt/xdr/other/RequestParsingTest.groovy b/xdr/src/test/groovy/gov/nist/healthcare/ttt/xdr/other/RequestParsingTest.groovy deleted file mode 100644 index de06bf3cd..000000000 --- a/xdr/src/test/groovy/gov/nist/healthcare/ttt/xdr/other/RequestParsingTest.groovy +++ /dev/null @@ -1,134 +0,0 @@ -package gov.nist.healthcare.ttt.xdr.other - -import org.apache.commons.lang.StringEscapeUtils -import spock.lang.Specification - -import javax.mail.Multipart -import javax.mail.Session -import javax.mail.internet.MimeBodyPart -import javax.mail.internet.MimeMessage -/** - * Created by gerardin on 12/1/14. - */ -class RequestParsingTest extends Specification { - - - def testRequestParsingWithEscapedXmlAndHttpHeaders() { - - given: - - def stream = this.getClass().getClassLoader().getResourceAsStream("xdr_full_metadata_sample_request_escaped.txt") - String string = org.apache.commons.io.IOUtils.toString(stream, "UTF-8"); - String unescapedString = StringEscapeUtils.unescapeXml(string) - InputStream unescapedStream = new ByteArrayInputStream(unescapedString.getBytes()) - - when: - - MimeMessage msg = new MimeMessage(Session.getDefaultInstance(new Properties()), unescapedStream) - Multipart content = msg.getContent() - MimeBodyPart part1 = content.getBodyPart(0) - - ByteArrayOutputStream out = new ByteArrayOutputStream() - part1.writeTo(out) - println out.toString() - - String xml = org.apache.commons.io.IOUtils.toString(part1.getInputStream(), "UTF-8"); - println xml - - def envelope = new XmlSlurper().parseText(xml) - def directFrom = envelope.Header.addressBlock.from.text() - - then: - println directFrom - assert directFrom == "directFrom" - - - } - - - def testRequestParsingWithEscapedXmlAndHttpHeadersFrom2Files() { - - given: - def file1 = this.getClass().getClassLoader().getResourceAsStream("new/header.txt") - def file2 = this.getClass().getClassLoader().getResourceAsStream("new/body.txt") - - when: - String string1 = org.apache.commons.io.IOUtils.toString(file1, "UTF-8"); - String unescapedString1 = StringEscapeUtils.unescapeXml(string1) - InputStream unescapedStream1 = new ByteArrayInputStream(unescapedString1.getBytes()) - - String string2 = org.apache.commons.io.IOUtils.toString(file2, "UTF-8"); - String unescapedString2 = StringEscapeUtils.unescapeXml(string2) - InputStream unescapedStream2 = new ByteArrayInputStream(unescapedString2.getBytes()) - - def file3 = new java.io.SequenceInputStream(unescapedStream1, unescapedStream2) - - MimeMessage msg = new MimeMessage(Session.getDefaultInstance(new Properties()), file3) - Multipart content = msg.getContent() - MimeBodyPart part1 = content.getBodyPart(0) - - ByteArrayOutputStream out = new ByteArrayOutputStream() - part1.writeTo(out) - println out.toString() - - String xml = org.apache.commons.io.IOUtils.toString(part1.getInputStream(), "UTF-8"); - - - def envelope = new XmlSlurper().parseText(xml) - def directFrom = envelope.Header.addressBlock.from.text() - - println directFrom - - then: - assert directFrom == "directFrom" - - - } - - - - def testRequestParsingWithEscapedXmlAndHttpHeadersFrom2FilesWithSerialization() { - - given: - - def file1 = this.getClass().getClassLoader().getResourceAsStream("new/header.txt") - def file2 = this.getClass().getClassLoader().getResourceAsStream("new/body.txt") - when: - - String header = org.apache.commons.io.IOUtils.toString(file1, "UTF-8"); - String body = org.apache.commons.io.IOUtils.toString(file2, "UTF-8"); - String unescapedString1 = StringEscapeUtils.unescapeXml(header) - String unescapedString2 = StringEscapeUtils.unescapeXml(body) - - def request = unescapedString1 + unescapedString2 - - println request - - InputStream req = new ByteArrayInputStream(request.getBytes()); - - MimeMessage msg = new MimeMessage(Session.getDefaultInstance(new Properties()), req) - Multipart content = msg.getContent() - MimeBodyPart part1 = content.getBodyPart(0) - - ByteArrayOutputStream out = new ByteArrayOutputStream() - part1.writeTo(out) - println out.toString() - - String xml = org.apache.commons.io.IOUtils.toString(part1.getInputStream(), "UTF-8"); - - def envelope = new XmlSlurper().parseText(xml) - def directFrom = envelope.Header.addressBlock.from.text() - - println directFrom - - then: - assert directFrom == "directFrom" - - - } - - - - - -} diff --git a/xdr/src/test/groovy/gov/nist/healthcare/ttt/xdr/other/SamlTest.java b/xdr/src/test/groovy/gov/nist/healthcare/ttt/xdr/other/SamlTest.java deleted file mode 100644 index 53425d344..000000000 --- a/xdr/src/test/groovy/gov/nist/healthcare/ttt/xdr/other/SamlTest.java +++ /dev/null @@ -1,35 +0,0 @@ -package gov.nist.healthcare.ttt.xdr.other; - -import org.w3c.dom.Document; - -import gov.nist.hit.ds.wsseTool.api.config.ContextFactory; -import gov.nist.hit.ds.wsseTool.api.config.GenContext; -import gov.nist.hit.ds.wsseTool.api.config.KeystoreAccess; -import gov.nist.hit.ds.wsseTool.generation.opensaml.OpenSamlWsseSecurityGenerator; -import gov.nist.hit.ds.wsseTool.util.MyXmlUtils; - - -public class SamlTest { - - public static void main( String[] args ) { - - String keystoreFileWithPath = SamlTest.class.getClassLoader().getResource("goodKeystore/goodKeystore").toString(); - String keyStorePass = "changeit"; - String alias = "1"; - String privateKeyPass = "changeit"; - - GenContext context = ContextFactory.getInstance(); - Document doc = null; - - try { - context.setKeystore(new KeystoreAccess(keystoreFileWithPath, keyStorePass, alias, privateKeyPass)); - context.setParam("patientId", "test"); - doc = new OpenSamlWsseSecurityGenerator().generateWsseHeader(context); - //new WsseHeaderValidator().validate(doc.getDocumentElement(),context); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - System.out.println(MyXmlUtils.DomToString(doc)); - } -} diff --git a/xdr/src/test/groovy/gov/nist/healthcare/ttt/xdr/unit/TkClientSpecTest.groovy b/xdr/src/test/groovy/gov/nist/healthcare/ttt/xdr/unit/TkClientSpecTest.groovy deleted file mode 100644 index ff682ded3..000000000 --- a/xdr/src/test/groovy/gov/nist/healthcare/ttt/xdr/unit/TkClientSpecTest.groovy +++ /dev/null @@ -1,150 +0,0 @@ -package gov.nist.healthcare.ttt.xdr.unit - -import gov.nist.healthcare.ttt.xdr.helpers.testFramework.TestApplication -import gov.nist.healthcare.ttt.xdr.web.GroovyRestClient -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.beans.factory.annotation.Value -import org.springframework.boot.test.IntegrationTest -import org.springframework.boot.test.SpringApplicationContextLoader -import org.springframework.test.context.ContextConfiguration -import org.springframework.test.context.web.WebAppConfiguration -import spock.lang.Specification - -import javax.annotation.PostConstruct - -/** - * Created by gerardin on 10/9/14. - * - * Here we only test the http client behavior under various conditions. - * The fake toolkit we use does not comply with the new API but this is largely irrelevant. - * We want to know whether the client reacts appropriately. - */ -@WebAppConfiguration -@IntegrationTest -@ContextConfiguration(loader = SpringApplicationContextLoader.class, classes = TestApplication.class) -class TkClientSpecTest extends Specification { - - @Value('${xdr.notification') - private String notificationUrl - - @Value('${server.contextPath}') - private String contextPath - - @Value('${server.port}') - private String port - - //TODO change that : either find a better way or rename property - @Value('${direct.listener.domainName}') - private String hostname - - private String fullNotificationUrl - private String fullUrl - - @PostConstruct - def buildUrls(){ - fullNotificationUrl = "http://"+hostname+":"+port+contextPath+notificationUrl - fullUrl = "http://"+hostname+":"+port+contextPath - } - - @Autowired - GroovyRestClient client - - def "test request on good endpoint"() { - given: - // a working url - def id = "SimpleTest1" - - def config = { - createSim { - SimType("XDR Document Recipient") - SimulatorId(id) - MetadataValidationLevel("Full") - CodeValidation("false") - PostNotification("$fullNotificationUrl") - } - } - - def url = fullUrl + "/createSim" - - when: - def resp = client.postXml(config, url, 1000) - - then: - //we have a successful interaction - assert resp.SimulatorId.text() == id - - } - - def sendRawXml(){ - - given: - // a working url - def id = "SimpleTest1" - - def config = """ -XDR Document RecipientSimpleTest1Fullfalsehttp://localhost:12080/ttt -""" - - def url = fullUrl + "/createSim" - - when: - def resp = client.postXml(config, url, 1000) - - then: - //we have a successful interaction - assert resp.SimulatorId.text() == id - - } - - def "test request on wrong endpoint"() { - given: - - def id = "SimpleTest1" - - def config = { - createSim { - SimType("XDR Document Recipient") - SimulatorId(id) - MetadataValidationLevel("Full") - CodeValidation("false") - PostNotification("$fullNotificationUrl") - } - } - - def url = fullUrl + "/badEndpoint" - - when: - def resp = client.postXml(config, url, 1000) - - then: - thrown(groovyx.net.http.HttpResponseException) - - } - - - def "test request on good endpoint but bad content"() { - given: - - def id = "SimpleTest1" - - def config = { - createSim { - SimType("XDR Document Recipient") - SimulatorId(id) - MetadataValidationLevel("Full") - CodeValidation("false") - PostNotification("$fullNotificationUrl") - } - } - - def url = fullUrl + "/createSimWithBadContent" - - when: - def resp = client.postXml(config, url, 1000) - - then: - thrown(groovyx.net.http.ResponseParseException) - - } - -} diff --git a/xdr/src/test/groovy/gov/nist/healthcare/ttt/xdr/unit/TkListenerSpecTest.groovy b/xdr/src/test/groovy/gov/nist/healthcare/ttt/xdr/unit/TkListenerSpecTest.groovy deleted file mode 100644 index 564669d20..000000000 --- a/xdr/src/test/groovy/gov/nist/healthcare/ttt/xdr/unit/TkListenerSpecTest.groovy +++ /dev/null @@ -1,157 +0,0 @@ -package gov.nist.healthcare.ttt.xdr.unit -import gov.nist.healthcare.ttt.commons.notification.IObserver -import gov.nist.healthcare.ttt.commons.notification.Message -import gov.nist.healthcare.ttt.xdr.api.XdrReceiver -import gov.nist.healthcare.ttt.xdr.domain.TkValidationReport -import gov.nist.healthcare.ttt.xdr.helpers.testFramework.TestApplication -import gov.nist.healthcare.ttt.xdr.web.TkListener -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.beans.factory.annotation.Value -import org.springframework.boot.test.IntegrationTest -import org.springframework.boot.test.SpringApplicationContextLoader -import org.springframework.http.MediaType -import org.springframework.test.context.ContextConfiguration -import org.springframework.test.context.web.WebAppConfiguration -import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders -import org.springframework.test.web.servlet.setup.MockMvcBuilders -import spock.lang.Specification - -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print -/** - * Created by gerardin on 10/14/14. - * - * Here we only test the notification process. - * If we receive sth on the notification url, we should notify the observer either of a well-formed or problematic message. - */ -@WebAppConfiguration -@IntegrationTest -@ContextConfiguration(loader = SpringApplicationContextLoader.class, classes = TestApplication.class) -class TkListenerSpecTest extends Specification { - - @Value('${xdr.notification}') - private String notificationUrl - - @Autowired - XdrReceiver receiver - - @Autowired - TkListener listener - - def "notify of a valid report"() { - - given: 'a valid validation report notification' - def mockMvc = MockMvcBuilders.standaloneSetup(listener).build() - def observer = Mock(IObserver) - receiver.registerObserver(observer) - - println "we want to send to notification url : $notificationUrl" - - MockHttpServletRequestBuilder req = MockMvcRequestBuilders.post(notificationUrl) - .accept(MediaType.ALL) - .content(GOOD_REPORT_XML) - .contentType(MediaType.APPLICATION_XML) - - when: 'a notification by a web client is received' - mockMvc - .perform(req) - .andDo(print()) - .andReturn() - - then: 'the observer is notified with a success message' - 1 * observer.getNotification({ - Message m -> - m.status.toString() == "SUCCESS" - m.content instanceof TkValidationReport - }) - - } - - - - def "notify of a bad report"() { - - given: 'a bad validation report notification (cannot be parsed to TkValidationReport)' - def mockMvc = MockMvcBuilders.standaloneSetup(listener).build() - def observer = Mock(IObserver) - receiver.registerObserver(observer) - - println "URL to send to is : " + notificationUrl - - MockHttpServletRequestBuilder req = MockMvcRequestBuilders.post(notificationUrl) - .accept(MediaType.ALL) - .content(BAD_REPORT_XML) - .contentType(MediaType.APPLICATION_XML) - - when: 'a notification by a web client is received' - mockMvc - .perform(req) - .andDo(print()) - .andReturn() - - then: 'the observer is notified with a success message' - 1 * observer.getNotification({ - Message m -> - m.status.toString() == "ERROR" - m.content == null - }) - - } - - private static String BAD_REPORT_XML = - "" + - "success"; - - private static String GOOD_REPORT_XML = - """ - - -
    content-type: multipart/related; boundary="MIMEBoundary_f41f86a92d39c3883023f2dbbaee45f5ae5bba5d4ffbfe70"; type="application/xop+xml"; start="<0.c41f86a92d39c3883023f2dbbaee45f5ae5bba5d4ffbfe70@apache.org>"; start-info="application/soap+xml"; action="urn:ihe:iti:2007:ProvideAndRegisterDocumentSet-b" - user-agent: Axis2 - host: localhost:9080 - transfer-encoding: chunked -
    - - --MIMEBoundary_f41f86a92d39c3883023f2dbbaee45f5ae5bba5d4ffbfe70 - Content-Type: application/xop+xml; charset=UTF-8; type="application/soap+xml" - Content-Transfer-Encoding: binary - Content-ID: <0.c41f86a92d39c3883023f2dbbaee45f5ae5bba5d4ffbfe70@apache.org> - - <?xml version='1.0' encoding='UTF-8'?>< - Rest removed because of size - -
    - -
    - content-type: multipart/related; boundary=MIMEBoundary112233445566778899; type="application/xop+xml"; start="<doc0@ihexds.nist.gov>"; start-info="application/soap+xml" -
    - - --MIMEBoundary112233445566778899 - Content-Type: application/xop+xml; charset=UTF-8; type="application/soap+xml" - Content-Transfer-Encoding: binary - Content-ID: <doc0@ihexds.nist.gov> - - - <S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope"> - <S:Header> - <wsa:Action s:mustUnderstand="1" xmlns:s="http://www.w3.org/2003/05/soap-envelope" - xmlns:wsa="http://www.w3.org/2005/08/addressing">urn:ihe:iti:2007:ProvideAndRegisterDocumentSet-bResponse</wsa:Action> - <wsa:RelatesTo xmlns:wsa="http://www.w3.org/2005/08/addressing">urn:uuid:2E3E584BB87837BC3B1417028462849</wsa:RelatesTo> - </S:Header> - <S:Body> - <rs:RegistryResponse status="urn:oasis:names:tc:ebxml-regrep:ResponseStatusType:Failure" - xmlns:rs="urn:oasis:names:tc:ebxml-regrep:xsd:rs:3.0"> - <rs:RegistryErrorList> - <rs:RegistryError errorCode="" codeContext="EXPECTED: XML starts with; FOUND: &lt;soapenv:Body xmlns:soape : MSG Schema: cvc-elt.1: Cannot find the declaration of element 'soapenv:Body'." - location=""/> - </rs:RegistryErrorList> - </rs:RegistryResponse> - </S:Body> - </S:Envelope> - - --MIMEBoundary112233445566778899-- - -
    -
    -""" -}